From 0203b209ccc8250bcdf21cec18040db0f204d53a Mon Sep 17 00:00:00 2001 From: Miki Date: Mon, 22 Jul 2024 12:17:07 -0700 Subject: [PATCH 1/9] Bump OUI to 1.8.0 (#7363) Signed-off-by: Miki (cherry picked from commit c1bae75097f0718187fc2b3334eb1e93201703dc) --- changelogs/fragments/7363.yml | 2 ++ package.json | 2 +- packages/osd-ui-framework/package.json | 2 +- packages/osd-ui-shared-deps/package.json | 2 +- .../plugins/osd_tp_run_pipeline/package.json | 2 +- .../plugins/osd_sample_panel_action/package.json | 2 +- .../plugins/osd_tp_custom_visualizations/package.json | 2 +- yarn.lock | 8 ++++---- 8 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 changelogs/fragments/7363.yml diff --git a/changelogs/fragments/7363.yml b/changelogs/fragments/7363.yml new file mode 100644 index 00000000000..29e27d719da --- /dev/null +++ b/changelogs/fragments/7363.yml @@ -0,0 +1,2 @@ +feat: +- Bump OUI to 1.8.0 ([#7363](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7363)) diff --git a/package.json b/package.json index b24c09ea6a6..2be780f92a4 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "dependencies": { "@aws-crypto/client-node": "^3.1.1", "@elastic/datemath": "5.0.3", - "@elastic/eui": "npm:@opensearch-project/oui@1.7.0", + "@elastic/eui": "npm:@opensearch-project/oui@1.8.0", "@elastic/good": "^9.0.1-kibana3", "@elastic/numeral": "npm:@amoo-miki/numeral@2.6.0", "@elastic/request-crypto": "2.0.0", diff --git a/packages/osd-ui-framework/package.json b/packages/osd-ui-framework/package.json index 860a50d39c4..48b5a4155bd 100644 --- a/packages/osd-ui-framework/package.json +++ b/packages/osd-ui-framework/package.json @@ -23,7 +23,7 @@ "enzyme-adapter-react-16": "^1.9.1" }, "devDependencies": { - "@elastic/eui": "npm:@opensearch-project/oui@1.7.0", + "@elastic/eui": "npm:@opensearch-project/oui@1.8.0", "@osd/babel-preset": "1.0.0", "@osd/optimizer": "1.0.0", "comment-stripper": "^0.0.4", diff --git a/packages/osd-ui-shared-deps/package.json b/packages/osd-ui-shared-deps/package.json index 1d4092f7df5..55c948bf9b0 100644 --- a/packages/osd-ui-shared-deps/package.json +++ b/packages/osd-ui-shared-deps/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@elastic/charts": "31.1.0", - "@elastic/eui": "npm:@opensearch-project/oui@1.7.0", + "@elastic/eui": "npm:@opensearch-project/oui@1.8.0", "@elastic/numeral": "npm:@amoo-miki/numeral@2.6.0", "@opensearch/datemath": "5.0.3", "@osd/i18n": "1.0.0", diff --git a/test/interpreter_functional/plugins/osd_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/osd_tp_run_pipeline/package.json index ba4c2399729..3cf395a0c1d 100644 --- a/test/interpreter_functional/plugins/osd_tp_run_pipeline/package.json +++ b/test/interpreter_functional/plugins/osd_tp_run_pipeline/package.json @@ -12,7 +12,7 @@ "build": "../../../../scripts/use_node ../../../../scripts/remove.js './target' && tsc" }, "devDependencies": { - "@elastic/eui": "npm:@opensearch-project/oui@1.7.0", + "@elastic/eui": "npm:@opensearch-project/oui@1.8.0", "@osd/plugin-helpers": "1.0.0", "react": "^16.14.0", "react-dom": "^16.12.0", diff --git a/test/plugin_functional/plugins/osd_sample_panel_action/package.json b/test/plugin_functional/plugins/osd_sample_panel_action/package.json index 61b89d5b86f..8f34041e1b8 100644 --- a/test/plugin_functional/plugins/osd_sample_panel_action/package.json +++ b/test/plugin_functional/plugins/osd_sample_panel_action/package.json @@ -12,7 +12,7 @@ "build": "../../../../scripts/use_node ../../../../scripts/remove.js './target' && tsc" }, "devDependencies": { - "@elastic/eui": "npm:@opensearch-project/oui@1.7.0", + "@elastic/eui": "npm:@opensearch-project/oui@1.8.0", "react": "^16.14.0", "typescript": "4.0.2" } diff --git a/test/plugin_functional/plugins/osd_tp_custom_visualizations/package.json b/test/plugin_functional/plugins/osd_tp_custom_visualizations/package.json index 594d0a7bbb9..535595a7639 100644 --- a/test/plugin_functional/plugins/osd_tp_custom_visualizations/package.json +++ b/test/plugin_functional/plugins/osd_tp_custom_visualizations/package.json @@ -12,7 +12,7 @@ "build": "../../../../scripts/use_node ../../../../scripts/remove.js './target' && tsc" }, "devDependencies": { - "@elastic/eui": "npm:@opensearch-project/oui@1.7.0", + "@elastic/eui": "npm:@opensearch-project/oui@1.8.0", "@osd/plugin-helpers": "1.0.0", "react": "^16.14.0", "typescript": "4.0.2" diff --git a/yarn.lock b/yarn.lock index 40df4e10c21..63a9d856328 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1307,10 +1307,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@npm:@opensearch-project/oui@1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@opensearch-project/oui/-/oui-1.7.0.tgz#f24cfb7fb4f18db607620919f70b4729b9ce27f9" - integrity sha512-HoWOS5kUbXoLn0I6+LC+V8aWblBTD2/x2kxvsvGQoBXXbfuWR+lphgqPdCetc4DCmvD/+jm0u3vRT2MYB6FQjw== +"@elastic/eui@npm:@opensearch-project/oui@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@opensearch-project/oui/-/oui-1.8.0.tgz#5fc6526ad140cfb0ceb582a5008929bc87721245" + integrity sha512-gGhO9GVrmUEn6uFX9AGpEuSNuIw+fo2bChoX5i9eQnj7xGPnMn9KX6ytItocbA0dWZUiJKXiq0UdNOrg0+fSBg== dependencies: "@types/chroma-js" "^2.4.0" "@types/react-beautiful-dnd" "^13.1.3" From fea5f44d03488d71a39af04cb0e36d18c9bfc81a Mon Sep 17 00:00:00 2001 From: Eric Wei Date: Mon, 22 Jul 2024 19:39:00 -0700 Subject: [PATCH 2/9] [Auto Suggest] OpenSearch SQL autosuggest with ANTLR (#7336) * cherry pick Signed-off-by: Eric * SQL keyword suggestion Signed-off-by: Eric * column and values suggestions Signed-off-by: Eric * adjust values suggestions and ignored token Signed-off-by: Eric * suggestion type casting Signed-off-by: Eric * ignore functions Signed-off-by: Eric * case insensitive Signed-off-by: Eric * change to use grammar for insensitive case Signed-off-by: Eric * fix multi-line issue Signed-off-by: Eric * code cleanup Signed-off-by: Eric * move ppl out of scope Signed-off-by: Eric * rename folder and add ignoring rules Signed-off-by: Eric * resolve type issue Signed-off-by: Eric * fix ppl suggestion provider issue Signed-off-by: Eric * remove function suggestion Signed-off-by: Eric * some code clean up and adding tests Signed-off-by: Eric * cursor tests Signed-off-by: Eric * remove testing setup Signed-off-by: Eric * add changelog Signed-off-by: Eric * update yarn file Signed-off-by: Eric * add missing testing library Signed-off-by: Eric * MDS integration Signed-off-by: Eric * minor interface change and disable word based suggestion Signed-off-by: Eric * update ID_LITERAL and recompile grammar Signed-off-by: Eric * column suggest for agg function Signed-off-by: Eric * revert version Signed-off-by: Eric * opensearch sql syntax highlighting Signed-off-by: Eric * add utility tests Signed-off-by: Eric * symbol table test Signed-off-by: Eric * error listener test Signed-off-by: Eric * parse test Signed-off-by: Eric * add suggestion provider to single line query editor Signed-off-by: Eric * remove one test Signed-off-by: Eric * add connection service type Signed-off-by: Eric --------- Signed-off-by: Eric (cherry picked from commit 9348bd4276a6daf4a719f3709c3d854e002350e0) --- .eslintignore | 4 + .eslintrc.js | 9 + changelogs/fragments/7336.yml | 2 + config/opensearch_dashboards.yml | 2 +- package.json | 17 +- packages/osd-babel-preset/webpack_preset.js | 6 + .../osd-monaco/src/xjson/lexer_rules/index.ts | 3 + .../src/xjson/lexer_rules/opensearchsql.ts | 157 + .../src/worker/webpack.config.ts | 10 + .../.generated/OpenSearchSQLLexer.interp | 1085 ++ .../.generated/OpenSearchSQLLexer.tokens | 689 + .../.generated/OpenSearchSQLLexer.ts | 2027 +++ .../.generated/OpenSearchSQLParser.interp | 829 + .../.generated/OpenSearchSQLParser.tokens | 689 + .../.generated/OpenSearchSQLParser.ts | 12612 ++++++++++++++++ .../.generated/OpenSearchSQLParserVisitor.ts | 1121 ++ .../antlr/opensearch_sql/code_completion.ts | 214 + .../public/antlr/opensearch_sql/constants.ts | 21 + .../grammar/.antlr/OpenSearchSQLLexer.interp | 1085 ++ .../grammar/.antlr/OpenSearchSQLLexer.java | 2836 ++++ .../grammar/.antlr/OpenSearchSQLLexer.tokens | 689 + .../grammar/.antlr/OpenSearchSQLParser.interp | 829 + .../grammar/.antlr/OpenSearchSQLParser.java | 11122 ++++++++++++++ .../grammar/.antlr/OpenSearchSQLParser.tokens | 689 + .../OpenSearchSQLParserBaseListener.java | 1851 +++ .../.antlr/OpenSearchSQLParserListener.java | 1613 ++ .../grammar/OpenSearchSQLLexer.g4 | 489 + .../grammar/OpenSearchSQLParser.g4 | 849 ++ .../opensearch_sql_autocomplete.ts | 272 + .../public/antlr/opensearch_sql/parse.test.ts | 84 + .../data/public/antlr/opensearch_sql/parse.ts | 55 + .../opensearch_sql/sql_error_listener.test.ts | 71 + .../opensearch_sql/sql_error_listerner.ts | 47 + .../antlr/opensearch_sql/symbol_table.test.ts | 95 + .../antlr/opensearch_sql/symbol_table.ts | 68 + .../public/antlr/opensearch_sql/table.test.ts | 120 + .../data/public/antlr/opensearch_sql/table.ts | 320 + .../data/public/antlr/shared/cursor.test.ts | 65 + .../data/public/antlr/shared/cursor.ts | 119 + src/plugins/data/public/antlr/shared/types.ts | 124 + .../data/public/antlr/shared/utils.test.ts | 159 + src/plugins/data/public/antlr/shared/utils.ts | 118 + .../providers/query_suggestion_provider.ts | 3 + src/plugins/data/public/plugin.ts | 4 + .../ui/filter_bar/_global_filter_group.scss | 1 + .../ui/query_editor/_language_switcher.scss | 8 + .../ui/query_editor/language_switcher.tsx | 102 + .../public/ui/query_editor/query_editor.tsx | 70 +- .../query_string_input/query_string_input.tsx | 2 - src/plugins/data/public/ui/types.ts | 1 + .../query_enhancements/public/plugin.tsx | 3 + yarn.lock | 284 +- 52 files changed, 43710 insertions(+), 34 deletions(-) create mode 100644 changelogs/fragments/7336.yml create mode 100644 packages/osd-monaco/src/xjson/lexer_rules/opensearchsql.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.interp create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.tokens create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.interp create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.tokens create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParserVisitor.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/code_completion.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/constants.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.interp create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.java create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.tokens create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.interp create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.java create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.tokens create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserBaseListener.java create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserListener.java create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 create mode 100644 src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 create mode 100644 src/plugins/data/public/antlr/opensearch_sql/opensearch_sql_autocomplete.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/parse.test.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/parse.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/sql_error_listener.test.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/sql_error_listerner.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/symbol_table.test.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/symbol_table.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/table.test.ts create mode 100644 src/plugins/data/public/antlr/opensearch_sql/table.ts create mode 100644 src/plugins/data/public/antlr/shared/cursor.test.ts create mode 100644 src/plugins/data/public/antlr/shared/cursor.ts create mode 100644 src/plugins/data/public/antlr/shared/types.ts create mode 100644 src/plugins/data/public/antlr/shared/utils.test.ts create mode 100644 src/plugins/data/public/antlr/shared/utils.ts create mode 100644 src/plugins/data/public/ui/query_editor/_language_switcher.scss create mode 100644 src/plugins/data/public/ui/query_editor/language_switcher.tsx diff --git a/.eslintignore b/.eslintignore index f5df2d394ad..f460657cb3b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -30,3 +30,7 @@ target /packages/osd-test/src/functional_test_runner/lib/config/__tests__/fixtures/ /packages/osd-ui-framework/dist /packages/osd-ui-shared-deps/flot_charts + +# antlr overrides +/src/plugins/data/public/antlr/opensearch_sql/.generated/* +/src/plugins/data/public/antlr/opensearch_sql/grammar/**/* diff --git a/.eslintrc.js b/.eslintrc.js index a78ddeca781..5ab6fdc4148 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -751,5 +751,14 @@ module.exports = { 'no-undef': 'off', }, }, + { + files: [ + 'src/plugins/data/public/antlr/opensearch_sql/.generated/*', + 'src/plugins/data/public/antlr/opensearch_sql/grammar/**/*', + ], + rules: { + 'filenames/match-regex': 'off', + }, + }, ], }; diff --git a/changelogs/fragments/7336.yml b/changelogs/fragments/7336.yml new file mode 100644 index 00000000000..4bd17f0155e --- /dev/null +++ b/changelogs/fragments/7336.yml @@ -0,0 +1,2 @@ +feat: +- [Auto Suggest] OpenSearch SQL autosuggest with ANTLR ([#7336](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7336)) \ No newline at end of file diff --git a/config/opensearch_dashboards.yml b/config/opensearch_dashboards.yml index 969fec9e8fa..0c3c82975e3 100644 --- a/config/opensearch_dashboards.yml +++ b/config/opensearch_dashboards.yml @@ -362,4 +362,4 @@ # Set the backend roles in groups or users, whoever has the backend roles or exactly match the user ids defined in this config will be regard as dashboard admin. # Dashboard admin will have the access to all the workspaces(workspace.enabled: true) and objects inside OpenSearch Dashboards. # opensearchDashboards.dashboardAdmin.groups: ["dashboard_admin"] -# opensearchDashboards.dashboardAdmin.users: ["dashboard_admin"] +# opensearchDashboards.dashboardAdmin.users: ["dashboard_admin"] \ No newline at end of file diff --git a/package.json b/package.json index 2be780f92a4..30cc500cdb6 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,12 @@ "osd:bootstrap": "scripts/use_node scripts/build_ts_refs && scripts/use_node scripts/register_git_hook", "spec_to_console": "scripts/use_node scripts/spec_to_console", "pkg-version": "scripts/use_node -e \"console.log(require('./package.json').version)\"", - "release_note:generate": "scripts/use_node scripts/generate_release_note" + "release_note:generate": "scripts/use_node scripts/generate_release_note", + "cypress:run-without-security": "env TZ=America/Los_Angeles NO_COLOR=1 cypress run --headless --env SECURITY_ENABLED=false", + "cypress:run-with-security": "env TZ=America/Los_Angeles NO_COLOR=1 cypress run --headless --env SECURITY_ENABLED=true,openSearchUrl=https://localhost:9200,WAIT_FOR_LOADER_BUFFER_MS=500", + "osd:ciGroup10": "echo \"dashboard_sanity_test_spec.js\"", + "osd:ciGroup11": "echo \"apps/vis_builder/*.js\"", + "generate:opensearchsqlantlr": "./node_modules/antlr4ng-cli/index.js -Dlanguage=TypeScript -o ./src/plugins/data/public/antlr/opensearch_sql/.generated -visitor -no-listener -Xexact-output-dir ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4" }, "repository": { "type": "git", @@ -109,7 +114,7 @@ "**/qs": "^6.11.0", "**/semver": "^7.5.3", "**/set-value": "^4.1.0", - "**/tar":"^6.2.1", + "**/tar": "^6.2.1", "**/topo/hoek": "npm:@amoo-miki/hoek@6.1.3", "**/trim": "^0.0.3", "**/typescript": "4.0.2", @@ -177,6 +182,8 @@ "JSONStream": "1.3.5", "abortcontroller-polyfill": "^1.4.0", "ajv": "^8.11.0", + "antlr4-c3": "^3.4.1", + "antlr4ng": "^3.0.4", "bluebird": "3.5.5", "chalk": "^4.1.0", "chokidar": "^3.4.2", @@ -242,11 +249,13 @@ "type-detect": "^4.0.8", "uuid": "3.3.2", "whatwg-fetch": "^3.0.0", - "yauzl": "^2.10.0" + "yauzl": "^2.10.0", + "@opensearch-dashboards-test/opensearch-dashboards-test-library": "https://github.com/opensearch-project/opensearch-dashboards-test-library/archive/refs/tags/1.0.6.tar.gz" }, "devDependencies": { "@babel/core": "^7.22.9", "@babel/parser": "^7.22.9", + "@babel/plugin-transform-class-static-block": "^7.24.4", "@babel/register": "^7.22.9", "@babel/types": "^7.22.9", "@elastic/apm-rum": "^5.6.1", @@ -361,6 +370,7 @@ "@types/zen-observable": "^0.8.0", "@typescript-eslint/eslint-plugin": "^3.10.0", "@typescript-eslint/parser": "^3.10.0", + "antlr4ng-cli": "^2.0.0", "archiver": "^5.3.0", "axe-core": "^4.0.2", "babel-eslint": "^10.0.3", @@ -461,6 +471,7 @@ "regenerate": "^1.4.0", "reselect": "^4.0.0", "resize-observer-polyfill": "^1.5.1", + "rimraf": "^5.0.7", "selenium-webdriver": "^4.0.0-alpha.7", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/packages/osd-babel-preset/webpack_preset.js b/packages/osd-babel-preset/webpack_preset.js index 9d0a75a042c..62b764f8294 100644 --- a/packages/osd-babel-preset/webpack_preset.js +++ b/packages/osd-babel-preset/webpack_preset.js @@ -55,6 +55,12 @@ module.exports = () => { fileName: false, }, ], + [ + require.resolve('@babel/plugin-transform-class-static-block'), + { + fileName: false, + }, + ], ], env: { production: { diff --git a/packages/osd-monaco/src/xjson/lexer_rules/index.ts b/packages/osd-monaco/src/xjson/lexer_rules/index.ts index b0ed41a6380..496769020e5 100644 --- a/packages/osd-monaco/src/xjson/lexer_rules/index.ts +++ b/packages/osd-monaco/src/xjson/lexer_rules/index.ts @@ -33,6 +33,7 @@ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; import * as xJson from './xjson'; import * as opensearchql from './opensearchql'; import * as painless from './painless'; +import * as opensearchsql from './opensearchsql'; export const registerLexerRules = (m: typeof monaco) => { m.languages.register({ id: xJson.ID }); @@ -41,4 +42,6 @@ export const registerLexerRules = (m: typeof monaco) => { m.languages.setMonarchTokensProvider(painless.ID, painless.lexerRules); m.languages.register({ id: opensearchql.ID }); m.languages.setMonarchTokensProvider(opensearchql.ID, opensearchql.lexerRules); + m.languages.register({ id: opensearchsql.ID }); + m.languages.setMonarchTokensProvider(opensearchsql.ID, opensearchsql.lexerRules); }; diff --git a/packages/osd-monaco/src/xjson/lexer_rules/opensearchsql.ts b/packages/osd-monaco/src/xjson/lexer_rules/opensearchsql.ts new file mode 100644 index 00000000000..b204c63e83c --- /dev/null +++ b/packages/osd-monaco/src/xjson/lexer_rules/opensearchsql.ts @@ -0,0 +1,157 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { monaco } from '../../monaco'; + +export const ID = 'SQL'; + +const keywords = [ + 'ALL', + 'AND', + 'AS', + 'ASC', + 'BOOLEAN', + 'BETWEEN', + 'BY', + 'CASE', + 'CAST', + 'CROSS', + 'COLUMNS', + 'DATETIME', + 'DELETE', + 'DESC', + 'DESCRIBE', + 'DISTINCT', + 'DOUBLE', + 'ELSE', + 'EXISTS', + 'FALSE', + 'FLOAT', + 'FIRST', + 'FROM', + 'GROUP', + 'HAVING', + 'IN', + 'INNER', + 'INT', + 'INTEGER', + 'IS', + 'JOIN', + 'LAST', + 'LEFT', + 'LIKE', + 'LIMIT', + 'LONG', + 'MATCH', + 'NATURAL', + 'NOT', + 'NULL', + 'NULLS', + 'ON', + 'OR', + 'ORDER', + 'OUTER', + 'OVER', + 'PARTITION', + 'REGEXP', + 'RIGHT', + 'SELECT', + 'SHOW', + 'STRING', + 'THEN', + 'TRUE', + 'UNION', + 'USING', + 'WHEN', + 'WHERE', + 'EXCEPT', +]; + +const functions = [ + 'AVG', + 'COUNT', + 'MAX', + 'MIN', + 'SUM', + 'VAR_POP', + 'VAR_SAMP', + 'VARIANCE', + 'STD', + 'STDDEV', + 'STDDEV_POP', + 'STDDEV_SAMP', + 'SUBSTRING', + 'TRIM', +]; + +const operators = [ + '=', + '>', + '<', + '!', + '~', + '\\|', + '&', + '\\^', + '\\*', + '/', + '%', + '\\+', + '-', + 'DIV', + 'MOD', +]; + +const brackets = [ + { open: '(', close: ')', token: 'delimiter.parenthesis' }, + { open: '[', close: ']', token: 'delimiter.square' }, +]; + +export const lexerRules = { + defaultToken: 'invalid', + ignoreCase: true, + tokenPostfix: '', + keywords, + functions, + operators, + brackets, + tokenizer: { + root: [ + [ + /[a-zA-Z_$][a-zA-Z0-9_$]*/, + { + cases: { + '@keywords': 'keyword', + '@functions': 'function', + '@default': 'identifier', + }, + }, + ], + { include: '@whitespace' }, + [/[()]/, '@brackets'], + [new RegExp(operators.join('|')), 'operator'], + [/[0-9]+(\.[0-9]+)?/, 'number'], + [/'([^'\\]|\\.)*$/, 'string.invalid'], // non-terminated string + [/'/, 'string', '@string'], + [/"/, 'string', '@string'], + ], + whitespace: [ + [/[ \t\r\n]+/, 'white'], + [/\/\*/, 'comment', '@comment'], + [/--.*$/, 'comment'], + ], + string: [ + [/[^'\\]+/, 'string'], + [/\\./, 'string.escape'], + [/'/, 'string', '@pop'], + [/"/, 'string', '@pop'], + ], + comment: [ + [/[^/*]+/, 'comment'], + [/\*\//, 'comment', '@pop'], + [/[\/*]/, 'comment'], + ], + }, +} as monaco.languages.IMonarchLanguage; diff --git a/packages/osd-optimizer/src/worker/webpack.config.ts b/packages/osd-optimizer/src/worker/webpack.config.ts index 1bfb1f186af..4c3ba9291ee 100644 --- a/packages/osd-optimizer/src/worker/webpack.config.ts +++ b/packages/osd-optimizer/src/worker/webpack.config.ts @@ -256,6 +256,16 @@ export function getWebpackConfig(bundle: Bundle, bundleRefs: BundleRefs, worker: loader: 'raw-loader', }, }, + { + test: /\.cjs$/, + include: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: [BABEL_PRESET_PATH], + }, + }, + }, ], }, diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.interp b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.interp new file mode 100644 index 00000000000..655cf595429 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.interp @@ -0,0 +1,1085 @@ +token literal names: +null +null +null +null +null +'ALL' +'AND' +'AS' +'ASC' +'BOOLEAN' +'BETWEEN' +'BY' +'CASE' +'CAST' +'CROSS' +'COLUMNS' +'DATETIME' +'DELETE' +'DESC' +'DESCRIBE' +'DISTINCT' +'DOUBLE' +'ELSE' +'EXISTS' +'FALSE' +'FLOAT' +'FIRST' +'FROM' +'GROUP' +'HAVING' +'IN' +'INNER' +'INT' +'INTEGER' +'IS' +'JOIN' +'LAST' +'LEFT' +'LIKE' +'LIMIT' +'LONG' +'MATCH' +'NATURAL' +'MISSING' +'NOT' +'NULL' +'NULLS' +'ON' +'OR' +'ORDER' +'OUTER' +'OVER' +'PARTITION' +'REGEXP' +'RIGHT' +'SELECT' +'SHOW' +'STRING' +'THEN' +'TRUE' +'UNION' +'USING' +'WHEN' +'WHERE' +'MINUS' +'AVG' +'COUNT' +'MAX' +'MIN' +'SUM' +'VAR_POP' +'VAR_SAMP' +'VARIANCE' +'STD' +'STDDEV' +'STDDEV_POP' +'STDDEV_SAMP' +'SUBSTRING' +'TRIM' +'END' +'FULL' +'OFFSET' +'INTERVAL' +'MICROSECOND' +'SECOND' +'MINUTE' +'HOUR' +'DAY' +'WEEK' +'MONTH' +'QUARTER' +'YEAR' +'SECOND_MICROSECOND' +'MINUTE_MICROSECOND' +'MINUTE_SECOND' +'HOUR_MICROSECOND' +'HOUR_SECOND' +'HOUR_MINUTE' +'DAY_MICROSECOND' +'DAY_SECOND' +'DAY_MINUTE' +'DAY_HOUR' +'YEAR_MONTH' +'TABLES' +'ABS' +'ACOS' +'ADD' +'ADDTIME' +'ASCII' +'ASIN' +'ATAN' +'ATAN2' +'CBRT' +'CEIL' +'CEILING' +'CONCAT' +'CONCAT_WS' +'CONV' +'CONVERT_TZ' +'COS' +'COSH' +'COT' +'CRC32' +'CURDATE' +'CURTIME' +'CURRENT_DATE' +'CURRENT_TIME' +'CURRENT_TIMESTAMP' +'DATE' +'DATE_ADD' +'DATE_FORMAT' +'DATE_SUB' +'DATEDIFF' +'DAYNAME' +'DAYOFMONTH' +'DAYOFWEEK' +'DAYOFYEAR' +'DEGREES' +'DIVIDE' +'E' +'EXP' +'EXPM1' +'EXTRACT' +'FLOOR' +'FROM_DAYS' +'FROM_UNIXTIME' +'GET_FORMAT' +'IF' +'IFNULL' +'ISNULL' +'LAST_DAY' +'LENGTH' +'LN' +'LOCALTIME' +'LOCALTIMESTAMP' +'LOCATE' +'LOG' +'LOG10' +'LOG2' +'LOWER' +'LTRIM' +'MAKEDATE' +'MAKETIME' +'MODULUS' +'MONTHNAME' +'MULTIPLY' +'NOW' +'NULLIF' +'PERIOD_ADD' +'PERIOD_DIFF' +'PI' +'POSITION' +'POW' +'POWER' +'RADIANS' +'RAND' +'REPLACE' +'RINT' +'ROUND' +'RTRIM' +'REVERSE' +'SEC_TO_TIME' +'SIGN' +'SIGNUM' +'SIN' +'SINH' +'SQRT' +'STR_TO_DATE' +'SUBDATE' +'SUBTIME' +'SUBTRACT' +'SYSDATE' +'TAN' +'TIME' +'TIMEDIFF' +'TIME_FORMAT' +'TIME_TO_SEC' +'TIMESTAMP' +'TRUNCATE' +'TO_DAYS' +'TO_SECONDS' +'UNIX_TIMESTAMP' +'UPPER' +'UTC_DATE' +'UTC_TIME' +'UTC_TIMESTAMP' +'D' +'T' +'TS' +'{' +'}' +'DENSE_RANK' +'RANK' +'ROW_NUMBER' +'DATE_HISTOGRAM' +'DAY_OF_MONTH' +'DAY_OF_YEAR' +'DAY_OF_WEEK' +'EXCLUDE' +'EXTENDED_STATS' +'FIELD' +'FILTER' +'GEO_BOUNDING_BOX' +'GEO_CELL' +'GEO_DISTANCE' +'GEO_DISTANCE_RANGE' +'GEO_INTERSECTS' +'GEO_POLYGON' +'HISTOGRAM' +'HOUR_OF_DAY' +'INCLUDE' +'IN_TERMS' +'MATCHPHRASE' +'MATCH_PHRASE' +'MATCHPHRASEQUERY' +'SIMPLE_QUERY_STRING' +'QUERY_STRING' +'MATCH_PHRASE_PREFIX' +'MATCHQUERY' +'MATCH_QUERY' +'MINUTE_OF_DAY' +'MINUTE_OF_HOUR' +'MONTH_OF_YEAR' +'MULTIMATCH' +'MULTI_MATCH' +'MULTIMATCHQUERY' +'NESTED' +'PERCENTILES' +'PERCENTILE' +'PERCENTILE_APPROX' +'REGEXP_QUERY' +'REVERSE_NESTED' +'QUERY' +'RANGE' +'SCORE' +'SCOREQUERY' +'SCORE_QUERY' +'SECOND_OF_MINUTE' +'STATS' +'TERM' +'TERMS' +'TIMESTAMPADD' +'TIMESTAMPDIFF' +'TOPHITS' +'TYPEOF' +'WEEK_OF_YEAR' +'WEEKOFYEAR' +'WEEKDAY' +'WILDCARDQUERY' +'WILDCARD_QUERY' +'SUBSTR' +'STRCMP' +'ADDDATE' +'YEARWEEK' +'ALLOW_LEADING_WILDCARD' +'ANALYZER' +'ANALYZE_WILDCARD' +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY' +'BOOST' +'CASE_INSENSITIVE' +'CUTOFF_FREQUENCY' +'DEFAULT_FIELD' +'DEFAULT_OPERATOR' +'ESCAPE' +'ENABLE_POSITION_INCREMENTS' +'FIELDS' +'FLAGS' +'FUZZINESS' +'FUZZY_MAX_EXPANSIONS' +'FUZZY_PREFIX_LENGTH' +'FUZZY_REWRITE' +'FUZZY_TRANSPOSITIONS' +'LENIENT' +'LOW_FREQ_OPERATOR' +'MAX_DETERMINIZED_STATES' +'MAX_EXPANSIONS' +'MINIMUM_SHOULD_MATCH' +'OPERATOR' +'PHRASE_SLOP' +'PREFIX_LENGTH' +'QUOTE_ANALYZER' +'QUOTE_FIELD_SUFFIX' +'REWRITE' +'SLOP' +'TIE_BREAKER' +'TIME_ZONE' +'TYPE' +'ZERO_TERMS_QUERY' +'HIGHLIGHT' +'PRE_TAGS' +'POST_TAGS' +'MATCH_BOOL_PREFIX' +'*' +'/' +'%' +'+' +'-' +'DIV' +'MOD' +'=' +'>' +'<' +'!' +'~' +'|' +'&' +'^' +'.' +'(' +')' +'[' +']' +',' +';' +'@' +'0' +'1' +'2' +'\'' +'"' +'`' +':' +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +SPACE +SPEC_SQL_COMMENT +COMMENT_INPUT +LINE_COMMENT +ALL +AND +AS +ASC +BOOLEAN +BETWEEN +BY +CASE +CAST +CROSS +COLUMNS +DATETIME +DELETE +DESC +DESCRIBE +DISTINCT +DOUBLE +ELSE +EXISTS +FALSE +FLOAT +FIRST +FROM +GROUP +HAVING +IN +INNER +INT +INTEGER +IS +JOIN +LAST +LEFT +LIKE +LIMIT +LONG +MATCH +NATURAL +MISSING_LITERAL +NOT +NULL_LITERAL +NULLS +ON +OR +ORDER +OUTER +OVER +PARTITION +REGEXP +RIGHT +SELECT +SHOW +STRING +THEN +TRUE +UNION +USING +WHEN +WHERE +EXCEPT +AVG +COUNT +MAX +MIN +SUM +VAR_POP +VAR_SAMP +VARIANCE +STD +STDDEV +STDDEV_POP +STDDEV_SAMP +SUBSTRING +TRIM +END +FULL +OFFSET +INTERVAL +MICROSECOND +SECOND +MINUTE +HOUR +DAY +WEEK +MONTH +QUARTER +YEAR +SECOND_MICROSECOND +MINUTE_MICROSECOND +MINUTE_SECOND +HOUR_MICROSECOND +HOUR_SECOND +HOUR_MINUTE +DAY_MICROSECOND +DAY_SECOND +DAY_MINUTE +DAY_HOUR +YEAR_MONTH +TABLES +ABS +ACOS +ADD +ADDTIME +ASCII +ASIN +ATAN +ATAN2 +CBRT +CEIL +CEILING +CONCAT +CONCAT_WS +CONV +CONVERT_TZ +COS +COSH +COT +CRC32 +CURDATE +CURTIME +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +DATE +DATE_ADD +DATE_FORMAT +DATE_SUB +DATEDIFF +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DEGREES +DIVIDE +E +EXP +EXPM1 +EXTRACT +FLOOR +FROM_DAYS +FROM_UNIXTIME +GET_FORMAT +IF +IFNULL +ISNULL +LAST_DAY +LENGTH +LN +LOCALTIME +LOCALTIMESTAMP +LOCATE +LOG +LOG10 +LOG2 +LOWER +LTRIM +MAKEDATE +MAKETIME +MODULUS +MONTHNAME +MULTIPLY +NOW +NULLIF +PERIOD_ADD +PERIOD_DIFF +PI +POSITION +POW +POWER +RADIANS +RAND +REPLACE +RINT +ROUND +RTRIM +REVERSE +SEC_TO_TIME +SIGN +SIGNUM +SIN +SINH +SQRT +STR_TO_DATE +SUBDATE +SUBTIME +SUBTRACT +SYSDATE +TAN +TIME +TIMEDIFF +TIME_FORMAT +TIME_TO_SEC +TIMESTAMP +TRUNCATE +TO_DAYS +TO_SECONDS +UNIX_TIMESTAMP +UPPER +UTC_DATE +UTC_TIME +UTC_TIMESTAMP +D +T +TS +LEFT_BRACE +RIGHT_BRACE +DENSE_RANK +RANK +ROW_NUMBER +DATE_HISTOGRAM +DAY_OF_MONTH +DAY_OF_YEAR +DAY_OF_WEEK +EXCLUDE +EXTENDED_STATS +FIELD +FILTER +GEO_BOUNDING_BOX +GEO_CELL +GEO_DISTANCE +GEO_DISTANCE_RANGE +GEO_INTERSECTS +GEO_POLYGON +HISTOGRAM +HOUR_OF_DAY +INCLUDE +IN_TERMS +MATCHPHRASE +MATCH_PHRASE +MATCHPHRASEQUERY +SIMPLE_QUERY_STRING +QUERY_STRING +MATCH_PHRASE_PREFIX +MATCHQUERY +MATCH_QUERY +MINUTE_OF_DAY +MINUTE_OF_HOUR +MONTH_OF_YEAR +MULTIMATCH +MULTI_MATCH +MULTIMATCHQUERY +NESTED +PERCENTILES +PERCENTILE +PERCENTILE_APPROX +REGEXP_QUERY +REVERSE_NESTED +QUERY +RANGE +SCORE +SCOREQUERY +SCORE_QUERY +SECOND_OF_MINUTE +STATS +TERM +TERMS +TIMESTAMPADD +TIMESTAMPDIFF +TOPHITS +TYPEOF +WEEK_OF_YEAR +WEEKOFYEAR +WEEKDAY +WILDCARDQUERY +WILDCARD_QUERY +SUBSTR +STRCMP +ADDDATE +YEARWEEK +ALLOW_LEADING_WILDCARD +ANALYZER +ANALYZE_WILDCARD +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY +BOOST +CASE_INSENSITIVE +CUTOFF_FREQUENCY +DEFAULT_FIELD +DEFAULT_OPERATOR +ESCAPE +ENABLE_POSITION_INCREMENTS +FIELDS +FLAGS +FUZZINESS +FUZZY_MAX_EXPANSIONS +FUZZY_PREFIX_LENGTH +FUZZY_REWRITE +FUZZY_TRANSPOSITIONS +LENIENT +LOW_FREQ_OPERATOR +MAX_DETERMINIZED_STATES +MAX_EXPANSIONS +MINIMUM_SHOULD_MATCH +OPERATOR +PHRASE_SLOP +PREFIX_LENGTH +QUOTE_ANALYZER +QUOTE_FIELD_SUFFIX +REWRITE +SLOP +TIE_BREAKER +TIME_ZONE +TYPE +ZERO_TERMS_QUERY +HIGHLIGHT +HIGHLIGHT_PRE_TAGS +HIGHLIGHT_POST_TAGS +MATCH_BOOL_PREFIX +STAR +SLASH +MODULE +PLUS +MINUS +DIV +MOD +EQUAL_SYMBOL +GREATER_SYMBOL +LESS_SYMBOL +EXCLAMATION_SYMBOL +BIT_NOT_OP +BIT_OR_OP +BIT_AND_OP +BIT_XOR_OP +DOT +LR_BRACKET +RR_BRACKET +LT_SQR_PRTHS +RT_SQR_PRTHS +COMMA +SEMI +AT_SIGN +ZERO_DECIMAL +ONE_DECIMAL +TWO_DECIMAL +SINGLE_QUOTE_SYMB +DOUBLE_QUOTE_SYMB +REVERSE_QUOTE_SYMB +COLON_SYMB +START_NATIONAL_STRING_LITERAL +STRING_LITERAL +DECIMAL_LITERAL +HEXADECIMAL_LITERAL +REAL_LITERAL +NULL_SPEC_LITERAL +BIT_STRING +ID +DOUBLE_QUOTE_ID +BACKTICK_QUOTE_ID +ERROR_RECOGNITION + +rule names: +SPACE +SPEC_SQL_COMMENT +COMMENT_INPUT +LINE_COMMENT +ALL +AND +AS +ASC +BOOLEAN +BETWEEN +BY +CASE +CAST +CROSS +COLUMNS +DATETIME +DELETE +DESC +DESCRIBE +DISTINCT +DOUBLE +ELSE +EXISTS +FALSE +FLOAT +FIRST +FROM +GROUP +HAVING +IN +INNER +INT +INTEGER +IS +JOIN +LAST +LEFT +LIKE +LIMIT +LONG +MATCH +NATURAL +MISSING_LITERAL +NOT +NULL_LITERAL +NULLS +ON +OR +ORDER +OUTER +OVER +PARTITION +REGEXP +RIGHT +SELECT +SHOW +STRING +THEN +TRUE +UNION +USING +WHEN +WHERE +EXCEPT +AVG +COUNT +MAX +MIN +SUM +VAR_POP +VAR_SAMP +VARIANCE +STD +STDDEV +STDDEV_POP +STDDEV_SAMP +SUBSTRING +TRIM +END +FULL +OFFSET +INTERVAL +MICROSECOND +SECOND +MINUTE +HOUR +DAY +WEEK +MONTH +QUARTER +YEAR +SECOND_MICROSECOND +MINUTE_MICROSECOND +MINUTE_SECOND +HOUR_MICROSECOND +HOUR_SECOND +HOUR_MINUTE +DAY_MICROSECOND +DAY_SECOND +DAY_MINUTE +DAY_HOUR +YEAR_MONTH +TABLES +ABS +ACOS +ADD +ADDTIME +ASCII +ASIN +ATAN +ATAN2 +CBRT +CEIL +CEILING +CONCAT +CONCAT_WS +CONV +CONVERT_TZ +COS +COSH +COT +CRC32 +CURDATE +CURTIME +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +DATE +DATE_ADD +DATE_FORMAT +DATE_SUB +DATEDIFF +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DEGREES +DIVIDE +E +EXP +EXPM1 +EXTRACT +FLOOR +FROM_DAYS +FROM_UNIXTIME +GET_FORMAT +IF +IFNULL +ISNULL +LAST_DAY +LENGTH +LN +LOCALTIME +LOCALTIMESTAMP +LOCATE +LOG +LOG10 +LOG2 +LOWER +LTRIM +MAKEDATE +MAKETIME +MODULUS +MONTHNAME +MULTIPLY +NOW +NULLIF +PERIOD_ADD +PERIOD_DIFF +PI +POSITION +POW +POWER +RADIANS +RAND +REPLACE +RINT +ROUND +RTRIM +REVERSE +SEC_TO_TIME +SIGN +SIGNUM +SIN +SINH +SQRT +STR_TO_DATE +SUBDATE +SUBTIME +SUBTRACT +SYSDATE +TAN +TIME +TIMEDIFF +TIME_FORMAT +TIME_TO_SEC +TIMESTAMP +TRUNCATE +TO_DAYS +TO_SECONDS +UNIX_TIMESTAMP +UPPER +UTC_DATE +UTC_TIME +UTC_TIMESTAMP +D +T +TS +LEFT_BRACE +RIGHT_BRACE +DENSE_RANK +RANK +ROW_NUMBER +DATE_HISTOGRAM +DAY_OF_MONTH +DAY_OF_YEAR +DAY_OF_WEEK +EXCLUDE +EXTENDED_STATS +FIELD +FILTER +GEO_BOUNDING_BOX +GEO_CELL +GEO_DISTANCE +GEO_DISTANCE_RANGE +GEO_INTERSECTS +GEO_POLYGON +HISTOGRAM +HOUR_OF_DAY +INCLUDE +IN_TERMS +MATCHPHRASE +MATCH_PHRASE +MATCHPHRASEQUERY +SIMPLE_QUERY_STRING +QUERY_STRING +MATCH_PHRASE_PREFIX +MATCHQUERY +MATCH_QUERY +MINUTE_OF_DAY +MINUTE_OF_HOUR +MONTH_OF_YEAR +MULTIMATCH +MULTI_MATCH +MULTIMATCHQUERY +NESTED +PERCENTILES +PERCENTILE +PERCENTILE_APPROX +REGEXP_QUERY +REVERSE_NESTED +QUERY +RANGE +SCORE +SCOREQUERY +SCORE_QUERY +SECOND_OF_MINUTE +STATS +TERM +TERMS +TIMESTAMPADD +TIMESTAMPDIFF +TOPHITS +TYPEOF +WEEK_OF_YEAR +WEEKOFYEAR +WEEKDAY +WILDCARDQUERY +WILDCARD_QUERY +SUBSTR +STRCMP +ADDDATE +YEARWEEK +ALLOW_LEADING_WILDCARD +ANALYZER +ANALYZE_WILDCARD +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY +BOOST +CASE_INSENSITIVE +CUTOFF_FREQUENCY +DEFAULT_FIELD +DEFAULT_OPERATOR +ESCAPE +ENABLE_POSITION_INCREMENTS +FIELDS +FLAGS +FUZZINESS +FUZZY_MAX_EXPANSIONS +FUZZY_PREFIX_LENGTH +FUZZY_REWRITE +FUZZY_TRANSPOSITIONS +LENIENT +LOW_FREQ_OPERATOR +MAX_DETERMINIZED_STATES +MAX_EXPANSIONS +MINIMUM_SHOULD_MATCH +OPERATOR +PHRASE_SLOP +PREFIX_LENGTH +QUOTE_ANALYZER +QUOTE_FIELD_SUFFIX +REWRITE +SLOP +TIE_BREAKER +TIME_ZONE +TYPE +ZERO_TERMS_QUERY +HIGHLIGHT +HIGHLIGHT_PRE_TAGS +HIGHLIGHT_POST_TAGS +MATCH_BOOL_PREFIX +STAR +SLASH +MODULE +PLUS +MINUS +DIV +MOD +EQUAL_SYMBOL +GREATER_SYMBOL +LESS_SYMBOL +EXCLAMATION_SYMBOL +BIT_NOT_OP +BIT_OR_OP +BIT_AND_OP +BIT_XOR_OP +DOT +LR_BRACKET +RR_BRACKET +LT_SQR_PRTHS +RT_SQR_PRTHS +COMMA +SEMI +AT_SIGN +ZERO_DECIMAL +ONE_DECIMAL +TWO_DECIMAL +SINGLE_QUOTE_SYMB +DOUBLE_QUOTE_SYMB +REVERSE_QUOTE_SYMB +COLON_SYMB +START_NATIONAL_STRING_LITERAL +STRING_LITERAL +DECIMAL_LITERAL +HEXADECIMAL_LITERAL +REAL_LITERAL +NULL_SPEC_LITERAL +BIT_STRING +ID +DOUBLE_QUOTE_ID +BACKTICK_QUOTE_ID +EXPONENT_NUM_PART +ID_LITERAL +DQUOTA_STRING +SQUOTA_STRING +BQUOTA_STRING +HEX_DIGIT +DEC_DIGIT +BIT_STRING_L +ERROR_RECOGNITION + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN +null +null +SQLCOMMENT +ERRORCHANNEL + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 352, 3776, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 2, 347, 7, 347, 2, 348, 7, 348, 2, 349, 7, 349, 2, 350, 7, 350, 2, 351, 7, 351, 2, 352, 7, 352, 2, 353, 7, 353, 2, 354, 7, 354, 2, 355, 7, 355, 2, 356, 7, 356, 2, 357, 7, 357, 2, 358, 7, 358, 2, 359, 7, 359, 1, 0, 4, 0, 723, 8, 0, 11, 0, 12, 0, 724, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 734, 8, 1, 11, 1, 12, 1, 735, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 747, 8, 2, 10, 2, 12, 2, 750, 9, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 761, 8, 3, 1, 3, 5, 3, 764, 8, 3, 10, 3, 12, 3, 767, 9, 3, 1, 3, 3, 3, 770, 8, 3, 1, 3, 1, 3, 3, 3, 774, 8, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 780, 8, 3, 1, 3, 1, 3, 3, 3, 784, 8, 3, 3, 3, 786, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 312, 1, 312, 1, 313, 1, 313, 1, 314, 1, 314, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 319, 1, 319, 1, 320, 1, 320, 1, 321, 1, 321, 1, 322, 1, 322, 1, 323, 1, 323, 1, 324, 1, 324, 1, 325, 1, 325, 1, 326, 1, 326, 1, 327, 1, 327, 1, 328, 1, 328, 1, 329, 1, 329, 1, 330, 1, 330, 1, 331, 1, 331, 1, 332, 1, 332, 1, 333, 1, 333, 1, 334, 1, 334, 1, 335, 1, 335, 1, 336, 1, 336, 1, 337, 1, 337, 1, 338, 1, 338, 1, 339, 1, 339, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 343, 4, 343, 3620, 8, 343, 11, 343, 12, 343, 3621, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 4, 344, 3629, 8, 344, 11, 344, 12, 344, 3630, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 4, 344, 3639, 8, 344, 11, 344, 12, 344, 3640, 3, 344, 3643, 8, 344, 1, 345, 4, 345, 3646, 8, 345, 11, 345, 12, 345, 3647, 3, 345, 3650, 8, 345, 1, 345, 1, 345, 4, 345, 3654, 8, 345, 11, 345, 12, 345, 3655, 1, 345, 4, 345, 3659, 8, 345, 11, 345, 12, 345, 3660, 1, 345, 1, 345, 1, 345, 1, 345, 4, 345, 3667, 8, 345, 11, 345, 12, 345, 3668, 3, 345, 3671, 8, 345, 1, 345, 1, 345, 4, 345, 3675, 8, 345, 11, 345, 12, 345, 3676, 1, 345, 1, 345, 1, 345, 4, 345, 3682, 8, 345, 11, 345, 12, 345, 3683, 1, 345, 1, 345, 3, 345, 3688, 8, 345, 1, 346, 1, 346, 1, 346, 1, 347, 1, 347, 1, 348, 1, 348, 1, 349, 1, 349, 1, 350, 1, 350, 1, 351, 1, 351, 3, 351, 3703, 8, 351, 1, 351, 4, 351, 3706, 8, 351, 11, 351, 12, 351, 3707, 1, 352, 4, 352, 3711, 8, 352, 11, 352, 12, 352, 3712, 1, 352, 5, 352, 3716, 8, 352, 10, 352, 12, 352, 3719, 9, 352, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 5, 353, 3727, 8, 353, 10, 353, 12, 353, 3730, 9, 353, 1, 353, 1, 353, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 5, 354, 3740, 8, 354, 10, 354, 12, 354, 3743, 9, 354, 1, 354, 1, 354, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 5, 355, 3753, 8, 355, 10, 355, 12, 355, 3756, 9, 355, 1, 355, 1, 355, 1, 356, 1, 356, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 4, 358, 3767, 8, 358, 11, 358, 12, 358, 3768, 1, 358, 1, 358, 1, 359, 1, 359, 1, 359, 1, 359, 2, 735, 748, 0, 360, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 189, 379, 190, 381, 191, 383, 192, 385, 193, 387, 194, 389, 195, 391, 196, 393, 197, 395, 198, 397, 199, 399, 200, 401, 201, 403, 202, 405, 203, 407, 204, 409, 205, 411, 206, 413, 207, 415, 208, 417, 209, 419, 210, 421, 211, 423, 212, 425, 213, 427, 214, 429, 215, 431, 216, 433, 217, 435, 218, 437, 219, 439, 220, 441, 221, 443, 222, 445, 223, 447, 224, 449, 225, 451, 226, 453, 227, 455, 228, 457, 229, 459, 230, 461, 231, 463, 232, 465, 233, 467, 234, 469, 235, 471, 236, 473, 237, 475, 238, 477, 239, 479, 240, 481, 241, 483, 242, 485, 243, 487, 244, 489, 245, 491, 246, 493, 247, 495, 248, 497, 249, 499, 250, 501, 251, 503, 252, 505, 253, 507, 254, 509, 255, 511, 256, 513, 257, 515, 258, 517, 259, 519, 260, 521, 261, 523, 262, 525, 263, 527, 264, 529, 265, 531, 266, 533, 267, 535, 268, 537, 269, 539, 270, 541, 271, 543, 272, 545, 273, 547, 274, 549, 275, 551, 276, 553, 277, 555, 278, 557, 279, 559, 280, 561, 281, 563, 282, 565, 283, 567, 284, 569, 285, 571, 286, 573, 287, 575, 288, 577, 289, 579, 290, 581, 291, 583, 292, 585, 293, 587, 294, 589, 295, 591, 296, 593, 297, 595, 298, 597, 299, 599, 300, 601, 301, 603, 302, 605, 303, 607, 304, 609, 305, 611, 306, 613, 307, 615, 308, 617, 309, 619, 310, 621, 311, 623, 312, 625, 313, 627, 314, 629, 315, 631, 316, 633, 317, 635, 318, 637, 319, 639, 320, 641, 321, 643, 322, 645, 323, 647, 324, 649, 325, 651, 326, 653, 327, 655, 328, 657, 329, 659, 330, 661, 331, 663, 332, 665, 333, 667, 334, 669, 335, 671, 336, 673, 337, 675, 338, 677, 339, 679, 340, 681, 341, 683, 342, 685, 343, 687, 344, 689, 345, 691, 346, 693, 347, 695, 348, 697, 349, 699, 350, 701, 351, 703, 0, 705, 0, 707, 0, 709, 0, 711, 0, 713, 0, 715, 0, 717, 0, 719, 352, 1, 0, 37, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 78, 78, 110, 110, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 67, 67, 99, 99, 2, 0, 66, 66, 98, 98, 2, 0, 79, 79, 111, 111, 2, 0, 69, 69, 101, 101, 2, 0, 84, 84, 116, 116, 2, 0, 87, 87, 119, 119, 2, 0, 89, 89, 121, 121, 2, 0, 82, 82, 114, 114, 2, 0, 85, 85, 117, 117, 2, 0, 77, 77, 109, 109, 2, 0, 73, 73, 105, 105, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 80, 80, 112, 112, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 81, 81, 113, 113, 2, 0, 90, 90, 122, 122, 2, 0, 43, 43, 45, 45, 4, 0, 42, 42, 64, 90, 95, 95, 97, 122, 6, 0, 42, 42, 45, 45, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 92, 92, 96, 96, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 1, 0, 48, 49, 3806, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 0, 379, 1, 0, 0, 0, 0, 381, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 385, 1, 0, 0, 0, 0, 387, 1, 0, 0, 0, 0, 389, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 397, 1, 0, 0, 0, 0, 399, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 405, 1, 0, 0, 0, 0, 407, 1, 0, 0, 0, 0, 409, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 511, 1, 0, 0, 0, 0, 513, 1, 0, 0, 0, 0, 515, 1, 0, 0, 0, 0, 517, 1, 0, 0, 0, 0, 519, 1, 0, 0, 0, 0, 521, 1, 0, 0, 0, 0, 523, 1, 0, 0, 0, 0, 525, 1, 0, 0, 0, 0, 527, 1, 0, 0, 0, 0, 529, 1, 0, 0, 0, 0, 531, 1, 0, 0, 0, 0, 533, 1, 0, 0, 0, 0, 535, 1, 0, 0, 0, 0, 537, 1, 0, 0, 0, 0, 539, 1, 0, 0, 0, 0, 541, 1, 0, 0, 0, 0, 543, 1, 0, 0, 0, 0, 545, 1, 0, 0, 0, 0, 547, 1, 0, 0, 0, 0, 549, 1, 0, 0, 0, 0, 551, 1, 0, 0, 0, 0, 553, 1, 0, 0, 0, 0, 555, 1, 0, 0, 0, 0, 557, 1, 0, 0, 0, 0, 559, 1, 0, 0, 0, 0, 561, 1, 0, 0, 0, 0, 563, 1, 0, 0, 0, 0, 565, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 0, 575, 1, 0, 0, 0, 0, 577, 1, 0, 0, 0, 0, 579, 1, 0, 0, 0, 0, 581, 1, 0, 0, 0, 0, 583, 1, 0, 0, 0, 0, 585, 1, 0, 0, 0, 0, 587, 1, 0, 0, 0, 0, 589, 1, 0, 0, 0, 0, 591, 1, 0, 0, 0, 0, 593, 1, 0, 0, 0, 0, 595, 1, 0, 0, 0, 0, 597, 1, 0, 0, 0, 0, 599, 1, 0, 0, 0, 0, 601, 1, 0, 0, 0, 0, 603, 1, 0, 0, 0, 0, 605, 1, 0, 0, 0, 0, 607, 1, 0, 0, 0, 0, 609, 1, 0, 0, 0, 0, 611, 1, 0, 0, 0, 0, 613, 1, 0, 0, 0, 0, 615, 1, 0, 0, 0, 0, 617, 1, 0, 0, 0, 0, 619, 1, 0, 0, 0, 0, 621, 1, 0, 0, 0, 0, 623, 1, 0, 0, 0, 0, 625, 1, 0, 0, 0, 0, 627, 1, 0, 0, 0, 0, 629, 1, 0, 0, 0, 0, 631, 1, 0, 0, 0, 0, 633, 1, 0, 0, 0, 0, 635, 1, 0, 0, 0, 0, 637, 1, 0, 0, 0, 0, 639, 1, 0, 0, 0, 0, 641, 1, 0, 0, 0, 0, 643, 1, 0, 0, 0, 0, 645, 1, 0, 0, 0, 0, 647, 1, 0, 0, 0, 0, 649, 1, 0, 0, 0, 0, 651, 1, 0, 0, 0, 0, 653, 1, 0, 0, 0, 0, 655, 1, 0, 0, 0, 0, 657, 1, 0, 0, 0, 0, 659, 1, 0, 0, 0, 0, 661, 1, 0, 0, 0, 0, 663, 1, 0, 0, 0, 0, 665, 1, 0, 0, 0, 0, 667, 1, 0, 0, 0, 0, 669, 1, 0, 0, 0, 0, 671, 1, 0, 0, 0, 0, 673, 1, 0, 0, 0, 0, 675, 1, 0, 0, 0, 0, 677, 1, 0, 0, 0, 0, 679, 1, 0, 0, 0, 0, 681, 1, 0, 0, 0, 0, 683, 1, 0, 0, 0, 0, 685, 1, 0, 0, 0, 0, 687, 1, 0, 0, 0, 0, 689, 1, 0, 0, 0, 0, 691, 1, 0, 0, 0, 0, 693, 1, 0, 0, 0, 0, 695, 1, 0, 0, 0, 0, 697, 1, 0, 0, 0, 0, 699, 1, 0, 0, 0, 0, 701, 1, 0, 0, 0, 0, 719, 1, 0, 0, 0, 1, 722, 1, 0, 0, 0, 3, 728, 1, 0, 0, 0, 5, 742, 1, 0, 0, 0, 7, 785, 1, 0, 0, 0, 9, 789, 1, 0, 0, 0, 11, 793, 1, 0, 0, 0, 13, 797, 1, 0, 0, 0, 15, 800, 1, 0, 0, 0, 17, 804, 1, 0, 0, 0, 19, 812, 1, 0, 0, 0, 21, 820, 1, 0, 0, 0, 23, 823, 1, 0, 0, 0, 25, 828, 1, 0, 0, 0, 27, 833, 1, 0, 0, 0, 29, 839, 1, 0, 0, 0, 31, 847, 1, 0, 0, 0, 33, 856, 1, 0, 0, 0, 35, 863, 1, 0, 0, 0, 37, 868, 1, 0, 0, 0, 39, 877, 1, 0, 0, 0, 41, 886, 1, 0, 0, 0, 43, 893, 1, 0, 0, 0, 45, 898, 1, 0, 0, 0, 47, 905, 1, 0, 0, 0, 49, 911, 1, 0, 0, 0, 51, 917, 1, 0, 0, 0, 53, 923, 1, 0, 0, 0, 55, 928, 1, 0, 0, 0, 57, 934, 1, 0, 0, 0, 59, 941, 1, 0, 0, 0, 61, 944, 1, 0, 0, 0, 63, 950, 1, 0, 0, 0, 65, 954, 1, 0, 0, 0, 67, 962, 1, 0, 0, 0, 69, 965, 1, 0, 0, 0, 71, 970, 1, 0, 0, 0, 73, 975, 1, 0, 0, 0, 75, 980, 1, 0, 0, 0, 77, 985, 1, 0, 0, 0, 79, 991, 1, 0, 0, 0, 81, 996, 1, 0, 0, 0, 83, 1002, 1, 0, 0, 0, 85, 1010, 1, 0, 0, 0, 87, 1018, 1, 0, 0, 0, 89, 1022, 1, 0, 0, 0, 91, 1027, 1, 0, 0, 0, 93, 1033, 1, 0, 0, 0, 95, 1036, 1, 0, 0, 0, 97, 1039, 1, 0, 0, 0, 99, 1045, 1, 0, 0, 0, 101, 1051, 1, 0, 0, 0, 103, 1056, 1, 0, 0, 0, 105, 1066, 1, 0, 0, 0, 107, 1073, 1, 0, 0, 0, 109, 1079, 1, 0, 0, 0, 111, 1086, 1, 0, 0, 0, 113, 1091, 1, 0, 0, 0, 115, 1098, 1, 0, 0, 0, 117, 1103, 1, 0, 0, 0, 119, 1108, 1, 0, 0, 0, 121, 1114, 1, 0, 0, 0, 123, 1120, 1, 0, 0, 0, 125, 1125, 1, 0, 0, 0, 127, 1131, 1, 0, 0, 0, 129, 1137, 1, 0, 0, 0, 131, 1141, 1, 0, 0, 0, 133, 1147, 1, 0, 0, 0, 135, 1151, 1, 0, 0, 0, 137, 1155, 1, 0, 0, 0, 139, 1159, 1, 0, 0, 0, 141, 1167, 1, 0, 0, 0, 143, 1176, 1, 0, 0, 0, 145, 1185, 1, 0, 0, 0, 147, 1189, 1, 0, 0, 0, 149, 1196, 1, 0, 0, 0, 151, 1207, 1, 0, 0, 0, 153, 1219, 1, 0, 0, 0, 155, 1229, 1, 0, 0, 0, 157, 1234, 1, 0, 0, 0, 159, 1238, 1, 0, 0, 0, 161, 1243, 1, 0, 0, 0, 163, 1250, 1, 0, 0, 0, 165, 1259, 1, 0, 0, 0, 167, 1271, 1, 0, 0, 0, 169, 1278, 1, 0, 0, 0, 171, 1285, 1, 0, 0, 0, 173, 1290, 1, 0, 0, 0, 175, 1294, 1, 0, 0, 0, 177, 1299, 1, 0, 0, 0, 179, 1305, 1, 0, 0, 0, 181, 1313, 1, 0, 0, 0, 183, 1318, 1, 0, 0, 0, 185, 1337, 1, 0, 0, 0, 187, 1356, 1, 0, 0, 0, 189, 1370, 1, 0, 0, 0, 191, 1387, 1, 0, 0, 0, 193, 1399, 1, 0, 0, 0, 195, 1411, 1, 0, 0, 0, 197, 1427, 1, 0, 0, 0, 199, 1438, 1, 0, 0, 0, 201, 1449, 1, 0, 0, 0, 203, 1458, 1, 0, 0, 0, 205, 1469, 1, 0, 0, 0, 207, 1476, 1, 0, 0, 0, 209, 1480, 1, 0, 0, 0, 211, 1485, 1, 0, 0, 0, 213, 1489, 1, 0, 0, 0, 215, 1497, 1, 0, 0, 0, 217, 1503, 1, 0, 0, 0, 219, 1508, 1, 0, 0, 0, 221, 1513, 1, 0, 0, 0, 223, 1519, 1, 0, 0, 0, 225, 1524, 1, 0, 0, 0, 227, 1529, 1, 0, 0, 0, 229, 1537, 1, 0, 0, 0, 231, 1544, 1, 0, 0, 0, 233, 1554, 1, 0, 0, 0, 235, 1559, 1, 0, 0, 0, 237, 1570, 1, 0, 0, 0, 239, 1574, 1, 0, 0, 0, 241, 1579, 1, 0, 0, 0, 243, 1583, 1, 0, 0, 0, 245, 1589, 1, 0, 0, 0, 247, 1597, 1, 0, 0, 0, 249, 1605, 1, 0, 0, 0, 251, 1618, 1, 0, 0, 0, 253, 1631, 1, 0, 0, 0, 255, 1649, 1, 0, 0, 0, 257, 1654, 1, 0, 0, 0, 259, 1663, 1, 0, 0, 0, 261, 1675, 1, 0, 0, 0, 263, 1684, 1, 0, 0, 0, 265, 1693, 1, 0, 0, 0, 267, 1701, 1, 0, 0, 0, 269, 1712, 1, 0, 0, 0, 271, 1722, 1, 0, 0, 0, 273, 1732, 1, 0, 0, 0, 275, 1740, 1, 0, 0, 0, 277, 1747, 1, 0, 0, 0, 279, 1749, 1, 0, 0, 0, 281, 1753, 1, 0, 0, 0, 283, 1759, 1, 0, 0, 0, 285, 1767, 1, 0, 0, 0, 287, 1773, 1, 0, 0, 0, 289, 1783, 1, 0, 0, 0, 291, 1797, 1, 0, 0, 0, 293, 1808, 1, 0, 0, 0, 295, 1811, 1, 0, 0, 0, 297, 1818, 1, 0, 0, 0, 299, 1825, 1, 0, 0, 0, 301, 1834, 1, 0, 0, 0, 303, 1841, 1, 0, 0, 0, 305, 1844, 1, 0, 0, 0, 307, 1854, 1, 0, 0, 0, 309, 1869, 1, 0, 0, 0, 311, 1876, 1, 0, 0, 0, 313, 1880, 1, 0, 0, 0, 315, 1886, 1, 0, 0, 0, 317, 1891, 1, 0, 0, 0, 319, 1897, 1, 0, 0, 0, 321, 1903, 1, 0, 0, 0, 323, 1912, 1, 0, 0, 0, 325, 1921, 1, 0, 0, 0, 327, 1929, 1, 0, 0, 0, 329, 1939, 1, 0, 0, 0, 331, 1948, 1, 0, 0, 0, 333, 1952, 1, 0, 0, 0, 335, 1959, 1, 0, 0, 0, 337, 1970, 1, 0, 0, 0, 339, 1982, 1, 0, 0, 0, 341, 1985, 1, 0, 0, 0, 343, 1994, 1, 0, 0, 0, 345, 1998, 1, 0, 0, 0, 347, 2004, 1, 0, 0, 0, 349, 2012, 1, 0, 0, 0, 351, 2017, 1, 0, 0, 0, 353, 2025, 1, 0, 0, 0, 355, 2030, 1, 0, 0, 0, 357, 2036, 1, 0, 0, 0, 359, 2042, 1, 0, 0, 0, 361, 2050, 1, 0, 0, 0, 363, 2062, 1, 0, 0, 0, 365, 2067, 1, 0, 0, 0, 367, 2074, 1, 0, 0, 0, 369, 2078, 1, 0, 0, 0, 371, 2083, 1, 0, 0, 0, 373, 2088, 1, 0, 0, 0, 375, 2100, 1, 0, 0, 0, 377, 2108, 1, 0, 0, 0, 379, 2116, 1, 0, 0, 0, 381, 2125, 1, 0, 0, 0, 383, 2133, 1, 0, 0, 0, 385, 2137, 1, 0, 0, 0, 387, 2142, 1, 0, 0, 0, 389, 2151, 1, 0, 0, 0, 391, 2163, 1, 0, 0, 0, 393, 2175, 1, 0, 0, 0, 395, 2185, 1, 0, 0, 0, 397, 2194, 1, 0, 0, 0, 399, 2202, 1, 0, 0, 0, 401, 2213, 1, 0, 0, 0, 403, 2228, 1, 0, 0, 0, 405, 2234, 1, 0, 0, 0, 407, 2243, 1, 0, 0, 0, 409, 2252, 1, 0, 0, 0, 411, 2266, 1, 0, 0, 0, 413, 2268, 1, 0, 0, 0, 415, 2270, 1, 0, 0, 0, 417, 2273, 1, 0, 0, 0, 419, 2275, 1, 0, 0, 0, 421, 2277, 1, 0, 0, 0, 423, 2288, 1, 0, 0, 0, 425, 2293, 1, 0, 0, 0, 427, 2304, 1, 0, 0, 0, 429, 2319, 1, 0, 0, 0, 431, 2332, 1, 0, 0, 0, 433, 2344, 1, 0, 0, 0, 435, 2356, 1, 0, 0, 0, 437, 2364, 1, 0, 0, 0, 439, 2379, 1, 0, 0, 0, 441, 2385, 1, 0, 0, 0, 443, 2392, 1, 0, 0, 0, 445, 2409, 1, 0, 0, 0, 447, 2418, 1, 0, 0, 0, 449, 2431, 1, 0, 0, 0, 451, 2450, 1, 0, 0, 0, 453, 2465, 1, 0, 0, 0, 455, 2477, 1, 0, 0, 0, 457, 2487, 1, 0, 0, 0, 459, 2499, 1, 0, 0, 0, 461, 2507, 1, 0, 0, 0, 463, 2516, 1, 0, 0, 0, 465, 2528, 1, 0, 0, 0, 467, 2541, 1, 0, 0, 0, 469, 2558, 1, 0, 0, 0, 471, 2578, 1, 0, 0, 0, 473, 2591, 1, 0, 0, 0, 475, 2611, 1, 0, 0, 0, 477, 2622, 1, 0, 0, 0, 479, 2634, 1, 0, 0, 0, 481, 2648, 1, 0, 0, 0, 483, 2663, 1, 0, 0, 0, 485, 2677, 1, 0, 0, 0, 487, 2688, 1, 0, 0, 0, 489, 2700, 1, 0, 0, 0, 491, 2716, 1, 0, 0, 0, 493, 2723, 1, 0, 0, 0, 495, 2735, 1, 0, 0, 0, 497, 2746, 1, 0, 0, 0, 499, 2764, 1, 0, 0, 0, 501, 2777, 1, 0, 0, 0, 503, 2792, 1, 0, 0, 0, 505, 2798, 1, 0, 0, 0, 507, 2804, 1, 0, 0, 0, 509, 2810, 1, 0, 0, 0, 511, 2821, 1, 0, 0, 0, 513, 2833, 1, 0, 0, 0, 515, 2850, 1, 0, 0, 0, 517, 2856, 1, 0, 0, 0, 519, 2861, 1, 0, 0, 0, 521, 2867, 1, 0, 0, 0, 523, 2880, 1, 0, 0, 0, 525, 2894, 1, 0, 0, 0, 527, 2902, 1, 0, 0, 0, 529, 2909, 1, 0, 0, 0, 531, 2922, 1, 0, 0, 0, 533, 2933, 1, 0, 0, 0, 535, 2941, 1, 0, 0, 0, 537, 2955, 1, 0, 0, 0, 539, 2970, 1, 0, 0, 0, 541, 2977, 1, 0, 0, 0, 543, 2984, 1, 0, 0, 0, 545, 2992, 1, 0, 0, 0, 547, 3001, 1, 0, 0, 0, 549, 3024, 1, 0, 0, 0, 551, 3033, 1, 0, 0, 0, 553, 3050, 1, 0, 0, 0, 555, 3086, 1, 0, 0, 0, 557, 3092, 1, 0, 0, 0, 559, 3109, 1, 0, 0, 0, 561, 3126, 1, 0, 0, 0, 563, 3140, 1, 0, 0, 0, 565, 3157, 1, 0, 0, 0, 567, 3164, 1, 0, 0, 0, 569, 3191, 1, 0, 0, 0, 571, 3198, 1, 0, 0, 0, 573, 3204, 1, 0, 0, 0, 575, 3214, 1, 0, 0, 0, 577, 3235, 1, 0, 0, 0, 579, 3255, 1, 0, 0, 0, 581, 3269, 1, 0, 0, 0, 583, 3290, 1, 0, 0, 0, 585, 3298, 1, 0, 0, 0, 587, 3316, 1, 0, 0, 0, 589, 3340, 1, 0, 0, 0, 591, 3355, 1, 0, 0, 0, 593, 3376, 1, 0, 0, 0, 595, 3385, 1, 0, 0, 0, 597, 3397, 1, 0, 0, 0, 599, 3411, 1, 0, 0, 0, 601, 3426, 1, 0, 0, 0, 603, 3445, 1, 0, 0, 0, 605, 3453, 1, 0, 0, 0, 607, 3458, 1, 0, 0, 0, 609, 3470, 1, 0, 0, 0, 611, 3480, 1, 0, 0, 0, 613, 3485, 1, 0, 0, 0, 615, 3502, 1, 0, 0, 0, 617, 3512, 1, 0, 0, 0, 619, 3521, 1, 0, 0, 0, 621, 3531, 1, 0, 0, 0, 623, 3549, 1, 0, 0, 0, 625, 3551, 1, 0, 0, 0, 627, 3553, 1, 0, 0, 0, 629, 3555, 1, 0, 0, 0, 631, 3557, 1, 0, 0, 0, 633, 3559, 1, 0, 0, 0, 635, 3563, 1, 0, 0, 0, 637, 3567, 1, 0, 0, 0, 639, 3569, 1, 0, 0, 0, 641, 3571, 1, 0, 0, 0, 643, 3573, 1, 0, 0, 0, 645, 3575, 1, 0, 0, 0, 647, 3577, 1, 0, 0, 0, 649, 3579, 1, 0, 0, 0, 651, 3581, 1, 0, 0, 0, 653, 3583, 1, 0, 0, 0, 655, 3585, 1, 0, 0, 0, 657, 3587, 1, 0, 0, 0, 659, 3589, 1, 0, 0, 0, 661, 3591, 1, 0, 0, 0, 663, 3593, 1, 0, 0, 0, 665, 3595, 1, 0, 0, 0, 667, 3597, 1, 0, 0, 0, 669, 3599, 1, 0, 0, 0, 671, 3601, 1, 0, 0, 0, 673, 3603, 1, 0, 0, 0, 675, 3605, 1, 0, 0, 0, 677, 3607, 1, 0, 0, 0, 679, 3609, 1, 0, 0, 0, 681, 3611, 1, 0, 0, 0, 683, 3613, 1, 0, 0, 0, 685, 3616, 1, 0, 0, 0, 687, 3619, 1, 0, 0, 0, 689, 3642, 1, 0, 0, 0, 691, 3687, 1, 0, 0, 0, 693, 3689, 1, 0, 0, 0, 695, 3692, 1, 0, 0, 0, 697, 3694, 1, 0, 0, 0, 699, 3696, 1, 0, 0, 0, 701, 3698, 1, 0, 0, 0, 703, 3700, 1, 0, 0, 0, 705, 3710, 1, 0, 0, 0, 707, 3720, 1, 0, 0, 0, 709, 3733, 1, 0, 0, 0, 711, 3746, 1, 0, 0, 0, 713, 3759, 1, 0, 0, 0, 715, 3761, 1, 0, 0, 0, 717, 3763, 1, 0, 0, 0, 719, 3772, 1, 0, 0, 0, 721, 723, 7, 0, 0, 0, 722, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 727, 6, 0, 0, 0, 727, 2, 1, 0, 0, 0, 728, 729, 5, 47, 0, 0, 729, 730, 5, 42, 0, 0, 730, 731, 5, 33, 0, 0, 731, 733, 1, 0, 0, 0, 732, 734, 9, 0, 0, 0, 733, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 5, 42, 0, 0, 738, 739, 5, 47, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 6, 1, 1, 0, 741, 4, 1, 0, 0, 0, 742, 743, 5, 47, 0, 0, 743, 744, 5, 42, 0, 0, 744, 748, 1, 0, 0, 0, 745, 747, 9, 0, 0, 0, 746, 745, 1, 0, 0, 0, 747, 750, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 749, 751, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 751, 752, 5, 42, 0, 0, 752, 753, 5, 47, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 6, 2, 0, 0, 755, 6, 1, 0, 0, 0, 756, 757, 5, 45, 0, 0, 757, 758, 5, 45, 0, 0, 758, 761, 5, 32, 0, 0, 759, 761, 5, 35, 0, 0, 760, 756, 1, 0, 0, 0, 760, 759, 1, 0, 0, 0, 761, 765, 1, 0, 0, 0, 762, 764, 8, 1, 0, 0, 763, 762, 1, 0, 0, 0, 764, 767, 1, 0, 0, 0, 765, 763, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 773, 1, 0, 0, 0, 767, 765, 1, 0, 0, 0, 768, 770, 5, 13, 0, 0, 769, 768, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 774, 5, 10, 0, 0, 772, 774, 5, 0, 0, 1, 773, 769, 1, 0, 0, 0, 773, 772, 1, 0, 0, 0, 774, 786, 1, 0, 0, 0, 775, 776, 5, 45, 0, 0, 776, 777, 5, 45, 0, 0, 777, 783, 1, 0, 0, 0, 778, 780, 5, 13, 0, 0, 779, 778, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 784, 5, 10, 0, 0, 782, 784, 5, 0, 0, 1, 783, 779, 1, 0, 0, 0, 783, 782, 1, 0, 0, 0, 784, 786, 1, 0, 0, 0, 785, 760, 1, 0, 0, 0, 785, 775, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 6, 3, 0, 0, 788, 8, 1, 0, 0, 0, 789, 790, 7, 2, 0, 0, 790, 791, 7, 3, 0, 0, 791, 792, 7, 3, 0, 0, 792, 10, 1, 0, 0, 0, 793, 794, 7, 2, 0, 0, 794, 795, 7, 4, 0, 0, 795, 796, 7, 5, 0, 0, 796, 12, 1, 0, 0, 0, 797, 798, 7, 2, 0, 0, 798, 799, 7, 6, 0, 0, 799, 14, 1, 0, 0, 0, 800, 801, 7, 2, 0, 0, 801, 802, 7, 6, 0, 0, 802, 803, 7, 7, 0, 0, 803, 16, 1, 0, 0, 0, 804, 805, 7, 8, 0, 0, 805, 806, 7, 9, 0, 0, 806, 807, 7, 9, 0, 0, 807, 808, 7, 3, 0, 0, 808, 809, 7, 10, 0, 0, 809, 810, 7, 2, 0, 0, 810, 811, 7, 4, 0, 0, 811, 18, 1, 0, 0, 0, 812, 813, 7, 8, 0, 0, 813, 814, 7, 10, 0, 0, 814, 815, 7, 11, 0, 0, 815, 816, 7, 12, 0, 0, 816, 817, 7, 10, 0, 0, 817, 818, 7, 10, 0, 0, 818, 819, 7, 4, 0, 0, 819, 20, 1, 0, 0, 0, 820, 821, 7, 8, 0, 0, 821, 822, 7, 13, 0, 0, 822, 22, 1, 0, 0, 0, 823, 824, 7, 7, 0, 0, 824, 825, 7, 2, 0, 0, 825, 826, 7, 6, 0, 0, 826, 827, 7, 10, 0, 0, 827, 24, 1, 0, 0, 0, 828, 829, 7, 7, 0, 0, 829, 830, 7, 2, 0, 0, 830, 831, 7, 6, 0, 0, 831, 832, 7, 11, 0, 0, 832, 26, 1, 0, 0, 0, 833, 834, 7, 7, 0, 0, 834, 835, 7, 14, 0, 0, 835, 836, 7, 9, 0, 0, 836, 837, 7, 6, 0, 0, 837, 838, 7, 6, 0, 0, 838, 28, 1, 0, 0, 0, 839, 840, 7, 7, 0, 0, 840, 841, 7, 9, 0, 0, 841, 842, 7, 3, 0, 0, 842, 843, 7, 15, 0, 0, 843, 844, 7, 16, 0, 0, 844, 845, 7, 4, 0, 0, 845, 846, 7, 6, 0, 0, 846, 30, 1, 0, 0, 0, 847, 848, 7, 5, 0, 0, 848, 849, 7, 2, 0, 0, 849, 850, 7, 11, 0, 0, 850, 851, 7, 10, 0, 0, 851, 852, 7, 11, 0, 0, 852, 853, 7, 17, 0, 0, 853, 854, 7, 16, 0, 0, 854, 855, 7, 10, 0, 0, 855, 32, 1, 0, 0, 0, 856, 857, 7, 5, 0, 0, 857, 858, 7, 10, 0, 0, 858, 859, 7, 3, 0, 0, 859, 860, 7, 10, 0, 0, 860, 861, 7, 11, 0, 0, 861, 862, 7, 10, 0, 0, 862, 34, 1, 0, 0, 0, 863, 864, 7, 5, 0, 0, 864, 865, 7, 10, 0, 0, 865, 866, 7, 6, 0, 0, 866, 867, 7, 7, 0, 0, 867, 36, 1, 0, 0, 0, 868, 869, 7, 5, 0, 0, 869, 870, 7, 10, 0, 0, 870, 871, 7, 6, 0, 0, 871, 872, 7, 7, 0, 0, 872, 873, 7, 14, 0, 0, 873, 874, 7, 17, 0, 0, 874, 875, 7, 8, 0, 0, 875, 876, 7, 10, 0, 0, 876, 38, 1, 0, 0, 0, 877, 878, 7, 5, 0, 0, 878, 879, 7, 17, 0, 0, 879, 880, 7, 6, 0, 0, 880, 881, 7, 11, 0, 0, 881, 882, 7, 17, 0, 0, 882, 883, 7, 4, 0, 0, 883, 884, 7, 7, 0, 0, 884, 885, 7, 11, 0, 0, 885, 40, 1, 0, 0, 0, 886, 887, 7, 5, 0, 0, 887, 888, 7, 9, 0, 0, 888, 889, 7, 15, 0, 0, 889, 890, 7, 8, 0, 0, 890, 891, 7, 3, 0, 0, 891, 892, 7, 10, 0, 0, 892, 42, 1, 0, 0, 0, 893, 894, 7, 10, 0, 0, 894, 895, 7, 3, 0, 0, 895, 896, 7, 6, 0, 0, 896, 897, 7, 10, 0, 0, 897, 44, 1, 0, 0, 0, 898, 899, 7, 10, 0, 0, 899, 900, 7, 18, 0, 0, 900, 901, 7, 17, 0, 0, 901, 902, 7, 6, 0, 0, 902, 903, 7, 11, 0, 0, 903, 904, 7, 6, 0, 0, 904, 46, 1, 0, 0, 0, 905, 906, 7, 19, 0, 0, 906, 907, 7, 2, 0, 0, 907, 908, 7, 3, 0, 0, 908, 909, 7, 6, 0, 0, 909, 910, 7, 10, 0, 0, 910, 48, 1, 0, 0, 0, 911, 912, 7, 19, 0, 0, 912, 913, 7, 3, 0, 0, 913, 914, 7, 9, 0, 0, 914, 915, 7, 2, 0, 0, 915, 916, 7, 11, 0, 0, 916, 50, 1, 0, 0, 0, 917, 918, 7, 19, 0, 0, 918, 919, 7, 17, 0, 0, 919, 920, 7, 14, 0, 0, 920, 921, 7, 6, 0, 0, 921, 922, 7, 11, 0, 0, 922, 52, 1, 0, 0, 0, 923, 924, 7, 19, 0, 0, 924, 925, 7, 14, 0, 0, 925, 926, 7, 9, 0, 0, 926, 927, 7, 16, 0, 0, 927, 54, 1, 0, 0, 0, 928, 929, 7, 20, 0, 0, 929, 930, 7, 14, 0, 0, 930, 931, 7, 9, 0, 0, 931, 932, 7, 15, 0, 0, 932, 933, 7, 21, 0, 0, 933, 56, 1, 0, 0, 0, 934, 935, 7, 22, 0, 0, 935, 936, 7, 2, 0, 0, 936, 937, 7, 23, 0, 0, 937, 938, 7, 17, 0, 0, 938, 939, 7, 4, 0, 0, 939, 940, 7, 20, 0, 0, 940, 58, 1, 0, 0, 0, 941, 942, 7, 17, 0, 0, 942, 943, 7, 4, 0, 0, 943, 60, 1, 0, 0, 0, 944, 945, 7, 17, 0, 0, 945, 946, 7, 4, 0, 0, 946, 947, 7, 4, 0, 0, 947, 948, 7, 10, 0, 0, 948, 949, 7, 14, 0, 0, 949, 62, 1, 0, 0, 0, 950, 951, 7, 17, 0, 0, 951, 952, 7, 4, 0, 0, 952, 953, 7, 11, 0, 0, 953, 64, 1, 0, 0, 0, 954, 955, 7, 17, 0, 0, 955, 956, 7, 4, 0, 0, 956, 957, 7, 11, 0, 0, 957, 958, 7, 10, 0, 0, 958, 959, 7, 20, 0, 0, 959, 960, 7, 10, 0, 0, 960, 961, 7, 14, 0, 0, 961, 66, 1, 0, 0, 0, 962, 963, 7, 17, 0, 0, 963, 964, 7, 6, 0, 0, 964, 68, 1, 0, 0, 0, 965, 966, 7, 24, 0, 0, 966, 967, 7, 9, 0, 0, 967, 968, 7, 17, 0, 0, 968, 969, 7, 4, 0, 0, 969, 70, 1, 0, 0, 0, 970, 971, 7, 3, 0, 0, 971, 972, 7, 2, 0, 0, 972, 973, 7, 6, 0, 0, 973, 974, 7, 11, 0, 0, 974, 72, 1, 0, 0, 0, 975, 976, 7, 3, 0, 0, 976, 977, 7, 10, 0, 0, 977, 978, 7, 19, 0, 0, 978, 979, 7, 11, 0, 0, 979, 74, 1, 0, 0, 0, 980, 981, 7, 3, 0, 0, 981, 982, 7, 17, 0, 0, 982, 983, 7, 25, 0, 0, 983, 984, 7, 10, 0, 0, 984, 76, 1, 0, 0, 0, 985, 986, 7, 3, 0, 0, 986, 987, 7, 17, 0, 0, 987, 988, 7, 16, 0, 0, 988, 989, 7, 17, 0, 0, 989, 990, 7, 11, 0, 0, 990, 78, 1, 0, 0, 0, 991, 992, 7, 3, 0, 0, 992, 993, 7, 9, 0, 0, 993, 994, 7, 4, 0, 0, 994, 995, 7, 20, 0, 0, 995, 80, 1, 0, 0, 0, 996, 997, 7, 16, 0, 0, 997, 998, 7, 2, 0, 0, 998, 999, 7, 11, 0, 0, 999, 1000, 7, 7, 0, 0, 1000, 1001, 7, 22, 0, 0, 1001, 82, 1, 0, 0, 0, 1002, 1003, 7, 4, 0, 0, 1003, 1004, 7, 2, 0, 0, 1004, 1005, 7, 11, 0, 0, 1005, 1006, 7, 15, 0, 0, 1006, 1007, 7, 14, 0, 0, 1007, 1008, 7, 2, 0, 0, 1008, 1009, 7, 3, 0, 0, 1009, 84, 1, 0, 0, 0, 1010, 1011, 7, 16, 0, 0, 1011, 1012, 7, 17, 0, 0, 1012, 1013, 7, 6, 0, 0, 1013, 1014, 7, 6, 0, 0, 1014, 1015, 7, 17, 0, 0, 1015, 1016, 7, 4, 0, 0, 1016, 1017, 7, 20, 0, 0, 1017, 86, 1, 0, 0, 0, 1018, 1019, 7, 4, 0, 0, 1019, 1020, 7, 9, 0, 0, 1020, 1021, 7, 11, 0, 0, 1021, 88, 1, 0, 0, 0, 1022, 1023, 7, 4, 0, 0, 1023, 1024, 7, 15, 0, 0, 1024, 1025, 7, 3, 0, 0, 1025, 1026, 7, 3, 0, 0, 1026, 90, 1, 0, 0, 0, 1027, 1028, 7, 4, 0, 0, 1028, 1029, 7, 15, 0, 0, 1029, 1030, 7, 3, 0, 0, 1030, 1031, 7, 3, 0, 0, 1031, 1032, 7, 6, 0, 0, 1032, 92, 1, 0, 0, 0, 1033, 1034, 7, 9, 0, 0, 1034, 1035, 7, 4, 0, 0, 1035, 94, 1, 0, 0, 0, 1036, 1037, 7, 9, 0, 0, 1037, 1038, 7, 14, 0, 0, 1038, 96, 1, 0, 0, 0, 1039, 1040, 7, 9, 0, 0, 1040, 1041, 7, 14, 0, 0, 1041, 1042, 7, 5, 0, 0, 1042, 1043, 7, 10, 0, 0, 1043, 1044, 7, 14, 0, 0, 1044, 98, 1, 0, 0, 0, 1045, 1046, 7, 9, 0, 0, 1046, 1047, 7, 15, 0, 0, 1047, 1048, 7, 11, 0, 0, 1048, 1049, 7, 10, 0, 0, 1049, 1050, 7, 14, 0, 0, 1050, 100, 1, 0, 0, 0, 1051, 1052, 7, 9, 0, 0, 1052, 1053, 7, 23, 0, 0, 1053, 1054, 7, 10, 0, 0, 1054, 1055, 7, 14, 0, 0, 1055, 102, 1, 0, 0, 0, 1056, 1057, 7, 21, 0, 0, 1057, 1058, 7, 2, 0, 0, 1058, 1059, 7, 14, 0, 0, 1059, 1060, 7, 11, 0, 0, 1060, 1061, 7, 17, 0, 0, 1061, 1062, 7, 11, 0, 0, 1062, 1063, 7, 17, 0, 0, 1063, 1064, 7, 9, 0, 0, 1064, 1065, 7, 4, 0, 0, 1065, 104, 1, 0, 0, 0, 1066, 1067, 7, 14, 0, 0, 1067, 1068, 7, 10, 0, 0, 1068, 1069, 7, 20, 0, 0, 1069, 1070, 7, 10, 0, 0, 1070, 1071, 7, 18, 0, 0, 1071, 1072, 7, 21, 0, 0, 1072, 106, 1, 0, 0, 0, 1073, 1074, 7, 14, 0, 0, 1074, 1075, 7, 17, 0, 0, 1075, 1076, 7, 20, 0, 0, 1076, 1077, 7, 22, 0, 0, 1077, 1078, 7, 11, 0, 0, 1078, 108, 1, 0, 0, 0, 1079, 1080, 7, 6, 0, 0, 1080, 1081, 7, 10, 0, 0, 1081, 1082, 7, 3, 0, 0, 1082, 1083, 7, 10, 0, 0, 1083, 1084, 7, 7, 0, 0, 1084, 1085, 7, 11, 0, 0, 1085, 110, 1, 0, 0, 0, 1086, 1087, 7, 6, 0, 0, 1087, 1088, 7, 22, 0, 0, 1088, 1089, 7, 9, 0, 0, 1089, 1090, 7, 12, 0, 0, 1090, 112, 1, 0, 0, 0, 1091, 1092, 7, 6, 0, 0, 1092, 1093, 7, 11, 0, 0, 1093, 1094, 7, 14, 0, 0, 1094, 1095, 7, 17, 0, 0, 1095, 1096, 7, 4, 0, 0, 1096, 1097, 7, 20, 0, 0, 1097, 114, 1, 0, 0, 0, 1098, 1099, 7, 11, 0, 0, 1099, 1100, 7, 22, 0, 0, 1100, 1101, 7, 10, 0, 0, 1101, 1102, 7, 4, 0, 0, 1102, 116, 1, 0, 0, 0, 1103, 1104, 7, 11, 0, 0, 1104, 1105, 7, 14, 0, 0, 1105, 1106, 7, 15, 0, 0, 1106, 1107, 7, 10, 0, 0, 1107, 118, 1, 0, 0, 0, 1108, 1109, 7, 15, 0, 0, 1109, 1110, 7, 4, 0, 0, 1110, 1111, 7, 17, 0, 0, 1111, 1112, 7, 9, 0, 0, 1112, 1113, 7, 4, 0, 0, 1113, 120, 1, 0, 0, 0, 1114, 1115, 7, 15, 0, 0, 1115, 1116, 7, 6, 0, 0, 1116, 1117, 7, 17, 0, 0, 1117, 1118, 7, 4, 0, 0, 1118, 1119, 7, 20, 0, 0, 1119, 122, 1, 0, 0, 0, 1120, 1121, 7, 12, 0, 0, 1121, 1122, 7, 22, 0, 0, 1122, 1123, 7, 10, 0, 0, 1123, 1124, 7, 4, 0, 0, 1124, 124, 1, 0, 0, 0, 1125, 1126, 7, 12, 0, 0, 1126, 1127, 7, 22, 0, 0, 1127, 1128, 7, 10, 0, 0, 1128, 1129, 7, 14, 0, 0, 1129, 1130, 7, 10, 0, 0, 1130, 126, 1, 0, 0, 0, 1131, 1132, 7, 16, 0, 0, 1132, 1133, 7, 17, 0, 0, 1133, 1134, 7, 4, 0, 0, 1134, 1135, 7, 15, 0, 0, 1135, 1136, 7, 6, 0, 0, 1136, 128, 1, 0, 0, 0, 1137, 1138, 7, 2, 0, 0, 1138, 1139, 7, 23, 0, 0, 1139, 1140, 7, 20, 0, 0, 1140, 130, 1, 0, 0, 0, 1141, 1142, 7, 7, 0, 0, 1142, 1143, 7, 9, 0, 0, 1143, 1144, 7, 15, 0, 0, 1144, 1145, 7, 4, 0, 0, 1145, 1146, 7, 11, 0, 0, 1146, 132, 1, 0, 0, 0, 1147, 1148, 7, 16, 0, 0, 1148, 1149, 7, 2, 0, 0, 1149, 1150, 7, 18, 0, 0, 1150, 134, 1, 0, 0, 0, 1151, 1152, 7, 16, 0, 0, 1152, 1153, 7, 17, 0, 0, 1153, 1154, 7, 4, 0, 0, 1154, 136, 1, 0, 0, 0, 1155, 1156, 7, 6, 0, 0, 1156, 1157, 7, 15, 0, 0, 1157, 1158, 7, 16, 0, 0, 1158, 138, 1, 0, 0, 0, 1159, 1160, 7, 23, 0, 0, 1160, 1161, 7, 2, 0, 0, 1161, 1162, 7, 14, 0, 0, 1162, 1163, 5, 95, 0, 0, 1163, 1164, 7, 21, 0, 0, 1164, 1165, 7, 9, 0, 0, 1165, 1166, 7, 21, 0, 0, 1166, 140, 1, 0, 0, 0, 1167, 1168, 7, 23, 0, 0, 1168, 1169, 7, 2, 0, 0, 1169, 1170, 7, 14, 0, 0, 1170, 1171, 5, 95, 0, 0, 1171, 1172, 7, 6, 0, 0, 1172, 1173, 7, 2, 0, 0, 1173, 1174, 7, 16, 0, 0, 1174, 1175, 7, 21, 0, 0, 1175, 142, 1, 0, 0, 0, 1176, 1177, 7, 23, 0, 0, 1177, 1178, 7, 2, 0, 0, 1178, 1179, 7, 14, 0, 0, 1179, 1180, 7, 17, 0, 0, 1180, 1181, 7, 2, 0, 0, 1181, 1182, 7, 4, 0, 0, 1182, 1183, 7, 7, 0, 0, 1183, 1184, 7, 10, 0, 0, 1184, 144, 1, 0, 0, 0, 1185, 1186, 7, 6, 0, 0, 1186, 1187, 7, 11, 0, 0, 1187, 1188, 7, 5, 0, 0, 1188, 146, 1, 0, 0, 0, 1189, 1190, 7, 6, 0, 0, 1190, 1191, 7, 11, 0, 0, 1191, 1192, 7, 5, 0, 0, 1192, 1193, 7, 5, 0, 0, 1193, 1194, 7, 10, 0, 0, 1194, 1195, 7, 23, 0, 0, 1195, 148, 1, 0, 0, 0, 1196, 1197, 7, 6, 0, 0, 1197, 1198, 7, 11, 0, 0, 1198, 1199, 7, 5, 0, 0, 1199, 1200, 7, 5, 0, 0, 1200, 1201, 7, 10, 0, 0, 1201, 1202, 7, 23, 0, 0, 1202, 1203, 5, 95, 0, 0, 1203, 1204, 7, 21, 0, 0, 1204, 1205, 7, 9, 0, 0, 1205, 1206, 7, 21, 0, 0, 1206, 150, 1, 0, 0, 0, 1207, 1208, 7, 6, 0, 0, 1208, 1209, 7, 11, 0, 0, 1209, 1210, 7, 5, 0, 0, 1210, 1211, 7, 5, 0, 0, 1211, 1212, 7, 10, 0, 0, 1212, 1213, 7, 23, 0, 0, 1213, 1214, 5, 95, 0, 0, 1214, 1215, 7, 6, 0, 0, 1215, 1216, 7, 2, 0, 0, 1216, 1217, 7, 16, 0, 0, 1217, 1218, 7, 21, 0, 0, 1218, 152, 1, 0, 0, 0, 1219, 1220, 7, 6, 0, 0, 1220, 1221, 7, 15, 0, 0, 1221, 1222, 7, 8, 0, 0, 1222, 1223, 7, 6, 0, 0, 1223, 1224, 7, 11, 0, 0, 1224, 1225, 7, 14, 0, 0, 1225, 1226, 7, 17, 0, 0, 1226, 1227, 7, 4, 0, 0, 1227, 1228, 7, 20, 0, 0, 1228, 154, 1, 0, 0, 0, 1229, 1230, 7, 11, 0, 0, 1230, 1231, 7, 14, 0, 0, 1231, 1232, 7, 17, 0, 0, 1232, 1233, 7, 16, 0, 0, 1233, 156, 1, 0, 0, 0, 1234, 1235, 7, 10, 0, 0, 1235, 1236, 7, 4, 0, 0, 1236, 1237, 7, 5, 0, 0, 1237, 158, 1, 0, 0, 0, 1238, 1239, 7, 19, 0, 0, 1239, 1240, 7, 15, 0, 0, 1240, 1241, 7, 3, 0, 0, 1241, 1242, 7, 3, 0, 0, 1242, 160, 1, 0, 0, 0, 1243, 1244, 7, 9, 0, 0, 1244, 1245, 7, 19, 0, 0, 1245, 1246, 7, 19, 0, 0, 1246, 1247, 7, 6, 0, 0, 1247, 1248, 7, 10, 0, 0, 1248, 1249, 7, 11, 0, 0, 1249, 162, 1, 0, 0, 0, 1250, 1251, 7, 17, 0, 0, 1251, 1252, 7, 4, 0, 0, 1252, 1253, 7, 11, 0, 0, 1253, 1254, 7, 10, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 1256, 7, 23, 0, 0, 1256, 1257, 7, 2, 0, 0, 1257, 1258, 7, 3, 0, 0, 1258, 164, 1, 0, 0, 0, 1259, 1260, 7, 16, 0, 0, 1260, 1261, 7, 17, 0, 0, 1261, 1262, 7, 7, 0, 0, 1262, 1263, 7, 14, 0, 0, 1263, 1264, 7, 9, 0, 0, 1264, 1265, 7, 6, 0, 0, 1265, 1266, 7, 10, 0, 0, 1266, 1267, 7, 7, 0, 0, 1267, 1268, 7, 9, 0, 0, 1268, 1269, 7, 4, 0, 0, 1269, 1270, 7, 5, 0, 0, 1270, 166, 1, 0, 0, 0, 1271, 1272, 7, 6, 0, 0, 1272, 1273, 7, 10, 0, 0, 1273, 1274, 7, 7, 0, 0, 1274, 1275, 7, 9, 0, 0, 1275, 1276, 7, 4, 0, 0, 1276, 1277, 7, 5, 0, 0, 1277, 168, 1, 0, 0, 0, 1278, 1279, 7, 16, 0, 0, 1279, 1280, 7, 17, 0, 0, 1280, 1281, 7, 4, 0, 0, 1281, 1282, 7, 15, 0, 0, 1282, 1283, 7, 11, 0, 0, 1283, 1284, 7, 10, 0, 0, 1284, 170, 1, 0, 0, 0, 1285, 1286, 7, 22, 0, 0, 1286, 1287, 7, 9, 0, 0, 1287, 1288, 7, 15, 0, 0, 1288, 1289, 7, 14, 0, 0, 1289, 172, 1, 0, 0, 0, 1290, 1291, 7, 5, 0, 0, 1291, 1292, 7, 2, 0, 0, 1292, 1293, 7, 13, 0, 0, 1293, 174, 1, 0, 0, 0, 1294, 1295, 7, 12, 0, 0, 1295, 1296, 7, 10, 0, 0, 1296, 1297, 7, 10, 0, 0, 1297, 1298, 7, 25, 0, 0, 1298, 176, 1, 0, 0, 0, 1299, 1300, 7, 16, 0, 0, 1300, 1301, 7, 9, 0, 0, 1301, 1302, 7, 4, 0, 0, 1302, 1303, 7, 11, 0, 0, 1303, 1304, 7, 22, 0, 0, 1304, 178, 1, 0, 0, 0, 1305, 1306, 7, 26, 0, 0, 1306, 1307, 7, 15, 0, 0, 1307, 1308, 7, 2, 0, 0, 1308, 1309, 7, 14, 0, 0, 1309, 1310, 7, 11, 0, 0, 1310, 1311, 7, 10, 0, 0, 1311, 1312, 7, 14, 0, 0, 1312, 180, 1, 0, 0, 0, 1313, 1314, 7, 13, 0, 0, 1314, 1315, 7, 10, 0, 0, 1315, 1316, 7, 2, 0, 0, 1316, 1317, 7, 14, 0, 0, 1317, 182, 1, 0, 0, 0, 1318, 1319, 7, 6, 0, 0, 1319, 1320, 7, 10, 0, 0, 1320, 1321, 7, 7, 0, 0, 1321, 1322, 7, 9, 0, 0, 1322, 1323, 7, 4, 0, 0, 1323, 1324, 7, 5, 0, 0, 1324, 1325, 5, 95, 0, 0, 1325, 1326, 7, 16, 0, 0, 1326, 1327, 7, 17, 0, 0, 1327, 1328, 7, 7, 0, 0, 1328, 1329, 7, 14, 0, 0, 1329, 1330, 7, 9, 0, 0, 1330, 1331, 7, 6, 0, 0, 1331, 1332, 7, 10, 0, 0, 1332, 1333, 7, 7, 0, 0, 1333, 1334, 7, 9, 0, 0, 1334, 1335, 7, 4, 0, 0, 1335, 1336, 7, 5, 0, 0, 1336, 184, 1, 0, 0, 0, 1337, 1338, 7, 16, 0, 0, 1338, 1339, 7, 17, 0, 0, 1339, 1340, 7, 4, 0, 0, 1340, 1341, 7, 15, 0, 0, 1341, 1342, 7, 11, 0, 0, 1342, 1343, 7, 10, 0, 0, 1343, 1344, 5, 95, 0, 0, 1344, 1345, 7, 16, 0, 0, 1345, 1346, 7, 17, 0, 0, 1346, 1347, 7, 7, 0, 0, 1347, 1348, 7, 14, 0, 0, 1348, 1349, 7, 9, 0, 0, 1349, 1350, 7, 6, 0, 0, 1350, 1351, 7, 10, 0, 0, 1351, 1352, 7, 7, 0, 0, 1352, 1353, 7, 9, 0, 0, 1353, 1354, 7, 4, 0, 0, 1354, 1355, 7, 5, 0, 0, 1355, 186, 1, 0, 0, 0, 1356, 1357, 7, 16, 0, 0, 1357, 1358, 7, 17, 0, 0, 1358, 1359, 7, 4, 0, 0, 1359, 1360, 7, 15, 0, 0, 1360, 1361, 7, 11, 0, 0, 1361, 1362, 7, 10, 0, 0, 1362, 1363, 5, 95, 0, 0, 1363, 1364, 7, 6, 0, 0, 1364, 1365, 7, 10, 0, 0, 1365, 1366, 7, 7, 0, 0, 1366, 1367, 7, 9, 0, 0, 1367, 1368, 7, 4, 0, 0, 1368, 1369, 7, 5, 0, 0, 1369, 188, 1, 0, 0, 0, 1370, 1371, 7, 22, 0, 0, 1371, 1372, 7, 9, 0, 0, 1372, 1373, 7, 15, 0, 0, 1373, 1374, 7, 14, 0, 0, 1374, 1375, 5, 95, 0, 0, 1375, 1376, 7, 16, 0, 0, 1376, 1377, 7, 17, 0, 0, 1377, 1378, 7, 7, 0, 0, 1378, 1379, 7, 14, 0, 0, 1379, 1380, 7, 9, 0, 0, 1380, 1381, 7, 6, 0, 0, 1381, 1382, 7, 10, 0, 0, 1382, 1383, 7, 7, 0, 0, 1383, 1384, 7, 9, 0, 0, 1384, 1385, 7, 4, 0, 0, 1385, 1386, 7, 5, 0, 0, 1386, 190, 1, 0, 0, 0, 1387, 1388, 7, 22, 0, 0, 1388, 1389, 7, 9, 0, 0, 1389, 1390, 7, 15, 0, 0, 1390, 1391, 7, 14, 0, 0, 1391, 1392, 5, 95, 0, 0, 1392, 1393, 7, 6, 0, 0, 1393, 1394, 7, 10, 0, 0, 1394, 1395, 7, 7, 0, 0, 1395, 1396, 7, 9, 0, 0, 1396, 1397, 7, 4, 0, 0, 1397, 1398, 7, 5, 0, 0, 1398, 192, 1, 0, 0, 0, 1399, 1400, 7, 22, 0, 0, 1400, 1401, 7, 9, 0, 0, 1401, 1402, 7, 15, 0, 0, 1402, 1403, 7, 14, 0, 0, 1403, 1404, 5, 95, 0, 0, 1404, 1405, 7, 16, 0, 0, 1405, 1406, 7, 17, 0, 0, 1406, 1407, 7, 4, 0, 0, 1407, 1408, 7, 15, 0, 0, 1408, 1409, 7, 11, 0, 0, 1409, 1410, 7, 10, 0, 0, 1410, 194, 1, 0, 0, 0, 1411, 1412, 7, 5, 0, 0, 1412, 1413, 7, 2, 0, 0, 1413, 1414, 7, 13, 0, 0, 1414, 1415, 5, 95, 0, 0, 1415, 1416, 7, 16, 0, 0, 1416, 1417, 7, 17, 0, 0, 1417, 1418, 7, 7, 0, 0, 1418, 1419, 7, 14, 0, 0, 1419, 1420, 7, 9, 0, 0, 1420, 1421, 7, 6, 0, 0, 1421, 1422, 7, 10, 0, 0, 1422, 1423, 7, 7, 0, 0, 1423, 1424, 7, 9, 0, 0, 1424, 1425, 7, 4, 0, 0, 1425, 1426, 7, 5, 0, 0, 1426, 196, 1, 0, 0, 0, 1427, 1428, 7, 5, 0, 0, 1428, 1429, 7, 2, 0, 0, 1429, 1430, 7, 13, 0, 0, 1430, 1431, 5, 95, 0, 0, 1431, 1432, 7, 6, 0, 0, 1432, 1433, 7, 10, 0, 0, 1433, 1434, 7, 7, 0, 0, 1434, 1435, 7, 9, 0, 0, 1435, 1436, 7, 4, 0, 0, 1436, 1437, 7, 5, 0, 0, 1437, 198, 1, 0, 0, 0, 1438, 1439, 7, 5, 0, 0, 1439, 1440, 7, 2, 0, 0, 1440, 1441, 7, 13, 0, 0, 1441, 1442, 5, 95, 0, 0, 1442, 1443, 7, 16, 0, 0, 1443, 1444, 7, 17, 0, 0, 1444, 1445, 7, 4, 0, 0, 1445, 1446, 7, 15, 0, 0, 1446, 1447, 7, 11, 0, 0, 1447, 1448, 7, 10, 0, 0, 1448, 200, 1, 0, 0, 0, 1449, 1450, 7, 5, 0, 0, 1450, 1451, 7, 2, 0, 0, 1451, 1452, 7, 13, 0, 0, 1452, 1453, 5, 95, 0, 0, 1453, 1454, 7, 22, 0, 0, 1454, 1455, 7, 9, 0, 0, 1455, 1456, 7, 15, 0, 0, 1456, 1457, 7, 14, 0, 0, 1457, 202, 1, 0, 0, 0, 1458, 1459, 7, 13, 0, 0, 1459, 1460, 7, 10, 0, 0, 1460, 1461, 7, 2, 0, 0, 1461, 1462, 7, 14, 0, 0, 1462, 1463, 5, 95, 0, 0, 1463, 1464, 7, 16, 0, 0, 1464, 1465, 7, 9, 0, 0, 1465, 1466, 7, 4, 0, 0, 1466, 1467, 7, 11, 0, 0, 1467, 1468, 7, 22, 0, 0, 1468, 204, 1, 0, 0, 0, 1469, 1470, 7, 11, 0, 0, 1470, 1471, 7, 2, 0, 0, 1471, 1472, 7, 8, 0, 0, 1472, 1473, 7, 3, 0, 0, 1473, 1474, 7, 10, 0, 0, 1474, 1475, 7, 6, 0, 0, 1475, 206, 1, 0, 0, 0, 1476, 1477, 7, 2, 0, 0, 1477, 1478, 7, 8, 0, 0, 1478, 1479, 7, 6, 0, 0, 1479, 208, 1, 0, 0, 0, 1480, 1481, 7, 2, 0, 0, 1481, 1482, 7, 7, 0, 0, 1482, 1483, 7, 9, 0, 0, 1483, 1484, 7, 6, 0, 0, 1484, 210, 1, 0, 0, 0, 1485, 1486, 7, 2, 0, 0, 1486, 1487, 7, 5, 0, 0, 1487, 1488, 7, 5, 0, 0, 1488, 212, 1, 0, 0, 0, 1489, 1490, 7, 2, 0, 0, 1490, 1491, 7, 5, 0, 0, 1491, 1492, 7, 5, 0, 0, 1492, 1493, 7, 11, 0, 0, 1493, 1494, 7, 17, 0, 0, 1494, 1495, 7, 16, 0, 0, 1495, 1496, 7, 10, 0, 0, 1496, 214, 1, 0, 0, 0, 1497, 1498, 7, 2, 0, 0, 1498, 1499, 7, 6, 0, 0, 1499, 1500, 7, 7, 0, 0, 1500, 1501, 7, 17, 0, 0, 1501, 1502, 7, 17, 0, 0, 1502, 216, 1, 0, 0, 0, 1503, 1504, 7, 2, 0, 0, 1504, 1505, 7, 6, 0, 0, 1505, 1506, 7, 17, 0, 0, 1506, 1507, 7, 4, 0, 0, 1507, 218, 1, 0, 0, 0, 1508, 1509, 7, 2, 0, 0, 1509, 1510, 7, 11, 0, 0, 1510, 1511, 7, 2, 0, 0, 1511, 1512, 7, 4, 0, 0, 1512, 220, 1, 0, 0, 0, 1513, 1514, 7, 2, 0, 0, 1514, 1515, 7, 11, 0, 0, 1515, 1516, 7, 2, 0, 0, 1516, 1517, 7, 4, 0, 0, 1517, 1518, 5, 50, 0, 0, 1518, 222, 1, 0, 0, 0, 1519, 1520, 7, 7, 0, 0, 1520, 1521, 7, 8, 0, 0, 1521, 1522, 7, 14, 0, 0, 1522, 1523, 7, 11, 0, 0, 1523, 224, 1, 0, 0, 0, 1524, 1525, 7, 7, 0, 0, 1525, 1526, 7, 10, 0, 0, 1526, 1527, 7, 17, 0, 0, 1527, 1528, 7, 3, 0, 0, 1528, 226, 1, 0, 0, 0, 1529, 1530, 7, 7, 0, 0, 1530, 1531, 7, 10, 0, 0, 1531, 1532, 7, 17, 0, 0, 1532, 1533, 7, 3, 0, 0, 1533, 1534, 7, 17, 0, 0, 1534, 1535, 7, 4, 0, 0, 1535, 1536, 7, 20, 0, 0, 1536, 228, 1, 0, 0, 0, 1537, 1538, 7, 7, 0, 0, 1538, 1539, 7, 9, 0, 0, 1539, 1540, 7, 4, 0, 0, 1540, 1541, 7, 7, 0, 0, 1541, 1542, 7, 2, 0, 0, 1542, 1543, 7, 11, 0, 0, 1543, 230, 1, 0, 0, 0, 1544, 1545, 7, 7, 0, 0, 1545, 1546, 7, 9, 0, 0, 1546, 1547, 7, 4, 0, 0, 1547, 1548, 7, 7, 0, 0, 1548, 1549, 7, 2, 0, 0, 1549, 1550, 7, 11, 0, 0, 1550, 1551, 5, 95, 0, 0, 1551, 1552, 7, 12, 0, 0, 1552, 1553, 7, 6, 0, 0, 1553, 232, 1, 0, 0, 0, 1554, 1555, 7, 7, 0, 0, 1555, 1556, 7, 9, 0, 0, 1556, 1557, 7, 4, 0, 0, 1557, 1558, 7, 23, 0, 0, 1558, 234, 1, 0, 0, 0, 1559, 1560, 7, 7, 0, 0, 1560, 1561, 7, 9, 0, 0, 1561, 1562, 7, 4, 0, 0, 1562, 1563, 7, 23, 0, 0, 1563, 1564, 7, 10, 0, 0, 1564, 1565, 7, 14, 0, 0, 1565, 1566, 7, 11, 0, 0, 1566, 1567, 5, 95, 0, 0, 1567, 1568, 7, 11, 0, 0, 1568, 1569, 7, 27, 0, 0, 1569, 236, 1, 0, 0, 0, 1570, 1571, 7, 7, 0, 0, 1571, 1572, 7, 9, 0, 0, 1572, 1573, 7, 6, 0, 0, 1573, 238, 1, 0, 0, 0, 1574, 1575, 7, 7, 0, 0, 1575, 1576, 7, 9, 0, 0, 1576, 1577, 7, 6, 0, 0, 1577, 1578, 7, 22, 0, 0, 1578, 240, 1, 0, 0, 0, 1579, 1580, 7, 7, 0, 0, 1580, 1581, 7, 9, 0, 0, 1581, 1582, 7, 11, 0, 0, 1582, 242, 1, 0, 0, 0, 1583, 1584, 7, 7, 0, 0, 1584, 1585, 7, 14, 0, 0, 1585, 1586, 7, 7, 0, 0, 1586, 1587, 5, 51, 0, 0, 1587, 1588, 5, 50, 0, 0, 1588, 244, 1, 0, 0, 0, 1589, 1590, 7, 7, 0, 0, 1590, 1591, 7, 15, 0, 0, 1591, 1592, 7, 14, 0, 0, 1592, 1593, 7, 5, 0, 0, 1593, 1594, 7, 2, 0, 0, 1594, 1595, 7, 11, 0, 0, 1595, 1596, 7, 10, 0, 0, 1596, 246, 1, 0, 0, 0, 1597, 1598, 7, 7, 0, 0, 1598, 1599, 7, 15, 0, 0, 1599, 1600, 7, 14, 0, 0, 1600, 1601, 7, 11, 0, 0, 1601, 1602, 7, 17, 0, 0, 1602, 1603, 7, 16, 0, 0, 1603, 1604, 7, 10, 0, 0, 1604, 248, 1, 0, 0, 0, 1605, 1606, 7, 7, 0, 0, 1606, 1607, 7, 15, 0, 0, 1607, 1608, 7, 14, 0, 0, 1608, 1609, 7, 14, 0, 0, 1609, 1610, 7, 10, 0, 0, 1610, 1611, 7, 4, 0, 0, 1611, 1612, 7, 11, 0, 0, 1612, 1613, 5, 95, 0, 0, 1613, 1614, 7, 5, 0, 0, 1614, 1615, 7, 2, 0, 0, 1615, 1616, 7, 11, 0, 0, 1616, 1617, 7, 10, 0, 0, 1617, 250, 1, 0, 0, 0, 1618, 1619, 7, 7, 0, 0, 1619, 1620, 7, 15, 0, 0, 1620, 1621, 7, 14, 0, 0, 1621, 1622, 7, 14, 0, 0, 1622, 1623, 7, 10, 0, 0, 1623, 1624, 7, 4, 0, 0, 1624, 1625, 7, 11, 0, 0, 1625, 1626, 5, 95, 0, 0, 1626, 1627, 7, 11, 0, 0, 1627, 1628, 7, 17, 0, 0, 1628, 1629, 7, 16, 0, 0, 1629, 1630, 7, 10, 0, 0, 1630, 252, 1, 0, 0, 0, 1631, 1632, 7, 7, 0, 0, 1632, 1633, 7, 15, 0, 0, 1633, 1634, 7, 14, 0, 0, 1634, 1635, 7, 14, 0, 0, 1635, 1636, 7, 10, 0, 0, 1636, 1637, 7, 4, 0, 0, 1637, 1638, 7, 11, 0, 0, 1638, 1639, 5, 95, 0, 0, 1639, 1640, 7, 11, 0, 0, 1640, 1641, 7, 17, 0, 0, 1641, 1642, 7, 16, 0, 0, 1642, 1643, 7, 10, 0, 0, 1643, 1644, 7, 6, 0, 0, 1644, 1645, 7, 11, 0, 0, 1645, 1646, 7, 2, 0, 0, 1646, 1647, 7, 16, 0, 0, 1647, 1648, 7, 21, 0, 0, 1648, 254, 1, 0, 0, 0, 1649, 1650, 7, 5, 0, 0, 1650, 1651, 7, 2, 0, 0, 1651, 1652, 7, 11, 0, 0, 1652, 1653, 7, 10, 0, 0, 1653, 256, 1, 0, 0, 0, 1654, 1655, 7, 5, 0, 0, 1655, 1656, 7, 2, 0, 0, 1656, 1657, 7, 11, 0, 0, 1657, 1658, 7, 10, 0, 0, 1658, 1659, 5, 95, 0, 0, 1659, 1660, 7, 2, 0, 0, 1660, 1661, 7, 5, 0, 0, 1661, 1662, 7, 5, 0, 0, 1662, 258, 1, 0, 0, 0, 1663, 1664, 7, 5, 0, 0, 1664, 1665, 7, 2, 0, 0, 1665, 1666, 7, 11, 0, 0, 1666, 1667, 7, 10, 0, 0, 1667, 1668, 5, 95, 0, 0, 1668, 1669, 7, 19, 0, 0, 1669, 1670, 7, 9, 0, 0, 1670, 1671, 7, 14, 0, 0, 1671, 1672, 7, 16, 0, 0, 1672, 1673, 7, 2, 0, 0, 1673, 1674, 7, 11, 0, 0, 1674, 260, 1, 0, 0, 0, 1675, 1676, 7, 5, 0, 0, 1676, 1677, 7, 2, 0, 0, 1677, 1678, 7, 11, 0, 0, 1678, 1679, 7, 10, 0, 0, 1679, 1680, 5, 95, 0, 0, 1680, 1681, 7, 6, 0, 0, 1681, 1682, 7, 15, 0, 0, 1682, 1683, 7, 8, 0, 0, 1683, 262, 1, 0, 0, 0, 1684, 1685, 7, 5, 0, 0, 1685, 1686, 7, 2, 0, 0, 1686, 1687, 7, 11, 0, 0, 1687, 1688, 7, 10, 0, 0, 1688, 1689, 7, 5, 0, 0, 1689, 1690, 7, 17, 0, 0, 1690, 1691, 7, 19, 0, 0, 1691, 1692, 7, 19, 0, 0, 1692, 264, 1, 0, 0, 0, 1693, 1694, 7, 5, 0, 0, 1694, 1695, 7, 2, 0, 0, 1695, 1696, 7, 13, 0, 0, 1696, 1697, 7, 4, 0, 0, 1697, 1698, 7, 2, 0, 0, 1698, 1699, 7, 16, 0, 0, 1699, 1700, 7, 10, 0, 0, 1700, 266, 1, 0, 0, 0, 1701, 1702, 7, 5, 0, 0, 1702, 1703, 7, 2, 0, 0, 1703, 1704, 7, 13, 0, 0, 1704, 1705, 7, 9, 0, 0, 1705, 1706, 7, 19, 0, 0, 1706, 1707, 7, 16, 0, 0, 1707, 1708, 7, 9, 0, 0, 1708, 1709, 7, 4, 0, 0, 1709, 1710, 7, 11, 0, 0, 1710, 1711, 7, 22, 0, 0, 1711, 268, 1, 0, 0, 0, 1712, 1713, 7, 5, 0, 0, 1713, 1714, 7, 2, 0, 0, 1714, 1715, 7, 13, 0, 0, 1715, 1716, 7, 9, 0, 0, 1716, 1717, 7, 19, 0, 0, 1717, 1718, 7, 12, 0, 0, 1718, 1719, 7, 10, 0, 0, 1719, 1720, 7, 10, 0, 0, 1720, 1721, 7, 25, 0, 0, 1721, 270, 1, 0, 0, 0, 1722, 1723, 7, 5, 0, 0, 1723, 1724, 7, 2, 0, 0, 1724, 1725, 7, 13, 0, 0, 1725, 1726, 7, 9, 0, 0, 1726, 1727, 7, 19, 0, 0, 1727, 1728, 7, 13, 0, 0, 1728, 1729, 7, 10, 0, 0, 1729, 1730, 7, 2, 0, 0, 1730, 1731, 7, 14, 0, 0, 1731, 272, 1, 0, 0, 0, 1732, 1733, 7, 5, 0, 0, 1733, 1734, 7, 10, 0, 0, 1734, 1735, 7, 20, 0, 0, 1735, 1736, 7, 14, 0, 0, 1736, 1737, 7, 10, 0, 0, 1737, 1738, 7, 10, 0, 0, 1738, 1739, 7, 6, 0, 0, 1739, 274, 1, 0, 0, 0, 1740, 1741, 7, 5, 0, 0, 1741, 1742, 7, 17, 0, 0, 1742, 1743, 7, 23, 0, 0, 1743, 1744, 7, 17, 0, 0, 1744, 1745, 7, 5, 0, 0, 1745, 1746, 7, 10, 0, 0, 1746, 276, 1, 0, 0, 0, 1747, 1748, 7, 10, 0, 0, 1748, 278, 1, 0, 0, 0, 1749, 1750, 7, 10, 0, 0, 1750, 1751, 7, 18, 0, 0, 1751, 1752, 7, 21, 0, 0, 1752, 280, 1, 0, 0, 0, 1753, 1754, 7, 10, 0, 0, 1754, 1755, 7, 18, 0, 0, 1755, 1756, 7, 21, 0, 0, 1756, 1757, 7, 16, 0, 0, 1757, 1758, 5, 49, 0, 0, 1758, 282, 1, 0, 0, 0, 1759, 1760, 7, 10, 0, 0, 1760, 1761, 7, 18, 0, 0, 1761, 1762, 7, 11, 0, 0, 1762, 1763, 7, 14, 0, 0, 1763, 1764, 7, 2, 0, 0, 1764, 1765, 7, 7, 0, 0, 1765, 1766, 7, 11, 0, 0, 1766, 284, 1, 0, 0, 0, 1767, 1768, 7, 19, 0, 0, 1768, 1769, 7, 3, 0, 0, 1769, 1770, 7, 9, 0, 0, 1770, 1771, 7, 9, 0, 0, 1771, 1772, 7, 14, 0, 0, 1772, 286, 1, 0, 0, 0, 1773, 1774, 7, 19, 0, 0, 1774, 1775, 7, 14, 0, 0, 1775, 1776, 7, 9, 0, 0, 1776, 1777, 7, 16, 0, 0, 1777, 1778, 5, 95, 0, 0, 1778, 1779, 7, 5, 0, 0, 1779, 1780, 7, 2, 0, 0, 1780, 1781, 7, 13, 0, 0, 1781, 1782, 7, 6, 0, 0, 1782, 288, 1, 0, 0, 0, 1783, 1784, 7, 19, 0, 0, 1784, 1785, 7, 14, 0, 0, 1785, 1786, 7, 9, 0, 0, 1786, 1787, 7, 16, 0, 0, 1787, 1788, 5, 95, 0, 0, 1788, 1789, 7, 15, 0, 0, 1789, 1790, 7, 4, 0, 0, 1790, 1791, 7, 17, 0, 0, 1791, 1792, 7, 18, 0, 0, 1792, 1793, 7, 11, 0, 0, 1793, 1794, 7, 17, 0, 0, 1794, 1795, 7, 16, 0, 0, 1795, 1796, 7, 10, 0, 0, 1796, 290, 1, 0, 0, 0, 1797, 1798, 7, 20, 0, 0, 1798, 1799, 7, 10, 0, 0, 1799, 1800, 7, 11, 0, 0, 1800, 1801, 5, 95, 0, 0, 1801, 1802, 7, 19, 0, 0, 1802, 1803, 7, 9, 0, 0, 1803, 1804, 7, 14, 0, 0, 1804, 1805, 7, 16, 0, 0, 1805, 1806, 7, 2, 0, 0, 1806, 1807, 7, 11, 0, 0, 1807, 292, 1, 0, 0, 0, 1808, 1809, 7, 17, 0, 0, 1809, 1810, 7, 19, 0, 0, 1810, 294, 1, 0, 0, 0, 1811, 1812, 7, 17, 0, 0, 1812, 1813, 7, 19, 0, 0, 1813, 1814, 7, 4, 0, 0, 1814, 1815, 7, 15, 0, 0, 1815, 1816, 7, 3, 0, 0, 1816, 1817, 7, 3, 0, 0, 1817, 296, 1, 0, 0, 0, 1818, 1819, 7, 17, 0, 0, 1819, 1820, 7, 6, 0, 0, 1820, 1821, 7, 4, 0, 0, 1821, 1822, 7, 15, 0, 0, 1822, 1823, 7, 3, 0, 0, 1823, 1824, 7, 3, 0, 0, 1824, 298, 1, 0, 0, 0, 1825, 1826, 7, 3, 0, 0, 1826, 1827, 7, 2, 0, 0, 1827, 1828, 7, 6, 0, 0, 1828, 1829, 7, 11, 0, 0, 1829, 1830, 5, 95, 0, 0, 1830, 1831, 7, 5, 0, 0, 1831, 1832, 7, 2, 0, 0, 1832, 1833, 7, 13, 0, 0, 1833, 300, 1, 0, 0, 0, 1834, 1835, 7, 3, 0, 0, 1835, 1836, 7, 10, 0, 0, 1836, 1837, 7, 4, 0, 0, 1837, 1838, 7, 20, 0, 0, 1838, 1839, 7, 11, 0, 0, 1839, 1840, 7, 22, 0, 0, 1840, 302, 1, 0, 0, 0, 1841, 1842, 7, 3, 0, 0, 1842, 1843, 7, 4, 0, 0, 1843, 304, 1, 0, 0, 0, 1844, 1845, 7, 3, 0, 0, 1845, 1846, 7, 9, 0, 0, 1846, 1847, 7, 7, 0, 0, 1847, 1848, 7, 2, 0, 0, 1848, 1849, 7, 3, 0, 0, 1849, 1850, 7, 11, 0, 0, 1850, 1851, 7, 17, 0, 0, 1851, 1852, 7, 16, 0, 0, 1852, 1853, 7, 10, 0, 0, 1853, 306, 1, 0, 0, 0, 1854, 1855, 7, 3, 0, 0, 1855, 1856, 7, 9, 0, 0, 1856, 1857, 7, 7, 0, 0, 1857, 1858, 7, 2, 0, 0, 1858, 1859, 7, 3, 0, 0, 1859, 1860, 7, 11, 0, 0, 1860, 1861, 7, 17, 0, 0, 1861, 1862, 7, 16, 0, 0, 1862, 1863, 7, 10, 0, 0, 1863, 1864, 7, 6, 0, 0, 1864, 1865, 7, 11, 0, 0, 1865, 1866, 7, 2, 0, 0, 1866, 1867, 7, 16, 0, 0, 1867, 1868, 7, 21, 0, 0, 1868, 308, 1, 0, 0, 0, 1869, 1870, 7, 3, 0, 0, 1870, 1871, 7, 9, 0, 0, 1871, 1872, 7, 7, 0, 0, 1872, 1873, 7, 2, 0, 0, 1873, 1874, 7, 11, 0, 0, 1874, 1875, 7, 10, 0, 0, 1875, 310, 1, 0, 0, 0, 1876, 1877, 7, 3, 0, 0, 1877, 1878, 7, 9, 0, 0, 1878, 1879, 7, 20, 0, 0, 1879, 312, 1, 0, 0, 0, 1880, 1881, 7, 3, 0, 0, 1881, 1882, 7, 9, 0, 0, 1882, 1883, 7, 20, 0, 0, 1883, 1884, 5, 49, 0, 0, 1884, 1885, 5, 48, 0, 0, 1885, 314, 1, 0, 0, 0, 1886, 1887, 7, 3, 0, 0, 1887, 1888, 7, 9, 0, 0, 1888, 1889, 7, 20, 0, 0, 1889, 1890, 5, 50, 0, 0, 1890, 316, 1, 0, 0, 0, 1891, 1892, 7, 3, 0, 0, 1892, 1893, 7, 9, 0, 0, 1893, 1894, 7, 12, 0, 0, 1894, 1895, 7, 10, 0, 0, 1895, 1896, 7, 14, 0, 0, 1896, 318, 1, 0, 0, 0, 1897, 1898, 7, 3, 0, 0, 1898, 1899, 7, 11, 0, 0, 1899, 1900, 7, 14, 0, 0, 1900, 1901, 7, 17, 0, 0, 1901, 1902, 7, 16, 0, 0, 1902, 320, 1, 0, 0, 0, 1903, 1904, 7, 16, 0, 0, 1904, 1905, 7, 2, 0, 0, 1905, 1906, 7, 25, 0, 0, 1906, 1907, 7, 10, 0, 0, 1907, 1908, 7, 5, 0, 0, 1908, 1909, 7, 2, 0, 0, 1909, 1910, 7, 11, 0, 0, 1910, 1911, 7, 10, 0, 0, 1911, 322, 1, 0, 0, 0, 1912, 1913, 7, 16, 0, 0, 1913, 1914, 7, 2, 0, 0, 1914, 1915, 7, 25, 0, 0, 1915, 1916, 7, 10, 0, 0, 1916, 1917, 7, 11, 0, 0, 1917, 1918, 7, 17, 0, 0, 1918, 1919, 7, 16, 0, 0, 1919, 1920, 7, 10, 0, 0, 1920, 324, 1, 0, 0, 0, 1921, 1922, 7, 16, 0, 0, 1922, 1923, 7, 9, 0, 0, 1923, 1924, 7, 5, 0, 0, 1924, 1925, 7, 15, 0, 0, 1925, 1926, 7, 3, 0, 0, 1926, 1927, 7, 15, 0, 0, 1927, 1928, 7, 6, 0, 0, 1928, 326, 1, 0, 0, 0, 1929, 1930, 7, 16, 0, 0, 1930, 1931, 7, 9, 0, 0, 1931, 1932, 7, 4, 0, 0, 1932, 1933, 7, 11, 0, 0, 1933, 1934, 7, 22, 0, 0, 1934, 1935, 7, 4, 0, 0, 1935, 1936, 7, 2, 0, 0, 1936, 1937, 7, 16, 0, 0, 1937, 1938, 7, 10, 0, 0, 1938, 328, 1, 0, 0, 0, 1939, 1940, 7, 16, 0, 0, 1940, 1941, 7, 15, 0, 0, 1941, 1942, 7, 3, 0, 0, 1942, 1943, 7, 11, 0, 0, 1943, 1944, 7, 17, 0, 0, 1944, 1945, 7, 21, 0, 0, 1945, 1946, 7, 3, 0, 0, 1946, 1947, 7, 13, 0, 0, 1947, 330, 1, 0, 0, 0, 1948, 1949, 7, 4, 0, 0, 1949, 1950, 7, 9, 0, 0, 1950, 1951, 7, 12, 0, 0, 1951, 332, 1, 0, 0, 0, 1952, 1953, 7, 4, 0, 0, 1953, 1954, 7, 15, 0, 0, 1954, 1955, 7, 3, 0, 0, 1955, 1956, 7, 3, 0, 0, 1956, 1957, 7, 17, 0, 0, 1957, 1958, 7, 19, 0, 0, 1958, 334, 1, 0, 0, 0, 1959, 1960, 7, 21, 0, 0, 1960, 1961, 7, 10, 0, 0, 1961, 1962, 7, 14, 0, 0, 1962, 1963, 7, 17, 0, 0, 1963, 1964, 7, 9, 0, 0, 1964, 1965, 7, 5, 0, 0, 1965, 1966, 5, 95, 0, 0, 1966, 1967, 7, 2, 0, 0, 1967, 1968, 7, 5, 0, 0, 1968, 1969, 7, 5, 0, 0, 1969, 336, 1, 0, 0, 0, 1970, 1971, 7, 21, 0, 0, 1971, 1972, 7, 10, 0, 0, 1972, 1973, 7, 14, 0, 0, 1973, 1974, 7, 17, 0, 0, 1974, 1975, 7, 9, 0, 0, 1975, 1976, 7, 5, 0, 0, 1976, 1977, 5, 95, 0, 0, 1977, 1978, 7, 5, 0, 0, 1978, 1979, 7, 17, 0, 0, 1979, 1980, 7, 19, 0, 0, 1980, 1981, 7, 19, 0, 0, 1981, 338, 1, 0, 0, 0, 1982, 1983, 7, 21, 0, 0, 1983, 1984, 7, 17, 0, 0, 1984, 340, 1, 0, 0, 0, 1985, 1986, 7, 21, 0, 0, 1986, 1987, 7, 9, 0, 0, 1987, 1988, 7, 6, 0, 0, 1988, 1989, 7, 17, 0, 0, 1989, 1990, 7, 11, 0, 0, 1990, 1991, 7, 17, 0, 0, 1991, 1992, 7, 9, 0, 0, 1992, 1993, 7, 4, 0, 0, 1993, 342, 1, 0, 0, 0, 1994, 1995, 7, 21, 0, 0, 1995, 1996, 7, 9, 0, 0, 1996, 1997, 7, 12, 0, 0, 1997, 344, 1, 0, 0, 0, 1998, 1999, 7, 21, 0, 0, 1999, 2000, 7, 9, 0, 0, 2000, 2001, 7, 12, 0, 0, 2001, 2002, 7, 10, 0, 0, 2002, 2003, 7, 14, 0, 0, 2003, 346, 1, 0, 0, 0, 2004, 2005, 7, 14, 0, 0, 2005, 2006, 7, 2, 0, 0, 2006, 2007, 7, 5, 0, 0, 2007, 2008, 7, 17, 0, 0, 2008, 2009, 7, 2, 0, 0, 2009, 2010, 7, 4, 0, 0, 2010, 2011, 7, 6, 0, 0, 2011, 348, 1, 0, 0, 0, 2012, 2013, 7, 14, 0, 0, 2013, 2014, 7, 2, 0, 0, 2014, 2015, 7, 4, 0, 0, 2015, 2016, 7, 5, 0, 0, 2016, 350, 1, 0, 0, 0, 2017, 2018, 7, 14, 0, 0, 2018, 2019, 7, 10, 0, 0, 2019, 2020, 7, 21, 0, 0, 2020, 2021, 7, 3, 0, 0, 2021, 2022, 7, 2, 0, 0, 2022, 2023, 7, 7, 0, 0, 2023, 2024, 7, 10, 0, 0, 2024, 352, 1, 0, 0, 0, 2025, 2026, 7, 14, 0, 0, 2026, 2027, 7, 17, 0, 0, 2027, 2028, 7, 4, 0, 0, 2028, 2029, 7, 11, 0, 0, 2029, 354, 1, 0, 0, 0, 2030, 2031, 7, 14, 0, 0, 2031, 2032, 7, 9, 0, 0, 2032, 2033, 7, 15, 0, 0, 2033, 2034, 7, 4, 0, 0, 2034, 2035, 7, 5, 0, 0, 2035, 356, 1, 0, 0, 0, 2036, 2037, 7, 14, 0, 0, 2037, 2038, 7, 11, 0, 0, 2038, 2039, 7, 14, 0, 0, 2039, 2040, 7, 17, 0, 0, 2040, 2041, 7, 16, 0, 0, 2041, 358, 1, 0, 0, 0, 2042, 2043, 7, 14, 0, 0, 2043, 2044, 7, 10, 0, 0, 2044, 2045, 7, 23, 0, 0, 2045, 2046, 7, 10, 0, 0, 2046, 2047, 7, 14, 0, 0, 2047, 2048, 7, 6, 0, 0, 2048, 2049, 7, 10, 0, 0, 2049, 360, 1, 0, 0, 0, 2050, 2051, 7, 6, 0, 0, 2051, 2052, 7, 10, 0, 0, 2052, 2053, 7, 7, 0, 0, 2053, 2054, 5, 95, 0, 0, 2054, 2055, 7, 11, 0, 0, 2055, 2056, 7, 9, 0, 0, 2056, 2057, 5, 95, 0, 0, 2057, 2058, 7, 11, 0, 0, 2058, 2059, 7, 17, 0, 0, 2059, 2060, 7, 16, 0, 0, 2060, 2061, 7, 10, 0, 0, 2061, 362, 1, 0, 0, 0, 2062, 2063, 7, 6, 0, 0, 2063, 2064, 7, 17, 0, 0, 2064, 2065, 7, 20, 0, 0, 2065, 2066, 7, 4, 0, 0, 2066, 364, 1, 0, 0, 0, 2067, 2068, 7, 6, 0, 0, 2068, 2069, 7, 17, 0, 0, 2069, 2070, 7, 20, 0, 0, 2070, 2071, 7, 4, 0, 0, 2071, 2072, 7, 15, 0, 0, 2072, 2073, 7, 16, 0, 0, 2073, 366, 1, 0, 0, 0, 2074, 2075, 7, 6, 0, 0, 2075, 2076, 7, 17, 0, 0, 2076, 2077, 7, 4, 0, 0, 2077, 368, 1, 0, 0, 0, 2078, 2079, 7, 6, 0, 0, 2079, 2080, 7, 17, 0, 0, 2080, 2081, 7, 4, 0, 0, 2081, 2082, 7, 22, 0, 0, 2082, 370, 1, 0, 0, 0, 2083, 2084, 7, 6, 0, 0, 2084, 2085, 7, 26, 0, 0, 2085, 2086, 7, 14, 0, 0, 2086, 2087, 7, 11, 0, 0, 2087, 372, 1, 0, 0, 0, 2088, 2089, 7, 6, 0, 0, 2089, 2090, 7, 11, 0, 0, 2090, 2091, 7, 14, 0, 0, 2091, 2092, 5, 95, 0, 0, 2092, 2093, 7, 11, 0, 0, 2093, 2094, 7, 9, 0, 0, 2094, 2095, 5, 95, 0, 0, 2095, 2096, 7, 5, 0, 0, 2096, 2097, 7, 2, 0, 0, 2097, 2098, 7, 11, 0, 0, 2098, 2099, 7, 10, 0, 0, 2099, 374, 1, 0, 0, 0, 2100, 2101, 7, 6, 0, 0, 2101, 2102, 7, 15, 0, 0, 2102, 2103, 7, 8, 0, 0, 2103, 2104, 7, 5, 0, 0, 2104, 2105, 7, 2, 0, 0, 2105, 2106, 7, 11, 0, 0, 2106, 2107, 7, 10, 0, 0, 2107, 376, 1, 0, 0, 0, 2108, 2109, 7, 6, 0, 0, 2109, 2110, 7, 15, 0, 0, 2110, 2111, 7, 8, 0, 0, 2111, 2112, 7, 11, 0, 0, 2112, 2113, 7, 17, 0, 0, 2113, 2114, 7, 16, 0, 0, 2114, 2115, 7, 10, 0, 0, 2115, 378, 1, 0, 0, 0, 2116, 2117, 7, 6, 0, 0, 2117, 2118, 7, 15, 0, 0, 2118, 2119, 7, 8, 0, 0, 2119, 2120, 7, 11, 0, 0, 2120, 2121, 7, 14, 0, 0, 2121, 2122, 7, 2, 0, 0, 2122, 2123, 7, 7, 0, 0, 2123, 2124, 7, 11, 0, 0, 2124, 380, 1, 0, 0, 0, 2125, 2126, 7, 6, 0, 0, 2126, 2127, 7, 13, 0, 0, 2127, 2128, 7, 6, 0, 0, 2128, 2129, 7, 5, 0, 0, 2129, 2130, 7, 2, 0, 0, 2130, 2131, 7, 11, 0, 0, 2131, 2132, 7, 10, 0, 0, 2132, 382, 1, 0, 0, 0, 2133, 2134, 7, 11, 0, 0, 2134, 2135, 7, 2, 0, 0, 2135, 2136, 7, 4, 0, 0, 2136, 384, 1, 0, 0, 0, 2137, 2138, 7, 11, 0, 0, 2138, 2139, 7, 17, 0, 0, 2139, 2140, 7, 16, 0, 0, 2140, 2141, 7, 10, 0, 0, 2141, 386, 1, 0, 0, 0, 2142, 2143, 7, 11, 0, 0, 2143, 2144, 7, 17, 0, 0, 2144, 2145, 7, 16, 0, 0, 2145, 2146, 7, 10, 0, 0, 2146, 2147, 7, 5, 0, 0, 2147, 2148, 7, 17, 0, 0, 2148, 2149, 7, 19, 0, 0, 2149, 2150, 7, 19, 0, 0, 2150, 388, 1, 0, 0, 0, 2151, 2152, 7, 11, 0, 0, 2152, 2153, 7, 17, 0, 0, 2153, 2154, 7, 16, 0, 0, 2154, 2155, 7, 10, 0, 0, 2155, 2156, 5, 95, 0, 0, 2156, 2157, 7, 19, 0, 0, 2157, 2158, 7, 9, 0, 0, 2158, 2159, 7, 14, 0, 0, 2159, 2160, 7, 16, 0, 0, 2160, 2161, 7, 2, 0, 0, 2161, 2162, 7, 11, 0, 0, 2162, 390, 1, 0, 0, 0, 2163, 2164, 7, 11, 0, 0, 2164, 2165, 7, 17, 0, 0, 2165, 2166, 7, 16, 0, 0, 2166, 2167, 7, 10, 0, 0, 2167, 2168, 5, 95, 0, 0, 2168, 2169, 7, 11, 0, 0, 2169, 2170, 7, 9, 0, 0, 2170, 2171, 5, 95, 0, 0, 2171, 2172, 7, 6, 0, 0, 2172, 2173, 7, 10, 0, 0, 2173, 2174, 7, 7, 0, 0, 2174, 392, 1, 0, 0, 0, 2175, 2176, 7, 11, 0, 0, 2176, 2177, 7, 17, 0, 0, 2177, 2178, 7, 16, 0, 0, 2178, 2179, 7, 10, 0, 0, 2179, 2180, 7, 6, 0, 0, 2180, 2181, 7, 11, 0, 0, 2181, 2182, 7, 2, 0, 0, 2182, 2183, 7, 16, 0, 0, 2183, 2184, 7, 21, 0, 0, 2184, 394, 1, 0, 0, 0, 2185, 2186, 7, 11, 0, 0, 2186, 2187, 7, 14, 0, 0, 2187, 2188, 7, 15, 0, 0, 2188, 2189, 7, 4, 0, 0, 2189, 2190, 7, 7, 0, 0, 2190, 2191, 7, 2, 0, 0, 2191, 2192, 7, 11, 0, 0, 2192, 2193, 7, 10, 0, 0, 2193, 396, 1, 0, 0, 0, 2194, 2195, 7, 11, 0, 0, 2195, 2196, 7, 9, 0, 0, 2196, 2197, 5, 95, 0, 0, 2197, 2198, 7, 5, 0, 0, 2198, 2199, 7, 2, 0, 0, 2199, 2200, 7, 13, 0, 0, 2200, 2201, 7, 6, 0, 0, 2201, 398, 1, 0, 0, 0, 2202, 2203, 7, 11, 0, 0, 2203, 2204, 7, 9, 0, 0, 2204, 2205, 5, 95, 0, 0, 2205, 2206, 7, 6, 0, 0, 2206, 2207, 7, 10, 0, 0, 2207, 2208, 7, 7, 0, 0, 2208, 2209, 7, 9, 0, 0, 2209, 2210, 7, 4, 0, 0, 2210, 2211, 7, 5, 0, 0, 2211, 2212, 7, 6, 0, 0, 2212, 400, 1, 0, 0, 0, 2213, 2214, 7, 15, 0, 0, 2214, 2215, 7, 4, 0, 0, 2215, 2216, 7, 17, 0, 0, 2216, 2217, 7, 18, 0, 0, 2217, 2218, 5, 95, 0, 0, 2218, 2219, 7, 11, 0, 0, 2219, 2220, 7, 17, 0, 0, 2220, 2221, 7, 16, 0, 0, 2221, 2222, 7, 10, 0, 0, 2222, 2223, 7, 6, 0, 0, 2223, 2224, 7, 11, 0, 0, 2224, 2225, 7, 2, 0, 0, 2225, 2226, 7, 16, 0, 0, 2226, 2227, 7, 21, 0, 0, 2227, 402, 1, 0, 0, 0, 2228, 2229, 7, 15, 0, 0, 2229, 2230, 7, 21, 0, 0, 2230, 2231, 7, 21, 0, 0, 2231, 2232, 7, 10, 0, 0, 2232, 2233, 7, 14, 0, 0, 2233, 404, 1, 0, 0, 0, 2234, 2235, 7, 15, 0, 0, 2235, 2236, 7, 11, 0, 0, 2236, 2237, 7, 7, 0, 0, 2237, 2238, 5, 95, 0, 0, 2238, 2239, 7, 5, 0, 0, 2239, 2240, 7, 2, 0, 0, 2240, 2241, 7, 11, 0, 0, 2241, 2242, 7, 10, 0, 0, 2242, 406, 1, 0, 0, 0, 2243, 2244, 7, 15, 0, 0, 2244, 2245, 7, 11, 0, 0, 2245, 2246, 7, 7, 0, 0, 2246, 2247, 5, 95, 0, 0, 2247, 2248, 7, 11, 0, 0, 2248, 2249, 7, 17, 0, 0, 2249, 2250, 7, 16, 0, 0, 2250, 2251, 7, 10, 0, 0, 2251, 408, 1, 0, 0, 0, 2252, 2253, 7, 15, 0, 0, 2253, 2254, 7, 11, 0, 0, 2254, 2255, 7, 7, 0, 0, 2255, 2256, 5, 95, 0, 0, 2256, 2257, 7, 11, 0, 0, 2257, 2258, 7, 17, 0, 0, 2258, 2259, 7, 16, 0, 0, 2259, 2260, 7, 10, 0, 0, 2260, 2261, 7, 6, 0, 0, 2261, 2262, 7, 11, 0, 0, 2262, 2263, 7, 2, 0, 0, 2263, 2264, 7, 16, 0, 0, 2264, 2265, 7, 21, 0, 0, 2265, 410, 1, 0, 0, 0, 2266, 2267, 7, 5, 0, 0, 2267, 412, 1, 0, 0, 0, 2268, 2269, 7, 11, 0, 0, 2269, 414, 1, 0, 0, 0, 2270, 2271, 7, 11, 0, 0, 2271, 2272, 7, 6, 0, 0, 2272, 416, 1, 0, 0, 0, 2273, 2274, 5, 123, 0, 0, 2274, 418, 1, 0, 0, 0, 2275, 2276, 5, 125, 0, 0, 2276, 420, 1, 0, 0, 0, 2277, 2278, 7, 5, 0, 0, 2278, 2279, 7, 10, 0, 0, 2279, 2280, 7, 4, 0, 0, 2280, 2281, 7, 6, 0, 0, 2281, 2282, 7, 10, 0, 0, 2282, 2283, 5, 95, 0, 0, 2283, 2284, 7, 14, 0, 0, 2284, 2285, 7, 2, 0, 0, 2285, 2286, 7, 4, 0, 0, 2286, 2287, 7, 25, 0, 0, 2287, 422, 1, 0, 0, 0, 2288, 2289, 7, 14, 0, 0, 2289, 2290, 7, 2, 0, 0, 2290, 2291, 7, 4, 0, 0, 2291, 2292, 7, 25, 0, 0, 2292, 424, 1, 0, 0, 0, 2293, 2294, 7, 14, 0, 0, 2294, 2295, 7, 9, 0, 0, 2295, 2296, 7, 12, 0, 0, 2296, 2297, 5, 95, 0, 0, 2297, 2298, 7, 4, 0, 0, 2298, 2299, 7, 15, 0, 0, 2299, 2300, 7, 16, 0, 0, 2300, 2301, 7, 8, 0, 0, 2301, 2302, 7, 10, 0, 0, 2302, 2303, 7, 14, 0, 0, 2303, 426, 1, 0, 0, 0, 2304, 2305, 7, 5, 0, 0, 2305, 2306, 7, 2, 0, 0, 2306, 2307, 7, 11, 0, 0, 2307, 2308, 7, 10, 0, 0, 2308, 2309, 5, 95, 0, 0, 2309, 2310, 7, 22, 0, 0, 2310, 2311, 7, 17, 0, 0, 2311, 2312, 7, 6, 0, 0, 2312, 2313, 7, 11, 0, 0, 2313, 2314, 7, 9, 0, 0, 2314, 2315, 7, 20, 0, 0, 2315, 2316, 7, 14, 0, 0, 2316, 2317, 7, 2, 0, 0, 2317, 2318, 7, 16, 0, 0, 2318, 428, 1, 0, 0, 0, 2319, 2320, 7, 5, 0, 0, 2320, 2321, 7, 2, 0, 0, 2321, 2322, 7, 13, 0, 0, 2322, 2323, 5, 95, 0, 0, 2323, 2324, 7, 9, 0, 0, 2324, 2325, 7, 19, 0, 0, 2325, 2326, 5, 95, 0, 0, 2326, 2327, 7, 16, 0, 0, 2327, 2328, 7, 9, 0, 0, 2328, 2329, 7, 4, 0, 0, 2329, 2330, 7, 11, 0, 0, 2330, 2331, 7, 22, 0, 0, 2331, 430, 1, 0, 0, 0, 2332, 2333, 7, 5, 0, 0, 2333, 2334, 7, 2, 0, 0, 2334, 2335, 7, 13, 0, 0, 2335, 2336, 5, 95, 0, 0, 2336, 2337, 7, 9, 0, 0, 2337, 2338, 7, 19, 0, 0, 2338, 2339, 5, 95, 0, 0, 2339, 2340, 7, 13, 0, 0, 2340, 2341, 7, 10, 0, 0, 2341, 2342, 7, 2, 0, 0, 2342, 2343, 7, 14, 0, 0, 2343, 432, 1, 0, 0, 0, 2344, 2345, 7, 5, 0, 0, 2345, 2346, 7, 2, 0, 0, 2346, 2347, 7, 13, 0, 0, 2347, 2348, 5, 95, 0, 0, 2348, 2349, 7, 9, 0, 0, 2349, 2350, 7, 19, 0, 0, 2350, 2351, 5, 95, 0, 0, 2351, 2352, 7, 12, 0, 0, 2352, 2353, 7, 10, 0, 0, 2353, 2354, 7, 10, 0, 0, 2354, 2355, 7, 25, 0, 0, 2355, 434, 1, 0, 0, 0, 2356, 2357, 7, 10, 0, 0, 2357, 2358, 7, 18, 0, 0, 2358, 2359, 7, 7, 0, 0, 2359, 2360, 7, 3, 0, 0, 2360, 2361, 7, 15, 0, 0, 2361, 2362, 7, 5, 0, 0, 2362, 2363, 7, 10, 0, 0, 2363, 436, 1, 0, 0, 0, 2364, 2365, 7, 10, 0, 0, 2365, 2366, 7, 18, 0, 0, 2366, 2367, 7, 11, 0, 0, 2367, 2368, 7, 10, 0, 0, 2368, 2369, 7, 4, 0, 0, 2369, 2370, 7, 5, 0, 0, 2370, 2371, 7, 10, 0, 0, 2371, 2372, 7, 5, 0, 0, 2372, 2373, 5, 95, 0, 0, 2373, 2374, 7, 6, 0, 0, 2374, 2375, 7, 11, 0, 0, 2375, 2376, 7, 2, 0, 0, 2376, 2377, 7, 11, 0, 0, 2377, 2378, 7, 6, 0, 0, 2378, 438, 1, 0, 0, 0, 2379, 2380, 7, 19, 0, 0, 2380, 2381, 7, 17, 0, 0, 2381, 2382, 7, 10, 0, 0, 2382, 2383, 7, 3, 0, 0, 2383, 2384, 7, 5, 0, 0, 2384, 440, 1, 0, 0, 0, 2385, 2386, 7, 19, 0, 0, 2386, 2387, 7, 17, 0, 0, 2387, 2388, 7, 3, 0, 0, 2388, 2389, 7, 11, 0, 0, 2389, 2390, 7, 10, 0, 0, 2390, 2391, 7, 14, 0, 0, 2391, 442, 1, 0, 0, 0, 2392, 2393, 7, 20, 0, 0, 2393, 2394, 7, 10, 0, 0, 2394, 2395, 7, 9, 0, 0, 2395, 2396, 5, 95, 0, 0, 2396, 2397, 7, 8, 0, 0, 2397, 2398, 7, 9, 0, 0, 2398, 2399, 7, 15, 0, 0, 2399, 2400, 7, 4, 0, 0, 2400, 2401, 7, 5, 0, 0, 2401, 2402, 7, 17, 0, 0, 2402, 2403, 7, 4, 0, 0, 2403, 2404, 7, 20, 0, 0, 2404, 2405, 5, 95, 0, 0, 2405, 2406, 7, 8, 0, 0, 2406, 2407, 7, 9, 0, 0, 2407, 2408, 7, 18, 0, 0, 2408, 444, 1, 0, 0, 0, 2409, 2410, 7, 20, 0, 0, 2410, 2411, 7, 10, 0, 0, 2411, 2412, 7, 9, 0, 0, 2412, 2413, 5, 95, 0, 0, 2413, 2414, 7, 7, 0, 0, 2414, 2415, 7, 10, 0, 0, 2415, 2416, 7, 3, 0, 0, 2416, 2417, 7, 3, 0, 0, 2417, 446, 1, 0, 0, 0, 2418, 2419, 7, 20, 0, 0, 2419, 2420, 7, 10, 0, 0, 2420, 2421, 7, 9, 0, 0, 2421, 2422, 5, 95, 0, 0, 2422, 2423, 7, 5, 0, 0, 2423, 2424, 7, 17, 0, 0, 2424, 2425, 7, 6, 0, 0, 2425, 2426, 7, 11, 0, 0, 2426, 2427, 7, 2, 0, 0, 2427, 2428, 7, 4, 0, 0, 2428, 2429, 7, 7, 0, 0, 2429, 2430, 7, 10, 0, 0, 2430, 448, 1, 0, 0, 0, 2431, 2432, 7, 20, 0, 0, 2432, 2433, 7, 10, 0, 0, 2433, 2434, 7, 9, 0, 0, 2434, 2435, 5, 95, 0, 0, 2435, 2436, 7, 5, 0, 0, 2436, 2437, 7, 17, 0, 0, 2437, 2438, 7, 6, 0, 0, 2438, 2439, 7, 11, 0, 0, 2439, 2440, 7, 2, 0, 0, 2440, 2441, 7, 4, 0, 0, 2441, 2442, 7, 7, 0, 0, 2442, 2443, 7, 10, 0, 0, 2443, 2444, 5, 95, 0, 0, 2444, 2445, 7, 14, 0, 0, 2445, 2446, 7, 2, 0, 0, 2446, 2447, 7, 4, 0, 0, 2447, 2448, 7, 20, 0, 0, 2448, 2449, 7, 10, 0, 0, 2449, 450, 1, 0, 0, 0, 2450, 2451, 7, 20, 0, 0, 2451, 2452, 7, 10, 0, 0, 2452, 2453, 7, 9, 0, 0, 2453, 2454, 5, 95, 0, 0, 2454, 2455, 7, 17, 0, 0, 2455, 2456, 7, 4, 0, 0, 2456, 2457, 7, 11, 0, 0, 2457, 2458, 7, 10, 0, 0, 2458, 2459, 7, 14, 0, 0, 2459, 2460, 7, 6, 0, 0, 2460, 2461, 7, 10, 0, 0, 2461, 2462, 7, 7, 0, 0, 2462, 2463, 7, 11, 0, 0, 2463, 2464, 7, 6, 0, 0, 2464, 452, 1, 0, 0, 0, 2465, 2466, 7, 20, 0, 0, 2466, 2467, 7, 10, 0, 0, 2467, 2468, 7, 9, 0, 0, 2468, 2469, 5, 95, 0, 0, 2469, 2470, 7, 21, 0, 0, 2470, 2471, 7, 9, 0, 0, 2471, 2472, 7, 3, 0, 0, 2472, 2473, 7, 13, 0, 0, 2473, 2474, 7, 20, 0, 0, 2474, 2475, 7, 9, 0, 0, 2475, 2476, 7, 4, 0, 0, 2476, 454, 1, 0, 0, 0, 2477, 2478, 7, 22, 0, 0, 2478, 2479, 7, 17, 0, 0, 2479, 2480, 7, 6, 0, 0, 2480, 2481, 7, 11, 0, 0, 2481, 2482, 7, 9, 0, 0, 2482, 2483, 7, 20, 0, 0, 2483, 2484, 7, 14, 0, 0, 2484, 2485, 7, 2, 0, 0, 2485, 2486, 7, 16, 0, 0, 2486, 456, 1, 0, 0, 0, 2487, 2488, 7, 22, 0, 0, 2488, 2489, 7, 9, 0, 0, 2489, 2490, 7, 15, 0, 0, 2490, 2491, 7, 14, 0, 0, 2491, 2492, 5, 95, 0, 0, 2492, 2493, 7, 9, 0, 0, 2493, 2494, 7, 19, 0, 0, 2494, 2495, 5, 95, 0, 0, 2495, 2496, 7, 5, 0, 0, 2496, 2497, 7, 2, 0, 0, 2497, 2498, 7, 13, 0, 0, 2498, 458, 1, 0, 0, 0, 2499, 2500, 7, 17, 0, 0, 2500, 2501, 7, 4, 0, 0, 2501, 2502, 7, 7, 0, 0, 2502, 2503, 7, 3, 0, 0, 2503, 2504, 7, 15, 0, 0, 2504, 2505, 7, 5, 0, 0, 2505, 2506, 7, 10, 0, 0, 2506, 460, 1, 0, 0, 0, 2507, 2508, 7, 17, 0, 0, 2508, 2509, 7, 4, 0, 0, 2509, 2510, 5, 95, 0, 0, 2510, 2511, 7, 11, 0, 0, 2511, 2512, 7, 10, 0, 0, 2512, 2513, 7, 14, 0, 0, 2513, 2514, 7, 16, 0, 0, 2514, 2515, 7, 6, 0, 0, 2515, 462, 1, 0, 0, 0, 2516, 2517, 7, 16, 0, 0, 2517, 2518, 7, 2, 0, 0, 2518, 2519, 7, 11, 0, 0, 2519, 2520, 7, 7, 0, 0, 2520, 2521, 7, 22, 0, 0, 2521, 2522, 7, 21, 0, 0, 2522, 2523, 7, 22, 0, 0, 2523, 2524, 7, 14, 0, 0, 2524, 2525, 7, 2, 0, 0, 2525, 2526, 7, 6, 0, 0, 2526, 2527, 7, 10, 0, 0, 2527, 464, 1, 0, 0, 0, 2528, 2529, 7, 16, 0, 0, 2529, 2530, 7, 2, 0, 0, 2530, 2531, 7, 11, 0, 0, 2531, 2532, 7, 7, 0, 0, 2532, 2533, 7, 22, 0, 0, 2533, 2534, 5, 95, 0, 0, 2534, 2535, 7, 21, 0, 0, 2535, 2536, 7, 22, 0, 0, 2536, 2537, 7, 14, 0, 0, 2537, 2538, 7, 2, 0, 0, 2538, 2539, 7, 6, 0, 0, 2539, 2540, 7, 10, 0, 0, 2540, 466, 1, 0, 0, 0, 2541, 2542, 7, 16, 0, 0, 2542, 2543, 7, 2, 0, 0, 2543, 2544, 7, 11, 0, 0, 2544, 2545, 7, 7, 0, 0, 2545, 2546, 7, 22, 0, 0, 2546, 2547, 7, 21, 0, 0, 2547, 2548, 7, 22, 0, 0, 2548, 2549, 7, 14, 0, 0, 2549, 2550, 7, 2, 0, 0, 2550, 2551, 7, 6, 0, 0, 2551, 2552, 7, 10, 0, 0, 2552, 2553, 7, 26, 0, 0, 2553, 2554, 7, 15, 0, 0, 2554, 2555, 7, 10, 0, 0, 2555, 2556, 7, 14, 0, 0, 2556, 2557, 7, 13, 0, 0, 2557, 468, 1, 0, 0, 0, 2558, 2559, 7, 6, 0, 0, 2559, 2560, 7, 17, 0, 0, 2560, 2561, 7, 16, 0, 0, 2561, 2562, 7, 21, 0, 0, 2562, 2563, 7, 3, 0, 0, 2563, 2564, 7, 10, 0, 0, 2564, 2565, 5, 95, 0, 0, 2565, 2566, 7, 26, 0, 0, 2566, 2567, 7, 15, 0, 0, 2567, 2568, 7, 10, 0, 0, 2568, 2569, 7, 14, 0, 0, 2569, 2570, 7, 13, 0, 0, 2570, 2571, 5, 95, 0, 0, 2571, 2572, 7, 6, 0, 0, 2572, 2573, 7, 11, 0, 0, 2573, 2574, 7, 14, 0, 0, 2574, 2575, 7, 17, 0, 0, 2575, 2576, 7, 4, 0, 0, 2576, 2577, 7, 20, 0, 0, 2577, 470, 1, 0, 0, 0, 2578, 2579, 7, 26, 0, 0, 2579, 2580, 7, 15, 0, 0, 2580, 2581, 7, 10, 0, 0, 2581, 2582, 7, 14, 0, 0, 2582, 2583, 7, 13, 0, 0, 2583, 2584, 5, 95, 0, 0, 2584, 2585, 7, 6, 0, 0, 2585, 2586, 7, 11, 0, 0, 2586, 2587, 7, 14, 0, 0, 2587, 2588, 7, 17, 0, 0, 2588, 2589, 7, 4, 0, 0, 2589, 2590, 7, 20, 0, 0, 2590, 472, 1, 0, 0, 0, 2591, 2592, 7, 16, 0, 0, 2592, 2593, 7, 2, 0, 0, 2593, 2594, 7, 11, 0, 0, 2594, 2595, 7, 7, 0, 0, 2595, 2596, 7, 22, 0, 0, 2596, 2597, 5, 95, 0, 0, 2597, 2598, 7, 21, 0, 0, 2598, 2599, 7, 22, 0, 0, 2599, 2600, 7, 14, 0, 0, 2600, 2601, 7, 2, 0, 0, 2601, 2602, 7, 6, 0, 0, 2602, 2603, 7, 10, 0, 0, 2603, 2604, 5, 95, 0, 0, 2604, 2605, 7, 21, 0, 0, 2605, 2606, 7, 14, 0, 0, 2606, 2607, 7, 10, 0, 0, 2607, 2608, 7, 19, 0, 0, 2608, 2609, 7, 17, 0, 0, 2609, 2610, 7, 18, 0, 0, 2610, 474, 1, 0, 0, 0, 2611, 2612, 7, 16, 0, 0, 2612, 2613, 7, 2, 0, 0, 2613, 2614, 7, 11, 0, 0, 2614, 2615, 7, 7, 0, 0, 2615, 2616, 7, 22, 0, 0, 2616, 2617, 7, 26, 0, 0, 2617, 2618, 7, 15, 0, 0, 2618, 2619, 7, 10, 0, 0, 2619, 2620, 7, 14, 0, 0, 2620, 2621, 7, 13, 0, 0, 2621, 476, 1, 0, 0, 0, 2622, 2623, 7, 16, 0, 0, 2623, 2624, 7, 2, 0, 0, 2624, 2625, 7, 11, 0, 0, 2625, 2626, 7, 7, 0, 0, 2626, 2627, 7, 22, 0, 0, 2627, 2628, 5, 95, 0, 0, 2628, 2629, 7, 26, 0, 0, 2629, 2630, 7, 15, 0, 0, 2630, 2631, 7, 10, 0, 0, 2631, 2632, 7, 14, 0, 0, 2632, 2633, 7, 13, 0, 0, 2633, 478, 1, 0, 0, 0, 2634, 2635, 7, 16, 0, 0, 2635, 2636, 7, 17, 0, 0, 2636, 2637, 7, 4, 0, 0, 2637, 2638, 7, 15, 0, 0, 2638, 2639, 7, 11, 0, 0, 2639, 2640, 7, 10, 0, 0, 2640, 2641, 5, 95, 0, 0, 2641, 2642, 7, 9, 0, 0, 2642, 2643, 7, 19, 0, 0, 2643, 2644, 5, 95, 0, 0, 2644, 2645, 7, 5, 0, 0, 2645, 2646, 7, 2, 0, 0, 2646, 2647, 7, 13, 0, 0, 2647, 480, 1, 0, 0, 0, 2648, 2649, 7, 16, 0, 0, 2649, 2650, 7, 17, 0, 0, 2650, 2651, 7, 4, 0, 0, 2651, 2652, 7, 15, 0, 0, 2652, 2653, 7, 11, 0, 0, 2653, 2654, 7, 10, 0, 0, 2654, 2655, 5, 95, 0, 0, 2655, 2656, 7, 9, 0, 0, 2656, 2657, 7, 19, 0, 0, 2657, 2658, 5, 95, 0, 0, 2658, 2659, 7, 22, 0, 0, 2659, 2660, 7, 9, 0, 0, 2660, 2661, 7, 15, 0, 0, 2661, 2662, 7, 14, 0, 0, 2662, 482, 1, 0, 0, 0, 2663, 2664, 7, 16, 0, 0, 2664, 2665, 7, 9, 0, 0, 2665, 2666, 7, 4, 0, 0, 2666, 2667, 7, 11, 0, 0, 2667, 2668, 7, 22, 0, 0, 2668, 2669, 5, 95, 0, 0, 2669, 2670, 7, 9, 0, 0, 2670, 2671, 7, 19, 0, 0, 2671, 2672, 5, 95, 0, 0, 2672, 2673, 7, 13, 0, 0, 2673, 2674, 7, 10, 0, 0, 2674, 2675, 7, 2, 0, 0, 2675, 2676, 7, 14, 0, 0, 2676, 484, 1, 0, 0, 0, 2677, 2678, 7, 16, 0, 0, 2678, 2679, 7, 15, 0, 0, 2679, 2680, 7, 3, 0, 0, 2680, 2681, 7, 11, 0, 0, 2681, 2682, 7, 17, 0, 0, 2682, 2683, 7, 16, 0, 0, 2683, 2684, 7, 2, 0, 0, 2684, 2685, 7, 11, 0, 0, 2685, 2686, 7, 7, 0, 0, 2686, 2687, 7, 22, 0, 0, 2687, 486, 1, 0, 0, 0, 2688, 2689, 7, 16, 0, 0, 2689, 2690, 7, 15, 0, 0, 2690, 2691, 7, 3, 0, 0, 2691, 2692, 7, 11, 0, 0, 2692, 2693, 7, 17, 0, 0, 2693, 2694, 5, 95, 0, 0, 2694, 2695, 7, 16, 0, 0, 2695, 2696, 7, 2, 0, 0, 2696, 2697, 7, 11, 0, 0, 2697, 2698, 7, 7, 0, 0, 2698, 2699, 7, 22, 0, 0, 2699, 488, 1, 0, 0, 0, 2700, 2701, 7, 16, 0, 0, 2701, 2702, 7, 15, 0, 0, 2702, 2703, 7, 3, 0, 0, 2703, 2704, 7, 11, 0, 0, 2704, 2705, 7, 17, 0, 0, 2705, 2706, 7, 16, 0, 0, 2706, 2707, 7, 2, 0, 0, 2707, 2708, 7, 11, 0, 0, 2708, 2709, 7, 7, 0, 0, 2709, 2710, 7, 22, 0, 0, 2710, 2711, 7, 26, 0, 0, 2711, 2712, 7, 15, 0, 0, 2712, 2713, 7, 10, 0, 0, 2713, 2714, 7, 14, 0, 0, 2714, 2715, 7, 13, 0, 0, 2715, 490, 1, 0, 0, 0, 2716, 2717, 7, 4, 0, 0, 2717, 2718, 7, 10, 0, 0, 2718, 2719, 7, 6, 0, 0, 2719, 2720, 7, 11, 0, 0, 2720, 2721, 7, 10, 0, 0, 2721, 2722, 7, 5, 0, 0, 2722, 492, 1, 0, 0, 0, 2723, 2724, 7, 21, 0, 0, 2724, 2725, 7, 10, 0, 0, 2725, 2726, 7, 14, 0, 0, 2726, 2727, 7, 7, 0, 0, 2727, 2728, 7, 10, 0, 0, 2728, 2729, 7, 4, 0, 0, 2729, 2730, 7, 11, 0, 0, 2730, 2731, 7, 17, 0, 0, 2731, 2732, 7, 3, 0, 0, 2732, 2733, 7, 10, 0, 0, 2733, 2734, 7, 6, 0, 0, 2734, 494, 1, 0, 0, 0, 2735, 2736, 7, 21, 0, 0, 2736, 2737, 7, 10, 0, 0, 2737, 2738, 7, 14, 0, 0, 2738, 2739, 7, 7, 0, 0, 2739, 2740, 7, 10, 0, 0, 2740, 2741, 7, 4, 0, 0, 2741, 2742, 7, 11, 0, 0, 2742, 2743, 7, 17, 0, 0, 2743, 2744, 7, 3, 0, 0, 2744, 2745, 7, 10, 0, 0, 2745, 496, 1, 0, 0, 0, 2746, 2747, 7, 21, 0, 0, 2747, 2748, 7, 10, 0, 0, 2748, 2749, 7, 14, 0, 0, 2749, 2750, 7, 7, 0, 0, 2750, 2751, 7, 10, 0, 0, 2751, 2752, 7, 4, 0, 0, 2752, 2753, 7, 11, 0, 0, 2753, 2754, 7, 17, 0, 0, 2754, 2755, 7, 3, 0, 0, 2755, 2756, 7, 10, 0, 0, 2756, 2757, 5, 95, 0, 0, 2757, 2758, 7, 2, 0, 0, 2758, 2759, 7, 21, 0, 0, 2759, 2760, 7, 21, 0, 0, 2760, 2761, 7, 14, 0, 0, 2761, 2762, 7, 9, 0, 0, 2762, 2763, 7, 18, 0, 0, 2763, 498, 1, 0, 0, 0, 2764, 2765, 7, 14, 0, 0, 2765, 2766, 7, 10, 0, 0, 2766, 2767, 7, 20, 0, 0, 2767, 2768, 7, 10, 0, 0, 2768, 2769, 7, 18, 0, 0, 2769, 2770, 7, 21, 0, 0, 2770, 2771, 5, 95, 0, 0, 2771, 2772, 7, 26, 0, 0, 2772, 2773, 7, 15, 0, 0, 2773, 2774, 7, 10, 0, 0, 2774, 2775, 7, 14, 0, 0, 2775, 2776, 7, 13, 0, 0, 2776, 500, 1, 0, 0, 0, 2777, 2778, 7, 14, 0, 0, 2778, 2779, 7, 10, 0, 0, 2779, 2780, 7, 23, 0, 0, 2780, 2781, 7, 10, 0, 0, 2781, 2782, 7, 14, 0, 0, 2782, 2783, 7, 6, 0, 0, 2783, 2784, 7, 10, 0, 0, 2784, 2785, 5, 95, 0, 0, 2785, 2786, 7, 4, 0, 0, 2786, 2787, 7, 10, 0, 0, 2787, 2788, 7, 6, 0, 0, 2788, 2789, 7, 11, 0, 0, 2789, 2790, 7, 10, 0, 0, 2790, 2791, 7, 5, 0, 0, 2791, 502, 1, 0, 0, 0, 2792, 2793, 7, 26, 0, 0, 2793, 2794, 7, 15, 0, 0, 2794, 2795, 7, 10, 0, 0, 2795, 2796, 7, 14, 0, 0, 2796, 2797, 7, 13, 0, 0, 2797, 504, 1, 0, 0, 0, 2798, 2799, 7, 14, 0, 0, 2799, 2800, 7, 2, 0, 0, 2800, 2801, 7, 4, 0, 0, 2801, 2802, 7, 20, 0, 0, 2802, 2803, 7, 10, 0, 0, 2803, 506, 1, 0, 0, 0, 2804, 2805, 7, 6, 0, 0, 2805, 2806, 7, 7, 0, 0, 2806, 2807, 7, 9, 0, 0, 2807, 2808, 7, 14, 0, 0, 2808, 2809, 7, 10, 0, 0, 2809, 508, 1, 0, 0, 0, 2810, 2811, 7, 6, 0, 0, 2811, 2812, 7, 7, 0, 0, 2812, 2813, 7, 9, 0, 0, 2813, 2814, 7, 14, 0, 0, 2814, 2815, 7, 10, 0, 0, 2815, 2816, 7, 26, 0, 0, 2816, 2817, 7, 15, 0, 0, 2817, 2818, 7, 10, 0, 0, 2818, 2819, 7, 14, 0, 0, 2819, 2820, 7, 13, 0, 0, 2820, 510, 1, 0, 0, 0, 2821, 2822, 7, 6, 0, 0, 2822, 2823, 7, 7, 0, 0, 2823, 2824, 7, 9, 0, 0, 2824, 2825, 7, 14, 0, 0, 2825, 2826, 7, 10, 0, 0, 2826, 2827, 5, 95, 0, 0, 2827, 2828, 7, 26, 0, 0, 2828, 2829, 7, 15, 0, 0, 2829, 2830, 7, 10, 0, 0, 2830, 2831, 7, 14, 0, 0, 2831, 2832, 7, 13, 0, 0, 2832, 512, 1, 0, 0, 0, 2833, 2834, 7, 6, 0, 0, 2834, 2835, 7, 10, 0, 0, 2835, 2836, 7, 7, 0, 0, 2836, 2837, 7, 9, 0, 0, 2837, 2838, 7, 4, 0, 0, 2838, 2839, 7, 5, 0, 0, 2839, 2840, 5, 95, 0, 0, 2840, 2841, 7, 9, 0, 0, 2841, 2842, 7, 19, 0, 0, 2842, 2843, 5, 95, 0, 0, 2843, 2844, 7, 16, 0, 0, 2844, 2845, 7, 17, 0, 0, 2845, 2846, 7, 4, 0, 0, 2846, 2847, 7, 15, 0, 0, 2847, 2848, 7, 11, 0, 0, 2848, 2849, 7, 10, 0, 0, 2849, 514, 1, 0, 0, 0, 2850, 2851, 7, 6, 0, 0, 2851, 2852, 7, 11, 0, 0, 2852, 2853, 7, 2, 0, 0, 2853, 2854, 7, 11, 0, 0, 2854, 2855, 7, 6, 0, 0, 2855, 516, 1, 0, 0, 0, 2856, 2857, 7, 11, 0, 0, 2857, 2858, 7, 10, 0, 0, 2858, 2859, 7, 14, 0, 0, 2859, 2860, 7, 16, 0, 0, 2860, 518, 1, 0, 0, 0, 2861, 2862, 7, 11, 0, 0, 2862, 2863, 7, 10, 0, 0, 2863, 2864, 7, 14, 0, 0, 2864, 2865, 7, 16, 0, 0, 2865, 2866, 7, 6, 0, 0, 2866, 520, 1, 0, 0, 0, 2867, 2868, 7, 11, 0, 0, 2868, 2869, 7, 17, 0, 0, 2869, 2870, 7, 16, 0, 0, 2870, 2871, 7, 10, 0, 0, 2871, 2872, 7, 6, 0, 0, 2872, 2873, 7, 11, 0, 0, 2873, 2874, 7, 2, 0, 0, 2874, 2875, 7, 16, 0, 0, 2875, 2876, 7, 21, 0, 0, 2876, 2877, 7, 2, 0, 0, 2877, 2878, 7, 5, 0, 0, 2878, 2879, 7, 5, 0, 0, 2879, 522, 1, 0, 0, 0, 2880, 2881, 7, 11, 0, 0, 2881, 2882, 7, 17, 0, 0, 2882, 2883, 7, 16, 0, 0, 2883, 2884, 7, 10, 0, 0, 2884, 2885, 7, 6, 0, 0, 2885, 2886, 7, 11, 0, 0, 2886, 2887, 7, 2, 0, 0, 2887, 2888, 7, 16, 0, 0, 2888, 2889, 7, 21, 0, 0, 2889, 2890, 7, 5, 0, 0, 2890, 2891, 7, 17, 0, 0, 2891, 2892, 7, 19, 0, 0, 2892, 2893, 7, 19, 0, 0, 2893, 524, 1, 0, 0, 0, 2894, 2895, 7, 11, 0, 0, 2895, 2896, 7, 9, 0, 0, 2896, 2897, 7, 21, 0, 0, 2897, 2898, 7, 22, 0, 0, 2898, 2899, 7, 17, 0, 0, 2899, 2900, 7, 11, 0, 0, 2900, 2901, 7, 6, 0, 0, 2901, 526, 1, 0, 0, 0, 2902, 2903, 7, 11, 0, 0, 2903, 2904, 7, 13, 0, 0, 2904, 2905, 7, 21, 0, 0, 2905, 2906, 7, 10, 0, 0, 2906, 2907, 7, 9, 0, 0, 2907, 2908, 7, 19, 0, 0, 2908, 528, 1, 0, 0, 0, 2909, 2910, 7, 12, 0, 0, 2910, 2911, 7, 10, 0, 0, 2911, 2912, 7, 10, 0, 0, 2912, 2913, 7, 25, 0, 0, 2913, 2914, 5, 95, 0, 0, 2914, 2915, 7, 9, 0, 0, 2915, 2916, 7, 19, 0, 0, 2916, 2917, 5, 95, 0, 0, 2917, 2918, 7, 13, 0, 0, 2918, 2919, 7, 10, 0, 0, 2919, 2920, 7, 2, 0, 0, 2920, 2921, 7, 14, 0, 0, 2921, 530, 1, 0, 0, 0, 2922, 2923, 7, 12, 0, 0, 2923, 2924, 7, 10, 0, 0, 2924, 2925, 7, 10, 0, 0, 2925, 2926, 7, 25, 0, 0, 2926, 2927, 7, 9, 0, 0, 2927, 2928, 7, 19, 0, 0, 2928, 2929, 7, 13, 0, 0, 2929, 2930, 7, 10, 0, 0, 2930, 2931, 7, 2, 0, 0, 2931, 2932, 7, 14, 0, 0, 2932, 532, 1, 0, 0, 0, 2933, 2934, 7, 12, 0, 0, 2934, 2935, 7, 10, 0, 0, 2935, 2936, 7, 10, 0, 0, 2936, 2937, 7, 25, 0, 0, 2937, 2938, 7, 5, 0, 0, 2938, 2939, 7, 2, 0, 0, 2939, 2940, 7, 13, 0, 0, 2940, 534, 1, 0, 0, 0, 2941, 2942, 7, 12, 0, 0, 2942, 2943, 7, 17, 0, 0, 2943, 2944, 7, 3, 0, 0, 2944, 2945, 7, 5, 0, 0, 2945, 2946, 7, 7, 0, 0, 2946, 2947, 7, 2, 0, 0, 2947, 2948, 7, 14, 0, 0, 2948, 2949, 7, 5, 0, 0, 2949, 2950, 7, 26, 0, 0, 2950, 2951, 7, 15, 0, 0, 2951, 2952, 7, 10, 0, 0, 2952, 2953, 7, 14, 0, 0, 2953, 2954, 7, 13, 0, 0, 2954, 536, 1, 0, 0, 0, 2955, 2956, 7, 12, 0, 0, 2956, 2957, 7, 17, 0, 0, 2957, 2958, 7, 3, 0, 0, 2958, 2959, 7, 5, 0, 0, 2959, 2960, 7, 7, 0, 0, 2960, 2961, 7, 2, 0, 0, 2961, 2962, 7, 14, 0, 0, 2962, 2963, 7, 5, 0, 0, 2963, 2964, 5, 95, 0, 0, 2964, 2965, 7, 26, 0, 0, 2965, 2966, 7, 15, 0, 0, 2966, 2967, 7, 10, 0, 0, 2967, 2968, 7, 14, 0, 0, 2968, 2969, 7, 13, 0, 0, 2969, 538, 1, 0, 0, 0, 2970, 2971, 7, 6, 0, 0, 2971, 2972, 7, 15, 0, 0, 2972, 2973, 7, 8, 0, 0, 2973, 2974, 7, 6, 0, 0, 2974, 2975, 7, 11, 0, 0, 2975, 2976, 7, 14, 0, 0, 2976, 540, 1, 0, 0, 0, 2977, 2978, 7, 6, 0, 0, 2978, 2979, 7, 11, 0, 0, 2979, 2980, 7, 14, 0, 0, 2980, 2981, 7, 7, 0, 0, 2981, 2982, 7, 16, 0, 0, 2982, 2983, 7, 21, 0, 0, 2983, 542, 1, 0, 0, 0, 2984, 2985, 7, 2, 0, 0, 2985, 2986, 7, 5, 0, 0, 2986, 2987, 7, 5, 0, 0, 2987, 2988, 7, 5, 0, 0, 2988, 2989, 7, 2, 0, 0, 2989, 2990, 7, 11, 0, 0, 2990, 2991, 7, 10, 0, 0, 2991, 544, 1, 0, 0, 0, 2992, 2993, 7, 13, 0, 0, 2993, 2994, 7, 10, 0, 0, 2994, 2995, 7, 2, 0, 0, 2995, 2996, 7, 14, 0, 0, 2996, 2997, 7, 12, 0, 0, 2997, 2998, 7, 10, 0, 0, 2998, 2999, 7, 10, 0, 0, 2999, 3000, 7, 25, 0, 0, 3000, 546, 1, 0, 0, 0, 3001, 3002, 7, 2, 0, 0, 3002, 3003, 7, 3, 0, 0, 3003, 3004, 7, 3, 0, 0, 3004, 3005, 7, 9, 0, 0, 3005, 3006, 7, 12, 0, 0, 3006, 3007, 5, 95, 0, 0, 3007, 3008, 7, 3, 0, 0, 3008, 3009, 7, 10, 0, 0, 3009, 3010, 7, 2, 0, 0, 3010, 3011, 7, 5, 0, 0, 3011, 3012, 7, 17, 0, 0, 3012, 3013, 7, 4, 0, 0, 3013, 3014, 7, 20, 0, 0, 3014, 3015, 5, 95, 0, 0, 3015, 3016, 7, 12, 0, 0, 3016, 3017, 7, 17, 0, 0, 3017, 3018, 7, 3, 0, 0, 3018, 3019, 7, 5, 0, 0, 3019, 3020, 7, 7, 0, 0, 3020, 3021, 7, 2, 0, 0, 3021, 3022, 7, 14, 0, 0, 3022, 3023, 7, 5, 0, 0, 3023, 548, 1, 0, 0, 0, 3024, 3025, 7, 2, 0, 0, 3025, 3026, 7, 4, 0, 0, 3026, 3027, 7, 2, 0, 0, 3027, 3028, 7, 3, 0, 0, 3028, 3029, 7, 13, 0, 0, 3029, 3030, 7, 27, 0, 0, 3030, 3031, 7, 10, 0, 0, 3031, 3032, 7, 14, 0, 0, 3032, 550, 1, 0, 0, 0, 3033, 3034, 7, 2, 0, 0, 3034, 3035, 7, 4, 0, 0, 3035, 3036, 7, 2, 0, 0, 3036, 3037, 7, 3, 0, 0, 3037, 3038, 7, 13, 0, 0, 3038, 3039, 7, 27, 0, 0, 3039, 3040, 7, 10, 0, 0, 3040, 3041, 5, 95, 0, 0, 3041, 3042, 7, 12, 0, 0, 3042, 3043, 7, 17, 0, 0, 3043, 3044, 7, 3, 0, 0, 3044, 3045, 7, 5, 0, 0, 3045, 3046, 7, 7, 0, 0, 3046, 3047, 7, 2, 0, 0, 3047, 3048, 7, 14, 0, 0, 3048, 3049, 7, 5, 0, 0, 3049, 552, 1, 0, 0, 0, 3050, 3051, 7, 2, 0, 0, 3051, 3052, 7, 15, 0, 0, 3052, 3053, 7, 11, 0, 0, 3053, 3054, 7, 9, 0, 0, 3054, 3055, 5, 95, 0, 0, 3055, 3056, 7, 20, 0, 0, 3056, 3057, 7, 10, 0, 0, 3057, 3058, 7, 4, 0, 0, 3058, 3059, 7, 10, 0, 0, 3059, 3060, 7, 14, 0, 0, 3060, 3061, 7, 2, 0, 0, 3061, 3062, 7, 11, 0, 0, 3062, 3063, 7, 10, 0, 0, 3063, 3064, 5, 95, 0, 0, 3064, 3065, 7, 6, 0, 0, 3065, 3066, 7, 13, 0, 0, 3066, 3067, 7, 4, 0, 0, 3067, 3068, 7, 9, 0, 0, 3068, 3069, 7, 4, 0, 0, 3069, 3070, 7, 13, 0, 0, 3070, 3071, 7, 16, 0, 0, 3071, 3072, 7, 6, 0, 0, 3072, 3073, 5, 95, 0, 0, 3073, 3074, 7, 21, 0, 0, 3074, 3075, 7, 22, 0, 0, 3075, 3076, 7, 14, 0, 0, 3076, 3077, 7, 2, 0, 0, 3077, 3078, 7, 6, 0, 0, 3078, 3079, 7, 10, 0, 0, 3079, 3080, 5, 95, 0, 0, 3080, 3081, 7, 26, 0, 0, 3081, 3082, 7, 15, 0, 0, 3082, 3083, 7, 10, 0, 0, 3083, 3084, 7, 14, 0, 0, 3084, 3085, 7, 13, 0, 0, 3085, 554, 1, 0, 0, 0, 3086, 3087, 7, 8, 0, 0, 3087, 3088, 7, 9, 0, 0, 3088, 3089, 7, 9, 0, 0, 3089, 3090, 7, 6, 0, 0, 3090, 3091, 7, 11, 0, 0, 3091, 556, 1, 0, 0, 0, 3092, 3093, 7, 7, 0, 0, 3093, 3094, 7, 2, 0, 0, 3094, 3095, 7, 6, 0, 0, 3095, 3096, 7, 10, 0, 0, 3096, 3097, 5, 95, 0, 0, 3097, 3098, 7, 17, 0, 0, 3098, 3099, 7, 4, 0, 0, 3099, 3100, 7, 6, 0, 0, 3100, 3101, 7, 10, 0, 0, 3101, 3102, 7, 4, 0, 0, 3102, 3103, 7, 6, 0, 0, 3103, 3104, 7, 17, 0, 0, 3104, 3105, 7, 11, 0, 0, 3105, 3106, 7, 17, 0, 0, 3106, 3107, 7, 23, 0, 0, 3107, 3108, 7, 10, 0, 0, 3108, 558, 1, 0, 0, 0, 3109, 3110, 7, 7, 0, 0, 3110, 3111, 7, 15, 0, 0, 3111, 3112, 7, 11, 0, 0, 3112, 3113, 7, 9, 0, 0, 3113, 3114, 7, 19, 0, 0, 3114, 3115, 7, 19, 0, 0, 3115, 3116, 5, 95, 0, 0, 3116, 3117, 7, 19, 0, 0, 3117, 3118, 7, 14, 0, 0, 3118, 3119, 7, 10, 0, 0, 3119, 3120, 7, 26, 0, 0, 3120, 3121, 7, 15, 0, 0, 3121, 3122, 7, 10, 0, 0, 3122, 3123, 7, 4, 0, 0, 3123, 3124, 7, 7, 0, 0, 3124, 3125, 7, 13, 0, 0, 3125, 560, 1, 0, 0, 0, 3126, 3127, 7, 5, 0, 0, 3127, 3128, 7, 10, 0, 0, 3128, 3129, 7, 19, 0, 0, 3129, 3130, 7, 2, 0, 0, 3130, 3131, 7, 15, 0, 0, 3131, 3132, 7, 3, 0, 0, 3132, 3133, 7, 11, 0, 0, 3133, 3134, 5, 95, 0, 0, 3134, 3135, 7, 19, 0, 0, 3135, 3136, 7, 17, 0, 0, 3136, 3137, 7, 10, 0, 0, 3137, 3138, 7, 3, 0, 0, 3138, 3139, 7, 5, 0, 0, 3139, 562, 1, 0, 0, 0, 3140, 3141, 7, 5, 0, 0, 3141, 3142, 7, 10, 0, 0, 3142, 3143, 7, 19, 0, 0, 3143, 3144, 7, 2, 0, 0, 3144, 3145, 7, 15, 0, 0, 3145, 3146, 7, 3, 0, 0, 3146, 3147, 7, 11, 0, 0, 3147, 3148, 5, 95, 0, 0, 3148, 3149, 7, 9, 0, 0, 3149, 3150, 7, 21, 0, 0, 3150, 3151, 7, 10, 0, 0, 3151, 3152, 7, 14, 0, 0, 3152, 3153, 7, 2, 0, 0, 3153, 3154, 7, 11, 0, 0, 3154, 3155, 7, 9, 0, 0, 3155, 3156, 7, 14, 0, 0, 3156, 564, 1, 0, 0, 0, 3157, 3158, 7, 10, 0, 0, 3158, 3159, 7, 6, 0, 0, 3159, 3160, 7, 7, 0, 0, 3160, 3161, 7, 2, 0, 0, 3161, 3162, 7, 21, 0, 0, 3162, 3163, 7, 10, 0, 0, 3163, 566, 1, 0, 0, 0, 3164, 3165, 7, 10, 0, 0, 3165, 3166, 7, 4, 0, 0, 3166, 3167, 7, 2, 0, 0, 3167, 3168, 7, 8, 0, 0, 3168, 3169, 7, 3, 0, 0, 3169, 3170, 7, 10, 0, 0, 3170, 3171, 5, 95, 0, 0, 3171, 3172, 7, 21, 0, 0, 3172, 3173, 7, 9, 0, 0, 3173, 3174, 7, 6, 0, 0, 3174, 3175, 7, 17, 0, 0, 3175, 3176, 7, 11, 0, 0, 3176, 3177, 7, 17, 0, 0, 3177, 3178, 7, 9, 0, 0, 3178, 3179, 7, 4, 0, 0, 3179, 3180, 5, 95, 0, 0, 3180, 3181, 7, 17, 0, 0, 3181, 3182, 7, 4, 0, 0, 3182, 3183, 7, 7, 0, 0, 3183, 3184, 7, 14, 0, 0, 3184, 3185, 7, 10, 0, 0, 3185, 3186, 7, 16, 0, 0, 3186, 3187, 7, 10, 0, 0, 3187, 3188, 7, 4, 0, 0, 3188, 3189, 7, 11, 0, 0, 3189, 3190, 7, 6, 0, 0, 3190, 568, 1, 0, 0, 0, 3191, 3192, 7, 19, 0, 0, 3192, 3193, 7, 17, 0, 0, 3193, 3194, 7, 10, 0, 0, 3194, 3195, 7, 3, 0, 0, 3195, 3196, 7, 5, 0, 0, 3196, 3197, 7, 6, 0, 0, 3197, 570, 1, 0, 0, 0, 3198, 3199, 7, 19, 0, 0, 3199, 3200, 7, 3, 0, 0, 3200, 3201, 7, 2, 0, 0, 3201, 3202, 7, 20, 0, 0, 3202, 3203, 7, 6, 0, 0, 3203, 572, 1, 0, 0, 0, 3204, 3205, 7, 19, 0, 0, 3205, 3206, 7, 15, 0, 0, 3206, 3207, 7, 27, 0, 0, 3207, 3208, 7, 27, 0, 0, 3208, 3209, 7, 17, 0, 0, 3209, 3210, 7, 4, 0, 0, 3210, 3211, 7, 10, 0, 0, 3211, 3212, 7, 6, 0, 0, 3212, 3213, 7, 6, 0, 0, 3213, 574, 1, 0, 0, 0, 3214, 3215, 7, 19, 0, 0, 3215, 3216, 7, 15, 0, 0, 3216, 3217, 7, 27, 0, 0, 3217, 3218, 7, 27, 0, 0, 3218, 3219, 7, 13, 0, 0, 3219, 3220, 5, 95, 0, 0, 3220, 3221, 7, 16, 0, 0, 3221, 3222, 7, 2, 0, 0, 3222, 3223, 7, 18, 0, 0, 3223, 3224, 5, 95, 0, 0, 3224, 3225, 7, 10, 0, 0, 3225, 3226, 7, 18, 0, 0, 3226, 3227, 7, 21, 0, 0, 3227, 3228, 7, 2, 0, 0, 3228, 3229, 7, 4, 0, 0, 3229, 3230, 7, 6, 0, 0, 3230, 3231, 7, 17, 0, 0, 3231, 3232, 7, 9, 0, 0, 3232, 3233, 7, 4, 0, 0, 3233, 3234, 7, 6, 0, 0, 3234, 576, 1, 0, 0, 0, 3235, 3236, 7, 19, 0, 0, 3236, 3237, 7, 15, 0, 0, 3237, 3238, 7, 27, 0, 0, 3238, 3239, 7, 27, 0, 0, 3239, 3240, 7, 13, 0, 0, 3240, 3241, 5, 95, 0, 0, 3241, 3242, 7, 21, 0, 0, 3242, 3243, 7, 14, 0, 0, 3243, 3244, 7, 10, 0, 0, 3244, 3245, 7, 19, 0, 0, 3245, 3246, 7, 17, 0, 0, 3246, 3247, 7, 18, 0, 0, 3247, 3248, 5, 95, 0, 0, 3248, 3249, 7, 3, 0, 0, 3249, 3250, 7, 10, 0, 0, 3250, 3251, 7, 4, 0, 0, 3251, 3252, 7, 20, 0, 0, 3252, 3253, 7, 11, 0, 0, 3253, 3254, 7, 22, 0, 0, 3254, 578, 1, 0, 0, 0, 3255, 3256, 7, 19, 0, 0, 3256, 3257, 7, 15, 0, 0, 3257, 3258, 7, 27, 0, 0, 3258, 3259, 7, 27, 0, 0, 3259, 3260, 7, 13, 0, 0, 3260, 3261, 5, 95, 0, 0, 3261, 3262, 7, 14, 0, 0, 3262, 3263, 7, 10, 0, 0, 3263, 3264, 7, 12, 0, 0, 3264, 3265, 7, 14, 0, 0, 3265, 3266, 7, 17, 0, 0, 3266, 3267, 7, 11, 0, 0, 3267, 3268, 7, 10, 0, 0, 3268, 580, 1, 0, 0, 0, 3269, 3270, 7, 19, 0, 0, 3270, 3271, 7, 15, 0, 0, 3271, 3272, 7, 27, 0, 0, 3272, 3273, 7, 27, 0, 0, 3273, 3274, 7, 13, 0, 0, 3274, 3275, 5, 95, 0, 0, 3275, 3276, 7, 11, 0, 0, 3276, 3277, 7, 14, 0, 0, 3277, 3278, 7, 2, 0, 0, 3278, 3279, 7, 4, 0, 0, 3279, 3280, 7, 6, 0, 0, 3280, 3281, 7, 21, 0, 0, 3281, 3282, 7, 9, 0, 0, 3282, 3283, 7, 6, 0, 0, 3283, 3284, 7, 17, 0, 0, 3284, 3285, 7, 11, 0, 0, 3285, 3286, 7, 17, 0, 0, 3286, 3287, 7, 9, 0, 0, 3287, 3288, 7, 4, 0, 0, 3288, 3289, 7, 6, 0, 0, 3289, 582, 1, 0, 0, 0, 3290, 3291, 7, 3, 0, 0, 3291, 3292, 7, 10, 0, 0, 3292, 3293, 7, 4, 0, 0, 3293, 3294, 7, 17, 0, 0, 3294, 3295, 7, 10, 0, 0, 3295, 3296, 7, 4, 0, 0, 3296, 3297, 7, 11, 0, 0, 3297, 584, 1, 0, 0, 0, 3298, 3299, 7, 3, 0, 0, 3299, 3300, 7, 9, 0, 0, 3300, 3301, 7, 12, 0, 0, 3301, 3302, 5, 95, 0, 0, 3302, 3303, 7, 19, 0, 0, 3303, 3304, 7, 14, 0, 0, 3304, 3305, 7, 10, 0, 0, 3305, 3306, 7, 26, 0, 0, 3306, 3307, 5, 95, 0, 0, 3307, 3308, 7, 9, 0, 0, 3308, 3309, 7, 21, 0, 0, 3309, 3310, 7, 10, 0, 0, 3310, 3311, 7, 14, 0, 0, 3311, 3312, 7, 2, 0, 0, 3312, 3313, 7, 11, 0, 0, 3313, 3314, 7, 9, 0, 0, 3314, 3315, 7, 14, 0, 0, 3315, 586, 1, 0, 0, 0, 3316, 3317, 7, 16, 0, 0, 3317, 3318, 7, 2, 0, 0, 3318, 3319, 7, 18, 0, 0, 3319, 3320, 5, 95, 0, 0, 3320, 3321, 7, 5, 0, 0, 3321, 3322, 7, 10, 0, 0, 3322, 3323, 7, 11, 0, 0, 3323, 3324, 7, 10, 0, 0, 3324, 3325, 7, 14, 0, 0, 3325, 3326, 7, 16, 0, 0, 3326, 3327, 7, 17, 0, 0, 3327, 3328, 7, 4, 0, 0, 3328, 3329, 7, 17, 0, 0, 3329, 3330, 7, 27, 0, 0, 3330, 3331, 7, 10, 0, 0, 3331, 3332, 7, 5, 0, 0, 3332, 3333, 5, 95, 0, 0, 3333, 3334, 7, 6, 0, 0, 3334, 3335, 7, 11, 0, 0, 3335, 3336, 7, 2, 0, 0, 3336, 3337, 7, 11, 0, 0, 3337, 3338, 7, 10, 0, 0, 3338, 3339, 7, 6, 0, 0, 3339, 588, 1, 0, 0, 0, 3340, 3341, 7, 16, 0, 0, 3341, 3342, 7, 2, 0, 0, 3342, 3343, 7, 18, 0, 0, 3343, 3344, 5, 95, 0, 0, 3344, 3345, 7, 10, 0, 0, 3345, 3346, 7, 18, 0, 0, 3346, 3347, 7, 21, 0, 0, 3347, 3348, 7, 2, 0, 0, 3348, 3349, 7, 4, 0, 0, 3349, 3350, 7, 6, 0, 0, 3350, 3351, 7, 17, 0, 0, 3351, 3352, 7, 9, 0, 0, 3352, 3353, 7, 4, 0, 0, 3353, 3354, 7, 6, 0, 0, 3354, 590, 1, 0, 0, 0, 3355, 3356, 7, 16, 0, 0, 3356, 3357, 7, 17, 0, 0, 3357, 3358, 7, 4, 0, 0, 3358, 3359, 7, 17, 0, 0, 3359, 3360, 7, 16, 0, 0, 3360, 3361, 7, 15, 0, 0, 3361, 3362, 7, 16, 0, 0, 3362, 3363, 5, 95, 0, 0, 3363, 3364, 7, 6, 0, 0, 3364, 3365, 7, 22, 0, 0, 3365, 3366, 7, 9, 0, 0, 3366, 3367, 7, 15, 0, 0, 3367, 3368, 7, 3, 0, 0, 3368, 3369, 7, 5, 0, 0, 3369, 3370, 5, 95, 0, 0, 3370, 3371, 7, 16, 0, 0, 3371, 3372, 7, 2, 0, 0, 3372, 3373, 7, 11, 0, 0, 3373, 3374, 7, 7, 0, 0, 3374, 3375, 7, 22, 0, 0, 3375, 592, 1, 0, 0, 0, 3376, 3377, 7, 9, 0, 0, 3377, 3378, 7, 21, 0, 0, 3378, 3379, 7, 10, 0, 0, 3379, 3380, 7, 14, 0, 0, 3380, 3381, 7, 2, 0, 0, 3381, 3382, 7, 11, 0, 0, 3382, 3383, 7, 9, 0, 0, 3383, 3384, 7, 14, 0, 0, 3384, 594, 1, 0, 0, 0, 3385, 3386, 7, 21, 0, 0, 3386, 3387, 7, 22, 0, 0, 3387, 3388, 7, 14, 0, 0, 3388, 3389, 7, 2, 0, 0, 3389, 3390, 7, 6, 0, 0, 3390, 3391, 7, 10, 0, 0, 3391, 3392, 5, 95, 0, 0, 3392, 3393, 7, 6, 0, 0, 3393, 3394, 7, 3, 0, 0, 3394, 3395, 7, 9, 0, 0, 3395, 3396, 7, 21, 0, 0, 3396, 596, 1, 0, 0, 0, 3397, 3398, 7, 21, 0, 0, 3398, 3399, 7, 14, 0, 0, 3399, 3400, 7, 10, 0, 0, 3400, 3401, 7, 19, 0, 0, 3401, 3402, 7, 17, 0, 0, 3402, 3403, 7, 18, 0, 0, 3403, 3404, 5, 95, 0, 0, 3404, 3405, 7, 3, 0, 0, 3405, 3406, 7, 10, 0, 0, 3406, 3407, 7, 4, 0, 0, 3407, 3408, 7, 20, 0, 0, 3408, 3409, 7, 11, 0, 0, 3409, 3410, 7, 22, 0, 0, 3410, 598, 1, 0, 0, 0, 3411, 3412, 7, 26, 0, 0, 3412, 3413, 7, 15, 0, 0, 3413, 3414, 7, 9, 0, 0, 3414, 3415, 7, 11, 0, 0, 3415, 3416, 7, 10, 0, 0, 3416, 3417, 5, 95, 0, 0, 3417, 3418, 7, 2, 0, 0, 3418, 3419, 7, 4, 0, 0, 3419, 3420, 7, 2, 0, 0, 3420, 3421, 7, 3, 0, 0, 3421, 3422, 7, 13, 0, 0, 3422, 3423, 7, 27, 0, 0, 3423, 3424, 7, 10, 0, 0, 3424, 3425, 7, 14, 0, 0, 3425, 600, 1, 0, 0, 0, 3426, 3427, 7, 26, 0, 0, 3427, 3428, 7, 15, 0, 0, 3428, 3429, 7, 9, 0, 0, 3429, 3430, 7, 11, 0, 0, 3430, 3431, 7, 10, 0, 0, 3431, 3432, 5, 95, 0, 0, 3432, 3433, 7, 19, 0, 0, 3433, 3434, 7, 17, 0, 0, 3434, 3435, 7, 10, 0, 0, 3435, 3436, 7, 3, 0, 0, 3436, 3437, 7, 5, 0, 0, 3437, 3438, 5, 95, 0, 0, 3438, 3439, 7, 6, 0, 0, 3439, 3440, 7, 15, 0, 0, 3440, 3441, 7, 19, 0, 0, 3441, 3442, 7, 19, 0, 0, 3442, 3443, 7, 17, 0, 0, 3443, 3444, 7, 18, 0, 0, 3444, 602, 1, 0, 0, 0, 3445, 3446, 7, 14, 0, 0, 3446, 3447, 7, 10, 0, 0, 3447, 3448, 7, 12, 0, 0, 3448, 3449, 7, 14, 0, 0, 3449, 3450, 7, 17, 0, 0, 3450, 3451, 7, 11, 0, 0, 3451, 3452, 7, 10, 0, 0, 3452, 604, 1, 0, 0, 0, 3453, 3454, 7, 6, 0, 0, 3454, 3455, 7, 3, 0, 0, 3455, 3456, 7, 9, 0, 0, 3456, 3457, 7, 21, 0, 0, 3457, 606, 1, 0, 0, 0, 3458, 3459, 7, 11, 0, 0, 3459, 3460, 7, 17, 0, 0, 3460, 3461, 7, 10, 0, 0, 3461, 3462, 5, 95, 0, 0, 3462, 3463, 7, 8, 0, 0, 3463, 3464, 7, 14, 0, 0, 3464, 3465, 7, 10, 0, 0, 3465, 3466, 7, 2, 0, 0, 3466, 3467, 7, 25, 0, 0, 3467, 3468, 7, 10, 0, 0, 3468, 3469, 7, 14, 0, 0, 3469, 608, 1, 0, 0, 0, 3470, 3471, 7, 11, 0, 0, 3471, 3472, 7, 17, 0, 0, 3472, 3473, 7, 16, 0, 0, 3473, 3474, 7, 10, 0, 0, 3474, 3475, 5, 95, 0, 0, 3475, 3476, 7, 27, 0, 0, 3476, 3477, 7, 9, 0, 0, 3477, 3478, 7, 4, 0, 0, 3478, 3479, 7, 10, 0, 0, 3479, 610, 1, 0, 0, 0, 3480, 3481, 7, 11, 0, 0, 3481, 3482, 7, 13, 0, 0, 3482, 3483, 7, 21, 0, 0, 3483, 3484, 7, 10, 0, 0, 3484, 612, 1, 0, 0, 0, 3485, 3486, 7, 27, 0, 0, 3486, 3487, 7, 10, 0, 0, 3487, 3488, 7, 14, 0, 0, 3488, 3489, 7, 9, 0, 0, 3489, 3490, 5, 95, 0, 0, 3490, 3491, 7, 11, 0, 0, 3491, 3492, 7, 10, 0, 0, 3492, 3493, 7, 14, 0, 0, 3493, 3494, 7, 16, 0, 0, 3494, 3495, 7, 6, 0, 0, 3495, 3496, 5, 95, 0, 0, 3496, 3497, 7, 26, 0, 0, 3497, 3498, 7, 15, 0, 0, 3498, 3499, 7, 10, 0, 0, 3499, 3500, 7, 14, 0, 0, 3500, 3501, 7, 13, 0, 0, 3501, 614, 1, 0, 0, 0, 3502, 3503, 7, 22, 0, 0, 3503, 3504, 7, 17, 0, 0, 3504, 3505, 7, 20, 0, 0, 3505, 3506, 7, 22, 0, 0, 3506, 3507, 7, 3, 0, 0, 3507, 3508, 7, 17, 0, 0, 3508, 3509, 7, 20, 0, 0, 3509, 3510, 7, 22, 0, 0, 3510, 3511, 7, 11, 0, 0, 3511, 616, 1, 0, 0, 0, 3512, 3513, 7, 21, 0, 0, 3513, 3514, 7, 14, 0, 0, 3514, 3515, 7, 10, 0, 0, 3515, 3516, 5, 95, 0, 0, 3516, 3517, 7, 11, 0, 0, 3517, 3518, 7, 2, 0, 0, 3518, 3519, 7, 20, 0, 0, 3519, 3520, 7, 6, 0, 0, 3520, 618, 1, 0, 0, 0, 3521, 3522, 7, 21, 0, 0, 3522, 3523, 7, 9, 0, 0, 3523, 3524, 7, 6, 0, 0, 3524, 3525, 7, 11, 0, 0, 3525, 3526, 5, 95, 0, 0, 3526, 3527, 7, 11, 0, 0, 3527, 3528, 7, 2, 0, 0, 3528, 3529, 7, 20, 0, 0, 3529, 3530, 7, 6, 0, 0, 3530, 620, 1, 0, 0, 0, 3531, 3532, 7, 16, 0, 0, 3532, 3533, 7, 2, 0, 0, 3533, 3534, 7, 11, 0, 0, 3534, 3535, 7, 7, 0, 0, 3535, 3536, 7, 22, 0, 0, 3536, 3537, 5, 95, 0, 0, 3537, 3538, 7, 8, 0, 0, 3538, 3539, 7, 9, 0, 0, 3539, 3540, 7, 9, 0, 0, 3540, 3541, 7, 3, 0, 0, 3541, 3542, 5, 95, 0, 0, 3542, 3543, 7, 21, 0, 0, 3543, 3544, 7, 14, 0, 0, 3544, 3545, 7, 10, 0, 0, 3545, 3546, 7, 19, 0, 0, 3546, 3547, 7, 17, 0, 0, 3547, 3548, 7, 18, 0, 0, 3548, 622, 1, 0, 0, 0, 3549, 3550, 5, 42, 0, 0, 3550, 624, 1, 0, 0, 0, 3551, 3552, 5, 47, 0, 0, 3552, 626, 1, 0, 0, 0, 3553, 3554, 5, 37, 0, 0, 3554, 628, 1, 0, 0, 0, 3555, 3556, 5, 43, 0, 0, 3556, 630, 1, 0, 0, 0, 3557, 3558, 5, 45, 0, 0, 3558, 632, 1, 0, 0, 0, 3559, 3560, 7, 5, 0, 0, 3560, 3561, 7, 17, 0, 0, 3561, 3562, 7, 23, 0, 0, 3562, 634, 1, 0, 0, 0, 3563, 3564, 7, 16, 0, 0, 3564, 3565, 7, 9, 0, 0, 3565, 3566, 7, 5, 0, 0, 3566, 636, 1, 0, 0, 0, 3567, 3568, 5, 61, 0, 0, 3568, 638, 1, 0, 0, 0, 3569, 3570, 5, 62, 0, 0, 3570, 640, 1, 0, 0, 0, 3571, 3572, 5, 60, 0, 0, 3572, 642, 1, 0, 0, 0, 3573, 3574, 5, 33, 0, 0, 3574, 644, 1, 0, 0, 0, 3575, 3576, 5, 126, 0, 0, 3576, 646, 1, 0, 0, 0, 3577, 3578, 5, 124, 0, 0, 3578, 648, 1, 0, 0, 0, 3579, 3580, 5, 38, 0, 0, 3580, 650, 1, 0, 0, 0, 3581, 3582, 5, 94, 0, 0, 3582, 652, 1, 0, 0, 0, 3583, 3584, 5, 46, 0, 0, 3584, 654, 1, 0, 0, 0, 3585, 3586, 5, 40, 0, 0, 3586, 656, 1, 0, 0, 0, 3587, 3588, 5, 41, 0, 0, 3588, 658, 1, 0, 0, 0, 3589, 3590, 5, 91, 0, 0, 3590, 660, 1, 0, 0, 0, 3591, 3592, 5, 93, 0, 0, 3592, 662, 1, 0, 0, 0, 3593, 3594, 5, 44, 0, 0, 3594, 664, 1, 0, 0, 0, 3595, 3596, 5, 59, 0, 0, 3596, 666, 1, 0, 0, 0, 3597, 3598, 5, 64, 0, 0, 3598, 668, 1, 0, 0, 0, 3599, 3600, 5, 48, 0, 0, 3600, 670, 1, 0, 0, 0, 3601, 3602, 5, 49, 0, 0, 3602, 672, 1, 0, 0, 0, 3603, 3604, 5, 50, 0, 0, 3604, 674, 1, 0, 0, 0, 3605, 3606, 5, 39, 0, 0, 3606, 676, 1, 0, 0, 0, 3607, 3608, 5, 34, 0, 0, 3608, 678, 1, 0, 0, 0, 3609, 3610, 5, 96, 0, 0, 3610, 680, 1, 0, 0, 0, 3611, 3612, 5, 58, 0, 0, 3612, 682, 1, 0, 0, 0, 3613, 3614, 7, 4, 0, 0, 3614, 3615, 3, 709, 354, 0, 3615, 684, 1, 0, 0, 0, 3616, 3617, 3, 709, 354, 0, 3617, 686, 1, 0, 0, 0, 3618, 3620, 3, 715, 357, 0, 3619, 3618, 1, 0, 0, 0, 3620, 3621, 1, 0, 0, 0, 3621, 3619, 1, 0, 0, 0, 3621, 3622, 1, 0, 0, 0, 3622, 688, 1, 0, 0, 0, 3623, 3624, 7, 18, 0, 0, 3624, 3628, 5, 39, 0, 0, 3625, 3626, 3, 713, 356, 0, 3626, 3627, 3, 713, 356, 0, 3627, 3629, 1, 0, 0, 0, 3628, 3625, 1, 0, 0, 0, 3629, 3630, 1, 0, 0, 0, 3630, 3628, 1, 0, 0, 0, 3630, 3631, 1, 0, 0, 0, 3631, 3632, 1, 0, 0, 0, 3632, 3633, 5, 39, 0, 0, 3633, 3643, 1, 0, 0, 0, 3634, 3635, 5, 48, 0, 0, 3635, 3636, 7, 18, 0, 0, 3636, 3638, 1, 0, 0, 0, 3637, 3639, 3, 713, 356, 0, 3638, 3637, 1, 0, 0, 0, 3639, 3640, 1, 0, 0, 0, 3640, 3638, 1, 0, 0, 0, 3640, 3641, 1, 0, 0, 0, 3641, 3643, 1, 0, 0, 0, 3642, 3623, 1, 0, 0, 0, 3642, 3634, 1, 0, 0, 0, 3643, 690, 1, 0, 0, 0, 3644, 3646, 3, 715, 357, 0, 3645, 3644, 1, 0, 0, 0, 3646, 3647, 1, 0, 0, 0, 3647, 3645, 1, 0, 0, 0, 3647, 3648, 1, 0, 0, 0, 3648, 3650, 1, 0, 0, 0, 3649, 3645, 1, 0, 0, 0, 3649, 3650, 1, 0, 0, 0, 3650, 3651, 1, 0, 0, 0, 3651, 3653, 5, 46, 0, 0, 3652, 3654, 3, 715, 357, 0, 3653, 3652, 1, 0, 0, 0, 3654, 3655, 1, 0, 0, 0, 3655, 3653, 1, 0, 0, 0, 3655, 3656, 1, 0, 0, 0, 3656, 3688, 1, 0, 0, 0, 3657, 3659, 3, 715, 357, 0, 3658, 3657, 1, 0, 0, 0, 3659, 3660, 1, 0, 0, 0, 3660, 3658, 1, 0, 0, 0, 3660, 3661, 1, 0, 0, 0, 3661, 3662, 1, 0, 0, 0, 3662, 3663, 5, 46, 0, 0, 3663, 3664, 3, 703, 351, 0, 3664, 3688, 1, 0, 0, 0, 3665, 3667, 3, 715, 357, 0, 3666, 3665, 1, 0, 0, 0, 3667, 3668, 1, 0, 0, 0, 3668, 3666, 1, 0, 0, 0, 3668, 3669, 1, 0, 0, 0, 3669, 3671, 1, 0, 0, 0, 3670, 3666, 1, 0, 0, 0, 3670, 3671, 1, 0, 0, 0, 3671, 3672, 1, 0, 0, 0, 3672, 3674, 5, 46, 0, 0, 3673, 3675, 3, 715, 357, 0, 3674, 3673, 1, 0, 0, 0, 3675, 3676, 1, 0, 0, 0, 3676, 3674, 1, 0, 0, 0, 3676, 3677, 1, 0, 0, 0, 3677, 3678, 1, 0, 0, 0, 3678, 3679, 3, 703, 351, 0, 3679, 3688, 1, 0, 0, 0, 3680, 3682, 3, 715, 357, 0, 3681, 3680, 1, 0, 0, 0, 3682, 3683, 1, 0, 0, 0, 3683, 3681, 1, 0, 0, 0, 3683, 3684, 1, 0, 0, 0, 3684, 3685, 1, 0, 0, 0, 3685, 3686, 3, 703, 351, 0, 3686, 3688, 1, 0, 0, 0, 3687, 3649, 1, 0, 0, 0, 3687, 3658, 1, 0, 0, 0, 3687, 3670, 1, 0, 0, 0, 3687, 3681, 1, 0, 0, 0, 3688, 692, 1, 0, 0, 0, 3689, 3690, 5, 92, 0, 0, 3690, 3691, 7, 4, 0, 0, 3691, 694, 1, 0, 0, 0, 3692, 3693, 3, 717, 358, 0, 3693, 696, 1, 0, 0, 0, 3694, 3695, 3, 705, 352, 0, 3695, 698, 1, 0, 0, 0, 3696, 3697, 3, 707, 353, 0, 3697, 700, 1, 0, 0, 0, 3698, 3699, 3, 711, 355, 0, 3699, 702, 1, 0, 0, 0, 3700, 3702, 7, 10, 0, 0, 3701, 3703, 7, 28, 0, 0, 3702, 3701, 1, 0, 0, 0, 3702, 3703, 1, 0, 0, 0, 3703, 3705, 1, 0, 0, 0, 3704, 3706, 3, 715, 357, 0, 3705, 3704, 1, 0, 0, 0, 3706, 3707, 1, 0, 0, 0, 3707, 3705, 1, 0, 0, 0, 3707, 3708, 1, 0, 0, 0, 3708, 704, 1, 0, 0, 0, 3709, 3711, 7, 29, 0, 0, 3710, 3709, 1, 0, 0, 0, 3711, 3712, 1, 0, 0, 0, 3712, 3710, 1, 0, 0, 0, 3712, 3713, 1, 0, 0, 0, 3713, 3717, 1, 0, 0, 0, 3714, 3716, 7, 30, 0, 0, 3715, 3714, 1, 0, 0, 0, 3716, 3719, 1, 0, 0, 0, 3717, 3715, 1, 0, 0, 0, 3717, 3718, 1, 0, 0, 0, 3718, 706, 1, 0, 0, 0, 3719, 3717, 1, 0, 0, 0, 3720, 3728, 5, 34, 0, 0, 3721, 3722, 5, 92, 0, 0, 3722, 3727, 9, 0, 0, 0, 3723, 3724, 5, 34, 0, 0, 3724, 3727, 5, 34, 0, 0, 3725, 3727, 8, 31, 0, 0, 3726, 3721, 1, 0, 0, 0, 3726, 3723, 1, 0, 0, 0, 3726, 3725, 1, 0, 0, 0, 3727, 3730, 1, 0, 0, 0, 3728, 3726, 1, 0, 0, 0, 3728, 3729, 1, 0, 0, 0, 3729, 3731, 1, 0, 0, 0, 3730, 3728, 1, 0, 0, 0, 3731, 3732, 5, 34, 0, 0, 3732, 708, 1, 0, 0, 0, 3733, 3741, 5, 39, 0, 0, 3734, 3735, 5, 92, 0, 0, 3735, 3740, 9, 0, 0, 0, 3736, 3737, 5, 39, 0, 0, 3737, 3740, 5, 39, 0, 0, 3738, 3740, 8, 32, 0, 0, 3739, 3734, 1, 0, 0, 0, 3739, 3736, 1, 0, 0, 0, 3739, 3738, 1, 0, 0, 0, 3740, 3743, 1, 0, 0, 0, 3741, 3739, 1, 0, 0, 0, 3741, 3742, 1, 0, 0, 0, 3742, 3744, 1, 0, 0, 0, 3743, 3741, 1, 0, 0, 0, 3744, 3745, 5, 39, 0, 0, 3745, 710, 1, 0, 0, 0, 3746, 3754, 5, 96, 0, 0, 3747, 3748, 5, 92, 0, 0, 3748, 3753, 9, 0, 0, 0, 3749, 3750, 5, 96, 0, 0, 3750, 3753, 5, 96, 0, 0, 3751, 3753, 8, 33, 0, 0, 3752, 3747, 1, 0, 0, 0, 3752, 3749, 1, 0, 0, 0, 3752, 3751, 1, 0, 0, 0, 3753, 3756, 1, 0, 0, 0, 3754, 3752, 1, 0, 0, 0, 3754, 3755, 1, 0, 0, 0, 3755, 3757, 1, 0, 0, 0, 3756, 3754, 1, 0, 0, 0, 3757, 3758, 5, 96, 0, 0, 3758, 712, 1, 0, 0, 0, 3759, 3760, 7, 34, 0, 0, 3760, 714, 1, 0, 0, 0, 3761, 3762, 7, 35, 0, 0, 3762, 716, 1, 0, 0, 0, 3763, 3764, 7, 8, 0, 0, 3764, 3766, 5, 39, 0, 0, 3765, 3767, 7, 36, 0, 0, 3766, 3765, 1, 0, 0, 0, 3767, 3768, 1, 0, 0, 0, 3768, 3766, 1, 0, 0, 0, 3768, 3769, 1, 0, 0, 0, 3769, 3770, 1, 0, 0, 0, 3770, 3771, 5, 39, 0, 0, 3771, 718, 1, 0, 0, 0, 3772, 3773, 9, 0, 0, 0, 3773, 3774, 1, 0, 0, 0, 3774, 3775, 6, 359, 2, 0, 3775, 720, 1, 0, 0, 0, 35, 0, 724, 735, 748, 760, 765, 769, 773, 779, 783, 785, 3621, 3630, 3640, 3642, 3647, 3649, 3655, 3660, 3668, 3670, 3676, 3683, 3687, 3702, 3707, 3712, 3717, 3726, 3728, 3739, 3741, 3752, 3754, 3768, 3, 0, 1, 0, 0, 2, 0, 0, 3, 0] \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.tokens b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.tokens new file mode 100644 index 00000000000..80703f8b9ac --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.tokens @@ -0,0 +1,689 @@ +SPACE=1 +SPEC_SQL_COMMENT=2 +COMMENT_INPUT=3 +LINE_COMMENT=4 +ALL=5 +AND=6 +AS=7 +ASC=8 +BOOLEAN=9 +BETWEEN=10 +BY=11 +CASE=12 +CAST=13 +CROSS=14 +COLUMNS=15 +DATETIME=16 +DELETE=17 +DESC=18 +DESCRIBE=19 +DISTINCT=20 +DOUBLE=21 +ELSE=22 +EXISTS=23 +FALSE=24 +FLOAT=25 +FIRST=26 +FROM=27 +GROUP=28 +HAVING=29 +IN=30 +INNER=31 +INT=32 +INTEGER=33 +IS=34 +JOIN=35 +LAST=36 +LEFT=37 +LIKE=38 +LIMIT=39 +LONG=40 +MATCH=41 +NATURAL=42 +MISSING_LITERAL=43 +NOT=44 +NULL_LITERAL=45 +NULLS=46 +ON=47 +OR=48 +ORDER=49 +OUTER=50 +OVER=51 +PARTITION=52 +REGEXP=53 +RIGHT=54 +SELECT=55 +SHOW=56 +STRING=57 +THEN=58 +TRUE=59 +UNION=60 +USING=61 +WHEN=62 +WHERE=63 +EXCEPT=64 +AVG=65 +COUNT=66 +MAX=67 +MIN=68 +SUM=69 +VAR_POP=70 +VAR_SAMP=71 +VARIANCE=72 +STD=73 +STDDEV=74 +STDDEV_POP=75 +STDDEV_SAMP=76 +SUBSTRING=77 +TRIM=78 +END=79 +FULL=80 +OFFSET=81 +INTERVAL=82 +MICROSECOND=83 +SECOND=84 +MINUTE=85 +HOUR=86 +DAY=87 +WEEK=88 +MONTH=89 +QUARTER=90 +YEAR=91 +SECOND_MICROSECOND=92 +MINUTE_MICROSECOND=93 +MINUTE_SECOND=94 +HOUR_MICROSECOND=95 +HOUR_SECOND=96 +HOUR_MINUTE=97 +DAY_MICROSECOND=98 +DAY_SECOND=99 +DAY_MINUTE=100 +DAY_HOUR=101 +YEAR_MONTH=102 +TABLES=103 +ABS=104 +ACOS=105 +ADD=106 +ADDTIME=107 +ASCII=108 +ASIN=109 +ATAN=110 +ATAN2=111 +CBRT=112 +CEIL=113 +CEILING=114 +CONCAT=115 +CONCAT_WS=116 +CONV=117 +CONVERT_TZ=118 +COS=119 +COSH=120 +COT=121 +CRC32=122 +CURDATE=123 +CURTIME=124 +CURRENT_DATE=125 +CURRENT_TIME=126 +CURRENT_TIMESTAMP=127 +DATE=128 +DATE_ADD=129 +DATE_FORMAT=130 +DATE_SUB=131 +DATEDIFF=132 +DAYNAME=133 +DAYOFMONTH=134 +DAYOFWEEK=135 +DAYOFYEAR=136 +DEGREES=137 +DIVIDE=138 +E=139 +EXP=140 +EXPM1=141 +EXTRACT=142 +FLOOR=143 +FROM_DAYS=144 +FROM_UNIXTIME=145 +GET_FORMAT=146 +IF=147 +IFNULL=148 +ISNULL=149 +LAST_DAY=150 +LENGTH=151 +LN=152 +LOCALTIME=153 +LOCALTIMESTAMP=154 +LOCATE=155 +LOG=156 +LOG10=157 +LOG2=158 +LOWER=159 +LTRIM=160 +MAKEDATE=161 +MAKETIME=162 +MODULUS=163 +MONTHNAME=164 +MULTIPLY=165 +NOW=166 +NULLIF=167 +PERIOD_ADD=168 +PERIOD_DIFF=169 +PI=170 +POSITION=171 +POW=172 +POWER=173 +RADIANS=174 +RAND=175 +REPLACE=176 +RINT=177 +ROUND=178 +RTRIM=179 +REVERSE=180 +SEC_TO_TIME=181 +SIGN=182 +SIGNUM=183 +SIN=184 +SINH=185 +SQRT=186 +STR_TO_DATE=187 +SUBDATE=188 +SUBTIME=189 +SUBTRACT=190 +SYSDATE=191 +TAN=192 +TIME=193 +TIMEDIFF=194 +TIME_FORMAT=195 +TIME_TO_SEC=196 +TIMESTAMP=197 +TRUNCATE=198 +TO_DAYS=199 +TO_SECONDS=200 +UNIX_TIMESTAMP=201 +UPPER=202 +UTC_DATE=203 +UTC_TIME=204 +UTC_TIMESTAMP=205 +D=206 +T=207 +TS=208 +LEFT_BRACE=209 +RIGHT_BRACE=210 +DENSE_RANK=211 +RANK=212 +ROW_NUMBER=213 +DATE_HISTOGRAM=214 +DAY_OF_MONTH=215 +DAY_OF_YEAR=216 +DAY_OF_WEEK=217 +EXCLUDE=218 +EXTENDED_STATS=219 +FIELD=220 +FILTER=221 +GEO_BOUNDING_BOX=222 +GEO_CELL=223 +GEO_DISTANCE=224 +GEO_DISTANCE_RANGE=225 +GEO_INTERSECTS=226 +GEO_POLYGON=227 +HISTOGRAM=228 +HOUR_OF_DAY=229 +INCLUDE=230 +IN_TERMS=231 +MATCHPHRASE=232 +MATCH_PHRASE=233 +MATCHPHRASEQUERY=234 +SIMPLE_QUERY_STRING=235 +QUERY_STRING=236 +MATCH_PHRASE_PREFIX=237 +MATCHQUERY=238 +MATCH_QUERY=239 +MINUTE_OF_DAY=240 +MINUTE_OF_HOUR=241 +MONTH_OF_YEAR=242 +MULTIMATCH=243 +MULTI_MATCH=244 +MULTIMATCHQUERY=245 +NESTED=246 +PERCENTILES=247 +PERCENTILE=248 +PERCENTILE_APPROX=249 +REGEXP_QUERY=250 +REVERSE_NESTED=251 +QUERY=252 +RANGE=253 +SCORE=254 +SCOREQUERY=255 +SCORE_QUERY=256 +SECOND_OF_MINUTE=257 +STATS=258 +TERM=259 +TERMS=260 +TIMESTAMPADD=261 +TIMESTAMPDIFF=262 +TOPHITS=263 +TYPEOF=264 +WEEK_OF_YEAR=265 +WEEKOFYEAR=266 +WEEKDAY=267 +WILDCARDQUERY=268 +WILDCARD_QUERY=269 +SUBSTR=270 +STRCMP=271 +ADDDATE=272 +YEARWEEK=273 +ALLOW_LEADING_WILDCARD=274 +ANALYZER=275 +ANALYZE_WILDCARD=276 +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY=277 +BOOST=278 +CASE_INSENSITIVE=279 +CUTOFF_FREQUENCY=280 +DEFAULT_FIELD=281 +DEFAULT_OPERATOR=282 +ESCAPE=283 +ENABLE_POSITION_INCREMENTS=284 +FIELDS=285 +FLAGS=286 +FUZZINESS=287 +FUZZY_MAX_EXPANSIONS=288 +FUZZY_PREFIX_LENGTH=289 +FUZZY_REWRITE=290 +FUZZY_TRANSPOSITIONS=291 +LENIENT=292 +LOW_FREQ_OPERATOR=293 +MAX_DETERMINIZED_STATES=294 +MAX_EXPANSIONS=295 +MINIMUM_SHOULD_MATCH=296 +OPERATOR=297 +PHRASE_SLOP=298 +PREFIX_LENGTH=299 +QUOTE_ANALYZER=300 +QUOTE_FIELD_SUFFIX=301 +REWRITE=302 +SLOP=303 +TIE_BREAKER=304 +TIME_ZONE=305 +TYPE=306 +ZERO_TERMS_QUERY=307 +HIGHLIGHT=308 +HIGHLIGHT_PRE_TAGS=309 +HIGHLIGHT_POST_TAGS=310 +MATCH_BOOL_PREFIX=311 +STAR=312 +SLASH=313 +MODULE=314 +PLUS=315 +MINUS=316 +DIV=317 +MOD=318 +EQUAL_SYMBOL=319 +GREATER_SYMBOL=320 +LESS_SYMBOL=321 +EXCLAMATION_SYMBOL=322 +BIT_NOT_OP=323 +BIT_OR_OP=324 +BIT_AND_OP=325 +BIT_XOR_OP=326 +DOT=327 +LR_BRACKET=328 +RR_BRACKET=329 +LT_SQR_PRTHS=330 +RT_SQR_PRTHS=331 +COMMA=332 +SEMI=333 +AT_SIGN=334 +ZERO_DECIMAL=335 +ONE_DECIMAL=336 +TWO_DECIMAL=337 +SINGLE_QUOTE_SYMB=338 +DOUBLE_QUOTE_SYMB=339 +REVERSE_QUOTE_SYMB=340 +COLON_SYMB=341 +START_NATIONAL_STRING_LITERAL=342 +STRING_LITERAL=343 +DECIMAL_LITERAL=344 +HEXADECIMAL_LITERAL=345 +REAL_LITERAL=346 +NULL_SPEC_LITERAL=347 +BIT_STRING=348 +ID=349 +DOUBLE_QUOTE_ID=350 +BACKTICK_QUOTE_ID=351 +ERROR_RECOGNITION=352 +'ALL'=5 +'AND'=6 +'AS'=7 +'ASC'=8 +'BOOLEAN'=9 +'BETWEEN'=10 +'BY'=11 +'CASE'=12 +'CAST'=13 +'CROSS'=14 +'COLUMNS'=15 +'DATETIME'=16 +'DELETE'=17 +'DESC'=18 +'DESCRIBE'=19 +'DISTINCT'=20 +'DOUBLE'=21 +'ELSE'=22 +'EXISTS'=23 +'FALSE'=24 +'FLOAT'=25 +'FIRST'=26 +'FROM'=27 +'GROUP'=28 +'HAVING'=29 +'IN'=30 +'INNER'=31 +'INT'=32 +'INTEGER'=33 +'IS'=34 +'JOIN'=35 +'LAST'=36 +'LEFT'=37 +'LIKE'=38 +'LIMIT'=39 +'LONG'=40 +'MATCH'=41 +'NATURAL'=42 +'MISSING'=43 +'NOT'=44 +'NULL'=45 +'NULLS'=46 +'ON'=47 +'OR'=48 +'ORDER'=49 +'OUTER'=50 +'OVER'=51 +'PARTITION'=52 +'REGEXP'=53 +'RIGHT'=54 +'SELECT'=55 +'SHOW'=56 +'STRING'=57 +'THEN'=58 +'TRUE'=59 +'UNION'=60 +'USING'=61 +'WHEN'=62 +'WHERE'=63 +'MINUS'=64 +'AVG'=65 +'COUNT'=66 +'MAX'=67 +'MIN'=68 +'SUM'=69 +'VAR_POP'=70 +'VAR_SAMP'=71 +'VARIANCE'=72 +'STD'=73 +'STDDEV'=74 +'STDDEV_POP'=75 +'STDDEV_SAMP'=76 +'SUBSTRING'=77 +'TRIM'=78 +'END'=79 +'FULL'=80 +'OFFSET'=81 +'INTERVAL'=82 +'MICROSECOND'=83 +'SECOND'=84 +'MINUTE'=85 +'HOUR'=86 +'DAY'=87 +'WEEK'=88 +'MONTH'=89 +'QUARTER'=90 +'YEAR'=91 +'SECOND_MICROSECOND'=92 +'MINUTE_MICROSECOND'=93 +'MINUTE_SECOND'=94 +'HOUR_MICROSECOND'=95 +'HOUR_SECOND'=96 +'HOUR_MINUTE'=97 +'DAY_MICROSECOND'=98 +'DAY_SECOND'=99 +'DAY_MINUTE'=100 +'DAY_HOUR'=101 +'YEAR_MONTH'=102 +'TABLES'=103 +'ABS'=104 +'ACOS'=105 +'ADD'=106 +'ADDTIME'=107 +'ASCII'=108 +'ASIN'=109 +'ATAN'=110 +'ATAN2'=111 +'CBRT'=112 +'CEIL'=113 +'CEILING'=114 +'CONCAT'=115 +'CONCAT_WS'=116 +'CONV'=117 +'CONVERT_TZ'=118 +'COS'=119 +'COSH'=120 +'COT'=121 +'CRC32'=122 +'CURDATE'=123 +'CURTIME'=124 +'CURRENT_DATE'=125 +'CURRENT_TIME'=126 +'CURRENT_TIMESTAMP'=127 +'DATE'=128 +'DATE_ADD'=129 +'DATE_FORMAT'=130 +'DATE_SUB'=131 +'DATEDIFF'=132 +'DAYNAME'=133 +'DAYOFMONTH'=134 +'DAYOFWEEK'=135 +'DAYOFYEAR'=136 +'DEGREES'=137 +'DIVIDE'=138 +'E'=139 +'EXP'=140 +'EXPM1'=141 +'EXTRACT'=142 +'FLOOR'=143 +'FROM_DAYS'=144 +'FROM_UNIXTIME'=145 +'GET_FORMAT'=146 +'IF'=147 +'IFNULL'=148 +'ISNULL'=149 +'LAST_DAY'=150 +'LENGTH'=151 +'LN'=152 +'LOCALTIME'=153 +'LOCALTIMESTAMP'=154 +'LOCATE'=155 +'LOG'=156 +'LOG10'=157 +'LOG2'=158 +'LOWER'=159 +'LTRIM'=160 +'MAKEDATE'=161 +'MAKETIME'=162 +'MODULUS'=163 +'MONTHNAME'=164 +'MULTIPLY'=165 +'NOW'=166 +'NULLIF'=167 +'PERIOD_ADD'=168 +'PERIOD_DIFF'=169 +'PI'=170 +'POSITION'=171 +'POW'=172 +'POWER'=173 +'RADIANS'=174 +'RAND'=175 +'REPLACE'=176 +'RINT'=177 +'ROUND'=178 +'RTRIM'=179 +'REVERSE'=180 +'SEC_TO_TIME'=181 +'SIGN'=182 +'SIGNUM'=183 +'SIN'=184 +'SINH'=185 +'SQRT'=186 +'STR_TO_DATE'=187 +'SUBDATE'=188 +'SUBTIME'=189 +'SUBTRACT'=190 +'SYSDATE'=191 +'TAN'=192 +'TIME'=193 +'TIMEDIFF'=194 +'TIME_FORMAT'=195 +'TIME_TO_SEC'=196 +'TIMESTAMP'=197 +'TRUNCATE'=198 +'TO_DAYS'=199 +'TO_SECONDS'=200 +'UNIX_TIMESTAMP'=201 +'UPPER'=202 +'UTC_DATE'=203 +'UTC_TIME'=204 +'UTC_TIMESTAMP'=205 +'D'=206 +'T'=207 +'TS'=208 +'{'=209 +'}'=210 +'DENSE_RANK'=211 +'RANK'=212 +'ROW_NUMBER'=213 +'DATE_HISTOGRAM'=214 +'DAY_OF_MONTH'=215 +'DAY_OF_YEAR'=216 +'DAY_OF_WEEK'=217 +'EXCLUDE'=218 +'EXTENDED_STATS'=219 +'FIELD'=220 +'FILTER'=221 +'GEO_BOUNDING_BOX'=222 +'GEO_CELL'=223 +'GEO_DISTANCE'=224 +'GEO_DISTANCE_RANGE'=225 +'GEO_INTERSECTS'=226 +'GEO_POLYGON'=227 +'HISTOGRAM'=228 +'HOUR_OF_DAY'=229 +'INCLUDE'=230 +'IN_TERMS'=231 +'MATCHPHRASE'=232 +'MATCH_PHRASE'=233 +'MATCHPHRASEQUERY'=234 +'SIMPLE_QUERY_STRING'=235 +'QUERY_STRING'=236 +'MATCH_PHRASE_PREFIX'=237 +'MATCHQUERY'=238 +'MATCH_QUERY'=239 +'MINUTE_OF_DAY'=240 +'MINUTE_OF_HOUR'=241 +'MONTH_OF_YEAR'=242 +'MULTIMATCH'=243 +'MULTI_MATCH'=244 +'MULTIMATCHQUERY'=245 +'NESTED'=246 +'PERCENTILES'=247 +'PERCENTILE'=248 +'PERCENTILE_APPROX'=249 +'REGEXP_QUERY'=250 +'REVERSE_NESTED'=251 +'QUERY'=252 +'RANGE'=253 +'SCORE'=254 +'SCOREQUERY'=255 +'SCORE_QUERY'=256 +'SECOND_OF_MINUTE'=257 +'STATS'=258 +'TERM'=259 +'TERMS'=260 +'TIMESTAMPADD'=261 +'TIMESTAMPDIFF'=262 +'TOPHITS'=263 +'TYPEOF'=264 +'WEEK_OF_YEAR'=265 +'WEEKOFYEAR'=266 +'WEEKDAY'=267 +'WILDCARDQUERY'=268 +'WILDCARD_QUERY'=269 +'SUBSTR'=270 +'STRCMP'=271 +'ADDDATE'=272 +'YEARWEEK'=273 +'ALLOW_LEADING_WILDCARD'=274 +'ANALYZER'=275 +'ANALYZE_WILDCARD'=276 +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'=277 +'BOOST'=278 +'CASE_INSENSITIVE'=279 +'CUTOFF_FREQUENCY'=280 +'DEFAULT_FIELD'=281 +'DEFAULT_OPERATOR'=282 +'ESCAPE'=283 +'ENABLE_POSITION_INCREMENTS'=284 +'FIELDS'=285 +'FLAGS'=286 +'FUZZINESS'=287 +'FUZZY_MAX_EXPANSIONS'=288 +'FUZZY_PREFIX_LENGTH'=289 +'FUZZY_REWRITE'=290 +'FUZZY_TRANSPOSITIONS'=291 +'LENIENT'=292 +'LOW_FREQ_OPERATOR'=293 +'MAX_DETERMINIZED_STATES'=294 +'MAX_EXPANSIONS'=295 +'MINIMUM_SHOULD_MATCH'=296 +'OPERATOR'=297 +'PHRASE_SLOP'=298 +'PREFIX_LENGTH'=299 +'QUOTE_ANALYZER'=300 +'QUOTE_FIELD_SUFFIX'=301 +'REWRITE'=302 +'SLOP'=303 +'TIE_BREAKER'=304 +'TIME_ZONE'=305 +'TYPE'=306 +'ZERO_TERMS_QUERY'=307 +'HIGHLIGHT'=308 +'PRE_TAGS'=309 +'POST_TAGS'=310 +'MATCH_BOOL_PREFIX'=311 +'*'=312 +'/'=313 +'%'=314 +'+'=315 +'-'=316 +'DIV'=317 +'MOD'=318 +'='=319 +'>'=320 +'<'=321 +'!'=322 +'~'=323 +'|'=324 +'&'=325 +'^'=326 +'.'=327 +'('=328 +')'=329 +'['=330 +']'=331 +','=332 +';'=333 +'@'=334 +'0'=335 +'1'=336 +'2'=337 +'\''=338 +'"'=339 +'`'=340 +':'=341 diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.ts b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.ts new file mode 100644 index 00000000000..04d34c00529 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLLexer.ts @@ -0,0 +1,2027 @@ +// Generated from ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 by ANTLR 4.13.1 + +import * as antlr from "antlr4ng"; +import { Token } from "antlr4ng"; + + +export class OpenSearchSQLLexer extends antlr.Lexer { + public static readonly SPACE = 1; + public static readonly SPEC_SQL_COMMENT = 2; + public static readonly COMMENT_INPUT = 3; + public static readonly LINE_COMMENT = 4; + public static readonly ALL = 5; + public static readonly AND = 6; + public static readonly AS = 7; + public static readonly ASC = 8; + public static readonly BOOLEAN = 9; + public static readonly BETWEEN = 10; + public static readonly BY = 11; + public static readonly CASE = 12; + public static readonly CAST = 13; + public static readonly CROSS = 14; + public static readonly COLUMNS = 15; + public static readonly DATETIME = 16; + public static readonly DELETE = 17; + public static readonly DESC = 18; + public static readonly DESCRIBE = 19; + public static readonly DISTINCT = 20; + public static readonly DOUBLE = 21; + public static readonly ELSE = 22; + public static readonly EXISTS = 23; + public static readonly FALSE = 24; + public static readonly FLOAT = 25; + public static readonly FIRST = 26; + public static readonly FROM = 27; + public static readonly GROUP = 28; + public static readonly HAVING = 29; + public static readonly IN = 30; + public static readonly INNER = 31; + public static readonly INT = 32; + public static readonly INTEGER = 33; + public static readonly IS = 34; + public static readonly JOIN = 35; + public static readonly LAST = 36; + public static readonly LEFT = 37; + public static readonly LIKE = 38; + public static readonly LIMIT = 39; + public static readonly LONG = 40; + public static readonly MATCH = 41; + public static readonly NATURAL = 42; + public static readonly MISSING_LITERAL = 43; + public static readonly NOT = 44; + public static readonly NULL_LITERAL = 45; + public static readonly NULLS = 46; + public static readonly ON = 47; + public static readonly OR = 48; + public static readonly ORDER = 49; + public static readonly OUTER = 50; + public static readonly OVER = 51; + public static readonly PARTITION = 52; + public static readonly REGEXP = 53; + public static readonly RIGHT = 54; + public static readonly SELECT = 55; + public static readonly SHOW = 56; + public static readonly STRING = 57; + public static readonly THEN = 58; + public static readonly TRUE = 59; + public static readonly UNION = 60; + public static readonly USING = 61; + public static readonly WHEN = 62; + public static readonly WHERE = 63; + public static readonly EXCEPT = 64; + public static readonly AVG = 65; + public static readonly COUNT = 66; + public static readonly MAX = 67; + public static readonly MIN = 68; + public static readonly SUM = 69; + public static readonly VAR_POP = 70; + public static readonly VAR_SAMP = 71; + public static readonly VARIANCE = 72; + public static readonly STD = 73; + public static readonly STDDEV = 74; + public static readonly STDDEV_POP = 75; + public static readonly STDDEV_SAMP = 76; + public static readonly SUBSTRING = 77; + public static readonly TRIM = 78; + public static readonly END = 79; + public static readonly FULL = 80; + public static readonly OFFSET = 81; + public static readonly INTERVAL = 82; + public static readonly MICROSECOND = 83; + public static readonly SECOND = 84; + public static readonly MINUTE = 85; + public static readonly HOUR = 86; + public static readonly DAY = 87; + public static readonly WEEK = 88; + public static readonly MONTH = 89; + public static readonly QUARTER = 90; + public static readonly YEAR = 91; + public static readonly SECOND_MICROSECOND = 92; + public static readonly MINUTE_MICROSECOND = 93; + public static readonly MINUTE_SECOND = 94; + public static readonly HOUR_MICROSECOND = 95; + public static readonly HOUR_SECOND = 96; + public static readonly HOUR_MINUTE = 97; + public static readonly DAY_MICROSECOND = 98; + public static readonly DAY_SECOND = 99; + public static readonly DAY_MINUTE = 100; + public static readonly DAY_HOUR = 101; + public static readonly YEAR_MONTH = 102; + public static readonly TABLES = 103; + public static readonly ABS = 104; + public static readonly ACOS = 105; + public static readonly ADD = 106; + public static readonly ADDTIME = 107; + public static readonly ASCII = 108; + public static readonly ASIN = 109; + public static readonly ATAN = 110; + public static readonly ATAN2 = 111; + public static readonly CBRT = 112; + public static readonly CEIL = 113; + public static readonly CEILING = 114; + public static readonly CONCAT = 115; + public static readonly CONCAT_WS = 116; + public static readonly CONV = 117; + public static readonly CONVERT_TZ = 118; + public static readonly COS = 119; + public static readonly COSH = 120; + public static readonly COT = 121; + public static readonly CRC32 = 122; + public static readonly CURDATE = 123; + public static readonly CURTIME = 124; + public static readonly CURRENT_DATE = 125; + public static readonly CURRENT_TIME = 126; + public static readonly CURRENT_TIMESTAMP = 127; + public static readonly DATE = 128; + public static readonly DATE_ADD = 129; + public static readonly DATE_FORMAT = 130; + public static readonly DATE_SUB = 131; + public static readonly DATEDIFF = 132; + public static readonly DAYNAME = 133; + public static readonly DAYOFMONTH = 134; + public static readonly DAYOFWEEK = 135; + public static readonly DAYOFYEAR = 136; + public static readonly DEGREES = 137; + public static readonly DIVIDE = 138; + public static readonly E = 139; + public static readonly EXP = 140; + public static readonly EXPM1 = 141; + public static readonly EXTRACT = 142; + public static readonly FLOOR = 143; + public static readonly FROM_DAYS = 144; + public static readonly FROM_UNIXTIME = 145; + public static readonly GET_FORMAT = 146; + public static readonly IF = 147; + public static readonly IFNULL = 148; + public static readonly ISNULL = 149; + public static readonly LAST_DAY = 150; + public static readonly LENGTH = 151; + public static readonly LN = 152; + public static readonly LOCALTIME = 153; + public static readonly LOCALTIMESTAMP = 154; + public static readonly LOCATE = 155; + public static readonly LOG = 156; + public static readonly LOG10 = 157; + public static readonly LOG2 = 158; + public static readonly LOWER = 159; + public static readonly LTRIM = 160; + public static readonly MAKEDATE = 161; + public static readonly MAKETIME = 162; + public static readonly MODULUS = 163; + public static readonly MONTHNAME = 164; + public static readonly MULTIPLY = 165; + public static readonly NOW = 166; + public static readonly NULLIF = 167; + public static readonly PERIOD_ADD = 168; + public static readonly PERIOD_DIFF = 169; + public static readonly PI = 170; + public static readonly POSITION = 171; + public static readonly POW = 172; + public static readonly POWER = 173; + public static readonly RADIANS = 174; + public static readonly RAND = 175; + public static readonly REPLACE = 176; + public static readonly RINT = 177; + public static readonly ROUND = 178; + public static readonly RTRIM = 179; + public static readonly REVERSE = 180; + public static readonly SEC_TO_TIME = 181; + public static readonly SIGN = 182; + public static readonly SIGNUM = 183; + public static readonly SIN = 184; + public static readonly SINH = 185; + public static readonly SQRT = 186; + public static readonly STR_TO_DATE = 187; + public static readonly SUBDATE = 188; + public static readonly SUBTIME = 189; + public static readonly SUBTRACT = 190; + public static readonly SYSDATE = 191; + public static readonly TAN = 192; + public static readonly TIME = 193; + public static readonly TIMEDIFF = 194; + public static readonly TIME_FORMAT = 195; + public static readonly TIME_TO_SEC = 196; + public static readonly TIMESTAMP = 197; + public static readonly TRUNCATE = 198; + public static readonly TO_DAYS = 199; + public static readonly TO_SECONDS = 200; + public static readonly UNIX_TIMESTAMP = 201; + public static readonly UPPER = 202; + public static readonly UTC_DATE = 203; + public static readonly UTC_TIME = 204; + public static readonly UTC_TIMESTAMP = 205; + public static readonly D = 206; + public static readonly T = 207; + public static readonly TS = 208; + public static readonly LEFT_BRACE = 209; + public static readonly RIGHT_BRACE = 210; + public static readonly DENSE_RANK = 211; + public static readonly RANK = 212; + public static readonly ROW_NUMBER = 213; + public static readonly DATE_HISTOGRAM = 214; + public static readonly DAY_OF_MONTH = 215; + public static readonly DAY_OF_YEAR = 216; + public static readonly DAY_OF_WEEK = 217; + public static readonly EXCLUDE = 218; + public static readonly EXTENDED_STATS = 219; + public static readonly FIELD = 220; + public static readonly FILTER = 221; + public static readonly GEO_BOUNDING_BOX = 222; + public static readonly GEO_CELL = 223; + public static readonly GEO_DISTANCE = 224; + public static readonly GEO_DISTANCE_RANGE = 225; + public static readonly GEO_INTERSECTS = 226; + public static readonly GEO_POLYGON = 227; + public static readonly HISTOGRAM = 228; + public static readonly HOUR_OF_DAY = 229; + public static readonly INCLUDE = 230; + public static readonly IN_TERMS = 231; + public static readonly MATCHPHRASE = 232; + public static readonly MATCH_PHRASE = 233; + public static readonly MATCHPHRASEQUERY = 234; + public static readonly SIMPLE_QUERY_STRING = 235; + public static readonly QUERY_STRING = 236; + public static readonly MATCH_PHRASE_PREFIX = 237; + public static readonly MATCHQUERY = 238; + public static readonly MATCH_QUERY = 239; + public static readonly MINUTE_OF_DAY = 240; + public static readonly MINUTE_OF_HOUR = 241; + public static readonly MONTH_OF_YEAR = 242; + public static readonly MULTIMATCH = 243; + public static readonly MULTI_MATCH = 244; + public static readonly MULTIMATCHQUERY = 245; + public static readonly NESTED = 246; + public static readonly PERCENTILES = 247; + public static readonly PERCENTILE = 248; + public static readonly PERCENTILE_APPROX = 249; + public static readonly REGEXP_QUERY = 250; + public static readonly REVERSE_NESTED = 251; + public static readonly QUERY = 252; + public static readonly RANGE = 253; + public static readonly SCORE = 254; + public static readonly SCOREQUERY = 255; + public static readonly SCORE_QUERY = 256; + public static readonly SECOND_OF_MINUTE = 257; + public static readonly STATS = 258; + public static readonly TERM = 259; + public static readonly TERMS = 260; + public static readonly TIMESTAMPADD = 261; + public static readonly TIMESTAMPDIFF = 262; + public static readonly TOPHITS = 263; + public static readonly TYPEOF = 264; + public static readonly WEEK_OF_YEAR = 265; + public static readonly WEEKOFYEAR = 266; + public static readonly WEEKDAY = 267; + public static readonly WILDCARDQUERY = 268; + public static readonly WILDCARD_QUERY = 269; + public static readonly SUBSTR = 270; + public static readonly STRCMP = 271; + public static readonly ADDDATE = 272; + public static readonly YEARWEEK = 273; + public static readonly ALLOW_LEADING_WILDCARD = 274; + public static readonly ANALYZER = 275; + public static readonly ANALYZE_WILDCARD = 276; + public static readonly AUTO_GENERATE_SYNONYMS_PHRASE_QUERY = 277; + public static readonly BOOST = 278; + public static readonly CASE_INSENSITIVE = 279; + public static readonly CUTOFF_FREQUENCY = 280; + public static readonly DEFAULT_FIELD = 281; + public static readonly DEFAULT_OPERATOR = 282; + public static readonly ESCAPE = 283; + public static readonly ENABLE_POSITION_INCREMENTS = 284; + public static readonly FIELDS = 285; + public static readonly FLAGS = 286; + public static readonly FUZZINESS = 287; + public static readonly FUZZY_MAX_EXPANSIONS = 288; + public static readonly FUZZY_PREFIX_LENGTH = 289; + public static readonly FUZZY_REWRITE = 290; + public static readonly FUZZY_TRANSPOSITIONS = 291; + public static readonly LENIENT = 292; + public static readonly LOW_FREQ_OPERATOR = 293; + public static readonly MAX_DETERMINIZED_STATES = 294; + public static readonly MAX_EXPANSIONS = 295; + public static readonly MINIMUM_SHOULD_MATCH = 296; + public static readonly OPERATOR = 297; + public static readonly PHRASE_SLOP = 298; + public static readonly PREFIX_LENGTH = 299; + public static readonly QUOTE_ANALYZER = 300; + public static readonly QUOTE_FIELD_SUFFIX = 301; + public static readonly REWRITE = 302; + public static readonly SLOP = 303; + public static readonly TIE_BREAKER = 304; + public static readonly TIME_ZONE = 305; + public static readonly TYPE = 306; + public static readonly ZERO_TERMS_QUERY = 307; + public static readonly HIGHLIGHT = 308; + public static readonly HIGHLIGHT_PRE_TAGS = 309; + public static readonly HIGHLIGHT_POST_TAGS = 310; + public static readonly MATCH_BOOL_PREFIX = 311; + public static readonly STAR = 312; + public static readonly SLASH = 313; + public static readonly MODULE = 314; + public static readonly PLUS = 315; + public static readonly MINUS = 316; + public static readonly DIV = 317; + public static readonly MOD = 318; + public static readonly EQUAL_SYMBOL = 319; + public static readonly GREATER_SYMBOL = 320; + public static readonly LESS_SYMBOL = 321; + public static readonly EXCLAMATION_SYMBOL = 322; + public static readonly BIT_NOT_OP = 323; + public static readonly BIT_OR_OP = 324; + public static readonly BIT_AND_OP = 325; + public static readonly BIT_XOR_OP = 326; + public static readonly DOT = 327; + public static readonly LR_BRACKET = 328; + public static readonly RR_BRACKET = 329; + public static readonly LT_SQR_PRTHS = 330; + public static readonly RT_SQR_PRTHS = 331; + public static readonly COMMA = 332; + public static readonly SEMI = 333; + public static readonly AT_SIGN = 334; + public static readonly ZERO_DECIMAL = 335; + public static readonly ONE_DECIMAL = 336; + public static readonly TWO_DECIMAL = 337; + public static readonly SINGLE_QUOTE_SYMB = 338; + public static readonly DOUBLE_QUOTE_SYMB = 339; + public static readonly REVERSE_QUOTE_SYMB = 340; + public static readonly COLON_SYMB = 341; + public static readonly START_NATIONAL_STRING_LITERAL = 342; + public static readonly STRING_LITERAL = 343; + public static readonly DECIMAL_LITERAL = 344; + public static readonly HEXADECIMAL_LITERAL = 345; + public static readonly REAL_LITERAL = 346; + public static readonly NULL_SPEC_LITERAL = 347; + public static readonly BIT_STRING = 348; + public static readonly ID = 349; + public static readonly DOUBLE_QUOTE_ID = 350; + public static readonly BACKTICK_QUOTE_ID = 351; + public static readonly ERROR_RECOGNITION = 352; + + public static readonly channelNames = [ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "SQLCOMMENT", "ERRORCHANNEL" + ]; + + public static readonly literalNames = [ + null, null, null, null, null, "'ALL'", "'AND'", "'AS'", "'ASC'", + "'BOOLEAN'", "'BETWEEN'", "'BY'", "'CASE'", "'CAST'", "'CROSS'", + "'COLUMNS'", "'DATETIME'", "'DELETE'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", + "'DOUBLE'", "'ELSE'", "'EXISTS'", "'FALSE'", "'FLOAT'", "'FIRST'", + "'FROM'", "'GROUP'", "'HAVING'", "'IN'", "'INNER'", "'INT'", "'INTEGER'", + "'IS'", "'JOIN'", "'LAST'", "'LEFT'", "'LIKE'", "'LIMIT'", "'LONG'", + "'MATCH'", "'NATURAL'", "'MISSING'", "'NOT'", "'NULL'", "'NULLS'", + "'ON'", "'OR'", "'ORDER'", "'OUTER'", "'OVER'", "'PARTITION'", "'REGEXP'", + "'RIGHT'", "'SELECT'", "'SHOW'", "'STRING'", "'THEN'", "'TRUE'", + "'UNION'", "'USING'", "'WHEN'", "'WHERE'", "'MINUS'", "'AVG'", "'COUNT'", + "'MAX'", "'MIN'", "'SUM'", "'VAR_POP'", "'VAR_SAMP'", "'VARIANCE'", + "'STD'", "'STDDEV'", "'STDDEV_POP'", "'STDDEV_SAMP'", "'SUBSTRING'", + "'TRIM'", "'END'", "'FULL'", "'OFFSET'", "'INTERVAL'", "'MICROSECOND'", + "'SECOND'", "'MINUTE'", "'HOUR'", "'DAY'", "'WEEK'", "'MONTH'", + "'QUARTER'", "'YEAR'", "'SECOND_MICROSECOND'", "'MINUTE_MICROSECOND'", + "'MINUTE_SECOND'", "'HOUR_MICROSECOND'", "'HOUR_SECOND'", "'HOUR_MINUTE'", + "'DAY_MICROSECOND'", "'DAY_SECOND'", "'DAY_MINUTE'", "'DAY_HOUR'", + "'YEAR_MONTH'", "'TABLES'", "'ABS'", "'ACOS'", "'ADD'", "'ADDTIME'", + "'ASCII'", "'ASIN'", "'ATAN'", "'ATAN2'", "'CBRT'", "'CEIL'", "'CEILING'", + "'CONCAT'", "'CONCAT_WS'", "'CONV'", "'CONVERT_TZ'", "'COS'", "'COSH'", + "'COT'", "'CRC32'", "'CURDATE'", "'CURTIME'", "'CURRENT_DATE'", + "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", "'DATE'", "'DATE_ADD'", + "'DATE_FORMAT'", "'DATE_SUB'", "'DATEDIFF'", "'DAYNAME'", "'DAYOFMONTH'", + "'DAYOFWEEK'", "'DAYOFYEAR'", "'DEGREES'", "'DIVIDE'", "'E'", "'EXP'", + "'EXPM1'", "'EXTRACT'", "'FLOOR'", "'FROM_DAYS'", "'FROM_UNIXTIME'", + "'GET_FORMAT'", "'IF'", "'IFNULL'", "'ISNULL'", "'LAST_DAY'", "'LENGTH'", + "'LN'", "'LOCALTIME'", "'LOCALTIMESTAMP'", "'LOCATE'", "'LOG'", + "'LOG10'", "'LOG2'", "'LOWER'", "'LTRIM'", "'MAKEDATE'", "'MAKETIME'", + "'MODULUS'", "'MONTHNAME'", "'MULTIPLY'", "'NOW'", "'NULLIF'", "'PERIOD_ADD'", + "'PERIOD_DIFF'", "'PI'", "'POSITION'", "'POW'", "'POWER'", "'RADIANS'", + "'RAND'", "'REPLACE'", "'RINT'", "'ROUND'", "'RTRIM'", "'REVERSE'", + "'SEC_TO_TIME'", "'SIGN'", "'SIGNUM'", "'SIN'", "'SINH'", "'SQRT'", + "'STR_TO_DATE'", "'SUBDATE'", "'SUBTIME'", "'SUBTRACT'", "'SYSDATE'", + "'TAN'", "'TIME'", "'TIMEDIFF'", "'TIME_FORMAT'", "'TIME_TO_SEC'", + "'TIMESTAMP'", "'TRUNCATE'", "'TO_DAYS'", "'TO_SECONDS'", "'UNIX_TIMESTAMP'", + "'UPPER'", "'UTC_DATE'", "'UTC_TIME'", "'UTC_TIMESTAMP'", "'D'", + "'T'", "'TS'", "'{'", "'}'", "'DENSE_RANK'", "'RANK'", "'ROW_NUMBER'", + "'DATE_HISTOGRAM'", "'DAY_OF_MONTH'", "'DAY_OF_YEAR'", "'DAY_OF_WEEK'", + "'EXCLUDE'", "'EXTENDED_STATS'", "'FIELD'", "'FILTER'", "'GEO_BOUNDING_BOX'", + "'GEO_CELL'", "'GEO_DISTANCE'", "'GEO_DISTANCE_RANGE'", "'GEO_INTERSECTS'", + "'GEO_POLYGON'", "'HISTOGRAM'", "'HOUR_OF_DAY'", "'INCLUDE'", "'IN_TERMS'", + "'MATCHPHRASE'", "'MATCH_PHRASE'", "'MATCHPHRASEQUERY'", "'SIMPLE_QUERY_STRING'", + "'QUERY_STRING'", "'MATCH_PHRASE_PREFIX'", "'MATCHQUERY'", "'MATCH_QUERY'", + "'MINUTE_OF_DAY'", "'MINUTE_OF_HOUR'", "'MONTH_OF_YEAR'", "'MULTIMATCH'", + "'MULTI_MATCH'", "'MULTIMATCHQUERY'", "'NESTED'", "'PERCENTILES'", + "'PERCENTILE'", "'PERCENTILE_APPROX'", "'REGEXP_QUERY'", "'REVERSE_NESTED'", + "'QUERY'", "'RANGE'", "'SCORE'", "'SCOREQUERY'", "'SCORE_QUERY'", + "'SECOND_OF_MINUTE'", "'STATS'", "'TERM'", "'TERMS'", "'TIMESTAMPADD'", + "'TIMESTAMPDIFF'", "'TOPHITS'", "'TYPEOF'", "'WEEK_OF_YEAR'", "'WEEKOFYEAR'", + "'WEEKDAY'", "'WILDCARDQUERY'", "'WILDCARD_QUERY'", "'SUBSTR'", + "'STRCMP'", "'ADDDATE'", "'YEARWEEK'", "'ALLOW_LEADING_WILDCARD'", + "'ANALYZER'", "'ANALYZE_WILDCARD'", "'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'", + "'BOOST'", "'CASE_INSENSITIVE'", "'CUTOFF_FREQUENCY'", "'DEFAULT_FIELD'", + "'DEFAULT_OPERATOR'", "'ESCAPE'", "'ENABLE_POSITION_INCREMENTS'", + "'FIELDS'", "'FLAGS'", "'FUZZINESS'", "'FUZZY_MAX_EXPANSIONS'", + "'FUZZY_PREFIX_LENGTH'", "'FUZZY_REWRITE'", "'FUZZY_TRANSPOSITIONS'", + "'LENIENT'", "'LOW_FREQ_OPERATOR'", "'MAX_DETERMINIZED_STATES'", + "'MAX_EXPANSIONS'", "'MINIMUM_SHOULD_MATCH'", "'OPERATOR'", "'PHRASE_SLOP'", + "'PREFIX_LENGTH'", "'QUOTE_ANALYZER'", "'QUOTE_FIELD_SUFFIX'", "'REWRITE'", + "'SLOP'", "'TIE_BREAKER'", "'TIME_ZONE'", "'TYPE'", "'ZERO_TERMS_QUERY'", + "'HIGHLIGHT'", "'PRE_TAGS'", "'POST_TAGS'", "'MATCH_BOOL_PREFIX'", + "'*'", "'/'", "'%'", "'+'", "'-'", "'DIV'", "'MOD'", "'='", "'>'", + "'<'", "'!'", "'~'", "'|'", "'&'", "'^'", "'.'", "'('", "')'", "'['", + "']'", "','", "';'", "'@'", "'0'", "'1'", "'2'", "'''", "'\"'", + "'`'", "':'" + ]; + + public static readonly symbolicNames = [ + null, "SPACE", "SPEC_SQL_COMMENT", "COMMENT_INPUT", "LINE_COMMENT", + "ALL", "AND", "AS", "ASC", "BOOLEAN", "BETWEEN", "BY", "CASE", "CAST", + "CROSS", "COLUMNS", "DATETIME", "DELETE", "DESC", "DESCRIBE", "DISTINCT", + "DOUBLE", "ELSE", "EXISTS", "FALSE", "FLOAT", "FIRST", "FROM", "GROUP", + "HAVING", "IN", "INNER", "INT", "INTEGER", "IS", "JOIN", "LAST", + "LEFT", "LIKE", "LIMIT", "LONG", "MATCH", "NATURAL", "MISSING_LITERAL", + "NOT", "NULL_LITERAL", "NULLS", "ON", "OR", "ORDER", "OUTER", "OVER", + "PARTITION", "REGEXP", "RIGHT", "SELECT", "SHOW", "STRING", "THEN", + "TRUE", "UNION", "USING", "WHEN", "WHERE", "EXCEPT", "AVG", "COUNT", + "MAX", "MIN", "SUM", "VAR_POP", "VAR_SAMP", "VARIANCE", "STD", "STDDEV", + "STDDEV_POP", "STDDEV_SAMP", "SUBSTRING", "TRIM", "END", "FULL", + "OFFSET", "INTERVAL", "MICROSECOND", "SECOND", "MINUTE", "HOUR", + "DAY", "WEEK", "MONTH", "QUARTER", "YEAR", "SECOND_MICROSECOND", + "MINUTE_MICROSECOND", "MINUTE_SECOND", "HOUR_MICROSECOND", "HOUR_SECOND", + "HOUR_MINUTE", "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", "DAY_HOUR", + "YEAR_MONTH", "TABLES", "ABS", "ACOS", "ADD", "ADDTIME", "ASCII", + "ASIN", "ATAN", "ATAN2", "CBRT", "CEIL", "CEILING", "CONCAT", "CONCAT_WS", + "CONV", "CONVERT_TZ", "COS", "COSH", "COT", "CRC32", "CURDATE", + "CURTIME", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", + "DATE", "DATE_ADD", "DATE_FORMAT", "DATE_SUB", "DATEDIFF", "DAYNAME", + "DAYOFMONTH", "DAYOFWEEK", "DAYOFYEAR", "DEGREES", "DIVIDE", "E", + "EXP", "EXPM1", "EXTRACT", "FLOOR", "FROM_DAYS", "FROM_UNIXTIME", + "GET_FORMAT", "IF", "IFNULL", "ISNULL", "LAST_DAY", "LENGTH", "LN", + "LOCALTIME", "LOCALTIMESTAMP", "LOCATE", "LOG", "LOG10", "LOG2", + "LOWER", "LTRIM", "MAKEDATE", "MAKETIME", "MODULUS", "MONTHNAME", + "MULTIPLY", "NOW", "NULLIF", "PERIOD_ADD", "PERIOD_DIFF", "PI", + "POSITION", "POW", "POWER", "RADIANS", "RAND", "REPLACE", "RINT", + "ROUND", "RTRIM", "REVERSE", "SEC_TO_TIME", "SIGN", "SIGNUM", "SIN", + "SINH", "SQRT", "STR_TO_DATE", "SUBDATE", "SUBTIME", "SUBTRACT", + "SYSDATE", "TAN", "TIME", "TIMEDIFF", "TIME_FORMAT", "TIME_TO_SEC", + "TIMESTAMP", "TRUNCATE", "TO_DAYS", "TO_SECONDS", "UNIX_TIMESTAMP", + "UPPER", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "D", "T", "TS", + "LEFT_BRACE", "RIGHT_BRACE", "DENSE_RANK", "RANK", "ROW_NUMBER", + "DATE_HISTOGRAM", "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK", + "EXCLUDE", "EXTENDED_STATS", "FIELD", "FILTER", "GEO_BOUNDING_BOX", + "GEO_CELL", "GEO_DISTANCE", "GEO_DISTANCE_RANGE", "GEO_INTERSECTS", + "GEO_POLYGON", "HISTOGRAM", "HOUR_OF_DAY", "INCLUDE", "IN_TERMS", + "MATCHPHRASE", "MATCH_PHRASE", "MATCHPHRASEQUERY", "SIMPLE_QUERY_STRING", + "QUERY_STRING", "MATCH_PHRASE_PREFIX", "MATCHQUERY", "MATCH_QUERY", + "MINUTE_OF_DAY", "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "MULTIMATCH", + "MULTI_MATCH", "MULTIMATCHQUERY", "NESTED", "PERCENTILES", "PERCENTILE", + "PERCENTILE_APPROX", "REGEXP_QUERY", "REVERSE_NESTED", "QUERY", + "RANGE", "SCORE", "SCOREQUERY", "SCORE_QUERY", "SECOND_OF_MINUTE", + "STATS", "TERM", "TERMS", "TIMESTAMPADD", "TIMESTAMPDIFF", "TOPHITS", + "TYPEOF", "WEEK_OF_YEAR", "WEEKOFYEAR", "WEEKDAY", "WILDCARDQUERY", + "WILDCARD_QUERY", "SUBSTR", "STRCMP", "ADDDATE", "YEARWEEK", "ALLOW_LEADING_WILDCARD", + "ANALYZER", "ANALYZE_WILDCARD", "AUTO_GENERATE_SYNONYMS_PHRASE_QUERY", + "BOOST", "CASE_INSENSITIVE", "CUTOFF_FREQUENCY", "DEFAULT_FIELD", + "DEFAULT_OPERATOR", "ESCAPE", "ENABLE_POSITION_INCREMENTS", "FIELDS", + "FLAGS", "FUZZINESS", "FUZZY_MAX_EXPANSIONS", "FUZZY_PREFIX_LENGTH", + "FUZZY_REWRITE", "FUZZY_TRANSPOSITIONS", "LENIENT", "LOW_FREQ_OPERATOR", + "MAX_DETERMINIZED_STATES", "MAX_EXPANSIONS", "MINIMUM_SHOULD_MATCH", + "OPERATOR", "PHRASE_SLOP", "PREFIX_LENGTH", "QUOTE_ANALYZER", "QUOTE_FIELD_SUFFIX", + "REWRITE", "SLOP", "TIE_BREAKER", "TIME_ZONE", "TYPE", "ZERO_TERMS_QUERY", + "HIGHLIGHT", "HIGHLIGHT_PRE_TAGS", "HIGHLIGHT_POST_TAGS", "MATCH_BOOL_PREFIX", + "STAR", "SLASH", "MODULE", "PLUS", "MINUS", "DIV", "MOD", "EQUAL_SYMBOL", + "GREATER_SYMBOL", "LESS_SYMBOL", "EXCLAMATION_SYMBOL", "BIT_NOT_OP", + "BIT_OR_OP", "BIT_AND_OP", "BIT_XOR_OP", "DOT", "LR_BRACKET", "RR_BRACKET", + "LT_SQR_PRTHS", "RT_SQR_PRTHS", "COMMA", "SEMI", "AT_SIGN", "ZERO_DECIMAL", + "ONE_DECIMAL", "TWO_DECIMAL", "SINGLE_QUOTE_SYMB", "DOUBLE_QUOTE_SYMB", + "REVERSE_QUOTE_SYMB", "COLON_SYMB", "START_NATIONAL_STRING_LITERAL", + "STRING_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "REAL_LITERAL", + "NULL_SPEC_LITERAL", "BIT_STRING", "ID", "DOUBLE_QUOTE_ID", "BACKTICK_QUOTE_ID", + "ERROR_RECOGNITION" + ]; + + public static readonly modeNames = [ + "DEFAULT_MODE", + ]; + + public static readonly ruleNames = [ + "SPACE", "SPEC_SQL_COMMENT", "COMMENT_INPUT", "LINE_COMMENT", "ALL", + "AND", "AS", "ASC", "BOOLEAN", "BETWEEN", "BY", "CASE", "CAST", + "CROSS", "COLUMNS", "DATETIME", "DELETE", "DESC", "DESCRIBE", "DISTINCT", + "DOUBLE", "ELSE", "EXISTS", "FALSE", "FLOAT", "FIRST", "FROM", "GROUP", + "HAVING", "IN", "INNER", "INT", "INTEGER", "IS", "JOIN", "LAST", + "LEFT", "LIKE", "LIMIT", "LONG", "MATCH", "NATURAL", "MISSING_LITERAL", + "NOT", "NULL_LITERAL", "NULLS", "ON", "OR", "ORDER", "OUTER", "OVER", + "PARTITION", "REGEXP", "RIGHT", "SELECT", "SHOW", "STRING", "THEN", + "TRUE", "UNION", "USING", "WHEN", "WHERE", "EXCEPT", "AVG", "COUNT", + "MAX", "MIN", "SUM", "VAR_POP", "VAR_SAMP", "VARIANCE", "STD", "STDDEV", + "STDDEV_POP", "STDDEV_SAMP", "SUBSTRING", "TRIM", "END", "FULL", + "OFFSET", "INTERVAL", "MICROSECOND", "SECOND", "MINUTE", "HOUR", + "DAY", "WEEK", "MONTH", "QUARTER", "YEAR", "SECOND_MICROSECOND", + "MINUTE_MICROSECOND", "MINUTE_SECOND", "HOUR_MICROSECOND", "HOUR_SECOND", + "HOUR_MINUTE", "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", "DAY_HOUR", + "YEAR_MONTH", "TABLES", "ABS", "ACOS", "ADD", "ADDTIME", "ASCII", + "ASIN", "ATAN", "ATAN2", "CBRT", "CEIL", "CEILING", "CONCAT", "CONCAT_WS", + "CONV", "CONVERT_TZ", "COS", "COSH", "COT", "CRC32", "CURDATE", + "CURTIME", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", + "DATE", "DATE_ADD", "DATE_FORMAT", "DATE_SUB", "DATEDIFF", "DAYNAME", + "DAYOFMONTH", "DAYOFWEEK", "DAYOFYEAR", "DEGREES", "DIVIDE", "E", + "EXP", "EXPM1", "EXTRACT", "FLOOR", "FROM_DAYS", "FROM_UNIXTIME", + "GET_FORMAT", "IF", "IFNULL", "ISNULL", "LAST_DAY", "LENGTH", "LN", + "LOCALTIME", "LOCALTIMESTAMP", "LOCATE", "LOG", "LOG10", "LOG2", + "LOWER", "LTRIM", "MAKEDATE", "MAKETIME", "MODULUS", "MONTHNAME", + "MULTIPLY", "NOW", "NULLIF", "PERIOD_ADD", "PERIOD_DIFF", "PI", + "POSITION", "POW", "POWER", "RADIANS", "RAND", "REPLACE", "RINT", + "ROUND", "RTRIM", "REVERSE", "SEC_TO_TIME", "SIGN", "SIGNUM", "SIN", + "SINH", "SQRT", "STR_TO_DATE", "SUBDATE", "SUBTIME", "SUBTRACT", + "SYSDATE", "TAN", "TIME", "TIMEDIFF", "TIME_FORMAT", "TIME_TO_SEC", + "TIMESTAMP", "TRUNCATE", "TO_DAYS", "TO_SECONDS", "UNIX_TIMESTAMP", + "UPPER", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "D", "T", "TS", + "LEFT_BRACE", "RIGHT_BRACE", "DENSE_RANK", "RANK", "ROW_NUMBER", + "DATE_HISTOGRAM", "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK", + "EXCLUDE", "EXTENDED_STATS", "FIELD", "FILTER", "GEO_BOUNDING_BOX", + "GEO_CELL", "GEO_DISTANCE", "GEO_DISTANCE_RANGE", "GEO_INTERSECTS", + "GEO_POLYGON", "HISTOGRAM", "HOUR_OF_DAY", "INCLUDE", "IN_TERMS", + "MATCHPHRASE", "MATCH_PHRASE", "MATCHPHRASEQUERY", "SIMPLE_QUERY_STRING", + "QUERY_STRING", "MATCH_PHRASE_PREFIX", "MATCHQUERY", "MATCH_QUERY", + "MINUTE_OF_DAY", "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "MULTIMATCH", + "MULTI_MATCH", "MULTIMATCHQUERY", "NESTED", "PERCENTILES", "PERCENTILE", + "PERCENTILE_APPROX", "REGEXP_QUERY", "REVERSE_NESTED", "QUERY", + "RANGE", "SCORE", "SCOREQUERY", "SCORE_QUERY", "SECOND_OF_MINUTE", + "STATS", "TERM", "TERMS", "TIMESTAMPADD", "TIMESTAMPDIFF", "TOPHITS", + "TYPEOF", "WEEK_OF_YEAR", "WEEKOFYEAR", "WEEKDAY", "WILDCARDQUERY", + "WILDCARD_QUERY", "SUBSTR", "STRCMP", "ADDDATE", "YEARWEEK", "ALLOW_LEADING_WILDCARD", + "ANALYZER", "ANALYZE_WILDCARD", "AUTO_GENERATE_SYNONYMS_PHRASE_QUERY", + "BOOST", "CASE_INSENSITIVE", "CUTOFF_FREQUENCY", "DEFAULT_FIELD", + "DEFAULT_OPERATOR", "ESCAPE", "ENABLE_POSITION_INCREMENTS", "FIELDS", + "FLAGS", "FUZZINESS", "FUZZY_MAX_EXPANSIONS", "FUZZY_PREFIX_LENGTH", + "FUZZY_REWRITE", "FUZZY_TRANSPOSITIONS", "LENIENT", "LOW_FREQ_OPERATOR", + "MAX_DETERMINIZED_STATES", "MAX_EXPANSIONS", "MINIMUM_SHOULD_MATCH", + "OPERATOR", "PHRASE_SLOP", "PREFIX_LENGTH", "QUOTE_ANALYZER", "QUOTE_FIELD_SUFFIX", + "REWRITE", "SLOP", "TIE_BREAKER", "TIME_ZONE", "TYPE", "ZERO_TERMS_QUERY", + "HIGHLIGHT", "HIGHLIGHT_PRE_TAGS", "HIGHLIGHT_POST_TAGS", "MATCH_BOOL_PREFIX", + "STAR", "SLASH", "MODULE", "PLUS", "MINUS", "DIV", "MOD", "EQUAL_SYMBOL", + "GREATER_SYMBOL", "LESS_SYMBOL", "EXCLAMATION_SYMBOL", "BIT_NOT_OP", + "BIT_OR_OP", "BIT_AND_OP", "BIT_XOR_OP", "DOT", "LR_BRACKET", "RR_BRACKET", + "LT_SQR_PRTHS", "RT_SQR_PRTHS", "COMMA", "SEMI", "AT_SIGN", "ZERO_DECIMAL", + "ONE_DECIMAL", "TWO_DECIMAL", "SINGLE_QUOTE_SYMB", "DOUBLE_QUOTE_SYMB", + "REVERSE_QUOTE_SYMB", "COLON_SYMB", "START_NATIONAL_STRING_LITERAL", + "STRING_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "REAL_LITERAL", + "NULL_SPEC_LITERAL", "BIT_STRING", "ID", "DOUBLE_QUOTE_ID", "BACKTICK_QUOTE_ID", + "EXPONENT_NUM_PART", "ID_LITERAL", "DQUOTA_STRING", "SQUOTA_STRING", + "BQUOTA_STRING", "HEX_DIGIT", "DEC_DIGIT", "BIT_STRING_L", "ERROR_RECOGNITION", + ]; + + + public constructor(input: antlr.CharStream) { + super(input); + this.interpreter = new antlr.LexerATNSimulator(this, OpenSearchSQLLexer._ATN, OpenSearchSQLLexer.decisionsToDFA, new antlr.PredictionContextCache()); + } + + public get grammarFileName(): string { return "OpenSearchSQLLexer.g4"; } + + public get literalNames(): (string | null)[] { return OpenSearchSQLLexer.literalNames; } + public get symbolicNames(): (string | null)[] { return OpenSearchSQLLexer.symbolicNames; } + public get ruleNames(): string[] { return OpenSearchSQLLexer.ruleNames; } + + public get serializedATN(): number[] { return OpenSearchSQLLexer._serializedATN; } + + public get channelNames(): string[] { return OpenSearchSQLLexer.channelNames; } + + public get modeNames(): string[] { return OpenSearchSQLLexer.modeNames; } + + public static readonly _serializedATN: number[] = [ + 4,0,352,3776,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7, + 5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12, + 2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19, + 7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25, + 2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32, + 7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, + 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45, + 7,45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51, + 2,52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58, + 7,58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64, + 2,65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71, + 7,71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77, + 2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84, + 7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90, + 2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97, + 7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, + 7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108, + 2,109,7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114, + 7,114,2,115,7,115,2,116,7,116,2,117,7,117,2,118,7,118,2,119,7,119, + 2,120,7,120,2,121,7,121,2,122,7,122,2,123,7,123,2,124,7,124,2,125, + 7,125,2,126,7,126,2,127,7,127,2,128,7,128,2,129,7,129,2,130,7,130, + 2,131,7,131,2,132,7,132,2,133,7,133,2,134,7,134,2,135,7,135,2,136, + 7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140,7,140,2,141,7,141, + 2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146,7,146,2,147, + 7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,2,152,7,152, + 2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157,7,157,2,158, + 7,158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162,2,163,7,163, + 2,164,7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,2,169, + 7,169,2,170,7,170,2,171,7,171,2,172,7,172,2,173,7,173,2,174,7,174, + 2,175,7,175,2,176,7,176,2,177,7,177,2,178,7,178,2,179,7,179,2,180, + 7,180,2,181,7,181,2,182,7,182,2,183,7,183,2,184,7,184,2,185,7,185, + 2,186,7,186,2,187,7,187,2,188,7,188,2,189,7,189,2,190,7,190,2,191, + 7,191,2,192,7,192,2,193,7,193,2,194,7,194,2,195,7,195,2,196,7,196, + 2,197,7,197,2,198,7,198,2,199,7,199,2,200,7,200,2,201,7,201,2,202, + 7,202,2,203,7,203,2,204,7,204,2,205,7,205,2,206,7,206,2,207,7,207, + 2,208,7,208,2,209,7,209,2,210,7,210,2,211,7,211,2,212,7,212,2,213, + 7,213,2,214,7,214,2,215,7,215,2,216,7,216,2,217,7,217,2,218,7,218, + 2,219,7,219,2,220,7,220,2,221,7,221,2,222,7,222,2,223,7,223,2,224, + 7,224,2,225,7,225,2,226,7,226,2,227,7,227,2,228,7,228,2,229,7,229, + 2,230,7,230,2,231,7,231,2,232,7,232,2,233,7,233,2,234,7,234,2,235, + 7,235,2,236,7,236,2,237,7,237,2,238,7,238,2,239,7,239,2,240,7,240, + 2,241,7,241,2,242,7,242,2,243,7,243,2,244,7,244,2,245,7,245,2,246, + 7,246,2,247,7,247,2,248,7,248,2,249,7,249,2,250,7,250,2,251,7,251, + 2,252,7,252,2,253,7,253,2,254,7,254,2,255,7,255,2,256,7,256,2,257, + 7,257,2,258,7,258,2,259,7,259,2,260,7,260,2,261,7,261,2,262,7,262, + 2,263,7,263,2,264,7,264,2,265,7,265,2,266,7,266,2,267,7,267,2,268, + 7,268,2,269,7,269,2,270,7,270,2,271,7,271,2,272,7,272,2,273,7,273, + 2,274,7,274,2,275,7,275,2,276,7,276,2,277,7,277,2,278,7,278,2,279, + 7,279,2,280,7,280,2,281,7,281,2,282,7,282,2,283,7,283,2,284,7,284, + 2,285,7,285,2,286,7,286,2,287,7,287,2,288,7,288,2,289,7,289,2,290, + 7,290,2,291,7,291,2,292,7,292,2,293,7,293,2,294,7,294,2,295,7,295, + 2,296,7,296,2,297,7,297,2,298,7,298,2,299,7,299,2,300,7,300,2,301, + 7,301,2,302,7,302,2,303,7,303,2,304,7,304,2,305,7,305,2,306,7,306, + 2,307,7,307,2,308,7,308,2,309,7,309,2,310,7,310,2,311,7,311,2,312, + 7,312,2,313,7,313,2,314,7,314,2,315,7,315,2,316,7,316,2,317,7,317, + 2,318,7,318,2,319,7,319,2,320,7,320,2,321,7,321,2,322,7,322,2,323, + 7,323,2,324,7,324,2,325,7,325,2,326,7,326,2,327,7,327,2,328,7,328, + 2,329,7,329,2,330,7,330,2,331,7,331,2,332,7,332,2,333,7,333,2,334, + 7,334,2,335,7,335,2,336,7,336,2,337,7,337,2,338,7,338,2,339,7,339, + 2,340,7,340,2,341,7,341,2,342,7,342,2,343,7,343,2,344,7,344,2,345, + 7,345,2,346,7,346,2,347,7,347,2,348,7,348,2,349,7,349,2,350,7,350, + 2,351,7,351,2,352,7,352,2,353,7,353,2,354,7,354,2,355,7,355,2,356, + 7,356,2,357,7,357,2,358,7,358,2,359,7,359,1,0,4,0,723,8,0,11,0,12, + 0,724,1,0,1,0,1,1,1,1,1,1,1,1,1,1,4,1,734,8,1,11,1,12,1,735,1,1, + 1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,5,2,747,8,2,10,2,12,2,750,9,2,1, + 2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,3,3,761,8,3,1,3,5,3,764,8,3,10, + 3,12,3,767,9,3,1,3,3,3,770,8,3,1,3,1,3,3,3,774,8,3,1,3,1,3,1,3,1, + 3,3,3,780,8,3,1,3,1,3,3,3,784,8,3,3,3,786,8,3,1,3,1,3,1,4,1,4,1, + 4,1,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1, + 8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10, + 1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13, + 1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15, + 1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22, + 1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24, + 1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26, + 1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28, + 1,28,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31, + 1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34, + 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36, + 1,36,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39, + 1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41, + 1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, + 1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45, + 1,45,1,45,1,46,1,46,1,46,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48, + 1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51, + 1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52, + 1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54, + 1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56, + 1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59, + 1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61, + 1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63, + 1,63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66, + 1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,69,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70, + 1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72, + 1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74, + 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75, + 1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,76, + 1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,79, + 1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81, + 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82, + 1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,83, + 1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,86, + 1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88, + 1,88,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90, + 1,90,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91, + 1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92, + 1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92, + 1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93, + 1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94, + 1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95, + 1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96, + 1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97, + 1,97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98, + 1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99, + 1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100, + 1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101, + 1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103, + 1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107, + 1,107,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109, + 1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111, + 1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113, + 1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115, + 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116, + 1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117, + 1,117,1,117,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119, + 1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,122, + 1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123, + 1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124,1,124, + 1,124,1,124,1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125, + 1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126, + 1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126, + 1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,128,1,128, + 1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129, + 1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,130,1,130,1,130, + 1,130,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,131, + 1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,1,132, + 1,132,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133, + 1,133,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134, + 1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,136, + 1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137, + 1,137,1,137,1,137,1,138,1,138,1,139,1,139,1,139,1,139,1,140,1,140, + 1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,141,1,141,1,141, + 1,141,1,142,1,142,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143, + 1,143,1,143,1,143,1,143,1,143,1,143,1,144,1,144,1,144,1,144,1,144, + 1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,145,1,145, + 1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,146,1,146, + 1,146,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,148,1,148,1,148, + 1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,149,1,149, + 1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,151,1,151, + 1,151,1,152,1,152,1,152,1,152,1,152,1,152,1,152,1,152,1,152,1,152, + 1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153, + 1,153,1,153,1,153,1,153,1,154,1,154,1,154,1,154,1,154,1,154,1,154, + 1,155,1,155,1,155,1,155,1,156,1,156,1,156,1,156,1,156,1,156,1,157, + 1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158,1,158,1,158,1,159, + 1,159,1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,160,1,160, + 1,160,1,160,1,160,1,161,1,161,1,161,1,161,1,161,1,161,1,161,1,161, + 1,161,1,162,1,162,1,162,1,162,1,162,1,162,1,162,1,162,1,163,1,163, + 1,163,1,163,1,163,1,163,1,163,1,163,1,163,1,163,1,164,1,164,1,164, + 1,164,1,164,1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,166, + 1,166,1,166,1,166,1,166,1,166,1,166,1,167,1,167,1,167,1,167,1,167, + 1,167,1,167,1,167,1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,168, + 1,168,1,168,1,168,1,168,1,168,1,168,1,168,1,169,1,169,1,169,1,170, + 1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,170,1,171,1,171,1,171, + 1,171,1,172,1,172,1,172,1,172,1,172,1,172,1,173,1,173,1,173,1,173, + 1,173,1,173,1,173,1,173,1,174,1,174,1,174,1,174,1,174,1,175,1,175, + 1,175,1,175,1,175,1,175,1,175,1,175,1,176,1,176,1,176,1,176,1,176, + 1,177,1,177,1,177,1,177,1,177,1,177,1,178,1,178,1,178,1,178,1,178, + 1,178,1,179,1,179,1,179,1,179,1,179,1,179,1,179,1,179,1,180,1,180, + 1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,181, + 1,181,1,181,1,181,1,181,1,182,1,182,1,182,1,182,1,182,1,182,1,182, + 1,183,1,183,1,183,1,183,1,184,1,184,1,184,1,184,1,184,1,185,1,185, + 1,185,1,185,1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186, + 1,186,1,186,1,186,1,186,1,187,1,187,1,187,1,187,1,187,1,187,1,187, + 1,187,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,189,1,189, + 1,189,1,189,1,189,1,189,1,189,1,189,1,189,1,190,1,190,1,190,1,190, + 1,190,1,190,1,190,1,190,1,191,1,191,1,191,1,191,1,192,1,192,1,192, + 1,192,1,192,1,193,1,193,1,193,1,193,1,193,1,193,1,193,1,193,1,193, + 1,194,1,194,1,194,1,194,1,194,1,194,1,194,1,194,1,194,1,194,1,194, + 1,194,1,195,1,195,1,195,1,195,1,195,1,195,1,195,1,195,1,195,1,195, + 1,195,1,195,1,196,1,196,1,196,1,196,1,196,1,196,1,196,1,196,1,196, + 1,196,1,197,1,197,1,197,1,197,1,197,1,197,1,197,1,197,1,197,1,198, + 1,198,1,198,1,198,1,198,1,198,1,198,1,198,1,199,1,199,1,199,1,199, + 1,199,1,199,1,199,1,199,1,199,1,199,1,199,1,200,1,200,1,200,1,200, + 1,200,1,200,1,200,1,200,1,200,1,200,1,200,1,200,1,200,1,200,1,200, + 1,201,1,201,1,201,1,201,1,201,1,201,1,202,1,202,1,202,1,202,1,202, + 1,202,1,202,1,202,1,202,1,203,1,203,1,203,1,203,1,203,1,203,1,203, + 1,203,1,203,1,204,1,204,1,204,1,204,1,204,1,204,1,204,1,204,1,204, + 1,204,1,204,1,204,1,204,1,204,1,205,1,205,1,206,1,206,1,207,1,207, + 1,207,1,208,1,208,1,209,1,209,1,210,1,210,1,210,1,210,1,210,1,210, + 1,210,1,210,1,210,1,210,1,210,1,211,1,211,1,211,1,211,1,211,1,212, + 1,212,1,212,1,212,1,212,1,212,1,212,1,212,1,212,1,212,1,212,1,213, + 1,213,1,213,1,213,1,213,1,213,1,213,1,213,1,213,1,213,1,213,1,213, + 1,213,1,213,1,213,1,214,1,214,1,214,1,214,1,214,1,214,1,214,1,214, + 1,214,1,214,1,214,1,214,1,214,1,215,1,215,1,215,1,215,1,215,1,215, + 1,215,1,215,1,215,1,215,1,215,1,215,1,216,1,216,1,216,1,216,1,216, + 1,216,1,216,1,216,1,216,1,216,1,216,1,216,1,217,1,217,1,217,1,217, + 1,217,1,217,1,217,1,217,1,218,1,218,1,218,1,218,1,218,1,218,1,218, + 1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,219,1,219,1,219, + 1,219,1,219,1,219,1,220,1,220,1,220,1,220,1,220,1,220,1,220,1,221, + 1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221, + 1,221,1,221,1,221,1,221,1,221,1,222,1,222,1,222,1,222,1,222,1,222, + 1,222,1,222,1,222,1,223,1,223,1,223,1,223,1,223,1,223,1,223,1,223, + 1,223,1,223,1,223,1,223,1,223,1,224,1,224,1,224,1,224,1,224,1,224, + 1,224,1,224,1,224,1,224,1,224,1,224,1,224,1,224,1,224,1,224,1,224, + 1,224,1,224,1,225,1,225,1,225,1,225,1,225,1,225,1,225,1,225,1,225, + 1,225,1,225,1,225,1,225,1,225,1,225,1,226,1,226,1,226,1,226,1,226, + 1,226,1,226,1,226,1,226,1,226,1,226,1,226,1,227,1,227,1,227,1,227, + 1,227,1,227,1,227,1,227,1,227,1,227,1,228,1,228,1,228,1,228,1,228, + 1,228,1,228,1,228,1,228,1,228,1,228,1,228,1,229,1,229,1,229,1,229, + 1,229,1,229,1,229,1,229,1,230,1,230,1,230,1,230,1,230,1,230,1,230, + 1,230,1,230,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231, + 1,231,1,231,1,231,1,232,1,232,1,232,1,232,1,232,1,232,1,232,1,232, + 1,232,1,232,1,232,1,232,1,232,1,233,1,233,1,233,1,233,1,233,1,233, + 1,233,1,233,1,233,1,233,1,233,1,233,1,233,1,233,1,233,1,233,1,233, + 1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,234, + 1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,234,1,235,1,235, + 1,235,1,235,1,235,1,235,1,235,1,235,1,235,1,235,1,235,1,235,1,235, + 1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,236, + 1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,236,1,237,1,237, + 1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,238,1,238, + 1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,239, + 1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239, + 1,239,1,239,1,240,1,240,1,240,1,240,1,240,1,240,1,240,1,240,1,240, + 1,240,1,240,1,240,1,240,1,240,1,240,1,241,1,241,1,241,1,241,1,241, + 1,241,1,241,1,241,1,241,1,241,1,241,1,241,1,241,1,241,1,242,1,242, + 1,242,1,242,1,242,1,242,1,242,1,242,1,242,1,242,1,242,1,243,1,243, + 1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,244, + 1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,244, + 1,244,1,244,1,244,1,244,1,245,1,245,1,245,1,245,1,245,1,245,1,245, + 1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246, + 1,246,1,247,1,247,1,247,1,247,1,247,1,247,1,247,1,247,1,247,1,247, + 1,247,1,248,1,248,1,248,1,248,1,248,1,248,1,248,1,248,1,248,1,248, + 1,248,1,248,1,248,1,248,1,248,1,248,1,248,1,248,1,249,1,249,1,249, + 1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,250, + 1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250, + 1,250,1,250,1,250,1,251,1,251,1,251,1,251,1,251,1,251,1,252,1,252, + 1,252,1,252,1,252,1,252,1,253,1,253,1,253,1,253,1,253,1,253,1,254, + 1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,254,1,255, + 1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255, + 1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256,1,256, + 1,256,1,256,1,256,1,256,1,256,1,256,1,257,1,257,1,257,1,257,1,257, + 1,257,1,258,1,258,1,258,1,258,1,258,1,259,1,259,1,259,1,259,1,259, + 1,259,1,260,1,260,1,260,1,260,1,260,1,260,1,260,1,260,1,260,1,260, + 1,260,1,260,1,260,1,261,1,261,1,261,1,261,1,261,1,261,1,261,1,261, + 1,261,1,261,1,261,1,261,1,261,1,261,1,262,1,262,1,262,1,262,1,262, + 1,262,1,262,1,262,1,263,1,263,1,263,1,263,1,263,1,263,1,263,1,264, + 1,264,1,264,1,264,1,264,1,264,1,264,1,264,1,264,1,264,1,264,1,264, + 1,264,1,265,1,265,1,265,1,265,1,265,1,265,1,265,1,265,1,265,1,265, + 1,265,1,266,1,266,1,266,1,266,1,266,1,266,1,266,1,266,1,267,1,267, + 1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267, + 1,267,1,268,1,268,1,268,1,268,1,268,1,268,1,268,1,268,1,268,1,268, + 1,268,1,268,1,268,1,268,1,268,1,269,1,269,1,269,1,269,1,269,1,269, + 1,269,1,270,1,270,1,270,1,270,1,270,1,270,1,270,1,271,1,271,1,271, + 1,271,1,271,1,271,1,271,1,271,1,272,1,272,1,272,1,272,1,272,1,272, + 1,272,1,272,1,272,1,273,1,273,1,273,1,273,1,273,1,273,1,273,1,273, + 1,273,1,273,1,273,1,273,1,273,1,273,1,273,1,273,1,273,1,273,1,273, + 1,273,1,273,1,273,1,273,1,274,1,274,1,274,1,274,1,274,1,274,1,274, + 1,274,1,274,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275, + 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,276,1,276,1,276, + 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276, + 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276, + 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276, + 1,277,1,277,1,277,1,277,1,277,1,277,1,278,1,278,1,278,1,278,1,278, + 1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,278, + 1,278,1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279, + 1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,280,1,280,1,280,1,280, + 1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,281, + 1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281,1,281, + 1,281,1,281,1,281,1,281,1,281,1,282,1,282,1,282,1,282,1,282,1,282, + 1,282,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283, + 1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,283, + 1,283,1,283,1,283,1,283,1,283,1,283,1,284,1,284,1,284,1,284,1,284, + 1,284,1,284,1,285,1,285,1,285,1,285,1,285,1,285,1,286,1,286,1,286, + 1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,287,1,287,1,287,1,287, + 1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287, + 1,287,1,287,1,287,1,287,1,287,1,287,1,288,1,288,1,288,1,288,1,288, + 1,288,1,288,1,288,1,288,1,288,1,288,1,288,1,288,1,288,1,288,1,288, + 1,288,1,288,1,288,1,288,1,289,1,289,1,289,1,289,1,289,1,289,1,289, + 1,289,1,289,1,289,1,289,1,289,1,289,1,289,1,290,1,290,1,290,1,290, + 1,290,1,290,1,290,1,290,1,290,1,290,1,290,1,290,1,290,1,290,1,290, + 1,290,1,290,1,290,1,290,1,290,1,290,1,291,1,291,1,291,1,291,1,291, + 1,291,1,291,1,291,1,292,1,292,1,292,1,292,1,292,1,292,1,292,1,292, + 1,292,1,292,1,292,1,292,1,292,1,292,1,292,1,292,1,292,1,292,1,293, + 1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293, + 1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293,1,293, + 1,293,1,294,1,294,1,294,1,294,1,294,1,294,1,294,1,294,1,294,1,294, + 1,294,1,294,1,294,1,294,1,294,1,295,1,295,1,295,1,295,1,295,1,295, + 1,295,1,295,1,295,1,295,1,295,1,295,1,295,1,295,1,295,1,295,1,295, + 1,295,1,295,1,295,1,295,1,296,1,296,1,296,1,296,1,296,1,296,1,296, + 1,296,1,296,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297, + 1,297,1,297,1,297,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298, + 1,298,1,298,1,298,1,298,1,298,1,298,1,299,1,299,1,299,1,299,1,299, + 1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,300, + 1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300, + 1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,301,1,301,1,301,1,301, + 1,301,1,301,1,301,1,301,1,302,1,302,1,302,1,302,1,302,1,303,1,303, + 1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,304, + 1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,305,1,305, + 1,305,1,305,1,305,1,306,1,306,1,306,1,306,1,306,1,306,1,306,1,306, + 1,306,1,306,1,306,1,306,1,306,1,306,1,306,1,306,1,306,1,307,1,307, + 1,307,1,307,1,307,1,307,1,307,1,307,1,307,1,307,1,308,1,308,1,308, + 1,308,1,308,1,308,1,308,1,308,1,308,1,309,1,309,1,309,1,309,1,309, + 1,309,1,309,1,309,1,309,1,309,1,310,1,310,1,310,1,310,1,310,1,310, + 1,310,1,310,1,310,1,310,1,310,1,310,1,310,1,310,1,310,1,310,1,310, + 1,310,1,311,1,311,1,312,1,312,1,313,1,313,1,314,1,314,1,315,1,315, + 1,316,1,316,1,316,1,316,1,317,1,317,1,317,1,317,1,318,1,318,1,319, + 1,319,1,320,1,320,1,321,1,321,1,322,1,322,1,323,1,323,1,324,1,324, + 1,325,1,325,1,326,1,326,1,327,1,327,1,328,1,328,1,329,1,329,1,330, + 1,330,1,331,1,331,1,332,1,332,1,333,1,333,1,334,1,334,1,335,1,335, + 1,336,1,336,1,337,1,337,1,338,1,338,1,339,1,339,1,340,1,340,1,341, + 1,341,1,341,1,342,1,342,1,343,4,343,3620,8,343,11,343,12,343,3621, + 1,344,1,344,1,344,1,344,1,344,4,344,3629,8,344,11,344,12,344,3630, + 1,344,1,344,1,344,1,344,1,344,1,344,4,344,3639,8,344,11,344,12,344, + 3640,3,344,3643,8,344,1,345,4,345,3646,8,345,11,345,12,345,3647, + 3,345,3650,8,345,1,345,1,345,4,345,3654,8,345,11,345,12,345,3655, + 1,345,4,345,3659,8,345,11,345,12,345,3660,1,345,1,345,1,345,1,345, + 4,345,3667,8,345,11,345,12,345,3668,3,345,3671,8,345,1,345,1,345, + 4,345,3675,8,345,11,345,12,345,3676,1,345,1,345,1,345,4,345,3682, + 8,345,11,345,12,345,3683,1,345,1,345,3,345,3688,8,345,1,346,1,346, + 1,346,1,347,1,347,1,348,1,348,1,349,1,349,1,350,1,350,1,351,1,351, + 3,351,3703,8,351,1,351,4,351,3706,8,351,11,351,12,351,3707,1,352, + 4,352,3711,8,352,11,352,12,352,3712,1,352,5,352,3716,8,352,10,352, + 12,352,3719,9,352,1,353,1,353,1,353,1,353,1,353,1,353,5,353,3727, + 8,353,10,353,12,353,3730,9,353,1,353,1,353,1,354,1,354,1,354,1,354, + 1,354,1,354,5,354,3740,8,354,10,354,12,354,3743,9,354,1,354,1,354, + 1,355,1,355,1,355,1,355,1,355,1,355,5,355,3753,8,355,10,355,12,355, + 3756,9,355,1,355,1,355,1,356,1,356,1,357,1,357,1,358,1,358,1,358, + 4,358,3767,8,358,11,358,12,358,3768,1,358,1,358,1,359,1,359,1,359, + 1,359,2,735,748,0,360,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19, + 10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41, + 21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63, + 32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85, + 43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53, + 107,54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125, + 63,127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72, + 145,73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163, + 82,165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91, + 183,92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100, + 201,101,203,102,205,103,207,104,209,105,211,106,213,107,215,108, + 217,109,219,110,221,111,223,112,225,113,227,114,229,115,231,116, + 233,117,235,118,237,119,239,120,241,121,243,122,245,123,247,124, + 249,125,251,126,253,127,255,128,257,129,259,130,261,131,263,132, + 265,133,267,134,269,135,271,136,273,137,275,138,277,139,279,140, + 281,141,283,142,285,143,287,144,289,145,291,146,293,147,295,148, + 297,149,299,150,301,151,303,152,305,153,307,154,309,155,311,156, + 313,157,315,158,317,159,319,160,321,161,323,162,325,163,327,164, + 329,165,331,166,333,167,335,168,337,169,339,170,341,171,343,172, + 345,173,347,174,349,175,351,176,353,177,355,178,357,179,359,180, + 361,181,363,182,365,183,367,184,369,185,371,186,373,187,375,188, + 377,189,379,190,381,191,383,192,385,193,387,194,389,195,391,196, + 393,197,395,198,397,199,399,200,401,201,403,202,405,203,407,204, + 409,205,411,206,413,207,415,208,417,209,419,210,421,211,423,212, + 425,213,427,214,429,215,431,216,433,217,435,218,437,219,439,220, + 441,221,443,222,445,223,447,224,449,225,451,226,453,227,455,228, + 457,229,459,230,461,231,463,232,465,233,467,234,469,235,471,236, + 473,237,475,238,477,239,479,240,481,241,483,242,485,243,487,244, + 489,245,491,246,493,247,495,248,497,249,499,250,501,251,503,252, + 505,253,507,254,509,255,511,256,513,257,515,258,517,259,519,260, + 521,261,523,262,525,263,527,264,529,265,531,266,533,267,535,268, + 537,269,539,270,541,271,543,272,545,273,547,274,549,275,551,276, + 553,277,555,278,557,279,559,280,561,281,563,282,565,283,567,284, + 569,285,571,286,573,287,575,288,577,289,579,290,581,291,583,292, + 585,293,587,294,589,295,591,296,593,297,595,298,597,299,599,300, + 601,301,603,302,605,303,607,304,609,305,611,306,613,307,615,308, + 617,309,619,310,621,311,623,312,625,313,627,314,629,315,631,316, + 633,317,635,318,637,319,639,320,641,321,643,322,645,323,647,324, + 649,325,651,326,653,327,655,328,657,329,659,330,661,331,663,332, + 665,333,667,334,669,335,671,336,673,337,675,338,677,339,679,340, + 681,341,683,342,685,343,687,344,689,345,691,346,693,347,695,348, + 697,349,699,350,701,351,703,0,705,0,707,0,709,0,711,0,713,0,715, + 0,717,0,719,352,1,0,37,3,0,9,10,13,13,32,32,2,0,10,10,13,13,2,0, + 65,65,97,97,2,0,76,76,108,108,2,0,78,78,110,110,2,0,68,68,100,100, + 2,0,83,83,115,115,2,0,67,67,99,99,2,0,66,66,98,98,2,0,79,79,111, + 111,2,0,69,69,101,101,2,0,84,84,116,116,2,0,87,87,119,119,2,0,89, + 89,121,121,2,0,82,82,114,114,2,0,85,85,117,117,2,0,77,77,109,109, + 2,0,73,73,105,105,2,0,88,88,120,120,2,0,70,70,102,102,2,0,71,71, + 103,103,2,0,80,80,112,112,2,0,72,72,104,104,2,0,86,86,118,118,2, + 0,74,74,106,106,2,0,75,75,107,107,2,0,81,81,113,113,2,0,90,90,122, + 122,2,0,43,43,45,45,4,0,42,42,64,90,95,95,97,122,6,0,42,42,45,45, + 48,57,65,90,95,95,97,122,2,0,34,34,92,92,2,0,39,39,92,92,2,0,92, + 92,96,96,3,0,48,57,65,70,97,102,1,0,48,57,1,0,48,49,3806,0,1,1,0, + 0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0, + 0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0, + 0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0, + 0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0, + 0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0, + 0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0, + 0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0, + 0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0, + 0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0, + 0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0, + 0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111, + 1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0, + 0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1, + 0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0, + 139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0, + 0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157, + 1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0, + 0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0,175,1, + 0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0,0,0,0, + 185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0, + 0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203, + 1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0, + 0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1, + 0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,0,0, + 231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0, + 0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249, + 1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0, + 0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1, + 0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0, + 277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0, + 0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295, + 1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0, + 0,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1, + 0,0,0,0,315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0, + 323,1,0,0,0,0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0, + 0,0,0,333,1,0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341, + 1,0,0,0,0,343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0, + 0,351,1,0,0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1, + 0,0,0,0,361,1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0, + 369,1,0,0,0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1,0,0,0,0,377,1,0, + 0,0,0,379,1,0,0,0,0,381,1,0,0,0,0,383,1,0,0,0,0,385,1,0,0,0,0,387, + 1,0,0,0,0,389,1,0,0,0,0,391,1,0,0,0,0,393,1,0,0,0,0,395,1,0,0,0, + 0,397,1,0,0,0,0,399,1,0,0,0,0,401,1,0,0,0,0,403,1,0,0,0,0,405,1, + 0,0,0,0,407,1,0,0,0,0,409,1,0,0,0,0,411,1,0,0,0,0,413,1,0,0,0,0, + 415,1,0,0,0,0,417,1,0,0,0,0,419,1,0,0,0,0,421,1,0,0,0,0,423,1,0, + 0,0,0,425,1,0,0,0,0,427,1,0,0,0,0,429,1,0,0,0,0,431,1,0,0,0,0,433, + 1,0,0,0,0,435,1,0,0,0,0,437,1,0,0,0,0,439,1,0,0,0,0,441,1,0,0,0, + 0,443,1,0,0,0,0,445,1,0,0,0,0,447,1,0,0,0,0,449,1,0,0,0,0,451,1, + 0,0,0,0,453,1,0,0,0,0,455,1,0,0,0,0,457,1,0,0,0,0,459,1,0,0,0,0, + 461,1,0,0,0,0,463,1,0,0,0,0,465,1,0,0,0,0,467,1,0,0,0,0,469,1,0, + 0,0,0,471,1,0,0,0,0,473,1,0,0,0,0,475,1,0,0,0,0,477,1,0,0,0,0,479, + 1,0,0,0,0,481,1,0,0,0,0,483,1,0,0,0,0,485,1,0,0,0,0,487,1,0,0,0, + 0,489,1,0,0,0,0,491,1,0,0,0,0,493,1,0,0,0,0,495,1,0,0,0,0,497,1, + 0,0,0,0,499,1,0,0,0,0,501,1,0,0,0,0,503,1,0,0,0,0,505,1,0,0,0,0, + 507,1,0,0,0,0,509,1,0,0,0,0,511,1,0,0,0,0,513,1,0,0,0,0,515,1,0, + 0,0,0,517,1,0,0,0,0,519,1,0,0,0,0,521,1,0,0,0,0,523,1,0,0,0,0,525, + 1,0,0,0,0,527,1,0,0,0,0,529,1,0,0,0,0,531,1,0,0,0,0,533,1,0,0,0, + 0,535,1,0,0,0,0,537,1,0,0,0,0,539,1,0,0,0,0,541,1,0,0,0,0,543,1, + 0,0,0,0,545,1,0,0,0,0,547,1,0,0,0,0,549,1,0,0,0,0,551,1,0,0,0,0, + 553,1,0,0,0,0,555,1,0,0,0,0,557,1,0,0,0,0,559,1,0,0,0,0,561,1,0, + 0,0,0,563,1,0,0,0,0,565,1,0,0,0,0,567,1,0,0,0,0,569,1,0,0,0,0,571, + 1,0,0,0,0,573,1,0,0,0,0,575,1,0,0,0,0,577,1,0,0,0,0,579,1,0,0,0, + 0,581,1,0,0,0,0,583,1,0,0,0,0,585,1,0,0,0,0,587,1,0,0,0,0,589,1, + 0,0,0,0,591,1,0,0,0,0,593,1,0,0,0,0,595,1,0,0,0,0,597,1,0,0,0,0, + 599,1,0,0,0,0,601,1,0,0,0,0,603,1,0,0,0,0,605,1,0,0,0,0,607,1,0, + 0,0,0,609,1,0,0,0,0,611,1,0,0,0,0,613,1,0,0,0,0,615,1,0,0,0,0,617, + 1,0,0,0,0,619,1,0,0,0,0,621,1,0,0,0,0,623,1,0,0,0,0,625,1,0,0,0, + 0,627,1,0,0,0,0,629,1,0,0,0,0,631,1,0,0,0,0,633,1,0,0,0,0,635,1, + 0,0,0,0,637,1,0,0,0,0,639,1,0,0,0,0,641,1,0,0,0,0,643,1,0,0,0,0, + 645,1,0,0,0,0,647,1,0,0,0,0,649,1,0,0,0,0,651,1,0,0,0,0,653,1,0, + 0,0,0,655,1,0,0,0,0,657,1,0,0,0,0,659,1,0,0,0,0,661,1,0,0,0,0,663, + 1,0,0,0,0,665,1,0,0,0,0,667,1,0,0,0,0,669,1,0,0,0,0,671,1,0,0,0, + 0,673,1,0,0,0,0,675,1,0,0,0,0,677,1,0,0,0,0,679,1,0,0,0,0,681,1, + 0,0,0,0,683,1,0,0,0,0,685,1,0,0,0,0,687,1,0,0,0,0,689,1,0,0,0,0, + 691,1,0,0,0,0,693,1,0,0,0,0,695,1,0,0,0,0,697,1,0,0,0,0,699,1,0, + 0,0,0,701,1,0,0,0,0,719,1,0,0,0,1,722,1,0,0,0,3,728,1,0,0,0,5,742, + 1,0,0,0,7,785,1,0,0,0,9,789,1,0,0,0,11,793,1,0,0,0,13,797,1,0,0, + 0,15,800,1,0,0,0,17,804,1,0,0,0,19,812,1,0,0,0,21,820,1,0,0,0,23, + 823,1,0,0,0,25,828,1,0,0,0,27,833,1,0,0,0,29,839,1,0,0,0,31,847, + 1,0,0,0,33,856,1,0,0,0,35,863,1,0,0,0,37,868,1,0,0,0,39,877,1,0, + 0,0,41,886,1,0,0,0,43,893,1,0,0,0,45,898,1,0,0,0,47,905,1,0,0,0, + 49,911,1,0,0,0,51,917,1,0,0,0,53,923,1,0,0,0,55,928,1,0,0,0,57,934, + 1,0,0,0,59,941,1,0,0,0,61,944,1,0,0,0,63,950,1,0,0,0,65,954,1,0, + 0,0,67,962,1,0,0,0,69,965,1,0,0,0,71,970,1,0,0,0,73,975,1,0,0,0, + 75,980,1,0,0,0,77,985,1,0,0,0,79,991,1,0,0,0,81,996,1,0,0,0,83,1002, + 1,0,0,0,85,1010,1,0,0,0,87,1018,1,0,0,0,89,1022,1,0,0,0,91,1027, + 1,0,0,0,93,1033,1,0,0,0,95,1036,1,0,0,0,97,1039,1,0,0,0,99,1045, + 1,0,0,0,101,1051,1,0,0,0,103,1056,1,0,0,0,105,1066,1,0,0,0,107,1073, + 1,0,0,0,109,1079,1,0,0,0,111,1086,1,0,0,0,113,1091,1,0,0,0,115,1098, + 1,0,0,0,117,1103,1,0,0,0,119,1108,1,0,0,0,121,1114,1,0,0,0,123,1120, + 1,0,0,0,125,1125,1,0,0,0,127,1131,1,0,0,0,129,1137,1,0,0,0,131,1141, + 1,0,0,0,133,1147,1,0,0,0,135,1151,1,0,0,0,137,1155,1,0,0,0,139,1159, + 1,0,0,0,141,1167,1,0,0,0,143,1176,1,0,0,0,145,1185,1,0,0,0,147,1189, + 1,0,0,0,149,1196,1,0,0,0,151,1207,1,0,0,0,153,1219,1,0,0,0,155,1229, + 1,0,0,0,157,1234,1,0,0,0,159,1238,1,0,0,0,161,1243,1,0,0,0,163,1250, + 1,0,0,0,165,1259,1,0,0,0,167,1271,1,0,0,0,169,1278,1,0,0,0,171,1285, + 1,0,0,0,173,1290,1,0,0,0,175,1294,1,0,0,0,177,1299,1,0,0,0,179,1305, + 1,0,0,0,181,1313,1,0,0,0,183,1318,1,0,0,0,185,1337,1,0,0,0,187,1356, + 1,0,0,0,189,1370,1,0,0,0,191,1387,1,0,0,0,193,1399,1,0,0,0,195,1411, + 1,0,0,0,197,1427,1,0,0,0,199,1438,1,0,0,0,201,1449,1,0,0,0,203,1458, + 1,0,0,0,205,1469,1,0,0,0,207,1476,1,0,0,0,209,1480,1,0,0,0,211,1485, + 1,0,0,0,213,1489,1,0,0,0,215,1497,1,0,0,0,217,1503,1,0,0,0,219,1508, + 1,0,0,0,221,1513,1,0,0,0,223,1519,1,0,0,0,225,1524,1,0,0,0,227,1529, + 1,0,0,0,229,1537,1,0,0,0,231,1544,1,0,0,0,233,1554,1,0,0,0,235,1559, + 1,0,0,0,237,1570,1,0,0,0,239,1574,1,0,0,0,241,1579,1,0,0,0,243,1583, + 1,0,0,0,245,1589,1,0,0,0,247,1597,1,0,0,0,249,1605,1,0,0,0,251,1618, + 1,0,0,0,253,1631,1,0,0,0,255,1649,1,0,0,0,257,1654,1,0,0,0,259,1663, + 1,0,0,0,261,1675,1,0,0,0,263,1684,1,0,0,0,265,1693,1,0,0,0,267,1701, + 1,0,0,0,269,1712,1,0,0,0,271,1722,1,0,0,0,273,1732,1,0,0,0,275,1740, + 1,0,0,0,277,1747,1,0,0,0,279,1749,1,0,0,0,281,1753,1,0,0,0,283,1759, + 1,0,0,0,285,1767,1,0,0,0,287,1773,1,0,0,0,289,1783,1,0,0,0,291,1797, + 1,0,0,0,293,1808,1,0,0,0,295,1811,1,0,0,0,297,1818,1,0,0,0,299,1825, + 1,0,0,0,301,1834,1,0,0,0,303,1841,1,0,0,0,305,1844,1,0,0,0,307,1854, + 1,0,0,0,309,1869,1,0,0,0,311,1876,1,0,0,0,313,1880,1,0,0,0,315,1886, + 1,0,0,0,317,1891,1,0,0,0,319,1897,1,0,0,0,321,1903,1,0,0,0,323,1912, + 1,0,0,0,325,1921,1,0,0,0,327,1929,1,0,0,0,329,1939,1,0,0,0,331,1948, + 1,0,0,0,333,1952,1,0,0,0,335,1959,1,0,0,0,337,1970,1,0,0,0,339,1982, + 1,0,0,0,341,1985,1,0,0,0,343,1994,1,0,0,0,345,1998,1,0,0,0,347,2004, + 1,0,0,0,349,2012,1,0,0,0,351,2017,1,0,0,0,353,2025,1,0,0,0,355,2030, + 1,0,0,0,357,2036,1,0,0,0,359,2042,1,0,0,0,361,2050,1,0,0,0,363,2062, + 1,0,0,0,365,2067,1,0,0,0,367,2074,1,0,0,0,369,2078,1,0,0,0,371,2083, + 1,0,0,0,373,2088,1,0,0,0,375,2100,1,0,0,0,377,2108,1,0,0,0,379,2116, + 1,0,0,0,381,2125,1,0,0,0,383,2133,1,0,0,0,385,2137,1,0,0,0,387,2142, + 1,0,0,0,389,2151,1,0,0,0,391,2163,1,0,0,0,393,2175,1,0,0,0,395,2185, + 1,0,0,0,397,2194,1,0,0,0,399,2202,1,0,0,0,401,2213,1,0,0,0,403,2228, + 1,0,0,0,405,2234,1,0,0,0,407,2243,1,0,0,0,409,2252,1,0,0,0,411,2266, + 1,0,0,0,413,2268,1,0,0,0,415,2270,1,0,0,0,417,2273,1,0,0,0,419,2275, + 1,0,0,0,421,2277,1,0,0,0,423,2288,1,0,0,0,425,2293,1,0,0,0,427,2304, + 1,0,0,0,429,2319,1,0,0,0,431,2332,1,0,0,0,433,2344,1,0,0,0,435,2356, + 1,0,0,0,437,2364,1,0,0,0,439,2379,1,0,0,0,441,2385,1,0,0,0,443,2392, + 1,0,0,0,445,2409,1,0,0,0,447,2418,1,0,0,0,449,2431,1,0,0,0,451,2450, + 1,0,0,0,453,2465,1,0,0,0,455,2477,1,0,0,0,457,2487,1,0,0,0,459,2499, + 1,0,0,0,461,2507,1,0,0,0,463,2516,1,0,0,0,465,2528,1,0,0,0,467,2541, + 1,0,0,0,469,2558,1,0,0,0,471,2578,1,0,0,0,473,2591,1,0,0,0,475,2611, + 1,0,0,0,477,2622,1,0,0,0,479,2634,1,0,0,0,481,2648,1,0,0,0,483,2663, + 1,0,0,0,485,2677,1,0,0,0,487,2688,1,0,0,0,489,2700,1,0,0,0,491,2716, + 1,0,0,0,493,2723,1,0,0,0,495,2735,1,0,0,0,497,2746,1,0,0,0,499,2764, + 1,0,0,0,501,2777,1,0,0,0,503,2792,1,0,0,0,505,2798,1,0,0,0,507,2804, + 1,0,0,0,509,2810,1,0,0,0,511,2821,1,0,0,0,513,2833,1,0,0,0,515,2850, + 1,0,0,0,517,2856,1,0,0,0,519,2861,1,0,0,0,521,2867,1,0,0,0,523,2880, + 1,0,0,0,525,2894,1,0,0,0,527,2902,1,0,0,0,529,2909,1,0,0,0,531,2922, + 1,0,0,0,533,2933,1,0,0,0,535,2941,1,0,0,0,537,2955,1,0,0,0,539,2970, + 1,0,0,0,541,2977,1,0,0,0,543,2984,1,0,0,0,545,2992,1,0,0,0,547,3001, + 1,0,0,0,549,3024,1,0,0,0,551,3033,1,0,0,0,553,3050,1,0,0,0,555,3086, + 1,0,0,0,557,3092,1,0,0,0,559,3109,1,0,0,0,561,3126,1,0,0,0,563,3140, + 1,0,0,0,565,3157,1,0,0,0,567,3164,1,0,0,0,569,3191,1,0,0,0,571,3198, + 1,0,0,0,573,3204,1,0,0,0,575,3214,1,0,0,0,577,3235,1,0,0,0,579,3255, + 1,0,0,0,581,3269,1,0,0,0,583,3290,1,0,0,0,585,3298,1,0,0,0,587,3316, + 1,0,0,0,589,3340,1,0,0,0,591,3355,1,0,0,0,593,3376,1,0,0,0,595,3385, + 1,0,0,0,597,3397,1,0,0,0,599,3411,1,0,0,0,601,3426,1,0,0,0,603,3445, + 1,0,0,0,605,3453,1,0,0,0,607,3458,1,0,0,0,609,3470,1,0,0,0,611,3480, + 1,0,0,0,613,3485,1,0,0,0,615,3502,1,0,0,0,617,3512,1,0,0,0,619,3521, + 1,0,0,0,621,3531,1,0,0,0,623,3549,1,0,0,0,625,3551,1,0,0,0,627,3553, + 1,0,0,0,629,3555,1,0,0,0,631,3557,1,0,0,0,633,3559,1,0,0,0,635,3563, + 1,0,0,0,637,3567,1,0,0,0,639,3569,1,0,0,0,641,3571,1,0,0,0,643,3573, + 1,0,0,0,645,3575,1,0,0,0,647,3577,1,0,0,0,649,3579,1,0,0,0,651,3581, + 1,0,0,0,653,3583,1,0,0,0,655,3585,1,0,0,0,657,3587,1,0,0,0,659,3589, + 1,0,0,0,661,3591,1,0,0,0,663,3593,1,0,0,0,665,3595,1,0,0,0,667,3597, + 1,0,0,0,669,3599,1,0,0,0,671,3601,1,0,0,0,673,3603,1,0,0,0,675,3605, + 1,0,0,0,677,3607,1,0,0,0,679,3609,1,0,0,0,681,3611,1,0,0,0,683,3613, + 1,0,0,0,685,3616,1,0,0,0,687,3619,1,0,0,0,689,3642,1,0,0,0,691,3687, + 1,0,0,0,693,3689,1,0,0,0,695,3692,1,0,0,0,697,3694,1,0,0,0,699,3696, + 1,0,0,0,701,3698,1,0,0,0,703,3700,1,0,0,0,705,3710,1,0,0,0,707,3720, + 1,0,0,0,709,3733,1,0,0,0,711,3746,1,0,0,0,713,3759,1,0,0,0,715,3761, + 1,0,0,0,717,3763,1,0,0,0,719,3772,1,0,0,0,721,723,7,0,0,0,722,721, + 1,0,0,0,723,724,1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,726, + 1,0,0,0,726,727,6,0,0,0,727,2,1,0,0,0,728,729,5,47,0,0,729,730,5, + 42,0,0,730,731,5,33,0,0,731,733,1,0,0,0,732,734,9,0,0,0,733,732, + 1,0,0,0,734,735,1,0,0,0,735,736,1,0,0,0,735,733,1,0,0,0,736,737, + 1,0,0,0,737,738,5,42,0,0,738,739,5,47,0,0,739,740,1,0,0,0,740,741, + 6,1,1,0,741,4,1,0,0,0,742,743,5,47,0,0,743,744,5,42,0,0,744,748, + 1,0,0,0,745,747,9,0,0,0,746,745,1,0,0,0,747,750,1,0,0,0,748,749, + 1,0,0,0,748,746,1,0,0,0,749,751,1,0,0,0,750,748,1,0,0,0,751,752, + 5,42,0,0,752,753,5,47,0,0,753,754,1,0,0,0,754,755,6,2,0,0,755,6, + 1,0,0,0,756,757,5,45,0,0,757,758,5,45,0,0,758,761,5,32,0,0,759,761, + 5,35,0,0,760,756,1,0,0,0,760,759,1,0,0,0,761,765,1,0,0,0,762,764, + 8,1,0,0,763,762,1,0,0,0,764,767,1,0,0,0,765,763,1,0,0,0,765,766, + 1,0,0,0,766,773,1,0,0,0,767,765,1,0,0,0,768,770,5,13,0,0,769,768, + 1,0,0,0,769,770,1,0,0,0,770,771,1,0,0,0,771,774,5,10,0,0,772,774, + 5,0,0,1,773,769,1,0,0,0,773,772,1,0,0,0,774,786,1,0,0,0,775,776, + 5,45,0,0,776,777,5,45,0,0,777,783,1,0,0,0,778,780,5,13,0,0,779,778, + 1,0,0,0,779,780,1,0,0,0,780,781,1,0,0,0,781,784,5,10,0,0,782,784, + 5,0,0,1,783,779,1,0,0,0,783,782,1,0,0,0,784,786,1,0,0,0,785,760, + 1,0,0,0,785,775,1,0,0,0,786,787,1,0,0,0,787,788,6,3,0,0,788,8,1, + 0,0,0,789,790,7,2,0,0,790,791,7,3,0,0,791,792,7,3,0,0,792,10,1,0, + 0,0,793,794,7,2,0,0,794,795,7,4,0,0,795,796,7,5,0,0,796,12,1,0,0, + 0,797,798,7,2,0,0,798,799,7,6,0,0,799,14,1,0,0,0,800,801,7,2,0,0, + 801,802,7,6,0,0,802,803,7,7,0,0,803,16,1,0,0,0,804,805,7,8,0,0,805, + 806,7,9,0,0,806,807,7,9,0,0,807,808,7,3,0,0,808,809,7,10,0,0,809, + 810,7,2,0,0,810,811,7,4,0,0,811,18,1,0,0,0,812,813,7,8,0,0,813,814, + 7,10,0,0,814,815,7,11,0,0,815,816,7,12,0,0,816,817,7,10,0,0,817, + 818,7,10,0,0,818,819,7,4,0,0,819,20,1,0,0,0,820,821,7,8,0,0,821, + 822,7,13,0,0,822,22,1,0,0,0,823,824,7,7,0,0,824,825,7,2,0,0,825, + 826,7,6,0,0,826,827,7,10,0,0,827,24,1,0,0,0,828,829,7,7,0,0,829, + 830,7,2,0,0,830,831,7,6,0,0,831,832,7,11,0,0,832,26,1,0,0,0,833, + 834,7,7,0,0,834,835,7,14,0,0,835,836,7,9,0,0,836,837,7,6,0,0,837, + 838,7,6,0,0,838,28,1,0,0,0,839,840,7,7,0,0,840,841,7,9,0,0,841,842, + 7,3,0,0,842,843,7,15,0,0,843,844,7,16,0,0,844,845,7,4,0,0,845,846, + 7,6,0,0,846,30,1,0,0,0,847,848,7,5,0,0,848,849,7,2,0,0,849,850,7, + 11,0,0,850,851,7,10,0,0,851,852,7,11,0,0,852,853,7,17,0,0,853,854, + 7,16,0,0,854,855,7,10,0,0,855,32,1,0,0,0,856,857,7,5,0,0,857,858, + 7,10,0,0,858,859,7,3,0,0,859,860,7,10,0,0,860,861,7,11,0,0,861,862, + 7,10,0,0,862,34,1,0,0,0,863,864,7,5,0,0,864,865,7,10,0,0,865,866, + 7,6,0,0,866,867,7,7,0,0,867,36,1,0,0,0,868,869,7,5,0,0,869,870,7, + 10,0,0,870,871,7,6,0,0,871,872,7,7,0,0,872,873,7,14,0,0,873,874, + 7,17,0,0,874,875,7,8,0,0,875,876,7,10,0,0,876,38,1,0,0,0,877,878, + 7,5,0,0,878,879,7,17,0,0,879,880,7,6,0,0,880,881,7,11,0,0,881,882, + 7,17,0,0,882,883,7,4,0,0,883,884,7,7,0,0,884,885,7,11,0,0,885,40, + 1,0,0,0,886,887,7,5,0,0,887,888,7,9,0,0,888,889,7,15,0,0,889,890, + 7,8,0,0,890,891,7,3,0,0,891,892,7,10,0,0,892,42,1,0,0,0,893,894, + 7,10,0,0,894,895,7,3,0,0,895,896,7,6,0,0,896,897,7,10,0,0,897,44, + 1,0,0,0,898,899,7,10,0,0,899,900,7,18,0,0,900,901,7,17,0,0,901,902, + 7,6,0,0,902,903,7,11,0,0,903,904,7,6,0,0,904,46,1,0,0,0,905,906, + 7,19,0,0,906,907,7,2,0,0,907,908,7,3,0,0,908,909,7,6,0,0,909,910, + 7,10,0,0,910,48,1,0,0,0,911,912,7,19,0,0,912,913,7,3,0,0,913,914, + 7,9,0,0,914,915,7,2,0,0,915,916,7,11,0,0,916,50,1,0,0,0,917,918, + 7,19,0,0,918,919,7,17,0,0,919,920,7,14,0,0,920,921,7,6,0,0,921,922, + 7,11,0,0,922,52,1,0,0,0,923,924,7,19,0,0,924,925,7,14,0,0,925,926, + 7,9,0,0,926,927,7,16,0,0,927,54,1,0,0,0,928,929,7,20,0,0,929,930, + 7,14,0,0,930,931,7,9,0,0,931,932,7,15,0,0,932,933,7,21,0,0,933,56, + 1,0,0,0,934,935,7,22,0,0,935,936,7,2,0,0,936,937,7,23,0,0,937,938, + 7,17,0,0,938,939,7,4,0,0,939,940,7,20,0,0,940,58,1,0,0,0,941,942, + 7,17,0,0,942,943,7,4,0,0,943,60,1,0,0,0,944,945,7,17,0,0,945,946, + 7,4,0,0,946,947,7,4,0,0,947,948,7,10,0,0,948,949,7,14,0,0,949,62, + 1,0,0,0,950,951,7,17,0,0,951,952,7,4,0,0,952,953,7,11,0,0,953,64, + 1,0,0,0,954,955,7,17,0,0,955,956,7,4,0,0,956,957,7,11,0,0,957,958, + 7,10,0,0,958,959,7,20,0,0,959,960,7,10,0,0,960,961,7,14,0,0,961, + 66,1,0,0,0,962,963,7,17,0,0,963,964,7,6,0,0,964,68,1,0,0,0,965,966, + 7,24,0,0,966,967,7,9,0,0,967,968,7,17,0,0,968,969,7,4,0,0,969,70, + 1,0,0,0,970,971,7,3,0,0,971,972,7,2,0,0,972,973,7,6,0,0,973,974, + 7,11,0,0,974,72,1,0,0,0,975,976,7,3,0,0,976,977,7,10,0,0,977,978, + 7,19,0,0,978,979,7,11,0,0,979,74,1,0,0,0,980,981,7,3,0,0,981,982, + 7,17,0,0,982,983,7,25,0,0,983,984,7,10,0,0,984,76,1,0,0,0,985,986, + 7,3,0,0,986,987,7,17,0,0,987,988,7,16,0,0,988,989,7,17,0,0,989,990, + 7,11,0,0,990,78,1,0,0,0,991,992,7,3,0,0,992,993,7,9,0,0,993,994, + 7,4,0,0,994,995,7,20,0,0,995,80,1,0,0,0,996,997,7,16,0,0,997,998, + 7,2,0,0,998,999,7,11,0,0,999,1000,7,7,0,0,1000,1001,7,22,0,0,1001, + 82,1,0,0,0,1002,1003,7,4,0,0,1003,1004,7,2,0,0,1004,1005,7,11,0, + 0,1005,1006,7,15,0,0,1006,1007,7,14,0,0,1007,1008,7,2,0,0,1008,1009, + 7,3,0,0,1009,84,1,0,0,0,1010,1011,7,16,0,0,1011,1012,7,17,0,0,1012, + 1013,7,6,0,0,1013,1014,7,6,0,0,1014,1015,7,17,0,0,1015,1016,7,4, + 0,0,1016,1017,7,20,0,0,1017,86,1,0,0,0,1018,1019,7,4,0,0,1019,1020, + 7,9,0,0,1020,1021,7,11,0,0,1021,88,1,0,0,0,1022,1023,7,4,0,0,1023, + 1024,7,15,0,0,1024,1025,7,3,0,0,1025,1026,7,3,0,0,1026,90,1,0,0, + 0,1027,1028,7,4,0,0,1028,1029,7,15,0,0,1029,1030,7,3,0,0,1030,1031, + 7,3,0,0,1031,1032,7,6,0,0,1032,92,1,0,0,0,1033,1034,7,9,0,0,1034, + 1035,7,4,0,0,1035,94,1,0,0,0,1036,1037,7,9,0,0,1037,1038,7,14,0, + 0,1038,96,1,0,0,0,1039,1040,7,9,0,0,1040,1041,7,14,0,0,1041,1042, + 7,5,0,0,1042,1043,7,10,0,0,1043,1044,7,14,0,0,1044,98,1,0,0,0,1045, + 1046,7,9,0,0,1046,1047,7,15,0,0,1047,1048,7,11,0,0,1048,1049,7,10, + 0,0,1049,1050,7,14,0,0,1050,100,1,0,0,0,1051,1052,7,9,0,0,1052,1053, + 7,23,0,0,1053,1054,7,10,0,0,1054,1055,7,14,0,0,1055,102,1,0,0,0, + 1056,1057,7,21,0,0,1057,1058,7,2,0,0,1058,1059,7,14,0,0,1059,1060, + 7,11,0,0,1060,1061,7,17,0,0,1061,1062,7,11,0,0,1062,1063,7,17,0, + 0,1063,1064,7,9,0,0,1064,1065,7,4,0,0,1065,104,1,0,0,0,1066,1067, + 7,14,0,0,1067,1068,7,10,0,0,1068,1069,7,20,0,0,1069,1070,7,10,0, + 0,1070,1071,7,18,0,0,1071,1072,7,21,0,0,1072,106,1,0,0,0,1073,1074, + 7,14,0,0,1074,1075,7,17,0,0,1075,1076,7,20,0,0,1076,1077,7,22,0, + 0,1077,1078,7,11,0,0,1078,108,1,0,0,0,1079,1080,7,6,0,0,1080,1081, + 7,10,0,0,1081,1082,7,3,0,0,1082,1083,7,10,0,0,1083,1084,7,7,0,0, + 1084,1085,7,11,0,0,1085,110,1,0,0,0,1086,1087,7,6,0,0,1087,1088, + 7,22,0,0,1088,1089,7,9,0,0,1089,1090,7,12,0,0,1090,112,1,0,0,0,1091, + 1092,7,6,0,0,1092,1093,7,11,0,0,1093,1094,7,14,0,0,1094,1095,7,17, + 0,0,1095,1096,7,4,0,0,1096,1097,7,20,0,0,1097,114,1,0,0,0,1098,1099, + 7,11,0,0,1099,1100,7,22,0,0,1100,1101,7,10,0,0,1101,1102,7,4,0,0, + 1102,116,1,0,0,0,1103,1104,7,11,0,0,1104,1105,7,14,0,0,1105,1106, + 7,15,0,0,1106,1107,7,10,0,0,1107,118,1,0,0,0,1108,1109,7,15,0,0, + 1109,1110,7,4,0,0,1110,1111,7,17,0,0,1111,1112,7,9,0,0,1112,1113, + 7,4,0,0,1113,120,1,0,0,0,1114,1115,7,15,0,0,1115,1116,7,6,0,0,1116, + 1117,7,17,0,0,1117,1118,7,4,0,0,1118,1119,7,20,0,0,1119,122,1,0, + 0,0,1120,1121,7,12,0,0,1121,1122,7,22,0,0,1122,1123,7,10,0,0,1123, + 1124,7,4,0,0,1124,124,1,0,0,0,1125,1126,7,12,0,0,1126,1127,7,22, + 0,0,1127,1128,7,10,0,0,1128,1129,7,14,0,0,1129,1130,7,10,0,0,1130, + 126,1,0,0,0,1131,1132,7,16,0,0,1132,1133,7,17,0,0,1133,1134,7,4, + 0,0,1134,1135,7,15,0,0,1135,1136,7,6,0,0,1136,128,1,0,0,0,1137,1138, + 7,2,0,0,1138,1139,7,23,0,0,1139,1140,7,20,0,0,1140,130,1,0,0,0,1141, + 1142,7,7,0,0,1142,1143,7,9,0,0,1143,1144,7,15,0,0,1144,1145,7,4, + 0,0,1145,1146,7,11,0,0,1146,132,1,0,0,0,1147,1148,7,16,0,0,1148, + 1149,7,2,0,0,1149,1150,7,18,0,0,1150,134,1,0,0,0,1151,1152,7,16, + 0,0,1152,1153,7,17,0,0,1153,1154,7,4,0,0,1154,136,1,0,0,0,1155,1156, + 7,6,0,0,1156,1157,7,15,0,0,1157,1158,7,16,0,0,1158,138,1,0,0,0,1159, + 1160,7,23,0,0,1160,1161,7,2,0,0,1161,1162,7,14,0,0,1162,1163,5,95, + 0,0,1163,1164,7,21,0,0,1164,1165,7,9,0,0,1165,1166,7,21,0,0,1166, + 140,1,0,0,0,1167,1168,7,23,0,0,1168,1169,7,2,0,0,1169,1170,7,14, + 0,0,1170,1171,5,95,0,0,1171,1172,7,6,0,0,1172,1173,7,2,0,0,1173, + 1174,7,16,0,0,1174,1175,7,21,0,0,1175,142,1,0,0,0,1176,1177,7,23, + 0,0,1177,1178,7,2,0,0,1178,1179,7,14,0,0,1179,1180,7,17,0,0,1180, + 1181,7,2,0,0,1181,1182,7,4,0,0,1182,1183,7,7,0,0,1183,1184,7,10, + 0,0,1184,144,1,0,0,0,1185,1186,7,6,0,0,1186,1187,7,11,0,0,1187,1188, + 7,5,0,0,1188,146,1,0,0,0,1189,1190,7,6,0,0,1190,1191,7,11,0,0,1191, + 1192,7,5,0,0,1192,1193,7,5,0,0,1193,1194,7,10,0,0,1194,1195,7,23, + 0,0,1195,148,1,0,0,0,1196,1197,7,6,0,0,1197,1198,7,11,0,0,1198,1199, + 7,5,0,0,1199,1200,7,5,0,0,1200,1201,7,10,0,0,1201,1202,7,23,0,0, + 1202,1203,5,95,0,0,1203,1204,7,21,0,0,1204,1205,7,9,0,0,1205,1206, + 7,21,0,0,1206,150,1,0,0,0,1207,1208,7,6,0,0,1208,1209,7,11,0,0,1209, + 1210,7,5,0,0,1210,1211,7,5,0,0,1211,1212,7,10,0,0,1212,1213,7,23, + 0,0,1213,1214,5,95,0,0,1214,1215,7,6,0,0,1215,1216,7,2,0,0,1216, + 1217,7,16,0,0,1217,1218,7,21,0,0,1218,152,1,0,0,0,1219,1220,7,6, + 0,0,1220,1221,7,15,0,0,1221,1222,7,8,0,0,1222,1223,7,6,0,0,1223, + 1224,7,11,0,0,1224,1225,7,14,0,0,1225,1226,7,17,0,0,1226,1227,7, + 4,0,0,1227,1228,7,20,0,0,1228,154,1,0,0,0,1229,1230,7,11,0,0,1230, + 1231,7,14,0,0,1231,1232,7,17,0,0,1232,1233,7,16,0,0,1233,156,1,0, + 0,0,1234,1235,7,10,0,0,1235,1236,7,4,0,0,1236,1237,7,5,0,0,1237, + 158,1,0,0,0,1238,1239,7,19,0,0,1239,1240,7,15,0,0,1240,1241,7,3, + 0,0,1241,1242,7,3,0,0,1242,160,1,0,0,0,1243,1244,7,9,0,0,1244,1245, + 7,19,0,0,1245,1246,7,19,0,0,1246,1247,7,6,0,0,1247,1248,7,10,0,0, + 1248,1249,7,11,0,0,1249,162,1,0,0,0,1250,1251,7,17,0,0,1251,1252, + 7,4,0,0,1252,1253,7,11,0,0,1253,1254,7,10,0,0,1254,1255,7,14,0,0, + 1255,1256,7,23,0,0,1256,1257,7,2,0,0,1257,1258,7,3,0,0,1258,164, + 1,0,0,0,1259,1260,7,16,0,0,1260,1261,7,17,0,0,1261,1262,7,7,0,0, + 1262,1263,7,14,0,0,1263,1264,7,9,0,0,1264,1265,7,6,0,0,1265,1266, + 7,10,0,0,1266,1267,7,7,0,0,1267,1268,7,9,0,0,1268,1269,7,4,0,0,1269, + 1270,7,5,0,0,1270,166,1,0,0,0,1271,1272,7,6,0,0,1272,1273,7,10,0, + 0,1273,1274,7,7,0,0,1274,1275,7,9,0,0,1275,1276,7,4,0,0,1276,1277, + 7,5,0,0,1277,168,1,0,0,0,1278,1279,7,16,0,0,1279,1280,7,17,0,0,1280, + 1281,7,4,0,0,1281,1282,7,15,0,0,1282,1283,7,11,0,0,1283,1284,7,10, + 0,0,1284,170,1,0,0,0,1285,1286,7,22,0,0,1286,1287,7,9,0,0,1287,1288, + 7,15,0,0,1288,1289,7,14,0,0,1289,172,1,0,0,0,1290,1291,7,5,0,0,1291, + 1292,7,2,0,0,1292,1293,7,13,0,0,1293,174,1,0,0,0,1294,1295,7,12, + 0,0,1295,1296,7,10,0,0,1296,1297,7,10,0,0,1297,1298,7,25,0,0,1298, + 176,1,0,0,0,1299,1300,7,16,0,0,1300,1301,7,9,0,0,1301,1302,7,4,0, + 0,1302,1303,7,11,0,0,1303,1304,7,22,0,0,1304,178,1,0,0,0,1305,1306, + 7,26,0,0,1306,1307,7,15,0,0,1307,1308,7,2,0,0,1308,1309,7,14,0,0, + 1309,1310,7,11,0,0,1310,1311,7,10,0,0,1311,1312,7,14,0,0,1312,180, + 1,0,0,0,1313,1314,7,13,0,0,1314,1315,7,10,0,0,1315,1316,7,2,0,0, + 1316,1317,7,14,0,0,1317,182,1,0,0,0,1318,1319,7,6,0,0,1319,1320, + 7,10,0,0,1320,1321,7,7,0,0,1321,1322,7,9,0,0,1322,1323,7,4,0,0,1323, + 1324,7,5,0,0,1324,1325,5,95,0,0,1325,1326,7,16,0,0,1326,1327,7,17, + 0,0,1327,1328,7,7,0,0,1328,1329,7,14,0,0,1329,1330,7,9,0,0,1330, + 1331,7,6,0,0,1331,1332,7,10,0,0,1332,1333,7,7,0,0,1333,1334,7,9, + 0,0,1334,1335,7,4,0,0,1335,1336,7,5,0,0,1336,184,1,0,0,0,1337,1338, + 7,16,0,0,1338,1339,7,17,0,0,1339,1340,7,4,0,0,1340,1341,7,15,0,0, + 1341,1342,7,11,0,0,1342,1343,7,10,0,0,1343,1344,5,95,0,0,1344,1345, + 7,16,0,0,1345,1346,7,17,0,0,1346,1347,7,7,0,0,1347,1348,7,14,0,0, + 1348,1349,7,9,0,0,1349,1350,7,6,0,0,1350,1351,7,10,0,0,1351,1352, + 7,7,0,0,1352,1353,7,9,0,0,1353,1354,7,4,0,0,1354,1355,7,5,0,0,1355, + 186,1,0,0,0,1356,1357,7,16,0,0,1357,1358,7,17,0,0,1358,1359,7,4, + 0,0,1359,1360,7,15,0,0,1360,1361,7,11,0,0,1361,1362,7,10,0,0,1362, + 1363,5,95,0,0,1363,1364,7,6,0,0,1364,1365,7,10,0,0,1365,1366,7,7, + 0,0,1366,1367,7,9,0,0,1367,1368,7,4,0,0,1368,1369,7,5,0,0,1369,188, + 1,0,0,0,1370,1371,7,22,0,0,1371,1372,7,9,0,0,1372,1373,7,15,0,0, + 1373,1374,7,14,0,0,1374,1375,5,95,0,0,1375,1376,7,16,0,0,1376,1377, + 7,17,0,0,1377,1378,7,7,0,0,1378,1379,7,14,0,0,1379,1380,7,9,0,0, + 1380,1381,7,6,0,0,1381,1382,7,10,0,0,1382,1383,7,7,0,0,1383,1384, + 7,9,0,0,1384,1385,7,4,0,0,1385,1386,7,5,0,0,1386,190,1,0,0,0,1387, + 1388,7,22,0,0,1388,1389,7,9,0,0,1389,1390,7,15,0,0,1390,1391,7,14, + 0,0,1391,1392,5,95,0,0,1392,1393,7,6,0,0,1393,1394,7,10,0,0,1394, + 1395,7,7,0,0,1395,1396,7,9,0,0,1396,1397,7,4,0,0,1397,1398,7,5,0, + 0,1398,192,1,0,0,0,1399,1400,7,22,0,0,1400,1401,7,9,0,0,1401,1402, + 7,15,0,0,1402,1403,7,14,0,0,1403,1404,5,95,0,0,1404,1405,7,16,0, + 0,1405,1406,7,17,0,0,1406,1407,7,4,0,0,1407,1408,7,15,0,0,1408,1409, + 7,11,0,0,1409,1410,7,10,0,0,1410,194,1,0,0,0,1411,1412,7,5,0,0,1412, + 1413,7,2,0,0,1413,1414,7,13,0,0,1414,1415,5,95,0,0,1415,1416,7,16, + 0,0,1416,1417,7,17,0,0,1417,1418,7,7,0,0,1418,1419,7,14,0,0,1419, + 1420,7,9,0,0,1420,1421,7,6,0,0,1421,1422,7,10,0,0,1422,1423,7,7, + 0,0,1423,1424,7,9,0,0,1424,1425,7,4,0,0,1425,1426,7,5,0,0,1426,196, + 1,0,0,0,1427,1428,7,5,0,0,1428,1429,7,2,0,0,1429,1430,7,13,0,0,1430, + 1431,5,95,0,0,1431,1432,7,6,0,0,1432,1433,7,10,0,0,1433,1434,7,7, + 0,0,1434,1435,7,9,0,0,1435,1436,7,4,0,0,1436,1437,7,5,0,0,1437,198, + 1,0,0,0,1438,1439,7,5,0,0,1439,1440,7,2,0,0,1440,1441,7,13,0,0,1441, + 1442,5,95,0,0,1442,1443,7,16,0,0,1443,1444,7,17,0,0,1444,1445,7, + 4,0,0,1445,1446,7,15,0,0,1446,1447,7,11,0,0,1447,1448,7,10,0,0,1448, + 200,1,0,0,0,1449,1450,7,5,0,0,1450,1451,7,2,0,0,1451,1452,7,13,0, + 0,1452,1453,5,95,0,0,1453,1454,7,22,0,0,1454,1455,7,9,0,0,1455,1456, + 7,15,0,0,1456,1457,7,14,0,0,1457,202,1,0,0,0,1458,1459,7,13,0,0, + 1459,1460,7,10,0,0,1460,1461,7,2,0,0,1461,1462,7,14,0,0,1462,1463, + 5,95,0,0,1463,1464,7,16,0,0,1464,1465,7,9,0,0,1465,1466,7,4,0,0, + 1466,1467,7,11,0,0,1467,1468,7,22,0,0,1468,204,1,0,0,0,1469,1470, + 7,11,0,0,1470,1471,7,2,0,0,1471,1472,7,8,0,0,1472,1473,7,3,0,0,1473, + 1474,7,10,0,0,1474,1475,7,6,0,0,1475,206,1,0,0,0,1476,1477,7,2,0, + 0,1477,1478,7,8,0,0,1478,1479,7,6,0,0,1479,208,1,0,0,0,1480,1481, + 7,2,0,0,1481,1482,7,7,0,0,1482,1483,7,9,0,0,1483,1484,7,6,0,0,1484, + 210,1,0,0,0,1485,1486,7,2,0,0,1486,1487,7,5,0,0,1487,1488,7,5,0, + 0,1488,212,1,0,0,0,1489,1490,7,2,0,0,1490,1491,7,5,0,0,1491,1492, + 7,5,0,0,1492,1493,7,11,0,0,1493,1494,7,17,0,0,1494,1495,7,16,0,0, + 1495,1496,7,10,0,0,1496,214,1,0,0,0,1497,1498,7,2,0,0,1498,1499, + 7,6,0,0,1499,1500,7,7,0,0,1500,1501,7,17,0,0,1501,1502,7,17,0,0, + 1502,216,1,0,0,0,1503,1504,7,2,0,0,1504,1505,7,6,0,0,1505,1506,7, + 17,0,0,1506,1507,7,4,0,0,1507,218,1,0,0,0,1508,1509,7,2,0,0,1509, + 1510,7,11,0,0,1510,1511,7,2,0,0,1511,1512,7,4,0,0,1512,220,1,0,0, + 0,1513,1514,7,2,0,0,1514,1515,7,11,0,0,1515,1516,7,2,0,0,1516,1517, + 7,4,0,0,1517,1518,5,50,0,0,1518,222,1,0,0,0,1519,1520,7,7,0,0,1520, + 1521,7,8,0,0,1521,1522,7,14,0,0,1522,1523,7,11,0,0,1523,224,1,0, + 0,0,1524,1525,7,7,0,0,1525,1526,7,10,0,0,1526,1527,7,17,0,0,1527, + 1528,7,3,0,0,1528,226,1,0,0,0,1529,1530,7,7,0,0,1530,1531,7,10,0, + 0,1531,1532,7,17,0,0,1532,1533,7,3,0,0,1533,1534,7,17,0,0,1534,1535, + 7,4,0,0,1535,1536,7,20,0,0,1536,228,1,0,0,0,1537,1538,7,7,0,0,1538, + 1539,7,9,0,0,1539,1540,7,4,0,0,1540,1541,7,7,0,0,1541,1542,7,2,0, + 0,1542,1543,7,11,0,0,1543,230,1,0,0,0,1544,1545,7,7,0,0,1545,1546, + 7,9,0,0,1546,1547,7,4,0,0,1547,1548,7,7,0,0,1548,1549,7,2,0,0,1549, + 1550,7,11,0,0,1550,1551,5,95,0,0,1551,1552,7,12,0,0,1552,1553,7, + 6,0,0,1553,232,1,0,0,0,1554,1555,7,7,0,0,1555,1556,7,9,0,0,1556, + 1557,7,4,0,0,1557,1558,7,23,0,0,1558,234,1,0,0,0,1559,1560,7,7,0, + 0,1560,1561,7,9,0,0,1561,1562,7,4,0,0,1562,1563,7,23,0,0,1563,1564, + 7,10,0,0,1564,1565,7,14,0,0,1565,1566,7,11,0,0,1566,1567,5,95,0, + 0,1567,1568,7,11,0,0,1568,1569,7,27,0,0,1569,236,1,0,0,0,1570,1571, + 7,7,0,0,1571,1572,7,9,0,0,1572,1573,7,6,0,0,1573,238,1,0,0,0,1574, + 1575,7,7,0,0,1575,1576,7,9,0,0,1576,1577,7,6,0,0,1577,1578,7,22, + 0,0,1578,240,1,0,0,0,1579,1580,7,7,0,0,1580,1581,7,9,0,0,1581,1582, + 7,11,0,0,1582,242,1,0,0,0,1583,1584,7,7,0,0,1584,1585,7,14,0,0,1585, + 1586,7,7,0,0,1586,1587,5,51,0,0,1587,1588,5,50,0,0,1588,244,1,0, + 0,0,1589,1590,7,7,0,0,1590,1591,7,15,0,0,1591,1592,7,14,0,0,1592, + 1593,7,5,0,0,1593,1594,7,2,0,0,1594,1595,7,11,0,0,1595,1596,7,10, + 0,0,1596,246,1,0,0,0,1597,1598,7,7,0,0,1598,1599,7,15,0,0,1599,1600, + 7,14,0,0,1600,1601,7,11,0,0,1601,1602,7,17,0,0,1602,1603,7,16,0, + 0,1603,1604,7,10,0,0,1604,248,1,0,0,0,1605,1606,7,7,0,0,1606,1607, + 7,15,0,0,1607,1608,7,14,0,0,1608,1609,7,14,0,0,1609,1610,7,10,0, + 0,1610,1611,7,4,0,0,1611,1612,7,11,0,0,1612,1613,5,95,0,0,1613,1614, + 7,5,0,0,1614,1615,7,2,0,0,1615,1616,7,11,0,0,1616,1617,7,10,0,0, + 1617,250,1,0,0,0,1618,1619,7,7,0,0,1619,1620,7,15,0,0,1620,1621, + 7,14,0,0,1621,1622,7,14,0,0,1622,1623,7,10,0,0,1623,1624,7,4,0,0, + 1624,1625,7,11,0,0,1625,1626,5,95,0,0,1626,1627,7,11,0,0,1627,1628, + 7,17,0,0,1628,1629,7,16,0,0,1629,1630,7,10,0,0,1630,252,1,0,0,0, + 1631,1632,7,7,0,0,1632,1633,7,15,0,0,1633,1634,7,14,0,0,1634,1635, + 7,14,0,0,1635,1636,7,10,0,0,1636,1637,7,4,0,0,1637,1638,7,11,0,0, + 1638,1639,5,95,0,0,1639,1640,7,11,0,0,1640,1641,7,17,0,0,1641,1642, + 7,16,0,0,1642,1643,7,10,0,0,1643,1644,7,6,0,0,1644,1645,7,11,0,0, + 1645,1646,7,2,0,0,1646,1647,7,16,0,0,1647,1648,7,21,0,0,1648,254, + 1,0,0,0,1649,1650,7,5,0,0,1650,1651,7,2,0,0,1651,1652,7,11,0,0,1652, + 1653,7,10,0,0,1653,256,1,0,0,0,1654,1655,7,5,0,0,1655,1656,7,2,0, + 0,1656,1657,7,11,0,0,1657,1658,7,10,0,0,1658,1659,5,95,0,0,1659, + 1660,7,2,0,0,1660,1661,7,5,0,0,1661,1662,7,5,0,0,1662,258,1,0,0, + 0,1663,1664,7,5,0,0,1664,1665,7,2,0,0,1665,1666,7,11,0,0,1666,1667, + 7,10,0,0,1667,1668,5,95,0,0,1668,1669,7,19,0,0,1669,1670,7,9,0,0, + 1670,1671,7,14,0,0,1671,1672,7,16,0,0,1672,1673,7,2,0,0,1673,1674, + 7,11,0,0,1674,260,1,0,0,0,1675,1676,7,5,0,0,1676,1677,7,2,0,0,1677, + 1678,7,11,0,0,1678,1679,7,10,0,0,1679,1680,5,95,0,0,1680,1681,7, + 6,0,0,1681,1682,7,15,0,0,1682,1683,7,8,0,0,1683,262,1,0,0,0,1684, + 1685,7,5,0,0,1685,1686,7,2,0,0,1686,1687,7,11,0,0,1687,1688,7,10, + 0,0,1688,1689,7,5,0,0,1689,1690,7,17,0,0,1690,1691,7,19,0,0,1691, + 1692,7,19,0,0,1692,264,1,0,0,0,1693,1694,7,5,0,0,1694,1695,7,2,0, + 0,1695,1696,7,13,0,0,1696,1697,7,4,0,0,1697,1698,7,2,0,0,1698,1699, + 7,16,0,0,1699,1700,7,10,0,0,1700,266,1,0,0,0,1701,1702,7,5,0,0,1702, + 1703,7,2,0,0,1703,1704,7,13,0,0,1704,1705,7,9,0,0,1705,1706,7,19, + 0,0,1706,1707,7,16,0,0,1707,1708,7,9,0,0,1708,1709,7,4,0,0,1709, + 1710,7,11,0,0,1710,1711,7,22,0,0,1711,268,1,0,0,0,1712,1713,7,5, + 0,0,1713,1714,7,2,0,0,1714,1715,7,13,0,0,1715,1716,7,9,0,0,1716, + 1717,7,19,0,0,1717,1718,7,12,0,0,1718,1719,7,10,0,0,1719,1720,7, + 10,0,0,1720,1721,7,25,0,0,1721,270,1,0,0,0,1722,1723,7,5,0,0,1723, + 1724,7,2,0,0,1724,1725,7,13,0,0,1725,1726,7,9,0,0,1726,1727,7,19, + 0,0,1727,1728,7,13,0,0,1728,1729,7,10,0,0,1729,1730,7,2,0,0,1730, + 1731,7,14,0,0,1731,272,1,0,0,0,1732,1733,7,5,0,0,1733,1734,7,10, + 0,0,1734,1735,7,20,0,0,1735,1736,7,14,0,0,1736,1737,7,10,0,0,1737, + 1738,7,10,0,0,1738,1739,7,6,0,0,1739,274,1,0,0,0,1740,1741,7,5,0, + 0,1741,1742,7,17,0,0,1742,1743,7,23,0,0,1743,1744,7,17,0,0,1744, + 1745,7,5,0,0,1745,1746,7,10,0,0,1746,276,1,0,0,0,1747,1748,7,10, + 0,0,1748,278,1,0,0,0,1749,1750,7,10,0,0,1750,1751,7,18,0,0,1751, + 1752,7,21,0,0,1752,280,1,0,0,0,1753,1754,7,10,0,0,1754,1755,7,18, + 0,0,1755,1756,7,21,0,0,1756,1757,7,16,0,0,1757,1758,5,49,0,0,1758, + 282,1,0,0,0,1759,1760,7,10,0,0,1760,1761,7,18,0,0,1761,1762,7,11, + 0,0,1762,1763,7,14,0,0,1763,1764,7,2,0,0,1764,1765,7,7,0,0,1765, + 1766,7,11,0,0,1766,284,1,0,0,0,1767,1768,7,19,0,0,1768,1769,7,3, + 0,0,1769,1770,7,9,0,0,1770,1771,7,9,0,0,1771,1772,7,14,0,0,1772, + 286,1,0,0,0,1773,1774,7,19,0,0,1774,1775,7,14,0,0,1775,1776,7,9, + 0,0,1776,1777,7,16,0,0,1777,1778,5,95,0,0,1778,1779,7,5,0,0,1779, + 1780,7,2,0,0,1780,1781,7,13,0,0,1781,1782,7,6,0,0,1782,288,1,0,0, + 0,1783,1784,7,19,0,0,1784,1785,7,14,0,0,1785,1786,7,9,0,0,1786,1787, + 7,16,0,0,1787,1788,5,95,0,0,1788,1789,7,15,0,0,1789,1790,7,4,0,0, + 1790,1791,7,17,0,0,1791,1792,7,18,0,0,1792,1793,7,11,0,0,1793,1794, + 7,17,0,0,1794,1795,7,16,0,0,1795,1796,7,10,0,0,1796,290,1,0,0,0, + 1797,1798,7,20,0,0,1798,1799,7,10,0,0,1799,1800,7,11,0,0,1800,1801, + 5,95,0,0,1801,1802,7,19,0,0,1802,1803,7,9,0,0,1803,1804,7,14,0,0, + 1804,1805,7,16,0,0,1805,1806,7,2,0,0,1806,1807,7,11,0,0,1807,292, + 1,0,0,0,1808,1809,7,17,0,0,1809,1810,7,19,0,0,1810,294,1,0,0,0,1811, + 1812,7,17,0,0,1812,1813,7,19,0,0,1813,1814,7,4,0,0,1814,1815,7,15, + 0,0,1815,1816,7,3,0,0,1816,1817,7,3,0,0,1817,296,1,0,0,0,1818,1819, + 7,17,0,0,1819,1820,7,6,0,0,1820,1821,7,4,0,0,1821,1822,7,15,0,0, + 1822,1823,7,3,0,0,1823,1824,7,3,0,0,1824,298,1,0,0,0,1825,1826,7, + 3,0,0,1826,1827,7,2,0,0,1827,1828,7,6,0,0,1828,1829,7,11,0,0,1829, + 1830,5,95,0,0,1830,1831,7,5,0,0,1831,1832,7,2,0,0,1832,1833,7,13, + 0,0,1833,300,1,0,0,0,1834,1835,7,3,0,0,1835,1836,7,10,0,0,1836,1837, + 7,4,0,0,1837,1838,7,20,0,0,1838,1839,7,11,0,0,1839,1840,7,22,0,0, + 1840,302,1,0,0,0,1841,1842,7,3,0,0,1842,1843,7,4,0,0,1843,304,1, + 0,0,0,1844,1845,7,3,0,0,1845,1846,7,9,0,0,1846,1847,7,7,0,0,1847, + 1848,7,2,0,0,1848,1849,7,3,0,0,1849,1850,7,11,0,0,1850,1851,7,17, + 0,0,1851,1852,7,16,0,0,1852,1853,7,10,0,0,1853,306,1,0,0,0,1854, + 1855,7,3,0,0,1855,1856,7,9,0,0,1856,1857,7,7,0,0,1857,1858,7,2,0, + 0,1858,1859,7,3,0,0,1859,1860,7,11,0,0,1860,1861,7,17,0,0,1861,1862, + 7,16,0,0,1862,1863,7,10,0,0,1863,1864,7,6,0,0,1864,1865,7,11,0,0, + 1865,1866,7,2,0,0,1866,1867,7,16,0,0,1867,1868,7,21,0,0,1868,308, + 1,0,0,0,1869,1870,7,3,0,0,1870,1871,7,9,0,0,1871,1872,7,7,0,0,1872, + 1873,7,2,0,0,1873,1874,7,11,0,0,1874,1875,7,10,0,0,1875,310,1,0, + 0,0,1876,1877,7,3,0,0,1877,1878,7,9,0,0,1878,1879,7,20,0,0,1879, + 312,1,0,0,0,1880,1881,7,3,0,0,1881,1882,7,9,0,0,1882,1883,7,20,0, + 0,1883,1884,5,49,0,0,1884,1885,5,48,0,0,1885,314,1,0,0,0,1886,1887, + 7,3,0,0,1887,1888,7,9,0,0,1888,1889,7,20,0,0,1889,1890,5,50,0,0, + 1890,316,1,0,0,0,1891,1892,7,3,0,0,1892,1893,7,9,0,0,1893,1894,7, + 12,0,0,1894,1895,7,10,0,0,1895,1896,7,14,0,0,1896,318,1,0,0,0,1897, + 1898,7,3,0,0,1898,1899,7,11,0,0,1899,1900,7,14,0,0,1900,1901,7,17, + 0,0,1901,1902,7,16,0,0,1902,320,1,0,0,0,1903,1904,7,16,0,0,1904, + 1905,7,2,0,0,1905,1906,7,25,0,0,1906,1907,7,10,0,0,1907,1908,7,5, + 0,0,1908,1909,7,2,0,0,1909,1910,7,11,0,0,1910,1911,7,10,0,0,1911, + 322,1,0,0,0,1912,1913,7,16,0,0,1913,1914,7,2,0,0,1914,1915,7,25, + 0,0,1915,1916,7,10,0,0,1916,1917,7,11,0,0,1917,1918,7,17,0,0,1918, + 1919,7,16,0,0,1919,1920,7,10,0,0,1920,324,1,0,0,0,1921,1922,7,16, + 0,0,1922,1923,7,9,0,0,1923,1924,7,5,0,0,1924,1925,7,15,0,0,1925, + 1926,7,3,0,0,1926,1927,7,15,0,0,1927,1928,7,6,0,0,1928,326,1,0,0, + 0,1929,1930,7,16,0,0,1930,1931,7,9,0,0,1931,1932,7,4,0,0,1932,1933, + 7,11,0,0,1933,1934,7,22,0,0,1934,1935,7,4,0,0,1935,1936,7,2,0,0, + 1936,1937,7,16,0,0,1937,1938,7,10,0,0,1938,328,1,0,0,0,1939,1940, + 7,16,0,0,1940,1941,7,15,0,0,1941,1942,7,3,0,0,1942,1943,7,11,0,0, + 1943,1944,7,17,0,0,1944,1945,7,21,0,0,1945,1946,7,3,0,0,1946,1947, + 7,13,0,0,1947,330,1,0,0,0,1948,1949,7,4,0,0,1949,1950,7,9,0,0,1950, + 1951,7,12,0,0,1951,332,1,0,0,0,1952,1953,7,4,0,0,1953,1954,7,15, + 0,0,1954,1955,7,3,0,0,1955,1956,7,3,0,0,1956,1957,7,17,0,0,1957, + 1958,7,19,0,0,1958,334,1,0,0,0,1959,1960,7,21,0,0,1960,1961,7,10, + 0,0,1961,1962,7,14,0,0,1962,1963,7,17,0,0,1963,1964,7,9,0,0,1964, + 1965,7,5,0,0,1965,1966,5,95,0,0,1966,1967,7,2,0,0,1967,1968,7,5, + 0,0,1968,1969,7,5,0,0,1969,336,1,0,0,0,1970,1971,7,21,0,0,1971,1972, + 7,10,0,0,1972,1973,7,14,0,0,1973,1974,7,17,0,0,1974,1975,7,9,0,0, + 1975,1976,7,5,0,0,1976,1977,5,95,0,0,1977,1978,7,5,0,0,1978,1979, + 7,17,0,0,1979,1980,7,19,0,0,1980,1981,7,19,0,0,1981,338,1,0,0,0, + 1982,1983,7,21,0,0,1983,1984,7,17,0,0,1984,340,1,0,0,0,1985,1986, + 7,21,0,0,1986,1987,7,9,0,0,1987,1988,7,6,0,0,1988,1989,7,17,0,0, + 1989,1990,7,11,0,0,1990,1991,7,17,0,0,1991,1992,7,9,0,0,1992,1993, + 7,4,0,0,1993,342,1,0,0,0,1994,1995,7,21,0,0,1995,1996,7,9,0,0,1996, + 1997,7,12,0,0,1997,344,1,0,0,0,1998,1999,7,21,0,0,1999,2000,7,9, + 0,0,2000,2001,7,12,0,0,2001,2002,7,10,0,0,2002,2003,7,14,0,0,2003, + 346,1,0,0,0,2004,2005,7,14,0,0,2005,2006,7,2,0,0,2006,2007,7,5,0, + 0,2007,2008,7,17,0,0,2008,2009,7,2,0,0,2009,2010,7,4,0,0,2010,2011, + 7,6,0,0,2011,348,1,0,0,0,2012,2013,7,14,0,0,2013,2014,7,2,0,0,2014, + 2015,7,4,0,0,2015,2016,7,5,0,0,2016,350,1,0,0,0,2017,2018,7,14,0, + 0,2018,2019,7,10,0,0,2019,2020,7,21,0,0,2020,2021,7,3,0,0,2021,2022, + 7,2,0,0,2022,2023,7,7,0,0,2023,2024,7,10,0,0,2024,352,1,0,0,0,2025, + 2026,7,14,0,0,2026,2027,7,17,0,0,2027,2028,7,4,0,0,2028,2029,7,11, + 0,0,2029,354,1,0,0,0,2030,2031,7,14,0,0,2031,2032,7,9,0,0,2032,2033, + 7,15,0,0,2033,2034,7,4,0,0,2034,2035,7,5,0,0,2035,356,1,0,0,0,2036, + 2037,7,14,0,0,2037,2038,7,11,0,0,2038,2039,7,14,0,0,2039,2040,7, + 17,0,0,2040,2041,7,16,0,0,2041,358,1,0,0,0,2042,2043,7,14,0,0,2043, + 2044,7,10,0,0,2044,2045,7,23,0,0,2045,2046,7,10,0,0,2046,2047,7, + 14,0,0,2047,2048,7,6,0,0,2048,2049,7,10,0,0,2049,360,1,0,0,0,2050, + 2051,7,6,0,0,2051,2052,7,10,0,0,2052,2053,7,7,0,0,2053,2054,5,95, + 0,0,2054,2055,7,11,0,0,2055,2056,7,9,0,0,2056,2057,5,95,0,0,2057, + 2058,7,11,0,0,2058,2059,7,17,0,0,2059,2060,7,16,0,0,2060,2061,7, + 10,0,0,2061,362,1,0,0,0,2062,2063,7,6,0,0,2063,2064,7,17,0,0,2064, + 2065,7,20,0,0,2065,2066,7,4,0,0,2066,364,1,0,0,0,2067,2068,7,6,0, + 0,2068,2069,7,17,0,0,2069,2070,7,20,0,0,2070,2071,7,4,0,0,2071,2072, + 7,15,0,0,2072,2073,7,16,0,0,2073,366,1,0,0,0,2074,2075,7,6,0,0,2075, + 2076,7,17,0,0,2076,2077,7,4,0,0,2077,368,1,0,0,0,2078,2079,7,6,0, + 0,2079,2080,7,17,0,0,2080,2081,7,4,0,0,2081,2082,7,22,0,0,2082,370, + 1,0,0,0,2083,2084,7,6,0,0,2084,2085,7,26,0,0,2085,2086,7,14,0,0, + 2086,2087,7,11,0,0,2087,372,1,0,0,0,2088,2089,7,6,0,0,2089,2090, + 7,11,0,0,2090,2091,7,14,0,0,2091,2092,5,95,0,0,2092,2093,7,11,0, + 0,2093,2094,7,9,0,0,2094,2095,5,95,0,0,2095,2096,7,5,0,0,2096,2097, + 7,2,0,0,2097,2098,7,11,0,0,2098,2099,7,10,0,0,2099,374,1,0,0,0,2100, + 2101,7,6,0,0,2101,2102,7,15,0,0,2102,2103,7,8,0,0,2103,2104,7,5, + 0,0,2104,2105,7,2,0,0,2105,2106,7,11,0,0,2106,2107,7,10,0,0,2107, + 376,1,0,0,0,2108,2109,7,6,0,0,2109,2110,7,15,0,0,2110,2111,7,8,0, + 0,2111,2112,7,11,0,0,2112,2113,7,17,0,0,2113,2114,7,16,0,0,2114, + 2115,7,10,0,0,2115,378,1,0,0,0,2116,2117,7,6,0,0,2117,2118,7,15, + 0,0,2118,2119,7,8,0,0,2119,2120,7,11,0,0,2120,2121,7,14,0,0,2121, + 2122,7,2,0,0,2122,2123,7,7,0,0,2123,2124,7,11,0,0,2124,380,1,0,0, + 0,2125,2126,7,6,0,0,2126,2127,7,13,0,0,2127,2128,7,6,0,0,2128,2129, + 7,5,0,0,2129,2130,7,2,0,0,2130,2131,7,11,0,0,2131,2132,7,10,0,0, + 2132,382,1,0,0,0,2133,2134,7,11,0,0,2134,2135,7,2,0,0,2135,2136, + 7,4,0,0,2136,384,1,0,0,0,2137,2138,7,11,0,0,2138,2139,7,17,0,0,2139, + 2140,7,16,0,0,2140,2141,7,10,0,0,2141,386,1,0,0,0,2142,2143,7,11, + 0,0,2143,2144,7,17,0,0,2144,2145,7,16,0,0,2145,2146,7,10,0,0,2146, + 2147,7,5,0,0,2147,2148,7,17,0,0,2148,2149,7,19,0,0,2149,2150,7,19, + 0,0,2150,388,1,0,0,0,2151,2152,7,11,0,0,2152,2153,7,17,0,0,2153, + 2154,7,16,0,0,2154,2155,7,10,0,0,2155,2156,5,95,0,0,2156,2157,7, + 19,0,0,2157,2158,7,9,0,0,2158,2159,7,14,0,0,2159,2160,7,16,0,0,2160, + 2161,7,2,0,0,2161,2162,7,11,0,0,2162,390,1,0,0,0,2163,2164,7,11, + 0,0,2164,2165,7,17,0,0,2165,2166,7,16,0,0,2166,2167,7,10,0,0,2167, + 2168,5,95,0,0,2168,2169,7,11,0,0,2169,2170,7,9,0,0,2170,2171,5,95, + 0,0,2171,2172,7,6,0,0,2172,2173,7,10,0,0,2173,2174,7,7,0,0,2174, + 392,1,0,0,0,2175,2176,7,11,0,0,2176,2177,7,17,0,0,2177,2178,7,16, + 0,0,2178,2179,7,10,0,0,2179,2180,7,6,0,0,2180,2181,7,11,0,0,2181, + 2182,7,2,0,0,2182,2183,7,16,0,0,2183,2184,7,21,0,0,2184,394,1,0, + 0,0,2185,2186,7,11,0,0,2186,2187,7,14,0,0,2187,2188,7,15,0,0,2188, + 2189,7,4,0,0,2189,2190,7,7,0,0,2190,2191,7,2,0,0,2191,2192,7,11, + 0,0,2192,2193,7,10,0,0,2193,396,1,0,0,0,2194,2195,7,11,0,0,2195, + 2196,7,9,0,0,2196,2197,5,95,0,0,2197,2198,7,5,0,0,2198,2199,7,2, + 0,0,2199,2200,7,13,0,0,2200,2201,7,6,0,0,2201,398,1,0,0,0,2202,2203, + 7,11,0,0,2203,2204,7,9,0,0,2204,2205,5,95,0,0,2205,2206,7,6,0,0, + 2206,2207,7,10,0,0,2207,2208,7,7,0,0,2208,2209,7,9,0,0,2209,2210, + 7,4,0,0,2210,2211,7,5,0,0,2211,2212,7,6,0,0,2212,400,1,0,0,0,2213, + 2214,7,15,0,0,2214,2215,7,4,0,0,2215,2216,7,17,0,0,2216,2217,7,18, + 0,0,2217,2218,5,95,0,0,2218,2219,7,11,0,0,2219,2220,7,17,0,0,2220, + 2221,7,16,0,0,2221,2222,7,10,0,0,2222,2223,7,6,0,0,2223,2224,7,11, + 0,0,2224,2225,7,2,0,0,2225,2226,7,16,0,0,2226,2227,7,21,0,0,2227, + 402,1,0,0,0,2228,2229,7,15,0,0,2229,2230,7,21,0,0,2230,2231,7,21, + 0,0,2231,2232,7,10,0,0,2232,2233,7,14,0,0,2233,404,1,0,0,0,2234, + 2235,7,15,0,0,2235,2236,7,11,0,0,2236,2237,7,7,0,0,2237,2238,5,95, + 0,0,2238,2239,7,5,0,0,2239,2240,7,2,0,0,2240,2241,7,11,0,0,2241, + 2242,7,10,0,0,2242,406,1,0,0,0,2243,2244,7,15,0,0,2244,2245,7,11, + 0,0,2245,2246,7,7,0,0,2246,2247,5,95,0,0,2247,2248,7,11,0,0,2248, + 2249,7,17,0,0,2249,2250,7,16,0,0,2250,2251,7,10,0,0,2251,408,1,0, + 0,0,2252,2253,7,15,0,0,2253,2254,7,11,0,0,2254,2255,7,7,0,0,2255, + 2256,5,95,0,0,2256,2257,7,11,0,0,2257,2258,7,17,0,0,2258,2259,7, + 16,0,0,2259,2260,7,10,0,0,2260,2261,7,6,0,0,2261,2262,7,11,0,0,2262, + 2263,7,2,0,0,2263,2264,7,16,0,0,2264,2265,7,21,0,0,2265,410,1,0, + 0,0,2266,2267,7,5,0,0,2267,412,1,0,0,0,2268,2269,7,11,0,0,2269,414, + 1,0,0,0,2270,2271,7,11,0,0,2271,2272,7,6,0,0,2272,416,1,0,0,0,2273, + 2274,5,123,0,0,2274,418,1,0,0,0,2275,2276,5,125,0,0,2276,420,1,0, + 0,0,2277,2278,7,5,0,0,2278,2279,7,10,0,0,2279,2280,7,4,0,0,2280, + 2281,7,6,0,0,2281,2282,7,10,0,0,2282,2283,5,95,0,0,2283,2284,7,14, + 0,0,2284,2285,7,2,0,0,2285,2286,7,4,0,0,2286,2287,7,25,0,0,2287, + 422,1,0,0,0,2288,2289,7,14,0,0,2289,2290,7,2,0,0,2290,2291,7,4,0, + 0,2291,2292,7,25,0,0,2292,424,1,0,0,0,2293,2294,7,14,0,0,2294,2295, + 7,9,0,0,2295,2296,7,12,0,0,2296,2297,5,95,0,0,2297,2298,7,4,0,0, + 2298,2299,7,15,0,0,2299,2300,7,16,0,0,2300,2301,7,8,0,0,2301,2302, + 7,10,0,0,2302,2303,7,14,0,0,2303,426,1,0,0,0,2304,2305,7,5,0,0,2305, + 2306,7,2,0,0,2306,2307,7,11,0,0,2307,2308,7,10,0,0,2308,2309,5,95, + 0,0,2309,2310,7,22,0,0,2310,2311,7,17,0,0,2311,2312,7,6,0,0,2312, + 2313,7,11,0,0,2313,2314,7,9,0,0,2314,2315,7,20,0,0,2315,2316,7,14, + 0,0,2316,2317,7,2,0,0,2317,2318,7,16,0,0,2318,428,1,0,0,0,2319,2320, + 7,5,0,0,2320,2321,7,2,0,0,2321,2322,7,13,0,0,2322,2323,5,95,0,0, + 2323,2324,7,9,0,0,2324,2325,7,19,0,0,2325,2326,5,95,0,0,2326,2327, + 7,16,0,0,2327,2328,7,9,0,0,2328,2329,7,4,0,0,2329,2330,7,11,0,0, + 2330,2331,7,22,0,0,2331,430,1,0,0,0,2332,2333,7,5,0,0,2333,2334, + 7,2,0,0,2334,2335,7,13,0,0,2335,2336,5,95,0,0,2336,2337,7,9,0,0, + 2337,2338,7,19,0,0,2338,2339,5,95,0,0,2339,2340,7,13,0,0,2340,2341, + 7,10,0,0,2341,2342,7,2,0,0,2342,2343,7,14,0,0,2343,432,1,0,0,0,2344, + 2345,7,5,0,0,2345,2346,7,2,0,0,2346,2347,7,13,0,0,2347,2348,5,95, + 0,0,2348,2349,7,9,0,0,2349,2350,7,19,0,0,2350,2351,5,95,0,0,2351, + 2352,7,12,0,0,2352,2353,7,10,0,0,2353,2354,7,10,0,0,2354,2355,7, + 25,0,0,2355,434,1,0,0,0,2356,2357,7,10,0,0,2357,2358,7,18,0,0,2358, + 2359,7,7,0,0,2359,2360,7,3,0,0,2360,2361,7,15,0,0,2361,2362,7,5, + 0,0,2362,2363,7,10,0,0,2363,436,1,0,0,0,2364,2365,7,10,0,0,2365, + 2366,7,18,0,0,2366,2367,7,11,0,0,2367,2368,7,10,0,0,2368,2369,7, + 4,0,0,2369,2370,7,5,0,0,2370,2371,7,10,0,0,2371,2372,7,5,0,0,2372, + 2373,5,95,0,0,2373,2374,7,6,0,0,2374,2375,7,11,0,0,2375,2376,7,2, + 0,0,2376,2377,7,11,0,0,2377,2378,7,6,0,0,2378,438,1,0,0,0,2379,2380, + 7,19,0,0,2380,2381,7,17,0,0,2381,2382,7,10,0,0,2382,2383,7,3,0,0, + 2383,2384,7,5,0,0,2384,440,1,0,0,0,2385,2386,7,19,0,0,2386,2387, + 7,17,0,0,2387,2388,7,3,0,0,2388,2389,7,11,0,0,2389,2390,7,10,0,0, + 2390,2391,7,14,0,0,2391,442,1,0,0,0,2392,2393,7,20,0,0,2393,2394, + 7,10,0,0,2394,2395,7,9,0,0,2395,2396,5,95,0,0,2396,2397,7,8,0,0, + 2397,2398,7,9,0,0,2398,2399,7,15,0,0,2399,2400,7,4,0,0,2400,2401, + 7,5,0,0,2401,2402,7,17,0,0,2402,2403,7,4,0,0,2403,2404,7,20,0,0, + 2404,2405,5,95,0,0,2405,2406,7,8,0,0,2406,2407,7,9,0,0,2407,2408, + 7,18,0,0,2408,444,1,0,0,0,2409,2410,7,20,0,0,2410,2411,7,10,0,0, + 2411,2412,7,9,0,0,2412,2413,5,95,0,0,2413,2414,7,7,0,0,2414,2415, + 7,10,0,0,2415,2416,7,3,0,0,2416,2417,7,3,0,0,2417,446,1,0,0,0,2418, + 2419,7,20,0,0,2419,2420,7,10,0,0,2420,2421,7,9,0,0,2421,2422,5,95, + 0,0,2422,2423,7,5,0,0,2423,2424,7,17,0,0,2424,2425,7,6,0,0,2425, + 2426,7,11,0,0,2426,2427,7,2,0,0,2427,2428,7,4,0,0,2428,2429,7,7, + 0,0,2429,2430,7,10,0,0,2430,448,1,0,0,0,2431,2432,7,20,0,0,2432, + 2433,7,10,0,0,2433,2434,7,9,0,0,2434,2435,5,95,0,0,2435,2436,7,5, + 0,0,2436,2437,7,17,0,0,2437,2438,7,6,0,0,2438,2439,7,11,0,0,2439, + 2440,7,2,0,0,2440,2441,7,4,0,0,2441,2442,7,7,0,0,2442,2443,7,10, + 0,0,2443,2444,5,95,0,0,2444,2445,7,14,0,0,2445,2446,7,2,0,0,2446, + 2447,7,4,0,0,2447,2448,7,20,0,0,2448,2449,7,10,0,0,2449,450,1,0, + 0,0,2450,2451,7,20,0,0,2451,2452,7,10,0,0,2452,2453,7,9,0,0,2453, + 2454,5,95,0,0,2454,2455,7,17,0,0,2455,2456,7,4,0,0,2456,2457,7,11, + 0,0,2457,2458,7,10,0,0,2458,2459,7,14,0,0,2459,2460,7,6,0,0,2460, + 2461,7,10,0,0,2461,2462,7,7,0,0,2462,2463,7,11,0,0,2463,2464,7,6, + 0,0,2464,452,1,0,0,0,2465,2466,7,20,0,0,2466,2467,7,10,0,0,2467, + 2468,7,9,0,0,2468,2469,5,95,0,0,2469,2470,7,21,0,0,2470,2471,7,9, + 0,0,2471,2472,7,3,0,0,2472,2473,7,13,0,0,2473,2474,7,20,0,0,2474, + 2475,7,9,0,0,2475,2476,7,4,0,0,2476,454,1,0,0,0,2477,2478,7,22,0, + 0,2478,2479,7,17,0,0,2479,2480,7,6,0,0,2480,2481,7,11,0,0,2481,2482, + 7,9,0,0,2482,2483,7,20,0,0,2483,2484,7,14,0,0,2484,2485,7,2,0,0, + 2485,2486,7,16,0,0,2486,456,1,0,0,0,2487,2488,7,22,0,0,2488,2489, + 7,9,0,0,2489,2490,7,15,0,0,2490,2491,7,14,0,0,2491,2492,5,95,0,0, + 2492,2493,7,9,0,0,2493,2494,7,19,0,0,2494,2495,5,95,0,0,2495,2496, + 7,5,0,0,2496,2497,7,2,0,0,2497,2498,7,13,0,0,2498,458,1,0,0,0,2499, + 2500,7,17,0,0,2500,2501,7,4,0,0,2501,2502,7,7,0,0,2502,2503,7,3, + 0,0,2503,2504,7,15,0,0,2504,2505,7,5,0,0,2505,2506,7,10,0,0,2506, + 460,1,0,0,0,2507,2508,7,17,0,0,2508,2509,7,4,0,0,2509,2510,5,95, + 0,0,2510,2511,7,11,0,0,2511,2512,7,10,0,0,2512,2513,7,14,0,0,2513, + 2514,7,16,0,0,2514,2515,7,6,0,0,2515,462,1,0,0,0,2516,2517,7,16, + 0,0,2517,2518,7,2,0,0,2518,2519,7,11,0,0,2519,2520,7,7,0,0,2520, + 2521,7,22,0,0,2521,2522,7,21,0,0,2522,2523,7,22,0,0,2523,2524,7, + 14,0,0,2524,2525,7,2,0,0,2525,2526,7,6,0,0,2526,2527,7,10,0,0,2527, + 464,1,0,0,0,2528,2529,7,16,0,0,2529,2530,7,2,0,0,2530,2531,7,11, + 0,0,2531,2532,7,7,0,0,2532,2533,7,22,0,0,2533,2534,5,95,0,0,2534, + 2535,7,21,0,0,2535,2536,7,22,0,0,2536,2537,7,14,0,0,2537,2538,7, + 2,0,0,2538,2539,7,6,0,0,2539,2540,7,10,0,0,2540,466,1,0,0,0,2541, + 2542,7,16,0,0,2542,2543,7,2,0,0,2543,2544,7,11,0,0,2544,2545,7,7, + 0,0,2545,2546,7,22,0,0,2546,2547,7,21,0,0,2547,2548,7,22,0,0,2548, + 2549,7,14,0,0,2549,2550,7,2,0,0,2550,2551,7,6,0,0,2551,2552,7,10, + 0,0,2552,2553,7,26,0,0,2553,2554,7,15,0,0,2554,2555,7,10,0,0,2555, + 2556,7,14,0,0,2556,2557,7,13,0,0,2557,468,1,0,0,0,2558,2559,7,6, + 0,0,2559,2560,7,17,0,0,2560,2561,7,16,0,0,2561,2562,7,21,0,0,2562, + 2563,7,3,0,0,2563,2564,7,10,0,0,2564,2565,5,95,0,0,2565,2566,7,26, + 0,0,2566,2567,7,15,0,0,2567,2568,7,10,0,0,2568,2569,7,14,0,0,2569, + 2570,7,13,0,0,2570,2571,5,95,0,0,2571,2572,7,6,0,0,2572,2573,7,11, + 0,0,2573,2574,7,14,0,0,2574,2575,7,17,0,0,2575,2576,7,4,0,0,2576, + 2577,7,20,0,0,2577,470,1,0,0,0,2578,2579,7,26,0,0,2579,2580,7,15, + 0,0,2580,2581,7,10,0,0,2581,2582,7,14,0,0,2582,2583,7,13,0,0,2583, + 2584,5,95,0,0,2584,2585,7,6,0,0,2585,2586,7,11,0,0,2586,2587,7,14, + 0,0,2587,2588,7,17,0,0,2588,2589,7,4,0,0,2589,2590,7,20,0,0,2590, + 472,1,0,0,0,2591,2592,7,16,0,0,2592,2593,7,2,0,0,2593,2594,7,11, + 0,0,2594,2595,7,7,0,0,2595,2596,7,22,0,0,2596,2597,5,95,0,0,2597, + 2598,7,21,0,0,2598,2599,7,22,0,0,2599,2600,7,14,0,0,2600,2601,7, + 2,0,0,2601,2602,7,6,0,0,2602,2603,7,10,0,0,2603,2604,5,95,0,0,2604, + 2605,7,21,0,0,2605,2606,7,14,0,0,2606,2607,7,10,0,0,2607,2608,7, + 19,0,0,2608,2609,7,17,0,0,2609,2610,7,18,0,0,2610,474,1,0,0,0,2611, + 2612,7,16,0,0,2612,2613,7,2,0,0,2613,2614,7,11,0,0,2614,2615,7,7, + 0,0,2615,2616,7,22,0,0,2616,2617,7,26,0,0,2617,2618,7,15,0,0,2618, + 2619,7,10,0,0,2619,2620,7,14,0,0,2620,2621,7,13,0,0,2621,476,1,0, + 0,0,2622,2623,7,16,0,0,2623,2624,7,2,0,0,2624,2625,7,11,0,0,2625, + 2626,7,7,0,0,2626,2627,7,22,0,0,2627,2628,5,95,0,0,2628,2629,7,26, + 0,0,2629,2630,7,15,0,0,2630,2631,7,10,0,0,2631,2632,7,14,0,0,2632, + 2633,7,13,0,0,2633,478,1,0,0,0,2634,2635,7,16,0,0,2635,2636,7,17, + 0,0,2636,2637,7,4,0,0,2637,2638,7,15,0,0,2638,2639,7,11,0,0,2639, + 2640,7,10,0,0,2640,2641,5,95,0,0,2641,2642,7,9,0,0,2642,2643,7,19, + 0,0,2643,2644,5,95,0,0,2644,2645,7,5,0,0,2645,2646,7,2,0,0,2646, + 2647,7,13,0,0,2647,480,1,0,0,0,2648,2649,7,16,0,0,2649,2650,7,17, + 0,0,2650,2651,7,4,0,0,2651,2652,7,15,0,0,2652,2653,7,11,0,0,2653, + 2654,7,10,0,0,2654,2655,5,95,0,0,2655,2656,7,9,0,0,2656,2657,7,19, + 0,0,2657,2658,5,95,0,0,2658,2659,7,22,0,0,2659,2660,7,9,0,0,2660, + 2661,7,15,0,0,2661,2662,7,14,0,0,2662,482,1,0,0,0,2663,2664,7,16, + 0,0,2664,2665,7,9,0,0,2665,2666,7,4,0,0,2666,2667,7,11,0,0,2667, + 2668,7,22,0,0,2668,2669,5,95,0,0,2669,2670,7,9,0,0,2670,2671,7,19, + 0,0,2671,2672,5,95,0,0,2672,2673,7,13,0,0,2673,2674,7,10,0,0,2674, + 2675,7,2,0,0,2675,2676,7,14,0,0,2676,484,1,0,0,0,2677,2678,7,16, + 0,0,2678,2679,7,15,0,0,2679,2680,7,3,0,0,2680,2681,7,11,0,0,2681, + 2682,7,17,0,0,2682,2683,7,16,0,0,2683,2684,7,2,0,0,2684,2685,7,11, + 0,0,2685,2686,7,7,0,0,2686,2687,7,22,0,0,2687,486,1,0,0,0,2688,2689, + 7,16,0,0,2689,2690,7,15,0,0,2690,2691,7,3,0,0,2691,2692,7,11,0,0, + 2692,2693,7,17,0,0,2693,2694,5,95,0,0,2694,2695,7,16,0,0,2695,2696, + 7,2,0,0,2696,2697,7,11,0,0,2697,2698,7,7,0,0,2698,2699,7,22,0,0, + 2699,488,1,0,0,0,2700,2701,7,16,0,0,2701,2702,7,15,0,0,2702,2703, + 7,3,0,0,2703,2704,7,11,0,0,2704,2705,7,17,0,0,2705,2706,7,16,0,0, + 2706,2707,7,2,0,0,2707,2708,7,11,0,0,2708,2709,7,7,0,0,2709,2710, + 7,22,0,0,2710,2711,7,26,0,0,2711,2712,7,15,0,0,2712,2713,7,10,0, + 0,2713,2714,7,14,0,0,2714,2715,7,13,0,0,2715,490,1,0,0,0,2716,2717, + 7,4,0,0,2717,2718,7,10,0,0,2718,2719,7,6,0,0,2719,2720,7,11,0,0, + 2720,2721,7,10,0,0,2721,2722,7,5,0,0,2722,492,1,0,0,0,2723,2724, + 7,21,0,0,2724,2725,7,10,0,0,2725,2726,7,14,0,0,2726,2727,7,7,0,0, + 2727,2728,7,10,0,0,2728,2729,7,4,0,0,2729,2730,7,11,0,0,2730,2731, + 7,17,0,0,2731,2732,7,3,0,0,2732,2733,7,10,0,0,2733,2734,7,6,0,0, + 2734,494,1,0,0,0,2735,2736,7,21,0,0,2736,2737,7,10,0,0,2737,2738, + 7,14,0,0,2738,2739,7,7,0,0,2739,2740,7,10,0,0,2740,2741,7,4,0,0, + 2741,2742,7,11,0,0,2742,2743,7,17,0,0,2743,2744,7,3,0,0,2744,2745, + 7,10,0,0,2745,496,1,0,0,0,2746,2747,7,21,0,0,2747,2748,7,10,0,0, + 2748,2749,7,14,0,0,2749,2750,7,7,0,0,2750,2751,7,10,0,0,2751,2752, + 7,4,0,0,2752,2753,7,11,0,0,2753,2754,7,17,0,0,2754,2755,7,3,0,0, + 2755,2756,7,10,0,0,2756,2757,5,95,0,0,2757,2758,7,2,0,0,2758,2759, + 7,21,0,0,2759,2760,7,21,0,0,2760,2761,7,14,0,0,2761,2762,7,9,0,0, + 2762,2763,7,18,0,0,2763,498,1,0,0,0,2764,2765,7,14,0,0,2765,2766, + 7,10,0,0,2766,2767,7,20,0,0,2767,2768,7,10,0,0,2768,2769,7,18,0, + 0,2769,2770,7,21,0,0,2770,2771,5,95,0,0,2771,2772,7,26,0,0,2772, + 2773,7,15,0,0,2773,2774,7,10,0,0,2774,2775,7,14,0,0,2775,2776,7, + 13,0,0,2776,500,1,0,0,0,2777,2778,7,14,0,0,2778,2779,7,10,0,0,2779, + 2780,7,23,0,0,2780,2781,7,10,0,0,2781,2782,7,14,0,0,2782,2783,7, + 6,0,0,2783,2784,7,10,0,0,2784,2785,5,95,0,0,2785,2786,7,4,0,0,2786, + 2787,7,10,0,0,2787,2788,7,6,0,0,2788,2789,7,11,0,0,2789,2790,7,10, + 0,0,2790,2791,7,5,0,0,2791,502,1,0,0,0,2792,2793,7,26,0,0,2793,2794, + 7,15,0,0,2794,2795,7,10,0,0,2795,2796,7,14,0,0,2796,2797,7,13,0, + 0,2797,504,1,0,0,0,2798,2799,7,14,0,0,2799,2800,7,2,0,0,2800,2801, + 7,4,0,0,2801,2802,7,20,0,0,2802,2803,7,10,0,0,2803,506,1,0,0,0,2804, + 2805,7,6,0,0,2805,2806,7,7,0,0,2806,2807,7,9,0,0,2807,2808,7,14, + 0,0,2808,2809,7,10,0,0,2809,508,1,0,0,0,2810,2811,7,6,0,0,2811,2812, + 7,7,0,0,2812,2813,7,9,0,0,2813,2814,7,14,0,0,2814,2815,7,10,0,0, + 2815,2816,7,26,0,0,2816,2817,7,15,0,0,2817,2818,7,10,0,0,2818,2819, + 7,14,0,0,2819,2820,7,13,0,0,2820,510,1,0,0,0,2821,2822,7,6,0,0,2822, + 2823,7,7,0,0,2823,2824,7,9,0,0,2824,2825,7,14,0,0,2825,2826,7,10, + 0,0,2826,2827,5,95,0,0,2827,2828,7,26,0,0,2828,2829,7,15,0,0,2829, + 2830,7,10,0,0,2830,2831,7,14,0,0,2831,2832,7,13,0,0,2832,512,1,0, + 0,0,2833,2834,7,6,0,0,2834,2835,7,10,0,0,2835,2836,7,7,0,0,2836, + 2837,7,9,0,0,2837,2838,7,4,0,0,2838,2839,7,5,0,0,2839,2840,5,95, + 0,0,2840,2841,7,9,0,0,2841,2842,7,19,0,0,2842,2843,5,95,0,0,2843, + 2844,7,16,0,0,2844,2845,7,17,0,0,2845,2846,7,4,0,0,2846,2847,7,15, + 0,0,2847,2848,7,11,0,0,2848,2849,7,10,0,0,2849,514,1,0,0,0,2850, + 2851,7,6,0,0,2851,2852,7,11,0,0,2852,2853,7,2,0,0,2853,2854,7,11, + 0,0,2854,2855,7,6,0,0,2855,516,1,0,0,0,2856,2857,7,11,0,0,2857,2858, + 7,10,0,0,2858,2859,7,14,0,0,2859,2860,7,16,0,0,2860,518,1,0,0,0, + 2861,2862,7,11,0,0,2862,2863,7,10,0,0,2863,2864,7,14,0,0,2864,2865, + 7,16,0,0,2865,2866,7,6,0,0,2866,520,1,0,0,0,2867,2868,7,11,0,0,2868, + 2869,7,17,0,0,2869,2870,7,16,0,0,2870,2871,7,10,0,0,2871,2872,7, + 6,0,0,2872,2873,7,11,0,0,2873,2874,7,2,0,0,2874,2875,7,16,0,0,2875, + 2876,7,21,0,0,2876,2877,7,2,0,0,2877,2878,7,5,0,0,2878,2879,7,5, + 0,0,2879,522,1,0,0,0,2880,2881,7,11,0,0,2881,2882,7,17,0,0,2882, + 2883,7,16,0,0,2883,2884,7,10,0,0,2884,2885,7,6,0,0,2885,2886,7,11, + 0,0,2886,2887,7,2,0,0,2887,2888,7,16,0,0,2888,2889,7,21,0,0,2889, + 2890,7,5,0,0,2890,2891,7,17,0,0,2891,2892,7,19,0,0,2892,2893,7,19, + 0,0,2893,524,1,0,0,0,2894,2895,7,11,0,0,2895,2896,7,9,0,0,2896,2897, + 7,21,0,0,2897,2898,7,22,0,0,2898,2899,7,17,0,0,2899,2900,7,11,0, + 0,2900,2901,7,6,0,0,2901,526,1,0,0,0,2902,2903,7,11,0,0,2903,2904, + 7,13,0,0,2904,2905,7,21,0,0,2905,2906,7,10,0,0,2906,2907,7,9,0,0, + 2907,2908,7,19,0,0,2908,528,1,0,0,0,2909,2910,7,12,0,0,2910,2911, + 7,10,0,0,2911,2912,7,10,0,0,2912,2913,7,25,0,0,2913,2914,5,95,0, + 0,2914,2915,7,9,0,0,2915,2916,7,19,0,0,2916,2917,5,95,0,0,2917,2918, + 7,13,0,0,2918,2919,7,10,0,0,2919,2920,7,2,0,0,2920,2921,7,14,0,0, + 2921,530,1,0,0,0,2922,2923,7,12,0,0,2923,2924,7,10,0,0,2924,2925, + 7,10,0,0,2925,2926,7,25,0,0,2926,2927,7,9,0,0,2927,2928,7,19,0,0, + 2928,2929,7,13,0,0,2929,2930,7,10,0,0,2930,2931,7,2,0,0,2931,2932, + 7,14,0,0,2932,532,1,0,0,0,2933,2934,7,12,0,0,2934,2935,7,10,0,0, + 2935,2936,7,10,0,0,2936,2937,7,25,0,0,2937,2938,7,5,0,0,2938,2939, + 7,2,0,0,2939,2940,7,13,0,0,2940,534,1,0,0,0,2941,2942,7,12,0,0,2942, + 2943,7,17,0,0,2943,2944,7,3,0,0,2944,2945,7,5,0,0,2945,2946,7,7, + 0,0,2946,2947,7,2,0,0,2947,2948,7,14,0,0,2948,2949,7,5,0,0,2949, + 2950,7,26,0,0,2950,2951,7,15,0,0,2951,2952,7,10,0,0,2952,2953,7, + 14,0,0,2953,2954,7,13,0,0,2954,536,1,0,0,0,2955,2956,7,12,0,0,2956, + 2957,7,17,0,0,2957,2958,7,3,0,0,2958,2959,7,5,0,0,2959,2960,7,7, + 0,0,2960,2961,7,2,0,0,2961,2962,7,14,0,0,2962,2963,7,5,0,0,2963, + 2964,5,95,0,0,2964,2965,7,26,0,0,2965,2966,7,15,0,0,2966,2967,7, + 10,0,0,2967,2968,7,14,0,0,2968,2969,7,13,0,0,2969,538,1,0,0,0,2970, + 2971,7,6,0,0,2971,2972,7,15,0,0,2972,2973,7,8,0,0,2973,2974,7,6, + 0,0,2974,2975,7,11,0,0,2975,2976,7,14,0,0,2976,540,1,0,0,0,2977, + 2978,7,6,0,0,2978,2979,7,11,0,0,2979,2980,7,14,0,0,2980,2981,7,7, + 0,0,2981,2982,7,16,0,0,2982,2983,7,21,0,0,2983,542,1,0,0,0,2984, + 2985,7,2,0,0,2985,2986,7,5,0,0,2986,2987,7,5,0,0,2987,2988,7,5,0, + 0,2988,2989,7,2,0,0,2989,2990,7,11,0,0,2990,2991,7,10,0,0,2991,544, + 1,0,0,0,2992,2993,7,13,0,0,2993,2994,7,10,0,0,2994,2995,7,2,0,0, + 2995,2996,7,14,0,0,2996,2997,7,12,0,0,2997,2998,7,10,0,0,2998,2999, + 7,10,0,0,2999,3000,7,25,0,0,3000,546,1,0,0,0,3001,3002,7,2,0,0,3002, + 3003,7,3,0,0,3003,3004,7,3,0,0,3004,3005,7,9,0,0,3005,3006,7,12, + 0,0,3006,3007,5,95,0,0,3007,3008,7,3,0,0,3008,3009,7,10,0,0,3009, + 3010,7,2,0,0,3010,3011,7,5,0,0,3011,3012,7,17,0,0,3012,3013,7,4, + 0,0,3013,3014,7,20,0,0,3014,3015,5,95,0,0,3015,3016,7,12,0,0,3016, + 3017,7,17,0,0,3017,3018,7,3,0,0,3018,3019,7,5,0,0,3019,3020,7,7, + 0,0,3020,3021,7,2,0,0,3021,3022,7,14,0,0,3022,3023,7,5,0,0,3023, + 548,1,0,0,0,3024,3025,7,2,0,0,3025,3026,7,4,0,0,3026,3027,7,2,0, + 0,3027,3028,7,3,0,0,3028,3029,7,13,0,0,3029,3030,7,27,0,0,3030,3031, + 7,10,0,0,3031,3032,7,14,0,0,3032,550,1,0,0,0,3033,3034,7,2,0,0,3034, + 3035,7,4,0,0,3035,3036,7,2,0,0,3036,3037,7,3,0,0,3037,3038,7,13, + 0,0,3038,3039,7,27,0,0,3039,3040,7,10,0,0,3040,3041,5,95,0,0,3041, + 3042,7,12,0,0,3042,3043,7,17,0,0,3043,3044,7,3,0,0,3044,3045,7,5, + 0,0,3045,3046,7,7,0,0,3046,3047,7,2,0,0,3047,3048,7,14,0,0,3048, + 3049,7,5,0,0,3049,552,1,0,0,0,3050,3051,7,2,0,0,3051,3052,7,15,0, + 0,3052,3053,7,11,0,0,3053,3054,7,9,0,0,3054,3055,5,95,0,0,3055,3056, + 7,20,0,0,3056,3057,7,10,0,0,3057,3058,7,4,0,0,3058,3059,7,10,0,0, + 3059,3060,7,14,0,0,3060,3061,7,2,0,0,3061,3062,7,11,0,0,3062,3063, + 7,10,0,0,3063,3064,5,95,0,0,3064,3065,7,6,0,0,3065,3066,7,13,0,0, + 3066,3067,7,4,0,0,3067,3068,7,9,0,0,3068,3069,7,4,0,0,3069,3070, + 7,13,0,0,3070,3071,7,16,0,0,3071,3072,7,6,0,0,3072,3073,5,95,0,0, + 3073,3074,7,21,0,0,3074,3075,7,22,0,0,3075,3076,7,14,0,0,3076,3077, + 7,2,0,0,3077,3078,7,6,0,0,3078,3079,7,10,0,0,3079,3080,5,95,0,0, + 3080,3081,7,26,0,0,3081,3082,7,15,0,0,3082,3083,7,10,0,0,3083,3084, + 7,14,0,0,3084,3085,7,13,0,0,3085,554,1,0,0,0,3086,3087,7,8,0,0,3087, + 3088,7,9,0,0,3088,3089,7,9,0,0,3089,3090,7,6,0,0,3090,3091,7,11, + 0,0,3091,556,1,0,0,0,3092,3093,7,7,0,0,3093,3094,7,2,0,0,3094,3095, + 7,6,0,0,3095,3096,7,10,0,0,3096,3097,5,95,0,0,3097,3098,7,17,0,0, + 3098,3099,7,4,0,0,3099,3100,7,6,0,0,3100,3101,7,10,0,0,3101,3102, + 7,4,0,0,3102,3103,7,6,0,0,3103,3104,7,17,0,0,3104,3105,7,11,0,0, + 3105,3106,7,17,0,0,3106,3107,7,23,0,0,3107,3108,7,10,0,0,3108,558, + 1,0,0,0,3109,3110,7,7,0,0,3110,3111,7,15,0,0,3111,3112,7,11,0,0, + 3112,3113,7,9,0,0,3113,3114,7,19,0,0,3114,3115,7,19,0,0,3115,3116, + 5,95,0,0,3116,3117,7,19,0,0,3117,3118,7,14,0,0,3118,3119,7,10,0, + 0,3119,3120,7,26,0,0,3120,3121,7,15,0,0,3121,3122,7,10,0,0,3122, + 3123,7,4,0,0,3123,3124,7,7,0,0,3124,3125,7,13,0,0,3125,560,1,0,0, + 0,3126,3127,7,5,0,0,3127,3128,7,10,0,0,3128,3129,7,19,0,0,3129,3130, + 7,2,0,0,3130,3131,7,15,0,0,3131,3132,7,3,0,0,3132,3133,7,11,0,0, + 3133,3134,5,95,0,0,3134,3135,7,19,0,0,3135,3136,7,17,0,0,3136,3137, + 7,10,0,0,3137,3138,7,3,0,0,3138,3139,7,5,0,0,3139,562,1,0,0,0,3140, + 3141,7,5,0,0,3141,3142,7,10,0,0,3142,3143,7,19,0,0,3143,3144,7,2, + 0,0,3144,3145,7,15,0,0,3145,3146,7,3,0,0,3146,3147,7,11,0,0,3147, + 3148,5,95,0,0,3148,3149,7,9,0,0,3149,3150,7,21,0,0,3150,3151,7,10, + 0,0,3151,3152,7,14,0,0,3152,3153,7,2,0,0,3153,3154,7,11,0,0,3154, + 3155,7,9,0,0,3155,3156,7,14,0,0,3156,564,1,0,0,0,3157,3158,7,10, + 0,0,3158,3159,7,6,0,0,3159,3160,7,7,0,0,3160,3161,7,2,0,0,3161,3162, + 7,21,0,0,3162,3163,7,10,0,0,3163,566,1,0,0,0,3164,3165,7,10,0,0, + 3165,3166,7,4,0,0,3166,3167,7,2,0,0,3167,3168,7,8,0,0,3168,3169, + 7,3,0,0,3169,3170,7,10,0,0,3170,3171,5,95,0,0,3171,3172,7,21,0,0, + 3172,3173,7,9,0,0,3173,3174,7,6,0,0,3174,3175,7,17,0,0,3175,3176, + 7,11,0,0,3176,3177,7,17,0,0,3177,3178,7,9,0,0,3178,3179,7,4,0,0, + 3179,3180,5,95,0,0,3180,3181,7,17,0,0,3181,3182,7,4,0,0,3182,3183, + 7,7,0,0,3183,3184,7,14,0,0,3184,3185,7,10,0,0,3185,3186,7,16,0,0, + 3186,3187,7,10,0,0,3187,3188,7,4,0,0,3188,3189,7,11,0,0,3189,3190, + 7,6,0,0,3190,568,1,0,0,0,3191,3192,7,19,0,0,3192,3193,7,17,0,0,3193, + 3194,7,10,0,0,3194,3195,7,3,0,0,3195,3196,7,5,0,0,3196,3197,7,6, + 0,0,3197,570,1,0,0,0,3198,3199,7,19,0,0,3199,3200,7,3,0,0,3200,3201, + 7,2,0,0,3201,3202,7,20,0,0,3202,3203,7,6,0,0,3203,572,1,0,0,0,3204, + 3205,7,19,0,0,3205,3206,7,15,0,0,3206,3207,7,27,0,0,3207,3208,7, + 27,0,0,3208,3209,7,17,0,0,3209,3210,7,4,0,0,3210,3211,7,10,0,0,3211, + 3212,7,6,0,0,3212,3213,7,6,0,0,3213,574,1,0,0,0,3214,3215,7,19,0, + 0,3215,3216,7,15,0,0,3216,3217,7,27,0,0,3217,3218,7,27,0,0,3218, + 3219,7,13,0,0,3219,3220,5,95,0,0,3220,3221,7,16,0,0,3221,3222,7, + 2,0,0,3222,3223,7,18,0,0,3223,3224,5,95,0,0,3224,3225,7,10,0,0,3225, + 3226,7,18,0,0,3226,3227,7,21,0,0,3227,3228,7,2,0,0,3228,3229,7,4, + 0,0,3229,3230,7,6,0,0,3230,3231,7,17,0,0,3231,3232,7,9,0,0,3232, + 3233,7,4,0,0,3233,3234,7,6,0,0,3234,576,1,0,0,0,3235,3236,7,19,0, + 0,3236,3237,7,15,0,0,3237,3238,7,27,0,0,3238,3239,7,27,0,0,3239, + 3240,7,13,0,0,3240,3241,5,95,0,0,3241,3242,7,21,0,0,3242,3243,7, + 14,0,0,3243,3244,7,10,0,0,3244,3245,7,19,0,0,3245,3246,7,17,0,0, + 3246,3247,7,18,0,0,3247,3248,5,95,0,0,3248,3249,7,3,0,0,3249,3250, + 7,10,0,0,3250,3251,7,4,0,0,3251,3252,7,20,0,0,3252,3253,7,11,0,0, + 3253,3254,7,22,0,0,3254,578,1,0,0,0,3255,3256,7,19,0,0,3256,3257, + 7,15,0,0,3257,3258,7,27,0,0,3258,3259,7,27,0,0,3259,3260,7,13,0, + 0,3260,3261,5,95,0,0,3261,3262,7,14,0,0,3262,3263,7,10,0,0,3263, + 3264,7,12,0,0,3264,3265,7,14,0,0,3265,3266,7,17,0,0,3266,3267,7, + 11,0,0,3267,3268,7,10,0,0,3268,580,1,0,0,0,3269,3270,7,19,0,0,3270, + 3271,7,15,0,0,3271,3272,7,27,0,0,3272,3273,7,27,0,0,3273,3274,7, + 13,0,0,3274,3275,5,95,0,0,3275,3276,7,11,0,0,3276,3277,7,14,0,0, + 3277,3278,7,2,0,0,3278,3279,7,4,0,0,3279,3280,7,6,0,0,3280,3281, + 7,21,0,0,3281,3282,7,9,0,0,3282,3283,7,6,0,0,3283,3284,7,17,0,0, + 3284,3285,7,11,0,0,3285,3286,7,17,0,0,3286,3287,7,9,0,0,3287,3288, + 7,4,0,0,3288,3289,7,6,0,0,3289,582,1,0,0,0,3290,3291,7,3,0,0,3291, + 3292,7,10,0,0,3292,3293,7,4,0,0,3293,3294,7,17,0,0,3294,3295,7,10, + 0,0,3295,3296,7,4,0,0,3296,3297,7,11,0,0,3297,584,1,0,0,0,3298,3299, + 7,3,0,0,3299,3300,7,9,0,0,3300,3301,7,12,0,0,3301,3302,5,95,0,0, + 3302,3303,7,19,0,0,3303,3304,7,14,0,0,3304,3305,7,10,0,0,3305,3306, + 7,26,0,0,3306,3307,5,95,0,0,3307,3308,7,9,0,0,3308,3309,7,21,0,0, + 3309,3310,7,10,0,0,3310,3311,7,14,0,0,3311,3312,7,2,0,0,3312,3313, + 7,11,0,0,3313,3314,7,9,0,0,3314,3315,7,14,0,0,3315,586,1,0,0,0,3316, + 3317,7,16,0,0,3317,3318,7,2,0,0,3318,3319,7,18,0,0,3319,3320,5,95, + 0,0,3320,3321,7,5,0,0,3321,3322,7,10,0,0,3322,3323,7,11,0,0,3323, + 3324,7,10,0,0,3324,3325,7,14,0,0,3325,3326,7,16,0,0,3326,3327,7, + 17,0,0,3327,3328,7,4,0,0,3328,3329,7,17,0,0,3329,3330,7,27,0,0,3330, + 3331,7,10,0,0,3331,3332,7,5,0,0,3332,3333,5,95,0,0,3333,3334,7,6, + 0,0,3334,3335,7,11,0,0,3335,3336,7,2,0,0,3336,3337,7,11,0,0,3337, + 3338,7,10,0,0,3338,3339,7,6,0,0,3339,588,1,0,0,0,3340,3341,7,16, + 0,0,3341,3342,7,2,0,0,3342,3343,7,18,0,0,3343,3344,5,95,0,0,3344, + 3345,7,10,0,0,3345,3346,7,18,0,0,3346,3347,7,21,0,0,3347,3348,7, + 2,0,0,3348,3349,7,4,0,0,3349,3350,7,6,0,0,3350,3351,7,17,0,0,3351, + 3352,7,9,0,0,3352,3353,7,4,0,0,3353,3354,7,6,0,0,3354,590,1,0,0, + 0,3355,3356,7,16,0,0,3356,3357,7,17,0,0,3357,3358,7,4,0,0,3358,3359, + 7,17,0,0,3359,3360,7,16,0,0,3360,3361,7,15,0,0,3361,3362,7,16,0, + 0,3362,3363,5,95,0,0,3363,3364,7,6,0,0,3364,3365,7,22,0,0,3365,3366, + 7,9,0,0,3366,3367,7,15,0,0,3367,3368,7,3,0,0,3368,3369,7,5,0,0,3369, + 3370,5,95,0,0,3370,3371,7,16,0,0,3371,3372,7,2,0,0,3372,3373,7,11, + 0,0,3373,3374,7,7,0,0,3374,3375,7,22,0,0,3375,592,1,0,0,0,3376,3377, + 7,9,0,0,3377,3378,7,21,0,0,3378,3379,7,10,0,0,3379,3380,7,14,0,0, + 3380,3381,7,2,0,0,3381,3382,7,11,0,0,3382,3383,7,9,0,0,3383,3384, + 7,14,0,0,3384,594,1,0,0,0,3385,3386,7,21,0,0,3386,3387,7,22,0,0, + 3387,3388,7,14,0,0,3388,3389,7,2,0,0,3389,3390,7,6,0,0,3390,3391, + 7,10,0,0,3391,3392,5,95,0,0,3392,3393,7,6,0,0,3393,3394,7,3,0,0, + 3394,3395,7,9,0,0,3395,3396,7,21,0,0,3396,596,1,0,0,0,3397,3398, + 7,21,0,0,3398,3399,7,14,0,0,3399,3400,7,10,0,0,3400,3401,7,19,0, + 0,3401,3402,7,17,0,0,3402,3403,7,18,0,0,3403,3404,5,95,0,0,3404, + 3405,7,3,0,0,3405,3406,7,10,0,0,3406,3407,7,4,0,0,3407,3408,7,20, + 0,0,3408,3409,7,11,0,0,3409,3410,7,22,0,0,3410,598,1,0,0,0,3411, + 3412,7,26,0,0,3412,3413,7,15,0,0,3413,3414,7,9,0,0,3414,3415,7,11, + 0,0,3415,3416,7,10,0,0,3416,3417,5,95,0,0,3417,3418,7,2,0,0,3418, + 3419,7,4,0,0,3419,3420,7,2,0,0,3420,3421,7,3,0,0,3421,3422,7,13, + 0,0,3422,3423,7,27,0,0,3423,3424,7,10,0,0,3424,3425,7,14,0,0,3425, + 600,1,0,0,0,3426,3427,7,26,0,0,3427,3428,7,15,0,0,3428,3429,7,9, + 0,0,3429,3430,7,11,0,0,3430,3431,7,10,0,0,3431,3432,5,95,0,0,3432, + 3433,7,19,0,0,3433,3434,7,17,0,0,3434,3435,7,10,0,0,3435,3436,7, + 3,0,0,3436,3437,7,5,0,0,3437,3438,5,95,0,0,3438,3439,7,6,0,0,3439, + 3440,7,15,0,0,3440,3441,7,19,0,0,3441,3442,7,19,0,0,3442,3443,7, + 17,0,0,3443,3444,7,18,0,0,3444,602,1,0,0,0,3445,3446,7,14,0,0,3446, + 3447,7,10,0,0,3447,3448,7,12,0,0,3448,3449,7,14,0,0,3449,3450,7, + 17,0,0,3450,3451,7,11,0,0,3451,3452,7,10,0,0,3452,604,1,0,0,0,3453, + 3454,7,6,0,0,3454,3455,7,3,0,0,3455,3456,7,9,0,0,3456,3457,7,21, + 0,0,3457,606,1,0,0,0,3458,3459,7,11,0,0,3459,3460,7,17,0,0,3460, + 3461,7,10,0,0,3461,3462,5,95,0,0,3462,3463,7,8,0,0,3463,3464,7,14, + 0,0,3464,3465,7,10,0,0,3465,3466,7,2,0,0,3466,3467,7,25,0,0,3467, + 3468,7,10,0,0,3468,3469,7,14,0,0,3469,608,1,0,0,0,3470,3471,7,11, + 0,0,3471,3472,7,17,0,0,3472,3473,7,16,0,0,3473,3474,7,10,0,0,3474, + 3475,5,95,0,0,3475,3476,7,27,0,0,3476,3477,7,9,0,0,3477,3478,7,4, + 0,0,3478,3479,7,10,0,0,3479,610,1,0,0,0,3480,3481,7,11,0,0,3481, + 3482,7,13,0,0,3482,3483,7,21,0,0,3483,3484,7,10,0,0,3484,612,1,0, + 0,0,3485,3486,7,27,0,0,3486,3487,7,10,0,0,3487,3488,7,14,0,0,3488, + 3489,7,9,0,0,3489,3490,5,95,0,0,3490,3491,7,11,0,0,3491,3492,7,10, + 0,0,3492,3493,7,14,0,0,3493,3494,7,16,0,0,3494,3495,7,6,0,0,3495, + 3496,5,95,0,0,3496,3497,7,26,0,0,3497,3498,7,15,0,0,3498,3499,7, + 10,0,0,3499,3500,7,14,0,0,3500,3501,7,13,0,0,3501,614,1,0,0,0,3502, + 3503,7,22,0,0,3503,3504,7,17,0,0,3504,3505,7,20,0,0,3505,3506,7, + 22,0,0,3506,3507,7,3,0,0,3507,3508,7,17,0,0,3508,3509,7,20,0,0,3509, + 3510,7,22,0,0,3510,3511,7,11,0,0,3511,616,1,0,0,0,3512,3513,7,21, + 0,0,3513,3514,7,14,0,0,3514,3515,7,10,0,0,3515,3516,5,95,0,0,3516, + 3517,7,11,0,0,3517,3518,7,2,0,0,3518,3519,7,20,0,0,3519,3520,7,6, + 0,0,3520,618,1,0,0,0,3521,3522,7,21,0,0,3522,3523,7,9,0,0,3523,3524, + 7,6,0,0,3524,3525,7,11,0,0,3525,3526,5,95,0,0,3526,3527,7,11,0,0, + 3527,3528,7,2,0,0,3528,3529,7,20,0,0,3529,3530,7,6,0,0,3530,620, + 1,0,0,0,3531,3532,7,16,0,0,3532,3533,7,2,0,0,3533,3534,7,11,0,0, + 3534,3535,7,7,0,0,3535,3536,7,22,0,0,3536,3537,5,95,0,0,3537,3538, + 7,8,0,0,3538,3539,7,9,0,0,3539,3540,7,9,0,0,3540,3541,7,3,0,0,3541, + 3542,5,95,0,0,3542,3543,7,21,0,0,3543,3544,7,14,0,0,3544,3545,7, + 10,0,0,3545,3546,7,19,0,0,3546,3547,7,17,0,0,3547,3548,7,18,0,0, + 3548,622,1,0,0,0,3549,3550,5,42,0,0,3550,624,1,0,0,0,3551,3552,5, + 47,0,0,3552,626,1,0,0,0,3553,3554,5,37,0,0,3554,628,1,0,0,0,3555, + 3556,5,43,0,0,3556,630,1,0,0,0,3557,3558,5,45,0,0,3558,632,1,0,0, + 0,3559,3560,7,5,0,0,3560,3561,7,17,0,0,3561,3562,7,23,0,0,3562,634, + 1,0,0,0,3563,3564,7,16,0,0,3564,3565,7,9,0,0,3565,3566,7,5,0,0,3566, + 636,1,0,0,0,3567,3568,5,61,0,0,3568,638,1,0,0,0,3569,3570,5,62,0, + 0,3570,640,1,0,0,0,3571,3572,5,60,0,0,3572,642,1,0,0,0,3573,3574, + 5,33,0,0,3574,644,1,0,0,0,3575,3576,5,126,0,0,3576,646,1,0,0,0,3577, + 3578,5,124,0,0,3578,648,1,0,0,0,3579,3580,5,38,0,0,3580,650,1,0, + 0,0,3581,3582,5,94,0,0,3582,652,1,0,0,0,3583,3584,5,46,0,0,3584, + 654,1,0,0,0,3585,3586,5,40,0,0,3586,656,1,0,0,0,3587,3588,5,41,0, + 0,3588,658,1,0,0,0,3589,3590,5,91,0,0,3590,660,1,0,0,0,3591,3592, + 5,93,0,0,3592,662,1,0,0,0,3593,3594,5,44,0,0,3594,664,1,0,0,0,3595, + 3596,5,59,0,0,3596,666,1,0,0,0,3597,3598,5,64,0,0,3598,668,1,0,0, + 0,3599,3600,5,48,0,0,3600,670,1,0,0,0,3601,3602,5,49,0,0,3602,672, + 1,0,0,0,3603,3604,5,50,0,0,3604,674,1,0,0,0,3605,3606,5,39,0,0,3606, + 676,1,0,0,0,3607,3608,5,34,0,0,3608,678,1,0,0,0,3609,3610,5,96,0, + 0,3610,680,1,0,0,0,3611,3612,5,58,0,0,3612,682,1,0,0,0,3613,3614, + 7,4,0,0,3614,3615,3,709,354,0,3615,684,1,0,0,0,3616,3617,3,709,354, + 0,3617,686,1,0,0,0,3618,3620,3,715,357,0,3619,3618,1,0,0,0,3620, + 3621,1,0,0,0,3621,3619,1,0,0,0,3621,3622,1,0,0,0,3622,688,1,0,0, + 0,3623,3624,7,18,0,0,3624,3628,5,39,0,0,3625,3626,3,713,356,0,3626, + 3627,3,713,356,0,3627,3629,1,0,0,0,3628,3625,1,0,0,0,3629,3630,1, + 0,0,0,3630,3628,1,0,0,0,3630,3631,1,0,0,0,3631,3632,1,0,0,0,3632, + 3633,5,39,0,0,3633,3643,1,0,0,0,3634,3635,5,48,0,0,3635,3636,7,18, + 0,0,3636,3638,1,0,0,0,3637,3639,3,713,356,0,3638,3637,1,0,0,0,3639, + 3640,1,0,0,0,3640,3638,1,0,0,0,3640,3641,1,0,0,0,3641,3643,1,0,0, + 0,3642,3623,1,0,0,0,3642,3634,1,0,0,0,3643,690,1,0,0,0,3644,3646, + 3,715,357,0,3645,3644,1,0,0,0,3646,3647,1,0,0,0,3647,3645,1,0,0, + 0,3647,3648,1,0,0,0,3648,3650,1,0,0,0,3649,3645,1,0,0,0,3649,3650, + 1,0,0,0,3650,3651,1,0,0,0,3651,3653,5,46,0,0,3652,3654,3,715,357, + 0,3653,3652,1,0,0,0,3654,3655,1,0,0,0,3655,3653,1,0,0,0,3655,3656, + 1,0,0,0,3656,3688,1,0,0,0,3657,3659,3,715,357,0,3658,3657,1,0,0, + 0,3659,3660,1,0,0,0,3660,3658,1,0,0,0,3660,3661,1,0,0,0,3661,3662, + 1,0,0,0,3662,3663,5,46,0,0,3663,3664,3,703,351,0,3664,3688,1,0,0, + 0,3665,3667,3,715,357,0,3666,3665,1,0,0,0,3667,3668,1,0,0,0,3668, + 3666,1,0,0,0,3668,3669,1,0,0,0,3669,3671,1,0,0,0,3670,3666,1,0,0, + 0,3670,3671,1,0,0,0,3671,3672,1,0,0,0,3672,3674,5,46,0,0,3673,3675, + 3,715,357,0,3674,3673,1,0,0,0,3675,3676,1,0,0,0,3676,3674,1,0,0, + 0,3676,3677,1,0,0,0,3677,3678,1,0,0,0,3678,3679,3,703,351,0,3679, + 3688,1,0,0,0,3680,3682,3,715,357,0,3681,3680,1,0,0,0,3682,3683,1, + 0,0,0,3683,3681,1,0,0,0,3683,3684,1,0,0,0,3684,3685,1,0,0,0,3685, + 3686,3,703,351,0,3686,3688,1,0,0,0,3687,3649,1,0,0,0,3687,3658,1, + 0,0,0,3687,3670,1,0,0,0,3687,3681,1,0,0,0,3688,692,1,0,0,0,3689, + 3690,5,92,0,0,3690,3691,7,4,0,0,3691,694,1,0,0,0,3692,3693,3,717, + 358,0,3693,696,1,0,0,0,3694,3695,3,705,352,0,3695,698,1,0,0,0,3696, + 3697,3,707,353,0,3697,700,1,0,0,0,3698,3699,3,711,355,0,3699,702, + 1,0,0,0,3700,3702,7,10,0,0,3701,3703,7,28,0,0,3702,3701,1,0,0,0, + 3702,3703,1,0,0,0,3703,3705,1,0,0,0,3704,3706,3,715,357,0,3705,3704, + 1,0,0,0,3706,3707,1,0,0,0,3707,3705,1,0,0,0,3707,3708,1,0,0,0,3708, + 704,1,0,0,0,3709,3711,7,29,0,0,3710,3709,1,0,0,0,3711,3712,1,0,0, + 0,3712,3710,1,0,0,0,3712,3713,1,0,0,0,3713,3717,1,0,0,0,3714,3716, + 7,30,0,0,3715,3714,1,0,0,0,3716,3719,1,0,0,0,3717,3715,1,0,0,0,3717, + 3718,1,0,0,0,3718,706,1,0,0,0,3719,3717,1,0,0,0,3720,3728,5,34,0, + 0,3721,3722,5,92,0,0,3722,3727,9,0,0,0,3723,3724,5,34,0,0,3724,3727, + 5,34,0,0,3725,3727,8,31,0,0,3726,3721,1,0,0,0,3726,3723,1,0,0,0, + 3726,3725,1,0,0,0,3727,3730,1,0,0,0,3728,3726,1,0,0,0,3728,3729, + 1,0,0,0,3729,3731,1,0,0,0,3730,3728,1,0,0,0,3731,3732,5,34,0,0,3732, + 708,1,0,0,0,3733,3741,5,39,0,0,3734,3735,5,92,0,0,3735,3740,9,0, + 0,0,3736,3737,5,39,0,0,3737,3740,5,39,0,0,3738,3740,8,32,0,0,3739, + 3734,1,0,0,0,3739,3736,1,0,0,0,3739,3738,1,0,0,0,3740,3743,1,0,0, + 0,3741,3739,1,0,0,0,3741,3742,1,0,0,0,3742,3744,1,0,0,0,3743,3741, + 1,0,0,0,3744,3745,5,39,0,0,3745,710,1,0,0,0,3746,3754,5,96,0,0,3747, + 3748,5,92,0,0,3748,3753,9,0,0,0,3749,3750,5,96,0,0,3750,3753,5,96, + 0,0,3751,3753,8,33,0,0,3752,3747,1,0,0,0,3752,3749,1,0,0,0,3752, + 3751,1,0,0,0,3753,3756,1,0,0,0,3754,3752,1,0,0,0,3754,3755,1,0,0, + 0,3755,3757,1,0,0,0,3756,3754,1,0,0,0,3757,3758,5,96,0,0,3758,712, + 1,0,0,0,3759,3760,7,34,0,0,3760,714,1,0,0,0,3761,3762,7,35,0,0,3762, + 716,1,0,0,0,3763,3764,7,8,0,0,3764,3766,5,39,0,0,3765,3767,7,36, + 0,0,3766,3765,1,0,0,0,3767,3768,1,0,0,0,3768,3766,1,0,0,0,3768,3769, + 1,0,0,0,3769,3770,1,0,0,0,3770,3771,5,39,0,0,3771,718,1,0,0,0,3772, + 3773,9,0,0,0,3773,3774,1,0,0,0,3774,3775,6,359,2,0,3775,720,1,0, + 0,0,35,0,724,735,748,760,765,769,773,779,783,785,3621,3630,3640, + 3642,3647,3649,3655,3660,3668,3670,3676,3683,3687,3702,3707,3712, + 3717,3726,3728,3739,3741,3752,3754,3768,3,0,1,0,0,2,0,0,3,0 + ]; + + private static __ATN: antlr.ATN; + public static get _ATN(): antlr.ATN { + if (!OpenSearchSQLLexer.__ATN) { + OpenSearchSQLLexer.__ATN = new antlr.ATNDeserializer().deserialize(OpenSearchSQLLexer._serializedATN); + } + + return OpenSearchSQLLexer.__ATN; + } + + + private static readonly vocabulary = new antlr.Vocabulary(OpenSearchSQLLexer.literalNames, OpenSearchSQLLexer.symbolicNames, []); + + public override get vocabulary(): antlr.Vocabulary { + return OpenSearchSQLLexer.vocabulary; + } + + private static readonly decisionsToDFA = OpenSearchSQLLexer._ATN.decisionToState.map( (ds: antlr.DecisionState, index: number) => new antlr.DFA(ds, index) ); +} \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.interp b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.interp new file mode 100644 index 00000000000..7ad75b08df3 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.interp @@ -0,0 +1,829 @@ +token literal names: +null +null +null +null +null +'ALL' +'AND' +'AS' +'ASC' +'BOOLEAN' +'BETWEEN' +'BY' +'CASE' +'CAST' +'CROSS' +'COLUMNS' +'DATETIME' +'DELETE' +'DESC' +'DESCRIBE' +'DISTINCT' +'DOUBLE' +'ELSE' +'EXISTS' +'FALSE' +'FLOAT' +'FIRST' +'FROM' +'GROUP' +'HAVING' +'IN' +'INNER' +'INT' +'INTEGER' +'IS' +'JOIN' +'LAST' +'LEFT' +'LIKE' +'LIMIT' +'LONG' +'MATCH' +'NATURAL' +'MISSING' +'NOT' +'NULL' +'NULLS' +'ON' +'OR' +'ORDER' +'OUTER' +'OVER' +'PARTITION' +'REGEXP' +'RIGHT' +'SELECT' +'SHOW' +'STRING' +'THEN' +'TRUE' +'UNION' +'USING' +'WHEN' +'WHERE' +'MINUS' +'AVG' +'COUNT' +'MAX' +'MIN' +'SUM' +'VAR_POP' +'VAR_SAMP' +'VARIANCE' +'STD' +'STDDEV' +'STDDEV_POP' +'STDDEV_SAMP' +'SUBSTRING' +'TRIM' +'END' +'FULL' +'OFFSET' +'INTERVAL' +'MICROSECOND' +'SECOND' +'MINUTE' +'HOUR' +'DAY' +'WEEK' +'MONTH' +'QUARTER' +'YEAR' +'SECOND_MICROSECOND' +'MINUTE_MICROSECOND' +'MINUTE_SECOND' +'HOUR_MICROSECOND' +'HOUR_SECOND' +'HOUR_MINUTE' +'DAY_MICROSECOND' +'DAY_SECOND' +'DAY_MINUTE' +'DAY_HOUR' +'YEAR_MONTH' +'TABLES' +'ABS' +'ACOS' +'ADD' +'ADDTIME' +'ASCII' +'ASIN' +'ATAN' +'ATAN2' +'CBRT' +'CEIL' +'CEILING' +'CONCAT' +'CONCAT_WS' +'CONV' +'CONVERT_TZ' +'COS' +'COSH' +'COT' +'CRC32' +'CURDATE' +'CURTIME' +'CURRENT_DATE' +'CURRENT_TIME' +'CURRENT_TIMESTAMP' +'DATE' +'DATE_ADD' +'DATE_FORMAT' +'DATE_SUB' +'DATEDIFF' +'DAYNAME' +'DAYOFMONTH' +'DAYOFWEEK' +'DAYOFYEAR' +'DEGREES' +'DIVIDE' +'E' +'EXP' +'EXPM1' +'EXTRACT' +'FLOOR' +'FROM_DAYS' +'FROM_UNIXTIME' +'GET_FORMAT' +'IF' +'IFNULL' +'ISNULL' +'LAST_DAY' +'LENGTH' +'LN' +'LOCALTIME' +'LOCALTIMESTAMP' +'LOCATE' +'LOG' +'LOG10' +'LOG2' +'LOWER' +'LTRIM' +'MAKEDATE' +'MAKETIME' +'MODULUS' +'MONTHNAME' +'MULTIPLY' +'NOW' +'NULLIF' +'PERIOD_ADD' +'PERIOD_DIFF' +'PI' +'POSITION' +'POW' +'POWER' +'RADIANS' +'RAND' +'REPLACE' +'RINT' +'ROUND' +'RTRIM' +'REVERSE' +'SEC_TO_TIME' +'SIGN' +'SIGNUM' +'SIN' +'SINH' +'SQRT' +'STR_TO_DATE' +'SUBDATE' +'SUBTIME' +'SUBTRACT' +'SYSDATE' +'TAN' +'TIME' +'TIMEDIFF' +'TIME_FORMAT' +'TIME_TO_SEC' +'TIMESTAMP' +'TRUNCATE' +'TO_DAYS' +'TO_SECONDS' +'UNIX_TIMESTAMP' +'UPPER' +'UTC_DATE' +'UTC_TIME' +'UTC_TIMESTAMP' +'D' +'T' +'TS' +'{' +'}' +'DENSE_RANK' +'RANK' +'ROW_NUMBER' +'DATE_HISTOGRAM' +'DAY_OF_MONTH' +'DAY_OF_YEAR' +'DAY_OF_WEEK' +'EXCLUDE' +'EXTENDED_STATS' +'FIELD' +'FILTER' +'GEO_BOUNDING_BOX' +'GEO_CELL' +'GEO_DISTANCE' +'GEO_DISTANCE_RANGE' +'GEO_INTERSECTS' +'GEO_POLYGON' +'HISTOGRAM' +'HOUR_OF_DAY' +'INCLUDE' +'IN_TERMS' +'MATCHPHRASE' +'MATCH_PHRASE' +'MATCHPHRASEQUERY' +'SIMPLE_QUERY_STRING' +'QUERY_STRING' +'MATCH_PHRASE_PREFIX' +'MATCHQUERY' +'MATCH_QUERY' +'MINUTE_OF_DAY' +'MINUTE_OF_HOUR' +'MONTH_OF_YEAR' +'MULTIMATCH' +'MULTI_MATCH' +'MULTIMATCHQUERY' +'NESTED' +'PERCENTILES' +'PERCENTILE' +'PERCENTILE_APPROX' +'REGEXP_QUERY' +'REVERSE_NESTED' +'QUERY' +'RANGE' +'SCORE' +'SCOREQUERY' +'SCORE_QUERY' +'SECOND_OF_MINUTE' +'STATS' +'TERM' +'TERMS' +'TIMESTAMPADD' +'TIMESTAMPDIFF' +'TOPHITS' +'TYPEOF' +'WEEK_OF_YEAR' +'WEEKOFYEAR' +'WEEKDAY' +'WILDCARDQUERY' +'WILDCARD_QUERY' +'SUBSTR' +'STRCMP' +'ADDDATE' +'YEARWEEK' +'ALLOW_LEADING_WILDCARD' +'ANALYZER' +'ANALYZE_WILDCARD' +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY' +'BOOST' +'CASE_INSENSITIVE' +'CUTOFF_FREQUENCY' +'DEFAULT_FIELD' +'DEFAULT_OPERATOR' +'ESCAPE' +'ENABLE_POSITION_INCREMENTS' +'FIELDS' +'FLAGS' +'FUZZINESS' +'FUZZY_MAX_EXPANSIONS' +'FUZZY_PREFIX_LENGTH' +'FUZZY_REWRITE' +'FUZZY_TRANSPOSITIONS' +'LENIENT' +'LOW_FREQ_OPERATOR' +'MAX_DETERMINIZED_STATES' +'MAX_EXPANSIONS' +'MINIMUM_SHOULD_MATCH' +'OPERATOR' +'PHRASE_SLOP' +'PREFIX_LENGTH' +'QUOTE_ANALYZER' +'QUOTE_FIELD_SUFFIX' +'REWRITE' +'SLOP' +'TIE_BREAKER' +'TIME_ZONE' +'TYPE' +'ZERO_TERMS_QUERY' +'HIGHLIGHT' +'PRE_TAGS' +'POST_TAGS' +'MATCH_BOOL_PREFIX' +'*' +'/' +'%' +'+' +'-' +'DIV' +'MOD' +'=' +'>' +'<' +'!' +'~' +'|' +'&' +'^' +'.' +'(' +')' +'[' +']' +',' +';' +'@' +'0' +'1' +'2' +'\'' +'"' +'`' +':' +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +SPACE +SPEC_SQL_COMMENT +COMMENT_INPUT +LINE_COMMENT +ALL +AND +AS +ASC +BOOLEAN +BETWEEN +BY +CASE +CAST +CROSS +COLUMNS +DATETIME +DELETE +DESC +DESCRIBE +DISTINCT +DOUBLE +ELSE +EXISTS +FALSE +FLOAT +FIRST +FROM +GROUP +HAVING +IN +INNER +INT +INTEGER +IS +JOIN +LAST +LEFT +LIKE +LIMIT +LONG +MATCH +NATURAL +MISSING_LITERAL +NOT +NULL_LITERAL +NULLS +ON +OR +ORDER +OUTER +OVER +PARTITION +REGEXP +RIGHT +SELECT +SHOW +STRING +THEN +TRUE +UNION +USING +WHEN +WHERE +EXCEPT +AVG +COUNT +MAX +MIN +SUM +VAR_POP +VAR_SAMP +VARIANCE +STD +STDDEV +STDDEV_POP +STDDEV_SAMP +SUBSTRING +TRIM +END +FULL +OFFSET +INTERVAL +MICROSECOND +SECOND +MINUTE +HOUR +DAY +WEEK +MONTH +QUARTER +YEAR +SECOND_MICROSECOND +MINUTE_MICROSECOND +MINUTE_SECOND +HOUR_MICROSECOND +HOUR_SECOND +HOUR_MINUTE +DAY_MICROSECOND +DAY_SECOND +DAY_MINUTE +DAY_HOUR +YEAR_MONTH +TABLES +ABS +ACOS +ADD +ADDTIME +ASCII +ASIN +ATAN +ATAN2 +CBRT +CEIL +CEILING +CONCAT +CONCAT_WS +CONV +CONVERT_TZ +COS +COSH +COT +CRC32 +CURDATE +CURTIME +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +DATE +DATE_ADD +DATE_FORMAT +DATE_SUB +DATEDIFF +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DEGREES +DIVIDE +E +EXP +EXPM1 +EXTRACT +FLOOR +FROM_DAYS +FROM_UNIXTIME +GET_FORMAT +IF +IFNULL +ISNULL +LAST_DAY +LENGTH +LN +LOCALTIME +LOCALTIMESTAMP +LOCATE +LOG +LOG10 +LOG2 +LOWER +LTRIM +MAKEDATE +MAKETIME +MODULUS +MONTHNAME +MULTIPLY +NOW +NULLIF +PERIOD_ADD +PERIOD_DIFF +PI +POSITION +POW +POWER +RADIANS +RAND +REPLACE +RINT +ROUND +RTRIM +REVERSE +SEC_TO_TIME +SIGN +SIGNUM +SIN +SINH +SQRT +STR_TO_DATE +SUBDATE +SUBTIME +SUBTRACT +SYSDATE +TAN +TIME +TIMEDIFF +TIME_FORMAT +TIME_TO_SEC +TIMESTAMP +TRUNCATE +TO_DAYS +TO_SECONDS +UNIX_TIMESTAMP +UPPER +UTC_DATE +UTC_TIME +UTC_TIMESTAMP +D +T +TS +LEFT_BRACE +RIGHT_BRACE +DENSE_RANK +RANK +ROW_NUMBER +DATE_HISTOGRAM +DAY_OF_MONTH +DAY_OF_YEAR +DAY_OF_WEEK +EXCLUDE +EXTENDED_STATS +FIELD +FILTER +GEO_BOUNDING_BOX +GEO_CELL +GEO_DISTANCE +GEO_DISTANCE_RANGE +GEO_INTERSECTS +GEO_POLYGON +HISTOGRAM +HOUR_OF_DAY +INCLUDE +IN_TERMS +MATCHPHRASE +MATCH_PHRASE +MATCHPHRASEQUERY +SIMPLE_QUERY_STRING +QUERY_STRING +MATCH_PHRASE_PREFIX +MATCHQUERY +MATCH_QUERY +MINUTE_OF_DAY +MINUTE_OF_HOUR +MONTH_OF_YEAR +MULTIMATCH +MULTI_MATCH +MULTIMATCHQUERY +NESTED +PERCENTILES +PERCENTILE +PERCENTILE_APPROX +REGEXP_QUERY +REVERSE_NESTED +QUERY +RANGE +SCORE +SCOREQUERY +SCORE_QUERY +SECOND_OF_MINUTE +STATS +TERM +TERMS +TIMESTAMPADD +TIMESTAMPDIFF +TOPHITS +TYPEOF +WEEK_OF_YEAR +WEEKOFYEAR +WEEKDAY +WILDCARDQUERY +WILDCARD_QUERY +SUBSTR +STRCMP +ADDDATE +YEARWEEK +ALLOW_LEADING_WILDCARD +ANALYZER +ANALYZE_WILDCARD +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY +BOOST +CASE_INSENSITIVE +CUTOFF_FREQUENCY +DEFAULT_FIELD +DEFAULT_OPERATOR +ESCAPE +ENABLE_POSITION_INCREMENTS +FIELDS +FLAGS +FUZZINESS +FUZZY_MAX_EXPANSIONS +FUZZY_PREFIX_LENGTH +FUZZY_REWRITE +FUZZY_TRANSPOSITIONS +LENIENT +LOW_FREQ_OPERATOR +MAX_DETERMINIZED_STATES +MAX_EXPANSIONS +MINIMUM_SHOULD_MATCH +OPERATOR +PHRASE_SLOP +PREFIX_LENGTH +QUOTE_ANALYZER +QUOTE_FIELD_SUFFIX +REWRITE +SLOP +TIE_BREAKER +TIME_ZONE +TYPE +ZERO_TERMS_QUERY +HIGHLIGHT +HIGHLIGHT_PRE_TAGS +HIGHLIGHT_POST_TAGS +MATCH_BOOL_PREFIX +STAR +SLASH +MODULE +PLUS +MINUS +DIV +MOD +EQUAL_SYMBOL +GREATER_SYMBOL +LESS_SYMBOL +EXCLAMATION_SYMBOL +BIT_NOT_OP +BIT_OR_OP +BIT_AND_OP +BIT_XOR_OP +DOT +LR_BRACKET +RR_BRACKET +LT_SQR_PRTHS +RT_SQR_PRTHS +COMMA +SEMI +AT_SIGN +ZERO_DECIMAL +ONE_DECIMAL +TWO_DECIMAL +SINGLE_QUOTE_SYMB +DOUBLE_QUOTE_SYMB +REVERSE_QUOTE_SYMB +COLON_SYMB +START_NATIONAL_STRING_LITERAL +STRING_LITERAL +DECIMAL_LITERAL +HEXADECIMAL_LITERAL +REAL_LITERAL +NULL_SPEC_LITERAL +BIT_STRING +ID +DOUBLE_QUOTE_ID +BACKTICK_QUOTE_ID +ERROR_RECOGNITION + +rule names: +root +sqlStatement +dmlStatement +selectStatement +adminStatement +showStatement +describeStatement +columnFilter +tableFilter +showDescribePattern +compatibleID +querySpecification +selectClause +selectSpec +selectElements +selectElement +fromClause +relation +whereClause +groupByClause +groupByElements +groupByElement +havingClause +orderByClause +orderByElement +limitClause +windowFunctionClause +windowFunction +overClause +partitionByClause +constant +decimalLiteral +numericLiteral +stringLiteral +booleanLiteral +realLiteral +sign +nullLiteral +datetimeLiteral +dateLiteral +timeLiteral +timestampLiteral +datetimeConstantLiteral +intervalLiteral +intervalUnit +expression +predicate +expressions +expressionAtom +comparisonOperator +nullNotnull +functionCall +timestampFunction +timestampFunctionName +getFormatFunction +getFormatType +extractFunction +simpleDateTimePart +complexDateTimePart +datetimePart +highlightFunction +positionFunction +matchQueryAltSyntaxFunction +scalarFunctionName +specificFunction +relevanceFunction +scoreRelevanceFunction +noFieldRelevanceFunction +singleFieldRelevanceFunction +multiFieldRelevanceFunction +altSingleFieldRelevanceFunction +altMultiFieldRelevanceFunction +convertedDataType +caseFuncAlternative +aggregateFunction +percentileApproxFunction +filterClause +aggregationFunctionName +mathematicalFunctionName +trigonometricFunctionName +arithmeticFunctionName +dateTimeFunctionName +textFunctionName +flowControlFunctionName +noFieldRelevanceFunctionName +systemFunctionName +nestedFunctionName +scoreRelevanceFunctionName +singleFieldRelevanceFunctionName +multiFieldRelevanceFunctionName +altSingleFieldRelevanceFunctionName +altMultiFieldRelevanceFunctionName +functionArgs +functionArg +relevanceArg +highlightArg +relevanceArgName +highlightArgName +relevanceFieldAndWeight +relevanceFieldWeight +relevanceField +relevanceQuery +relevanceArgValue +highlightArgValue +alternateMultiMatchArgName +alternateMultiMatchQuery +alternateMultiMatchField +tableName +columnName +allTupleFields +alias +qualifiedName +ident +keywordsCanBeId + + +atn: +[4, 1, 352, 1112, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 1, 0, 3, 0, 230, 8, 0, 1, 0, 3, 0, 233, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 239, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 3, 4, 247, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 257, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 3, 9, 268, 8, 9, 1, 10, 4, 10, 271, 8, 10, 11, 10, 12, 10, 272, 1, 11, 1, 11, 3, 11, 277, 8, 11, 1, 11, 3, 11, 280, 8, 11, 1, 12, 1, 12, 3, 12, 284, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 3, 14, 292, 8, 14, 1, 14, 1, 14, 5, 14, 296, 8, 14, 10, 14, 12, 14, 299, 9, 14, 1, 15, 1, 15, 3, 15, 303, 8, 15, 1, 15, 3, 15, 306, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 311, 8, 16, 1, 16, 3, 16, 314, 8, 16, 1, 16, 3, 16, 317, 8, 16, 1, 16, 3, 16, 320, 8, 16, 1, 17, 1, 17, 3, 17, 324, 8, 17, 1, 17, 3, 17, 327, 8, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 333, 8, 17, 1, 17, 1, 17, 3, 17, 337, 8, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 349, 8, 20, 10, 20, 12, 20, 352, 9, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 364, 8, 23, 10, 23, 12, 23, 367, 9, 23, 1, 24, 1, 24, 3, 24, 371, 8, 24, 1, 24, 1, 24, 3, 24, 375, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 381, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 389, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 397, 8, 27, 1, 27, 1, 27, 3, 27, 401, 8, 27, 1, 28, 1, 28, 1, 28, 3, 28, 406, 8, 28, 1, 28, 3, 28, 409, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 418, 8, 29, 10, 29, 12, 29, 421, 9, 29, 1, 30, 1, 30, 3, 30, 425, 8, 30, 1, 30, 1, 30, 3, 30, 429, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 436, 8, 30, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 442, 8, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 457, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 466, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 475, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 484, 8, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 498, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 506, 8, 45, 10, 45, 12, 45, 509, 9, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 520, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 529, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 541, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 548, 8, 46, 10, 46, 12, 46, 551, 9, 46, 1, 47, 1, 47, 1, 47, 5, 47, 556, 8, 47, 10, 47, 12, 47, 559, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 569, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 577, 8, 48, 10, 48, 12, 48, 580, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 593, 8, 49, 1, 50, 3, 50, 596, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 615, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 626, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 3, 59, 661, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 668, 8, 60, 10, 60, 12, 60, 671, 9, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 695, 8, 63, 1, 64, 1, 64, 1, 64, 4, 64, 700, 8, 64, 11, 64, 12, 64, 701, 1, 64, 1, 64, 3, 64, 706, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 4, 64, 712, 8, 64, 11, 64, 12, 64, 713, 1, 64, 1, 64, 3, 64, 718, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 729, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 736, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 743, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 752, 8, 67, 10, 67, 12, 67, 755, 9, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 5, 68, 766, 8, 68, 10, 68, 12, 68, 769, 9, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 779, 8, 69, 10, 69, 12, 69, 782, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 789, 8, 69, 10, 69, 12, 69, 792, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 803, 8, 69, 10, 69, 12, 69, 806, 9, 69, 1, 69, 1, 69, 3, 69, 810, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 819, 8, 70, 10, 70, 12, 70, 822, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 833, 8, 71, 10, 71, 12, 71, 836, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 850, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 873, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 882, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 921, 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 986, 8, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1011, 8, 92, 10, 92, 12, 92, 1014, 9, 92, 3, 92, 1016, 8, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1028, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 3, 98, 1046, 8, 98, 1, 99, 1, 99, 1, 100, 1, 100, 3, 100, 1052, 8, 100, 1, 101, 1, 101, 1, 102, 1, 102, 3, 102, 1058, 8, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 3, 104, 1065, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1081, 8, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 5, 111, 1096, 8, 111, 10, 111, 12, 111, 1099, 9, 111, 1, 112, 3, 112, 1102, 8, 112, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1108, 8, 112, 1, 113, 1, 113, 1, 113, 1, 272, 3, 90, 92, 96, 114, 0, 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, 0, 33, 2, 0, 314, 314, 349, 349, 2, 0, 5, 5, 20, 20, 2, 0, 8, 8, 18, 18, 2, 0, 26, 26, 36, 36, 1, 0, 211, 213, 2, 0, 335, 337, 344, 344, 2, 0, 343, 343, 350, 350, 2, 0, 24, 24, 59, 59, 1, 0, 315, 316, 2, 0, 128, 128, 206, 206, 2, 0, 193, 193, 207, 207, 2, 0, 197, 197, 208, 208, 3, 0, 125, 127, 153, 154, 203, 205, 1, 0, 83, 102, 1, 0, 312, 314, 1, 0, 261, 262, 4, 0, 16, 16, 128, 128, 193, 193, 197, 197, 1, 0, 83, 91, 1, 0, 92, 102, 1, 0, 248, 249, 1, 0, 65, 76, 7, 0, 105, 105, 109, 111, 119, 121, 137, 137, 174, 174, 184, 185, 192, 192, 6, 0, 106, 106, 138, 138, 163, 163, 165, 165, 190, 190, 318, 318, 12, 0, 37, 37, 54, 54, 77, 78, 108, 108, 115, 116, 151, 151, 155, 155, 159, 160, 176, 176, 179, 180, 202, 202, 270, 271, 2, 0, 147, 149, 167, 167, 1, 0, 254, 256, 5, 0, 41, 41, 232, 234, 237, 239, 268, 269, 311, 311, 2, 0, 235, 236, 243, 245, 2, 0, 232, 233, 238, 239, 1, 0, 243, 244, 1, 0, 274, 307, 1, 0, 309, 310, 7, 0, 26, 26, 36, 36, 65, 69, 80, 80, 206, 208, 220, 220, 306, 306, 1220, 0, 229, 1, 0, 0, 0, 2, 238, 1, 0, 0, 0, 4, 240, 1, 0, 0, 0, 6, 242, 1, 0, 0, 0, 8, 246, 1, 0, 0, 0, 10, 248, 1, 0, 0, 0, 12, 252, 1, 0, 0, 0, 14, 258, 1, 0, 0, 0, 16, 262, 1, 0, 0, 0, 18, 267, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 274, 1, 0, 0, 0, 24, 281, 1, 0, 0, 0, 26, 287, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 300, 1, 0, 0, 0, 32, 307, 1, 0, 0, 0, 34, 336, 1, 0, 0, 0, 36, 338, 1, 0, 0, 0, 38, 341, 1, 0, 0, 0, 40, 345, 1, 0, 0, 0, 42, 353, 1, 0, 0, 0, 44, 355, 1, 0, 0, 0, 46, 358, 1, 0, 0, 0, 48, 368, 1, 0, 0, 0, 50, 388, 1, 0, 0, 0, 52, 390, 1, 0, 0, 0, 54, 400, 1, 0, 0, 0, 56, 402, 1, 0, 0, 0, 58, 412, 1, 0, 0, 0, 60, 435, 1, 0, 0, 0, 62, 437, 1, 0, 0, 0, 64, 441, 1, 0, 0, 0, 66, 443, 1, 0, 0, 0, 68, 445, 1, 0, 0, 0, 70, 447, 1, 0, 0, 0, 72, 449, 1, 0, 0, 0, 74, 451, 1, 0, 0, 0, 76, 456, 1, 0, 0, 0, 78, 465, 1, 0, 0, 0, 80, 474, 1, 0, 0, 0, 82, 483, 1, 0, 0, 0, 84, 485, 1, 0, 0, 0, 86, 487, 1, 0, 0, 0, 88, 491, 1, 0, 0, 0, 90, 497, 1, 0, 0, 0, 92, 510, 1, 0, 0, 0, 94, 552, 1, 0, 0, 0, 96, 568, 1, 0, 0, 0, 98, 592, 1, 0, 0, 0, 100, 595, 1, 0, 0, 0, 102, 625, 1, 0, 0, 0, 104, 627, 1, 0, 0, 0, 106, 636, 1, 0, 0, 0, 108, 638, 1, 0, 0, 0, 110, 645, 1, 0, 0, 0, 112, 647, 1, 0, 0, 0, 114, 654, 1, 0, 0, 0, 116, 656, 1, 0, 0, 0, 118, 660, 1, 0, 0, 0, 120, 662, 1, 0, 0, 0, 122, 674, 1, 0, 0, 0, 124, 681, 1, 0, 0, 0, 126, 694, 1, 0, 0, 0, 128, 728, 1, 0, 0, 0, 130, 735, 1, 0, 0, 0, 132, 737, 1, 0, 0, 0, 134, 746, 1, 0, 0, 0, 136, 758, 1, 0, 0, 0, 138, 809, 1, 0, 0, 0, 140, 811, 1, 0, 0, 0, 142, 825, 1, 0, 0, 0, 144, 849, 1, 0, 0, 0, 146, 851, 1, 0, 0, 0, 148, 872, 1, 0, 0, 0, 150, 874, 1, 0, 0, 0, 152, 885, 1, 0, 0, 0, 154, 891, 1, 0, 0, 0, 156, 920, 1, 0, 0, 0, 158, 922, 1, 0, 0, 0, 160, 924, 1, 0, 0, 0, 162, 985, 1, 0, 0, 0, 164, 987, 1, 0, 0, 0, 166, 989, 1, 0, 0, 0, 168, 991, 1, 0, 0, 0, 170, 993, 1, 0, 0, 0, 172, 995, 1, 0, 0, 0, 174, 997, 1, 0, 0, 0, 176, 999, 1, 0, 0, 0, 178, 1001, 1, 0, 0, 0, 180, 1003, 1, 0, 0, 0, 182, 1005, 1, 0, 0, 0, 184, 1015, 1, 0, 0, 0, 186, 1017, 1, 0, 0, 0, 188, 1027, 1, 0, 0, 0, 190, 1029, 1, 0, 0, 0, 192, 1033, 1, 0, 0, 0, 194, 1035, 1, 0, 0, 0, 196, 1045, 1, 0, 0, 0, 198, 1047, 1, 0, 0, 0, 200, 1051, 1, 0, 0, 0, 202, 1053, 1, 0, 0, 0, 204, 1057, 1, 0, 0, 0, 206, 1059, 1, 0, 0, 0, 208, 1064, 1, 0, 0, 0, 210, 1066, 1, 0, 0, 0, 212, 1080, 1, 0, 0, 0, 214, 1082, 1, 0, 0, 0, 216, 1084, 1, 0, 0, 0, 218, 1086, 1, 0, 0, 0, 220, 1090, 1, 0, 0, 0, 222, 1092, 1, 0, 0, 0, 224, 1107, 1, 0, 0, 0, 226, 1109, 1, 0, 0, 0, 228, 230, 3, 2, 1, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 233, 5, 333, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 0, 0, 1, 235, 1, 1, 0, 0, 0, 236, 239, 3, 4, 2, 0, 237, 239, 3, 8, 4, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 3, 1, 0, 0, 0, 240, 241, 3, 6, 3, 0, 241, 5, 1, 0, 0, 0, 242, 243, 3, 22, 11, 0, 243, 7, 1, 0, 0, 0, 244, 247, 3, 10, 5, 0, 245, 247, 3, 12, 6, 0, 246, 244, 1, 0, 0, 0, 246, 245, 1, 0, 0, 0, 247, 9, 1, 0, 0, 0, 248, 249, 5, 56, 0, 0, 249, 250, 5, 103, 0, 0, 250, 251, 3, 16, 8, 0, 251, 11, 1, 0, 0, 0, 252, 253, 5, 19, 0, 0, 253, 254, 5, 103, 0, 0, 254, 256, 3, 16, 8, 0, 255, 257, 3, 14, 7, 0, 256, 255, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 13, 1, 0, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 38, 0, 0, 260, 261, 3, 18, 9, 0, 261, 15, 1, 0, 0, 0, 262, 263, 5, 38, 0, 0, 263, 264, 3, 18, 9, 0, 264, 17, 1, 0, 0, 0, 265, 268, 3, 20, 10, 0, 266, 268, 3, 66, 33, 0, 267, 265, 1, 0, 0, 0, 267, 266, 1, 0, 0, 0, 268, 19, 1, 0, 0, 0, 269, 271, 7, 0, 0, 0, 270, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 21, 1, 0, 0, 0, 274, 276, 3, 24, 12, 0, 275, 277, 3, 32, 16, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 279, 1, 0, 0, 0, 278, 280, 3, 50, 25, 0, 279, 278, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 23, 1, 0, 0, 0, 281, 283, 5, 55, 0, 0, 282, 284, 3, 26, 13, 0, 283, 282, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 286, 3, 28, 14, 0, 286, 25, 1, 0, 0, 0, 287, 288, 7, 1, 0, 0, 288, 27, 1, 0, 0, 0, 289, 292, 5, 312, 0, 0, 290, 292, 3, 30, 15, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 292, 297, 1, 0, 0, 0, 293, 294, 5, 332, 0, 0, 294, 296, 3, 30, 15, 0, 295, 293, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 29, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 305, 3, 90, 45, 0, 301, 303, 5, 7, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 3, 220, 110, 0, 305, 302, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 31, 1, 0, 0, 0, 307, 308, 5, 27, 0, 0, 308, 310, 3, 34, 17, 0, 309, 311, 3, 36, 18, 0, 310, 309, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 313, 1, 0, 0, 0, 312, 314, 3, 38, 19, 0, 313, 312, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 317, 3, 44, 22, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 319, 1, 0, 0, 0, 318, 320, 3, 46, 23, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 33, 1, 0, 0, 0, 321, 326, 3, 214, 107, 0, 322, 324, 5, 7, 0, 0, 323, 322, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 3, 220, 110, 0, 326, 323, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 337, 1, 0, 0, 0, 328, 329, 5, 328, 0, 0, 329, 330, 3, 22, 11, 0, 330, 332, 5, 329, 0, 0, 331, 333, 5, 7, 0, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 335, 3, 220, 110, 0, 335, 337, 1, 0, 0, 0, 336, 321, 1, 0, 0, 0, 336, 328, 1, 0, 0, 0, 337, 35, 1, 0, 0, 0, 338, 339, 5, 63, 0, 0, 339, 340, 3, 90, 45, 0, 340, 37, 1, 0, 0, 0, 341, 342, 5, 28, 0, 0, 342, 343, 5, 11, 0, 0, 343, 344, 3, 40, 20, 0, 344, 39, 1, 0, 0, 0, 345, 350, 3, 42, 21, 0, 346, 347, 5, 332, 0, 0, 347, 349, 3, 42, 21, 0, 348, 346, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 41, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 3, 90, 45, 0, 354, 43, 1, 0, 0, 0, 355, 356, 5, 29, 0, 0, 356, 357, 3, 90, 45, 0, 357, 45, 1, 0, 0, 0, 358, 359, 5, 49, 0, 0, 359, 360, 5, 11, 0, 0, 360, 365, 3, 48, 24, 0, 361, 362, 5, 332, 0, 0, 362, 364, 3, 48, 24, 0, 363, 361, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 47, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 368, 370, 3, 90, 45, 0, 369, 371, 7, 2, 0, 0, 370, 369, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 373, 5, 46, 0, 0, 373, 375, 7, 3, 0, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 49, 1, 0, 0, 0, 376, 380, 5, 39, 0, 0, 377, 378, 3, 62, 31, 0, 378, 379, 5, 332, 0, 0, 379, 381, 1, 0, 0, 0, 380, 377, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 389, 3, 62, 31, 0, 383, 384, 5, 39, 0, 0, 384, 385, 3, 62, 31, 0, 385, 386, 5, 81, 0, 0, 386, 387, 3, 62, 31, 0, 387, 389, 1, 0, 0, 0, 388, 376, 1, 0, 0, 0, 388, 383, 1, 0, 0, 0, 389, 51, 1, 0, 0, 0, 390, 391, 3, 54, 27, 0, 391, 392, 3, 56, 28, 0, 392, 53, 1, 0, 0, 0, 393, 394, 7, 4, 0, 0, 394, 396, 5, 328, 0, 0, 395, 397, 3, 184, 92, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 401, 5, 329, 0, 0, 399, 401, 3, 148, 74, 0, 400, 393, 1, 0, 0, 0, 400, 399, 1, 0, 0, 0, 401, 55, 1, 0, 0, 0, 402, 403, 5, 51, 0, 0, 403, 405, 5, 328, 0, 0, 404, 406, 3, 58, 29, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 409, 3, 46, 23, 0, 408, 407, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 411, 5, 329, 0, 0, 411, 57, 1, 0, 0, 0, 412, 413, 5, 52, 0, 0, 413, 414, 5, 11, 0, 0, 414, 419, 3, 90, 45, 0, 415, 416, 5, 332, 0, 0, 416, 418, 3, 90, 45, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 59, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 436, 3, 66, 33, 0, 423, 425, 3, 72, 36, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 436, 3, 62, 31, 0, 427, 429, 3, 72, 36, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 436, 3, 70, 35, 0, 431, 436, 3, 68, 34, 0, 432, 436, 3, 76, 38, 0, 433, 436, 3, 86, 43, 0, 434, 436, 3, 74, 37, 0, 435, 422, 1, 0, 0, 0, 435, 424, 1, 0, 0, 0, 435, 428, 1, 0, 0, 0, 435, 431, 1, 0, 0, 0, 435, 432, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 434, 1, 0, 0, 0, 436, 61, 1, 0, 0, 0, 437, 438, 7, 5, 0, 0, 438, 63, 1, 0, 0, 0, 439, 442, 3, 62, 31, 0, 440, 442, 3, 70, 35, 0, 441, 439, 1, 0, 0, 0, 441, 440, 1, 0, 0, 0, 442, 65, 1, 0, 0, 0, 443, 444, 7, 6, 0, 0, 444, 67, 1, 0, 0, 0, 445, 446, 7, 7, 0, 0, 446, 69, 1, 0, 0, 0, 447, 448, 5, 346, 0, 0, 448, 71, 1, 0, 0, 0, 449, 450, 7, 8, 0, 0, 450, 73, 1, 0, 0, 0, 451, 452, 5, 45, 0, 0, 452, 75, 1, 0, 0, 0, 453, 457, 3, 78, 39, 0, 454, 457, 3, 80, 40, 0, 455, 457, 3, 82, 41, 0, 456, 453, 1, 0, 0, 0, 456, 454, 1, 0, 0, 0, 456, 455, 1, 0, 0, 0, 457, 77, 1, 0, 0, 0, 458, 459, 5, 128, 0, 0, 459, 466, 3, 66, 33, 0, 460, 461, 5, 209, 0, 0, 461, 462, 7, 9, 0, 0, 462, 463, 3, 66, 33, 0, 463, 464, 5, 210, 0, 0, 464, 466, 1, 0, 0, 0, 465, 458, 1, 0, 0, 0, 465, 460, 1, 0, 0, 0, 466, 79, 1, 0, 0, 0, 467, 468, 5, 193, 0, 0, 468, 475, 3, 66, 33, 0, 469, 470, 5, 209, 0, 0, 470, 471, 7, 10, 0, 0, 471, 472, 3, 66, 33, 0, 472, 473, 5, 210, 0, 0, 473, 475, 1, 0, 0, 0, 474, 467, 1, 0, 0, 0, 474, 469, 1, 0, 0, 0, 475, 81, 1, 0, 0, 0, 476, 477, 5, 197, 0, 0, 477, 484, 3, 66, 33, 0, 478, 479, 5, 209, 0, 0, 479, 480, 7, 11, 0, 0, 480, 481, 3, 66, 33, 0, 481, 482, 5, 210, 0, 0, 482, 484, 1, 0, 0, 0, 483, 476, 1, 0, 0, 0, 483, 478, 1, 0, 0, 0, 484, 83, 1, 0, 0, 0, 485, 486, 7, 12, 0, 0, 486, 85, 1, 0, 0, 0, 487, 488, 5, 82, 0, 0, 488, 489, 3, 90, 45, 0, 489, 490, 3, 88, 44, 0, 490, 87, 1, 0, 0, 0, 491, 492, 7, 13, 0, 0, 492, 89, 1, 0, 0, 0, 493, 494, 6, 45, -1, 0, 494, 495, 5, 44, 0, 0, 495, 498, 3, 90, 45, 4, 496, 498, 3, 92, 46, 0, 497, 493, 1, 0, 0, 0, 497, 496, 1, 0, 0, 0, 498, 507, 1, 0, 0, 0, 499, 500, 10, 3, 0, 0, 500, 501, 5, 6, 0, 0, 501, 506, 3, 90, 45, 4, 502, 503, 10, 2, 0, 0, 503, 504, 5, 48, 0, 0, 504, 506, 3, 90, 45, 3, 505, 499, 1, 0, 0, 0, 505, 502, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 91, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 6, 46, -1, 0, 511, 512, 3, 96, 48, 0, 512, 549, 1, 0, 0, 0, 513, 514, 10, 6, 0, 0, 514, 515, 3, 98, 49, 0, 515, 516, 3, 92, 46, 7, 516, 548, 1, 0, 0, 0, 517, 519, 10, 4, 0, 0, 518, 520, 5, 44, 0, 0, 519, 518, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 5, 10, 0, 0, 522, 523, 3, 92, 46, 0, 523, 524, 5, 6, 0, 0, 524, 525, 3, 92, 46, 5, 525, 548, 1, 0, 0, 0, 526, 528, 10, 3, 0, 0, 527, 529, 5, 44, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 38, 0, 0, 531, 548, 3, 92, 46, 4, 532, 533, 10, 2, 0, 0, 533, 534, 5, 53, 0, 0, 534, 548, 3, 92, 46, 3, 535, 536, 10, 5, 0, 0, 536, 537, 5, 34, 0, 0, 537, 548, 3, 100, 50, 0, 538, 540, 10, 1, 0, 0, 539, 541, 5, 44, 0, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 30, 0, 0, 543, 544, 5, 328, 0, 0, 544, 545, 3, 94, 47, 0, 545, 546, 5, 329, 0, 0, 546, 548, 1, 0, 0, 0, 547, 513, 1, 0, 0, 0, 547, 517, 1, 0, 0, 0, 547, 526, 1, 0, 0, 0, 547, 532, 1, 0, 0, 0, 547, 535, 1, 0, 0, 0, 547, 538, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 93, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 557, 3, 90, 45, 0, 553, 554, 5, 332, 0, 0, 554, 556, 3, 90, 45, 0, 555, 553, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 95, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 6, 48, -1, 0, 561, 569, 3, 60, 30, 0, 562, 569, 3, 216, 108, 0, 563, 569, 3, 102, 51, 0, 564, 565, 5, 328, 0, 0, 565, 566, 3, 90, 45, 0, 566, 567, 5, 329, 0, 0, 567, 569, 1, 0, 0, 0, 568, 560, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 563, 1, 0, 0, 0, 568, 564, 1, 0, 0, 0, 569, 578, 1, 0, 0, 0, 570, 571, 10, 2, 0, 0, 571, 572, 7, 14, 0, 0, 572, 577, 3, 96, 48, 3, 573, 574, 10, 1, 0, 0, 574, 575, 7, 8, 0, 0, 575, 577, 3, 96, 48, 2, 576, 570, 1, 0, 0, 0, 576, 573, 1, 0, 0, 0, 577, 580, 1, 0, 0, 0, 578, 576, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 97, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 581, 593, 5, 319, 0, 0, 582, 593, 5, 320, 0, 0, 583, 593, 5, 321, 0, 0, 584, 585, 5, 321, 0, 0, 585, 593, 5, 319, 0, 0, 586, 587, 5, 320, 0, 0, 587, 593, 5, 319, 0, 0, 588, 589, 5, 321, 0, 0, 589, 593, 5, 320, 0, 0, 590, 591, 5, 322, 0, 0, 591, 593, 5, 319, 0, 0, 592, 581, 1, 0, 0, 0, 592, 582, 1, 0, 0, 0, 592, 583, 1, 0, 0, 0, 592, 584, 1, 0, 0, 0, 592, 586, 1, 0, 0, 0, 592, 588, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 593, 99, 1, 0, 0, 0, 594, 596, 5, 44, 0, 0, 595, 594, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 5, 45, 0, 0, 598, 101, 1, 0, 0, 0, 599, 600, 3, 172, 86, 0, 600, 601, 5, 328, 0, 0, 601, 602, 3, 218, 109, 0, 602, 603, 5, 329, 0, 0, 603, 626, 1, 0, 0, 0, 604, 605, 3, 126, 63, 0, 605, 606, 5, 328, 0, 0, 606, 607, 3, 184, 92, 0, 607, 608, 5, 329, 0, 0, 608, 626, 1, 0, 0, 0, 609, 626, 3, 128, 64, 0, 610, 626, 3, 52, 26, 0, 611, 626, 3, 148, 74, 0, 612, 614, 3, 148, 74, 0, 613, 615, 3, 46, 23, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 3, 152, 76, 0, 617, 626, 1, 0, 0, 0, 618, 626, 3, 132, 66, 0, 619, 626, 3, 130, 65, 0, 620, 626, 3, 120, 60, 0, 621, 626, 3, 122, 61, 0, 622, 626, 3, 112, 56, 0, 623, 626, 3, 108, 54, 0, 624, 626, 3, 104, 52, 0, 625, 599, 1, 0, 0, 0, 625, 604, 1, 0, 0, 0, 625, 609, 1, 0, 0, 0, 625, 610, 1, 0, 0, 0, 625, 611, 1, 0, 0, 0, 625, 612, 1, 0, 0, 0, 625, 618, 1, 0, 0, 0, 625, 619, 1, 0, 0, 0, 625, 620, 1, 0, 0, 0, 625, 621, 1, 0, 0, 0, 625, 622, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 625, 624, 1, 0, 0, 0, 626, 103, 1, 0, 0, 0, 627, 628, 3, 106, 53, 0, 628, 629, 5, 328, 0, 0, 629, 630, 3, 114, 57, 0, 630, 631, 5, 332, 0, 0, 631, 632, 3, 186, 93, 0, 632, 633, 5, 332, 0, 0, 633, 634, 3, 186, 93, 0, 634, 635, 5, 329, 0, 0, 635, 105, 1, 0, 0, 0, 636, 637, 7, 15, 0, 0, 637, 107, 1, 0, 0, 0, 638, 639, 5, 146, 0, 0, 639, 640, 5, 328, 0, 0, 640, 641, 3, 110, 55, 0, 641, 642, 5, 332, 0, 0, 642, 643, 3, 186, 93, 0, 643, 644, 5, 329, 0, 0, 644, 109, 1, 0, 0, 0, 645, 646, 7, 16, 0, 0, 646, 111, 1, 0, 0, 0, 647, 648, 5, 142, 0, 0, 648, 649, 5, 328, 0, 0, 649, 650, 3, 118, 59, 0, 650, 651, 5, 27, 0, 0, 651, 652, 3, 186, 93, 0, 652, 653, 5, 329, 0, 0, 653, 113, 1, 0, 0, 0, 654, 655, 7, 17, 0, 0, 655, 115, 1, 0, 0, 0, 656, 657, 7, 18, 0, 0, 657, 117, 1, 0, 0, 0, 658, 661, 3, 114, 57, 0, 659, 661, 3, 116, 58, 0, 660, 658, 1, 0, 0, 0, 660, 659, 1, 0, 0, 0, 661, 119, 1, 0, 0, 0, 662, 663, 5, 308, 0, 0, 663, 664, 5, 328, 0, 0, 664, 669, 3, 200, 100, 0, 665, 666, 5, 332, 0, 0, 666, 668, 3, 190, 95, 0, 667, 665, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 5, 329, 0, 0, 673, 121, 1, 0, 0, 0, 674, 675, 5, 171, 0, 0, 675, 676, 5, 328, 0, 0, 676, 677, 3, 186, 93, 0, 677, 678, 5, 30, 0, 0, 678, 679, 3, 186, 93, 0, 679, 680, 5, 329, 0, 0, 680, 123, 1, 0, 0, 0, 681, 682, 3, 200, 100, 0, 682, 683, 5, 319, 0, 0, 683, 684, 5, 239, 0, 0, 684, 685, 5, 328, 0, 0, 685, 686, 3, 202, 101, 0, 686, 687, 5, 329, 0, 0, 687, 125, 1, 0, 0, 0, 688, 695, 3, 156, 78, 0, 689, 695, 3, 162, 81, 0, 690, 695, 3, 164, 82, 0, 691, 695, 3, 166, 83, 0, 692, 695, 3, 170, 85, 0, 693, 695, 3, 172, 86, 0, 694, 688, 1, 0, 0, 0, 694, 689, 1, 0, 0, 0, 694, 690, 1, 0, 0, 0, 694, 691, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 693, 1, 0, 0, 0, 695, 127, 1, 0, 0, 0, 696, 697, 5, 12, 0, 0, 697, 699, 3, 90, 45, 0, 698, 700, 3, 146, 73, 0, 699, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 705, 1, 0, 0, 0, 703, 704, 5, 22, 0, 0, 704, 706, 3, 186, 93, 0, 705, 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 708, 5, 79, 0, 0, 708, 729, 1, 0, 0, 0, 709, 711, 5, 12, 0, 0, 710, 712, 3, 146, 73, 0, 711, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 717, 1, 0, 0, 0, 715, 716, 5, 22, 0, 0, 716, 718, 3, 186, 93, 0, 717, 715, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 720, 5, 79, 0, 0, 720, 729, 1, 0, 0, 0, 721, 722, 5, 13, 0, 0, 722, 723, 5, 328, 0, 0, 723, 724, 3, 90, 45, 0, 724, 725, 5, 7, 0, 0, 725, 726, 3, 144, 72, 0, 726, 727, 5, 329, 0, 0, 727, 729, 1, 0, 0, 0, 728, 696, 1, 0, 0, 0, 728, 709, 1, 0, 0, 0, 728, 721, 1, 0, 0, 0, 729, 129, 1, 0, 0, 0, 730, 736, 3, 134, 67, 0, 731, 736, 3, 136, 68, 0, 732, 736, 3, 138, 69, 0, 733, 736, 3, 140, 70, 0, 734, 736, 3, 142, 71, 0, 735, 730, 1, 0, 0, 0, 735, 731, 1, 0, 0, 0, 735, 732, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 735, 734, 1, 0, 0, 0, 736, 131, 1, 0, 0, 0, 737, 738, 3, 174, 87, 0, 738, 739, 5, 328, 0, 0, 739, 742, 3, 130, 65, 0, 740, 741, 5, 332, 0, 0, 741, 743, 3, 198, 99, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 5, 329, 0, 0, 745, 133, 1, 0, 0, 0, 746, 747, 3, 168, 84, 0, 747, 748, 5, 328, 0, 0, 748, 753, 3, 202, 101, 0, 749, 750, 5, 332, 0, 0, 750, 752, 3, 188, 94, 0, 751, 749, 1, 0, 0, 0, 752, 755, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 756, 1, 0, 0, 0, 755, 753, 1, 0, 0, 0, 756, 757, 5, 329, 0, 0, 757, 135, 1, 0, 0, 0, 758, 759, 3, 176, 88, 0, 759, 760, 5, 328, 0, 0, 760, 761, 3, 200, 100, 0, 761, 762, 5, 332, 0, 0, 762, 767, 3, 202, 101, 0, 763, 764, 5, 332, 0, 0, 764, 766, 3, 188, 94, 0, 765, 763, 1, 0, 0, 0, 766, 769, 1, 0, 0, 0, 767, 765, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 770, 1, 0, 0, 0, 769, 767, 1, 0, 0, 0, 770, 771, 5, 329, 0, 0, 771, 137, 1, 0, 0, 0, 772, 773, 3, 178, 89, 0, 773, 774, 5, 328, 0, 0, 774, 775, 5, 330, 0, 0, 775, 780, 3, 196, 98, 0, 776, 777, 5, 332, 0, 0, 777, 779, 3, 196, 98, 0, 778, 776, 1, 0, 0, 0, 779, 782, 1, 0, 0, 0, 780, 778, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 783, 1, 0, 0, 0, 782, 780, 1, 0, 0, 0, 783, 784, 5, 331, 0, 0, 784, 785, 5, 332, 0, 0, 785, 790, 3, 202, 101, 0, 786, 787, 5, 332, 0, 0, 787, 789, 3, 188, 94, 0, 788, 786, 1, 0, 0, 0, 789, 792, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 793, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 793, 794, 5, 329, 0, 0, 794, 810, 1, 0, 0, 0, 795, 796, 3, 178, 89, 0, 796, 797, 5, 328, 0, 0, 797, 798, 3, 210, 105, 0, 798, 799, 5, 332, 0, 0, 799, 804, 3, 212, 106, 0, 800, 801, 5, 332, 0, 0, 801, 803, 3, 188, 94, 0, 802, 800, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 802, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 807, 1, 0, 0, 0, 806, 804, 1, 0, 0, 0, 807, 808, 5, 329, 0, 0, 808, 810, 1, 0, 0, 0, 809, 772, 1, 0, 0, 0, 809, 795, 1, 0, 0, 0, 810, 139, 1, 0, 0, 0, 811, 812, 3, 200, 100, 0, 812, 813, 5, 319, 0, 0, 813, 814, 3, 180, 90, 0, 814, 815, 5, 328, 0, 0, 815, 820, 3, 202, 101, 0, 816, 817, 5, 332, 0, 0, 817, 819, 3, 188, 94, 0, 818, 816, 1, 0, 0, 0, 819, 822, 1, 0, 0, 0, 820, 818, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 823, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 823, 824, 5, 329, 0, 0, 824, 141, 1, 0, 0, 0, 825, 826, 3, 200, 100, 0, 826, 827, 5, 319, 0, 0, 827, 828, 3, 182, 91, 0, 828, 829, 5, 328, 0, 0, 829, 834, 3, 202, 101, 0, 830, 831, 5, 332, 0, 0, 831, 833, 3, 188, 94, 0, 832, 830, 1, 0, 0, 0, 833, 836, 1, 0, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 1, 0, 0, 0, 836, 834, 1, 0, 0, 0, 837, 838, 5, 329, 0, 0, 838, 143, 1, 0, 0, 0, 839, 850, 5, 128, 0, 0, 840, 850, 5, 193, 0, 0, 841, 850, 5, 197, 0, 0, 842, 850, 5, 32, 0, 0, 843, 850, 5, 33, 0, 0, 844, 850, 5, 21, 0, 0, 845, 850, 5, 40, 0, 0, 846, 850, 5, 25, 0, 0, 847, 850, 5, 57, 0, 0, 848, 850, 5, 9, 0, 0, 849, 839, 1, 0, 0, 0, 849, 840, 1, 0, 0, 0, 849, 841, 1, 0, 0, 0, 849, 842, 1, 0, 0, 0, 849, 843, 1, 0, 0, 0, 849, 844, 1, 0, 0, 0, 849, 845, 1, 0, 0, 0, 849, 846, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 849, 848, 1, 0, 0, 0, 850, 145, 1, 0, 0, 0, 851, 852, 5, 62, 0, 0, 852, 853, 3, 186, 93, 0, 853, 854, 5, 58, 0, 0, 854, 855, 3, 186, 93, 0, 855, 147, 1, 0, 0, 0, 856, 857, 3, 154, 77, 0, 857, 858, 5, 328, 0, 0, 858, 859, 3, 186, 93, 0, 859, 860, 5, 329, 0, 0, 860, 873, 1, 0, 0, 0, 861, 862, 5, 66, 0, 0, 862, 863, 5, 328, 0, 0, 863, 864, 5, 312, 0, 0, 864, 873, 5, 329, 0, 0, 865, 866, 5, 66, 0, 0, 866, 867, 5, 328, 0, 0, 867, 868, 5, 20, 0, 0, 868, 869, 3, 186, 93, 0, 869, 870, 5, 329, 0, 0, 870, 873, 1, 0, 0, 0, 871, 873, 3, 150, 75, 0, 872, 856, 1, 0, 0, 0, 872, 861, 1, 0, 0, 0, 872, 865, 1, 0, 0, 0, 872, 871, 1, 0, 0, 0, 873, 149, 1, 0, 0, 0, 874, 875, 7, 19, 0, 0, 875, 876, 5, 328, 0, 0, 876, 877, 3, 186, 93, 0, 877, 878, 5, 332, 0, 0, 878, 881, 3, 64, 32, 0, 879, 880, 5, 332, 0, 0, 880, 882, 3, 64, 32, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 329, 0, 0, 884, 151, 1, 0, 0, 0, 885, 886, 5, 221, 0, 0, 886, 887, 5, 328, 0, 0, 887, 888, 5, 63, 0, 0, 888, 889, 3, 90, 45, 0, 889, 890, 5, 329, 0, 0, 890, 153, 1, 0, 0, 0, 891, 892, 7, 20, 0, 0, 892, 155, 1, 0, 0, 0, 893, 921, 5, 104, 0, 0, 894, 921, 5, 112, 0, 0, 895, 921, 5, 113, 0, 0, 896, 921, 5, 114, 0, 0, 897, 921, 5, 117, 0, 0, 898, 921, 5, 122, 0, 0, 899, 921, 5, 139, 0, 0, 900, 921, 5, 140, 0, 0, 901, 921, 5, 141, 0, 0, 902, 921, 5, 143, 0, 0, 903, 921, 5, 152, 0, 0, 904, 921, 5, 156, 0, 0, 905, 921, 5, 157, 0, 0, 906, 921, 5, 158, 0, 0, 907, 921, 5, 318, 0, 0, 908, 921, 5, 170, 0, 0, 909, 921, 5, 172, 0, 0, 910, 921, 5, 173, 0, 0, 911, 921, 5, 175, 0, 0, 912, 921, 5, 177, 0, 0, 913, 921, 5, 178, 0, 0, 914, 921, 5, 182, 0, 0, 915, 921, 5, 183, 0, 0, 916, 921, 5, 186, 0, 0, 917, 921, 5, 198, 0, 0, 918, 921, 3, 158, 79, 0, 919, 921, 3, 160, 80, 0, 920, 893, 1, 0, 0, 0, 920, 894, 1, 0, 0, 0, 920, 895, 1, 0, 0, 0, 920, 896, 1, 0, 0, 0, 920, 897, 1, 0, 0, 0, 920, 898, 1, 0, 0, 0, 920, 899, 1, 0, 0, 0, 920, 900, 1, 0, 0, 0, 920, 901, 1, 0, 0, 0, 920, 902, 1, 0, 0, 0, 920, 903, 1, 0, 0, 0, 920, 904, 1, 0, 0, 0, 920, 905, 1, 0, 0, 0, 920, 906, 1, 0, 0, 0, 920, 907, 1, 0, 0, 0, 920, 908, 1, 0, 0, 0, 920, 909, 1, 0, 0, 0, 920, 910, 1, 0, 0, 0, 920, 911, 1, 0, 0, 0, 920, 912, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 920, 914, 1, 0, 0, 0, 920, 915, 1, 0, 0, 0, 920, 916, 1, 0, 0, 0, 920, 917, 1, 0, 0, 0, 920, 918, 1, 0, 0, 0, 920, 919, 1, 0, 0, 0, 921, 157, 1, 0, 0, 0, 922, 923, 7, 21, 0, 0, 923, 159, 1, 0, 0, 0, 924, 925, 7, 22, 0, 0, 925, 161, 1, 0, 0, 0, 926, 986, 3, 84, 42, 0, 927, 986, 5, 272, 0, 0, 928, 986, 5, 107, 0, 0, 929, 986, 5, 118, 0, 0, 930, 986, 5, 123, 0, 0, 931, 986, 5, 124, 0, 0, 932, 986, 5, 128, 0, 0, 933, 986, 5, 129, 0, 0, 934, 986, 5, 130, 0, 0, 935, 986, 5, 131, 0, 0, 936, 986, 5, 132, 0, 0, 937, 986, 5, 16, 0, 0, 938, 986, 5, 87, 0, 0, 939, 986, 5, 133, 0, 0, 940, 986, 5, 134, 0, 0, 941, 986, 5, 215, 0, 0, 942, 986, 5, 135, 0, 0, 943, 986, 5, 136, 0, 0, 944, 986, 5, 216, 0, 0, 945, 986, 5, 217, 0, 0, 946, 986, 5, 144, 0, 0, 947, 986, 5, 145, 0, 0, 948, 986, 5, 86, 0, 0, 949, 986, 5, 229, 0, 0, 950, 986, 5, 150, 0, 0, 951, 986, 5, 161, 0, 0, 952, 986, 5, 162, 0, 0, 953, 986, 5, 83, 0, 0, 954, 986, 5, 85, 0, 0, 955, 986, 5, 240, 0, 0, 956, 986, 5, 241, 0, 0, 957, 986, 5, 89, 0, 0, 958, 986, 5, 164, 0, 0, 959, 986, 5, 242, 0, 0, 960, 986, 5, 166, 0, 0, 961, 986, 5, 168, 0, 0, 962, 986, 5, 169, 0, 0, 963, 986, 5, 90, 0, 0, 964, 986, 5, 181, 0, 0, 965, 986, 5, 84, 0, 0, 966, 986, 5, 257, 0, 0, 967, 986, 5, 188, 0, 0, 968, 986, 5, 189, 0, 0, 969, 986, 5, 191, 0, 0, 970, 986, 5, 187, 0, 0, 971, 986, 5, 193, 0, 0, 972, 986, 5, 195, 0, 0, 973, 986, 5, 196, 0, 0, 974, 986, 5, 194, 0, 0, 975, 986, 5, 197, 0, 0, 976, 986, 5, 199, 0, 0, 977, 986, 5, 200, 0, 0, 978, 986, 5, 201, 0, 0, 979, 986, 5, 88, 0, 0, 980, 986, 5, 267, 0, 0, 981, 986, 5, 265, 0, 0, 982, 986, 5, 266, 0, 0, 983, 986, 5, 91, 0, 0, 984, 986, 5, 273, 0, 0, 985, 926, 1, 0, 0, 0, 985, 927, 1, 0, 0, 0, 985, 928, 1, 0, 0, 0, 985, 929, 1, 0, 0, 0, 985, 930, 1, 0, 0, 0, 985, 931, 1, 0, 0, 0, 985, 932, 1, 0, 0, 0, 985, 933, 1, 0, 0, 0, 985, 934, 1, 0, 0, 0, 985, 935, 1, 0, 0, 0, 985, 936, 1, 0, 0, 0, 985, 937, 1, 0, 0, 0, 985, 938, 1, 0, 0, 0, 985, 939, 1, 0, 0, 0, 985, 940, 1, 0, 0, 0, 985, 941, 1, 0, 0, 0, 985, 942, 1, 0, 0, 0, 985, 943, 1, 0, 0, 0, 985, 944, 1, 0, 0, 0, 985, 945, 1, 0, 0, 0, 985, 946, 1, 0, 0, 0, 985, 947, 1, 0, 0, 0, 985, 948, 1, 0, 0, 0, 985, 949, 1, 0, 0, 0, 985, 950, 1, 0, 0, 0, 985, 951, 1, 0, 0, 0, 985, 952, 1, 0, 0, 0, 985, 953, 1, 0, 0, 0, 985, 954, 1, 0, 0, 0, 985, 955, 1, 0, 0, 0, 985, 956, 1, 0, 0, 0, 985, 957, 1, 0, 0, 0, 985, 958, 1, 0, 0, 0, 985, 959, 1, 0, 0, 0, 985, 960, 1, 0, 0, 0, 985, 961, 1, 0, 0, 0, 985, 962, 1, 0, 0, 0, 985, 963, 1, 0, 0, 0, 985, 964, 1, 0, 0, 0, 985, 965, 1, 0, 0, 0, 985, 966, 1, 0, 0, 0, 985, 967, 1, 0, 0, 0, 985, 968, 1, 0, 0, 0, 985, 969, 1, 0, 0, 0, 985, 970, 1, 0, 0, 0, 985, 971, 1, 0, 0, 0, 985, 972, 1, 0, 0, 0, 985, 973, 1, 0, 0, 0, 985, 974, 1, 0, 0, 0, 985, 975, 1, 0, 0, 0, 985, 976, 1, 0, 0, 0, 985, 977, 1, 0, 0, 0, 985, 978, 1, 0, 0, 0, 985, 979, 1, 0, 0, 0, 985, 980, 1, 0, 0, 0, 985, 981, 1, 0, 0, 0, 985, 982, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 985, 984, 1, 0, 0, 0, 986, 163, 1, 0, 0, 0, 987, 988, 7, 23, 0, 0, 988, 165, 1, 0, 0, 0, 989, 990, 7, 24, 0, 0, 990, 167, 1, 0, 0, 0, 991, 992, 5, 252, 0, 0, 992, 169, 1, 0, 0, 0, 993, 994, 5, 264, 0, 0, 994, 171, 1, 0, 0, 0, 995, 996, 5, 246, 0, 0, 996, 173, 1, 0, 0, 0, 997, 998, 7, 25, 0, 0, 998, 175, 1, 0, 0, 0, 999, 1000, 7, 26, 0, 0, 1000, 177, 1, 0, 0, 0, 1001, 1002, 7, 27, 0, 0, 1002, 179, 1, 0, 0, 0, 1003, 1004, 7, 28, 0, 0, 1004, 181, 1, 0, 0, 0, 1005, 1006, 7, 29, 0, 0, 1006, 183, 1, 0, 0, 0, 1007, 1012, 3, 186, 93, 0, 1008, 1009, 5, 332, 0, 0, 1009, 1011, 3, 186, 93, 0, 1010, 1008, 1, 0, 0, 0, 1011, 1014, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1016, 1, 0, 0, 0, 1014, 1012, 1, 0, 0, 0, 1015, 1007, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 185, 1, 0, 0, 0, 1017, 1018, 3, 90, 45, 0, 1018, 187, 1, 0, 0, 0, 1019, 1020, 3, 192, 96, 0, 1020, 1021, 5, 319, 0, 0, 1021, 1022, 3, 204, 102, 0, 1022, 1028, 1, 0, 0, 0, 1023, 1024, 3, 66, 33, 0, 1024, 1025, 5, 319, 0, 0, 1025, 1026, 3, 204, 102, 0, 1026, 1028, 1, 0, 0, 0, 1027, 1019, 1, 0, 0, 0, 1027, 1023, 1, 0, 0, 0, 1028, 189, 1, 0, 0, 0, 1029, 1030, 3, 194, 97, 0, 1030, 1031, 5, 319, 0, 0, 1031, 1032, 3, 206, 103, 0, 1032, 191, 1, 0, 0, 0, 1033, 1034, 7, 30, 0, 0, 1034, 193, 1, 0, 0, 0, 1035, 1036, 7, 31, 0, 0, 1036, 195, 1, 0, 0, 0, 1037, 1046, 3, 200, 100, 0, 1038, 1039, 3, 200, 100, 0, 1039, 1040, 3, 198, 99, 0, 1040, 1046, 1, 0, 0, 0, 1041, 1042, 3, 200, 100, 0, 1042, 1043, 5, 326, 0, 0, 1043, 1044, 3, 198, 99, 0, 1044, 1046, 1, 0, 0, 0, 1045, 1037, 1, 0, 0, 0, 1045, 1038, 1, 0, 0, 0, 1045, 1041, 1, 0, 0, 0, 1046, 197, 1, 0, 0, 0, 1047, 1048, 3, 64, 32, 0, 1048, 199, 1, 0, 0, 0, 1049, 1052, 3, 222, 111, 0, 1050, 1052, 3, 66, 33, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 201, 1, 0, 0, 0, 1053, 1054, 3, 204, 102, 0, 1054, 203, 1, 0, 0, 0, 1055, 1058, 3, 222, 111, 0, 1056, 1058, 3, 60, 30, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 205, 1, 0, 0, 0, 1059, 1060, 3, 66, 33, 0, 1060, 207, 1, 0, 0, 0, 1061, 1065, 5, 285, 0, 0, 1062, 1065, 5, 252, 0, 0, 1063, 1065, 3, 66, 33, 0, 1064, 1061, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1063, 1, 0, 0, 0, 1065, 209, 1, 0, 0, 0, 1066, 1067, 3, 208, 104, 0, 1067, 1068, 5, 319, 0, 0, 1068, 1069, 3, 204, 102, 0, 1069, 211, 1, 0, 0, 0, 1070, 1071, 3, 208, 104, 0, 1071, 1072, 5, 319, 0, 0, 1072, 1073, 3, 204, 102, 0, 1073, 1081, 1, 0, 0, 0, 1074, 1075, 3, 208, 104, 0, 1075, 1076, 5, 319, 0, 0, 1076, 1077, 5, 330, 0, 0, 1077, 1078, 3, 204, 102, 0, 1078, 1079, 5, 331, 0, 0, 1079, 1081, 1, 0, 0, 0, 1080, 1070, 1, 0, 0, 0, 1080, 1074, 1, 0, 0, 0, 1081, 213, 1, 0, 0, 0, 1082, 1083, 3, 222, 111, 0, 1083, 215, 1, 0, 0, 0, 1084, 1085, 3, 222, 111, 0, 1085, 217, 1, 0, 0, 0, 1086, 1087, 3, 222, 111, 0, 1087, 1088, 5, 327, 0, 0, 1088, 1089, 5, 312, 0, 0, 1089, 219, 1, 0, 0, 0, 1090, 1091, 3, 224, 112, 0, 1091, 221, 1, 0, 0, 0, 1092, 1097, 3, 224, 112, 0, 1093, 1094, 5, 327, 0, 0, 1094, 1096, 3, 224, 112, 0, 1095, 1093, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 223, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1102, 5, 327, 0, 0, 1101, 1100, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1108, 5, 349, 0, 0, 1104, 1108, 5, 351, 0, 0, 1105, 1108, 3, 226, 113, 0, 1106, 1108, 3, 126, 63, 0, 1107, 1101, 1, 0, 0, 0, 1107, 1104, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1106, 1, 0, 0, 0, 1108, 225, 1, 0, 0, 0, 1109, 1110, 7, 32, 0, 0, 1110, 227, 1, 0, 0, 0, 91, 229, 232, 238, 246, 256, 267, 272, 276, 279, 283, 291, 297, 302, 305, 310, 313, 316, 319, 323, 326, 332, 336, 350, 365, 370, 374, 380, 388, 396, 400, 405, 408, 419, 424, 428, 435, 441, 456, 465, 474, 483, 497, 505, 507, 519, 528, 540, 547, 549, 557, 568, 576, 578, 592, 595, 614, 625, 660, 669, 694, 701, 705, 713, 717, 728, 735, 742, 753, 767, 780, 790, 804, 809, 820, 834, 849, 872, 881, 920, 985, 1012, 1015, 1027, 1045, 1051, 1057, 1064, 1080, 1097, 1101, 1107] \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.tokens b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.tokens new file mode 100644 index 00000000000..80703f8b9ac --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.tokens @@ -0,0 +1,689 @@ +SPACE=1 +SPEC_SQL_COMMENT=2 +COMMENT_INPUT=3 +LINE_COMMENT=4 +ALL=5 +AND=6 +AS=7 +ASC=8 +BOOLEAN=9 +BETWEEN=10 +BY=11 +CASE=12 +CAST=13 +CROSS=14 +COLUMNS=15 +DATETIME=16 +DELETE=17 +DESC=18 +DESCRIBE=19 +DISTINCT=20 +DOUBLE=21 +ELSE=22 +EXISTS=23 +FALSE=24 +FLOAT=25 +FIRST=26 +FROM=27 +GROUP=28 +HAVING=29 +IN=30 +INNER=31 +INT=32 +INTEGER=33 +IS=34 +JOIN=35 +LAST=36 +LEFT=37 +LIKE=38 +LIMIT=39 +LONG=40 +MATCH=41 +NATURAL=42 +MISSING_LITERAL=43 +NOT=44 +NULL_LITERAL=45 +NULLS=46 +ON=47 +OR=48 +ORDER=49 +OUTER=50 +OVER=51 +PARTITION=52 +REGEXP=53 +RIGHT=54 +SELECT=55 +SHOW=56 +STRING=57 +THEN=58 +TRUE=59 +UNION=60 +USING=61 +WHEN=62 +WHERE=63 +EXCEPT=64 +AVG=65 +COUNT=66 +MAX=67 +MIN=68 +SUM=69 +VAR_POP=70 +VAR_SAMP=71 +VARIANCE=72 +STD=73 +STDDEV=74 +STDDEV_POP=75 +STDDEV_SAMP=76 +SUBSTRING=77 +TRIM=78 +END=79 +FULL=80 +OFFSET=81 +INTERVAL=82 +MICROSECOND=83 +SECOND=84 +MINUTE=85 +HOUR=86 +DAY=87 +WEEK=88 +MONTH=89 +QUARTER=90 +YEAR=91 +SECOND_MICROSECOND=92 +MINUTE_MICROSECOND=93 +MINUTE_SECOND=94 +HOUR_MICROSECOND=95 +HOUR_SECOND=96 +HOUR_MINUTE=97 +DAY_MICROSECOND=98 +DAY_SECOND=99 +DAY_MINUTE=100 +DAY_HOUR=101 +YEAR_MONTH=102 +TABLES=103 +ABS=104 +ACOS=105 +ADD=106 +ADDTIME=107 +ASCII=108 +ASIN=109 +ATAN=110 +ATAN2=111 +CBRT=112 +CEIL=113 +CEILING=114 +CONCAT=115 +CONCAT_WS=116 +CONV=117 +CONVERT_TZ=118 +COS=119 +COSH=120 +COT=121 +CRC32=122 +CURDATE=123 +CURTIME=124 +CURRENT_DATE=125 +CURRENT_TIME=126 +CURRENT_TIMESTAMP=127 +DATE=128 +DATE_ADD=129 +DATE_FORMAT=130 +DATE_SUB=131 +DATEDIFF=132 +DAYNAME=133 +DAYOFMONTH=134 +DAYOFWEEK=135 +DAYOFYEAR=136 +DEGREES=137 +DIVIDE=138 +E=139 +EXP=140 +EXPM1=141 +EXTRACT=142 +FLOOR=143 +FROM_DAYS=144 +FROM_UNIXTIME=145 +GET_FORMAT=146 +IF=147 +IFNULL=148 +ISNULL=149 +LAST_DAY=150 +LENGTH=151 +LN=152 +LOCALTIME=153 +LOCALTIMESTAMP=154 +LOCATE=155 +LOG=156 +LOG10=157 +LOG2=158 +LOWER=159 +LTRIM=160 +MAKEDATE=161 +MAKETIME=162 +MODULUS=163 +MONTHNAME=164 +MULTIPLY=165 +NOW=166 +NULLIF=167 +PERIOD_ADD=168 +PERIOD_DIFF=169 +PI=170 +POSITION=171 +POW=172 +POWER=173 +RADIANS=174 +RAND=175 +REPLACE=176 +RINT=177 +ROUND=178 +RTRIM=179 +REVERSE=180 +SEC_TO_TIME=181 +SIGN=182 +SIGNUM=183 +SIN=184 +SINH=185 +SQRT=186 +STR_TO_DATE=187 +SUBDATE=188 +SUBTIME=189 +SUBTRACT=190 +SYSDATE=191 +TAN=192 +TIME=193 +TIMEDIFF=194 +TIME_FORMAT=195 +TIME_TO_SEC=196 +TIMESTAMP=197 +TRUNCATE=198 +TO_DAYS=199 +TO_SECONDS=200 +UNIX_TIMESTAMP=201 +UPPER=202 +UTC_DATE=203 +UTC_TIME=204 +UTC_TIMESTAMP=205 +D=206 +T=207 +TS=208 +LEFT_BRACE=209 +RIGHT_BRACE=210 +DENSE_RANK=211 +RANK=212 +ROW_NUMBER=213 +DATE_HISTOGRAM=214 +DAY_OF_MONTH=215 +DAY_OF_YEAR=216 +DAY_OF_WEEK=217 +EXCLUDE=218 +EXTENDED_STATS=219 +FIELD=220 +FILTER=221 +GEO_BOUNDING_BOX=222 +GEO_CELL=223 +GEO_DISTANCE=224 +GEO_DISTANCE_RANGE=225 +GEO_INTERSECTS=226 +GEO_POLYGON=227 +HISTOGRAM=228 +HOUR_OF_DAY=229 +INCLUDE=230 +IN_TERMS=231 +MATCHPHRASE=232 +MATCH_PHRASE=233 +MATCHPHRASEQUERY=234 +SIMPLE_QUERY_STRING=235 +QUERY_STRING=236 +MATCH_PHRASE_PREFIX=237 +MATCHQUERY=238 +MATCH_QUERY=239 +MINUTE_OF_DAY=240 +MINUTE_OF_HOUR=241 +MONTH_OF_YEAR=242 +MULTIMATCH=243 +MULTI_MATCH=244 +MULTIMATCHQUERY=245 +NESTED=246 +PERCENTILES=247 +PERCENTILE=248 +PERCENTILE_APPROX=249 +REGEXP_QUERY=250 +REVERSE_NESTED=251 +QUERY=252 +RANGE=253 +SCORE=254 +SCOREQUERY=255 +SCORE_QUERY=256 +SECOND_OF_MINUTE=257 +STATS=258 +TERM=259 +TERMS=260 +TIMESTAMPADD=261 +TIMESTAMPDIFF=262 +TOPHITS=263 +TYPEOF=264 +WEEK_OF_YEAR=265 +WEEKOFYEAR=266 +WEEKDAY=267 +WILDCARDQUERY=268 +WILDCARD_QUERY=269 +SUBSTR=270 +STRCMP=271 +ADDDATE=272 +YEARWEEK=273 +ALLOW_LEADING_WILDCARD=274 +ANALYZER=275 +ANALYZE_WILDCARD=276 +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY=277 +BOOST=278 +CASE_INSENSITIVE=279 +CUTOFF_FREQUENCY=280 +DEFAULT_FIELD=281 +DEFAULT_OPERATOR=282 +ESCAPE=283 +ENABLE_POSITION_INCREMENTS=284 +FIELDS=285 +FLAGS=286 +FUZZINESS=287 +FUZZY_MAX_EXPANSIONS=288 +FUZZY_PREFIX_LENGTH=289 +FUZZY_REWRITE=290 +FUZZY_TRANSPOSITIONS=291 +LENIENT=292 +LOW_FREQ_OPERATOR=293 +MAX_DETERMINIZED_STATES=294 +MAX_EXPANSIONS=295 +MINIMUM_SHOULD_MATCH=296 +OPERATOR=297 +PHRASE_SLOP=298 +PREFIX_LENGTH=299 +QUOTE_ANALYZER=300 +QUOTE_FIELD_SUFFIX=301 +REWRITE=302 +SLOP=303 +TIE_BREAKER=304 +TIME_ZONE=305 +TYPE=306 +ZERO_TERMS_QUERY=307 +HIGHLIGHT=308 +HIGHLIGHT_PRE_TAGS=309 +HIGHLIGHT_POST_TAGS=310 +MATCH_BOOL_PREFIX=311 +STAR=312 +SLASH=313 +MODULE=314 +PLUS=315 +MINUS=316 +DIV=317 +MOD=318 +EQUAL_SYMBOL=319 +GREATER_SYMBOL=320 +LESS_SYMBOL=321 +EXCLAMATION_SYMBOL=322 +BIT_NOT_OP=323 +BIT_OR_OP=324 +BIT_AND_OP=325 +BIT_XOR_OP=326 +DOT=327 +LR_BRACKET=328 +RR_BRACKET=329 +LT_SQR_PRTHS=330 +RT_SQR_PRTHS=331 +COMMA=332 +SEMI=333 +AT_SIGN=334 +ZERO_DECIMAL=335 +ONE_DECIMAL=336 +TWO_DECIMAL=337 +SINGLE_QUOTE_SYMB=338 +DOUBLE_QUOTE_SYMB=339 +REVERSE_QUOTE_SYMB=340 +COLON_SYMB=341 +START_NATIONAL_STRING_LITERAL=342 +STRING_LITERAL=343 +DECIMAL_LITERAL=344 +HEXADECIMAL_LITERAL=345 +REAL_LITERAL=346 +NULL_SPEC_LITERAL=347 +BIT_STRING=348 +ID=349 +DOUBLE_QUOTE_ID=350 +BACKTICK_QUOTE_ID=351 +ERROR_RECOGNITION=352 +'ALL'=5 +'AND'=6 +'AS'=7 +'ASC'=8 +'BOOLEAN'=9 +'BETWEEN'=10 +'BY'=11 +'CASE'=12 +'CAST'=13 +'CROSS'=14 +'COLUMNS'=15 +'DATETIME'=16 +'DELETE'=17 +'DESC'=18 +'DESCRIBE'=19 +'DISTINCT'=20 +'DOUBLE'=21 +'ELSE'=22 +'EXISTS'=23 +'FALSE'=24 +'FLOAT'=25 +'FIRST'=26 +'FROM'=27 +'GROUP'=28 +'HAVING'=29 +'IN'=30 +'INNER'=31 +'INT'=32 +'INTEGER'=33 +'IS'=34 +'JOIN'=35 +'LAST'=36 +'LEFT'=37 +'LIKE'=38 +'LIMIT'=39 +'LONG'=40 +'MATCH'=41 +'NATURAL'=42 +'MISSING'=43 +'NOT'=44 +'NULL'=45 +'NULLS'=46 +'ON'=47 +'OR'=48 +'ORDER'=49 +'OUTER'=50 +'OVER'=51 +'PARTITION'=52 +'REGEXP'=53 +'RIGHT'=54 +'SELECT'=55 +'SHOW'=56 +'STRING'=57 +'THEN'=58 +'TRUE'=59 +'UNION'=60 +'USING'=61 +'WHEN'=62 +'WHERE'=63 +'MINUS'=64 +'AVG'=65 +'COUNT'=66 +'MAX'=67 +'MIN'=68 +'SUM'=69 +'VAR_POP'=70 +'VAR_SAMP'=71 +'VARIANCE'=72 +'STD'=73 +'STDDEV'=74 +'STDDEV_POP'=75 +'STDDEV_SAMP'=76 +'SUBSTRING'=77 +'TRIM'=78 +'END'=79 +'FULL'=80 +'OFFSET'=81 +'INTERVAL'=82 +'MICROSECOND'=83 +'SECOND'=84 +'MINUTE'=85 +'HOUR'=86 +'DAY'=87 +'WEEK'=88 +'MONTH'=89 +'QUARTER'=90 +'YEAR'=91 +'SECOND_MICROSECOND'=92 +'MINUTE_MICROSECOND'=93 +'MINUTE_SECOND'=94 +'HOUR_MICROSECOND'=95 +'HOUR_SECOND'=96 +'HOUR_MINUTE'=97 +'DAY_MICROSECOND'=98 +'DAY_SECOND'=99 +'DAY_MINUTE'=100 +'DAY_HOUR'=101 +'YEAR_MONTH'=102 +'TABLES'=103 +'ABS'=104 +'ACOS'=105 +'ADD'=106 +'ADDTIME'=107 +'ASCII'=108 +'ASIN'=109 +'ATAN'=110 +'ATAN2'=111 +'CBRT'=112 +'CEIL'=113 +'CEILING'=114 +'CONCAT'=115 +'CONCAT_WS'=116 +'CONV'=117 +'CONVERT_TZ'=118 +'COS'=119 +'COSH'=120 +'COT'=121 +'CRC32'=122 +'CURDATE'=123 +'CURTIME'=124 +'CURRENT_DATE'=125 +'CURRENT_TIME'=126 +'CURRENT_TIMESTAMP'=127 +'DATE'=128 +'DATE_ADD'=129 +'DATE_FORMAT'=130 +'DATE_SUB'=131 +'DATEDIFF'=132 +'DAYNAME'=133 +'DAYOFMONTH'=134 +'DAYOFWEEK'=135 +'DAYOFYEAR'=136 +'DEGREES'=137 +'DIVIDE'=138 +'E'=139 +'EXP'=140 +'EXPM1'=141 +'EXTRACT'=142 +'FLOOR'=143 +'FROM_DAYS'=144 +'FROM_UNIXTIME'=145 +'GET_FORMAT'=146 +'IF'=147 +'IFNULL'=148 +'ISNULL'=149 +'LAST_DAY'=150 +'LENGTH'=151 +'LN'=152 +'LOCALTIME'=153 +'LOCALTIMESTAMP'=154 +'LOCATE'=155 +'LOG'=156 +'LOG10'=157 +'LOG2'=158 +'LOWER'=159 +'LTRIM'=160 +'MAKEDATE'=161 +'MAKETIME'=162 +'MODULUS'=163 +'MONTHNAME'=164 +'MULTIPLY'=165 +'NOW'=166 +'NULLIF'=167 +'PERIOD_ADD'=168 +'PERIOD_DIFF'=169 +'PI'=170 +'POSITION'=171 +'POW'=172 +'POWER'=173 +'RADIANS'=174 +'RAND'=175 +'REPLACE'=176 +'RINT'=177 +'ROUND'=178 +'RTRIM'=179 +'REVERSE'=180 +'SEC_TO_TIME'=181 +'SIGN'=182 +'SIGNUM'=183 +'SIN'=184 +'SINH'=185 +'SQRT'=186 +'STR_TO_DATE'=187 +'SUBDATE'=188 +'SUBTIME'=189 +'SUBTRACT'=190 +'SYSDATE'=191 +'TAN'=192 +'TIME'=193 +'TIMEDIFF'=194 +'TIME_FORMAT'=195 +'TIME_TO_SEC'=196 +'TIMESTAMP'=197 +'TRUNCATE'=198 +'TO_DAYS'=199 +'TO_SECONDS'=200 +'UNIX_TIMESTAMP'=201 +'UPPER'=202 +'UTC_DATE'=203 +'UTC_TIME'=204 +'UTC_TIMESTAMP'=205 +'D'=206 +'T'=207 +'TS'=208 +'{'=209 +'}'=210 +'DENSE_RANK'=211 +'RANK'=212 +'ROW_NUMBER'=213 +'DATE_HISTOGRAM'=214 +'DAY_OF_MONTH'=215 +'DAY_OF_YEAR'=216 +'DAY_OF_WEEK'=217 +'EXCLUDE'=218 +'EXTENDED_STATS'=219 +'FIELD'=220 +'FILTER'=221 +'GEO_BOUNDING_BOX'=222 +'GEO_CELL'=223 +'GEO_DISTANCE'=224 +'GEO_DISTANCE_RANGE'=225 +'GEO_INTERSECTS'=226 +'GEO_POLYGON'=227 +'HISTOGRAM'=228 +'HOUR_OF_DAY'=229 +'INCLUDE'=230 +'IN_TERMS'=231 +'MATCHPHRASE'=232 +'MATCH_PHRASE'=233 +'MATCHPHRASEQUERY'=234 +'SIMPLE_QUERY_STRING'=235 +'QUERY_STRING'=236 +'MATCH_PHRASE_PREFIX'=237 +'MATCHQUERY'=238 +'MATCH_QUERY'=239 +'MINUTE_OF_DAY'=240 +'MINUTE_OF_HOUR'=241 +'MONTH_OF_YEAR'=242 +'MULTIMATCH'=243 +'MULTI_MATCH'=244 +'MULTIMATCHQUERY'=245 +'NESTED'=246 +'PERCENTILES'=247 +'PERCENTILE'=248 +'PERCENTILE_APPROX'=249 +'REGEXP_QUERY'=250 +'REVERSE_NESTED'=251 +'QUERY'=252 +'RANGE'=253 +'SCORE'=254 +'SCOREQUERY'=255 +'SCORE_QUERY'=256 +'SECOND_OF_MINUTE'=257 +'STATS'=258 +'TERM'=259 +'TERMS'=260 +'TIMESTAMPADD'=261 +'TIMESTAMPDIFF'=262 +'TOPHITS'=263 +'TYPEOF'=264 +'WEEK_OF_YEAR'=265 +'WEEKOFYEAR'=266 +'WEEKDAY'=267 +'WILDCARDQUERY'=268 +'WILDCARD_QUERY'=269 +'SUBSTR'=270 +'STRCMP'=271 +'ADDDATE'=272 +'YEARWEEK'=273 +'ALLOW_LEADING_WILDCARD'=274 +'ANALYZER'=275 +'ANALYZE_WILDCARD'=276 +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'=277 +'BOOST'=278 +'CASE_INSENSITIVE'=279 +'CUTOFF_FREQUENCY'=280 +'DEFAULT_FIELD'=281 +'DEFAULT_OPERATOR'=282 +'ESCAPE'=283 +'ENABLE_POSITION_INCREMENTS'=284 +'FIELDS'=285 +'FLAGS'=286 +'FUZZINESS'=287 +'FUZZY_MAX_EXPANSIONS'=288 +'FUZZY_PREFIX_LENGTH'=289 +'FUZZY_REWRITE'=290 +'FUZZY_TRANSPOSITIONS'=291 +'LENIENT'=292 +'LOW_FREQ_OPERATOR'=293 +'MAX_DETERMINIZED_STATES'=294 +'MAX_EXPANSIONS'=295 +'MINIMUM_SHOULD_MATCH'=296 +'OPERATOR'=297 +'PHRASE_SLOP'=298 +'PREFIX_LENGTH'=299 +'QUOTE_ANALYZER'=300 +'QUOTE_FIELD_SUFFIX'=301 +'REWRITE'=302 +'SLOP'=303 +'TIE_BREAKER'=304 +'TIME_ZONE'=305 +'TYPE'=306 +'ZERO_TERMS_QUERY'=307 +'HIGHLIGHT'=308 +'PRE_TAGS'=309 +'POST_TAGS'=310 +'MATCH_BOOL_PREFIX'=311 +'*'=312 +'/'=313 +'%'=314 +'+'=315 +'-'=316 +'DIV'=317 +'MOD'=318 +'='=319 +'>'=320 +'<'=321 +'!'=322 +'~'=323 +'|'=324 +'&'=325 +'^'=326 +'.'=327 +'('=328 +')'=329 +'['=330 +']'=331 +','=332 +';'=333 +'@'=334 +'0'=335 +'1'=336 +'2'=337 +'\''=338 +'"'=339 +'`'=340 +':'=341 diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.ts b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.ts new file mode 100644 index 00000000000..fc5d4d5bcd5 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParser.ts @@ -0,0 +1,12612 @@ +// Generated from ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 by ANTLR 4.13.1 + +import * as antlr from "antlr4ng"; +import { Token } from "antlr4ng"; + +import { OpenSearchSQLParserVisitor } from "./OpenSearchSQLParserVisitor.js"; + +// for running tests with parameters, TODO: discuss strategy for typed parameters in CI +// eslint-disable-next-line no-unused-vars +type int = number; + + +export class OpenSearchSQLParser extends antlr.Parser { + public static readonly SPACE = 1; + public static readonly SPEC_SQL_COMMENT = 2; + public static readonly COMMENT_INPUT = 3; + public static readonly LINE_COMMENT = 4; + public static readonly ALL = 5; + public static readonly AND = 6; + public static readonly AS = 7; + public static readonly ASC = 8; + public static readonly BOOLEAN = 9; + public static readonly BETWEEN = 10; + public static readonly BY = 11; + public static readonly CASE = 12; + public static readonly CAST = 13; + public static readonly CROSS = 14; + public static readonly COLUMNS = 15; + public static readonly DATETIME = 16; + public static readonly DELETE = 17; + public static readonly DESC = 18; + public static readonly DESCRIBE = 19; + public static readonly DISTINCT = 20; + public static readonly DOUBLE = 21; + public static readonly ELSE = 22; + public static readonly EXISTS = 23; + public static readonly FALSE = 24; + public static readonly FLOAT = 25; + public static readonly FIRST = 26; + public static readonly FROM = 27; + public static readonly GROUP = 28; + public static readonly HAVING = 29; + public static readonly IN = 30; + public static readonly INNER = 31; + public static readonly INT = 32; + public static readonly INTEGER = 33; + public static readonly IS = 34; + public static readonly JOIN = 35; + public static readonly LAST = 36; + public static readonly LEFT = 37; + public static readonly LIKE = 38; + public static readonly LIMIT = 39; + public static readonly LONG = 40; + public static readonly MATCH = 41; + public static readonly NATURAL = 42; + public static readonly MISSING_LITERAL = 43; + public static readonly NOT = 44; + public static readonly NULL_LITERAL = 45; + public static readonly NULLS = 46; + public static readonly ON = 47; + public static readonly OR = 48; + public static readonly ORDER = 49; + public static readonly OUTER = 50; + public static readonly OVER = 51; + public static readonly PARTITION = 52; + public static readonly REGEXP = 53; + public static readonly RIGHT = 54; + public static readonly SELECT = 55; + public static readonly SHOW = 56; + public static readonly STRING = 57; + public static readonly THEN = 58; + public static readonly TRUE = 59; + public static readonly UNION = 60; + public static readonly USING = 61; + public static readonly WHEN = 62; + public static readonly WHERE = 63; + public static readonly EXCEPT = 64; + public static readonly AVG = 65; + public static readonly COUNT = 66; + public static readonly MAX = 67; + public static readonly MIN = 68; + public static readonly SUM = 69; + public static readonly VAR_POP = 70; + public static readonly VAR_SAMP = 71; + public static readonly VARIANCE = 72; + public static readonly STD = 73; + public static readonly STDDEV = 74; + public static readonly STDDEV_POP = 75; + public static readonly STDDEV_SAMP = 76; + public static readonly SUBSTRING = 77; + public static readonly TRIM = 78; + public static readonly END = 79; + public static readonly FULL = 80; + public static readonly OFFSET = 81; + public static readonly INTERVAL = 82; + public static readonly MICROSECOND = 83; + public static readonly SECOND = 84; + public static readonly MINUTE = 85; + public static readonly HOUR = 86; + public static readonly DAY = 87; + public static readonly WEEK = 88; + public static readonly MONTH = 89; + public static readonly QUARTER = 90; + public static readonly YEAR = 91; + public static readonly SECOND_MICROSECOND = 92; + public static readonly MINUTE_MICROSECOND = 93; + public static readonly MINUTE_SECOND = 94; + public static readonly HOUR_MICROSECOND = 95; + public static readonly HOUR_SECOND = 96; + public static readonly HOUR_MINUTE = 97; + public static readonly DAY_MICROSECOND = 98; + public static readonly DAY_SECOND = 99; + public static readonly DAY_MINUTE = 100; + public static readonly DAY_HOUR = 101; + public static readonly YEAR_MONTH = 102; + public static readonly TABLES = 103; + public static readonly ABS = 104; + public static readonly ACOS = 105; + public static readonly ADD = 106; + public static readonly ADDTIME = 107; + public static readonly ASCII = 108; + public static readonly ASIN = 109; + public static readonly ATAN = 110; + public static readonly ATAN2 = 111; + public static readonly CBRT = 112; + public static readonly CEIL = 113; + public static readonly CEILING = 114; + public static readonly CONCAT = 115; + public static readonly CONCAT_WS = 116; + public static readonly CONV = 117; + public static readonly CONVERT_TZ = 118; + public static readonly COS = 119; + public static readonly COSH = 120; + public static readonly COT = 121; + public static readonly CRC32 = 122; + public static readonly CURDATE = 123; + public static readonly CURTIME = 124; + public static readonly CURRENT_DATE = 125; + public static readonly CURRENT_TIME = 126; + public static readonly CURRENT_TIMESTAMP = 127; + public static readonly DATE = 128; + public static readonly DATE_ADD = 129; + public static readonly DATE_FORMAT = 130; + public static readonly DATE_SUB = 131; + public static readonly DATEDIFF = 132; + public static readonly DAYNAME = 133; + public static readonly DAYOFMONTH = 134; + public static readonly DAYOFWEEK = 135; + public static readonly DAYOFYEAR = 136; + public static readonly DEGREES = 137; + public static readonly DIVIDE = 138; + public static readonly E = 139; + public static readonly EXP = 140; + public static readonly EXPM1 = 141; + public static readonly EXTRACT = 142; + public static readonly FLOOR = 143; + public static readonly FROM_DAYS = 144; + public static readonly FROM_UNIXTIME = 145; + public static readonly GET_FORMAT = 146; + public static readonly IF = 147; + public static readonly IFNULL = 148; + public static readonly ISNULL = 149; + public static readonly LAST_DAY = 150; + public static readonly LENGTH = 151; + public static readonly LN = 152; + public static readonly LOCALTIME = 153; + public static readonly LOCALTIMESTAMP = 154; + public static readonly LOCATE = 155; + public static readonly LOG = 156; + public static readonly LOG10 = 157; + public static readonly LOG2 = 158; + public static readonly LOWER = 159; + public static readonly LTRIM = 160; + public static readonly MAKEDATE = 161; + public static readonly MAKETIME = 162; + public static readonly MODULUS = 163; + public static readonly MONTHNAME = 164; + public static readonly MULTIPLY = 165; + public static readonly NOW = 166; + public static readonly NULLIF = 167; + public static readonly PERIOD_ADD = 168; + public static readonly PERIOD_DIFF = 169; + public static readonly PI = 170; + public static readonly POSITION = 171; + public static readonly POW = 172; + public static readonly POWER = 173; + public static readonly RADIANS = 174; + public static readonly RAND = 175; + public static readonly REPLACE = 176; + public static readonly RINT = 177; + public static readonly ROUND = 178; + public static readonly RTRIM = 179; + public static readonly REVERSE = 180; + public static readonly SEC_TO_TIME = 181; + public static readonly SIGN = 182; + public static readonly SIGNUM = 183; + public static readonly SIN = 184; + public static readonly SINH = 185; + public static readonly SQRT = 186; + public static readonly STR_TO_DATE = 187; + public static readonly SUBDATE = 188; + public static readonly SUBTIME = 189; + public static readonly SUBTRACT = 190; + public static readonly SYSDATE = 191; + public static readonly TAN = 192; + public static readonly TIME = 193; + public static readonly TIMEDIFF = 194; + public static readonly TIME_FORMAT = 195; + public static readonly TIME_TO_SEC = 196; + public static readonly TIMESTAMP = 197; + public static readonly TRUNCATE = 198; + public static readonly TO_DAYS = 199; + public static readonly TO_SECONDS = 200; + public static readonly UNIX_TIMESTAMP = 201; + public static readonly UPPER = 202; + public static readonly UTC_DATE = 203; + public static readonly UTC_TIME = 204; + public static readonly UTC_TIMESTAMP = 205; + public static readonly D = 206; + public static readonly T = 207; + public static readonly TS = 208; + public static readonly LEFT_BRACE = 209; + public static readonly RIGHT_BRACE = 210; + public static readonly DENSE_RANK = 211; + public static readonly RANK = 212; + public static readonly ROW_NUMBER = 213; + public static readonly DATE_HISTOGRAM = 214; + public static readonly DAY_OF_MONTH = 215; + public static readonly DAY_OF_YEAR = 216; + public static readonly DAY_OF_WEEK = 217; + public static readonly EXCLUDE = 218; + public static readonly EXTENDED_STATS = 219; + public static readonly FIELD = 220; + public static readonly FILTER = 221; + public static readonly GEO_BOUNDING_BOX = 222; + public static readonly GEO_CELL = 223; + public static readonly GEO_DISTANCE = 224; + public static readonly GEO_DISTANCE_RANGE = 225; + public static readonly GEO_INTERSECTS = 226; + public static readonly GEO_POLYGON = 227; + public static readonly HISTOGRAM = 228; + public static readonly HOUR_OF_DAY = 229; + public static readonly INCLUDE = 230; + public static readonly IN_TERMS = 231; + public static readonly MATCHPHRASE = 232; + public static readonly MATCH_PHRASE = 233; + public static readonly MATCHPHRASEQUERY = 234; + public static readonly SIMPLE_QUERY_STRING = 235; + public static readonly QUERY_STRING = 236; + public static readonly MATCH_PHRASE_PREFIX = 237; + public static readonly MATCHQUERY = 238; + public static readonly MATCH_QUERY = 239; + public static readonly MINUTE_OF_DAY = 240; + public static readonly MINUTE_OF_HOUR = 241; + public static readonly MONTH_OF_YEAR = 242; + public static readonly MULTIMATCH = 243; + public static readonly MULTI_MATCH = 244; + public static readonly MULTIMATCHQUERY = 245; + public static readonly NESTED = 246; + public static readonly PERCENTILES = 247; + public static readonly PERCENTILE = 248; + public static readonly PERCENTILE_APPROX = 249; + public static readonly REGEXP_QUERY = 250; + public static readonly REVERSE_NESTED = 251; + public static readonly QUERY = 252; + public static readonly RANGE = 253; + public static readonly SCORE = 254; + public static readonly SCOREQUERY = 255; + public static readonly SCORE_QUERY = 256; + public static readonly SECOND_OF_MINUTE = 257; + public static readonly STATS = 258; + public static readonly TERM = 259; + public static readonly TERMS = 260; + public static readonly TIMESTAMPADD = 261; + public static readonly TIMESTAMPDIFF = 262; + public static readonly TOPHITS = 263; + public static readonly TYPEOF = 264; + public static readonly WEEK_OF_YEAR = 265; + public static readonly WEEKOFYEAR = 266; + public static readonly WEEKDAY = 267; + public static readonly WILDCARDQUERY = 268; + public static readonly WILDCARD_QUERY = 269; + public static readonly SUBSTR = 270; + public static readonly STRCMP = 271; + public static readonly ADDDATE = 272; + public static readonly YEARWEEK = 273; + public static readonly ALLOW_LEADING_WILDCARD = 274; + public static readonly ANALYZER = 275; + public static readonly ANALYZE_WILDCARD = 276; + public static readonly AUTO_GENERATE_SYNONYMS_PHRASE_QUERY = 277; + public static readonly BOOST = 278; + public static readonly CASE_INSENSITIVE = 279; + public static readonly CUTOFF_FREQUENCY = 280; + public static readonly DEFAULT_FIELD = 281; + public static readonly DEFAULT_OPERATOR = 282; + public static readonly ESCAPE = 283; + public static readonly ENABLE_POSITION_INCREMENTS = 284; + public static readonly FIELDS = 285; + public static readonly FLAGS = 286; + public static readonly FUZZINESS = 287; + public static readonly FUZZY_MAX_EXPANSIONS = 288; + public static readonly FUZZY_PREFIX_LENGTH = 289; + public static readonly FUZZY_REWRITE = 290; + public static readonly FUZZY_TRANSPOSITIONS = 291; + public static readonly LENIENT = 292; + public static readonly LOW_FREQ_OPERATOR = 293; + public static readonly MAX_DETERMINIZED_STATES = 294; + public static readonly MAX_EXPANSIONS = 295; + public static readonly MINIMUM_SHOULD_MATCH = 296; + public static readonly OPERATOR = 297; + public static readonly PHRASE_SLOP = 298; + public static readonly PREFIX_LENGTH = 299; + public static readonly QUOTE_ANALYZER = 300; + public static readonly QUOTE_FIELD_SUFFIX = 301; + public static readonly REWRITE = 302; + public static readonly SLOP = 303; + public static readonly TIE_BREAKER = 304; + public static readonly TIME_ZONE = 305; + public static readonly TYPE = 306; + public static readonly ZERO_TERMS_QUERY = 307; + public static readonly HIGHLIGHT = 308; + public static readonly HIGHLIGHT_PRE_TAGS = 309; + public static readonly HIGHLIGHT_POST_TAGS = 310; + public static readonly MATCH_BOOL_PREFIX = 311; + public static readonly STAR = 312; + public static readonly SLASH = 313; + public static readonly MODULE = 314; + public static readonly PLUS = 315; + public static readonly MINUS = 316; + public static readonly DIV = 317; + public static readonly MOD = 318; + public static readonly EQUAL_SYMBOL = 319; + public static readonly GREATER_SYMBOL = 320; + public static readonly LESS_SYMBOL = 321; + public static readonly EXCLAMATION_SYMBOL = 322; + public static readonly BIT_NOT_OP = 323; + public static readonly BIT_OR_OP = 324; + public static readonly BIT_AND_OP = 325; + public static readonly BIT_XOR_OP = 326; + public static readonly DOT = 327; + public static readonly LR_BRACKET = 328; + public static readonly RR_BRACKET = 329; + public static readonly LT_SQR_PRTHS = 330; + public static readonly RT_SQR_PRTHS = 331; + public static readonly COMMA = 332; + public static readonly SEMI = 333; + public static readonly AT_SIGN = 334; + public static readonly ZERO_DECIMAL = 335; + public static readonly ONE_DECIMAL = 336; + public static readonly TWO_DECIMAL = 337; + public static readonly SINGLE_QUOTE_SYMB = 338; + public static readonly DOUBLE_QUOTE_SYMB = 339; + public static readonly REVERSE_QUOTE_SYMB = 340; + public static readonly COLON_SYMB = 341; + public static readonly START_NATIONAL_STRING_LITERAL = 342; + public static readonly STRING_LITERAL = 343; + public static readonly DECIMAL_LITERAL = 344; + public static readonly HEXADECIMAL_LITERAL = 345; + public static readonly REAL_LITERAL = 346; + public static readonly NULL_SPEC_LITERAL = 347; + public static readonly BIT_STRING = 348; + public static readonly ID = 349; + public static readonly DOUBLE_QUOTE_ID = 350; + public static readonly BACKTICK_QUOTE_ID = 351; + public static readonly ERROR_RECOGNITION = 352; + public static readonly RULE_root = 0; + public static readonly RULE_sqlStatement = 1; + public static readonly RULE_dmlStatement = 2; + public static readonly RULE_selectStatement = 3; + public static readonly RULE_adminStatement = 4; + public static readonly RULE_showStatement = 5; + public static readonly RULE_describeStatement = 6; + public static readonly RULE_columnFilter = 7; + public static readonly RULE_tableFilter = 8; + public static readonly RULE_showDescribePattern = 9; + public static readonly RULE_compatibleID = 10; + public static readonly RULE_querySpecification = 11; + public static readonly RULE_selectClause = 12; + public static readonly RULE_selectSpec = 13; + public static readonly RULE_selectElements = 14; + public static readonly RULE_selectElement = 15; + public static readonly RULE_fromClause = 16; + public static readonly RULE_relation = 17; + public static readonly RULE_whereClause = 18; + public static readonly RULE_groupByClause = 19; + public static readonly RULE_groupByElements = 20; + public static readonly RULE_groupByElement = 21; + public static readonly RULE_havingClause = 22; + public static readonly RULE_orderByClause = 23; + public static readonly RULE_orderByElement = 24; + public static readonly RULE_limitClause = 25; + public static readonly RULE_windowFunctionClause = 26; + public static readonly RULE_windowFunction = 27; + public static readonly RULE_overClause = 28; + public static readonly RULE_partitionByClause = 29; + public static readonly RULE_constant = 30; + public static readonly RULE_decimalLiteral = 31; + public static readonly RULE_numericLiteral = 32; + public static readonly RULE_stringLiteral = 33; + public static readonly RULE_booleanLiteral = 34; + public static readonly RULE_realLiteral = 35; + public static readonly RULE_sign = 36; + public static readonly RULE_nullLiteral = 37; + public static readonly RULE_datetimeLiteral = 38; + public static readonly RULE_dateLiteral = 39; + public static readonly RULE_timeLiteral = 40; + public static readonly RULE_timestampLiteral = 41; + public static readonly RULE_datetimeConstantLiteral = 42; + public static readonly RULE_intervalLiteral = 43; + public static readonly RULE_intervalUnit = 44; + public static readonly RULE_expression = 45; + public static readonly RULE_predicate = 46; + public static readonly RULE_expressions = 47; + public static readonly RULE_expressionAtom = 48; + public static readonly RULE_comparisonOperator = 49; + public static readonly RULE_nullNotnull = 50; + public static readonly RULE_functionCall = 51; + public static readonly RULE_timestampFunction = 52; + public static readonly RULE_timestampFunctionName = 53; + public static readonly RULE_getFormatFunction = 54; + public static readonly RULE_getFormatType = 55; + public static readonly RULE_extractFunction = 56; + public static readonly RULE_simpleDateTimePart = 57; + public static readonly RULE_complexDateTimePart = 58; + public static readonly RULE_datetimePart = 59; + public static readonly RULE_highlightFunction = 60; + public static readonly RULE_positionFunction = 61; + public static readonly RULE_matchQueryAltSyntaxFunction = 62; + public static readonly RULE_scalarFunctionName = 63; + public static readonly RULE_specificFunction = 64; + public static readonly RULE_relevanceFunction = 65; + public static readonly RULE_scoreRelevanceFunction = 66; + public static readonly RULE_noFieldRelevanceFunction = 67; + public static readonly RULE_singleFieldRelevanceFunction = 68; + public static readonly RULE_multiFieldRelevanceFunction = 69; + public static readonly RULE_altSingleFieldRelevanceFunction = 70; + public static readonly RULE_altMultiFieldRelevanceFunction = 71; + public static readonly RULE_convertedDataType = 72; + public static readonly RULE_caseFuncAlternative = 73; + public static readonly RULE_aggregateFunction = 74; + public static readonly RULE_percentileApproxFunction = 75; + public static readonly RULE_filterClause = 76; + public static readonly RULE_aggregationFunctionName = 77; + public static readonly RULE_mathematicalFunctionName = 78; + public static readonly RULE_trigonometricFunctionName = 79; + public static readonly RULE_arithmeticFunctionName = 80; + public static readonly RULE_dateTimeFunctionName = 81; + public static readonly RULE_textFunctionName = 82; + public static readonly RULE_flowControlFunctionName = 83; + public static readonly RULE_noFieldRelevanceFunctionName = 84; + public static readonly RULE_systemFunctionName = 85; + public static readonly RULE_nestedFunctionName = 86; + public static readonly RULE_scoreRelevanceFunctionName = 87; + public static readonly RULE_singleFieldRelevanceFunctionName = 88; + public static readonly RULE_multiFieldRelevanceFunctionName = 89; + public static readonly RULE_altSingleFieldRelevanceFunctionName = 90; + public static readonly RULE_altMultiFieldRelevanceFunctionName = 91; + public static readonly RULE_functionArgs = 92; + public static readonly RULE_functionArg = 93; + public static readonly RULE_relevanceArg = 94; + public static readonly RULE_highlightArg = 95; + public static readonly RULE_relevanceArgName = 96; + public static readonly RULE_highlightArgName = 97; + public static readonly RULE_relevanceFieldAndWeight = 98; + public static readonly RULE_relevanceFieldWeight = 99; + public static readonly RULE_relevanceField = 100; + public static readonly RULE_relevanceQuery = 101; + public static readonly RULE_relevanceArgValue = 102; + public static readonly RULE_highlightArgValue = 103; + public static readonly RULE_alternateMultiMatchArgName = 104; + public static readonly RULE_alternateMultiMatchQuery = 105; + public static readonly RULE_alternateMultiMatchField = 106; + public static readonly RULE_tableName = 107; + public static readonly RULE_columnName = 108; + public static readonly RULE_allTupleFields = 109; + public static readonly RULE_alias = 110; + public static readonly RULE_qualifiedName = 111; + public static readonly RULE_ident = 112; + public static readonly RULE_keywordsCanBeId = 113; + + public static readonly literalNames = [ + null, null, null, null, null, "'ALL'", "'AND'", "'AS'", "'ASC'", + "'BOOLEAN'", "'BETWEEN'", "'BY'", "'CASE'", "'CAST'", "'CROSS'", + "'COLUMNS'", "'DATETIME'", "'DELETE'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", + "'DOUBLE'", "'ELSE'", "'EXISTS'", "'FALSE'", "'FLOAT'", "'FIRST'", + "'FROM'", "'GROUP'", "'HAVING'", "'IN'", "'INNER'", "'INT'", "'INTEGER'", + "'IS'", "'JOIN'", "'LAST'", "'LEFT'", "'LIKE'", "'LIMIT'", "'LONG'", + "'MATCH'", "'NATURAL'", "'MISSING'", "'NOT'", "'NULL'", "'NULLS'", + "'ON'", "'OR'", "'ORDER'", "'OUTER'", "'OVER'", "'PARTITION'", "'REGEXP'", + "'RIGHT'", "'SELECT'", "'SHOW'", "'STRING'", "'THEN'", "'TRUE'", + "'UNION'", "'USING'", "'WHEN'", "'WHERE'", "'MINUS'", "'AVG'", "'COUNT'", + "'MAX'", "'MIN'", "'SUM'", "'VAR_POP'", "'VAR_SAMP'", "'VARIANCE'", + "'STD'", "'STDDEV'", "'STDDEV_POP'", "'STDDEV_SAMP'", "'SUBSTRING'", + "'TRIM'", "'END'", "'FULL'", "'OFFSET'", "'INTERVAL'", "'MICROSECOND'", + "'SECOND'", "'MINUTE'", "'HOUR'", "'DAY'", "'WEEK'", "'MONTH'", + "'QUARTER'", "'YEAR'", "'SECOND_MICROSECOND'", "'MINUTE_MICROSECOND'", + "'MINUTE_SECOND'", "'HOUR_MICROSECOND'", "'HOUR_SECOND'", "'HOUR_MINUTE'", + "'DAY_MICROSECOND'", "'DAY_SECOND'", "'DAY_MINUTE'", "'DAY_HOUR'", + "'YEAR_MONTH'", "'TABLES'", "'ABS'", "'ACOS'", "'ADD'", "'ADDTIME'", + "'ASCII'", "'ASIN'", "'ATAN'", "'ATAN2'", "'CBRT'", "'CEIL'", "'CEILING'", + "'CONCAT'", "'CONCAT_WS'", "'CONV'", "'CONVERT_TZ'", "'COS'", "'COSH'", + "'COT'", "'CRC32'", "'CURDATE'", "'CURTIME'", "'CURRENT_DATE'", + "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", "'DATE'", "'DATE_ADD'", + "'DATE_FORMAT'", "'DATE_SUB'", "'DATEDIFF'", "'DAYNAME'", "'DAYOFMONTH'", + "'DAYOFWEEK'", "'DAYOFYEAR'", "'DEGREES'", "'DIVIDE'", "'E'", "'EXP'", + "'EXPM1'", "'EXTRACT'", "'FLOOR'", "'FROM_DAYS'", "'FROM_UNIXTIME'", + "'GET_FORMAT'", "'IF'", "'IFNULL'", "'ISNULL'", "'LAST_DAY'", "'LENGTH'", + "'LN'", "'LOCALTIME'", "'LOCALTIMESTAMP'", "'LOCATE'", "'LOG'", + "'LOG10'", "'LOG2'", "'LOWER'", "'LTRIM'", "'MAKEDATE'", "'MAKETIME'", + "'MODULUS'", "'MONTHNAME'", "'MULTIPLY'", "'NOW'", "'NULLIF'", "'PERIOD_ADD'", + "'PERIOD_DIFF'", "'PI'", "'POSITION'", "'POW'", "'POWER'", "'RADIANS'", + "'RAND'", "'REPLACE'", "'RINT'", "'ROUND'", "'RTRIM'", "'REVERSE'", + "'SEC_TO_TIME'", "'SIGN'", "'SIGNUM'", "'SIN'", "'SINH'", "'SQRT'", + "'STR_TO_DATE'", "'SUBDATE'", "'SUBTIME'", "'SUBTRACT'", "'SYSDATE'", + "'TAN'", "'TIME'", "'TIMEDIFF'", "'TIME_FORMAT'", "'TIME_TO_SEC'", + "'TIMESTAMP'", "'TRUNCATE'", "'TO_DAYS'", "'TO_SECONDS'", "'UNIX_TIMESTAMP'", + "'UPPER'", "'UTC_DATE'", "'UTC_TIME'", "'UTC_TIMESTAMP'", "'D'", + "'T'", "'TS'", "'{'", "'}'", "'DENSE_RANK'", "'RANK'", "'ROW_NUMBER'", + "'DATE_HISTOGRAM'", "'DAY_OF_MONTH'", "'DAY_OF_YEAR'", "'DAY_OF_WEEK'", + "'EXCLUDE'", "'EXTENDED_STATS'", "'FIELD'", "'FILTER'", "'GEO_BOUNDING_BOX'", + "'GEO_CELL'", "'GEO_DISTANCE'", "'GEO_DISTANCE_RANGE'", "'GEO_INTERSECTS'", + "'GEO_POLYGON'", "'HISTOGRAM'", "'HOUR_OF_DAY'", "'INCLUDE'", "'IN_TERMS'", + "'MATCHPHRASE'", "'MATCH_PHRASE'", "'MATCHPHRASEQUERY'", "'SIMPLE_QUERY_STRING'", + "'QUERY_STRING'", "'MATCH_PHRASE_PREFIX'", "'MATCHQUERY'", "'MATCH_QUERY'", + "'MINUTE_OF_DAY'", "'MINUTE_OF_HOUR'", "'MONTH_OF_YEAR'", "'MULTIMATCH'", + "'MULTI_MATCH'", "'MULTIMATCHQUERY'", "'NESTED'", "'PERCENTILES'", + "'PERCENTILE'", "'PERCENTILE_APPROX'", "'REGEXP_QUERY'", "'REVERSE_NESTED'", + "'QUERY'", "'RANGE'", "'SCORE'", "'SCOREQUERY'", "'SCORE_QUERY'", + "'SECOND_OF_MINUTE'", "'STATS'", "'TERM'", "'TERMS'", "'TIMESTAMPADD'", + "'TIMESTAMPDIFF'", "'TOPHITS'", "'TYPEOF'", "'WEEK_OF_YEAR'", "'WEEKOFYEAR'", + "'WEEKDAY'", "'WILDCARDQUERY'", "'WILDCARD_QUERY'", "'SUBSTR'", + "'STRCMP'", "'ADDDATE'", "'YEARWEEK'", "'ALLOW_LEADING_WILDCARD'", + "'ANALYZER'", "'ANALYZE_WILDCARD'", "'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'", + "'BOOST'", "'CASE_INSENSITIVE'", "'CUTOFF_FREQUENCY'", "'DEFAULT_FIELD'", + "'DEFAULT_OPERATOR'", "'ESCAPE'", "'ENABLE_POSITION_INCREMENTS'", + "'FIELDS'", "'FLAGS'", "'FUZZINESS'", "'FUZZY_MAX_EXPANSIONS'", + "'FUZZY_PREFIX_LENGTH'", "'FUZZY_REWRITE'", "'FUZZY_TRANSPOSITIONS'", + "'LENIENT'", "'LOW_FREQ_OPERATOR'", "'MAX_DETERMINIZED_STATES'", + "'MAX_EXPANSIONS'", "'MINIMUM_SHOULD_MATCH'", "'OPERATOR'", "'PHRASE_SLOP'", + "'PREFIX_LENGTH'", "'QUOTE_ANALYZER'", "'QUOTE_FIELD_SUFFIX'", "'REWRITE'", + "'SLOP'", "'TIE_BREAKER'", "'TIME_ZONE'", "'TYPE'", "'ZERO_TERMS_QUERY'", + "'HIGHLIGHT'", "'PRE_TAGS'", "'POST_TAGS'", "'MATCH_BOOL_PREFIX'", + "'*'", "'/'", "'%'", "'+'", "'-'", "'DIV'", "'MOD'", "'='", "'>'", + "'<'", "'!'", "'~'", "'|'", "'&'", "'^'", "'.'", "'('", "')'", "'['", + "']'", "','", "';'", "'@'", "'0'", "'1'", "'2'", "'''", "'\"'", + "'`'", "':'" + ]; + + public static readonly symbolicNames = [ + null, "SPACE", "SPEC_SQL_COMMENT", "COMMENT_INPUT", "LINE_COMMENT", + "ALL", "AND", "AS", "ASC", "BOOLEAN", "BETWEEN", "BY", "CASE", "CAST", + "CROSS", "COLUMNS", "DATETIME", "DELETE", "DESC", "DESCRIBE", "DISTINCT", + "DOUBLE", "ELSE", "EXISTS", "FALSE", "FLOAT", "FIRST", "FROM", "GROUP", + "HAVING", "IN", "INNER", "INT", "INTEGER", "IS", "JOIN", "LAST", + "LEFT", "LIKE", "LIMIT", "LONG", "MATCH", "NATURAL", "MISSING_LITERAL", + "NOT", "NULL_LITERAL", "NULLS", "ON", "OR", "ORDER", "OUTER", "OVER", + "PARTITION", "REGEXP", "RIGHT", "SELECT", "SHOW", "STRING", "THEN", + "TRUE", "UNION", "USING", "WHEN", "WHERE", "EXCEPT", "AVG", "COUNT", + "MAX", "MIN", "SUM", "VAR_POP", "VAR_SAMP", "VARIANCE", "STD", "STDDEV", + "STDDEV_POP", "STDDEV_SAMP", "SUBSTRING", "TRIM", "END", "FULL", + "OFFSET", "INTERVAL", "MICROSECOND", "SECOND", "MINUTE", "HOUR", + "DAY", "WEEK", "MONTH", "QUARTER", "YEAR", "SECOND_MICROSECOND", + "MINUTE_MICROSECOND", "MINUTE_SECOND", "HOUR_MICROSECOND", "HOUR_SECOND", + "HOUR_MINUTE", "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", "DAY_HOUR", + "YEAR_MONTH", "TABLES", "ABS", "ACOS", "ADD", "ADDTIME", "ASCII", + "ASIN", "ATAN", "ATAN2", "CBRT", "CEIL", "CEILING", "CONCAT", "CONCAT_WS", + "CONV", "CONVERT_TZ", "COS", "COSH", "COT", "CRC32", "CURDATE", + "CURTIME", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", + "DATE", "DATE_ADD", "DATE_FORMAT", "DATE_SUB", "DATEDIFF", "DAYNAME", + "DAYOFMONTH", "DAYOFWEEK", "DAYOFYEAR", "DEGREES", "DIVIDE", "E", + "EXP", "EXPM1", "EXTRACT", "FLOOR", "FROM_DAYS", "FROM_UNIXTIME", + "GET_FORMAT", "IF", "IFNULL", "ISNULL", "LAST_DAY", "LENGTH", "LN", + "LOCALTIME", "LOCALTIMESTAMP", "LOCATE", "LOG", "LOG10", "LOG2", + "LOWER", "LTRIM", "MAKEDATE", "MAKETIME", "MODULUS", "MONTHNAME", + "MULTIPLY", "NOW", "NULLIF", "PERIOD_ADD", "PERIOD_DIFF", "PI", + "POSITION", "POW", "POWER", "RADIANS", "RAND", "REPLACE", "RINT", + "ROUND", "RTRIM", "REVERSE", "SEC_TO_TIME", "SIGN", "SIGNUM", "SIN", + "SINH", "SQRT", "STR_TO_DATE", "SUBDATE", "SUBTIME", "SUBTRACT", + "SYSDATE", "TAN", "TIME", "TIMEDIFF", "TIME_FORMAT", "TIME_TO_SEC", + "TIMESTAMP", "TRUNCATE", "TO_DAYS", "TO_SECONDS", "UNIX_TIMESTAMP", + "UPPER", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "D", "T", "TS", + "LEFT_BRACE", "RIGHT_BRACE", "DENSE_RANK", "RANK", "ROW_NUMBER", + "DATE_HISTOGRAM", "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK", + "EXCLUDE", "EXTENDED_STATS", "FIELD", "FILTER", "GEO_BOUNDING_BOX", + "GEO_CELL", "GEO_DISTANCE", "GEO_DISTANCE_RANGE", "GEO_INTERSECTS", + "GEO_POLYGON", "HISTOGRAM", "HOUR_OF_DAY", "INCLUDE", "IN_TERMS", + "MATCHPHRASE", "MATCH_PHRASE", "MATCHPHRASEQUERY", "SIMPLE_QUERY_STRING", + "QUERY_STRING", "MATCH_PHRASE_PREFIX", "MATCHQUERY", "MATCH_QUERY", + "MINUTE_OF_DAY", "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "MULTIMATCH", + "MULTI_MATCH", "MULTIMATCHQUERY", "NESTED", "PERCENTILES", "PERCENTILE", + "PERCENTILE_APPROX", "REGEXP_QUERY", "REVERSE_NESTED", "QUERY", + "RANGE", "SCORE", "SCOREQUERY", "SCORE_QUERY", "SECOND_OF_MINUTE", + "STATS", "TERM", "TERMS", "TIMESTAMPADD", "TIMESTAMPDIFF", "TOPHITS", + "TYPEOF", "WEEK_OF_YEAR", "WEEKOFYEAR", "WEEKDAY", "WILDCARDQUERY", + "WILDCARD_QUERY", "SUBSTR", "STRCMP", "ADDDATE", "YEARWEEK", "ALLOW_LEADING_WILDCARD", + "ANALYZER", "ANALYZE_WILDCARD", "AUTO_GENERATE_SYNONYMS_PHRASE_QUERY", + "BOOST", "CASE_INSENSITIVE", "CUTOFF_FREQUENCY", "DEFAULT_FIELD", + "DEFAULT_OPERATOR", "ESCAPE", "ENABLE_POSITION_INCREMENTS", "FIELDS", + "FLAGS", "FUZZINESS", "FUZZY_MAX_EXPANSIONS", "FUZZY_PREFIX_LENGTH", + "FUZZY_REWRITE", "FUZZY_TRANSPOSITIONS", "LENIENT", "LOW_FREQ_OPERATOR", + "MAX_DETERMINIZED_STATES", "MAX_EXPANSIONS", "MINIMUM_SHOULD_MATCH", + "OPERATOR", "PHRASE_SLOP", "PREFIX_LENGTH", "QUOTE_ANALYZER", "QUOTE_FIELD_SUFFIX", + "REWRITE", "SLOP", "TIE_BREAKER", "TIME_ZONE", "TYPE", "ZERO_TERMS_QUERY", + "HIGHLIGHT", "HIGHLIGHT_PRE_TAGS", "HIGHLIGHT_POST_TAGS", "MATCH_BOOL_PREFIX", + "STAR", "SLASH", "MODULE", "PLUS", "MINUS", "DIV", "MOD", "EQUAL_SYMBOL", + "GREATER_SYMBOL", "LESS_SYMBOL", "EXCLAMATION_SYMBOL", "BIT_NOT_OP", + "BIT_OR_OP", "BIT_AND_OP", "BIT_XOR_OP", "DOT", "LR_BRACKET", "RR_BRACKET", + "LT_SQR_PRTHS", "RT_SQR_PRTHS", "COMMA", "SEMI", "AT_SIGN", "ZERO_DECIMAL", + "ONE_DECIMAL", "TWO_DECIMAL", "SINGLE_QUOTE_SYMB", "DOUBLE_QUOTE_SYMB", + "REVERSE_QUOTE_SYMB", "COLON_SYMB", "START_NATIONAL_STRING_LITERAL", + "STRING_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "REAL_LITERAL", + "NULL_SPEC_LITERAL", "BIT_STRING", "ID", "DOUBLE_QUOTE_ID", "BACKTICK_QUOTE_ID", + "ERROR_RECOGNITION" + ]; + public static readonly ruleNames = [ + "root", "sqlStatement", "dmlStatement", "selectStatement", "adminStatement", + "showStatement", "describeStatement", "columnFilter", "tableFilter", + "showDescribePattern", "compatibleID", "querySpecification", "selectClause", + "selectSpec", "selectElements", "selectElement", "fromClause", "relation", + "whereClause", "groupByClause", "groupByElements", "groupByElement", + "havingClause", "orderByClause", "orderByElement", "limitClause", + "windowFunctionClause", "windowFunction", "overClause", "partitionByClause", + "constant", "decimalLiteral", "numericLiteral", "stringLiteral", + "booleanLiteral", "realLiteral", "sign", "nullLiteral", "datetimeLiteral", + "dateLiteral", "timeLiteral", "timestampLiteral", "datetimeConstantLiteral", + "intervalLiteral", "intervalUnit", "expression", "predicate", "expressions", + "expressionAtom", "comparisonOperator", "nullNotnull", "functionCall", + "timestampFunction", "timestampFunctionName", "getFormatFunction", + "getFormatType", "extractFunction", "simpleDateTimePart", "complexDateTimePart", + "datetimePart", "highlightFunction", "positionFunction", "matchQueryAltSyntaxFunction", + "scalarFunctionName", "specificFunction", "relevanceFunction", "scoreRelevanceFunction", + "noFieldRelevanceFunction", "singleFieldRelevanceFunction", "multiFieldRelevanceFunction", + "altSingleFieldRelevanceFunction", "altMultiFieldRelevanceFunction", + "convertedDataType", "caseFuncAlternative", "aggregateFunction", + "percentileApproxFunction", "filterClause", "aggregationFunctionName", + "mathematicalFunctionName", "trigonometricFunctionName", "arithmeticFunctionName", + "dateTimeFunctionName", "textFunctionName", "flowControlFunctionName", + "noFieldRelevanceFunctionName", "systemFunctionName", "nestedFunctionName", + "scoreRelevanceFunctionName", "singleFieldRelevanceFunctionName", + "multiFieldRelevanceFunctionName", "altSingleFieldRelevanceFunctionName", + "altMultiFieldRelevanceFunctionName", "functionArgs", "functionArg", + "relevanceArg", "highlightArg", "relevanceArgName", "highlightArgName", + "relevanceFieldAndWeight", "relevanceFieldWeight", "relevanceField", + "relevanceQuery", "relevanceArgValue", "highlightArgValue", "alternateMultiMatchArgName", + "alternateMultiMatchQuery", "alternateMultiMatchField", "tableName", + "columnName", "allTupleFields", "alias", "qualifiedName", "ident", + "keywordsCanBeId", + ]; + + public get grammarFileName(): string { return "OpenSearchSQLParser.g4"; } + public get literalNames(): (string | null)[] { return OpenSearchSQLParser.literalNames; } + public get symbolicNames(): (string | null)[] { return OpenSearchSQLParser.symbolicNames; } + public get ruleNames(): string[] { return OpenSearchSQLParser.ruleNames; } + public get serializedATN(): number[] { return OpenSearchSQLParser._serializedATN; } + + protected createFailedPredicateException(predicate?: string, message?: string): antlr.FailedPredicateException { + return new antlr.FailedPredicateException(this, predicate, message); + } + + public constructor(input: antlr.TokenStream) { + super(input); + this.interpreter = new antlr.ParserATNSimulator(this, OpenSearchSQLParser._ATN, OpenSearchSQLParser.decisionsToDFA, new antlr.PredictionContextCache()); + } + public root(): RootContext { + let localContext = new RootContext(this.context, this.state); + this.enterRule(localContext, 0, OpenSearchSQLParser.RULE_root); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 229; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 19 || _la === 55 || _la === 56) { + { + this.state = 228; + this.sqlStatement(); + } + } + + this.state = 232; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 333) { + { + this.state = 231; + this.match(OpenSearchSQLParser.SEMI); + } + } + + this.state = 234; + this.match(OpenSearchSQLParser.EOF); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public sqlStatement(): SqlStatementContext { + let localContext = new SqlStatementContext(this.context, this.state); + this.enterRule(localContext, 2, OpenSearchSQLParser.RULE_sqlStatement); + try { + this.state = 238; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.SELECT: + this.enterOuterAlt(localContext, 1); + { + this.state = 236; + this.dmlStatement(); + } + break; + case OpenSearchSQLParser.DESCRIBE: + case OpenSearchSQLParser.SHOW: + this.enterOuterAlt(localContext, 2); + { + this.state = 237; + this.adminStatement(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public dmlStatement(): DmlStatementContext { + let localContext = new DmlStatementContext(this.context, this.state); + this.enterRule(localContext, 4, OpenSearchSQLParser.RULE_dmlStatement); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 240; + this.selectStatement(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public selectStatement(): SelectStatementContext { + let localContext = new SelectStatementContext(this.context, this.state); + this.enterRule(localContext, 6, OpenSearchSQLParser.RULE_selectStatement); + try { + localContext = new SimpleSelectContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 242; + this.querySpecification(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public adminStatement(): AdminStatementContext { + let localContext = new AdminStatementContext(this.context, this.state); + this.enterRule(localContext, 8, OpenSearchSQLParser.RULE_adminStatement); + try { + this.state = 246; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.SHOW: + this.enterOuterAlt(localContext, 1); + { + this.state = 244; + this.showStatement(); + } + break; + case OpenSearchSQLParser.DESCRIBE: + this.enterOuterAlt(localContext, 2); + { + this.state = 245; + this.describeStatement(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public showStatement(): ShowStatementContext { + let localContext = new ShowStatementContext(this.context, this.state); + this.enterRule(localContext, 10, OpenSearchSQLParser.RULE_showStatement); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 248; + this.match(OpenSearchSQLParser.SHOW); + this.state = 249; + this.match(OpenSearchSQLParser.TABLES); + this.state = 250; + this.tableFilter(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public describeStatement(): DescribeStatementContext { + let localContext = new DescribeStatementContext(this.context, this.state); + this.enterRule(localContext, 12, OpenSearchSQLParser.RULE_describeStatement); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 252; + this.match(OpenSearchSQLParser.DESCRIBE); + this.state = 253; + this.match(OpenSearchSQLParser.TABLES); + this.state = 254; + this.tableFilter(); + this.state = 256; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 15) { + { + this.state = 255; + this.columnFilter(); + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public columnFilter(): ColumnFilterContext { + let localContext = new ColumnFilterContext(this.context, this.state); + this.enterRule(localContext, 14, OpenSearchSQLParser.RULE_columnFilter); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 258; + this.match(OpenSearchSQLParser.COLUMNS); + this.state = 259; + this.match(OpenSearchSQLParser.LIKE); + this.state = 260; + this.showDescribePattern(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public tableFilter(): TableFilterContext { + let localContext = new TableFilterContext(this.context, this.state); + this.enterRule(localContext, 16, OpenSearchSQLParser.RULE_tableFilter); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 262; + this.match(OpenSearchSQLParser.LIKE); + this.state = 263; + this.showDescribePattern(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public showDescribePattern(): ShowDescribePatternContext { + let localContext = new ShowDescribePatternContext(this.context, this.state); + this.enterRule(localContext, 18, OpenSearchSQLParser.RULE_showDescribePattern); + try { + this.state = 267; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.MODULE: + case OpenSearchSQLParser.ID: + this.enterOuterAlt(localContext, 1); + { + this.state = 265; + localContext._oldID = this.compatibleID(); + } + break; + case OpenSearchSQLParser.STRING_LITERAL: + case OpenSearchSQLParser.DOUBLE_QUOTE_ID: + this.enterOuterAlt(localContext, 2); + { + this.state = 266; + this.stringLiteral(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public compatibleID(): CompatibleIDContext { + let localContext = new CompatibleIDContext(this.context, this.state); + this.enterRule(localContext, 20, OpenSearchSQLParser.RULE_compatibleID); + let _la: number; + try { + let alternative: number; + this.enterOuterAlt(localContext, 1); + { + this.state = 270; + this.errorHandler.sync(this); + alternative = 1 + 1; + do { + switch (alternative) { + case 1 + 1: + { + { + this.state = 269; + _la = this.tokenStream.LA(1); + if(!(_la === 314 || _la === 349)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + break; + default: + throw new antlr.NoViableAltException(this); + } + this.state = 272; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 6, this.context); + } while (alternative !== 1 && alternative !== antlr.ATN.INVALID_ALT_NUMBER); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public querySpecification(): QuerySpecificationContext { + let localContext = new QuerySpecificationContext(this.context, this.state); + this.enterRule(localContext, 22, OpenSearchSQLParser.RULE_querySpecification); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 274; + this.selectClause(); + this.state = 276; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 27) { + { + this.state = 275; + this.fromClause(); + } + } + + this.state = 279; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 39) { + { + this.state = 278; + this.limitClause(); + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public selectClause(): SelectClauseContext { + let localContext = new SelectClauseContext(this.context, this.state); + this.enterRule(localContext, 24, OpenSearchSQLParser.RULE_selectClause); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 281; + this.match(OpenSearchSQLParser.SELECT); + this.state = 283; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 5 || _la === 20) { + { + this.state = 282; + this.selectSpec(); + } + } + + this.state = 285; + this.selectElements(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public selectSpec(): SelectSpecContext { + let localContext = new SelectSpecContext(this.context, this.state); + this.enterRule(localContext, 26, OpenSearchSQLParser.RULE_selectSpec); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 287; + _la = this.tokenStream.LA(1); + if(!(_la === 5 || _la === 20)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public selectElements(): SelectElementsContext { + let localContext = new SelectElementsContext(this.context, this.state); + this.enterRule(localContext, 28, OpenSearchSQLParser.RULE_selectElements); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 291; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.STAR: + { + this.state = 289; + localContext._star = this.match(OpenSearchSQLParser.STAR); + } + break; + case OpenSearchSQLParser.CASE: + case OpenSearchSQLParser.CAST: + case OpenSearchSQLParser.DATETIME: + case OpenSearchSQLParser.FALSE: + case OpenSearchSQLParser.FIRST: + case OpenSearchSQLParser.LAST: + case OpenSearchSQLParser.LEFT: + case OpenSearchSQLParser.MATCH: + case OpenSearchSQLParser.NOT: + case OpenSearchSQLParser.NULL_LITERAL: + case OpenSearchSQLParser.RIGHT: + case OpenSearchSQLParser.TRUE: + case OpenSearchSQLParser.AVG: + case OpenSearchSQLParser.COUNT: + case OpenSearchSQLParser.MAX: + case OpenSearchSQLParser.MIN: + case OpenSearchSQLParser.SUM: + case OpenSearchSQLParser.VAR_POP: + case OpenSearchSQLParser.VAR_SAMP: + case OpenSearchSQLParser.VARIANCE: + case OpenSearchSQLParser.STD: + case OpenSearchSQLParser.STDDEV: + case OpenSearchSQLParser.STDDEV_POP: + case OpenSearchSQLParser.STDDEV_SAMP: + case OpenSearchSQLParser.SUBSTRING: + case OpenSearchSQLParser.TRIM: + case OpenSearchSQLParser.FULL: + case OpenSearchSQLParser.INTERVAL: + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + case OpenSearchSQLParser.ABS: + case OpenSearchSQLParser.ACOS: + case OpenSearchSQLParser.ADD: + case OpenSearchSQLParser.ADDTIME: + case OpenSearchSQLParser.ASCII: + case OpenSearchSQLParser.ASIN: + case OpenSearchSQLParser.ATAN: + case OpenSearchSQLParser.ATAN2: + case OpenSearchSQLParser.CBRT: + case OpenSearchSQLParser.CEIL: + case OpenSearchSQLParser.CEILING: + case OpenSearchSQLParser.CONCAT: + case OpenSearchSQLParser.CONCAT_WS: + case OpenSearchSQLParser.CONV: + case OpenSearchSQLParser.CONVERT_TZ: + case OpenSearchSQLParser.COS: + case OpenSearchSQLParser.COSH: + case OpenSearchSQLParser.COT: + case OpenSearchSQLParser.CRC32: + case OpenSearchSQLParser.CURDATE: + case OpenSearchSQLParser.CURTIME: + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.DATE: + case OpenSearchSQLParser.DATE_ADD: + case OpenSearchSQLParser.DATE_FORMAT: + case OpenSearchSQLParser.DATE_SUB: + case OpenSearchSQLParser.DATEDIFF: + case OpenSearchSQLParser.DAYNAME: + case OpenSearchSQLParser.DAYOFMONTH: + case OpenSearchSQLParser.DAYOFWEEK: + case OpenSearchSQLParser.DAYOFYEAR: + case OpenSearchSQLParser.DEGREES: + case OpenSearchSQLParser.DIVIDE: + case OpenSearchSQLParser.E: + case OpenSearchSQLParser.EXP: + case OpenSearchSQLParser.EXPM1: + case OpenSearchSQLParser.EXTRACT: + case OpenSearchSQLParser.FLOOR: + case OpenSearchSQLParser.FROM_DAYS: + case OpenSearchSQLParser.FROM_UNIXTIME: + case OpenSearchSQLParser.GET_FORMAT: + case OpenSearchSQLParser.IF: + case OpenSearchSQLParser.IFNULL: + case OpenSearchSQLParser.ISNULL: + case OpenSearchSQLParser.LAST_DAY: + case OpenSearchSQLParser.LENGTH: + case OpenSearchSQLParser.LN: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.LOCATE: + case OpenSearchSQLParser.LOG: + case OpenSearchSQLParser.LOG10: + case OpenSearchSQLParser.LOG2: + case OpenSearchSQLParser.LOWER: + case OpenSearchSQLParser.LTRIM: + case OpenSearchSQLParser.MAKEDATE: + case OpenSearchSQLParser.MAKETIME: + case OpenSearchSQLParser.MODULUS: + case OpenSearchSQLParser.MONTHNAME: + case OpenSearchSQLParser.MULTIPLY: + case OpenSearchSQLParser.NOW: + case OpenSearchSQLParser.NULLIF: + case OpenSearchSQLParser.PERIOD_ADD: + case OpenSearchSQLParser.PERIOD_DIFF: + case OpenSearchSQLParser.PI: + case OpenSearchSQLParser.POSITION: + case OpenSearchSQLParser.POW: + case OpenSearchSQLParser.POWER: + case OpenSearchSQLParser.RADIANS: + case OpenSearchSQLParser.RAND: + case OpenSearchSQLParser.REPLACE: + case OpenSearchSQLParser.RINT: + case OpenSearchSQLParser.ROUND: + case OpenSearchSQLParser.RTRIM: + case OpenSearchSQLParser.REVERSE: + case OpenSearchSQLParser.SEC_TO_TIME: + case OpenSearchSQLParser.SIGN: + case OpenSearchSQLParser.SIGNUM: + case OpenSearchSQLParser.SIN: + case OpenSearchSQLParser.SINH: + case OpenSearchSQLParser.SQRT: + case OpenSearchSQLParser.STR_TO_DATE: + case OpenSearchSQLParser.SUBDATE: + case OpenSearchSQLParser.SUBTIME: + case OpenSearchSQLParser.SUBTRACT: + case OpenSearchSQLParser.SYSDATE: + case OpenSearchSQLParser.TAN: + case OpenSearchSQLParser.TIME: + case OpenSearchSQLParser.TIMEDIFF: + case OpenSearchSQLParser.TIME_FORMAT: + case OpenSearchSQLParser.TIME_TO_SEC: + case OpenSearchSQLParser.TIMESTAMP: + case OpenSearchSQLParser.TRUNCATE: + case OpenSearchSQLParser.TO_DAYS: + case OpenSearchSQLParser.TO_SECONDS: + case OpenSearchSQLParser.UNIX_TIMESTAMP: + case OpenSearchSQLParser.UPPER: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + case OpenSearchSQLParser.D: + case OpenSearchSQLParser.T: + case OpenSearchSQLParser.TS: + case OpenSearchSQLParser.LEFT_BRACE: + case OpenSearchSQLParser.DENSE_RANK: + case OpenSearchSQLParser.RANK: + case OpenSearchSQLParser.ROW_NUMBER: + case OpenSearchSQLParser.DAY_OF_MONTH: + case OpenSearchSQLParser.DAY_OF_YEAR: + case OpenSearchSQLParser.DAY_OF_WEEK: + case OpenSearchSQLParser.FIELD: + case OpenSearchSQLParser.HOUR_OF_DAY: + case OpenSearchSQLParser.MATCHPHRASE: + case OpenSearchSQLParser.MATCH_PHRASE: + case OpenSearchSQLParser.MATCHPHRASEQUERY: + case OpenSearchSQLParser.SIMPLE_QUERY_STRING: + case OpenSearchSQLParser.QUERY_STRING: + case OpenSearchSQLParser.MATCH_PHRASE_PREFIX: + case OpenSearchSQLParser.MATCHQUERY: + case OpenSearchSQLParser.MATCH_QUERY: + case OpenSearchSQLParser.MINUTE_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_HOUR: + case OpenSearchSQLParser.MONTH_OF_YEAR: + case OpenSearchSQLParser.MULTIMATCH: + case OpenSearchSQLParser.MULTI_MATCH: + case OpenSearchSQLParser.MULTIMATCHQUERY: + case OpenSearchSQLParser.NESTED: + case OpenSearchSQLParser.PERCENTILE: + case OpenSearchSQLParser.PERCENTILE_APPROX: + case OpenSearchSQLParser.QUERY: + case OpenSearchSQLParser.SCORE: + case OpenSearchSQLParser.SCOREQUERY: + case OpenSearchSQLParser.SCORE_QUERY: + case OpenSearchSQLParser.SECOND_OF_MINUTE: + case OpenSearchSQLParser.TIMESTAMPADD: + case OpenSearchSQLParser.TIMESTAMPDIFF: + case OpenSearchSQLParser.TYPEOF: + case OpenSearchSQLParser.WEEK_OF_YEAR: + case OpenSearchSQLParser.WEEKOFYEAR: + case OpenSearchSQLParser.WEEKDAY: + case OpenSearchSQLParser.WILDCARDQUERY: + case OpenSearchSQLParser.WILDCARD_QUERY: + case OpenSearchSQLParser.SUBSTR: + case OpenSearchSQLParser.STRCMP: + case OpenSearchSQLParser.ADDDATE: + case OpenSearchSQLParser.YEARWEEK: + case OpenSearchSQLParser.TYPE: + case OpenSearchSQLParser.HIGHLIGHT: + case OpenSearchSQLParser.MATCH_BOOL_PREFIX: + case OpenSearchSQLParser.PLUS: + case OpenSearchSQLParser.MINUS: + case OpenSearchSQLParser.MOD: + case OpenSearchSQLParser.DOT: + case OpenSearchSQLParser.LR_BRACKET: + case OpenSearchSQLParser.ZERO_DECIMAL: + case OpenSearchSQLParser.ONE_DECIMAL: + case OpenSearchSQLParser.TWO_DECIMAL: + case OpenSearchSQLParser.STRING_LITERAL: + case OpenSearchSQLParser.DECIMAL_LITERAL: + case OpenSearchSQLParser.REAL_LITERAL: + case OpenSearchSQLParser.ID: + case OpenSearchSQLParser.DOUBLE_QUOTE_ID: + case OpenSearchSQLParser.BACKTICK_QUOTE_ID: + { + this.state = 290; + this.selectElement(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + this.state = 297; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 293; + this.match(OpenSearchSQLParser.COMMA); + this.state = 294; + this.selectElement(); + } + } + this.state = 299; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public selectElement(): SelectElementContext { + let localContext = new SelectElementContext(this.context, this.state); + this.enterRule(localContext, 30, OpenSearchSQLParser.RULE_selectElement); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 300; + this.expression(0); + this.state = 305; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (((((_la - 7)) & ~0x1F) === 0 && ((1 << (_la - 7)) & 1611137537) !== 0) || ((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & 3850434561) !== 0) || ((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 4294705215) !== 0) || ((((_la - 118)) & ~0x1F) === 0 && ((1 << (_la - 118)) & 4009754623) !== 0) || ((((_la - 150)) & ~0x1F) === 0 && ((1 << (_la - 150)) & 4292870143) !== 0) || ((((_la - 182)) & ~0x1F) === 0 && ((1 << (_la - 182)) & 134217727) !== 0) || ((((_la - 215)) & ~0x1F) === 0 && ((1 << (_la - 215)) & 2382381095) !== 0) || ((((_la - 257)) & ~0x1F) === 0 && ((1 << (_la - 257)) & 124801) !== 0) || ((((_la - 306)) & ~0x1F) === 0 && ((1 << (_la - 306)) & 2101249) !== 0) || _la === 349 || _la === 351) { + { + this.state = 302; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 7) { + { + this.state = 301; + this.match(OpenSearchSQLParser.AS); + } + } + + this.state = 304; + this.alias(); + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public fromClause(): FromClauseContext { + let localContext = new FromClauseContext(this.context, this.state); + this.enterRule(localContext, 32, OpenSearchSQLParser.RULE_fromClause); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 307; + this.match(OpenSearchSQLParser.FROM); + this.state = 308; + this.relation(); + this.state = 310; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 63) { + { + this.state = 309; + this.whereClause(); + } + } + + this.state = 313; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 28) { + { + this.state = 312; + this.groupByClause(); + } + } + + this.state = 316; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 29) { + { + this.state = 315; + this.havingClause(); + } + } + + this.state = 319; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 49) { + { + this.state = 318; + this.orderByClause(); + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relation(): RelationContext { + let localContext = new RelationContext(this.context, this.state); + this.enterRule(localContext, 34, OpenSearchSQLParser.RULE_relation); + let _la: number; + try { + this.state = 336; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.DATETIME: + case OpenSearchSQLParser.FIRST: + case OpenSearchSQLParser.LAST: + case OpenSearchSQLParser.LEFT: + case OpenSearchSQLParser.RIGHT: + case OpenSearchSQLParser.AVG: + case OpenSearchSQLParser.COUNT: + case OpenSearchSQLParser.MAX: + case OpenSearchSQLParser.MIN: + case OpenSearchSQLParser.SUM: + case OpenSearchSQLParser.SUBSTRING: + case OpenSearchSQLParser.TRIM: + case OpenSearchSQLParser.FULL: + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + case OpenSearchSQLParser.ABS: + case OpenSearchSQLParser.ACOS: + case OpenSearchSQLParser.ADD: + case OpenSearchSQLParser.ADDTIME: + case OpenSearchSQLParser.ASCII: + case OpenSearchSQLParser.ASIN: + case OpenSearchSQLParser.ATAN: + case OpenSearchSQLParser.ATAN2: + case OpenSearchSQLParser.CBRT: + case OpenSearchSQLParser.CEIL: + case OpenSearchSQLParser.CEILING: + case OpenSearchSQLParser.CONCAT: + case OpenSearchSQLParser.CONCAT_WS: + case OpenSearchSQLParser.CONV: + case OpenSearchSQLParser.CONVERT_TZ: + case OpenSearchSQLParser.COS: + case OpenSearchSQLParser.COSH: + case OpenSearchSQLParser.COT: + case OpenSearchSQLParser.CRC32: + case OpenSearchSQLParser.CURDATE: + case OpenSearchSQLParser.CURTIME: + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.DATE: + case OpenSearchSQLParser.DATE_ADD: + case OpenSearchSQLParser.DATE_FORMAT: + case OpenSearchSQLParser.DATE_SUB: + case OpenSearchSQLParser.DATEDIFF: + case OpenSearchSQLParser.DAYNAME: + case OpenSearchSQLParser.DAYOFMONTH: + case OpenSearchSQLParser.DAYOFWEEK: + case OpenSearchSQLParser.DAYOFYEAR: + case OpenSearchSQLParser.DEGREES: + case OpenSearchSQLParser.DIVIDE: + case OpenSearchSQLParser.E: + case OpenSearchSQLParser.EXP: + case OpenSearchSQLParser.EXPM1: + case OpenSearchSQLParser.FLOOR: + case OpenSearchSQLParser.FROM_DAYS: + case OpenSearchSQLParser.FROM_UNIXTIME: + case OpenSearchSQLParser.IF: + case OpenSearchSQLParser.IFNULL: + case OpenSearchSQLParser.ISNULL: + case OpenSearchSQLParser.LAST_DAY: + case OpenSearchSQLParser.LENGTH: + case OpenSearchSQLParser.LN: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.LOCATE: + case OpenSearchSQLParser.LOG: + case OpenSearchSQLParser.LOG10: + case OpenSearchSQLParser.LOG2: + case OpenSearchSQLParser.LOWER: + case OpenSearchSQLParser.LTRIM: + case OpenSearchSQLParser.MAKEDATE: + case OpenSearchSQLParser.MAKETIME: + case OpenSearchSQLParser.MODULUS: + case OpenSearchSQLParser.MONTHNAME: + case OpenSearchSQLParser.MULTIPLY: + case OpenSearchSQLParser.NOW: + case OpenSearchSQLParser.NULLIF: + case OpenSearchSQLParser.PERIOD_ADD: + case OpenSearchSQLParser.PERIOD_DIFF: + case OpenSearchSQLParser.PI: + case OpenSearchSQLParser.POW: + case OpenSearchSQLParser.POWER: + case OpenSearchSQLParser.RADIANS: + case OpenSearchSQLParser.RAND: + case OpenSearchSQLParser.REPLACE: + case OpenSearchSQLParser.RINT: + case OpenSearchSQLParser.ROUND: + case OpenSearchSQLParser.RTRIM: + case OpenSearchSQLParser.REVERSE: + case OpenSearchSQLParser.SEC_TO_TIME: + case OpenSearchSQLParser.SIGN: + case OpenSearchSQLParser.SIGNUM: + case OpenSearchSQLParser.SIN: + case OpenSearchSQLParser.SINH: + case OpenSearchSQLParser.SQRT: + case OpenSearchSQLParser.STR_TO_DATE: + case OpenSearchSQLParser.SUBDATE: + case OpenSearchSQLParser.SUBTIME: + case OpenSearchSQLParser.SUBTRACT: + case OpenSearchSQLParser.SYSDATE: + case OpenSearchSQLParser.TAN: + case OpenSearchSQLParser.TIME: + case OpenSearchSQLParser.TIMEDIFF: + case OpenSearchSQLParser.TIME_FORMAT: + case OpenSearchSQLParser.TIME_TO_SEC: + case OpenSearchSQLParser.TIMESTAMP: + case OpenSearchSQLParser.TRUNCATE: + case OpenSearchSQLParser.TO_DAYS: + case OpenSearchSQLParser.TO_SECONDS: + case OpenSearchSQLParser.UNIX_TIMESTAMP: + case OpenSearchSQLParser.UPPER: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + case OpenSearchSQLParser.D: + case OpenSearchSQLParser.T: + case OpenSearchSQLParser.TS: + case OpenSearchSQLParser.DAY_OF_MONTH: + case OpenSearchSQLParser.DAY_OF_YEAR: + case OpenSearchSQLParser.DAY_OF_WEEK: + case OpenSearchSQLParser.FIELD: + case OpenSearchSQLParser.HOUR_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_HOUR: + case OpenSearchSQLParser.MONTH_OF_YEAR: + case OpenSearchSQLParser.NESTED: + case OpenSearchSQLParser.SECOND_OF_MINUTE: + case OpenSearchSQLParser.TYPEOF: + case OpenSearchSQLParser.WEEK_OF_YEAR: + case OpenSearchSQLParser.WEEKOFYEAR: + case OpenSearchSQLParser.WEEKDAY: + case OpenSearchSQLParser.SUBSTR: + case OpenSearchSQLParser.STRCMP: + case OpenSearchSQLParser.ADDDATE: + case OpenSearchSQLParser.YEARWEEK: + case OpenSearchSQLParser.TYPE: + case OpenSearchSQLParser.MOD: + case OpenSearchSQLParser.DOT: + case OpenSearchSQLParser.ID: + case OpenSearchSQLParser.BACKTICK_QUOTE_ID: + localContext = new TableAsRelationContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 321; + this.tableName(); + this.state = 326; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (((((_la - 7)) & ~0x1F) === 0 && ((1 << (_la - 7)) & 1611137537) !== 0) || ((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & 3850434561) !== 0) || ((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 4294705215) !== 0) || ((((_la - 118)) & ~0x1F) === 0 && ((1 << (_la - 118)) & 4009754623) !== 0) || ((((_la - 150)) & ~0x1F) === 0 && ((1 << (_la - 150)) & 4292870143) !== 0) || ((((_la - 182)) & ~0x1F) === 0 && ((1 << (_la - 182)) & 134217727) !== 0) || ((((_la - 215)) & ~0x1F) === 0 && ((1 << (_la - 215)) & 2382381095) !== 0) || ((((_la - 257)) & ~0x1F) === 0 && ((1 << (_la - 257)) & 124801) !== 0) || ((((_la - 306)) & ~0x1F) === 0 && ((1 << (_la - 306)) & 2101249) !== 0) || _la === 349 || _la === 351) { + { + this.state = 323; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 7) { + { + this.state = 322; + this.match(OpenSearchSQLParser.AS); + } + } + + this.state = 325; + this.alias(); + } + } + + } + break; + case OpenSearchSQLParser.LR_BRACKET: + localContext = new SubqueryAsRelationContext(localContext); + this.enterOuterAlt(localContext, 2); + { + this.state = 328; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 329; + (localContext as SubqueryAsRelationContext)._subquery = this.querySpecification(); + this.state = 330; + this.match(OpenSearchSQLParser.RR_BRACKET); + this.state = 332; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 7) { + { + this.state = 331; + this.match(OpenSearchSQLParser.AS); + } + } + + this.state = 334; + this.alias(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public whereClause(): WhereClauseContext { + let localContext = new WhereClauseContext(this.context, this.state); + this.enterRule(localContext, 36, OpenSearchSQLParser.RULE_whereClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 338; + this.match(OpenSearchSQLParser.WHERE); + this.state = 339; + this.expression(0); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public groupByClause(): GroupByClauseContext { + let localContext = new GroupByClauseContext(this.context, this.state); + this.enterRule(localContext, 38, OpenSearchSQLParser.RULE_groupByClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 341; + this.match(OpenSearchSQLParser.GROUP); + this.state = 342; + this.match(OpenSearchSQLParser.BY); + this.state = 343; + this.groupByElements(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public groupByElements(): GroupByElementsContext { + let localContext = new GroupByElementsContext(this.context, this.state); + this.enterRule(localContext, 40, OpenSearchSQLParser.RULE_groupByElements); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 345; + this.groupByElement(); + this.state = 350; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 346; + this.match(OpenSearchSQLParser.COMMA); + this.state = 347; + this.groupByElement(); + } + } + this.state = 352; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public groupByElement(): GroupByElementContext { + let localContext = new GroupByElementContext(this.context, this.state); + this.enterRule(localContext, 42, OpenSearchSQLParser.RULE_groupByElement); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 353; + this.expression(0); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public havingClause(): HavingClauseContext { + let localContext = new HavingClauseContext(this.context, this.state); + this.enterRule(localContext, 44, OpenSearchSQLParser.RULE_havingClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 355; + this.match(OpenSearchSQLParser.HAVING); + this.state = 356; + this.expression(0); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public orderByClause(): OrderByClauseContext { + let localContext = new OrderByClauseContext(this.context, this.state); + this.enterRule(localContext, 46, OpenSearchSQLParser.RULE_orderByClause); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 358; + this.match(OpenSearchSQLParser.ORDER); + this.state = 359; + this.match(OpenSearchSQLParser.BY); + this.state = 360; + this.orderByElement(); + this.state = 365; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 361; + this.match(OpenSearchSQLParser.COMMA); + this.state = 362; + this.orderByElement(); + } + } + this.state = 367; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public orderByElement(): OrderByElementContext { + let localContext = new OrderByElementContext(this.context, this.state); + this.enterRule(localContext, 48, OpenSearchSQLParser.RULE_orderByElement); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 368; + this.expression(0); + this.state = 370; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 8 || _la === 18) { + { + this.state = 369; + localContext._order = this.tokenStream.LT(1); + _la = this.tokenStream.LA(1); + if(!(_la === 8 || _la === 18)) { + localContext._order = this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + + this.state = 374; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 46) { + { + this.state = 372; + this.match(OpenSearchSQLParser.NULLS); + this.state = 373; + _la = this.tokenStream.LA(1); + if(!(_la === 26 || _la === 36)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public limitClause(): LimitClauseContext { + let localContext = new LimitClauseContext(this.context, this.state); + this.enterRule(localContext, 50, OpenSearchSQLParser.RULE_limitClause); + try { + this.state = 388; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 27, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 376; + this.match(OpenSearchSQLParser.LIMIT); + this.state = 380; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 26, this.context) ) { + case 1: + { + this.state = 377; + localContext._offset = this.decimalLiteral(); + this.state = 378; + this.match(OpenSearchSQLParser.COMMA); + } + break; + } + this.state = 382; + localContext._limit = this.decimalLiteral(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 383; + this.match(OpenSearchSQLParser.LIMIT); + this.state = 384; + localContext._limit = this.decimalLiteral(); + this.state = 385; + this.match(OpenSearchSQLParser.OFFSET); + this.state = 386; + localContext._offset = this.decimalLiteral(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public windowFunctionClause(): WindowFunctionClauseContext { + let localContext = new WindowFunctionClauseContext(this.context, this.state); + this.enterRule(localContext, 52, OpenSearchSQLParser.RULE_windowFunctionClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 390; + localContext._function_ = this.windowFunction(); + this.state = 391; + this.overClause(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public windowFunction(): WindowFunctionContext { + let localContext = new WindowFunctionContext(this.context, this.state); + this.enterRule(localContext, 54, OpenSearchSQLParser.RULE_windowFunction); + let _la: number; + try { + this.state = 400; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.DENSE_RANK: + case OpenSearchSQLParser.RANK: + case OpenSearchSQLParser.ROW_NUMBER: + localContext = new ScalarWindowFunctionContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 393; + (localContext as ScalarWindowFunctionContext)._functionName = this.tokenStream.LT(1); + _la = this.tokenStream.LA(1); + if(!(((((_la - 211)) & ~0x1F) === 0 && ((1 << (_la - 211)) & 7) !== 0))) { + (localContext as ScalarWindowFunctionContext)._functionName = this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 394; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 396; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 28, this.context) ) { + case 1: + { + this.state = 395; + this.functionArgs(); + } + break; + } + this.state = 398; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case OpenSearchSQLParser.AVG: + case OpenSearchSQLParser.COUNT: + case OpenSearchSQLParser.MAX: + case OpenSearchSQLParser.MIN: + case OpenSearchSQLParser.SUM: + case OpenSearchSQLParser.VAR_POP: + case OpenSearchSQLParser.VAR_SAMP: + case OpenSearchSQLParser.VARIANCE: + case OpenSearchSQLParser.STD: + case OpenSearchSQLParser.STDDEV: + case OpenSearchSQLParser.STDDEV_POP: + case OpenSearchSQLParser.STDDEV_SAMP: + case OpenSearchSQLParser.PERCENTILE: + case OpenSearchSQLParser.PERCENTILE_APPROX: + localContext = new AggregateWindowFunctionContext(localContext); + this.enterOuterAlt(localContext, 2); + { + this.state = 399; + this.aggregateFunction(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public overClause(): OverClauseContext { + let localContext = new OverClauseContext(this.context, this.state); + this.enterRule(localContext, 56, OpenSearchSQLParser.RULE_overClause); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 402; + this.match(OpenSearchSQLParser.OVER); + this.state = 403; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 405; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 52) { + { + this.state = 404; + this.partitionByClause(); + } + } + + this.state = 408; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 49) { + { + this.state = 407; + this.orderByClause(); + } + } + + this.state = 410; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public partitionByClause(): PartitionByClauseContext { + let localContext = new PartitionByClauseContext(this.context, this.state); + this.enterRule(localContext, 58, OpenSearchSQLParser.RULE_partitionByClause); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 412; + this.match(OpenSearchSQLParser.PARTITION); + this.state = 413; + this.match(OpenSearchSQLParser.BY); + this.state = 414; + this.expression(0); + this.state = 419; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 415; + this.match(OpenSearchSQLParser.COMMA); + this.state = 416; + this.expression(0); + } + } + this.state = 421; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public constant(): ConstantContext { + let localContext = new ConstantContext(this.context, this.state); + this.enterRule(localContext, 60, OpenSearchSQLParser.RULE_constant); + let _la: number; + try { + this.state = 435; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 35, this.context) ) { + case 1: + localContext = new StringContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 422; + this.stringLiteral(); + } + break; + case 2: + localContext = new SignedDecimalContext(localContext); + this.enterOuterAlt(localContext, 2); + { + this.state = 424; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 315 || _la === 316) { + { + this.state = 423; + this.sign(); + } + } + + this.state = 426; + this.decimalLiteral(); + } + break; + case 3: + localContext = new SignedRealContext(localContext); + this.enterOuterAlt(localContext, 3); + { + this.state = 428; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 315 || _la === 316) { + { + this.state = 427; + this.sign(); + } + } + + this.state = 430; + this.realLiteral(); + } + break; + case 4: + localContext = new BooleanContext(localContext); + this.enterOuterAlt(localContext, 4); + { + this.state = 431; + this.booleanLiteral(); + } + break; + case 5: + localContext = new DatetimeContext(localContext); + this.enterOuterAlt(localContext, 5); + { + this.state = 432; + this.datetimeLiteral(); + } + break; + case 6: + localContext = new IntervalContext(localContext); + this.enterOuterAlt(localContext, 6); + { + this.state = 433; + this.intervalLiteral(); + } + break; + case 7: + localContext = new NullContext(localContext); + this.enterOuterAlt(localContext, 7); + { + this.state = 434; + this.nullLiteral(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public decimalLiteral(): DecimalLiteralContext { + let localContext = new DecimalLiteralContext(this.context, this.state); + this.enterRule(localContext, 62, OpenSearchSQLParser.RULE_decimalLiteral); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 437; + _la = this.tokenStream.LA(1); + if(!(((((_la - 335)) & ~0x1F) === 0 && ((1 << (_la - 335)) & 519) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public numericLiteral(): NumericLiteralContext { + let localContext = new NumericLiteralContext(this.context, this.state); + this.enterRule(localContext, 64, OpenSearchSQLParser.RULE_numericLiteral); + try { + this.state = 441; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.ZERO_DECIMAL: + case OpenSearchSQLParser.ONE_DECIMAL: + case OpenSearchSQLParser.TWO_DECIMAL: + case OpenSearchSQLParser.DECIMAL_LITERAL: + this.enterOuterAlt(localContext, 1); + { + this.state = 439; + this.decimalLiteral(); + } + break; + case OpenSearchSQLParser.REAL_LITERAL: + this.enterOuterAlt(localContext, 2); + { + this.state = 440; + this.realLiteral(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public stringLiteral(): StringLiteralContext { + let localContext = new StringLiteralContext(this.context, this.state); + this.enterRule(localContext, 66, OpenSearchSQLParser.RULE_stringLiteral); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 443; + _la = this.tokenStream.LA(1); + if(!(_la === 343 || _la === 350)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public booleanLiteral(): BooleanLiteralContext { + let localContext = new BooleanLiteralContext(this.context, this.state); + this.enterRule(localContext, 68, OpenSearchSQLParser.RULE_booleanLiteral); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 445; + _la = this.tokenStream.LA(1); + if(!(_la === 24 || _la === 59)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public realLiteral(): RealLiteralContext { + let localContext = new RealLiteralContext(this.context, this.state); + this.enterRule(localContext, 70, OpenSearchSQLParser.RULE_realLiteral); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 447; + this.match(OpenSearchSQLParser.REAL_LITERAL); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public sign(): SignContext { + let localContext = new SignContext(this.context, this.state); + this.enterRule(localContext, 72, OpenSearchSQLParser.RULE_sign); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 449; + _la = this.tokenStream.LA(1); + if(!(_la === 315 || _la === 316)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public nullLiteral(): NullLiteralContext { + let localContext = new NullLiteralContext(this.context, this.state); + this.enterRule(localContext, 74, OpenSearchSQLParser.RULE_nullLiteral); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 451; + this.match(OpenSearchSQLParser.NULL_LITERAL); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public datetimeLiteral(): DatetimeLiteralContext { + let localContext = new DatetimeLiteralContext(this.context, this.state); + this.enterRule(localContext, 76, OpenSearchSQLParser.RULE_datetimeLiteral); + try { + this.state = 456; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 37, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 453; + this.dateLiteral(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 454; + this.timeLiteral(); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 455; + this.timestampLiteral(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public dateLiteral(): DateLiteralContext { + let localContext = new DateLiteralContext(this.context, this.state); + this.enterRule(localContext, 78, OpenSearchSQLParser.RULE_dateLiteral); + let _la: number; + try { + this.state = 465; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.DATE: + this.enterOuterAlt(localContext, 1); + { + this.state = 458; + this.match(OpenSearchSQLParser.DATE); + this.state = 459; + localContext._date = this.stringLiteral(); + } + break; + case OpenSearchSQLParser.LEFT_BRACE: + this.enterOuterAlt(localContext, 2); + { + this.state = 460; + this.match(OpenSearchSQLParser.LEFT_BRACE); + this.state = 461; + _la = this.tokenStream.LA(1); + if(!(_la === 128 || _la === 206)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 462; + localContext._date = this.stringLiteral(); + this.state = 463; + this.match(OpenSearchSQLParser.RIGHT_BRACE); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public timeLiteral(): TimeLiteralContext { + let localContext = new TimeLiteralContext(this.context, this.state); + this.enterRule(localContext, 80, OpenSearchSQLParser.RULE_timeLiteral); + let _la: number; + try { + this.state = 474; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.TIME: + this.enterOuterAlt(localContext, 1); + { + this.state = 467; + this.match(OpenSearchSQLParser.TIME); + this.state = 468; + localContext._time = this.stringLiteral(); + } + break; + case OpenSearchSQLParser.LEFT_BRACE: + this.enterOuterAlt(localContext, 2); + { + this.state = 469; + this.match(OpenSearchSQLParser.LEFT_BRACE); + this.state = 470; + _la = this.tokenStream.LA(1); + if(!(_la === 193 || _la === 207)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 471; + localContext._time = this.stringLiteral(); + this.state = 472; + this.match(OpenSearchSQLParser.RIGHT_BRACE); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public timestampLiteral(): TimestampLiteralContext { + let localContext = new TimestampLiteralContext(this.context, this.state); + this.enterRule(localContext, 82, OpenSearchSQLParser.RULE_timestampLiteral); + let _la: number; + try { + this.state = 483; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.TIMESTAMP: + this.enterOuterAlt(localContext, 1); + { + this.state = 476; + this.match(OpenSearchSQLParser.TIMESTAMP); + this.state = 477; + localContext._timestamp = this.stringLiteral(); + } + break; + case OpenSearchSQLParser.LEFT_BRACE: + this.enterOuterAlt(localContext, 2); + { + this.state = 478; + this.match(OpenSearchSQLParser.LEFT_BRACE); + this.state = 479; + _la = this.tokenStream.LA(1); + if(!(_la === 197 || _la === 208)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 480; + localContext._timestamp = this.stringLiteral(); + this.state = 481; + this.match(OpenSearchSQLParser.RIGHT_BRACE); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public datetimeConstantLiteral(): DatetimeConstantLiteralContext { + let localContext = new DatetimeConstantLiteralContext(this.context, this.state); + this.enterRule(localContext, 84, OpenSearchSQLParser.RULE_datetimeConstantLiteral); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 485; + _la = this.tokenStream.LA(1); + if(!(((((_la - 125)) & ~0x1F) === 0 && ((1 << (_la - 125)) & 805306375) !== 0) || ((((_la - 203)) & ~0x1F) === 0 && ((1 << (_la - 203)) & 7) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public intervalLiteral(): IntervalLiteralContext { + let localContext = new IntervalLiteralContext(this.context, this.state); + this.enterRule(localContext, 86, OpenSearchSQLParser.RULE_intervalLiteral); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 487; + this.match(OpenSearchSQLParser.INTERVAL); + this.state = 488; + this.expression(0); + this.state = 489; + this.intervalUnit(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public intervalUnit(): IntervalUnitContext { + let localContext = new IntervalUnitContext(this.context, this.state); + this.enterRule(localContext, 88, OpenSearchSQLParser.RULE_intervalUnit); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 491; + _la = this.tokenStream.LA(1); + if(!(((((_la - 83)) & ~0x1F) === 0 && ((1 << (_la - 83)) & 1048575) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + + public expression(): ExpressionContext; + public expression(_p: number): ExpressionContext; + public expression(_p?: number): ExpressionContext { + if (_p === undefined) { + _p = 0; + } + + let parentContext = this.context; + let parentState = this.state; + let localContext = new ExpressionContext(this.context, parentState); + let previousContext = localContext; + let _startState = 90; + this.enterRecursionRule(localContext, 90, OpenSearchSQLParser.RULE_expression, _p); + try { + let alternative: number; + this.enterOuterAlt(localContext, 1); + { + this.state = 497; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.NOT: + { + localContext = new NotExpressionContext(localContext); + this.context = localContext; + previousContext = localContext; + + this.state = 494; + this.match(OpenSearchSQLParser.NOT); + this.state = 495; + this.expression(4); + } + break; + case OpenSearchSQLParser.CASE: + case OpenSearchSQLParser.CAST: + case OpenSearchSQLParser.DATETIME: + case OpenSearchSQLParser.FALSE: + case OpenSearchSQLParser.FIRST: + case OpenSearchSQLParser.LAST: + case OpenSearchSQLParser.LEFT: + case OpenSearchSQLParser.MATCH: + case OpenSearchSQLParser.NULL_LITERAL: + case OpenSearchSQLParser.RIGHT: + case OpenSearchSQLParser.TRUE: + case OpenSearchSQLParser.AVG: + case OpenSearchSQLParser.COUNT: + case OpenSearchSQLParser.MAX: + case OpenSearchSQLParser.MIN: + case OpenSearchSQLParser.SUM: + case OpenSearchSQLParser.VAR_POP: + case OpenSearchSQLParser.VAR_SAMP: + case OpenSearchSQLParser.VARIANCE: + case OpenSearchSQLParser.STD: + case OpenSearchSQLParser.STDDEV: + case OpenSearchSQLParser.STDDEV_POP: + case OpenSearchSQLParser.STDDEV_SAMP: + case OpenSearchSQLParser.SUBSTRING: + case OpenSearchSQLParser.TRIM: + case OpenSearchSQLParser.FULL: + case OpenSearchSQLParser.INTERVAL: + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + case OpenSearchSQLParser.ABS: + case OpenSearchSQLParser.ACOS: + case OpenSearchSQLParser.ADD: + case OpenSearchSQLParser.ADDTIME: + case OpenSearchSQLParser.ASCII: + case OpenSearchSQLParser.ASIN: + case OpenSearchSQLParser.ATAN: + case OpenSearchSQLParser.ATAN2: + case OpenSearchSQLParser.CBRT: + case OpenSearchSQLParser.CEIL: + case OpenSearchSQLParser.CEILING: + case OpenSearchSQLParser.CONCAT: + case OpenSearchSQLParser.CONCAT_WS: + case OpenSearchSQLParser.CONV: + case OpenSearchSQLParser.CONVERT_TZ: + case OpenSearchSQLParser.COS: + case OpenSearchSQLParser.COSH: + case OpenSearchSQLParser.COT: + case OpenSearchSQLParser.CRC32: + case OpenSearchSQLParser.CURDATE: + case OpenSearchSQLParser.CURTIME: + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.DATE: + case OpenSearchSQLParser.DATE_ADD: + case OpenSearchSQLParser.DATE_FORMAT: + case OpenSearchSQLParser.DATE_SUB: + case OpenSearchSQLParser.DATEDIFF: + case OpenSearchSQLParser.DAYNAME: + case OpenSearchSQLParser.DAYOFMONTH: + case OpenSearchSQLParser.DAYOFWEEK: + case OpenSearchSQLParser.DAYOFYEAR: + case OpenSearchSQLParser.DEGREES: + case OpenSearchSQLParser.DIVIDE: + case OpenSearchSQLParser.E: + case OpenSearchSQLParser.EXP: + case OpenSearchSQLParser.EXPM1: + case OpenSearchSQLParser.EXTRACT: + case OpenSearchSQLParser.FLOOR: + case OpenSearchSQLParser.FROM_DAYS: + case OpenSearchSQLParser.FROM_UNIXTIME: + case OpenSearchSQLParser.GET_FORMAT: + case OpenSearchSQLParser.IF: + case OpenSearchSQLParser.IFNULL: + case OpenSearchSQLParser.ISNULL: + case OpenSearchSQLParser.LAST_DAY: + case OpenSearchSQLParser.LENGTH: + case OpenSearchSQLParser.LN: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.LOCATE: + case OpenSearchSQLParser.LOG: + case OpenSearchSQLParser.LOG10: + case OpenSearchSQLParser.LOG2: + case OpenSearchSQLParser.LOWER: + case OpenSearchSQLParser.LTRIM: + case OpenSearchSQLParser.MAKEDATE: + case OpenSearchSQLParser.MAKETIME: + case OpenSearchSQLParser.MODULUS: + case OpenSearchSQLParser.MONTHNAME: + case OpenSearchSQLParser.MULTIPLY: + case OpenSearchSQLParser.NOW: + case OpenSearchSQLParser.NULLIF: + case OpenSearchSQLParser.PERIOD_ADD: + case OpenSearchSQLParser.PERIOD_DIFF: + case OpenSearchSQLParser.PI: + case OpenSearchSQLParser.POSITION: + case OpenSearchSQLParser.POW: + case OpenSearchSQLParser.POWER: + case OpenSearchSQLParser.RADIANS: + case OpenSearchSQLParser.RAND: + case OpenSearchSQLParser.REPLACE: + case OpenSearchSQLParser.RINT: + case OpenSearchSQLParser.ROUND: + case OpenSearchSQLParser.RTRIM: + case OpenSearchSQLParser.REVERSE: + case OpenSearchSQLParser.SEC_TO_TIME: + case OpenSearchSQLParser.SIGN: + case OpenSearchSQLParser.SIGNUM: + case OpenSearchSQLParser.SIN: + case OpenSearchSQLParser.SINH: + case OpenSearchSQLParser.SQRT: + case OpenSearchSQLParser.STR_TO_DATE: + case OpenSearchSQLParser.SUBDATE: + case OpenSearchSQLParser.SUBTIME: + case OpenSearchSQLParser.SUBTRACT: + case OpenSearchSQLParser.SYSDATE: + case OpenSearchSQLParser.TAN: + case OpenSearchSQLParser.TIME: + case OpenSearchSQLParser.TIMEDIFF: + case OpenSearchSQLParser.TIME_FORMAT: + case OpenSearchSQLParser.TIME_TO_SEC: + case OpenSearchSQLParser.TIMESTAMP: + case OpenSearchSQLParser.TRUNCATE: + case OpenSearchSQLParser.TO_DAYS: + case OpenSearchSQLParser.TO_SECONDS: + case OpenSearchSQLParser.UNIX_TIMESTAMP: + case OpenSearchSQLParser.UPPER: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + case OpenSearchSQLParser.D: + case OpenSearchSQLParser.T: + case OpenSearchSQLParser.TS: + case OpenSearchSQLParser.LEFT_BRACE: + case OpenSearchSQLParser.DENSE_RANK: + case OpenSearchSQLParser.RANK: + case OpenSearchSQLParser.ROW_NUMBER: + case OpenSearchSQLParser.DAY_OF_MONTH: + case OpenSearchSQLParser.DAY_OF_YEAR: + case OpenSearchSQLParser.DAY_OF_WEEK: + case OpenSearchSQLParser.FIELD: + case OpenSearchSQLParser.HOUR_OF_DAY: + case OpenSearchSQLParser.MATCHPHRASE: + case OpenSearchSQLParser.MATCH_PHRASE: + case OpenSearchSQLParser.MATCHPHRASEQUERY: + case OpenSearchSQLParser.SIMPLE_QUERY_STRING: + case OpenSearchSQLParser.QUERY_STRING: + case OpenSearchSQLParser.MATCH_PHRASE_PREFIX: + case OpenSearchSQLParser.MATCHQUERY: + case OpenSearchSQLParser.MATCH_QUERY: + case OpenSearchSQLParser.MINUTE_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_HOUR: + case OpenSearchSQLParser.MONTH_OF_YEAR: + case OpenSearchSQLParser.MULTIMATCH: + case OpenSearchSQLParser.MULTI_MATCH: + case OpenSearchSQLParser.MULTIMATCHQUERY: + case OpenSearchSQLParser.NESTED: + case OpenSearchSQLParser.PERCENTILE: + case OpenSearchSQLParser.PERCENTILE_APPROX: + case OpenSearchSQLParser.QUERY: + case OpenSearchSQLParser.SCORE: + case OpenSearchSQLParser.SCOREQUERY: + case OpenSearchSQLParser.SCORE_QUERY: + case OpenSearchSQLParser.SECOND_OF_MINUTE: + case OpenSearchSQLParser.TIMESTAMPADD: + case OpenSearchSQLParser.TIMESTAMPDIFF: + case OpenSearchSQLParser.TYPEOF: + case OpenSearchSQLParser.WEEK_OF_YEAR: + case OpenSearchSQLParser.WEEKOFYEAR: + case OpenSearchSQLParser.WEEKDAY: + case OpenSearchSQLParser.WILDCARDQUERY: + case OpenSearchSQLParser.WILDCARD_QUERY: + case OpenSearchSQLParser.SUBSTR: + case OpenSearchSQLParser.STRCMP: + case OpenSearchSQLParser.ADDDATE: + case OpenSearchSQLParser.YEARWEEK: + case OpenSearchSQLParser.TYPE: + case OpenSearchSQLParser.HIGHLIGHT: + case OpenSearchSQLParser.MATCH_BOOL_PREFIX: + case OpenSearchSQLParser.PLUS: + case OpenSearchSQLParser.MINUS: + case OpenSearchSQLParser.MOD: + case OpenSearchSQLParser.DOT: + case OpenSearchSQLParser.LR_BRACKET: + case OpenSearchSQLParser.ZERO_DECIMAL: + case OpenSearchSQLParser.ONE_DECIMAL: + case OpenSearchSQLParser.TWO_DECIMAL: + case OpenSearchSQLParser.STRING_LITERAL: + case OpenSearchSQLParser.DECIMAL_LITERAL: + case OpenSearchSQLParser.REAL_LITERAL: + case OpenSearchSQLParser.ID: + case OpenSearchSQLParser.DOUBLE_QUOTE_ID: + case OpenSearchSQLParser.BACKTICK_QUOTE_ID: + { + localContext = new PredicateExpressionContext(localContext); + this.context = localContext; + previousContext = localContext; + this.state = 496; + this.predicate(0); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + this.context!.stop = this.tokenStream.LT(-1); + this.state = 507; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 43, this.context); + while (alternative !== 2 && alternative !== antlr.ATN.INVALID_ALT_NUMBER) { + if (alternative === 1) { + if (this.parseListeners != null) { + this.triggerExitRuleEvent(); + } + previousContext = localContext; + { + this.state = 505; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 42, this.context) ) { + case 1: + { + localContext = new AndExpressionContext(new ExpressionContext(parentContext, parentState)); + (localContext as AndExpressionContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_expression); + this.state = 499; + if (!(this.precpred(this.context, 3))) { + throw this.createFailedPredicateException("this.precpred(this.context, 3)"); + } + this.state = 500; + this.match(OpenSearchSQLParser.AND); + this.state = 501; + (localContext as AndExpressionContext)._right = this.expression(4); + } + break; + case 2: + { + localContext = new OrExpressionContext(new ExpressionContext(parentContext, parentState)); + (localContext as OrExpressionContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_expression); + this.state = 502; + if (!(this.precpred(this.context, 2))) { + throw this.createFailedPredicateException("this.precpred(this.context, 2)"); + } + this.state = 503; + this.match(OpenSearchSQLParser.OR); + this.state = 504; + (localContext as OrExpressionContext)._right = this.expression(3); + } + break; + } + } + } + this.state = 509; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 43, this.context); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.unrollRecursionContexts(parentContext); + } + return localContext; + } + + public predicate(): PredicateContext; + public predicate(_p: number): PredicateContext; + public predicate(_p?: number): PredicateContext { + if (_p === undefined) { + _p = 0; + } + + let parentContext = this.context; + let parentState = this.state; + let localContext = new PredicateContext(this.context, parentState); + let previousContext = localContext; + let _startState = 92; + this.enterRecursionRule(localContext, 92, OpenSearchSQLParser.RULE_predicate, _p); + let _la: number; + try { + let alternative: number; + this.enterOuterAlt(localContext, 1); + { + { + localContext = new ExpressionAtomPredicateContext(localContext); + this.context = localContext; + previousContext = localContext; + + this.state = 511; + this.expressionAtom(0); + } + this.context!.stop = this.tokenStream.LT(-1); + this.state = 549; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 48, this.context); + while (alternative !== 2 && alternative !== antlr.ATN.INVALID_ALT_NUMBER) { + if (alternative === 1) { + if (this.parseListeners != null) { + this.triggerExitRuleEvent(); + } + previousContext = localContext; + { + this.state = 547; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 47, this.context) ) { + case 1: + { + localContext = new BinaryComparisonPredicateContext(new PredicateContext(parentContext, parentState)); + (localContext as BinaryComparisonPredicateContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_predicate); + this.state = 513; + if (!(this.precpred(this.context, 6))) { + throw this.createFailedPredicateException("this.precpred(this.context, 6)"); + } + this.state = 514; + this.comparisonOperator(); + this.state = 515; + (localContext as BinaryComparisonPredicateContext)._right = this.predicate(7); + } + break; + case 2: + { + localContext = new BetweenPredicateContext(new PredicateContext(parentContext, parentState)); + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_predicate); + this.state = 517; + if (!(this.precpred(this.context, 4))) { + throw this.createFailedPredicateException("this.precpred(this.context, 4)"); + } + this.state = 519; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 44) { + { + this.state = 518; + this.match(OpenSearchSQLParser.NOT); + } + } + + this.state = 521; + this.match(OpenSearchSQLParser.BETWEEN); + this.state = 522; + this.predicate(0); + this.state = 523; + this.match(OpenSearchSQLParser.AND); + this.state = 524; + this.predicate(5); + } + break; + case 3: + { + localContext = new LikePredicateContext(new PredicateContext(parentContext, parentState)); + (localContext as LikePredicateContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_predicate); + this.state = 526; + if (!(this.precpred(this.context, 3))) { + throw this.createFailedPredicateException("this.precpred(this.context, 3)"); + } + this.state = 528; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 44) { + { + this.state = 527; + this.match(OpenSearchSQLParser.NOT); + } + } + + this.state = 530; + this.match(OpenSearchSQLParser.LIKE); + this.state = 531; + (localContext as LikePredicateContext)._right = this.predicate(4); + } + break; + case 4: + { + localContext = new RegexpPredicateContext(new PredicateContext(parentContext, parentState)); + (localContext as RegexpPredicateContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_predicate); + this.state = 532; + if (!(this.precpred(this.context, 2))) { + throw this.createFailedPredicateException("this.precpred(this.context, 2)"); + } + this.state = 533; + this.match(OpenSearchSQLParser.REGEXP); + this.state = 534; + (localContext as RegexpPredicateContext)._right = this.predicate(3); + } + break; + case 5: + { + localContext = new IsNullPredicateContext(new PredicateContext(parentContext, parentState)); + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_predicate); + this.state = 535; + if (!(this.precpred(this.context, 5))) { + throw this.createFailedPredicateException("this.precpred(this.context, 5)"); + } + this.state = 536; + this.match(OpenSearchSQLParser.IS); + this.state = 537; + this.nullNotnull(); + } + break; + case 6: + { + localContext = new InPredicateContext(new PredicateContext(parentContext, parentState)); + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_predicate); + this.state = 538; + if (!(this.precpred(this.context, 1))) { + throw this.createFailedPredicateException("this.precpred(this.context, 1)"); + } + this.state = 540; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 44) { + { + this.state = 539; + this.match(OpenSearchSQLParser.NOT); + } + } + + this.state = 542; + this.match(OpenSearchSQLParser.IN); + this.state = 543; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 544; + this.expressions(); + this.state = 545; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + } + } + } + this.state = 551; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 48, this.context); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.unrollRecursionContexts(parentContext); + } + return localContext; + } + public expressions(): ExpressionsContext { + let localContext = new ExpressionsContext(this.context, this.state); + this.enterRule(localContext, 94, OpenSearchSQLParser.RULE_expressions); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 552; + this.expression(0); + this.state = 557; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 553; + this.match(OpenSearchSQLParser.COMMA); + this.state = 554; + this.expression(0); + } + } + this.state = 559; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + + public expressionAtom(): ExpressionAtomContext; + public expressionAtom(_p: number): ExpressionAtomContext; + public expressionAtom(_p?: number): ExpressionAtomContext { + if (_p === undefined) { + _p = 0; + } + + let parentContext = this.context; + let parentState = this.state; + let localContext = new ExpressionAtomContext(this.context, parentState); + let previousContext = localContext; + let _startState = 96; + this.enterRecursionRule(localContext, 96, OpenSearchSQLParser.RULE_expressionAtom, _p); + let _la: number; + try { + let alternative: number; + this.enterOuterAlt(localContext, 1); + { + this.state = 568; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 50, this.context) ) { + case 1: + { + localContext = new ConstantExpressionAtomContext(localContext); + this.context = localContext; + previousContext = localContext; + + this.state = 561; + this.constant(); + } + break; + case 2: + { + localContext = new FullColumnNameExpressionAtomContext(localContext); + this.context = localContext; + previousContext = localContext; + this.state = 562; + this.columnName(); + } + break; + case 3: + { + localContext = new FunctionCallExpressionAtomContext(localContext); + this.context = localContext; + previousContext = localContext; + this.state = 563; + this.functionCall(); + } + break; + case 4: + { + localContext = new NestedExpressionAtomContext(localContext); + this.context = localContext; + previousContext = localContext; + this.state = 564; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 565; + this.expression(0); + this.state = 566; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + } + this.context!.stop = this.tokenStream.LT(-1); + this.state = 578; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 52, this.context); + while (alternative !== 2 && alternative !== antlr.ATN.INVALID_ALT_NUMBER) { + if (alternative === 1) { + if (this.parseListeners != null) { + this.triggerExitRuleEvent(); + } + previousContext = localContext; + { + this.state = 576; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 51, this.context) ) { + case 1: + { + localContext = new MathExpressionAtomContext(new ExpressionAtomContext(parentContext, parentState)); + (localContext as MathExpressionAtomContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_expressionAtom); + this.state = 570; + if (!(this.precpred(this.context, 2))) { + throw this.createFailedPredicateException("this.precpred(this.context, 2)"); + } + this.state = 571; + (localContext as MathExpressionAtomContext)._mathOperator = this.tokenStream.LT(1); + _la = this.tokenStream.LA(1); + if(!(((((_la - 312)) & ~0x1F) === 0 && ((1 << (_la - 312)) & 7) !== 0))) { + (localContext as MathExpressionAtomContext)._mathOperator = this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 572; + (localContext as MathExpressionAtomContext)._right = this.expressionAtom(3); + } + break; + case 2: + { + localContext = new MathExpressionAtomContext(new ExpressionAtomContext(parentContext, parentState)); + (localContext as MathExpressionAtomContext)._left = previousContext; + this.pushNewRecursionContext(localContext, _startState, OpenSearchSQLParser.RULE_expressionAtom); + this.state = 573; + if (!(this.precpred(this.context, 1))) { + throw this.createFailedPredicateException("this.precpred(this.context, 1)"); + } + this.state = 574; + (localContext as MathExpressionAtomContext)._mathOperator = this.tokenStream.LT(1); + _la = this.tokenStream.LA(1); + if(!(_la === 315 || _la === 316)) { + (localContext as MathExpressionAtomContext)._mathOperator = this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 575; + (localContext as MathExpressionAtomContext)._right = this.expressionAtom(2); + } + break; + } + } + } + this.state = 580; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 52, this.context); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.unrollRecursionContexts(parentContext); + } + return localContext; + } + public comparisonOperator(): ComparisonOperatorContext { + let localContext = new ComparisonOperatorContext(this.context, this.state); + this.enterRule(localContext, 98, OpenSearchSQLParser.RULE_comparisonOperator); + try { + this.state = 592; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 53, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 581; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 582; + this.match(OpenSearchSQLParser.GREATER_SYMBOL); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 583; + this.match(OpenSearchSQLParser.LESS_SYMBOL); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 584; + this.match(OpenSearchSQLParser.LESS_SYMBOL); + this.state = 585; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 586; + this.match(OpenSearchSQLParser.GREATER_SYMBOL); + this.state = 587; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + } + break; + case 6: + this.enterOuterAlt(localContext, 6); + { + this.state = 588; + this.match(OpenSearchSQLParser.LESS_SYMBOL); + this.state = 589; + this.match(OpenSearchSQLParser.GREATER_SYMBOL); + } + break; + case 7: + this.enterOuterAlt(localContext, 7); + { + this.state = 590; + this.match(OpenSearchSQLParser.EXCLAMATION_SYMBOL); + this.state = 591; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public nullNotnull(): NullNotnullContext { + let localContext = new NullNotnullContext(this.context, this.state); + this.enterRule(localContext, 100, OpenSearchSQLParser.RULE_nullNotnull); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 595; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 44) { + { + this.state = 594; + this.match(OpenSearchSQLParser.NOT); + } + } + + this.state = 597; + this.match(OpenSearchSQLParser.NULL_LITERAL); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public functionCall(): FunctionCallContext { + let localContext = new FunctionCallContext(this.context, this.state); + this.enterRule(localContext, 102, OpenSearchSQLParser.RULE_functionCall); + let _la: number; + try { + this.state = 625; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 56, this.context) ) { + case 1: + localContext = new NestedAllFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 599; + this.nestedFunctionName(); + this.state = 600; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 601; + this.allTupleFields(); + this.state = 602; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case 2: + localContext = new ScalarFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 2); + { + this.state = 604; + this.scalarFunctionName(); + this.state = 605; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 606; + this.functionArgs(); + this.state = 607; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case 3: + localContext = new SpecificFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 3); + { + this.state = 609; + this.specificFunction(); + } + break; + case 4: + localContext = new WindowFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 4); + { + this.state = 610; + this.windowFunctionClause(); + } + break; + case 5: + localContext = new AggregateFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 5); + { + this.state = 611; + this.aggregateFunction(); + } + break; + case 6: + localContext = new FilteredAggregationFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 6); + { + this.state = 612; + this.aggregateFunction(); + this.state = 614; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 49) { + { + this.state = 613; + this.orderByClause(); + } + } + + this.state = 616; + this.filterClause(); + } + break; + case 7: + localContext = new ScoreRelevanceFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 7); + { + this.state = 618; + this.scoreRelevanceFunction(); + } + break; + case 8: + localContext = new RelevanceFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 8); + { + this.state = 619; + this.relevanceFunction(); + } + break; + case 9: + localContext = new HighlightFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 9); + { + this.state = 620; + this.highlightFunction(); + } + break; + case 10: + localContext = new PositionFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 10); + { + this.state = 621; + this.positionFunction(); + } + break; + case 11: + localContext = new ExtractFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 11); + { + this.state = 622; + this.extractFunction(); + } + break; + case 12: + localContext = new GetFormatFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 12); + { + this.state = 623; + this.getFormatFunction(); + } + break; + case 13: + localContext = new TimestampFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 13); + { + this.state = 624; + this.timestampFunction(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public timestampFunction(): TimestampFunctionContext { + let localContext = new TimestampFunctionContext(this.context, this.state); + this.enterRule(localContext, 104, OpenSearchSQLParser.RULE_timestampFunction); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 627; + this.timestampFunctionName(); + this.state = 628; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 629; + this.simpleDateTimePart(); + this.state = 630; + this.match(OpenSearchSQLParser.COMMA); + this.state = 631; + localContext._firstArg = this.functionArg(); + this.state = 632; + this.match(OpenSearchSQLParser.COMMA); + this.state = 633; + localContext._secondArg = this.functionArg(); + this.state = 634; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public timestampFunctionName(): TimestampFunctionNameContext { + let localContext = new TimestampFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 106, OpenSearchSQLParser.RULE_timestampFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 636; + _la = this.tokenStream.LA(1); + if(!(_la === 261 || _la === 262)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public getFormatFunction(): GetFormatFunctionContext { + let localContext = new GetFormatFunctionContext(this.context, this.state); + this.enterRule(localContext, 108, OpenSearchSQLParser.RULE_getFormatFunction); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 638; + this.match(OpenSearchSQLParser.GET_FORMAT); + this.state = 639; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 640; + this.getFormatType(); + this.state = 641; + this.match(OpenSearchSQLParser.COMMA); + this.state = 642; + this.functionArg(); + this.state = 643; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public getFormatType(): GetFormatTypeContext { + let localContext = new GetFormatTypeContext(this.context, this.state); + this.enterRule(localContext, 110, OpenSearchSQLParser.RULE_getFormatType); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 645; + _la = this.tokenStream.LA(1); + if(!(_la === 16 || _la === 128 || _la === 193 || _la === 197)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public extractFunction(): ExtractFunctionContext { + let localContext = new ExtractFunctionContext(this.context, this.state); + this.enterRule(localContext, 112, OpenSearchSQLParser.RULE_extractFunction); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 647; + this.match(OpenSearchSQLParser.EXTRACT); + this.state = 648; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 649; + this.datetimePart(); + this.state = 650; + this.match(OpenSearchSQLParser.FROM); + this.state = 651; + this.functionArg(); + this.state = 652; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public simpleDateTimePart(): SimpleDateTimePartContext { + let localContext = new SimpleDateTimePartContext(this.context, this.state); + this.enterRule(localContext, 114, OpenSearchSQLParser.RULE_simpleDateTimePart); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 654; + _la = this.tokenStream.LA(1); + if(!(((((_la - 83)) & ~0x1F) === 0 && ((1 << (_la - 83)) & 511) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public complexDateTimePart(): ComplexDateTimePartContext { + let localContext = new ComplexDateTimePartContext(this.context, this.state); + this.enterRule(localContext, 116, OpenSearchSQLParser.RULE_complexDateTimePart); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 656; + _la = this.tokenStream.LA(1); + if(!(((((_la - 92)) & ~0x1F) === 0 && ((1 << (_la - 92)) & 2047) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public datetimePart(): DatetimePartContext { + let localContext = new DatetimePartContext(this.context, this.state); + this.enterRule(localContext, 118, OpenSearchSQLParser.RULE_datetimePart); + try { + this.state = 660; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + this.enterOuterAlt(localContext, 1); + { + this.state = 658; + this.simpleDateTimePart(); + } + break; + case OpenSearchSQLParser.SECOND_MICROSECOND: + case OpenSearchSQLParser.MINUTE_MICROSECOND: + case OpenSearchSQLParser.MINUTE_SECOND: + case OpenSearchSQLParser.HOUR_MICROSECOND: + case OpenSearchSQLParser.HOUR_SECOND: + case OpenSearchSQLParser.HOUR_MINUTE: + case OpenSearchSQLParser.DAY_MICROSECOND: + case OpenSearchSQLParser.DAY_SECOND: + case OpenSearchSQLParser.DAY_MINUTE: + case OpenSearchSQLParser.DAY_HOUR: + case OpenSearchSQLParser.YEAR_MONTH: + this.enterOuterAlt(localContext, 2); + { + this.state = 659; + this.complexDateTimePart(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public highlightFunction(): HighlightFunctionContext { + let localContext = new HighlightFunctionContext(this.context, this.state); + this.enterRule(localContext, 120, OpenSearchSQLParser.RULE_highlightFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 662; + this.match(OpenSearchSQLParser.HIGHLIGHT); + this.state = 663; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 664; + this.relevanceField(); + this.state = 669; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 665; + this.match(OpenSearchSQLParser.COMMA); + this.state = 666; + this.highlightArg(); + } + } + this.state = 671; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 672; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public positionFunction(): PositionFunctionContext { + let localContext = new PositionFunctionContext(this.context, this.state); + this.enterRule(localContext, 122, OpenSearchSQLParser.RULE_positionFunction); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 674; + this.match(OpenSearchSQLParser.POSITION); + this.state = 675; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 676; + this.functionArg(); + this.state = 677; + this.match(OpenSearchSQLParser.IN); + this.state = 678; + this.functionArg(); + this.state = 679; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public matchQueryAltSyntaxFunction(): MatchQueryAltSyntaxFunctionContext { + let localContext = new MatchQueryAltSyntaxFunctionContext(this.context, this.state); + this.enterRule(localContext, 124, OpenSearchSQLParser.RULE_matchQueryAltSyntaxFunction); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 681; + localContext._field = this.relevanceField(); + this.state = 682; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 683; + this.match(OpenSearchSQLParser.MATCH_QUERY); + this.state = 684; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 685; + localContext._query = this.relevanceQuery(); + this.state = 686; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public scalarFunctionName(): ScalarFunctionNameContext { + let localContext = new ScalarFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 126, OpenSearchSQLParser.RULE_scalarFunctionName); + try { + this.state = 694; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.ABS: + case OpenSearchSQLParser.ACOS: + case OpenSearchSQLParser.ADD: + case OpenSearchSQLParser.ASIN: + case OpenSearchSQLParser.ATAN: + case OpenSearchSQLParser.ATAN2: + case OpenSearchSQLParser.CBRT: + case OpenSearchSQLParser.CEIL: + case OpenSearchSQLParser.CEILING: + case OpenSearchSQLParser.CONV: + case OpenSearchSQLParser.COS: + case OpenSearchSQLParser.COSH: + case OpenSearchSQLParser.COT: + case OpenSearchSQLParser.CRC32: + case OpenSearchSQLParser.DEGREES: + case OpenSearchSQLParser.DIVIDE: + case OpenSearchSQLParser.E: + case OpenSearchSQLParser.EXP: + case OpenSearchSQLParser.EXPM1: + case OpenSearchSQLParser.FLOOR: + case OpenSearchSQLParser.LN: + case OpenSearchSQLParser.LOG: + case OpenSearchSQLParser.LOG10: + case OpenSearchSQLParser.LOG2: + case OpenSearchSQLParser.MODULUS: + case OpenSearchSQLParser.MULTIPLY: + case OpenSearchSQLParser.PI: + case OpenSearchSQLParser.POW: + case OpenSearchSQLParser.POWER: + case OpenSearchSQLParser.RADIANS: + case OpenSearchSQLParser.RAND: + case OpenSearchSQLParser.RINT: + case OpenSearchSQLParser.ROUND: + case OpenSearchSQLParser.SIGN: + case OpenSearchSQLParser.SIGNUM: + case OpenSearchSQLParser.SIN: + case OpenSearchSQLParser.SINH: + case OpenSearchSQLParser.SQRT: + case OpenSearchSQLParser.SUBTRACT: + case OpenSearchSQLParser.TAN: + case OpenSearchSQLParser.TRUNCATE: + case OpenSearchSQLParser.MOD: + this.enterOuterAlt(localContext, 1); + { + this.state = 688; + this.mathematicalFunctionName(); + } + break; + case OpenSearchSQLParser.DATETIME: + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + case OpenSearchSQLParser.ADDTIME: + case OpenSearchSQLParser.CONVERT_TZ: + case OpenSearchSQLParser.CURDATE: + case OpenSearchSQLParser.CURTIME: + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.DATE: + case OpenSearchSQLParser.DATE_ADD: + case OpenSearchSQLParser.DATE_FORMAT: + case OpenSearchSQLParser.DATE_SUB: + case OpenSearchSQLParser.DATEDIFF: + case OpenSearchSQLParser.DAYNAME: + case OpenSearchSQLParser.DAYOFMONTH: + case OpenSearchSQLParser.DAYOFWEEK: + case OpenSearchSQLParser.DAYOFYEAR: + case OpenSearchSQLParser.FROM_DAYS: + case OpenSearchSQLParser.FROM_UNIXTIME: + case OpenSearchSQLParser.LAST_DAY: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.MAKEDATE: + case OpenSearchSQLParser.MAKETIME: + case OpenSearchSQLParser.MONTHNAME: + case OpenSearchSQLParser.NOW: + case OpenSearchSQLParser.PERIOD_ADD: + case OpenSearchSQLParser.PERIOD_DIFF: + case OpenSearchSQLParser.SEC_TO_TIME: + case OpenSearchSQLParser.STR_TO_DATE: + case OpenSearchSQLParser.SUBDATE: + case OpenSearchSQLParser.SUBTIME: + case OpenSearchSQLParser.SYSDATE: + case OpenSearchSQLParser.TIME: + case OpenSearchSQLParser.TIMEDIFF: + case OpenSearchSQLParser.TIME_FORMAT: + case OpenSearchSQLParser.TIME_TO_SEC: + case OpenSearchSQLParser.TIMESTAMP: + case OpenSearchSQLParser.TO_DAYS: + case OpenSearchSQLParser.TO_SECONDS: + case OpenSearchSQLParser.UNIX_TIMESTAMP: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + case OpenSearchSQLParser.DAY_OF_MONTH: + case OpenSearchSQLParser.DAY_OF_YEAR: + case OpenSearchSQLParser.DAY_OF_WEEK: + case OpenSearchSQLParser.HOUR_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_HOUR: + case OpenSearchSQLParser.MONTH_OF_YEAR: + case OpenSearchSQLParser.SECOND_OF_MINUTE: + case OpenSearchSQLParser.WEEK_OF_YEAR: + case OpenSearchSQLParser.WEEKOFYEAR: + case OpenSearchSQLParser.WEEKDAY: + case OpenSearchSQLParser.ADDDATE: + case OpenSearchSQLParser.YEARWEEK: + this.enterOuterAlt(localContext, 2); + { + this.state = 689; + this.dateTimeFunctionName(); + } + break; + case OpenSearchSQLParser.LEFT: + case OpenSearchSQLParser.RIGHT: + case OpenSearchSQLParser.SUBSTRING: + case OpenSearchSQLParser.TRIM: + case OpenSearchSQLParser.ASCII: + case OpenSearchSQLParser.CONCAT: + case OpenSearchSQLParser.CONCAT_WS: + case OpenSearchSQLParser.LENGTH: + case OpenSearchSQLParser.LOCATE: + case OpenSearchSQLParser.LOWER: + case OpenSearchSQLParser.LTRIM: + case OpenSearchSQLParser.REPLACE: + case OpenSearchSQLParser.RTRIM: + case OpenSearchSQLParser.REVERSE: + case OpenSearchSQLParser.UPPER: + case OpenSearchSQLParser.SUBSTR: + case OpenSearchSQLParser.STRCMP: + this.enterOuterAlt(localContext, 3); + { + this.state = 690; + this.textFunctionName(); + } + break; + case OpenSearchSQLParser.IF: + case OpenSearchSQLParser.IFNULL: + case OpenSearchSQLParser.ISNULL: + case OpenSearchSQLParser.NULLIF: + this.enterOuterAlt(localContext, 4); + { + this.state = 691; + this.flowControlFunctionName(); + } + break; + case OpenSearchSQLParser.TYPEOF: + this.enterOuterAlt(localContext, 5); + { + this.state = 692; + this.systemFunctionName(); + } + break; + case OpenSearchSQLParser.NESTED: + this.enterOuterAlt(localContext, 6); + { + this.state = 693; + this.nestedFunctionName(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public specificFunction(): SpecificFunctionContext { + let localContext = new SpecificFunctionContext(this.context, this.state); + this.enterRule(localContext, 128, OpenSearchSQLParser.RULE_specificFunction); + let _la: number; + try { + this.state = 728; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 64, this.context) ) { + case 1: + localContext = new CaseFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 696; + this.match(OpenSearchSQLParser.CASE); + this.state = 697; + this.expression(0); + this.state = 699; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + do { + { + { + this.state = 698; + this.caseFuncAlternative(); + } + } + this.state = 701; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } while (_la === 62); + this.state = 705; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 22) { + { + this.state = 703; + this.match(OpenSearchSQLParser.ELSE); + this.state = 704; + (localContext as CaseFunctionCallContext)._elseArg = this.functionArg(); + } + } + + this.state = 707; + this.match(OpenSearchSQLParser.END); + } + break; + case 2: + localContext = new CaseFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 2); + { + this.state = 709; + this.match(OpenSearchSQLParser.CASE); + this.state = 711; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + do { + { + { + this.state = 710; + this.caseFuncAlternative(); + } + } + this.state = 713; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } while (_la === 62); + this.state = 717; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 22) { + { + this.state = 715; + this.match(OpenSearchSQLParser.ELSE); + this.state = 716; + (localContext as CaseFunctionCallContext)._elseArg = this.functionArg(); + } + } + + this.state = 719; + this.match(OpenSearchSQLParser.END); + } + break; + case 3: + localContext = new DataTypeFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 3); + { + this.state = 721; + this.match(OpenSearchSQLParser.CAST); + this.state = 722; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 723; + this.expression(0); + this.state = 724; + this.match(OpenSearchSQLParser.AS); + this.state = 725; + this.convertedDataType(); + this.state = 726; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceFunction(): RelevanceFunctionContext { + let localContext = new RelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 130, OpenSearchSQLParser.RULE_relevanceFunction); + try { + this.state = 735; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 65, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 730; + this.noFieldRelevanceFunction(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 731; + this.singleFieldRelevanceFunction(); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 732; + this.multiFieldRelevanceFunction(); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 733; + this.altSingleFieldRelevanceFunction(); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 734; + this.altMultiFieldRelevanceFunction(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public scoreRelevanceFunction(): ScoreRelevanceFunctionContext { + let localContext = new ScoreRelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 132, OpenSearchSQLParser.RULE_scoreRelevanceFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 737; + this.scoreRelevanceFunctionName(); + this.state = 738; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 739; + this.relevanceFunction(); + this.state = 742; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 332) { + { + this.state = 740; + this.match(OpenSearchSQLParser.COMMA); + this.state = 741; + localContext._weight = this.relevanceFieldWeight(); + } + } + + this.state = 744; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public noFieldRelevanceFunction(): NoFieldRelevanceFunctionContext { + let localContext = new NoFieldRelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 134, OpenSearchSQLParser.RULE_noFieldRelevanceFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 746; + this.noFieldRelevanceFunctionName(); + this.state = 747; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 748; + localContext._query = this.relevanceQuery(); + this.state = 753; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 749; + this.match(OpenSearchSQLParser.COMMA); + this.state = 750; + this.relevanceArg(); + } + } + this.state = 755; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 756; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public singleFieldRelevanceFunction(): SingleFieldRelevanceFunctionContext { + let localContext = new SingleFieldRelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 136, OpenSearchSQLParser.RULE_singleFieldRelevanceFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 758; + this.singleFieldRelevanceFunctionName(); + this.state = 759; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 760; + localContext._field = this.relevanceField(); + this.state = 761; + this.match(OpenSearchSQLParser.COMMA); + this.state = 762; + localContext._query = this.relevanceQuery(); + this.state = 767; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 763; + this.match(OpenSearchSQLParser.COMMA); + this.state = 764; + this.relevanceArg(); + } + } + this.state = 769; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 770; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public multiFieldRelevanceFunction(): MultiFieldRelevanceFunctionContext { + let localContext = new MultiFieldRelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 138, OpenSearchSQLParser.RULE_multiFieldRelevanceFunction); + let _la: number; + try { + this.state = 809; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 72, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 772; + this.multiFieldRelevanceFunctionName(); + this.state = 773; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 774; + this.match(OpenSearchSQLParser.LT_SQR_PRTHS); + this.state = 775; + localContext._field = this.relevanceFieldAndWeight(); + this.state = 780; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 776; + this.match(OpenSearchSQLParser.COMMA); + this.state = 777; + localContext._field = this.relevanceFieldAndWeight(); + } + } + this.state = 782; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 783; + this.match(OpenSearchSQLParser.RT_SQR_PRTHS); + this.state = 784; + this.match(OpenSearchSQLParser.COMMA); + this.state = 785; + localContext._query = this.relevanceQuery(); + this.state = 790; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 786; + this.match(OpenSearchSQLParser.COMMA); + this.state = 787; + this.relevanceArg(); + } + } + this.state = 792; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 793; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 795; + this.multiFieldRelevanceFunctionName(); + this.state = 796; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 797; + this.alternateMultiMatchQuery(); + this.state = 798; + this.match(OpenSearchSQLParser.COMMA); + this.state = 799; + this.alternateMultiMatchField(); + this.state = 804; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 800; + this.match(OpenSearchSQLParser.COMMA); + this.state = 801; + this.relevanceArg(); + } + } + this.state = 806; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 807; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public altSingleFieldRelevanceFunction(): AltSingleFieldRelevanceFunctionContext { + let localContext = new AltSingleFieldRelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 140, OpenSearchSQLParser.RULE_altSingleFieldRelevanceFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 811; + localContext._field = this.relevanceField(); + this.state = 812; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 813; + localContext._altSyntaxFunctionName = this.altSingleFieldRelevanceFunctionName(); + this.state = 814; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 815; + localContext._query = this.relevanceQuery(); + this.state = 820; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 816; + this.match(OpenSearchSQLParser.COMMA); + this.state = 817; + this.relevanceArg(); + } + } + this.state = 822; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 823; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public altMultiFieldRelevanceFunction(): AltMultiFieldRelevanceFunctionContext { + let localContext = new AltMultiFieldRelevanceFunctionContext(this.context, this.state); + this.enterRule(localContext, 142, OpenSearchSQLParser.RULE_altMultiFieldRelevanceFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 825; + localContext._field = this.relevanceField(); + this.state = 826; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 827; + localContext._altSyntaxFunctionName = this.altMultiFieldRelevanceFunctionName(); + this.state = 828; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 829; + localContext._query = this.relevanceQuery(); + this.state = 834; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 830; + this.match(OpenSearchSQLParser.COMMA); + this.state = 831; + this.relevanceArg(); + } + } + this.state = 836; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 837; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public convertedDataType(): ConvertedDataTypeContext { + let localContext = new ConvertedDataTypeContext(this.context, this.state); + this.enterRule(localContext, 144, OpenSearchSQLParser.RULE_convertedDataType); + try { + this.state = 849; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.DATE: + this.enterOuterAlt(localContext, 1); + { + this.state = 839; + localContext._typeName = this.match(OpenSearchSQLParser.DATE); + } + break; + case OpenSearchSQLParser.TIME: + this.enterOuterAlt(localContext, 2); + { + this.state = 840; + localContext._typeName = this.match(OpenSearchSQLParser.TIME); + } + break; + case OpenSearchSQLParser.TIMESTAMP: + this.enterOuterAlt(localContext, 3); + { + this.state = 841; + localContext._typeName = this.match(OpenSearchSQLParser.TIMESTAMP); + } + break; + case OpenSearchSQLParser.INT: + this.enterOuterAlt(localContext, 4); + { + this.state = 842; + localContext._typeName = this.match(OpenSearchSQLParser.INT); + } + break; + case OpenSearchSQLParser.INTEGER: + this.enterOuterAlt(localContext, 5); + { + this.state = 843; + localContext._typeName = this.match(OpenSearchSQLParser.INTEGER); + } + break; + case OpenSearchSQLParser.DOUBLE: + this.enterOuterAlt(localContext, 6); + { + this.state = 844; + localContext._typeName = this.match(OpenSearchSQLParser.DOUBLE); + } + break; + case OpenSearchSQLParser.LONG: + this.enterOuterAlt(localContext, 7); + { + this.state = 845; + localContext._typeName = this.match(OpenSearchSQLParser.LONG); + } + break; + case OpenSearchSQLParser.FLOAT: + this.enterOuterAlt(localContext, 8); + { + this.state = 846; + localContext._typeName = this.match(OpenSearchSQLParser.FLOAT); + } + break; + case OpenSearchSQLParser.STRING: + this.enterOuterAlt(localContext, 9); + { + this.state = 847; + localContext._typeName = this.match(OpenSearchSQLParser.STRING); + } + break; + case OpenSearchSQLParser.BOOLEAN: + this.enterOuterAlt(localContext, 10); + { + this.state = 848; + localContext._typeName = this.match(OpenSearchSQLParser.BOOLEAN); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public caseFuncAlternative(): CaseFuncAlternativeContext { + let localContext = new CaseFuncAlternativeContext(this.context, this.state); + this.enterRule(localContext, 146, OpenSearchSQLParser.RULE_caseFuncAlternative); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 851; + this.match(OpenSearchSQLParser.WHEN); + this.state = 852; + localContext._condition = this.functionArg(); + this.state = 853; + this.match(OpenSearchSQLParser.THEN); + this.state = 854; + localContext._consequent = this.functionArg(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public aggregateFunction(): AggregateFunctionContext { + let localContext = new AggregateFunctionContext(this.context, this.state); + this.enterRule(localContext, 148, OpenSearchSQLParser.RULE_aggregateFunction); + try { + this.state = 872; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 76, this.context) ) { + case 1: + localContext = new RegularAggregateFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 1); + { + this.state = 856; + (localContext as RegularAggregateFunctionCallContext)._functionName = this.aggregationFunctionName(); + this.state = 857; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 858; + this.functionArg(); + this.state = 859; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case 2: + localContext = new CountStarFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 2); + { + this.state = 861; + this.match(OpenSearchSQLParser.COUNT); + this.state = 862; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 863; + this.match(OpenSearchSQLParser.STAR); + this.state = 864; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case 3: + localContext = new DistinctCountFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 3); + { + this.state = 865; + this.match(OpenSearchSQLParser.COUNT); + this.state = 866; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 867; + this.match(OpenSearchSQLParser.DISTINCT); + this.state = 868; + this.functionArg(); + this.state = 869; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + break; + case 4: + localContext = new PercentileApproxFunctionCallContext(localContext); + this.enterOuterAlt(localContext, 4); + { + this.state = 871; + this.percentileApproxFunction(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public percentileApproxFunction(): PercentileApproxFunctionContext { + let localContext = new PercentileApproxFunctionContext(this.context, this.state); + this.enterRule(localContext, 150, OpenSearchSQLParser.RULE_percentileApproxFunction); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 874; + _la = this.tokenStream.LA(1); + if(!(_la === 248 || _la === 249)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 875; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 876; + localContext._aggField = this.functionArg(); + this.state = 877; + this.match(OpenSearchSQLParser.COMMA); + this.state = 878; + localContext._percent = this.numericLiteral(); + this.state = 881; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 332) { + { + this.state = 879; + this.match(OpenSearchSQLParser.COMMA); + this.state = 880; + localContext._compression = this.numericLiteral(); + } + } + + this.state = 883; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public filterClause(): FilterClauseContext { + let localContext = new FilterClauseContext(this.context, this.state); + this.enterRule(localContext, 152, OpenSearchSQLParser.RULE_filterClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 885; + this.match(OpenSearchSQLParser.FILTER); + this.state = 886; + this.match(OpenSearchSQLParser.LR_BRACKET); + this.state = 887; + this.match(OpenSearchSQLParser.WHERE); + this.state = 888; + this.expression(0); + this.state = 889; + this.match(OpenSearchSQLParser.RR_BRACKET); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public aggregationFunctionName(): AggregationFunctionNameContext { + let localContext = new AggregationFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 154, OpenSearchSQLParser.RULE_aggregationFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 891; + _la = this.tokenStream.LA(1); + if(!(((((_la - 65)) & ~0x1F) === 0 && ((1 << (_la - 65)) & 4095) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public mathematicalFunctionName(): MathematicalFunctionNameContext { + let localContext = new MathematicalFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 156, OpenSearchSQLParser.RULE_mathematicalFunctionName); + try { + this.state = 920; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 78, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 893; + this.match(OpenSearchSQLParser.ABS); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 894; + this.match(OpenSearchSQLParser.CBRT); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 895; + this.match(OpenSearchSQLParser.CEIL); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 896; + this.match(OpenSearchSQLParser.CEILING); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 897; + this.match(OpenSearchSQLParser.CONV); + } + break; + case 6: + this.enterOuterAlt(localContext, 6); + { + this.state = 898; + this.match(OpenSearchSQLParser.CRC32); + } + break; + case 7: + this.enterOuterAlt(localContext, 7); + { + this.state = 899; + this.match(OpenSearchSQLParser.E); + } + break; + case 8: + this.enterOuterAlt(localContext, 8); + { + this.state = 900; + this.match(OpenSearchSQLParser.EXP); + } + break; + case 9: + this.enterOuterAlt(localContext, 9); + { + this.state = 901; + this.match(OpenSearchSQLParser.EXPM1); + } + break; + case 10: + this.enterOuterAlt(localContext, 10); + { + this.state = 902; + this.match(OpenSearchSQLParser.FLOOR); + } + break; + case 11: + this.enterOuterAlt(localContext, 11); + { + this.state = 903; + this.match(OpenSearchSQLParser.LN); + } + break; + case 12: + this.enterOuterAlt(localContext, 12); + { + this.state = 904; + this.match(OpenSearchSQLParser.LOG); + } + break; + case 13: + this.enterOuterAlt(localContext, 13); + { + this.state = 905; + this.match(OpenSearchSQLParser.LOG10); + } + break; + case 14: + this.enterOuterAlt(localContext, 14); + { + this.state = 906; + this.match(OpenSearchSQLParser.LOG2); + } + break; + case 15: + this.enterOuterAlt(localContext, 15); + { + this.state = 907; + this.match(OpenSearchSQLParser.MOD); + } + break; + case 16: + this.enterOuterAlt(localContext, 16); + { + this.state = 908; + this.match(OpenSearchSQLParser.PI); + } + break; + case 17: + this.enterOuterAlt(localContext, 17); + { + this.state = 909; + this.match(OpenSearchSQLParser.POW); + } + break; + case 18: + this.enterOuterAlt(localContext, 18); + { + this.state = 910; + this.match(OpenSearchSQLParser.POWER); + } + break; + case 19: + this.enterOuterAlt(localContext, 19); + { + this.state = 911; + this.match(OpenSearchSQLParser.RAND); + } + break; + case 20: + this.enterOuterAlt(localContext, 20); + { + this.state = 912; + this.match(OpenSearchSQLParser.RINT); + } + break; + case 21: + this.enterOuterAlt(localContext, 21); + { + this.state = 913; + this.match(OpenSearchSQLParser.ROUND); + } + break; + case 22: + this.enterOuterAlt(localContext, 22); + { + this.state = 914; + this.match(OpenSearchSQLParser.SIGN); + } + break; + case 23: + this.enterOuterAlt(localContext, 23); + { + this.state = 915; + this.match(OpenSearchSQLParser.SIGNUM); + } + break; + case 24: + this.enterOuterAlt(localContext, 24); + { + this.state = 916; + this.match(OpenSearchSQLParser.SQRT); + } + break; + case 25: + this.enterOuterAlt(localContext, 25); + { + this.state = 917; + this.match(OpenSearchSQLParser.TRUNCATE); + } + break; + case 26: + this.enterOuterAlt(localContext, 26); + { + this.state = 918; + this.trigonometricFunctionName(); + } + break; + case 27: + this.enterOuterAlt(localContext, 27); + { + this.state = 919; + this.arithmeticFunctionName(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public trigonometricFunctionName(): TrigonometricFunctionNameContext { + let localContext = new TrigonometricFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 158, OpenSearchSQLParser.RULE_trigonometricFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 922; + _la = this.tokenStream.LA(1); + if(!(((((_la - 105)) & ~0x1F) === 0 && ((1 << (_la - 105)) & 114801) !== 0) || _la === 137 || ((((_la - 174)) & ~0x1F) === 0 && ((1 << (_la - 174)) & 265217) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public arithmeticFunctionName(): ArithmeticFunctionNameContext { + let localContext = new ArithmeticFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 160, OpenSearchSQLParser.RULE_arithmeticFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 924; + _la = this.tokenStream.LA(1); + if(!(_la === 106 || ((((_la - 138)) & ~0x1F) === 0 && ((1 << (_la - 138)) & 167772161) !== 0) || _la === 190 || _la === 318)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public dateTimeFunctionName(): DateTimeFunctionNameContext { + let localContext = new DateTimeFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 162, OpenSearchSQLParser.RULE_dateTimeFunctionName); + try { + this.state = 985; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + this.enterOuterAlt(localContext, 1); + { + this.state = 926; + this.datetimeConstantLiteral(); + } + break; + case OpenSearchSQLParser.ADDDATE: + this.enterOuterAlt(localContext, 2); + { + this.state = 927; + this.match(OpenSearchSQLParser.ADDDATE); + } + break; + case OpenSearchSQLParser.ADDTIME: + this.enterOuterAlt(localContext, 3); + { + this.state = 928; + this.match(OpenSearchSQLParser.ADDTIME); + } + break; + case OpenSearchSQLParser.CONVERT_TZ: + this.enterOuterAlt(localContext, 4); + { + this.state = 929; + this.match(OpenSearchSQLParser.CONVERT_TZ); + } + break; + case OpenSearchSQLParser.CURDATE: + this.enterOuterAlt(localContext, 5); + { + this.state = 930; + this.match(OpenSearchSQLParser.CURDATE); + } + break; + case OpenSearchSQLParser.CURTIME: + this.enterOuterAlt(localContext, 6); + { + this.state = 931; + this.match(OpenSearchSQLParser.CURTIME); + } + break; + case OpenSearchSQLParser.DATE: + this.enterOuterAlt(localContext, 7); + { + this.state = 932; + this.match(OpenSearchSQLParser.DATE); + } + break; + case OpenSearchSQLParser.DATE_ADD: + this.enterOuterAlt(localContext, 8); + { + this.state = 933; + this.match(OpenSearchSQLParser.DATE_ADD); + } + break; + case OpenSearchSQLParser.DATE_FORMAT: + this.enterOuterAlt(localContext, 9); + { + this.state = 934; + this.match(OpenSearchSQLParser.DATE_FORMAT); + } + break; + case OpenSearchSQLParser.DATE_SUB: + this.enterOuterAlt(localContext, 10); + { + this.state = 935; + this.match(OpenSearchSQLParser.DATE_SUB); + } + break; + case OpenSearchSQLParser.DATEDIFF: + this.enterOuterAlt(localContext, 11); + { + this.state = 936; + this.match(OpenSearchSQLParser.DATEDIFF); + } + break; + case OpenSearchSQLParser.DATETIME: + this.enterOuterAlt(localContext, 12); + { + this.state = 937; + this.match(OpenSearchSQLParser.DATETIME); + } + break; + case OpenSearchSQLParser.DAY: + this.enterOuterAlt(localContext, 13); + { + this.state = 938; + this.match(OpenSearchSQLParser.DAY); + } + break; + case OpenSearchSQLParser.DAYNAME: + this.enterOuterAlt(localContext, 14); + { + this.state = 939; + this.match(OpenSearchSQLParser.DAYNAME); + } + break; + case OpenSearchSQLParser.DAYOFMONTH: + this.enterOuterAlt(localContext, 15); + { + this.state = 940; + this.match(OpenSearchSQLParser.DAYOFMONTH); + } + break; + case OpenSearchSQLParser.DAY_OF_MONTH: + this.enterOuterAlt(localContext, 16); + { + this.state = 941; + this.match(OpenSearchSQLParser.DAY_OF_MONTH); + } + break; + case OpenSearchSQLParser.DAYOFWEEK: + this.enterOuterAlt(localContext, 17); + { + this.state = 942; + this.match(OpenSearchSQLParser.DAYOFWEEK); + } + break; + case OpenSearchSQLParser.DAYOFYEAR: + this.enterOuterAlt(localContext, 18); + { + this.state = 943; + this.match(OpenSearchSQLParser.DAYOFYEAR); + } + break; + case OpenSearchSQLParser.DAY_OF_YEAR: + this.enterOuterAlt(localContext, 19); + { + this.state = 944; + this.match(OpenSearchSQLParser.DAY_OF_YEAR); + } + break; + case OpenSearchSQLParser.DAY_OF_WEEK: + this.enterOuterAlt(localContext, 20); + { + this.state = 945; + this.match(OpenSearchSQLParser.DAY_OF_WEEK); + } + break; + case OpenSearchSQLParser.FROM_DAYS: + this.enterOuterAlt(localContext, 21); + { + this.state = 946; + this.match(OpenSearchSQLParser.FROM_DAYS); + } + break; + case OpenSearchSQLParser.FROM_UNIXTIME: + this.enterOuterAlt(localContext, 22); + { + this.state = 947; + this.match(OpenSearchSQLParser.FROM_UNIXTIME); + } + break; + case OpenSearchSQLParser.HOUR: + this.enterOuterAlt(localContext, 23); + { + this.state = 948; + this.match(OpenSearchSQLParser.HOUR); + } + break; + case OpenSearchSQLParser.HOUR_OF_DAY: + this.enterOuterAlt(localContext, 24); + { + this.state = 949; + this.match(OpenSearchSQLParser.HOUR_OF_DAY); + } + break; + case OpenSearchSQLParser.LAST_DAY: + this.enterOuterAlt(localContext, 25); + { + this.state = 950; + this.match(OpenSearchSQLParser.LAST_DAY); + } + break; + case OpenSearchSQLParser.MAKEDATE: + this.enterOuterAlt(localContext, 26); + { + this.state = 951; + this.match(OpenSearchSQLParser.MAKEDATE); + } + break; + case OpenSearchSQLParser.MAKETIME: + this.enterOuterAlt(localContext, 27); + { + this.state = 952; + this.match(OpenSearchSQLParser.MAKETIME); + } + break; + case OpenSearchSQLParser.MICROSECOND: + this.enterOuterAlt(localContext, 28); + { + this.state = 953; + this.match(OpenSearchSQLParser.MICROSECOND); + } + break; + case OpenSearchSQLParser.MINUTE: + this.enterOuterAlt(localContext, 29); + { + this.state = 954; + this.match(OpenSearchSQLParser.MINUTE); + } + break; + case OpenSearchSQLParser.MINUTE_OF_DAY: + this.enterOuterAlt(localContext, 30); + { + this.state = 955; + this.match(OpenSearchSQLParser.MINUTE_OF_DAY); + } + break; + case OpenSearchSQLParser.MINUTE_OF_HOUR: + this.enterOuterAlt(localContext, 31); + { + this.state = 956; + this.match(OpenSearchSQLParser.MINUTE_OF_HOUR); + } + break; + case OpenSearchSQLParser.MONTH: + this.enterOuterAlt(localContext, 32); + { + this.state = 957; + this.match(OpenSearchSQLParser.MONTH); + } + break; + case OpenSearchSQLParser.MONTHNAME: + this.enterOuterAlt(localContext, 33); + { + this.state = 958; + this.match(OpenSearchSQLParser.MONTHNAME); + } + break; + case OpenSearchSQLParser.MONTH_OF_YEAR: + this.enterOuterAlt(localContext, 34); + { + this.state = 959; + this.match(OpenSearchSQLParser.MONTH_OF_YEAR); + } + break; + case OpenSearchSQLParser.NOW: + this.enterOuterAlt(localContext, 35); + { + this.state = 960; + this.match(OpenSearchSQLParser.NOW); + } + break; + case OpenSearchSQLParser.PERIOD_ADD: + this.enterOuterAlt(localContext, 36); + { + this.state = 961; + this.match(OpenSearchSQLParser.PERIOD_ADD); + } + break; + case OpenSearchSQLParser.PERIOD_DIFF: + this.enterOuterAlt(localContext, 37); + { + this.state = 962; + this.match(OpenSearchSQLParser.PERIOD_DIFF); + } + break; + case OpenSearchSQLParser.QUARTER: + this.enterOuterAlt(localContext, 38); + { + this.state = 963; + this.match(OpenSearchSQLParser.QUARTER); + } + break; + case OpenSearchSQLParser.SEC_TO_TIME: + this.enterOuterAlt(localContext, 39); + { + this.state = 964; + this.match(OpenSearchSQLParser.SEC_TO_TIME); + } + break; + case OpenSearchSQLParser.SECOND: + this.enterOuterAlt(localContext, 40); + { + this.state = 965; + this.match(OpenSearchSQLParser.SECOND); + } + break; + case OpenSearchSQLParser.SECOND_OF_MINUTE: + this.enterOuterAlt(localContext, 41); + { + this.state = 966; + this.match(OpenSearchSQLParser.SECOND_OF_MINUTE); + } + break; + case OpenSearchSQLParser.SUBDATE: + this.enterOuterAlt(localContext, 42); + { + this.state = 967; + this.match(OpenSearchSQLParser.SUBDATE); + } + break; + case OpenSearchSQLParser.SUBTIME: + this.enterOuterAlt(localContext, 43); + { + this.state = 968; + this.match(OpenSearchSQLParser.SUBTIME); + } + break; + case OpenSearchSQLParser.SYSDATE: + this.enterOuterAlt(localContext, 44); + { + this.state = 969; + this.match(OpenSearchSQLParser.SYSDATE); + } + break; + case OpenSearchSQLParser.STR_TO_DATE: + this.enterOuterAlt(localContext, 45); + { + this.state = 970; + this.match(OpenSearchSQLParser.STR_TO_DATE); + } + break; + case OpenSearchSQLParser.TIME: + this.enterOuterAlt(localContext, 46); + { + this.state = 971; + this.match(OpenSearchSQLParser.TIME); + } + break; + case OpenSearchSQLParser.TIME_FORMAT: + this.enterOuterAlt(localContext, 47); + { + this.state = 972; + this.match(OpenSearchSQLParser.TIME_FORMAT); + } + break; + case OpenSearchSQLParser.TIME_TO_SEC: + this.enterOuterAlt(localContext, 48); + { + this.state = 973; + this.match(OpenSearchSQLParser.TIME_TO_SEC); + } + break; + case OpenSearchSQLParser.TIMEDIFF: + this.enterOuterAlt(localContext, 49); + { + this.state = 974; + this.match(OpenSearchSQLParser.TIMEDIFF); + } + break; + case OpenSearchSQLParser.TIMESTAMP: + this.enterOuterAlt(localContext, 50); + { + this.state = 975; + this.match(OpenSearchSQLParser.TIMESTAMP); + } + break; + case OpenSearchSQLParser.TO_DAYS: + this.enterOuterAlt(localContext, 51); + { + this.state = 976; + this.match(OpenSearchSQLParser.TO_DAYS); + } + break; + case OpenSearchSQLParser.TO_SECONDS: + this.enterOuterAlt(localContext, 52); + { + this.state = 977; + this.match(OpenSearchSQLParser.TO_SECONDS); + } + break; + case OpenSearchSQLParser.UNIX_TIMESTAMP: + this.enterOuterAlt(localContext, 53); + { + this.state = 978; + this.match(OpenSearchSQLParser.UNIX_TIMESTAMP); + } + break; + case OpenSearchSQLParser.WEEK: + this.enterOuterAlt(localContext, 54); + { + this.state = 979; + this.match(OpenSearchSQLParser.WEEK); + } + break; + case OpenSearchSQLParser.WEEKDAY: + this.enterOuterAlt(localContext, 55); + { + this.state = 980; + this.match(OpenSearchSQLParser.WEEKDAY); + } + break; + case OpenSearchSQLParser.WEEK_OF_YEAR: + this.enterOuterAlt(localContext, 56); + { + this.state = 981; + this.match(OpenSearchSQLParser.WEEK_OF_YEAR); + } + break; + case OpenSearchSQLParser.WEEKOFYEAR: + this.enterOuterAlt(localContext, 57); + { + this.state = 982; + this.match(OpenSearchSQLParser.WEEKOFYEAR); + } + break; + case OpenSearchSQLParser.YEAR: + this.enterOuterAlt(localContext, 58); + { + this.state = 983; + this.match(OpenSearchSQLParser.YEAR); + } + break; + case OpenSearchSQLParser.YEARWEEK: + this.enterOuterAlt(localContext, 59); + { + this.state = 984; + this.match(OpenSearchSQLParser.YEARWEEK); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public textFunctionName(): TextFunctionNameContext { + let localContext = new TextFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 164, OpenSearchSQLParser.RULE_textFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 987; + _la = this.tokenStream.LA(1); + if(!(_la === 37 || _la === 54 || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 2147483651) !== 0) || _la === 115 || _la === 116 || ((((_la - 151)) & ~0x1F) === 0 && ((1 << (_la - 151)) & 838861585) !== 0) || _la === 202 || _la === 270 || _la === 271)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public flowControlFunctionName(): FlowControlFunctionNameContext { + let localContext = new FlowControlFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 166, OpenSearchSQLParser.RULE_flowControlFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 989; + _la = this.tokenStream.LA(1); + if(!(((((_la - 147)) & ~0x1F) === 0 && ((1 << (_la - 147)) & 1048583) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public noFieldRelevanceFunctionName(): NoFieldRelevanceFunctionNameContext { + let localContext = new NoFieldRelevanceFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 168, OpenSearchSQLParser.RULE_noFieldRelevanceFunctionName); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 991; + this.match(OpenSearchSQLParser.QUERY); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public systemFunctionName(): SystemFunctionNameContext { + let localContext = new SystemFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 170, OpenSearchSQLParser.RULE_systemFunctionName); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 993; + this.match(OpenSearchSQLParser.TYPEOF); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public nestedFunctionName(): NestedFunctionNameContext { + let localContext = new NestedFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 172, OpenSearchSQLParser.RULE_nestedFunctionName); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 995; + this.match(OpenSearchSQLParser.NESTED); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public scoreRelevanceFunctionName(): ScoreRelevanceFunctionNameContext { + let localContext = new ScoreRelevanceFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 174, OpenSearchSQLParser.RULE_scoreRelevanceFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 997; + _la = this.tokenStream.LA(1); + if(!(((((_la - 254)) & ~0x1F) === 0 && ((1 << (_la - 254)) & 7) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public singleFieldRelevanceFunctionName(): SingleFieldRelevanceFunctionNameContext { + let localContext = new SingleFieldRelevanceFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 176, OpenSearchSQLParser.RULE_singleFieldRelevanceFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 999; + _la = this.tokenStream.LA(1); + if(!(_la === 41 || ((((_la - 232)) & ~0x1F) === 0 && ((1 << (_la - 232)) & 231) !== 0) || _la === 268 || _la === 269 || _la === 311)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public multiFieldRelevanceFunctionName(): MultiFieldRelevanceFunctionNameContext { + let localContext = new MultiFieldRelevanceFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 178, OpenSearchSQLParser.RULE_multiFieldRelevanceFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1001; + _la = this.tokenStream.LA(1); + if(!(((((_la - 235)) & ~0x1F) === 0 && ((1 << (_la - 235)) & 1795) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public altSingleFieldRelevanceFunctionName(): AltSingleFieldRelevanceFunctionNameContext { + let localContext = new AltSingleFieldRelevanceFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 180, OpenSearchSQLParser.RULE_altSingleFieldRelevanceFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1003; + _la = this.tokenStream.LA(1); + if(!(((((_la - 232)) & ~0x1F) === 0 && ((1 << (_la - 232)) & 195) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public altMultiFieldRelevanceFunctionName(): AltMultiFieldRelevanceFunctionNameContext { + let localContext = new AltMultiFieldRelevanceFunctionNameContext(this.context, this.state); + this.enterRule(localContext, 182, OpenSearchSQLParser.RULE_altMultiFieldRelevanceFunctionName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1005; + _la = this.tokenStream.LA(1); + if(!(_la === 243 || _la === 244)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public functionArgs(): FunctionArgsContext { + let localContext = new FunctionArgsContext(this.context, this.state); + this.enterRule(localContext, 184, OpenSearchSQLParser.RULE_functionArgs); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1015; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 83963904) !== 0) || ((((_la - 36)) & ~0x1F) === 0 && ((1 << (_la - 36)) & 3766747939) !== 0) || ((((_la - 68)) & ~0x1F) === 0 && ((1 << (_la - 68)) & 16766975) !== 0) || ((((_la - 104)) & ~0x1F) === 0 && ((1 << (_la - 104)) & 4294967295) !== 0) || ((((_la - 136)) & ~0x1F) === 0 && ((1 << (_la - 136)) & 4294967295) !== 0) || ((((_la - 168)) & ~0x1F) === 0 && ((1 << (_la - 168)) & 4294967295) !== 0) || ((((_la - 200)) & ~0x1F) === 0 && ((1 << (_la - 200)) & 538164223) !== 0) || ((((_la - 232)) & ~0x1F) === 0 && ((1 << (_la - 232)) & 1674805247) !== 0) || ((((_la - 264)) & ~0x1F) === 0 && ((1 << (_la - 264)) & 1023) !== 0) || ((((_la - 306)) & ~0x1F) === 0 && ((1 << (_la - 306)) & 3764393509) !== 0) || ((((_la - 343)) & ~0x1F) === 0 && ((1 << (_la - 343)) & 459) !== 0)) { + { + this.state = 1007; + this.functionArg(); + this.state = 1012; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 332) { + { + { + this.state = 1008; + this.match(OpenSearchSQLParser.COMMA); + this.state = 1009; + this.functionArg(); + } + } + this.state = 1014; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + } + } + + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public functionArg(): FunctionArgContext { + let localContext = new FunctionArgContext(this.context, this.state); + this.enterRule(localContext, 186, OpenSearchSQLParser.RULE_functionArg); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1017; + this.expression(0); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceArg(): RelevanceArgContext { + let localContext = new RelevanceArgContext(this.context, this.state); + this.enterRule(localContext, 188, OpenSearchSQLParser.RULE_relevanceArg); + try { + this.state = 1027; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.ALLOW_LEADING_WILDCARD: + case OpenSearchSQLParser.ANALYZER: + case OpenSearchSQLParser.ANALYZE_WILDCARD: + case OpenSearchSQLParser.AUTO_GENERATE_SYNONYMS_PHRASE_QUERY: + case OpenSearchSQLParser.BOOST: + case OpenSearchSQLParser.CASE_INSENSITIVE: + case OpenSearchSQLParser.CUTOFF_FREQUENCY: + case OpenSearchSQLParser.DEFAULT_FIELD: + case OpenSearchSQLParser.DEFAULT_OPERATOR: + case OpenSearchSQLParser.ESCAPE: + case OpenSearchSQLParser.ENABLE_POSITION_INCREMENTS: + case OpenSearchSQLParser.FIELDS: + case OpenSearchSQLParser.FLAGS: + case OpenSearchSQLParser.FUZZINESS: + case OpenSearchSQLParser.FUZZY_MAX_EXPANSIONS: + case OpenSearchSQLParser.FUZZY_PREFIX_LENGTH: + case OpenSearchSQLParser.FUZZY_REWRITE: + case OpenSearchSQLParser.FUZZY_TRANSPOSITIONS: + case OpenSearchSQLParser.LENIENT: + case OpenSearchSQLParser.LOW_FREQ_OPERATOR: + case OpenSearchSQLParser.MAX_DETERMINIZED_STATES: + case OpenSearchSQLParser.MAX_EXPANSIONS: + case OpenSearchSQLParser.MINIMUM_SHOULD_MATCH: + case OpenSearchSQLParser.OPERATOR: + case OpenSearchSQLParser.PHRASE_SLOP: + case OpenSearchSQLParser.PREFIX_LENGTH: + case OpenSearchSQLParser.QUOTE_ANALYZER: + case OpenSearchSQLParser.QUOTE_FIELD_SUFFIX: + case OpenSearchSQLParser.REWRITE: + case OpenSearchSQLParser.SLOP: + case OpenSearchSQLParser.TIE_BREAKER: + case OpenSearchSQLParser.TIME_ZONE: + case OpenSearchSQLParser.TYPE: + case OpenSearchSQLParser.ZERO_TERMS_QUERY: + this.enterOuterAlt(localContext, 1); + { + this.state = 1019; + this.relevanceArgName(); + this.state = 1020; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 1021; + this.relevanceArgValue(); + } + break; + case OpenSearchSQLParser.STRING_LITERAL: + case OpenSearchSQLParser.DOUBLE_QUOTE_ID: + this.enterOuterAlt(localContext, 2); + { + this.state = 1023; + localContext._argName = this.stringLiteral(); + this.state = 1024; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 1025; + localContext._argVal = this.relevanceArgValue(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public highlightArg(): HighlightArgContext { + let localContext = new HighlightArgContext(this.context, this.state); + this.enterRule(localContext, 190, OpenSearchSQLParser.RULE_highlightArg); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1029; + this.highlightArgName(); + this.state = 1030; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 1031; + this.highlightArgValue(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceArgName(): RelevanceArgNameContext { + let localContext = new RelevanceArgNameContext(this.context, this.state); + this.enterRule(localContext, 192, OpenSearchSQLParser.RULE_relevanceArgName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1033; + _la = this.tokenStream.LA(1); + if(!(((((_la - 274)) & ~0x1F) === 0 && ((1 << (_la - 274)) & 4294967295) !== 0) || _la === 306 || _la === 307)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public highlightArgName(): HighlightArgNameContext { + let localContext = new HighlightArgNameContext(this.context, this.state); + this.enterRule(localContext, 194, OpenSearchSQLParser.RULE_highlightArgName); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1035; + _la = this.tokenStream.LA(1); + if(!(_la === 309 || _la === 310)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceFieldAndWeight(): RelevanceFieldAndWeightContext { + let localContext = new RelevanceFieldAndWeightContext(this.context, this.state); + this.enterRule(localContext, 196, OpenSearchSQLParser.RULE_relevanceFieldAndWeight); + try { + this.state = 1045; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 83, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 1037; + localContext._field = this.relevanceField(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 1038; + localContext._field = this.relevanceField(); + this.state = 1039; + localContext._weight = this.relevanceFieldWeight(); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 1041; + localContext._field = this.relevanceField(); + this.state = 1042; + this.match(OpenSearchSQLParser.BIT_XOR_OP); + this.state = 1043; + localContext._weight = this.relevanceFieldWeight(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceFieldWeight(): RelevanceFieldWeightContext { + let localContext = new RelevanceFieldWeightContext(this.context, this.state); + this.enterRule(localContext, 198, OpenSearchSQLParser.RULE_relevanceFieldWeight); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1047; + this.numericLiteral(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceField(): RelevanceFieldContext { + let localContext = new RelevanceFieldContext(this.context, this.state); + this.enterRule(localContext, 200, OpenSearchSQLParser.RULE_relevanceField); + try { + this.state = 1051; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.DATETIME: + case OpenSearchSQLParser.FIRST: + case OpenSearchSQLParser.LAST: + case OpenSearchSQLParser.LEFT: + case OpenSearchSQLParser.RIGHT: + case OpenSearchSQLParser.AVG: + case OpenSearchSQLParser.COUNT: + case OpenSearchSQLParser.MAX: + case OpenSearchSQLParser.MIN: + case OpenSearchSQLParser.SUM: + case OpenSearchSQLParser.SUBSTRING: + case OpenSearchSQLParser.TRIM: + case OpenSearchSQLParser.FULL: + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + case OpenSearchSQLParser.ABS: + case OpenSearchSQLParser.ACOS: + case OpenSearchSQLParser.ADD: + case OpenSearchSQLParser.ADDTIME: + case OpenSearchSQLParser.ASCII: + case OpenSearchSQLParser.ASIN: + case OpenSearchSQLParser.ATAN: + case OpenSearchSQLParser.ATAN2: + case OpenSearchSQLParser.CBRT: + case OpenSearchSQLParser.CEIL: + case OpenSearchSQLParser.CEILING: + case OpenSearchSQLParser.CONCAT: + case OpenSearchSQLParser.CONCAT_WS: + case OpenSearchSQLParser.CONV: + case OpenSearchSQLParser.CONVERT_TZ: + case OpenSearchSQLParser.COS: + case OpenSearchSQLParser.COSH: + case OpenSearchSQLParser.COT: + case OpenSearchSQLParser.CRC32: + case OpenSearchSQLParser.CURDATE: + case OpenSearchSQLParser.CURTIME: + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.DATE: + case OpenSearchSQLParser.DATE_ADD: + case OpenSearchSQLParser.DATE_FORMAT: + case OpenSearchSQLParser.DATE_SUB: + case OpenSearchSQLParser.DATEDIFF: + case OpenSearchSQLParser.DAYNAME: + case OpenSearchSQLParser.DAYOFMONTH: + case OpenSearchSQLParser.DAYOFWEEK: + case OpenSearchSQLParser.DAYOFYEAR: + case OpenSearchSQLParser.DEGREES: + case OpenSearchSQLParser.DIVIDE: + case OpenSearchSQLParser.E: + case OpenSearchSQLParser.EXP: + case OpenSearchSQLParser.EXPM1: + case OpenSearchSQLParser.FLOOR: + case OpenSearchSQLParser.FROM_DAYS: + case OpenSearchSQLParser.FROM_UNIXTIME: + case OpenSearchSQLParser.IF: + case OpenSearchSQLParser.IFNULL: + case OpenSearchSQLParser.ISNULL: + case OpenSearchSQLParser.LAST_DAY: + case OpenSearchSQLParser.LENGTH: + case OpenSearchSQLParser.LN: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.LOCATE: + case OpenSearchSQLParser.LOG: + case OpenSearchSQLParser.LOG10: + case OpenSearchSQLParser.LOG2: + case OpenSearchSQLParser.LOWER: + case OpenSearchSQLParser.LTRIM: + case OpenSearchSQLParser.MAKEDATE: + case OpenSearchSQLParser.MAKETIME: + case OpenSearchSQLParser.MODULUS: + case OpenSearchSQLParser.MONTHNAME: + case OpenSearchSQLParser.MULTIPLY: + case OpenSearchSQLParser.NOW: + case OpenSearchSQLParser.NULLIF: + case OpenSearchSQLParser.PERIOD_ADD: + case OpenSearchSQLParser.PERIOD_DIFF: + case OpenSearchSQLParser.PI: + case OpenSearchSQLParser.POW: + case OpenSearchSQLParser.POWER: + case OpenSearchSQLParser.RADIANS: + case OpenSearchSQLParser.RAND: + case OpenSearchSQLParser.REPLACE: + case OpenSearchSQLParser.RINT: + case OpenSearchSQLParser.ROUND: + case OpenSearchSQLParser.RTRIM: + case OpenSearchSQLParser.REVERSE: + case OpenSearchSQLParser.SEC_TO_TIME: + case OpenSearchSQLParser.SIGN: + case OpenSearchSQLParser.SIGNUM: + case OpenSearchSQLParser.SIN: + case OpenSearchSQLParser.SINH: + case OpenSearchSQLParser.SQRT: + case OpenSearchSQLParser.STR_TO_DATE: + case OpenSearchSQLParser.SUBDATE: + case OpenSearchSQLParser.SUBTIME: + case OpenSearchSQLParser.SUBTRACT: + case OpenSearchSQLParser.SYSDATE: + case OpenSearchSQLParser.TAN: + case OpenSearchSQLParser.TIME: + case OpenSearchSQLParser.TIMEDIFF: + case OpenSearchSQLParser.TIME_FORMAT: + case OpenSearchSQLParser.TIME_TO_SEC: + case OpenSearchSQLParser.TIMESTAMP: + case OpenSearchSQLParser.TRUNCATE: + case OpenSearchSQLParser.TO_DAYS: + case OpenSearchSQLParser.TO_SECONDS: + case OpenSearchSQLParser.UNIX_TIMESTAMP: + case OpenSearchSQLParser.UPPER: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + case OpenSearchSQLParser.D: + case OpenSearchSQLParser.T: + case OpenSearchSQLParser.TS: + case OpenSearchSQLParser.DAY_OF_MONTH: + case OpenSearchSQLParser.DAY_OF_YEAR: + case OpenSearchSQLParser.DAY_OF_WEEK: + case OpenSearchSQLParser.FIELD: + case OpenSearchSQLParser.HOUR_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_HOUR: + case OpenSearchSQLParser.MONTH_OF_YEAR: + case OpenSearchSQLParser.NESTED: + case OpenSearchSQLParser.SECOND_OF_MINUTE: + case OpenSearchSQLParser.TYPEOF: + case OpenSearchSQLParser.WEEK_OF_YEAR: + case OpenSearchSQLParser.WEEKOFYEAR: + case OpenSearchSQLParser.WEEKDAY: + case OpenSearchSQLParser.SUBSTR: + case OpenSearchSQLParser.STRCMP: + case OpenSearchSQLParser.ADDDATE: + case OpenSearchSQLParser.YEARWEEK: + case OpenSearchSQLParser.TYPE: + case OpenSearchSQLParser.MOD: + case OpenSearchSQLParser.DOT: + case OpenSearchSQLParser.ID: + case OpenSearchSQLParser.BACKTICK_QUOTE_ID: + this.enterOuterAlt(localContext, 1); + { + this.state = 1049; + this.qualifiedName(); + } + break; + case OpenSearchSQLParser.STRING_LITERAL: + case OpenSearchSQLParser.DOUBLE_QUOTE_ID: + this.enterOuterAlt(localContext, 2); + { + this.state = 1050; + this.stringLiteral(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceQuery(): RelevanceQueryContext { + let localContext = new RelevanceQueryContext(this.context, this.state); + this.enterRule(localContext, 202, OpenSearchSQLParser.RULE_relevanceQuery); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1053; + this.relevanceArgValue(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public relevanceArgValue(): RelevanceArgValueContext { + let localContext = new RelevanceArgValueContext(this.context, this.state); + this.enterRule(localContext, 204, OpenSearchSQLParser.RULE_relevanceArgValue); + try { + this.state = 1057; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 85, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 1055; + this.qualifiedName(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 1056; + this.constant(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public highlightArgValue(): HighlightArgValueContext { + let localContext = new HighlightArgValueContext(this.context, this.state); + this.enterRule(localContext, 206, OpenSearchSQLParser.RULE_highlightArgValue); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1059; + this.stringLiteral(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public alternateMultiMatchArgName(): AlternateMultiMatchArgNameContext { + let localContext = new AlternateMultiMatchArgNameContext(this.context, this.state); + this.enterRule(localContext, 208, OpenSearchSQLParser.RULE_alternateMultiMatchArgName); + try { + this.state = 1064; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.FIELDS: + this.enterOuterAlt(localContext, 1); + { + this.state = 1061; + this.match(OpenSearchSQLParser.FIELDS); + } + break; + case OpenSearchSQLParser.QUERY: + this.enterOuterAlt(localContext, 2); + { + this.state = 1062; + this.match(OpenSearchSQLParser.QUERY); + } + break; + case OpenSearchSQLParser.STRING_LITERAL: + case OpenSearchSQLParser.DOUBLE_QUOTE_ID: + this.enterOuterAlt(localContext, 3); + { + this.state = 1063; + this.stringLiteral(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public alternateMultiMatchQuery(): AlternateMultiMatchQueryContext { + let localContext = new AlternateMultiMatchQueryContext(this.context, this.state); + this.enterRule(localContext, 210, OpenSearchSQLParser.RULE_alternateMultiMatchQuery); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1066; + localContext._argName = this.alternateMultiMatchArgName(); + this.state = 1067; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 1068; + localContext._argVal = this.relevanceArgValue(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public alternateMultiMatchField(): AlternateMultiMatchFieldContext { + let localContext = new AlternateMultiMatchFieldContext(this.context, this.state); + this.enterRule(localContext, 212, OpenSearchSQLParser.RULE_alternateMultiMatchField); + try { + this.state = 1080; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 87, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 1070; + localContext._argName = this.alternateMultiMatchArgName(); + this.state = 1071; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 1072; + localContext._argVal = this.relevanceArgValue(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 1074; + localContext._argName = this.alternateMultiMatchArgName(); + this.state = 1075; + this.match(OpenSearchSQLParser.EQUAL_SYMBOL); + this.state = 1076; + this.match(OpenSearchSQLParser.LT_SQR_PRTHS); + this.state = 1077; + localContext._argVal = this.relevanceArgValue(); + this.state = 1078; + this.match(OpenSearchSQLParser.RT_SQR_PRTHS); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public tableName(): TableNameContext { + let localContext = new TableNameContext(this.context, this.state); + this.enterRule(localContext, 214, OpenSearchSQLParser.RULE_tableName); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1082; + this.qualifiedName(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public columnName(): ColumnNameContext { + let localContext = new ColumnNameContext(this.context, this.state); + this.enterRule(localContext, 216, OpenSearchSQLParser.RULE_columnName); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1084; + this.qualifiedName(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public allTupleFields(): AllTupleFieldsContext { + let localContext = new AllTupleFieldsContext(this.context, this.state); + this.enterRule(localContext, 218, OpenSearchSQLParser.RULE_allTupleFields); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1086; + localContext._path = this.qualifiedName(); + this.state = 1087; + this.match(OpenSearchSQLParser.DOT); + this.state = 1088; + this.match(OpenSearchSQLParser.STAR); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public alias(): AliasContext { + let localContext = new AliasContext(this.context, this.state); + this.enterRule(localContext, 220, OpenSearchSQLParser.RULE_alias); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1090; + this.ident(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public qualifiedName(): QualifiedNameContext { + let localContext = new QualifiedNameContext(this.context, this.state); + this.enterRule(localContext, 222, OpenSearchSQLParser.RULE_qualifiedName); + try { + let alternative: number; + this.enterOuterAlt(localContext, 1); + { + this.state = 1092; + this.ident(); + this.state = 1097; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 88, this.context); + while (alternative !== 2 && alternative !== antlr.ATN.INVALID_ALT_NUMBER) { + if (alternative === 1) { + { + { + this.state = 1093; + this.match(OpenSearchSQLParser.DOT); + this.state = 1094; + this.ident(); + } + } + } + this.state = 1099; + this.errorHandler.sync(this); + alternative = this.interpreter.adaptivePredict(this.tokenStream, 88, this.context); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public ident(): IdentContext { + let localContext = new IdentContext(this.context, this.state); + this.enterRule(localContext, 224, OpenSearchSQLParser.RULE_ident); + let _la: number; + try { + this.state = 1107; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case OpenSearchSQLParser.DOT: + case OpenSearchSQLParser.ID: + this.enterOuterAlt(localContext, 1); + { + this.state = 1101; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 327) { + { + this.state = 1100; + this.match(OpenSearchSQLParser.DOT); + } + } + + this.state = 1103; + this.match(OpenSearchSQLParser.ID); + } + break; + case OpenSearchSQLParser.BACKTICK_QUOTE_ID: + this.enterOuterAlt(localContext, 2); + { + this.state = 1104; + this.match(OpenSearchSQLParser.BACKTICK_QUOTE_ID); + } + break; + case OpenSearchSQLParser.FIRST: + case OpenSearchSQLParser.LAST: + case OpenSearchSQLParser.AVG: + case OpenSearchSQLParser.COUNT: + case OpenSearchSQLParser.MAX: + case OpenSearchSQLParser.MIN: + case OpenSearchSQLParser.SUM: + case OpenSearchSQLParser.FULL: + case OpenSearchSQLParser.D: + case OpenSearchSQLParser.T: + case OpenSearchSQLParser.TS: + case OpenSearchSQLParser.FIELD: + case OpenSearchSQLParser.TYPE: + this.enterOuterAlt(localContext, 3); + { + this.state = 1105; + this.keywordsCanBeId(); + } + break; + case OpenSearchSQLParser.DATETIME: + case OpenSearchSQLParser.LEFT: + case OpenSearchSQLParser.RIGHT: + case OpenSearchSQLParser.SUBSTRING: + case OpenSearchSQLParser.TRIM: + case OpenSearchSQLParser.MICROSECOND: + case OpenSearchSQLParser.SECOND: + case OpenSearchSQLParser.MINUTE: + case OpenSearchSQLParser.HOUR: + case OpenSearchSQLParser.DAY: + case OpenSearchSQLParser.WEEK: + case OpenSearchSQLParser.MONTH: + case OpenSearchSQLParser.QUARTER: + case OpenSearchSQLParser.YEAR: + case OpenSearchSQLParser.ABS: + case OpenSearchSQLParser.ACOS: + case OpenSearchSQLParser.ADD: + case OpenSearchSQLParser.ADDTIME: + case OpenSearchSQLParser.ASCII: + case OpenSearchSQLParser.ASIN: + case OpenSearchSQLParser.ATAN: + case OpenSearchSQLParser.ATAN2: + case OpenSearchSQLParser.CBRT: + case OpenSearchSQLParser.CEIL: + case OpenSearchSQLParser.CEILING: + case OpenSearchSQLParser.CONCAT: + case OpenSearchSQLParser.CONCAT_WS: + case OpenSearchSQLParser.CONV: + case OpenSearchSQLParser.CONVERT_TZ: + case OpenSearchSQLParser.COS: + case OpenSearchSQLParser.COSH: + case OpenSearchSQLParser.COT: + case OpenSearchSQLParser.CRC32: + case OpenSearchSQLParser.CURDATE: + case OpenSearchSQLParser.CURTIME: + case OpenSearchSQLParser.CURRENT_DATE: + case OpenSearchSQLParser.CURRENT_TIME: + case OpenSearchSQLParser.CURRENT_TIMESTAMP: + case OpenSearchSQLParser.DATE: + case OpenSearchSQLParser.DATE_ADD: + case OpenSearchSQLParser.DATE_FORMAT: + case OpenSearchSQLParser.DATE_SUB: + case OpenSearchSQLParser.DATEDIFF: + case OpenSearchSQLParser.DAYNAME: + case OpenSearchSQLParser.DAYOFMONTH: + case OpenSearchSQLParser.DAYOFWEEK: + case OpenSearchSQLParser.DAYOFYEAR: + case OpenSearchSQLParser.DEGREES: + case OpenSearchSQLParser.DIVIDE: + case OpenSearchSQLParser.E: + case OpenSearchSQLParser.EXP: + case OpenSearchSQLParser.EXPM1: + case OpenSearchSQLParser.FLOOR: + case OpenSearchSQLParser.FROM_DAYS: + case OpenSearchSQLParser.FROM_UNIXTIME: + case OpenSearchSQLParser.IF: + case OpenSearchSQLParser.IFNULL: + case OpenSearchSQLParser.ISNULL: + case OpenSearchSQLParser.LAST_DAY: + case OpenSearchSQLParser.LENGTH: + case OpenSearchSQLParser.LN: + case OpenSearchSQLParser.LOCALTIME: + case OpenSearchSQLParser.LOCALTIMESTAMP: + case OpenSearchSQLParser.LOCATE: + case OpenSearchSQLParser.LOG: + case OpenSearchSQLParser.LOG10: + case OpenSearchSQLParser.LOG2: + case OpenSearchSQLParser.LOWER: + case OpenSearchSQLParser.LTRIM: + case OpenSearchSQLParser.MAKEDATE: + case OpenSearchSQLParser.MAKETIME: + case OpenSearchSQLParser.MODULUS: + case OpenSearchSQLParser.MONTHNAME: + case OpenSearchSQLParser.MULTIPLY: + case OpenSearchSQLParser.NOW: + case OpenSearchSQLParser.NULLIF: + case OpenSearchSQLParser.PERIOD_ADD: + case OpenSearchSQLParser.PERIOD_DIFF: + case OpenSearchSQLParser.PI: + case OpenSearchSQLParser.POW: + case OpenSearchSQLParser.POWER: + case OpenSearchSQLParser.RADIANS: + case OpenSearchSQLParser.RAND: + case OpenSearchSQLParser.REPLACE: + case OpenSearchSQLParser.RINT: + case OpenSearchSQLParser.ROUND: + case OpenSearchSQLParser.RTRIM: + case OpenSearchSQLParser.REVERSE: + case OpenSearchSQLParser.SEC_TO_TIME: + case OpenSearchSQLParser.SIGN: + case OpenSearchSQLParser.SIGNUM: + case OpenSearchSQLParser.SIN: + case OpenSearchSQLParser.SINH: + case OpenSearchSQLParser.SQRT: + case OpenSearchSQLParser.STR_TO_DATE: + case OpenSearchSQLParser.SUBDATE: + case OpenSearchSQLParser.SUBTIME: + case OpenSearchSQLParser.SUBTRACT: + case OpenSearchSQLParser.SYSDATE: + case OpenSearchSQLParser.TAN: + case OpenSearchSQLParser.TIME: + case OpenSearchSQLParser.TIMEDIFF: + case OpenSearchSQLParser.TIME_FORMAT: + case OpenSearchSQLParser.TIME_TO_SEC: + case OpenSearchSQLParser.TIMESTAMP: + case OpenSearchSQLParser.TRUNCATE: + case OpenSearchSQLParser.TO_DAYS: + case OpenSearchSQLParser.TO_SECONDS: + case OpenSearchSQLParser.UNIX_TIMESTAMP: + case OpenSearchSQLParser.UPPER: + case OpenSearchSQLParser.UTC_DATE: + case OpenSearchSQLParser.UTC_TIME: + case OpenSearchSQLParser.UTC_TIMESTAMP: + case OpenSearchSQLParser.DAY_OF_MONTH: + case OpenSearchSQLParser.DAY_OF_YEAR: + case OpenSearchSQLParser.DAY_OF_WEEK: + case OpenSearchSQLParser.HOUR_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_DAY: + case OpenSearchSQLParser.MINUTE_OF_HOUR: + case OpenSearchSQLParser.MONTH_OF_YEAR: + case OpenSearchSQLParser.NESTED: + case OpenSearchSQLParser.SECOND_OF_MINUTE: + case OpenSearchSQLParser.TYPEOF: + case OpenSearchSQLParser.WEEK_OF_YEAR: + case OpenSearchSQLParser.WEEKOFYEAR: + case OpenSearchSQLParser.WEEKDAY: + case OpenSearchSQLParser.SUBSTR: + case OpenSearchSQLParser.STRCMP: + case OpenSearchSQLParser.ADDDATE: + case OpenSearchSQLParser.YEARWEEK: + case OpenSearchSQLParser.MOD: + this.enterOuterAlt(localContext, 4); + { + this.state = 1106; + this.scalarFunctionName(); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public keywordsCanBeId(): KeywordsCanBeIdContext { + let localContext = new KeywordsCanBeIdContext(this.context, this.state); + this.enterRule(localContext, 226, OpenSearchSQLParser.RULE_keywordsCanBeId); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1109; + _la = this.tokenStream.LA(1); + if(!(_la === 26 || _la === 36 || ((((_la - 65)) & ~0x1F) === 0 && ((1 << (_la - 65)) & 32799) !== 0) || ((((_la - 206)) & ~0x1F) === 0 && ((1 << (_la - 206)) & 16391) !== 0) || _la === 306)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + + public override sempred(localContext: antlr.ParserRuleContext | null, ruleIndex: number, predIndex: number): boolean { + switch (ruleIndex) { + case 45: + return this.expression_sempred(localContext as ExpressionContext, predIndex); + case 46: + return this.predicate_sempred(localContext as PredicateContext, predIndex); + case 48: + return this.expressionAtom_sempred(localContext as ExpressionAtomContext, predIndex); + } + return true; + } + private expression_sempred(localContext: ExpressionContext | null, predIndex: number): boolean { + switch (predIndex) { + case 0: + return this.precpred(this.context, 3); + case 1: + return this.precpred(this.context, 2); + } + return true; + } + private predicate_sempred(localContext: PredicateContext | null, predIndex: number): boolean { + switch (predIndex) { + case 2: + return this.precpred(this.context, 6); + case 3: + return this.precpred(this.context, 4); + case 4: + return this.precpred(this.context, 3); + case 5: + return this.precpred(this.context, 2); + case 6: + return this.precpred(this.context, 5); + case 7: + return this.precpred(this.context, 1); + } + return true; + } + private expressionAtom_sempred(localContext: ExpressionAtomContext | null, predIndex: number): boolean { + switch (predIndex) { + case 8: + return this.precpred(this.context, 2); + case 9: + return this.precpred(this.context, 1); + } + return true; + } + + public static readonly _serializedATN: number[] = [ + 4,1,352,1112,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, + 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, + 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, + 26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2, + 33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7, + 39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, + 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7, + 52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2, + 59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7, + 65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,71,2, + 72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2,78,7, + 78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7,84,2, + 85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2,91,7, + 91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7,97,2, + 98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103,7,103, + 2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108,2,109, + 7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,1,0,3,0,230, + 8,0,1,0,3,0,233,8,0,1,0,1,0,1,1,1,1,3,1,239,8,1,1,2,1,2,1,3,1,3, + 1,4,1,4,3,4,247,8,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,3,6,257,8,6, + 1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,9,1,9,3,9,268,8,9,1,10,4,10,271,8, + 10,11,10,12,10,272,1,11,1,11,3,11,277,8,11,1,11,3,11,280,8,11,1, + 12,1,12,3,12,284,8,12,1,12,1,12,1,13,1,13,1,14,1,14,3,14,292,8,14, + 1,14,1,14,5,14,296,8,14,10,14,12,14,299,9,14,1,15,1,15,3,15,303, + 8,15,1,15,3,15,306,8,15,1,16,1,16,1,16,3,16,311,8,16,1,16,3,16,314, + 8,16,1,16,3,16,317,8,16,1,16,3,16,320,8,16,1,17,1,17,3,17,324,8, + 17,1,17,3,17,327,8,17,1,17,1,17,1,17,1,17,3,17,333,8,17,1,17,1,17, + 3,17,337,8,17,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,20,1,20,1,20, + 5,20,349,8,20,10,20,12,20,352,9,20,1,21,1,21,1,22,1,22,1,22,1,23, + 1,23,1,23,1,23,1,23,5,23,364,8,23,10,23,12,23,367,9,23,1,24,1,24, + 3,24,371,8,24,1,24,1,24,3,24,375,8,24,1,25,1,25,1,25,1,25,3,25,381, + 8,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,389,8,25,1,26,1,26,1,26, + 1,27,1,27,1,27,3,27,397,8,27,1,27,1,27,3,27,401,8,27,1,28,1,28,1, + 28,3,28,406,8,28,1,28,3,28,409,8,28,1,28,1,28,1,29,1,29,1,29,1,29, + 1,29,5,29,418,8,29,10,29,12,29,421,9,29,1,30,1,30,3,30,425,8,30, + 1,30,1,30,3,30,429,8,30,1,30,1,30,1,30,1,30,1,30,3,30,436,8,30,1, + 31,1,31,1,32,1,32,3,32,442,8,32,1,33,1,33,1,34,1,34,1,35,1,35,1, + 36,1,36,1,37,1,37,1,38,1,38,1,38,3,38,457,8,38,1,39,1,39,1,39,1, + 39,1,39,1,39,1,39,3,39,466,8,39,1,40,1,40,1,40,1,40,1,40,1,40,1, + 40,3,40,475,8,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,484,8,41, + 1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,45,1,45,3,45, + 498,8,45,1,45,1,45,1,45,1,45,1,45,1,45,5,45,506,8,45,10,45,12,45, + 509,9,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,520,8, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,529,8,46,1,46,1,46,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,541,8,46,1,46,1,46,1, + 46,1,46,1,46,5,46,548,8,46,10,46,12,46,551,9,46,1,47,1,47,1,47,5, + 47,556,8,47,10,47,12,47,559,9,47,1,48,1,48,1,48,1,48,1,48,1,48,1, + 48,1,48,3,48,569,8,48,1,48,1,48,1,48,1,48,1,48,1,48,5,48,577,8,48, + 10,48,12,48,580,9,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, + 1,49,1,49,3,49,593,8,49,1,50,3,50,596,8,50,1,50,1,50,1,51,1,51,1, + 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,3, + 51,615,8,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,3,51,626, + 8,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,54, + 1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,56,1,56,1,56,1,56,1,56, + 1,56,1,56,1,57,1,57,1,58,1,58,1,59,1,59,3,59,661,8,59,1,60,1,60, + 1,60,1,60,1,60,5,60,668,8,60,10,60,12,60,671,9,60,1,60,1,60,1,61, + 1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 1,63,1,63,1,63,1,63,1,63,1,63,3,63,695,8,63,1,64,1,64,1,64,4,64, + 700,8,64,11,64,12,64,701,1,64,1,64,3,64,706,8,64,1,64,1,64,1,64, + 1,64,4,64,712,8,64,11,64,12,64,713,1,64,1,64,3,64,718,8,64,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,729,8,64,1,65,1,65, + 1,65,1,65,1,65,3,65,736,8,65,1,66,1,66,1,66,1,66,1,66,3,66,743,8, + 66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,5,67,752,8,67,10,67,12,67, + 755,9,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,5,68,766,8, + 68,10,68,12,68,769,9,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69, + 5,69,779,8,69,10,69,12,69,782,9,69,1,69,1,69,1,69,1,69,1,69,5,69, + 789,8,69,10,69,12,69,792,9,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 1,69,1,69,5,69,803,8,69,10,69,12,69,806,9,69,1,69,1,69,3,69,810, + 8,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,5,70,819,8,70,10,70,12,70, + 822,9,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,5,71,833,8, + 71,10,71,12,71,836,9,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72, + 1,72,1,72,1,72,1,72,3,72,850,8,72,1,73,1,73,1,73,1,73,1,73,1,74, + 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74, + 1,74,1,74,3,74,873,8,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,3,75, + 882,8,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,78, + 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78, + 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78, + 3,78,921,8,78,1,79,1,79,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81, + 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81, + 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81, + 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81, + 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81, + 1,81,3,81,986,8,81,1,82,1,82,1,83,1,83,1,84,1,84,1,85,1,85,1,86, + 1,86,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90,1,91,1,91,1,92,1,92, + 1,92,5,92,1011,8,92,10,92,12,92,1014,9,92,3,92,1016,8,92,1,93,1, + 93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,3,94,1028,8,94,1,95,1, + 95,1,95,1,95,1,96,1,96,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1, + 98,1,98,3,98,1046,8,98,1,99,1,99,1,100,1,100,3,100,1052,8,100,1, + 101,1,101,1,102,1,102,3,102,1058,8,102,1,103,1,103,1,104,1,104,1, + 104,3,104,1065,8,104,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1, + 106,1,106,1,106,1,106,1,106,1,106,1,106,3,106,1081,8,106,1,107,1, + 107,1,108,1,108,1,109,1,109,1,109,1,109,1,110,1,110,1,111,1,111, + 1,111,5,111,1096,8,111,10,111,12,111,1099,9,111,1,112,3,112,1102, + 8,112,1,112,1,112,1,112,1,112,3,112,1108,8,112,1,113,1,113,1,113, + 1,272,3,90,92,96,114,0,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,0,33,2,0,314,314,349,349,2,0, + 5,5,20,20,2,0,8,8,18,18,2,0,26,26,36,36,1,0,211,213,2,0,335,337, + 344,344,2,0,343,343,350,350,2,0,24,24,59,59,1,0,315,316,2,0,128, + 128,206,206,2,0,193,193,207,207,2,0,197,197,208,208,3,0,125,127, + 153,154,203,205,1,0,83,102,1,0,312,314,1,0,261,262,4,0,16,16,128, + 128,193,193,197,197,1,0,83,91,1,0,92,102,1,0,248,249,1,0,65,76,7, + 0,105,105,109,111,119,121,137,137,174,174,184,185,192,192,6,0,106, + 106,138,138,163,163,165,165,190,190,318,318,12,0,37,37,54,54,77, + 78,108,108,115,116,151,151,155,155,159,160,176,176,179,180,202,202, + 270,271,2,0,147,149,167,167,1,0,254,256,5,0,41,41,232,234,237,239, + 268,269,311,311,2,0,235,236,243,245,2,0,232,233,238,239,1,0,243, + 244,1,0,274,307,1,0,309,310,7,0,26,26,36,36,65,69,80,80,206,208, + 220,220,306,306,1220,0,229,1,0,0,0,2,238,1,0,0,0,4,240,1,0,0,0,6, + 242,1,0,0,0,8,246,1,0,0,0,10,248,1,0,0,0,12,252,1,0,0,0,14,258,1, + 0,0,0,16,262,1,0,0,0,18,267,1,0,0,0,20,270,1,0,0,0,22,274,1,0,0, + 0,24,281,1,0,0,0,26,287,1,0,0,0,28,291,1,0,0,0,30,300,1,0,0,0,32, + 307,1,0,0,0,34,336,1,0,0,0,36,338,1,0,0,0,38,341,1,0,0,0,40,345, + 1,0,0,0,42,353,1,0,0,0,44,355,1,0,0,0,46,358,1,0,0,0,48,368,1,0, + 0,0,50,388,1,0,0,0,52,390,1,0,0,0,54,400,1,0,0,0,56,402,1,0,0,0, + 58,412,1,0,0,0,60,435,1,0,0,0,62,437,1,0,0,0,64,441,1,0,0,0,66,443, + 1,0,0,0,68,445,1,0,0,0,70,447,1,0,0,0,72,449,1,0,0,0,74,451,1,0, + 0,0,76,456,1,0,0,0,78,465,1,0,0,0,80,474,1,0,0,0,82,483,1,0,0,0, + 84,485,1,0,0,0,86,487,1,0,0,0,88,491,1,0,0,0,90,497,1,0,0,0,92,510, + 1,0,0,0,94,552,1,0,0,0,96,568,1,0,0,0,98,592,1,0,0,0,100,595,1,0, + 0,0,102,625,1,0,0,0,104,627,1,0,0,0,106,636,1,0,0,0,108,638,1,0, + 0,0,110,645,1,0,0,0,112,647,1,0,0,0,114,654,1,0,0,0,116,656,1,0, + 0,0,118,660,1,0,0,0,120,662,1,0,0,0,122,674,1,0,0,0,124,681,1,0, + 0,0,126,694,1,0,0,0,128,728,1,0,0,0,130,735,1,0,0,0,132,737,1,0, + 0,0,134,746,1,0,0,0,136,758,1,0,0,0,138,809,1,0,0,0,140,811,1,0, + 0,0,142,825,1,0,0,0,144,849,1,0,0,0,146,851,1,0,0,0,148,872,1,0, + 0,0,150,874,1,0,0,0,152,885,1,0,0,0,154,891,1,0,0,0,156,920,1,0, + 0,0,158,922,1,0,0,0,160,924,1,0,0,0,162,985,1,0,0,0,164,987,1,0, + 0,0,166,989,1,0,0,0,168,991,1,0,0,0,170,993,1,0,0,0,172,995,1,0, + 0,0,174,997,1,0,0,0,176,999,1,0,0,0,178,1001,1,0,0,0,180,1003,1, + 0,0,0,182,1005,1,0,0,0,184,1015,1,0,0,0,186,1017,1,0,0,0,188,1027, + 1,0,0,0,190,1029,1,0,0,0,192,1033,1,0,0,0,194,1035,1,0,0,0,196,1045, + 1,0,0,0,198,1047,1,0,0,0,200,1051,1,0,0,0,202,1053,1,0,0,0,204,1057, + 1,0,0,0,206,1059,1,0,0,0,208,1064,1,0,0,0,210,1066,1,0,0,0,212,1080, + 1,0,0,0,214,1082,1,0,0,0,216,1084,1,0,0,0,218,1086,1,0,0,0,220,1090, + 1,0,0,0,222,1092,1,0,0,0,224,1107,1,0,0,0,226,1109,1,0,0,0,228,230, + 3,2,1,0,229,228,1,0,0,0,229,230,1,0,0,0,230,232,1,0,0,0,231,233, + 5,333,0,0,232,231,1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,235, + 5,0,0,1,235,1,1,0,0,0,236,239,3,4,2,0,237,239,3,8,4,0,238,236,1, + 0,0,0,238,237,1,0,0,0,239,3,1,0,0,0,240,241,3,6,3,0,241,5,1,0,0, + 0,242,243,3,22,11,0,243,7,1,0,0,0,244,247,3,10,5,0,245,247,3,12, + 6,0,246,244,1,0,0,0,246,245,1,0,0,0,247,9,1,0,0,0,248,249,5,56,0, + 0,249,250,5,103,0,0,250,251,3,16,8,0,251,11,1,0,0,0,252,253,5,19, + 0,0,253,254,5,103,0,0,254,256,3,16,8,0,255,257,3,14,7,0,256,255, + 1,0,0,0,256,257,1,0,0,0,257,13,1,0,0,0,258,259,5,15,0,0,259,260, + 5,38,0,0,260,261,3,18,9,0,261,15,1,0,0,0,262,263,5,38,0,0,263,264, + 3,18,9,0,264,17,1,0,0,0,265,268,3,20,10,0,266,268,3,66,33,0,267, + 265,1,0,0,0,267,266,1,0,0,0,268,19,1,0,0,0,269,271,7,0,0,0,270,269, + 1,0,0,0,271,272,1,0,0,0,272,273,1,0,0,0,272,270,1,0,0,0,273,21,1, + 0,0,0,274,276,3,24,12,0,275,277,3,32,16,0,276,275,1,0,0,0,276,277, + 1,0,0,0,277,279,1,0,0,0,278,280,3,50,25,0,279,278,1,0,0,0,279,280, + 1,0,0,0,280,23,1,0,0,0,281,283,5,55,0,0,282,284,3,26,13,0,283,282, + 1,0,0,0,283,284,1,0,0,0,284,285,1,0,0,0,285,286,3,28,14,0,286,25, + 1,0,0,0,287,288,7,1,0,0,288,27,1,0,0,0,289,292,5,312,0,0,290,292, + 3,30,15,0,291,289,1,0,0,0,291,290,1,0,0,0,292,297,1,0,0,0,293,294, + 5,332,0,0,294,296,3,30,15,0,295,293,1,0,0,0,296,299,1,0,0,0,297, + 295,1,0,0,0,297,298,1,0,0,0,298,29,1,0,0,0,299,297,1,0,0,0,300,305, + 3,90,45,0,301,303,5,7,0,0,302,301,1,0,0,0,302,303,1,0,0,0,303,304, + 1,0,0,0,304,306,3,220,110,0,305,302,1,0,0,0,305,306,1,0,0,0,306, + 31,1,0,0,0,307,308,5,27,0,0,308,310,3,34,17,0,309,311,3,36,18,0, + 310,309,1,0,0,0,310,311,1,0,0,0,311,313,1,0,0,0,312,314,3,38,19, + 0,313,312,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,317,3,44,22, + 0,316,315,1,0,0,0,316,317,1,0,0,0,317,319,1,0,0,0,318,320,3,46,23, + 0,319,318,1,0,0,0,319,320,1,0,0,0,320,33,1,0,0,0,321,326,3,214,107, + 0,322,324,5,7,0,0,323,322,1,0,0,0,323,324,1,0,0,0,324,325,1,0,0, + 0,325,327,3,220,110,0,326,323,1,0,0,0,326,327,1,0,0,0,327,337,1, + 0,0,0,328,329,5,328,0,0,329,330,3,22,11,0,330,332,5,329,0,0,331, + 333,5,7,0,0,332,331,1,0,0,0,332,333,1,0,0,0,333,334,1,0,0,0,334, + 335,3,220,110,0,335,337,1,0,0,0,336,321,1,0,0,0,336,328,1,0,0,0, + 337,35,1,0,0,0,338,339,5,63,0,0,339,340,3,90,45,0,340,37,1,0,0,0, + 341,342,5,28,0,0,342,343,5,11,0,0,343,344,3,40,20,0,344,39,1,0,0, + 0,345,350,3,42,21,0,346,347,5,332,0,0,347,349,3,42,21,0,348,346, + 1,0,0,0,349,352,1,0,0,0,350,348,1,0,0,0,350,351,1,0,0,0,351,41,1, + 0,0,0,352,350,1,0,0,0,353,354,3,90,45,0,354,43,1,0,0,0,355,356,5, + 29,0,0,356,357,3,90,45,0,357,45,1,0,0,0,358,359,5,49,0,0,359,360, + 5,11,0,0,360,365,3,48,24,0,361,362,5,332,0,0,362,364,3,48,24,0,363, + 361,1,0,0,0,364,367,1,0,0,0,365,363,1,0,0,0,365,366,1,0,0,0,366, + 47,1,0,0,0,367,365,1,0,0,0,368,370,3,90,45,0,369,371,7,2,0,0,370, + 369,1,0,0,0,370,371,1,0,0,0,371,374,1,0,0,0,372,373,5,46,0,0,373, + 375,7,3,0,0,374,372,1,0,0,0,374,375,1,0,0,0,375,49,1,0,0,0,376,380, + 5,39,0,0,377,378,3,62,31,0,378,379,5,332,0,0,379,381,1,0,0,0,380, + 377,1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,389,3,62,31,0,383, + 384,5,39,0,0,384,385,3,62,31,0,385,386,5,81,0,0,386,387,3,62,31, + 0,387,389,1,0,0,0,388,376,1,0,0,0,388,383,1,0,0,0,389,51,1,0,0,0, + 390,391,3,54,27,0,391,392,3,56,28,0,392,53,1,0,0,0,393,394,7,4,0, + 0,394,396,5,328,0,0,395,397,3,184,92,0,396,395,1,0,0,0,396,397,1, + 0,0,0,397,398,1,0,0,0,398,401,5,329,0,0,399,401,3,148,74,0,400,393, + 1,0,0,0,400,399,1,0,0,0,401,55,1,0,0,0,402,403,5,51,0,0,403,405, + 5,328,0,0,404,406,3,58,29,0,405,404,1,0,0,0,405,406,1,0,0,0,406, + 408,1,0,0,0,407,409,3,46,23,0,408,407,1,0,0,0,408,409,1,0,0,0,409, + 410,1,0,0,0,410,411,5,329,0,0,411,57,1,0,0,0,412,413,5,52,0,0,413, + 414,5,11,0,0,414,419,3,90,45,0,415,416,5,332,0,0,416,418,3,90,45, + 0,417,415,1,0,0,0,418,421,1,0,0,0,419,417,1,0,0,0,419,420,1,0,0, + 0,420,59,1,0,0,0,421,419,1,0,0,0,422,436,3,66,33,0,423,425,3,72, + 36,0,424,423,1,0,0,0,424,425,1,0,0,0,425,426,1,0,0,0,426,436,3,62, + 31,0,427,429,3,72,36,0,428,427,1,0,0,0,428,429,1,0,0,0,429,430,1, + 0,0,0,430,436,3,70,35,0,431,436,3,68,34,0,432,436,3,76,38,0,433, + 436,3,86,43,0,434,436,3,74,37,0,435,422,1,0,0,0,435,424,1,0,0,0, + 435,428,1,0,0,0,435,431,1,0,0,0,435,432,1,0,0,0,435,433,1,0,0,0, + 435,434,1,0,0,0,436,61,1,0,0,0,437,438,7,5,0,0,438,63,1,0,0,0,439, + 442,3,62,31,0,440,442,3,70,35,0,441,439,1,0,0,0,441,440,1,0,0,0, + 442,65,1,0,0,0,443,444,7,6,0,0,444,67,1,0,0,0,445,446,7,7,0,0,446, + 69,1,0,0,0,447,448,5,346,0,0,448,71,1,0,0,0,449,450,7,8,0,0,450, + 73,1,0,0,0,451,452,5,45,0,0,452,75,1,0,0,0,453,457,3,78,39,0,454, + 457,3,80,40,0,455,457,3,82,41,0,456,453,1,0,0,0,456,454,1,0,0,0, + 456,455,1,0,0,0,457,77,1,0,0,0,458,459,5,128,0,0,459,466,3,66,33, + 0,460,461,5,209,0,0,461,462,7,9,0,0,462,463,3,66,33,0,463,464,5, + 210,0,0,464,466,1,0,0,0,465,458,1,0,0,0,465,460,1,0,0,0,466,79,1, + 0,0,0,467,468,5,193,0,0,468,475,3,66,33,0,469,470,5,209,0,0,470, + 471,7,10,0,0,471,472,3,66,33,0,472,473,5,210,0,0,473,475,1,0,0,0, + 474,467,1,0,0,0,474,469,1,0,0,0,475,81,1,0,0,0,476,477,5,197,0,0, + 477,484,3,66,33,0,478,479,5,209,0,0,479,480,7,11,0,0,480,481,3,66, + 33,0,481,482,5,210,0,0,482,484,1,0,0,0,483,476,1,0,0,0,483,478,1, + 0,0,0,484,83,1,0,0,0,485,486,7,12,0,0,486,85,1,0,0,0,487,488,5,82, + 0,0,488,489,3,90,45,0,489,490,3,88,44,0,490,87,1,0,0,0,491,492,7, + 13,0,0,492,89,1,0,0,0,493,494,6,45,-1,0,494,495,5,44,0,0,495,498, + 3,90,45,4,496,498,3,92,46,0,497,493,1,0,0,0,497,496,1,0,0,0,498, + 507,1,0,0,0,499,500,10,3,0,0,500,501,5,6,0,0,501,506,3,90,45,4,502, + 503,10,2,0,0,503,504,5,48,0,0,504,506,3,90,45,3,505,499,1,0,0,0, + 505,502,1,0,0,0,506,509,1,0,0,0,507,505,1,0,0,0,507,508,1,0,0,0, + 508,91,1,0,0,0,509,507,1,0,0,0,510,511,6,46,-1,0,511,512,3,96,48, + 0,512,549,1,0,0,0,513,514,10,6,0,0,514,515,3,98,49,0,515,516,3,92, + 46,7,516,548,1,0,0,0,517,519,10,4,0,0,518,520,5,44,0,0,519,518,1, + 0,0,0,519,520,1,0,0,0,520,521,1,0,0,0,521,522,5,10,0,0,522,523,3, + 92,46,0,523,524,5,6,0,0,524,525,3,92,46,5,525,548,1,0,0,0,526,528, + 10,3,0,0,527,529,5,44,0,0,528,527,1,0,0,0,528,529,1,0,0,0,529,530, + 1,0,0,0,530,531,5,38,0,0,531,548,3,92,46,4,532,533,10,2,0,0,533, + 534,5,53,0,0,534,548,3,92,46,3,535,536,10,5,0,0,536,537,5,34,0,0, + 537,548,3,100,50,0,538,540,10,1,0,0,539,541,5,44,0,0,540,539,1,0, + 0,0,540,541,1,0,0,0,541,542,1,0,0,0,542,543,5,30,0,0,543,544,5,328, + 0,0,544,545,3,94,47,0,545,546,5,329,0,0,546,548,1,0,0,0,547,513, + 1,0,0,0,547,517,1,0,0,0,547,526,1,0,0,0,547,532,1,0,0,0,547,535, + 1,0,0,0,547,538,1,0,0,0,548,551,1,0,0,0,549,547,1,0,0,0,549,550, + 1,0,0,0,550,93,1,0,0,0,551,549,1,0,0,0,552,557,3,90,45,0,553,554, + 5,332,0,0,554,556,3,90,45,0,555,553,1,0,0,0,556,559,1,0,0,0,557, + 555,1,0,0,0,557,558,1,0,0,0,558,95,1,0,0,0,559,557,1,0,0,0,560,561, + 6,48,-1,0,561,569,3,60,30,0,562,569,3,216,108,0,563,569,3,102,51, + 0,564,565,5,328,0,0,565,566,3,90,45,0,566,567,5,329,0,0,567,569, + 1,0,0,0,568,560,1,0,0,0,568,562,1,0,0,0,568,563,1,0,0,0,568,564, + 1,0,0,0,569,578,1,0,0,0,570,571,10,2,0,0,571,572,7,14,0,0,572,577, + 3,96,48,3,573,574,10,1,0,0,574,575,7,8,0,0,575,577,3,96,48,2,576, + 570,1,0,0,0,576,573,1,0,0,0,577,580,1,0,0,0,578,576,1,0,0,0,578, + 579,1,0,0,0,579,97,1,0,0,0,580,578,1,0,0,0,581,593,5,319,0,0,582, + 593,5,320,0,0,583,593,5,321,0,0,584,585,5,321,0,0,585,593,5,319, + 0,0,586,587,5,320,0,0,587,593,5,319,0,0,588,589,5,321,0,0,589,593, + 5,320,0,0,590,591,5,322,0,0,591,593,5,319,0,0,592,581,1,0,0,0,592, + 582,1,0,0,0,592,583,1,0,0,0,592,584,1,0,0,0,592,586,1,0,0,0,592, + 588,1,0,0,0,592,590,1,0,0,0,593,99,1,0,0,0,594,596,5,44,0,0,595, + 594,1,0,0,0,595,596,1,0,0,0,596,597,1,0,0,0,597,598,5,45,0,0,598, + 101,1,0,0,0,599,600,3,172,86,0,600,601,5,328,0,0,601,602,3,218,109, + 0,602,603,5,329,0,0,603,626,1,0,0,0,604,605,3,126,63,0,605,606,5, + 328,0,0,606,607,3,184,92,0,607,608,5,329,0,0,608,626,1,0,0,0,609, + 626,3,128,64,0,610,626,3,52,26,0,611,626,3,148,74,0,612,614,3,148, + 74,0,613,615,3,46,23,0,614,613,1,0,0,0,614,615,1,0,0,0,615,616,1, + 0,0,0,616,617,3,152,76,0,617,626,1,0,0,0,618,626,3,132,66,0,619, + 626,3,130,65,0,620,626,3,120,60,0,621,626,3,122,61,0,622,626,3,112, + 56,0,623,626,3,108,54,0,624,626,3,104,52,0,625,599,1,0,0,0,625,604, + 1,0,0,0,625,609,1,0,0,0,625,610,1,0,0,0,625,611,1,0,0,0,625,612, + 1,0,0,0,625,618,1,0,0,0,625,619,1,0,0,0,625,620,1,0,0,0,625,621, + 1,0,0,0,625,622,1,0,0,0,625,623,1,0,0,0,625,624,1,0,0,0,626,103, + 1,0,0,0,627,628,3,106,53,0,628,629,5,328,0,0,629,630,3,114,57,0, + 630,631,5,332,0,0,631,632,3,186,93,0,632,633,5,332,0,0,633,634,3, + 186,93,0,634,635,5,329,0,0,635,105,1,0,0,0,636,637,7,15,0,0,637, + 107,1,0,0,0,638,639,5,146,0,0,639,640,5,328,0,0,640,641,3,110,55, + 0,641,642,5,332,0,0,642,643,3,186,93,0,643,644,5,329,0,0,644,109, + 1,0,0,0,645,646,7,16,0,0,646,111,1,0,0,0,647,648,5,142,0,0,648,649, + 5,328,0,0,649,650,3,118,59,0,650,651,5,27,0,0,651,652,3,186,93,0, + 652,653,5,329,0,0,653,113,1,0,0,0,654,655,7,17,0,0,655,115,1,0,0, + 0,656,657,7,18,0,0,657,117,1,0,0,0,658,661,3,114,57,0,659,661,3, + 116,58,0,660,658,1,0,0,0,660,659,1,0,0,0,661,119,1,0,0,0,662,663, + 5,308,0,0,663,664,5,328,0,0,664,669,3,200,100,0,665,666,5,332,0, + 0,666,668,3,190,95,0,667,665,1,0,0,0,668,671,1,0,0,0,669,667,1,0, + 0,0,669,670,1,0,0,0,670,672,1,0,0,0,671,669,1,0,0,0,672,673,5,329, + 0,0,673,121,1,0,0,0,674,675,5,171,0,0,675,676,5,328,0,0,676,677, + 3,186,93,0,677,678,5,30,0,0,678,679,3,186,93,0,679,680,5,329,0,0, + 680,123,1,0,0,0,681,682,3,200,100,0,682,683,5,319,0,0,683,684,5, + 239,0,0,684,685,5,328,0,0,685,686,3,202,101,0,686,687,5,329,0,0, + 687,125,1,0,0,0,688,695,3,156,78,0,689,695,3,162,81,0,690,695,3, + 164,82,0,691,695,3,166,83,0,692,695,3,170,85,0,693,695,3,172,86, + 0,694,688,1,0,0,0,694,689,1,0,0,0,694,690,1,0,0,0,694,691,1,0,0, + 0,694,692,1,0,0,0,694,693,1,0,0,0,695,127,1,0,0,0,696,697,5,12,0, + 0,697,699,3,90,45,0,698,700,3,146,73,0,699,698,1,0,0,0,700,701,1, + 0,0,0,701,699,1,0,0,0,701,702,1,0,0,0,702,705,1,0,0,0,703,704,5, + 22,0,0,704,706,3,186,93,0,705,703,1,0,0,0,705,706,1,0,0,0,706,707, + 1,0,0,0,707,708,5,79,0,0,708,729,1,0,0,0,709,711,5,12,0,0,710,712, + 3,146,73,0,711,710,1,0,0,0,712,713,1,0,0,0,713,711,1,0,0,0,713,714, + 1,0,0,0,714,717,1,0,0,0,715,716,5,22,0,0,716,718,3,186,93,0,717, + 715,1,0,0,0,717,718,1,0,0,0,718,719,1,0,0,0,719,720,5,79,0,0,720, + 729,1,0,0,0,721,722,5,13,0,0,722,723,5,328,0,0,723,724,3,90,45,0, + 724,725,5,7,0,0,725,726,3,144,72,0,726,727,5,329,0,0,727,729,1,0, + 0,0,728,696,1,0,0,0,728,709,1,0,0,0,728,721,1,0,0,0,729,129,1,0, + 0,0,730,736,3,134,67,0,731,736,3,136,68,0,732,736,3,138,69,0,733, + 736,3,140,70,0,734,736,3,142,71,0,735,730,1,0,0,0,735,731,1,0,0, + 0,735,732,1,0,0,0,735,733,1,0,0,0,735,734,1,0,0,0,736,131,1,0,0, + 0,737,738,3,174,87,0,738,739,5,328,0,0,739,742,3,130,65,0,740,741, + 5,332,0,0,741,743,3,198,99,0,742,740,1,0,0,0,742,743,1,0,0,0,743, + 744,1,0,0,0,744,745,5,329,0,0,745,133,1,0,0,0,746,747,3,168,84,0, + 747,748,5,328,0,0,748,753,3,202,101,0,749,750,5,332,0,0,750,752, + 3,188,94,0,751,749,1,0,0,0,752,755,1,0,0,0,753,751,1,0,0,0,753,754, + 1,0,0,0,754,756,1,0,0,0,755,753,1,0,0,0,756,757,5,329,0,0,757,135, + 1,0,0,0,758,759,3,176,88,0,759,760,5,328,0,0,760,761,3,200,100,0, + 761,762,5,332,0,0,762,767,3,202,101,0,763,764,5,332,0,0,764,766, + 3,188,94,0,765,763,1,0,0,0,766,769,1,0,0,0,767,765,1,0,0,0,767,768, + 1,0,0,0,768,770,1,0,0,0,769,767,1,0,0,0,770,771,5,329,0,0,771,137, + 1,0,0,0,772,773,3,178,89,0,773,774,5,328,0,0,774,775,5,330,0,0,775, + 780,3,196,98,0,776,777,5,332,0,0,777,779,3,196,98,0,778,776,1,0, + 0,0,779,782,1,0,0,0,780,778,1,0,0,0,780,781,1,0,0,0,781,783,1,0, + 0,0,782,780,1,0,0,0,783,784,5,331,0,0,784,785,5,332,0,0,785,790, + 3,202,101,0,786,787,5,332,0,0,787,789,3,188,94,0,788,786,1,0,0,0, + 789,792,1,0,0,0,790,788,1,0,0,0,790,791,1,0,0,0,791,793,1,0,0,0, + 792,790,1,0,0,0,793,794,5,329,0,0,794,810,1,0,0,0,795,796,3,178, + 89,0,796,797,5,328,0,0,797,798,3,210,105,0,798,799,5,332,0,0,799, + 804,3,212,106,0,800,801,5,332,0,0,801,803,3,188,94,0,802,800,1,0, + 0,0,803,806,1,0,0,0,804,802,1,0,0,0,804,805,1,0,0,0,805,807,1,0, + 0,0,806,804,1,0,0,0,807,808,5,329,0,0,808,810,1,0,0,0,809,772,1, + 0,0,0,809,795,1,0,0,0,810,139,1,0,0,0,811,812,3,200,100,0,812,813, + 5,319,0,0,813,814,3,180,90,0,814,815,5,328,0,0,815,820,3,202,101, + 0,816,817,5,332,0,0,817,819,3,188,94,0,818,816,1,0,0,0,819,822,1, + 0,0,0,820,818,1,0,0,0,820,821,1,0,0,0,821,823,1,0,0,0,822,820,1, + 0,0,0,823,824,5,329,0,0,824,141,1,0,0,0,825,826,3,200,100,0,826, + 827,5,319,0,0,827,828,3,182,91,0,828,829,5,328,0,0,829,834,3,202, + 101,0,830,831,5,332,0,0,831,833,3,188,94,0,832,830,1,0,0,0,833,836, + 1,0,0,0,834,832,1,0,0,0,834,835,1,0,0,0,835,837,1,0,0,0,836,834, + 1,0,0,0,837,838,5,329,0,0,838,143,1,0,0,0,839,850,5,128,0,0,840, + 850,5,193,0,0,841,850,5,197,0,0,842,850,5,32,0,0,843,850,5,33,0, + 0,844,850,5,21,0,0,845,850,5,40,0,0,846,850,5,25,0,0,847,850,5,57, + 0,0,848,850,5,9,0,0,849,839,1,0,0,0,849,840,1,0,0,0,849,841,1,0, + 0,0,849,842,1,0,0,0,849,843,1,0,0,0,849,844,1,0,0,0,849,845,1,0, + 0,0,849,846,1,0,0,0,849,847,1,0,0,0,849,848,1,0,0,0,850,145,1,0, + 0,0,851,852,5,62,0,0,852,853,3,186,93,0,853,854,5,58,0,0,854,855, + 3,186,93,0,855,147,1,0,0,0,856,857,3,154,77,0,857,858,5,328,0,0, + 858,859,3,186,93,0,859,860,5,329,0,0,860,873,1,0,0,0,861,862,5,66, + 0,0,862,863,5,328,0,0,863,864,5,312,0,0,864,873,5,329,0,0,865,866, + 5,66,0,0,866,867,5,328,0,0,867,868,5,20,0,0,868,869,3,186,93,0,869, + 870,5,329,0,0,870,873,1,0,0,0,871,873,3,150,75,0,872,856,1,0,0,0, + 872,861,1,0,0,0,872,865,1,0,0,0,872,871,1,0,0,0,873,149,1,0,0,0, + 874,875,7,19,0,0,875,876,5,328,0,0,876,877,3,186,93,0,877,878,5, + 332,0,0,878,881,3,64,32,0,879,880,5,332,0,0,880,882,3,64,32,0,881, + 879,1,0,0,0,881,882,1,0,0,0,882,883,1,0,0,0,883,884,5,329,0,0,884, + 151,1,0,0,0,885,886,5,221,0,0,886,887,5,328,0,0,887,888,5,63,0,0, + 888,889,3,90,45,0,889,890,5,329,0,0,890,153,1,0,0,0,891,892,7,20, + 0,0,892,155,1,0,0,0,893,921,5,104,0,0,894,921,5,112,0,0,895,921, + 5,113,0,0,896,921,5,114,0,0,897,921,5,117,0,0,898,921,5,122,0,0, + 899,921,5,139,0,0,900,921,5,140,0,0,901,921,5,141,0,0,902,921,5, + 143,0,0,903,921,5,152,0,0,904,921,5,156,0,0,905,921,5,157,0,0,906, + 921,5,158,0,0,907,921,5,318,0,0,908,921,5,170,0,0,909,921,5,172, + 0,0,910,921,5,173,0,0,911,921,5,175,0,0,912,921,5,177,0,0,913,921, + 5,178,0,0,914,921,5,182,0,0,915,921,5,183,0,0,916,921,5,186,0,0, + 917,921,5,198,0,0,918,921,3,158,79,0,919,921,3,160,80,0,920,893, + 1,0,0,0,920,894,1,0,0,0,920,895,1,0,0,0,920,896,1,0,0,0,920,897, + 1,0,0,0,920,898,1,0,0,0,920,899,1,0,0,0,920,900,1,0,0,0,920,901, + 1,0,0,0,920,902,1,0,0,0,920,903,1,0,0,0,920,904,1,0,0,0,920,905, + 1,0,0,0,920,906,1,0,0,0,920,907,1,0,0,0,920,908,1,0,0,0,920,909, + 1,0,0,0,920,910,1,0,0,0,920,911,1,0,0,0,920,912,1,0,0,0,920,913, + 1,0,0,0,920,914,1,0,0,0,920,915,1,0,0,0,920,916,1,0,0,0,920,917, + 1,0,0,0,920,918,1,0,0,0,920,919,1,0,0,0,921,157,1,0,0,0,922,923, + 7,21,0,0,923,159,1,0,0,0,924,925,7,22,0,0,925,161,1,0,0,0,926,986, + 3,84,42,0,927,986,5,272,0,0,928,986,5,107,0,0,929,986,5,118,0,0, + 930,986,5,123,0,0,931,986,5,124,0,0,932,986,5,128,0,0,933,986,5, + 129,0,0,934,986,5,130,0,0,935,986,5,131,0,0,936,986,5,132,0,0,937, + 986,5,16,0,0,938,986,5,87,0,0,939,986,5,133,0,0,940,986,5,134,0, + 0,941,986,5,215,0,0,942,986,5,135,0,0,943,986,5,136,0,0,944,986, + 5,216,0,0,945,986,5,217,0,0,946,986,5,144,0,0,947,986,5,145,0,0, + 948,986,5,86,0,0,949,986,5,229,0,0,950,986,5,150,0,0,951,986,5,161, + 0,0,952,986,5,162,0,0,953,986,5,83,0,0,954,986,5,85,0,0,955,986, + 5,240,0,0,956,986,5,241,0,0,957,986,5,89,0,0,958,986,5,164,0,0,959, + 986,5,242,0,0,960,986,5,166,0,0,961,986,5,168,0,0,962,986,5,169, + 0,0,963,986,5,90,0,0,964,986,5,181,0,0,965,986,5,84,0,0,966,986, + 5,257,0,0,967,986,5,188,0,0,968,986,5,189,0,0,969,986,5,191,0,0, + 970,986,5,187,0,0,971,986,5,193,0,0,972,986,5,195,0,0,973,986,5, + 196,0,0,974,986,5,194,0,0,975,986,5,197,0,0,976,986,5,199,0,0,977, + 986,5,200,0,0,978,986,5,201,0,0,979,986,5,88,0,0,980,986,5,267,0, + 0,981,986,5,265,0,0,982,986,5,266,0,0,983,986,5,91,0,0,984,986,5, + 273,0,0,985,926,1,0,0,0,985,927,1,0,0,0,985,928,1,0,0,0,985,929, + 1,0,0,0,985,930,1,0,0,0,985,931,1,0,0,0,985,932,1,0,0,0,985,933, + 1,0,0,0,985,934,1,0,0,0,985,935,1,0,0,0,985,936,1,0,0,0,985,937, + 1,0,0,0,985,938,1,0,0,0,985,939,1,0,0,0,985,940,1,0,0,0,985,941, + 1,0,0,0,985,942,1,0,0,0,985,943,1,0,0,0,985,944,1,0,0,0,985,945, + 1,0,0,0,985,946,1,0,0,0,985,947,1,0,0,0,985,948,1,0,0,0,985,949, + 1,0,0,0,985,950,1,0,0,0,985,951,1,0,0,0,985,952,1,0,0,0,985,953, + 1,0,0,0,985,954,1,0,0,0,985,955,1,0,0,0,985,956,1,0,0,0,985,957, + 1,0,0,0,985,958,1,0,0,0,985,959,1,0,0,0,985,960,1,0,0,0,985,961, + 1,0,0,0,985,962,1,0,0,0,985,963,1,0,0,0,985,964,1,0,0,0,985,965, + 1,0,0,0,985,966,1,0,0,0,985,967,1,0,0,0,985,968,1,0,0,0,985,969, + 1,0,0,0,985,970,1,0,0,0,985,971,1,0,0,0,985,972,1,0,0,0,985,973, + 1,0,0,0,985,974,1,0,0,0,985,975,1,0,0,0,985,976,1,0,0,0,985,977, + 1,0,0,0,985,978,1,0,0,0,985,979,1,0,0,0,985,980,1,0,0,0,985,981, + 1,0,0,0,985,982,1,0,0,0,985,983,1,0,0,0,985,984,1,0,0,0,986,163, + 1,0,0,0,987,988,7,23,0,0,988,165,1,0,0,0,989,990,7,24,0,0,990,167, + 1,0,0,0,991,992,5,252,0,0,992,169,1,0,0,0,993,994,5,264,0,0,994, + 171,1,0,0,0,995,996,5,246,0,0,996,173,1,0,0,0,997,998,7,25,0,0,998, + 175,1,0,0,0,999,1000,7,26,0,0,1000,177,1,0,0,0,1001,1002,7,27,0, + 0,1002,179,1,0,0,0,1003,1004,7,28,0,0,1004,181,1,0,0,0,1005,1006, + 7,29,0,0,1006,183,1,0,0,0,1007,1012,3,186,93,0,1008,1009,5,332,0, + 0,1009,1011,3,186,93,0,1010,1008,1,0,0,0,1011,1014,1,0,0,0,1012, + 1010,1,0,0,0,1012,1013,1,0,0,0,1013,1016,1,0,0,0,1014,1012,1,0,0, + 0,1015,1007,1,0,0,0,1015,1016,1,0,0,0,1016,185,1,0,0,0,1017,1018, + 3,90,45,0,1018,187,1,0,0,0,1019,1020,3,192,96,0,1020,1021,5,319, + 0,0,1021,1022,3,204,102,0,1022,1028,1,0,0,0,1023,1024,3,66,33,0, + 1024,1025,5,319,0,0,1025,1026,3,204,102,0,1026,1028,1,0,0,0,1027, + 1019,1,0,0,0,1027,1023,1,0,0,0,1028,189,1,0,0,0,1029,1030,3,194, + 97,0,1030,1031,5,319,0,0,1031,1032,3,206,103,0,1032,191,1,0,0,0, + 1033,1034,7,30,0,0,1034,193,1,0,0,0,1035,1036,7,31,0,0,1036,195, + 1,0,0,0,1037,1046,3,200,100,0,1038,1039,3,200,100,0,1039,1040,3, + 198,99,0,1040,1046,1,0,0,0,1041,1042,3,200,100,0,1042,1043,5,326, + 0,0,1043,1044,3,198,99,0,1044,1046,1,0,0,0,1045,1037,1,0,0,0,1045, + 1038,1,0,0,0,1045,1041,1,0,0,0,1046,197,1,0,0,0,1047,1048,3,64,32, + 0,1048,199,1,0,0,0,1049,1052,3,222,111,0,1050,1052,3,66,33,0,1051, + 1049,1,0,0,0,1051,1050,1,0,0,0,1052,201,1,0,0,0,1053,1054,3,204, + 102,0,1054,203,1,0,0,0,1055,1058,3,222,111,0,1056,1058,3,60,30,0, + 1057,1055,1,0,0,0,1057,1056,1,0,0,0,1058,205,1,0,0,0,1059,1060,3, + 66,33,0,1060,207,1,0,0,0,1061,1065,5,285,0,0,1062,1065,5,252,0,0, + 1063,1065,3,66,33,0,1064,1061,1,0,0,0,1064,1062,1,0,0,0,1064,1063, + 1,0,0,0,1065,209,1,0,0,0,1066,1067,3,208,104,0,1067,1068,5,319,0, + 0,1068,1069,3,204,102,0,1069,211,1,0,0,0,1070,1071,3,208,104,0,1071, + 1072,5,319,0,0,1072,1073,3,204,102,0,1073,1081,1,0,0,0,1074,1075, + 3,208,104,0,1075,1076,5,319,0,0,1076,1077,5,330,0,0,1077,1078,3, + 204,102,0,1078,1079,5,331,0,0,1079,1081,1,0,0,0,1080,1070,1,0,0, + 0,1080,1074,1,0,0,0,1081,213,1,0,0,0,1082,1083,3,222,111,0,1083, + 215,1,0,0,0,1084,1085,3,222,111,0,1085,217,1,0,0,0,1086,1087,3,222, + 111,0,1087,1088,5,327,0,0,1088,1089,5,312,0,0,1089,219,1,0,0,0,1090, + 1091,3,224,112,0,1091,221,1,0,0,0,1092,1097,3,224,112,0,1093,1094, + 5,327,0,0,1094,1096,3,224,112,0,1095,1093,1,0,0,0,1096,1099,1,0, + 0,0,1097,1095,1,0,0,0,1097,1098,1,0,0,0,1098,223,1,0,0,0,1099,1097, + 1,0,0,0,1100,1102,5,327,0,0,1101,1100,1,0,0,0,1101,1102,1,0,0,0, + 1102,1103,1,0,0,0,1103,1108,5,349,0,0,1104,1108,5,351,0,0,1105,1108, + 3,226,113,0,1106,1108,3,126,63,0,1107,1101,1,0,0,0,1107,1104,1,0, + 0,0,1107,1105,1,0,0,0,1107,1106,1,0,0,0,1108,225,1,0,0,0,1109,1110, + 7,32,0,0,1110,227,1,0,0,0,91,229,232,238,246,256,267,272,276,279, + 283,291,297,302,305,310,313,316,319,323,326,332,336,350,365,370, + 374,380,388,396,400,405,408,419,424,428,435,441,456,465,474,483, + 497,505,507,519,528,540,547,549,557,568,576,578,592,595,614,625, + 660,669,694,701,705,713,717,728,735,742,753,767,780,790,804,809, + 820,834,849,872,881,920,985,1012,1015,1027,1045,1051,1057,1064,1080, + 1097,1101,1107 + ]; + + private static __ATN: antlr.ATN; + public static get _ATN(): antlr.ATN { + if (!OpenSearchSQLParser.__ATN) { + OpenSearchSQLParser.__ATN = new antlr.ATNDeserializer().deserialize(OpenSearchSQLParser._serializedATN); + } + + return OpenSearchSQLParser.__ATN; + } + + + private static readonly vocabulary = new antlr.Vocabulary(OpenSearchSQLParser.literalNames, OpenSearchSQLParser.symbolicNames, []); + + public override get vocabulary(): antlr.Vocabulary { + return OpenSearchSQLParser.vocabulary; + } + + private static readonly decisionsToDFA = OpenSearchSQLParser._ATN.decisionToState.map( (ds: antlr.DecisionState, index: number) => new antlr.DFA(ds, index) ); +} + +export class RootContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EOF(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EOF, 0)!; + } + public sqlStatement(): SqlStatementContext | null { + return this.getRuleContext(0, SqlStatementContext); + } + public SEMI(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SEMI, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_root; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRoot) { + return visitor.visitRoot(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SqlStatementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public dmlStatement(): DmlStatementContext | null { + return this.getRuleContext(0, DmlStatementContext); + } + public adminStatement(): AdminStatementContext | null { + return this.getRuleContext(0, AdminStatementContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_sqlStatement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSqlStatement) { + return visitor.visitSqlStatement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DmlStatementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public selectStatement(): SelectStatementContext { + return this.getRuleContext(0, SelectStatementContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_dmlStatement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDmlStatement) { + return visitor.visitDmlStatement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SelectStatementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_selectStatement; + } + public override copyFrom(ctx: SelectStatementContext): void { + super.copyFrom(ctx); + } +} +export class SimpleSelectContext extends SelectStatementContext { + public constructor(ctx: SelectStatementContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public querySpecification(): QuerySpecificationContext { + return this.getRuleContext(0, QuerySpecificationContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSimpleSelect) { + return visitor.visitSimpleSelect(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AdminStatementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public showStatement(): ShowStatementContext | null { + return this.getRuleContext(0, ShowStatementContext); + } + public describeStatement(): DescribeStatementContext | null { + return this.getRuleContext(0, DescribeStatementContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_adminStatement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAdminStatement) { + return visitor.visitAdminStatement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ShowStatementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public SHOW(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.SHOW, 0)!; + } + public TABLES(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.TABLES, 0)!; + } + public tableFilter(): TableFilterContext { + return this.getRuleContext(0, TableFilterContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_showStatement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitShowStatement) { + return visitor.visitShowStatement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DescribeStatementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public DESCRIBE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.DESCRIBE, 0)!; + } + public TABLES(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.TABLES, 0)!; + } + public tableFilter(): TableFilterContext { + return this.getRuleContext(0, TableFilterContext)!; + } + public columnFilter(): ColumnFilterContext | null { + return this.getRuleContext(0, ColumnFilterContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_describeStatement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDescribeStatement) { + return visitor.visitDescribeStatement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ColumnFilterContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public COLUMNS(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.COLUMNS, 0)!; + } + public LIKE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LIKE, 0)!; + } + public showDescribePattern(): ShowDescribePatternContext { + return this.getRuleContext(0, ShowDescribePatternContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_columnFilter; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitColumnFilter) { + return visitor.visitColumnFilter(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TableFilterContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public LIKE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LIKE, 0)!; + } + public showDescribePattern(): ShowDescribePatternContext { + return this.getRuleContext(0, ShowDescribePatternContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_tableFilter; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTableFilter) { + return visitor.visitTableFilter(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ShowDescribePatternContext extends antlr.ParserRuleContext { + public _oldID?: CompatibleIDContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public compatibleID(): CompatibleIDContext | null { + return this.getRuleContext(0, CompatibleIDContext); + } + public stringLiteral(): StringLiteralContext | null { + return this.getRuleContext(0, StringLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_showDescribePattern; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitShowDescribePattern) { + return visitor.visitShowDescribePattern(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class CompatibleIDContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MODULE(): antlr.TerminalNode[]; + public MODULE(i: number): antlr.TerminalNode | null; + public MODULE(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.MODULE); + } else { + return this.getToken(OpenSearchSQLParser.MODULE, i); + } + } + public ID(): antlr.TerminalNode[]; + public ID(i: number): antlr.TerminalNode | null; + public ID(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.ID); + } else { + return this.getToken(OpenSearchSQLParser.ID, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_compatibleID; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitCompatibleID) { + return visitor.visitCompatibleID(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class QuerySpecificationContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public selectClause(): SelectClauseContext { + return this.getRuleContext(0, SelectClauseContext)!; + } + public fromClause(): FromClauseContext | null { + return this.getRuleContext(0, FromClauseContext); + } + public limitClause(): LimitClauseContext | null { + return this.getRuleContext(0, LimitClauseContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_querySpecification; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitQuerySpecification) { + return visitor.visitQuerySpecification(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SelectClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public SELECT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.SELECT, 0)!; + } + public selectElements(): SelectElementsContext { + return this.getRuleContext(0, SelectElementsContext)!; + } + public selectSpec(): SelectSpecContext | null { + return this.getRuleContext(0, SelectSpecContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_selectClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSelectClause) { + return visitor.visitSelectClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SelectSpecContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ALL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ALL, 0); + } + public DISTINCT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DISTINCT, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_selectSpec; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSelectSpec) { + return visitor.visitSelectSpec(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SelectElementsContext extends antlr.ParserRuleContext { + public _star?: Token | null; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public selectElement(): SelectElementContext[]; + public selectElement(i: number): SelectElementContext | null; + public selectElement(i?: number): SelectElementContext[] | SelectElementContext | null { + if (i === undefined) { + return this.getRuleContexts(SelectElementContext); + } + + return this.getRuleContext(i, SelectElementContext); + } + public STAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STAR, 0); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_selectElements; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSelectElements) { + return visitor.visitSelectElements(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SelectElementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public alias(): AliasContext | null { + return this.getRuleContext(0, AliasContext); + } + public AS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.AS, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_selectElement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSelectElement) { + return visitor.visitSelectElement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class FromClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public FROM(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.FROM, 0)!; + } + public relation(): RelationContext { + return this.getRuleContext(0, RelationContext)!; + } + public whereClause(): WhereClauseContext | null { + return this.getRuleContext(0, WhereClauseContext); + } + public groupByClause(): GroupByClauseContext | null { + return this.getRuleContext(0, GroupByClauseContext); + } + public havingClause(): HavingClauseContext | null { + return this.getRuleContext(0, HavingClauseContext); + } + public orderByClause(): OrderByClauseContext | null { + return this.getRuleContext(0, OrderByClauseContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_fromClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFromClause) { + return visitor.visitFromClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelationContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relation; + } + public override copyFrom(ctx: RelationContext): void { + super.copyFrom(ctx); + } +} +export class TableAsRelationContext extends RelationContext { + public constructor(ctx: RelationContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public tableName(): TableNameContext { + return this.getRuleContext(0, TableNameContext)!; + } + public alias(): AliasContext | null { + return this.getRuleContext(0, AliasContext); + } + public AS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.AS, 0); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTableAsRelation) { + return visitor.visitTableAsRelation(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class SubqueryAsRelationContext extends RelationContext { + public _subquery?: QuerySpecificationContext; + public constructor(ctx: RelationContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public alias(): AliasContext { + return this.getRuleContext(0, AliasContext)!; + } + public querySpecification(): QuerySpecificationContext { + return this.getRuleContext(0, QuerySpecificationContext)!; + } + public AS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.AS, 0); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSubqueryAsRelation) { + return visitor.visitSubqueryAsRelation(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class WhereClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public WHERE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.WHERE, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_whereClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitWhereClause) { + return visitor.visitWhereClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class GroupByClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public GROUP(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.GROUP, 0)!; + } + public BY(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.BY, 0)!; + } + public groupByElements(): GroupByElementsContext { + return this.getRuleContext(0, GroupByElementsContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_groupByClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitGroupByClause) { + return visitor.visitGroupByClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class GroupByElementsContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public groupByElement(): GroupByElementContext[]; + public groupByElement(i: number): GroupByElementContext | null; + public groupByElement(i?: number): GroupByElementContext[] | GroupByElementContext | null { + if (i === undefined) { + return this.getRuleContexts(GroupByElementContext); + } + + return this.getRuleContext(i, GroupByElementContext); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_groupByElements; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitGroupByElements) { + return visitor.visitGroupByElements(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class GroupByElementContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_groupByElement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitGroupByElement) { + return visitor.visitGroupByElement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class HavingClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public HAVING(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.HAVING, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_havingClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitHavingClause) { + return visitor.visitHavingClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class OrderByClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ORDER(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.ORDER, 0)!; + } + public BY(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.BY, 0)!; + } + public orderByElement(): OrderByElementContext[]; + public orderByElement(i: number): OrderByElementContext | null; + public orderByElement(i?: number): OrderByElementContext[] | OrderByElementContext | null { + if (i === undefined) { + return this.getRuleContexts(OrderByElementContext); + } + + return this.getRuleContext(i, OrderByElementContext); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_orderByClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitOrderByClause) { + return visitor.visitOrderByClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class OrderByElementContext extends antlr.ParserRuleContext { + public _order?: Token | null; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public NULLS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NULLS, 0); + } + public FIRST(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FIRST, 0); + } + public LAST(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LAST, 0); + } + public ASC(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ASC, 0); + } + public DESC(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DESC, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_orderByElement; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitOrderByElement) { + return visitor.visitOrderByElement(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class LimitClauseContext extends antlr.ParserRuleContext { + public _offset?: DecimalLiteralContext; + public _limit?: DecimalLiteralContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public LIMIT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LIMIT, 0)!; + } + public decimalLiteral(): DecimalLiteralContext[]; + public decimalLiteral(i: number): DecimalLiteralContext | null; + public decimalLiteral(i?: number): DecimalLiteralContext[] | DecimalLiteralContext | null { + if (i === undefined) { + return this.getRuleContexts(DecimalLiteralContext); + } + + return this.getRuleContext(i, DecimalLiteralContext); + } + public COMMA(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COMMA, 0); + } + public OFFSET(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.OFFSET, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_limitClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitLimitClause) { + return visitor.visitLimitClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class WindowFunctionClauseContext extends antlr.ParserRuleContext { + public _function_?: WindowFunctionContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public overClause(): OverClauseContext { + return this.getRuleContext(0, OverClauseContext)!; + } + public windowFunction(): WindowFunctionContext { + return this.getRuleContext(0, WindowFunctionContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_windowFunctionClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitWindowFunctionClause) { + return visitor.visitWindowFunctionClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class WindowFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_windowFunction; + } + public override copyFrom(ctx: WindowFunctionContext): void { + super.copyFrom(ctx); + } +} +export class AggregateWindowFunctionContext extends WindowFunctionContext { + public constructor(ctx: WindowFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public aggregateFunction(): AggregateFunctionContext { + return this.getRuleContext(0, AggregateFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAggregateWindowFunction) { + return visitor.visitAggregateWindowFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class ScalarWindowFunctionContext extends WindowFunctionContext { + public _functionName?: Token | null; + public constructor(ctx: WindowFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public ROW_NUMBER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ROW_NUMBER, 0); + } + public RANK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RANK, 0); + } + public DENSE_RANK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DENSE_RANK, 0); + } + public functionArgs(): FunctionArgsContext | null { + return this.getRuleContext(0, FunctionArgsContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitScalarWindowFunction) { + return visitor.visitScalarWindowFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class OverClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public OVER(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.OVER, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public partitionByClause(): PartitionByClauseContext | null { + return this.getRuleContext(0, PartitionByClauseContext); + } + public orderByClause(): OrderByClauseContext | null { + return this.getRuleContext(0, OrderByClauseContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_overClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitOverClause) { + return visitor.visitOverClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class PartitionByClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public PARTITION(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.PARTITION, 0)!; + } + public BY(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.BY, 0)!; + } + public expression(): ExpressionContext[]; + public expression(i: number): ExpressionContext | null; + public expression(i?: number): ExpressionContext[] | ExpressionContext | null { + if (i === undefined) { + return this.getRuleContexts(ExpressionContext); + } + + return this.getRuleContext(i, ExpressionContext); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_partitionByClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitPartitionByClause) { + return visitor.visitPartitionByClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ConstantContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_constant; + } + public override copyFrom(ctx: ConstantContext): void { + super.copyFrom(ctx); + } +} +export class DatetimeContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public datetimeLiteral(): DatetimeLiteralContext { + return this.getRuleContext(0, DatetimeLiteralContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDatetime) { + return visitor.visitDatetime(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class SignedDecimalContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public decimalLiteral(): DecimalLiteralContext { + return this.getRuleContext(0, DecimalLiteralContext)!; + } + public sign(): SignContext | null { + return this.getRuleContext(0, SignContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSignedDecimal) { + return visitor.visitSignedDecimal(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class BooleanContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public booleanLiteral(): BooleanLiteralContext { + return this.getRuleContext(0, BooleanLiteralContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitBoolean) { + return visitor.visitBoolean(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class StringContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitString) { + return visitor.visitString(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class NullContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public nullLiteral(): NullLiteralContext { + return this.getRuleContext(0, NullLiteralContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNull) { + return visitor.visitNull(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class IntervalContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public intervalLiteral(): IntervalLiteralContext { + return this.getRuleContext(0, IntervalLiteralContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitInterval) { + return visitor.visitInterval(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class SignedRealContext extends ConstantContext { + public constructor(ctx: ConstantContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public realLiteral(): RealLiteralContext { + return this.getRuleContext(0, RealLiteralContext)!; + } + public sign(): SignContext | null { + return this.getRuleContext(0, SignContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSignedReal) { + return visitor.visitSignedReal(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DecimalLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public DECIMAL_LITERAL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DECIMAL_LITERAL, 0); + } + public ZERO_DECIMAL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ZERO_DECIMAL, 0); + } + public ONE_DECIMAL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ONE_DECIMAL, 0); + } + public TWO_DECIMAL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TWO_DECIMAL, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_decimalLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDecimalLiteral) { + return visitor.visitDecimalLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class NumericLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public decimalLiteral(): DecimalLiteralContext | null { + return this.getRuleContext(0, DecimalLiteralContext); + } + public realLiteral(): RealLiteralContext | null { + return this.getRuleContext(0, RealLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_numericLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNumericLiteral) { + return visitor.visitNumericLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class StringLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public STRING_LITERAL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STRING_LITERAL, 0); + } + public DOUBLE_QUOTE_ID(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DOUBLE_QUOTE_ID, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_stringLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitStringLiteral) { + return visitor.visitStringLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class BooleanLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public TRUE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TRUE, 0); + } + public FALSE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FALSE, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_booleanLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitBooleanLiteral) { + return visitor.visitBooleanLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RealLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public REAL_LITERAL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.REAL_LITERAL, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_realLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRealLiteral) { + return visitor.visitRealLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SignContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public PLUS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PLUS, 0); + } + public MINUS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUS, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_sign; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSign) { + return visitor.visitSign(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class NullLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public NULL_LITERAL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.NULL_LITERAL, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_nullLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNullLiteral) { + return visitor.visitNullLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DatetimeLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public dateLiteral(): DateLiteralContext | null { + return this.getRuleContext(0, DateLiteralContext); + } + public timeLiteral(): TimeLiteralContext | null { + return this.getRuleContext(0, TimeLiteralContext); + } + public timestampLiteral(): TimestampLiteralContext | null { + return this.getRuleContext(0, TimestampLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_datetimeLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDatetimeLiteral) { + return visitor.visitDatetimeLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DateLiteralContext extends antlr.ParserRuleContext { + public _date?: StringLiteralContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE, 0); + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public LEFT_BRACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LEFT_BRACE, 0); + } + public RIGHT_BRACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RIGHT_BRACE, 0); + } + public D(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.D, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_dateLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDateLiteral) { + return visitor.visitDateLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TimeLiteralContext extends antlr.ParserRuleContext { + public _time?: StringLiteralContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME, 0); + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public LEFT_BRACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LEFT_BRACE, 0); + } + public RIGHT_BRACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RIGHT_BRACE, 0); + } + public T(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.T, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_timeLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTimeLiteral) { + return visitor.visitTimeLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TimestampLiteralContext extends antlr.ParserRuleContext { + public _timestamp?: StringLiteralContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMESTAMP, 0); + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public LEFT_BRACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LEFT_BRACE, 0); + } + public RIGHT_BRACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RIGHT_BRACE, 0); + } + public TS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TS, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_timestampLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTimestampLiteral) { + return visitor.visitTimestampLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DatetimeConstantLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public CURRENT_DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CURRENT_DATE, 0); + } + public CURRENT_TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CURRENT_TIME, 0); + } + public CURRENT_TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CURRENT_TIMESTAMP, 0); + } + public LOCALTIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOCALTIME, 0); + } + public LOCALTIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOCALTIMESTAMP, 0); + } + public UTC_TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.UTC_TIMESTAMP, 0); + } + public UTC_DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.UTC_DATE, 0); + } + public UTC_TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.UTC_TIME, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_datetimeConstantLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDatetimeConstantLiteral) { + return visitor.visitDatetimeConstantLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class IntervalLiteralContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public INTERVAL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.INTERVAL, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public intervalUnit(): IntervalUnitContext { + return this.getRuleContext(0, IntervalUnitContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_intervalLiteral; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitIntervalLiteral) { + return visitor.visitIntervalLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class IntervalUnitContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MICROSECOND, 0); + } + public SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SECOND, 0); + } + public MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE, 0); + } + public HOUR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR, 0); + } + public DAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY, 0); + } + public WEEK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WEEK, 0); + } + public MONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MONTH, 0); + } + public QUARTER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUARTER, 0); + } + public YEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.YEAR, 0); + } + public SECOND_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SECOND_MICROSECOND, 0); + } + public MINUTE_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE_MICROSECOND, 0); + } + public MINUTE_SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE_SECOND, 0); + } + public HOUR_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_MICROSECOND, 0); + } + public HOUR_SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_SECOND, 0); + } + public HOUR_MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_MINUTE, 0); + } + public DAY_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_MICROSECOND, 0); + } + public DAY_SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_SECOND, 0); + } + public DAY_MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_MINUTE, 0); + } + public DAY_HOUR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_HOUR, 0); + } + public YEAR_MONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.YEAR_MONTH, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_intervalUnit; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitIntervalUnit) { + return visitor.visitIntervalUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ExpressionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_expression; + } + public override copyFrom(ctx: ExpressionContext): void { + super.copyFrom(ctx); + } +} +export class OrExpressionContext extends ExpressionContext { + public _left?: ExpressionContext; + public _right?: ExpressionContext; + public constructor(ctx: ExpressionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public OR(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.OR, 0)!; + } + public expression(): ExpressionContext[]; + public expression(i: number): ExpressionContext | null; + public expression(i?: number): ExpressionContext[] | ExpressionContext | null { + if (i === undefined) { + return this.getRuleContexts(ExpressionContext); + } + + return this.getRuleContext(i, ExpressionContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitOrExpression) { + return visitor.visitOrExpression(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class AndExpressionContext extends ExpressionContext { + public _left?: ExpressionContext; + public _right?: ExpressionContext; + public constructor(ctx: ExpressionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public AND(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.AND, 0)!; + } + public expression(): ExpressionContext[]; + public expression(i: number): ExpressionContext | null; + public expression(i?: number): ExpressionContext[] | ExpressionContext | null { + if (i === undefined) { + return this.getRuleContexts(ExpressionContext); + } + + return this.getRuleContext(i, ExpressionContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAndExpression) { + return visitor.visitAndExpression(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class NotExpressionContext extends ExpressionContext { + public constructor(ctx: ExpressionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public NOT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.NOT, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNotExpression) { + return visitor.visitNotExpression(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class PredicateExpressionContext extends ExpressionContext { + public constructor(ctx: ExpressionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public predicate(): PredicateContext { + return this.getRuleContext(0, PredicateContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitPredicateExpression) { + return visitor.visitPredicateExpression(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class PredicateContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_predicate; + } + public override copyFrom(ctx: PredicateContext): void { + super.copyFrom(ctx); + } +} +export class ExpressionAtomPredicateContext extends PredicateContext { + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public expressionAtom(): ExpressionAtomContext { + return this.getRuleContext(0, ExpressionAtomContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitExpressionAtomPredicate) { + return visitor.visitExpressionAtomPredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class BinaryComparisonPredicateContext extends PredicateContext { + public _left?: PredicateContext; + public _right?: PredicateContext; + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public comparisonOperator(): ComparisonOperatorContext { + return this.getRuleContext(0, ComparisonOperatorContext)!; + } + public predicate(): PredicateContext[]; + public predicate(i: number): PredicateContext | null; + public predicate(i?: number): PredicateContext[] | PredicateContext | null { + if (i === undefined) { + return this.getRuleContexts(PredicateContext); + } + + return this.getRuleContext(i, PredicateContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitBinaryComparisonPredicate) { + return visitor.visitBinaryComparisonPredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class InPredicateContext extends PredicateContext { + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public predicate(): PredicateContext { + return this.getRuleContext(0, PredicateContext)!; + } + public IN(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.IN, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public expressions(): ExpressionsContext { + return this.getRuleContext(0, ExpressionsContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public NOT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NOT, 0); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitInPredicate) { + return visitor.visitInPredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class BetweenPredicateContext extends PredicateContext { + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public predicate(): PredicateContext[]; + public predicate(i: number): PredicateContext | null; + public predicate(i?: number): PredicateContext[] | PredicateContext | null { + if (i === undefined) { + return this.getRuleContexts(PredicateContext); + } + + return this.getRuleContext(i, PredicateContext); + } + public BETWEEN(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.BETWEEN, 0)!; + } + public AND(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.AND, 0)!; + } + public NOT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NOT, 0); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitBetweenPredicate) { + return visitor.visitBetweenPredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class IsNullPredicateContext extends PredicateContext { + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public predicate(): PredicateContext { + return this.getRuleContext(0, PredicateContext)!; + } + public IS(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.IS, 0)!; + } + public nullNotnull(): NullNotnullContext { + return this.getRuleContext(0, NullNotnullContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitIsNullPredicate) { + return visitor.visitIsNullPredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class LikePredicateContext extends PredicateContext { + public _left?: PredicateContext; + public _right?: PredicateContext; + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public LIKE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LIKE, 0)!; + } + public predicate(): PredicateContext[]; + public predicate(i: number): PredicateContext | null; + public predicate(i?: number): PredicateContext[] | PredicateContext | null { + if (i === undefined) { + return this.getRuleContexts(PredicateContext); + } + + return this.getRuleContext(i, PredicateContext); + } + public NOT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NOT, 0); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitLikePredicate) { + return visitor.visitLikePredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class RegexpPredicateContext extends PredicateContext { + public _left?: PredicateContext; + public _right?: PredicateContext; + public constructor(ctx: PredicateContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public REGEXP(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.REGEXP, 0)!; + } + public predicate(): PredicateContext[]; + public predicate(i: number): PredicateContext | null; + public predicate(i?: number): PredicateContext[] | PredicateContext | null { + if (i === undefined) { + return this.getRuleContexts(PredicateContext); + } + + return this.getRuleContext(i, PredicateContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRegexpPredicate) { + return visitor.visitRegexpPredicate(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ExpressionsContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public expression(): ExpressionContext[]; + public expression(i: number): ExpressionContext | null; + public expression(i?: number): ExpressionContext[] | ExpressionContext | null { + if (i === undefined) { + return this.getRuleContexts(ExpressionContext); + } + + return this.getRuleContext(i, ExpressionContext); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_expressions; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitExpressions) { + return visitor.visitExpressions(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ExpressionAtomContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_expressionAtom; + } + public override copyFrom(ctx: ExpressionAtomContext): void { + super.copyFrom(ctx); + } +} +export class ConstantExpressionAtomContext extends ExpressionAtomContext { + public constructor(ctx: ExpressionAtomContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public constant(): ConstantContext { + return this.getRuleContext(0, ConstantContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitConstantExpressionAtom) { + return visitor.visitConstantExpressionAtom(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class FunctionCallExpressionAtomContext extends ExpressionAtomContext { + public constructor(ctx: ExpressionAtomContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public functionCall(): FunctionCallContext { + return this.getRuleContext(0, FunctionCallContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFunctionCallExpressionAtom) { + return visitor.visitFunctionCallExpressionAtom(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class FullColumnNameExpressionAtomContext extends ExpressionAtomContext { + public constructor(ctx: ExpressionAtomContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public columnName(): ColumnNameContext { + return this.getRuleContext(0, ColumnNameContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFullColumnNameExpressionAtom) { + return visitor.visitFullColumnNameExpressionAtom(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class NestedExpressionAtomContext extends ExpressionAtomContext { + public constructor(ctx: ExpressionAtomContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNestedExpressionAtom) { + return visitor.visitNestedExpressionAtom(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class MathExpressionAtomContext extends ExpressionAtomContext { + public _left?: ExpressionAtomContext; + public _mathOperator?: Token | null; + public _right?: ExpressionAtomContext; + public constructor(ctx: ExpressionAtomContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public expressionAtom(): ExpressionAtomContext[]; + public expressionAtom(i: number): ExpressionAtomContext | null; + public expressionAtom(i?: number): ExpressionAtomContext[] | ExpressionAtomContext | null { + if (i === undefined) { + return this.getRuleContexts(ExpressionAtomContext); + } + + return this.getRuleContext(i, ExpressionAtomContext); + } + public STAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STAR, 0); + } + public SLASH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SLASH, 0); + } + public MODULE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MODULE, 0); + } + public PLUS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PLUS, 0); + } + public MINUS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUS, 0); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitMathExpressionAtom) { + return visitor.visitMathExpressionAtom(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ComparisonOperatorContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EQUAL_SYMBOL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); + } + public GREATER_SYMBOL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.GREATER_SYMBOL, 0); + } + public LESS_SYMBOL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LESS_SYMBOL, 0); + } + public EXCLAMATION_SYMBOL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.EXCLAMATION_SYMBOL, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_comparisonOperator; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitComparisonOperator) { + return visitor.visitComparisonOperator(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class NullNotnullContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public NULL_LITERAL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.NULL_LITERAL, 0)!; + } + public NOT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NOT, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_nullNotnull; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNullNotnull) { + return visitor.visitNullNotnull(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class FunctionCallContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_functionCall; + } + public override copyFrom(ctx: FunctionCallContext): void { + super.copyFrom(ctx); + } +} +export class PositionFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public positionFunction(): PositionFunctionContext { + return this.getRuleContext(0, PositionFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitPositionFunctionCall) { + return visitor.visitPositionFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class SpecificFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public specificFunction(): SpecificFunctionContext { + return this.getRuleContext(0, SpecificFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSpecificFunctionCall) { + return visitor.visitSpecificFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class ScoreRelevanceFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public scoreRelevanceFunction(): ScoreRelevanceFunctionContext { + return this.getRuleContext(0, ScoreRelevanceFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitScoreRelevanceFunctionCall) { + return visitor.visitScoreRelevanceFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class HighlightFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public highlightFunction(): HighlightFunctionContext { + return this.getRuleContext(0, HighlightFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitHighlightFunctionCall) { + return visitor.visitHighlightFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class ExtractFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public extractFunction(): ExtractFunctionContext { + return this.getRuleContext(0, ExtractFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitExtractFunctionCall) { + return visitor.visitExtractFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class RelevanceFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public relevanceFunction(): RelevanceFunctionContext { + return this.getRuleContext(0, RelevanceFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceFunctionCall) { + return visitor.visitRelevanceFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class TimestampFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public timestampFunction(): TimestampFunctionContext { + return this.getRuleContext(0, TimestampFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTimestampFunctionCall) { + return visitor.visitTimestampFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class NestedAllFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public nestedFunctionName(): NestedFunctionNameContext { + return this.getRuleContext(0, NestedFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public allTupleFields(): AllTupleFieldsContext { + return this.getRuleContext(0, AllTupleFieldsContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNestedAllFunctionCall) { + return visitor.visitNestedAllFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class FilteredAggregationFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public aggregateFunction(): AggregateFunctionContext { + return this.getRuleContext(0, AggregateFunctionContext)!; + } + public filterClause(): FilterClauseContext { + return this.getRuleContext(0, FilterClauseContext)!; + } + public orderByClause(): OrderByClauseContext | null { + return this.getRuleContext(0, OrderByClauseContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFilteredAggregationFunctionCall) { + return visitor.visitFilteredAggregationFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class WindowFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public windowFunctionClause(): WindowFunctionClauseContext { + return this.getRuleContext(0, WindowFunctionClauseContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitWindowFunctionCall) { + return visitor.visitWindowFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class AggregateFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public aggregateFunction(): AggregateFunctionContext { + return this.getRuleContext(0, AggregateFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAggregateFunctionCall) { + return visitor.visitAggregateFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class GetFormatFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public getFormatFunction(): GetFormatFunctionContext { + return this.getRuleContext(0, GetFormatFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitGetFormatFunctionCall) { + return visitor.visitGetFormatFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class ScalarFunctionCallContext extends FunctionCallContext { + public constructor(ctx: FunctionCallContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public scalarFunctionName(): ScalarFunctionNameContext { + return this.getRuleContext(0, ScalarFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public functionArgs(): FunctionArgsContext { + return this.getRuleContext(0, FunctionArgsContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitScalarFunctionCall) { + return visitor.visitScalarFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TimestampFunctionContext extends antlr.ParserRuleContext { + public _firstArg?: FunctionArgContext; + public _secondArg?: FunctionArgContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public timestampFunctionName(): TimestampFunctionNameContext { + return this.getRuleContext(0, TimestampFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public simpleDateTimePart(): SimpleDateTimePartContext { + return this.getRuleContext(0, SimpleDateTimePartContext)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public functionArg(): FunctionArgContext[]; + public functionArg(i: number): FunctionArgContext | null; + public functionArg(i?: number): FunctionArgContext[] | FunctionArgContext | null { + if (i === undefined) { + return this.getRuleContexts(FunctionArgContext); + } + + return this.getRuleContext(i, FunctionArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_timestampFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTimestampFunction) { + return visitor.visitTimestampFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TimestampFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public TIMESTAMPADD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMESTAMPADD, 0); + } + public TIMESTAMPDIFF(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMESTAMPDIFF, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_timestampFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTimestampFunctionName) { + return visitor.visitTimestampFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class GetFormatFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public GET_FORMAT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.GET_FORMAT, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public getFormatType(): GetFormatTypeContext { + return this.getRuleContext(0, GetFormatTypeContext)!; + } + public COMMA(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.COMMA, 0)!; + } + public functionArg(): FunctionArgContext { + return this.getRuleContext(0, FunctionArgContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_getFormatFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitGetFormatFunction) { + return visitor.visitGetFormatFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class GetFormatTypeContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE, 0); + } + public DATETIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATETIME, 0); + } + public TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME, 0); + } + public TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMESTAMP, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_getFormatType; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitGetFormatType) { + return visitor.visitGetFormatType(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ExtractFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EXTRACT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EXTRACT, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public datetimePart(): DatetimePartContext { + return this.getRuleContext(0, DatetimePartContext)!; + } + public FROM(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.FROM, 0)!; + } + public functionArg(): FunctionArgContext { + return this.getRuleContext(0, FunctionArgContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_extractFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitExtractFunction) { + return visitor.visitExtractFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SimpleDateTimePartContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MICROSECOND, 0); + } + public SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SECOND, 0); + } + public MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE, 0); + } + public HOUR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR, 0); + } + public DAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY, 0); + } + public WEEK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WEEK, 0); + } + public MONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MONTH, 0); + } + public QUARTER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUARTER, 0); + } + public YEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.YEAR, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_simpleDateTimePart; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSimpleDateTimePart) { + return visitor.visitSimpleDateTimePart(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ComplexDateTimePartContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public SECOND_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SECOND_MICROSECOND, 0); + } + public MINUTE_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE_MICROSECOND, 0); + } + public MINUTE_SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE_SECOND, 0); + } + public HOUR_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_MICROSECOND, 0); + } + public HOUR_SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_SECOND, 0); + } + public HOUR_MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_MINUTE, 0); + } + public DAY_MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_MICROSECOND, 0); + } + public DAY_SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_SECOND, 0); + } + public DAY_MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_MINUTE, 0); + } + public DAY_HOUR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_HOUR, 0); + } + public YEAR_MONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.YEAR_MONTH, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_complexDateTimePart; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitComplexDateTimePart) { + return visitor.visitComplexDateTimePart(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DatetimePartContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public simpleDateTimePart(): SimpleDateTimePartContext | null { + return this.getRuleContext(0, SimpleDateTimePartContext); + } + public complexDateTimePart(): ComplexDateTimePartContext | null { + return this.getRuleContext(0, ComplexDateTimePartContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_datetimePart; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDatetimePart) { + return visitor.visitDatetimePart(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class HighlightFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public HIGHLIGHT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.HIGHLIGHT, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public relevanceField(): RelevanceFieldContext { + return this.getRuleContext(0, RelevanceFieldContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public highlightArg(): HighlightArgContext[]; + public highlightArg(i: number): HighlightArgContext | null; + public highlightArg(i?: number): HighlightArgContext[] | HighlightArgContext | null { + if (i === undefined) { + return this.getRuleContexts(HighlightArgContext); + } + + return this.getRuleContext(i, HighlightArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_highlightFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitHighlightFunction) { + return visitor.visitHighlightFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class PositionFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public POSITION(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.POSITION, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public functionArg(): FunctionArgContext[]; + public functionArg(i: number): FunctionArgContext | null; + public functionArg(i?: number): FunctionArgContext[] | FunctionArgContext | null { + if (i === undefined) { + return this.getRuleContexts(FunctionArgContext); + } + + return this.getRuleContext(i, FunctionArgContext); + } + public IN(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.IN, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_positionFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitPositionFunction) { + return visitor.visitPositionFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class MatchQueryAltSyntaxFunctionContext extends antlr.ParserRuleContext { + public _field?: RelevanceFieldContext; + public _query?: RelevanceQueryContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public MATCH_QUERY(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.MATCH_QUERY, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public relevanceField(): RelevanceFieldContext { + return this.getRuleContext(0, RelevanceFieldContext)!; + } + public relevanceQuery(): RelevanceQueryContext { + return this.getRuleContext(0, RelevanceQueryContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_matchQueryAltSyntaxFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitMatchQueryAltSyntaxFunction) { + return visitor.visitMatchQueryAltSyntaxFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ScalarFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public mathematicalFunctionName(): MathematicalFunctionNameContext | null { + return this.getRuleContext(0, MathematicalFunctionNameContext); + } + public dateTimeFunctionName(): DateTimeFunctionNameContext | null { + return this.getRuleContext(0, DateTimeFunctionNameContext); + } + public textFunctionName(): TextFunctionNameContext | null { + return this.getRuleContext(0, TextFunctionNameContext); + } + public flowControlFunctionName(): FlowControlFunctionNameContext | null { + return this.getRuleContext(0, FlowControlFunctionNameContext); + } + public systemFunctionName(): SystemFunctionNameContext | null { + return this.getRuleContext(0, SystemFunctionNameContext); + } + public nestedFunctionName(): NestedFunctionNameContext | null { + return this.getRuleContext(0, NestedFunctionNameContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_scalarFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitScalarFunctionName) { + return visitor.visitScalarFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SpecificFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_specificFunction; + } + public override copyFrom(ctx: SpecificFunctionContext): void { + super.copyFrom(ctx); + } +} +export class CaseFunctionCallContext extends SpecificFunctionContext { + public _elseArg?: FunctionArgContext; + public constructor(ctx: SpecificFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public CASE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.CASE, 0)!; + } + public expression(): ExpressionContext | null { + return this.getRuleContext(0, ExpressionContext); + } + public END(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.END, 0)!; + } + public caseFuncAlternative(): CaseFuncAlternativeContext[]; + public caseFuncAlternative(i: number): CaseFuncAlternativeContext | null; + public caseFuncAlternative(i?: number): CaseFuncAlternativeContext[] | CaseFuncAlternativeContext | null { + if (i === undefined) { + return this.getRuleContexts(CaseFuncAlternativeContext); + } + + return this.getRuleContext(i, CaseFuncAlternativeContext); + } + public ELSE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ELSE, 0); + } + public functionArg(): FunctionArgContext | null { + return this.getRuleContext(0, FunctionArgContext); + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitCaseFunctionCall) { + return visitor.visitCaseFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class DataTypeFunctionCallContext extends SpecificFunctionContext { + public constructor(ctx: SpecificFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public CAST(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.CAST, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public AS(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.AS, 0)!; + } + public convertedDataType(): ConvertedDataTypeContext { + return this.getRuleContext(0, ConvertedDataTypeContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDataTypeFunctionCall) { + return visitor.visitDataTypeFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public noFieldRelevanceFunction(): NoFieldRelevanceFunctionContext | null { + return this.getRuleContext(0, NoFieldRelevanceFunctionContext); + } + public singleFieldRelevanceFunction(): SingleFieldRelevanceFunctionContext | null { + return this.getRuleContext(0, SingleFieldRelevanceFunctionContext); + } + public multiFieldRelevanceFunction(): MultiFieldRelevanceFunctionContext | null { + return this.getRuleContext(0, MultiFieldRelevanceFunctionContext); + } + public altSingleFieldRelevanceFunction(): AltSingleFieldRelevanceFunctionContext | null { + return this.getRuleContext(0, AltSingleFieldRelevanceFunctionContext); + } + public altMultiFieldRelevanceFunction(): AltMultiFieldRelevanceFunctionContext | null { + return this.getRuleContext(0, AltMultiFieldRelevanceFunctionContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceFunction) { + return visitor.visitRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ScoreRelevanceFunctionContext extends antlr.ParserRuleContext { + public _weight?: RelevanceFieldWeightContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public scoreRelevanceFunctionName(): ScoreRelevanceFunctionNameContext { + return this.getRuleContext(0, ScoreRelevanceFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public relevanceFunction(): RelevanceFunctionContext { + return this.getRuleContext(0, RelevanceFunctionContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public COMMA(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COMMA, 0); + } + public relevanceFieldWeight(): RelevanceFieldWeightContext | null { + return this.getRuleContext(0, RelevanceFieldWeightContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_scoreRelevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitScoreRelevanceFunction) { + return visitor.visitScoreRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class NoFieldRelevanceFunctionContext extends antlr.ParserRuleContext { + public _query?: RelevanceQueryContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public noFieldRelevanceFunctionName(): NoFieldRelevanceFunctionNameContext { + return this.getRuleContext(0, NoFieldRelevanceFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public relevanceQuery(): RelevanceQueryContext { + return this.getRuleContext(0, RelevanceQueryContext)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public relevanceArg(): RelevanceArgContext[]; + public relevanceArg(i: number): RelevanceArgContext | null; + public relevanceArg(i?: number): RelevanceArgContext[] | RelevanceArgContext | null { + if (i === undefined) { + return this.getRuleContexts(RelevanceArgContext); + } + + return this.getRuleContext(i, RelevanceArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_noFieldRelevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNoFieldRelevanceFunction) { + return visitor.visitNoFieldRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SingleFieldRelevanceFunctionContext extends antlr.ParserRuleContext { + public _field?: RelevanceFieldContext; + public _query?: RelevanceQueryContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public singleFieldRelevanceFunctionName(): SingleFieldRelevanceFunctionNameContext { + return this.getRuleContext(0, SingleFieldRelevanceFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public relevanceField(): RelevanceFieldContext { + return this.getRuleContext(0, RelevanceFieldContext)!; + } + public relevanceQuery(): RelevanceQueryContext { + return this.getRuleContext(0, RelevanceQueryContext)!; + } + public relevanceArg(): RelevanceArgContext[]; + public relevanceArg(i: number): RelevanceArgContext | null; + public relevanceArg(i?: number): RelevanceArgContext[] | RelevanceArgContext | null { + if (i === undefined) { + return this.getRuleContexts(RelevanceArgContext); + } + + return this.getRuleContext(i, RelevanceArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_singleFieldRelevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSingleFieldRelevanceFunction) { + return visitor.visitSingleFieldRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class MultiFieldRelevanceFunctionContext extends antlr.ParserRuleContext { + public _field?: RelevanceFieldAndWeightContext; + public _query?: RelevanceQueryContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public multiFieldRelevanceFunctionName(): MultiFieldRelevanceFunctionNameContext { + return this.getRuleContext(0, MultiFieldRelevanceFunctionNameContext)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public LT_SQR_PRTHS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LT_SQR_PRTHS, 0); + } + public RT_SQR_PRTHS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RT_SQR_PRTHS, 0); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public relevanceFieldAndWeight(): RelevanceFieldAndWeightContext[]; + public relevanceFieldAndWeight(i: number): RelevanceFieldAndWeightContext | null; + public relevanceFieldAndWeight(i?: number): RelevanceFieldAndWeightContext[] | RelevanceFieldAndWeightContext | null { + if (i === undefined) { + return this.getRuleContexts(RelevanceFieldAndWeightContext); + } + + return this.getRuleContext(i, RelevanceFieldAndWeightContext); + } + public relevanceQuery(): RelevanceQueryContext | null { + return this.getRuleContext(0, RelevanceQueryContext); + } + public relevanceArg(): RelevanceArgContext[]; + public relevanceArg(i: number): RelevanceArgContext | null; + public relevanceArg(i?: number): RelevanceArgContext[] | RelevanceArgContext | null { + if (i === undefined) { + return this.getRuleContexts(RelevanceArgContext); + } + + return this.getRuleContext(i, RelevanceArgContext); + } + public alternateMultiMatchQuery(): AlternateMultiMatchQueryContext | null { + return this.getRuleContext(0, AlternateMultiMatchQueryContext); + } + public alternateMultiMatchField(): AlternateMultiMatchFieldContext | null { + return this.getRuleContext(0, AlternateMultiMatchFieldContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_multiFieldRelevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitMultiFieldRelevanceFunction) { + return visitor.visitMultiFieldRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AltSingleFieldRelevanceFunctionContext extends antlr.ParserRuleContext { + public _field?: RelevanceFieldContext; + public _altSyntaxFunctionName?: AltSingleFieldRelevanceFunctionNameContext; + public _query?: RelevanceQueryContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public relevanceField(): RelevanceFieldContext { + return this.getRuleContext(0, RelevanceFieldContext)!; + } + public altSingleFieldRelevanceFunctionName(): AltSingleFieldRelevanceFunctionNameContext { + return this.getRuleContext(0, AltSingleFieldRelevanceFunctionNameContext)!; + } + public relevanceQuery(): RelevanceQueryContext { + return this.getRuleContext(0, RelevanceQueryContext)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public relevanceArg(): RelevanceArgContext[]; + public relevanceArg(i: number): RelevanceArgContext | null; + public relevanceArg(i?: number): RelevanceArgContext[] | RelevanceArgContext | null { + if (i === undefined) { + return this.getRuleContexts(RelevanceArgContext); + } + + return this.getRuleContext(i, RelevanceArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_altSingleFieldRelevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAltSingleFieldRelevanceFunction) { + return visitor.visitAltSingleFieldRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AltMultiFieldRelevanceFunctionContext extends antlr.ParserRuleContext { + public _field?: RelevanceFieldContext; + public _altSyntaxFunctionName?: AltMultiFieldRelevanceFunctionNameContext; + public _query?: RelevanceQueryContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public relevanceField(): RelevanceFieldContext { + return this.getRuleContext(0, RelevanceFieldContext)!; + } + public altMultiFieldRelevanceFunctionName(): AltMultiFieldRelevanceFunctionNameContext { + return this.getRuleContext(0, AltMultiFieldRelevanceFunctionNameContext)!; + } + public relevanceQuery(): RelevanceQueryContext { + return this.getRuleContext(0, RelevanceQueryContext)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public relevanceArg(): RelevanceArgContext[]; + public relevanceArg(i: number): RelevanceArgContext | null; + public relevanceArg(i?: number): RelevanceArgContext[] | RelevanceArgContext | null { + if (i === undefined) { + return this.getRuleContexts(RelevanceArgContext); + } + + return this.getRuleContext(i, RelevanceArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_altMultiFieldRelevanceFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAltMultiFieldRelevanceFunction) { + return visitor.visitAltMultiFieldRelevanceFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ConvertedDataTypeContext extends antlr.ParserRuleContext { + public _typeName?: Token | null; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE, 0); + } + public TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME, 0); + } + public TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMESTAMP, 0); + } + public INT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.INT, 0); + } + public INTEGER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.INTEGER, 0); + } + public DOUBLE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DOUBLE, 0); + } + public LONG(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LONG, 0); + } + public FLOAT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FLOAT, 0); + } + public STRING(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STRING, 0); + } + public BOOLEAN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.BOOLEAN, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_convertedDataType; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitConvertedDataType) { + return visitor.visitConvertedDataType(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class CaseFuncAlternativeContext extends antlr.ParserRuleContext { + public _condition?: FunctionArgContext; + public _consequent?: FunctionArgContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public WHEN(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.WHEN, 0)!; + } + public THEN(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.THEN, 0)!; + } + public functionArg(): FunctionArgContext[]; + public functionArg(i: number): FunctionArgContext | null; + public functionArg(i?: number): FunctionArgContext[] | FunctionArgContext | null { + if (i === undefined) { + return this.getRuleContexts(FunctionArgContext); + } + + return this.getRuleContext(i, FunctionArgContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_caseFuncAlternative; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitCaseFuncAlternative) { + return visitor.visitCaseFuncAlternative(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AggregateFunctionContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_aggregateFunction; + } + public override copyFrom(ctx: AggregateFunctionContext): void { + super.copyFrom(ctx); + } +} +export class DistinctCountFunctionCallContext extends AggregateFunctionContext { + public constructor(ctx: AggregateFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public COUNT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.COUNT, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public DISTINCT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.DISTINCT, 0)!; + } + public functionArg(): FunctionArgContext { + return this.getRuleContext(0, FunctionArgContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDistinctCountFunctionCall) { + return visitor.visitDistinctCountFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class PercentileApproxFunctionCallContext extends AggregateFunctionContext { + public constructor(ctx: AggregateFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public percentileApproxFunction(): PercentileApproxFunctionContext { + return this.getRuleContext(0, PercentileApproxFunctionContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitPercentileApproxFunctionCall) { + return visitor.visitPercentileApproxFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class CountStarFunctionCallContext extends AggregateFunctionContext { + public constructor(ctx: AggregateFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public COUNT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.COUNT, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public STAR(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.STAR, 0)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitCountStarFunctionCall) { + return visitor.visitCountStarFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class RegularAggregateFunctionCallContext extends AggregateFunctionContext { + public _functionName?: AggregationFunctionNameContext; + public constructor(ctx: AggregateFunctionContext) { + super(ctx.parent, ctx.invokingState); + super.copyFrom(ctx); + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public functionArg(): FunctionArgContext { + return this.getRuleContext(0, FunctionArgContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public aggregationFunctionName(): AggregationFunctionNameContext { + return this.getRuleContext(0, AggregationFunctionNameContext)!; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRegularAggregateFunctionCall) { + return visitor.visitRegularAggregateFunctionCall(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class PercentileApproxFunctionContext extends antlr.ParserRuleContext { + public _aggField?: FunctionArgContext; + public _percent?: NumericLiteralContext; + public _compression?: NumericLiteralContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public PERCENTILE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PERCENTILE, 0); + } + public PERCENTILE_APPROX(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PERCENTILE_APPROX, 0); + } + public functionArg(): FunctionArgContext { + return this.getRuleContext(0, FunctionArgContext)!; + } + public numericLiteral(): NumericLiteralContext[]; + public numericLiteral(i: number): NumericLiteralContext | null; + public numericLiteral(i?: number): NumericLiteralContext[] | NumericLiteralContext | null { + if (i === undefined) { + return this.getRuleContexts(NumericLiteralContext); + } + + return this.getRuleContext(i, NumericLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_percentileApproxFunction; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitPercentileApproxFunction) { + return visitor.visitPercentileApproxFunction(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class FilterClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public FILTER(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.FILTER, 0)!; + } + public LR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.LR_BRACKET, 0)!; + } + public WHERE(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.WHERE, 0)!; + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public RR_BRACKET(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.RR_BRACKET, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_filterClause; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFilterClause) { + return visitor.visitFilterClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AggregationFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public AVG(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.AVG, 0); + } + public COUNT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COUNT, 0); + } + public SUM(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUM, 0); + } + public MIN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MIN, 0); + } + public MAX(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MAX, 0); + } + public VAR_POP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.VAR_POP, 0); + } + public VAR_SAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.VAR_SAMP, 0); + } + public VARIANCE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.VARIANCE, 0); + } + public STD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STD, 0); + } + public STDDEV(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STDDEV, 0); + } + public STDDEV_POP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STDDEV_POP, 0); + } + public STDDEV_SAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STDDEV_SAMP, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_aggregationFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAggregationFunctionName) { + return visitor.visitAggregationFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class MathematicalFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ABS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ABS, 0); + } + public CBRT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CBRT, 0); + } + public CEIL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CEIL, 0); + } + public CEILING(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CEILING, 0); + } + public CONV(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CONV, 0); + } + public CRC32(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CRC32, 0); + } + public E(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.E, 0); + } + public EXP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.EXP, 0); + } + public EXPM1(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.EXPM1, 0); + } + public FLOOR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FLOOR, 0); + } + public LN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LN, 0); + } + public LOG(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOG, 0); + } + public LOG10(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOG10, 0); + } + public LOG2(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOG2, 0); + } + public MOD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MOD, 0); + } + public PI(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PI, 0); + } + public POW(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.POW, 0); + } + public POWER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.POWER, 0); + } + public RAND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RAND, 0); + } + public RINT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RINT, 0); + } + public ROUND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ROUND, 0); + } + public SIGN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SIGN, 0); + } + public SIGNUM(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SIGNUM, 0); + } + public SQRT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SQRT, 0); + } + public TRUNCATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TRUNCATE, 0); + } + public trigonometricFunctionName(): TrigonometricFunctionNameContext | null { + return this.getRuleContext(0, TrigonometricFunctionNameContext); + } + public arithmeticFunctionName(): ArithmeticFunctionNameContext | null { + return this.getRuleContext(0, ArithmeticFunctionNameContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_mathematicalFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitMathematicalFunctionName) { + return visitor.visitMathematicalFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TrigonometricFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ACOS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ACOS, 0); + } + public ASIN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ASIN, 0); + } + public ATAN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ATAN, 0); + } + public ATAN2(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ATAN2, 0); + } + public COS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COS, 0); + } + public COSH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COSH, 0); + } + public COT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COT, 0); + } + public DEGREES(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DEGREES, 0); + } + public RADIANS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RADIANS, 0); + } + public SIN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SIN, 0); + } + public SINH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SINH, 0); + } + public TAN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TAN, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_trigonometricFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTrigonometricFunctionName) { + return visitor.visitTrigonometricFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ArithmeticFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ADD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ADD, 0); + } + public SUBTRACT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUBTRACT, 0); + } + public MULTIPLY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MULTIPLY, 0); + } + public DIVIDE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DIVIDE, 0); + } + public MOD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MOD, 0); + } + public MODULUS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MODULUS, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_arithmeticFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitArithmeticFunctionName) { + return visitor.visitArithmeticFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class DateTimeFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public datetimeConstantLiteral(): DatetimeConstantLiteralContext | null { + return this.getRuleContext(0, DatetimeConstantLiteralContext); + } + public ADDDATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ADDDATE, 0); + } + public ADDTIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ADDTIME, 0); + } + public CONVERT_TZ(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CONVERT_TZ, 0); + } + public CURDATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CURDATE, 0); + } + public CURTIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CURTIME, 0); + } + public DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE, 0); + } + public DATE_ADD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE_ADD, 0); + } + public DATE_FORMAT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE_FORMAT, 0); + } + public DATE_SUB(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATE_SUB, 0); + } + public DATEDIFF(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATEDIFF, 0); + } + public DATETIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DATETIME, 0); + } + public DAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY, 0); + } + public DAYNAME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAYNAME, 0); + } + public DAYOFMONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAYOFMONTH, 0); + } + public DAY_OF_MONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_OF_MONTH, 0); + } + public DAYOFWEEK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAYOFWEEK, 0); + } + public DAYOFYEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAYOFYEAR, 0); + } + public DAY_OF_YEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_OF_YEAR, 0); + } + public DAY_OF_WEEK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DAY_OF_WEEK, 0); + } + public FROM_DAYS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FROM_DAYS, 0); + } + public FROM_UNIXTIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FROM_UNIXTIME, 0); + } + public HOUR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR, 0); + } + public HOUR_OF_DAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HOUR_OF_DAY, 0); + } + public LAST_DAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LAST_DAY, 0); + } + public MAKEDATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MAKEDATE, 0); + } + public MAKETIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MAKETIME, 0); + } + public MICROSECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MICROSECOND, 0); + } + public MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE, 0); + } + public MINUTE_OF_DAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE_OF_DAY, 0); + } + public MINUTE_OF_HOUR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINUTE_OF_HOUR, 0); + } + public MONTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MONTH, 0); + } + public MONTHNAME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MONTHNAME, 0); + } + public MONTH_OF_YEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MONTH_OF_YEAR, 0); + } + public NOW(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NOW, 0); + } + public PERIOD_ADD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PERIOD_ADD, 0); + } + public PERIOD_DIFF(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PERIOD_DIFF, 0); + } + public QUARTER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUARTER, 0); + } + public SEC_TO_TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SEC_TO_TIME, 0); + } + public SECOND(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SECOND, 0); + } + public SECOND_OF_MINUTE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SECOND_OF_MINUTE, 0); + } + public SUBDATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUBDATE, 0); + } + public SUBTIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUBTIME, 0); + } + public SYSDATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SYSDATE, 0); + } + public STR_TO_DATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STR_TO_DATE, 0); + } + public TIME(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME, 0); + } + public TIME_FORMAT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME_FORMAT, 0); + } + public TIME_TO_SEC(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME_TO_SEC, 0); + } + public TIMEDIFF(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMEDIFF, 0); + } + public TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIMESTAMP, 0); + } + public TO_DAYS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TO_DAYS, 0); + } + public TO_SECONDS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TO_SECONDS, 0); + } + public UNIX_TIMESTAMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.UNIX_TIMESTAMP, 0); + } + public WEEK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WEEK, 0); + } + public WEEKDAY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WEEKDAY, 0); + } + public WEEK_OF_YEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WEEK_OF_YEAR, 0); + } + public WEEKOFYEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WEEKOFYEAR, 0); + } + public YEAR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.YEAR, 0); + } + public YEARWEEK(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.YEARWEEK, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_dateTimeFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitDateTimeFunctionName) { + return visitor.visitDateTimeFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TextFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public SUBSTR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUBSTR, 0); + } + public SUBSTRING(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUBSTRING, 0); + } + public TRIM(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TRIM, 0); + } + public LTRIM(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LTRIM, 0); + } + public RTRIM(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RTRIM, 0); + } + public LOWER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOWER, 0); + } + public UPPER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.UPPER, 0); + } + public CONCAT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CONCAT, 0); + } + public CONCAT_WS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CONCAT_WS, 0); + } + public LENGTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LENGTH, 0); + } + public STRCMP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.STRCMP, 0); + } + public RIGHT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RIGHT, 0); + } + public LEFT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LEFT, 0); + } + public ASCII(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ASCII, 0); + } + public LOCATE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOCATE, 0); + } + public REPLACE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.REPLACE, 0); + } + public REVERSE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.REVERSE, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_textFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTextFunctionName) { + return visitor.visitTextFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class FlowControlFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public IF(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.IF, 0); + } + public IFNULL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.IFNULL, 0); + } + public NULLIF(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.NULLIF, 0); + } + public ISNULL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ISNULL, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_flowControlFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFlowControlFunctionName) { + return visitor.visitFlowControlFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class NoFieldRelevanceFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public QUERY(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.QUERY, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_noFieldRelevanceFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNoFieldRelevanceFunctionName) { + return visitor.visitNoFieldRelevanceFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SystemFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public TYPEOF(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.TYPEOF, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_systemFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSystemFunctionName) { + return visitor.visitSystemFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class NestedFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public NESTED(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.NESTED, 0)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_nestedFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitNestedFunctionName) { + return visitor.visitNestedFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ScoreRelevanceFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public SCORE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SCORE, 0); + } + public SCOREQUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SCOREQUERY, 0); + } + public SCORE_QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SCORE_QUERY, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_scoreRelevanceFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitScoreRelevanceFunctionName) { + return visitor.visitScoreRelevanceFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SingleFieldRelevanceFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MATCH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH, 0); + } + public MATCHQUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCHQUERY, 0); + } + public MATCH_QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH_QUERY, 0); + } + public MATCH_PHRASE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH_PHRASE, 0); + } + public MATCHPHRASE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCHPHRASE, 0); + } + public MATCHPHRASEQUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCHPHRASEQUERY, 0); + } + public MATCH_BOOL_PREFIX(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH_BOOL_PREFIX, 0); + } + public MATCH_PHRASE_PREFIX(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH_PHRASE_PREFIX, 0); + } + public WILDCARD_QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WILDCARD_QUERY, 0); + } + public WILDCARDQUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.WILDCARDQUERY, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_singleFieldRelevanceFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitSingleFieldRelevanceFunctionName) { + return visitor.visitSingleFieldRelevanceFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class MultiFieldRelevanceFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MULTI_MATCH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MULTI_MATCH, 0); + } + public MULTIMATCH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MULTIMATCH, 0); + } + public MULTIMATCHQUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MULTIMATCHQUERY, 0); + } + public SIMPLE_QUERY_STRING(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SIMPLE_QUERY_STRING, 0); + } + public QUERY_STRING(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUERY_STRING, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_multiFieldRelevanceFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitMultiFieldRelevanceFunctionName) { + return visitor.visitMultiFieldRelevanceFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AltSingleFieldRelevanceFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MATCH_QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH_QUERY, 0); + } + public MATCHQUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCHQUERY, 0); + } + public MATCH_PHRASE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCH_PHRASE, 0); + } + public MATCHPHRASE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MATCHPHRASE, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_altSingleFieldRelevanceFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAltSingleFieldRelevanceFunctionName) { + return visitor.visitAltSingleFieldRelevanceFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AltMultiFieldRelevanceFunctionNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MULTI_MATCH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MULTI_MATCH, 0); + } + public MULTIMATCH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MULTIMATCH, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_altMultiFieldRelevanceFunctionName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAltMultiFieldRelevanceFunctionName) { + return visitor.visitAltMultiFieldRelevanceFunctionName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class FunctionArgsContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public functionArg(): FunctionArgContext[]; + public functionArg(i: number): FunctionArgContext | null; + public functionArg(i?: number): FunctionArgContext[] | FunctionArgContext | null { + if (i === undefined) { + return this.getRuleContexts(FunctionArgContext); + } + + return this.getRuleContext(i, FunctionArgContext); + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.COMMA); + } else { + return this.getToken(OpenSearchSQLParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_functionArgs; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFunctionArgs) { + return visitor.visitFunctionArgs(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class FunctionArgContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public expression(): ExpressionContext { + return this.getRuleContext(0, ExpressionContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_functionArg; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitFunctionArg) { + return visitor.visitFunctionArg(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceArgContext extends antlr.ParserRuleContext { + public _argName?: StringLiteralContext; + public _argVal?: RelevanceArgValueContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public relevanceArgName(): RelevanceArgNameContext | null { + return this.getRuleContext(0, RelevanceArgNameContext); + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public relevanceArgValue(): RelevanceArgValueContext { + return this.getRuleContext(0, RelevanceArgValueContext)!; + } + public stringLiteral(): StringLiteralContext | null { + return this.getRuleContext(0, StringLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceArg; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceArg) { + return visitor.visitRelevanceArg(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class HighlightArgContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public highlightArgName(): HighlightArgNameContext { + return this.getRuleContext(0, HighlightArgNameContext)!; + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public highlightArgValue(): HighlightArgValueContext { + return this.getRuleContext(0, HighlightArgValueContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_highlightArg; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitHighlightArg) { + return visitor.visitHighlightArg(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceArgNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ALLOW_LEADING_WILDCARD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ALLOW_LEADING_WILDCARD, 0); + } + public ANALYZER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ANALYZER, 0); + } + public ANALYZE_WILDCARD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ANALYZE_WILDCARD, 0); + } + public AUTO_GENERATE_SYNONYMS_PHRASE_QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.AUTO_GENERATE_SYNONYMS_PHRASE_QUERY, 0); + } + public BOOST(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.BOOST, 0); + } + public CASE_INSENSITIVE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CASE_INSENSITIVE, 0); + } + public CUTOFF_FREQUENCY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.CUTOFF_FREQUENCY, 0); + } + public DEFAULT_FIELD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DEFAULT_FIELD, 0); + } + public DEFAULT_OPERATOR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DEFAULT_OPERATOR, 0); + } + public ENABLE_POSITION_INCREMENTS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ENABLE_POSITION_INCREMENTS, 0); + } + public ESCAPE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ESCAPE, 0); + } + public FIELDS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FIELDS, 0); + } + public FLAGS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FLAGS, 0); + } + public FUZZINESS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FUZZINESS, 0); + } + public FUZZY_MAX_EXPANSIONS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FUZZY_MAX_EXPANSIONS, 0); + } + public FUZZY_PREFIX_LENGTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FUZZY_PREFIX_LENGTH, 0); + } + public FUZZY_REWRITE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FUZZY_REWRITE, 0); + } + public FUZZY_TRANSPOSITIONS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FUZZY_TRANSPOSITIONS, 0); + } + public LENIENT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LENIENT, 0); + } + public LOW_FREQ_OPERATOR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LOW_FREQ_OPERATOR, 0); + } + public MAX_DETERMINIZED_STATES(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MAX_DETERMINIZED_STATES, 0); + } + public MAX_EXPANSIONS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MAX_EXPANSIONS, 0); + } + public MINIMUM_SHOULD_MATCH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MINIMUM_SHOULD_MATCH, 0); + } + public OPERATOR(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.OPERATOR, 0); + } + public PHRASE_SLOP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PHRASE_SLOP, 0); + } + public PREFIX_LENGTH(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.PREFIX_LENGTH, 0); + } + public QUOTE_ANALYZER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUOTE_ANALYZER, 0); + } + public QUOTE_FIELD_SUFFIX(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUOTE_FIELD_SUFFIX, 0); + } + public REWRITE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.REWRITE, 0); + } + public SLOP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SLOP, 0); + } + public TIE_BREAKER(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIE_BREAKER, 0); + } + public TIME_ZONE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TIME_ZONE, 0); + } + public TYPE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TYPE, 0); + } + public ZERO_TERMS_QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ZERO_TERMS_QUERY, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceArgName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceArgName) { + return visitor.visitRelevanceArgName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class HighlightArgNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public HIGHLIGHT_POST_TAGS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HIGHLIGHT_POST_TAGS, 0); + } + public HIGHLIGHT_PRE_TAGS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.HIGHLIGHT_PRE_TAGS, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_highlightArgName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitHighlightArgName) { + return visitor.visitHighlightArgName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceFieldAndWeightContext extends antlr.ParserRuleContext { + public _field?: RelevanceFieldContext; + public _weight?: RelevanceFieldWeightContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public relevanceField(): RelevanceFieldContext { + return this.getRuleContext(0, RelevanceFieldContext)!; + } + public relevanceFieldWeight(): RelevanceFieldWeightContext | null { + return this.getRuleContext(0, RelevanceFieldWeightContext); + } + public BIT_XOR_OP(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.BIT_XOR_OP, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceFieldAndWeight; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceFieldAndWeight) { + return visitor.visitRelevanceFieldAndWeight(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceFieldWeightContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public numericLiteral(): NumericLiteralContext { + return this.getRuleContext(0, NumericLiteralContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceFieldWeight; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceFieldWeight) { + return visitor.visitRelevanceFieldWeight(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceFieldContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public qualifiedName(): QualifiedNameContext | null { + return this.getRuleContext(0, QualifiedNameContext); + } + public stringLiteral(): StringLiteralContext | null { + return this.getRuleContext(0, StringLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceField; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceField) { + return visitor.visitRelevanceField(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceQueryContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public relevanceArgValue(): RelevanceArgValueContext { + return this.getRuleContext(0, RelevanceArgValueContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceQuery; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceQuery) { + return visitor.visitRelevanceQuery(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class RelevanceArgValueContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public qualifiedName(): QualifiedNameContext | null { + return this.getRuleContext(0, QualifiedNameContext); + } + public constant(): ConstantContext | null { + return this.getRuleContext(0, ConstantContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_relevanceArgValue; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitRelevanceArgValue) { + return visitor.visitRelevanceArgValue(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class HighlightArgValueContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_highlightArgValue; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitHighlightArgValue) { + return visitor.visitHighlightArgValue(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AlternateMultiMatchArgNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public FIELDS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FIELDS, 0); + } + public QUERY(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.QUERY, 0); + } + public stringLiteral(): StringLiteralContext | null { + return this.getRuleContext(0, StringLiteralContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_alternateMultiMatchArgName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAlternateMultiMatchArgName) { + return visitor.visitAlternateMultiMatchArgName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AlternateMultiMatchQueryContext extends antlr.ParserRuleContext { + public _argName?: AlternateMultiMatchArgNameContext; + public _argVal?: RelevanceArgValueContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public alternateMultiMatchArgName(): AlternateMultiMatchArgNameContext { + return this.getRuleContext(0, AlternateMultiMatchArgNameContext)!; + } + public relevanceArgValue(): RelevanceArgValueContext { + return this.getRuleContext(0, RelevanceArgValueContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_alternateMultiMatchQuery; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAlternateMultiMatchQuery) { + return visitor.visitAlternateMultiMatchQuery(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AlternateMultiMatchFieldContext extends antlr.ParserRuleContext { + public _argName?: AlternateMultiMatchArgNameContext; + public _argVal?: RelevanceArgValueContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EQUAL_SYMBOL(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0)!; + } + public alternateMultiMatchArgName(): AlternateMultiMatchArgNameContext { + return this.getRuleContext(0, AlternateMultiMatchArgNameContext)!; + } + public relevanceArgValue(): RelevanceArgValueContext { + return this.getRuleContext(0, RelevanceArgValueContext)!; + } + public LT_SQR_PRTHS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LT_SQR_PRTHS, 0); + } + public RT_SQR_PRTHS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.RT_SQR_PRTHS, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_alternateMultiMatchField; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAlternateMultiMatchField) { + return visitor.visitAlternateMultiMatchField(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TableNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public qualifiedName(): QualifiedNameContext { + return this.getRuleContext(0, QualifiedNameContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_tableName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitTableName) { + return visitor.visitTableName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ColumnNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public qualifiedName(): QualifiedNameContext { + return this.getRuleContext(0, QualifiedNameContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_columnName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitColumnName) { + return visitor.visitColumnName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AllTupleFieldsContext extends antlr.ParserRuleContext { + public _path?: QualifiedNameContext; + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public DOT(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.DOT, 0)!; + } + public STAR(): antlr.TerminalNode { + return this.getToken(OpenSearchSQLParser.STAR, 0)!; + } + public qualifiedName(): QualifiedNameContext { + return this.getRuleContext(0, QualifiedNameContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_allTupleFields; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAllTupleFields) { + return visitor.visitAllTupleFields(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class AliasContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ident(): IdentContext { + return this.getRuleContext(0, IdentContext)!; + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_alias; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitAlias) { + return visitor.visitAlias(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class QualifiedNameContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ident(): IdentContext[]; + public ident(i: number): IdentContext | null; + public ident(i?: number): IdentContext[] | IdentContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentContext); + } + + return this.getRuleContext(i, IdentContext); + } + public DOT(): antlr.TerminalNode[]; + public DOT(i: number): antlr.TerminalNode | null; + public DOT(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(OpenSearchSQLParser.DOT); + } else { + return this.getToken(OpenSearchSQLParser.DOT, i); + } + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_qualifiedName; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitQualifiedName) { + return visitor.visitQualifiedName(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class IdentContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ID(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.ID, 0); + } + public DOT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.DOT, 0); + } + public BACKTICK_QUOTE_ID(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.BACKTICK_QUOTE_ID, 0); + } + public keywordsCanBeId(): KeywordsCanBeIdContext | null { + return this.getRuleContext(0, KeywordsCanBeIdContext); + } + public scalarFunctionName(): ScalarFunctionNameContext | null { + return this.getRuleContext(0, ScalarFunctionNameContext); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_ident; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitIdent) { + return visitor.visitIdent(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class KeywordsCanBeIdContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public FULL(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FULL, 0); + } + public FIELD(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FIELD, 0); + } + public D(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.D, 0); + } + public T(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.T, 0); + } + public TS(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TS, 0); + } + public COUNT(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.COUNT, 0); + } + public SUM(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.SUM, 0); + } + public AVG(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.AVG, 0); + } + public MAX(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MAX, 0); + } + public MIN(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.MIN, 0); + } + public FIRST(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.FIRST, 0); + } + public LAST(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.LAST, 0); + } + public TYPE(): antlr.TerminalNode | null { + return this.getToken(OpenSearchSQLParser.TYPE, 0); + } + public override get ruleIndex(): number { + return OpenSearchSQLParser.RULE_keywordsCanBeId; + } + public override accept(visitor: OpenSearchSQLParserVisitor): Result | null { + if (visitor.visitKeywordsCanBeId) { + return visitor.visitKeywordsCanBeId(this); + } else { + return visitor.visitChildren(this); + } + } +} diff --git a/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParserVisitor.ts b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParserVisitor.ts new file mode 100644 index 00000000000..a6e7dcc4bf4 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/.generated/OpenSearchSQLParserVisitor.ts @@ -0,0 +1,1121 @@ +// Generated from ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 by ANTLR 4.13.1 + +import { AbstractParseTreeVisitor } from "antlr4ng"; + + +import { RootContext } from "./OpenSearchSQLParser.js"; +import { SqlStatementContext } from "./OpenSearchSQLParser.js"; +import { DmlStatementContext } from "./OpenSearchSQLParser.js"; +import { SimpleSelectContext } from "./OpenSearchSQLParser.js"; +import { AdminStatementContext } from "./OpenSearchSQLParser.js"; +import { ShowStatementContext } from "./OpenSearchSQLParser.js"; +import { DescribeStatementContext } from "./OpenSearchSQLParser.js"; +import { ColumnFilterContext } from "./OpenSearchSQLParser.js"; +import { TableFilterContext } from "./OpenSearchSQLParser.js"; +import { ShowDescribePatternContext } from "./OpenSearchSQLParser.js"; +import { CompatibleIDContext } from "./OpenSearchSQLParser.js"; +import { QuerySpecificationContext } from "./OpenSearchSQLParser.js"; +import { SelectClauseContext } from "./OpenSearchSQLParser.js"; +import { SelectSpecContext } from "./OpenSearchSQLParser.js"; +import { SelectElementsContext } from "./OpenSearchSQLParser.js"; +import { SelectElementContext } from "./OpenSearchSQLParser.js"; +import { FromClauseContext } from "./OpenSearchSQLParser.js"; +import { TableAsRelationContext } from "./OpenSearchSQLParser.js"; +import { SubqueryAsRelationContext } from "./OpenSearchSQLParser.js"; +import { WhereClauseContext } from "./OpenSearchSQLParser.js"; +import { GroupByClauseContext } from "./OpenSearchSQLParser.js"; +import { GroupByElementsContext } from "./OpenSearchSQLParser.js"; +import { GroupByElementContext } from "./OpenSearchSQLParser.js"; +import { HavingClauseContext } from "./OpenSearchSQLParser.js"; +import { OrderByClauseContext } from "./OpenSearchSQLParser.js"; +import { OrderByElementContext } from "./OpenSearchSQLParser.js"; +import { LimitClauseContext } from "./OpenSearchSQLParser.js"; +import { WindowFunctionClauseContext } from "./OpenSearchSQLParser.js"; +import { ScalarWindowFunctionContext } from "./OpenSearchSQLParser.js"; +import { AggregateWindowFunctionContext } from "./OpenSearchSQLParser.js"; +import { OverClauseContext } from "./OpenSearchSQLParser.js"; +import { PartitionByClauseContext } from "./OpenSearchSQLParser.js"; +import { StringContext } from "./OpenSearchSQLParser.js"; +import { SignedDecimalContext } from "./OpenSearchSQLParser.js"; +import { SignedRealContext } from "./OpenSearchSQLParser.js"; +import { BooleanContext } from "./OpenSearchSQLParser.js"; +import { DatetimeContext } from "./OpenSearchSQLParser.js"; +import { IntervalContext } from "./OpenSearchSQLParser.js"; +import { NullContext } from "./OpenSearchSQLParser.js"; +import { DecimalLiteralContext } from "./OpenSearchSQLParser.js"; +import { NumericLiteralContext } from "./OpenSearchSQLParser.js"; +import { StringLiteralContext } from "./OpenSearchSQLParser.js"; +import { BooleanLiteralContext } from "./OpenSearchSQLParser.js"; +import { RealLiteralContext } from "./OpenSearchSQLParser.js"; +import { SignContext } from "./OpenSearchSQLParser.js"; +import { NullLiteralContext } from "./OpenSearchSQLParser.js"; +import { DatetimeLiteralContext } from "./OpenSearchSQLParser.js"; +import { DateLiteralContext } from "./OpenSearchSQLParser.js"; +import { TimeLiteralContext } from "./OpenSearchSQLParser.js"; +import { TimestampLiteralContext } from "./OpenSearchSQLParser.js"; +import { DatetimeConstantLiteralContext } from "./OpenSearchSQLParser.js"; +import { IntervalLiteralContext } from "./OpenSearchSQLParser.js"; +import { IntervalUnitContext } from "./OpenSearchSQLParser.js"; +import { OrExpressionContext } from "./OpenSearchSQLParser.js"; +import { AndExpressionContext } from "./OpenSearchSQLParser.js"; +import { NotExpressionContext } from "./OpenSearchSQLParser.js"; +import { PredicateExpressionContext } from "./OpenSearchSQLParser.js"; +import { ExpressionAtomPredicateContext } from "./OpenSearchSQLParser.js"; +import { BinaryComparisonPredicateContext } from "./OpenSearchSQLParser.js"; +import { InPredicateContext } from "./OpenSearchSQLParser.js"; +import { BetweenPredicateContext } from "./OpenSearchSQLParser.js"; +import { IsNullPredicateContext } from "./OpenSearchSQLParser.js"; +import { LikePredicateContext } from "./OpenSearchSQLParser.js"; +import { RegexpPredicateContext } from "./OpenSearchSQLParser.js"; +import { ExpressionsContext } from "./OpenSearchSQLParser.js"; +import { ConstantExpressionAtomContext } from "./OpenSearchSQLParser.js"; +import { FunctionCallExpressionAtomContext } from "./OpenSearchSQLParser.js"; +import { FullColumnNameExpressionAtomContext } from "./OpenSearchSQLParser.js"; +import { NestedExpressionAtomContext } from "./OpenSearchSQLParser.js"; +import { MathExpressionAtomContext } from "./OpenSearchSQLParser.js"; +import { ComparisonOperatorContext } from "./OpenSearchSQLParser.js"; +import { NullNotnullContext } from "./OpenSearchSQLParser.js"; +import { NestedAllFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { ScalarFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { SpecificFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { WindowFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { AggregateFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { FilteredAggregationFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { ScoreRelevanceFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { RelevanceFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { HighlightFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { PositionFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { ExtractFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { GetFormatFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { TimestampFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { TimestampFunctionContext } from "./OpenSearchSQLParser.js"; +import { TimestampFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { GetFormatFunctionContext } from "./OpenSearchSQLParser.js"; +import { GetFormatTypeContext } from "./OpenSearchSQLParser.js"; +import { ExtractFunctionContext } from "./OpenSearchSQLParser.js"; +import { SimpleDateTimePartContext } from "./OpenSearchSQLParser.js"; +import { ComplexDateTimePartContext } from "./OpenSearchSQLParser.js"; +import { DatetimePartContext } from "./OpenSearchSQLParser.js"; +import { HighlightFunctionContext } from "./OpenSearchSQLParser.js"; +import { PositionFunctionContext } from "./OpenSearchSQLParser.js"; +import { MatchQueryAltSyntaxFunctionContext } from "./OpenSearchSQLParser.js"; +import { ScalarFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { CaseFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { DataTypeFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { RelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { ScoreRelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { NoFieldRelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { SingleFieldRelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { MultiFieldRelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { AltSingleFieldRelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { AltMultiFieldRelevanceFunctionContext } from "./OpenSearchSQLParser.js"; +import { ConvertedDataTypeContext } from "./OpenSearchSQLParser.js"; +import { CaseFuncAlternativeContext } from "./OpenSearchSQLParser.js"; +import { RegularAggregateFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { CountStarFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { DistinctCountFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { PercentileApproxFunctionCallContext } from "./OpenSearchSQLParser.js"; +import { PercentileApproxFunctionContext } from "./OpenSearchSQLParser.js"; +import { FilterClauseContext } from "./OpenSearchSQLParser.js"; +import { AggregationFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { MathematicalFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { TrigonometricFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { ArithmeticFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { DateTimeFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { TextFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { FlowControlFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { NoFieldRelevanceFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { SystemFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { NestedFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { ScoreRelevanceFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { SingleFieldRelevanceFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { MultiFieldRelevanceFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { AltSingleFieldRelevanceFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { AltMultiFieldRelevanceFunctionNameContext } from "./OpenSearchSQLParser.js"; +import { FunctionArgsContext } from "./OpenSearchSQLParser.js"; +import { FunctionArgContext } from "./OpenSearchSQLParser.js"; +import { RelevanceArgContext } from "./OpenSearchSQLParser.js"; +import { HighlightArgContext } from "./OpenSearchSQLParser.js"; +import { RelevanceArgNameContext } from "./OpenSearchSQLParser.js"; +import { HighlightArgNameContext } from "./OpenSearchSQLParser.js"; +import { RelevanceFieldAndWeightContext } from "./OpenSearchSQLParser.js"; +import { RelevanceFieldWeightContext } from "./OpenSearchSQLParser.js"; +import { RelevanceFieldContext } from "./OpenSearchSQLParser.js"; +import { RelevanceQueryContext } from "./OpenSearchSQLParser.js"; +import { RelevanceArgValueContext } from "./OpenSearchSQLParser.js"; +import { HighlightArgValueContext } from "./OpenSearchSQLParser.js"; +import { AlternateMultiMatchArgNameContext } from "./OpenSearchSQLParser.js"; +import { AlternateMultiMatchQueryContext } from "./OpenSearchSQLParser.js"; +import { AlternateMultiMatchFieldContext } from "./OpenSearchSQLParser.js"; +import { TableNameContext } from "./OpenSearchSQLParser.js"; +import { ColumnNameContext } from "./OpenSearchSQLParser.js"; +import { AllTupleFieldsContext } from "./OpenSearchSQLParser.js"; +import { AliasContext } from "./OpenSearchSQLParser.js"; +import { QualifiedNameContext } from "./OpenSearchSQLParser.js"; +import { IdentContext } from "./OpenSearchSQLParser.js"; +import { KeywordsCanBeIdContext } from "./OpenSearchSQLParser.js"; + + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by `OpenSearchSQLParser`. + * + * @param The return type of the visit operation. Use `void` for + * operations with no return type. + */ +export class OpenSearchSQLParserVisitor extends AbstractParseTreeVisitor { + /** + * Visit a parse tree produced by `OpenSearchSQLParser.root`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRoot?: (ctx: RootContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.sqlStatement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSqlStatement?: (ctx: SqlStatementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.dmlStatement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDmlStatement?: (ctx: DmlStatementContext) => Result; + /** + * Visit a parse tree produced by the `simpleSelect` + * labeled alternative in `OpenSearchSQLParser.selectStatement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSimpleSelect?: (ctx: SimpleSelectContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.adminStatement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAdminStatement?: (ctx: AdminStatementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.showStatement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitShowStatement?: (ctx: ShowStatementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.describeStatement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDescribeStatement?: (ctx: DescribeStatementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.columnFilter`. + * @param ctx the parse tree + * @return the visitor result + */ + visitColumnFilter?: (ctx: ColumnFilterContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.tableFilter`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTableFilter?: (ctx: TableFilterContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.showDescribePattern`. + * @param ctx the parse tree + * @return the visitor result + */ + visitShowDescribePattern?: (ctx: ShowDescribePatternContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.compatibleID`. + * @param ctx the parse tree + * @return the visitor result + */ + visitCompatibleID?: (ctx: CompatibleIDContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.querySpecification`. + * @param ctx the parse tree + * @return the visitor result + */ + visitQuerySpecification?: (ctx: QuerySpecificationContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.selectClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSelectClause?: (ctx: SelectClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.selectSpec`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSelectSpec?: (ctx: SelectSpecContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.selectElements`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSelectElements?: (ctx: SelectElementsContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.selectElement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSelectElement?: (ctx: SelectElementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.fromClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFromClause?: (ctx: FromClauseContext) => Result; + /** + * Visit a parse tree produced by the `tableAsRelation` + * labeled alternative in `OpenSearchSQLParser.relation`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTableAsRelation?: (ctx: TableAsRelationContext) => Result; + /** + * Visit a parse tree produced by the `subqueryAsRelation` + * labeled alternative in `OpenSearchSQLParser.relation`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSubqueryAsRelation?: (ctx: SubqueryAsRelationContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.whereClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitWhereClause?: (ctx: WhereClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.groupByClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitGroupByClause?: (ctx: GroupByClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.groupByElements`. + * @param ctx the parse tree + * @return the visitor result + */ + visitGroupByElements?: (ctx: GroupByElementsContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.groupByElement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitGroupByElement?: (ctx: GroupByElementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.havingClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitHavingClause?: (ctx: HavingClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.orderByClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitOrderByClause?: (ctx: OrderByClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.orderByElement`. + * @param ctx the parse tree + * @return the visitor result + */ + visitOrderByElement?: (ctx: OrderByElementContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.limitClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitLimitClause?: (ctx: LimitClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.windowFunctionClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitWindowFunctionClause?: (ctx: WindowFunctionClauseContext) => Result; + /** + * Visit a parse tree produced by the `scalarWindowFunction` + * labeled alternative in `OpenSearchSQLParser.windowFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitScalarWindowFunction?: (ctx: ScalarWindowFunctionContext) => Result; + /** + * Visit a parse tree produced by the `aggregateWindowFunction` + * labeled alternative in `OpenSearchSQLParser.windowFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAggregateWindowFunction?: (ctx: AggregateWindowFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.overClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitOverClause?: (ctx: OverClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.partitionByClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPartitionByClause?: (ctx: PartitionByClauseContext) => Result; + /** + * Visit a parse tree produced by the `string` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitString?: (ctx: StringContext) => Result; + /** + * Visit a parse tree produced by the `signedDecimal` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSignedDecimal?: (ctx: SignedDecimalContext) => Result; + /** + * Visit a parse tree produced by the `signedReal` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSignedReal?: (ctx: SignedRealContext) => Result; + /** + * Visit a parse tree produced by the `boolean` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitBoolean?: (ctx: BooleanContext) => Result; + /** + * Visit a parse tree produced by the `datetime` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDatetime?: (ctx: DatetimeContext) => Result; + /** + * Visit a parse tree produced by the `interval` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitInterval?: (ctx: IntervalContext) => Result; + /** + * Visit a parse tree produced by the `null` + * labeled alternative in `OpenSearchSQLParser.constant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNull?: (ctx: NullContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.decimalLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDecimalLiteral?: (ctx: DecimalLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.numericLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNumericLiteral?: (ctx: NumericLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.stringLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitStringLiteral?: (ctx: StringLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.booleanLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitBooleanLiteral?: (ctx: BooleanLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.realLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRealLiteral?: (ctx: RealLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.sign`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSign?: (ctx: SignContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.nullLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNullLiteral?: (ctx: NullLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.datetimeLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDatetimeLiteral?: (ctx: DatetimeLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.dateLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDateLiteral?: (ctx: DateLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.timeLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTimeLiteral?: (ctx: TimeLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.timestampLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTimestampLiteral?: (ctx: TimestampLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.datetimeConstantLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDatetimeConstantLiteral?: (ctx: DatetimeConstantLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.intervalLiteral`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIntervalLiteral?: (ctx: IntervalLiteralContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.intervalUnit`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIntervalUnit?: (ctx: IntervalUnitContext) => Result; + /** + * Visit a parse tree produced by the `orExpression` + * labeled alternative in `OpenSearchSQLParser.expression`. + * @param ctx the parse tree + * @return the visitor result + */ + visitOrExpression?: (ctx: OrExpressionContext) => Result; + /** + * Visit a parse tree produced by the `andExpression` + * labeled alternative in `OpenSearchSQLParser.expression`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAndExpression?: (ctx: AndExpressionContext) => Result; + /** + * Visit a parse tree produced by the `notExpression` + * labeled alternative in `OpenSearchSQLParser.expression`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNotExpression?: (ctx: NotExpressionContext) => Result; + /** + * Visit a parse tree produced by the `predicateExpression` + * labeled alternative in `OpenSearchSQLParser.expression`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPredicateExpression?: (ctx: PredicateExpressionContext) => Result; + /** + * Visit a parse tree produced by the `expressionAtomPredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExpressionAtomPredicate?: (ctx: ExpressionAtomPredicateContext) => Result; + /** + * Visit a parse tree produced by the `binaryComparisonPredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitBinaryComparisonPredicate?: (ctx: BinaryComparisonPredicateContext) => Result; + /** + * Visit a parse tree produced by the `inPredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitInPredicate?: (ctx: InPredicateContext) => Result; + /** + * Visit a parse tree produced by the `betweenPredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitBetweenPredicate?: (ctx: BetweenPredicateContext) => Result; + /** + * Visit a parse tree produced by the `isNullPredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIsNullPredicate?: (ctx: IsNullPredicateContext) => Result; + /** + * Visit a parse tree produced by the `likePredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitLikePredicate?: (ctx: LikePredicateContext) => Result; + /** + * Visit a parse tree produced by the `regexpPredicate` + * labeled alternative in `OpenSearchSQLParser.predicate`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRegexpPredicate?: (ctx: RegexpPredicateContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.expressions`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExpressions?: (ctx: ExpressionsContext) => Result; + /** + * Visit a parse tree produced by the `constantExpressionAtom` + * labeled alternative in `OpenSearchSQLParser.expressionAtom`. + * @param ctx the parse tree + * @return the visitor result + */ + visitConstantExpressionAtom?: (ctx: ConstantExpressionAtomContext) => Result; + /** + * Visit a parse tree produced by the `functionCallExpressionAtom` + * labeled alternative in `OpenSearchSQLParser.expressionAtom`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFunctionCallExpressionAtom?: (ctx: FunctionCallExpressionAtomContext) => Result; + /** + * Visit a parse tree produced by the `fullColumnNameExpressionAtom` + * labeled alternative in `OpenSearchSQLParser.expressionAtom`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFullColumnNameExpressionAtom?: (ctx: FullColumnNameExpressionAtomContext) => Result; + /** + * Visit a parse tree produced by the `nestedExpressionAtom` + * labeled alternative in `OpenSearchSQLParser.expressionAtom`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNestedExpressionAtom?: (ctx: NestedExpressionAtomContext) => Result; + /** + * Visit a parse tree produced by the `mathExpressionAtom` + * labeled alternative in `OpenSearchSQLParser.expressionAtom`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMathExpressionAtom?: (ctx: MathExpressionAtomContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.comparisonOperator`. + * @param ctx the parse tree + * @return the visitor result + */ + visitComparisonOperator?: (ctx: ComparisonOperatorContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.nullNotnull`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNullNotnull?: (ctx: NullNotnullContext) => Result; + /** + * Visit a parse tree produced by the `nestedAllFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNestedAllFunctionCall?: (ctx: NestedAllFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `scalarFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitScalarFunctionCall?: (ctx: ScalarFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `specificFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSpecificFunctionCall?: (ctx: SpecificFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `windowFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitWindowFunctionCall?: (ctx: WindowFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `aggregateFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAggregateFunctionCall?: (ctx: AggregateFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `filteredAggregationFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFilteredAggregationFunctionCall?: (ctx: FilteredAggregationFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `scoreRelevanceFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitScoreRelevanceFunctionCall?: (ctx: ScoreRelevanceFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `relevanceFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceFunctionCall?: (ctx: RelevanceFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `highlightFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitHighlightFunctionCall?: (ctx: HighlightFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `positionFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPositionFunctionCall?: (ctx: PositionFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `extractFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExtractFunctionCall?: (ctx: ExtractFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `getFormatFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitGetFormatFunctionCall?: (ctx: GetFormatFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `timestampFunctionCall` + * labeled alternative in `OpenSearchSQLParser.functionCall`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTimestampFunctionCall?: (ctx: TimestampFunctionCallContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.timestampFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTimestampFunction?: (ctx: TimestampFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.timestampFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTimestampFunctionName?: (ctx: TimestampFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.getFormatFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitGetFormatFunction?: (ctx: GetFormatFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.getFormatType`. + * @param ctx the parse tree + * @return the visitor result + */ + visitGetFormatType?: (ctx: GetFormatTypeContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.extractFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExtractFunction?: (ctx: ExtractFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.simpleDateTimePart`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSimpleDateTimePart?: (ctx: SimpleDateTimePartContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.complexDateTimePart`. + * @param ctx the parse tree + * @return the visitor result + */ + visitComplexDateTimePart?: (ctx: ComplexDateTimePartContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.datetimePart`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDatetimePart?: (ctx: DatetimePartContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.highlightFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitHighlightFunction?: (ctx: HighlightFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.positionFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPositionFunction?: (ctx: PositionFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.matchQueryAltSyntaxFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMatchQueryAltSyntaxFunction?: (ctx: MatchQueryAltSyntaxFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.scalarFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitScalarFunctionName?: (ctx: ScalarFunctionNameContext) => Result; + /** + * Visit a parse tree produced by the `caseFunctionCall` + * labeled alternative in `OpenSearchSQLParser.specificFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitCaseFunctionCall?: (ctx: CaseFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `dataTypeFunctionCall` + * labeled alternative in `OpenSearchSQLParser.specificFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDataTypeFunctionCall?: (ctx: DataTypeFunctionCallContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceFunction?: (ctx: RelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.scoreRelevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitScoreRelevanceFunction?: (ctx: ScoreRelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.noFieldRelevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNoFieldRelevanceFunction?: (ctx: NoFieldRelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.singleFieldRelevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSingleFieldRelevanceFunction?: (ctx: SingleFieldRelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.multiFieldRelevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMultiFieldRelevanceFunction?: (ctx: MultiFieldRelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.altSingleFieldRelevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAltSingleFieldRelevanceFunction?: (ctx: AltSingleFieldRelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.altMultiFieldRelevanceFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAltMultiFieldRelevanceFunction?: (ctx: AltMultiFieldRelevanceFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.convertedDataType`. + * @param ctx the parse tree + * @return the visitor result + */ + visitConvertedDataType?: (ctx: ConvertedDataTypeContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.caseFuncAlternative`. + * @param ctx the parse tree + * @return the visitor result + */ + visitCaseFuncAlternative?: (ctx: CaseFuncAlternativeContext) => Result; + /** + * Visit a parse tree produced by the `regularAggregateFunctionCall` + * labeled alternative in `OpenSearchSQLParser.aggregateFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRegularAggregateFunctionCall?: (ctx: RegularAggregateFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `countStarFunctionCall` + * labeled alternative in `OpenSearchSQLParser.aggregateFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitCountStarFunctionCall?: (ctx: CountStarFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `distinctCountFunctionCall` + * labeled alternative in `OpenSearchSQLParser.aggregateFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDistinctCountFunctionCall?: (ctx: DistinctCountFunctionCallContext) => Result; + /** + * Visit a parse tree produced by the `percentileApproxFunctionCall` + * labeled alternative in `OpenSearchSQLParser.aggregateFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPercentileApproxFunctionCall?: (ctx: PercentileApproxFunctionCallContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.percentileApproxFunction`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPercentileApproxFunction?: (ctx: PercentileApproxFunctionContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.filterClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFilterClause?: (ctx: FilterClauseContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.aggregationFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAggregationFunctionName?: (ctx: AggregationFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.mathematicalFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMathematicalFunctionName?: (ctx: MathematicalFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.trigonometricFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTrigonometricFunctionName?: (ctx: TrigonometricFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.arithmeticFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitArithmeticFunctionName?: (ctx: ArithmeticFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.dateTimeFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDateTimeFunctionName?: (ctx: DateTimeFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.textFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTextFunctionName?: (ctx: TextFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.flowControlFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFlowControlFunctionName?: (ctx: FlowControlFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.noFieldRelevanceFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNoFieldRelevanceFunctionName?: (ctx: NoFieldRelevanceFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.systemFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSystemFunctionName?: (ctx: SystemFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.nestedFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitNestedFunctionName?: (ctx: NestedFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.scoreRelevanceFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitScoreRelevanceFunctionName?: (ctx: ScoreRelevanceFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.singleFieldRelevanceFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSingleFieldRelevanceFunctionName?: (ctx: SingleFieldRelevanceFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.multiFieldRelevanceFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMultiFieldRelevanceFunctionName?: (ctx: MultiFieldRelevanceFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.altSingleFieldRelevanceFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAltSingleFieldRelevanceFunctionName?: (ctx: AltSingleFieldRelevanceFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.altMultiFieldRelevanceFunctionName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAltMultiFieldRelevanceFunctionName?: (ctx: AltMultiFieldRelevanceFunctionNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.functionArgs`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFunctionArgs?: (ctx: FunctionArgsContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.functionArg`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFunctionArg?: (ctx: FunctionArgContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceArg`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceArg?: (ctx: RelevanceArgContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.highlightArg`. + * @param ctx the parse tree + * @return the visitor result + */ + visitHighlightArg?: (ctx: HighlightArgContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceArgName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceArgName?: (ctx: RelevanceArgNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.highlightArgName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitHighlightArgName?: (ctx: HighlightArgNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceFieldAndWeight`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceFieldAndWeight?: (ctx: RelevanceFieldAndWeightContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceFieldWeight`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceFieldWeight?: (ctx: RelevanceFieldWeightContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceField`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceField?: (ctx: RelevanceFieldContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceQuery`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceQuery?: (ctx: RelevanceQueryContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.relevanceArgValue`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelevanceArgValue?: (ctx: RelevanceArgValueContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.highlightArgValue`. + * @param ctx the parse tree + * @return the visitor result + */ + visitHighlightArgValue?: (ctx: HighlightArgValueContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.alternateMultiMatchArgName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAlternateMultiMatchArgName?: (ctx: AlternateMultiMatchArgNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.alternateMultiMatchQuery`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAlternateMultiMatchQuery?: (ctx: AlternateMultiMatchQueryContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.alternateMultiMatchField`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAlternateMultiMatchField?: (ctx: AlternateMultiMatchFieldContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.tableName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTableName?: (ctx: TableNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.columnName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitColumnName?: (ctx: ColumnNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.allTupleFields`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAllTupleFields?: (ctx: AllTupleFieldsContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.alias`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAlias?: (ctx: AliasContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.qualifiedName`. + * @param ctx the parse tree + * @return the visitor result + */ + visitQualifiedName?: (ctx: QualifiedNameContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.ident`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIdent?: (ctx: IdentContext) => Result; + /** + * Visit a parse tree produced by `OpenSearchSQLParser.keywordsCanBeId`. + * @param ctx the parse tree + * @return the visitor result + */ + visitKeywordsCanBeId?: (ctx: KeywordsCanBeIdContext) => Result; +} + diff --git a/src/plugins/data/public/antlr/opensearch_sql/code_completion.ts b/src/plugins/data/public/antlr/opensearch_sql/code_completion.ts new file mode 100644 index 00000000000..25fbac2f3ad --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/code_completion.ts @@ -0,0 +1,214 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { monaco } from 'packages/osd-monaco/target'; +import { Lexer as LexerType, ParserRuleContext, Parser as ParserType } from 'antlr4ng'; +import { CodeCompletionCore } from 'antlr4-c3'; +import { + AutocompleteResultBase, + CursorPosition, + EnrichAutocompleteResult, + GetParseTree, + KeywordSuggestion, + LexerConstructor, + OpenSearchSqlAutocompleteResult, + ParserConstructor, +} from '../shared/types'; +import { TokenDictionary } from './table'; +import { createParser } from './parse'; +import { SqlErrorListener } from './sql_error_listerner'; +import { findCursorTokenIndex } from '../shared/cursor'; +import { openSearchSqlAutocompleteData } from './opensearch_sql_autocomplete'; +import { getUiSettings } from '../../services'; +import { SQL_SYMBOLS } from './constants'; +import { QuerySuggestionGetFnArgs } from '../../autocomplete'; +import { fetchColumnValues, fetchTableSchemas } from '../shared/utils'; + +export interface SuggestionParams { + position: monaco.Position; + query: string; +} + +export interface ISuggestionItem { + text: string; + type: string; + fieldType?: string; +} + +const quotesRegex = /^'(.*)'$/; + +export const getSuggestions = async ({ + selectionStart, + selectionEnd, + position, + query, + connectionService, +}: QuerySuggestionGetFnArgs): Promise => { + const { api } = getUiSettings(); + const suggestions = getOpenSearchSqlAutoCompleteSuggestions(query, { + line: position?.lineNumber || selectionStart, + column: position?.column || selectionEnd, + }); + + const finalSuggestions = []; + + try { + // Fetch columns and values + if ('suggestColumns' in suggestions && (suggestions.suggestColumns?.tables?.length ?? 0) > 0) { + const tableNames = suggestions.suggestColumns?.tables?.map((table) => table.name) ?? []; + const schemas = await fetchTableSchemas(tableNames, api, connectionService); + + schemas.forEach((schema) => { + if (schema.body?.fields?.length > 0) { + const columns = schema.body.fields.find((col) => col.name === 'COLUMN_NAME'); + const fieldTypes = schema.body.fields.find((col) => col.name === 'DATA_TYPE'); + if (columns && fieldTypes) { + finalSuggestions.push( + ...columns.values.map((col: string, index: number) => ({ + text: col, + type: 'field', + fieldType: fieldTypes.values[index], + })) + ); + } + } + }); + + if ( + 'suggestValuesForColumn' in suggestions && + /\S/.test(suggestions.suggestValuesForColumn as string) && + suggestions.suggestValuesForColumn !== undefined + ) { + const values = await fetchColumnValues( + tableNames, + suggestions.suggestValuesForColumn as string, + api, + connectionService + ); + values.forEach((value) => { + if (value.body?.fields?.length > 0) { + finalSuggestions.push( + ...value.body.fields[0].values.map((colVal: string) => ({ + text: `'${colVal}'`, + type: 'value', + })) + ); + } + }); + } + } + + // Fill in aggregate functions + if ('suggestAggregateFunctions' in suggestions && suggestions.suggestAggregateFunctions) { + finalSuggestions.push( + ...SQL_SYMBOLS.AGREGATE_FUNCTIONS.map((af) => ({ + text: af, + type: 'function', + })) + ); + } + + // Fill in SQL keywords + if ('suggestKeywords' in suggestions && (suggestions.suggestKeywords?.length ?? 0) > 0) { + finalSuggestions.push( + ...(suggestions.suggestKeywords ?? []).map((sk) => ({ + text: sk.value, + type: 'keyword', + })) + ); + } + } catch (error) { + // TODO: pipe error to the UI + } + + return finalSuggestions; +}; + +export interface ParsingSubject { + Lexer: LexerConstructor; + Parser: ParserConstructor

; + tokenDictionary: TokenDictionary; + ignoredTokens: Set; + rulesToVisit: Set; + getParseTree: GetParseTree

; + enrichAutocompleteResult: EnrichAutocompleteResult; + query: string; + cursor: CursorPosition; + context?: ParserRuleContext; +} + +export const parseQuery = < + A extends AutocompleteResultBase, + L extends LexerType, + P extends ParserType +>({ + Lexer, + Parser, + tokenDictionary, + ignoredTokens, + rulesToVisit, + getParseTree, + enrichAutocompleteResult, + query, + cursor, + context, +}: ParsingSubject) => { + const parser = createParser(Lexer, Parser, query); + const { tokenStream } = parser; + const errorListener = new SqlErrorListener(tokenDictionary.SPACE); + + parser.removeErrorListeners(); + parser.addErrorListener(errorListener); + getParseTree(parser); + + const core = new CodeCompletionCore(parser); + core.ignoredTokens = ignoredTokens; + core.preferredRules = rulesToVisit; + const cursorTokenIndex = findCursorTokenIndex(tokenStream, cursor, tokenDictionary.SPACE); + if (cursorTokenIndex === undefined) { + throw new Error( + `Could not find cursor token index for line: ${cursor.line}, column: ${cursor.column}` + ); + } + + const suggestKeywords: KeywordSuggestion[] = []; + const { tokens, rules } = core.collectCandidates(cursorTokenIndex, context); + tokens.forEach((_, tokenType) => { + // Literal keyword names are quoted + const literalName = parser.vocabulary.getLiteralName(tokenType)?.replace(quotesRegex, '$1'); + + if (!literalName) { + throw new Error(`Could not get literal name for token ${tokenType}`); + } + + suggestKeywords.push({ + value: literalName, + }); + }); + + const result: AutocompleteResultBase = { + errors: errorListener.errors, + suggestKeywords, + }; + + return enrichAutocompleteResult(result, rules, tokenStream, cursorTokenIndex, cursor, query); +}; + +export const getOpenSearchSqlAutoCompleteSuggestions = ( + query: string, + cursor: CursorPosition +): OpenSearchSqlAutocompleteResult => { + return parseQuery({ + Lexer: openSearchSqlAutocompleteData.Lexer, + Parser: openSearchSqlAutocompleteData.Parser, + tokenDictionary: openSearchSqlAutocompleteData.tokenDictionary, + ignoredTokens: openSearchSqlAutocompleteData.ignoredTokens, + rulesToVisit: openSearchSqlAutocompleteData.rulesToVisit, + getParseTree: openSearchSqlAutocompleteData.getParseTree, + enrichAutocompleteResult: openSearchSqlAutocompleteData.enrichAutocompleteResult, + query, + cursor, + }); +}; diff --git a/src/plugins/data/public/antlr/opensearch_sql/constants.ts b/src/plugins/data/public/antlr/opensearch_sql/constants.ts new file mode 100644 index 00000000000..30ab55a35aa --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/constants.ts @@ -0,0 +1,21 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const SQL_SYMBOLS = { + AGREGATE_FUNCTIONS: [ + 'AVG', + 'COUNT', + 'SUM', + 'MIN', + 'MAX', + 'VAR_POP', + 'VAR_SAMP', + 'VARIANCE', + 'STD', + 'STDDEV', + 'STDDEV_POP', + 'STDDEV_SAMP', + ], +}; diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.interp b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.interp new file mode 100644 index 00000000000..655cf595429 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.interp @@ -0,0 +1,1085 @@ +token literal names: +null +null +null +null +null +'ALL' +'AND' +'AS' +'ASC' +'BOOLEAN' +'BETWEEN' +'BY' +'CASE' +'CAST' +'CROSS' +'COLUMNS' +'DATETIME' +'DELETE' +'DESC' +'DESCRIBE' +'DISTINCT' +'DOUBLE' +'ELSE' +'EXISTS' +'FALSE' +'FLOAT' +'FIRST' +'FROM' +'GROUP' +'HAVING' +'IN' +'INNER' +'INT' +'INTEGER' +'IS' +'JOIN' +'LAST' +'LEFT' +'LIKE' +'LIMIT' +'LONG' +'MATCH' +'NATURAL' +'MISSING' +'NOT' +'NULL' +'NULLS' +'ON' +'OR' +'ORDER' +'OUTER' +'OVER' +'PARTITION' +'REGEXP' +'RIGHT' +'SELECT' +'SHOW' +'STRING' +'THEN' +'TRUE' +'UNION' +'USING' +'WHEN' +'WHERE' +'MINUS' +'AVG' +'COUNT' +'MAX' +'MIN' +'SUM' +'VAR_POP' +'VAR_SAMP' +'VARIANCE' +'STD' +'STDDEV' +'STDDEV_POP' +'STDDEV_SAMP' +'SUBSTRING' +'TRIM' +'END' +'FULL' +'OFFSET' +'INTERVAL' +'MICROSECOND' +'SECOND' +'MINUTE' +'HOUR' +'DAY' +'WEEK' +'MONTH' +'QUARTER' +'YEAR' +'SECOND_MICROSECOND' +'MINUTE_MICROSECOND' +'MINUTE_SECOND' +'HOUR_MICROSECOND' +'HOUR_SECOND' +'HOUR_MINUTE' +'DAY_MICROSECOND' +'DAY_SECOND' +'DAY_MINUTE' +'DAY_HOUR' +'YEAR_MONTH' +'TABLES' +'ABS' +'ACOS' +'ADD' +'ADDTIME' +'ASCII' +'ASIN' +'ATAN' +'ATAN2' +'CBRT' +'CEIL' +'CEILING' +'CONCAT' +'CONCAT_WS' +'CONV' +'CONVERT_TZ' +'COS' +'COSH' +'COT' +'CRC32' +'CURDATE' +'CURTIME' +'CURRENT_DATE' +'CURRENT_TIME' +'CURRENT_TIMESTAMP' +'DATE' +'DATE_ADD' +'DATE_FORMAT' +'DATE_SUB' +'DATEDIFF' +'DAYNAME' +'DAYOFMONTH' +'DAYOFWEEK' +'DAYOFYEAR' +'DEGREES' +'DIVIDE' +'E' +'EXP' +'EXPM1' +'EXTRACT' +'FLOOR' +'FROM_DAYS' +'FROM_UNIXTIME' +'GET_FORMAT' +'IF' +'IFNULL' +'ISNULL' +'LAST_DAY' +'LENGTH' +'LN' +'LOCALTIME' +'LOCALTIMESTAMP' +'LOCATE' +'LOG' +'LOG10' +'LOG2' +'LOWER' +'LTRIM' +'MAKEDATE' +'MAKETIME' +'MODULUS' +'MONTHNAME' +'MULTIPLY' +'NOW' +'NULLIF' +'PERIOD_ADD' +'PERIOD_DIFF' +'PI' +'POSITION' +'POW' +'POWER' +'RADIANS' +'RAND' +'REPLACE' +'RINT' +'ROUND' +'RTRIM' +'REVERSE' +'SEC_TO_TIME' +'SIGN' +'SIGNUM' +'SIN' +'SINH' +'SQRT' +'STR_TO_DATE' +'SUBDATE' +'SUBTIME' +'SUBTRACT' +'SYSDATE' +'TAN' +'TIME' +'TIMEDIFF' +'TIME_FORMAT' +'TIME_TO_SEC' +'TIMESTAMP' +'TRUNCATE' +'TO_DAYS' +'TO_SECONDS' +'UNIX_TIMESTAMP' +'UPPER' +'UTC_DATE' +'UTC_TIME' +'UTC_TIMESTAMP' +'D' +'T' +'TS' +'{' +'}' +'DENSE_RANK' +'RANK' +'ROW_NUMBER' +'DATE_HISTOGRAM' +'DAY_OF_MONTH' +'DAY_OF_YEAR' +'DAY_OF_WEEK' +'EXCLUDE' +'EXTENDED_STATS' +'FIELD' +'FILTER' +'GEO_BOUNDING_BOX' +'GEO_CELL' +'GEO_DISTANCE' +'GEO_DISTANCE_RANGE' +'GEO_INTERSECTS' +'GEO_POLYGON' +'HISTOGRAM' +'HOUR_OF_DAY' +'INCLUDE' +'IN_TERMS' +'MATCHPHRASE' +'MATCH_PHRASE' +'MATCHPHRASEQUERY' +'SIMPLE_QUERY_STRING' +'QUERY_STRING' +'MATCH_PHRASE_PREFIX' +'MATCHQUERY' +'MATCH_QUERY' +'MINUTE_OF_DAY' +'MINUTE_OF_HOUR' +'MONTH_OF_YEAR' +'MULTIMATCH' +'MULTI_MATCH' +'MULTIMATCHQUERY' +'NESTED' +'PERCENTILES' +'PERCENTILE' +'PERCENTILE_APPROX' +'REGEXP_QUERY' +'REVERSE_NESTED' +'QUERY' +'RANGE' +'SCORE' +'SCOREQUERY' +'SCORE_QUERY' +'SECOND_OF_MINUTE' +'STATS' +'TERM' +'TERMS' +'TIMESTAMPADD' +'TIMESTAMPDIFF' +'TOPHITS' +'TYPEOF' +'WEEK_OF_YEAR' +'WEEKOFYEAR' +'WEEKDAY' +'WILDCARDQUERY' +'WILDCARD_QUERY' +'SUBSTR' +'STRCMP' +'ADDDATE' +'YEARWEEK' +'ALLOW_LEADING_WILDCARD' +'ANALYZER' +'ANALYZE_WILDCARD' +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY' +'BOOST' +'CASE_INSENSITIVE' +'CUTOFF_FREQUENCY' +'DEFAULT_FIELD' +'DEFAULT_OPERATOR' +'ESCAPE' +'ENABLE_POSITION_INCREMENTS' +'FIELDS' +'FLAGS' +'FUZZINESS' +'FUZZY_MAX_EXPANSIONS' +'FUZZY_PREFIX_LENGTH' +'FUZZY_REWRITE' +'FUZZY_TRANSPOSITIONS' +'LENIENT' +'LOW_FREQ_OPERATOR' +'MAX_DETERMINIZED_STATES' +'MAX_EXPANSIONS' +'MINIMUM_SHOULD_MATCH' +'OPERATOR' +'PHRASE_SLOP' +'PREFIX_LENGTH' +'QUOTE_ANALYZER' +'QUOTE_FIELD_SUFFIX' +'REWRITE' +'SLOP' +'TIE_BREAKER' +'TIME_ZONE' +'TYPE' +'ZERO_TERMS_QUERY' +'HIGHLIGHT' +'PRE_TAGS' +'POST_TAGS' +'MATCH_BOOL_PREFIX' +'*' +'/' +'%' +'+' +'-' +'DIV' +'MOD' +'=' +'>' +'<' +'!' +'~' +'|' +'&' +'^' +'.' +'(' +')' +'[' +']' +',' +';' +'@' +'0' +'1' +'2' +'\'' +'"' +'`' +':' +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +SPACE +SPEC_SQL_COMMENT +COMMENT_INPUT +LINE_COMMENT +ALL +AND +AS +ASC +BOOLEAN +BETWEEN +BY +CASE +CAST +CROSS +COLUMNS +DATETIME +DELETE +DESC +DESCRIBE +DISTINCT +DOUBLE +ELSE +EXISTS +FALSE +FLOAT +FIRST +FROM +GROUP +HAVING +IN +INNER +INT +INTEGER +IS +JOIN +LAST +LEFT +LIKE +LIMIT +LONG +MATCH +NATURAL +MISSING_LITERAL +NOT +NULL_LITERAL +NULLS +ON +OR +ORDER +OUTER +OVER +PARTITION +REGEXP +RIGHT +SELECT +SHOW +STRING +THEN +TRUE +UNION +USING +WHEN +WHERE +EXCEPT +AVG +COUNT +MAX +MIN +SUM +VAR_POP +VAR_SAMP +VARIANCE +STD +STDDEV +STDDEV_POP +STDDEV_SAMP +SUBSTRING +TRIM +END +FULL +OFFSET +INTERVAL +MICROSECOND +SECOND +MINUTE +HOUR +DAY +WEEK +MONTH +QUARTER +YEAR +SECOND_MICROSECOND +MINUTE_MICROSECOND +MINUTE_SECOND +HOUR_MICROSECOND +HOUR_SECOND +HOUR_MINUTE +DAY_MICROSECOND +DAY_SECOND +DAY_MINUTE +DAY_HOUR +YEAR_MONTH +TABLES +ABS +ACOS +ADD +ADDTIME +ASCII +ASIN +ATAN +ATAN2 +CBRT +CEIL +CEILING +CONCAT +CONCAT_WS +CONV +CONVERT_TZ +COS +COSH +COT +CRC32 +CURDATE +CURTIME +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +DATE +DATE_ADD +DATE_FORMAT +DATE_SUB +DATEDIFF +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DEGREES +DIVIDE +E +EXP +EXPM1 +EXTRACT +FLOOR +FROM_DAYS +FROM_UNIXTIME +GET_FORMAT +IF +IFNULL +ISNULL +LAST_DAY +LENGTH +LN +LOCALTIME +LOCALTIMESTAMP +LOCATE +LOG +LOG10 +LOG2 +LOWER +LTRIM +MAKEDATE +MAKETIME +MODULUS +MONTHNAME +MULTIPLY +NOW +NULLIF +PERIOD_ADD +PERIOD_DIFF +PI +POSITION +POW +POWER +RADIANS +RAND +REPLACE +RINT +ROUND +RTRIM +REVERSE +SEC_TO_TIME +SIGN +SIGNUM +SIN +SINH +SQRT +STR_TO_DATE +SUBDATE +SUBTIME +SUBTRACT +SYSDATE +TAN +TIME +TIMEDIFF +TIME_FORMAT +TIME_TO_SEC +TIMESTAMP +TRUNCATE +TO_DAYS +TO_SECONDS +UNIX_TIMESTAMP +UPPER +UTC_DATE +UTC_TIME +UTC_TIMESTAMP +D +T +TS +LEFT_BRACE +RIGHT_BRACE +DENSE_RANK +RANK +ROW_NUMBER +DATE_HISTOGRAM +DAY_OF_MONTH +DAY_OF_YEAR +DAY_OF_WEEK +EXCLUDE +EXTENDED_STATS +FIELD +FILTER +GEO_BOUNDING_BOX +GEO_CELL +GEO_DISTANCE +GEO_DISTANCE_RANGE +GEO_INTERSECTS +GEO_POLYGON +HISTOGRAM +HOUR_OF_DAY +INCLUDE +IN_TERMS +MATCHPHRASE +MATCH_PHRASE +MATCHPHRASEQUERY +SIMPLE_QUERY_STRING +QUERY_STRING +MATCH_PHRASE_PREFIX +MATCHQUERY +MATCH_QUERY +MINUTE_OF_DAY +MINUTE_OF_HOUR +MONTH_OF_YEAR +MULTIMATCH +MULTI_MATCH +MULTIMATCHQUERY +NESTED +PERCENTILES +PERCENTILE +PERCENTILE_APPROX +REGEXP_QUERY +REVERSE_NESTED +QUERY +RANGE +SCORE +SCOREQUERY +SCORE_QUERY +SECOND_OF_MINUTE +STATS +TERM +TERMS +TIMESTAMPADD +TIMESTAMPDIFF +TOPHITS +TYPEOF +WEEK_OF_YEAR +WEEKOFYEAR +WEEKDAY +WILDCARDQUERY +WILDCARD_QUERY +SUBSTR +STRCMP +ADDDATE +YEARWEEK +ALLOW_LEADING_WILDCARD +ANALYZER +ANALYZE_WILDCARD +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY +BOOST +CASE_INSENSITIVE +CUTOFF_FREQUENCY +DEFAULT_FIELD +DEFAULT_OPERATOR +ESCAPE +ENABLE_POSITION_INCREMENTS +FIELDS +FLAGS +FUZZINESS +FUZZY_MAX_EXPANSIONS +FUZZY_PREFIX_LENGTH +FUZZY_REWRITE +FUZZY_TRANSPOSITIONS +LENIENT +LOW_FREQ_OPERATOR +MAX_DETERMINIZED_STATES +MAX_EXPANSIONS +MINIMUM_SHOULD_MATCH +OPERATOR +PHRASE_SLOP +PREFIX_LENGTH +QUOTE_ANALYZER +QUOTE_FIELD_SUFFIX +REWRITE +SLOP +TIE_BREAKER +TIME_ZONE +TYPE +ZERO_TERMS_QUERY +HIGHLIGHT +HIGHLIGHT_PRE_TAGS +HIGHLIGHT_POST_TAGS +MATCH_BOOL_PREFIX +STAR +SLASH +MODULE +PLUS +MINUS +DIV +MOD +EQUAL_SYMBOL +GREATER_SYMBOL +LESS_SYMBOL +EXCLAMATION_SYMBOL +BIT_NOT_OP +BIT_OR_OP +BIT_AND_OP +BIT_XOR_OP +DOT +LR_BRACKET +RR_BRACKET +LT_SQR_PRTHS +RT_SQR_PRTHS +COMMA +SEMI +AT_SIGN +ZERO_DECIMAL +ONE_DECIMAL +TWO_DECIMAL +SINGLE_QUOTE_SYMB +DOUBLE_QUOTE_SYMB +REVERSE_QUOTE_SYMB +COLON_SYMB +START_NATIONAL_STRING_LITERAL +STRING_LITERAL +DECIMAL_LITERAL +HEXADECIMAL_LITERAL +REAL_LITERAL +NULL_SPEC_LITERAL +BIT_STRING +ID +DOUBLE_QUOTE_ID +BACKTICK_QUOTE_ID +ERROR_RECOGNITION + +rule names: +SPACE +SPEC_SQL_COMMENT +COMMENT_INPUT +LINE_COMMENT +ALL +AND +AS +ASC +BOOLEAN +BETWEEN +BY +CASE +CAST +CROSS +COLUMNS +DATETIME +DELETE +DESC +DESCRIBE +DISTINCT +DOUBLE +ELSE +EXISTS +FALSE +FLOAT +FIRST +FROM +GROUP +HAVING +IN +INNER +INT +INTEGER +IS +JOIN +LAST +LEFT +LIKE +LIMIT +LONG +MATCH +NATURAL +MISSING_LITERAL +NOT +NULL_LITERAL +NULLS +ON +OR +ORDER +OUTER +OVER +PARTITION +REGEXP +RIGHT +SELECT +SHOW +STRING +THEN +TRUE +UNION +USING +WHEN +WHERE +EXCEPT +AVG +COUNT +MAX +MIN +SUM +VAR_POP +VAR_SAMP +VARIANCE +STD +STDDEV +STDDEV_POP +STDDEV_SAMP +SUBSTRING +TRIM +END +FULL +OFFSET +INTERVAL +MICROSECOND +SECOND +MINUTE +HOUR +DAY +WEEK +MONTH +QUARTER +YEAR +SECOND_MICROSECOND +MINUTE_MICROSECOND +MINUTE_SECOND +HOUR_MICROSECOND +HOUR_SECOND +HOUR_MINUTE +DAY_MICROSECOND +DAY_SECOND +DAY_MINUTE +DAY_HOUR +YEAR_MONTH +TABLES +ABS +ACOS +ADD +ADDTIME +ASCII +ASIN +ATAN +ATAN2 +CBRT +CEIL +CEILING +CONCAT +CONCAT_WS +CONV +CONVERT_TZ +COS +COSH +COT +CRC32 +CURDATE +CURTIME +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +DATE +DATE_ADD +DATE_FORMAT +DATE_SUB +DATEDIFF +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DEGREES +DIVIDE +E +EXP +EXPM1 +EXTRACT +FLOOR +FROM_DAYS +FROM_UNIXTIME +GET_FORMAT +IF +IFNULL +ISNULL +LAST_DAY +LENGTH +LN +LOCALTIME +LOCALTIMESTAMP +LOCATE +LOG +LOG10 +LOG2 +LOWER +LTRIM +MAKEDATE +MAKETIME +MODULUS +MONTHNAME +MULTIPLY +NOW +NULLIF +PERIOD_ADD +PERIOD_DIFF +PI +POSITION +POW +POWER +RADIANS +RAND +REPLACE +RINT +ROUND +RTRIM +REVERSE +SEC_TO_TIME +SIGN +SIGNUM +SIN +SINH +SQRT +STR_TO_DATE +SUBDATE +SUBTIME +SUBTRACT +SYSDATE +TAN +TIME +TIMEDIFF +TIME_FORMAT +TIME_TO_SEC +TIMESTAMP +TRUNCATE +TO_DAYS +TO_SECONDS +UNIX_TIMESTAMP +UPPER +UTC_DATE +UTC_TIME +UTC_TIMESTAMP +D +T +TS +LEFT_BRACE +RIGHT_BRACE +DENSE_RANK +RANK +ROW_NUMBER +DATE_HISTOGRAM +DAY_OF_MONTH +DAY_OF_YEAR +DAY_OF_WEEK +EXCLUDE +EXTENDED_STATS +FIELD +FILTER +GEO_BOUNDING_BOX +GEO_CELL +GEO_DISTANCE +GEO_DISTANCE_RANGE +GEO_INTERSECTS +GEO_POLYGON +HISTOGRAM +HOUR_OF_DAY +INCLUDE +IN_TERMS +MATCHPHRASE +MATCH_PHRASE +MATCHPHRASEQUERY +SIMPLE_QUERY_STRING +QUERY_STRING +MATCH_PHRASE_PREFIX +MATCHQUERY +MATCH_QUERY +MINUTE_OF_DAY +MINUTE_OF_HOUR +MONTH_OF_YEAR +MULTIMATCH +MULTI_MATCH +MULTIMATCHQUERY +NESTED +PERCENTILES +PERCENTILE +PERCENTILE_APPROX +REGEXP_QUERY +REVERSE_NESTED +QUERY +RANGE +SCORE +SCOREQUERY +SCORE_QUERY +SECOND_OF_MINUTE +STATS +TERM +TERMS +TIMESTAMPADD +TIMESTAMPDIFF +TOPHITS +TYPEOF +WEEK_OF_YEAR +WEEKOFYEAR +WEEKDAY +WILDCARDQUERY +WILDCARD_QUERY +SUBSTR +STRCMP +ADDDATE +YEARWEEK +ALLOW_LEADING_WILDCARD +ANALYZER +ANALYZE_WILDCARD +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY +BOOST +CASE_INSENSITIVE +CUTOFF_FREQUENCY +DEFAULT_FIELD +DEFAULT_OPERATOR +ESCAPE +ENABLE_POSITION_INCREMENTS +FIELDS +FLAGS +FUZZINESS +FUZZY_MAX_EXPANSIONS +FUZZY_PREFIX_LENGTH +FUZZY_REWRITE +FUZZY_TRANSPOSITIONS +LENIENT +LOW_FREQ_OPERATOR +MAX_DETERMINIZED_STATES +MAX_EXPANSIONS +MINIMUM_SHOULD_MATCH +OPERATOR +PHRASE_SLOP +PREFIX_LENGTH +QUOTE_ANALYZER +QUOTE_FIELD_SUFFIX +REWRITE +SLOP +TIE_BREAKER +TIME_ZONE +TYPE +ZERO_TERMS_QUERY +HIGHLIGHT +HIGHLIGHT_PRE_TAGS +HIGHLIGHT_POST_TAGS +MATCH_BOOL_PREFIX +STAR +SLASH +MODULE +PLUS +MINUS +DIV +MOD +EQUAL_SYMBOL +GREATER_SYMBOL +LESS_SYMBOL +EXCLAMATION_SYMBOL +BIT_NOT_OP +BIT_OR_OP +BIT_AND_OP +BIT_XOR_OP +DOT +LR_BRACKET +RR_BRACKET +LT_SQR_PRTHS +RT_SQR_PRTHS +COMMA +SEMI +AT_SIGN +ZERO_DECIMAL +ONE_DECIMAL +TWO_DECIMAL +SINGLE_QUOTE_SYMB +DOUBLE_QUOTE_SYMB +REVERSE_QUOTE_SYMB +COLON_SYMB +START_NATIONAL_STRING_LITERAL +STRING_LITERAL +DECIMAL_LITERAL +HEXADECIMAL_LITERAL +REAL_LITERAL +NULL_SPEC_LITERAL +BIT_STRING +ID +DOUBLE_QUOTE_ID +BACKTICK_QUOTE_ID +EXPONENT_NUM_PART +ID_LITERAL +DQUOTA_STRING +SQUOTA_STRING +BQUOTA_STRING +HEX_DIGIT +DEC_DIGIT +BIT_STRING_L +ERROR_RECOGNITION + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN +null +null +SQLCOMMENT +ERRORCHANNEL + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 352, 3776, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 2, 347, 7, 347, 2, 348, 7, 348, 2, 349, 7, 349, 2, 350, 7, 350, 2, 351, 7, 351, 2, 352, 7, 352, 2, 353, 7, 353, 2, 354, 7, 354, 2, 355, 7, 355, 2, 356, 7, 356, 2, 357, 7, 357, 2, 358, 7, 358, 2, 359, 7, 359, 1, 0, 4, 0, 723, 8, 0, 11, 0, 12, 0, 724, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 734, 8, 1, 11, 1, 12, 1, 735, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 747, 8, 2, 10, 2, 12, 2, 750, 9, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 761, 8, 3, 1, 3, 5, 3, 764, 8, 3, 10, 3, 12, 3, 767, 9, 3, 1, 3, 3, 3, 770, 8, 3, 1, 3, 1, 3, 3, 3, 774, 8, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 780, 8, 3, 1, 3, 1, 3, 3, 3, 784, 8, 3, 3, 3, 786, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 312, 1, 312, 1, 313, 1, 313, 1, 314, 1, 314, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 319, 1, 319, 1, 320, 1, 320, 1, 321, 1, 321, 1, 322, 1, 322, 1, 323, 1, 323, 1, 324, 1, 324, 1, 325, 1, 325, 1, 326, 1, 326, 1, 327, 1, 327, 1, 328, 1, 328, 1, 329, 1, 329, 1, 330, 1, 330, 1, 331, 1, 331, 1, 332, 1, 332, 1, 333, 1, 333, 1, 334, 1, 334, 1, 335, 1, 335, 1, 336, 1, 336, 1, 337, 1, 337, 1, 338, 1, 338, 1, 339, 1, 339, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 343, 4, 343, 3620, 8, 343, 11, 343, 12, 343, 3621, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 4, 344, 3629, 8, 344, 11, 344, 12, 344, 3630, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 4, 344, 3639, 8, 344, 11, 344, 12, 344, 3640, 3, 344, 3643, 8, 344, 1, 345, 4, 345, 3646, 8, 345, 11, 345, 12, 345, 3647, 3, 345, 3650, 8, 345, 1, 345, 1, 345, 4, 345, 3654, 8, 345, 11, 345, 12, 345, 3655, 1, 345, 4, 345, 3659, 8, 345, 11, 345, 12, 345, 3660, 1, 345, 1, 345, 1, 345, 1, 345, 4, 345, 3667, 8, 345, 11, 345, 12, 345, 3668, 3, 345, 3671, 8, 345, 1, 345, 1, 345, 4, 345, 3675, 8, 345, 11, 345, 12, 345, 3676, 1, 345, 1, 345, 1, 345, 4, 345, 3682, 8, 345, 11, 345, 12, 345, 3683, 1, 345, 1, 345, 3, 345, 3688, 8, 345, 1, 346, 1, 346, 1, 346, 1, 347, 1, 347, 1, 348, 1, 348, 1, 349, 1, 349, 1, 350, 1, 350, 1, 351, 1, 351, 3, 351, 3703, 8, 351, 1, 351, 4, 351, 3706, 8, 351, 11, 351, 12, 351, 3707, 1, 352, 4, 352, 3711, 8, 352, 11, 352, 12, 352, 3712, 1, 352, 5, 352, 3716, 8, 352, 10, 352, 12, 352, 3719, 9, 352, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 5, 353, 3727, 8, 353, 10, 353, 12, 353, 3730, 9, 353, 1, 353, 1, 353, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 5, 354, 3740, 8, 354, 10, 354, 12, 354, 3743, 9, 354, 1, 354, 1, 354, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 5, 355, 3753, 8, 355, 10, 355, 12, 355, 3756, 9, 355, 1, 355, 1, 355, 1, 356, 1, 356, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 4, 358, 3767, 8, 358, 11, 358, 12, 358, 3768, 1, 358, 1, 358, 1, 359, 1, 359, 1, 359, 1, 359, 2, 735, 748, 0, 360, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 189, 379, 190, 381, 191, 383, 192, 385, 193, 387, 194, 389, 195, 391, 196, 393, 197, 395, 198, 397, 199, 399, 200, 401, 201, 403, 202, 405, 203, 407, 204, 409, 205, 411, 206, 413, 207, 415, 208, 417, 209, 419, 210, 421, 211, 423, 212, 425, 213, 427, 214, 429, 215, 431, 216, 433, 217, 435, 218, 437, 219, 439, 220, 441, 221, 443, 222, 445, 223, 447, 224, 449, 225, 451, 226, 453, 227, 455, 228, 457, 229, 459, 230, 461, 231, 463, 232, 465, 233, 467, 234, 469, 235, 471, 236, 473, 237, 475, 238, 477, 239, 479, 240, 481, 241, 483, 242, 485, 243, 487, 244, 489, 245, 491, 246, 493, 247, 495, 248, 497, 249, 499, 250, 501, 251, 503, 252, 505, 253, 507, 254, 509, 255, 511, 256, 513, 257, 515, 258, 517, 259, 519, 260, 521, 261, 523, 262, 525, 263, 527, 264, 529, 265, 531, 266, 533, 267, 535, 268, 537, 269, 539, 270, 541, 271, 543, 272, 545, 273, 547, 274, 549, 275, 551, 276, 553, 277, 555, 278, 557, 279, 559, 280, 561, 281, 563, 282, 565, 283, 567, 284, 569, 285, 571, 286, 573, 287, 575, 288, 577, 289, 579, 290, 581, 291, 583, 292, 585, 293, 587, 294, 589, 295, 591, 296, 593, 297, 595, 298, 597, 299, 599, 300, 601, 301, 603, 302, 605, 303, 607, 304, 609, 305, 611, 306, 613, 307, 615, 308, 617, 309, 619, 310, 621, 311, 623, 312, 625, 313, 627, 314, 629, 315, 631, 316, 633, 317, 635, 318, 637, 319, 639, 320, 641, 321, 643, 322, 645, 323, 647, 324, 649, 325, 651, 326, 653, 327, 655, 328, 657, 329, 659, 330, 661, 331, 663, 332, 665, 333, 667, 334, 669, 335, 671, 336, 673, 337, 675, 338, 677, 339, 679, 340, 681, 341, 683, 342, 685, 343, 687, 344, 689, 345, 691, 346, 693, 347, 695, 348, 697, 349, 699, 350, 701, 351, 703, 0, 705, 0, 707, 0, 709, 0, 711, 0, 713, 0, 715, 0, 717, 0, 719, 352, 1, 0, 37, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 78, 78, 110, 110, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 67, 67, 99, 99, 2, 0, 66, 66, 98, 98, 2, 0, 79, 79, 111, 111, 2, 0, 69, 69, 101, 101, 2, 0, 84, 84, 116, 116, 2, 0, 87, 87, 119, 119, 2, 0, 89, 89, 121, 121, 2, 0, 82, 82, 114, 114, 2, 0, 85, 85, 117, 117, 2, 0, 77, 77, 109, 109, 2, 0, 73, 73, 105, 105, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 80, 80, 112, 112, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 81, 81, 113, 113, 2, 0, 90, 90, 122, 122, 2, 0, 43, 43, 45, 45, 4, 0, 42, 42, 64, 90, 95, 95, 97, 122, 6, 0, 42, 42, 45, 45, 48, 57, 65, 90, 95, 95, 97, 122, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 92, 92, 96, 96, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 1, 0, 48, 49, 3806, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 0, 379, 1, 0, 0, 0, 0, 381, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 385, 1, 0, 0, 0, 0, 387, 1, 0, 0, 0, 0, 389, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 397, 1, 0, 0, 0, 0, 399, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 405, 1, 0, 0, 0, 0, 407, 1, 0, 0, 0, 0, 409, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 511, 1, 0, 0, 0, 0, 513, 1, 0, 0, 0, 0, 515, 1, 0, 0, 0, 0, 517, 1, 0, 0, 0, 0, 519, 1, 0, 0, 0, 0, 521, 1, 0, 0, 0, 0, 523, 1, 0, 0, 0, 0, 525, 1, 0, 0, 0, 0, 527, 1, 0, 0, 0, 0, 529, 1, 0, 0, 0, 0, 531, 1, 0, 0, 0, 0, 533, 1, 0, 0, 0, 0, 535, 1, 0, 0, 0, 0, 537, 1, 0, 0, 0, 0, 539, 1, 0, 0, 0, 0, 541, 1, 0, 0, 0, 0, 543, 1, 0, 0, 0, 0, 545, 1, 0, 0, 0, 0, 547, 1, 0, 0, 0, 0, 549, 1, 0, 0, 0, 0, 551, 1, 0, 0, 0, 0, 553, 1, 0, 0, 0, 0, 555, 1, 0, 0, 0, 0, 557, 1, 0, 0, 0, 0, 559, 1, 0, 0, 0, 0, 561, 1, 0, 0, 0, 0, 563, 1, 0, 0, 0, 0, 565, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 0, 575, 1, 0, 0, 0, 0, 577, 1, 0, 0, 0, 0, 579, 1, 0, 0, 0, 0, 581, 1, 0, 0, 0, 0, 583, 1, 0, 0, 0, 0, 585, 1, 0, 0, 0, 0, 587, 1, 0, 0, 0, 0, 589, 1, 0, 0, 0, 0, 591, 1, 0, 0, 0, 0, 593, 1, 0, 0, 0, 0, 595, 1, 0, 0, 0, 0, 597, 1, 0, 0, 0, 0, 599, 1, 0, 0, 0, 0, 601, 1, 0, 0, 0, 0, 603, 1, 0, 0, 0, 0, 605, 1, 0, 0, 0, 0, 607, 1, 0, 0, 0, 0, 609, 1, 0, 0, 0, 0, 611, 1, 0, 0, 0, 0, 613, 1, 0, 0, 0, 0, 615, 1, 0, 0, 0, 0, 617, 1, 0, 0, 0, 0, 619, 1, 0, 0, 0, 0, 621, 1, 0, 0, 0, 0, 623, 1, 0, 0, 0, 0, 625, 1, 0, 0, 0, 0, 627, 1, 0, 0, 0, 0, 629, 1, 0, 0, 0, 0, 631, 1, 0, 0, 0, 0, 633, 1, 0, 0, 0, 0, 635, 1, 0, 0, 0, 0, 637, 1, 0, 0, 0, 0, 639, 1, 0, 0, 0, 0, 641, 1, 0, 0, 0, 0, 643, 1, 0, 0, 0, 0, 645, 1, 0, 0, 0, 0, 647, 1, 0, 0, 0, 0, 649, 1, 0, 0, 0, 0, 651, 1, 0, 0, 0, 0, 653, 1, 0, 0, 0, 0, 655, 1, 0, 0, 0, 0, 657, 1, 0, 0, 0, 0, 659, 1, 0, 0, 0, 0, 661, 1, 0, 0, 0, 0, 663, 1, 0, 0, 0, 0, 665, 1, 0, 0, 0, 0, 667, 1, 0, 0, 0, 0, 669, 1, 0, 0, 0, 0, 671, 1, 0, 0, 0, 0, 673, 1, 0, 0, 0, 0, 675, 1, 0, 0, 0, 0, 677, 1, 0, 0, 0, 0, 679, 1, 0, 0, 0, 0, 681, 1, 0, 0, 0, 0, 683, 1, 0, 0, 0, 0, 685, 1, 0, 0, 0, 0, 687, 1, 0, 0, 0, 0, 689, 1, 0, 0, 0, 0, 691, 1, 0, 0, 0, 0, 693, 1, 0, 0, 0, 0, 695, 1, 0, 0, 0, 0, 697, 1, 0, 0, 0, 0, 699, 1, 0, 0, 0, 0, 701, 1, 0, 0, 0, 0, 719, 1, 0, 0, 0, 1, 722, 1, 0, 0, 0, 3, 728, 1, 0, 0, 0, 5, 742, 1, 0, 0, 0, 7, 785, 1, 0, 0, 0, 9, 789, 1, 0, 0, 0, 11, 793, 1, 0, 0, 0, 13, 797, 1, 0, 0, 0, 15, 800, 1, 0, 0, 0, 17, 804, 1, 0, 0, 0, 19, 812, 1, 0, 0, 0, 21, 820, 1, 0, 0, 0, 23, 823, 1, 0, 0, 0, 25, 828, 1, 0, 0, 0, 27, 833, 1, 0, 0, 0, 29, 839, 1, 0, 0, 0, 31, 847, 1, 0, 0, 0, 33, 856, 1, 0, 0, 0, 35, 863, 1, 0, 0, 0, 37, 868, 1, 0, 0, 0, 39, 877, 1, 0, 0, 0, 41, 886, 1, 0, 0, 0, 43, 893, 1, 0, 0, 0, 45, 898, 1, 0, 0, 0, 47, 905, 1, 0, 0, 0, 49, 911, 1, 0, 0, 0, 51, 917, 1, 0, 0, 0, 53, 923, 1, 0, 0, 0, 55, 928, 1, 0, 0, 0, 57, 934, 1, 0, 0, 0, 59, 941, 1, 0, 0, 0, 61, 944, 1, 0, 0, 0, 63, 950, 1, 0, 0, 0, 65, 954, 1, 0, 0, 0, 67, 962, 1, 0, 0, 0, 69, 965, 1, 0, 0, 0, 71, 970, 1, 0, 0, 0, 73, 975, 1, 0, 0, 0, 75, 980, 1, 0, 0, 0, 77, 985, 1, 0, 0, 0, 79, 991, 1, 0, 0, 0, 81, 996, 1, 0, 0, 0, 83, 1002, 1, 0, 0, 0, 85, 1010, 1, 0, 0, 0, 87, 1018, 1, 0, 0, 0, 89, 1022, 1, 0, 0, 0, 91, 1027, 1, 0, 0, 0, 93, 1033, 1, 0, 0, 0, 95, 1036, 1, 0, 0, 0, 97, 1039, 1, 0, 0, 0, 99, 1045, 1, 0, 0, 0, 101, 1051, 1, 0, 0, 0, 103, 1056, 1, 0, 0, 0, 105, 1066, 1, 0, 0, 0, 107, 1073, 1, 0, 0, 0, 109, 1079, 1, 0, 0, 0, 111, 1086, 1, 0, 0, 0, 113, 1091, 1, 0, 0, 0, 115, 1098, 1, 0, 0, 0, 117, 1103, 1, 0, 0, 0, 119, 1108, 1, 0, 0, 0, 121, 1114, 1, 0, 0, 0, 123, 1120, 1, 0, 0, 0, 125, 1125, 1, 0, 0, 0, 127, 1131, 1, 0, 0, 0, 129, 1137, 1, 0, 0, 0, 131, 1141, 1, 0, 0, 0, 133, 1147, 1, 0, 0, 0, 135, 1151, 1, 0, 0, 0, 137, 1155, 1, 0, 0, 0, 139, 1159, 1, 0, 0, 0, 141, 1167, 1, 0, 0, 0, 143, 1176, 1, 0, 0, 0, 145, 1185, 1, 0, 0, 0, 147, 1189, 1, 0, 0, 0, 149, 1196, 1, 0, 0, 0, 151, 1207, 1, 0, 0, 0, 153, 1219, 1, 0, 0, 0, 155, 1229, 1, 0, 0, 0, 157, 1234, 1, 0, 0, 0, 159, 1238, 1, 0, 0, 0, 161, 1243, 1, 0, 0, 0, 163, 1250, 1, 0, 0, 0, 165, 1259, 1, 0, 0, 0, 167, 1271, 1, 0, 0, 0, 169, 1278, 1, 0, 0, 0, 171, 1285, 1, 0, 0, 0, 173, 1290, 1, 0, 0, 0, 175, 1294, 1, 0, 0, 0, 177, 1299, 1, 0, 0, 0, 179, 1305, 1, 0, 0, 0, 181, 1313, 1, 0, 0, 0, 183, 1318, 1, 0, 0, 0, 185, 1337, 1, 0, 0, 0, 187, 1356, 1, 0, 0, 0, 189, 1370, 1, 0, 0, 0, 191, 1387, 1, 0, 0, 0, 193, 1399, 1, 0, 0, 0, 195, 1411, 1, 0, 0, 0, 197, 1427, 1, 0, 0, 0, 199, 1438, 1, 0, 0, 0, 201, 1449, 1, 0, 0, 0, 203, 1458, 1, 0, 0, 0, 205, 1469, 1, 0, 0, 0, 207, 1476, 1, 0, 0, 0, 209, 1480, 1, 0, 0, 0, 211, 1485, 1, 0, 0, 0, 213, 1489, 1, 0, 0, 0, 215, 1497, 1, 0, 0, 0, 217, 1503, 1, 0, 0, 0, 219, 1508, 1, 0, 0, 0, 221, 1513, 1, 0, 0, 0, 223, 1519, 1, 0, 0, 0, 225, 1524, 1, 0, 0, 0, 227, 1529, 1, 0, 0, 0, 229, 1537, 1, 0, 0, 0, 231, 1544, 1, 0, 0, 0, 233, 1554, 1, 0, 0, 0, 235, 1559, 1, 0, 0, 0, 237, 1570, 1, 0, 0, 0, 239, 1574, 1, 0, 0, 0, 241, 1579, 1, 0, 0, 0, 243, 1583, 1, 0, 0, 0, 245, 1589, 1, 0, 0, 0, 247, 1597, 1, 0, 0, 0, 249, 1605, 1, 0, 0, 0, 251, 1618, 1, 0, 0, 0, 253, 1631, 1, 0, 0, 0, 255, 1649, 1, 0, 0, 0, 257, 1654, 1, 0, 0, 0, 259, 1663, 1, 0, 0, 0, 261, 1675, 1, 0, 0, 0, 263, 1684, 1, 0, 0, 0, 265, 1693, 1, 0, 0, 0, 267, 1701, 1, 0, 0, 0, 269, 1712, 1, 0, 0, 0, 271, 1722, 1, 0, 0, 0, 273, 1732, 1, 0, 0, 0, 275, 1740, 1, 0, 0, 0, 277, 1747, 1, 0, 0, 0, 279, 1749, 1, 0, 0, 0, 281, 1753, 1, 0, 0, 0, 283, 1759, 1, 0, 0, 0, 285, 1767, 1, 0, 0, 0, 287, 1773, 1, 0, 0, 0, 289, 1783, 1, 0, 0, 0, 291, 1797, 1, 0, 0, 0, 293, 1808, 1, 0, 0, 0, 295, 1811, 1, 0, 0, 0, 297, 1818, 1, 0, 0, 0, 299, 1825, 1, 0, 0, 0, 301, 1834, 1, 0, 0, 0, 303, 1841, 1, 0, 0, 0, 305, 1844, 1, 0, 0, 0, 307, 1854, 1, 0, 0, 0, 309, 1869, 1, 0, 0, 0, 311, 1876, 1, 0, 0, 0, 313, 1880, 1, 0, 0, 0, 315, 1886, 1, 0, 0, 0, 317, 1891, 1, 0, 0, 0, 319, 1897, 1, 0, 0, 0, 321, 1903, 1, 0, 0, 0, 323, 1912, 1, 0, 0, 0, 325, 1921, 1, 0, 0, 0, 327, 1929, 1, 0, 0, 0, 329, 1939, 1, 0, 0, 0, 331, 1948, 1, 0, 0, 0, 333, 1952, 1, 0, 0, 0, 335, 1959, 1, 0, 0, 0, 337, 1970, 1, 0, 0, 0, 339, 1982, 1, 0, 0, 0, 341, 1985, 1, 0, 0, 0, 343, 1994, 1, 0, 0, 0, 345, 1998, 1, 0, 0, 0, 347, 2004, 1, 0, 0, 0, 349, 2012, 1, 0, 0, 0, 351, 2017, 1, 0, 0, 0, 353, 2025, 1, 0, 0, 0, 355, 2030, 1, 0, 0, 0, 357, 2036, 1, 0, 0, 0, 359, 2042, 1, 0, 0, 0, 361, 2050, 1, 0, 0, 0, 363, 2062, 1, 0, 0, 0, 365, 2067, 1, 0, 0, 0, 367, 2074, 1, 0, 0, 0, 369, 2078, 1, 0, 0, 0, 371, 2083, 1, 0, 0, 0, 373, 2088, 1, 0, 0, 0, 375, 2100, 1, 0, 0, 0, 377, 2108, 1, 0, 0, 0, 379, 2116, 1, 0, 0, 0, 381, 2125, 1, 0, 0, 0, 383, 2133, 1, 0, 0, 0, 385, 2137, 1, 0, 0, 0, 387, 2142, 1, 0, 0, 0, 389, 2151, 1, 0, 0, 0, 391, 2163, 1, 0, 0, 0, 393, 2175, 1, 0, 0, 0, 395, 2185, 1, 0, 0, 0, 397, 2194, 1, 0, 0, 0, 399, 2202, 1, 0, 0, 0, 401, 2213, 1, 0, 0, 0, 403, 2228, 1, 0, 0, 0, 405, 2234, 1, 0, 0, 0, 407, 2243, 1, 0, 0, 0, 409, 2252, 1, 0, 0, 0, 411, 2266, 1, 0, 0, 0, 413, 2268, 1, 0, 0, 0, 415, 2270, 1, 0, 0, 0, 417, 2273, 1, 0, 0, 0, 419, 2275, 1, 0, 0, 0, 421, 2277, 1, 0, 0, 0, 423, 2288, 1, 0, 0, 0, 425, 2293, 1, 0, 0, 0, 427, 2304, 1, 0, 0, 0, 429, 2319, 1, 0, 0, 0, 431, 2332, 1, 0, 0, 0, 433, 2344, 1, 0, 0, 0, 435, 2356, 1, 0, 0, 0, 437, 2364, 1, 0, 0, 0, 439, 2379, 1, 0, 0, 0, 441, 2385, 1, 0, 0, 0, 443, 2392, 1, 0, 0, 0, 445, 2409, 1, 0, 0, 0, 447, 2418, 1, 0, 0, 0, 449, 2431, 1, 0, 0, 0, 451, 2450, 1, 0, 0, 0, 453, 2465, 1, 0, 0, 0, 455, 2477, 1, 0, 0, 0, 457, 2487, 1, 0, 0, 0, 459, 2499, 1, 0, 0, 0, 461, 2507, 1, 0, 0, 0, 463, 2516, 1, 0, 0, 0, 465, 2528, 1, 0, 0, 0, 467, 2541, 1, 0, 0, 0, 469, 2558, 1, 0, 0, 0, 471, 2578, 1, 0, 0, 0, 473, 2591, 1, 0, 0, 0, 475, 2611, 1, 0, 0, 0, 477, 2622, 1, 0, 0, 0, 479, 2634, 1, 0, 0, 0, 481, 2648, 1, 0, 0, 0, 483, 2663, 1, 0, 0, 0, 485, 2677, 1, 0, 0, 0, 487, 2688, 1, 0, 0, 0, 489, 2700, 1, 0, 0, 0, 491, 2716, 1, 0, 0, 0, 493, 2723, 1, 0, 0, 0, 495, 2735, 1, 0, 0, 0, 497, 2746, 1, 0, 0, 0, 499, 2764, 1, 0, 0, 0, 501, 2777, 1, 0, 0, 0, 503, 2792, 1, 0, 0, 0, 505, 2798, 1, 0, 0, 0, 507, 2804, 1, 0, 0, 0, 509, 2810, 1, 0, 0, 0, 511, 2821, 1, 0, 0, 0, 513, 2833, 1, 0, 0, 0, 515, 2850, 1, 0, 0, 0, 517, 2856, 1, 0, 0, 0, 519, 2861, 1, 0, 0, 0, 521, 2867, 1, 0, 0, 0, 523, 2880, 1, 0, 0, 0, 525, 2894, 1, 0, 0, 0, 527, 2902, 1, 0, 0, 0, 529, 2909, 1, 0, 0, 0, 531, 2922, 1, 0, 0, 0, 533, 2933, 1, 0, 0, 0, 535, 2941, 1, 0, 0, 0, 537, 2955, 1, 0, 0, 0, 539, 2970, 1, 0, 0, 0, 541, 2977, 1, 0, 0, 0, 543, 2984, 1, 0, 0, 0, 545, 2992, 1, 0, 0, 0, 547, 3001, 1, 0, 0, 0, 549, 3024, 1, 0, 0, 0, 551, 3033, 1, 0, 0, 0, 553, 3050, 1, 0, 0, 0, 555, 3086, 1, 0, 0, 0, 557, 3092, 1, 0, 0, 0, 559, 3109, 1, 0, 0, 0, 561, 3126, 1, 0, 0, 0, 563, 3140, 1, 0, 0, 0, 565, 3157, 1, 0, 0, 0, 567, 3164, 1, 0, 0, 0, 569, 3191, 1, 0, 0, 0, 571, 3198, 1, 0, 0, 0, 573, 3204, 1, 0, 0, 0, 575, 3214, 1, 0, 0, 0, 577, 3235, 1, 0, 0, 0, 579, 3255, 1, 0, 0, 0, 581, 3269, 1, 0, 0, 0, 583, 3290, 1, 0, 0, 0, 585, 3298, 1, 0, 0, 0, 587, 3316, 1, 0, 0, 0, 589, 3340, 1, 0, 0, 0, 591, 3355, 1, 0, 0, 0, 593, 3376, 1, 0, 0, 0, 595, 3385, 1, 0, 0, 0, 597, 3397, 1, 0, 0, 0, 599, 3411, 1, 0, 0, 0, 601, 3426, 1, 0, 0, 0, 603, 3445, 1, 0, 0, 0, 605, 3453, 1, 0, 0, 0, 607, 3458, 1, 0, 0, 0, 609, 3470, 1, 0, 0, 0, 611, 3480, 1, 0, 0, 0, 613, 3485, 1, 0, 0, 0, 615, 3502, 1, 0, 0, 0, 617, 3512, 1, 0, 0, 0, 619, 3521, 1, 0, 0, 0, 621, 3531, 1, 0, 0, 0, 623, 3549, 1, 0, 0, 0, 625, 3551, 1, 0, 0, 0, 627, 3553, 1, 0, 0, 0, 629, 3555, 1, 0, 0, 0, 631, 3557, 1, 0, 0, 0, 633, 3559, 1, 0, 0, 0, 635, 3563, 1, 0, 0, 0, 637, 3567, 1, 0, 0, 0, 639, 3569, 1, 0, 0, 0, 641, 3571, 1, 0, 0, 0, 643, 3573, 1, 0, 0, 0, 645, 3575, 1, 0, 0, 0, 647, 3577, 1, 0, 0, 0, 649, 3579, 1, 0, 0, 0, 651, 3581, 1, 0, 0, 0, 653, 3583, 1, 0, 0, 0, 655, 3585, 1, 0, 0, 0, 657, 3587, 1, 0, 0, 0, 659, 3589, 1, 0, 0, 0, 661, 3591, 1, 0, 0, 0, 663, 3593, 1, 0, 0, 0, 665, 3595, 1, 0, 0, 0, 667, 3597, 1, 0, 0, 0, 669, 3599, 1, 0, 0, 0, 671, 3601, 1, 0, 0, 0, 673, 3603, 1, 0, 0, 0, 675, 3605, 1, 0, 0, 0, 677, 3607, 1, 0, 0, 0, 679, 3609, 1, 0, 0, 0, 681, 3611, 1, 0, 0, 0, 683, 3613, 1, 0, 0, 0, 685, 3616, 1, 0, 0, 0, 687, 3619, 1, 0, 0, 0, 689, 3642, 1, 0, 0, 0, 691, 3687, 1, 0, 0, 0, 693, 3689, 1, 0, 0, 0, 695, 3692, 1, 0, 0, 0, 697, 3694, 1, 0, 0, 0, 699, 3696, 1, 0, 0, 0, 701, 3698, 1, 0, 0, 0, 703, 3700, 1, 0, 0, 0, 705, 3710, 1, 0, 0, 0, 707, 3720, 1, 0, 0, 0, 709, 3733, 1, 0, 0, 0, 711, 3746, 1, 0, 0, 0, 713, 3759, 1, 0, 0, 0, 715, 3761, 1, 0, 0, 0, 717, 3763, 1, 0, 0, 0, 719, 3772, 1, 0, 0, 0, 721, 723, 7, 0, 0, 0, 722, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 727, 6, 0, 0, 0, 727, 2, 1, 0, 0, 0, 728, 729, 5, 47, 0, 0, 729, 730, 5, 42, 0, 0, 730, 731, 5, 33, 0, 0, 731, 733, 1, 0, 0, 0, 732, 734, 9, 0, 0, 0, 733, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 5, 42, 0, 0, 738, 739, 5, 47, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 6, 1, 1, 0, 741, 4, 1, 0, 0, 0, 742, 743, 5, 47, 0, 0, 743, 744, 5, 42, 0, 0, 744, 748, 1, 0, 0, 0, 745, 747, 9, 0, 0, 0, 746, 745, 1, 0, 0, 0, 747, 750, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 749, 751, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 751, 752, 5, 42, 0, 0, 752, 753, 5, 47, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 6, 2, 0, 0, 755, 6, 1, 0, 0, 0, 756, 757, 5, 45, 0, 0, 757, 758, 5, 45, 0, 0, 758, 761, 5, 32, 0, 0, 759, 761, 5, 35, 0, 0, 760, 756, 1, 0, 0, 0, 760, 759, 1, 0, 0, 0, 761, 765, 1, 0, 0, 0, 762, 764, 8, 1, 0, 0, 763, 762, 1, 0, 0, 0, 764, 767, 1, 0, 0, 0, 765, 763, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 773, 1, 0, 0, 0, 767, 765, 1, 0, 0, 0, 768, 770, 5, 13, 0, 0, 769, 768, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 774, 5, 10, 0, 0, 772, 774, 5, 0, 0, 1, 773, 769, 1, 0, 0, 0, 773, 772, 1, 0, 0, 0, 774, 786, 1, 0, 0, 0, 775, 776, 5, 45, 0, 0, 776, 777, 5, 45, 0, 0, 777, 783, 1, 0, 0, 0, 778, 780, 5, 13, 0, 0, 779, 778, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 784, 5, 10, 0, 0, 782, 784, 5, 0, 0, 1, 783, 779, 1, 0, 0, 0, 783, 782, 1, 0, 0, 0, 784, 786, 1, 0, 0, 0, 785, 760, 1, 0, 0, 0, 785, 775, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 6, 3, 0, 0, 788, 8, 1, 0, 0, 0, 789, 790, 7, 2, 0, 0, 790, 791, 7, 3, 0, 0, 791, 792, 7, 3, 0, 0, 792, 10, 1, 0, 0, 0, 793, 794, 7, 2, 0, 0, 794, 795, 7, 4, 0, 0, 795, 796, 7, 5, 0, 0, 796, 12, 1, 0, 0, 0, 797, 798, 7, 2, 0, 0, 798, 799, 7, 6, 0, 0, 799, 14, 1, 0, 0, 0, 800, 801, 7, 2, 0, 0, 801, 802, 7, 6, 0, 0, 802, 803, 7, 7, 0, 0, 803, 16, 1, 0, 0, 0, 804, 805, 7, 8, 0, 0, 805, 806, 7, 9, 0, 0, 806, 807, 7, 9, 0, 0, 807, 808, 7, 3, 0, 0, 808, 809, 7, 10, 0, 0, 809, 810, 7, 2, 0, 0, 810, 811, 7, 4, 0, 0, 811, 18, 1, 0, 0, 0, 812, 813, 7, 8, 0, 0, 813, 814, 7, 10, 0, 0, 814, 815, 7, 11, 0, 0, 815, 816, 7, 12, 0, 0, 816, 817, 7, 10, 0, 0, 817, 818, 7, 10, 0, 0, 818, 819, 7, 4, 0, 0, 819, 20, 1, 0, 0, 0, 820, 821, 7, 8, 0, 0, 821, 822, 7, 13, 0, 0, 822, 22, 1, 0, 0, 0, 823, 824, 7, 7, 0, 0, 824, 825, 7, 2, 0, 0, 825, 826, 7, 6, 0, 0, 826, 827, 7, 10, 0, 0, 827, 24, 1, 0, 0, 0, 828, 829, 7, 7, 0, 0, 829, 830, 7, 2, 0, 0, 830, 831, 7, 6, 0, 0, 831, 832, 7, 11, 0, 0, 832, 26, 1, 0, 0, 0, 833, 834, 7, 7, 0, 0, 834, 835, 7, 14, 0, 0, 835, 836, 7, 9, 0, 0, 836, 837, 7, 6, 0, 0, 837, 838, 7, 6, 0, 0, 838, 28, 1, 0, 0, 0, 839, 840, 7, 7, 0, 0, 840, 841, 7, 9, 0, 0, 841, 842, 7, 3, 0, 0, 842, 843, 7, 15, 0, 0, 843, 844, 7, 16, 0, 0, 844, 845, 7, 4, 0, 0, 845, 846, 7, 6, 0, 0, 846, 30, 1, 0, 0, 0, 847, 848, 7, 5, 0, 0, 848, 849, 7, 2, 0, 0, 849, 850, 7, 11, 0, 0, 850, 851, 7, 10, 0, 0, 851, 852, 7, 11, 0, 0, 852, 853, 7, 17, 0, 0, 853, 854, 7, 16, 0, 0, 854, 855, 7, 10, 0, 0, 855, 32, 1, 0, 0, 0, 856, 857, 7, 5, 0, 0, 857, 858, 7, 10, 0, 0, 858, 859, 7, 3, 0, 0, 859, 860, 7, 10, 0, 0, 860, 861, 7, 11, 0, 0, 861, 862, 7, 10, 0, 0, 862, 34, 1, 0, 0, 0, 863, 864, 7, 5, 0, 0, 864, 865, 7, 10, 0, 0, 865, 866, 7, 6, 0, 0, 866, 867, 7, 7, 0, 0, 867, 36, 1, 0, 0, 0, 868, 869, 7, 5, 0, 0, 869, 870, 7, 10, 0, 0, 870, 871, 7, 6, 0, 0, 871, 872, 7, 7, 0, 0, 872, 873, 7, 14, 0, 0, 873, 874, 7, 17, 0, 0, 874, 875, 7, 8, 0, 0, 875, 876, 7, 10, 0, 0, 876, 38, 1, 0, 0, 0, 877, 878, 7, 5, 0, 0, 878, 879, 7, 17, 0, 0, 879, 880, 7, 6, 0, 0, 880, 881, 7, 11, 0, 0, 881, 882, 7, 17, 0, 0, 882, 883, 7, 4, 0, 0, 883, 884, 7, 7, 0, 0, 884, 885, 7, 11, 0, 0, 885, 40, 1, 0, 0, 0, 886, 887, 7, 5, 0, 0, 887, 888, 7, 9, 0, 0, 888, 889, 7, 15, 0, 0, 889, 890, 7, 8, 0, 0, 890, 891, 7, 3, 0, 0, 891, 892, 7, 10, 0, 0, 892, 42, 1, 0, 0, 0, 893, 894, 7, 10, 0, 0, 894, 895, 7, 3, 0, 0, 895, 896, 7, 6, 0, 0, 896, 897, 7, 10, 0, 0, 897, 44, 1, 0, 0, 0, 898, 899, 7, 10, 0, 0, 899, 900, 7, 18, 0, 0, 900, 901, 7, 17, 0, 0, 901, 902, 7, 6, 0, 0, 902, 903, 7, 11, 0, 0, 903, 904, 7, 6, 0, 0, 904, 46, 1, 0, 0, 0, 905, 906, 7, 19, 0, 0, 906, 907, 7, 2, 0, 0, 907, 908, 7, 3, 0, 0, 908, 909, 7, 6, 0, 0, 909, 910, 7, 10, 0, 0, 910, 48, 1, 0, 0, 0, 911, 912, 7, 19, 0, 0, 912, 913, 7, 3, 0, 0, 913, 914, 7, 9, 0, 0, 914, 915, 7, 2, 0, 0, 915, 916, 7, 11, 0, 0, 916, 50, 1, 0, 0, 0, 917, 918, 7, 19, 0, 0, 918, 919, 7, 17, 0, 0, 919, 920, 7, 14, 0, 0, 920, 921, 7, 6, 0, 0, 921, 922, 7, 11, 0, 0, 922, 52, 1, 0, 0, 0, 923, 924, 7, 19, 0, 0, 924, 925, 7, 14, 0, 0, 925, 926, 7, 9, 0, 0, 926, 927, 7, 16, 0, 0, 927, 54, 1, 0, 0, 0, 928, 929, 7, 20, 0, 0, 929, 930, 7, 14, 0, 0, 930, 931, 7, 9, 0, 0, 931, 932, 7, 15, 0, 0, 932, 933, 7, 21, 0, 0, 933, 56, 1, 0, 0, 0, 934, 935, 7, 22, 0, 0, 935, 936, 7, 2, 0, 0, 936, 937, 7, 23, 0, 0, 937, 938, 7, 17, 0, 0, 938, 939, 7, 4, 0, 0, 939, 940, 7, 20, 0, 0, 940, 58, 1, 0, 0, 0, 941, 942, 7, 17, 0, 0, 942, 943, 7, 4, 0, 0, 943, 60, 1, 0, 0, 0, 944, 945, 7, 17, 0, 0, 945, 946, 7, 4, 0, 0, 946, 947, 7, 4, 0, 0, 947, 948, 7, 10, 0, 0, 948, 949, 7, 14, 0, 0, 949, 62, 1, 0, 0, 0, 950, 951, 7, 17, 0, 0, 951, 952, 7, 4, 0, 0, 952, 953, 7, 11, 0, 0, 953, 64, 1, 0, 0, 0, 954, 955, 7, 17, 0, 0, 955, 956, 7, 4, 0, 0, 956, 957, 7, 11, 0, 0, 957, 958, 7, 10, 0, 0, 958, 959, 7, 20, 0, 0, 959, 960, 7, 10, 0, 0, 960, 961, 7, 14, 0, 0, 961, 66, 1, 0, 0, 0, 962, 963, 7, 17, 0, 0, 963, 964, 7, 6, 0, 0, 964, 68, 1, 0, 0, 0, 965, 966, 7, 24, 0, 0, 966, 967, 7, 9, 0, 0, 967, 968, 7, 17, 0, 0, 968, 969, 7, 4, 0, 0, 969, 70, 1, 0, 0, 0, 970, 971, 7, 3, 0, 0, 971, 972, 7, 2, 0, 0, 972, 973, 7, 6, 0, 0, 973, 974, 7, 11, 0, 0, 974, 72, 1, 0, 0, 0, 975, 976, 7, 3, 0, 0, 976, 977, 7, 10, 0, 0, 977, 978, 7, 19, 0, 0, 978, 979, 7, 11, 0, 0, 979, 74, 1, 0, 0, 0, 980, 981, 7, 3, 0, 0, 981, 982, 7, 17, 0, 0, 982, 983, 7, 25, 0, 0, 983, 984, 7, 10, 0, 0, 984, 76, 1, 0, 0, 0, 985, 986, 7, 3, 0, 0, 986, 987, 7, 17, 0, 0, 987, 988, 7, 16, 0, 0, 988, 989, 7, 17, 0, 0, 989, 990, 7, 11, 0, 0, 990, 78, 1, 0, 0, 0, 991, 992, 7, 3, 0, 0, 992, 993, 7, 9, 0, 0, 993, 994, 7, 4, 0, 0, 994, 995, 7, 20, 0, 0, 995, 80, 1, 0, 0, 0, 996, 997, 7, 16, 0, 0, 997, 998, 7, 2, 0, 0, 998, 999, 7, 11, 0, 0, 999, 1000, 7, 7, 0, 0, 1000, 1001, 7, 22, 0, 0, 1001, 82, 1, 0, 0, 0, 1002, 1003, 7, 4, 0, 0, 1003, 1004, 7, 2, 0, 0, 1004, 1005, 7, 11, 0, 0, 1005, 1006, 7, 15, 0, 0, 1006, 1007, 7, 14, 0, 0, 1007, 1008, 7, 2, 0, 0, 1008, 1009, 7, 3, 0, 0, 1009, 84, 1, 0, 0, 0, 1010, 1011, 7, 16, 0, 0, 1011, 1012, 7, 17, 0, 0, 1012, 1013, 7, 6, 0, 0, 1013, 1014, 7, 6, 0, 0, 1014, 1015, 7, 17, 0, 0, 1015, 1016, 7, 4, 0, 0, 1016, 1017, 7, 20, 0, 0, 1017, 86, 1, 0, 0, 0, 1018, 1019, 7, 4, 0, 0, 1019, 1020, 7, 9, 0, 0, 1020, 1021, 7, 11, 0, 0, 1021, 88, 1, 0, 0, 0, 1022, 1023, 7, 4, 0, 0, 1023, 1024, 7, 15, 0, 0, 1024, 1025, 7, 3, 0, 0, 1025, 1026, 7, 3, 0, 0, 1026, 90, 1, 0, 0, 0, 1027, 1028, 7, 4, 0, 0, 1028, 1029, 7, 15, 0, 0, 1029, 1030, 7, 3, 0, 0, 1030, 1031, 7, 3, 0, 0, 1031, 1032, 7, 6, 0, 0, 1032, 92, 1, 0, 0, 0, 1033, 1034, 7, 9, 0, 0, 1034, 1035, 7, 4, 0, 0, 1035, 94, 1, 0, 0, 0, 1036, 1037, 7, 9, 0, 0, 1037, 1038, 7, 14, 0, 0, 1038, 96, 1, 0, 0, 0, 1039, 1040, 7, 9, 0, 0, 1040, 1041, 7, 14, 0, 0, 1041, 1042, 7, 5, 0, 0, 1042, 1043, 7, 10, 0, 0, 1043, 1044, 7, 14, 0, 0, 1044, 98, 1, 0, 0, 0, 1045, 1046, 7, 9, 0, 0, 1046, 1047, 7, 15, 0, 0, 1047, 1048, 7, 11, 0, 0, 1048, 1049, 7, 10, 0, 0, 1049, 1050, 7, 14, 0, 0, 1050, 100, 1, 0, 0, 0, 1051, 1052, 7, 9, 0, 0, 1052, 1053, 7, 23, 0, 0, 1053, 1054, 7, 10, 0, 0, 1054, 1055, 7, 14, 0, 0, 1055, 102, 1, 0, 0, 0, 1056, 1057, 7, 21, 0, 0, 1057, 1058, 7, 2, 0, 0, 1058, 1059, 7, 14, 0, 0, 1059, 1060, 7, 11, 0, 0, 1060, 1061, 7, 17, 0, 0, 1061, 1062, 7, 11, 0, 0, 1062, 1063, 7, 17, 0, 0, 1063, 1064, 7, 9, 0, 0, 1064, 1065, 7, 4, 0, 0, 1065, 104, 1, 0, 0, 0, 1066, 1067, 7, 14, 0, 0, 1067, 1068, 7, 10, 0, 0, 1068, 1069, 7, 20, 0, 0, 1069, 1070, 7, 10, 0, 0, 1070, 1071, 7, 18, 0, 0, 1071, 1072, 7, 21, 0, 0, 1072, 106, 1, 0, 0, 0, 1073, 1074, 7, 14, 0, 0, 1074, 1075, 7, 17, 0, 0, 1075, 1076, 7, 20, 0, 0, 1076, 1077, 7, 22, 0, 0, 1077, 1078, 7, 11, 0, 0, 1078, 108, 1, 0, 0, 0, 1079, 1080, 7, 6, 0, 0, 1080, 1081, 7, 10, 0, 0, 1081, 1082, 7, 3, 0, 0, 1082, 1083, 7, 10, 0, 0, 1083, 1084, 7, 7, 0, 0, 1084, 1085, 7, 11, 0, 0, 1085, 110, 1, 0, 0, 0, 1086, 1087, 7, 6, 0, 0, 1087, 1088, 7, 22, 0, 0, 1088, 1089, 7, 9, 0, 0, 1089, 1090, 7, 12, 0, 0, 1090, 112, 1, 0, 0, 0, 1091, 1092, 7, 6, 0, 0, 1092, 1093, 7, 11, 0, 0, 1093, 1094, 7, 14, 0, 0, 1094, 1095, 7, 17, 0, 0, 1095, 1096, 7, 4, 0, 0, 1096, 1097, 7, 20, 0, 0, 1097, 114, 1, 0, 0, 0, 1098, 1099, 7, 11, 0, 0, 1099, 1100, 7, 22, 0, 0, 1100, 1101, 7, 10, 0, 0, 1101, 1102, 7, 4, 0, 0, 1102, 116, 1, 0, 0, 0, 1103, 1104, 7, 11, 0, 0, 1104, 1105, 7, 14, 0, 0, 1105, 1106, 7, 15, 0, 0, 1106, 1107, 7, 10, 0, 0, 1107, 118, 1, 0, 0, 0, 1108, 1109, 7, 15, 0, 0, 1109, 1110, 7, 4, 0, 0, 1110, 1111, 7, 17, 0, 0, 1111, 1112, 7, 9, 0, 0, 1112, 1113, 7, 4, 0, 0, 1113, 120, 1, 0, 0, 0, 1114, 1115, 7, 15, 0, 0, 1115, 1116, 7, 6, 0, 0, 1116, 1117, 7, 17, 0, 0, 1117, 1118, 7, 4, 0, 0, 1118, 1119, 7, 20, 0, 0, 1119, 122, 1, 0, 0, 0, 1120, 1121, 7, 12, 0, 0, 1121, 1122, 7, 22, 0, 0, 1122, 1123, 7, 10, 0, 0, 1123, 1124, 7, 4, 0, 0, 1124, 124, 1, 0, 0, 0, 1125, 1126, 7, 12, 0, 0, 1126, 1127, 7, 22, 0, 0, 1127, 1128, 7, 10, 0, 0, 1128, 1129, 7, 14, 0, 0, 1129, 1130, 7, 10, 0, 0, 1130, 126, 1, 0, 0, 0, 1131, 1132, 7, 16, 0, 0, 1132, 1133, 7, 17, 0, 0, 1133, 1134, 7, 4, 0, 0, 1134, 1135, 7, 15, 0, 0, 1135, 1136, 7, 6, 0, 0, 1136, 128, 1, 0, 0, 0, 1137, 1138, 7, 2, 0, 0, 1138, 1139, 7, 23, 0, 0, 1139, 1140, 7, 20, 0, 0, 1140, 130, 1, 0, 0, 0, 1141, 1142, 7, 7, 0, 0, 1142, 1143, 7, 9, 0, 0, 1143, 1144, 7, 15, 0, 0, 1144, 1145, 7, 4, 0, 0, 1145, 1146, 7, 11, 0, 0, 1146, 132, 1, 0, 0, 0, 1147, 1148, 7, 16, 0, 0, 1148, 1149, 7, 2, 0, 0, 1149, 1150, 7, 18, 0, 0, 1150, 134, 1, 0, 0, 0, 1151, 1152, 7, 16, 0, 0, 1152, 1153, 7, 17, 0, 0, 1153, 1154, 7, 4, 0, 0, 1154, 136, 1, 0, 0, 0, 1155, 1156, 7, 6, 0, 0, 1156, 1157, 7, 15, 0, 0, 1157, 1158, 7, 16, 0, 0, 1158, 138, 1, 0, 0, 0, 1159, 1160, 7, 23, 0, 0, 1160, 1161, 7, 2, 0, 0, 1161, 1162, 7, 14, 0, 0, 1162, 1163, 5, 95, 0, 0, 1163, 1164, 7, 21, 0, 0, 1164, 1165, 7, 9, 0, 0, 1165, 1166, 7, 21, 0, 0, 1166, 140, 1, 0, 0, 0, 1167, 1168, 7, 23, 0, 0, 1168, 1169, 7, 2, 0, 0, 1169, 1170, 7, 14, 0, 0, 1170, 1171, 5, 95, 0, 0, 1171, 1172, 7, 6, 0, 0, 1172, 1173, 7, 2, 0, 0, 1173, 1174, 7, 16, 0, 0, 1174, 1175, 7, 21, 0, 0, 1175, 142, 1, 0, 0, 0, 1176, 1177, 7, 23, 0, 0, 1177, 1178, 7, 2, 0, 0, 1178, 1179, 7, 14, 0, 0, 1179, 1180, 7, 17, 0, 0, 1180, 1181, 7, 2, 0, 0, 1181, 1182, 7, 4, 0, 0, 1182, 1183, 7, 7, 0, 0, 1183, 1184, 7, 10, 0, 0, 1184, 144, 1, 0, 0, 0, 1185, 1186, 7, 6, 0, 0, 1186, 1187, 7, 11, 0, 0, 1187, 1188, 7, 5, 0, 0, 1188, 146, 1, 0, 0, 0, 1189, 1190, 7, 6, 0, 0, 1190, 1191, 7, 11, 0, 0, 1191, 1192, 7, 5, 0, 0, 1192, 1193, 7, 5, 0, 0, 1193, 1194, 7, 10, 0, 0, 1194, 1195, 7, 23, 0, 0, 1195, 148, 1, 0, 0, 0, 1196, 1197, 7, 6, 0, 0, 1197, 1198, 7, 11, 0, 0, 1198, 1199, 7, 5, 0, 0, 1199, 1200, 7, 5, 0, 0, 1200, 1201, 7, 10, 0, 0, 1201, 1202, 7, 23, 0, 0, 1202, 1203, 5, 95, 0, 0, 1203, 1204, 7, 21, 0, 0, 1204, 1205, 7, 9, 0, 0, 1205, 1206, 7, 21, 0, 0, 1206, 150, 1, 0, 0, 0, 1207, 1208, 7, 6, 0, 0, 1208, 1209, 7, 11, 0, 0, 1209, 1210, 7, 5, 0, 0, 1210, 1211, 7, 5, 0, 0, 1211, 1212, 7, 10, 0, 0, 1212, 1213, 7, 23, 0, 0, 1213, 1214, 5, 95, 0, 0, 1214, 1215, 7, 6, 0, 0, 1215, 1216, 7, 2, 0, 0, 1216, 1217, 7, 16, 0, 0, 1217, 1218, 7, 21, 0, 0, 1218, 152, 1, 0, 0, 0, 1219, 1220, 7, 6, 0, 0, 1220, 1221, 7, 15, 0, 0, 1221, 1222, 7, 8, 0, 0, 1222, 1223, 7, 6, 0, 0, 1223, 1224, 7, 11, 0, 0, 1224, 1225, 7, 14, 0, 0, 1225, 1226, 7, 17, 0, 0, 1226, 1227, 7, 4, 0, 0, 1227, 1228, 7, 20, 0, 0, 1228, 154, 1, 0, 0, 0, 1229, 1230, 7, 11, 0, 0, 1230, 1231, 7, 14, 0, 0, 1231, 1232, 7, 17, 0, 0, 1232, 1233, 7, 16, 0, 0, 1233, 156, 1, 0, 0, 0, 1234, 1235, 7, 10, 0, 0, 1235, 1236, 7, 4, 0, 0, 1236, 1237, 7, 5, 0, 0, 1237, 158, 1, 0, 0, 0, 1238, 1239, 7, 19, 0, 0, 1239, 1240, 7, 15, 0, 0, 1240, 1241, 7, 3, 0, 0, 1241, 1242, 7, 3, 0, 0, 1242, 160, 1, 0, 0, 0, 1243, 1244, 7, 9, 0, 0, 1244, 1245, 7, 19, 0, 0, 1245, 1246, 7, 19, 0, 0, 1246, 1247, 7, 6, 0, 0, 1247, 1248, 7, 10, 0, 0, 1248, 1249, 7, 11, 0, 0, 1249, 162, 1, 0, 0, 0, 1250, 1251, 7, 17, 0, 0, 1251, 1252, 7, 4, 0, 0, 1252, 1253, 7, 11, 0, 0, 1253, 1254, 7, 10, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 1256, 7, 23, 0, 0, 1256, 1257, 7, 2, 0, 0, 1257, 1258, 7, 3, 0, 0, 1258, 164, 1, 0, 0, 0, 1259, 1260, 7, 16, 0, 0, 1260, 1261, 7, 17, 0, 0, 1261, 1262, 7, 7, 0, 0, 1262, 1263, 7, 14, 0, 0, 1263, 1264, 7, 9, 0, 0, 1264, 1265, 7, 6, 0, 0, 1265, 1266, 7, 10, 0, 0, 1266, 1267, 7, 7, 0, 0, 1267, 1268, 7, 9, 0, 0, 1268, 1269, 7, 4, 0, 0, 1269, 1270, 7, 5, 0, 0, 1270, 166, 1, 0, 0, 0, 1271, 1272, 7, 6, 0, 0, 1272, 1273, 7, 10, 0, 0, 1273, 1274, 7, 7, 0, 0, 1274, 1275, 7, 9, 0, 0, 1275, 1276, 7, 4, 0, 0, 1276, 1277, 7, 5, 0, 0, 1277, 168, 1, 0, 0, 0, 1278, 1279, 7, 16, 0, 0, 1279, 1280, 7, 17, 0, 0, 1280, 1281, 7, 4, 0, 0, 1281, 1282, 7, 15, 0, 0, 1282, 1283, 7, 11, 0, 0, 1283, 1284, 7, 10, 0, 0, 1284, 170, 1, 0, 0, 0, 1285, 1286, 7, 22, 0, 0, 1286, 1287, 7, 9, 0, 0, 1287, 1288, 7, 15, 0, 0, 1288, 1289, 7, 14, 0, 0, 1289, 172, 1, 0, 0, 0, 1290, 1291, 7, 5, 0, 0, 1291, 1292, 7, 2, 0, 0, 1292, 1293, 7, 13, 0, 0, 1293, 174, 1, 0, 0, 0, 1294, 1295, 7, 12, 0, 0, 1295, 1296, 7, 10, 0, 0, 1296, 1297, 7, 10, 0, 0, 1297, 1298, 7, 25, 0, 0, 1298, 176, 1, 0, 0, 0, 1299, 1300, 7, 16, 0, 0, 1300, 1301, 7, 9, 0, 0, 1301, 1302, 7, 4, 0, 0, 1302, 1303, 7, 11, 0, 0, 1303, 1304, 7, 22, 0, 0, 1304, 178, 1, 0, 0, 0, 1305, 1306, 7, 26, 0, 0, 1306, 1307, 7, 15, 0, 0, 1307, 1308, 7, 2, 0, 0, 1308, 1309, 7, 14, 0, 0, 1309, 1310, 7, 11, 0, 0, 1310, 1311, 7, 10, 0, 0, 1311, 1312, 7, 14, 0, 0, 1312, 180, 1, 0, 0, 0, 1313, 1314, 7, 13, 0, 0, 1314, 1315, 7, 10, 0, 0, 1315, 1316, 7, 2, 0, 0, 1316, 1317, 7, 14, 0, 0, 1317, 182, 1, 0, 0, 0, 1318, 1319, 7, 6, 0, 0, 1319, 1320, 7, 10, 0, 0, 1320, 1321, 7, 7, 0, 0, 1321, 1322, 7, 9, 0, 0, 1322, 1323, 7, 4, 0, 0, 1323, 1324, 7, 5, 0, 0, 1324, 1325, 5, 95, 0, 0, 1325, 1326, 7, 16, 0, 0, 1326, 1327, 7, 17, 0, 0, 1327, 1328, 7, 7, 0, 0, 1328, 1329, 7, 14, 0, 0, 1329, 1330, 7, 9, 0, 0, 1330, 1331, 7, 6, 0, 0, 1331, 1332, 7, 10, 0, 0, 1332, 1333, 7, 7, 0, 0, 1333, 1334, 7, 9, 0, 0, 1334, 1335, 7, 4, 0, 0, 1335, 1336, 7, 5, 0, 0, 1336, 184, 1, 0, 0, 0, 1337, 1338, 7, 16, 0, 0, 1338, 1339, 7, 17, 0, 0, 1339, 1340, 7, 4, 0, 0, 1340, 1341, 7, 15, 0, 0, 1341, 1342, 7, 11, 0, 0, 1342, 1343, 7, 10, 0, 0, 1343, 1344, 5, 95, 0, 0, 1344, 1345, 7, 16, 0, 0, 1345, 1346, 7, 17, 0, 0, 1346, 1347, 7, 7, 0, 0, 1347, 1348, 7, 14, 0, 0, 1348, 1349, 7, 9, 0, 0, 1349, 1350, 7, 6, 0, 0, 1350, 1351, 7, 10, 0, 0, 1351, 1352, 7, 7, 0, 0, 1352, 1353, 7, 9, 0, 0, 1353, 1354, 7, 4, 0, 0, 1354, 1355, 7, 5, 0, 0, 1355, 186, 1, 0, 0, 0, 1356, 1357, 7, 16, 0, 0, 1357, 1358, 7, 17, 0, 0, 1358, 1359, 7, 4, 0, 0, 1359, 1360, 7, 15, 0, 0, 1360, 1361, 7, 11, 0, 0, 1361, 1362, 7, 10, 0, 0, 1362, 1363, 5, 95, 0, 0, 1363, 1364, 7, 6, 0, 0, 1364, 1365, 7, 10, 0, 0, 1365, 1366, 7, 7, 0, 0, 1366, 1367, 7, 9, 0, 0, 1367, 1368, 7, 4, 0, 0, 1368, 1369, 7, 5, 0, 0, 1369, 188, 1, 0, 0, 0, 1370, 1371, 7, 22, 0, 0, 1371, 1372, 7, 9, 0, 0, 1372, 1373, 7, 15, 0, 0, 1373, 1374, 7, 14, 0, 0, 1374, 1375, 5, 95, 0, 0, 1375, 1376, 7, 16, 0, 0, 1376, 1377, 7, 17, 0, 0, 1377, 1378, 7, 7, 0, 0, 1378, 1379, 7, 14, 0, 0, 1379, 1380, 7, 9, 0, 0, 1380, 1381, 7, 6, 0, 0, 1381, 1382, 7, 10, 0, 0, 1382, 1383, 7, 7, 0, 0, 1383, 1384, 7, 9, 0, 0, 1384, 1385, 7, 4, 0, 0, 1385, 1386, 7, 5, 0, 0, 1386, 190, 1, 0, 0, 0, 1387, 1388, 7, 22, 0, 0, 1388, 1389, 7, 9, 0, 0, 1389, 1390, 7, 15, 0, 0, 1390, 1391, 7, 14, 0, 0, 1391, 1392, 5, 95, 0, 0, 1392, 1393, 7, 6, 0, 0, 1393, 1394, 7, 10, 0, 0, 1394, 1395, 7, 7, 0, 0, 1395, 1396, 7, 9, 0, 0, 1396, 1397, 7, 4, 0, 0, 1397, 1398, 7, 5, 0, 0, 1398, 192, 1, 0, 0, 0, 1399, 1400, 7, 22, 0, 0, 1400, 1401, 7, 9, 0, 0, 1401, 1402, 7, 15, 0, 0, 1402, 1403, 7, 14, 0, 0, 1403, 1404, 5, 95, 0, 0, 1404, 1405, 7, 16, 0, 0, 1405, 1406, 7, 17, 0, 0, 1406, 1407, 7, 4, 0, 0, 1407, 1408, 7, 15, 0, 0, 1408, 1409, 7, 11, 0, 0, 1409, 1410, 7, 10, 0, 0, 1410, 194, 1, 0, 0, 0, 1411, 1412, 7, 5, 0, 0, 1412, 1413, 7, 2, 0, 0, 1413, 1414, 7, 13, 0, 0, 1414, 1415, 5, 95, 0, 0, 1415, 1416, 7, 16, 0, 0, 1416, 1417, 7, 17, 0, 0, 1417, 1418, 7, 7, 0, 0, 1418, 1419, 7, 14, 0, 0, 1419, 1420, 7, 9, 0, 0, 1420, 1421, 7, 6, 0, 0, 1421, 1422, 7, 10, 0, 0, 1422, 1423, 7, 7, 0, 0, 1423, 1424, 7, 9, 0, 0, 1424, 1425, 7, 4, 0, 0, 1425, 1426, 7, 5, 0, 0, 1426, 196, 1, 0, 0, 0, 1427, 1428, 7, 5, 0, 0, 1428, 1429, 7, 2, 0, 0, 1429, 1430, 7, 13, 0, 0, 1430, 1431, 5, 95, 0, 0, 1431, 1432, 7, 6, 0, 0, 1432, 1433, 7, 10, 0, 0, 1433, 1434, 7, 7, 0, 0, 1434, 1435, 7, 9, 0, 0, 1435, 1436, 7, 4, 0, 0, 1436, 1437, 7, 5, 0, 0, 1437, 198, 1, 0, 0, 0, 1438, 1439, 7, 5, 0, 0, 1439, 1440, 7, 2, 0, 0, 1440, 1441, 7, 13, 0, 0, 1441, 1442, 5, 95, 0, 0, 1442, 1443, 7, 16, 0, 0, 1443, 1444, 7, 17, 0, 0, 1444, 1445, 7, 4, 0, 0, 1445, 1446, 7, 15, 0, 0, 1446, 1447, 7, 11, 0, 0, 1447, 1448, 7, 10, 0, 0, 1448, 200, 1, 0, 0, 0, 1449, 1450, 7, 5, 0, 0, 1450, 1451, 7, 2, 0, 0, 1451, 1452, 7, 13, 0, 0, 1452, 1453, 5, 95, 0, 0, 1453, 1454, 7, 22, 0, 0, 1454, 1455, 7, 9, 0, 0, 1455, 1456, 7, 15, 0, 0, 1456, 1457, 7, 14, 0, 0, 1457, 202, 1, 0, 0, 0, 1458, 1459, 7, 13, 0, 0, 1459, 1460, 7, 10, 0, 0, 1460, 1461, 7, 2, 0, 0, 1461, 1462, 7, 14, 0, 0, 1462, 1463, 5, 95, 0, 0, 1463, 1464, 7, 16, 0, 0, 1464, 1465, 7, 9, 0, 0, 1465, 1466, 7, 4, 0, 0, 1466, 1467, 7, 11, 0, 0, 1467, 1468, 7, 22, 0, 0, 1468, 204, 1, 0, 0, 0, 1469, 1470, 7, 11, 0, 0, 1470, 1471, 7, 2, 0, 0, 1471, 1472, 7, 8, 0, 0, 1472, 1473, 7, 3, 0, 0, 1473, 1474, 7, 10, 0, 0, 1474, 1475, 7, 6, 0, 0, 1475, 206, 1, 0, 0, 0, 1476, 1477, 7, 2, 0, 0, 1477, 1478, 7, 8, 0, 0, 1478, 1479, 7, 6, 0, 0, 1479, 208, 1, 0, 0, 0, 1480, 1481, 7, 2, 0, 0, 1481, 1482, 7, 7, 0, 0, 1482, 1483, 7, 9, 0, 0, 1483, 1484, 7, 6, 0, 0, 1484, 210, 1, 0, 0, 0, 1485, 1486, 7, 2, 0, 0, 1486, 1487, 7, 5, 0, 0, 1487, 1488, 7, 5, 0, 0, 1488, 212, 1, 0, 0, 0, 1489, 1490, 7, 2, 0, 0, 1490, 1491, 7, 5, 0, 0, 1491, 1492, 7, 5, 0, 0, 1492, 1493, 7, 11, 0, 0, 1493, 1494, 7, 17, 0, 0, 1494, 1495, 7, 16, 0, 0, 1495, 1496, 7, 10, 0, 0, 1496, 214, 1, 0, 0, 0, 1497, 1498, 7, 2, 0, 0, 1498, 1499, 7, 6, 0, 0, 1499, 1500, 7, 7, 0, 0, 1500, 1501, 7, 17, 0, 0, 1501, 1502, 7, 17, 0, 0, 1502, 216, 1, 0, 0, 0, 1503, 1504, 7, 2, 0, 0, 1504, 1505, 7, 6, 0, 0, 1505, 1506, 7, 17, 0, 0, 1506, 1507, 7, 4, 0, 0, 1507, 218, 1, 0, 0, 0, 1508, 1509, 7, 2, 0, 0, 1509, 1510, 7, 11, 0, 0, 1510, 1511, 7, 2, 0, 0, 1511, 1512, 7, 4, 0, 0, 1512, 220, 1, 0, 0, 0, 1513, 1514, 7, 2, 0, 0, 1514, 1515, 7, 11, 0, 0, 1515, 1516, 7, 2, 0, 0, 1516, 1517, 7, 4, 0, 0, 1517, 1518, 5, 50, 0, 0, 1518, 222, 1, 0, 0, 0, 1519, 1520, 7, 7, 0, 0, 1520, 1521, 7, 8, 0, 0, 1521, 1522, 7, 14, 0, 0, 1522, 1523, 7, 11, 0, 0, 1523, 224, 1, 0, 0, 0, 1524, 1525, 7, 7, 0, 0, 1525, 1526, 7, 10, 0, 0, 1526, 1527, 7, 17, 0, 0, 1527, 1528, 7, 3, 0, 0, 1528, 226, 1, 0, 0, 0, 1529, 1530, 7, 7, 0, 0, 1530, 1531, 7, 10, 0, 0, 1531, 1532, 7, 17, 0, 0, 1532, 1533, 7, 3, 0, 0, 1533, 1534, 7, 17, 0, 0, 1534, 1535, 7, 4, 0, 0, 1535, 1536, 7, 20, 0, 0, 1536, 228, 1, 0, 0, 0, 1537, 1538, 7, 7, 0, 0, 1538, 1539, 7, 9, 0, 0, 1539, 1540, 7, 4, 0, 0, 1540, 1541, 7, 7, 0, 0, 1541, 1542, 7, 2, 0, 0, 1542, 1543, 7, 11, 0, 0, 1543, 230, 1, 0, 0, 0, 1544, 1545, 7, 7, 0, 0, 1545, 1546, 7, 9, 0, 0, 1546, 1547, 7, 4, 0, 0, 1547, 1548, 7, 7, 0, 0, 1548, 1549, 7, 2, 0, 0, 1549, 1550, 7, 11, 0, 0, 1550, 1551, 5, 95, 0, 0, 1551, 1552, 7, 12, 0, 0, 1552, 1553, 7, 6, 0, 0, 1553, 232, 1, 0, 0, 0, 1554, 1555, 7, 7, 0, 0, 1555, 1556, 7, 9, 0, 0, 1556, 1557, 7, 4, 0, 0, 1557, 1558, 7, 23, 0, 0, 1558, 234, 1, 0, 0, 0, 1559, 1560, 7, 7, 0, 0, 1560, 1561, 7, 9, 0, 0, 1561, 1562, 7, 4, 0, 0, 1562, 1563, 7, 23, 0, 0, 1563, 1564, 7, 10, 0, 0, 1564, 1565, 7, 14, 0, 0, 1565, 1566, 7, 11, 0, 0, 1566, 1567, 5, 95, 0, 0, 1567, 1568, 7, 11, 0, 0, 1568, 1569, 7, 27, 0, 0, 1569, 236, 1, 0, 0, 0, 1570, 1571, 7, 7, 0, 0, 1571, 1572, 7, 9, 0, 0, 1572, 1573, 7, 6, 0, 0, 1573, 238, 1, 0, 0, 0, 1574, 1575, 7, 7, 0, 0, 1575, 1576, 7, 9, 0, 0, 1576, 1577, 7, 6, 0, 0, 1577, 1578, 7, 22, 0, 0, 1578, 240, 1, 0, 0, 0, 1579, 1580, 7, 7, 0, 0, 1580, 1581, 7, 9, 0, 0, 1581, 1582, 7, 11, 0, 0, 1582, 242, 1, 0, 0, 0, 1583, 1584, 7, 7, 0, 0, 1584, 1585, 7, 14, 0, 0, 1585, 1586, 7, 7, 0, 0, 1586, 1587, 5, 51, 0, 0, 1587, 1588, 5, 50, 0, 0, 1588, 244, 1, 0, 0, 0, 1589, 1590, 7, 7, 0, 0, 1590, 1591, 7, 15, 0, 0, 1591, 1592, 7, 14, 0, 0, 1592, 1593, 7, 5, 0, 0, 1593, 1594, 7, 2, 0, 0, 1594, 1595, 7, 11, 0, 0, 1595, 1596, 7, 10, 0, 0, 1596, 246, 1, 0, 0, 0, 1597, 1598, 7, 7, 0, 0, 1598, 1599, 7, 15, 0, 0, 1599, 1600, 7, 14, 0, 0, 1600, 1601, 7, 11, 0, 0, 1601, 1602, 7, 17, 0, 0, 1602, 1603, 7, 16, 0, 0, 1603, 1604, 7, 10, 0, 0, 1604, 248, 1, 0, 0, 0, 1605, 1606, 7, 7, 0, 0, 1606, 1607, 7, 15, 0, 0, 1607, 1608, 7, 14, 0, 0, 1608, 1609, 7, 14, 0, 0, 1609, 1610, 7, 10, 0, 0, 1610, 1611, 7, 4, 0, 0, 1611, 1612, 7, 11, 0, 0, 1612, 1613, 5, 95, 0, 0, 1613, 1614, 7, 5, 0, 0, 1614, 1615, 7, 2, 0, 0, 1615, 1616, 7, 11, 0, 0, 1616, 1617, 7, 10, 0, 0, 1617, 250, 1, 0, 0, 0, 1618, 1619, 7, 7, 0, 0, 1619, 1620, 7, 15, 0, 0, 1620, 1621, 7, 14, 0, 0, 1621, 1622, 7, 14, 0, 0, 1622, 1623, 7, 10, 0, 0, 1623, 1624, 7, 4, 0, 0, 1624, 1625, 7, 11, 0, 0, 1625, 1626, 5, 95, 0, 0, 1626, 1627, 7, 11, 0, 0, 1627, 1628, 7, 17, 0, 0, 1628, 1629, 7, 16, 0, 0, 1629, 1630, 7, 10, 0, 0, 1630, 252, 1, 0, 0, 0, 1631, 1632, 7, 7, 0, 0, 1632, 1633, 7, 15, 0, 0, 1633, 1634, 7, 14, 0, 0, 1634, 1635, 7, 14, 0, 0, 1635, 1636, 7, 10, 0, 0, 1636, 1637, 7, 4, 0, 0, 1637, 1638, 7, 11, 0, 0, 1638, 1639, 5, 95, 0, 0, 1639, 1640, 7, 11, 0, 0, 1640, 1641, 7, 17, 0, 0, 1641, 1642, 7, 16, 0, 0, 1642, 1643, 7, 10, 0, 0, 1643, 1644, 7, 6, 0, 0, 1644, 1645, 7, 11, 0, 0, 1645, 1646, 7, 2, 0, 0, 1646, 1647, 7, 16, 0, 0, 1647, 1648, 7, 21, 0, 0, 1648, 254, 1, 0, 0, 0, 1649, 1650, 7, 5, 0, 0, 1650, 1651, 7, 2, 0, 0, 1651, 1652, 7, 11, 0, 0, 1652, 1653, 7, 10, 0, 0, 1653, 256, 1, 0, 0, 0, 1654, 1655, 7, 5, 0, 0, 1655, 1656, 7, 2, 0, 0, 1656, 1657, 7, 11, 0, 0, 1657, 1658, 7, 10, 0, 0, 1658, 1659, 5, 95, 0, 0, 1659, 1660, 7, 2, 0, 0, 1660, 1661, 7, 5, 0, 0, 1661, 1662, 7, 5, 0, 0, 1662, 258, 1, 0, 0, 0, 1663, 1664, 7, 5, 0, 0, 1664, 1665, 7, 2, 0, 0, 1665, 1666, 7, 11, 0, 0, 1666, 1667, 7, 10, 0, 0, 1667, 1668, 5, 95, 0, 0, 1668, 1669, 7, 19, 0, 0, 1669, 1670, 7, 9, 0, 0, 1670, 1671, 7, 14, 0, 0, 1671, 1672, 7, 16, 0, 0, 1672, 1673, 7, 2, 0, 0, 1673, 1674, 7, 11, 0, 0, 1674, 260, 1, 0, 0, 0, 1675, 1676, 7, 5, 0, 0, 1676, 1677, 7, 2, 0, 0, 1677, 1678, 7, 11, 0, 0, 1678, 1679, 7, 10, 0, 0, 1679, 1680, 5, 95, 0, 0, 1680, 1681, 7, 6, 0, 0, 1681, 1682, 7, 15, 0, 0, 1682, 1683, 7, 8, 0, 0, 1683, 262, 1, 0, 0, 0, 1684, 1685, 7, 5, 0, 0, 1685, 1686, 7, 2, 0, 0, 1686, 1687, 7, 11, 0, 0, 1687, 1688, 7, 10, 0, 0, 1688, 1689, 7, 5, 0, 0, 1689, 1690, 7, 17, 0, 0, 1690, 1691, 7, 19, 0, 0, 1691, 1692, 7, 19, 0, 0, 1692, 264, 1, 0, 0, 0, 1693, 1694, 7, 5, 0, 0, 1694, 1695, 7, 2, 0, 0, 1695, 1696, 7, 13, 0, 0, 1696, 1697, 7, 4, 0, 0, 1697, 1698, 7, 2, 0, 0, 1698, 1699, 7, 16, 0, 0, 1699, 1700, 7, 10, 0, 0, 1700, 266, 1, 0, 0, 0, 1701, 1702, 7, 5, 0, 0, 1702, 1703, 7, 2, 0, 0, 1703, 1704, 7, 13, 0, 0, 1704, 1705, 7, 9, 0, 0, 1705, 1706, 7, 19, 0, 0, 1706, 1707, 7, 16, 0, 0, 1707, 1708, 7, 9, 0, 0, 1708, 1709, 7, 4, 0, 0, 1709, 1710, 7, 11, 0, 0, 1710, 1711, 7, 22, 0, 0, 1711, 268, 1, 0, 0, 0, 1712, 1713, 7, 5, 0, 0, 1713, 1714, 7, 2, 0, 0, 1714, 1715, 7, 13, 0, 0, 1715, 1716, 7, 9, 0, 0, 1716, 1717, 7, 19, 0, 0, 1717, 1718, 7, 12, 0, 0, 1718, 1719, 7, 10, 0, 0, 1719, 1720, 7, 10, 0, 0, 1720, 1721, 7, 25, 0, 0, 1721, 270, 1, 0, 0, 0, 1722, 1723, 7, 5, 0, 0, 1723, 1724, 7, 2, 0, 0, 1724, 1725, 7, 13, 0, 0, 1725, 1726, 7, 9, 0, 0, 1726, 1727, 7, 19, 0, 0, 1727, 1728, 7, 13, 0, 0, 1728, 1729, 7, 10, 0, 0, 1729, 1730, 7, 2, 0, 0, 1730, 1731, 7, 14, 0, 0, 1731, 272, 1, 0, 0, 0, 1732, 1733, 7, 5, 0, 0, 1733, 1734, 7, 10, 0, 0, 1734, 1735, 7, 20, 0, 0, 1735, 1736, 7, 14, 0, 0, 1736, 1737, 7, 10, 0, 0, 1737, 1738, 7, 10, 0, 0, 1738, 1739, 7, 6, 0, 0, 1739, 274, 1, 0, 0, 0, 1740, 1741, 7, 5, 0, 0, 1741, 1742, 7, 17, 0, 0, 1742, 1743, 7, 23, 0, 0, 1743, 1744, 7, 17, 0, 0, 1744, 1745, 7, 5, 0, 0, 1745, 1746, 7, 10, 0, 0, 1746, 276, 1, 0, 0, 0, 1747, 1748, 7, 10, 0, 0, 1748, 278, 1, 0, 0, 0, 1749, 1750, 7, 10, 0, 0, 1750, 1751, 7, 18, 0, 0, 1751, 1752, 7, 21, 0, 0, 1752, 280, 1, 0, 0, 0, 1753, 1754, 7, 10, 0, 0, 1754, 1755, 7, 18, 0, 0, 1755, 1756, 7, 21, 0, 0, 1756, 1757, 7, 16, 0, 0, 1757, 1758, 5, 49, 0, 0, 1758, 282, 1, 0, 0, 0, 1759, 1760, 7, 10, 0, 0, 1760, 1761, 7, 18, 0, 0, 1761, 1762, 7, 11, 0, 0, 1762, 1763, 7, 14, 0, 0, 1763, 1764, 7, 2, 0, 0, 1764, 1765, 7, 7, 0, 0, 1765, 1766, 7, 11, 0, 0, 1766, 284, 1, 0, 0, 0, 1767, 1768, 7, 19, 0, 0, 1768, 1769, 7, 3, 0, 0, 1769, 1770, 7, 9, 0, 0, 1770, 1771, 7, 9, 0, 0, 1771, 1772, 7, 14, 0, 0, 1772, 286, 1, 0, 0, 0, 1773, 1774, 7, 19, 0, 0, 1774, 1775, 7, 14, 0, 0, 1775, 1776, 7, 9, 0, 0, 1776, 1777, 7, 16, 0, 0, 1777, 1778, 5, 95, 0, 0, 1778, 1779, 7, 5, 0, 0, 1779, 1780, 7, 2, 0, 0, 1780, 1781, 7, 13, 0, 0, 1781, 1782, 7, 6, 0, 0, 1782, 288, 1, 0, 0, 0, 1783, 1784, 7, 19, 0, 0, 1784, 1785, 7, 14, 0, 0, 1785, 1786, 7, 9, 0, 0, 1786, 1787, 7, 16, 0, 0, 1787, 1788, 5, 95, 0, 0, 1788, 1789, 7, 15, 0, 0, 1789, 1790, 7, 4, 0, 0, 1790, 1791, 7, 17, 0, 0, 1791, 1792, 7, 18, 0, 0, 1792, 1793, 7, 11, 0, 0, 1793, 1794, 7, 17, 0, 0, 1794, 1795, 7, 16, 0, 0, 1795, 1796, 7, 10, 0, 0, 1796, 290, 1, 0, 0, 0, 1797, 1798, 7, 20, 0, 0, 1798, 1799, 7, 10, 0, 0, 1799, 1800, 7, 11, 0, 0, 1800, 1801, 5, 95, 0, 0, 1801, 1802, 7, 19, 0, 0, 1802, 1803, 7, 9, 0, 0, 1803, 1804, 7, 14, 0, 0, 1804, 1805, 7, 16, 0, 0, 1805, 1806, 7, 2, 0, 0, 1806, 1807, 7, 11, 0, 0, 1807, 292, 1, 0, 0, 0, 1808, 1809, 7, 17, 0, 0, 1809, 1810, 7, 19, 0, 0, 1810, 294, 1, 0, 0, 0, 1811, 1812, 7, 17, 0, 0, 1812, 1813, 7, 19, 0, 0, 1813, 1814, 7, 4, 0, 0, 1814, 1815, 7, 15, 0, 0, 1815, 1816, 7, 3, 0, 0, 1816, 1817, 7, 3, 0, 0, 1817, 296, 1, 0, 0, 0, 1818, 1819, 7, 17, 0, 0, 1819, 1820, 7, 6, 0, 0, 1820, 1821, 7, 4, 0, 0, 1821, 1822, 7, 15, 0, 0, 1822, 1823, 7, 3, 0, 0, 1823, 1824, 7, 3, 0, 0, 1824, 298, 1, 0, 0, 0, 1825, 1826, 7, 3, 0, 0, 1826, 1827, 7, 2, 0, 0, 1827, 1828, 7, 6, 0, 0, 1828, 1829, 7, 11, 0, 0, 1829, 1830, 5, 95, 0, 0, 1830, 1831, 7, 5, 0, 0, 1831, 1832, 7, 2, 0, 0, 1832, 1833, 7, 13, 0, 0, 1833, 300, 1, 0, 0, 0, 1834, 1835, 7, 3, 0, 0, 1835, 1836, 7, 10, 0, 0, 1836, 1837, 7, 4, 0, 0, 1837, 1838, 7, 20, 0, 0, 1838, 1839, 7, 11, 0, 0, 1839, 1840, 7, 22, 0, 0, 1840, 302, 1, 0, 0, 0, 1841, 1842, 7, 3, 0, 0, 1842, 1843, 7, 4, 0, 0, 1843, 304, 1, 0, 0, 0, 1844, 1845, 7, 3, 0, 0, 1845, 1846, 7, 9, 0, 0, 1846, 1847, 7, 7, 0, 0, 1847, 1848, 7, 2, 0, 0, 1848, 1849, 7, 3, 0, 0, 1849, 1850, 7, 11, 0, 0, 1850, 1851, 7, 17, 0, 0, 1851, 1852, 7, 16, 0, 0, 1852, 1853, 7, 10, 0, 0, 1853, 306, 1, 0, 0, 0, 1854, 1855, 7, 3, 0, 0, 1855, 1856, 7, 9, 0, 0, 1856, 1857, 7, 7, 0, 0, 1857, 1858, 7, 2, 0, 0, 1858, 1859, 7, 3, 0, 0, 1859, 1860, 7, 11, 0, 0, 1860, 1861, 7, 17, 0, 0, 1861, 1862, 7, 16, 0, 0, 1862, 1863, 7, 10, 0, 0, 1863, 1864, 7, 6, 0, 0, 1864, 1865, 7, 11, 0, 0, 1865, 1866, 7, 2, 0, 0, 1866, 1867, 7, 16, 0, 0, 1867, 1868, 7, 21, 0, 0, 1868, 308, 1, 0, 0, 0, 1869, 1870, 7, 3, 0, 0, 1870, 1871, 7, 9, 0, 0, 1871, 1872, 7, 7, 0, 0, 1872, 1873, 7, 2, 0, 0, 1873, 1874, 7, 11, 0, 0, 1874, 1875, 7, 10, 0, 0, 1875, 310, 1, 0, 0, 0, 1876, 1877, 7, 3, 0, 0, 1877, 1878, 7, 9, 0, 0, 1878, 1879, 7, 20, 0, 0, 1879, 312, 1, 0, 0, 0, 1880, 1881, 7, 3, 0, 0, 1881, 1882, 7, 9, 0, 0, 1882, 1883, 7, 20, 0, 0, 1883, 1884, 5, 49, 0, 0, 1884, 1885, 5, 48, 0, 0, 1885, 314, 1, 0, 0, 0, 1886, 1887, 7, 3, 0, 0, 1887, 1888, 7, 9, 0, 0, 1888, 1889, 7, 20, 0, 0, 1889, 1890, 5, 50, 0, 0, 1890, 316, 1, 0, 0, 0, 1891, 1892, 7, 3, 0, 0, 1892, 1893, 7, 9, 0, 0, 1893, 1894, 7, 12, 0, 0, 1894, 1895, 7, 10, 0, 0, 1895, 1896, 7, 14, 0, 0, 1896, 318, 1, 0, 0, 0, 1897, 1898, 7, 3, 0, 0, 1898, 1899, 7, 11, 0, 0, 1899, 1900, 7, 14, 0, 0, 1900, 1901, 7, 17, 0, 0, 1901, 1902, 7, 16, 0, 0, 1902, 320, 1, 0, 0, 0, 1903, 1904, 7, 16, 0, 0, 1904, 1905, 7, 2, 0, 0, 1905, 1906, 7, 25, 0, 0, 1906, 1907, 7, 10, 0, 0, 1907, 1908, 7, 5, 0, 0, 1908, 1909, 7, 2, 0, 0, 1909, 1910, 7, 11, 0, 0, 1910, 1911, 7, 10, 0, 0, 1911, 322, 1, 0, 0, 0, 1912, 1913, 7, 16, 0, 0, 1913, 1914, 7, 2, 0, 0, 1914, 1915, 7, 25, 0, 0, 1915, 1916, 7, 10, 0, 0, 1916, 1917, 7, 11, 0, 0, 1917, 1918, 7, 17, 0, 0, 1918, 1919, 7, 16, 0, 0, 1919, 1920, 7, 10, 0, 0, 1920, 324, 1, 0, 0, 0, 1921, 1922, 7, 16, 0, 0, 1922, 1923, 7, 9, 0, 0, 1923, 1924, 7, 5, 0, 0, 1924, 1925, 7, 15, 0, 0, 1925, 1926, 7, 3, 0, 0, 1926, 1927, 7, 15, 0, 0, 1927, 1928, 7, 6, 0, 0, 1928, 326, 1, 0, 0, 0, 1929, 1930, 7, 16, 0, 0, 1930, 1931, 7, 9, 0, 0, 1931, 1932, 7, 4, 0, 0, 1932, 1933, 7, 11, 0, 0, 1933, 1934, 7, 22, 0, 0, 1934, 1935, 7, 4, 0, 0, 1935, 1936, 7, 2, 0, 0, 1936, 1937, 7, 16, 0, 0, 1937, 1938, 7, 10, 0, 0, 1938, 328, 1, 0, 0, 0, 1939, 1940, 7, 16, 0, 0, 1940, 1941, 7, 15, 0, 0, 1941, 1942, 7, 3, 0, 0, 1942, 1943, 7, 11, 0, 0, 1943, 1944, 7, 17, 0, 0, 1944, 1945, 7, 21, 0, 0, 1945, 1946, 7, 3, 0, 0, 1946, 1947, 7, 13, 0, 0, 1947, 330, 1, 0, 0, 0, 1948, 1949, 7, 4, 0, 0, 1949, 1950, 7, 9, 0, 0, 1950, 1951, 7, 12, 0, 0, 1951, 332, 1, 0, 0, 0, 1952, 1953, 7, 4, 0, 0, 1953, 1954, 7, 15, 0, 0, 1954, 1955, 7, 3, 0, 0, 1955, 1956, 7, 3, 0, 0, 1956, 1957, 7, 17, 0, 0, 1957, 1958, 7, 19, 0, 0, 1958, 334, 1, 0, 0, 0, 1959, 1960, 7, 21, 0, 0, 1960, 1961, 7, 10, 0, 0, 1961, 1962, 7, 14, 0, 0, 1962, 1963, 7, 17, 0, 0, 1963, 1964, 7, 9, 0, 0, 1964, 1965, 7, 5, 0, 0, 1965, 1966, 5, 95, 0, 0, 1966, 1967, 7, 2, 0, 0, 1967, 1968, 7, 5, 0, 0, 1968, 1969, 7, 5, 0, 0, 1969, 336, 1, 0, 0, 0, 1970, 1971, 7, 21, 0, 0, 1971, 1972, 7, 10, 0, 0, 1972, 1973, 7, 14, 0, 0, 1973, 1974, 7, 17, 0, 0, 1974, 1975, 7, 9, 0, 0, 1975, 1976, 7, 5, 0, 0, 1976, 1977, 5, 95, 0, 0, 1977, 1978, 7, 5, 0, 0, 1978, 1979, 7, 17, 0, 0, 1979, 1980, 7, 19, 0, 0, 1980, 1981, 7, 19, 0, 0, 1981, 338, 1, 0, 0, 0, 1982, 1983, 7, 21, 0, 0, 1983, 1984, 7, 17, 0, 0, 1984, 340, 1, 0, 0, 0, 1985, 1986, 7, 21, 0, 0, 1986, 1987, 7, 9, 0, 0, 1987, 1988, 7, 6, 0, 0, 1988, 1989, 7, 17, 0, 0, 1989, 1990, 7, 11, 0, 0, 1990, 1991, 7, 17, 0, 0, 1991, 1992, 7, 9, 0, 0, 1992, 1993, 7, 4, 0, 0, 1993, 342, 1, 0, 0, 0, 1994, 1995, 7, 21, 0, 0, 1995, 1996, 7, 9, 0, 0, 1996, 1997, 7, 12, 0, 0, 1997, 344, 1, 0, 0, 0, 1998, 1999, 7, 21, 0, 0, 1999, 2000, 7, 9, 0, 0, 2000, 2001, 7, 12, 0, 0, 2001, 2002, 7, 10, 0, 0, 2002, 2003, 7, 14, 0, 0, 2003, 346, 1, 0, 0, 0, 2004, 2005, 7, 14, 0, 0, 2005, 2006, 7, 2, 0, 0, 2006, 2007, 7, 5, 0, 0, 2007, 2008, 7, 17, 0, 0, 2008, 2009, 7, 2, 0, 0, 2009, 2010, 7, 4, 0, 0, 2010, 2011, 7, 6, 0, 0, 2011, 348, 1, 0, 0, 0, 2012, 2013, 7, 14, 0, 0, 2013, 2014, 7, 2, 0, 0, 2014, 2015, 7, 4, 0, 0, 2015, 2016, 7, 5, 0, 0, 2016, 350, 1, 0, 0, 0, 2017, 2018, 7, 14, 0, 0, 2018, 2019, 7, 10, 0, 0, 2019, 2020, 7, 21, 0, 0, 2020, 2021, 7, 3, 0, 0, 2021, 2022, 7, 2, 0, 0, 2022, 2023, 7, 7, 0, 0, 2023, 2024, 7, 10, 0, 0, 2024, 352, 1, 0, 0, 0, 2025, 2026, 7, 14, 0, 0, 2026, 2027, 7, 17, 0, 0, 2027, 2028, 7, 4, 0, 0, 2028, 2029, 7, 11, 0, 0, 2029, 354, 1, 0, 0, 0, 2030, 2031, 7, 14, 0, 0, 2031, 2032, 7, 9, 0, 0, 2032, 2033, 7, 15, 0, 0, 2033, 2034, 7, 4, 0, 0, 2034, 2035, 7, 5, 0, 0, 2035, 356, 1, 0, 0, 0, 2036, 2037, 7, 14, 0, 0, 2037, 2038, 7, 11, 0, 0, 2038, 2039, 7, 14, 0, 0, 2039, 2040, 7, 17, 0, 0, 2040, 2041, 7, 16, 0, 0, 2041, 358, 1, 0, 0, 0, 2042, 2043, 7, 14, 0, 0, 2043, 2044, 7, 10, 0, 0, 2044, 2045, 7, 23, 0, 0, 2045, 2046, 7, 10, 0, 0, 2046, 2047, 7, 14, 0, 0, 2047, 2048, 7, 6, 0, 0, 2048, 2049, 7, 10, 0, 0, 2049, 360, 1, 0, 0, 0, 2050, 2051, 7, 6, 0, 0, 2051, 2052, 7, 10, 0, 0, 2052, 2053, 7, 7, 0, 0, 2053, 2054, 5, 95, 0, 0, 2054, 2055, 7, 11, 0, 0, 2055, 2056, 7, 9, 0, 0, 2056, 2057, 5, 95, 0, 0, 2057, 2058, 7, 11, 0, 0, 2058, 2059, 7, 17, 0, 0, 2059, 2060, 7, 16, 0, 0, 2060, 2061, 7, 10, 0, 0, 2061, 362, 1, 0, 0, 0, 2062, 2063, 7, 6, 0, 0, 2063, 2064, 7, 17, 0, 0, 2064, 2065, 7, 20, 0, 0, 2065, 2066, 7, 4, 0, 0, 2066, 364, 1, 0, 0, 0, 2067, 2068, 7, 6, 0, 0, 2068, 2069, 7, 17, 0, 0, 2069, 2070, 7, 20, 0, 0, 2070, 2071, 7, 4, 0, 0, 2071, 2072, 7, 15, 0, 0, 2072, 2073, 7, 16, 0, 0, 2073, 366, 1, 0, 0, 0, 2074, 2075, 7, 6, 0, 0, 2075, 2076, 7, 17, 0, 0, 2076, 2077, 7, 4, 0, 0, 2077, 368, 1, 0, 0, 0, 2078, 2079, 7, 6, 0, 0, 2079, 2080, 7, 17, 0, 0, 2080, 2081, 7, 4, 0, 0, 2081, 2082, 7, 22, 0, 0, 2082, 370, 1, 0, 0, 0, 2083, 2084, 7, 6, 0, 0, 2084, 2085, 7, 26, 0, 0, 2085, 2086, 7, 14, 0, 0, 2086, 2087, 7, 11, 0, 0, 2087, 372, 1, 0, 0, 0, 2088, 2089, 7, 6, 0, 0, 2089, 2090, 7, 11, 0, 0, 2090, 2091, 7, 14, 0, 0, 2091, 2092, 5, 95, 0, 0, 2092, 2093, 7, 11, 0, 0, 2093, 2094, 7, 9, 0, 0, 2094, 2095, 5, 95, 0, 0, 2095, 2096, 7, 5, 0, 0, 2096, 2097, 7, 2, 0, 0, 2097, 2098, 7, 11, 0, 0, 2098, 2099, 7, 10, 0, 0, 2099, 374, 1, 0, 0, 0, 2100, 2101, 7, 6, 0, 0, 2101, 2102, 7, 15, 0, 0, 2102, 2103, 7, 8, 0, 0, 2103, 2104, 7, 5, 0, 0, 2104, 2105, 7, 2, 0, 0, 2105, 2106, 7, 11, 0, 0, 2106, 2107, 7, 10, 0, 0, 2107, 376, 1, 0, 0, 0, 2108, 2109, 7, 6, 0, 0, 2109, 2110, 7, 15, 0, 0, 2110, 2111, 7, 8, 0, 0, 2111, 2112, 7, 11, 0, 0, 2112, 2113, 7, 17, 0, 0, 2113, 2114, 7, 16, 0, 0, 2114, 2115, 7, 10, 0, 0, 2115, 378, 1, 0, 0, 0, 2116, 2117, 7, 6, 0, 0, 2117, 2118, 7, 15, 0, 0, 2118, 2119, 7, 8, 0, 0, 2119, 2120, 7, 11, 0, 0, 2120, 2121, 7, 14, 0, 0, 2121, 2122, 7, 2, 0, 0, 2122, 2123, 7, 7, 0, 0, 2123, 2124, 7, 11, 0, 0, 2124, 380, 1, 0, 0, 0, 2125, 2126, 7, 6, 0, 0, 2126, 2127, 7, 13, 0, 0, 2127, 2128, 7, 6, 0, 0, 2128, 2129, 7, 5, 0, 0, 2129, 2130, 7, 2, 0, 0, 2130, 2131, 7, 11, 0, 0, 2131, 2132, 7, 10, 0, 0, 2132, 382, 1, 0, 0, 0, 2133, 2134, 7, 11, 0, 0, 2134, 2135, 7, 2, 0, 0, 2135, 2136, 7, 4, 0, 0, 2136, 384, 1, 0, 0, 0, 2137, 2138, 7, 11, 0, 0, 2138, 2139, 7, 17, 0, 0, 2139, 2140, 7, 16, 0, 0, 2140, 2141, 7, 10, 0, 0, 2141, 386, 1, 0, 0, 0, 2142, 2143, 7, 11, 0, 0, 2143, 2144, 7, 17, 0, 0, 2144, 2145, 7, 16, 0, 0, 2145, 2146, 7, 10, 0, 0, 2146, 2147, 7, 5, 0, 0, 2147, 2148, 7, 17, 0, 0, 2148, 2149, 7, 19, 0, 0, 2149, 2150, 7, 19, 0, 0, 2150, 388, 1, 0, 0, 0, 2151, 2152, 7, 11, 0, 0, 2152, 2153, 7, 17, 0, 0, 2153, 2154, 7, 16, 0, 0, 2154, 2155, 7, 10, 0, 0, 2155, 2156, 5, 95, 0, 0, 2156, 2157, 7, 19, 0, 0, 2157, 2158, 7, 9, 0, 0, 2158, 2159, 7, 14, 0, 0, 2159, 2160, 7, 16, 0, 0, 2160, 2161, 7, 2, 0, 0, 2161, 2162, 7, 11, 0, 0, 2162, 390, 1, 0, 0, 0, 2163, 2164, 7, 11, 0, 0, 2164, 2165, 7, 17, 0, 0, 2165, 2166, 7, 16, 0, 0, 2166, 2167, 7, 10, 0, 0, 2167, 2168, 5, 95, 0, 0, 2168, 2169, 7, 11, 0, 0, 2169, 2170, 7, 9, 0, 0, 2170, 2171, 5, 95, 0, 0, 2171, 2172, 7, 6, 0, 0, 2172, 2173, 7, 10, 0, 0, 2173, 2174, 7, 7, 0, 0, 2174, 392, 1, 0, 0, 0, 2175, 2176, 7, 11, 0, 0, 2176, 2177, 7, 17, 0, 0, 2177, 2178, 7, 16, 0, 0, 2178, 2179, 7, 10, 0, 0, 2179, 2180, 7, 6, 0, 0, 2180, 2181, 7, 11, 0, 0, 2181, 2182, 7, 2, 0, 0, 2182, 2183, 7, 16, 0, 0, 2183, 2184, 7, 21, 0, 0, 2184, 394, 1, 0, 0, 0, 2185, 2186, 7, 11, 0, 0, 2186, 2187, 7, 14, 0, 0, 2187, 2188, 7, 15, 0, 0, 2188, 2189, 7, 4, 0, 0, 2189, 2190, 7, 7, 0, 0, 2190, 2191, 7, 2, 0, 0, 2191, 2192, 7, 11, 0, 0, 2192, 2193, 7, 10, 0, 0, 2193, 396, 1, 0, 0, 0, 2194, 2195, 7, 11, 0, 0, 2195, 2196, 7, 9, 0, 0, 2196, 2197, 5, 95, 0, 0, 2197, 2198, 7, 5, 0, 0, 2198, 2199, 7, 2, 0, 0, 2199, 2200, 7, 13, 0, 0, 2200, 2201, 7, 6, 0, 0, 2201, 398, 1, 0, 0, 0, 2202, 2203, 7, 11, 0, 0, 2203, 2204, 7, 9, 0, 0, 2204, 2205, 5, 95, 0, 0, 2205, 2206, 7, 6, 0, 0, 2206, 2207, 7, 10, 0, 0, 2207, 2208, 7, 7, 0, 0, 2208, 2209, 7, 9, 0, 0, 2209, 2210, 7, 4, 0, 0, 2210, 2211, 7, 5, 0, 0, 2211, 2212, 7, 6, 0, 0, 2212, 400, 1, 0, 0, 0, 2213, 2214, 7, 15, 0, 0, 2214, 2215, 7, 4, 0, 0, 2215, 2216, 7, 17, 0, 0, 2216, 2217, 7, 18, 0, 0, 2217, 2218, 5, 95, 0, 0, 2218, 2219, 7, 11, 0, 0, 2219, 2220, 7, 17, 0, 0, 2220, 2221, 7, 16, 0, 0, 2221, 2222, 7, 10, 0, 0, 2222, 2223, 7, 6, 0, 0, 2223, 2224, 7, 11, 0, 0, 2224, 2225, 7, 2, 0, 0, 2225, 2226, 7, 16, 0, 0, 2226, 2227, 7, 21, 0, 0, 2227, 402, 1, 0, 0, 0, 2228, 2229, 7, 15, 0, 0, 2229, 2230, 7, 21, 0, 0, 2230, 2231, 7, 21, 0, 0, 2231, 2232, 7, 10, 0, 0, 2232, 2233, 7, 14, 0, 0, 2233, 404, 1, 0, 0, 0, 2234, 2235, 7, 15, 0, 0, 2235, 2236, 7, 11, 0, 0, 2236, 2237, 7, 7, 0, 0, 2237, 2238, 5, 95, 0, 0, 2238, 2239, 7, 5, 0, 0, 2239, 2240, 7, 2, 0, 0, 2240, 2241, 7, 11, 0, 0, 2241, 2242, 7, 10, 0, 0, 2242, 406, 1, 0, 0, 0, 2243, 2244, 7, 15, 0, 0, 2244, 2245, 7, 11, 0, 0, 2245, 2246, 7, 7, 0, 0, 2246, 2247, 5, 95, 0, 0, 2247, 2248, 7, 11, 0, 0, 2248, 2249, 7, 17, 0, 0, 2249, 2250, 7, 16, 0, 0, 2250, 2251, 7, 10, 0, 0, 2251, 408, 1, 0, 0, 0, 2252, 2253, 7, 15, 0, 0, 2253, 2254, 7, 11, 0, 0, 2254, 2255, 7, 7, 0, 0, 2255, 2256, 5, 95, 0, 0, 2256, 2257, 7, 11, 0, 0, 2257, 2258, 7, 17, 0, 0, 2258, 2259, 7, 16, 0, 0, 2259, 2260, 7, 10, 0, 0, 2260, 2261, 7, 6, 0, 0, 2261, 2262, 7, 11, 0, 0, 2262, 2263, 7, 2, 0, 0, 2263, 2264, 7, 16, 0, 0, 2264, 2265, 7, 21, 0, 0, 2265, 410, 1, 0, 0, 0, 2266, 2267, 7, 5, 0, 0, 2267, 412, 1, 0, 0, 0, 2268, 2269, 7, 11, 0, 0, 2269, 414, 1, 0, 0, 0, 2270, 2271, 7, 11, 0, 0, 2271, 2272, 7, 6, 0, 0, 2272, 416, 1, 0, 0, 0, 2273, 2274, 5, 123, 0, 0, 2274, 418, 1, 0, 0, 0, 2275, 2276, 5, 125, 0, 0, 2276, 420, 1, 0, 0, 0, 2277, 2278, 7, 5, 0, 0, 2278, 2279, 7, 10, 0, 0, 2279, 2280, 7, 4, 0, 0, 2280, 2281, 7, 6, 0, 0, 2281, 2282, 7, 10, 0, 0, 2282, 2283, 5, 95, 0, 0, 2283, 2284, 7, 14, 0, 0, 2284, 2285, 7, 2, 0, 0, 2285, 2286, 7, 4, 0, 0, 2286, 2287, 7, 25, 0, 0, 2287, 422, 1, 0, 0, 0, 2288, 2289, 7, 14, 0, 0, 2289, 2290, 7, 2, 0, 0, 2290, 2291, 7, 4, 0, 0, 2291, 2292, 7, 25, 0, 0, 2292, 424, 1, 0, 0, 0, 2293, 2294, 7, 14, 0, 0, 2294, 2295, 7, 9, 0, 0, 2295, 2296, 7, 12, 0, 0, 2296, 2297, 5, 95, 0, 0, 2297, 2298, 7, 4, 0, 0, 2298, 2299, 7, 15, 0, 0, 2299, 2300, 7, 16, 0, 0, 2300, 2301, 7, 8, 0, 0, 2301, 2302, 7, 10, 0, 0, 2302, 2303, 7, 14, 0, 0, 2303, 426, 1, 0, 0, 0, 2304, 2305, 7, 5, 0, 0, 2305, 2306, 7, 2, 0, 0, 2306, 2307, 7, 11, 0, 0, 2307, 2308, 7, 10, 0, 0, 2308, 2309, 5, 95, 0, 0, 2309, 2310, 7, 22, 0, 0, 2310, 2311, 7, 17, 0, 0, 2311, 2312, 7, 6, 0, 0, 2312, 2313, 7, 11, 0, 0, 2313, 2314, 7, 9, 0, 0, 2314, 2315, 7, 20, 0, 0, 2315, 2316, 7, 14, 0, 0, 2316, 2317, 7, 2, 0, 0, 2317, 2318, 7, 16, 0, 0, 2318, 428, 1, 0, 0, 0, 2319, 2320, 7, 5, 0, 0, 2320, 2321, 7, 2, 0, 0, 2321, 2322, 7, 13, 0, 0, 2322, 2323, 5, 95, 0, 0, 2323, 2324, 7, 9, 0, 0, 2324, 2325, 7, 19, 0, 0, 2325, 2326, 5, 95, 0, 0, 2326, 2327, 7, 16, 0, 0, 2327, 2328, 7, 9, 0, 0, 2328, 2329, 7, 4, 0, 0, 2329, 2330, 7, 11, 0, 0, 2330, 2331, 7, 22, 0, 0, 2331, 430, 1, 0, 0, 0, 2332, 2333, 7, 5, 0, 0, 2333, 2334, 7, 2, 0, 0, 2334, 2335, 7, 13, 0, 0, 2335, 2336, 5, 95, 0, 0, 2336, 2337, 7, 9, 0, 0, 2337, 2338, 7, 19, 0, 0, 2338, 2339, 5, 95, 0, 0, 2339, 2340, 7, 13, 0, 0, 2340, 2341, 7, 10, 0, 0, 2341, 2342, 7, 2, 0, 0, 2342, 2343, 7, 14, 0, 0, 2343, 432, 1, 0, 0, 0, 2344, 2345, 7, 5, 0, 0, 2345, 2346, 7, 2, 0, 0, 2346, 2347, 7, 13, 0, 0, 2347, 2348, 5, 95, 0, 0, 2348, 2349, 7, 9, 0, 0, 2349, 2350, 7, 19, 0, 0, 2350, 2351, 5, 95, 0, 0, 2351, 2352, 7, 12, 0, 0, 2352, 2353, 7, 10, 0, 0, 2353, 2354, 7, 10, 0, 0, 2354, 2355, 7, 25, 0, 0, 2355, 434, 1, 0, 0, 0, 2356, 2357, 7, 10, 0, 0, 2357, 2358, 7, 18, 0, 0, 2358, 2359, 7, 7, 0, 0, 2359, 2360, 7, 3, 0, 0, 2360, 2361, 7, 15, 0, 0, 2361, 2362, 7, 5, 0, 0, 2362, 2363, 7, 10, 0, 0, 2363, 436, 1, 0, 0, 0, 2364, 2365, 7, 10, 0, 0, 2365, 2366, 7, 18, 0, 0, 2366, 2367, 7, 11, 0, 0, 2367, 2368, 7, 10, 0, 0, 2368, 2369, 7, 4, 0, 0, 2369, 2370, 7, 5, 0, 0, 2370, 2371, 7, 10, 0, 0, 2371, 2372, 7, 5, 0, 0, 2372, 2373, 5, 95, 0, 0, 2373, 2374, 7, 6, 0, 0, 2374, 2375, 7, 11, 0, 0, 2375, 2376, 7, 2, 0, 0, 2376, 2377, 7, 11, 0, 0, 2377, 2378, 7, 6, 0, 0, 2378, 438, 1, 0, 0, 0, 2379, 2380, 7, 19, 0, 0, 2380, 2381, 7, 17, 0, 0, 2381, 2382, 7, 10, 0, 0, 2382, 2383, 7, 3, 0, 0, 2383, 2384, 7, 5, 0, 0, 2384, 440, 1, 0, 0, 0, 2385, 2386, 7, 19, 0, 0, 2386, 2387, 7, 17, 0, 0, 2387, 2388, 7, 3, 0, 0, 2388, 2389, 7, 11, 0, 0, 2389, 2390, 7, 10, 0, 0, 2390, 2391, 7, 14, 0, 0, 2391, 442, 1, 0, 0, 0, 2392, 2393, 7, 20, 0, 0, 2393, 2394, 7, 10, 0, 0, 2394, 2395, 7, 9, 0, 0, 2395, 2396, 5, 95, 0, 0, 2396, 2397, 7, 8, 0, 0, 2397, 2398, 7, 9, 0, 0, 2398, 2399, 7, 15, 0, 0, 2399, 2400, 7, 4, 0, 0, 2400, 2401, 7, 5, 0, 0, 2401, 2402, 7, 17, 0, 0, 2402, 2403, 7, 4, 0, 0, 2403, 2404, 7, 20, 0, 0, 2404, 2405, 5, 95, 0, 0, 2405, 2406, 7, 8, 0, 0, 2406, 2407, 7, 9, 0, 0, 2407, 2408, 7, 18, 0, 0, 2408, 444, 1, 0, 0, 0, 2409, 2410, 7, 20, 0, 0, 2410, 2411, 7, 10, 0, 0, 2411, 2412, 7, 9, 0, 0, 2412, 2413, 5, 95, 0, 0, 2413, 2414, 7, 7, 0, 0, 2414, 2415, 7, 10, 0, 0, 2415, 2416, 7, 3, 0, 0, 2416, 2417, 7, 3, 0, 0, 2417, 446, 1, 0, 0, 0, 2418, 2419, 7, 20, 0, 0, 2419, 2420, 7, 10, 0, 0, 2420, 2421, 7, 9, 0, 0, 2421, 2422, 5, 95, 0, 0, 2422, 2423, 7, 5, 0, 0, 2423, 2424, 7, 17, 0, 0, 2424, 2425, 7, 6, 0, 0, 2425, 2426, 7, 11, 0, 0, 2426, 2427, 7, 2, 0, 0, 2427, 2428, 7, 4, 0, 0, 2428, 2429, 7, 7, 0, 0, 2429, 2430, 7, 10, 0, 0, 2430, 448, 1, 0, 0, 0, 2431, 2432, 7, 20, 0, 0, 2432, 2433, 7, 10, 0, 0, 2433, 2434, 7, 9, 0, 0, 2434, 2435, 5, 95, 0, 0, 2435, 2436, 7, 5, 0, 0, 2436, 2437, 7, 17, 0, 0, 2437, 2438, 7, 6, 0, 0, 2438, 2439, 7, 11, 0, 0, 2439, 2440, 7, 2, 0, 0, 2440, 2441, 7, 4, 0, 0, 2441, 2442, 7, 7, 0, 0, 2442, 2443, 7, 10, 0, 0, 2443, 2444, 5, 95, 0, 0, 2444, 2445, 7, 14, 0, 0, 2445, 2446, 7, 2, 0, 0, 2446, 2447, 7, 4, 0, 0, 2447, 2448, 7, 20, 0, 0, 2448, 2449, 7, 10, 0, 0, 2449, 450, 1, 0, 0, 0, 2450, 2451, 7, 20, 0, 0, 2451, 2452, 7, 10, 0, 0, 2452, 2453, 7, 9, 0, 0, 2453, 2454, 5, 95, 0, 0, 2454, 2455, 7, 17, 0, 0, 2455, 2456, 7, 4, 0, 0, 2456, 2457, 7, 11, 0, 0, 2457, 2458, 7, 10, 0, 0, 2458, 2459, 7, 14, 0, 0, 2459, 2460, 7, 6, 0, 0, 2460, 2461, 7, 10, 0, 0, 2461, 2462, 7, 7, 0, 0, 2462, 2463, 7, 11, 0, 0, 2463, 2464, 7, 6, 0, 0, 2464, 452, 1, 0, 0, 0, 2465, 2466, 7, 20, 0, 0, 2466, 2467, 7, 10, 0, 0, 2467, 2468, 7, 9, 0, 0, 2468, 2469, 5, 95, 0, 0, 2469, 2470, 7, 21, 0, 0, 2470, 2471, 7, 9, 0, 0, 2471, 2472, 7, 3, 0, 0, 2472, 2473, 7, 13, 0, 0, 2473, 2474, 7, 20, 0, 0, 2474, 2475, 7, 9, 0, 0, 2475, 2476, 7, 4, 0, 0, 2476, 454, 1, 0, 0, 0, 2477, 2478, 7, 22, 0, 0, 2478, 2479, 7, 17, 0, 0, 2479, 2480, 7, 6, 0, 0, 2480, 2481, 7, 11, 0, 0, 2481, 2482, 7, 9, 0, 0, 2482, 2483, 7, 20, 0, 0, 2483, 2484, 7, 14, 0, 0, 2484, 2485, 7, 2, 0, 0, 2485, 2486, 7, 16, 0, 0, 2486, 456, 1, 0, 0, 0, 2487, 2488, 7, 22, 0, 0, 2488, 2489, 7, 9, 0, 0, 2489, 2490, 7, 15, 0, 0, 2490, 2491, 7, 14, 0, 0, 2491, 2492, 5, 95, 0, 0, 2492, 2493, 7, 9, 0, 0, 2493, 2494, 7, 19, 0, 0, 2494, 2495, 5, 95, 0, 0, 2495, 2496, 7, 5, 0, 0, 2496, 2497, 7, 2, 0, 0, 2497, 2498, 7, 13, 0, 0, 2498, 458, 1, 0, 0, 0, 2499, 2500, 7, 17, 0, 0, 2500, 2501, 7, 4, 0, 0, 2501, 2502, 7, 7, 0, 0, 2502, 2503, 7, 3, 0, 0, 2503, 2504, 7, 15, 0, 0, 2504, 2505, 7, 5, 0, 0, 2505, 2506, 7, 10, 0, 0, 2506, 460, 1, 0, 0, 0, 2507, 2508, 7, 17, 0, 0, 2508, 2509, 7, 4, 0, 0, 2509, 2510, 5, 95, 0, 0, 2510, 2511, 7, 11, 0, 0, 2511, 2512, 7, 10, 0, 0, 2512, 2513, 7, 14, 0, 0, 2513, 2514, 7, 16, 0, 0, 2514, 2515, 7, 6, 0, 0, 2515, 462, 1, 0, 0, 0, 2516, 2517, 7, 16, 0, 0, 2517, 2518, 7, 2, 0, 0, 2518, 2519, 7, 11, 0, 0, 2519, 2520, 7, 7, 0, 0, 2520, 2521, 7, 22, 0, 0, 2521, 2522, 7, 21, 0, 0, 2522, 2523, 7, 22, 0, 0, 2523, 2524, 7, 14, 0, 0, 2524, 2525, 7, 2, 0, 0, 2525, 2526, 7, 6, 0, 0, 2526, 2527, 7, 10, 0, 0, 2527, 464, 1, 0, 0, 0, 2528, 2529, 7, 16, 0, 0, 2529, 2530, 7, 2, 0, 0, 2530, 2531, 7, 11, 0, 0, 2531, 2532, 7, 7, 0, 0, 2532, 2533, 7, 22, 0, 0, 2533, 2534, 5, 95, 0, 0, 2534, 2535, 7, 21, 0, 0, 2535, 2536, 7, 22, 0, 0, 2536, 2537, 7, 14, 0, 0, 2537, 2538, 7, 2, 0, 0, 2538, 2539, 7, 6, 0, 0, 2539, 2540, 7, 10, 0, 0, 2540, 466, 1, 0, 0, 0, 2541, 2542, 7, 16, 0, 0, 2542, 2543, 7, 2, 0, 0, 2543, 2544, 7, 11, 0, 0, 2544, 2545, 7, 7, 0, 0, 2545, 2546, 7, 22, 0, 0, 2546, 2547, 7, 21, 0, 0, 2547, 2548, 7, 22, 0, 0, 2548, 2549, 7, 14, 0, 0, 2549, 2550, 7, 2, 0, 0, 2550, 2551, 7, 6, 0, 0, 2551, 2552, 7, 10, 0, 0, 2552, 2553, 7, 26, 0, 0, 2553, 2554, 7, 15, 0, 0, 2554, 2555, 7, 10, 0, 0, 2555, 2556, 7, 14, 0, 0, 2556, 2557, 7, 13, 0, 0, 2557, 468, 1, 0, 0, 0, 2558, 2559, 7, 6, 0, 0, 2559, 2560, 7, 17, 0, 0, 2560, 2561, 7, 16, 0, 0, 2561, 2562, 7, 21, 0, 0, 2562, 2563, 7, 3, 0, 0, 2563, 2564, 7, 10, 0, 0, 2564, 2565, 5, 95, 0, 0, 2565, 2566, 7, 26, 0, 0, 2566, 2567, 7, 15, 0, 0, 2567, 2568, 7, 10, 0, 0, 2568, 2569, 7, 14, 0, 0, 2569, 2570, 7, 13, 0, 0, 2570, 2571, 5, 95, 0, 0, 2571, 2572, 7, 6, 0, 0, 2572, 2573, 7, 11, 0, 0, 2573, 2574, 7, 14, 0, 0, 2574, 2575, 7, 17, 0, 0, 2575, 2576, 7, 4, 0, 0, 2576, 2577, 7, 20, 0, 0, 2577, 470, 1, 0, 0, 0, 2578, 2579, 7, 26, 0, 0, 2579, 2580, 7, 15, 0, 0, 2580, 2581, 7, 10, 0, 0, 2581, 2582, 7, 14, 0, 0, 2582, 2583, 7, 13, 0, 0, 2583, 2584, 5, 95, 0, 0, 2584, 2585, 7, 6, 0, 0, 2585, 2586, 7, 11, 0, 0, 2586, 2587, 7, 14, 0, 0, 2587, 2588, 7, 17, 0, 0, 2588, 2589, 7, 4, 0, 0, 2589, 2590, 7, 20, 0, 0, 2590, 472, 1, 0, 0, 0, 2591, 2592, 7, 16, 0, 0, 2592, 2593, 7, 2, 0, 0, 2593, 2594, 7, 11, 0, 0, 2594, 2595, 7, 7, 0, 0, 2595, 2596, 7, 22, 0, 0, 2596, 2597, 5, 95, 0, 0, 2597, 2598, 7, 21, 0, 0, 2598, 2599, 7, 22, 0, 0, 2599, 2600, 7, 14, 0, 0, 2600, 2601, 7, 2, 0, 0, 2601, 2602, 7, 6, 0, 0, 2602, 2603, 7, 10, 0, 0, 2603, 2604, 5, 95, 0, 0, 2604, 2605, 7, 21, 0, 0, 2605, 2606, 7, 14, 0, 0, 2606, 2607, 7, 10, 0, 0, 2607, 2608, 7, 19, 0, 0, 2608, 2609, 7, 17, 0, 0, 2609, 2610, 7, 18, 0, 0, 2610, 474, 1, 0, 0, 0, 2611, 2612, 7, 16, 0, 0, 2612, 2613, 7, 2, 0, 0, 2613, 2614, 7, 11, 0, 0, 2614, 2615, 7, 7, 0, 0, 2615, 2616, 7, 22, 0, 0, 2616, 2617, 7, 26, 0, 0, 2617, 2618, 7, 15, 0, 0, 2618, 2619, 7, 10, 0, 0, 2619, 2620, 7, 14, 0, 0, 2620, 2621, 7, 13, 0, 0, 2621, 476, 1, 0, 0, 0, 2622, 2623, 7, 16, 0, 0, 2623, 2624, 7, 2, 0, 0, 2624, 2625, 7, 11, 0, 0, 2625, 2626, 7, 7, 0, 0, 2626, 2627, 7, 22, 0, 0, 2627, 2628, 5, 95, 0, 0, 2628, 2629, 7, 26, 0, 0, 2629, 2630, 7, 15, 0, 0, 2630, 2631, 7, 10, 0, 0, 2631, 2632, 7, 14, 0, 0, 2632, 2633, 7, 13, 0, 0, 2633, 478, 1, 0, 0, 0, 2634, 2635, 7, 16, 0, 0, 2635, 2636, 7, 17, 0, 0, 2636, 2637, 7, 4, 0, 0, 2637, 2638, 7, 15, 0, 0, 2638, 2639, 7, 11, 0, 0, 2639, 2640, 7, 10, 0, 0, 2640, 2641, 5, 95, 0, 0, 2641, 2642, 7, 9, 0, 0, 2642, 2643, 7, 19, 0, 0, 2643, 2644, 5, 95, 0, 0, 2644, 2645, 7, 5, 0, 0, 2645, 2646, 7, 2, 0, 0, 2646, 2647, 7, 13, 0, 0, 2647, 480, 1, 0, 0, 0, 2648, 2649, 7, 16, 0, 0, 2649, 2650, 7, 17, 0, 0, 2650, 2651, 7, 4, 0, 0, 2651, 2652, 7, 15, 0, 0, 2652, 2653, 7, 11, 0, 0, 2653, 2654, 7, 10, 0, 0, 2654, 2655, 5, 95, 0, 0, 2655, 2656, 7, 9, 0, 0, 2656, 2657, 7, 19, 0, 0, 2657, 2658, 5, 95, 0, 0, 2658, 2659, 7, 22, 0, 0, 2659, 2660, 7, 9, 0, 0, 2660, 2661, 7, 15, 0, 0, 2661, 2662, 7, 14, 0, 0, 2662, 482, 1, 0, 0, 0, 2663, 2664, 7, 16, 0, 0, 2664, 2665, 7, 9, 0, 0, 2665, 2666, 7, 4, 0, 0, 2666, 2667, 7, 11, 0, 0, 2667, 2668, 7, 22, 0, 0, 2668, 2669, 5, 95, 0, 0, 2669, 2670, 7, 9, 0, 0, 2670, 2671, 7, 19, 0, 0, 2671, 2672, 5, 95, 0, 0, 2672, 2673, 7, 13, 0, 0, 2673, 2674, 7, 10, 0, 0, 2674, 2675, 7, 2, 0, 0, 2675, 2676, 7, 14, 0, 0, 2676, 484, 1, 0, 0, 0, 2677, 2678, 7, 16, 0, 0, 2678, 2679, 7, 15, 0, 0, 2679, 2680, 7, 3, 0, 0, 2680, 2681, 7, 11, 0, 0, 2681, 2682, 7, 17, 0, 0, 2682, 2683, 7, 16, 0, 0, 2683, 2684, 7, 2, 0, 0, 2684, 2685, 7, 11, 0, 0, 2685, 2686, 7, 7, 0, 0, 2686, 2687, 7, 22, 0, 0, 2687, 486, 1, 0, 0, 0, 2688, 2689, 7, 16, 0, 0, 2689, 2690, 7, 15, 0, 0, 2690, 2691, 7, 3, 0, 0, 2691, 2692, 7, 11, 0, 0, 2692, 2693, 7, 17, 0, 0, 2693, 2694, 5, 95, 0, 0, 2694, 2695, 7, 16, 0, 0, 2695, 2696, 7, 2, 0, 0, 2696, 2697, 7, 11, 0, 0, 2697, 2698, 7, 7, 0, 0, 2698, 2699, 7, 22, 0, 0, 2699, 488, 1, 0, 0, 0, 2700, 2701, 7, 16, 0, 0, 2701, 2702, 7, 15, 0, 0, 2702, 2703, 7, 3, 0, 0, 2703, 2704, 7, 11, 0, 0, 2704, 2705, 7, 17, 0, 0, 2705, 2706, 7, 16, 0, 0, 2706, 2707, 7, 2, 0, 0, 2707, 2708, 7, 11, 0, 0, 2708, 2709, 7, 7, 0, 0, 2709, 2710, 7, 22, 0, 0, 2710, 2711, 7, 26, 0, 0, 2711, 2712, 7, 15, 0, 0, 2712, 2713, 7, 10, 0, 0, 2713, 2714, 7, 14, 0, 0, 2714, 2715, 7, 13, 0, 0, 2715, 490, 1, 0, 0, 0, 2716, 2717, 7, 4, 0, 0, 2717, 2718, 7, 10, 0, 0, 2718, 2719, 7, 6, 0, 0, 2719, 2720, 7, 11, 0, 0, 2720, 2721, 7, 10, 0, 0, 2721, 2722, 7, 5, 0, 0, 2722, 492, 1, 0, 0, 0, 2723, 2724, 7, 21, 0, 0, 2724, 2725, 7, 10, 0, 0, 2725, 2726, 7, 14, 0, 0, 2726, 2727, 7, 7, 0, 0, 2727, 2728, 7, 10, 0, 0, 2728, 2729, 7, 4, 0, 0, 2729, 2730, 7, 11, 0, 0, 2730, 2731, 7, 17, 0, 0, 2731, 2732, 7, 3, 0, 0, 2732, 2733, 7, 10, 0, 0, 2733, 2734, 7, 6, 0, 0, 2734, 494, 1, 0, 0, 0, 2735, 2736, 7, 21, 0, 0, 2736, 2737, 7, 10, 0, 0, 2737, 2738, 7, 14, 0, 0, 2738, 2739, 7, 7, 0, 0, 2739, 2740, 7, 10, 0, 0, 2740, 2741, 7, 4, 0, 0, 2741, 2742, 7, 11, 0, 0, 2742, 2743, 7, 17, 0, 0, 2743, 2744, 7, 3, 0, 0, 2744, 2745, 7, 10, 0, 0, 2745, 496, 1, 0, 0, 0, 2746, 2747, 7, 21, 0, 0, 2747, 2748, 7, 10, 0, 0, 2748, 2749, 7, 14, 0, 0, 2749, 2750, 7, 7, 0, 0, 2750, 2751, 7, 10, 0, 0, 2751, 2752, 7, 4, 0, 0, 2752, 2753, 7, 11, 0, 0, 2753, 2754, 7, 17, 0, 0, 2754, 2755, 7, 3, 0, 0, 2755, 2756, 7, 10, 0, 0, 2756, 2757, 5, 95, 0, 0, 2757, 2758, 7, 2, 0, 0, 2758, 2759, 7, 21, 0, 0, 2759, 2760, 7, 21, 0, 0, 2760, 2761, 7, 14, 0, 0, 2761, 2762, 7, 9, 0, 0, 2762, 2763, 7, 18, 0, 0, 2763, 498, 1, 0, 0, 0, 2764, 2765, 7, 14, 0, 0, 2765, 2766, 7, 10, 0, 0, 2766, 2767, 7, 20, 0, 0, 2767, 2768, 7, 10, 0, 0, 2768, 2769, 7, 18, 0, 0, 2769, 2770, 7, 21, 0, 0, 2770, 2771, 5, 95, 0, 0, 2771, 2772, 7, 26, 0, 0, 2772, 2773, 7, 15, 0, 0, 2773, 2774, 7, 10, 0, 0, 2774, 2775, 7, 14, 0, 0, 2775, 2776, 7, 13, 0, 0, 2776, 500, 1, 0, 0, 0, 2777, 2778, 7, 14, 0, 0, 2778, 2779, 7, 10, 0, 0, 2779, 2780, 7, 23, 0, 0, 2780, 2781, 7, 10, 0, 0, 2781, 2782, 7, 14, 0, 0, 2782, 2783, 7, 6, 0, 0, 2783, 2784, 7, 10, 0, 0, 2784, 2785, 5, 95, 0, 0, 2785, 2786, 7, 4, 0, 0, 2786, 2787, 7, 10, 0, 0, 2787, 2788, 7, 6, 0, 0, 2788, 2789, 7, 11, 0, 0, 2789, 2790, 7, 10, 0, 0, 2790, 2791, 7, 5, 0, 0, 2791, 502, 1, 0, 0, 0, 2792, 2793, 7, 26, 0, 0, 2793, 2794, 7, 15, 0, 0, 2794, 2795, 7, 10, 0, 0, 2795, 2796, 7, 14, 0, 0, 2796, 2797, 7, 13, 0, 0, 2797, 504, 1, 0, 0, 0, 2798, 2799, 7, 14, 0, 0, 2799, 2800, 7, 2, 0, 0, 2800, 2801, 7, 4, 0, 0, 2801, 2802, 7, 20, 0, 0, 2802, 2803, 7, 10, 0, 0, 2803, 506, 1, 0, 0, 0, 2804, 2805, 7, 6, 0, 0, 2805, 2806, 7, 7, 0, 0, 2806, 2807, 7, 9, 0, 0, 2807, 2808, 7, 14, 0, 0, 2808, 2809, 7, 10, 0, 0, 2809, 508, 1, 0, 0, 0, 2810, 2811, 7, 6, 0, 0, 2811, 2812, 7, 7, 0, 0, 2812, 2813, 7, 9, 0, 0, 2813, 2814, 7, 14, 0, 0, 2814, 2815, 7, 10, 0, 0, 2815, 2816, 7, 26, 0, 0, 2816, 2817, 7, 15, 0, 0, 2817, 2818, 7, 10, 0, 0, 2818, 2819, 7, 14, 0, 0, 2819, 2820, 7, 13, 0, 0, 2820, 510, 1, 0, 0, 0, 2821, 2822, 7, 6, 0, 0, 2822, 2823, 7, 7, 0, 0, 2823, 2824, 7, 9, 0, 0, 2824, 2825, 7, 14, 0, 0, 2825, 2826, 7, 10, 0, 0, 2826, 2827, 5, 95, 0, 0, 2827, 2828, 7, 26, 0, 0, 2828, 2829, 7, 15, 0, 0, 2829, 2830, 7, 10, 0, 0, 2830, 2831, 7, 14, 0, 0, 2831, 2832, 7, 13, 0, 0, 2832, 512, 1, 0, 0, 0, 2833, 2834, 7, 6, 0, 0, 2834, 2835, 7, 10, 0, 0, 2835, 2836, 7, 7, 0, 0, 2836, 2837, 7, 9, 0, 0, 2837, 2838, 7, 4, 0, 0, 2838, 2839, 7, 5, 0, 0, 2839, 2840, 5, 95, 0, 0, 2840, 2841, 7, 9, 0, 0, 2841, 2842, 7, 19, 0, 0, 2842, 2843, 5, 95, 0, 0, 2843, 2844, 7, 16, 0, 0, 2844, 2845, 7, 17, 0, 0, 2845, 2846, 7, 4, 0, 0, 2846, 2847, 7, 15, 0, 0, 2847, 2848, 7, 11, 0, 0, 2848, 2849, 7, 10, 0, 0, 2849, 514, 1, 0, 0, 0, 2850, 2851, 7, 6, 0, 0, 2851, 2852, 7, 11, 0, 0, 2852, 2853, 7, 2, 0, 0, 2853, 2854, 7, 11, 0, 0, 2854, 2855, 7, 6, 0, 0, 2855, 516, 1, 0, 0, 0, 2856, 2857, 7, 11, 0, 0, 2857, 2858, 7, 10, 0, 0, 2858, 2859, 7, 14, 0, 0, 2859, 2860, 7, 16, 0, 0, 2860, 518, 1, 0, 0, 0, 2861, 2862, 7, 11, 0, 0, 2862, 2863, 7, 10, 0, 0, 2863, 2864, 7, 14, 0, 0, 2864, 2865, 7, 16, 0, 0, 2865, 2866, 7, 6, 0, 0, 2866, 520, 1, 0, 0, 0, 2867, 2868, 7, 11, 0, 0, 2868, 2869, 7, 17, 0, 0, 2869, 2870, 7, 16, 0, 0, 2870, 2871, 7, 10, 0, 0, 2871, 2872, 7, 6, 0, 0, 2872, 2873, 7, 11, 0, 0, 2873, 2874, 7, 2, 0, 0, 2874, 2875, 7, 16, 0, 0, 2875, 2876, 7, 21, 0, 0, 2876, 2877, 7, 2, 0, 0, 2877, 2878, 7, 5, 0, 0, 2878, 2879, 7, 5, 0, 0, 2879, 522, 1, 0, 0, 0, 2880, 2881, 7, 11, 0, 0, 2881, 2882, 7, 17, 0, 0, 2882, 2883, 7, 16, 0, 0, 2883, 2884, 7, 10, 0, 0, 2884, 2885, 7, 6, 0, 0, 2885, 2886, 7, 11, 0, 0, 2886, 2887, 7, 2, 0, 0, 2887, 2888, 7, 16, 0, 0, 2888, 2889, 7, 21, 0, 0, 2889, 2890, 7, 5, 0, 0, 2890, 2891, 7, 17, 0, 0, 2891, 2892, 7, 19, 0, 0, 2892, 2893, 7, 19, 0, 0, 2893, 524, 1, 0, 0, 0, 2894, 2895, 7, 11, 0, 0, 2895, 2896, 7, 9, 0, 0, 2896, 2897, 7, 21, 0, 0, 2897, 2898, 7, 22, 0, 0, 2898, 2899, 7, 17, 0, 0, 2899, 2900, 7, 11, 0, 0, 2900, 2901, 7, 6, 0, 0, 2901, 526, 1, 0, 0, 0, 2902, 2903, 7, 11, 0, 0, 2903, 2904, 7, 13, 0, 0, 2904, 2905, 7, 21, 0, 0, 2905, 2906, 7, 10, 0, 0, 2906, 2907, 7, 9, 0, 0, 2907, 2908, 7, 19, 0, 0, 2908, 528, 1, 0, 0, 0, 2909, 2910, 7, 12, 0, 0, 2910, 2911, 7, 10, 0, 0, 2911, 2912, 7, 10, 0, 0, 2912, 2913, 7, 25, 0, 0, 2913, 2914, 5, 95, 0, 0, 2914, 2915, 7, 9, 0, 0, 2915, 2916, 7, 19, 0, 0, 2916, 2917, 5, 95, 0, 0, 2917, 2918, 7, 13, 0, 0, 2918, 2919, 7, 10, 0, 0, 2919, 2920, 7, 2, 0, 0, 2920, 2921, 7, 14, 0, 0, 2921, 530, 1, 0, 0, 0, 2922, 2923, 7, 12, 0, 0, 2923, 2924, 7, 10, 0, 0, 2924, 2925, 7, 10, 0, 0, 2925, 2926, 7, 25, 0, 0, 2926, 2927, 7, 9, 0, 0, 2927, 2928, 7, 19, 0, 0, 2928, 2929, 7, 13, 0, 0, 2929, 2930, 7, 10, 0, 0, 2930, 2931, 7, 2, 0, 0, 2931, 2932, 7, 14, 0, 0, 2932, 532, 1, 0, 0, 0, 2933, 2934, 7, 12, 0, 0, 2934, 2935, 7, 10, 0, 0, 2935, 2936, 7, 10, 0, 0, 2936, 2937, 7, 25, 0, 0, 2937, 2938, 7, 5, 0, 0, 2938, 2939, 7, 2, 0, 0, 2939, 2940, 7, 13, 0, 0, 2940, 534, 1, 0, 0, 0, 2941, 2942, 7, 12, 0, 0, 2942, 2943, 7, 17, 0, 0, 2943, 2944, 7, 3, 0, 0, 2944, 2945, 7, 5, 0, 0, 2945, 2946, 7, 7, 0, 0, 2946, 2947, 7, 2, 0, 0, 2947, 2948, 7, 14, 0, 0, 2948, 2949, 7, 5, 0, 0, 2949, 2950, 7, 26, 0, 0, 2950, 2951, 7, 15, 0, 0, 2951, 2952, 7, 10, 0, 0, 2952, 2953, 7, 14, 0, 0, 2953, 2954, 7, 13, 0, 0, 2954, 536, 1, 0, 0, 0, 2955, 2956, 7, 12, 0, 0, 2956, 2957, 7, 17, 0, 0, 2957, 2958, 7, 3, 0, 0, 2958, 2959, 7, 5, 0, 0, 2959, 2960, 7, 7, 0, 0, 2960, 2961, 7, 2, 0, 0, 2961, 2962, 7, 14, 0, 0, 2962, 2963, 7, 5, 0, 0, 2963, 2964, 5, 95, 0, 0, 2964, 2965, 7, 26, 0, 0, 2965, 2966, 7, 15, 0, 0, 2966, 2967, 7, 10, 0, 0, 2967, 2968, 7, 14, 0, 0, 2968, 2969, 7, 13, 0, 0, 2969, 538, 1, 0, 0, 0, 2970, 2971, 7, 6, 0, 0, 2971, 2972, 7, 15, 0, 0, 2972, 2973, 7, 8, 0, 0, 2973, 2974, 7, 6, 0, 0, 2974, 2975, 7, 11, 0, 0, 2975, 2976, 7, 14, 0, 0, 2976, 540, 1, 0, 0, 0, 2977, 2978, 7, 6, 0, 0, 2978, 2979, 7, 11, 0, 0, 2979, 2980, 7, 14, 0, 0, 2980, 2981, 7, 7, 0, 0, 2981, 2982, 7, 16, 0, 0, 2982, 2983, 7, 21, 0, 0, 2983, 542, 1, 0, 0, 0, 2984, 2985, 7, 2, 0, 0, 2985, 2986, 7, 5, 0, 0, 2986, 2987, 7, 5, 0, 0, 2987, 2988, 7, 5, 0, 0, 2988, 2989, 7, 2, 0, 0, 2989, 2990, 7, 11, 0, 0, 2990, 2991, 7, 10, 0, 0, 2991, 544, 1, 0, 0, 0, 2992, 2993, 7, 13, 0, 0, 2993, 2994, 7, 10, 0, 0, 2994, 2995, 7, 2, 0, 0, 2995, 2996, 7, 14, 0, 0, 2996, 2997, 7, 12, 0, 0, 2997, 2998, 7, 10, 0, 0, 2998, 2999, 7, 10, 0, 0, 2999, 3000, 7, 25, 0, 0, 3000, 546, 1, 0, 0, 0, 3001, 3002, 7, 2, 0, 0, 3002, 3003, 7, 3, 0, 0, 3003, 3004, 7, 3, 0, 0, 3004, 3005, 7, 9, 0, 0, 3005, 3006, 7, 12, 0, 0, 3006, 3007, 5, 95, 0, 0, 3007, 3008, 7, 3, 0, 0, 3008, 3009, 7, 10, 0, 0, 3009, 3010, 7, 2, 0, 0, 3010, 3011, 7, 5, 0, 0, 3011, 3012, 7, 17, 0, 0, 3012, 3013, 7, 4, 0, 0, 3013, 3014, 7, 20, 0, 0, 3014, 3015, 5, 95, 0, 0, 3015, 3016, 7, 12, 0, 0, 3016, 3017, 7, 17, 0, 0, 3017, 3018, 7, 3, 0, 0, 3018, 3019, 7, 5, 0, 0, 3019, 3020, 7, 7, 0, 0, 3020, 3021, 7, 2, 0, 0, 3021, 3022, 7, 14, 0, 0, 3022, 3023, 7, 5, 0, 0, 3023, 548, 1, 0, 0, 0, 3024, 3025, 7, 2, 0, 0, 3025, 3026, 7, 4, 0, 0, 3026, 3027, 7, 2, 0, 0, 3027, 3028, 7, 3, 0, 0, 3028, 3029, 7, 13, 0, 0, 3029, 3030, 7, 27, 0, 0, 3030, 3031, 7, 10, 0, 0, 3031, 3032, 7, 14, 0, 0, 3032, 550, 1, 0, 0, 0, 3033, 3034, 7, 2, 0, 0, 3034, 3035, 7, 4, 0, 0, 3035, 3036, 7, 2, 0, 0, 3036, 3037, 7, 3, 0, 0, 3037, 3038, 7, 13, 0, 0, 3038, 3039, 7, 27, 0, 0, 3039, 3040, 7, 10, 0, 0, 3040, 3041, 5, 95, 0, 0, 3041, 3042, 7, 12, 0, 0, 3042, 3043, 7, 17, 0, 0, 3043, 3044, 7, 3, 0, 0, 3044, 3045, 7, 5, 0, 0, 3045, 3046, 7, 7, 0, 0, 3046, 3047, 7, 2, 0, 0, 3047, 3048, 7, 14, 0, 0, 3048, 3049, 7, 5, 0, 0, 3049, 552, 1, 0, 0, 0, 3050, 3051, 7, 2, 0, 0, 3051, 3052, 7, 15, 0, 0, 3052, 3053, 7, 11, 0, 0, 3053, 3054, 7, 9, 0, 0, 3054, 3055, 5, 95, 0, 0, 3055, 3056, 7, 20, 0, 0, 3056, 3057, 7, 10, 0, 0, 3057, 3058, 7, 4, 0, 0, 3058, 3059, 7, 10, 0, 0, 3059, 3060, 7, 14, 0, 0, 3060, 3061, 7, 2, 0, 0, 3061, 3062, 7, 11, 0, 0, 3062, 3063, 7, 10, 0, 0, 3063, 3064, 5, 95, 0, 0, 3064, 3065, 7, 6, 0, 0, 3065, 3066, 7, 13, 0, 0, 3066, 3067, 7, 4, 0, 0, 3067, 3068, 7, 9, 0, 0, 3068, 3069, 7, 4, 0, 0, 3069, 3070, 7, 13, 0, 0, 3070, 3071, 7, 16, 0, 0, 3071, 3072, 7, 6, 0, 0, 3072, 3073, 5, 95, 0, 0, 3073, 3074, 7, 21, 0, 0, 3074, 3075, 7, 22, 0, 0, 3075, 3076, 7, 14, 0, 0, 3076, 3077, 7, 2, 0, 0, 3077, 3078, 7, 6, 0, 0, 3078, 3079, 7, 10, 0, 0, 3079, 3080, 5, 95, 0, 0, 3080, 3081, 7, 26, 0, 0, 3081, 3082, 7, 15, 0, 0, 3082, 3083, 7, 10, 0, 0, 3083, 3084, 7, 14, 0, 0, 3084, 3085, 7, 13, 0, 0, 3085, 554, 1, 0, 0, 0, 3086, 3087, 7, 8, 0, 0, 3087, 3088, 7, 9, 0, 0, 3088, 3089, 7, 9, 0, 0, 3089, 3090, 7, 6, 0, 0, 3090, 3091, 7, 11, 0, 0, 3091, 556, 1, 0, 0, 0, 3092, 3093, 7, 7, 0, 0, 3093, 3094, 7, 2, 0, 0, 3094, 3095, 7, 6, 0, 0, 3095, 3096, 7, 10, 0, 0, 3096, 3097, 5, 95, 0, 0, 3097, 3098, 7, 17, 0, 0, 3098, 3099, 7, 4, 0, 0, 3099, 3100, 7, 6, 0, 0, 3100, 3101, 7, 10, 0, 0, 3101, 3102, 7, 4, 0, 0, 3102, 3103, 7, 6, 0, 0, 3103, 3104, 7, 17, 0, 0, 3104, 3105, 7, 11, 0, 0, 3105, 3106, 7, 17, 0, 0, 3106, 3107, 7, 23, 0, 0, 3107, 3108, 7, 10, 0, 0, 3108, 558, 1, 0, 0, 0, 3109, 3110, 7, 7, 0, 0, 3110, 3111, 7, 15, 0, 0, 3111, 3112, 7, 11, 0, 0, 3112, 3113, 7, 9, 0, 0, 3113, 3114, 7, 19, 0, 0, 3114, 3115, 7, 19, 0, 0, 3115, 3116, 5, 95, 0, 0, 3116, 3117, 7, 19, 0, 0, 3117, 3118, 7, 14, 0, 0, 3118, 3119, 7, 10, 0, 0, 3119, 3120, 7, 26, 0, 0, 3120, 3121, 7, 15, 0, 0, 3121, 3122, 7, 10, 0, 0, 3122, 3123, 7, 4, 0, 0, 3123, 3124, 7, 7, 0, 0, 3124, 3125, 7, 13, 0, 0, 3125, 560, 1, 0, 0, 0, 3126, 3127, 7, 5, 0, 0, 3127, 3128, 7, 10, 0, 0, 3128, 3129, 7, 19, 0, 0, 3129, 3130, 7, 2, 0, 0, 3130, 3131, 7, 15, 0, 0, 3131, 3132, 7, 3, 0, 0, 3132, 3133, 7, 11, 0, 0, 3133, 3134, 5, 95, 0, 0, 3134, 3135, 7, 19, 0, 0, 3135, 3136, 7, 17, 0, 0, 3136, 3137, 7, 10, 0, 0, 3137, 3138, 7, 3, 0, 0, 3138, 3139, 7, 5, 0, 0, 3139, 562, 1, 0, 0, 0, 3140, 3141, 7, 5, 0, 0, 3141, 3142, 7, 10, 0, 0, 3142, 3143, 7, 19, 0, 0, 3143, 3144, 7, 2, 0, 0, 3144, 3145, 7, 15, 0, 0, 3145, 3146, 7, 3, 0, 0, 3146, 3147, 7, 11, 0, 0, 3147, 3148, 5, 95, 0, 0, 3148, 3149, 7, 9, 0, 0, 3149, 3150, 7, 21, 0, 0, 3150, 3151, 7, 10, 0, 0, 3151, 3152, 7, 14, 0, 0, 3152, 3153, 7, 2, 0, 0, 3153, 3154, 7, 11, 0, 0, 3154, 3155, 7, 9, 0, 0, 3155, 3156, 7, 14, 0, 0, 3156, 564, 1, 0, 0, 0, 3157, 3158, 7, 10, 0, 0, 3158, 3159, 7, 6, 0, 0, 3159, 3160, 7, 7, 0, 0, 3160, 3161, 7, 2, 0, 0, 3161, 3162, 7, 21, 0, 0, 3162, 3163, 7, 10, 0, 0, 3163, 566, 1, 0, 0, 0, 3164, 3165, 7, 10, 0, 0, 3165, 3166, 7, 4, 0, 0, 3166, 3167, 7, 2, 0, 0, 3167, 3168, 7, 8, 0, 0, 3168, 3169, 7, 3, 0, 0, 3169, 3170, 7, 10, 0, 0, 3170, 3171, 5, 95, 0, 0, 3171, 3172, 7, 21, 0, 0, 3172, 3173, 7, 9, 0, 0, 3173, 3174, 7, 6, 0, 0, 3174, 3175, 7, 17, 0, 0, 3175, 3176, 7, 11, 0, 0, 3176, 3177, 7, 17, 0, 0, 3177, 3178, 7, 9, 0, 0, 3178, 3179, 7, 4, 0, 0, 3179, 3180, 5, 95, 0, 0, 3180, 3181, 7, 17, 0, 0, 3181, 3182, 7, 4, 0, 0, 3182, 3183, 7, 7, 0, 0, 3183, 3184, 7, 14, 0, 0, 3184, 3185, 7, 10, 0, 0, 3185, 3186, 7, 16, 0, 0, 3186, 3187, 7, 10, 0, 0, 3187, 3188, 7, 4, 0, 0, 3188, 3189, 7, 11, 0, 0, 3189, 3190, 7, 6, 0, 0, 3190, 568, 1, 0, 0, 0, 3191, 3192, 7, 19, 0, 0, 3192, 3193, 7, 17, 0, 0, 3193, 3194, 7, 10, 0, 0, 3194, 3195, 7, 3, 0, 0, 3195, 3196, 7, 5, 0, 0, 3196, 3197, 7, 6, 0, 0, 3197, 570, 1, 0, 0, 0, 3198, 3199, 7, 19, 0, 0, 3199, 3200, 7, 3, 0, 0, 3200, 3201, 7, 2, 0, 0, 3201, 3202, 7, 20, 0, 0, 3202, 3203, 7, 6, 0, 0, 3203, 572, 1, 0, 0, 0, 3204, 3205, 7, 19, 0, 0, 3205, 3206, 7, 15, 0, 0, 3206, 3207, 7, 27, 0, 0, 3207, 3208, 7, 27, 0, 0, 3208, 3209, 7, 17, 0, 0, 3209, 3210, 7, 4, 0, 0, 3210, 3211, 7, 10, 0, 0, 3211, 3212, 7, 6, 0, 0, 3212, 3213, 7, 6, 0, 0, 3213, 574, 1, 0, 0, 0, 3214, 3215, 7, 19, 0, 0, 3215, 3216, 7, 15, 0, 0, 3216, 3217, 7, 27, 0, 0, 3217, 3218, 7, 27, 0, 0, 3218, 3219, 7, 13, 0, 0, 3219, 3220, 5, 95, 0, 0, 3220, 3221, 7, 16, 0, 0, 3221, 3222, 7, 2, 0, 0, 3222, 3223, 7, 18, 0, 0, 3223, 3224, 5, 95, 0, 0, 3224, 3225, 7, 10, 0, 0, 3225, 3226, 7, 18, 0, 0, 3226, 3227, 7, 21, 0, 0, 3227, 3228, 7, 2, 0, 0, 3228, 3229, 7, 4, 0, 0, 3229, 3230, 7, 6, 0, 0, 3230, 3231, 7, 17, 0, 0, 3231, 3232, 7, 9, 0, 0, 3232, 3233, 7, 4, 0, 0, 3233, 3234, 7, 6, 0, 0, 3234, 576, 1, 0, 0, 0, 3235, 3236, 7, 19, 0, 0, 3236, 3237, 7, 15, 0, 0, 3237, 3238, 7, 27, 0, 0, 3238, 3239, 7, 27, 0, 0, 3239, 3240, 7, 13, 0, 0, 3240, 3241, 5, 95, 0, 0, 3241, 3242, 7, 21, 0, 0, 3242, 3243, 7, 14, 0, 0, 3243, 3244, 7, 10, 0, 0, 3244, 3245, 7, 19, 0, 0, 3245, 3246, 7, 17, 0, 0, 3246, 3247, 7, 18, 0, 0, 3247, 3248, 5, 95, 0, 0, 3248, 3249, 7, 3, 0, 0, 3249, 3250, 7, 10, 0, 0, 3250, 3251, 7, 4, 0, 0, 3251, 3252, 7, 20, 0, 0, 3252, 3253, 7, 11, 0, 0, 3253, 3254, 7, 22, 0, 0, 3254, 578, 1, 0, 0, 0, 3255, 3256, 7, 19, 0, 0, 3256, 3257, 7, 15, 0, 0, 3257, 3258, 7, 27, 0, 0, 3258, 3259, 7, 27, 0, 0, 3259, 3260, 7, 13, 0, 0, 3260, 3261, 5, 95, 0, 0, 3261, 3262, 7, 14, 0, 0, 3262, 3263, 7, 10, 0, 0, 3263, 3264, 7, 12, 0, 0, 3264, 3265, 7, 14, 0, 0, 3265, 3266, 7, 17, 0, 0, 3266, 3267, 7, 11, 0, 0, 3267, 3268, 7, 10, 0, 0, 3268, 580, 1, 0, 0, 0, 3269, 3270, 7, 19, 0, 0, 3270, 3271, 7, 15, 0, 0, 3271, 3272, 7, 27, 0, 0, 3272, 3273, 7, 27, 0, 0, 3273, 3274, 7, 13, 0, 0, 3274, 3275, 5, 95, 0, 0, 3275, 3276, 7, 11, 0, 0, 3276, 3277, 7, 14, 0, 0, 3277, 3278, 7, 2, 0, 0, 3278, 3279, 7, 4, 0, 0, 3279, 3280, 7, 6, 0, 0, 3280, 3281, 7, 21, 0, 0, 3281, 3282, 7, 9, 0, 0, 3282, 3283, 7, 6, 0, 0, 3283, 3284, 7, 17, 0, 0, 3284, 3285, 7, 11, 0, 0, 3285, 3286, 7, 17, 0, 0, 3286, 3287, 7, 9, 0, 0, 3287, 3288, 7, 4, 0, 0, 3288, 3289, 7, 6, 0, 0, 3289, 582, 1, 0, 0, 0, 3290, 3291, 7, 3, 0, 0, 3291, 3292, 7, 10, 0, 0, 3292, 3293, 7, 4, 0, 0, 3293, 3294, 7, 17, 0, 0, 3294, 3295, 7, 10, 0, 0, 3295, 3296, 7, 4, 0, 0, 3296, 3297, 7, 11, 0, 0, 3297, 584, 1, 0, 0, 0, 3298, 3299, 7, 3, 0, 0, 3299, 3300, 7, 9, 0, 0, 3300, 3301, 7, 12, 0, 0, 3301, 3302, 5, 95, 0, 0, 3302, 3303, 7, 19, 0, 0, 3303, 3304, 7, 14, 0, 0, 3304, 3305, 7, 10, 0, 0, 3305, 3306, 7, 26, 0, 0, 3306, 3307, 5, 95, 0, 0, 3307, 3308, 7, 9, 0, 0, 3308, 3309, 7, 21, 0, 0, 3309, 3310, 7, 10, 0, 0, 3310, 3311, 7, 14, 0, 0, 3311, 3312, 7, 2, 0, 0, 3312, 3313, 7, 11, 0, 0, 3313, 3314, 7, 9, 0, 0, 3314, 3315, 7, 14, 0, 0, 3315, 586, 1, 0, 0, 0, 3316, 3317, 7, 16, 0, 0, 3317, 3318, 7, 2, 0, 0, 3318, 3319, 7, 18, 0, 0, 3319, 3320, 5, 95, 0, 0, 3320, 3321, 7, 5, 0, 0, 3321, 3322, 7, 10, 0, 0, 3322, 3323, 7, 11, 0, 0, 3323, 3324, 7, 10, 0, 0, 3324, 3325, 7, 14, 0, 0, 3325, 3326, 7, 16, 0, 0, 3326, 3327, 7, 17, 0, 0, 3327, 3328, 7, 4, 0, 0, 3328, 3329, 7, 17, 0, 0, 3329, 3330, 7, 27, 0, 0, 3330, 3331, 7, 10, 0, 0, 3331, 3332, 7, 5, 0, 0, 3332, 3333, 5, 95, 0, 0, 3333, 3334, 7, 6, 0, 0, 3334, 3335, 7, 11, 0, 0, 3335, 3336, 7, 2, 0, 0, 3336, 3337, 7, 11, 0, 0, 3337, 3338, 7, 10, 0, 0, 3338, 3339, 7, 6, 0, 0, 3339, 588, 1, 0, 0, 0, 3340, 3341, 7, 16, 0, 0, 3341, 3342, 7, 2, 0, 0, 3342, 3343, 7, 18, 0, 0, 3343, 3344, 5, 95, 0, 0, 3344, 3345, 7, 10, 0, 0, 3345, 3346, 7, 18, 0, 0, 3346, 3347, 7, 21, 0, 0, 3347, 3348, 7, 2, 0, 0, 3348, 3349, 7, 4, 0, 0, 3349, 3350, 7, 6, 0, 0, 3350, 3351, 7, 17, 0, 0, 3351, 3352, 7, 9, 0, 0, 3352, 3353, 7, 4, 0, 0, 3353, 3354, 7, 6, 0, 0, 3354, 590, 1, 0, 0, 0, 3355, 3356, 7, 16, 0, 0, 3356, 3357, 7, 17, 0, 0, 3357, 3358, 7, 4, 0, 0, 3358, 3359, 7, 17, 0, 0, 3359, 3360, 7, 16, 0, 0, 3360, 3361, 7, 15, 0, 0, 3361, 3362, 7, 16, 0, 0, 3362, 3363, 5, 95, 0, 0, 3363, 3364, 7, 6, 0, 0, 3364, 3365, 7, 22, 0, 0, 3365, 3366, 7, 9, 0, 0, 3366, 3367, 7, 15, 0, 0, 3367, 3368, 7, 3, 0, 0, 3368, 3369, 7, 5, 0, 0, 3369, 3370, 5, 95, 0, 0, 3370, 3371, 7, 16, 0, 0, 3371, 3372, 7, 2, 0, 0, 3372, 3373, 7, 11, 0, 0, 3373, 3374, 7, 7, 0, 0, 3374, 3375, 7, 22, 0, 0, 3375, 592, 1, 0, 0, 0, 3376, 3377, 7, 9, 0, 0, 3377, 3378, 7, 21, 0, 0, 3378, 3379, 7, 10, 0, 0, 3379, 3380, 7, 14, 0, 0, 3380, 3381, 7, 2, 0, 0, 3381, 3382, 7, 11, 0, 0, 3382, 3383, 7, 9, 0, 0, 3383, 3384, 7, 14, 0, 0, 3384, 594, 1, 0, 0, 0, 3385, 3386, 7, 21, 0, 0, 3386, 3387, 7, 22, 0, 0, 3387, 3388, 7, 14, 0, 0, 3388, 3389, 7, 2, 0, 0, 3389, 3390, 7, 6, 0, 0, 3390, 3391, 7, 10, 0, 0, 3391, 3392, 5, 95, 0, 0, 3392, 3393, 7, 6, 0, 0, 3393, 3394, 7, 3, 0, 0, 3394, 3395, 7, 9, 0, 0, 3395, 3396, 7, 21, 0, 0, 3396, 596, 1, 0, 0, 0, 3397, 3398, 7, 21, 0, 0, 3398, 3399, 7, 14, 0, 0, 3399, 3400, 7, 10, 0, 0, 3400, 3401, 7, 19, 0, 0, 3401, 3402, 7, 17, 0, 0, 3402, 3403, 7, 18, 0, 0, 3403, 3404, 5, 95, 0, 0, 3404, 3405, 7, 3, 0, 0, 3405, 3406, 7, 10, 0, 0, 3406, 3407, 7, 4, 0, 0, 3407, 3408, 7, 20, 0, 0, 3408, 3409, 7, 11, 0, 0, 3409, 3410, 7, 22, 0, 0, 3410, 598, 1, 0, 0, 0, 3411, 3412, 7, 26, 0, 0, 3412, 3413, 7, 15, 0, 0, 3413, 3414, 7, 9, 0, 0, 3414, 3415, 7, 11, 0, 0, 3415, 3416, 7, 10, 0, 0, 3416, 3417, 5, 95, 0, 0, 3417, 3418, 7, 2, 0, 0, 3418, 3419, 7, 4, 0, 0, 3419, 3420, 7, 2, 0, 0, 3420, 3421, 7, 3, 0, 0, 3421, 3422, 7, 13, 0, 0, 3422, 3423, 7, 27, 0, 0, 3423, 3424, 7, 10, 0, 0, 3424, 3425, 7, 14, 0, 0, 3425, 600, 1, 0, 0, 0, 3426, 3427, 7, 26, 0, 0, 3427, 3428, 7, 15, 0, 0, 3428, 3429, 7, 9, 0, 0, 3429, 3430, 7, 11, 0, 0, 3430, 3431, 7, 10, 0, 0, 3431, 3432, 5, 95, 0, 0, 3432, 3433, 7, 19, 0, 0, 3433, 3434, 7, 17, 0, 0, 3434, 3435, 7, 10, 0, 0, 3435, 3436, 7, 3, 0, 0, 3436, 3437, 7, 5, 0, 0, 3437, 3438, 5, 95, 0, 0, 3438, 3439, 7, 6, 0, 0, 3439, 3440, 7, 15, 0, 0, 3440, 3441, 7, 19, 0, 0, 3441, 3442, 7, 19, 0, 0, 3442, 3443, 7, 17, 0, 0, 3443, 3444, 7, 18, 0, 0, 3444, 602, 1, 0, 0, 0, 3445, 3446, 7, 14, 0, 0, 3446, 3447, 7, 10, 0, 0, 3447, 3448, 7, 12, 0, 0, 3448, 3449, 7, 14, 0, 0, 3449, 3450, 7, 17, 0, 0, 3450, 3451, 7, 11, 0, 0, 3451, 3452, 7, 10, 0, 0, 3452, 604, 1, 0, 0, 0, 3453, 3454, 7, 6, 0, 0, 3454, 3455, 7, 3, 0, 0, 3455, 3456, 7, 9, 0, 0, 3456, 3457, 7, 21, 0, 0, 3457, 606, 1, 0, 0, 0, 3458, 3459, 7, 11, 0, 0, 3459, 3460, 7, 17, 0, 0, 3460, 3461, 7, 10, 0, 0, 3461, 3462, 5, 95, 0, 0, 3462, 3463, 7, 8, 0, 0, 3463, 3464, 7, 14, 0, 0, 3464, 3465, 7, 10, 0, 0, 3465, 3466, 7, 2, 0, 0, 3466, 3467, 7, 25, 0, 0, 3467, 3468, 7, 10, 0, 0, 3468, 3469, 7, 14, 0, 0, 3469, 608, 1, 0, 0, 0, 3470, 3471, 7, 11, 0, 0, 3471, 3472, 7, 17, 0, 0, 3472, 3473, 7, 16, 0, 0, 3473, 3474, 7, 10, 0, 0, 3474, 3475, 5, 95, 0, 0, 3475, 3476, 7, 27, 0, 0, 3476, 3477, 7, 9, 0, 0, 3477, 3478, 7, 4, 0, 0, 3478, 3479, 7, 10, 0, 0, 3479, 610, 1, 0, 0, 0, 3480, 3481, 7, 11, 0, 0, 3481, 3482, 7, 13, 0, 0, 3482, 3483, 7, 21, 0, 0, 3483, 3484, 7, 10, 0, 0, 3484, 612, 1, 0, 0, 0, 3485, 3486, 7, 27, 0, 0, 3486, 3487, 7, 10, 0, 0, 3487, 3488, 7, 14, 0, 0, 3488, 3489, 7, 9, 0, 0, 3489, 3490, 5, 95, 0, 0, 3490, 3491, 7, 11, 0, 0, 3491, 3492, 7, 10, 0, 0, 3492, 3493, 7, 14, 0, 0, 3493, 3494, 7, 16, 0, 0, 3494, 3495, 7, 6, 0, 0, 3495, 3496, 5, 95, 0, 0, 3496, 3497, 7, 26, 0, 0, 3497, 3498, 7, 15, 0, 0, 3498, 3499, 7, 10, 0, 0, 3499, 3500, 7, 14, 0, 0, 3500, 3501, 7, 13, 0, 0, 3501, 614, 1, 0, 0, 0, 3502, 3503, 7, 22, 0, 0, 3503, 3504, 7, 17, 0, 0, 3504, 3505, 7, 20, 0, 0, 3505, 3506, 7, 22, 0, 0, 3506, 3507, 7, 3, 0, 0, 3507, 3508, 7, 17, 0, 0, 3508, 3509, 7, 20, 0, 0, 3509, 3510, 7, 22, 0, 0, 3510, 3511, 7, 11, 0, 0, 3511, 616, 1, 0, 0, 0, 3512, 3513, 7, 21, 0, 0, 3513, 3514, 7, 14, 0, 0, 3514, 3515, 7, 10, 0, 0, 3515, 3516, 5, 95, 0, 0, 3516, 3517, 7, 11, 0, 0, 3517, 3518, 7, 2, 0, 0, 3518, 3519, 7, 20, 0, 0, 3519, 3520, 7, 6, 0, 0, 3520, 618, 1, 0, 0, 0, 3521, 3522, 7, 21, 0, 0, 3522, 3523, 7, 9, 0, 0, 3523, 3524, 7, 6, 0, 0, 3524, 3525, 7, 11, 0, 0, 3525, 3526, 5, 95, 0, 0, 3526, 3527, 7, 11, 0, 0, 3527, 3528, 7, 2, 0, 0, 3528, 3529, 7, 20, 0, 0, 3529, 3530, 7, 6, 0, 0, 3530, 620, 1, 0, 0, 0, 3531, 3532, 7, 16, 0, 0, 3532, 3533, 7, 2, 0, 0, 3533, 3534, 7, 11, 0, 0, 3534, 3535, 7, 7, 0, 0, 3535, 3536, 7, 22, 0, 0, 3536, 3537, 5, 95, 0, 0, 3537, 3538, 7, 8, 0, 0, 3538, 3539, 7, 9, 0, 0, 3539, 3540, 7, 9, 0, 0, 3540, 3541, 7, 3, 0, 0, 3541, 3542, 5, 95, 0, 0, 3542, 3543, 7, 21, 0, 0, 3543, 3544, 7, 14, 0, 0, 3544, 3545, 7, 10, 0, 0, 3545, 3546, 7, 19, 0, 0, 3546, 3547, 7, 17, 0, 0, 3547, 3548, 7, 18, 0, 0, 3548, 622, 1, 0, 0, 0, 3549, 3550, 5, 42, 0, 0, 3550, 624, 1, 0, 0, 0, 3551, 3552, 5, 47, 0, 0, 3552, 626, 1, 0, 0, 0, 3553, 3554, 5, 37, 0, 0, 3554, 628, 1, 0, 0, 0, 3555, 3556, 5, 43, 0, 0, 3556, 630, 1, 0, 0, 0, 3557, 3558, 5, 45, 0, 0, 3558, 632, 1, 0, 0, 0, 3559, 3560, 7, 5, 0, 0, 3560, 3561, 7, 17, 0, 0, 3561, 3562, 7, 23, 0, 0, 3562, 634, 1, 0, 0, 0, 3563, 3564, 7, 16, 0, 0, 3564, 3565, 7, 9, 0, 0, 3565, 3566, 7, 5, 0, 0, 3566, 636, 1, 0, 0, 0, 3567, 3568, 5, 61, 0, 0, 3568, 638, 1, 0, 0, 0, 3569, 3570, 5, 62, 0, 0, 3570, 640, 1, 0, 0, 0, 3571, 3572, 5, 60, 0, 0, 3572, 642, 1, 0, 0, 0, 3573, 3574, 5, 33, 0, 0, 3574, 644, 1, 0, 0, 0, 3575, 3576, 5, 126, 0, 0, 3576, 646, 1, 0, 0, 0, 3577, 3578, 5, 124, 0, 0, 3578, 648, 1, 0, 0, 0, 3579, 3580, 5, 38, 0, 0, 3580, 650, 1, 0, 0, 0, 3581, 3582, 5, 94, 0, 0, 3582, 652, 1, 0, 0, 0, 3583, 3584, 5, 46, 0, 0, 3584, 654, 1, 0, 0, 0, 3585, 3586, 5, 40, 0, 0, 3586, 656, 1, 0, 0, 0, 3587, 3588, 5, 41, 0, 0, 3588, 658, 1, 0, 0, 0, 3589, 3590, 5, 91, 0, 0, 3590, 660, 1, 0, 0, 0, 3591, 3592, 5, 93, 0, 0, 3592, 662, 1, 0, 0, 0, 3593, 3594, 5, 44, 0, 0, 3594, 664, 1, 0, 0, 0, 3595, 3596, 5, 59, 0, 0, 3596, 666, 1, 0, 0, 0, 3597, 3598, 5, 64, 0, 0, 3598, 668, 1, 0, 0, 0, 3599, 3600, 5, 48, 0, 0, 3600, 670, 1, 0, 0, 0, 3601, 3602, 5, 49, 0, 0, 3602, 672, 1, 0, 0, 0, 3603, 3604, 5, 50, 0, 0, 3604, 674, 1, 0, 0, 0, 3605, 3606, 5, 39, 0, 0, 3606, 676, 1, 0, 0, 0, 3607, 3608, 5, 34, 0, 0, 3608, 678, 1, 0, 0, 0, 3609, 3610, 5, 96, 0, 0, 3610, 680, 1, 0, 0, 0, 3611, 3612, 5, 58, 0, 0, 3612, 682, 1, 0, 0, 0, 3613, 3614, 7, 4, 0, 0, 3614, 3615, 3, 709, 354, 0, 3615, 684, 1, 0, 0, 0, 3616, 3617, 3, 709, 354, 0, 3617, 686, 1, 0, 0, 0, 3618, 3620, 3, 715, 357, 0, 3619, 3618, 1, 0, 0, 0, 3620, 3621, 1, 0, 0, 0, 3621, 3619, 1, 0, 0, 0, 3621, 3622, 1, 0, 0, 0, 3622, 688, 1, 0, 0, 0, 3623, 3624, 7, 18, 0, 0, 3624, 3628, 5, 39, 0, 0, 3625, 3626, 3, 713, 356, 0, 3626, 3627, 3, 713, 356, 0, 3627, 3629, 1, 0, 0, 0, 3628, 3625, 1, 0, 0, 0, 3629, 3630, 1, 0, 0, 0, 3630, 3628, 1, 0, 0, 0, 3630, 3631, 1, 0, 0, 0, 3631, 3632, 1, 0, 0, 0, 3632, 3633, 5, 39, 0, 0, 3633, 3643, 1, 0, 0, 0, 3634, 3635, 5, 48, 0, 0, 3635, 3636, 7, 18, 0, 0, 3636, 3638, 1, 0, 0, 0, 3637, 3639, 3, 713, 356, 0, 3638, 3637, 1, 0, 0, 0, 3639, 3640, 1, 0, 0, 0, 3640, 3638, 1, 0, 0, 0, 3640, 3641, 1, 0, 0, 0, 3641, 3643, 1, 0, 0, 0, 3642, 3623, 1, 0, 0, 0, 3642, 3634, 1, 0, 0, 0, 3643, 690, 1, 0, 0, 0, 3644, 3646, 3, 715, 357, 0, 3645, 3644, 1, 0, 0, 0, 3646, 3647, 1, 0, 0, 0, 3647, 3645, 1, 0, 0, 0, 3647, 3648, 1, 0, 0, 0, 3648, 3650, 1, 0, 0, 0, 3649, 3645, 1, 0, 0, 0, 3649, 3650, 1, 0, 0, 0, 3650, 3651, 1, 0, 0, 0, 3651, 3653, 5, 46, 0, 0, 3652, 3654, 3, 715, 357, 0, 3653, 3652, 1, 0, 0, 0, 3654, 3655, 1, 0, 0, 0, 3655, 3653, 1, 0, 0, 0, 3655, 3656, 1, 0, 0, 0, 3656, 3688, 1, 0, 0, 0, 3657, 3659, 3, 715, 357, 0, 3658, 3657, 1, 0, 0, 0, 3659, 3660, 1, 0, 0, 0, 3660, 3658, 1, 0, 0, 0, 3660, 3661, 1, 0, 0, 0, 3661, 3662, 1, 0, 0, 0, 3662, 3663, 5, 46, 0, 0, 3663, 3664, 3, 703, 351, 0, 3664, 3688, 1, 0, 0, 0, 3665, 3667, 3, 715, 357, 0, 3666, 3665, 1, 0, 0, 0, 3667, 3668, 1, 0, 0, 0, 3668, 3666, 1, 0, 0, 0, 3668, 3669, 1, 0, 0, 0, 3669, 3671, 1, 0, 0, 0, 3670, 3666, 1, 0, 0, 0, 3670, 3671, 1, 0, 0, 0, 3671, 3672, 1, 0, 0, 0, 3672, 3674, 5, 46, 0, 0, 3673, 3675, 3, 715, 357, 0, 3674, 3673, 1, 0, 0, 0, 3675, 3676, 1, 0, 0, 0, 3676, 3674, 1, 0, 0, 0, 3676, 3677, 1, 0, 0, 0, 3677, 3678, 1, 0, 0, 0, 3678, 3679, 3, 703, 351, 0, 3679, 3688, 1, 0, 0, 0, 3680, 3682, 3, 715, 357, 0, 3681, 3680, 1, 0, 0, 0, 3682, 3683, 1, 0, 0, 0, 3683, 3681, 1, 0, 0, 0, 3683, 3684, 1, 0, 0, 0, 3684, 3685, 1, 0, 0, 0, 3685, 3686, 3, 703, 351, 0, 3686, 3688, 1, 0, 0, 0, 3687, 3649, 1, 0, 0, 0, 3687, 3658, 1, 0, 0, 0, 3687, 3670, 1, 0, 0, 0, 3687, 3681, 1, 0, 0, 0, 3688, 692, 1, 0, 0, 0, 3689, 3690, 5, 92, 0, 0, 3690, 3691, 7, 4, 0, 0, 3691, 694, 1, 0, 0, 0, 3692, 3693, 3, 717, 358, 0, 3693, 696, 1, 0, 0, 0, 3694, 3695, 3, 705, 352, 0, 3695, 698, 1, 0, 0, 0, 3696, 3697, 3, 707, 353, 0, 3697, 700, 1, 0, 0, 0, 3698, 3699, 3, 711, 355, 0, 3699, 702, 1, 0, 0, 0, 3700, 3702, 7, 10, 0, 0, 3701, 3703, 7, 28, 0, 0, 3702, 3701, 1, 0, 0, 0, 3702, 3703, 1, 0, 0, 0, 3703, 3705, 1, 0, 0, 0, 3704, 3706, 3, 715, 357, 0, 3705, 3704, 1, 0, 0, 0, 3706, 3707, 1, 0, 0, 0, 3707, 3705, 1, 0, 0, 0, 3707, 3708, 1, 0, 0, 0, 3708, 704, 1, 0, 0, 0, 3709, 3711, 7, 29, 0, 0, 3710, 3709, 1, 0, 0, 0, 3711, 3712, 1, 0, 0, 0, 3712, 3710, 1, 0, 0, 0, 3712, 3713, 1, 0, 0, 0, 3713, 3717, 1, 0, 0, 0, 3714, 3716, 7, 30, 0, 0, 3715, 3714, 1, 0, 0, 0, 3716, 3719, 1, 0, 0, 0, 3717, 3715, 1, 0, 0, 0, 3717, 3718, 1, 0, 0, 0, 3718, 706, 1, 0, 0, 0, 3719, 3717, 1, 0, 0, 0, 3720, 3728, 5, 34, 0, 0, 3721, 3722, 5, 92, 0, 0, 3722, 3727, 9, 0, 0, 0, 3723, 3724, 5, 34, 0, 0, 3724, 3727, 5, 34, 0, 0, 3725, 3727, 8, 31, 0, 0, 3726, 3721, 1, 0, 0, 0, 3726, 3723, 1, 0, 0, 0, 3726, 3725, 1, 0, 0, 0, 3727, 3730, 1, 0, 0, 0, 3728, 3726, 1, 0, 0, 0, 3728, 3729, 1, 0, 0, 0, 3729, 3731, 1, 0, 0, 0, 3730, 3728, 1, 0, 0, 0, 3731, 3732, 5, 34, 0, 0, 3732, 708, 1, 0, 0, 0, 3733, 3741, 5, 39, 0, 0, 3734, 3735, 5, 92, 0, 0, 3735, 3740, 9, 0, 0, 0, 3736, 3737, 5, 39, 0, 0, 3737, 3740, 5, 39, 0, 0, 3738, 3740, 8, 32, 0, 0, 3739, 3734, 1, 0, 0, 0, 3739, 3736, 1, 0, 0, 0, 3739, 3738, 1, 0, 0, 0, 3740, 3743, 1, 0, 0, 0, 3741, 3739, 1, 0, 0, 0, 3741, 3742, 1, 0, 0, 0, 3742, 3744, 1, 0, 0, 0, 3743, 3741, 1, 0, 0, 0, 3744, 3745, 5, 39, 0, 0, 3745, 710, 1, 0, 0, 0, 3746, 3754, 5, 96, 0, 0, 3747, 3748, 5, 92, 0, 0, 3748, 3753, 9, 0, 0, 0, 3749, 3750, 5, 96, 0, 0, 3750, 3753, 5, 96, 0, 0, 3751, 3753, 8, 33, 0, 0, 3752, 3747, 1, 0, 0, 0, 3752, 3749, 1, 0, 0, 0, 3752, 3751, 1, 0, 0, 0, 3753, 3756, 1, 0, 0, 0, 3754, 3752, 1, 0, 0, 0, 3754, 3755, 1, 0, 0, 0, 3755, 3757, 1, 0, 0, 0, 3756, 3754, 1, 0, 0, 0, 3757, 3758, 5, 96, 0, 0, 3758, 712, 1, 0, 0, 0, 3759, 3760, 7, 34, 0, 0, 3760, 714, 1, 0, 0, 0, 3761, 3762, 7, 35, 0, 0, 3762, 716, 1, 0, 0, 0, 3763, 3764, 7, 8, 0, 0, 3764, 3766, 5, 39, 0, 0, 3765, 3767, 7, 36, 0, 0, 3766, 3765, 1, 0, 0, 0, 3767, 3768, 1, 0, 0, 0, 3768, 3766, 1, 0, 0, 0, 3768, 3769, 1, 0, 0, 0, 3769, 3770, 1, 0, 0, 0, 3770, 3771, 5, 39, 0, 0, 3771, 718, 1, 0, 0, 0, 3772, 3773, 9, 0, 0, 0, 3773, 3774, 1, 0, 0, 0, 3774, 3775, 6, 359, 2, 0, 3775, 720, 1, 0, 0, 0, 35, 0, 724, 735, 748, 760, 765, 769, 773, 779, 783, 785, 3621, 3630, 3640, 3642, 3647, 3649, 3655, 3660, 3668, 3670, 3676, 3683, 3687, 3702, 3707, 3712, 3717, 3726, 3728, 3739, 3741, 3752, 3754, 3768, 3, 0, 1, 0, 0, 2, 0, 0, 3, 0] \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.java b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.java new file mode 100644 index 00000000000..ac44d3f27a7 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.java @@ -0,0 +1,2836 @@ +// Generated from /home/ubuntu/ws/OpenSearch-Dashboards/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 by ANTLR 4.13.1 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +public class OpenSearchSQLLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + SPACE=1, SPEC_SQL_COMMENT=2, COMMENT_INPUT=3, LINE_COMMENT=4, ALL=5, AND=6, + AS=7, ASC=8, BOOLEAN=9, BETWEEN=10, BY=11, CASE=12, CAST=13, CROSS=14, + COLUMNS=15, DATETIME=16, DELETE=17, DESC=18, DESCRIBE=19, DISTINCT=20, + DOUBLE=21, ELSE=22, EXISTS=23, FALSE=24, FLOAT=25, FIRST=26, FROM=27, + GROUP=28, HAVING=29, IN=30, INNER=31, INT=32, INTEGER=33, IS=34, JOIN=35, + LAST=36, LEFT=37, LIKE=38, LIMIT=39, LONG=40, MATCH=41, NATURAL=42, MISSING_LITERAL=43, + NOT=44, NULL_LITERAL=45, NULLS=46, ON=47, OR=48, ORDER=49, OUTER=50, OVER=51, + PARTITION=52, REGEXP=53, RIGHT=54, SELECT=55, SHOW=56, STRING=57, THEN=58, + TRUE=59, UNION=60, USING=61, WHEN=62, WHERE=63, EXCEPT=64, AVG=65, COUNT=66, + MAX=67, MIN=68, SUM=69, VAR_POP=70, VAR_SAMP=71, VARIANCE=72, STD=73, + STDDEV=74, STDDEV_POP=75, STDDEV_SAMP=76, SUBSTRING=77, TRIM=78, END=79, + FULL=80, OFFSET=81, INTERVAL=82, MICROSECOND=83, SECOND=84, MINUTE=85, + HOUR=86, DAY=87, WEEK=88, MONTH=89, QUARTER=90, YEAR=91, SECOND_MICROSECOND=92, + MINUTE_MICROSECOND=93, MINUTE_SECOND=94, HOUR_MICROSECOND=95, HOUR_SECOND=96, + HOUR_MINUTE=97, DAY_MICROSECOND=98, DAY_SECOND=99, DAY_MINUTE=100, DAY_HOUR=101, + YEAR_MONTH=102, TABLES=103, ABS=104, ACOS=105, ADD=106, ADDTIME=107, ASCII=108, + ASIN=109, ATAN=110, ATAN2=111, CBRT=112, CEIL=113, CEILING=114, CONCAT=115, + CONCAT_WS=116, CONV=117, CONVERT_TZ=118, COS=119, COSH=120, COT=121, CRC32=122, + CURDATE=123, CURTIME=124, CURRENT_DATE=125, CURRENT_TIME=126, CURRENT_TIMESTAMP=127, + DATE=128, DATE_ADD=129, DATE_FORMAT=130, DATE_SUB=131, DATEDIFF=132, DAYNAME=133, + DAYOFMONTH=134, DAYOFWEEK=135, DAYOFYEAR=136, DEGREES=137, DIVIDE=138, + E=139, EXP=140, EXPM1=141, EXTRACT=142, FLOOR=143, FROM_DAYS=144, FROM_UNIXTIME=145, + GET_FORMAT=146, IF=147, IFNULL=148, ISNULL=149, LAST_DAY=150, LENGTH=151, + LN=152, LOCALTIME=153, LOCALTIMESTAMP=154, LOCATE=155, LOG=156, LOG10=157, + LOG2=158, LOWER=159, LTRIM=160, MAKEDATE=161, MAKETIME=162, MODULUS=163, + MONTHNAME=164, MULTIPLY=165, NOW=166, NULLIF=167, PERIOD_ADD=168, PERIOD_DIFF=169, + PI=170, POSITION=171, POW=172, POWER=173, RADIANS=174, RAND=175, REPLACE=176, + RINT=177, ROUND=178, RTRIM=179, REVERSE=180, SEC_TO_TIME=181, SIGN=182, + SIGNUM=183, SIN=184, SINH=185, SQRT=186, STR_TO_DATE=187, SUBDATE=188, + SUBTIME=189, SUBTRACT=190, SYSDATE=191, TAN=192, TIME=193, TIMEDIFF=194, + TIME_FORMAT=195, TIME_TO_SEC=196, TIMESTAMP=197, TRUNCATE=198, TO_DAYS=199, + TO_SECONDS=200, UNIX_TIMESTAMP=201, UPPER=202, UTC_DATE=203, UTC_TIME=204, + UTC_TIMESTAMP=205, D=206, T=207, TS=208, LEFT_BRACE=209, RIGHT_BRACE=210, + DENSE_RANK=211, RANK=212, ROW_NUMBER=213, DATE_HISTOGRAM=214, DAY_OF_MONTH=215, + DAY_OF_YEAR=216, DAY_OF_WEEK=217, EXCLUDE=218, EXTENDED_STATS=219, FIELD=220, + FILTER=221, GEO_BOUNDING_BOX=222, GEO_CELL=223, GEO_DISTANCE=224, GEO_DISTANCE_RANGE=225, + GEO_INTERSECTS=226, GEO_POLYGON=227, HISTOGRAM=228, HOUR_OF_DAY=229, INCLUDE=230, + IN_TERMS=231, MATCHPHRASE=232, MATCH_PHRASE=233, MATCHPHRASEQUERY=234, + SIMPLE_QUERY_STRING=235, QUERY_STRING=236, MATCH_PHRASE_PREFIX=237, MATCHQUERY=238, + MATCH_QUERY=239, MINUTE_OF_DAY=240, MINUTE_OF_HOUR=241, MONTH_OF_YEAR=242, + MULTIMATCH=243, MULTI_MATCH=244, MULTIMATCHQUERY=245, NESTED=246, PERCENTILES=247, + PERCENTILE=248, PERCENTILE_APPROX=249, REGEXP_QUERY=250, REVERSE_NESTED=251, + QUERY=252, RANGE=253, SCORE=254, SCOREQUERY=255, SCORE_QUERY=256, SECOND_OF_MINUTE=257, + STATS=258, TERM=259, TERMS=260, TIMESTAMPADD=261, TIMESTAMPDIFF=262, TOPHITS=263, + TYPEOF=264, WEEK_OF_YEAR=265, WEEKOFYEAR=266, WEEKDAY=267, WILDCARDQUERY=268, + WILDCARD_QUERY=269, SUBSTR=270, STRCMP=271, ADDDATE=272, YEARWEEK=273, + ALLOW_LEADING_WILDCARD=274, ANALYZER=275, ANALYZE_WILDCARD=276, AUTO_GENERATE_SYNONYMS_PHRASE_QUERY=277, + BOOST=278, CASE_INSENSITIVE=279, CUTOFF_FREQUENCY=280, DEFAULT_FIELD=281, + DEFAULT_OPERATOR=282, ESCAPE=283, ENABLE_POSITION_INCREMENTS=284, FIELDS=285, + FLAGS=286, FUZZINESS=287, FUZZY_MAX_EXPANSIONS=288, FUZZY_PREFIX_LENGTH=289, + FUZZY_REWRITE=290, FUZZY_TRANSPOSITIONS=291, LENIENT=292, LOW_FREQ_OPERATOR=293, + MAX_DETERMINIZED_STATES=294, MAX_EXPANSIONS=295, MINIMUM_SHOULD_MATCH=296, + OPERATOR=297, PHRASE_SLOP=298, PREFIX_LENGTH=299, QUOTE_ANALYZER=300, + QUOTE_FIELD_SUFFIX=301, REWRITE=302, SLOP=303, TIE_BREAKER=304, TIME_ZONE=305, + TYPE=306, ZERO_TERMS_QUERY=307, HIGHLIGHT=308, HIGHLIGHT_PRE_TAGS=309, + HIGHLIGHT_POST_TAGS=310, MATCH_BOOL_PREFIX=311, STAR=312, SLASH=313, MODULE=314, + PLUS=315, MINUS=316, DIV=317, MOD=318, EQUAL_SYMBOL=319, GREATER_SYMBOL=320, + LESS_SYMBOL=321, EXCLAMATION_SYMBOL=322, BIT_NOT_OP=323, BIT_OR_OP=324, + BIT_AND_OP=325, BIT_XOR_OP=326, DOT=327, LR_BRACKET=328, RR_BRACKET=329, + LT_SQR_PRTHS=330, RT_SQR_PRTHS=331, COMMA=332, SEMI=333, AT_SIGN=334, + ZERO_DECIMAL=335, ONE_DECIMAL=336, TWO_DECIMAL=337, SINGLE_QUOTE_SYMB=338, + DOUBLE_QUOTE_SYMB=339, REVERSE_QUOTE_SYMB=340, COLON_SYMB=341, START_NATIONAL_STRING_LITERAL=342, + STRING_LITERAL=343, DECIMAL_LITERAL=344, HEXADECIMAL_LITERAL=345, REAL_LITERAL=346, + NULL_SPEC_LITERAL=347, BIT_STRING=348, ID=349, DOUBLE_QUOTE_ID=350, BACKTICK_QUOTE_ID=351, + ERROR_RECOGNITION=352; + public static final int + SQLCOMMENT=2, ERRORCHANNEL=3; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "SQLCOMMENT", "ERRORCHANNEL" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "SPACE", "SPEC_SQL_COMMENT", "COMMENT_INPUT", "LINE_COMMENT", "ALL", + "AND", "AS", "ASC", "BOOLEAN", "BETWEEN", "BY", "CASE", "CAST", "CROSS", + "COLUMNS", "DATETIME", "DELETE", "DESC", "DESCRIBE", "DISTINCT", "DOUBLE", + "ELSE", "EXISTS", "FALSE", "FLOAT", "FIRST", "FROM", "GROUP", "HAVING", + "IN", "INNER", "INT", "INTEGER", "IS", "JOIN", "LAST", "LEFT", "LIKE", + "LIMIT", "LONG", "MATCH", "NATURAL", "MISSING_LITERAL", "NOT", "NULL_LITERAL", + "NULLS", "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "REGEXP", + "RIGHT", "SELECT", "SHOW", "STRING", "THEN", "TRUE", "UNION", "USING", + "WHEN", "WHERE", "EXCEPT", "AVG", "COUNT", "MAX", "MIN", "SUM", "VAR_POP", + "VAR_SAMP", "VARIANCE", "STD", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", + "SUBSTRING", "TRIM", "END", "FULL", "OFFSET", "INTERVAL", "MICROSECOND", + "SECOND", "MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "QUARTER", "YEAR", + "SECOND_MICROSECOND", "MINUTE_MICROSECOND", "MINUTE_SECOND", "HOUR_MICROSECOND", + "HOUR_SECOND", "HOUR_MINUTE", "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", + "DAY_HOUR", "YEAR_MONTH", "TABLES", "ABS", "ACOS", "ADD", "ADDTIME", + "ASCII", "ASIN", "ATAN", "ATAN2", "CBRT", "CEIL", "CEILING", "CONCAT", + "CONCAT_WS", "CONV", "CONVERT_TZ", "COS", "COSH", "COT", "CRC32", "CURDATE", + "CURTIME", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATE", + "DATE_ADD", "DATE_FORMAT", "DATE_SUB", "DATEDIFF", "DAYNAME", "DAYOFMONTH", + "DAYOFWEEK", "DAYOFYEAR", "DEGREES", "DIVIDE", "E", "EXP", "EXPM1", "EXTRACT", + "FLOOR", "FROM_DAYS", "FROM_UNIXTIME", "GET_FORMAT", "IF", "IFNULL", + "ISNULL", "LAST_DAY", "LENGTH", "LN", "LOCALTIME", "LOCALTIMESTAMP", + "LOCATE", "LOG", "LOG10", "LOG2", "LOWER", "LTRIM", "MAKEDATE", "MAKETIME", + "MODULUS", "MONTHNAME", "MULTIPLY", "NOW", "NULLIF", "PERIOD_ADD", "PERIOD_DIFF", + "PI", "POSITION", "POW", "POWER", "RADIANS", "RAND", "REPLACE", "RINT", + "ROUND", "RTRIM", "REVERSE", "SEC_TO_TIME", "SIGN", "SIGNUM", "SIN", + "SINH", "SQRT", "STR_TO_DATE", "SUBDATE", "SUBTIME", "SUBTRACT", "SYSDATE", + "TAN", "TIME", "TIMEDIFF", "TIME_FORMAT", "TIME_TO_SEC", "TIMESTAMP", + "TRUNCATE", "TO_DAYS", "TO_SECONDS", "UNIX_TIMESTAMP", "UPPER", "UTC_DATE", + "UTC_TIME", "UTC_TIMESTAMP", "D", "T", "TS", "LEFT_BRACE", "RIGHT_BRACE", + "DENSE_RANK", "RANK", "ROW_NUMBER", "DATE_HISTOGRAM", "DAY_OF_MONTH", + "DAY_OF_YEAR", "DAY_OF_WEEK", "EXCLUDE", "EXTENDED_STATS", "FIELD", "FILTER", + "GEO_BOUNDING_BOX", "GEO_CELL", "GEO_DISTANCE", "GEO_DISTANCE_RANGE", + "GEO_INTERSECTS", "GEO_POLYGON", "HISTOGRAM", "HOUR_OF_DAY", "INCLUDE", + "IN_TERMS", "MATCHPHRASE", "MATCH_PHRASE", "MATCHPHRASEQUERY", "SIMPLE_QUERY_STRING", + "QUERY_STRING", "MATCH_PHRASE_PREFIX", "MATCHQUERY", "MATCH_QUERY", "MINUTE_OF_DAY", + "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "MULTIMATCH", "MULTI_MATCH", "MULTIMATCHQUERY", + "NESTED", "PERCENTILES", "PERCENTILE", "PERCENTILE_APPROX", "REGEXP_QUERY", + "REVERSE_NESTED", "QUERY", "RANGE", "SCORE", "SCOREQUERY", "SCORE_QUERY", + "SECOND_OF_MINUTE", "STATS", "TERM", "TERMS", "TIMESTAMPADD", "TIMESTAMPDIFF", + "TOPHITS", "TYPEOF", "WEEK_OF_YEAR", "WEEKOFYEAR", "WEEKDAY", "WILDCARDQUERY", + "WILDCARD_QUERY", "SUBSTR", "STRCMP", "ADDDATE", "YEARWEEK", "ALLOW_LEADING_WILDCARD", + "ANALYZER", "ANALYZE_WILDCARD", "AUTO_GENERATE_SYNONYMS_PHRASE_QUERY", + "BOOST", "CASE_INSENSITIVE", "CUTOFF_FREQUENCY", "DEFAULT_FIELD", "DEFAULT_OPERATOR", + "ESCAPE", "ENABLE_POSITION_INCREMENTS", "FIELDS", "FLAGS", "FUZZINESS", + "FUZZY_MAX_EXPANSIONS", "FUZZY_PREFIX_LENGTH", "FUZZY_REWRITE", "FUZZY_TRANSPOSITIONS", + "LENIENT", "LOW_FREQ_OPERATOR", "MAX_DETERMINIZED_STATES", "MAX_EXPANSIONS", + "MINIMUM_SHOULD_MATCH", "OPERATOR", "PHRASE_SLOP", "PREFIX_LENGTH", "QUOTE_ANALYZER", + "QUOTE_FIELD_SUFFIX", "REWRITE", "SLOP", "TIE_BREAKER", "TIME_ZONE", + "TYPE", "ZERO_TERMS_QUERY", "HIGHLIGHT", "HIGHLIGHT_PRE_TAGS", "HIGHLIGHT_POST_TAGS", + "MATCH_BOOL_PREFIX", "STAR", "SLASH", "MODULE", "PLUS", "MINUS", "DIV", + "MOD", "EQUAL_SYMBOL", "GREATER_SYMBOL", "LESS_SYMBOL", "EXCLAMATION_SYMBOL", + "BIT_NOT_OP", "BIT_OR_OP", "BIT_AND_OP", "BIT_XOR_OP", "DOT", "LR_BRACKET", + "RR_BRACKET", "LT_SQR_PRTHS", "RT_SQR_PRTHS", "COMMA", "SEMI", "AT_SIGN", + "ZERO_DECIMAL", "ONE_DECIMAL", "TWO_DECIMAL", "SINGLE_QUOTE_SYMB", "DOUBLE_QUOTE_SYMB", + "REVERSE_QUOTE_SYMB", "COLON_SYMB", "START_NATIONAL_STRING_LITERAL", + "STRING_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "REAL_LITERAL", + "NULL_SPEC_LITERAL", "BIT_STRING", "ID", "DOUBLE_QUOTE_ID", "BACKTICK_QUOTE_ID", + "EXPONENT_NUM_PART", "ID_LITERAL", "DQUOTA_STRING", "SQUOTA_STRING", + "BQUOTA_STRING", "HEX_DIGIT", "DEC_DIGIT", "BIT_STRING_L", "ERROR_RECOGNITION" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, "'ALL'", "'AND'", "'AS'", "'ASC'", "'BOOLEAN'", + "'BETWEEN'", "'BY'", "'CASE'", "'CAST'", "'CROSS'", "'COLUMNS'", "'DATETIME'", + "'DELETE'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'DOUBLE'", "'ELSE'", + "'EXISTS'", "'FALSE'", "'FLOAT'", "'FIRST'", "'FROM'", "'GROUP'", "'HAVING'", + "'IN'", "'INNER'", "'INT'", "'INTEGER'", "'IS'", "'JOIN'", "'LAST'", + "'LEFT'", "'LIKE'", "'LIMIT'", "'LONG'", "'MATCH'", "'NATURAL'", "'MISSING'", + "'NOT'", "'NULL'", "'NULLS'", "'ON'", "'OR'", "'ORDER'", "'OUTER'", "'OVER'", + "'PARTITION'", "'REGEXP'", "'RIGHT'", "'SELECT'", "'SHOW'", "'STRING'", + "'THEN'", "'TRUE'", "'UNION'", "'USING'", "'WHEN'", "'WHERE'", "'MINUS'", + "'AVG'", "'COUNT'", "'MAX'", "'MIN'", "'SUM'", "'VAR_POP'", "'VAR_SAMP'", + "'VARIANCE'", "'STD'", "'STDDEV'", "'STDDEV_POP'", "'STDDEV_SAMP'", "'SUBSTRING'", + "'TRIM'", "'END'", "'FULL'", "'OFFSET'", "'INTERVAL'", "'MICROSECOND'", + "'SECOND'", "'MINUTE'", "'HOUR'", "'DAY'", "'WEEK'", "'MONTH'", "'QUARTER'", + "'YEAR'", "'SECOND_MICROSECOND'", "'MINUTE_MICROSECOND'", "'MINUTE_SECOND'", + "'HOUR_MICROSECOND'", "'HOUR_SECOND'", "'HOUR_MINUTE'", "'DAY_MICROSECOND'", + "'DAY_SECOND'", "'DAY_MINUTE'", "'DAY_HOUR'", "'YEAR_MONTH'", "'TABLES'", + "'ABS'", "'ACOS'", "'ADD'", "'ADDTIME'", "'ASCII'", "'ASIN'", "'ATAN'", + "'ATAN2'", "'CBRT'", "'CEIL'", "'CEILING'", "'CONCAT'", "'CONCAT_WS'", + "'CONV'", "'CONVERT_TZ'", "'COS'", "'COSH'", "'COT'", "'CRC32'", "'CURDATE'", + "'CURTIME'", "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", + "'DATE'", "'DATE_ADD'", "'DATE_FORMAT'", "'DATE_SUB'", "'DATEDIFF'", + "'DAYNAME'", "'DAYOFMONTH'", "'DAYOFWEEK'", "'DAYOFYEAR'", "'DEGREES'", + "'DIVIDE'", "'E'", "'EXP'", "'EXPM1'", "'EXTRACT'", "'FLOOR'", "'FROM_DAYS'", + "'FROM_UNIXTIME'", "'GET_FORMAT'", "'IF'", "'IFNULL'", "'ISNULL'", "'LAST_DAY'", + "'LENGTH'", "'LN'", "'LOCALTIME'", "'LOCALTIMESTAMP'", "'LOCATE'", "'LOG'", + "'LOG10'", "'LOG2'", "'LOWER'", "'LTRIM'", "'MAKEDATE'", "'MAKETIME'", + "'MODULUS'", "'MONTHNAME'", "'MULTIPLY'", "'NOW'", "'NULLIF'", "'PERIOD_ADD'", + "'PERIOD_DIFF'", "'PI'", "'POSITION'", "'POW'", "'POWER'", "'RADIANS'", + "'RAND'", "'REPLACE'", "'RINT'", "'ROUND'", "'RTRIM'", "'REVERSE'", "'SEC_TO_TIME'", + "'SIGN'", "'SIGNUM'", "'SIN'", "'SINH'", "'SQRT'", "'STR_TO_DATE'", "'SUBDATE'", + "'SUBTIME'", "'SUBTRACT'", "'SYSDATE'", "'TAN'", "'TIME'", "'TIMEDIFF'", + "'TIME_FORMAT'", "'TIME_TO_SEC'", "'TIMESTAMP'", "'TRUNCATE'", "'TO_DAYS'", + "'TO_SECONDS'", "'UNIX_TIMESTAMP'", "'UPPER'", "'UTC_DATE'", "'UTC_TIME'", + "'UTC_TIMESTAMP'", "'D'", "'T'", "'TS'", "'{'", "'}'", "'DENSE_RANK'", + "'RANK'", "'ROW_NUMBER'", "'DATE_HISTOGRAM'", "'DAY_OF_MONTH'", "'DAY_OF_YEAR'", + "'DAY_OF_WEEK'", "'EXCLUDE'", "'EXTENDED_STATS'", "'FIELD'", "'FILTER'", + "'GEO_BOUNDING_BOX'", "'GEO_CELL'", "'GEO_DISTANCE'", "'GEO_DISTANCE_RANGE'", + "'GEO_INTERSECTS'", "'GEO_POLYGON'", "'HISTOGRAM'", "'HOUR_OF_DAY'", + "'INCLUDE'", "'IN_TERMS'", "'MATCHPHRASE'", "'MATCH_PHRASE'", "'MATCHPHRASEQUERY'", + "'SIMPLE_QUERY_STRING'", "'QUERY_STRING'", "'MATCH_PHRASE_PREFIX'", "'MATCHQUERY'", + "'MATCH_QUERY'", "'MINUTE_OF_DAY'", "'MINUTE_OF_HOUR'", "'MONTH_OF_YEAR'", + "'MULTIMATCH'", "'MULTI_MATCH'", "'MULTIMATCHQUERY'", "'NESTED'", "'PERCENTILES'", + "'PERCENTILE'", "'PERCENTILE_APPROX'", "'REGEXP_QUERY'", "'REVERSE_NESTED'", + "'QUERY'", "'RANGE'", "'SCORE'", "'SCOREQUERY'", "'SCORE_QUERY'", "'SECOND_OF_MINUTE'", + "'STATS'", "'TERM'", "'TERMS'", "'TIMESTAMPADD'", "'TIMESTAMPDIFF'", + "'TOPHITS'", "'TYPEOF'", "'WEEK_OF_YEAR'", "'WEEKOFYEAR'", "'WEEKDAY'", + "'WILDCARDQUERY'", "'WILDCARD_QUERY'", "'SUBSTR'", "'STRCMP'", "'ADDDATE'", + "'YEARWEEK'", "'ALLOW_LEADING_WILDCARD'", "'ANALYZER'", "'ANALYZE_WILDCARD'", + "'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'", "'BOOST'", "'CASE_INSENSITIVE'", + "'CUTOFF_FREQUENCY'", "'DEFAULT_FIELD'", "'DEFAULT_OPERATOR'", "'ESCAPE'", + "'ENABLE_POSITION_INCREMENTS'", "'FIELDS'", "'FLAGS'", "'FUZZINESS'", + "'FUZZY_MAX_EXPANSIONS'", "'FUZZY_PREFIX_LENGTH'", "'FUZZY_REWRITE'", + "'FUZZY_TRANSPOSITIONS'", "'LENIENT'", "'LOW_FREQ_OPERATOR'", "'MAX_DETERMINIZED_STATES'", + "'MAX_EXPANSIONS'", "'MINIMUM_SHOULD_MATCH'", "'OPERATOR'", "'PHRASE_SLOP'", + "'PREFIX_LENGTH'", "'QUOTE_ANALYZER'", "'QUOTE_FIELD_SUFFIX'", "'REWRITE'", + "'SLOP'", "'TIE_BREAKER'", "'TIME_ZONE'", "'TYPE'", "'ZERO_TERMS_QUERY'", + "'HIGHLIGHT'", "'PRE_TAGS'", "'POST_TAGS'", "'MATCH_BOOL_PREFIX'", "'*'", + "'/'", "'%'", "'+'", "'-'", "'DIV'", "'MOD'", "'='", "'>'", "'<'", "'!'", + "'~'", "'|'", "'&'", "'^'", "'.'", "'('", "')'", "'['", "']'", "','", + "';'", "'@'", "'0'", "'1'", "'2'", "'''", "'\"'", "'`'", "':'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "SPACE", "SPEC_SQL_COMMENT", "COMMENT_INPUT", "LINE_COMMENT", "ALL", + "AND", "AS", "ASC", "BOOLEAN", "BETWEEN", "BY", "CASE", "CAST", "CROSS", + "COLUMNS", "DATETIME", "DELETE", "DESC", "DESCRIBE", "DISTINCT", "DOUBLE", + "ELSE", "EXISTS", "FALSE", "FLOAT", "FIRST", "FROM", "GROUP", "HAVING", + "IN", "INNER", "INT", "INTEGER", "IS", "JOIN", "LAST", "LEFT", "LIKE", + "LIMIT", "LONG", "MATCH", "NATURAL", "MISSING_LITERAL", "NOT", "NULL_LITERAL", + "NULLS", "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "REGEXP", + "RIGHT", "SELECT", "SHOW", "STRING", "THEN", "TRUE", "UNION", "USING", + "WHEN", "WHERE", "EXCEPT", "AVG", "COUNT", "MAX", "MIN", "SUM", "VAR_POP", + "VAR_SAMP", "VARIANCE", "STD", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", + "SUBSTRING", "TRIM", "END", "FULL", "OFFSET", "INTERVAL", "MICROSECOND", + "SECOND", "MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "QUARTER", "YEAR", + "SECOND_MICROSECOND", "MINUTE_MICROSECOND", "MINUTE_SECOND", "HOUR_MICROSECOND", + "HOUR_SECOND", "HOUR_MINUTE", "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", + "DAY_HOUR", "YEAR_MONTH", "TABLES", "ABS", "ACOS", "ADD", "ADDTIME", + "ASCII", "ASIN", "ATAN", "ATAN2", "CBRT", "CEIL", "CEILING", "CONCAT", + "CONCAT_WS", "CONV", "CONVERT_TZ", "COS", "COSH", "COT", "CRC32", "CURDATE", + "CURTIME", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATE", + "DATE_ADD", "DATE_FORMAT", "DATE_SUB", "DATEDIFF", "DAYNAME", "DAYOFMONTH", + "DAYOFWEEK", "DAYOFYEAR", "DEGREES", "DIVIDE", "E", "EXP", "EXPM1", "EXTRACT", + "FLOOR", "FROM_DAYS", "FROM_UNIXTIME", "GET_FORMAT", "IF", "IFNULL", + "ISNULL", "LAST_DAY", "LENGTH", "LN", "LOCALTIME", "LOCALTIMESTAMP", + "LOCATE", "LOG", "LOG10", "LOG2", "LOWER", "LTRIM", "MAKEDATE", "MAKETIME", + "MODULUS", "MONTHNAME", "MULTIPLY", "NOW", "NULLIF", "PERIOD_ADD", "PERIOD_DIFF", + "PI", "POSITION", "POW", "POWER", "RADIANS", "RAND", "REPLACE", "RINT", + "ROUND", "RTRIM", "REVERSE", "SEC_TO_TIME", "SIGN", "SIGNUM", "SIN", + "SINH", "SQRT", "STR_TO_DATE", "SUBDATE", "SUBTIME", "SUBTRACT", "SYSDATE", + "TAN", "TIME", "TIMEDIFF", "TIME_FORMAT", "TIME_TO_SEC", "TIMESTAMP", + "TRUNCATE", "TO_DAYS", "TO_SECONDS", "UNIX_TIMESTAMP", "UPPER", "UTC_DATE", + "UTC_TIME", "UTC_TIMESTAMP", "D", "T", "TS", "LEFT_BRACE", "RIGHT_BRACE", + "DENSE_RANK", "RANK", "ROW_NUMBER", "DATE_HISTOGRAM", "DAY_OF_MONTH", + "DAY_OF_YEAR", "DAY_OF_WEEK", "EXCLUDE", "EXTENDED_STATS", "FIELD", "FILTER", + "GEO_BOUNDING_BOX", "GEO_CELL", "GEO_DISTANCE", "GEO_DISTANCE_RANGE", + "GEO_INTERSECTS", "GEO_POLYGON", "HISTOGRAM", "HOUR_OF_DAY", "INCLUDE", + "IN_TERMS", "MATCHPHRASE", "MATCH_PHRASE", "MATCHPHRASEQUERY", "SIMPLE_QUERY_STRING", + "QUERY_STRING", "MATCH_PHRASE_PREFIX", "MATCHQUERY", "MATCH_QUERY", "MINUTE_OF_DAY", + "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "MULTIMATCH", "MULTI_MATCH", "MULTIMATCHQUERY", + "NESTED", "PERCENTILES", "PERCENTILE", "PERCENTILE_APPROX", "REGEXP_QUERY", + "REVERSE_NESTED", "QUERY", "RANGE", "SCORE", "SCOREQUERY", "SCORE_QUERY", + "SECOND_OF_MINUTE", "STATS", "TERM", "TERMS", "TIMESTAMPADD", "TIMESTAMPDIFF", + "TOPHITS", "TYPEOF", "WEEK_OF_YEAR", "WEEKOFYEAR", "WEEKDAY", "WILDCARDQUERY", + "WILDCARD_QUERY", "SUBSTR", "STRCMP", "ADDDATE", "YEARWEEK", "ALLOW_LEADING_WILDCARD", + "ANALYZER", "ANALYZE_WILDCARD", "AUTO_GENERATE_SYNONYMS_PHRASE_QUERY", + "BOOST", "CASE_INSENSITIVE", "CUTOFF_FREQUENCY", "DEFAULT_FIELD", "DEFAULT_OPERATOR", + "ESCAPE", "ENABLE_POSITION_INCREMENTS", "FIELDS", "FLAGS", "FUZZINESS", + "FUZZY_MAX_EXPANSIONS", "FUZZY_PREFIX_LENGTH", "FUZZY_REWRITE", "FUZZY_TRANSPOSITIONS", + "LENIENT", "LOW_FREQ_OPERATOR", "MAX_DETERMINIZED_STATES", "MAX_EXPANSIONS", + "MINIMUM_SHOULD_MATCH", "OPERATOR", "PHRASE_SLOP", "PREFIX_LENGTH", "QUOTE_ANALYZER", + "QUOTE_FIELD_SUFFIX", "REWRITE", "SLOP", "TIE_BREAKER", "TIME_ZONE", + "TYPE", "ZERO_TERMS_QUERY", "HIGHLIGHT", "HIGHLIGHT_PRE_TAGS", "HIGHLIGHT_POST_TAGS", + "MATCH_BOOL_PREFIX", "STAR", "SLASH", "MODULE", "PLUS", "MINUS", "DIV", + "MOD", "EQUAL_SYMBOL", "GREATER_SYMBOL", "LESS_SYMBOL", "EXCLAMATION_SYMBOL", + "BIT_NOT_OP", "BIT_OR_OP", "BIT_AND_OP", "BIT_XOR_OP", "DOT", "LR_BRACKET", + "RR_BRACKET", "LT_SQR_PRTHS", "RT_SQR_PRTHS", "COMMA", "SEMI", "AT_SIGN", + "ZERO_DECIMAL", "ONE_DECIMAL", "TWO_DECIMAL", "SINGLE_QUOTE_SYMB", "DOUBLE_QUOTE_SYMB", + "REVERSE_QUOTE_SYMB", "COLON_SYMB", "START_NATIONAL_STRING_LITERAL", + "STRING_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "REAL_LITERAL", + "NULL_SPEC_LITERAL", "BIT_STRING", "ID", "DOUBLE_QUOTE_ID", "BACKTICK_QUOTE_ID", + "ERROR_RECOGNITION" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public OpenSearchSQLLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "OpenSearchSQLLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + private static final String _serializedATNSegment0 = + "\u0004\u0000\u0160\u0ec0\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+ + "\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002"+ + "\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002"+ + "\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002"+ + "\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e"+ + "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011"+ + "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014"+ + "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017"+ + "\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a"+ + "\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d"+ + "\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!"+ + "\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002"+ + "&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002"+ + "+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u0002"+ + "0\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u0002"+ + "5\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002"+ + ":\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002"+ + "?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002"+ + "D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002"+ + "I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002"+ + "N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002"+ + "S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002"+ + "X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002"+ + "]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002"+ + "b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002"+ + "g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002"+ + "l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002"+ + "q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002"+ + "v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002"+ + "{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f"+ + "\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082"+ + "\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085"+ + "\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088"+ + "\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002\u008b\u0007\u008b"+ + "\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e"+ + "\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091"+ + "\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094"+ + "\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002\u0097\u0007\u0097"+ + "\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002\u009a\u0007\u009a"+ + "\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002\u009d\u0007\u009d"+ + "\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002\u00a0\u0007\u00a0"+ + "\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002\u00a3\u0007\u00a3"+ + "\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002\u00a6\u0007\u00a6"+ + "\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002\u00a9\u0007\u00a9"+ + "\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002\u00ac\u0007\u00ac"+ + "\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af"+ + "\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2"+ + "\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5"+ + "\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8"+ + "\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb"+ + "\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be"+ + "\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002\u00c1\u0007\u00c1"+ + "\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002\u00c4\u0007\u00c4"+ + "\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002\u00c7\u0007\u00c7"+ + "\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002\u00ca\u0007\u00ca"+ + "\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002\u00cd\u0007\u00cd"+ + "\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002\u00d0\u0007\u00d0"+ + "\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002\u00d3\u0007\u00d3"+ + "\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002\u00d6\u0007\u00d6"+ + "\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002\u00d9\u0007\u00d9"+ + "\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002\u00dc\u0007\u00dc"+ + "\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002\u00df\u0007\u00df"+ + "\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002\u00e2\u0007\u00e2"+ + "\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002\u00e5\u0007\u00e5"+ + "\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002\u00e8\u0007\u00e8"+ + "\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002\u00eb\u0007\u00eb"+ + "\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0002\u00ee\u0007\u00ee"+ + "\u0002\u00ef\u0007\u00ef\u0002\u00f0\u0007\u00f0\u0002\u00f1\u0007\u00f1"+ + "\u0002\u00f2\u0007\u00f2\u0002\u00f3\u0007\u00f3\u0002\u00f4\u0007\u00f4"+ + "\u0002\u00f5\u0007\u00f5\u0002\u00f6\u0007\u00f6\u0002\u00f7\u0007\u00f7"+ + "\u0002\u00f8\u0007\u00f8\u0002\u00f9\u0007\u00f9\u0002\u00fa\u0007\u00fa"+ + "\u0002\u00fb\u0007\u00fb\u0002\u00fc\u0007\u00fc\u0002\u00fd\u0007\u00fd"+ + "\u0002\u00fe\u0007\u00fe\u0002\u00ff\u0007\u00ff\u0002\u0100\u0007\u0100"+ + "\u0002\u0101\u0007\u0101\u0002\u0102\u0007\u0102\u0002\u0103\u0007\u0103"+ + "\u0002\u0104\u0007\u0104\u0002\u0105\u0007\u0105\u0002\u0106\u0007\u0106"+ + "\u0002\u0107\u0007\u0107\u0002\u0108\u0007\u0108\u0002\u0109\u0007\u0109"+ + "\u0002\u010a\u0007\u010a\u0002\u010b\u0007\u010b\u0002\u010c\u0007\u010c"+ + "\u0002\u010d\u0007\u010d\u0002\u010e\u0007\u010e\u0002\u010f\u0007\u010f"+ + "\u0002\u0110\u0007\u0110\u0002\u0111\u0007\u0111\u0002\u0112\u0007\u0112"+ + "\u0002\u0113\u0007\u0113\u0002\u0114\u0007\u0114\u0002\u0115\u0007\u0115"+ + "\u0002\u0116\u0007\u0116\u0002\u0117\u0007\u0117\u0002\u0118\u0007\u0118"+ + "\u0002\u0119\u0007\u0119\u0002\u011a\u0007\u011a\u0002\u011b\u0007\u011b"+ + "\u0002\u011c\u0007\u011c\u0002\u011d\u0007\u011d\u0002\u011e\u0007\u011e"+ + "\u0002\u011f\u0007\u011f\u0002\u0120\u0007\u0120\u0002\u0121\u0007\u0121"+ + "\u0002\u0122\u0007\u0122\u0002\u0123\u0007\u0123\u0002\u0124\u0007\u0124"+ + "\u0002\u0125\u0007\u0125\u0002\u0126\u0007\u0126\u0002\u0127\u0007\u0127"+ + "\u0002\u0128\u0007\u0128\u0002\u0129\u0007\u0129\u0002\u012a\u0007\u012a"+ + "\u0002\u012b\u0007\u012b\u0002\u012c\u0007\u012c\u0002\u012d\u0007\u012d"+ + "\u0002\u012e\u0007\u012e\u0002\u012f\u0007\u012f\u0002\u0130\u0007\u0130"+ + "\u0002\u0131\u0007\u0131\u0002\u0132\u0007\u0132\u0002\u0133\u0007\u0133"+ + "\u0002\u0134\u0007\u0134\u0002\u0135\u0007\u0135\u0002\u0136\u0007\u0136"+ + "\u0002\u0137\u0007\u0137\u0002\u0138\u0007\u0138\u0002\u0139\u0007\u0139"+ + "\u0002\u013a\u0007\u013a\u0002\u013b\u0007\u013b\u0002\u013c\u0007\u013c"+ + "\u0002\u013d\u0007\u013d\u0002\u013e\u0007\u013e\u0002\u013f\u0007\u013f"+ + "\u0002\u0140\u0007\u0140\u0002\u0141\u0007\u0141\u0002\u0142\u0007\u0142"+ + "\u0002\u0143\u0007\u0143\u0002\u0144\u0007\u0144\u0002\u0145\u0007\u0145"+ + "\u0002\u0146\u0007\u0146\u0002\u0147\u0007\u0147\u0002\u0148\u0007\u0148"+ + "\u0002\u0149\u0007\u0149\u0002\u014a\u0007\u014a\u0002\u014b\u0007\u014b"+ + "\u0002\u014c\u0007\u014c\u0002\u014d\u0007\u014d\u0002\u014e\u0007\u014e"+ + "\u0002\u014f\u0007\u014f\u0002\u0150\u0007\u0150\u0002\u0151\u0007\u0151"+ + "\u0002\u0152\u0007\u0152\u0002\u0153\u0007\u0153\u0002\u0154\u0007\u0154"+ + "\u0002\u0155\u0007\u0155\u0002\u0156\u0007\u0156\u0002\u0157\u0007\u0157"+ + "\u0002\u0158\u0007\u0158\u0002\u0159\u0007\u0159\u0002\u015a\u0007\u015a"+ + "\u0002\u015b\u0007\u015b\u0002\u015c\u0007\u015c\u0002\u015d\u0007\u015d"+ + "\u0002\u015e\u0007\u015e\u0002\u015f\u0007\u015f\u0002\u0160\u0007\u0160"+ + "\u0002\u0161\u0007\u0161\u0002\u0162\u0007\u0162\u0002\u0163\u0007\u0163"+ + "\u0002\u0164\u0007\u0164\u0002\u0165\u0007\u0165\u0002\u0166\u0007\u0166"+ + "\u0002\u0167\u0007\u0167\u0001\u0000\u0004\u0000\u02d3\b\u0000\u000b\u0000"+ + "\f\u0000\u02d4\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0004\u0001\u02de\b\u0001\u000b\u0001\f\u0001"+ + "\u02df\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u02eb\b\u0002\n"+ + "\u0002\f\u0002\u02ee\t\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003"+ + "\u0003\u02f9\b\u0003\u0001\u0003\u0005\u0003\u02fc\b\u0003\n\u0003\f\u0003"+ + "\u02ff\t\u0003\u0001\u0003\u0003\u0003\u0302\b\u0003\u0001\u0003\u0001"+ + "\u0003\u0003\u0003\u0306\b\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0003\u0003\u030c\b\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u0310"+ + "\b\u0003\u0003\u0003\u0312\b\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ + "\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001"+ + ".\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "2\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ + "5\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ + "A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001"+ + "D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ + "H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ + "N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ + "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+ + "h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001"+ + "j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001"+ + "l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ + "n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001"+ + "o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001"+ + "q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001"+ + "r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+ + "s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001"+ + "u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ + "v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001"+ + "y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001"+ + "z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001"+ + "{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ + "|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001"+ + "}\u0001}\u0001}\u0001}\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082"+ + "\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082"+ + "\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083"+ + "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084"+ + "\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084"+ + "\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085"+ + "\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087"+ + "\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087"+ + "\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088"+ + "\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089"+ + "\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a"+ + "\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c"+ + "\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+ + "\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096"+ + "\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c"+ + "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ + "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ + "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af"+ + "\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ + "\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3"+ + "\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb"+ + "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ + "\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd"+ + "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be"+ + "\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be"+ + "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2"+ + "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2"+ + "\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3"+ + "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3"+ + "\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4"+ + "\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5"+ + "\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5"+ + "\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6"+ + "\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7"+ + "\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7"+ + "\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ + "\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ + "\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ + "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9"+ + "\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ + "\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb"+ + "\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb"+ + "\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ + "\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ + "\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce"+ + "\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d1"+ + "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d6\u0001\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7"+ + "\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7"+ + "\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9"+ + "\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da"+ + "\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ + "\u0001\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de"+ + "\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00e0"+ + "\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4"+ + "\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4"+ + "\u0001\u00e4\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8"+ + "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8"+ + "\u0001\u00e8\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9"+ + "\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9"+ + "\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9"+ + "\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea"+ + "\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea"+ + "\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea"+ + "\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb"+ + "\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb"+ + "\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec"+ + "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec"+ + "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec"+ + "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ed"+ + "\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed"+ + "\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee"+ + "\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee"+ + "\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef"+ + "\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef"+ + "\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef"+ + "\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0"+ + "\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0"+ + "\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1"+ + "\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1"+ + "\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2"+ + "\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2"+ + "\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3"+ + "\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3"+ + "\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4"+ + "\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4"+ + "\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4"+ + "\u0001\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5"+ + "\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001\u00f6"+ + "\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6"+ + "\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7"+ + "\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7"+ + "\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8"+ + "\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8"+ + "\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8"+ + "\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9"+ + "\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9"+ + "\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001\u00fa"+ + "\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa"+ + "\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa"+ + "\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb"+ + "\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc"+ + "\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd"+ + "\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe"+ + "\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00ff"+ + "\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff"+ + "\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u0100"+ + "\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100"+ + "\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100"+ + "\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0101\u0001\u0101"+ + "\u0001\u0101\u0001\u0101\u0001\u0101\u0001\u0101\u0001\u0102\u0001\u0102"+ + "\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0103\u0001\u0103\u0001\u0103"+ + "\u0001\u0103\u0001\u0103\u0001\u0103\u0001\u0104\u0001\u0104\u0001\u0104"+ + "\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0104"+ + "\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0105\u0001\u0105"+ + "\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105"+ + "\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105"+ + "\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106"+ + "\u0001\u0106\u0001\u0106\u0001\u0107\u0001\u0107\u0001\u0107\u0001\u0107"+ + "\u0001\u0107\u0001\u0107\u0001\u0107\u0001\u0108\u0001\u0108\u0001\u0108"+ + "\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108"+ + "\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0109\u0001\u0109"+ + "\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109"+ + "\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u010a\u0001\u010a\u0001\u010a"+ + "\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010b"+ + "\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b"+ + "\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b"+ + "\u0001\u010b\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c"+ + "\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c"+ + "\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010d\u0001\u010d"+ + "\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010e"+ + "\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010e"+ + "\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f"+ + "\u0001\u010f\u0001\u010f\u0001\u0110\u0001\u0110\u0001\u0110\u0001\u0110"+ + "\u0001\u0110\u0001\u0110\u0001\u0110\u0001\u0110\u0001\u0110\u0001\u0111"+ + "\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111"+ + "\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111"+ + "\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111"+ + "\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0112\u0001\u0112"+ + "\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0112"+ + "\u0001\u0112\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113"+ + "\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113"+ + "\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113"+ + "\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ + "\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ + "\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ + "\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ + "\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ + "\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ + "\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0115"+ + "\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116"+ + "\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116"+ + "\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0117"+ + "\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117"+ + "\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117"+ + "\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0118\u0001\u0118"+ + "\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118"+ + "\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118"+ + "\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119"+ + "\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119"+ + "\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u011a"+ + "\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011a"+ + "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b"+ + "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b"+ + "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b"+ + "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b"+ + "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011c\u0001\u011c\u0001\u011c"+ + "\u0001\u011c\u0001\u011c\u0001\u011c\u0001\u011c\u0001\u011d\u0001\u011d"+ + "\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011e\u0001\u011e"+ + "\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011e"+ + "\u0001\u011e\u0001\u011e\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f"+ + "\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f"+ + "\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f"+ + "\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u0120"+ + "\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120"+ + "\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120"+ + "\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120"+ + "\u0001\u0120\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121"+ + "\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121"+ + "\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0122\u0001\u0122\u0001\u0122"+ + "\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122"+ + "\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122"+ + "\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122"+ + "\u0001\u0123\u0001\u0123\u0001\u0123\u0001\u0123\u0001\u0123\u0001\u0123"+ + "\u0001\u0123\u0001\u0123\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124"+ + "\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124"+ + "\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124"+ + "\u0001\u0124\u0001\u0124\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125"+ + "\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125"+ + "\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125"+ + "\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125"+ + "\u0001\u0125\u0001\u0125\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126"+ + "\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126"+ + "\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0127"+ + "\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127"+ + "\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127"+ + "\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127"+ + "\u0001\u0127\u0001\u0127\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0128"+ + "\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0129"+ + "\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129"+ + "\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u012a"+ + "\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a"+ + "\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a"+ + "\u0001\u012a\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b"+ + "\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b"+ + "\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012c\u0001\u012c"+ + "\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c"+ + "\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c"+ + "\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012d"+ + "\u0001\u012d\u0001\u012d\u0001\u012d\u0001\u012d\u0001\u012d\u0001\u012d"+ + "\u0001\u012d\u0001\u012e\u0001\u012e\u0001\u012e\u0001\u012e\u0001\u012e"+ + "\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f"+ + "\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f"+ + "\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0130"+ + "\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0131\u0001\u0131"+ + "\u0001\u0131\u0001\u0131\u0001\u0131\u0001\u0132\u0001\u0132\u0001\u0132"+ + "\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132"+ + "\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132"+ + "\u0001\u0132\u0001\u0132\u0001\u0133\u0001\u0133\u0001\u0133\u0001\u0133"+ + "\u0001\u0133\u0001\u0133\u0001\u0133\u0001\u0133\u0001\u0133\u0001\u0133"+ + "\u0001\u0134\u0001\u0134\u0001\u0134\u0001\u0134\u0001\u0134\u0001\u0134"+ + "\u0001\u0134\u0001\u0134\u0001\u0134\u0001\u0135\u0001\u0135\u0001\u0135"+ + "\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0135"+ + "\u0001\u0135\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136"+ + "\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136"+ + "\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136"+ + "\u0001\u0136\u0001\u0137\u0001\u0137\u0001\u0138\u0001\u0138\u0001\u0139"+ + "\u0001\u0139\u0001\u013a\u0001\u013a\u0001\u013b\u0001\u013b\u0001\u013c"+ + "\u0001\u013c\u0001\u013c\u0001\u013c\u0001\u013d\u0001\u013d\u0001\u013d"+ + "\u0001\u013d\u0001\u013e\u0001\u013e\u0001\u013f\u0001\u013f\u0001\u0140"+ + "\u0001\u0140\u0001\u0141\u0001\u0141\u0001\u0142\u0001\u0142\u0001\u0143"+ + "\u0001\u0143\u0001\u0144\u0001\u0144\u0001\u0145\u0001\u0145\u0001\u0146"+ + "\u0001\u0146\u0001\u0147\u0001\u0147\u0001\u0148\u0001\u0148\u0001\u0149"+ + "\u0001\u0149\u0001\u014a\u0001\u014a\u0001\u014b\u0001\u014b\u0001\u014c"+ + "\u0001\u014c\u0001\u014d\u0001\u014d\u0001\u014e\u0001\u014e\u0001\u014f"+ + "\u0001\u014f\u0001\u0150\u0001\u0150\u0001\u0151\u0001\u0151\u0001\u0152"+ + "\u0001\u0152\u0001\u0153\u0001\u0153\u0001\u0154\u0001\u0154\u0001\u0155"+ + "\u0001\u0155\u0001\u0155\u0001\u0156\u0001\u0156\u0001\u0157\u0004\u0157"+ + "\u0e24\b\u0157\u000b\u0157\f\u0157\u0e25\u0001\u0158\u0001\u0158\u0001"+ + "\u0158\u0001\u0158\u0001\u0158\u0004\u0158\u0e2d\b\u0158\u000b\u0158\f"+ + "\u0158\u0e2e\u0001\u0158\u0001\u0158\u0001\u0158\u0001\u0158\u0001\u0158"+ + "\u0001\u0158\u0004\u0158\u0e37\b\u0158\u000b\u0158\f\u0158\u0e38\u0003"+ + "\u0158\u0e3b\b\u0158\u0001\u0159\u0004\u0159\u0e3e\b\u0159\u000b\u0159"+ + "\f\u0159\u0e3f\u0003\u0159\u0e42\b\u0159\u0001\u0159\u0001\u0159\u0004"+ + "\u0159\u0e46\b\u0159\u000b\u0159\f\u0159\u0e47\u0001\u0159\u0004\u0159"+ + "\u0e4b\b\u0159\u000b\u0159\f\u0159\u0e4c\u0001\u0159\u0001\u0159\u0001"+ + "\u0159\u0001\u0159\u0004\u0159\u0e53\b\u0159\u000b\u0159\f\u0159\u0e54"+ + "\u0003\u0159\u0e57\b\u0159\u0001\u0159\u0001\u0159\u0004\u0159\u0e5b\b"+ + "\u0159\u000b\u0159\f\u0159\u0e5c\u0001\u0159\u0001\u0159\u0001\u0159\u0004"+ + "\u0159\u0e62\b\u0159\u000b\u0159\f\u0159\u0e63\u0001\u0159\u0001\u0159"+ + "\u0003\u0159\u0e68\b\u0159\u0001\u015a\u0001\u015a\u0001\u015a\u0001\u015b"+ + "\u0001\u015b\u0001\u015c\u0001\u015c\u0001\u015d\u0001\u015d\u0001\u015e"+ + "\u0001\u015e\u0001\u015f\u0001\u015f\u0003\u015f\u0e77\b\u015f\u0001\u015f"+ + "\u0004\u015f\u0e7a\b\u015f\u000b\u015f\f\u015f\u0e7b\u0001\u0160\u0004"+ + "\u0160\u0e7f\b\u0160\u000b\u0160\f\u0160\u0e80\u0001\u0160\u0005\u0160"+ + "\u0e84\b\u0160\n\u0160\f\u0160\u0e87\t\u0160\u0001\u0161\u0001\u0161\u0001"+ + "\u0161\u0001\u0161\u0001\u0161\u0001\u0161\u0005\u0161\u0e8f\b\u0161\n"+ + "\u0161\f\u0161\u0e92\t\u0161\u0001\u0161\u0001\u0161\u0001\u0162\u0001"+ + "\u0162\u0001\u0162\u0001\u0162\u0001\u0162\u0001\u0162\u0005\u0162\u0e9c"+ + "\b\u0162\n\u0162\f\u0162\u0e9f\t\u0162\u0001\u0162\u0001\u0162\u0001\u0163"+ + "\u0001\u0163\u0001\u0163\u0001\u0163\u0001\u0163\u0001\u0163\u0005\u0163"+ + "\u0ea9\b\u0163\n\u0163\f\u0163\u0eac\t\u0163\u0001\u0163\u0001\u0163\u0001"+ + "\u0164\u0001\u0164\u0001\u0165\u0001\u0165\u0001\u0166\u0001\u0166\u0001"+ + "\u0166\u0004\u0166\u0eb7\b\u0166\u000b\u0166\f\u0166\u0eb8\u0001\u0166"+ + "\u0001\u0166\u0001\u0167\u0001\u0167\u0001\u0167\u0001\u0167\u0002\u02df"+ + "\u02ec\u0000\u0168\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005"+ + "\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019"+ + "\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015"+ + "+\u0016-\u0017/\u00181\u00193\u001a5\u001b7\u001c9\u001d;\u001e=\u001f"+ + "? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f"+ + "@\u0081A\u0083B\u0085C\u0087D\u0089E\u008bF\u008dG\u008fH\u0091I\u0093"+ + "J\u0095K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1Q\u00a3R\u00a5S\u00a7"+ + "T\u00a9U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb"+ + "^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7d\u00c9e\u00cbf\u00cdg\u00cf"+ + "h\u00d1i\u00d3j\u00d5k\u00d7l\u00d9m\u00dbn\u00ddo\u00dfp\u00e1q\u00e3"+ + "r\u00e5s\u00e7t\u00e9u\u00ebv\u00edw\u00efx\u00f1y\u00f3z\u00f5{\u00f7"+ + "|\u00f9}\u00fb~\u00fd\u007f\u00ff\u0080\u0101\u0081\u0103\u0082\u0105"+ + "\u0083\u0107\u0084\u0109\u0085\u010b\u0086\u010d\u0087\u010f\u0088\u0111"+ + "\u0089\u0113\u008a\u0115\u008b\u0117\u008c\u0119\u008d\u011b\u008e\u011d"+ + "\u008f\u011f\u0090\u0121\u0091\u0123\u0092\u0125\u0093\u0127\u0094\u0129"+ + "\u0095\u012b\u0096\u012d\u0097\u012f\u0098\u0131\u0099\u0133\u009a\u0135"+ + "\u009b\u0137\u009c\u0139\u009d\u013b\u009e\u013d\u009f\u013f\u00a0\u0141"+ + "\u00a1\u0143\u00a2\u0145\u00a3\u0147\u00a4\u0149\u00a5\u014b\u00a6\u014d"+ + "\u00a7\u014f\u00a8\u0151\u00a9\u0153\u00aa\u0155\u00ab\u0157\u00ac\u0159"+ + "\u00ad\u015b\u00ae\u015d\u00af\u015f\u00b0\u0161\u00b1\u0163\u00b2\u0165"+ + "\u00b3\u0167\u00b4\u0169\u00b5\u016b\u00b6\u016d\u00b7\u016f\u00b8\u0171"+ + "\u00b9\u0173\u00ba\u0175\u00bb\u0177\u00bc\u0179\u00bd\u017b\u00be\u017d"+ + "\u00bf\u017f\u00c0\u0181\u00c1\u0183\u00c2\u0185\u00c3\u0187\u00c4\u0189"+ + "\u00c5\u018b\u00c6\u018d\u00c7\u018f\u00c8\u0191\u00c9\u0193\u00ca\u0195"+ + "\u00cb\u0197\u00cc\u0199\u00cd\u019b\u00ce\u019d\u00cf\u019f\u00d0\u01a1"+ + "\u00d1\u01a3\u00d2\u01a5\u00d3\u01a7\u00d4\u01a9\u00d5\u01ab\u00d6\u01ad"+ + "\u00d7\u01af\u00d8\u01b1\u00d9\u01b3\u00da\u01b5\u00db\u01b7\u00dc\u01b9"+ + "\u00dd\u01bb\u00de\u01bd\u00df\u01bf\u00e0\u01c1\u00e1\u01c3\u00e2\u01c5"+ + "\u00e3\u01c7\u00e4\u01c9\u00e5\u01cb\u00e6\u01cd\u00e7\u01cf\u00e8\u01d1"+ + "\u00e9\u01d3\u00ea\u01d5\u00eb\u01d7\u00ec\u01d9\u00ed\u01db\u00ee\u01dd"+ + "\u00ef\u01df\u00f0\u01e1\u00f1\u01e3\u00f2\u01e5\u00f3\u01e7\u00f4\u01e9"+ + "\u00f5\u01eb\u00f6\u01ed\u00f7\u01ef\u00f8\u01f1\u00f9\u01f3\u00fa\u01f5"+ + "\u00fb\u01f7\u00fc\u01f9\u00fd\u01fb\u00fe\u01fd\u00ff\u01ff\u0100\u0201"+ + "\u0101\u0203\u0102\u0205\u0103\u0207\u0104\u0209\u0105\u020b\u0106\u020d"+ + "\u0107\u020f\u0108\u0211\u0109\u0213\u010a\u0215\u010b\u0217\u010c\u0219"+ + "\u010d\u021b\u010e\u021d\u010f\u021f\u0110\u0221\u0111\u0223\u0112\u0225"+ + "\u0113\u0227\u0114\u0229\u0115\u022b\u0116\u022d\u0117\u022f\u0118\u0231"+ + "\u0119\u0233\u011a\u0235\u011b\u0237\u011c\u0239\u011d\u023b\u011e\u023d"+ + "\u011f\u023f\u0120\u0241\u0121\u0243\u0122\u0245\u0123\u0247\u0124\u0249"+ + "\u0125\u024b\u0126\u024d\u0127\u024f\u0128\u0251\u0129\u0253\u012a\u0255"+ + "\u012b\u0257\u012c\u0259\u012d\u025b\u012e\u025d\u012f\u025f\u0130\u0261"+ + "\u0131\u0263\u0132\u0265\u0133\u0267\u0134\u0269\u0135\u026b\u0136\u026d"+ + "\u0137\u026f\u0138\u0271\u0139\u0273\u013a\u0275\u013b\u0277\u013c\u0279"+ + "\u013d\u027b\u013e\u027d\u013f\u027f\u0140\u0281\u0141\u0283\u0142\u0285"+ + "\u0143\u0287\u0144\u0289\u0145\u028b\u0146\u028d\u0147\u028f\u0148\u0291"+ + "\u0149\u0293\u014a\u0295\u014b\u0297\u014c\u0299\u014d\u029b\u014e\u029d"+ + "\u014f\u029f\u0150\u02a1\u0151\u02a3\u0152\u02a5\u0153\u02a7\u0154\u02a9"+ + "\u0155\u02ab\u0156\u02ad\u0157\u02af\u0158\u02b1\u0159\u02b3\u015a\u02b5"+ + "\u015b\u02b7\u015c\u02b9\u015d\u02bb\u015e\u02bd\u015f\u02bf\u0000\u02c1"+ + "\u0000\u02c3\u0000\u02c5\u0000\u02c7\u0000\u02c9\u0000\u02cb\u0000\u02cd"+ + "\u0000\u02cf\u0160\u0001\u0000%\u0003\u0000\t\n\r\r \u0002\u0000\n\n"+ + "\r\r\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000NNnn\u0002\u0000DDdd\u0002"+ + "\u0000SSss\u0002\u0000CCcc\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000"+ + "EEee\u0002\u0000TTtt\u0002\u0000WWww\u0002\u0000YYyy\u0002\u0000RRrr\u0002"+ + "\u0000UUuu\u0002\u0000MMmm\u0002\u0000IIii\u0002\u0000XXxx\u0002\u0000"+ + "FFff\u0002\u0000GGgg\u0002\u0000PPpp\u0002\u0000HHhh\u0002\u0000VVvv\u0002"+ + "\u0000JJjj\u0002\u0000KKkk\u0002\u0000QQqq\u0002\u0000ZZzz\u0002\u0000"+ + "++--\u0004\u0000**@Z__az\u0006\u0000**--09AZ__az\u0002\u0000\"\"\\\\\u0002"+ + "\u0000\'\'\\\\\u0002\u0000\\\\``\u0003\u000009AFaf\u0001\u000009\u0001"+ + "\u000001\u0ede\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000"+ + "\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000"+ + "\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000"+ + "\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000"+ + "\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000"+ + "\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000"+ + "\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000"+ + "\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000"+ + "\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%"+ + "\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001"+ + "\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000"+ + "\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u0000"+ + "3\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001"+ + "\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000"+ + "\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000"+ + "A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001"+ + "\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001\u0000\u0000"+ + "\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M\u0001\u0000\u0000\u0000\u0000"+ + "O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000\u0000\u0000\u0000S\u0001"+ + "\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000\u0000W\u0001\u0000\u0000"+ + "\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000[\u0001\u0000\u0000\u0000\u0000"+ + "]\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000a\u0001"+ + "\u0000\u0000\u0000\u0000c\u0001\u0000\u0000\u0000\u0000e\u0001\u0000\u0000"+ + "\u0000\u0000g\u0001\u0000\u0000\u0000\u0000i\u0001\u0000\u0000\u0000\u0000"+ + "k\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000\u0000\u0000o\u0001"+ + "\u0000\u0000\u0000\u0000q\u0001\u0000\u0000\u0000\u0000s\u0001\u0000\u0000"+ + "\u0000\u0000u\u0001\u0000\u0000\u0000\u0000w\u0001\u0000\u0000\u0000\u0000"+ + "y\u0001\u0000\u0000\u0000\u0000{\u0001\u0000\u0000\u0000\u0000}\u0001"+ + "\u0000\u0000\u0000\u0000\u007f\u0001\u0000\u0000\u0000\u0000\u0081\u0001"+ + "\u0000\u0000\u0000\u0000\u0083\u0001\u0000\u0000\u0000\u0000\u0085\u0001"+ + "\u0000\u0000\u0000\u0000\u0087\u0001\u0000\u0000\u0000\u0000\u0089\u0001"+ + "\u0000\u0000\u0000\u0000\u008b\u0001\u0000\u0000\u0000\u0000\u008d\u0001"+ + "\u0000\u0000\u0000\u0000\u008f\u0001\u0000\u0000\u0000\u0000\u0091\u0001"+ + "\u0000\u0000\u0000\u0000\u0093\u0001\u0000\u0000\u0000\u0000\u0095\u0001"+ + "\u0000\u0000\u0000\u0000\u0097\u0001\u0000\u0000\u0000\u0000\u0099\u0001"+ + "\u0000\u0000\u0000\u0000\u009b\u0001\u0000\u0000\u0000\u0000\u009d\u0001"+ + "\u0000\u0000\u0000\u0000\u009f\u0001\u0000\u0000\u0000\u0000\u00a1\u0001"+ + "\u0000\u0000\u0000\u0000\u00a3\u0001\u0000\u0000\u0000\u0000\u00a5\u0001"+ + "\u0000\u0000\u0000\u0000\u00a7\u0001\u0000\u0000\u0000\u0000\u00a9\u0001"+ + "\u0000\u0000\u0000\u0000\u00ab\u0001\u0000\u0000\u0000\u0000\u00ad\u0001"+ + "\u0000\u0000\u0000\u0000\u00af\u0001\u0000\u0000\u0000\u0000\u00b1\u0001"+ + "\u0000\u0000\u0000\u0000\u00b3\u0001\u0000\u0000\u0000\u0000\u00b5\u0001"+ + "\u0000\u0000\u0000\u0000\u00b7\u0001\u0000\u0000\u0000\u0000\u00b9\u0001"+ + "\u0000\u0000\u0000\u0000\u00bb\u0001\u0000\u0000\u0000\u0000\u00bd\u0001"+ + "\u0000\u0000\u0000\u0000\u00bf\u0001\u0000\u0000\u0000\u0000\u00c1\u0001"+ + "\u0000\u0000\u0000\u0000\u00c3\u0001\u0000\u0000\u0000\u0000\u00c5\u0001"+ + "\u0000\u0000\u0000\u0000\u00c7\u0001\u0000\u0000\u0000\u0000\u00c9\u0001"+ + "\u0000\u0000\u0000\u0000\u00cb\u0001\u0000\u0000\u0000\u0000\u00cd\u0001"+ + "\u0000\u0000\u0000\u0000\u00cf\u0001\u0000\u0000\u0000\u0000\u00d1\u0001"+ + "\u0000\u0000\u0000\u0000\u00d3\u0001\u0000\u0000\u0000\u0000\u00d5\u0001"+ + "\u0000\u0000\u0000\u0000\u00d7\u0001\u0000\u0000\u0000\u0000\u00d9\u0001"+ + "\u0000\u0000\u0000\u0000\u00db\u0001\u0000\u0000\u0000\u0000\u00dd\u0001"+ + "\u0000\u0000\u0000\u0000\u00df\u0001\u0000\u0000\u0000\u0000\u00e1\u0001"+ + "\u0000\u0000\u0000\u0000\u00e3\u0001\u0000\u0000\u0000\u0000\u00e5\u0001"+ + "\u0000\u0000\u0000\u0000\u00e7\u0001\u0000\u0000\u0000\u0000\u00e9\u0001"+ + "\u0000\u0000\u0000\u0000\u00eb\u0001\u0000\u0000\u0000\u0000\u00ed\u0001"+ + "\u0000\u0000\u0000\u0000\u00ef\u0001\u0000\u0000\u0000\u0000\u00f1\u0001"+ + "\u0000\u0000\u0000\u0000\u00f3\u0001\u0000\u0000\u0000\u0000\u00f5\u0001"+ + "\u0000\u0000\u0000\u0000\u00f7\u0001\u0000\u0000\u0000\u0000\u00f9\u0001"+ + "\u0000\u0000\u0000\u0000\u00fb\u0001\u0000\u0000\u0000\u0000\u00fd\u0001"+ + "\u0000\u0000\u0000\u0000\u00ff\u0001\u0000\u0000\u0000\u0000\u0101\u0001"+ + "\u0000\u0000\u0000\u0000\u0103\u0001\u0000\u0000\u0000\u0000\u0105\u0001"+ + "\u0000\u0000\u0000\u0000\u0107\u0001\u0000\u0000\u0000\u0000\u0109\u0001"+ + "\u0000\u0000\u0000\u0000\u010b\u0001\u0000\u0000\u0000\u0000\u010d\u0001"+ + "\u0000\u0000\u0000\u0000\u010f\u0001\u0000\u0000\u0000\u0000\u0111\u0001"+ + "\u0000\u0000\u0000\u0000\u0113\u0001\u0000\u0000\u0000\u0000\u0115\u0001"+ + "\u0000\u0000\u0000\u0000\u0117\u0001\u0000\u0000\u0000\u0000\u0119\u0001"+ + "\u0000\u0000\u0000\u0000\u011b\u0001\u0000\u0000\u0000\u0000\u011d\u0001"+ + "\u0000\u0000\u0000\u0000\u011f\u0001\u0000\u0000\u0000\u0000\u0121\u0001"+ + "\u0000\u0000\u0000\u0000\u0123\u0001\u0000\u0000\u0000\u0000\u0125\u0001"+ + "\u0000\u0000\u0000\u0000\u0127\u0001\u0000\u0000\u0000\u0000\u0129\u0001"+ + "\u0000\u0000\u0000\u0000\u012b\u0001\u0000\u0000\u0000\u0000\u012d\u0001"+ + "\u0000\u0000\u0000\u0000\u012f\u0001\u0000\u0000\u0000\u0000\u0131\u0001"+ + "\u0000\u0000\u0000\u0000\u0133\u0001\u0000\u0000\u0000\u0000\u0135\u0001"+ + "\u0000\u0000\u0000\u0000\u0137\u0001\u0000\u0000\u0000\u0000\u0139\u0001"+ + "\u0000\u0000\u0000\u0000\u013b\u0001\u0000\u0000\u0000\u0000\u013d\u0001"+ + "\u0000\u0000\u0000\u0000\u013f\u0001\u0000\u0000\u0000\u0000\u0141\u0001"+ + "\u0000\u0000\u0000\u0000\u0143\u0001\u0000\u0000\u0000\u0000\u0145\u0001"+ + "\u0000\u0000\u0000\u0000\u0147\u0001\u0000\u0000\u0000\u0000\u0149\u0001"+ + "\u0000\u0000\u0000\u0000\u014b\u0001\u0000\u0000\u0000\u0000\u014d\u0001"+ + "\u0000\u0000\u0000\u0000\u014f\u0001\u0000\u0000\u0000\u0000\u0151\u0001"+ + "\u0000\u0000\u0000\u0000\u0153\u0001\u0000\u0000\u0000\u0000\u0155\u0001"+ + "\u0000\u0000\u0000\u0000\u0157\u0001\u0000\u0000\u0000\u0000\u0159\u0001"+ + "\u0000\u0000\u0000\u0000\u015b\u0001\u0000\u0000\u0000\u0000\u015d\u0001"+ + "\u0000\u0000\u0000\u0000\u015f\u0001\u0000\u0000\u0000\u0000\u0161\u0001"+ + "\u0000\u0000\u0000\u0000\u0163\u0001\u0000\u0000\u0000\u0000\u0165\u0001"+ + "\u0000\u0000\u0000\u0000\u0167\u0001\u0000\u0000\u0000\u0000\u0169\u0001"+ + "\u0000\u0000\u0000\u0000\u016b\u0001\u0000\u0000\u0000\u0000\u016d\u0001"+ + "\u0000\u0000\u0000\u0000\u016f\u0001\u0000\u0000\u0000\u0000\u0171\u0001"+ + "\u0000\u0000\u0000\u0000\u0173\u0001\u0000\u0000\u0000\u0000\u0175\u0001"+ + "\u0000\u0000\u0000\u0000\u0177\u0001\u0000\u0000\u0000\u0000\u0179\u0001"+ + "\u0000\u0000\u0000\u0000\u017b\u0001\u0000\u0000\u0000\u0000\u017d\u0001"+ + "\u0000\u0000\u0000\u0000\u017f\u0001\u0000\u0000\u0000\u0000\u0181\u0001"+ + "\u0000\u0000\u0000\u0000\u0183\u0001\u0000\u0000\u0000\u0000\u0185\u0001"+ + "\u0000\u0000\u0000\u0000\u0187\u0001\u0000\u0000\u0000\u0000\u0189\u0001"+ + "\u0000\u0000\u0000\u0000\u018b\u0001\u0000\u0000\u0000\u0000\u018d\u0001"+ + "\u0000\u0000\u0000\u0000\u018f\u0001\u0000\u0000\u0000\u0000\u0191\u0001"+ + "\u0000\u0000\u0000\u0000\u0193\u0001\u0000\u0000\u0000\u0000\u0195\u0001"+ + "\u0000\u0000\u0000\u0000\u0197\u0001\u0000\u0000\u0000\u0000\u0199\u0001"+ + "\u0000\u0000\u0000\u0000\u019b\u0001\u0000\u0000\u0000\u0000\u019d\u0001"+ + "\u0000\u0000\u0000\u0000\u019f\u0001\u0000\u0000\u0000\u0000\u01a1\u0001"+ + "\u0000\u0000\u0000\u0000\u01a3\u0001\u0000\u0000\u0000\u0000\u01a5\u0001"+ + "\u0000\u0000\u0000\u0000\u01a7\u0001\u0000\u0000\u0000\u0000\u01a9\u0001"+ + "\u0000\u0000\u0000\u0000\u01ab\u0001\u0000\u0000\u0000\u0000\u01ad\u0001"+ + "\u0000\u0000\u0000\u0000\u01af\u0001\u0000\u0000\u0000\u0000\u01b1\u0001"+ + "\u0000\u0000\u0000\u0000\u01b3\u0001\u0000\u0000\u0000\u0000\u01b5\u0001"+ + "\u0000\u0000\u0000\u0000\u01b7\u0001\u0000\u0000\u0000\u0000\u01b9\u0001"+ + "\u0000\u0000\u0000\u0000\u01bb\u0001\u0000\u0000\u0000\u0000\u01bd\u0001"+ + "\u0000\u0000\u0000\u0000\u01bf\u0001\u0000\u0000\u0000\u0000\u01c1\u0001"+ + "\u0000\u0000\u0000\u0000\u01c3\u0001\u0000\u0000\u0000\u0000\u01c5\u0001"+ + "\u0000\u0000\u0000\u0000\u01c7\u0001\u0000\u0000\u0000\u0000\u01c9\u0001"+ + "\u0000\u0000\u0000\u0000\u01cb\u0001\u0000\u0000\u0000\u0000\u01cd\u0001"+ + "\u0000\u0000\u0000\u0000\u01cf\u0001\u0000\u0000\u0000\u0000\u01d1\u0001"+ + "\u0000\u0000\u0000\u0000\u01d3\u0001\u0000\u0000\u0000\u0000\u01d5\u0001"+ + "\u0000\u0000\u0000\u0000\u01d7\u0001\u0000\u0000\u0000\u0000\u01d9\u0001"+ + "\u0000\u0000\u0000\u0000\u01db\u0001\u0000\u0000\u0000\u0000\u01dd\u0001"+ + "\u0000\u0000\u0000\u0000\u01df\u0001\u0000\u0000\u0000\u0000\u01e1\u0001"+ + "\u0000\u0000\u0000\u0000\u01e3\u0001\u0000\u0000\u0000\u0000\u01e5\u0001"+ + "\u0000\u0000\u0000\u0000\u01e7\u0001\u0000\u0000\u0000\u0000\u01e9\u0001"+ + "\u0000\u0000\u0000\u0000\u01eb\u0001\u0000\u0000\u0000\u0000\u01ed\u0001"+ + "\u0000\u0000\u0000\u0000\u01ef\u0001\u0000\u0000\u0000\u0000\u01f1\u0001"+ + "\u0000\u0000\u0000\u0000\u01f3\u0001\u0000\u0000\u0000\u0000\u01f5\u0001"+ + "\u0000\u0000\u0000\u0000\u01f7\u0001\u0000\u0000\u0000\u0000\u01f9\u0001"+ + "\u0000\u0000\u0000\u0000\u01fb\u0001\u0000\u0000\u0000\u0000\u01fd\u0001"+ + "\u0000\u0000\u0000\u0000\u01ff\u0001\u0000\u0000\u0000\u0000\u0201\u0001"+ + "\u0000\u0000\u0000\u0000\u0203\u0001\u0000\u0000\u0000\u0000\u0205\u0001"+ + "\u0000\u0000\u0000\u0000\u0207\u0001\u0000\u0000\u0000\u0000\u0209\u0001"+ + "\u0000\u0000\u0000\u0000\u020b\u0001\u0000\u0000\u0000\u0000\u020d\u0001"+ + "\u0000\u0000\u0000\u0000\u020f\u0001\u0000\u0000\u0000\u0000\u0211\u0001"+ + "\u0000\u0000\u0000\u0000\u0213\u0001\u0000\u0000\u0000\u0000\u0215\u0001"+ + "\u0000\u0000\u0000\u0000\u0217\u0001\u0000\u0000\u0000\u0000\u0219\u0001"+ + "\u0000\u0000\u0000\u0000\u021b\u0001\u0000\u0000\u0000\u0000\u021d\u0001"+ + "\u0000\u0000\u0000\u0000\u021f\u0001\u0000\u0000\u0000\u0000\u0221\u0001"+ + "\u0000\u0000\u0000\u0000\u0223\u0001\u0000\u0000\u0000\u0000\u0225\u0001"+ + "\u0000\u0000\u0000\u0000\u0227\u0001\u0000\u0000\u0000\u0000\u0229\u0001"+ + "\u0000\u0000\u0000\u0000\u022b\u0001\u0000\u0000\u0000\u0000\u022d\u0001"+ + "\u0000\u0000\u0000\u0000\u022f\u0001\u0000\u0000\u0000\u0000\u0231\u0001"+ + "\u0000\u0000\u0000\u0000\u0233\u0001\u0000\u0000\u0000\u0000\u0235\u0001"+ + "\u0000\u0000\u0000\u0000\u0237\u0001\u0000\u0000\u0000\u0000\u0239\u0001"+ + "\u0000\u0000\u0000\u0000\u023b\u0001\u0000\u0000\u0000\u0000\u023d\u0001"+ + "\u0000\u0000\u0000\u0000\u023f\u0001\u0000\u0000\u0000\u0000\u0241\u0001"+ + "\u0000\u0000\u0000\u0000\u0243\u0001\u0000\u0000\u0000\u0000\u0245\u0001"+ + "\u0000\u0000\u0000\u0000\u0247\u0001\u0000\u0000\u0000\u0000\u0249\u0001"+ + "\u0000\u0000\u0000\u0000\u024b\u0001\u0000\u0000\u0000\u0000\u024d\u0001"+ + "\u0000\u0000\u0000\u0000\u024f\u0001\u0000\u0000\u0000\u0000\u0251\u0001"+ + "\u0000\u0000\u0000\u0000\u0253\u0001\u0000\u0000\u0000\u0000\u0255\u0001"+ + "\u0000\u0000\u0000\u0000\u0257\u0001\u0000\u0000\u0000\u0000\u0259\u0001"+ + "\u0000\u0000\u0000\u0000\u025b\u0001\u0000\u0000\u0000\u0000\u025d\u0001"+ + "\u0000\u0000\u0000\u0000\u025f\u0001\u0000\u0000\u0000\u0000\u0261\u0001"+ + "\u0000\u0000\u0000\u0000\u0263\u0001\u0000\u0000\u0000\u0000\u0265\u0001"+ + "\u0000\u0000\u0000\u0000\u0267\u0001\u0000\u0000\u0000\u0000\u0269\u0001"+ + "\u0000\u0000\u0000\u0000\u026b\u0001\u0000\u0000\u0000\u0000\u026d\u0001"+ + "\u0000\u0000\u0000\u0000\u026f\u0001\u0000\u0000\u0000\u0000\u0271\u0001"+ + "\u0000\u0000\u0000\u0000\u0273\u0001\u0000\u0000\u0000\u0000\u0275\u0001"+ + "\u0000\u0000\u0000\u0000\u0277\u0001\u0000\u0000\u0000\u0000\u0279\u0001"+ + "\u0000\u0000\u0000\u0000\u027b\u0001\u0000\u0000\u0000\u0000\u027d\u0001"+ + "\u0000\u0000\u0000\u0000\u027f\u0001\u0000\u0000\u0000\u0000\u0281\u0001"+ + "\u0000\u0000\u0000\u0000\u0283\u0001\u0000\u0000\u0000\u0000\u0285\u0001"+ + "\u0000\u0000\u0000\u0000\u0287\u0001\u0000\u0000\u0000\u0000\u0289\u0001"+ + "\u0000\u0000\u0000\u0000\u028b\u0001\u0000\u0000\u0000\u0000\u028d\u0001"+ + "\u0000\u0000\u0000\u0000\u028f\u0001\u0000\u0000\u0000\u0000\u0291\u0001"+ + "\u0000\u0000\u0000\u0000\u0293\u0001\u0000\u0000\u0000\u0000\u0295\u0001"+ + "\u0000\u0000\u0000\u0000\u0297\u0001\u0000\u0000\u0000\u0000\u0299\u0001"+ + "\u0000\u0000\u0000\u0000\u029b\u0001\u0000\u0000\u0000\u0000\u029d\u0001"+ + "\u0000\u0000\u0000\u0000\u029f\u0001\u0000\u0000\u0000\u0000\u02a1\u0001"+ + "\u0000\u0000\u0000\u0000\u02a3\u0001\u0000\u0000\u0000\u0000\u02a5\u0001"+ + "\u0000\u0000\u0000\u0000\u02a7\u0001\u0000\u0000\u0000\u0000\u02a9\u0001"+ + "\u0000\u0000\u0000\u0000\u02ab\u0001\u0000\u0000\u0000\u0000\u02ad\u0001"+ + "\u0000\u0000\u0000\u0000\u02af\u0001\u0000\u0000\u0000\u0000\u02b1\u0001"+ + "\u0000\u0000\u0000\u0000\u02b3\u0001\u0000\u0000\u0000\u0000\u02b5\u0001"+ + "\u0000\u0000\u0000\u0000\u02b7\u0001\u0000\u0000\u0000\u0000\u02b9\u0001"+ + "\u0000\u0000\u0000\u0000\u02bb\u0001\u0000\u0000\u0000\u0000\u02bd\u0001"+ + "\u0000\u0000\u0000\u0000\u02cf\u0001\u0000\u0000\u0000\u0001\u02d2\u0001"+ + "\u0000\u0000\u0000\u0003\u02d8\u0001\u0000\u0000\u0000\u0005\u02e6\u0001"+ + "\u0000\u0000\u0000\u0007\u0311\u0001\u0000\u0000\u0000\t\u0315\u0001\u0000"+ + "\u0000\u0000\u000b\u0319\u0001\u0000\u0000\u0000\r\u031d\u0001\u0000\u0000"+ + "\u0000\u000f\u0320\u0001\u0000\u0000\u0000\u0011\u0324\u0001\u0000\u0000"+ + "\u0000\u0013\u032c\u0001\u0000\u0000\u0000\u0015\u0334\u0001\u0000\u0000"+ + "\u0000\u0017\u0337\u0001\u0000\u0000\u0000\u0019\u033c\u0001\u0000\u0000"+ + "\u0000\u001b\u0341\u0001\u0000\u0000\u0000\u001d\u0347\u0001\u0000\u0000"+ + "\u0000\u001f\u034f\u0001\u0000\u0000\u0000!\u0358\u0001\u0000\u0000\u0000"+ + "#\u035f\u0001\u0000\u0000\u0000%\u0364\u0001\u0000\u0000\u0000\'\u036d"+ + "\u0001\u0000\u0000\u0000)\u0376\u0001\u0000\u0000\u0000+\u037d\u0001\u0000"+ + "\u0000\u0000-\u0382\u0001\u0000\u0000\u0000/\u0389\u0001\u0000\u0000\u0000"+ + "1\u038f\u0001\u0000\u0000\u00003\u0395\u0001\u0000\u0000\u00005\u039b"+ + "\u0001\u0000\u0000\u00007\u03a0\u0001\u0000\u0000\u00009\u03a6\u0001\u0000"+ + "\u0000\u0000;\u03ad\u0001\u0000\u0000\u0000=\u03b0\u0001\u0000\u0000\u0000"+ + "?\u03b6\u0001\u0000\u0000\u0000A\u03ba\u0001\u0000\u0000\u0000C\u03c2"+ + "\u0001\u0000\u0000\u0000E\u03c5\u0001\u0000\u0000\u0000G\u03ca\u0001\u0000"+ + "\u0000\u0000I\u03cf\u0001\u0000\u0000\u0000K\u03d4\u0001\u0000\u0000\u0000"+ + "M\u03d9\u0001\u0000\u0000\u0000O\u03df\u0001\u0000\u0000\u0000Q\u03e4"+ + "\u0001\u0000\u0000\u0000S\u03ea\u0001\u0000\u0000\u0000U\u03f2\u0001\u0000"+ + "\u0000\u0000W\u03fa\u0001\u0000\u0000\u0000Y\u03fe\u0001\u0000\u0000\u0000"+ + "[\u0403\u0001\u0000\u0000\u0000]\u0409\u0001\u0000\u0000\u0000_\u040c"+ + "\u0001\u0000\u0000\u0000a\u040f\u0001\u0000\u0000\u0000c\u0415\u0001\u0000"+ + "\u0000\u0000e\u041b\u0001\u0000\u0000\u0000g\u0420\u0001\u0000\u0000\u0000"+ + "i\u042a\u0001\u0000\u0000\u0000k\u0431\u0001\u0000\u0000\u0000m\u0437"+ + "\u0001\u0000\u0000\u0000o\u043e\u0001\u0000\u0000\u0000q\u0443\u0001\u0000"+ + "\u0000\u0000s\u044a\u0001\u0000\u0000\u0000u\u044f\u0001\u0000\u0000\u0000"+ + "w\u0454\u0001\u0000\u0000\u0000y\u045a\u0001\u0000\u0000\u0000{\u0460"+ + "\u0001\u0000\u0000\u0000}\u0465\u0001\u0000\u0000\u0000\u007f\u046b\u0001"+ + "\u0000\u0000\u0000\u0081\u0471\u0001\u0000\u0000\u0000\u0083\u0475\u0001"+ + "\u0000\u0000\u0000\u0085\u047b\u0001\u0000\u0000\u0000\u0087\u047f\u0001"+ + "\u0000\u0000\u0000\u0089\u0483\u0001\u0000\u0000\u0000\u008b\u0487\u0001"+ + "\u0000\u0000\u0000\u008d\u048f\u0001\u0000\u0000\u0000\u008f\u0498\u0001"+ + "\u0000\u0000\u0000\u0091\u04a1\u0001\u0000\u0000\u0000\u0093\u04a5\u0001"+ + "\u0000\u0000\u0000\u0095\u04ac\u0001\u0000\u0000\u0000\u0097\u04b7\u0001"+ + "\u0000\u0000\u0000\u0099\u04c3\u0001\u0000\u0000\u0000\u009b\u04cd\u0001"+ + "\u0000\u0000\u0000\u009d\u04d2\u0001\u0000\u0000\u0000\u009f\u04d6\u0001"+ + "\u0000\u0000\u0000\u00a1\u04db\u0001\u0000\u0000\u0000\u00a3\u04e2\u0001"+ + "\u0000\u0000\u0000\u00a5\u04eb\u0001\u0000\u0000\u0000\u00a7\u04f7\u0001"+ + "\u0000\u0000\u0000\u00a9\u04fe\u0001\u0000\u0000\u0000\u00ab\u0505\u0001"+ + "\u0000\u0000\u0000\u00ad\u050a\u0001\u0000\u0000\u0000\u00af\u050e\u0001"+ + "\u0000\u0000\u0000\u00b1\u0513\u0001\u0000\u0000\u0000\u00b3\u0519\u0001"+ + "\u0000\u0000\u0000\u00b5\u0521\u0001\u0000\u0000\u0000\u00b7\u0526\u0001"+ + "\u0000\u0000\u0000\u00b9\u0539\u0001\u0000\u0000\u0000\u00bb\u054c\u0001"+ + "\u0000\u0000\u0000\u00bd\u055a\u0001\u0000\u0000\u0000\u00bf\u056b\u0001"+ + "\u0000\u0000\u0000\u00c1\u0577\u0001\u0000\u0000\u0000\u00c3\u0583\u0001"+ + "\u0000\u0000\u0000\u00c5\u0593\u0001\u0000\u0000\u0000\u00c7\u059e\u0001"+ + "\u0000\u0000\u0000\u00c9\u05a9\u0001\u0000\u0000\u0000\u00cb\u05b2\u0001"+ + "\u0000\u0000\u0000\u00cd\u05bd\u0001\u0000\u0000\u0000\u00cf\u05c4\u0001"+ + "\u0000\u0000\u0000\u00d1\u05c8\u0001\u0000\u0000\u0000\u00d3\u05cd\u0001"+ + "\u0000\u0000\u0000\u00d5\u05d1\u0001\u0000\u0000\u0000\u00d7\u05d9\u0001"+ + "\u0000\u0000\u0000\u00d9\u05df\u0001\u0000\u0000\u0000\u00db\u05e4\u0001"+ + "\u0000\u0000\u0000\u00dd\u05e9\u0001\u0000\u0000\u0000\u00df\u05ef\u0001"+ + "\u0000\u0000\u0000\u00e1\u05f4\u0001\u0000\u0000\u0000\u00e3\u05f9\u0001"+ + "\u0000\u0000\u0000\u00e5\u0601\u0001\u0000\u0000\u0000\u00e7\u0608\u0001"+ + "\u0000\u0000\u0000\u00e9\u0612\u0001\u0000\u0000\u0000\u00eb\u0617\u0001"+ + "\u0000\u0000\u0000\u00ed\u0622\u0001\u0000\u0000\u0000\u00ef\u0626\u0001"+ + "\u0000\u0000\u0000\u00f1\u062b\u0001\u0000\u0000\u0000\u00f3\u062f\u0001"+ + "\u0000\u0000\u0000\u00f5\u0635\u0001\u0000\u0000\u0000\u00f7\u063d\u0001"+ + "\u0000\u0000\u0000\u00f9\u0645\u0001\u0000\u0000\u0000\u00fb\u0652\u0001"+ + "\u0000\u0000\u0000\u00fd\u065f\u0001\u0000\u0000\u0000\u00ff\u0671\u0001"+ + "\u0000\u0000\u0000\u0101\u0676\u0001\u0000\u0000\u0000\u0103\u067f\u0001"+ + "\u0000\u0000\u0000\u0105\u068b\u0001\u0000\u0000\u0000\u0107\u0694\u0001"+ + "\u0000\u0000\u0000\u0109\u069d\u0001\u0000\u0000\u0000\u010b\u06a5\u0001"+ + "\u0000\u0000\u0000\u010d\u06b0\u0001\u0000\u0000\u0000\u010f\u06ba\u0001"+ + "\u0000\u0000\u0000\u0111\u06c4\u0001\u0000\u0000\u0000\u0113\u06cc\u0001"+ + "\u0000\u0000\u0000\u0115\u06d3\u0001\u0000\u0000\u0000\u0117\u06d5\u0001"+ + "\u0000\u0000\u0000\u0119\u06d9\u0001\u0000\u0000\u0000\u011b\u06df\u0001"+ + "\u0000\u0000\u0000\u011d\u06e7\u0001\u0000\u0000\u0000\u011f\u06ed\u0001"+ + "\u0000\u0000\u0000\u0121\u06f7\u0001\u0000\u0000\u0000\u0123\u0705\u0001"+ + "\u0000\u0000\u0000\u0125\u0710\u0001\u0000\u0000\u0000\u0127\u0713\u0001"+ + "\u0000\u0000\u0000\u0129\u071a\u0001\u0000\u0000\u0000\u012b\u0721\u0001"+ + "\u0000\u0000\u0000\u012d\u072a\u0001\u0000\u0000\u0000\u012f\u0731\u0001"+ + "\u0000\u0000\u0000\u0131\u0734\u0001\u0000\u0000\u0000\u0133\u073e\u0001"+ + "\u0000\u0000\u0000\u0135\u074d\u0001\u0000\u0000\u0000\u0137\u0754\u0001"+ + "\u0000\u0000\u0000\u0139\u0758\u0001\u0000\u0000\u0000\u013b\u075e\u0001"+ + "\u0000\u0000\u0000\u013d\u0763\u0001\u0000\u0000\u0000\u013f\u0769\u0001"+ + "\u0000\u0000\u0000\u0141\u076f\u0001\u0000\u0000\u0000\u0143\u0778\u0001"+ + "\u0000\u0000\u0000\u0145\u0781\u0001\u0000\u0000\u0000\u0147\u0789\u0001"+ + "\u0000\u0000\u0000\u0149\u0793\u0001\u0000\u0000\u0000\u014b\u079c\u0001"+ + "\u0000\u0000\u0000\u014d\u07a0\u0001\u0000\u0000\u0000\u014f\u07a7\u0001"+ + "\u0000\u0000\u0000\u0151\u07b2\u0001\u0000\u0000\u0000\u0153\u07be\u0001"+ + "\u0000\u0000\u0000\u0155\u07c1\u0001\u0000\u0000\u0000\u0157\u07ca\u0001"+ + "\u0000\u0000\u0000\u0159\u07ce\u0001\u0000\u0000\u0000\u015b\u07d4\u0001"+ + "\u0000\u0000\u0000\u015d\u07dc\u0001\u0000\u0000\u0000\u015f\u07e1\u0001"+ + "\u0000\u0000\u0000\u0161\u07e9\u0001\u0000\u0000\u0000\u0163\u07ee\u0001"+ + "\u0000\u0000\u0000\u0165\u07f4\u0001\u0000\u0000\u0000\u0167\u07fa\u0001"+ + "\u0000\u0000\u0000\u0169\u0802\u0001\u0000\u0000\u0000\u016b\u080e\u0001"+ + "\u0000\u0000\u0000\u016d\u0813\u0001\u0000\u0000\u0000\u016f\u081a\u0001"+ + "\u0000\u0000\u0000\u0171\u081e\u0001\u0000\u0000\u0000\u0173\u0823\u0001"+ + "\u0000\u0000\u0000\u0175\u0828\u0001\u0000\u0000\u0000\u0177\u0834\u0001"+ + "\u0000\u0000\u0000\u0179\u083c\u0001\u0000\u0000\u0000\u017b\u0844\u0001"+ + "\u0000\u0000\u0000\u017d\u084d\u0001\u0000\u0000\u0000\u017f\u0855\u0001"+ + "\u0000\u0000\u0000\u0181\u0859\u0001\u0000\u0000\u0000\u0183\u085e\u0001"+ + "\u0000\u0000\u0000\u0185\u0867\u0001\u0000\u0000\u0000\u0187\u0873\u0001"+ + "\u0000\u0000\u0000\u0189\u087f\u0001\u0000\u0000\u0000\u018b\u0889\u0001"+ + "\u0000\u0000\u0000\u018d\u0892\u0001\u0000\u0000\u0000\u018f\u089a\u0001"+ + "\u0000\u0000\u0000\u0191\u08a5\u0001\u0000\u0000\u0000\u0193\u08b4\u0001"+ + "\u0000\u0000\u0000\u0195\u08ba\u0001\u0000\u0000\u0000\u0197\u08c3\u0001"+ + "\u0000\u0000\u0000\u0199\u08cc\u0001\u0000\u0000\u0000\u019b\u08da\u0001"+ + "\u0000\u0000\u0000\u019d\u08dc\u0001\u0000\u0000\u0000\u019f\u08de\u0001"+ + "\u0000\u0000\u0000\u01a1\u08e1\u0001\u0000\u0000\u0000\u01a3\u08e3\u0001"+ + "\u0000\u0000\u0000\u01a5\u08e5\u0001\u0000\u0000\u0000\u01a7\u08f0\u0001"+ + "\u0000\u0000\u0000\u01a9\u08f5\u0001\u0000\u0000\u0000\u01ab\u0900\u0001"+ + "\u0000\u0000\u0000\u01ad\u090f\u0001\u0000\u0000\u0000\u01af\u091c\u0001"+ + "\u0000\u0000\u0000\u01b1\u0928\u0001\u0000\u0000\u0000\u01b3\u0934\u0001"+ + "\u0000\u0000\u0000\u01b5\u093c\u0001\u0000\u0000\u0000\u01b7\u094b\u0001"+ + "\u0000\u0000\u0000\u01b9\u0951\u0001\u0000\u0000\u0000\u01bb\u0958\u0001"+ + "\u0000\u0000\u0000\u01bd\u0969\u0001\u0000\u0000\u0000\u01bf\u0972\u0001"+ + "\u0000\u0000\u0000\u01c1\u097f\u0001\u0000\u0000\u0000\u01c3\u0992\u0001"+ + "\u0000\u0000\u0000\u01c5\u09a1\u0001\u0000\u0000\u0000\u01c7\u09ad\u0001"+ + "\u0000\u0000\u0000\u01c9\u09b7\u0001\u0000\u0000\u0000\u01cb\u09c3\u0001"+ + "\u0000\u0000\u0000\u01cd\u09cb\u0001\u0000\u0000\u0000\u01cf\u09d4\u0001"+ + "\u0000\u0000\u0000\u01d1\u09e0\u0001\u0000\u0000\u0000\u01d3\u09ed\u0001"+ + "\u0000\u0000\u0000\u01d5\u09fe\u0001\u0000\u0000\u0000\u01d7\u0a12\u0001"+ + "\u0000\u0000\u0000\u01d9\u0a1f\u0001\u0000\u0000\u0000\u01db\u0a33\u0001"+ + "\u0000\u0000\u0000\u01dd\u0a3e\u0001\u0000\u0000\u0000\u01df\u0a4a\u0001"+ + "\u0000\u0000\u0000\u01e1\u0a58\u0001\u0000\u0000\u0000\u01e3\u0a67\u0001"+ + "\u0000\u0000\u0000\u01e5\u0a75\u0001\u0000\u0000\u0000\u01e7\u0a80\u0001"+ + "\u0000\u0000\u0000\u01e9\u0a8c\u0001\u0000\u0000\u0000\u01eb\u0a9c\u0001"+ + "\u0000\u0000\u0000\u01ed\u0aa3\u0001\u0000\u0000\u0000\u01ef\u0aaf\u0001"+ + "\u0000\u0000\u0000\u01f1\u0aba\u0001\u0000\u0000\u0000\u01f3\u0acc\u0001"+ + "\u0000\u0000\u0000\u01f5\u0ad9\u0001\u0000\u0000\u0000\u01f7\u0ae8\u0001"+ + "\u0000\u0000\u0000\u01f9\u0aee\u0001\u0000\u0000\u0000\u01fb\u0af4\u0001"+ + "\u0000\u0000\u0000\u01fd\u0afa\u0001\u0000\u0000\u0000\u01ff\u0b05\u0001"+ + "\u0000\u0000\u0000\u0201\u0b11\u0001\u0000\u0000\u0000\u0203\u0b22\u0001"+ + "\u0000\u0000\u0000\u0205\u0b28\u0001\u0000\u0000\u0000\u0207\u0b2d\u0001"+ + "\u0000\u0000\u0000\u0209\u0b33\u0001\u0000\u0000\u0000\u020b\u0b40\u0001"+ + "\u0000\u0000\u0000\u020d\u0b4e\u0001\u0000\u0000\u0000\u020f\u0b56\u0001"+ + "\u0000\u0000\u0000\u0211\u0b5d\u0001\u0000\u0000\u0000\u0213\u0b6a\u0001"+ + "\u0000\u0000\u0000\u0215\u0b75\u0001\u0000\u0000\u0000\u0217\u0b7d\u0001"+ + "\u0000\u0000\u0000\u0219\u0b8b\u0001\u0000\u0000\u0000\u021b\u0b9a\u0001"+ + "\u0000\u0000\u0000\u021d\u0ba1\u0001\u0000\u0000\u0000\u021f\u0ba8\u0001"+ + "\u0000\u0000\u0000\u0221\u0bb0\u0001\u0000\u0000\u0000\u0223\u0bb9\u0001"+ + "\u0000\u0000\u0000\u0225\u0bd0\u0001\u0000\u0000\u0000\u0227\u0bd9\u0001"+ + "\u0000\u0000\u0000\u0229\u0bea\u0001\u0000\u0000\u0000\u022b\u0c0e\u0001"+ + "\u0000\u0000\u0000\u022d\u0c14\u0001\u0000\u0000\u0000\u022f\u0c25\u0001"+ + "\u0000\u0000\u0000\u0231\u0c36\u0001\u0000\u0000\u0000\u0233\u0c44\u0001"+ + "\u0000\u0000\u0000\u0235\u0c55\u0001\u0000\u0000\u0000\u0237\u0c5c\u0001"+ + "\u0000\u0000\u0000\u0239\u0c77\u0001\u0000\u0000\u0000\u023b\u0c7e\u0001"+ + "\u0000\u0000\u0000\u023d\u0c84\u0001\u0000\u0000\u0000\u023f\u0c8e\u0001"+ + "\u0000\u0000\u0000\u0241\u0ca3\u0001\u0000\u0000\u0000\u0243\u0cb7\u0001"+ + "\u0000\u0000\u0000\u0245\u0cc5\u0001\u0000\u0000\u0000\u0247\u0cda\u0001"+ + "\u0000\u0000\u0000\u0249\u0ce2\u0001\u0000\u0000\u0000\u024b\u0cf4\u0001"+ + "\u0000\u0000\u0000\u024d\u0d0c\u0001\u0000\u0000\u0000\u024f\u0d1b\u0001"+ + "\u0000\u0000\u0000\u0251\u0d30\u0001\u0000\u0000\u0000\u0253\u0d39\u0001"+ + "\u0000\u0000\u0000\u0255\u0d45\u0001\u0000\u0000\u0000\u0257\u0d53\u0001"+ + "\u0000\u0000\u0000\u0259\u0d62\u0001\u0000\u0000\u0000\u025b\u0d75\u0001"+ + "\u0000\u0000\u0000\u025d\u0d7d\u0001\u0000\u0000\u0000\u025f\u0d82\u0001"+ + "\u0000\u0000\u0000\u0261\u0d8e\u0001\u0000\u0000\u0000\u0263\u0d98\u0001"+ + "\u0000\u0000\u0000\u0265\u0d9d\u0001\u0000\u0000\u0000\u0267\u0dae\u0001"+ + "\u0000\u0000\u0000\u0269\u0db8\u0001\u0000\u0000\u0000\u026b\u0dc1\u0001"+ + "\u0000\u0000\u0000\u026d\u0dcb\u0001\u0000\u0000\u0000\u026f\u0ddd\u0001"+ + "\u0000\u0000\u0000\u0271\u0ddf\u0001\u0000\u0000\u0000\u0273\u0de1\u0001"+ + "\u0000\u0000\u0000\u0275\u0de3\u0001\u0000\u0000\u0000\u0277\u0de5\u0001"+ + "\u0000\u0000\u0000\u0279\u0de7\u0001\u0000\u0000\u0000\u027b\u0deb\u0001"+ + "\u0000\u0000\u0000\u027d\u0def\u0001\u0000\u0000\u0000\u027f\u0df1\u0001"+ + "\u0000\u0000\u0000\u0281\u0df3\u0001\u0000\u0000\u0000\u0283\u0df5\u0001"+ + "\u0000\u0000\u0000\u0285\u0df7\u0001\u0000\u0000\u0000\u0287\u0df9\u0001"+ + "\u0000\u0000\u0000\u0289\u0dfb\u0001\u0000\u0000\u0000\u028b\u0dfd\u0001"+ + "\u0000\u0000\u0000\u028d\u0dff\u0001\u0000\u0000\u0000\u028f\u0e01\u0001"+ + "\u0000\u0000\u0000\u0291\u0e03\u0001\u0000\u0000\u0000\u0293\u0e05\u0001"+ + "\u0000\u0000\u0000\u0295\u0e07\u0001\u0000\u0000\u0000\u0297\u0e09\u0001"+ + "\u0000\u0000\u0000\u0299\u0e0b\u0001\u0000\u0000\u0000\u029b\u0e0d\u0001"+ + "\u0000\u0000\u0000\u029d\u0e0f\u0001\u0000\u0000\u0000\u029f\u0e11\u0001"+ + "\u0000\u0000\u0000\u02a1\u0e13\u0001\u0000\u0000\u0000\u02a3\u0e15\u0001"+ + "\u0000\u0000\u0000\u02a5\u0e17\u0001\u0000\u0000\u0000\u02a7\u0e19\u0001"+ + "\u0000\u0000\u0000\u02a9\u0e1b\u0001\u0000\u0000\u0000\u02ab\u0e1d\u0001"+ + "\u0000\u0000\u0000\u02ad\u0e20\u0001\u0000\u0000\u0000\u02af\u0e23\u0001"+ + "\u0000\u0000\u0000\u02b1\u0e3a\u0001\u0000\u0000\u0000\u02b3\u0e67\u0001"+ + "\u0000\u0000\u0000\u02b5\u0e69\u0001\u0000\u0000\u0000\u02b7\u0e6c\u0001"+ + "\u0000\u0000\u0000\u02b9\u0e6e\u0001\u0000\u0000\u0000\u02bb\u0e70\u0001"+ + "\u0000\u0000\u0000\u02bd\u0e72\u0001\u0000\u0000\u0000\u02bf\u0e74\u0001"+ + "\u0000\u0000\u0000\u02c1\u0e7e\u0001\u0000\u0000\u0000\u02c3\u0e88\u0001"+ + "\u0000\u0000\u0000\u02c5\u0e95\u0001\u0000\u0000\u0000\u02c7\u0ea2\u0001"+ + "\u0000\u0000\u0000\u02c9\u0eaf\u0001\u0000\u0000\u0000\u02cb\u0eb1\u0001"+ + "\u0000\u0000\u0000\u02cd\u0eb3\u0001\u0000\u0000\u0000\u02cf\u0ebc\u0001"+ + "\u0000\u0000\u0000\u02d1\u02d3\u0007\u0000\u0000\u0000\u02d2\u02d1\u0001"+ + "\u0000\u0000\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4\u02d2\u0001"+ + "\u0000\u0000\u0000\u02d4\u02d5\u0001\u0000\u0000\u0000\u02d5\u02d6\u0001"+ + "\u0000\u0000\u0000\u02d6\u02d7\u0006\u0000\u0000\u0000\u02d7\u0002\u0001"+ + "\u0000\u0000\u0000\u02d8\u02d9\u0005/\u0000\u0000\u02d9\u02da\u0005*\u0000"+ + "\u0000\u02da\u02db\u0005!\u0000\u0000\u02db\u02dd\u0001\u0000\u0000\u0000"+ + "\u02dc\u02de\t\u0000\u0000\u0000\u02dd\u02dc\u0001\u0000\u0000\u0000\u02de"+ + "\u02df\u0001\u0000\u0000\u0000\u02df\u02e0\u0001\u0000\u0000\u0000\u02df"+ + "\u02dd\u0001\u0000\u0000\u0000\u02e0\u02e1\u0001\u0000\u0000\u0000\u02e1"+ + "\u02e2\u0005*\u0000\u0000\u02e2\u02e3\u0005/\u0000\u0000\u02e3\u02e4\u0001"+ + "\u0000\u0000\u0000\u02e4\u02e5\u0006\u0001\u0001\u0000\u02e5\u0004\u0001"+ + "\u0000\u0000\u0000\u02e6\u02e7\u0005/\u0000\u0000\u02e7\u02e8\u0005*\u0000"+ + "\u0000\u02e8\u02ec\u0001\u0000\u0000\u0000\u02e9\u02eb\t\u0000\u0000\u0000"+ + "\u02ea\u02e9\u0001\u0000\u0000\u0000\u02eb\u02ee\u0001\u0000\u0000\u0000"+ + "\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000"+ + "\u02ed\u02ef\u0001\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000"+ + "\u02ef\u02f0\u0005*\u0000\u0000\u02f0\u02f1\u0005/\u0000\u0000\u02f1\u02f2"+ + "\u0001\u0000\u0000\u0000\u02f2\u02f3\u0006\u0002\u0000\u0000\u02f3\u0006"+ + "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005-\u0000\u0000\u02f5\u02f6\u0005"+ + "-\u0000\u0000\u02f6\u02f9\u0005 \u0000\u0000\u02f7\u02f9\u0005#\u0000"+ + "\u0000\u02f8\u02f4\u0001\u0000\u0000\u0000\u02f8\u02f7\u0001\u0000\u0000"+ + "\u0000\u02f9\u02fd\u0001\u0000\u0000\u0000\u02fa\u02fc\b\u0001\u0000\u0000"+ + "\u02fb\u02fa\u0001\u0000\u0000\u0000\u02fc\u02ff\u0001\u0000\u0000\u0000"+ + "\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd\u02fe\u0001\u0000\u0000\u0000"+ + "\u02fe\u0305\u0001\u0000\u0000\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000"+ + "\u0300\u0302\u0005\r\u0000\u0000\u0301\u0300\u0001\u0000\u0000\u0000\u0301"+ + "\u0302\u0001\u0000\u0000\u0000\u0302\u0303\u0001\u0000\u0000\u0000\u0303"+ + "\u0306\u0005\n\u0000\u0000\u0304\u0306\u0005\u0000\u0000\u0001\u0305\u0301"+ + "\u0001\u0000\u0000\u0000\u0305\u0304\u0001\u0000\u0000\u0000\u0306\u0312"+ + "\u0001\u0000\u0000\u0000\u0307\u0308\u0005-\u0000\u0000\u0308\u0309\u0005"+ + "-\u0000\u0000\u0309\u030f\u0001\u0000\u0000\u0000\u030a\u030c\u0005\r"+ + "\u0000\u0000\u030b\u030a\u0001\u0000\u0000\u0000\u030b\u030c\u0001\u0000"+ + "\u0000\u0000\u030c\u030d\u0001\u0000\u0000\u0000\u030d\u0310\u0005\n\u0000"+ + "\u0000\u030e\u0310\u0005\u0000\u0000\u0001\u030f\u030b\u0001\u0000\u0000"+ + "\u0000\u030f\u030e\u0001\u0000\u0000\u0000\u0310\u0312\u0001\u0000\u0000"+ + "\u0000\u0311\u02f8\u0001\u0000\u0000\u0000\u0311\u0307\u0001\u0000\u0000"+ + "\u0000\u0312\u0313\u0001\u0000\u0000\u0000\u0313\u0314\u0006\u0003\u0000"+ + "\u0000\u0314\b\u0001\u0000\u0000\u0000\u0315\u0316\u0007\u0002\u0000\u0000"+ + "\u0316\u0317\u0007\u0003\u0000\u0000\u0317\u0318\u0007\u0003\u0000\u0000"+ + "\u0318\n\u0001\u0000\u0000\u0000\u0319\u031a\u0007\u0002\u0000\u0000\u031a"+ + "\u031b\u0007\u0004\u0000\u0000\u031b\u031c\u0007\u0005\u0000\u0000\u031c"+ + "\f\u0001\u0000\u0000\u0000\u031d\u031e\u0007\u0002\u0000\u0000\u031e\u031f"+ + "\u0007\u0006\u0000\u0000\u031f\u000e\u0001\u0000\u0000\u0000\u0320\u0321"+ + "\u0007\u0002\u0000\u0000\u0321\u0322\u0007\u0006\u0000\u0000\u0322\u0323"+ + "\u0007\u0007\u0000\u0000\u0323\u0010\u0001\u0000\u0000\u0000\u0324\u0325"+ + "\u0007\b\u0000\u0000\u0325\u0326\u0007\t\u0000\u0000\u0326\u0327\u0007"+ + "\t\u0000\u0000\u0327\u0328\u0007\u0003\u0000\u0000\u0328\u0329\u0007\n"+ + "\u0000\u0000\u0329\u032a\u0007\u0002\u0000\u0000\u032a\u032b\u0007\u0004"+ + "\u0000\u0000\u032b\u0012\u0001\u0000\u0000\u0000\u032c\u032d\u0007\b\u0000"+ + "\u0000\u032d\u032e\u0007\n\u0000\u0000\u032e\u032f\u0007\u000b\u0000\u0000"+ + "\u032f\u0330\u0007\f\u0000\u0000\u0330\u0331\u0007\n\u0000\u0000\u0331"+ + "\u0332\u0007\n\u0000\u0000\u0332\u0333\u0007\u0004\u0000\u0000\u0333\u0014"+ + "\u0001\u0000\u0000\u0000\u0334\u0335\u0007\b\u0000\u0000\u0335\u0336\u0007"+ + "\r\u0000\u0000\u0336\u0016\u0001\u0000\u0000\u0000\u0337\u0338\u0007\u0007"+ + "\u0000\u0000\u0338\u0339\u0007\u0002\u0000\u0000\u0339\u033a\u0007\u0006"+ + "\u0000\u0000\u033a\u033b\u0007\n\u0000\u0000\u033b\u0018\u0001\u0000\u0000"+ + "\u0000\u033c\u033d\u0007\u0007\u0000\u0000\u033d\u033e\u0007\u0002\u0000"+ + "\u0000\u033e\u033f\u0007\u0006\u0000\u0000\u033f\u0340\u0007\u000b\u0000"+ + "\u0000\u0340\u001a\u0001\u0000\u0000\u0000\u0341\u0342\u0007\u0007\u0000"+ + "\u0000\u0342\u0343\u0007\u000e\u0000\u0000\u0343\u0344\u0007\t\u0000\u0000"+ + "\u0344\u0345\u0007\u0006\u0000\u0000\u0345\u0346\u0007\u0006\u0000\u0000"+ + "\u0346\u001c\u0001\u0000\u0000\u0000\u0347\u0348\u0007\u0007\u0000\u0000"+ + "\u0348\u0349\u0007\t\u0000\u0000\u0349\u034a\u0007\u0003\u0000\u0000\u034a"+ + "\u034b\u0007\u000f\u0000\u0000\u034b\u034c\u0007\u0010\u0000\u0000\u034c"+ + "\u034d\u0007\u0004\u0000\u0000\u034d\u034e\u0007\u0006\u0000\u0000\u034e"+ + "\u001e\u0001\u0000\u0000\u0000\u034f\u0350\u0007\u0005\u0000\u0000\u0350"+ + "\u0351\u0007\u0002\u0000\u0000\u0351\u0352\u0007\u000b\u0000\u0000\u0352"+ + "\u0353\u0007\n\u0000\u0000\u0353\u0354\u0007\u000b\u0000\u0000\u0354\u0355"+ + "\u0007\u0011\u0000\u0000\u0355\u0356\u0007\u0010\u0000\u0000\u0356\u0357"+ + "\u0007\n\u0000\u0000\u0357 \u0001\u0000\u0000\u0000\u0358\u0359\u0007"+ + "\u0005\u0000\u0000\u0359\u035a\u0007\n\u0000\u0000\u035a\u035b\u0007\u0003"+ + "\u0000\u0000\u035b\u035c\u0007\n\u0000\u0000\u035c\u035d\u0007\u000b\u0000"+ + "\u0000\u035d\u035e\u0007\n\u0000\u0000\u035e\"\u0001\u0000\u0000\u0000"+ + "\u035f\u0360\u0007\u0005\u0000\u0000\u0360\u0361\u0007\n\u0000\u0000\u0361"+ + "\u0362\u0007\u0006\u0000\u0000\u0362\u0363\u0007\u0007\u0000\u0000\u0363"+ + "$\u0001\u0000\u0000\u0000\u0364\u0365\u0007\u0005\u0000\u0000\u0365\u0366"+ + "\u0007\n\u0000\u0000\u0366\u0367\u0007\u0006\u0000\u0000\u0367\u0368\u0007"+ + "\u0007\u0000\u0000\u0368\u0369\u0007\u000e\u0000\u0000\u0369\u036a\u0007"+ + "\u0011\u0000\u0000\u036a\u036b\u0007\b\u0000\u0000\u036b\u036c\u0007\n"+ + "\u0000\u0000\u036c&\u0001\u0000\u0000\u0000\u036d\u036e\u0007\u0005\u0000"+ + "\u0000\u036e\u036f\u0007\u0011\u0000\u0000\u036f\u0370\u0007\u0006\u0000"+ + "\u0000\u0370\u0371\u0007\u000b\u0000\u0000\u0371\u0372\u0007\u0011\u0000"+ + "\u0000\u0372\u0373\u0007\u0004\u0000\u0000\u0373\u0374\u0007\u0007\u0000"+ + "\u0000\u0374\u0375\u0007\u000b\u0000\u0000\u0375(\u0001\u0000\u0000\u0000"+ + "\u0376\u0377\u0007\u0005\u0000\u0000\u0377\u0378\u0007\t\u0000\u0000\u0378"+ + "\u0379\u0007\u000f\u0000\u0000\u0379\u037a\u0007\b\u0000\u0000\u037a\u037b"+ + "\u0007\u0003\u0000\u0000\u037b\u037c\u0007\n\u0000\u0000\u037c*\u0001"+ + "\u0000\u0000\u0000\u037d\u037e\u0007\n\u0000\u0000\u037e\u037f\u0007\u0003"+ + "\u0000\u0000\u037f\u0380\u0007\u0006\u0000\u0000\u0380\u0381\u0007\n\u0000"+ + "\u0000\u0381,\u0001\u0000\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000"+ + "\u0383\u0384\u0007\u0012\u0000\u0000\u0384\u0385\u0007\u0011\u0000\u0000"+ + "\u0385\u0386\u0007\u0006\u0000\u0000\u0386\u0387\u0007\u000b\u0000\u0000"+ + "\u0387\u0388\u0007\u0006\u0000\u0000\u0388.\u0001\u0000\u0000\u0000\u0389"+ + "\u038a\u0007\u0013\u0000\u0000\u038a\u038b\u0007\u0002\u0000\u0000\u038b"+ + "\u038c\u0007\u0003\u0000\u0000\u038c\u038d\u0007\u0006\u0000\u0000\u038d"+ + "\u038e\u0007\n\u0000\u0000\u038e0\u0001\u0000\u0000\u0000\u038f\u0390"+ + "\u0007\u0013\u0000\u0000\u0390\u0391\u0007\u0003\u0000\u0000\u0391\u0392"+ + "\u0007\t\u0000\u0000\u0392\u0393\u0007\u0002\u0000\u0000\u0393\u0394\u0007"+ + "\u000b\u0000\u0000\u03942\u0001\u0000\u0000\u0000\u0395\u0396\u0007\u0013"+ + "\u0000\u0000\u0396\u0397\u0007\u0011\u0000\u0000\u0397\u0398\u0007\u000e"+ + "\u0000\u0000\u0398\u0399\u0007\u0006\u0000\u0000\u0399\u039a\u0007\u000b"+ + "\u0000\u0000\u039a4\u0001\u0000\u0000\u0000\u039b\u039c\u0007\u0013\u0000"+ + "\u0000\u039c\u039d\u0007\u000e\u0000\u0000\u039d\u039e\u0007\t\u0000\u0000"+ + "\u039e\u039f\u0007\u0010\u0000\u0000\u039f6\u0001\u0000\u0000\u0000\u03a0"+ + "\u03a1\u0007\u0014\u0000\u0000\u03a1\u03a2\u0007\u000e\u0000\u0000\u03a2"+ + "\u03a3\u0007\t\u0000\u0000\u03a3\u03a4\u0007\u000f\u0000\u0000\u03a4\u03a5"+ + "\u0007\u0015\u0000\u0000\u03a58\u0001\u0000\u0000\u0000\u03a6\u03a7\u0007"+ + "\u0016\u0000\u0000\u03a7\u03a8\u0007\u0002\u0000\u0000\u03a8\u03a9\u0007"+ + "\u0017\u0000\u0000\u03a9\u03aa\u0007\u0011\u0000\u0000\u03aa\u03ab\u0007"+ + "\u0004\u0000\u0000\u03ab\u03ac\u0007\u0014\u0000\u0000\u03ac:\u0001\u0000"+ + "\u0000\u0000\u03ad\u03ae\u0007\u0011\u0000\u0000\u03ae\u03af\u0007\u0004"+ + "\u0000\u0000\u03af<\u0001\u0000\u0000\u0000\u03b0\u03b1\u0007\u0011\u0000"+ + "\u0000\u03b1\u03b2\u0007\u0004\u0000\u0000\u03b2\u03b3\u0007\u0004\u0000"+ + "\u0000\u03b3\u03b4\u0007\n\u0000\u0000\u03b4\u03b5\u0007\u000e\u0000\u0000"+ + "\u03b5>\u0001\u0000\u0000\u0000\u03b6\u03b7\u0007\u0011\u0000\u0000\u03b7"+ + "\u03b8\u0007\u0004\u0000\u0000\u03b8\u03b9\u0007\u000b\u0000\u0000\u03b9"+ + "@\u0001\u0000\u0000\u0000\u03ba\u03bb\u0007\u0011\u0000\u0000\u03bb\u03bc"+ + "\u0007\u0004\u0000\u0000\u03bc\u03bd\u0007\u000b\u0000\u0000\u03bd\u03be"+ + "\u0007\n\u0000\u0000\u03be\u03bf\u0007\u0014\u0000\u0000\u03bf\u03c0\u0007"+ + "\n\u0000\u0000\u03c0\u03c1\u0007\u000e\u0000\u0000\u03c1B\u0001\u0000"+ + "\u0000\u0000\u03c2\u03c3\u0007\u0011\u0000\u0000\u03c3\u03c4\u0007\u0006"+ + "\u0000\u0000\u03c4D\u0001\u0000\u0000\u0000\u03c5\u03c6\u0007\u0018\u0000"+ + "\u0000\u03c6\u03c7\u0007\t\u0000\u0000\u03c7\u03c8\u0007\u0011\u0000\u0000"+ + "\u03c8\u03c9\u0007\u0004\u0000\u0000\u03c9F\u0001\u0000\u0000\u0000\u03ca"+ + "\u03cb\u0007\u0003\u0000\u0000\u03cb\u03cc\u0007\u0002\u0000\u0000\u03cc"+ + "\u03cd\u0007\u0006\u0000\u0000\u03cd\u03ce\u0007\u000b\u0000\u0000\u03ce"+ + "H\u0001\u0000\u0000\u0000\u03cf\u03d0\u0007\u0003\u0000\u0000\u03d0\u03d1"+ + "\u0007\n\u0000\u0000\u03d1\u03d2\u0007\u0013\u0000\u0000\u03d2\u03d3\u0007"+ + "\u000b\u0000\u0000\u03d3J\u0001\u0000\u0000\u0000\u03d4\u03d5\u0007\u0003"+ + "\u0000\u0000\u03d5\u03d6\u0007\u0011\u0000\u0000\u03d6\u03d7\u0007\u0019"+ + "\u0000\u0000\u03d7\u03d8\u0007\n\u0000\u0000\u03d8L\u0001\u0000\u0000"+ + "\u0000\u03d9\u03da\u0007\u0003\u0000\u0000\u03da\u03db\u0007\u0011\u0000"+ + "\u0000\u03db\u03dc\u0007\u0010\u0000\u0000\u03dc\u03dd\u0007\u0011\u0000"+ + "\u0000\u03dd\u03de\u0007\u000b\u0000\u0000\u03deN\u0001\u0000\u0000\u0000"+ + "\u03df\u03e0\u0007\u0003\u0000\u0000\u03e0\u03e1\u0007\t\u0000\u0000\u03e1"+ + "\u03e2\u0007\u0004\u0000\u0000\u03e2\u03e3\u0007\u0014\u0000\u0000\u03e3"+ + "P\u0001\u0000\u0000\u0000\u03e4\u03e5\u0007\u0010\u0000\u0000\u03e5\u03e6"+ + "\u0007\u0002\u0000\u0000\u03e6\u03e7\u0007\u000b\u0000\u0000\u03e7\u03e8"+ + "\u0007\u0007\u0000\u0000\u03e8\u03e9\u0007\u0016\u0000\u0000\u03e9R\u0001"+ + "\u0000\u0000\u0000\u03ea\u03eb\u0007\u0004\u0000\u0000\u03eb\u03ec\u0007"+ + "\u0002\u0000\u0000\u03ec\u03ed\u0007\u000b\u0000\u0000\u03ed\u03ee\u0007"+ + "\u000f\u0000\u0000\u03ee\u03ef\u0007\u000e\u0000\u0000\u03ef\u03f0\u0007"+ + "\u0002\u0000\u0000\u03f0\u03f1\u0007\u0003\u0000\u0000\u03f1T\u0001\u0000"+ + "\u0000\u0000\u03f2\u03f3\u0007\u0010\u0000\u0000\u03f3\u03f4\u0007\u0011"+ + "\u0000\u0000\u03f4\u03f5\u0007\u0006\u0000\u0000\u03f5\u03f6\u0007\u0006"+ + "\u0000\u0000\u03f6\u03f7\u0007\u0011\u0000\u0000\u03f7\u03f8\u0007\u0004"+ + "\u0000\u0000\u03f8\u03f9\u0007\u0014\u0000\u0000\u03f9V\u0001\u0000\u0000"+ + "\u0000\u03fa\u03fb\u0007\u0004\u0000\u0000\u03fb\u03fc\u0007\t\u0000\u0000"+ + "\u03fc\u03fd\u0007\u000b\u0000\u0000\u03fdX\u0001\u0000\u0000\u0000\u03fe"+ + "\u03ff\u0007\u0004\u0000\u0000\u03ff\u0400\u0007\u000f\u0000\u0000\u0400"+ + "\u0401\u0007\u0003\u0000\u0000\u0401\u0402\u0007\u0003\u0000\u0000\u0402"+ + "Z\u0001\u0000\u0000\u0000\u0403\u0404\u0007\u0004\u0000\u0000\u0404\u0405"+ + "\u0007\u000f\u0000\u0000\u0405\u0406\u0007\u0003\u0000\u0000\u0406\u0407"+ + "\u0007\u0003\u0000\u0000\u0407\u0408\u0007\u0006\u0000\u0000\u0408\\\u0001"+ + "\u0000\u0000\u0000\u0409\u040a\u0007\t\u0000\u0000\u040a\u040b\u0007\u0004"+ + "\u0000\u0000\u040b^\u0001\u0000\u0000\u0000\u040c\u040d\u0007\t\u0000"+ + "\u0000\u040d\u040e\u0007\u000e\u0000\u0000\u040e`\u0001\u0000\u0000\u0000"+ + "\u040f\u0410\u0007\t\u0000\u0000\u0410\u0411\u0007\u000e\u0000\u0000\u0411"+ + "\u0412\u0007\u0005\u0000\u0000\u0412\u0413\u0007\n\u0000\u0000\u0413\u0414"+ + "\u0007\u000e\u0000\u0000\u0414b\u0001\u0000\u0000\u0000\u0415\u0416\u0007"+ + "\t\u0000\u0000\u0416\u0417\u0007\u000f\u0000\u0000\u0417\u0418\u0007\u000b"+ + "\u0000\u0000\u0418\u0419\u0007\n\u0000\u0000\u0419\u041a\u0007\u000e\u0000"+ + "\u0000\u041ad\u0001\u0000\u0000\u0000\u041b\u041c\u0007\t\u0000\u0000"+ + "\u041c\u041d\u0007\u0017\u0000\u0000\u041d\u041e\u0007\n\u0000\u0000\u041e"+ + "\u041f\u0007\u000e\u0000\u0000\u041ff\u0001\u0000\u0000\u0000\u0420\u0421"+ + "\u0007\u0015\u0000\u0000\u0421\u0422\u0007\u0002\u0000\u0000\u0422\u0423"+ + "\u0007\u000e\u0000\u0000\u0423\u0424\u0007\u000b\u0000\u0000\u0424\u0425"+ + "\u0007\u0011\u0000\u0000\u0425\u0426\u0007\u000b\u0000\u0000\u0426\u0427"+ + "\u0007\u0011\u0000\u0000\u0427\u0428\u0007\t\u0000\u0000\u0428\u0429\u0007"+ + "\u0004\u0000\u0000\u0429h\u0001\u0000\u0000\u0000\u042a\u042b\u0007\u000e"+ + "\u0000\u0000\u042b\u042c\u0007\n\u0000\u0000\u042c\u042d\u0007\u0014\u0000"+ + "\u0000\u042d\u042e\u0007\n\u0000\u0000\u042e\u042f\u0007\u0012\u0000\u0000"+ + "\u042f\u0430\u0007\u0015\u0000\u0000\u0430j\u0001\u0000\u0000\u0000\u0431"+ + "\u0432\u0007\u000e\u0000\u0000\u0432\u0433\u0007\u0011\u0000\u0000\u0433"+ + "\u0434\u0007\u0014\u0000\u0000\u0434\u0435\u0007\u0016\u0000\u0000\u0435"+ + "\u0436\u0007\u000b\u0000\u0000\u0436l\u0001\u0000\u0000\u0000\u0437\u0438"+ + "\u0007\u0006\u0000\u0000\u0438\u0439\u0007\n\u0000\u0000\u0439\u043a\u0007"+ + "\u0003\u0000\u0000\u043a\u043b\u0007\n\u0000\u0000\u043b\u043c\u0007\u0007"+ + "\u0000\u0000\u043c\u043d\u0007\u000b\u0000\u0000\u043dn\u0001\u0000\u0000"+ + "\u0000\u043e\u043f\u0007\u0006\u0000\u0000\u043f\u0440\u0007\u0016\u0000"+ + "\u0000\u0440\u0441\u0007\t\u0000\u0000\u0441\u0442\u0007\f\u0000\u0000"+ + "\u0442p\u0001\u0000\u0000\u0000\u0443\u0444\u0007\u0006\u0000\u0000\u0444"+ + "\u0445\u0007\u000b\u0000\u0000\u0445\u0446\u0007\u000e\u0000\u0000\u0446"+ + "\u0447\u0007\u0011\u0000\u0000\u0447\u0448\u0007\u0004\u0000\u0000\u0448"+ + "\u0449\u0007\u0014\u0000\u0000\u0449r\u0001\u0000\u0000\u0000\u044a\u044b"+ + "\u0007\u000b\u0000\u0000\u044b\u044c\u0007\u0016\u0000\u0000\u044c\u044d"+ + "\u0007\n\u0000\u0000\u044d\u044e\u0007\u0004\u0000\u0000\u044et\u0001"+ + "\u0000\u0000\u0000\u044f\u0450\u0007\u000b\u0000\u0000\u0450\u0451\u0007"+ + "\u000e\u0000\u0000\u0451\u0452\u0007\u000f\u0000\u0000\u0452\u0453\u0007"+ + "\n\u0000\u0000\u0453v\u0001\u0000\u0000\u0000\u0454\u0455\u0007\u000f"+ + "\u0000\u0000\u0455\u0456\u0007\u0004\u0000\u0000\u0456\u0457\u0007\u0011"+ + "\u0000\u0000\u0457\u0458\u0007\t\u0000\u0000\u0458\u0459\u0007\u0004\u0000"+ + "\u0000\u0459x\u0001\u0000\u0000\u0000\u045a\u045b\u0007\u000f\u0000\u0000"+ + "\u045b\u045c\u0007\u0006\u0000\u0000\u045c\u045d\u0007\u0011\u0000\u0000"+ + "\u045d\u045e\u0007\u0004\u0000\u0000\u045e\u045f\u0007\u0014\u0000\u0000"+ + "\u045fz\u0001\u0000\u0000\u0000\u0460\u0461\u0007\f\u0000\u0000\u0461"+ + "\u0462\u0007\u0016\u0000\u0000\u0462\u0463\u0007\n\u0000\u0000\u0463\u0464"+ + "\u0007\u0004\u0000\u0000\u0464|\u0001\u0000\u0000\u0000\u0465\u0466\u0007"+ + "\f\u0000\u0000\u0466\u0467\u0007\u0016\u0000\u0000\u0467\u0468\u0007\n"+ + "\u0000\u0000\u0468\u0469\u0007\u000e\u0000\u0000\u0469\u046a\u0007\n\u0000"+ + "\u0000\u046a~\u0001\u0000\u0000\u0000\u046b\u046c\u0007\u0010\u0000\u0000"+ + "\u046c\u046d\u0007\u0011\u0000\u0000\u046d\u046e\u0007\u0004\u0000\u0000"+ + "\u046e\u046f\u0007\u000f\u0000\u0000\u046f\u0470\u0007\u0006\u0000\u0000"+ + "\u0470\u0080\u0001\u0000\u0000\u0000\u0471\u0472\u0007\u0002\u0000\u0000"+ + "\u0472\u0473\u0007\u0017\u0000\u0000\u0473\u0474\u0007\u0014\u0000\u0000"+ + "\u0474\u0082\u0001\u0000\u0000\u0000\u0475\u0476\u0007\u0007\u0000\u0000"+ + "\u0476\u0477\u0007\t\u0000\u0000\u0477\u0478\u0007\u000f\u0000\u0000\u0478"+ + "\u0479\u0007\u0004\u0000\u0000\u0479\u047a\u0007\u000b\u0000\u0000\u047a"+ + "\u0084\u0001\u0000\u0000\u0000\u047b\u047c\u0007\u0010\u0000\u0000\u047c"+ + "\u047d\u0007\u0002\u0000\u0000\u047d\u047e\u0007\u0012\u0000\u0000\u047e"+ + "\u0086\u0001\u0000\u0000\u0000\u047f\u0480\u0007\u0010\u0000\u0000\u0480"+ + "\u0481\u0007\u0011\u0000\u0000\u0481\u0482\u0007\u0004\u0000\u0000\u0482"+ + "\u0088\u0001\u0000\u0000\u0000\u0483\u0484\u0007\u0006\u0000\u0000\u0484"+ + "\u0485\u0007\u000f\u0000\u0000\u0485\u0486\u0007\u0010\u0000\u0000\u0486"+ + "\u008a\u0001\u0000\u0000\u0000\u0487\u0488\u0007\u0017\u0000\u0000\u0488"+ + "\u0489\u0007\u0002\u0000\u0000\u0489\u048a\u0007\u000e\u0000\u0000\u048a"+ + "\u048b\u0005_\u0000\u0000\u048b\u048c\u0007\u0015\u0000\u0000\u048c\u048d"+ + "\u0007\t\u0000\u0000\u048d\u048e\u0007\u0015\u0000\u0000\u048e\u008c\u0001"+ + "\u0000\u0000\u0000\u048f\u0490\u0007\u0017\u0000\u0000\u0490\u0491\u0007"+ + "\u0002\u0000\u0000\u0491\u0492\u0007\u000e\u0000\u0000\u0492\u0493\u0005"+ + "_\u0000\u0000\u0493\u0494\u0007\u0006\u0000\u0000\u0494\u0495\u0007\u0002"+ + "\u0000\u0000\u0495\u0496\u0007\u0010\u0000\u0000\u0496\u0497\u0007\u0015"+ + "\u0000\u0000\u0497\u008e\u0001\u0000\u0000\u0000\u0498\u0499\u0007\u0017"+ + "\u0000\u0000\u0499\u049a\u0007\u0002\u0000\u0000\u049a\u049b\u0007\u000e"+ + "\u0000\u0000\u049b\u049c\u0007\u0011\u0000\u0000\u049c\u049d\u0007\u0002"+ + "\u0000\u0000\u049d\u049e\u0007\u0004\u0000\u0000\u049e\u049f\u0007\u0007"+ + "\u0000\u0000\u049f\u04a0\u0007\n\u0000\u0000\u04a0\u0090\u0001\u0000\u0000"+ + "\u0000\u04a1\u04a2\u0007\u0006\u0000\u0000\u04a2\u04a3\u0007\u000b\u0000"+ + "\u0000\u04a3\u04a4\u0007\u0005\u0000\u0000\u04a4\u0092\u0001\u0000\u0000"+ + "\u0000\u04a5\u04a6\u0007\u0006\u0000\u0000\u04a6\u04a7\u0007\u000b\u0000"+ + "\u0000\u04a7\u04a8\u0007\u0005\u0000\u0000\u04a8\u04a9\u0007\u0005\u0000"+ + "\u0000\u04a9\u04aa\u0007\n\u0000\u0000\u04aa\u04ab\u0007\u0017\u0000\u0000"+ + "\u04ab\u0094\u0001\u0000\u0000\u0000\u04ac\u04ad\u0007\u0006\u0000\u0000"+ + "\u04ad\u04ae\u0007\u000b\u0000\u0000\u04ae\u04af\u0007\u0005\u0000\u0000"+ + "\u04af\u04b0\u0007\u0005\u0000\u0000\u04b0\u04b1\u0007\n\u0000\u0000\u04b1"+ + "\u04b2\u0007\u0017\u0000\u0000\u04b2\u04b3\u0005_\u0000\u0000\u04b3\u04b4"+ + "\u0007\u0015\u0000\u0000\u04b4\u04b5\u0007\t\u0000\u0000\u04b5\u04b6\u0007"+ + "\u0015\u0000\u0000\u04b6\u0096\u0001\u0000\u0000\u0000\u04b7\u04b8\u0007"+ + "\u0006\u0000\u0000\u04b8\u04b9\u0007\u000b\u0000\u0000\u04b9\u04ba\u0007"+ + "\u0005\u0000\u0000\u04ba\u04bb\u0007\u0005\u0000\u0000\u04bb\u04bc\u0007"+ + "\n\u0000\u0000\u04bc\u04bd\u0007\u0017\u0000\u0000\u04bd\u04be\u0005_"+ + "\u0000\u0000\u04be\u04bf\u0007\u0006\u0000\u0000\u04bf\u04c0\u0007\u0002"+ + "\u0000\u0000\u04c0\u04c1\u0007\u0010\u0000\u0000\u04c1\u04c2\u0007\u0015"+ + "\u0000\u0000\u04c2\u0098\u0001\u0000\u0000\u0000\u04c3\u04c4\u0007\u0006"+ + "\u0000\u0000\u04c4\u04c5\u0007\u000f\u0000\u0000\u04c5\u04c6\u0007\b\u0000"+ + "\u0000\u04c6\u04c7\u0007\u0006\u0000\u0000\u04c7\u04c8\u0007\u000b\u0000"+ + "\u0000\u04c8\u04c9\u0007\u000e\u0000\u0000\u04c9\u04ca\u0007\u0011\u0000"+ + "\u0000\u04ca\u04cb\u0007\u0004\u0000\u0000\u04cb\u04cc\u0007\u0014\u0000"+ + "\u0000\u04cc\u009a\u0001\u0000\u0000\u0000\u04cd\u04ce\u0007\u000b\u0000"+ + "\u0000\u04ce\u04cf\u0007\u000e\u0000\u0000\u04cf\u04d0\u0007\u0011\u0000"+ + "\u0000\u04d0\u04d1\u0007\u0010\u0000\u0000\u04d1\u009c\u0001\u0000\u0000"+ + "\u0000\u04d2\u04d3\u0007\n\u0000\u0000\u04d3\u04d4\u0007\u0004\u0000\u0000"+ + "\u04d4\u04d5\u0007\u0005\u0000\u0000\u04d5\u009e\u0001\u0000\u0000\u0000"+ + "\u04d6\u04d7\u0007\u0013\u0000\u0000\u04d7\u04d8\u0007\u000f\u0000\u0000"+ + "\u04d8\u04d9\u0007\u0003\u0000\u0000\u04d9\u04da\u0007\u0003\u0000\u0000"+ + "\u04da\u00a0\u0001\u0000\u0000\u0000\u04db\u04dc\u0007\t\u0000\u0000\u04dc"+ + "\u04dd\u0007\u0013\u0000\u0000\u04dd\u04de\u0007\u0013\u0000\u0000\u04de"+ + "\u04df\u0007\u0006\u0000\u0000\u04df\u04e0\u0007\n\u0000\u0000\u04e0\u04e1"+ + "\u0007\u000b\u0000\u0000\u04e1\u00a2\u0001\u0000\u0000\u0000\u04e2\u04e3"+ + "\u0007\u0011\u0000\u0000\u04e3\u04e4\u0007\u0004\u0000\u0000\u04e4\u04e5"+ + "\u0007\u000b\u0000\u0000\u04e5\u04e6\u0007\n\u0000\u0000\u04e6\u04e7\u0007"+ + "\u000e\u0000\u0000\u04e7\u04e8\u0007\u0017\u0000\u0000\u04e8\u04e9\u0007"+ + "\u0002\u0000\u0000\u04e9\u04ea\u0007\u0003\u0000\u0000\u04ea\u00a4\u0001"+ + "\u0000\u0000\u0000\u04eb\u04ec\u0007\u0010\u0000\u0000\u04ec\u04ed\u0007"+ + "\u0011\u0000\u0000\u04ed\u04ee\u0007\u0007\u0000\u0000\u04ee\u04ef\u0007"+ + "\u000e\u0000\u0000\u04ef\u04f0\u0007\t\u0000\u0000\u04f0\u04f1\u0007\u0006"+ + "\u0000\u0000\u04f1\u04f2\u0007\n\u0000\u0000\u04f2\u04f3\u0007\u0007\u0000"+ + "\u0000\u04f3\u04f4\u0007\t\u0000\u0000\u04f4\u04f5\u0007\u0004\u0000\u0000"+ + "\u04f5\u04f6\u0007\u0005\u0000\u0000\u04f6\u00a6\u0001\u0000\u0000\u0000"+ + "\u04f7\u04f8\u0007\u0006\u0000\u0000\u04f8\u04f9\u0007\n\u0000\u0000\u04f9"+ + "\u04fa\u0007\u0007\u0000\u0000\u04fa\u04fb\u0007\t\u0000\u0000\u04fb\u04fc"+ + "\u0007\u0004\u0000\u0000\u04fc\u04fd\u0007\u0005\u0000\u0000\u04fd\u00a8"+ + "\u0001\u0000\u0000\u0000\u04fe\u04ff\u0007\u0010\u0000\u0000\u04ff\u0500"+ + "\u0007\u0011\u0000\u0000\u0500\u0501\u0007\u0004\u0000\u0000\u0501\u0502"+ + "\u0007\u000f\u0000\u0000\u0502\u0503\u0007\u000b\u0000\u0000\u0503\u0504"+ + "\u0007\n\u0000\u0000\u0504\u00aa\u0001\u0000\u0000\u0000\u0505\u0506\u0007"+ + "\u0016\u0000\u0000\u0506\u0507\u0007\t\u0000\u0000\u0507\u0508\u0007\u000f"+ + "\u0000\u0000\u0508\u0509\u0007\u000e\u0000\u0000\u0509\u00ac\u0001\u0000"+ + "\u0000\u0000\u050a\u050b\u0007\u0005\u0000\u0000\u050b\u050c\u0007\u0002"+ + "\u0000\u0000\u050c\u050d\u0007\r\u0000\u0000\u050d\u00ae\u0001\u0000\u0000"+ + "\u0000\u050e\u050f\u0007\f\u0000\u0000\u050f\u0510\u0007\n\u0000\u0000"+ + "\u0510\u0511\u0007\n\u0000\u0000\u0511\u0512\u0007\u0019\u0000\u0000\u0512"+ + "\u00b0\u0001\u0000\u0000\u0000\u0513\u0514\u0007\u0010\u0000\u0000\u0514"+ + "\u0515\u0007\t\u0000\u0000\u0515\u0516\u0007\u0004\u0000\u0000\u0516\u0517"+ + "\u0007\u000b\u0000\u0000\u0517\u0518\u0007\u0016\u0000\u0000\u0518\u00b2"+ + "\u0001\u0000\u0000\u0000\u0519\u051a\u0007\u001a\u0000\u0000\u051a\u051b"+ + "\u0007\u000f\u0000\u0000\u051b\u051c\u0007\u0002\u0000\u0000\u051c\u051d"+ + "\u0007\u000e\u0000\u0000\u051d\u051e\u0007\u000b\u0000\u0000\u051e\u051f"+ + "\u0007\n\u0000\u0000\u051f\u0520\u0007\u000e\u0000\u0000\u0520\u00b4\u0001"+ + "\u0000\u0000\u0000\u0521\u0522\u0007\r\u0000\u0000\u0522\u0523\u0007\n"+ + "\u0000\u0000\u0523\u0524\u0007\u0002\u0000\u0000\u0524\u0525\u0007\u000e"+ + "\u0000\u0000\u0525\u00b6\u0001\u0000\u0000\u0000\u0526\u0527\u0007\u0006"+ + "\u0000\u0000\u0527\u0528\u0007\n\u0000\u0000\u0528\u0529\u0007\u0007\u0000"+ + "\u0000\u0529\u052a\u0007\t\u0000\u0000\u052a\u052b\u0007\u0004\u0000\u0000"+ + "\u052b\u052c\u0007\u0005\u0000\u0000\u052c\u052d\u0005_\u0000\u0000\u052d"+ + "\u052e\u0007\u0010\u0000\u0000\u052e\u052f\u0007\u0011\u0000\u0000\u052f"+ + "\u0530\u0007\u0007\u0000\u0000\u0530\u0531\u0007\u000e\u0000\u0000\u0531"+ + "\u0532\u0007\t\u0000\u0000\u0532\u0533\u0007\u0006\u0000\u0000\u0533\u0534"+ + "\u0007\n\u0000\u0000\u0534\u0535\u0007\u0007\u0000\u0000\u0535\u0536\u0007"+ + "\t\u0000\u0000\u0536\u0537\u0007\u0004\u0000\u0000\u0537\u0538\u0007\u0005"+ + "\u0000\u0000\u0538\u00b8\u0001\u0000\u0000\u0000\u0539\u053a\u0007\u0010"+ + "\u0000\u0000\u053a\u053b\u0007\u0011\u0000\u0000\u053b\u053c\u0007\u0004"+ + "\u0000\u0000\u053c\u053d\u0007\u000f\u0000\u0000\u053d\u053e\u0007\u000b"+ + "\u0000\u0000\u053e\u053f\u0007\n\u0000\u0000\u053f\u0540\u0005_\u0000"+ + "\u0000\u0540\u0541\u0007\u0010\u0000\u0000\u0541\u0542\u0007\u0011\u0000"+ + "\u0000\u0542\u0543\u0007\u0007\u0000\u0000\u0543\u0544\u0007\u000e\u0000"+ + "\u0000\u0544\u0545\u0007\t\u0000\u0000\u0545\u0546\u0007\u0006\u0000\u0000"+ + "\u0546\u0547\u0007\n\u0000\u0000\u0547\u0548\u0007\u0007\u0000\u0000\u0548"+ + "\u0549\u0007\t\u0000\u0000\u0549\u054a\u0007\u0004\u0000\u0000\u054a\u054b"+ + "\u0007\u0005\u0000\u0000\u054b\u00ba\u0001\u0000\u0000\u0000\u054c\u054d"+ + "\u0007\u0010\u0000\u0000\u054d\u054e\u0007\u0011\u0000\u0000\u054e\u054f"+ + "\u0007\u0004\u0000\u0000\u054f\u0550\u0007\u000f\u0000\u0000\u0550\u0551"+ + "\u0007\u000b\u0000\u0000\u0551\u0552\u0007\n\u0000\u0000\u0552\u0553\u0005"+ + "_\u0000\u0000\u0553\u0554\u0007\u0006\u0000\u0000\u0554\u0555\u0007\n"+ + "\u0000\u0000\u0555\u0556\u0007\u0007\u0000\u0000\u0556\u0557\u0007\t\u0000"+ + "\u0000\u0557\u0558\u0007\u0004\u0000\u0000\u0558\u0559\u0007\u0005\u0000"+ + "\u0000\u0559\u00bc\u0001\u0000\u0000\u0000\u055a\u055b\u0007\u0016\u0000"+ + "\u0000\u055b\u055c\u0007\t\u0000\u0000\u055c\u055d\u0007\u000f\u0000\u0000"+ + "\u055d\u055e\u0007\u000e\u0000\u0000\u055e\u055f\u0005_\u0000\u0000\u055f"+ + "\u0560\u0007\u0010\u0000\u0000\u0560\u0561\u0007\u0011\u0000\u0000\u0561"+ + "\u0562\u0007\u0007\u0000\u0000\u0562\u0563\u0007\u000e\u0000\u0000\u0563"+ + "\u0564\u0007\t\u0000\u0000\u0564\u0565\u0007\u0006\u0000\u0000\u0565\u0566"+ + "\u0007\n\u0000\u0000\u0566\u0567\u0007\u0007\u0000\u0000\u0567\u0568\u0007"+ + "\t\u0000\u0000\u0568\u0569\u0007\u0004\u0000\u0000\u0569\u056a\u0007\u0005"+ + "\u0000\u0000\u056a\u00be\u0001\u0000\u0000\u0000\u056b\u056c\u0007\u0016"+ + "\u0000\u0000\u056c\u056d\u0007\t\u0000\u0000\u056d\u056e\u0007\u000f\u0000"+ + "\u0000\u056e\u056f\u0007\u000e\u0000\u0000\u056f\u0570\u0005_\u0000\u0000"+ + "\u0570\u0571\u0007\u0006\u0000\u0000\u0571\u0572\u0007\n\u0000\u0000\u0572"+ + "\u0573\u0007\u0007\u0000\u0000\u0573\u0574\u0007\t\u0000\u0000\u0574\u0575"+ + "\u0007\u0004\u0000\u0000\u0575\u0576\u0007\u0005\u0000\u0000\u0576\u00c0"+ + "\u0001\u0000\u0000\u0000\u0577\u0578\u0007\u0016\u0000\u0000\u0578\u0579"+ + "\u0007\t\u0000\u0000\u0579\u057a\u0007\u000f\u0000\u0000\u057a\u057b\u0007"+ + "\u000e\u0000\u0000\u057b\u057c\u0005_\u0000\u0000\u057c\u057d\u0007\u0010"+ + "\u0000\u0000\u057d\u057e\u0007\u0011\u0000\u0000\u057e\u057f\u0007\u0004"+ + "\u0000\u0000\u057f\u0580\u0007\u000f\u0000\u0000\u0580\u0581\u0007\u000b"+ + "\u0000\u0000\u0581\u0582\u0007\n\u0000\u0000\u0582\u00c2\u0001\u0000\u0000"+ + "\u0000\u0583\u0584\u0007\u0005\u0000\u0000\u0584\u0585\u0007\u0002\u0000"+ + "\u0000\u0585\u0586\u0007\r\u0000\u0000\u0586\u0587\u0005_\u0000\u0000"+ + "\u0587\u0588\u0007\u0010\u0000\u0000\u0588\u0589\u0007\u0011\u0000\u0000"+ + "\u0589\u058a\u0007\u0007\u0000\u0000\u058a\u058b\u0007\u000e\u0000\u0000"+ + "\u058b\u058c\u0007\t\u0000\u0000\u058c\u058d\u0007\u0006\u0000\u0000\u058d"+ + "\u058e\u0007\n\u0000\u0000\u058e\u058f\u0007\u0007\u0000\u0000\u058f\u0590"+ + "\u0007\t\u0000\u0000\u0590\u0591\u0007\u0004\u0000\u0000\u0591\u0592\u0007"+ + "\u0005\u0000\u0000\u0592\u00c4\u0001\u0000\u0000\u0000\u0593\u0594\u0007"+ + "\u0005\u0000\u0000\u0594\u0595\u0007\u0002\u0000\u0000\u0595\u0596\u0007"+ + "\r\u0000\u0000\u0596\u0597\u0005_\u0000\u0000\u0597\u0598\u0007\u0006"+ + "\u0000\u0000\u0598\u0599\u0007\n\u0000\u0000\u0599\u059a\u0007\u0007\u0000"+ + "\u0000\u059a\u059b\u0007\t\u0000\u0000\u059b\u059c\u0007\u0004\u0000\u0000"+ + "\u059c\u059d\u0007\u0005\u0000\u0000\u059d\u00c6\u0001\u0000\u0000\u0000"+ + "\u059e\u059f\u0007\u0005\u0000\u0000\u059f\u05a0\u0007\u0002\u0000\u0000"+ + "\u05a0\u05a1\u0007\r\u0000\u0000\u05a1\u05a2\u0005_\u0000\u0000\u05a2"+ + "\u05a3\u0007\u0010\u0000\u0000\u05a3\u05a4\u0007\u0011\u0000\u0000\u05a4"+ + "\u05a5\u0007\u0004\u0000\u0000\u05a5\u05a6\u0007\u000f\u0000\u0000\u05a6"+ + "\u05a7\u0007\u000b\u0000\u0000\u05a7\u05a8\u0007\n\u0000\u0000\u05a8\u00c8"+ + "\u0001\u0000\u0000\u0000\u05a9\u05aa\u0007\u0005\u0000\u0000\u05aa\u05ab"+ + "\u0007\u0002\u0000\u0000\u05ab\u05ac\u0007\r\u0000\u0000\u05ac\u05ad\u0005"+ + "_\u0000\u0000\u05ad\u05ae\u0007\u0016\u0000\u0000\u05ae\u05af\u0007\t"+ + "\u0000\u0000\u05af\u05b0\u0007\u000f\u0000\u0000\u05b0\u05b1\u0007\u000e"+ + "\u0000\u0000\u05b1\u00ca\u0001\u0000\u0000\u0000\u05b2\u05b3\u0007\r\u0000"+ + "\u0000\u05b3\u05b4\u0007\n\u0000\u0000\u05b4\u05b5\u0007\u0002\u0000\u0000"+ + "\u05b5\u05b6\u0007\u000e\u0000\u0000\u05b6\u05b7\u0005_\u0000\u0000\u05b7"+ + "\u05b8\u0007\u0010\u0000\u0000\u05b8\u05b9\u0007\t\u0000\u0000\u05b9\u05ba"+ + "\u0007\u0004\u0000\u0000\u05ba\u05bb\u0007\u000b\u0000\u0000\u05bb\u05bc"+ + "\u0007\u0016\u0000\u0000\u05bc\u00cc\u0001\u0000\u0000\u0000\u05bd\u05be"+ + "\u0007\u000b\u0000\u0000\u05be\u05bf\u0007\u0002\u0000\u0000\u05bf\u05c0"+ + "\u0007\b\u0000\u0000\u05c0\u05c1\u0007\u0003\u0000\u0000\u05c1\u05c2\u0007"+ + "\n\u0000\u0000\u05c2\u05c3\u0007\u0006\u0000\u0000\u05c3\u00ce\u0001\u0000"+ + "\u0000\u0000\u05c4\u05c5\u0007\u0002\u0000\u0000\u05c5\u05c6\u0007\b\u0000"+ + "\u0000\u05c6\u05c7\u0007\u0006\u0000\u0000\u05c7\u00d0\u0001\u0000\u0000"+ + "\u0000\u05c8\u05c9\u0007\u0002\u0000\u0000\u05c9\u05ca\u0007\u0007\u0000"+ + "\u0000\u05ca\u05cb\u0007\t\u0000\u0000\u05cb\u05cc\u0007\u0006\u0000\u0000"+ + "\u05cc\u00d2\u0001\u0000\u0000\u0000\u05cd\u05ce\u0007\u0002\u0000\u0000"+ + "\u05ce\u05cf\u0007\u0005\u0000\u0000\u05cf\u05d0\u0007\u0005\u0000\u0000"+ + "\u05d0\u00d4\u0001\u0000\u0000\u0000\u05d1\u05d2\u0007\u0002\u0000\u0000"+ + "\u05d2\u05d3\u0007\u0005\u0000\u0000\u05d3\u05d4\u0007\u0005\u0000\u0000"+ + "\u05d4\u05d5\u0007\u000b\u0000\u0000\u05d5\u05d6\u0007\u0011\u0000\u0000"+ + "\u05d6\u05d7\u0007\u0010\u0000\u0000\u05d7\u05d8\u0007\n\u0000\u0000\u05d8"+ + "\u00d6\u0001\u0000\u0000\u0000\u05d9\u05da\u0007\u0002\u0000\u0000\u05da"+ + "\u05db\u0007\u0006\u0000\u0000\u05db\u05dc\u0007\u0007\u0000\u0000\u05dc"+ + "\u05dd\u0007\u0011\u0000\u0000\u05dd\u05de\u0007\u0011\u0000\u0000\u05de"+ + "\u00d8\u0001\u0000\u0000\u0000\u05df\u05e0\u0007\u0002\u0000\u0000\u05e0"+ + "\u05e1\u0007\u0006\u0000\u0000\u05e1\u05e2\u0007\u0011\u0000\u0000\u05e2"+ + "\u05e3\u0007\u0004\u0000\u0000\u05e3\u00da\u0001\u0000\u0000\u0000\u05e4"+ + "\u05e5\u0007\u0002\u0000\u0000\u05e5\u05e6\u0007\u000b\u0000\u0000\u05e6"+ + "\u05e7\u0007\u0002\u0000\u0000\u05e7\u05e8\u0007\u0004\u0000\u0000\u05e8"+ + "\u00dc\u0001\u0000\u0000\u0000\u05e9\u05ea\u0007\u0002\u0000\u0000\u05ea"+ + "\u05eb\u0007\u000b\u0000\u0000\u05eb\u05ec\u0007\u0002\u0000\u0000\u05ec"+ + "\u05ed\u0007\u0004\u0000\u0000\u05ed\u05ee\u00052\u0000\u0000\u05ee\u00de"+ + "\u0001\u0000\u0000\u0000\u05ef\u05f0\u0007\u0007\u0000\u0000\u05f0\u05f1"+ + "\u0007\b\u0000\u0000\u05f1\u05f2\u0007\u000e\u0000\u0000\u05f2\u05f3\u0007"+ + "\u000b\u0000\u0000\u05f3\u00e0\u0001\u0000\u0000\u0000\u05f4\u05f5\u0007"+ + "\u0007\u0000\u0000\u05f5\u05f6\u0007\n\u0000\u0000\u05f6\u05f7\u0007\u0011"+ + "\u0000\u0000\u05f7\u05f8\u0007\u0003\u0000\u0000\u05f8\u00e2\u0001\u0000"+ + "\u0000\u0000\u05f9\u05fa\u0007\u0007\u0000\u0000\u05fa\u05fb\u0007\n\u0000"+ + "\u0000\u05fb\u05fc\u0007\u0011\u0000\u0000\u05fc\u05fd\u0007\u0003\u0000"+ + "\u0000\u05fd\u05fe\u0007\u0011\u0000\u0000\u05fe\u05ff\u0007\u0004\u0000"+ + "\u0000\u05ff\u0600\u0007\u0014\u0000\u0000\u0600\u00e4\u0001\u0000\u0000"+ + "\u0000\u0601\u0602\u0007\u0007\u0000\u0000\u0602\u0603\u0007\t\u0000\u0000"+ + "\u0603\u0604\u0007\u0004\u0000\u0000\u0604\u0605\u0007\u0007\u0000\u0000"+ + "\u0605\u0606\u0007\u0002\u0000\u0000\u0606\u0607\u0007\u000b\u0000\u0000"+ + "\u0607\u00e6\u0001\u0000\u0000\u0000\u0608\u0609\u0007\u0007\u0000\u0000"+ + "\u0609\u060a\u0007\t\u0000\u0000\u060a\u060b\u0007\u0004\u0000\u0000\u060b"+ + "\u060c\u0007\u0007\u0000\u0000\u060c\u060d\u0007\u0002\u0000\u0000\u060d"+ + "\u060e\u0007\u000b\u0000\u0000\u060e\u060f\u0005_\u0000\u0000\u060f\u0610"+ + "\u0007\f\u0000\u0000\u0610\u0611\u0007\u0006\u0000\u0000\u0611\u00e8\u0001"+ + "\u0000\u0000\u0000\u0612\u0613\u0007\u0007\u0000\u0000\u0613\u0614\u0007"+ + "\t\u0000\u0000\u0614\u0615\u0007\u0004\u0000\u0000\u0615\u0616\u0007\u0017"+ + "\u0000\u0000\u0616\u00ea\u0001\u0000\u0000\u0000\u0617\u0618\u0007\u0007"+ + "\u0000\u0000\u0618\u0619\u0007\t\u0000\u0000\u0619\u061a\u0007\u0004\u0000"+ + "\u0000\u061a\u061b\u0007\u0017\u0000\u0000\u061b\u061c\u0007\n\u0000\u0000"+ + "\u061c\u061d\u0007\u000e\u0000\u0000\u061d\u061e\u0007\u000b\u0000\u0000"+ + "\u061e\u061f\u0005_\u0000\u0000\u061f\u0620\u0007\u000b\u0000\u0000\u0620"+ + "\u0621\u0007\u001b\u0000\u0000\u0621\u00ec\u0001\u0000\u0000\u0000\u0622"+ + "\u0623\u0007\u0007\u0000\u0000\u0623\u0624\u0007\t\u0000\u0000\u0624\u0625"+ + "\u0007\u0006\u0000\u0000\u0625\u00ee\u0001\u0000\u0000\u0000\u0626\u0627"+ + "\u0007\u0007\u0000\u0000\u0627\u0628\u0007\t\u0000\u0000\u0628\u0629\u0007"+ + "\u0006\u0000\u0000\u0629\u062a\u0007\u0016\u0000\u0000\u062a\u00f0\u0001"+ + "\u0000\u0000\u0000\u062b\u062c\u0007\u0007\u0000\u0000\u062c\u062d\u0007"+ + "\t\u0000\u0000\u062d\u062e\u0007\u000b\u0000\u0000\u062e\u00f2\u0001\u0000"+ + "\u0000\u0000\u062f\u0630\u0007\u0007\u0000\u0000\u0630\u0631\u0007\u000e"+ + "\u0000\u0000\u0631\u0632\u0007\u0007\u0000\u0000\u0632\u0633\u00053\u0000"+ + "\u0000\u0633\u0634\u00052\u0000\u0000\u0634\u00f4\u0001\u0000\u0000\u0000"+ + "\u0635\u0636\u0007\u0007\u0000\u0000\u0636\u0637\u0007\u000f\u0000\u0000"+ + "\u0637\u0638\u0007\u000e\u0000\u0000\u0638\u0639\u0007\u0005\u0000\u0000"+ + "\u0639\u063a\u0007\u0002\u0000\u0000\u063a\u063b\u0007\u000b\u0000\u0000"+ + "\u063b\u063c\u0007\n\u0000\u0000\u063c\u00f6\u0001\u0000\u0000\u0000\u063d"+ + "\u063e\u0007\u0007\u0000\u0000\u063e\u063f\u0007\u000f\u0000\u0000\u063f"+ + "\u0640\u0007\u000e\u0000\u0000\u0640\u0641\u0007\u000b\u0000\u0000\u0641"+ + "\u0642\u0007\u0011\u0000\u0000\u0642\u0643\u0007\u0010\u0000\u0000\u0643"+ + "\u0644\u0007\n\u0000\u0000\u0644\u00f8\u0001\u0000\u0000\u0000\u0645\u0646"+ + "\u0007\u0007\u0000\u0000\u0646\u0647\u0007\u000f\u0000\u0000\u0647\u0648"+ + "\u0007\u000e\u0000\u0000\u0648\u0649\u0007\u000e\u0000\u0000\u0649\u064a"+ + "\u0007\n\u0000\u0000\u064a\u064b\u0007\u0004\u0000\u0000\u064b\u064c\u0007"+ + "\u000b\u0000\u0000\u064c\u064d\u0005_\u0000\u0000\u064d\u064e\u0007\u0005"+ + "\u0000\u0000\u064e\u064f\u0007\u0002\u0000\u0000\u064f\u0650\u0007\u000b"+ + "\u0000\u0000\u0650\u0651\u0007\n\u0000\u0000\u0651\u00fa\u0001\u0000\u0000"+ + "\u0000\u0652\u0653\u0007\u0007\u0000\u0000\u0653\u0654\u0007\u000f\u0000"+ + "\u0000\u0654\u0655\u0007\u000e\u0000\u0000\u0655\u0656\u0007\u000e\u0000"+ + "\u0000\u0656\u0657\u0007\n\u0000\u0000\u0657\u0658\u0007\u0004\u0000\u0000"+ + "\u0658\u0659\u0007\u000b\u0000\u0000\u0659\u065a\u0005_\u0000\u0000\u065a"+ + "\u065b\u0007\u000b\u0000\u0000\u065b\u065c\u0007\u0011\u0000\u0000\u065c"+ + "\u065d\u0007\u0010\u0000\u0000\u065d\u065e\u0007\n\u0000\u0000\u065e\u00fc"+ + "\u0001\u0000\u0000\u0000\u065f\u0660\u0007\u0007\u0000\u0000\u0660\u0661"+ + "\u0007\u000f\u0000\u0000\u0661\u0662\u0007\u000e\u0000\u0000\u0662\u0663"+ + "\u0007\u000e\u0000\u0000\u0663\u0664\u0007\n\u0000\u0000\u0664\u0665\u0007"+ + "\u0004\u0000\u0000\u0665\u0666\u0007\u000b\u0000\u0000\u0666\u0667\u0005"+ + "_\u0000\u0000\u0667\u0668\u0007\u000b\u0000\u0000\u0668\u0669\u0007\u0011"+ + "\u0000\u0000\u0669\u066a\u0007\u0010\u0000\u0000\u066a\u066b\u0007\n\u0000"+ + "\u0000\u066b\u066c\u0007\u0006\u0000\u0000\u066c\u066d\u0007\u000b\u0000"+ + "\u0000\u066d\u066e\u0007\u0002\u0000\u0000\u066e\u066f\u0007\u0010\u0000"+ + "\u0000\u066f\u0670\u0007\u0015\u0000\u0000\u0670\u00fe\u0001\u0000\u0000"+ + "\u0000\u0671\u0672\u0007\u0005\u0000\u0000\u0672\u0673\u0007\u0002\u0000"+ + "\u0000\u0673\u0674\u0007\u000b\u0000\u0000\u0674\u0675\u0007\n\u0000\u0000"+ + "\u0675\u0100\u0001\u0000\u0000\u0000\u0676\u0677\u0007\u0005\u0000\u0000"+ + "\u0677\u0678\u0007\u0002\u0000\u0000\u0678\u0679\u0007\u000b\u0000\u0000"+ + "\u0679\u067a\u0007\n\u0000\u0000\u067a\u067b\u0005_\u0000\u0000\u067b"+ + "\u067c\u0007\u0002\u0000\u0000\u067c\u067d\u0007\u0005\u0000\u0000\u067d"+ + "\u067e\u0007\u0005\u0000\u0000\u067e\u0102\u0001\u0000\u0000\u0000\u067f"+ + "\u0680\u0007\u0005\u0000\u0000\u0680\u0681\u0007\u0002\u0000\u0000\u0681"+ + "\u0682\u0007\u000b\u0000\u0000\u0682\u0683\u0007\n\u0000\u0000\u0683\u0684"+ + "\u0005_\u0000\u0000\u0684\u0685\u0007\u0013\u0000\u0000\u0685\u0686\u0007"+ + "\t\u0000\u0000\u0686\u0687\u0007\u000e\u0000\u0000\u0687\u0688\u0007\u0010"+ + "\u0000\u0000\u0688\u0689\u0007\u0002\u0000\u0000\u0689\u068a\u0007\u000b"+ + "\u0000\u0000\u068a\u0104\u0001\u0000\u0000\u0000\u068b\u068c\u0007\u0005"+ + "\u0000\u0000\u068c\u068d\u0007\u0002\u0000\u0000\u068d\u068e\u0007\u000b"+ + "\u0000\u0000\u068e\u068f\u0007\n\u0000\u0000\u068f\u0690\u0005_\u0000"+ + "\u0000\u0690\u0691\u0007\u0006\u0000\u0000\u0691\u0692\u0007\u000f\u0000"+ + "\u0000\u0692\u0693\u0007\b\u0000\u0000\u0693\u0106\u0001\u0000\u0000\u0000"+ + "\u0694\u0695\u0007\u0005\u0000\u0000\u0695\u0696\u0007\u0002\u0000\u0000"+ + "\u0696\u0697\u0007\u000b\u0000\u0000\u0697\u0698\u0007\n\u0000\u0000\u0698"+ + "\u0699\u0007\u0005\u0000\u0000\u0699\u069a\u0007\u0011\u0000\u0000\u069a"+ + "\u069b\u0007\u0013\u0000\u0000\u069b\u069c\u0007\u0013\u0000\u0000\u069c"+ + "\u0108\u0001\u0000\u0000\u0000\u069d\u069e\u0007\u0005\u0000\u0000\u069e"+ + "\u069f\u0007\u0002\u0000\u0000\u069f\u06a0\u0007\r\u0000\u0000\u06a0\u06a1"+ + "\u0007\u0004\u0000\u0000\u06a1\u06a2\u0007\u0002\u0000\u0000\u06a2\u06a3"+ + "\u0007\u0010\u0000\u0000\u06a3\u06a4\u0007\n\u0000\u0000\u06a4\u010a\u0001"+ + "\u0000\u0000\u0000\u06a5\u06a6\u0007\u0005\u0000\u0000\u06a6\u06a7\u0007"+ + "\u0002\u0000\u0000\u06a7\u06a8\u0007\r\u0000\u0000\u06a8\u06a9\u0007\t"+ + "\u0000\u0000\u06a9\u06aa\u0007\u0013\u0000\u0000\u06aa\u06ab\u0007\u0010"+ + "\u0000\u0000\u06ab\u06ac\u0007\t\u0000\u0000\u06ac\u06ad\u0007\u0004\u0000"+ + "\u0000\u06ad\u06ae\u0007\u000b\u0000\u0000\u06ae\u06af\u0007\u0016\u0000"+ + "\u0000\u06af\u010c\u0001\u0000\u0000\u0000\u06b0\u06b1\u0007\u0005\u0000"+ + "\u0000\u06b1\u06b2\u0007\u0002\u0000\u0000\u06b2\u06b3\u0007\r\u0000\u0000"+ + "\u06b3\u06b4\u0007\t\u0000\u0000\u06b4\u06b5\u0007\u0013\u0000\u0000\u06b5"+ + "\u06b6\u0007\f\u0000\u0000\u06b6\u06b7\u0007\n\u0000\u0000\u06b7\u06b8"+ + "\u0007\n\u0000\u0000\u06b8\u06b9\u0007\u0019\u0000\u0000\u06b9\u010e\u0001"+ + "\u0000\u0000\u0000\u06ba\u06bb\u0007\u0005\u0000\u0000\u06bb\u06bc\u0007"+ + "\u0002\u0000\u0000\u06bc\u06bd\u0007\r\u0000\u0000\u06bd\u06be\u0007\t"+ + "\u0000\u0000\u06be\u06bf\u0007\u0013\u0000\u0000\u06bf\u06c0\u0007\r\u0000"+ + "\u0000\u06c0\u06c1\u0007\n\u0000\u0000\u06c1\u06c2\u0007\u0002\u0000\u0000"+ + "\u06c2\u06c3\u0007\u000e\u0000\u0000\u06c3\u0110\u0001\u0000\u0000\u0000"+ + "\u06c4\u06c5\u0007\u0005\u0000\u0000\u06c5\u06c6\u0007\n\u0000\u0000\u06c6"+ + "\u06c7\u0007\u0014\u0000\u0000\u06c7\u06c8\u0007\u000e\u0000\u0000\u06c8"+ + "\u06c9\u0007\n\u0000\u0000\u06c9\u06ca\u0007\n\u0000\u0000\u06ca\u06cb"+ + "\u0007\u0006\u0000\u0000\u06cb\u0112\u0001\u0000\u0000\u0000\u06cc\u06cd"+ + "\u0007\u0005\u0000\u0000\u06cd\u06ce\u0007\u0011\u0000\u0000\u06ce\u06cf"+ + "\u0007\u0017\u0000\u0000\u06cf\u06d0\u0007\u0011\u0000\u0000\u06d0\u06d1"+ + "\u0007\u0005\u0000\u0000\u06d1\u06d2\u0007\n\u0000\u0000\u06d2\u0114\u0001"+ + "\u0000\u0000\u0000\u06d3\u06d4\u0007\n\u0000\u0000\u06d4\u0116\u0001\u0000"+ + "\u0000\u0000\u06d5\u06d6\u0007\n\u0000\u0000\u06d6\u06d7\u0007\u0012\u0000"+ + "\u0000\u06d7\u06d8\u0007\u0015\u0000\u0000\u06d8\u0118\u0001\u0000\u0000"+ + "\u0000\u06d9\u06da\u0007\n\u0000\u0000\u06da\u06db\u0007\u0012\u0000\u0000"+ + "\u06db\u06dc\u0007\u0015\u0000\u0000\u06dc\u06dd\u0007\u0010\u0000\u0000"+ + "\u06dd\u06de\u00051\u0000\u0000\u06de\u011a\u0001\u0000\u0000\u0000\u06df"+ + "\u06e0\u0007\n\u0000\u0000\u06e0\u06e1\u0007\u0012\u0000\u0000\u06e1\u06e2"+ + "\u0007\u000b\u0000\u0000\u06e2\u06e3\u0007\u000e\u0000\u0000\u06e3\u06e4"+ + "\u0007\u0002\u0000\u0000\u06e4\u06e5\u0007\u0007\u0000\u0000\u06e5\u06e6"+ + "\u0007\u000b\u0000\u0000\u06e6\u011c\u0001\u0000\u0000\u0000\u06e7\u06e8"+ + "\u0007\u0013\u0000\u0000\u06e8\u06e9\u0007\u0003\u0000\u0000\u06e9\u06ea"+ + "\u0007\t\u0000\u0000\u06ea\u06eb\u0007\t\u0000\u0000\u06eb\u06ec\u0007"+ + "\u000e\u0000\u0000\u06ec\u011e\u0001\u0000\u0000\u0000\u06ed\u06ee\u0007"+ + "\u0013\u0000\u0000\u06ee\u06ef\u0007\u000e\u0000\u0000\u06ef\u06f0\u0007"+ + "\t\u0000\u0000\u06f0\u06f1\u0007\u0010\u0000\u0000\u06f1\u06f2\u0005_"+ + "\u0000\u0000\u06f2\u06f3\u0007\u0005\u0000\u0000\u06f3\u06f4\u0007\u0002"+ + "\u0000\u0000\u06f4\u06f5\u0007\r\u0000\u0000\u06f5\u06f6\u0007\u0006\u0000"+ + "\u0000\u06f6\u0120\u0001\u0000\u0000\u0000\u06f7\u06f8\u0007\u0013\u0000"+ + "\u0000\u06f8\u06f9\u0007\u000e\u0000\u0000\u06f9\u06fa\u0007\t\u0000\u0000"+ + "\u06fa\u06fb\u0007\u0010\u0000\u0000\u06fb\u06fc\u0005_\u0000\u0000\u06fc"+ + "\u06fd\u0007\u000f\u0000\u0000\u06fd\u06fe\u0007\u0004\u0000\u0000\u06fe"+ + "\u06ff\u0007\u0011\u0000\u0000\u06ff\u0700\u0007\u0012\u0000\u0000\u0700"+ + "\u0701\u0007\u000b\u0000\u0000\u0701\u0702\u0007\u0011\u0000\u0000\u0702"+ + "\u0703\u0007\u0010\u0000\u0000\u0703\u0704\u0007\n\u0000\u0000\u0704\u0122"+ + "\u0001\u0000\u0000\u0000\u0705\u0706\u0007\u0014\u0000\u0000\u0706\u0707"+ + "\u0007\n\u0000\u0000\u0707\u0708\u0007\u000b\u0000\u0000\u0708\u0709\u0005"+ + "_\u0000\u0000\u0709\u070a\u0007\u0013\u0000\u0000\u070a\u070b\u0007\t"+ + "\u0000\u0000\u070b\u070c\u0007\u000e\u0000\u0000\u070c\u070d\u0007\u0010"+ + "\u0000\u0000\u070d\u070e\u0007\u0002\u0000\u0000\u070e\u070f\u0007\u000b"+ + "\u0000\u0000\u070f\u0124\u0001\u0000\u0000\u0000\u0710\u0711\u0007\u0011"+ + "\u0000\u0000\u0711\u0712\u0007\u0013\u0000\u0000\u0712\u0126\u0001\u0000"+ + "\u0000\u0000\u0713\u0714\u0007\u0011\u0000\u0000\u0714\u0715\u0007\u0013"+ + "\u0000\u0000\u0715\u0716\u0007\u0004\u0000\u0000\u0716\u0717\u0007\u000f"+ + "\u0000\u0000\u0717\u0718\u0007\u0003\u0000\u0000\u0718\u0719\u0007\u0003"+ + "\u0000\u0000\u0719\u0128\u0001\u0000\u0000\u0000\u071a\u071b\u0007\u0011"+ + "\u0000\u0000\u071b\u071c\u0007\u0006\u0000\u0000\u071c\u071d\u0007\u0004"+ + "\u0000\u0000\u071d\u071e\u0007\u000f\u0000\u0000\u071e\u071f\u0007\u0003"+ + "\u0000\u0000\u071f\u0720\u0007\u0003\u0000\u0000\u0720\u012a\u0001\u0000"+ + "\u0000\u0000\u0721\u0722\u0007\u0003\u0000\u0000\u0722\u0723\u0007\u0002"+ + "\u0000\u0000\u0723\u0724\u0007\u0006\u0000\u0000\u0724\u0725\u0007\u000b"+ + "\u0000\u0000\u0725\u0726\u0005_\u0000\u0000\u0726\u0727\u0007\u0005\u0000"+ + "\u0000\u0727\u0728\u0007\u0002\u0000\u0000\u0728\u0729\u0007\r\u0000\u0000"+ + "\u0729\u012c\u0001\u0000\u0000\u0000\u072a\u072b\u0007\u0003\u0000\u0000"+ + "\u072b\u072c\u0007\n\u0000\u0000\u072c\u072d\u0007\u0004\u0000\u0000\u072d"+ + "\u072e\u0007\u0014\u0000\u0000\u072e\u072f\u0007\u000b\u0000\u0000\u072f"+ + "\u0730\u0007\u0016\u0000\u0000\u0730\u012e\u0001\u0000\u0000\u0000\u0731"+ + "\u0732\u0007\u0003\u0000\u0000\u0732\u0733\u0007\u0004\u0000\u0000\u0733"+ + "\u0130\u0001\u0000\u0000\u0000\u0734\u0735\u0007\u0003\u0000\u0000\u0735"+ + "\u0736\u0007\t\u0000\u0000\u0736\u0737\u0007\u0007\u0000\u0000\u0737\u0738"+ + "\u0007\u0002\u0000\u0000\u0738\u0739\u0007\u0003\u0000\u0000\u0739\u073a"+ + "\u0007\u000b\u0000\u0000\u073a\u073b\u0007\u0011\u0000\u0000\u073b\u073c"+ + "\u0007\u0010\u0000\u0000\u073c\u073d\u0007\n\u0000\u0000\u073d\u0132\u0001"+ + "\u0000\u0000\u0000\u073e\u073f\u0007\u0003\u0000\u0000\u073f\u0740\u0007"+ + "\t\u0000\u0000\u0740\u0741\u0007\u0007\u0000\u0000\u0741\u0742\u0007\u0002"+ + "\u0000\u0000\u0742\u0743\u0007\u0003\u0000\u0000\u0743\u0744\u0007\u000b"+ + "\u0000\u0000\u0744\u0745\u0007\u0011\u0000\u0000\u0745\u0746\u0007\u0010"+ + "\u0000\u0000\u0746\u0747\u0007\n\u0000\u0000\u0747\u0748\u0007\u0006\u0000"+ + "\u0000\u0748\u0749\u0007\u000b\u0000\u0000\u0749\u074a\u0007\u0002\u0000"+ + "\u0000\u074a\u074b\u0007\u0010\u0000\u0000\u074b\u074c\u0007\u0015\u0000"+ + "\u0000\u074c\u0134\u0001\u0000\u0000\u0000\u074d\u074e\u0007\u0003\u0000"+ + "\u0000\u074e\u074f\u0007\t\u0000\u0000\u074f\u0750\u0007\u0007\u0000\u0000"+ + "\u0750\u0751\u0007\u0002\u0000\u0000\u0751\u0752\u0007\u000b\u0000\u0000"+ + "\u0752\u0753\u0007\n\u0000\u0000\u0753\u0136\u0001\u0000\u0000\u0000\u0754"+ + "\u0755\u0007\u0003\u0000\u0000\u0755\u0756\u0007\t\u0000\u0000\u0756\u0757"+ + "\u0007\u0014\u0000\u0000\u0757\u0138\u0001\u0000\u0000\u0000\u0758\u0759"+ + "\u0007\u0003\u0000\u0000\u0759\u075a\u0007\t\u0000\u0000\u075a\u075b\u0007"+ + "\u0014\u0000\u0000\u075b\u075c\u00051\u0000\u0000\u075c\u075d\u00050\u0000"+ + "\u0000\u075d\u013a\u0001\u0000\u0000\u0000\u075e\u075f\u0007\u0003\u0000"+ + "\u0000\u075f\u0760\u0007\t\u0000\u0000\u0760\u0761\u0007\u0014\u0000\u0000"+ + "\u0761\u0762\u00052\u0000\u0000\u0762\u013c\u0001\u0000\u0000\u0000\u0763"+ + "\u0764\u0007\u0003\u0000\u0000\u0764\u0765\u0007\t\u0000\u0000\u0765\u0766"+ + "\u0007\f\u0000\u0000\u0766\u0767\u0007\n\u0000\u0000\u0767\u0768\u0007"+ + "\u000e\u0000\u0000\u0768\u013e\u0001\u0000\u0000\u0000\u0769\u076a\u0007"+ + "\u0003\u0000\u0000\u076a\u076b\u0007\u000b\u0000\u0000\u076b\u076c\u0007"+ + "\u000e\u0000\u0000\u076c\u076d\u0007\u0011\u0000\u0000\u076d\u076e\u0007"+ + "\u0010\u0000\u0000\u076e\u0140\u0001\u0000\u0000\u0000\u076f\u0770\u0007"+ + "\u0010\u0000\u0000\u0770\u0771\u0007\u0002\u0000\u0000\u0771\u0772\u0007"+ + "\u0019\u0000\u0000\u0772\u0773\u0007\n\u0000\u0000\u0773\u0774\u0007\u0005"+ + "\u0000\u0000\u0774\u0775\u0007\u0002\u0000\u0000\u0775\u0776\u0007\u000b"+ + "\u0000\u0000\u0776\u0777\u0007\n\u0000\u0000\u0777\u0142\u0001\u0000\u0000"+ + "\u0000\u0778\u0779\u0007\u0010\u0000\u0000\u0779\u077a\u0007\u0002\u0000"+ + "\u0000\u077a\u077b\u0007\u0019\u0000\u0000\u077b\u077c\u0007\n\u0000\u0000"+ + "\u077c\u077d\u0007\u000b\u0000\u0000\u077d\u077e\u0007\u0011\u0000\u0000"+ + "\u077e\u077f\u0007\u0010\u0000\u0000\u077f\u0780\u0007\n\u0000\u0000\u0780"+ + "\u0144\u0001\u0000\u0000\u0000\u0781\u0782\u0007\u0010\u0000\u0000\u0782"+ + "\u0783\u0007\t\u0000\u0000\u0783\u0784\u0007\u0005\u0000\u0000\u0784\u0785"+ + "\u0007\u000f\u0000\u0000\u0785\u0786\u0007\u0003\u0000\u0000\u0786\u0787"+ + "\u0007\u000f\u0000\u0000\u0787\u0788\u0007\u0006\u0000\u0000\u0788\u0146"+ + "\u0001\u0000\u0000\u0000\u0789\u078a\u0007\u0010\u0000\u0000\u078a\u078b"+ + "\u0007\t\u0000\u0000\u078b\u078c\u0007\u0004\u0000\u0000\u078c\u078d\u0007"+ + "\u000b\u0000\u0000\u078d\u078e\u0007\u0016\u0000\u0000\u078e\u078f\u0007"+ + "\u0004\u0000\u0000\u078f\u0790\u0007\u0002\u0000\u0000\u0790\u0791\u0007"+ + "\u0010\u0000\u0000\u0791\u0792\u0007\n\u0000\u0000\u0792\u0148\u0001\u0000"+ + "\u0000\u0000\u0793\u0794\u0007\u0010\u0000\u0000\u0794\u0795\u0007\u000f"+ + "\u0000\u0000\u0795\u0796\u0007\u0003\u0000\u0000\u0796\u0797\u0007\u000b"+ + "\u0000\u0000\u0797\u0798\u0007\u0011\u0000\u0000\u0798\u0799\u0007\u0015"+ + "\u0000\u0000\u0799\u079a\u0007\u0003\u0000\u0000\u079a\u079b\u0007\r\u0000"+ + "\u0000\u079b\u014a\u0001\u0000\u0000\u0000\u079c\u079d\u0007\u0004\u0000"+ + "\u0000\u079d\u079e\u0007\t\u0000\u0000\u079e\u079f\u0007\f\u0000\u0000"+ + "\u079f\u014c\u0001\u0000\u0000\u0000\u07a0\u07a1\u0007\u0004\u0000\u0000"+ + "\u07a1\u07a2\u0007\u000f\u0000\u0000\u07a2\u07a3\u0007\u0003\u0000\u0000"+ + "\u07a3\u07a4\u0007\u0003\u0000\u0000\u07a4\u07a5\u0007\u0011\u0000\u0000"+ + "\u07a5\u07a6\u0007\u0013\u0000\u0000\u07a6\u014e\u0001\u0000\u0000\u0000"+ + "\u07a7\u07a8\u0007\u0015\u0000\u0000\u07a8\u07a9\u0007\n\u0000\u0000\u07a9"+ + "\u07aa\u0007\u000e\u0000\u0000\u07aa\u07ab\u0007\u0011\u0000\u0000\u07ab"+ + "\u07ac\u0007\t\u0000\u0000\u07ac\u07ad\u0007\u0005\u0000\u0000\u07ad\u07ae"+ + "\u0005_\u0000\u0000\u07ae\u07af\u0007\u0002\u0000\u0000\u07af\u07b0\u0007"+ + "\u0005\u0000\u0000\u07b0\u07b1\u0007\u0005\u0000\u0000\u07b1\u0150\u0001"+ + "\u0000\u0000\u0000\u07b2\u07b3\u0007\u0015\u0000\u0000\u07b3\u07b4\u0007"+ + "\n\u0000\u0000\u07b4\u07b5\u0007\u000e\u0000\u0000\u07b5\u07b6\u0007\u0011"+ + "\u0000\u0000\u07b6\u07b7\u0007\t\u0000\u0000\u07b7\u07b8\u0007\u0005\u0000"+ + "\u0000\u07b8\u07b9\u0005_\u0000\u0000\u07b9\u07ba\u0007\u0005\u0000\u0000"+ + "\u07ba\u07bb\u0007\u0011\u0000\u0000\u07bb\u07bc\u0007\u0013\u0000\u0000"+ + "\u07bc\u07bd\u0007\u0013\u0000\u0000\u07bd\u0152\u0001\u0000\u0000\u0000"+ + "\u07be\u07bf\u0007\u0015\u0000\u0000\u07bf\u07c0\u0007\u0011\u0000\u0000"+ + "\u07c0\u0154\u0001\u0000\u0000\u0000\u07c1\u07c2\u0007\u0015\u0000\u0000"+ + "\u07c2\u07c3\u0007\t\u0000\u0000\u07c3\u07c4\u0007\u0006\u0000\u0000\u07c4"+ + "\u07c5\u0007\u0011\u0000\u0000\u07c5\u07c6\u0007\u000b\u0000\u0000\u07c6"+ + "\u07c7\u0007\u0011\u0000\u0000\u07c7\u07c8\u0007\t\u0000\u0000\u07c8\u07c9"+ + "\u0007\u0004\u0000\u0000\u07c9\u0156\u0001\u0000\u0000\u0000\u07ca\u07cb"+ + "\u0007\u0015\u0000\u0000\u07cb\u07cc\u0007\t\u0000\u0000\u07cc\u07cd\u0007"+ + "\f\u0000\u0000\u07cd\u0158\u0001\u0000\u0000\u0000\u07ce\u07cf\u0007\u0015"+ + "\u0000\u0000\u07cf\u07d0\u0007\t\u0000\u0000\u07d0\u07d1\u0007\f\u0000"+ + "\u0000\u07d1\u07d2\u0007\n\u0000\u0000\u07d2\u07d3\u0007\u000e\u0000\u0000"+ + "\u07d3\u015a\u0001\u0000\u0000\u0000\u07d4\u07d5\u0007\u000e\u0000\u0000"+ + "\u07d5\u07d6\u0007\u0002\u0000\u0000\u07d6\u07d7\u0007\u0005\u0000\u0000"+ + "\u07d7\u07d8\u0007\u0011\u0000\u0000\u07d8\u07d9\u0007\u0002\u0000\u0000"+ + "\u07d9\u07da\u0007\u0004\u0000\u0000\u07da\u07db\u0007\u0006\u0000\u0000"+ + "\u07db\u015c\u0001\u0000\u0000\u0000\u07dc\u07dd\u0007\u000e\u0000\u0000"+ + "\u07dd\u07de\u0007\u0002\u0000\u0000\u07de\u07df\u0007\u0004\u0000\u0000"+ + "\u07df\u07e0\u0007\u0005\u0000\u0000\u07e0\u015e\u0001\u0000\u0000\u0000"+ + "\u07e1\u07e2\u0007\u000e\u0000\u0000\u07e2\u07e3\u0007\n\u0000\u0000\u07e3"+ + "\u07e4\u0007\u0015\u0000\u0000\u07e4\u07e5\u0007\u0003\u0000\u0000\u07e5"+ + "\u07e6\u0007\u0002\u0000\u0000\u07e6\u07e7\u0007\u0007\u0000\u0000\u07e7"+ + "\u07e8\u0007\n\u0000\u0000\u07e8\u0160\u0001\u0000\u0000\u0000\u07e9\u07ea"+ + "\u0007\u000e\u0000\u0000\u07ea\u07eb\u0007\u0011\u0000\u0000\u07eb\u07ec"+ + "\u0007\u0004\u0000\u0000\u07ec\u07ed\u0007\u000b\u0000\u0000\u07ed\u0162"+ + "\u0001\u0000\u0000\u0000\u07ee\u07ef\u0007\u000e\u0000\u0000\u07ef\u07f0"+ + "\u0007\t\u0000\u0000\u07f0\u07f1\u0007\u000f\u0000\u0000\u07f1\u07f2\u0007"+ + "\u0004\u0000\u0000\u07f2\u07f3\u0007\u0005\u0000\u0000\u07f3\u0164\u0001"+ + "\u0000\u0000\u0000\u07f4\u07f5\u0007\u000e\u0000\u0000\u07f5\u07f6\u0007"+ + "\u000b\u0000\u0000\u07f6\u07f7\u0007\u000e\u0000\u0000\u07f7\u07f8\u0007"+ + "\u0011\u0000\u0000\u07f8\u07f9\u0007\u0010\u0000\u0000\u07f9\u0166\u0001"+ + "\u0000\u0000\u0000\u07fa\u07fb\u0007\u000e\u0000\u0000\u07fb\u07fc\u0007"+ + "\n\u0000\u0000\u07fc\u07fd\u0007\u0017\u0000\u0000\u07fd\u07fe\u0007\n"+ + "\u0000\u0000\u07fe\u07ff\u0007\u000e\u0000\u0000\u07ff\u0800\u0007\u0006"+ + "\u0000\u0000\u0800\u0801\u0007\n\u0000\u0000\u0801\u0168\u0001\u0000\u0000"+ + "\u0000\u0802\u0803\u0007\u0006\u0000\u0000\u0803\u0804\u0007\n\u0000\u0000"+ + "\u0804\u0805\u0007\u0007\u0000\u0000\u0805\u0806\u0005_\u0000\u0000\u0806"+ + "\u0807\u0007\u000b\u0000\u0000\u0807\u0808\u0007\t\u0000\u0000\u0808\u0809"+ + "\u0005_\u0000\u0000\u0809\u080a\u0007\u000b\u0000\u0000\u080a\u080b\u0007"+ + "\u0011\u0000\u0000\u080b\u080c\u0007\u0010\u0000\u0000\u080c\u080d\u0007"+ + "\n\u0000\u0000\u080d\u016a\u0001\u0000\u0000\u0000\u080e\u080f\u0007\u0006"+ + "\u0000\u0000\u080f\u0810\u0007\u0011\u0000\u0000\u0810\u0811\u0007\u0014"+ + "\u0000\u0000\u0811\u0812\u0007\u0004\u0000\u0000\u0812\u016c\u0001\u0000"+ + "\u0000\u0000\u0813\u0814\u0007\u0006\u0000\u0000\u0814\u0815\u0007\u0011"+ + "\u0000\u0000\u0815\u0816\u0007\u0014\u0000\u0000\u0816\u0817\u0007\u0004"+ + "\u0000\u0000\u0817\u0818\u0007\u000f\u0000\u0000\u0818\u0819\u0007\u0010"+ + "\u0000\u0000\u0819\u016e\u0001\u0000\u0000\u0000\u081a\u081b\u0007\u0006"+ + "\u0000\u0000\u081b\u081c\u0007\u0011\u0000\u0000\u081c\u081d\u0007\u0004"+ + "\u0000\u0000\u081d\u0170\u0001\u0000\u0000\u0000\u081e\u081f\u0007\u0006"+ + "\u0000\u0000\u081f\u0820\u0007\u0011\u0000\u0000\u0820\u0821\u0007\u0004"+ + "\u0000\u0000\u0821\u0822\u0007\u0016\u0000\u0000\u0822\u0172\u0001\u0000"+ + "\u0000\u0000\u0823\u0824\u0007\u0006\u0000\u0000\u0824\u0825\u0007\u001a"+ + "\u0000\u0000\u0825\u0826\u0007\u000e\u0000\u0000\u0826\u0827\u0007\u000b"+ + "\u0000\u0000\u0827\u0174\u0001\u0000\u0000\u0000\u0828\u0829\u0007\u0006"+ + "\u0000\u0000\u0829\u082a\u0007\u000b\u0000\u0000\u082a\u082b\u0007\u000e"+ + "\u0000\u0000\u082b\u082c\u0005_\u0000\u0000\u082c\u082d\u0007\u000b\u0000"+ + "\u0000\u082d\u082e\u0007\t\u0000\u0000\u082e\u082f\u0005_\u0000\u0000"+ + "\u082f\u0830\u0007\u0005\u0000\u0000\u0830\u0831\u0007\u0002\u0000\u0000"+ + "\u0831\u0832\u0007\u000b\u0000\u0000\u0832\u0833\u0007\n\u0000\u0000\u0833"+ + "\u0176\u0001\u0000\u0000\u0000\u0834\u0835\u0007\u0006\u0000\u0000\u0835"+ + "\u0836\u0007\u000f\u0000\u0000\u0836\u0837\u0007\b\u0000\u0000\u0837\u0838"+ + "\u0007\u0005\u0000\u0000\u0838\u0839\u0007\u0002\u0000\u0000\u0839\u083a"+ + "\u0007\u000b\u0000\u0000\u083a\u083b\u0007\n\u0000\u0000\u083b\u0178\u0001"+ + "\u0000\u0000\u0000\u083c\u083d\u0007\u0006\u0000\u0000\u083d\u083e\u0007"+ + "\u000f\u0000\u0000\u083e\u083f\u0007\b\u0000\u0000\u083f\u0840\u0007\u000b"+ + "\u0000\u0000\u0840\u0841\u0007\u0011\u0000\u0000\u0841\u0842\u0007\u0010"+ + "\u0000\u0000\u0842\u0843\u0007\n\u0000\u0000\u0843\u017a\u0001\u0000\u0000"+ + "\u0000\u0844\u0845\u0007\u0006\u0000\u0000\u0845\u0846\u0007\u000f\u0000"+ + "\u0000\u0846\u0847\u0007\b\u0000\u0000\u0847\u0848\u0007\u000b\u0000\u0000"+ + "\u0848\u0849\u0007\u000e\u0000\u0000\u0849\u084a\u0007\u0002\u0000\u0000"+ + "\u084a\u084b\u0007\u0007\u0000\u0000\u084b\u084c\u0007\u000b\u0000\u0000"+ + "\u084c\u017c\u0001\u0000\u0000\u0000\u084d\u084e\u0007\u0006\u0000\u0000"+ + "\u084e\u084f\u0007\r\u0000\u0000\u084f\u0850\u0007\u0006\u0000\u0000\u0850"+ + "\u0851\u0007\u0005\u0000\u0000\u0851\u0852\u0007\u0002\u0000\u0000\u0852"+ + "\u0853\u0007\u000b\u0000\u0000\u0853\u0854\u0007\n\u0000\u0000\u0854\u017e"+ + "\u0001\u0000\u0000\u0000\u0855\u0856\u0007\u000b\u0000\u0000\u0856\u0857"+ + "\u0007\u0002\u0000\u0000\u0857\u0858\u0007\u0004\u0000\u0000\u0858\u0180"+ + "\u0001\u0000\u0000\u0000\u0859\u085a\u0007\u000b\u0000\u0000\u085a\u085b"+ + "\u0007\u0011\u0000\u0000\u085b\u085c\u0007\u0010\u0000\u0000\u085c\u085d"+ + "\u0007\n\u0000\u0000\u085d\u0182\u0001\u0000\u0000\u0000\u085e\u085f\u0007"+ + "\u000b\u0000\u0000\u085f\u0860\u0007\u0011\u0000\u0000\u0860\u0861\u0007"+ + "\u0010\u0000\u0000\u0861\u0862\u0007\n\u0000\u0000\u0862\u0863\u0007\u0005"+ + "\u0000\u0000\u0863\u0864\u0007\u0011\u0000\u0000\u0864\u0865\u0007\u0013"+ + "\u0000\u0000\u0865\u0866\u0007\u0013\u0000\u0000\u0866\u0184\u0001\u0000"+ + "\u0000\u0000\u0867\u0868\u0007\u000b\u0000\u0000\u0868\u0869\u0007\u0011"+ + "\u0000\u0000\u0869\u086a\u0007\u0010\u0000\u0000\u086a\u086b\u0007\n\u0000"+ + "\u0000\u086b\u086c\u0005_\u0000\u0000\u086c\u086d\u0007\u0013\u0000\u0000"+ + "\u086d\u086e\u0007\t\u0000\u0000\u086e\u086f\u0007\u000e\u0000\u0000\u086f"+ + "\u0870\u0007\u0010\u0000\u0000\u0870\u0871\u0007\u0002\u0000\u0000\u0871"+ + "\u0872\u0007\u000b\u0000\u0000\u0872\u0186\u0001\u0000\u0000\u0000\u0873"+ + "\u0874\u0007\u000b\u0000\u0000\u0874\u0875\u0007\u0011\u0000\u0000\u0875"+ + "\u0876\u0007\u0010\u0000\u0000\u0876\u0877\u0007\n\u0000\u0000\u0877\u0878"+ + "\u0005_\u0000\u0000\u0878\u0879\u0007\u000b\u0000\u0000\u0879\u087a\u0007"+ + "\t\u0000\u0000\u087a\u087b\u0005_\u0000\u0000\u087b\u087c\u0007\u0006"+ + "\u0000\u0000\u087c\u087d\u0007\n\u0000\u0000\u087d\u087e\u0007\u0007\u0000"+ + "\u0000\u087e\u0188\u0001\u0000\u0000\u0000\u087f\u0880\u0007\u000b\u0000"+ + "\u0000\u0880\u0881\u0007\u0011\u0000\u0000\u0881\u0882\u0007\u0010\u0000"+ + "\u0000\u0882\u0883\u0007\n\u0000\u0000\u0883\u0884\u0007\u0006\u0000\u0000"+ + "\u0884\u0885\u0007\u000b\u0000\u0000\u0885\u0886\u0007\u0002\u0000\u0000"+ + "\u0886\u0887\u0007\u0010\u0000\u0000\u0887\u0888\u0007\u0015\u0000\u0000"+ + "\u0888\u018a\u0001\u0000\u0000\u0000\u0889\u088a\u0007\u000b\u0000\u0000"+ + "\u088a\u088b\u0007\u000e\u0000\u0000\u088b\u088c\u0007\u000f\u0000\u0000"+ + "\u088c\u088d\u0007\u0004\u0000\u0000\u088d\u088e\u0007\u0007\u0000\u0000"+ + "\u088e\u088f\u0007\u0002\u0000\u0000\u088f\u0890\u0007\u000b\u0000\u0000"+ + "\u0890\u0891\u0007\n\u0000\u0000\u0891\u018c\u0001\u0000\u0000\u0000\u0892"+ + "\u0893\u0007\u000b\u0000\u0000\u0893\u0894\u0007\t\u0000\u0000\u0894\u0895"+ + "\u0005_\u0000\u0000\u0895\u0896\u0007\u0005\u0000\u0000\u0896\u0897\u0007"+ + "\u0002\u0000\u0000\u0897\u0898\u0007\r\u0000\u0000\u0898\u0899\u0007\u0006"+ + "\u0000\u0000\u0899\u018e\u0001\u0000\u0000\u0000\u089a\u089b\u0007\u000b"+ + "\u0000\u0000\u089b\u089c\u0007\t\u0000\u0000\u089c\u089d\u0005_\u0000"+ + "\u0000\u089d\u089e\u0007\u0006\u0000\u0000\u089e\u089f\u0007\n\u0000\u0000"+ + "\u089f\u08a0\u0007\u0007\u0000\u0000\u08a0\u08a1\u0007\t\u0000\u0000\u08a1"+ + "\u08a2\u0007\u0004\u0000\u0000\u08a2\u08a3\u0007\u0005\u0000\u0000\u08a3"+ + "\u08a4"; + private static final String _serializedATNSegment1 = + "\u0007\u0006\u0000\u0000\u08a4\u0190\u0001\u0000\u0000\u0000\u08a5\u08a6"+ + "\u0007\u000f\u0000\u0000\u08a6\u08a7\u0007\u0004\u0000\u0000\u08a7\u08a8"+ + "\u0007\u0011\u0000\u0000\u08a8\u08a9\u0007\u0012\u0000\u0000\u08a9\u08aa"+ + "\u0005_\u0000\u0000\u08aa\u08ab\u0007\u000b\u0000\u0000\u08ab\u08ac\u0007"+ + "\u0011\u0000\u0000\u08ac\u08ad\u0007\u0010\u0000\u0000\u08ad\u08ae\u0007"+ + "\n\u0000\u0000\u08ae\u08af\u0007\u0006\u0000\u0000\u08af\u08b0\u0007\u000b"+ + "\u0000\u0000\u08b0\u08b1\u0007\u0002\u0000\u0000\u08b1\u08b2\u0007\u0010"+ + "\u0000\u0000\u08b2\u08b3\u0007\u0015\u0000\u0000\u08b3\u0192\u0001\u0000"+ + "\u0000\u0000\u08b4\u08b5\u0007\u000f\u0000\u0000\u08b5\u08b6\u0007\u0015"+ + "\u0000\u0000\u08b6\u08b7\u0007\u0015\u0000\u0000\u08b7\u08b8\u0007\n\u0000"+ + "\u0000\u08b8\u08b9\u0007\u000e\u0000\u0000\u08b9\u0194\u0001\u0000\u0000"+ + "\u0000\u08ba\u08bb\u0007\u000f\u0000\u0000\u08bb\u08bc\u0007\u000b\u0000"+ + "\u0000\u08bc\u08bd\u0007\u0007\u0000\u0000\u08bd\u08be\u0005_\u0000\u0000"+ + "\u08be\u08bf\u0007\u0005\u0000\u0000\u08bf\u08c0\u0007\u0002\u0000\u0000"+ + "\u08c0\u08c1\u0007\u000b\u0000\u0000\u08c1\u08c2\u0007\n\u0000\u0000\u08c2"+ + "\u0196\u0001\u0000\u0000\u0000\u08c3\u08c4\u0007\u000f\u0000\u0000\u08c4"+ + "\u08c5\u0007\u000b\u0000\u0000\u08c5\u08c6\u0007\u0007\u0000\u0000\u08c6"+ + "\u08c7\u0005_\u0000\u0000\u08c7\u08c8\u0007\u000b\u0000\u0000\u08c8\u08c9"+ + "\u0007\u0011\u0000\u0000\u08c9\u08ca\u0007\u0010\u0000\u0000\u08ca\u08cb"+ + "\u0007\n\u0000\u0000\u08cb\u0198\u0001\u0000\u0000\u0000\u08cc\u08cd\u0007"+ + "\u000f\u0000\u0000\u08cd\u08ce\u0007\u000b\u0000\u0000\u08ce\u08cf\u0007"+ + "\u0007\u0000\u0000\u08cf\u08d0\u0005_\u0000\u0000\u08d0\u08d1\u0007\u000b"+ + "\u0000\u0000\u08d1\u08d2\u0007\u0011\u0000\u0000\u08d2\u08d3\u0007\u0010"+ + "\u0000\u0000\u08d3\u08d4\u0007\n\u0000\u0000\u08d4\u08d5\u0007\u0006\u0000"+ + "\u0000\u08d5\u08d6\u0007\u000b\u0000\u0000\u08d6\u08d7\u0007\u0002\u0000"+ + "\u0000\u08d7\u08d8\u0007\u0010\u0000\u0000\u08d8\u08d9\u0007\u0015\u0000"+ + "\u0000\u08d9\u019a\u0001\u0000\u0000\u0000\u08da\u08db\u0007\u0005\u0000"+ + "\u0000\u08db\u019c\u0001\u0000\u0000\u0000\u08dc\u08dd\u0007\u000b\u0000"+ + "\u0000\u08dd\u019e\u0001\u0000\u0000\u0000\u08de\u08df\u0007\u000b\u0000"+ + "\u0000\u08df\u08e0\u0007\u0006\u0000\u0000\u08e0\u01a0\u0001\u0000\u0000"+ + "\u0000\u08e1\u08e2\u0005{\u0000\u0000\u08e2\u01a2\u0001\u0000\u0000\u0000"+ + "\u08e3\u08e4\u0005}\u0000\u0000\u08e4\u01a4\u0001\u0000\u0000\u0000\u08e5"+ + "\u08e6\u0007\u0005\u0000\u0000\u08e6\u08e7\u0007\n\u0000\u0000\u08e7\u08e8"+ + "\u0007\u0004\u0000\u0000\u08e8\u08e9\u0007\u0006\u0000\u0000\u08e9\u08ea"+ + "\u0007\n\u0000\u0000\u08ea\u08eb\u0005_\u0000\u0000\u08eb\u08ec\u0007"+ + "\u000e\u0000\u0000\u08ec\u08ed\u0007\u0002\u0000\u0000\u08ed\u08ee\u0007"+ + "\u0004\u0000\u0000\u08ee\u08ef\u0007\u0019\u0000\u0000\u08ef\u01a6\u0001"+ + "\u0000\u0000\u0000\u08f0\u08f1\u0007\u000e\u0000\u0000\u08f1\u08f2\u0007"+ + "\u0002\u0000\u0000\u08f2\u08f3\u0007\u0004\u0000\u0000\u08f3\u08f4\u0007"+ + "\u0019\u0000\u0000\u08f4\u01a8\u0001\u0000\u0000\u0000\u08f5\u08f6\u0007"+ + "\u000e\u0000\u0000\u08f6\u08f7\u0007\t\u0000\u0000\u08f7\u08f8\u0007\f"+ + "\u0000\u0000\u08f8\u08f9\u0005_\u0000\u0000\u08f9\u08fa\u0007\u0004\u0000"+ + "\u0000\u08fa\u08fb\u0007\u000f\u0000\u0000\u08fb\u08fc\u0007\u0010\u0000"+ + "\u0000\u08fc\u08fd\u0007\b\u0000\u0000\u08fd\u08fe\u0007\n\u0000\u0000"+ + "\u08fe\u08ff\u0007\u000e\u0000\u0000\u08ff\u01aa\u0001\u0000\u0000\u0000"+ + "\u0900\u0901\u0007\u0005\u0000\u0000\u0901\u0902\u0007\u0002\u0000\u0000"+ + "\u0902\u0903\u0007\u000b\u0000\u0000\u0903\u0904\u0007\n\u0000\u0000\u0904"+ + "\u0905\u0005_\u0000\u0000\u0905\u0906\u0007\u0016\u0000\u0000\u0906\u0907"+ + "\u0007\u0011\u0000\u0000\u0907\u0908\u0007\u0006\u0000\u0000\u0908\u0909"+ + "\u0007\u000b\u0000\u0000\u0909\u090a\u0007\t\u0000\u0000\u090a\u090b\u0007"+ + "\u0014\u0000\u0000\u090b\u090c\u0007\u000e\u0000\u0000\u090c\u090d\u0007"+ + "\u0002\u0000\u0000\u090d\u090e\u0007\u0010\u0000\u0000\u090e\u01ac\u0001"+ + "\u0000\u0000\u0000\u090f\u0910\u0007\u0005\u0000\u0000\u0910\u0911\u0007"+ + "\u0002\u0000\u0000\u0911\u0912\u0007\r\u0000\u0000\u0912\u0913\u0005_"+ + "\u0000\u0000\u0913\u0914\u0007\t\u0000\u0000\u0914\u0915\u0007\u0013\u0000"+ + "\u0000\u0915\u0916\u0005_\u0000\u0000\u0916\u0917\u0007\u0010\u0000\u0000"+ + "\u0917\u0918\u0007\t\u0000\u0000\u0918\u0919\u0007\u0004\u0000\u0000\u0919"+ + "\u091a\u0007\u000b\u0000\u0000\u091a\u091b\u0007\u0016\u0000\u0000\u091b"+ + "\u01ae\u0001\u0000\u0000\u0000\u091c\u091d\u0007\u0005\u0000\u0000\u091d"+ + "\u091e\u0007\u0002\u0000\u0000\u091e\u091f\u0007\r\u0000\u0000\u091f\u0920"+ + "\u0005_\u0000\u0000\u0920\u0921\u0007\t\u0000\u0000\u0921\u0922\u0007"+ + "\u0013\u0000\u0000\u0922\u0923\u0005_\u0000\u0000\u0923\u0924\u0007\r"+ + "\u0000\u0000\u0924\u0925\u0007\n\u0000\u0000\u0925\u0926\u0007\u0002\u0000"+ + "\u0000\u0926\u0927\u0007\u000e\u0000\u0000\u0927\u01b0\u0001\u0000\u0000"+ + "\u0000\u0928\u0929\u0007\u0005\u0000\u0000\u0929\u092a\u0007\u0002\u0000"+ + "\u0000\u092a\u092b\u0007\r\u0000\u0000\u092b\u092c\u0005_\u0000\u0000"+ + "\u092c\u092d\u0007\t\u0000\u0000\u092d\u092e\u0007\u0013\u0000\u0000\u092e"+ + "\u092f\u0005_\u0000\u0000\u092f\u0930\u0007\f\u0000\u0000\u0930\u0931"+ + "\u0007\n\u0000\u0000\u0931\u0932\u0007\n\u0000\u0000\u0932\u0933\u0007"+ + "\u0019\u0000\u0000\u0933\u01b2\u0001\u0000\u0000\u0000\u0934\u0935\u0007"+ + "\n\u0000\u0000\u0935\u0936\u0007\u0012\u0000\u0000\u0936\u0937\u0007\u0007"+ + "\u0000\u0000\u0937\u0938\u0007\u0003\u0000\u0000\u0938\u0939\u0007\u000f"+ + "\u0000\u0000\u0939\u093a\u0007\u0005\u0000\u0000\u093a\u093b\u0007\n\u0000"+ + "\u0000\u093b\u01b4\u0001\u0000\u0000\u0000\u093c\u093d\u0007\n\u0000\u0000"+ + "\u093d\u093e\u0007\u0012\u0000\u0000\u093e\u093f\u0007\u000b\u0000\u0000"+ + "\u093f\u0940\u0007\n\u0000\u0000\u0940\u0941\u0007\u0004\u0000\u0000\u0941"+ + "\u0942\u0007\u0005\u0000\u0000\u0942\u0943\u0007\n\u0000\u0000\u0943\u0944"+ + "\u0007\u0005\u0000\u0000\u0944\u0945\u0005_\u0000\u0000\u0945\u0946\u0007"+ + "\u0006\u0000\u0000\u0946\u0947\u0007\u000b\u0000\u0000\u0947\u0948\u0007"+ + "\u0002\u0000\u0000\u0948\u0949\u0007\u000b\u0000\u0000\u0949\u094a\u0007"+ + "\u0006\u0000\u0000\u094a\u01b6\u0001\u0000\u0000\u0000\u094b\u094c\u0007"+ + "\u0013\u0000\u0000\u094c\u094d\u0007\u0011\u0000\u0000\u094d\u094e\u0007"+ + "\n\u0000\u0000\u094e\u094f\u0007\u0003\u0000\u0000\u094f\u0950\u0007\u0005"+ + "\u0000\u0000\u0950\u01b8\u0001\u0000\u0000\u0000\u0951\u0952\u0007\u0013"+ + "\u0000\u0000\u0952\u0953\u0007\u0011\u0000\u0000\u0953\u0954\u0007\u0003"+ + "\u0000\u0000\u0954\u0955\u0007\u000b\u0000\u0000\u0955\u0956\u0007\n\u0000"+ + "\u0000\u0956\u0957\u0007\u000e\u0000\u0000\u0957\u01ba\u0001\u0000\u0000"+ + "\u0000\u0958\u0959\u0007\u0014\u0000\u0000\u0959\u095a\u0007\n\u0000\u0000"+ + "\u095a\u095b\u0007\t\u0000\u0000\u095b\u095c\u0005_\u0000\u0000\u095c"+ + "\u095d\u0007\b\u0000\u0000\u095d\u095e\u0007\t\u0000\u0000\u095e\u095f"+ + "\u0007\u000f\u0000\u0000\u095f\u0960\u0007\u0004\u0000\u0000\u0960\u0961"+ + "\u0007\u0005\u0000\u0000\u0961\u0962\u0007\u0011\u0000\u0000\u0962\u0963"+ + "\u0007\u0004\u0000\u0000\u0963\u0964\u0007\u0014\u0000\u0000\u0964\u0965"+ + "\u0005_\u0000\u0000\u0965\u0966\u0007\b\u0000\u0000\u0966\u0967\u0007"+ + "\t\u0000\u0000\u0967\u0968\u0007\u0012\u0000\u0000\u0968\u01bc\u0001\u0000"+ + "\u0000\u0000\u0969\u096a\u0007\u0014\u0000\u0000\u096a\u096b\u0007\n\u0000"+ + "\u0000\u096b\u096c\u0007\t\u0000\u0000\u096c\u096d\u0005_\u0000\u0000"+ + "\u096d\u096e\u0007\u0007\u0000\u0000\u096e\u096f\u0007\n\u0000\u0000\u096f"+ + "\u0970\u0007\u0003\u0000\u0000\u0970\u0971\u0007\u0003\u0000\u0000\u0971"+ + "\u01be\u0001\u0000\u0000\u0000\u0972\u0973\u0007\u0014\u0000\u0000\u0973"+ + "\u0974\u0007\n\u0000\u0000\u0974\u0975\u0007\t\u0000\u0000\u0975\u0976"+ + "\u0005_\u0000\u0000\u0976\u0977\u0007\u0005\u0000\u0000\u0977\u0978\u0007"+ + "\u0011\u0000\u0000\u0978\u0979\u0007\u0006\u0000\u0000\u0979\u097a\u0007"+ + "\u000b\u0000\u0000\u097a\u097b\u0007\u0002\u0000\u0000\u097b\u097c\u0007"+ + "\u0004\u0000\u0000\u097c\u097d\u0007\u0007\u0000\u0000\u097d\u097e\u0007"+ + "\n\u0000\u0000\u097e\u01c0\u0001\u0000\u0000\u0000\u097f\u0980\u0007\u0014"+ + "\u0000\u0000\u0980\u0981\u0007\n\u0000\u0000\u0981\u0982\u0007\t\u0000"+ + "\u0000\u0982\u0983\u0005_\u0000\u0000\u0983\u0984\u0007\u0005\u0000\u0000"+ + "\u0984\u0985\u0007\u0011\u0000\u0000\u0985\u0986\u0007\u0006\u0000\u0000"+ + "\u0986\u0987\u0007\u000b\u0000\u0000\u0987\u0988\u0007\u0002\u0000\u0000"+ + "\u0988\u0989\u0007\u0004\u0000\u0000\u0989\u098a\u0007\u0007\u0000\u0000"+ + "\u098a\u098b\u0007\n\u0000\u0000\u098b\u098c\u0005_\u0000\u0000\u098c"+ + "\u098d\u0007\u000e\u0000\u0000\u098d\u098e\u0007\u0002\u0000\u0000\u098e"+ + "\u098f\u0007\u0004\u0000\u0000\u098f\u0990\u0007\u0014\u0000\u0000\u0990"+ + "\u0991\u0007\n\u0000\u0000\u0991\u01c2\u0001\u0000\u0000\u0000\u0992\u0993"+ + "\u0007\u0014\u0000\u0000\u0993\u0994\u0007\n\u0000\u0000\u0994\u0995\u0007"+ + "\t\u0000\u0000\u0995\u0996\u0005_\u0000\u0000\u0996\u0997\u0007\u0011"+ + "\u0000\u0000\u0997\u0998\u0007\u0004\u0000\u0000\u0998\u0999\u0007\u000b"+ + "\u0000\u0000\u0999\u099a\u0007\n\u0000\u0000\u099a\u099b\u0007\u000e\u0000"+ + "\u0000\u099b\u099c\u0007\u0006\u0000\u0000\u099c\u099d\u0007\n\u0000\u0000"+ + "\u099d\u099e\u0007\u0007\u0000\u0000\u099e\u099f\u0007\u000b\u0000\u0000"+ + "\u099f\u09a0\u0007\u0006\u0000\u0000\u09a0\u01c4\u0001\u0000\u0000\u0000"+ + "\u09a1\u09a2\u0007\u0014\u0000\u0000\u09a2\u09a3\u0007\n\u0000\u0000\u09a3"+ + "\u09a4\u0007\t\u0000\u0000\u09a4\u09a5\u0005_\u0000\u0000\u09a5\u09a6"+ + "\u0007\u0015\u0000\u0000\u09a6\u09a7\u0007\t\u0000\u0000\u09a7\u09a8\u0007"+ + "\u0003\u0000\u0000\u09a8\u09a9\u0007\r\u0000\u0000\u09a9\u09aa\u0007\u0014"+ + "\u0000\u0000\u09aa\u09ab\u0007\t\u0000\u0000\u09ab\u09ac\u0007\u0004\u0000"+ + "\u0000\u09ac\u01c6\u0001\u0000\u0000\u0000\u09ad\u09ae\u0007\u0016\u0000"+ + "\u0000\u09ae\u09af\u0007\u0011\u0000\u0000\u09af\u09b0\u0007\u0006\u0000"+ + "\u0000\u09b0\u09b1\u0007\u000b\u0000\u0000\u09b1\u09b2\u0007\t\u0000\u0000"+ + "\u09b2\u09b3\u0007\u0014\u0000\u0000\u09b3\u09b4\u0007\u000e\u0000\u0000"+ + "\u09b4\u09b5\u0007\u0002\u0000\u0000\u09b5\u09b6\u0007\u0010\u0000\u0000"+ + "\u09b6\u01c8\u0001\u0000\u0000\u0000\u09b7\u09b8\u0007\u0016\u0000\u0000"+ + "\u09b8\u09b9\u0007\t\u0000\u0000\u09b9\u09ba\u0007\u000f\u0000\u0000\u09ba"+ + "\u09bb\u0007\u000e\u0000\u0000\u09bb\u09bc\u0005_\u0000\u0000\u09bc\u09bd"+ + "\u0007\t\u0000\u0000\u09bd\u09be\u0007\u0013\u0000\u0000\u09be\u09bf\u0005"+ + "_\u0000\u0000\u09bf\u09c0\u0007\u0005\u0000\u0000\u09c0\u09c1\u0007\u0002"+ + "\u0000\u0000\u09c1\u09c2\u0007\r\u0000\u0000\u09c2\u01ca\u0001\u0000\u0000"+ + "\u0000\u09c3\u09c4\u0007\u0011\u0000\u0000\u09c4\u09c5\u0007\u0004\u0000"+ + "\u0000\u09c5\u09c6\u0007\u0007\u0000\u0000\u09c6\u09c7\u0007\u0003\u0000"+ + "\u0000\u09c7\u09c8\u0007\u000f\u0000\u0000\u09c8\u09c9\u0007\u0005\u0000"+ + "\u0000\u09c9\u09ca\u0007\n\u0000\u0000\u09ca\u01cc\u0001\u0000\u0000\u0000"+ + "\u09cb\u09cc\u0007\u0011\u0000\u0000\u09cc\u09cd\u0007\u0004\u0000\u0000"+ + "\u09cd\u09ce\u0005_\u0000\u0000\u09ce\u09cf\u0007\u000b\u0000\u0000\u09cf"+ + "\u09d0\u0007\n\u0000\u0000\u09d0\u09d1\u0007\u000e\u0000\u0000\u09d1\u09d2"+ + "\u0007\u0010\u0000\u0000\u09d2\u09d3\u0007\u0006\u0000\u0000\u09d3\u01ce"+ + "\u0001\u0000\u0000\u0000\u09d4\u09d5\u0007\u0010\u0000\u0000\u09d5\u09d6"+ + "\u0007\u0002\u0000\u0000\u09d6\u09d7\u0007\u000b\u0000\u0000\u09d7\u09d8"+ + "\u0007\u0007\u0000\u0000\u09d8\u09d9\u0007\u0016\u0000\u0000\u09d9\u09da"+ + "\u0007\u0015\u0000\u0000\u09da\u09db\u0007\u0016\u0000\u0000\u09db\u09dc"+ + "\u0007\u000e\u0000\u0000\u09dc\u09dd\u0007\u0002\u0000\u0000\u09dd\u09de"+ + "\u0007\u0006\u0000\u0000\u09de\u09df\u0007\n\u0000\u0000\u09df\u01d0\u0001"+ + "\u0000\u0000\u0000\u09e0\u09e1\u0007\u0010\u0000\u0000\u09e1\u09e2\u0007"+ + "\u0002\u0000\u0000\u09e2\u09e3\u0007\u000b\u0000\u0000\u09e3\u09e4\u0007"+ + "\u0007\u0000\u0000\u09e4\u09e5\u0007\u0016\u0000\u0000\u09e5\u09e6\u0005"+ + "_\u0000\u0000\u09e6\u09e7\u0007\u0015\u0000\u0000\u09e7\u09e8\u0007\u0016"+ + "\u0000\u0000\u09e8\u09e9\u0007\u000e\u0000\u0000\u09e9\u09ea\u0007\u0002"+ + "\u0000\u0000\u09ea\u09eb\u0007\u0006\u0000\u0000\u09eb\u09ec\u0007\n\u0000"+ + "\u0000\u09ec\u01d2\u0001\u0000\u0000\u0000\u09ed\u09ee\u0007\u0010\u0000"+ + "\u0000\u09ee\u09ef\u0007\u0002\u0000\u0000\u09ef\u09f0\u0007\u000b\u0000"+ + "\u0000\u09f0\u09f1\u0007\u0007\u0000\u0000\u09f1\u09f2\u0007\u0016\u0000"+ + "\u0000\u09f2\u09f3\u0007\u0015\u0000\u0000\u09f3\u09f4\u0007\u0016\u0000"+ + "\u0000\u09f4\u09f5\u0007\u000e\u0000\u0000\u09f5\u09f6\u0007\u0002\u0000"+ + "\u0000\u09f6\u09f7\u0007\u0006\u0000\u0000\u09f7\u09f8\u0007\n\u0000\u0000"+ + "\u09f8\u09f9\u0007\u001a\u0000\u0000\u09f9\u09fa\u0007\u000f\u0000\u0000"+ + "\u09fa\u09fb\u0007\n\u0000\u0000\u09fb\u09fc\u0007\u000e\u0000\u0000\u09fc"+ + "\u09fd\u0007\r\u0000\u0000\u09fd\u01d4\u0001\u0000\u0000\u0000\u09fe\u09ff"+ + "\u0007\u0006\u0000\u0000\u09ff\u0a00\u0007\u0011\u0000\u0000\u0a00\u0a01"+ + "\u0007\u0010\u0000\u0000\u0a01\u0a02\u0007\u0015\u0000\u0000\u0a02\u0a03"+ + "\u0007\u0003\u0000\u0000\u0a03\u0a04\u0007\n\u0000\u0000\u0a04\u0a05\u0005"+ + "_\u0000\u0000\u0a05\u0a06\u0007\u001a\u0000\u0000\u0a06\u0a07\u0007\u000f"+ + "\u0000\u0000\u0a07\u0a08\u0007\n\u0000\u0000\u0a08\u0a09\u0007\u000e\u0000"+ + "\u0000\u0a09\u0a0a\u0007\r\u0000\u0000\u0a0a\u0a0b\u0005_\u0000\u0000"+ + "\u0a0b\u0a0c\u0007\u0006\u0000\u0000\u0a0c\u0a0d\u0007\u000b\u0000\u0000"+ + "\u0a0d\u0a0e\u0007\u000e\u0000\u0000\u0a0e\u0a0f\u0007\u0011\u0000\u0000"+ + "\u0a0f\u0a10\u0007\u0004\u0000\u0000\u0a10\u0a11\u0007\u0014\u0000\u0000"+ + "\u0a11\u01d6\u0001\u0000\u0000\u0000\u0a12\u0a13\u0007\u001a\u0000\u0000"+ + "\u0a13\u0a14\u0007\u000f\u0000\u0000\u0a14\u0a15\u0007\n\u0000\u0000\u0a15"+ + "\u0a16\u0007\u000e\u0000\u0000\u0a16\u0a17\u0007\r\u0000\u0000\u0a17\u0a18"+ + "\u0005_\u0000\u0000\u0a18\u0a19\u0007\u0006\u0000\u0000\u0a19\u0a1a\u0007"+ + "\u000b\u0000\u0000\u0a1a\u0a1b\u0007\u000e\u0000\u0000\u0a1b\u0a1c\u0007"+ + "\u0011\u0000\u0000\u0a1c\u0a1d\u0007\u0004\u0000\u0000\u0a1d\u0a1e\u0007"+ + "\u0014\u0000\u0000\u0a1e\u01d8\u0001\u0000\u0000\u0000\u0a1f\u0a20\u0007"+ + "\u0010\u0000\u0000\u0a20\u0a21\u0007\u0002\u0000\u0000\u0a21\u0a22\u0007"+ + "\u000b\u0000\u0000\u0a22\u0a23\u0007\u0007\u0000\u0000\u0a23\u0a24\u0007"+ + "\u0016\u0000\u0000\u0a24\u0a25\u0005_\u0000\u0000\u0a25\u0a26\u0007\u0015"+ + "\u0000\u0000\u0a26\u0a27\u0007\u0016\u0000\u0000\u0a27\u0a28\u0007\u000e"+ + "\u0000\u0000\u0a28\u0a29\u0007\u0002\u0000\u0000\u0a29\u0a2a\u0007\u0006"+ + "\u0000\u0000\u0a2a\u0a2b\u0007\n\u0000\u0000\u0a2b\u0a2c\u0005_\u0000"+ + "\u0000\u0a2c\u0a2d\u0007\u0015\u0000\u0000\u0a2d\u0a2e\u0007\u000e\u0000"+ + "\u0000\u0a2e\u0a2f\u0007\n\u0000\u0000\u0a2f\u0a30\u0007\u0013\u0000\u0000"+ + "\u0a30\u0a31\u0007\u0011\u0000\u0000\u0a31\u0a32\u0007\u0012\u0000\u0000"+ + "\u0a32\u01da\u0001\u0000\u0000\u0000\u0a33\u0a34\u0007\u0010\u0000\u0000"+ + "\u0a34\u0a35\u0007\u0002\u0000\u0000\u0a35\u0a36\u0007\u000b\u0000\u0000"+ + "\u0a36\u0a37\u0007\u0007\u0000\u0000\u0a37\u0a38\u0007\u0016\u0000\u0000"+ + "\u0a38\u0a39\u0007\u001a\u0000\u0000\u0a39\u0a3a\u0007\u000f\u0000\u0000"+ + "\u0a3a\u0a3b\u0007\n\u0000\u0000\u0a3b\u0a3c\u0007\u000e\u0000\u0000\u0a3c"+ + "\u0a3d\u0007\r\u0000\u0000\u0a3d\u01dc\u0001\u0000\u0000\u0000\u0a3e\u0a3f"+ + "\u0007\u0010\u0000\u0000\u0a3f\u0a40\u0007\u0002\u0000\u0000\u0a40\u0a41"+ + "\u0007\u000b\u0000\u0000\u0a41\u0a42\u0007\u0007\u0000\u0000\u0a42\u0a43"+ + "\u0007\u0016\u0000\u0000\u0a43\u0a44\u0005_\u0000\u0000\u0a44\u0a45\u0007"+ + "\u001a\u0000\u0000\u0a45\u0a46\u0007\u000f\u0000\u0000\u0a46\u0a47\u0007"+ + "\n\u0000\u0000\u0a47\u0a48\u0007\u000e\u0000\u0000\u0a48\u0a49\u0007\r"+ + "\u0000\u0000\u0a49\u01de\u0001\u0000\u0000\u0000\u0a4a\u0a4b\u0007\u0010"+ + "\u0000\u0000\u0a4b\u0a4c\u0007\u0011\u0000\u0000\u0a4c\u0a4d\u0007\u0004"+ + "\u0000\u0000\u0a4d\u0a4e\u0007\u000f\u0000\u0000\u0a4e\u0a4f\u0007\u000b"+ + "\u0000\u0000\u0a4f\u0a50\u0007\n\u0000\u0000\u0a50\u0a51\u0005_\u0000"+ + "\u0000\u0a51\u0a52\u0007\t\u0000\u0000\u0a52\u0a53\u0007\u0013\u0000\u0000"+ + "\u0a53\u0a54\u0005_\u0000\u0000\u0a54\u0a55\u0007\u0005\u0000\u0000\u0a55"+ + "\u0a56\u0007\u0002\u0000\u0000\u0a56\u0a57\u0007\r\u0000\u0000\u0a57\u01e0"+ + "\u0001\u0000\u0000\u0000\u0a58\u0a59\u0007\u0010\u0000\u0000\u0a59\u0a5a"+ + "\u0007\u0011\u0000\u0000\u0a5a\u0a5b\u0007\u0004\u0000\u0000\u0a5b\u0a5c"+ + "\u0007\u000f\u0000\u0000\u0a5c\u0a5d\u0007\u000b\u0000\u0000\u0a5d\u0a5e"+ + "\u0007\n\u0000\u0000\u0a5e\u0a5f\u0005_\u0000\u0000\u0a5f\u0a60\u0007"+ + "\t\u0000\u0000\u0a60\u0a61\u0007\u0013\u0000\u0000\u0a61\u0a62\u0005_"+ + "\u0000\u0000\u0a62\u0a63\u0007\u0016\u0000\u0000\u0a63\u0a64\u0007\t\u0000"+ + "\u0000\u0a64\u0a65\u0007\u000f\u0000\u0000\u0a65\u0a66\u0007\u000e\u0000"+ + "\u0000\u0a66\u01e2\u0001\u0000\u0000\u0000\u0a67\u0a68\u0007\u0010\u0000"+ + "\u0000\u0a68\u0a69\u0007\t\u0000\u0000\u0a69\u0a6a\u0007\u0004\u0000\u0000"+ + "\u0a6a\u0a6b\u0007\u000b\u0000\u0000\u0a6b\u0a6c\u0007\u0016\u0000\u0000"+ + "\u0a6c\u0a6d\u0005_\u0000\u0000\u0a6d\u0a6e\u0007\t\u0000\u0000\u0a6e"+ + "\u0a6f\u0007\u0013\u0000\u0000\u0a6f\u0a70\u0005_\u0000\u0000\u0a70\u0a71"+ + "\u0007\r\u0000\u0000\u0a71\u0a72\u0007\n\u0000\u0000\u0a72\u0a73\u0007"+ + "\u0002\u0000\u0000\u0a73\u0a74\u0007\u000e\u0000\u0000\u0a74\u01e4\u0001"+ + "\u0000\u0000\u0000\u0a75\u0a76\u0007\u0010\u0000\u0000\u0a76\u0a77\u0007"+ + "\u000f\u0000\u0000\u0a77\u0a78\u0007\u0003\u0000\u0000\u0a78\u0a79\u0007"+ + "\u000b\u0000\u0000\u0a79\u0a7a\u0007\u0011\u0000\u0000\u0a7a\u0a7b\u0007"+ + "\u0010\u0000\u0000\u0a7b\u0a7c\u0007\u0002\u0000\u0000\u0a7c\u0a7d\u0007"+ + "\u000b\u0000\u0000\u0a7d\u0a7e\u0007\u0007\u0000\u0000\u0a7e\u0a7f\u0007"+ + "\u0016\u0000\u0000\u0a7f\u01e6\u0001\u0000\u0000\u0000\u0a80\u0a81\u0007"+ + "\u0010\u0000\u0000\u0a81\u0a82\u0007\u000f\u0000\u0000\u0a82\u0a83\u0007"+ + "\u0003\u0000\u0000\u0a83\u0a84\u0007\u000b\u0000\u0000\u0a84\u0a85\u0007"+ + "\u0011\u0000\u0000\u0a85\u0a86\u0005_\u0000\u0000\u0a86\u0a87\u0007\u0010"+ + "\u0000\u0000\u0a87\u0a88\u0007\u0002\u0000\u0000\u0a88\u0a89\u0007\u000b"+ + "\u0000\u0000\u0a89\u0a8a\u0007\u0007\u0000\u0000\u0a8a\u0a8b\u0007\u0016"+ + "\u0000\u0000\u0a8b\u01e8\u0001\u0000\u0000\u0000\u0a8c\u0a8d\u0007\u0010"+ + "\u0000\u0000\u0a8d\u0a8e\u0007\u000f\u0000\u0000\u0a8e\u0a8f\u0007\u0003"+ + "\u0000\u0000\u0a8f\u0a90\u0007\u000b\u0000\u0000\u0a90\u0a91\u0007\u0011"+ + "\u0000\u0000\u0a91\u0a92\u0007\u0010\u0000\u0000\u0a92\u0a93\u0007\u0002"+ + "\u0000\u0000\u0a93\u0a94\u0007\u000b\u0000\u0000\u0a94\u0a95\u0007\u0007"+ + "\u0000\u0000\u0a95\u0a96\u0007\u0016\u0000\u0000\u0a96\u0a97\u0007\u001a"+ + "\u0000\u0000\u0a97\u0a98\u0007\u000f\u0000\u0000\u0a98\u0a99\u0007\n\u0000"+ + "\u0000\u0a99\u0a9a\u0007\u000e\u0000\u0000\u0a9a\u0a9b\u0007\r\u0000\u0000"+ + "\u0a9b\u01ea\u0001\u0000\u0000\u0000\u0a9c\u0a9d\u0007\u0004\u0000\u0000"+ + "\u0a9d\u0a9e\u0007\n\u0000\u0000\u0a9e\u0a9f\u0007\u0006\u0000\u0000\u0a9f"+ + "\u0aa0\u0007\u000b\u0000\u0000\u0aa0\u0aa1\u0007\n\u0000\u0000\u0aa1\u0aa2"+ + "\u0007\u0005\u0000\u0000\u0aa2\u01ec\u0001\u0000\u0000\u0000\u0aa3\u0aa4"+ + "\u0007\u0015\u0000\u0000\u0aa4\u0aa5\u0007\n\u0000\u0000\u0aa5\u0aa6\u0007"+ + "\u000e\u0000\u0000\u0aa6\u0aa7\u0007\u0007\u0000\u0000\u0aa7\u0aa8\u0007"+ + "\n\u0000\u0000\u0aa8\u0aa9\u0007\u0004\u0000\u0000\u0aa9\u0aaa\u0007\u000b"+ + "\u0000\u0000\u0aaa\u0aab\u0007\u0011\u0000\u0000\u0aab\u0aac\u0007\u0003"+ + "\u0000\u0000\u0aac\u0aad\u0007\n\u0000\u0000\u0aad\u0aae\u0007\u0006\u0000"+ + "\u0000\u0aae\u01ee\u0001\u0000\u0000\u0000\u0aaf\u0ab0\u0007\u0015\u0000"+ + "\u0000\u0ab0\u0ab1\u0007\n\u0000\u0000\u0ab1\u0ab2\u0007\u000e\u0000\u0000"+ + "\u0ab2\u0ab3\u0007\u0007\u0000\u0000\u0ab3\u0ab4\u0007\n\u0000\u0000\u0ab4"+ + "\u0ab5\u0007\u0004\u0000\u0000\u0ab5\u0ab6\u0007\u000b\u0000\u0000\u0ab6"+ + "\u0ab7\u0007\u0011\u0000\u0000\u0ab7\u0ab8\u0007\u0003\u0000\u0000\u0ab8"+ + "\u0ab9\u0007\n\u0000\u0000\u0ab9\u01f0\u0001\u0000\u0000\u0000\u0aba\u0abb"+ + "\u0007\u0015\u0000\u0000\u0abb\u0abc\u0007\n\u0000\u0000\u0abc\u0abd\u0007"+ + "\u000e\u0000\u0000\u0abd\u0abe\u0007\u0007\u0000\u0000\u0abe\u0abf\u0007"+ + "\n\u0000\u0000\u0abf\u0ac0\u0007\u0004\u0000\u0000\u0ac0\u0ac1\u0007\u000b"+ + "\u0000\u0000\u0ac1\u0ac2\u0007\u0011\u0000\u0000\u0ac2\u0ac3\u0007\u0003"+ + "\u0000\u0000\u0ac3\u0ac4\u0007\n\u0000\u0000\u0ac4\u0ac5\u0005_\u0000"+ + "\u0000\u0ac5\u0ac6\u0007\u0002\u0000\u0000\u0ac6\u0ac7\u0007\u0015\u0000"+ + "\u0000\u0ac7\u0ac8\u0007\u0015\u0000\u0000\u0ac8\u0ac9\u0007\u000e\u0000"+ + "\u0000\u0ac9\u0aca\u0007\t\u0000\u0000\u0aca\u0acb\u0007\u0012\u0000\u0000"+ + "\u0acb\u01f2\u0001\u0000\u0000\u0000\u0acc\u0acd\u0007\u000e\u0000\u0000"+ + "\u0acd\u0ace\u0007\n\u0000\u0000\u0ace\u0acf\u0007\u0014\u0000\u0000\u0acf"+ + "\u0ad0\u0007\n\u0000\u0000\u0ad0\u0ad1\u0007\u0012\u0000\u0000\u0ad1\u0ad2"+ + "\u0007\u0015\u0000\u0000\u0ad2\u0ad3\u0005_\u0000\u0000\u0ad3\u0ad4\u0007"+ + "\u001a\u0000\u0000\u0ad4\u0ad5\u0007\u000f\u0000\u0000\u0ad5\u0ad6\u0007"+ + "\n\u0000\u0000\u0ad6\u0ad7\u0007\u000e\u0000\u0000\u0ad7\u0ad8\u0007\r"+ + "\u0000\u0000\u0ad8\u01f4\u0001\u0000\u0000\u0000\u0ad9\u0ada\u0007\u000e"+ + "\u0000\u0000\u0ada\u0adb\u0007\n\u0000\u0000\u0adb\u0adc\u0007\u0017\u0000"+ + "\u0000\u0adc\u0add\u0007\n\u0000\u0000\u0add\u0ade\u0007\u000e\u0000\u0000"+ + "\u0ade\u0adf\u0007\u0006\u0000\u0000\u0adf\u0ae0\u0007\n\u0000\u0000\u0ae0"+ + "\u0ae1\u0005_\u0000\u0000\u0ae1\u0ae2\u0007\u0004\u0000\u0000\u0ae2\u0ae3"+ + "\u0007\n\u0000\u0000\u0ae3\u0ae4\u0007\u0006\u0000\u0000\u0ae4\u0ae5\u0007"+ + "\u000b\u0000\u0000\u0ae5\u0ae6\u0007\n\u0000\u0000\u0ae6\u0ae7\u0007\u0005"+ + "\u0000\u0000\u0ae7\u01f6\u0001\u0000\u0000\u0000\u0ae8\u0ae9\u0007\u001a"+ + "\u0000\u0000\u0ae9\u0aea\u0007\u000f\u0000\u0000\u0aea\u0aeb\u0007\n\u0000"+ + "\u0000\u0aeb\u0aec\u0007\u000e\u0000\u0000\u0aec\u0aed\u0007\r\u0000\u0000"+ + "\u0aed\u01f8\u0001\u0000\u0000\u0000\u0aee\u0aef\u0007\u000e\u0000\u0000"+ + "\u0aef\u0af0\u0007\u0002\u0000\u0000\u0af0\u0af1\u0007\u0004\u0000\u0000"+ + "\u0af1\u0af2\u0007\u0014\u0000\u0000\u0af2\u0af3\u0007\n\u0000\u0000\u0af3"+ + "\u01fa\u0001\u0000\u0000\u0000\u0af4\u0af5\u0007\u0006\u0000\u0000\u0af5"+ + "\u0af6\u0007\u0007\u0000\u0000\u0af6\u0af7\u0007\t\u0000\u0000\u0af7\u0af8"+ + "\u0007\u000e\u0000\u0000\u0af8\u0af9\u0007\n\u0000\u0000\u0af9\u01fc\u0001"+ + "\u0000\u0000\u0000\u0afa\u0afb\u0007\u0006\u0000\u0000\u0afb\u0afc\u0007"+ + "\u0007\u0000\u0000\u0afc\u0afd\u0007\t\u0000\u0000\u0afd\u0afe\u0007\u000e"+ + "\u0000\u0000\u0afe\u0aff\u0007\n\u0000\u0000\u0aff\u0b00\u0007\u001a\u0000"+ + "\u0000\u0b00\u0b01\u0007\u000f\u0000\u0000\u0b01\u0b02\u0007\n\u0000\u0000"+ + "\u0b02\u0b03\u0007\u000e\u0000\u0000\u0b03\u0b04\u0007\r\u0000\u0000\u0b04"+ + "\u01fe\u0001\u0000\u0000\u0000\u0b05\u0b06\u0007\u0006\u0000\u0000\u0b06"+ + "\u0b07\u0007\u0007\u0000\u0000\u0b07\u0b08\u0007\t\u0000\u0000\u0b08\u0b09"+ + "\u0007\u000e\u0000\u0000\u0b09\u0b0a\u0007\n\u0000\u0000\u0b0a\u0b0b\u0005"+ + "_\u0000\u0000\u0b0b\u0b0c\u0007\u001a\u0000\u0000\u0b0c\u0b0d\u0007\u000f"+ + "\u0000\u0000\u0b0d\u0b0e\u0007\n\u0000\u0000\u0b0e\u0b0f\u0007\u000e\u0000"+ + "\u0000\u0b0f\u0b10\u0007\r\u0000\u0000\u0b10\u0200\u0001\u0000\u0000\u0000"+ + "\u0b11\u0b12\u0007\u0006\u0000\u0000\u0b12\u0b13\u0007\n\u0000\u0000\u0b13"+ + "\u0b14\u0007\u0007\u0000\u0000\u0b14\u0b15\u0007\t\u0000\u0000\u0b15\u0b16"+ + "\u0007\u0004\u0000\u0000\u0b16\u0b17\u0007\u0005\u0000\u0000\u0b17\u0b18"+ + "\u0005_\u0000\u0000\u0b18\u0b19\u0007\t\u0000\u0000\u0b19\u0b1a\u0007"+ + "\u0013\u0000\u0000\u0b1a\u0b1b\u0005_\u0000\u0000\u0b1b\u0b1c\u0007\u0010"+ + "\u0000\u0000\u0b1c\u0b1d\u0007\u0011\u0000\u0000\u0b1d\u0b1e\u0007\u0004"+ + "\u0000\u0000\u0b1e\u0b1f\u0007\u000f\u0000\u0000\u0b1f\u0b20\u0007\u000b"+ + "\u0000\u0000\u0b20\u0b21\u0007\n\u0000\u0000\u0b21\u0202\u0001\u0000\u0000"+ + "\u0000\u0b22\u0b23\u0007\u0006\u0000\u0000\u0b23\u0b24\u0007\u000b\u0000"+ + "\u0000\u0b24\u0b25\u0007\u0002\u0000\u0000\u0b25\u0b26\u0007\u000b\u0000"+ + "\u0000\u0b26\u0b27\u0007\u0006\u0000\u0000\u0b27\u0204\u0001\u0000\u0000"+ + "\u0000\u0b28\u0b29\u0007\u000b\u0000\u0000\u0b29\u0b2a\u0007\n\u0000\u0000"+ + "\u0b2a\u0b2b\u0007\u000e\u0000\u0000\u0b2b\u0b2c\u0007\u0010\u0000\u0000"+ + "\u0b2c\u0206\u0001\u0000\u0000\u0000\u0b2d\u0b2e\u0007\u000b\u0000\u0000"+ + "\u0b2e\u0b2f\u0007\n\u0000\u0000\u0b2f\u0b30\u0007\u000e\u0000\u0000\u0b30"+ + "\u0b31\u0007\u0010\u0000\u0000\u0b31\u0b32\u0007\u0006\u0000\u0000\u0b32"+ + "\u0208\u0001\u0000\u0000\u0000\u0b33\u0b34\u0007\u000b\u0000\u0000\u0b34"+ + "\u0b35\u0007\u0011\u0000\u0000\u0b35\u0b36\u0007\u0010\u0000\u0000\u0b36"+ + "\u0b37\u0007\n\u0000\u0000\u0b37\u0b38\u0007\u0006\u0000\u0000\u0b38\u0b39"+ + "\u0007\u000b\u0000\u0000\u0b39\u0b3a\u0007\u0002\u0000\u0000\u0b3a\u0b3b"+ + "\u0007\u0010\u0000\u0000\u0b3b\u0b3c\u0007\u0015\u0000\u0000\u0b3c\u0b3d"+ + "\u0007\u0002\u0000\u0000\u0b3d\u0b3e\u0007\u0005\u0000\u0000\u0b3e\u0b3f"+ + "\u0007\u0005\u0000\u0000\u0b3f\u020a\u0001\u0000\u0000\u0000\u0b40\u0b41"+ + "\u0007\u000b\u0000\u0000\u0b41\u0b42\u0007\u0011\u0000\u0000\u0b42\u0b43"+ + "\u0007\u0010\u0000\u0000\u0b43\u0b44\u0007\n\u0000\u0000\u0b44\u0b45\u0007"+ + "\u0006\u0000\u0000\u0b45\u0b46\u0007\u000b\u0000\u0000\u0b46\u0b47\u0007"+ + "\u0002\u0000\u0000\u0b47\u0b48\u0007\u0010\u0000\u0000\u0b48\u0b49\u0007"+ + "\u0015\u0000\u0000\u0b49\u0b4a\u0007\u0005\u0000\u0000\u0b4a\u0b4b\u0007"+ + "\u0011\u0000\u0000\u0b4b\u0b4c\u0007\u0013\u0000\u0000\u0b4c\u0b4d\u0007"+ + "\u0013\u0000\u0000\u0b4d\u020c\u0001\u0000\u0000\u0000\u0b4e\u0b4f\u0007"+ + "\u000b\u0000\u0000\u0b4f\u0b50\u0007\t\u0000\u0000\u0b50\u0b51\u0007\u0015"+ + "\u0000\u0000\u0b51\u0b52\u0007\u0016\u0000\u0000\u0b52\u0b53\u0007\u0011"+ + "\u0000\u0000\u0b53\u0b54\u0007\u000b\u0000\u0000\u0b54\u0b55\u0007\u0006"+ + "\u0000\u0000\u0b55\u020e\u0001\u0000\u0000\u0000\u0b56\u0b57\u0007\u000b"+ + "\u0000\u0000\u0b57\u0b58\u0007\r\u0000\u0000\u0b58\u0b59\u0007\u0015\u0000"+ + "\u0000\u0b59\u0b5a\u0007\n\u0000\u0000\u0b5a\u0b5b\u0007\t\u0000\u0000"+ + "\u0b5b\u0b5c\u0007\u0013\u0000\u0000\u0b5c\u0210\u0001\u0000\u0000\u0000"+ + "\u0b5d\u0b5e\u0007\f\u0000\u0000\u0b5e\u0b5f\u0007\n\u0000\u0000\u0b5f"+ + "\u0b60\u0007\n\u0000\u0000\u0b60\u0b61\u0007\u0019\u0000\u0000\u0b61\u0b62"+ + "\u0005_\u0000\u0000\u0b62\u0b63\u0007\t\u0000\u0000\u0b63\u0b64\u0007"+ + "\u0013\u0000\u0000\u0b64\u0b65\u0005_\u0000\u0000\u0b65\u0b66\u0007\r"+ + "\u0000\u0000\u0b66\u0b67\u0007\n\u0000\u0000\u0b67\u0b68\u0007\u0002\u0000"+ + "\u0000\u0b68\u0b69\u0007\u000e\u0000\u0000\u0b69\u0212\u0001\u0000\u0000"+ + "\u0000\u0b6a\u0b6b\u0007\f\u0000\u0000\u0b6b\u0b6c\u0007\n\u0000\u0000"+ + "\u0b6c\u0b6d\u0007\n\u0000\u0000\u0b6d\u0b6e\u0007\u0019\u0000\u0000\u0b6e"+ + "\u0b6f\u0007\t\u0000\u0000\u0b6f\u0b70\u0007\u0013\u0000\u0000\u0b70\u0b71"+ + "\u0007\r\u0000\u0000\u0b71\u0b72\u0007\n\u0000\u0000\u0b72\u0b73\u0007"+ + "\u0002\u0000\u0000\u0b73\u0b74\u0007\u000e\u0000\u0000\u0b74\u0214\u0001"+ + "\u0000\u0000\u0000\u0b75\u0b76\u0007\f\u0000\u0000\u0b76\u0b77\u0007\n"+ + "\u0000\u0000\u0b77\u0b78\u0007\n\u0000\u0000\u0b78\u0b79\u0007\u0019\u0000"+ + "\u0000\u0b79\u0b7a\u0007\u0005\u0000\u0000\u0b7a\u0b7b\u0007\u0002\u0000"+ + "\u0000\u0b7b\u0b7c\u0007\r\u0000\u0000\u0b7c\u0216\u0001\u0000\u0000\u0000"+ + "\u0b7d\u0b7e\u0007\f\u0000\u0000\u0b7e\u0b7f\u0007\u0011\u0000\u0000\u0b7f"+ + "\u0b80\u0007\u0003\u0000\u0000\u0b80\u0b81\u0007\u0005\u0000\u0000\u0b81"+ + "\u0b82\u0007\u0007\u0000\u0000\u0b82\u0b83\u0007\u0002\u0000\u0000\u0b83"+ + "\u0b84\u0007\u000e\u0000\u0000\u0b84\u0b85\u0007\u0005\u0000\u0000\u0b85"+ + "\u0b86\u0007\u001a\u0000\u0000\u0b86\u0b87\u0007\u000f\u0000\u0000\u0b87"+ + "\u0b88\u0007\n\u0000\u0000\u0b88\u0b89\u0007\u000e\u0000\u0000\u0b89\u0b8a"+ + "\u0007\r\u0000\u0000\u0b8a\u0218\u0001\u0000\u0000\u0000\u0b8b\u0b8c\u0007"+ + "\f\u0000\u0000\u0b8c\u0b8d\u0007\u0011\u0000\u0000\u0b8d\u0b8e\u0007\u0003"+ + "\u0000\u0000\u0b8e\u0b8f\u0007\u0005\u0000\u0000\u0b8f\u0b90\u0007\u0007"+ + "\u0000\u0000\u0b90\u0b91\u0007\u0002\u0000\u0000\u0b91\u0b92\u0007\u000e"+ + "\u0000\u0000\u0b92\u0b93\u0007\u0005\u0000\u0000\u0b93\u0b94\u0005_\u0000"+ + "\u0000\u0b94\u0b95\u0007\u001a\u0000\u0000\u0b95\u0b96\u0007\u000f\u0000"+ + "\u0000\u0b96\u0b97\u0007\n\u0000\u0000\u0b97\u0b98\u0007\u000e\u0000\u0000"+ + "\u0b98\u0b99\u0007\r\u0000\u0000\u0b99\u021a\u0001\u0000\u0000\u0000\u0b9a"+ + "\u0b9b\u0007\u0006\u0000\u0000\u0b9b\u0b9c\u0007\u000f\u0000\u0000\u0b9c"+ + "\u0b9d\u0007\b\u0000\u0000\u0b9d\u0b9e\u0007\u0006\u0000\u0000\u0b9e\u0b9f"+ + "\u0007\u000b\u0000\u0000\u0b9f\u0ba0\u0007\u000e\u0000\u0000\u0ba0\u021c"+ + "\u0001\u0000\u0000\u0000\u0ba1\u0ba2\u0007\u0006\u0000\u0000\u0ba2\u0ba3"+ + "\u0007\u000b\u0000\u0000\u0ba3\u0ba4\u0007\u000e\u0000\u0000\u0ba4\u0ba5"+ + "\u0007\u0007\u0000\u0000\u0ba5\u0ba6\u0007\u0010\u0000\u0000\u0ba6\u0ba7"+ + "\u0007\u0015\u0000\u0000\u0ba7\u021e\u0001\u0000\u0000\u0000\u0ba8\u0ba9"+ + "\u0007\u0002\u0000\u0000\u0ba9\u0baa\u0007\u0005\u0000\u0000\u0baa\u0bab"+ + "\u0007\u0005\u0000\u0000\u0bab\u0bac\u0007\u0005\u0000\u0000\u0bac\u0bad"+ + "\u0007\u0002\u0000\u0000\u0bad\u0bae\u0007\u000b\u0000\u0000\u0bae\u0baf"+ + "\u0007\n\u0000\u0000\u0baf\u0220\u0001\u0000\u0000\u0000\u0bb0\u0bb1\u0007"+ + "\r\u0000\u0000\u0bb1\u0bb2\u0007\n\u0000\u0000\u0bb2\u0bb3\u0007\u0002"+ + "\u0000\u0000\u0bb3\u0bb4\u0007\u000e\u0000\u0000\u0bb4\u0bb5\u0007\f\u0000"+ + "\u0000\u0bb5\u0bb6\u0007\n\u0000\u0000\u0bb6\u0bb7\u0007\n\u0000\u0000"+ + "\u0bb7\u0bb8\u0007\u0019\u0000\u0000\u0bb8\u0222\u0001\u0000\u0000\u0000"+ + "\u0bb9\u0bba\u0007\u0002\u0000\u0000\u0bba\u0bbb\u0007\u0003\u0000\u0000"+ + "\u0bbb\u0bbc\u0007\u0003\u0000\u0000\u0bbc\u0bbd\u0007\t\u0000\u0000\u0bbd"+ + "\u0bbe\u0007\f\u0000\u0000\u0bbe\u0bbf\u0005_\u0000\u0000\u0bbf\u0bc0"+ + "\u0007\u0003\u0000\u0000\u0bc0\u0bc1\u0007\n\u0000\u0000\u0bc1\u0bc2\u0007"+ + "\u0002\u0000\u0000\u0bc2\u0bc3\u0007\u0005\u0000\u0000\u0bc3\u0bc4\u0007"+ + "\u0011\u0000\u0000\u0bc4\u0bc5\u0007\u0004\u0000\u0000\u0bc5\u0bc6\u0007"+ + "\u0014\u0000\u0000\u0bc6\u0bc7\u0005_\u0000\u0000\u0bc7\u0bc8\u0007\f"+ + "\u0000\u0000\u0bc8\u0bc9\u0007\u0011\u0000\u0000\u0bc9\u0bca\u0007\u0003"+ + "\u0000\u0000\u0bca\u0bcb\u0007\u0005\u0000\u0000\u0bcb\u0bcc\u0007\u0007"+ + "\u0000\u0000\u0bcc\u0bcd\u0007\u0002\u0000\u0000\u0bcd\u0bce\u0007\u000e"+ + "\u0000\u0000\u0bce\u0bcf\u0007\u0005\u0000\u0000\u0bcf\u0224\u0001\u0000"+ + "\u0000\u0000\u0bd0\u0bd1\u0007\u0002\u0000\u0000\u0bd1\u0bd2\u0007\u0004"+ + "\u0000\u0000\u0bd2\u0bd3\u0007\u0002\u0000\u0000\u0bd3\u0bd4\u0007\u0003"+ + "\u0000\u0000\u0bd4\u0bd5\u0007\r\u0000\u0000\u0bd5\u0bd6\u0007\u001b\u0000"+ + "\u0000\u0bd6\u0bd7\u0007\n\u0000\u0000\u0bd7\u0bd8\u0007\u000e\u0000\u0000"+ + "\u0bd8\u0226\u0001\u0000\u0000\u0000\u0bd9\u0bda\u0007\u0002\u0000\u0000"+ + "\u0bda\u0bdb\u0007\u0004\u0000\u0000\u0bdb\u0bdc\u0007\u0002\u0000\u0000"+ + "\u0bdc\u0bdd\u0007\u0003\u0000\u0000\u0bdd\u0bde\u0007\r\u0000\u0000\u0bde"+ + "\u0bdf\u0007\u001b\u0000\u0000\u0bdf\u0be0\u0007\n\u0000\u0000\u0be0\u0be1"+ + "\u0005_\u0000\u0000\u0be1\u0be2\u0007\f\u0000\u0000\u0be2\u0be3\u0007"+ + "\u0011\u0000\u0000\u0be3\u0be4\u0007\u0003\u0000\u0000\u0be4\u0be5\u0007"+ + "\u0005\u0000\u0000\u0be5\u0be6\u0007\u0007\u0000\u0000\u0be6\u0be7\u0007"+ + "\u0002\u0000\u0000\u0be7\u0be8\u0007\u000e\u0000\u0000\u0be8\u0be9\u0007"+ + "\u0005\u0000\u0000\u0be9\u0228\u0001\u0000\u0000\u0000\u0bea\u0beb\u0007"+ + "\u0002\u0000\u0000\u0beb\u0bec\u0007\u000f\u0000\u0000\u0bec\u0bed\u0007"+ + "\u000b\u0000\u0000\u0bed\u0bee\u0007\t\u0000\u0000\u0bee\u0bef\u0005_"+ + "\u0000\u0000\u0bef\u0bf0\u0007\u0014\u0000\u0000\u0bf0\u0bf1\u0007\n\u0000"+ + "\u0000\u0bf1\u0bf2\u0007\u0004\u0000\u0000\u0bf2\u0bf3\u0007\n\u0000\u0000"+ + "\u0bf3\u0bf4\u0007\u000e\u0000\u0000\u0bf4\u0bf5\u0007\u0002\u0000\u0000"+ + "\u0bf5\u0bf6\u0007\u000b\u0000\u0000\u0bf6\u0bf7\u0007\n\u0000\u0000\u0bf7"+ + "\u0bf8\u0005_\u0000\u0000\u0bf8\u0bf9\u0007\u0006\u0000\u0000\u0bf9\u0bfa"+ + "\u0007\r\u0000\u0000\u0bfa\u0bfb\u0007\u0004\u0000\u0000\u0bfb\u0bfc\u0007"+ + "\t\u0000\u0000\u0bfc\u0bfd\u0007\u0004\u0000\u0000\u0bfd\u0bfe\u0007\r"+ + "\u0000\u0000\u0bfe\u0bff\u0007\u0010\u0000\u0000\u0bff\u0c00\u0007\u0006"+ + "\u0000\u0000\u0c00\u0c01\u0005_\u0000\u0000\u0c01\u0c02\u0007\u0015\u0000"+ + "\u0000\u0c02\u0c03\u0007\u0016\u0000\u0000\u0c03\u0c04\u0007\u000e\u0000"+ + "\u0000\u0c04\u0c05\u0007\u0002\u0000\u0000\u0c05\u0c06\u0007\u0006\u0000"+ + "\u0000\u0c06\u0c07\u0007\n\u0000\u0000\u0c07\u0c08\u0005_\u0000\u0000"+ + "\u0c08\u0c09\u0007\u001a\u0000\u0000\u0c09\u0c0a\u0007\u000f\u0000\u0000"+ + "\u0c0a\u0c0b\u0007\n\u0000\u0000\u0c0b\u0c0c\u0007\u000e\u0000\u0000\u0c0c"+ + "\u0c0d\u0007\r\u0000\u0000\u0c0d\u022a\u0001\u0000\u0000\u0000\u0c0e\u0c0f"+ + "\u0007\b\u0000\u0000\u0c0f\u0c10\u0007\t\u0000\u0000\u0c10\u0c11\u0007"+ + "\t\u0000\u0000\u0c11\u0c12\u0007\u0006\u0000\u0000\u0c12\u0c13\u0007\u000b"+ + "\u0000\u0000\u0c13\u022c\u0001\u0000\u0000\u0000\u0c14\u0c15\u0007\u0007"+ + "\u0000\u0000\u0c15\u0c16\u0007\u0002\u0000\u0000\u0c16\u0c17\u0007\u0006"+ + "\u0000\u0000\u0c17\u0c18\u0007\n\u0000\u0000\u0c18\u0c19\u0005_\u0000"+ + "\u0000\u0c19\u0c1a\u0007\u0011\u0000\u0000\u0c1a\u0c1b\u0007\u0004\u0000"+ + "\u0000\u0c1b\u0c1c\u0007\u0006\u0000\u0000\u0c1c\u0c1d\u0007\n\u0000\u0000"+ + "\u0c1d\u0c1e\u0007\u0004\u0000\u0000\u0c1e\u0c1f\u0007\u0006\u0000\u0000"+ + "\u0c1f\u0c20\u0007\u0011\u0000\u0000\u0c20\u0c21\u0007\u000b\u0000\u0000"+ + "\u0c21\u0c22\u0007\u0011\u0000\u0000\u0c22\u0c23\u0007\u0017\u0000\u0000"+ + "\u0c23\u0c24\u0007\n\u0000\u0000\u0c24\u022e\u0001\u0000\u0000\u0000\u0c25"+ + "\u0c26\u0007\u0007\u0000\u0000\u0c26\u0c27\u0007\u000f\u0000\u0000\u0c27"+ + "\u0c28\u0007\u000b\u0000\u0000\u0c28\u0c29\u0007\t\u0000\u0000\u0c29\u0c2a"+ + "\u0007\u0013\u0000\u0000\u0c2a\u0c2b\u0007\u0013\u0000\u0000\u0c2b\u0c2c"+ + "\u0005_\u0000\u0000\u0c2c\u0c2d\u0007\u0013\u0000\u0000\u0c2d\u0c2e\u0007"+ + "\u000e\u0000\u0000\u0c2e\u0c2f\u0007\n\u0000\u0000\u0c2f\u0c30\u0007\u001a"+ + "\u0000\u0000\u0c30\u0c31\u0007\u000f\u0000\u0000\u0c31\u0c32\u0007\n\u0000"+ + "\u0000\u0c32\u0c33\u0007\u0004\u0000\u0000\u0c33\u0c34\u0007\u0007\u0000"+ + "\u0000\u0c34\u0c35\u0007\r\u0000\u0000\u0c35\u0230\u0001\u0000\u0000\u0000"+ + "\u0c36\u0c37\u0007\u0005\u0000\u0000\u0c37\u0c38\u0007\n\u0000\u0000\u0c38"+ + "\u0c39\u0007\u0013\u0000\u0000\u0c39\u0c3a\u0007\u0002\u0000\u0000\u0c3a"+ + "\u0c3b\u0007\u000f\u0000\u0000\u0c3b\u0c3c\u0007\u0003\u0000\u0000\u0c3c"+ + "\u0c3d\u0007\u000b\u0000\u0000\u0c3d\u0c3e\u0005_\u0000\u0000\u0c3e\u0c3f"+ + "\u0007\u0013\u0000\u0000\u0c3f\u0c40\u0007\u0011\u0000\u0000\u0c40\u0c41"+ + "\u0007\n\u0000\u0000\u0c41\u0c42\u0007\u0003\u0000\u0000\u0c42\u0c43\u0007"+ + "\u0005\u0000\u0000\u0c43\u0232\u0001\u0000\u0000\u0000\u0c44\u0c45\u0007"+ + "\u0005\u0000\u0000\u0c45\u0c46\u0007\n\u0000\u0000\u0c46\u0c47\u0007\u0013"+ + "\u0000\u0000\u0c47\u0c48\u0007\u0002\u0000\u0000\u0c48\u0c49\u0007\u000f"+ + "\u0000\u0000\u0c49\u0c4a\u0007\u0003\u0000\u0000\u0c4a\u0c4b\u0007\u000b"+ + "\u0000\u0000\u0c4b\u0c4c\u0005_\u0000\u0000\u0c4c\u0c4d\u0007\t\u0000"+ + "\u0000\u0c4d\u0c4e\u0007\u0015\u0000\u0000\u0c4e\u0c4f\u0007\n\u0000\u0000"+ + "\u0c4f\u0c50\u0007\u000e\u0000\u0000\u0c50\u0c51\u0007\u0002\u0000\u0000"+ + "\u0c51\u0c52\u0007\u000b\u0000\u0000\u0c52\u0c53\u0007\t\u0000\u0000\u0c53"+ + "\u0c54\u0007\u000e\u0000\u0000\u0c54\u0234\u0001\u0000\u0000\u0000\u0c55"+ + "\u0c56\u0007\n\u0000\u0000\u0c56\u0c57\u0007\u0006\u0000\u0000\u0c57\u0c58"+ + "\u0007\u0007\u0000\u0000\u0c58\u0c59\u0007\u0002\u0000\u0000\u0c59\u0c5a"+ + "\u0007\u0015\u0000\u0000\u0c5a\u0c5b\u0007\n\u0000\u0000\u0c5b\u0236\u0001"+ + "\u0000\u0000\u0000\u0c5c\u0c5d\u0007\n\u0000\u0000\u0c5d\u0c5e\u0007\u0004"+ + "\u0000\u0000\u0c5e\u0c5f\u0007\u0002\u0000\u0000\u0c5f\u0c60\u0007\b\u0000"+ + "\u0000\u0c60\u0c61\u0007\u0003\u0000\u0000\u0c61\u0c62\u0007\n\u0000\u0000"+ + "\u0c62\u0c63\u0005_\u0000\u0000\u0c63\u0c64\u0007\u0015\u0000\u0000\u0c64"+ + "\u0c65\u0007\t\u0000\u0000\u0c65\u0c66\u0007\u0006\u0000\u0000\u0c66\u0c67"+ + "\u0007\u0011\u0000\u0000\u0c67\u0c68\u0007\u000b\u0000\u0000\u0c68\u0c69"+ + "\u0007\u0011\u0000\u0000\u0c69\u0c6a\u0007\t\u0000\u0000\u0c6a\u0c6b\u0007"+ + "\u0004\u0000\u0000\u0c6b\u0c6c\u0005_\u0000\u0000\u0c6c\u0c6d\u0007\u0011"+ + "\u0000\u0000\u0c6d\u0c6e\u0007\u0004\u0000\u0000\u0c6e\u0c6f\u0007\u0007"+ + "\u0000\u0000\u0c6f\u0c70\u0007\u000e\u0000\u0000\u0c70\u0c71\u0007\n\u0000"+ + "\u0000\u0c71\u0c72\u0007\u0010\u0000\u0000\u0c72\u0c73\u0007\n\u0000\u0000"+ + "\u0c73\u0c74\u0007\u0004\u0000\u0000\u0c74\u0c75\u0007\u000b\u0000\u0000"+ + "\u0c75\u0c76\u0007\u0006\u0000\u0000\u0c76\u0238\u0001\u0000\u0000\u0000"+ + "\u0c77\u0c78\u0007\u0013\u0000\u0000\u0c78\u0c79\u0007\u0011\u0000\u0000"+ + "\u0c79\u0c7a\u0007\n\u0000\u0000\u0c7a\u0c7b\u0007\u0003\u0000\u0000\u0c7b"+ + "\u0c7c\u0007\u0005\u0000\u0000\u0c7c\u0c7d\u0007\u0006\u0000\u0000\u0c7d"+ + "\u023a\u0001\u0000\u0000\u0000\u0c7e\u0c7f\u0007\u0013\u0000\u0000\u0c7f"+ + "\u0c80\u0007\u0003\u0000\u0000\u0c80\u0c81\u0007\u0002\u0000\u0000\u0c81"+ + "\u0c82\u0007\u0014\u0000\u0000\u0c82\u0c83\u0007\u0006\u0000\u0000\u0c83"+ + "\u023c\u0001\u0000\u0000\u0000\u0c84\u0c85\u0007\u0013\u0000\u0000\u0c85"+ + "\u0c86\u0007\u000f\u0000\u0000\u0c86\u0c87\u0007\u001b\u0000\u0000\u0c87"+ + "\u0c88\u0007\u001b\u0000\u0000\u0c88\u0c89\u0007\u0011\u0000\u0000\u0c89"+ + "\u0c8a\u0007\u0004\u0000\u0000\u0c8a\u0c8b\u0007\n\u0000\u0000\u0c8b\u0c8c"+ + "\u0007\u0006\u0000\u0000\u0c8c\u0c8d\u0007\u0006\u0000\u0000\u0c8d\u023e"+ + "\u0001\u0000\u0000\u0000\u0c8e\u0c8f\u0007\u0013\u0000\u0000\u0c8f\u0c90"+ + "\u0007\u000f\u0000\u0000\u0c90\u0c91\u0007\u001b\u0000\u0000\u0c91\u0c92"+ + "\u0007\u001b\u0000\u0000\u0c92\u0c93\u0007\r\u0000\u0000\u0c93\u0c94\u0005"+ + "_\u0000\u0000\u0c94\u0c95\u0007\u0010\u0000\u0000\u0c95\u0c96\u0007\u0002"+ + "\u0000\u0000\u0c96\u0c97\u0007\u0012\u0000\u0000\u0c97\u0c98\u0005_\u0000"+ + "\u0000\u0c98\u0c99\u0007\n\u0000\u0000\u0c99\u0c9a\u0007\u0012\u0000\u0000"+ + "\u0c9a\u0c9b\u0007\u0015\u0000\u0000\u0c9b\u0c9c\u0007\u0002\u0000\u0000"+ + "\u0c9c\u0c9d\u0007\u0004\u0000\u0000\u0c9d\u0c9e\u0007\u0006\u0000\u0000"+ + "\u0c9e\u0c9f\u0007\u0011\u0000\u0000\u0c9f\u0ca0\u0007\t\u0000\u0000\u0ca0"+ + "\u0ca1\u0007\u0004\u0000\u0000\u0ca1\u0ca2\u0007\u0006\u0000\u0000\u0ca2"+ + "\u0240\u0001\u0000\u0000\u0000\u0ca3\u0ca4\u0007\u0013\u0000\u0000\u0ca4"+ + "\u0ca5\u0007\u000f\u0000\u0000\u0ca5\u0ca6\u0007\u001b\u0000\u0000\u0ca6"+ + "\u0ca7\u0007\u001b\u0000\u0000\u0ca7\u0ca8\u0007\r\u0000\u0000\u0ca8\u0ca9"+ + "\u0005_\u0000\u0000\u0ca9\u0caa\u0007\u0015\u0000\u0000\u0caa\u0cab\u0007"+ + "\u000e\u0000\u0000\u0cab\u0cac\u0007\n\u0000\u0000\u0cac\u0cad\u0007\u0013"+ + "\u0000\u0000\u0cad\u0cae\u0007\u0011\u0000\u0000\u0cae\u0caf\u0007\u0012"+ + "\u0000\u0000\u0caf\u0cb0\u0005_\u0000\u0000\u0cb0\u0cb1\u0007\u0003\u0000"+ + "\u0000\u0cb1\u0cb2\u0007\n\u0000\u0000\u0cb2\u0cb3\u0007\u0004\u0000\u0000"+ + "\u0cb3\u0cb4\u0007\u0014\u0000\u0000\u0cb4\u0cb5\u0007\u000b\u0000\u0000"+ + "\u0cb5\u0cb6\u0007\u0016\u0000\u0000\u0cb6\u0242\u0001\u0000\u0000\u0000"+ + "\u0cb7\u0cb8\u0007\u0013\u0000\u0000\u0cb8\u0cb9\u0007\u000f\u0000\u0000"+ + "\u0cb9\u0cba\u0007\u001b\u0000\u0000\u0cba\u0cbb\u0007\u001b\u0000\u0000"+ + "\u0cbb\u0cbc\u0007\r\u0000\u0000\u0cbc\u0cbd\u0005_\u0000\u0000\u0cbd"+ + "\u0cbe\u0007\u000e\u0000\u0000\u0cbe\u0cbf\u0007\n\u0000\u0000\u0cbf\u0cc0"+ + "\u0007\f\u0000\u0000\u0cc0\u0cc1\u0007\u000e\u0000\u0000\u0cc1\u0cc2\u0007"+ + "\u0011\u0000\u0000\u0cc2\u0cc3\u0007\u000b\u0000\u0000\u0cc3\u0cc4\u0007"+ + "\n\u0000\u0000\u0cc4\u0244\u0001\u0000\u0000\u0000\u0cc5\u0cc6\u0007\u0013"+ + "\u0000\u0000\u0cc6\u0cc7\u0007\u000f\u0000\u0000\u0cc7\u0cc8\u0007\u001b"+ + "\u0000\u0000\u0cc8\u0cc9\u0007\u001b\u0000\u0000\u0cc9\u0cca\u0007\r\u0000"+ + "\u0000\u0cca\u0ccb\u0005_\u0000\u0000\u0ccb\u0ccc\u0007\u000b\u0000\u0000"+ + "\u0ccc\u0ccd\u0007\u000e\u0000\u0000\u0ccd\u0cce\u0007\u0002\u0000\u0000"+ + "\u0cce\u0ccf\u0007\u0004\u0000\u0000\u0ccf\u0cd0\u0007\u0006\u0000\u0000"+ + "\u0cd0\u0cd1\u0007\u0015\u0000\u0000\u0cd1\u0cd2\u0007\t\u0000\u0000\u0cd2"+ + "\u0cd3\u0007\u0006\u0000\u0000\u0cd3\u0cd4\u0007\u0011\u0000\u0000\u0cd4"+ + "\u0cd5\u0007\u000b\u0000\u0000\u0cd5\u0cd6\u0007\u0011\u0000\u0000\u0cd6"+ + "\u0cd7\u0007\t\u0000\u0000\u0cd7\u0cd8\u0007\u0004\u0000\u0000\u0cd8\u0cd9"+ + "\u0007\u0006\u0000\u0000\u0cd9\u0246\u0001\u0000\u0000\u0000\u0cda\u0cdb"+ + "\u0007\u0003\u0000\u0000\u0cdb\u0cdc\u0007\n\u0000\u0000\u0cdc\u0cdd\u0007"+ + "\u0004\u0000\u0000\u0cdd\u0cde\u0007\u0011\u0000\u0000\u0cde\u0cdf\u0007"+ + "\n\u0000\u0000\u0cdf\u0ce0\u0007\u0004\u0000\u0000\u0ce0\u0ce1\u0007\u000b"+ + "\u0000\u0000\u0ce1\u0248\u0001\u0000\u0000\u0000\u0ce2\u0ce3\u0007\u0003"+ + "\u0000\u0000\u0ce3\u0ce4\u0007\t\u0000\u0000\u0ce4\u0ce5\u0007\f\u0000"+ + "\u0000\u0ce5\u0ce6\u0005_\u0000\u0000\u0ce6\u0ce7\u0007\u0013\u0000\u0000"+ + "\u0ce7\u0ce8\u0007\u000e\u0000\u0000\u0ce8\u0ce9\u0007\n\u0000\u0000\u0ce9"+ + "\u0cea\u0007\u001a\u0000\u0000\u0cea\u0ceb\u0005_\u0000\u0000\u0ceb\u0cec"+ + "\u0007\t\u0000\u0000\u0cec\u0ced\u0007\u0015\u0000\u0000\u0ced\u0cee\u0007"+ + "\n\u0000\u0000\u0cee\u0cef\u0007\u000e\u0000\u0000\u0cef\u0cf0\u0007\u0002"+ + "\u0000\u0000\u0cf0\u0cf1\u0007\u000b\u0000\u0000\u0cf1\u0cf2\u0007\t\u0000"+ + "\u0000\u0cf2\u0cf3\u0007\u000e\u0000\u0000\u0cf3\u024a\u0001\u0000\u0000"+ + "\u0000\u0cf4\u0cf5\u0007\u0010\u0000\u0000\u0cf5\u0cf6\u0007\u0002\u0000"+ + "\u0000\u0cf6\u0cf7\u0007\u0012\u0000\u0000\u0cf7\u0cf8\u0005_\u0000\u0000"+ + "\u0cf8\u0cf9\u0007\u0005\u0000\u0000\u0cf9\u0cfa\u0007\n\u0000\u0000\u0cfa"+ + "\u0cfb\u0007\u000b\u0000\u0000\u0cfb\u0cfc\u0007\n\u0000\u0000\u0cfc\u0cfd"+ + "\u0007\u000e\u0000\u0000\u0cfd\u0cfe\u0007\u0010\u0000\u0000\u0cfe\u0cff"+ + "\u0007\u0011\u0000\u0000\u0cff\u0d00\u0007\u0004\u0000\u0000\u0d00\u0d01"+ + "\u0007\u0011\u0000\u0000\u0d01\u0d02\u0007\u001b\u0000\u0000\u0d02\u0d03"+ + "\u0007\n\u0000\u0000\u0d03\u0d04\u0007\u0005\u0000\u0000\u0d04\u0d05\u0005"+ + "_\u0000\u0000\u0d05\u0d06\u0007\u0006\u0000\u0000\u0d06\u0d07\u0007\u000b"+ + "\u0000\u0000\u0d07\u0d08\u0007\u0002\u0000\u0000\u0d08\u0d09\u0007\u000b"+ + "\u0000\u0000\u0d09\u0d0a\u0007\n\u0000\u0000\u0d0a\u0d0b\u0007\u0006\u0000"+ + "\u0000\u0d0b\u024c\u0001\u0000\u0000\u0000\u0d0c\u0d0d\u0007\u0010\u0000"+ + "\u0000\u0d0d\u0d0e\u0007\u0002\u0000\u0000\u0d0e\u0d0f\u0007\u0012\u0000"+ + "\u0000\u0d0f\u0d10\u0005_\u0000\u0000\u0d10\u0d11\u0007\n\u0000\u0000"+ + "\u0d11\u0d12\u0007\u0012\u0000\u0000\u0d12\u0d13\u0007\u0015\u0000\u0000"+ + "\u0d13\u0d14\u0007\u0002\u0000\u0000\u0d14\u0d15\u0007\u0004\u0000\u0000"+ + "\u0d15\u0d16\u0007\u0006\u0000\u0000\u0d16\u0d17\u0007\u0011\u0000\u0000"+ + "\u0d17\u0d18\u0007\t\u0000\u0000\u0d18\u0d19\u0007\u0004\u0000\u0000\u0d19"+ + "\u0d1a\u0007\u0006\u0000\u0000\u0d1a\u024e\u0001\u0000\u0000\u0000\u0d1b"+ + "\u0d1c\u0007\u0010\u0000\u0000\u0d1c\u0d1d\u0007\u0011\u0000\u0000\u0d1d"+ + "\u0d1e\u0007\u0004\u0000\u0000\u0d1e\u0d1f\u0007\u0011\u0000\u0000\u0d1f"+ + "\u0d20\u0007\u0010\u0000\u0000\u0d20\u0d21\u0007\u000f\u0000\u0000\u0d21"+ + "\u0d22\u0007\u0010\u0000\u0000\u0d22\u0d23\u0005_\u0000\u0000\u0d23\u0d24"+ + "\u0007\u0006\u0000\u0000\u0d24\u0d25\u0007\u0016\u0000\u0000\u0d25\u0d26"+ + "\u0007\t\u0000\u0000\u0d26\u0d27\u0007\u000f\u0000\u0000\u0d27\u0d28\u0007"+ + "\u0003\u0000\u0000\u0d28\u0d29\u0007\u0005\u0000\u0000\u0d29\u0d2a\u0005"+ + "_\u0000\u0000\u0d2a\u0d2b\u0007\u0010\u0000\u0000\u0d2b\u0d2c\u0007\u0002"+ + "\u0000\u0000\u0d2c\u0d2d\u0007\u000b\u0000\u0000\u0d2d\u0d2e\u0007\u0007"+ + "\u0000\u0000\u0d2e\u0d2f\u0007\u0016\u0000\u0000\u0d2f\u0250\u0001\u0000"+ + "\u0000\u0000\u0d30\u0d31\u0007\t\u0000\u0000\u0d31\u0d32\u0007\u0015\u0000"+ + "\u0000\u0d32\u0d33\u0007\n\u0000\u0000\u0d33\u0d34\u0007\u000e\u0000\u0000"+ + "\u0d34\u0d35\u0007\u0002\u0000\u0000\u0d35\u0d36\u0007\u000b\u0000\u0000"+ + "\u0d36\u0d37\u0007\t\u0000\u0000\u0d37\u0d38\u0007\u000e\u0000\u0000\u0d38"+ + "\u0252\u0001\u0000\u0000\u0000\u0d39\u0d3a\u0007\u0015\u0000\u0000\u0d3a"+ + "\u0d3b\u0007\u0016\u0000\u0000\u0d3b\u0d3c\u0007\u000e\u0000\u0000\u0d3c"+ + "\u0d3d\u0007\u0002\u0000\u0000\u0d3d\u0d3e\u0007\u0006\u0000\u0000\u0d3e"+ + "\u0d3f\u0007\n\u0000\u0000\u0d3f\u0d40\u0005_\u0000\u0000\u0d40\u0d41"+ + "\u0007\u0006\u0000\u0000\u0d41\u0d42\u0007\u0003\u0000\u0000\u0d42\u0d43"+ + "\u0007\t\u0000\u0000\u0d43\u0d44\u0007\u0015\u0000\u0000\u0d44\u0254\u0001"+ + "\u0000\u0000\u0000\u0d45\u0d46\u0007\u0015\u0000\u0000\u0d46\u0d47\u0007"+ + "\u000e\u0000\u0000\u0d47\u0d48\u0007\n\u0000\u0000\u0d48\u0d49\u0007\u0013"+ + "\u0000\u0000\u0d49\u0d4a\u0007\u0011\u0000\u0000\u0d4a\u0d4b\u0007\u0012"+ + "\u0000\u0000\u0d4b\u0d4c\u0005_\u0000\u0000\u0d4c\u0d4d\u0007\u0003\u0000"+ + "\u0000\u0d4d\u0d4e\u0007\n\u0000\u0000\u0d4e\u0d4f\u0007\u0004\u0000\u0000"+ + "\u0d4f\u0d50\u0007\u0014\u0000\u0000\u0d50\u0d51\u0007\u000b\u0000\u0000"+ + "\u0d51\u0d52\u0007\u0016\u0000\u0000\u0d52\u0256\u0001\u0000\u0000\u0000"+ + "\u0d53\u0d54\u0007\u001a\u0000\u0000\u0d54\u0d55\u0007\u000f\u0000\u0000"+ + "\u0d55\u0d56\u0007\t\u0000\u0000\u0d56\u0d57\u0007\u000b\u0000\u0000\u0d57"+ + "\u0d58\u0007\n\u0000\u0000\u0d58\u0d59\u0005_\u0000\u0000\u0d59\u0d5a"+ + "\u0007\u0002\u0000\u0000\u0d5a\u0d5b\u0007\u0004\u0000\u0000\u0d5b\u0d5c"+ + "\u0007\u0002\u0000\u0000\u0d5c\u0d5d\u0007\u0003\u0000\u0000\u0d5d\u0d5e"+ + "\u0007\r\u0000\u0000\u0d5e\u0d5f\u0007\u001b\u0000\u0000\u0d5f\u0d60\u0007"+ + "\n\u0000\u0000\u0d60\u0d61\u0007\u000e\u0000\u0000\u0d61\u0258\u0001\u0000"+ + "\u0000\u0000\u0d62\u0d63\u0007\u001a\u0000\u0000\u0d63\u0d64\u0007\u000f"+ + "\u0000\u0000\u0d64\u0d65\u0007\t\u0000\u0000\u0d65\u0d66\u0007\u000b\u0000"+ + "\u0000\u0d66\u0d67\u0007\n\u0000\u0000\u0d67\u0d68\u0005_\u0000\u0000"+ + "\u0d68\u0d69\u0007\u0013\u0000\u0000\u0d69\u0d6a\u0007\u0011\u0000\u0000"+ + "\u0d6a\u0d6b\u0007\n\u0000\u0000\u0d6b\u0d6c\u0007\u0003\u0000\u0000\u0d6c"+ + "\u0d6d\u0007\u0005\u0000\u0000\u0d6d\u0d6e\u0005_\u0000\u0000\u0d6e\u0d6f"+ + "\u0007\u0006\u0000\u0000\u0d6f\u0d70\u0007\u000f\u0000\u0000\u0d70\u0d71"+ + "\u0007\u0013\u0000\u0000\u0d71\u0d72\u0007\u0013\u0000\u0000\u0d72\u0d73"+ + "\u0007\u0011\u0000\u0000\u0d73\u0d74\u0007\u0012\u0000\u0000\u0d74\u025a"+ + "\u0001\u0000\u0000\u0000\u0d75\u0d76\u0007\u000e\u0000\u0000\u0d76\u0d77"+ + "\u0007\n\u0000\u0000\u0d77\u0d78\u0007\f\u0000\u0000\u0d78\u0d79\u0007"+ + "\u000e\u0000\u0000\u0d79\u0d7a\u0007\u0011\u0000\u0000\u0d7a\u0d7b\u0007"+ + "\u000b\u0000\u0000\u0d7b\u0d7c\u0007\n\u0000\u0000\u0d7c\u025c\u0001\u0000"+ + "\u0000\u0000\u0d7d\u0d7e\u0007\u0006\u0000\u0000\u0d7e\u0d7f\u0007\u0003"+ + "\u0000\u0000\u0d7f\u0d80\u0007\t\u0000\u0000\u0d80\u0d81\u0007\u0015\u0000"+ + "\u0000\u0d81\u025e\u0001\u0000\u0000\u0000\u0d82\u0d83\u0007\u000b\u0000"+ + "\u0000\u0d83\u0d84\u0007\u0011\u0000\u0000\u0d84\u0d85\u0007\n\u0000\u0000"+ + "\u0d85\u0d86\u0005_\u0000\u0000\u0d86\u0d87\u0007\b\u0000\u0000\u0d87"+ + "\u0d88\u0007\u000e\u0000\u0000\u0d88\u0d89\u0007\n\u0000\u0000\u0d89\u0d8a"+ + "\u0007\u0002\u0000\u0000\u0d8a\u0d8b\u0007\u0019\u0000\u0000\u0d8b\u0d8c"+ + "\u0007\n\u0000\u0000\u0d8c\u0d8d\u0007\u000e\u0000\u0000\u0d8d\u0260\u0001"+ + "\u0000\u0000\u0000\u0d8e\u0d8f\u0007\u000b\u0000\u0000\u0d8f\u0d90\u0007"+ + "\u0011\u0000\u0000\u0d90\u0d91\u0007\u0010\u0000\u0000\u0d91\u0d92\u0007"+ + "\n\u0000\u0000\u0d92\u0d93\u0005_\u0000\u0000\u0d93\u0d94\u0007\u001b"+ + "\u0000\u0000\u0d94\u0d95\u0007\t\u0000\u0000\u0d95\u0d96\u0007\u0004\u0000"+ + "\u0000\u0d96\u0d97\u0007\n\u0000\u0000\u0d97\u0262\u0001\u0000\u0000\u0000"+ + "\u0d98\u0d99\u0007\u000b\u0000\u0000\u0d99\u0d9a\u0007\r\u0000\u0000\u0d9a"+ + "\u0d9b\u0007\u0015\u0000\u0000\u0d9b\u0d9c\u0007\n\u0000\u0000\u0d9c\u0264"+ + "\u0001\u0000\u0000\u0000\u0d9d\u0d9e\u0007\u001b\u0000\u0000\u0d9e\u0d9f"+ + "\u0007\n\u0000\u0000\u0d9f\u0da0\u0007\u000e\u0000\u0000\u0da0\u0da1\u0007"+ + "\t\u0000\u0000\u0da1\u0da2\u0005_\u0000\u0000\u0da2\u0da3\u0007\u000b"+ + "\u0000\u0000\u0da3\u0da4\u0007\n\u0000\u0000\u0da4\u0da5\u0007\u000e\u0000"+ + "\u0000\u0da5\u0da6\u0007\u0010\u0000\u0000\u0da6\u0da7\u0007\u0006\u0000"+ + "\u0000\u0da7\u0da8\u0005_\u0000\u0000\u0da8\u0da9\u0007\u001a\u0000\u0000"+ + "\u0da9\u0daa\u0007\u000f\u0000\u0000\u0daa\u0dab\u0007\n\u0000\u0000\u0dab"+ + "\u0dac\u0007\u000e\u0000\u0000\u0dac\u0dad\u0007\r\u0000\u0000\u0dad\u0266"+ + "\u0001\u0000\u0000\u0000\u0dae\u0daf\u0007\u0016\u0000\u0000\u0daf\u0db0"+ + "\u0007\u0011\u0000\u0000\u0db0\u0db1\u0007\u0014\u0000\u0000\u0db1\u0db2"+ + "\u0007\u0016\u0000\u0000\u0db2\u0db3\u0007\u0003\u0000\u0000\u0db3\u0db4"+ + "\u0007\u0011\u0000\u0000\u0db4\u0db5\u0007\u0014\u0000\u0000\u0db5\u0db6"+ + "\u0007\u0016\u0000\u0000\u0db6\u0db7\u0007\u000b\u0000\u0000\u0db7\u0268"+ + "\u0001\u0000\u0000\u0000\u0db8\u0db9\u0007\u0015\u0000\u0000\u0db9\u0dba"+ + "\u0007\u000e\u0000\u0000\u0dba\u0dbb\u0007\n\u0000\u0000\u0dbb\u0dbc\u0005"+ + "_\u0000\u0000\u0dbc\u0dbd\u0007\u000b\u0000\u0000\u0dbd\u0dbe\u0007\u0002"+ + "\u0000\u0000\u0dbe\u0dbf\u0007\u0014\u0000\u0000\u0dbf\u0dc0\u0007\u0006"+ + "\u0000\u0000\u0dc0\u026a\u0001\u0000\u0000\u0000\u0dc1\u0dc2\u0007\u0015"+ + "\u0000\u0000\u0dc2\u0dc3\u0007\t\u0000\u0000\u0dc3\u0dc4\u0007\u0006\u0000"+ + "\u0000\u0dc4\u0dc5\u0007\u000b\u0000\u0000\u0dc5\u0dc6\u0005_\u0000\u0000"+ + "\u0dc6\u0dc7\u0007\u000b\u0000\u0000\u0dc7\u0dc8\u0007\u0002\u0000\u0000"+ + "\u0dc8\u0dc9\u0007\u0014\u0000\u0000\u0dc9\u0dca\u0007\u0006\u0000\u0000"+ + "\u0dca\u026c\u0001\u0000\u0000\u0000\u0dcb\u0dcc\u0007\u0010\u0000\u0000"+ + "\u0dcc\u0dcd\u0007\u0002\u0000\u0000\u0dcd\u0dce\u0007\u000b\u0000\u0000"+ + "\u0dce\u0dcf\u0007\u0007\u0000\u0000\u0dcf\u0dd0\u0007\u0016\u0000\u0000"+ + "\u0dd0\u0dd1\u0005_\u0000\u0000\u0dd1\u0dd2\u0007\b\u0000\u0000\u0dd2"+ + "\u0dd3\u0007\t\u0000\u0000\u0dd3\u0dd4\u0007\t\u0000\u0000\u0dd4\u0dd5"+ + "\u0007\u0003\u0000\u0000\u0dd5\u0dd6\u0005_\u0000\u0000\u0dd6\u0dd7\u0007"+ + "\u0015\u0000\u0000\u0dd7\u0dd8\u0007\u000e\u0000\u0000\u0dd8\u0dd9\u0007"+ + "\n\u0000\u0000\u0dd9\u0dda\u0007\u0013\u0000\u0000\u0dda\u0ddb\u0007\u0011"+ + "\u0000\u0000\u0ddb\u0ddc\u0007\u0012\u0000\u0000\u0ddc\u026e\u0001\u0000"+ + "\u0000\u0000\u0ddd\u0dde\u0005*\u0000\u0000\u0dde\u0270\u0001\u0000\u0000"+ + "\u0000\u0ddf\u0de0\u0005/\u0000\u0000\u0de0\u0272\u0001\u0000\u0000\u0000"+ + "\u0de1\u0de2\u0005%\u0000\u0000\u0de2\u0274\u0001\u0000\u0000\u0000\u0de3"+ + "\u0de4\u0005+\u0000\u0000\u0de4\u0276\u0001\u0000\u0000\u0000\u0de5\u0de6"+ + "\u0005-\u0000\u0000\u0de6\u0278\u0001\u0000\u0000\u0000\u0de7\u0de8\u0007"+ + "\u0005\u0000\u0000\u0de8\u0de9\u0007\u0011\u0000\u0000\u0de9\u0dea\u0007"+ + "\u0017\u0000\u0000\u0dea\u027a\u0001\u0000\u0000\u0000\u0deb\u0dec\u0007"+ + "\u0010\u0000\u0000\u0dec\u0ded\u0007\t\u0000\u0000\u0ded\u0dee\u0007\u0005"+ + "\u0000\u0000\u0dee\u027c\u0001\u0000\u0000\u0000\u0def\u0df0\u0005=\u0000"+ + "\u0000\u0df0\u027e\u0001\u0000\u0000\u0000\u0df1\u0df2\u0005>\u0000\u0000"+ + "\u0df2\u0280\u0001\u0000\u0000\u0000\u0df3\u0df4\u0005<\u0000\u0000\u0df4"+ + "\u0282\u0001\u0000\u0000\u0000\u0df5\u0df6\u0005!\u0000\u0000\u0df6\u0284"+ + "\u0001\u0000\u0000\u0000\u0df7\u0df8\u0005~\u0000\u0000\u0df8\u0286\u0001"+ + "\u0000\u0000\u0000\u0df9\u0dfa\u0005|\u0000\u0000\u0dfa\u0288\u0001\u0000"+ + "\u0000\u0000\u0dfb\u0dfc\u0005&\u0000\u0000\u0dfc\u028a\u0001\u0000\u0000"+ + "\u0000\u0dfd\u0dfe\u0005^\u0000\u0000\u0dfe\u028c\u0001\u0000\u0000\u0000"+ + "\u0dff\u0e00\u0005.\u0000\u0000\u0e00\u028e\u0001\u0000\u0000\u0000\u0e01"+ + "\u0e02\u0005(\u0000\u0000\u0e02\u0290\u0001\u0000\u0000\u0000\u0e03\u0e04"+ + "\u0005)\u0000\u0000\u0e04\u0292\u0001\u0000\u0000\u0000\u0e05\u0e06\u0005"+ + "[\u0000\u0000\u0e06\u0294\u0001\u0000\u0000\u0000\u0e07\u0e08\u0005]\u0000"+ + "\u0000\u0e08\u0296\u0001\u0000\u0000\u0000\u0e09\u0e0a\u0005,\u0000\u0000"+ + "\u0e0a\u0298\u0001\u0000\u0000\u0000\u0e0b\u0e0c\u0005;\u0000\u0000\u0e0c"+ + "\u029a\u0001\u0000\u0000\u0000\u0e0d\u0e0e\u0005@\u0000\u0000\u0e0e\u029c"+ + "\u0001\u0000\u0000\u0000\u0e0f\u0e10\u00050\u0000\u0000\u0e10\u029e\u0001"+ + "\u0000\u0000\u0000\u0e11\u0e12\u00051\u0000\u0000\u0e12\u02a0\u0001\u0000"+ + "\u0000\u0000\u0e13\u0e14\u00052\u0000\u0000\u0e14\u02a2\u0001\u0000\u0000"+ + "\u0000\u0e15\u0e16\u0005\'\u0000\u0000\u0e16\u02a4\u0001\u0000\u0000\u0000"+ + "\u0e17\u0e18\u0005\"\u0000\u0000\u0e18\u02a6\u0001\u0000\u0000\u0000\u0e19"+ + "\u0e1a\u0005`\u0000\u0000\u0e1a\u02a8\u0001\u0000\u0000\u0000\u0e1b\u0e1c"+ + "\u0005:\u0000\u0000\u0e1c\u02aa\u0001\u0000\u0000\u0000\u0e1d\u0e1e\u0007"+ + "\u0004\u0000\u0000\u0e1e\u0e1f\u0003\u02c5\u0162\u0000\u0e1f\u02ac\u0001"+ + "\u0000\u0000\u0000\u0e20\u0e21\u0003\u02c5\u0162\u0000\u0e21\u02ae\u0001"+ + "\u0000\u0000\u0000\u0e22\u0e24\u0003\u02cb\u0165\u0000\u0e23\u0e22\u0001"+ + "\u0000\u0000\u0000\u0e24\u0e25\u0001\u0000\u0000\u0000\u0e25\u0e23\u0001"+ + "\u0000\u0000\u0000\u0e25\u0e26\u0001\u0000\u0000\u0000\u0e26\u02b0\u0001"+ + "\u0000\u0000\u0000\u0e27\u0e28\u0007\u0012\u0000\u0000\u0e28\u0e2c\u0005"+ + "\'\u0000\u0000\u0e29\u0e2a\u0003\u02c9\u0164\u0000\u0e2a\u0e2b\u0003\u02c9"+ + "\u0164\u0000\u0e2b\u0e2d\u0001\u0000\u0000\u0000\u0e2c\u0e29\u0001\u0000"+ + "\u0000\u0000\u0e2d\u0e2e\u0001\u0000\u0000\u0000\u0e2e\u0e2c\u0001\u0000"+ + "\u0000\u0000\u0e2e\u0e2f\u0001\u0000\u0000\u0000\u0e2f\u0e30\u0001\u0000"+ + "\u0000\u0000\u0e30\u0e31\u0005\'\u0000\u0000\u0e31\u0e3b\u0001\u0000\u0000"+ + "\u0000\u0e32\u0e33\u00050\u0000\u0000\u0e33\u0e34\u0007\u0012\u0000\u0000"+ + "\u0e34\u0e36\u0001\u0000\u0000\u0000\u0e35\u0e37\u0003\u02c9\u0164\u0000"+ + "\u0e36\u0e35\u0001\u0000\u0000\u0000\u0e37\u0e38\u0001\u0000\u0000\u0000"+ + "\u0e38\u0e36\u0001\u0000\u0000\u0000\u0e38\u0e39\u0001\u0000\u0000\u0000"+ + "\u0e39\u0e3b\u0001\u0000\u0000\u0000\u0e3a\u0e27\u0001\u0000\u0000\u0000"+ + "\u0e3a\u0e32\u0001\u0000\u0000\u0000\u0e3b\u02b2\u0001\u0000\u0000\u0000"+ + "\u0e3c\u0e3e\u0003\u02cb\u0165\u0000\u0e3d\u0e3c\u0001\u0000\u0000\u0000"+ + "\u0e3e\u0e3f\u0001\u0000\u0000\u0000\u0e3f\u0e3d\u0001\u0000\u0000\u0000"+ + "\u0e3f\u0e40\u0001\u0000\u0000\u0000\u0e40\u0e42\u0001\u0000\u0000\u0000"+ + "\u0e41\u0e3d\u0001\u0000\u0000\u0000\u0e41\u0e42\u0001\u0000\u0000\u0000"+ + "\u0e42\u0e43\u0001\u0000\u0000\u0000\u0e43\u0e45\u0005.\u0000\u0000\u0e44"+ + "\u0e46\u0003\u02cb\u0165\u0000\u0e45\u0e44\u0001\u0000\u0000\u0000\u0e46"+ + "\u0e47\u0001\u0000\u0000\u0000\u0e47\u0e45\u0001\u0000\u0000\u0000\u0e47"+ + "\u0e48\u0001\u0000\u0000\u0000\u0e48\u0e68\u0001\u0000\u0000\u0000\u0e49"+ + "\u0e4b\u0003\u02cb\u0165\u0000\u0e4a\u0e49\u0001\u0000\u0000\u0000\u0e4b"+ + "\u0e4c\u0001\u0000\u0000\u0000\u0e4c\u0e4a\u0001\u0000\u0000\u0000\u0e4c"+ + "\u0e4d\u0001\u0000\u0000\u0000\u0e4d\u0e4e\u0001\u0000\u0000\u0000\u0e4e"+ + "\u0e4f\u0005.\u0000\u0000\u0e4f\u0e50\u0003\u02bf\u015f\u0000\u0e50\u0e68"+ + "\u0001\u0000\u0000\u0000\u0e51\u0e53\u0003\u02cb\u0165\u0000\u0e52\u0e51"+ + "\u0001\u0000\u0000\u0000\u0e53\u0e54\u0001\u0000\u0000\u0000\u0e54\u0e52"+ + "\u0001\u0000\u0000\u0000\u0e54\u0e55\u0001\u0000\u0000\u0000\u0e55\u0e57"+ + "\u0001\u0000\u0000\u0000\u0e56\u0e52\u0001\u0000\u0000\u0000\u0e56\u0e57"+ + "\u0001\u0000\u0000\u0000\u0e57\u0e58\u0001\u0000\u0000\u0000\u0e58\u0e5a"+ + "\u0005.\u0000\u0000\u0e59\u0e5b\u0003\u02cb\u0165\u0000\u0e5a\u0e59\u0001"+ + "\u0000\u0000\u0000\u0e5b\u0e5c\u0001\u0000\u0000\u0000\u0e5c\u0e5a\u0001"+ + "\u0000\u0000\u0000\u0e5c\u0e5d\u0001\u0000\u0000\u0000\u0e5d\u0e5e\u0001"+ + "\u0000\u0000\u0000\u0e5e\u0e5f\u0003\u02bf\u015f\u0000\u0e5f\u0e68\u0001"+ + "\u0000\u0000\u0000\u0e60\u0e62\u0003\u02cb\u0165\u0000\u0e61\u0e60\u0001"+ + "\u0000\u0000\u0000\u0e62\u0e63\u0001\u0000\u0000\u0000\u0e63\u0e61\u0001"+ + "\u0000\u0000\u0000\u0e63\u0e64\u0001\u0000\u0000\u0000\u0e64\u0e65\u0001"+ + "\u0000\u0000\u0000\u0e65\u0e66\u0003\u02bf\u015f\u0000\u0e66\u0e68\u0001"+ + "\u0000\u0000\u0000\u0e67\u0e41\u0001\u0000\u0000\u0000\u0e67\u0e4a\u0001"+ + "\u0000\u0000\u0000\u0e67\u0e56\u0001\u0000\u0000\u0000\u0e67\u0e61\u0001"+ + "\u0000\u0000\u0000\u0e68\u02b4\u0001\u0000\u0000\u0000\u0e69\u0e6a\u0005"+ + "\\\u0000\u0000\u0e6a\u0e6b\u0007\u0004\u0000\u0000\u0e6b\u02b6\u0001\u0000"+ + "\u0000\u0000\u0e6c\u0e6d\u0003\u02cd\u0166\u0000\u0e6d\u02b8\u0001\u0000"+ + "\u0000\u0000\u0e6e\u0e6f\u0003\u02c1\u0160\u0000\u0e6f\u02ba\u0001\u0000"+ + "\u0000\u0000\u0e70\u0e71\u0003\u02c3\u0161\u0000\u0e71\u02bc\u0001\u0000"+ + "\u0000\u0000\u0e72\u0e73\u0003\u02c7\u0163\u0000\u0e73\u02be\u0001\u0000"+ + "\u0000\u0000\u0e74\u0e76\u0007\n\u0000\u0000\u0e75\u0e77\u0007\u001c\u0000"+ + "\u0000\u0e76\u0e75\u0001\u0000\u0000\u0000\u0e76\u0e77\u0001\u0000\u0000"+ + "\u0000\u0e77\u0e79\u0001\u0000\u0000\u0000\u0e78\u0e7a\u0003\u02cb\u0165"+ + "\u0000\u0e79\u0e78\u0001\u0000\u0000\u0000\u0e7a\u0e7b\u0001\u0000\u0000"+ + "\u0000\u0e7b\u0e79\u0001\u0000\u0000\u0000\u0e7b\u0e7c\u0001\u0000\u0000"+ + "\u0000\u0e7c\u02c0\u0001\u0000\u0000\u0000\u0e7d\u0e7f\u0007\u001d\u0000"+ + "\u0000\u0e7e\u0e7d\u0001\u0000\u0000\u0000\u0e7f\u0e80\u0001\u0000\u0000"+ + "\u0000\u0e80\u0e7e\u0001\u0000\u0000\u0000\u0e80\u0e81\u0001\u0000\u0000"+ + "\u0000\u0e81\u0e85\u0001\u0000\u0000\u0000\u0e82\u0e84\u0007\u001e\u0000"+ + "\u0000\u0e83\u0e82\u0001\u0000\u0000\u0000\u0e84\u0e87\u0001\u0000\u0000"+ + "\u0000\u0e85\u0e83\u0001\u0000\u0000\u0000\u0e85\u0e86\u0001\u0000\u0000"+ + "\u0000\u0e86\u02c2\u0001\u0000\u0000\u0000\u0e87\u0e85\u0001\u0000\u0000"+ + "\u0000\u0e88\u0e90\u0005\"\u0000\u0000\u0e89\u0e8a\u0005\\\u0000\u0000"+ + "\u0e8a\u0e8f\t\u0000\u0000\u0000\u0e8b\u0e8c\u0005\"\u0000\u0000\u0e8c"+ + "\u0e8f\u0005\"\u0000\u0000\u0e8d\u0e8f\b\u001f\u0000\u0000\u0e8e\u0e89"+ + "\u0001\u0000\u0000\u0000\u0e8e\u0e8b\u0001\u0000\u0000\u0000\u0e8e\u0e8d"+ + "\u0001\u0000\u0000\u0000\u0e8f\u0e92\u0001\u0000\u0000\u0000\u0e90\u0e8e"+ + "\u0001\u0000\u0000\u0000\u0e90\u0e91\u0001\u0000\u0000\u0000\u0e91\u0e93"+ + "\u0001\u0000\u0000\u0000\u0e92\u0e90\u0001\u0000\u0000\u0000\u0e93\u0e94"+ + "\u0005\"\u0000\u0000\u0e94\u02c4\u0001\u0000\u0000\u0000\u0e95\u0e9d\u0005"+ + "\'\u0000\u0000\u0e96\u0e97\u0005\\\u0000\u0000\u0e97\u0e9c\t\u0000\u0000"+ + "\u0000\u0e98\u0e99\u0005\'\u0000\u0000\u0e99\u0e9c\u0005\'\u0000\u0000"+ + "\u0e9a\u0e9c\b \u0000\u0000\u0e9b\u0e96\u0001\u0000\u0000\u0000\u0e9b"+ + "\u0e98\u0001\u0000\u0000\u0000\u0e9b\u0e9a\u0001\u0000\u0000\u0000\u0e9c"+ + "\u0e9f\u0001\u0000\u0000\u0000\u0e9d\u0e9b\u0001\u0000\u0000\u0000\u0e9d"+ + "\u0e9e\u0001\u0000\u0000\u0000\u0e9e\u0ea0\u0001\u0000\u0000\u0000\u0e9f"+ + "\u0e9d\u0001\u0000\u0000\u0000\u0ea0\u0ea1\u0005\'\u0000\u0000\u0ea1\u02c6"+ + "\u0001\u0000\u0000\u0000\u0ea2\u0eaa\u0005`\u0000\u0000\u0ea3\u0ea4\u0005"+ + "\\\u0000\u0000\u0ea4\u0ea9\t\u0000\u0000\u0000\u0ea5\u0ea6\u0005`\u0000"+ + "\u0000\u0ea6\u0ea9\u0005`\u0000\u0000\u0ea7\u0ea9\b!\u0000\u0000\u0ea8"+ + "\u0ea3\u0001\u0000\u0000\u0000\u0ea8\u0ea5\u0001\u0000\u0000\u0000\u0ea8"+ + "\u0ea7\u0001\u0000\u0000\u0000\u0ea9\u0eac\u0001\u0000\u0000\u0000\u0eaa"+ + "\u0ea8\u0001\u0000\u0000\u0000\u0eaa\u0eab\u0001\u0000\u0000\u0000\u0eab"+ + "\u0ead\u0001\u0000\u0000\u0000\u0eac\u0eaa\u0001\u0000\u0000\u0000\u0ead"+ + "\u0eae\u0005`\u0000\u0000\u0eae\u02c8\u0001\u0000\u0000\u0000\u0eaf\u0eb0"+ + "\u0007\"\u0000\u0000\u0eb0\u02ca\u0001\u0000\u0000\u0000\u0eb1\u0eb2\u0007"+ + "#\u0000\u0000\u0eb2\u02cc\u0001\u0000\u0000\u0000\u0eb3\u0eb4\u0007\b"+ + "\u0000\u0000\u0eb4\u0eb6\u0005\'\u0000\u0000\u0eb5\u0eb7\u0007$\u0000"+ + "\u0000\u0eb6\u0eb5\u0001\u0000\u0000\u0000\u0eb7\u0eb8\u0001\u0000\u0000"+ + "\u0000\u0eb8\u0eb6\u0001\u0000\u0000\u0000\u0eb8\u0eb9\u0001\u0000\u0000"+ + "\u0000\u0eb9\u0eba\u0001\u0000\u0000\u0000\u0eba\u0ebb\u0005\'\u0000\u0000"+ + "\u0ebb\u02ce\u0001\u0000\u0000\u0000\u0ebc\u0ebd\t\u0000\u0000\u0000\u0ebd"+ + "\u0ebe\u0001\u0000\u0000\u0000\u0ebe\u0ebf\u0006\u0167\u0002\u0000\u0ebf"+ + "\u02d0\u0001\u0000\u0000\u0000#\u0000\u02d4\u02df\u02ec\u02f8\u02fd\u0301"+ + "\u0305\u030b\u030f\u0311\u0e25\u0e2e\u0e38\u0e3a\u0e3f\u0e41\u0e47\u0e4c"+ + "\u0e54\u0e56\u0e5c\u0e63\u0e67\u0e76\u0e7b\u0e80\u0e85\u0e8e\u0e90\u0e9b"+ + "\u0e9d\u0ea8\u0eaa\u0eb8\u0003\u0000\u0001\u0000\u0000\u0002\u0000\u0000"+ + "\u0003\u0000"; + public static final String _serializedATN = Utils.join( + new String[] { + _serializedATNSegment0, + _serializedATNSegment1 + }, + "" + ); + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.tokens b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.tokens new file mode 100644 index 00000000000..80703f8b9ac --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLLexer.tokens @@ -0,0 +1,689 @@ +SPACE=1 +SPEC_SQL_COMMENT=2 +COMMENT_INPUT=3 +LINE_COMMENT=4 +ALL=5 +AND=6 +AS=7 +ASC=8 +BOOLEAN=9 +BETWEEN=10 +BY=11 +CASE=12 +CAST=13 +CROSS=14 +COLUMNS=15 +DATETIME=16 +DELETE=17 +DESC=18 +DESCRIBE=19 +DISTINCT=20 +DOUBLE=21 +ELSE=22 +EXISTS=23 +FALSE=24 +FLOAT=25 +FIRST=26 +FROM=27 +GROUP=28 +HAVING=29 +IN=30 +INNER=31 +INT=32 +INTEGER=33 +IS=34 +JOIN=35 +LAST=36 +LEFT=37 +LIKE=38 +LIMIT=39 +LONG=40 +MATCH=41 +NATURAL=42 +MISSING_LITERAL=43 +NOT=44 +NULL_LITERAL=45 +NULLS=46 +ON=47 +OR=48 +ORDER=49 +OUTER=50 +OVER=51 +PARTITION=52 +REGEXP=53 +RIGHT=54 +SELECT=55 +SHOW=56 +STRING=57 +THEN=58 +TRUE=59 +UNION=60 +USING=61 +WHEN=62 +WHERE=63 +EXCEPT=64 +AVG=65 +COUNT=66 +MAX=67 +MIN=68 +SUM=69 +VAR_POP=70 +VAR_SAMP=71 +VARIANCE=72 +STD=73 +STDDEV=74 +STDDEV_POP=75 +STDDEV_SAMP=76 +SUBSTRING=77 +TRIM=78 +END=79 +FULL=80 +OFFSET=81 +INTERVAL=82 +MICROSECOND=83 +SECOND=84 +MINUTE=85 +HOUR=86 +DAY=87 +WEEK=88 +MONTH=89 +QUARTER=90 +YEAR=91 +SECOND_MICROSECOND=92 +MINUTE_MICROSECOND=93 +MINUTE_SECOND=94 +HOUR_MICROSECOND=95 +HOUR_SECOND=96 +HOUR_MINUTE=97 +DAY_MICROSECOND=98 +DAY_SECOND=99 +DAY_MINUTE=100 +DAY_HOUR=101 +YEAR_MONTH=102 +TABLES=103 +ABS=104 +ACOS=105 +ADD=106 +ADDTIME=107 +ASCII=108 +ASIN=109 +ATAN=110 +ATAN2=111 +CBRT=112 +CEIL=113 +CEILING=114 +CONCAT=115 +CONCAT_WS=116 +CONV=117 +CONVERT_TZ=118 +COS=119 +COSH=120 +COT=121 +CRC32=122 +CURDATE=123 +CURTIME=124 +CURRENT_DATE=125 +CURRENT_TIME=126 +CURRENT_TIMESTAMP=127 +DATE=128 +DATE_ADD=129 +DATE_FORMAT=130 +DATE_SUB=131 +DATEDIFF=132 +DAYNAME=133 +DAYOFMONTH=134 +DAYOFWEEK=135 +DAYOFYEAR=136 +DEGREES=137 +DIVIDE=138 +E=139 +EXP=140 +EXPM1=141 +EXTRACT=142 +FLOOR=143 +FROM_DAYS=144 +FROM_UNIXTIME=145 +GET_FORMAT=146 +IF=147 +IFNULL=148 +ISNULL=149 +LAST_DAY=150 +LENGTH=151 +LN=152 +LOCALTIME=153 +LOCALTIMESTAMP=154 +LOCATE=155 +LOG=156 +LOG10=157 +LOG2=158 +LOWER=159 +LTRIM=160 +MAKEDATE=161 +MAKETIME=162 +MODULUS=163 +MONTHNAME=164 +MULTIPLY=165 +NOW=166 +NULLIF=167 +PERIOD_ADD=168 +PERIOD_DIFF=169 +PI=170 +POSITION=171 +POW=172 +POWER=173 +RADIANS=174 +RAND=175 +REPLACE=176 +RINT=177 +ROUND=178 +RTRIM=179 +REVERSE=180 +SEC_TO_TIME=181 +SIGN=182 +SIGNUM=183 +SIN=184 +SINH=185 +SQRT=186 +STR_TO_DATE=187 +SUBDATE=188 +SUBTIME=189 +SUBTRACT=190 +SYSDATE=191 +TAN=192 +TIME=193 +TIMEDIFF=194 +TIME_FORMAT=195 +TIME_TO_SEC=196 +TIMESTAMP=197 +TRUNCATE=198 +TO_DAYS=199 +TO_SECONDS=200 +UNIX_TIMESTAMP=201 +UPPER=202 +UTC_DATE=203 +UTC_TIME=204 +UTC_TIMESTAMP=205 +D=206 +T=207 +TS=208 +LEFT_BRACE=209 +RIGHT_BRACE=210 +DENSE_RANK=211 +RANK=212 +ROW_NUMBER=213 +DATE_HISTOGRAM=214 +DAY_OF_MONTH=215 +DAY_OF_YEAR=216 +DAY_OF_WEEK=217 +EXCLUDE=218 +EXTENDED_STATS=219 +FIELD=220 +FILTER=221 +GEO_BOUNDING_BOX=222 +GEO_CELL=223 +GEO_DISTANCE=224 +GEO_DISTANCE_RANGE=225 +GEO_INTERSECTS=226 +GEO_POLYGON=227 +HISTOGRAM=228 +HOUR_OF_DAY=229 +INCLUDE=230 +IN_TERMS=231 +MATCHPHRASE=232 +MATCH_PHRASE=233 +MATCHPHRASEQUERY=234 +SIMPLE_QUERY_STRING=235 +QUERY_STRING=236 +MATCH_PHRASE_PREFIX=237 +MATCHQUERY=238 +MATCH_QUERY=239 +MINUTE_OF_DAY=240 +MINUTE_OF_HOUR=241 +MONTH_OF_YEAR=242 +MULTIMATCH=243 +MULTI_MATCH=244 +MULTIMATCHQUERY=245 +NESTED=246 +PERCENTILES=247 +PERCENTILE=248 +PERCENTILE_APPROX=249 +REGEXP_QUERY=250 +REVERSE_NESTED=251 +QUERY=252 +RANGE=253 +SCORE=254 +SCOREQUERY=255 +SCORE_QUERY=256 +SECOND_OF_MINUTE=257 +STATS=258 +TERM=259 +TERMS=260 +TIMESTAMPADD=261 +TIMESTAMPDIFF=262 +TOPHITS=263 +TYPEOF=264 +WEEK_OF_YEAR=265 +WEEKOFYEAR=266 +WEEKDAY=267 +WILDCARDQUERY=268 +WILDCARD_QUERY=269 +SUBSTR=270 +STRCMP=271 +ADDDATE=272 +YEARWEEK=273 +ALLOW_LEADING_WILDCARD=274 +ANALYZER=275 +ANALYZE_WILDCARD=276 +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY=277 +BOOST=278 +CASE_INSENSITIVE=279 +CUTOFF_FREQUENCY=280 +DEFAULT_FIELD=281 +DEFAULT_OPERATOR=282 +ESCAPE=283 +ENABLE_POSITION_INCREMENTS=284 +FIELDS=285 +FLAGS=286 +FUZZINESS=287 +FUZZY_MAX_EXPANSIONS=288 +FUZZY_PREFIX_LENGTH=289 +FUZZY_REWRITE=290 +FUZZY_TRANSPOSITIONS=291 +LENIENT=292 +LOW_FREQ_OPERATOR=293 +MAX_DETERMINIZED_STATES=294 +MAX_EXPANSIONS=295 +MINIMUM_SHOULD_MATCH=296 +OPERATOR=297 +PHRASE_SLOP=298 +PREFIX_LENGTH=299 +QUOTE_ANALYZER=300 +QUOTE_FIELD_SUFFIX=301 +REWRITE=302 +SLOP=303 +TIE_BREAKER=304 +TIME_ZONE=305 +TYPE=306 +ZERO_TERMS_QUERY=307 +HIGHLIGHT=308 +HIGHLIGHT_PRE_TAGS=309 +HIGHLIGHT_POST_TAGS=310 +MATCH_BOOL_PREFIX=311 +STAR=312 +SLASH=313 +MODULE=314 +PLUS=315 +MINUS=316 +DIV=317 +MOD=318 +EQUAL_SYMBOL=319 +GREATER_SYMBOL=320 +LESS_SYMBOL=321 +EXCLAMATION_SYMBOL=322 +BIT_NOT_OP=323 +BIT_OR_OP=324 +BIT_AND_OP=325 +BIT_XOR_OP=326 +DOT=327 +LR_BRACKET=328 +RR_BRACKET=329 +LT_SQR_PRTHS=330 +RT_SQR_PRTHS=331 +COMMA=332 +SEMI=333 +AT_SIGN=334 +ZERO_DECIMAL=335 +ONE_DECIMAL=336 +TWO_DECIMAL=337 +SINGLE_QUOTE_SYMB=338 +DOUBLE_QUOTE_SYMB=339 +REVERSE_QUOTE_SYMB=340 +COLON_SYMB=341 +START_NATIONAL_STRING_LITERAL=342 +STRING_LITERAL=343 +DECIMAL_LITERAL=344 +HEXADECIMAL_LITERAL=345 +REAL_LITERAL=346 +NULL_SPEC_LITERAL=347 +BIT_STRING=348 +ID=349 +DOUBLE_QUOTE_ID=350 +BACKTICK_QUOTE_ID=351 +ERROR_RECOGNITION=352 +'ALL'=5 +'AND'=6 +'AS'=7 +'ASC'=8 +'BOOLEAN'=9 +'BETWEEN'=10 +'BY'=11 +'CASE'=12 +'CAST'=13 +'CROSS'=14 +'COLUMNS'=15 +'DATETIME'=16 +'DELETE'=17 +'DESC'=18 +'DESCRIBE'=19 +'DISTINCT'=20 +'DOUBLE'=21 +'ELSE'=22 +'EXISTS'=23 +'FALSE'=24 +'FLOAT'=25 +'FIRST'=26 +'FROM'=27 +'GROUP'=28 +'HAVING'=29 +'IN'=30 +'INNER'=31 +'INT'=32 +'INTEGER'=33 +'IS'=34 +'JOIN'=35 +'LAST'=36 +'LEFT'=37 +'LIKE'=38 +'LIMIT'=39 +'LONG'=40 +'MATCH'=41 +'NATURAL'=42 +'MISSING'=43 +'NOT'=44 +'NULL'=45 +'NULLS'=46 +'ON'=47 +'OR'=48 +'ORDER'=49 +'OUTER'=50 +'OVER'=51 +'PARTITION'=52 +'REGEXP'=53 +'RIGHT'=54 +'SELECT'=55 +'SHOW'=56 +'STRING'=57 +'THEN'=58 +'TRUE'=59 +'UNION'=60 +'USING'=61 +'WHEN'=62 +'WHERE'=63 +'MINUS'=64 +'AVG'=65 +'COUNT'=66 +'MAX'=67 +'MIN'=68 +'SUM'=69 +'VAR_POP'=70 +'VAR_SAMP'=71 +'VARIANCE'=72 +'STD'=73 +'STDDEV'=74 +'STDDEV_POP'=75 +'STDDEV_SAMP'=76 +'SUBSTRING'=77 +'TRIM'=78 +'END'=79 +'FULL'=80 +'OFFSET'=81 +'INTERVAL'=82 +'MICROSECOND'=83 +'SECOND'=84 +'MINUTE'=85 +'HOUR'=86 +'DAY'=87 +'WEEK'=88 +'MONTH'=89 +'QUARTER'=90 +'YEAR'=91 +'SECOND_MICROSECOND'=92 +'MINUTE_MICROSECOND'=93 +'MINUTE_SECOND'=94 +'HOUR_MICROSECOND'=95 +'HOUR_SECOND'=96 +'HOUR_MINUTE'=97 +'DAY_MICROSECOND'=98 +'DAY_SECOND'=99 +'DAY_MINUTE'=100 +'DAY_HOUR'=101 +'YEAR_MONTH'=102 +'TABLES'=103 +'ABS'=104 +'ACOS'=105 +'ADD'=106 +'ADDTIME'=107 +'ASCII'=108 +'ASIN'=109 +'ATAN'=110 +'ATAN2'=111 +'CBRT'=112 +'CEIL'=113 +'CEILING'=114 +'CONCAT'=115 +'CONCAT_WS'=116 +'CONV'=117 +'CONVERT_TZ'=118 +'COS'=119 +'COSH'=120 +'COT'=121 +'CRC32'=122 +'CURDATE'=123 +'CURTIME'=124 +'CURRENT_DATE'=125 +'CURRENT_TIME'=126 +'CURRENT_TIMESTAMP'=127 +'DATE'=128 +'DATE_ADD'=129 +'DATE_FORMAT'=130 +'DATE_SUB'=131 +'DATEDIFF'=132 +'DAYNAME'=133 +'DAYOFMONTH'=134 +'DAYOFWEEK'=135 +'DAYOFYEAR'=136 +'DEGREES'=137 +'DIVIDE'=138 +'E'=139 +'EXP'=140 +'EXPM1'=141 +'EXTRACT'=142 +'FLOOR'=143 +'FROM_DAYS'=144 +'FROM_UNIXTIME'=145 +'GET_FORMAT'=146 +'IF'=147 +'IFNULL'=148 +'ISNULL'=149 +'LAST_DAY'=150 +'LENGTH'=151 +'LN'=152 +'LOCALTIME'=153 +'LOCALTIMESTAMP'=154 +'LOCATE'=155 +'LOG'=156 +'LOG10'=157 +'LOG2'=158 +'LOWER'=159 +'LTRIM'=160 +'MAKEDATE'=161 +'MAKETIME'=162 +'MODULUS'=163 +'MONTHNAME'=164 +'MULTIPLY'=165 +'NOW'=166 +'NULLIF'=167 +'PERIOD_ADD'=168 +'PERIOD_DIFF'=169 +'PI'=170 +'POSITION'=171 +'POW'=172 +'POWER'=173 +'RADIANS'=174 +'RAND'=175 +'REPLACE'=176 +'RINT'=177 +'ROUND'=178 +'RTRIM'=179 +'REVERSE'=180 +'SEC_TO_TIME'=181 +'SIGN'=182 +'SIGNUM'=183 +'SIN'=184 +'SINH'=185 +'SQRT'=186 +'STR_TO_DATE'=187 +'SUBDATE'=188 +'SUBTIME'=189 +'SUBTRACT'=190 +'SYSDATE'=191 +'TAN'=192 +'TIME'=193 +'TIMEDIFF'=194 +'TIME_FORMAT'=195 +'TIME_TO_SEC'=196 +'TIMESTAMP'=197 +'TRUNCATE'=198 +'TO_DAYS'=199 +'TO_SECONDS'=200 +'UNIX_TIMESTAMP'=201 +'UPPER'=202 +'UTC_DATE'=203 +'UTC_TIME'=204 +'UTC_TIMESTAMP'=205 +'D'=206 +'T'=207 +'TS'=208 +'{'=209 +'}'=210 +'DENSE_RANK'=211 +'RANK'=212 +'ROW_NUMBER'=213 +'DATE_HISTOGRAM'=214 +'DAY_OF_MONTH'=215 +'DAY_OF_YEAR'=216 +'DAY_OF_WEEK'=217 +'EXCLUDE'=218 +'EXTENDED_STATS'=219 +'FIELD'=220 +'FILTER'=221 +'GEO_BOUNDING_BOX'=222 +'GEO_CELL'=223 +'GEO_DISTANCE'=224 +'GEO_DISTANCE_RANGE'=225 +'GEO_INTERSECTS'=226 +'GEO_POLYGON'=227 +'HISTOGRAM'=228 +'HOUR_OF_DAY'=229 +'INCLUDE'=230 +'IN_TERMS'=231 +'MATCHPHRASE'=232 +'MATCH_PHRASE'=233 +'MATCHPHRASEQUERY'=234 +'SIMPLE_QUERY_STRING'=235 +'QUERY_STRING'=236 +'MATCH_PHRASE_PREFIX'=237 +'MATCHQUERY'=238 +'MATCH_QUERY'=239 +'MINUTE_OF_DAY'=240 +'MINUTE_OF_HOUR'=241 +'MONTH_OF_YEAR'=242 +'MULTIMATCH'=243 +'MULTI_MATCH'=244 +'MULTIMATCHQUERY'=245 +'NESTED'=246 +'PERCENTILES'=247 +'PERCENTILE'=248 +'PERCENTILE_APPROX'=249 +'REGEXP_QUERY'=250 +'REVERSE_NESTED'=251 +'QUERY'=252 +'RANGE'=253 +'SCORE'=254 +'SCOREQUERY'=255 +'SCORE_QUERY'=256 +'SECOND_OF_MINUTE'=257 +'STATS'=258 +'TERM'=259 +'TERMS'=260 +'TIMESTAMPADD'=261 +'TIMESTAMPDIFF'=262 +'TOPHITS'=263 +'TYPEOF'=264 +'WEEK_OF_YEAR'=265 +'WEEKOFYEAR'=266 +'WEEKDAY'=267 +'WILDCARDQUERY'=268 +'WILDCARD_QUERY'=269 +'SUBSTR'=270 +'STRCMP'=271 +'ADDDATE'=272 +'YEARWEEK'=273 +'ALLOW_LEADING_WILDCARD'=274 +'ANALYZER'=275 +'ANALYZE_WILDCARD'=276 +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'=277 +'BOOST'=278 +'CASE_INSENSITIVE'=279 +'CUTOFF_FREQUENCY'=280 +'DEFAULT_FIELD'=281 +'DEFAULT_OPERATOR'=282 +'ESCAPE'=283 +'ENABLE_POSITION_INCREMENTS'=284 +'FIELDS'=285 +'FLAGS'=286 +'FUZZINESS'=287 +'FUZZY_MAX_EXPANSIONS'=288 +'FUZZY_PREFIX_LENGTH'=289 +'FUZZY_REWRITE'=290 +'FUZZY_TRANSPOSITIONS'=291 +'LENIENT'=292 +'LOW_FREQ_OPERATOR'=293 +'MAX_DETERMINIZED_STATES'=294 +'MAX_EXPANSIONS'=295 +'MINIMUM_SHOULD_MATCH'=296 +'OPERATOR'=297 +'PHRASE_SLOP'=298 +'PREFIX_LENGTH'=299 +'QUOTE_ANALYZER'=300 +'QUOTE_FIELD_SUFFIX'=301 +'REWRITE'=302 +'SLOP'=303 +'TIE_BREAKER'=304 +'TIME_ZONE'=305 +'TYPE'=306 +'ZERO_TERMS_QUERY'=307 +'HIGHLIGHT'=308 +'PRE_TAGS'=309 +'POST_TAGS'=310 +'MATCH_BOOL_PREFIX'=311 +'*'=312 +'/'=313 +'%'=314 +'+'=315 +'-'=316 +'DIV'=317 +'MOD'=318 +'='=319 +'>'=320 +'<'=321 +'!'=322 +'~'=323 +'|'=324 +'&'=325 +'^'=326 +'.'=327 +'('=328 +')'=329 +'['=330 +']'=331 +','=332 +';'=333 +'@'=334 +'0'=335 +'1'=336 +'2'=337 +'\''=338 +'"'=339 +'`'=340 +':'=341 diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.interp b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.interp new file mode 100644 index 00000000000..7ad75b08df3 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.interp @@ -0,0 +1,829 @@ +token literal names: +null +null +null +null +null +'ALL' +'AND' +'AS' +'ASC' +'BOOLEAN' +'BETWEEN' +'BY' +'CASE' +'CAST' +'CROSS' +'COLUMNS' +'DATETIME' +'DELETE' +'DESC' +'DESCRIBE' +'DISTINCT' +'DOUBLE' +'ELSE' +'EXISTS' +'FALSE' +'FLOAT' +'FIRST' +'FROM' +'GROUP' +'HAVING' +'IN' +'INNER' +'INT' +'INTEGER' +'IS' +'JOIN' +'LAST' +'LEFT' +'LIKE' +'LIMIT' +'LONG' +'MATCH' +'NATURAL' +'MISSING' +'NOT' +'NULL' +'NULLS' +'ON' +'OR' +'ORDER' +'OUTER' +'OVER' +'PARTITION' +'REGEXP' +'RIGHT' +'SELECT' +'SHOW' +'STRING' +'THEN' +'TRUE' +'UNION' +'USING' +'WHEN' +'WHERE' +'MINUS' +'AVG' +'COUNT' +'MAX' +'MIN' +'SUM' +'VAR_POP' +'VAR_SAMP' +'VARIANCE' +'STD' +'STDDEV' +'STDDEV_POP' +'STDDEV_SAMP' +'SUBSTRING' +'TRIM' +'END' +'FULL' +'OFFSET' +'INTERVAL' +'MICROSECOND' +'SECOND' +'MINUTE' +'HOUR' +'DAY' +'WEEK' +'MONTH' +'QUARTER' +'YEAR' +'SECOND_MICROSECOND' +'MINUTE_MICROSECOND' +'MINUTE_SECOND' +'HOUR_MICROSECOND' +'HOUR_SECOND' +'HOUR_MINUTE' +'DAY_MICROSECOND' +'DAY_SECOND' +'DAY_MINUTE' +'DAY_HOUR' +'YEAR_MONTH' +'TABLES' +'ABS' +'ACOS' +'ADD' +'ADDTIME' +'ASCII' +'ASIN' +'ATAN' +'ATAN2' +'CBRT' +'CEIL' +'CEILING' +'CONCAT' +'CONCAT_WS' +'CONV' +'CONVERT_TZ' +'COS' +'COSH' +'COT' +'CRC32' +'CURDATE' +'CURTIME' +'CURRENT_DATE' +'CURRENT_TIME' +'CURRENT_TIMESTAMP' +'DATE' +'DATE_ADD' +'DATE_FORMAT' +'DATE_SUB' +'DATEDIFF' +'DAYNAME' +'DAYOFMONTH' +'DAYOFWEEK' +'DAYOFYEAR' +'DEGREES' +'DIVIDE' +'E' +'EXP' +'EXPM1' +'EXTRACT' +'FLOOR' +'FROM_DAYS' +'FROM_UNIXTIME' +'GET_FORMAT' +'IF' +'IFNULL' +'ISNULL' +'LAST_DAY' +'LENGTH' +'LN' +'LOCALTIME' +'LOCALTIMESTAMP' +'LOCATE' +'LOG' +'LOG10' +'LOG2' +'LOWER' +'LTRIM' +'MAKEDATE' +'MAKETIME' +'MODULUS' +'MONTHNAME' +'MULTIPLY' +'NOW' +'NULLIF' +'PERIOD_ADD' +'PERIOD_DIFF' +'PI' +'POSITION' +'POW' +'POWER' +'RADIANS' +'RAND' +'REPLACE' +'RINT' +'ROUND' +'RTRIM' +'REVERSE' +'SEC_TO_TIME' +'SIGN' +'SIGNUM' +'SIN' +'SINH' +'SQRT' +'STR_TO_DATE' +'SUBDATE' +'SUBTIME' +'SUBTRACT' +'SYSDATE' +'TAN' +'TIME' +'TIMEDIFF' +'TIME_FORMAT' +'TIME_TO_SEC' +'TIMESTAMP' +'TRUNCATE' +'TO_DAYS' +'TO_SECONDS' +'UNIX_TIMESTAMP' +'UPPER' +'UTC_DATE' +'UTC_TIME' +'UTC_TIMESTAMP' +'D' +'T' +'TS' +'{' +'}' +'DENSE_RANK' +'RANK' +'ROW_NUMBER' +'DATE_HISTOGRAM' +'DAY_OF_MONTH' +'DAY_OF_YEAR' +'DAY_OF_WEEK' +'EXCLUDE' +'EXTENDED_STATS' +'FIELD' +'FILTER' +'GEO_BOUNDING_BOX' +'GEO_CELL' +'GEO_DISTANCE' +'GEO_DISTANCE_RANGE' +'GEO_INTERSECTS' +'GEO_POLYGON' +'HISTOGRAM' +'HOUR_OF_DAY' +'INCLUDE' +'IN_TERMS' +'MATCHPHRASE' +'MATCH_PHRASE' +'MATCHPHRASEQUERY' +'SIMPLE_QUERY_STRING' +'QUERY_STRING' +'MATCH_PHRASE_PREFIX' +'MATCHQUERY' +'MATCH_QUERY' +'MINUTE_OF_DAY' +'MINUTE_OF_HOUR' +'MONTH_OF_YEAR' +'MULTIMATCH' +'MULTI_MATCH' +'MULTIMATCHQUERY' +'NESTED' +'PERCENTILES' +'PERCENTILE' +'PERCENTILE_APPROX' +'REGEXP_QUERY' +'REVERSE_NESTED' +'QUERY' +'RANGE' +'SCORE' +'SCOREQUERY' +'SCORE_QUERY' +'SECOND_OF_MINUTE' +'STATS' +'TERM' +'TERMS' +'TIMESTAMPADD' +'TIMESTAMPDIFF' +'TOPHITS' +'TYPEOF' +'WEEK_OF_YEAR' +'WEEKOFYEAR' +'WEEKDAY' +'WILDCARDQUERY' +'WILDCARD_QUERY' +'SUBSTR' +'STRCMP' +'ADDDATE' +'YEARWEEK' +'ALLOW_LEADING_WILDCARD' +'ANALYZER' +'ANALYZE_WILDCARD' +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY' +'BOOST' +'CASE_INSENSITIVE' +'CUTOFF_FREQUENCY' +'DEFAULT_FIELD' +'DEFAULT_OPERATOR' +'ESCAPE' +'ENABLE_POSITION_INCREMENTS' +'FIELDS' +'FLAGS' +'FUZZINESS' +'FUZZY_MAX_EXPANSIONS' +'FUZZY_PREFIX_LENGTH' +'FUZZY_REWRITE' +'FUZZY_TRANSPOSITIONS' +'LENIENT' +'LOW_FREQ_OPERATOR' +'MAX_DETERMINIZED_STATES' +'MAX_EXPANSIONS' +'MINIMUM_SHOULD_MATCH' +'OPERATOR' +'PHRASE_SLOP' +'PREFIX_LENGTH' +'QUOTE_ANALYZER' +'QUOTE_FIELD_SUFFIX' +'REWRITE' +'SLOP' +'TIE_BREAKER' +'TIME_ZONE' +'TYPE' +'ZERO_TERMS_QUERY' +'HIGHLIGHT' +'PRE_TAGS' +'POST_TAGS' +'MATCH_BOOL_PREFIX' +'*' +'/' +'%' +'+' +'-' +'DIV' +'MOD' +'=' +'>' +'<' +'!' +'~' +'|' +'&' +'^' +'.' +'(' +')' +'[' +']' +',' +';' +'@' +'0' +'1' +'2' +'\'' +'"' +'`' +':' +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +SPACE +SPEC_SQL_COMMENT +COMMENT_INPUT +LINE_COMMENT +ALL +AND +AS +ASC +BOOLEAN +BETWEEN +BY +CASE +CAST +CROSS +COLUMNS +DATETIME +DELETE +DESC +DESCRIBE +DISTINCT +DOUBLE +ELSE +EXISTS +FALSE +FLOAT +FIRST +FROM +GROUP +HAVING +IN +INNER +INT +INTEGER +IS +JOIN +LAST +LEFT +LIKE +LIMIT +LONG +MATCH +NATURAL +MISSING_LITERAL +NOT +NULL_LITERAL +NULLS +ON +OR +ORDER +OUTER +OVER +PARTITION +REGEXP +RIGHT +SELECT +SHOW +STRING +THEN +TRUE +UNION +USING +WHEN +WHERE +EXCEPT +AVG +COUNT +MAX +MIN +SUM +VAR_POP +VAR_SAMP +VARIANCE +STD +STDDEV +STDDEV_POP +STDDEV_SAMP +SUBSTRING +TRIM +END +FULL +OFFSET +INTERVAL +MICROSECOND +SECOND +MINUTE +HOUR +DAY +WEEK +MONTH +QUARTER +YEAR +SECOND_MICROSECOND +MINUTE_MICROSECOND +MINUTE_SECOND +HOUR_MICROSECOND +HOUR_SECOND +HOUR_MINUTE +DAY_MICROSECOND +DAY_SECOND +DAY_MINUTE +DAY_HOUR +YEAR_MONTH +TABLES +ABS +ACOS +ADD +ADDTIME +ASCII +ASIN +ATAN +ATAN2 +CBRT +CEIL +CEILING +CONCAT +CONCAT_WS +CONV +CONVERT_TZ +COS +COSH +COT +CRC32 +CURDATE +CURTIME +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +DATE +DATE_ADD +DATE_FORMAT +DATE_SUB +DATEDIFF +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DEGREES +DIVIDE +E +EXP +EXPM1 +EXTRACT +FLOOR +FROM_DAYS +FROM_UNIXTIME +GET_FORMAT +IF +IFNULL +ISNULL +LAST_DAY +LENGTH +LN +LOCALTIME +LOCALTIMESTAMP +LOCATE +LOG +LOG10 +LOG2 +LOWER +LTRIM +MAKEDATE +MAKETIME +MODULUS +MONTHNAME +MULTIPLY +NOW +NULLIF +PERIOD_ADD +PERIOD_DIFF +PI +POSITION +POW +POWER +RADIANS +RAND +REPLACE +RINT +ROUND +RTRIM +REVERSE +SEC_TO_TIME +SIGN +SIGNUM +SIN +SINH +SQRT +STR_TO_DATE +SUBDATE +SUBTIME +SUBTRACT +SYSDATE +TAN +TIME +TIMEDIFF +TIME_FORMAT +TIME_TO_SEC +TIMESTAMP +TRUNCATE +TO_DAYS +TO_SECONDS +UNIX_TIMESTAMP +UPPER +UTC_DATE +UTC_TIME +UTC_TIMESTAMP +D +T +TS +LEFT_BRACE +RIGHT_BRACE +DENSE_RANK +RANK +ROW_NUMBER +DATE_HISTOGRAM +DAY_OF_MONTH +DAY_OF_YEAR +DAY_OF_WEEK +EXCLUDE +EXTENDED_STATS +FIELD +FILTER +GEO_BOUNDING_BOX +GEO_CELL +GEO_DISTANCE +GEO_DISTANCE_RANGE +GEO_INTERSECTS +GEO_POLYGON +HISTOGRAM +HOUR_OF_DAY +INCLUDE +IN_TERMS +MATCHPHRASE +MATCH_PHRASE +MATCHPHRASEQUERY +SIMPLE_QUERY_STRING +QUERY_STRING +MATCH_PHRASE_PREFIX +MATCHQUERY +MATCH_QUERY +MINUTE_OF_DAY +MINUTE_OF_HOUR +MONTH_OF_YEAR +MULTIMATCH +MULTI_MATCH +MULTIMATCHQUERY +NESTED +PERCENTILES +PERCENTILE +PERCENTILE_APPROX +REGEXP_QUERY +REVERSE_NESTED +QUERY +RANGE +SCORE +SCOREQUERY +SCORE_QUERY +SECOND_OF_MINUTE +STATS +TERM +TERMS +TIMESTAMPADD +TIMESTAMPDIFF +TOPHITS +TYPEOF +WEEK_OF_YEAR +WEEKOFYEAR +WEEKDAY +WILDCARDQUERY +WILDCARD_QUERY +SUBSTR +STRCMP +ADDDATE +YEARWEEK +ALLOW_LEADING_WILDCARD +ANALYZER +ANALYZE_WILDCARD +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY +BOOST +CASE_INSENSITIVE +CUTOFF_FREQUENCY +DEFAULT_FIELD +DEFAULT_OPERATOR +ESCAPE +ENABLE_POSITION_INCREMENTS +FIELDS +FLAGS +FUZZINESS +FUZZY_MAX_EXPANSIONS +FUZZY_PREFIX_LENGTH +FUZZY_REWRITE +FUZZY_TRANSPOSITIONS +LENIENT +LOW_FREQ_OPERATOR +MAX_DETERMINIZED_STATES +MAX_EXPANSIONS +MINIMUM_SHOULD_MATCH +OPERATOR +PHRASE_SLOP +PREFIX_LENGTH +QUOTE_ANALYZER +QUOTE_FIELD_SUFFIX +REWRITE +SLOP +TIE_BREAKER +TIME_ZONE +TYPE +ZERO_TERMS_QUERY +HIGHLIGHT +HIGHLIGHT_PRE_TAGS +HIGHLIGHT_POST_TAGS +MATCH_BOOL_PREFIX +STAR +SLASH +MODULE +PLUS +MINUS +DIV +MOD +EQUAL_SYMBOL +GREATER_SYMBOL +LESS_SYMBOL +EXCLAMATION_SYMBOL +BIT_NOT_OP +BIT_OR_OP +BIT_AND_OP +BIT_XOR_OP +DOT +LR_BRACKET +RR_BRACKET +LT_SQR_PRTHS +RT_SQR_PRTHS +COMMA +SEMI +AT_SIGN +ZERO_DECIMAL +ONE_DECIMAL +TWO_DECIMAL +SINGLE_QUOTE_SYMB +DOUBLE_QUOTE_SYMB +REVERSE_QUOTE_SYMB +COLON_SYMB +START_NATIONAL_STRING_LITERAL +STRING_LITERAL +DECIMAL_LITERAL +HEXADECIMAL_LITERAL +REAL_LITERAL +NULL_SPEC_LITERAL +BIT_STRING +ID +DOUBLE_QUOTE_ID +BACKTICK_QUOTE_ID +ERROR_RECOGNITION + +rule names: +root +sqlStatement +dmlStatement +selectStatement +adminStatement +showStatement +describeStatement +columnFilter +tableFilter +showDescribePattern +compatibleID +querySpecification +selectClause +selectSpec +selectElements +selectElement +fromClause +relation +whereClause +groupByClause +groupByElements +groupByElement +havingClause +orderByClause +orderByElement +limitClause +windowFunctionClause +windowFunction +overClause +partitionByClause +constant +decimalLiteral +numericLiteral +stringLiteral +booleanLiteral +realLiteral +sign +nullLiteral +datetimeLiteral +dateLiteral +timeLiteral +timestampLiteral +datetimeConstantLiteral +intervalLiteral +intervalUnit +expression +predicate +expressions +expressionAtom +comparisonOperator +nullNotnull +functionCall +timestampFunction +timestampFunctionName +getFormatFunction +getFormatType +extractFunction +simpleDateTimePart +complexDateTimePart +datetimePart +highlightFunction +positionFunction +matchQueryAltSyntaxFunction +scalarFunctionName +specificFunction +relevanceFunction +scoreRelevanceFunction +noFieldRelevanceFunction +singleFieldRelevanceFunction +multiFieldRelevanceFunction +altSingleFieldRelevanceFunction +altMultiFieldRelevanceFunction +convertedDataType +caseFuncAlternative +aggregateFunction +percentileApproxFunction +filterClause +aggregationFunctionName +mathematicalFunctionName +trigonometricFunctionName +arithmeticFunctionName +dateTimeFunctionName +textFunctionName +flowControlFunctionName +noFieldRelevanceFunctionName +systemFunctionName +nestedFunctionName +scoreRelevanceFunctionName +singleFieldRelevanceFunctionName +multiFieldRelevanceFunctionName +altSingleFieldRelevanceFunctionName +altMultiFieldRelevanceFunctionName +functionArgs +functionArg +relevanceArg +highlightArg +relevanceArgName +highlightArgName +relevanceFieldAndWeight +relevanceFieldWeight +relevanceField +relevanceQuery +relevanceArgValue +highlightArgValue +alternateMultiMatchArgName +alternateMultiMatchQuery +alternateMultiMatchField +tableName +columnName +allTupleFields +alias +qualifiedName +ident +keywordsCanBeId + + +atn: +[4, 1, 352, 1112, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 1, 0, 3, 0, 230, 8, 0, 1, 0, 3, 0, 233, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 239, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 3, 4, 247, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 257, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 3, 9, 268, 8, 9, 1, 10, 4, 10, 271, 8, 10, 11, 10, 12, 10, 272, 1, 11, 1, 11, 3, 11, 277, 8, 11, 1, 11, 3, 11, 280, 8, 11, 1, 12, 1, 12, 3, 12, 284, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 3, 14, 292, 8, 14, 1, 14, 1, 14, 5, 14, 296, 8, 14, 10, 14, 12, 14, 299, 9, 14, 1, 15, 1, 15, 3, 15, 303, 8, 15, 1, 15, 3, 15, 306, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 311, 8, 16, 1, 16, 3, 16, 314, 8, 16, 1, 16, 3, 16, 317, 8, 16, 1, 16, 3, 16, 320, 8, 16, 1, 17, 1, 17, 3, 17, 324, 8, 17, 1, 17, 3, 17, 327, 8, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 333, 8, 17, 1, 17, 1, 17, 3, 17, 337, 8, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 349, 8, 20, 10, 20, 12, 20, 352, 9, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 364, 8, 23, 10, 23, 12, 23, 367, 9, 23, 1, 24, 1, 24, 3, 24, 371, 8, 24, 1, 24, 1, 24, 3, 24, 375, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 381, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 389, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 397, 8, 27, 1, 27, 1, 27, 3, 27, 401, 8, 27, 1, 28, 1, 28, 1, 28, 3, 28, 406, 8, 28, 1, 28, 3, 28, 409, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 418, 8, 29, 10, 29, 12, 29, 421, 9, 29, 1, 30, 1, 30, 3, 30, 425, 8, 30, 1, 30, 1, 30, 3, 30, 429, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 436, 8, 30, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 442, 8, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 457, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 466, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 475, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 484, 8, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 498, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 506, 8, 45, 10, 45, 12, 45, 509, 9, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 520, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 529, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 541, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 548, 8, 46, 10, 46, 12, 46, 551, 9, 46, 1, 47, 1, 47, 1, 47, 5, 47, 556, 8, 47, 10, 47, 12, 47, 559, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 569, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 577, 8, 48, 10, 48, 12, 48, 580, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 593, 8, 49, 1, 50, 3, 50, 596, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 615, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 626, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 3, 59, 661, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 668, 8, 60, 10, 60, 12, 60, 671, 9, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 695, 8, 63, 1, 64, 1, 64, 1, 64, 4, 64, 700, 8, 64, 11, 64, 12, 64, 701, 1, 64, 1, 64, 3, 64, 706, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 4, 64, 712, 8, 64, 11, 64, 12, 64, 713, 1, 64, 1, 64, 3, 64, 718, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 729, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 736, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 743, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 752, 8, 67, 10, 67, 12, 67, 755, 9, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 5, 68, 766, 8, 68, 10, 68, 12, 68, 769, 9, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 779, 8, 69, 10, 69, 12, 69, 782, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 789, 8, 69, 10, 69, 12, 69, 792, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 803, 8, 69, 10, 69, 12, 69, 806, 9, 69, 1, 69, 1, 69, 3, 69, 810, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 819, 8, 70, 10, 70, 12, 70, 822, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 833, 8, 71, 10, 71, 12, 71, 836, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 850, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 873, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 882, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 921, 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 986, 8, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1011, 8, 92, 10, 92, 12, 92, 1014, 9, 92, 3, 92, 1016, 8, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1028, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 3, 98, 1046, 8, 98, 1, 99, 1, 99, 1, 100, 1, 100, 3, 100, 1052, 8, 100, 1, 101, 1, 101, 1, 102, 1, 102, 3, 102, 1058, 8, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 3, 104, 1065, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1081, 8, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 5, 111, 1096, 8, 111, 10, 111, 12, 111, 1099, 9, 111, 1, 112, 3, 112, 1102, 8, 112, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1108, 8, 112, 1, 113, 1, 113, 1, 113, 1, 272, 3, 90, 92, 96, 114, 0, 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, 0, 33, 2, 0, 314, 314, 349, 349, 2, 0, 5, 5, 20, 20, 2, 0, 8, 8, 18, 18, 2, 0, 26, 26, 36, 36, 1, 0, 211, 213, 2, 0, 335, 337, 344, 344, 2, 0, 343, 343, 350, 350, 2, 0, 24, 24, 59, 59, 1, 0, 315, 316, 2, 0, 128, 128, 206, 206, 2, 0, 193, 193, 207, 207, 2, 0, 197, 197, 208, 208, 3, 0, 125, 127, 153, 154, 203, 205, 1, 0, 83, 102, 1, 0, 312, 314, 1, 0, 261, 262, 4, 0, 16, 16, 128, 128, 193, 193, 197, 197, 1, 0, 83, 91, 1, 0, 92, 102, 1, 0, 248, 249, 1, 0, 65, 76, 7, 0, 105, 105, 109, 111, 119, 121, 137, 137, 174, 174, 184, 185, 192, 192, 6, 0, 106, 106, 138, 138, 163, 163, 165, 165, 190, 190, 318, 318, 12, 0, 37, 37, 54, 54, 77, 78, 108, 108, 115, 116, 151, 151, 155, 155, 159, 160, 176, 176, 179, 180, 202, 202, 270, 271, 2, 0, 147, 149, 167, 167, 1, 0, 254, 256, 5, 0, 41, 41, 232, 234, 237, 239, 268, 269, 311, 311, 2, 0, 235, 236, 243, 245, 2, 0, 232, 233, 238, 239, 1, 0, 243, 244, 1, 0, 274, 307, 1, 0, 309, 310, 7, 0, 26, 26, 36, 36, 65, 69, 80, 80, 206, 208, 220, 220, 306, 306, 1220, 0, 229, 1, 0, 0, 0, 2, 238, 1, 0, 0, 0, 4, 240, 1, 0, 0, 0, 6, 242, 1, 0, 0, 0, 8, 246, 1, 0, 0, 0, 10, 248, 1, 0, 0, 0, 12, 252, 1, 0, 0, 0, 14, 258, 1, 0, 0, 0, 16, 262, 1, 0, 0, 0, 18, 267, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 274, 1, 0, 0, 0, 24, 281, 1, 0, 0, 0, 26, 287, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 300, 1, 0, 0, 0, 32, 307, 1, 0, 0, 0, 34, 336, 1, 0, 0, 0, 36, 338, 1, 0, 0, 0, 38, 341, 1, 0, 0, 0, 40, 345, 1, 0, 0, 0, 42, 353, 1, 0, 0, 0, 44, 355, 1, 0, 0, 0, 46, 358, 1, 0, 0, 0, 48, 368, 1, 0, 0, 0, 50, 388, 1, 0, 0, 0, 52, 390, 1, 0, 0, 0, 54, 400, 1, 0, 0, 0, 56, 402, 1, 0, 0, 0, 58, 412, 1, 0, 0, 0, 60, 435, 1, 0, 0, 0, 62, 437, 1, 0, 0, 0, 64, 441, 1, 0, 0, 0, 66, 443, 1, 0, 0, 0, 68, 445, 1, 0, 0, 0, 70, 447, 1, 0, 0, 0, 72, 449, 1, 0, 0, 0, 74, 451, 1, 0, 0, 0, 76, 456, 1, 0, 0, 0, 78, 465, 1, 0, 0, 0, 80, 474, 1, 0, 0, 0, 82, 483, 1, 0, 0, 0, 84, 485, 1, 0, 0, 0, 86, 487, 1, 0, 0, 0, 88, 491, 1, 0, 0, 0, 90, 497, 1, 0, 0, 0, 92, 510, 1, 0, 0, 0, 94, 552, 1, 0, 0, 0, 96, 568, 1, 0, 0, 0, 98, 592, 1, 0, 0, 0, 100, 595, 1, 0, 0, 0, 102, 625, 1, 0, 0, 0, 104, 627, 1, 0, 0, 0, 106, 636, 1, 0, 0, 0, 108, 638, 1, 0, 0, 0, 110, 645, 1, 0, 0, 0, 112, 647, 1, 0, 0, 0, 114, 654, 1, 0, 0, 0, 116, 656, 1, 0, 0, 0, 118, 660, 1, 0, 0, 0, 120, 662, 1, 0, 0, 0, 122, 674, 1, 0, 0, 0, 124, 681, 1, 0, 0, 0, 126, 694, 1, 0, 0, 0, 128, 728, 1, 0, 0, 0, 130, 735, 1, 0, 0, 0, 132, 737, 1, 0, 0, 0, 134, 746, 1, 0, 0, 0, 136, 758, 1, 0, 0, 0, 138, 809, 1, 0, 0, 0, 140, 811, 1, 0, 0, 0, 142, 825, 1, 0, 0, 0, 144, 849, 1, 0, 0, 0, 146, 851, 1, 0, 0, 0, 148, 872, 1, 0, 0, 0, 150, 874, 1, 0, 0, 0, 152, 885, 1, 0, 0, 0, 154, 891, 1, 0, 0, 0, 156, 920, 1, 0, 0, 0, 158, 922, 1, 0, 0, 0, 160, 924, 1, 0, 0, 0, 162, 985, 1, 0, 0, 0, 164, 987, 1, 0, 0, 0, 166, 989, 1, 0, 0, 0, 168, 991, 1, 0, 0, 0, 170, 993, 1, 0, 0, 0, 172, 995, 1, 0, 0, 0, 174, 997, 1, 0, 0, 0, 176, 999, 1, 0, 0, 0, 178, 1001, 1, 0, 0, 0, 180, 1003, 1, 0, 0, 0, 182, 1005, 1, 0, 0, 0, 184, 1015, 1, 0, 0, 0, 186, 1017, 1, 0, 0, 0, 188, 1027, 1, 0, 0, 0, 190, 1029, 1, 0, 0, 0, 192, 1033, 1, 0, 0, 0, 194, 1035, 1, 0, 0, 0, 196, 1045, 1, 0, 0, 0, 198, 1047, 1, 0, 0, 0, 200, 1051, 1, 0, 0, 0, 202, 1053, 1, 0, 0, 0, 204, 1057, 1, 0, 0, 0, 206, 1059, 1, 0, 0, 0, 208, 1064, 1, 0, 0, 0, 210, 1066, 1, 0, 0, 0, 212, 1080, 1, 0, 0, 0, 214, 1082, 1, 0, 0, 0, 216, 1084, 1, 0, 0, 0, 218, 1086, 1, 0, 0, 0, 220, 1090, 1, 0, 0, 0, 222, 1092, 1, 0, 0, 0, 224, 1107, 1, 0, 0, 0, 226, 1109, 1, 0, 0, 0, 228, 230, 3, 2, 1, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 233, 5, 333, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 0, 0, 1, 235, 1, 1, 0, 0, 0, 236, 239, 3, 4, 2, 0, 237, 239, 3, 8, 4, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 3, 1, 0, 0, 0, 240, 241, 3, 6, 3, 0, 241, 5, 1, 0, 0, 0, 242, 243, 3, 22, 11, 0, 243, 7, 1, 0, 0, 0, 244, 247, 3, 10, 5, 0, 245, 247, 3, 12, 6, 0, 246, 244, 1, 0, 0, 0, 246, 245, 1, 0, 0, 0, 247, 9, 1, 0, 0, 0, 248, 249, 5, 56, 0, 0, 249, 250, 5, 103, 0, 0, 250, 251, 3, 16, 8, 0, 251, 11, 1, 0, 0, 0, 252, 253, 5, 19, 0, 0, 253, 254, 5, 103, 0, 0, 254, 256, 3, 16, 8, 0, 255, 257, 3, 14, 7, 0, 256, 255, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 13, 1, 0, 0, 0, 258, 259, 5, 15, 0, 0, 259, 260, 5, 38, 0, 0, 260, 261, 3, 18, 9, 0, 261, 15, 1, 0, 0, 0, 262, 263, 5, 38, 0, 0, 263, 264, 3, 18, 9, 0, 264, 17, 1, 0, 0, 0, 265, 268, 3, 20, 10, 0, 266, 268, 3, 66, 33, 0, 267, 265, 1, 0, 0, 0, 267, 266, 1, 0, 0, 0, 268, 19, 1, 0, 0, 0, 269, 271, 7, 0, 0, 0, 270, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 21, 1, 0, 0, 0, 274, 276, 3, 24, 12, 0, 275, 277, 3, 32, 16, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 279, 1, 0, 0, 0, 278, 280, 3, 50, 25, 0, 279, 278, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 23, 1, 0, 0, 0, 281, 283, 5, 55, 0, 0, 282, 284, 3, 26, 13, 0, 283, 282, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 286, 3, 28, 14, 0, 286, 25, 1, 0, 0, 0, 287, 288, 7, 1, 0, 0, 288, 27, 1, 0, 0, 0, 289, 292, 5, 312, 0, 0, 290, 292, 3, 30, 15, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 292, 297, 1, 0, 0, 0, 293, 294, 5, 332, 0, 0, 294, 296, 3, 30, 15, 0, 295, 293, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 29, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 305, 3, 90, 45, 0, 301, 303, 5, 7, 0, 0, 302, 301, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 3, 220, 110, 0, 305, 302, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 31, 1, 0, 0, 0, 307, 308, 5, 27, 0, 0, 308, 310, 3, 34, 17, 0, 309, 311, 3, 36, 18, 0, 310, 309, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 313, 1, 0, 0, 0, 312, 314, 3, 38, 19, 0, 313, 312, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 317, 3, 44, 22, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 319, 1, 0, 0, 0, 318, 320, 3, 46, 23, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 33, 1, 0, 0, 0, 321, 326, 3, 214, 107, 0, 322, 324, 5, 7, 0, 0, 323, 322, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 3, 220, 110, 0, 326, 323, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 337, 1, 0, 0, 0, 328, 329, 5, 328, 0, 0, 329, 330, 3, 22, 11, 0, 330, 332, 5, 329, 0, 0, 331, 333, 5, 7, 0, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 335, 3, 220, 110, 0, 335, 337, 1, 0, 0, 0, 336, 321, 1, 0, 0, 0, 336, 328, 1, 0, 0, 0, 337, 35, 1, 0, 0, 0, 338, 339, 5, 63, 0, 0, 339, 340, 3, 90, 45, 0, 340, 37, 1, 0, 0, 0, 341, 342, 5, 28, 0, 0, 342, 343, 5, 11, 0, 0, 343, 344, 3, 40, 20, 0, 344, 39, 1, 0, 0, 0, 345, 350, 3, 42, 21, 0, 346, 347, 5, 332, 0, 0, 347, 349, 3, 42, 21, 0, 348, 346, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 41, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 3, 90, 45, 0, 354, 43, 1, 0, 0, 0, 355, 356, 5, 29, 0, 0, 356, 357, 3, 90, 45, 0, 357, 45, 1, 0, 0, 0, 358, 359, 5, 49, 0, 0, 359, 360, 5, 11, 0, 0, 360, 365, 3, 48, 24, 0, 361, 362, 5, 332, 0, 0, 362, 364, 3, 48, 24, 0, 363, 361, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 47, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 368, 370, 3, 90, 45, 0, 369, 371, 7, 2, 0, 0, 370, 369, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 373, 5, 46, 0, 0, 373, 375, 7, 3, 0, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 49, 1, 0, 0, 0, 376, 380, 5, 39, 0, 0, 377, 378, 3, 62, 31, 0, 378, 379, 5, 332, 0, 0, 379, 381, 1, 0, 0, 0, 380, 377, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 389, 3, 62, 31, 0, 383, 384, 5, 39, 0, 0, 384, 385, 3, 62, 31, 0, 385, 386, 5, 81, 0, 0, 386, 387, 3, 62, 31, 0, 387, 389, 1, 0, 0, 0, 388, 376, 1, 0, 0, 0, 388, 383, 1, 0, 0, 0, 389, 51, 1, 0, 0, 0, 390, 391, 3, 54, 27, 0, 391, 392, 3, 56, 28, 0, 392, 53, 1, 0, 0, 0, 393, 394, 7, 4, 0, 0, 394, 396, 5, 328, 0, 0, 395, 397, 3, 184, 92, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 401, 5, 329, 0, 0, 399, 401, 3, 148, 74, 0, 400, 393, 1, 0, 0, 0, 400, 399, 1, 0, 0, 0, 401, 55, 1, 0, 0, 0, 402, 403, 5, 51, 0, 0, 403, 405, 5, 328, 0, 0, 404, 406, 3, 58, 29, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 409, 3, 46, 23, 0, 408, 407, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 411, 5, 329, 0, 0, 411, 57, 1, 0, 0, 0, 412, 413, 5, 52, 0, 0, 413, 414, 5, 11, 0, 0, 414, 419, 3, 90, 45, 0, 415, 416, 5, 332, 0, 0, 416, 418, 3, 90, 45, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 59, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 436, 3, 66, 33, 0, 423, 425, 3, 72, 36, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 436, 3, 62, 31, 0, 427, 429, 3, 72, 36, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 436, 3, 70, 35, 0, 431, 436, 3, 68, 34, 0, 432, 436, 3, 76, 38, 0, 433, 436, 3, 86, 43, 0, 434, 436, 3, 74, 37, 0, 435, 422, 1, 0, 0, 0, 435, 424, 1, 0, 0, 0, 435, 428, 1, 0, 0, 0, 435, 431, 1, 0, 0, 0, 435, 432, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 434, 1, 0, 0, 0, 436, 61, 1, 0, 0, 0, 437, 438, 7, 5, 0, 0, 438, 63, 1, 0, 0, 0, 439, 442, 3, 62, 31, 0, 440, 442, 3, 70, 35, 0, 441, 439, 1, 0, 0, 0, 441, 440, 1, 0, 0, 0, 442, 65, 1, 0, 0, 0, 443, 444, 7, 6, 0, 0, 444, 67, 1, 0, 0, 0, 445, 446, 7, 7, 0, 0, 446, 69, 1, 0, 0, 0, 447, 448, 5, 346, 0, 0, 448, 71, 1, 0, 0, 0, 449, 450, 7, 8, 0, 0, 450, 73, 1, 0, 0, 0, 451, 452, 5, 45, 0, 0, 452, 75, 1, 0, 0, 0, 453, 457, 3, 78, 39, 0, 454, 457, 3, 80, 40, 0, 455, 457, 3, 82, 41, 0, 456, 453, 1, 0, 0, 0, 456, 454, 1, 0, 0, 0, 456, 455, 1, 0, 0, 0, 457, 77, 1, 0, 0, 0, 458, 459, 5, 128, 0, 0, 459, 466, 3, 66, 33, 0, 460, 461, 5, 209, 0, 0, 461, 462, 7, 9, 0, 0, 462, 463, 3, 66, 33, 0, 463, 464, 5, 210, 0, 0, 464, 466, 1, 0, 0, 0, 465, 458, 1, 0, 0, 0, 465, 460, 1, 0, 0, 0, 466, 79, 1, 0, 0, 0, 467, 468, 5, 193, 0, 0, 468, 475, 3, 66, 33, 0, 469, 470, 5, 209, 0, 0, 470, 471, 7, 10, 0, 0, 471, 472, 3, 66, 33, 0, 472, 473, 5, 210, 0, 0, 473, 475, 1, 0, 0, 0, 474, 467, 1, 0, 0, 0, 474, 469, 1, 0, 0, 0, 475, 81, 1, 0, 0, 0, 476, 477, 5, 197, 0, 0, 477, 484, 3, 66, 33, 0, 478, 479, 5, 209, 0, 0, 479, 480, 7, 11, 0, 0, 480, 481, 3, 66, 33, 0, 481, 482, 5, 210, 0, 0, 482, 484, 1, 0, 0, 0, 483, 476, 1, 0, 0, 0, 483, 478, 1, 0, 0, 0, 484, 83, 1, 0, 0, 0, 485, 486, 7, 12, 0, 0, 486, 85, 1, 0, 0, 0, 487, 488, 5, 82, 0, 0, 488, 489, 3, 90, 45, 0, 489, 490, 3, 88, 44, 0, 490, 87, 1, 0, 0, 0, 491, 492, 7, 13, 0, 0, 492, 89, 1, 0, 0, 0, 493, 494, 6, 45, -1, 0, 494, 495, 5, 44, 0, 0, 495, 498, 3, 90, 45, 4, 496, 498, 3, 92, 46, 0, 497, 493, 1, 0, 0, 0, 497, 496, 1, 0, 0, 0, 498, 507, 1, 0, 0, 0, 499, 500, 10, 3, 0, 0, 500, 501, 5, 6, 0, 0, 501, 506, 3, 90, 45, 4, 502, 503, 10, 2, 0, 0, 503, 504, 5, 48, 0, 0, 504, 506, 3, 90, 45, 3, 505, 499, 1, 0, 0, 0, 505, 502, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 91, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 6, 46, -1, 0, 511, 512, 3, 96, 48, 0, 512, 549, 1, 0, 0, 0, 513, 514, 10, 6, 0, 0, 514, 515, 3, 98, 49, 0, 515, 516, 3, 92, 46, 7, 516, 548, 1, 0, 0, 0, 517, 519, 10, 4, 0, 0, 518, 520, 5, 44, 0, 0, 519, 518, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 5, 10, 0, 0, 522, 523, 3, 92, 46, 0, 523, 524, 5, 6, 0, 0, 524, 525, 3, 92, 46, 5, 525, 548, 1, 0, 0, 0, 526, 528, 10, 3, 0, 0, 527, 529, 5, 44, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 38, 0, 0, 531, 548, 3, 92, 46, 4, 532, 533, 10, 2, 0, 0, 533, 534, 5, 53, 0, 0, 534, 548, 3, 92, 46, 3, 535, 536, 10, 5, 0, 0, 536, 537, 5, 34, 0, 0, 537, 548, 3, 100, 50, 0, 538, 540, 10, 1, 0, 0, 539, 541, 5, 44, 0, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 30, 0, 0, 543, 544, 5, 328, 0, 0, 544, 545, 3, 94, 47, 0, 545, 546, 5, 329, 0, 0, 546, 548, 1, 0, 0, 0, 547, 513, 1, 0, 0, 0, 547, 517, 1, 0, 0, 0, 547, 526, 1, 0, 0, 0, 547, 532, 1, 0, 0, 0, 547, 535, 1, 0, 0, 0, 547, 538, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 93, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 557, 3, 90, 45, 0, 553, 554, 5, 332, 0, 0, 554, 556, 3, 90, 45, 0, 555, 553, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 95, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 6, 48, -1, 0, 561, 569, 3, 60, 30, 0, 562, 569, 3, 216, 108, 0, 563, 569, 3, 102, 51, 0, 564, 565, 5, 328, 0, 0, 565, 566, 3, 90, 45, 0, 566, 567, 5, 329, 0, 0, 567, 569, 1, 0, 0, 0, 568, 560, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 563, 1, 0, 0, 0, 568, 564, 1, 0, 0, 0, 569, 578, 1, 0, 0, 0, 570, 571, 10, 2, 0, 0, 571, 572, 7, 14, 0, 0, 572, 577, 3, 96, 48, 3, 573, 574, 10, 1, 0, 0, 574, 575, 7, 8, 0, 0, 575, 577, 3, 96, 48, 2, 576, 570, 1, 0, 0, 0, 576, 573, 1, 0, 0, 0, 577, 580, 1, 0, 0, 0, 578, 576, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 97, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 581, 593, 5, 319, 0, 0, 582, 593, 5, 320, 0, 0, 583, 593, 5, 321, 0, 0, 584, 585, 5, 321, 0, 0, 585, 593, 5, 319, 0, 0, 586, 587, 5, 320, 0, 0, 587, 593, 5, 319, 0, 0, 588, 589, 5, 321, 0, 0, 589, 593, 5, 320, 0, 0, 590, 591, 5, 322, 0, 0, 591, 593, 5, 319, 0, 0, 592, 581, 1, 0, 0, 0, 592, 582, 1, 0, 0, 0, 592, 583, 1, 0, 0, 0, 592, 584, 1, 0, 0, 0, 592, 586, 1, 0, 0, 0, 592, 588, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 593, 99, 1, 0, 0, 0, 594, 596, 5, 44, 0, 0, 595, 594, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 5, 45, 0, 0, 598, 101, 1, 0, 0, 0, 599, 600, 3, 172, 86, 0, 600, 601, 5, 328, 0, 0, 601, 602, 3, 218, 109, 0, 602, 603, 5, 329, 0, 0, 603, 626, 1, 0, 0, 0, 604, 605, 3, 126, 63, 0, 605, 606, 5, 328, 0, 0, 606, 607, 3, 184, 92, 0, 607, 608, 5, 329, 0, 0, 608, 626, 1, 0, 0, 0, 609, 626, 3, 128, 64, 0, 610, 626, 3, 52, 26, 0, 611, 626, 3, 148, 74, 0, 612, 614, 3, 148, 74, 0, 613, 615, 3, 46, 23, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 3, 152, 76, 0, 617, 626, 1, 0, 0, 0, 618, 626, 3, 132, 66, 0, 619, 626, 3, 130, 65, 0, 620, 626, 3, 120, 60, 0, 621, 626, 3, 122, 61, 0, 622, 626, 3, 112, 56, 0, 623, 626, 3, 108, 54, 0, 624, 626, 3, 104, 52, 0, 625, 599, 1, 0, 0, 0, 625, 604, 1, 0, 0, 0, 625, 609, 1, 0, 0, 0, 625, 610, 1, 0, 0, 0, 625, 611, 1, 0, 0, 0, 625, 612, 1, 0, 0, 0, 625, 618, 1, 0, 0, 0, 625, 619, 1, 0, 0, 0, 625, 620, 1, 0, 0, 0, 625, 621, 1, 0, 0, 0, 625, 622, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 625, 624, 1, 0, 0, 0, 626, 103, 1, 0, 0, 0, 627, 628, 3, 106, 53, 0, 628, 629, 5, 328, 0, 0, 629, 630, 3, 114, 57, 0, 630, 631, 5, 332, 0, 0, 631, 632, 3, 186, 93, 0, 632, 633, 5, 332, 0, 0, 633, 634, 3, 186, 93, 0, 634, 635, 5, 329, 0, 0, 635, 105, 1, 0, 0, 0, 636, 637, 7, 15, 0, 0, 637, 107, 1, 0, 0, 0, 638, 639, 5, 146, 0, 0, 639, 640, 5, 328, 0, 0, 640, 641, 3, 110, 55, 0, 641, 642, 5, 332, 0, 0, 642, 643, 3, 186, 93, 0, 643, 644, 5, 329, 0, 0, 644, 109, 1, 0, 0, 0, 645, 646, 7, 16, 0, 0, 646, 111, 1, 0, 0, 0, 647, 648, 5, 142, 0, 0, 648, 649, 5, 328, 0, 0, 649, 650, 3, 118, 59, 0, 650, 651, 5, 27, 0, 0, 651, 652, 3, 186, 93, 0, 652, 653, 5, 329, 0, 0, 653, 113, 1, 0, 0, 0, 654, 655, 7, 17, 0, 0, 655, 115, 1, 0, 0, 0, 656, 657, 7, 18, 0, 0, 657, 117, 1, 0, 0, 0, 658, 661, 3, 114, 57, 0, 659, 661, 3, 116, 58, 0, 660, 658, 1, 0, 0, 0, 660, 659, 1, 0, 0, 0, 661, 119, 1, 0, 0, 0, 662, 663, 5, 308, 0, 0, 663, 664, 5, 328, 0, 0, 664, 669, 3, 200, 100, 0, 665, 666, 5, 332, 0, 0, 666, 668, 3, 190, 95, 0, 667, 665, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 5, 329, 0, 0, 673, 121, 1, 0, 0, 0, 674, 675, 5, 171, 0, 0, 675, 676, 5, 328, 0, 0, 676, 677, 3, 186, 93, 0, 677, 678, 5, 30, 0, 0, 678, 679, 3, 186, 93, 0, 679, 680, 5, 329, 0, 0, 680, 123, 1, 0, 0, 0, 681, 682, 3, 200, 100, 0, 682, 683, 5, 319, 0, 0, 683, 684, 5, 239, 0, 0, 684, 685, 5, 328, 0, 0, 685, 686, 3, 202, 101, 0, 686, 687, 5, 329, 0, 0, 687, 125, 1, 0, 0, 0, 688, 695, 3, 156, 78, 0, 689, 695, 3, 162, 81, 0, 690, 695, 3, 164, 82, 0, 691, 695, 3, 166, 83, 0, 692, 695, 3, 170, 85, 0, 693, 695, 3, 172, 86, 0, 694, 688, 1, 0, 0, 0, 694, 689, 1, 0, 0, 0, 694, 690, 1, 0, 0, 0, 694, 691, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 693, 1, 0, 0, 0, 695, 127, 1, 0, 0, 0, 696, 697, 5, 12, 0, 0, 697, 699, 3, 90, 45, 0, 698, 700, 3, 146, 73, 0, 699, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 705, 1, 0, 0, 0, 703, 704, 5, 22, 0, 0, 704, 706, 3, 186, 93, 0, 705, 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 708, 5, 79, 0, 0, 708, 729, 1, 0, 0, 0, 709, 711, 5, 12, 0, 0, 710, 712, 3, 146, 73, 0, 711, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 717, 1, 0, 0, 0, 715, 716, 5, 22, 0, 0, 716, 718, 3, 186, 93, 0, 717, 715, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 720, 5, 79, 0, 0, 720, 729, 1, 0, 0, 0, 721, 722, 5, 13, 0, 0, 722, 723, 5, 328, 0, 0, 723, 724, 3, 90, 45, 0, 724, 725, 5, 7, 0, 0, 725, 726, 3, 144, 72, 0, 726, 727, 5, 329, 0, 0, 727, 729, 1, 0, 0, 0, 728, 696, 1, 0, 0, 0, 728, 709, 1, 0, 0, 0, 728, 721, 1, 0, 0, 0, 729, 129, 1, 0, 0, 0, 730, 736, 3, 134, 67, 0, 731, 736, 3, 136, 68, 0, 732, 736, 3, 138, 69, 0, 733, 736, 3, 140, 70, 0, 734, 736, 3, 142, 71, 0, 735, 730, 1, 0, 0, 0, 735, 731, 1, 0, 0, 0, 735, 732, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 735, 734, 1, 0, 0, 0, 736, 131, 1, 0, 0, 0, 737, 738, 3, 174, 87, 0, 738, 739, 5, 328, 0, 0, 739, 742, 3, 130, 65, 0, 740, 741, 5, 332, 0, 0, 741, 743, 3, 198, 99, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 5, 329, 0, 0, 745, 133, 1, 0, 0, 0, 746, 747, 3, 168, 84, 0, 747, 748, 5, 328, 0, 0, 748, 753, 3, 202, 101, 0, 749, 750, 5, 332, 0, 0, 750, 752, 3, 188, 94, 0, 751, 749, 1, 0, 0, 0, 752, 755, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 756, 1, 0, 0, 0, 755, 753, 1, 0, 0, 0, 756, 757, 5, 329, 0, 0, 757, 135, 1, 0, 0, 0, 758, 759, 3, 176, 88, 0, 759, 760, 5, 328, 0, 0, 760, 761, 3, 200, 100, 0, 761, 762, 5, 332, 0, 0, 762, 767, 3, 202, 101, 0, 763, 764, 5, 332, 0, 0, 764, 766, 3, 188, 94, 0, 765, 763, 1, 0, 0, 0, 766, 769, 1, 0, 0, 0, 767, 765, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 770, 1, 0, 0, 0, 769, 767, 1, 0, 0, 0, 770, 771, 5, 329, 0, 0, 771, 137, 1, 0, 0, 0, 772, 773, 3, 178, 89, 0, 773, 774, 5, 328, 0, 0, 774, 775, 5, 330, 0, 0, 775, 780, 3, 196, 98, 0, 776, 777, 5, 332, 0, 0, 777, 779, 3, 196, 98, 0, 778, 776, 1, 0, 0, 0, 779, 782, 1, 0, 0, 0, 780, 778, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 783, 1, 0, 0, 0, 782, 780, 1, 0, 0, 0, 783, 784, 5, 331, 0, 0, 784, 785, 5, 332, 0, 0, 785, 790, 3, 202, 101, 0, 786, 787, 5, 332, 0, 0, 787, 789, 3, 188, 94, 0, 788, 786, 1, 0, 0, 0, 789, 792, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 793, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 793, 794, 5, 329, 0, 0, 794, 810, 1, 0, 0, 0, 795, 796, 3, 178, 89, 0, 796, 797, 5, 328, 0, 0, 797, 798, 3, 210, 105, 0, 798, 799, 5, 332, 0, 0, 799, 804, 3, 212, 106, 0, 800, 801, 5, 332, 0, 0, 801, 803, 3, 188, 94, 0, 802, 800, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 802, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 807, 1, 0, 0, 0, 806, 804, 1, 0, 0, 0, 807, 808, 5, 329, 0, 0, 808, 810, 1, 0, 0, 0, 809, 772, 1, 0, 0, 0, 809, 795, 1, 0, 0, 0, 810, 139, 1, 0, 0, 0, 811, 812, 3, 200, 100, 0, 812, 813, 5, 319, 0, 0, 813, 814, 3, 180, 90, 0, 814, 815, 5, 328, 0, 0, 815, 820, 3, 202, 101, 0, 816, 817, 5, 332, 0, 0, 817, 819, 3, 188, 94, 0, 818, 816, 1, 0, 0, 0, 819, 822, 1, 0, 0, 0, 820, 818, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 823, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 823, 824, 5, 329, 0, 0, 824, 141, 1, 0, 0, 0, 825, 826, 3, 200, 100, 0, 826, 827, 5, 319, 0, 0, 827, 828, 3, 182, 91, 0, 828, 829, 5, 328, 0, 0, 829, 834, 3, 202, 101, 0, 830, 831, 5, 332, 0, 0, 831, 833, 3, 188, 94, 0, 832, 830, 1, 0, 0, 0, 833, 836, 1, 0, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 1, 0, 0, 0, 836, 834, 1, 0, 0, 0, 837, 838, 5, 329, 0, 0, 838, 143, 1, 0, 0, 0, 839, 850, 5, 128, 0, 0, 840, 850, 5, 193, 0, 0, 841, 850, 5, 197, 0, 0, 842, 850, 5, 32, 0, 0, 843, 850, 5, 33, 0, 0, 844, 850, 5, 21, 0, 0, 845, 850, 5, 40, 0, 0, 846, 850, 5, 25, 0, 0, 847, 850, 5, 57, 0, 0, 848, 850, 5, 9, 0, 0, 849, 839, 1, 0, 0, 0, 849, 840, 1, 0, 0, 0, 849, 841, 1, 0, 0, 0, 849, 842, 1, 0, 0, 0, 849, 843, 1, 0, 0, 0, 849, 844, 1, 0, 0, 0, 849, 845, 1, 0, 0, 0, 849, 846, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 849, 848, 1, 0, 0, 0, 850, 145, 1, 0, 0, 0, 851, 852, 5, 62, 0, 0, 852, 853, 3, 186, 93, 0, 853, 854, 5, 58, 0, 0, 854, 855, 3, 186, 93, 0, 855, 147, 1, 0, 0, 0, 856, 857, 3, 154, 77, 0, 857, 858, 5, 328, 0, 0, 858, 859, 3, 186, 93, 0, 859, 860, 5, 329, 0, 0, 860, 873, 1, 0, 0, 0, 861, 862, 5, 66, 0, 0, 862, 863, 5, 328, 0, 0, 863, 864, 5, 312, 0, 0, 864, 873, 5, 329, 0, 0, 865, 866, 5, 66, 0, 0, 866, 867, 5, 328, 0, 0, 867, 868, 5, 20, 0, 0, 868, 869, 3, 186, 93, 0, 869, 870, 5, 329, 0, 0, 870, 873, 1, 0, 0, 0, 871, 873, 3, 150, 75, 0, 872, 856, 1, 0, 0, 0, 872, 861, 1, 0, 0, 0, 872, 865, 1, 0, 0, 0, 872, 871, 1, 0, 0, 0, 873, 149, 1, 0, 0, 0, 874, 875, 7, 19, 0, 0, 875, 876, 5, 328, 0, 0, 876, 877, 3, 186, 93, 0, 877, 878, 5, 332, 0, 0, 878, 881, 3, 64, 32, 0, 879, 880, 5, 332, 0, 0, 880, 882, 3, 64, 32, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 329, 0, 0, 884, 151, 1, 0, 0, 0, 885, 886, 5, 221, 0, 0, 886, 887, 5, 328, 0, 0, 887, 888, 5, 63, 0, 0, 888, 889, 3, 90, 45, 0, 889, 890, 5, 329, 0, 0, 890, 153, 1, 0, 0, 0, 891, 892, 7, 20, 0, 0, 892, 155, 1, 0, 0, 0, 893, 921, 5, 104, 0, 0, 894, 921, 5, 112, 0, 0, 895, 921, 5, 113, 0, 0, 896, 921, 5, 114, 0, 0, 897, 921, 5, 117, 0, 0, 898, 921, 5, 122, 0, 0, 899, 921, 5, 139, 0, 0, 900, 921, 5, 140, 0, 0, 901, 921, 5, 141, 0, 0, 902, 921, 5, 143, 0, 0, 903, 921, 5, 152, 0, 0, 904, 921, 5, 156, 0, 0, 905, 921, 5, 157, 0, 0, 906, 921, 5, 158, 0, 0, 907, 921, 5, 318, 0, 0, 908, 921, 5, 170, 0, 0, 909, 921, 5, 172, 0, 0, 910, 921, 5, 173, 0, 0, 911, 921, 5, 175, 0, 0, 912, 921, 5, 177, 0, 0, 913, 921, 5, 178, 0, 0, 914, 921, 5, 182, 0, 0, 915, 921, 5, 183, 0, 0, 916, 921, 5, 186, 0, 0, 917, 921, 5, 198, 0, 0, 918, 921, 3, 158, 79, 0, 919, 921, 3, 160, 80, 0, 920, 893, 1, 0, 0, 0, 920, 894, 1, 0, 0, 0, 920, 895, 1, 0, 0, 0, 920, 896, 1, 0, 0, 0, 920, 897, 1, 0, 0, 0, 920, 898, 1, 0, 0, 0, 920, 899, 1, 0, 0, 0, 920, 900, 1, 0, 0, 0, 920, 901, 1, 0, 0, 0, 920, 902, 1, 0, 0, 0, 920, 903, 1, 0, 0, 0, 920, 904, 1, 0, 0, 0, 920, 905, 1, 0, 0, 0, 920, 906, 1, 0, 0, 0, 920, 907, 1, 0, 0, 0, 920, 908, 1, 0, 0, 0, 920, 909, 1, 0, 0, 0, 920, 910, 1, 0, 0, 0, 920, 911, 1, 0, 0, 0, 920, 912, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 920, 914, 1, 0, 0, 0, 920, 915, 1, 0, 0, 0, 920, 916, 1, 0, 0, 0, 920, 917, 1, 0, 0, 0, 920, 918, 1, 0, 0, 0, 920, 919, 1, 0, 0, 0, 921, 157, 1, 0, 0, 0, 922, 923, 7, 21, 0, 0, 923, 159, 1, 0, 0, 0, 924, 925, 7, 22, 0, 0, 925, 161, 1, 0, 0, 0, 926, 986, 3, 84, 42, 0, 927, 986, 5, 272, 0, 0, 928, 986, 5, 107, 0, 0, 929, 986, 5, 118, 0, 0, 930, 986, 5, 123, 0, 0, 931, 986, 5, 124, 0, 0, 932, 986, 5, 128, 0, 0, 933, 986, 5, 129, 0, 0, 934, 986, 5, 130, 0, 0, 935, 986, 5, 131, 0, 0, 936, 986, 5, 132, 0, 0, 937, 986, 5, 16, 0, 0, 938, 986, 5, 87, 0, 0, 939, 986, 5, 133, 0, 0, 940, 986, 5, 134, 0, 0, 941, 986, 5, 215, 0, 0, 942, 986, 5, 135, 0, 0, 943, 986, 5, 136, 0, 0, 944, 986, 5, 216, 0, 0, 945, 986, 5, 217, 0, 0, 946, 986, 5, 144, 0, 0, 947, 986, 5, 145, 0, 0, 948, 986, 5, 86, 0, 0, 949, 986, 5, 229, 0, 0, 950, 986, 5, 150, 0, 0, 951, 986, 5, 161, 0, 0, 952, 986, 5, 162, 0, 0, 953, 986, 5, 83, 0, 0, 954, 986, 5, 85, 0, 0, 955, 986, 5, 240, 0, 0, 956, 986, 5, 241, 0, 0, 957, 986, 5, 89, 0, 0, 958, 986, 5, 164, 0, 0, 959, 986, 5, 242, 0, 0, 960, 986, 5, 166, 0, 0, 961, 986, 5, 168, 0, 0, 962, 986, 5, 169, 0, 0, 963, 986, 5, 90, 0, 0, 964, 986, 5, 181, 0, 0, 965, 986, 5, 84, 0, 0, 966, 986, 5, 257, 0, 0, 967, 986, 5, 188, 0, 0, 968, 986, 5, 189, 0, 0, 969, 986, 5, 191, 0, 0, 970, 986, 5, 187, 0, 0, 971, 986, 5, 193, 0, 0, 972, 986, 5, 195, 0, 0, 973, 986, 5, 196, 0, 0, 974, 986, 5, 194, 0, 0, 975, 986, 5, 197, 0, 0, 976, 986, 5, 199, 0, 0, 977, 986, 5, 200, 0, 0, 978, 986, 5, 201, 0, 0, 979, 986, 5, 88, 0, 0, 980, 986, 5, 267, 0, 0, 981, 986, 5, 265, 0, 0, 982, 986, 5, 266, 0, 0, 983, 986, 5, 91, 0, 0, 984, 986, 5, 273, 0, 0, 985, 926, 1, 0, 0, 0, 985, 927, 1, 0, 0, 0, 985, 928, 1, 0, 0, 0, 985, 929, 1, 0, 0, 0, 985, 930, 1, 0, 0, 0, 985, 931, 1, 0, 0, 0, 985, 932, 1, 0, 0, 0, 985, 933, 1, 0, 0, 0, 985, 934, 1, 0, 0, 0, 985, 935, 1, 0, 0, 0, 985, 936, 1, 0, 0, 0, 985, 937, 1, 0, 0, 0, 985, 938, 1, 0, 0, 0, 985, 939, 1, 0, 0, 0, 985, 940, 1, 0, 0, 0, 985, 941, 1, 0, 0, 0, 985, 942, 1, 0, 0, 0, 985, 943, 1, 0, 0, 0, 985, 944, 1, 0, 0, 0, 985, 945, 1, 0, 0, 0, 985, 946, 1, 0, 0, 0, 985, 947, 1, 0, 0, 0, 985, 948, 1, 0, 0, 0, 985, 949, 1, 0, 0, 0, 985, 950, 1, 0, 0, 0, 985, 951, 1, 0, 0, 0, 985, 952, 1, 0, 0, 0, 985, 953, 1, 0, 0, 0, 985, 954, 1, 0, 0, 0, 985, 955, 1, 0, 0, 0, 985, 956, 1, 0, 0, 0, 985, 957, 1, 0, 0, 0, 985, 958, 1, 0, 0, 0, 985, 959, 1, 0, 0, 0, 985, 960, 1, 0, 0, 0, 985, 961, 1, 0, 0, 0, 985, 962, 1, 0, 0, 0, 985, 963, 1, 0, 0, 0, 985, 964, 1, 0, 0, 0, 985, 965, 1, 0, 0, 0, 985, 966, 1, 0, 0, 0, 985, 967, 1, 0, 0, 0, 985, 968, 1, 0, 0, 0, 985, 969, 1, 0, 0, 0, 985, 970, 1, 0, 0, 0, 985, 971, 1, 0, 0, 0, 985, 972, 1, 0, 0, 0, 985, 973, 1, 0, 0, 0, 985, 974, 1, 0, 0, 0, 985, 975, 1, 0, 0, 0, 985, 976, 1, 0, 0, 0, 985, 977, 1, 0, 0, 0, 985, 978, 1, 0, 0, 0, 985, 979, 1, 0, 0, 0, 985, 980, 1, 0, 0, 0, 985, 981, 1, 0, 0, 0, 985, 982, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 985, 984, 1, 0, 0, 0, 986, 163, 1, 0, 0, 0, 987, 988, 7, 23, 0, 0, 988, 165, 1, 0, 0, 0, 989, 990, 7, 24, 0, 0, 990, 167, 1, 0, 0, 0, 991, 992, 5, 252, 0, 0, 992, 169, 1, 0, 0, 0, 993, 994, 5, 264, 0, 0, 994, 171, 1, 0, 0, 0, 995, 996, 5, 246, 0, 0, 996, 173, 1, 0, 0, 0, 997, 998, 7, 25, 0, 0, 998, 175, 1, 0, 0, 0, 999, 1000, 7, 26, 0, 0, 1000, 177, 1, 0, 0, 0, 1001, 1002, 7, 27, 0, 0, 1002, 179, 1, 0, 0, 0, 1003, 1004, 7, 28, 0, 0, 1004, 181, 1, 0, 0, 0, 1005, 1006, 7, 29, 0, 0, 1006, 183, 1, 0, 0, 0, 1007, 1012, 3, 186, 93, 0, 1008, 1009, 5, 332, 0, 0, 1009, 1011, 3, 186, 93, 0, 1010, 1008, 1, 0, 0, 0, 1011, 1014, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1016, 1, 0, 0, 0, 1014, 1012, 1, 0, 0, 0, 1015, 1007, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 185, 1, 0, 0, 0, 1017, 1018, 3, 90, 45, 0, 1018, 187, 1, 0, 0, 0, 1019, 1020, 3, 192, 96, 0, 1020, 1021, 5, 319, 0, 0, 1021, 1022, 3, 204, 102, 0, 1022, 1028, 1, 0, 0, 0, 1023, 1024, 3, 66, 33, 0, 1024, 1025, 5, 319, 0, 0, 1025, 1026, 3, 204, 102, 0, 1026, 1028, 1, 0, 0, 0, 1027, 1019, 1, 0, 0, 0, 1027, 1023, 1, 0, 0, 0, 1028, 189, 1, 0, 0, 0, 1029, 1030, 3, 194, 97, 0, 1030, 1031, 5, 319, 0, 0, 1031, 1032, 3, 206, 103, 0, 1032, 191, 1, 0, 0, 0, 1033, 1034, 7, 30, 0, 0, 1034, 193, 1, 0, 0, 0, 1035, 1036, 7, 31, 0, 0, 1036, 195, 1, 0, 0, 0, 1037, 1046, 3, 200, 100, 0, 1038, 1039, 3, 200, 100, 0, 1039, 1040, 3, 198, 99, 0, 1040, 1046, 1, 0, 0, 0, 1041, 1042, 3, 200, 100, 0, 1042, 1043, 5, 326, 0, 0, 1043, 1044, 3, 198, 99, 0, 1044, 1046, 1, 0, 0, 0, 1045, 1037, 1, 0, 0, 0, 1045, 1038, 1, 0, 0, 0, 1045, 1041, 1, 0, 0, 0, 1046, 197, 1, 0, 0, 0, 1047, 1048, 3, 64, 32, 0, 1048, 199, 1, 0, 0, 0, 1049, 1052, 3, 222, 111, 0, 1050, 1052, 3, 66, 33, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 201, 1, 0, 0, 0, 1053, 1054, 3, 204, 102, 0, 1054, 203, 1, 0, 0, 0, 1055, 1058, 3, 222, 111, 0, 1056, 1058, 3, 60, 30, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 205, 1, 0, 0, 0, 1059, 1060, 3, 66, 33, 0, 1060, 207, 1, 0, 0, 0, 1061, 1065, 5, 285, 0, 0, 1062, 1065, 5, 252, 0, 0, 1063, 1065, 3, 66, 33, 0, 1064, 1061, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1063, 1, 0, 0, 0, 1065, 209, 1, 0, 0, 0, 1066, 1067, 3, 208, 104, 0, 1067, 1068, 5, 319, 0, 0, 1068, 1069, 3, 204, 102, 0, 1069, 211, 1, 0, 0, 0, 1070, 1071, 3, 208, 104, 0, 1071, 1072, 5, 319, 0, 0, 1072, 1073, 3, 204, 102, 0, 1073, 1081, 1, 0, 0, 0, 1074, 1075, 3, 208, 104, 0, 1075, 1076, 5, 319, 0, 0, 1076, 1077, 5, 330, 0, 0, 1077, 1078, 3, 204, 102, 0, 1078, 1079, 5, 331, 0, 0, 1079, 1081, 1, 0, 0, 0, 1080, 1070, 1, 0, 0, 0, 1080, 1074, 1, 0, 0, 0, 1081, 213, 1, 0, 0, 0, 1082, 1083, 3, 222, 111, 0, 1083, 215, 1, 0, 0, 0, 1084, 1085, 3, 222, 111, 0, 1085, 217, 1, 0, 0, 0, 1086, 1087, 3, 222, 111, 0, 1087, 1088, 5, 327, 0, 0, 1088, 1089, 5, 312, 0, 0, 1089, 219, 1, 0, 0, 0, 1090, 1091, 3, 224, 112, 0, 1091, 221, 1, 0, 0, 0, 1092, 1097, 3, 224, 112, 0, 1093, 1094, 5, 327, 0, 0, 1094, 1096, 3, 224, 112, 0, 1095, 1093, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 223, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1102, 5, 327, 0, 0, 1101, 1100, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1108, 5, 349, 0, 0, 1104, 1108, 5, 351, 0, 0, 1105, 1108, 3, 226, 113, 0, 1106, 1108, 3, 126, 63, 0, 1107, 1101, 1, 0, 0, 0, 1107, 1104, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1106, 1, 0, 0, 0, 1108, 225, 1, 0, 0, 0, 1109, 1110, 7, 32, 0, 0, 1110, 227, 1, 0, 0, 0, 91, 229, 232, 238, 246, 256, 267, 272, 276, 279, 283, 291, 297, 302, 305, 310, 313, 316, 319, 323, 326, 332, 336, 350, 365, 370, 374, 380, 388, 396, 400, 405, 408, 419, 424, 428, 435, 441, 456, 465, 474, 483, 497, 505, 507, 519, 528, 540, 547, 549, 557, 568, 576, 578, 592, 595, 614, 625, 660, 669, 694, 701, 705, 713, 717, 728, 735, 742, 753, 767, 780, 790, 804, 809, 820, 834, 849, 872, 881, 920, 985, 1012, 1015, 1027, 1045, 1051, 1057, 1064, 1080, 1097, 1101, 1107] \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.java b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.java new file mode 100644 index 00000000000..cbb96dc5db1 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.java @@ -0,0 +1,11122 @@ +// Generated from /home/ubuntu/ws/OpenSearch-Dashboards/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 by ANTLR 4.13.1 +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class OpenSearchSQLParser extends Parser { + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + SPACE=1, SPEC_SQL_COMMENT=2, COMMENT_INPUT=3, LINE_COMMENT=4, ALL=5, AND=6, + AS=7, ASC=8, BOOLEAN=9, BETWEEN=10, BY=11, CASE=12, CAST=13, CROSS=14, + COLUMNS=15, DATETIME=16, DELETE=17, DESC=18, DESCRIBE=19, DISTINCT=20, + DOUBLE=21, ELSE=22, EXISTS=23, FALSE=24, FLOAT=25, FIRST=26, FROM=27, + GROUP=28, HAVING=29, IN=30, INNER=31, INT=32, INTEGER=33, IS=34, JOIN=35, + LAST=36, LEFT=37, LIKE=38, LIMIT=39, LONG=40, MATCH=41, NATURAL=42, MISSING_LITERAL=43, + NOT=44, NULL_LITERAL=45, NULLS=46, ON=47, OR=48, ORDER=49, OUTER=50, OVER=51, + PARTITION=52, REGEXP=53, RIGHT=54, SELECT=55, SHOW=56, STRING=57, THEN=58, + TRUE=59, UNION=60, USING=61, WHEN=62, WHERE=63, EXCEPT=64, AVG=65, COUNT=66, + MAX=67, MIN=68, SUM=69, VAR_POP=70, VAR_SAMP=71, VARIANCE=72, STD=73, + STDDEV=74, STDDEV_POP=75, STDDEV_SAMP=76, SUBSTRING=77, TRIM=78, END=79, + FULL=80, OFFSET=81, INTERVAL=82, MICROSECOND=83, SECOND=84, MINUTE=85, + HOUR=86, DAY=87, WEEK=88, MONTH=89, QUARTER=90, YEAR=91, SECOND_MICROSECOND=92, + MINUTE_MICROSECOND=93, MINUTE_SECOND=94, HOUR_MICROSECOND=95, HOUR_SECOND=96, + HOUR_MINUTE=97, DAY_MICROSECOND=98, DAY_SECOND=99, DAY_MINUTE=100, DAY_HOUR=101, + YEAR_MONTH=102, TABLES=103, ABS=104, ACOS=105, ADD=106, ADDTIME=107, ASCII=108, + ASIN=109, ATAN=110, ATAN2=111, CBRT=112, CEIL=113, CEILING=114, CONCAT=115, + CONCAT_WS=116, CONV=117, CONVERT_TZ=118, COS=119, COSH=120, COT=121, CRC32=122, + CURDATE=123, CURTIME=124, CURRENT_DATE=125, CURRENT_TIME=126, CURRENT_TIMESTAMP=127, + DATE=128, DATE_ADD=129, DATE_FORMAT=130, DATE_SUB=131, DATEDIFF=132, DAYNAME=133, + DAYOFMONTH=134, DAYOFWEEK=135, DAYOFYEAR=136, DEGREES=137, DIVIDE=138, + E=139, EXP=140, EXPM1=141, EXTRACT=142, FLOOR=143, FROM_DAYS=144, FROM_UNIXTIME=145, + GET_FORMAT=146, IF=147, IFNULL=148, ISNULL=149, LAST_DAY=150, LENGTH=151, + LN=152, LOCALTIME=153, LOCALTIMESTAMP=154, LOCATE=155, LOG=156, LOG10=157, + LOG2=158, LOWER=159, LTRIM=160, MAKEDATE=161, MAKETIME=162, MODULUS=163, + MONTHNAME=164, MULTIPLY=165, NOW=166, NULLIF=167, PERIOD_ADD=168, PERIOD_DIFF=169, + PI=170, POSITION=171, POW=172, POWER=173, RADIANS=174, RAND=175, REPLACE=176, + RINT=177, ROUND=178, RTRIM=179, REVERSE=180, SEC_TO_TIME=181, SIGN=182, + SIGNUM=183, SIN=184, SINH=185, SQRT=186, STR_TO_DATE=187, SUBDATE=188, + SUBTIME=189, SUBTRACT=190, SYSDATE=191, TAN=192, TIME=193, TIMEDIFF=194, + TIME_FORMAT=195, TIME_TO_SEC=196, TIMESTAMP=197, TRUNCATE=198, TO_DAYS=199, + TO_SECONDS=200, UNIX_TIMESTAMP=201, UPPER=202, UTC_DATE=203, UTC_TIME=204, + UTC_TIMESTAMP=205, D=206, T=207, TS=208, LEFT_BRACE=209, RIGHT_BRACE=210, + DENSE_RANK=211, RANK=212, ROW_NUMBER=213, DATE_HISTOGRAM=214, DAY_OF_MONTH=215, + DAY_OF_YEAR=216, DAY_OF_WEEK=217, EXCLUDE=218, EXTENDED_STATS=219, FIELD=220, + FILTER=221, GEO_BOUNDING_BOX=222, GEO_CELL=223, GEO_DISTANCE=224, GEO_DISTANCE_RANGE=225, + GEO_INTERSECTS=226, GEO_POLYGON=227, HISTOGRAM=228, HOUR_OF_DAY=229, INCLUDE=230, + IN_TERMS=231, MATCHPHRASE=232, MATCH_PHRASE=233, MATCHPHRASEQUERY=234, + SIMPLE_QUERY_STRING=235, QUERY_STRING=236, MATCH_PHRASE_PREFIX=237, MATCHQUERY=238, + MATCH_QUERY=239, MINUTE_OF_DAY=240, MINUTE_OF_HOUR=241, MONTH_OF_YEAR=242, + MULTIMATCH=243, MULTI_MATCH=244, MULTIMATCHQUERY=245, NESTED=246, PERCENTILES=247, + PERCENTILE=248, PERCENTILE_APPROX=249, REGEXP_QUERY=250, REVERSE_NESTED=251, + QUERY=252, RANGE=253, SCORE=254, SCOREQUERY=255, SCORE_QUERY=256, SECOND_OF_MINUTE=257, + STATS=258, TERM=259, TERMS=260, TIMESTAMPADD=261, TIMESTAMPDIFF=262, TOPHITS=263, + TYPEOF=264, WEEK_OF_YEAR=265, WEEKOFYEAR=266, WEEKDAY=267, WILDCARDQUERY=268, + WILDCARD_QUERY=269, SUBSTR=270, STRCMP=271, ADDDATE=272, YEARWEEK=273, + ALLOW_LEADING_WILDCARD=274, ANALYZER=275, ANALYZE_WILDCARD=276, AUTO_GENERATE_SYNONYMS_PHRASE_QUERY=277, + BOOST=278, CASE_INSENSITIVE=279, CUTOFF_FREQUENCY=280, DEFAULT_FIELD=281, + DEFAULT_OPERATOR=282, ESCAPE=283, ENABLE_POSITION_INCREMENTS=284, FIELDS=285, + FLAGS=286, FUZZINESS=287, FUZZY_MAX_EXPANSIONS=288, FUZZY_PREFIX_LENGTH=289, + FUZZY_REWRITE=290, FUZZY_TRANSPOSITIONS=291, LENIENT=292, LOW_FREQ_OPERATOR=293, + MAX_DETERMINIZED_STATES=294, MAX_EXPANSIONS=295, MINIMUM_SHOULD_MATCH=296, + OPERATOR=297, PHRASE_SLOP=298, PREFIX_LENGTH=299, QUOTE_ANALYZER=300, + QUOTE_FIELD_SUFFIX=301, REWRITE=302, SLOP=303, TIE_BREAKER=304, TIME_ZONE=305, + TYPE=306, ZERO_TERMS_QUERY=307, HIGHLIGHT=308, HIGHLIGHT_PRE_TAGS=309, + HIGHLIGHT_POST_TAGS=310, MATCH_BOOL_PREFIX=311, STAR=312, SLASH=313, MODULE=314, + PLUS=315, MINUS=316, DIV=317, MOD=318, EQUAL_SYMBOL=319, GREATER_SYMBOL=320, + LESS_SYMBOL=321, EXCLAMATION_SYMBOL=322, BIT_NOT_OP=323, BIT_OR_OP=324, + BIT_AND_OP=325, BIT_XOR_OP=326, DOT=327, LR_BRACKET=328, RR_BRACKET=329, + LT_SQR_PRTHS=330, RT_SQR_PRTHS=331, COMMA=332, SEMI=333, AT_SIGN=334, + ZERO_DECIMAL=335, ONE_DECIMAL=336, TWO_DECIMAL=337, SINGLE_QUOTE_SYMB=338, + DOUBLE_QUOTE_SYMB=339, REVERSE_QUOTE_SYMB=340, COLON_SYMB=341, START_NATIONAL_STRING_LITERAL=342, + STRING_LITERAL=343, DECIMAL_LITERAL=344, HEXADECIMAL_LITERAL=345, REAL_LITERAL=346, + NULL_SPEC_LITERAL=347, BIT_STRING=348, ID=349, DOUBLE_QUOTE_ID=350, BACKTICK_QUOTE_ID=351, + ERROR_RECOGNITION=352; + public static final int + RULE_root = 0, RULE_sqlStatement = 1, RULE_dmlStatement = 2, RULE_selectStatement = 3, + RULE_adminStatement = 4, RULE_showStatement = 5, RULE_describeStatement = 6, + RULE_columnFilter = 7, RULE_tableFilter = 8, RULE_showDescribePattern = 9, + RULE_compatibleID = 10, RULE_querySpecification = 11, RULE_selectClause = 12, + RULE_selectSpec = 13, RULE_selectElements = 14, RULE_selectElement = 15, + RULE_fromClause = 16, RULE_relation = 17, RULE_whereClause = 18, RULE_groupByClause = 19, + RULE_groupByElements = 20, RULE_groupByElement = 21, RULE_havingClause = 22, + RULE_orderByClause = 23, RULE_orderByElement = 24, RULE_limitClause = 25, + RULE_windowFunctionClause = 26, RULE_windowFunction = 27, RULE_overClause = 28, + RULE_partitionByClause = 29, RULE_constant = 30, RULE_decimalLiteral = 31, + RULE_numericLiteral = 32, RULE_stringLiteral = 33, RULE_booleanLiteral = 34, + RULE_realLiteral = 35, RULE_sign = 36, RULE_nullLiteral = 37, RULE_datetimeLiteral = 38, + RULE_dateLiteral = 39, RULE_timeLiteral = 40, RULE_timestampLiteral = 41, + RULE_datetimeConstantLiteral = 42, RULE_intervalLiteral = 43, RULE_intervalUnit = 44, + RULE_expression = 45, RULE_predicate = 46, RULE_expressions = 47, RULE_expressionAtom = 48, + RULE_comparisonOperator = 49, RULE_nullNotnull = 50, RULE_functionCall = 51, + RULE_timestampFunction = 52, RULE_timestampFunctionName = 53, RULE_getFormatFunction = 54, + RULE_getFormatType = 55, RULE_extractFunction = 56, RULE_simpleDateTimePart = 57, + RULE_complexDateTimePart = 58, RULE_datetimePart = 59, RULE_highlightFunction = 60, + RULE_positionFunction = 61, RULE_matchQueryAltSyntaxFunction = 62, RULE_scalarFunctionName = 63, + RULE_specificFunction = 64, RULE_relevanceFunction = 65, RULE_scoreRelevanceFunction = 66, + RULE_noFieldRelevanceFunction = 67, RULE_singleFieldRelevanceFunction = 68, + RULE_multiFieldRelevanceFunction = 69, RULE_altSingleFieldRelevanceFunction = 70, + RULE_altMultiFieldRelevanceFunction = 71, RULE_convertedDataType = 72, + RULE_caseFuncAlternative = 73, RULE_aggregateFunction = 74, RULE_percentileApproxFunction = 75, + RULE_filterClause = 76, RULE_aggregationFunctionName = 77, RULE_mathematicalFunctionName = 78, + RULE_trigonometricFunctionName = 79, RULE_arithmeticFunctionName = 80, + RULE_dateTimeFunctionName = 81, RULE_textFunctionName = 82, RULE_flowControlFunctionName = 83, + RULE_noFieldRelevanceFunctionName = 84, RULE_systemFunctionName = 85, + RULE_nestedFunctionName = 86, RULE_scoreRelevanceFunctionName = 87, RULE_singleFieldRelevanceFunctionName = 88, + RULE_multiFieldRelevanceFunctionName = 89, RULE_altSingleFieldRelevanceFunctionName = 90, + RULE_altMultiFieldRelevanceFunctionName = 91, RULE_functionArgs = 92, + RULE_functionArg = 93, RULE_relevanceArg = 94, RULE_highlightArg = 95, + RULE_relevanceArgName = 96, RULE_highlightArgName = 97, RULE_relevanceFieldAndWeight = 98, + RULE_relevanceFieldWeight = 99, RULE_relevanceField = 100, RULE_relevanceQuery = 101, + RULE_relevanceArgValue = 102, RULE_highlightArgValue = 103, RULE_alternateMultiMatchArgName = 104, + RULE_alternateMultiMatchQuery = 105, RULE_alternateMultiMatchField = 106, + RULE_tableName = 107, RULE_columnName = 108, RULE_allTupleFields = 109, + RULE_alias = 110, RULE_qualifiedName = 111, RULE_ident = 112, RULE_keywordsCanBeId = 113; + private static String[] makeRuleNames() { + return new String[] { + "root", "sqlStatement", "dmlStatement", "selectStatement", "adminStatement", + "showStatement", "describeStatement", "columnFilter", "tableFilter", + "showDescribePattern", "compatibleID", "querySpecification", "selectClause", + "selectSpec", "selectElements", "selectElement", "fromClause", "relation", + "whereClause", "groupByClause", "groupByElements", "groupByElement", + "havingClause", "orderByClause", "orderByElement", "limitClause", "windowFunctionClause", + "windowFunction", "overClause", "partitionByClause", "constant", "decimalLiteral", + "numericLiteral", "stringLiteral", "booleanLiteral", "realLiteral", "sign", + "nullLiteral", "datetimeLiteral", "dateLiteral", "timeLiteral", "timestampLiteral", + "datetimeConstantLiteral", "intervalLiteral", "intervalUnit", "expression", + "predicate", "expressions", "expressionAtom", "comparisonOperator", "nullNotnull", + "functionCall", "timestampFunction", "timestampFunctionName", "getFormatFunction", + "getFormatType", "extractFunction", "simpleDateTimePart", "complexDateTimePart", + "datetimePart", "highlightFunction", "positionFunction", "matchQueryAltSyntaxFunction", + "scalarFunctionName", "specificFunction", "relevanceFunction", "scoreRelevanceFunction", + "noFieldRelevanceFunction", "singleFieldRelevanceFunction", "multiFieldRelevanceFunction", + "altSingleFieldRelevanceFunction", "altMultiFieldRelevanceFunction", + "convertedDataType", "caseFuncAlternative", "aggregateFunction", "percentileApproxFunction", + "filterClause", "aggregationFunctionName", "mathematicalFunctionName", + "trigonometricFunctionName", "arithmeticFunctionName", "dateTimeFunctionName", + "textFunctionName", "flowControlFunctionName", "noFieldRelevanceFunctionName", + "systemFunctionName", "nestedFunctionName", "scoreRelevanceFunctionName", + "singleFieldRelevanceFunctionName", "multiFieldRelevanceFunctionName", + "altSingleFieldRelevanceFunctionName", "altMultiFieldRelevanceFunctionName", + "functionArgs", "functionArg", "relevanceArg", "highlightArg", "relevanceArgName", + "highlightArgName", "relevanceFieldAndWeight", "relevanceFieldWeight", + "relevanceField", "relevanceQuery", "relevanceArgValue", "highlightArgValue", + "alternateMultiMatchArgName", "alternateMultiMatchQuery", "alternateMultiMatchField", + "tableName", "columnName", "allTupleFields", "alias", "qualifiedName", + "ident", "keywordsCanBeId" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, "'ALL'", "'AND'", "'AS'", "'ASC'", "'BOOLEAN'", + "'BETWEEN'", "'BY'", "'CASE'", "'CAST'", "'CROSS'", "'COLUMNS'", "'DATETIME'", + "'DELETE'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'DOUBLE'", "'ELSE'", + "'EXISTS'", "'FALSE'", "'FLOAT'", "'FIRST'", "'FROM'", "'GROUP'", "'HAVING'", + "'IN'", "'INNER'", "'INT'", "'INTEGER'", "'IS'", "'JOIN'", "'LAST'", + "'LEFT'", "'LIKE'", "'LIMIT'", "'LONG'", "'MATCH'", "'NATURAL'", "'MISSING'", + "'NOT'", "'NULL'", "'NULLS'", "'ON'", "'OR'", "'ORDER'", "'OUTER'", "'OVER'", + "'PARTITION'", "'REGEXP'", "'RIGHT'", "'SELECT'", "'SHOW'", "'STRING'", + "'THEN'", "'TRUE'", "'UNION'", "'USING'", "'WHEN'", "'WHERE'", "'MINUS'", + "'AVG'", "'COUNT'", "'MAX'", "'MIN'", "'SUM'", "'VAR_POP'", "'VAR_SAMP'", + "'VARIANCE'", "'STD'", "'STDDEV'", "'STDDEV_POP'", "'STDDEV_SAMP'", "'SUBSTRING'", + "'TRIM'", "'END'", "'FULL'", "'OFFSET'", "'INTERVAL'", "'MICROSECOND'", + "'SECOND'", "'MINUTE'", "'HOUR'", "'DAY'", "'WEEK'", "'MONTH'", "'QUARTER'", + "'YEAR'", "'SECOND_MICROSECOND'", "'MINUTE_MICROSECOND'", "'MINUTE_SECOND'", + "'HOUR_MICROSECOND'", "'HOUR_SECOND'", "'HOUR_MINUTE'", "'DAY_MICROSECOND'", + "'DAY_SECOND'", "'DAY_MINUTE'", "'DAY_HOUR'", "'YEAR_MONTH'", "'TABLES'", + "'ABS'", "'ACOS'", "'ADD'", "'ADDTIME'", "'ASCII'", "'ASIN'", "'ATAN'", + "'ATAN2'", "'CBRT'", "'CEIL'", "'CEILING'", "'CONCAT'", "'CONCAT_WS'", + "'CONV'", "'CONVERT_TZ'", "'COS'", "'COSH'", "'COT'", "'CRC32'", "'CURDATE'", + "'CURTIME'", "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", + "'DATE'", "'DATE_ADD'", "'DATE_FORMAT'", "'DATE_SUB'", "'DATEDIFF'", + "'DAYNAME'", "'DAYOFMONTH'", "'DAYOFWEEK'", "'DAYOFYEAR'", "'DEGREES'", + "'DIVIDE'", "'E'", "'EXP'", "'EXPM1'", "'EXTRACT'", "'FLOOR'", "'FROM_DAYS'", + "'FROM_UNIXTIME'", "'GET_FORMAT'", "'IF'", "'IFNULL'", "'ISNULL'", "'LAST_DAY'", + "'LENGTH'", "'LN'", "'LOCALTIME'", "'LOCALTIMESTAMP'", "'LOCATE'", "'LOG'", + "'LOG10'", "'LOG2'", "'LOWER'", "'LTRIM'", "'MAKEDATE'", "'MAKETIME'", + "'MODULUS'", "'MONTHNAME'", "'MULTIPLY'", "'NOW'", "'NULLIF'", "'PERIOD_ADD'", + "'PERIOD_DIFF'", "'PI'", "'POSITION'", "'POW'", "'POWER'", "'RADIANS'", + "'RAND'", "'REPLACE'", "'RINT'", "'ROUND'", "'RTRIM'", "'REVERSE'", "'SEC_TO_TIME'", + "'SIGN'", "'SIGNUM'", "'SIN'", "'SINH'", "'SQRT'", "'STR_TO_DATE'", "'SUBDATE'", + "'SUBTIME'", "'SUBTRACT'", "'SYSDATE'", "'TAN'", "'TIME'", "'TIMEDIFF'", + "'TIME_FORMAT'", "'TIME_TO_SEC'", "'TIMESTAMP'", "'TRUNCATE'", "'TO_DAYS'", + "'TO_SECONDS'", "'UNIX_TIMESTAMP'", "'UPPER'", "'UTC_DATE'", "'UTC_TIME'", + "'UTC_TIMESTAMP'", "'D'", "'T'", "'TS'", "'{'", "'}'", "'DENSE_RANK'", + "'RANK'", "'ROW_NUMBER'", "'DATE_HISTOGRAM'", "'DAY_OF_MONTH'", "'DAY_OF_YEAR'", + "'DAY_OF_WEEK'", "'EXCLUDE'", "'EXTENDED_STATS'", "'FIELD'", "'FILTER'", + "'GEO_BOUNDING_BOX'", "'GEO_CELL'", "'GEO_DISTANCE'", "'GEO_DISTANCE_RANGE'", + "'GEO_INTERSECTS'", "'GEO_POLYGON'", "'HISTOGRAM'", "'HOUR_OF_DAY'", + "'INCLUDE'", "'IN_TERMS'", "'MATCHPHRASE'", "'MATCH_PHRASE'", "'MATCHPHRASEQUERY'", + "'SIMPLE_QUERY_STRING'", "'QUERY_STRING'", "'MATCH_PHRASE_PREFIX'", "'MATCHQUERY'", + "'MATCH_QUERY'", "'MINUTE_OF_DAY'", "'MINUTE_OF_HOUR'", "'MONTH_OF_YEAR'", + "'MULTIMATCH'", "'MULTI_MATCH'", "'MULTIMATCHQUERY'", "'NESTED'", "'PERCENTILES'", + "'PERCENTILE'", "'PERCENTILE_APPROX'", "'REGEXP_QUERY'", "'REVERSE_NESTED'", + "'QUERY'", "'RANGE'", "'SCORE'", "'SCOREQUERY'", "'SCORE_QUERY'", "'SECOND_OF_MINUTE'", + "'STATS'", "'TERM'", "'TERMS'", "'TIMESTAMPADD'", "'TIMESTAMPDIFF'", + "'TOPHITS'", "'TYPEOF'", "'WEEK_OF_YEAR'", "'WEEKOFYEAR'", "'WEEKDAY'", + "'WILDCARDQUERY'", "'WILDCARD_QUERY'", "'SUBSTR'", "'STRCMP'", "'ADDDATE'", + "'YEARWEEK'", "'ALLOW_LEADING_WILDCARD'", "'ANALYZER'", "'ANALYZE_WILDCARD'", + "'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'", "'BOOST'", "'CASE_INSENSITIVE'", + "'CUTOFF_FREQUENCY'", "'DEFAULT_FIELD'", "'DEFAULT_OPERATOR'", "'ESCAPE'", + "'ENABLE_POSITION_INCREMENTS'", "'FIELDS'", "'FLAGS'", "'FUZZINESS'", + "'FUZZY_MAX_EXPANSIONS'", "'FUZZY_PREFIX_LENGTH'", "'FUZZY_REWRITE'", + "'FUZZY_TRANSPOSITIONS'", "'LENIENT'", "'LOW_FREQ_OPERATOR'", "'MAX_DETERMINIZED_STATES'", + "'MAX_EXPANSIONS'", "'MINIMUM_SHOULD_MATCH'", "'OPERATOR'", "'PHRASE_SLOP'", + "'PREFIX_LENGTH'", "'QUOTE_ANALYZER'", "'QUOTE_FIELD_SUFFIX'", "'REWRITE'", + "'SLOP'", "'TIE_BREAKER'", "'TIME_ZONE'", "'TYPE'", "'ZERO_TERMS_QUERY'", + "'HIGHLIGHT'", "'PRE_TAGS'", "'POST_TAGS'", "'MATCH_BOOL_PREFIX'", "'*'", + "'/'", "'%'", "'+'", "'-'", "'DIV'", "'MOD'", "'='", "'>'", "'<'", "'!'", + "'~'", "'|'", "'&'", "'^'", "'.'", "'('", "')'", "'['", "']'", "','", + "';'", "'@'", "'0'", "'1'", "'2'", "'''", "'\"'", "'`'", "':'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "SPACE", "SPEC_SQL_COMMENT", "COMMENT_INPUT", "LINE_COMMENT", "ALL", + "AND", "AS", "ASC", "BOOLEAN", "BETWEEN", "BY", "CASE", "CAST", "CROSS", + "COLUMNS", "DATETIME", "DELETE", "DESC", "DESCRIBE", "DISTINCT", "DOUBLE", + "ELSE", "EXISTS", "FALSE", "FLOAT", "FIRST", "FROM", "GROUP", "HAVING", + "IN", "INNER", "INT", "INTEGER", "IS", "JOIN", "LAST", "LEFT", "LIKE", + "LIMIT", "LONG", "MATCH", "NATURAL", "MISSING_LITERAL", "NOT", "NULL_LITERAL", + "NULLS", "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "REGEXP", + "RIGHT", "SELECT", "SHOW", "STRING", "THEN", "TRUE", "UNION", "USING", + "WHEN", "WHERE", "EXCEPT", "AVG", "COUNT", "MAX", "MIN", "SUM", "VAR_POP", + "VAR_SAMP", "VARIANCE", "STD", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", + "SUBSTRING", "TRIM", "END", "FULL", "OFFSET", "INTERVAL", "MICROSECOND", + "SECOND", "MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "QUARTER", "YEAR", + "SECOND_MICROSECOND", "MINUTE_MICROSECOND", "MINUTE_SECOND", "HOUR_MICROSECOND", + "HOUR_SECOND", "HOUR_MINUTE", "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", + "DAY_HOUR", "YEAR_MONTH", "TABLES", "ABS", "ACOS", "ADD", "ADDTIME", + "ASCII", "ASIN", "ATAN", "ATAN2", "CBRT", "CEIL", "CEILING", "CONCAT", + "CONCAT_WS", "CONV", "CONVERT_TZ", "COS", "COSH", "COT", "CRC32", "CURDATE", + "CURTIME", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATE", + "DATE_ADD", "DATE_FORMAT", "DATE_SUB", "DATEDIFF", "DAYNAME", "DAYOFMONTH", + "DAYOFWEEK", "DAYOFYEAR", "DEGREES", "DIVIDE", "E", "EXP", "EXPM1", "EXTRACT", + "FLOOR", "FROM_DAYS", "FROM_UNIXTIME", "GET_FORMAT", "IF", "IFNULL", + "ISNULL", "LAST_DAY", "LENGTH", "LN", "LOCALTIME", "LOCALTIMESTAMP", + "LOCATE", "LOG", "LOG10", "LOG2", "LOWER", "LTRIM", "MAKEDATE", "MAKETIME", + "MODULUS", "MONTHNAME", "MULTIPLY", "NOW", "NULLIF", "PERIOD_ADD", "PERIOD_DIFF", + "PI", "POSITION", "POW", "POWER", "RADIANS", "RAND", "REPLACE", "RINT", + "ROUND", "RTRIM", "REVERSE", "SEC_TO_TIME", "SIGN", "SIGNUM", "SIN", + "SINH", "SQRT", "STR_TO_DATE", "SUBDATE", "SUBTIME", "SUBTRACT", "SYSDATE", + "TAN", "TIME", "TIMEDIFF", "TIME_FORMAT", "TIME_TO_SEC", "TIMESTAMP", + "TRUNCATE", "TO_DAYS", "TO_SECONDS", "UNIX_TIMESTAMP", "UPPER", "UTC_DATE", + "UTC_TIME", "UTC_TIMESTAMP", "D", "T", "TS", "LEFT_BRACE", "RIGHT_BRACE", + "DENSE_RANK", "RANK", "ROW_NUMBER", "DATE_HISTOGRAM", "DAY_OF_MONTH", + "DAY_OF_YEAR", "DAY_OF_WEEK", "EXCLUDE", "EXTENDED_STATS", "FIELD", "FILTER", + "GEO_BOUNDING_BOX", "GEO_CELL", "GEO_DISTANCE", "GEO_DISTANCE_RANGE", + "GEO_INTERSECTS", "GEO_POLYGON", "HISTOGRAM", "HOUR_OF_DAY", "INCLUDE", + "IN_TERMS", "MATCHPHRASE", "MATCH_PHRASE", "MATCHPHRASEQUERY", "SIMPLE_QUERY_STRING", + "QUERY_STRING", "MATCH_PHRASE_PREFIX", "MATCHQUERY", "MATCH_QUERY", "MINUTE_OF_DAY", + "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "MULTIMATCH", "MULTI_MATCH", "MULTIMATCHQUERY", + "NESTED", "PERCENTILES", "PERCENTILE", "PERCENTILE_APPROX", "REGEXP_QUERY", + "REVERSE_NESTED", "QUERY", "RANGE", "SCORE", "SCOREQUERY", "SCORE_QUERY", + "SECOND_OF_MINUTE", "STATS", "TERM", "TERMS", "TIMESTAMPADD", "TIMESTAMPDIFF", + "TOPHITS", "TYPEOF", "WEEK_OF_YEAR", "WEEKOFYEAR", "WEEKDAY", "WILDCARDQUERY", + "WILDCARD_QUERY", "SUBSTR", "STRCMP", "ADDDATE", "YEARWEEK", "ALLOW_LEADING_WILDCARD", + "ANALYZER", "ANALYZE_WILDCARD", "AUTO_GENERATE_SYNONYMS_PHRASE_QUERY", + "BOOST", "CASE_INSENSITIVE", "CUTOFF_FREQUENCY", "DEFAULT_FIELD", "DEFAULT_OPERATOR", + "ESCAPE", "ENABLE_POSITION_INCREMENTS", "FIELDS", "FLAGS", "FUZZINESS", + "FUZZY_MAX_EXPANSIONS", "FUZZY_PREFIX_LENGTH", "FUZZY_REWRITE", "FUZZY_TRANSPOSITIONS", + "LENIENT", "LOW_FREQ_OPERATOR", "MAX_DETERMINIZED_STATES", "MAX_EXPANSIONS", + "MINIMUM_SHOULD_MATCH", "OPERATOR", "PHRASE_SLOP", "PREFIX_LENGTH", "QUOTE_ANALYZER", + "QUOTE_FIELD_SUFFIX", "REWRITE", "SLOP", "TIE_BREAKER", "TIME_ZONE", + "TYPE", "ZERO_TERMS_QUERY", "HIGHLIGHT", "HIGHLIGHT_PRE_TAGS", "HIGHLIGHT_POST_TAGS", + "MATCH_BOOL_PREFIX", "STAR", "SLASH", "MODULE", "PLUS", "MINUS", "DIV", + "MOD", "EQUAL_SYMBOL", "GREATER_SYMBOL", "LESS_SYMBOL", "EXCLAMATION_SYMBOL", + "BIT_NOT_OP", "BIT_OR_OP", "BIT_AND_OP", "BIT_XOR_OP", "DOT", "LR_BRACKET", + "RR_BRACKET", "LT_SQR_PRTHS", "RT_SQR_PRTHS", "COMMA", "SEMI", "AT_SIGN", + "ZERO_DECIMAL", "ONE_DECIMAL", "TWO_DECIMAL", "SINGLE_QUOTE_SYMB", "DOUBLE_QUOTE_SYMB", + "REVERSE_QUOTE_SYMB", "COLON_SYMB", "START_NATIONAL_STRING_LITERAL", + "STRING_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "REAL_LITERAL", + "NULL_SPEC_LITERAL", "BIT_STRING", "ID", "DOUBLE_QUOTE_ID", "BACKTICK_QUOTE_ID", + "ERROR_RECOGNITION" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "OpenSearchSQLParser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public OpenSearchSQLParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class RootContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(OpenSearchSQLParser.EOF, 0); } + public SqlStatementContext sqlStatement() { + return getRuleContext(SqlStatementContext.class,0); + } + public TerminalNode SEMI() { return getToken(OpenSearchSQLParser.SEMI, 0); } + public RootContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_root; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRoot(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRoot(this); + } + } + + public final RootContext root() throws RecognitionException { + RootContext _localctx = new RootContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_root); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(229); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 108086391057416192L) != 0)) { + { + setState(228); + sqlStatement(); + } + } + + setState(232); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMI) { + { + setState(231); + match(SEMI); + } + } + + setState(234); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SqlStatementContext extends ParserRuleContext { + public DmlStatementContext dmlStatement() { + return getRuleContext(DmlStatementContext.class,0); + } + public AdminStatementContext adminStatement() { + return getRuleContext(AdminStatementContext.class,0); + } + public SqlStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sqlStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSqlStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSqlStatement(this); + } + } + + public final SqlStatementContext sqlStatement() throws RecognitionException { + SqlStatementContext _localctx = new SqlStatementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_sqlStatement); + try { + setState(238); + _errHandler.sync(this); + switch (_input.LA(1)) { + case SELECT: + enterOuterAlt(_localctx, 1); + { + setState(236); + dmlStatement(); + } + break; + case DESCRIBE: + case SHOW: + enterOuterAlt(_localctx, 2); + { + setState(237); + adminStatement(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DmlStatementContext extends ParserRuleContext { + public SelectStatementContext selectStatement() { + return getRuleContext(SelectStatementContext.class,0); + } + public DmlStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dmlStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDmlStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDmlStatement(this); + } + } + + public final DmlStatementContext dmlStatement() throws RecognitionException { + DmlStatementContext _localctx = new DmlStatementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_dmlStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(240); + selectStatement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SelectStatementContext extends ParserRuleContext { + public SelectStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selectStatement; } + + public SelectStatementContext() { } + public void copyFrom(SelectStatementContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class SimpleSelectContext extends SelectStatementContext { + public QuerySpecificationContext querySpecification() { + return getRuleContext(QuerySpecificationContext.class,0); + } + public SimpleSelectContext(SelectStatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSimpleSelect(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSimpleSelect(this); + } + } + + public final SelectStatementContext selectStatement() throws RecognitionException { + SelectStatementContext _localctx = new SelectStatementContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_selectStatement); + try { + _localctx = new SimpleSelectContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(242); + querySpecification(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AdminStatementContext extends ParserRuleContext { + public ShowStatementContext showStatement() { + return getRuleContext(ShowStatementContext.class,0); + } + public DescribeStatementContext describeStatement() { + return getRuleContext(DescribeStatementContext.class,0); + } + public AdminStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_adminStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAdminStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAdminStatement(this); + } + } + + public final AdminStatementContext adminStatement() throws RecognitionException { + AdminStatementContext _localctx = new AdminStatementContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_adminStatement); + try { + setState(246); + _errHandler.sync(this); + switch (_input.LA(1)) { + case SHOW: + enterOuterAlt(_localctx, 1); + { + setState(244); + showStatement(); + } + break; + case DESCRIBE: + enterOuterAlt(_localctx, 2); + { + setState(245); + describeStatement(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ShowStatementContext extends ParserRuleContext { + public TerminalNode SHOW() { return getToken(OpenSearchSQLParser.SHOW, 0); } + public TerminalNode TABLES() { return getToken(OpenSearchSQLParser.TABLES, 0); } + public TableFilterContext tableFilter() { + return getRuleContext(TableFilterContext.class,0); + } + public ShowStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_showStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterShowStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitShowStatement(this); + } + } + + public final ShowStatementContext showStatement() throws RecognitionException { + ShowStatementContext _localctx = new ShowStatementContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_showStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(248); + match(SHOW); + setState(249); + match(TABLES); + setState(250); + tableFilter(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DescribeStatementContext extends ParserRuleContext { + public TerminalNode DESCRIBE() { return getToken(OpenSearchSQLParser.DESCRIBE, 0); } + public TerminalNode TABLES() { return getToken(OpenSearchSQLParser.TABLES, 0); } + public TableFilterContext tableFilter() { + return getRuleContext(TableFilterContext.class,0); + } + public ColumnFilterContext columnFilter() { + return getRuleContext(ColumnFilterContext.class,0); + } + public DescribeStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_describeStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDescribeStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDescribeStatement(this); + } + } + + public final DescribeStatementContext describeStatement() throws RecognitionException { + DescribeStatementContext _localctx = new DescribeStatementContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_describeStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(252); + match(DESCRIBE); + setState(253); + match(TABLES); + setState(254); + tableFilter(); + setState(256); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLUMNS) { + { + setState(255); + columnFilter(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ColumnFilterContext extends ParserRuleContext { + public TerminalNode COLUMNS() { return getToken(OpenSearchSQLParser.COLUMNS, 0); } + public TerminalNode LIKE() { return getToken(OpenSearchSQLParser.LIKE, 0); } + public ShowDescribePatternContext showDescribePattern() { + return getRuleContext(ShowDescribePatternContext.class,0); + } + public ColumnFilterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_columnFilter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterColumnFilter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitColumnFilter(this); + } + } + + public final ColumnFilterContext columnFilter() throws RecognitionException { + ColumnFilterContext _localctx = new ColumnFilterContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_columnFilter); + try { + enterOuterAlt(_localctx, 1); + { + setState(258); + match(COLUMNS); + setState(259); + match(LIKE); + setState(260); + showDescribePattern(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TableFilterContext extends ParserRuleContext { + public TerminalNode LIKE() { return getToken(OpenSearchSQLParser.LIKE, 0); } + public ShowDescribePatternContext showDescribePattern() { + return getRuleContext(ShowDescribePatternContext.class,0); + } + public TableFilterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tableFilter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTableFilter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTableFilter(this); + } + } + + public final TableFilterContext tableFilter() throws RecognitionException { + TableFilterContext _localctx = new TableFilterContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_tableFilter); + try { + enterOuterAlt(_localctx, 1); + { + setState(262); + match(LIKE); + setState(263); + showDescribePattern(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ShowDescribePatternContext extends ParserRuleContext { + public CompatibleIDContext oldID; + public CompatibleIDContext compatibleID() { + return getRuleContext(CompatibleIDContext.class,0); + } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public ShowDescribePatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_showDescribePattern; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterShowDescribePattern(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitShowDescribePattern(this); + } + } + + public final ShowDescribePatternContext showDescribePattern() throws RecognitionException { + ShowDescribePatternContext _localctx = new ShowDescribePatternContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_showDescribePattern); + try { + setState(267); + _errHandler.sync(this); + switch (_input.LA(1)) { + case MODULE: + case ID: + enterOuterAlt(_localctx, 1); + { + setState(265); + ((ShowDescribePatternContext)_localctx).oldID = compatibleID(); + } + break; + case STRING_LITERAL: + case DOUBLE_QUOTE_ID: + enterOuterAlt(_localctx, 2); + { + setState(266); + stringLiteral(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CompatibleIDContext extends ParserRuleContext { + public List MODULE() { return getTokens(OpenSearchSQLParser.MODULE); } + public TerminalNode MODULE(int i) { + return getToken(OpenSearchSQLParser.MODULE, i); + } + public List ID() { return getTokens(OpenSearchSQLParser.ID); } + public TerminalNode ID(int i) { + return getToken(OpenSearchSQLParser.ID, i); + } + public CompatibleIDContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_compatibleID; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterCompatibleID(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitCompatibleID(this); + } + } + + public final CompatibleIDContext compatibleID() throws RecognitionException { + CompatibleIDContext _localctx = new CompatibleIDContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_compatibleID); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(270); + _errHandler.sync(this); + _alt = 1+1; + do { + switch (_alt) { + case 1+1: + { + { + setState(269); + _la = _input.LA(1); + if ( !(_la==MODULE || _la==ID) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(272); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,6,_ctx); + } while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QuerySpecificationContext extends ParserRuleContext { + public SelectClauseContext selectClause() { + return getRuleContext(SelectClauseContext.class,0); + } + public FromClauseContext fromClause() { + return getRuleContext(FromClauseContext.class,0); + } + public LimitClauseContext limitClause() { + return getRuleContext(LimitClauseContext.class,0); + } + public QuerySpecificationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_querySpecification; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterQuerySpecification(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitQuerySpecification(this); + } + } + + public final QuerySpecificationContext querySpecification() throws RecognitionException { + QuerySpecificationContext _localctx = new QuerySpecificationContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_querySpecification); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(274); + selectClause(); + setState(276); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FROM) { + { + setState(275); + fromClause(); + } + } + + setState(279); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LIMIT) { + { + setState(278); + limitClause(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SelectClauseContext extends ParserRuleContext { + public TerminalNode SELECT() { return getToken(OpenSearchSQLParser.SELECT, 0); } + public SelectElementsContext selectElements() { + return getRuleContext(SelectElementsContext.class,0); + } + public SelectSpecContext selectSpec() { + return getRuleContext(SelectSpecContext.class,0); + } + public SelectClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selectClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSelectClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSelectClause(this); + } + } + + public final SelectClauseContext selectClause() throws RecognitionException { + SelectClauseContext _localctx = new SelectClauseContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_selectClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(281); + match(SELECT); + setState(283); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ALL || _la==DISTINCT) { + { + setState(282); + selectSpec(); + } + } + + setState(285); + selectElements(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SelectSpecContext extends ParserRuleContext { + public TerminalNode ALL() { return getToken(OpenSearchSQLParser.ALL, 0); } + public TerminalNode DISTINCT() { return getToken(OpenSearchSQLParser.DISTINCT, 0); } + public SelectSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selectSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSelectSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSelectSpec(this); + } + } + + public final SelectSpecContext selectSpec() throws RecognitionException { + SelectSpecContext _localctx = new SelectSpecContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_selectSpec); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(287); + _la = _input.LA(1); + if ( !(_la==ALL || _la==DISTINCT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SelectElementsContext extends ParserRuleContext { + public Token star; + public List selectElement() { + return getRuleContexts(SelectElementContext.class); + } + public SelectElementContext selectElement(int i) { + return getRuleContext(SelectElementContext.class,i); + } + public TerminalNode STAR() { return getToken(OpenSearchSQLParser.STAR, 0); } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public SelectElementsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selectElements; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSelectElements(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSelectElements(this); + } + } + + public final SelectElementsContext selectElements() throws RecognitionException { + SelectElementsContext _localctx = new SelectElementsContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_selectElements); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(291); + _errHandler.sync(this); + switch (_input.LA(1)) { + case STAR: + { + setState(289); + ((SelectElementsContext)_localctx).star = match(STAR); + } + break; + case CASE: + case CAST: + case DATETIME: + case FALSE: + case FIRST: + case LAST: + case LEFT: + case MATCH: + case NOT: + case NULL_LITERAL: + case RIGHT: + case TRUE: + case AVG: + case COUNT: + case MAX: + case MIN: + case SUM: + case VAR_POP: + case VAR_SAMP: + case VARIANCE: + case STD: + case STDDEV: + case STDDEV_POP: + case STDDEV_SAMP: + case SUBSTRING: + case TRIM: + case FULL: + case INTERVAL: + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + case ABS: + case ACOS: + case ADD: + case ADDTIME: + case ASCII: + case ASIN: + case ATAN: + case ATAN2: + case CBRT: + case CEIL: + case CEILING: + case CONCAT: + case CONCAT_WS: + case CONV: + case CONVERT_TZ: + case COS: + case COSH: + case COT: + case CRC32: + case CURDATE: + case CURTIME: + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case DATE: + case DATE_ADD: + case DATE_FORMAT: + case DATE_SUB: + case DATEDIFF: + case DAYNAME: + case DAYOFMONTH: + case DAYOFWEEK: + case DAYOFYEAR: + case DEGREES: + case DIVIDE: + case E: + case EXP: + case EXPM1: + case EXTRACT: + case FLOOR: + case FROM_DAYS: + case FROM_UNIXTIME: + case GET_FORMAT: + case IF: + case IFNULL: + case ISNULL: + case LAST_DAY: + case LENGTH: + case LN: + case LOCALTIME: + case LOCALTIMESTAMP: + case LOCATE: + case LOG: + case LOG10: + case LOG2: + case LOWER: + case LTRIM: + case MAKEDATE: + case MAKETIME: + case MODULUS: + case MONTHNAME: + case MULTIPLY: + case NOW: + case NULLIF: + case PERIOD_ADD: + case PERIOD_DIFF: + case PI: + case POSITION: + case POW: + case POWER: + case RADIANS: + case RAND: + case REPLACE: + case RINT: + case ROUND: + case RTRIM: + case REVERSE: + case SEC_TO_TIME: + case SIGN: + case SIGNUM: + case SIN: + case SINH: + case SQRT: + case STR_TO_DATE: + case SUBDATE: + case SUBTIME: + case SUBTRACT: + case SYSDATE: + case TAN: + case TIME: + case TIMEDIFF: + case TIME_FORMAT: + case TIME_TO_SEC: + case TIMESTAMP: + case TRUNCATE: + case TO_DAYS: + case TO_SECONDS: + case UNIX_TIMESTAMP: + case UPPER: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + case D: + case T: + case TS: + case LEFT_BRACE: + case DENSE_RANK: + case RANK: + case ROW_NUMBER: + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + case FIELD: + case HOUR_OF_DAY: + case MATCHPHRASE: + case MATCH_PHRASE: + case MATCHPHRASEQUERY: + case SIMPLE_QUERY_STRING: + case QUERY_STRING: + case MATCH_PHRASE_PREFIX: + case MATCHQUERY: + case MATCH_QUERY: + case MINUTE_OF_DAY: + case MINUTE_OF_HOUR: + case MONTH_OF_YEAR: + case MULTIMATCH: + case MULTI_MATCH: + case MULTIMATCHQUERY: + case NESTED: + case PERCENTILE: + case PERCENTILE_APPROX: + case QUERY: + case SCORE: + case SCOREQUERY: + case SCORE_QUERY: + case SECOND_OF_MINUTE: + case TIMESTAMPADD: + case TIMESTAMPDIFF: + case TYPEOF: + case WEEK_OF_YEAR: + case WEEKOFYEAR: + case WEEKDAY: + case WILDCARDQUERY: + case WILDCARD_QUERY: + case SUBSTR: + case STRCMP: + case ADDDATE: + case YEARWEEK: + case TYPE: + case HIGHLIGHT: + case MATCH_BOOL_PREFIX: + case PLUS: + case MINUS: + case MOD: + case DOT: + case LR_BRACKET: + case ZERO_DECIMAL: + case ONE_DECIMAL: + case TWO_DECIMAL: + case STRING_LITERAL: + case DECIMAL_LITERAL: + case REAL_LITERAL: + case ID: + case DOUBLE_QUOTE_ID: + case BACKTICK_QUOTE_ID: + { + setState(290); + selectElement(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(297); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(293); + match(COMMA); + setState(294); + selectElement(); + } + } + setState(299); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SelectElementContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public AliasContext alias() { + return getRuleContext(AliasContext.class,0); + } + public TerminalNode AS() { return getToken(OpenSearchSQLParser.AS, 0); } + public SelectElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selectElement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSelectElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSelectElement(this); + } + } + + public final SelectElementContext selectElement() throws RecognitionException { + SelectElementContext _localctx = new SelectElementContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_selectElement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(300); + expression(0); + setState(305); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 18014604735086720L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & -549621813217L) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & -4398046650369L) != 0) || ((((_la - 193)) & ~0x3f) == 0 && ((1L << (_la - 193)) & 9992430556348415L) != 0) || ((((_la - 257)) & ~0x3f) == 0 && ((1L << (_la - 257)) & 2306405959167240065L) != 0) || ((((_la - 327)) & ~0x3f) == 0 && ((1L << (_la - 327)) & 20971521L) != 0)) { + { + setState(302); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(301); + match(AS); + } + } + + setState(304); + alias(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FromClauseContext extends ParserRuleContext { + public TerminalNode FROM() { return getToken(OpenSearchSQLParser.FROM, 0); } + public RelationContext relation() { + return getRuleContext(RelationContext.class,0); + } + public WhereClauseContext whereClause() { + return getRuleContext(WhereClauseContext.class,0); + } + public GroupByClauseContext groupByClause() { + return getRuleContext(GroupByClauseContext.class,0); + } + public HavingClauseContext havingClause() { + return getRuleContext(HavingClauseContext.class,0); + } + public OrderByClauseContext orderByClause() { + return getRuleContext(OrderByClauseContext.class,0); + } + public FromClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFromClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFromClause(this); + } + } + + public final FromClauseContext fromClause() throws RecognitionException { + FromClauseContext _localctx = new FromClauseContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_fromClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(307); + match(FROM); + setState(308); + relation(); + setState(310); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(309); + whereClause(); + } + } + + setState(313); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GROUP) { + { + setState(312); + groupByClause(); + } + } + + setState(316); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==HAVING) { + { + setState(315); + havingClause(); + } + } + + setState(319); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ORDER) { + { + setState(318); + orderByClause(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelationContext extends ParserRuleContext { + public RelationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relation; } + + public RelationContext() { } + public void copyFrom(RelationContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class TableAsRelationContext extends RelationContext { + public TableNameContext tableName() { + return getRuleContext(TableNameContext.class,0); + } + public AliasContext alias() { + return getRuleContext(AliasContext.class,0); + } + public TerminalNode AS() { return getToken(OpenSearchSQLParser.AS, 0); } + public TableAsRelationContext(RelationContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTableAsRelation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTableAsRelation(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class SubqueryAsRelationContext extends RelationContext { + public QuerySpecificationContext subquery; + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public AliasContext alias() { + return getRuleContext(AliasContext.class,0); + } + public QuerySpecificationContext querySpecification() { + return getRuleContext(QuerySpecificationContext.class,0); + } + public TerminalNode AS() { return getToken(OpenSearchSQLParser.AS, 0); } + public SubqueryAsRelationContext(RelationContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSubqueryAsRelation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSubqueryAsRelation(this); + } + } + + public final RelationContext relation() throws RecognitionException { + RelationContext _localctx = new RelationContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_relation); + int _la; + try { + setState(336); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DATETIME: + case FIRST: + case LAST: + case LEFT: + case RIGHT: + case AVG: + case COUNT: + case MAX: + case MIN: + case SUM: + case SUBSTRING: + case TRIM: + case FULL: + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + case ABS: + case ACOS: + case ADD: + case ADDTIME: + case ASCII: + case ASIN: + case ATAN: + case ATAN2: + case CBRT: + case CEIL: + case CEILING: + case CONCAT: + case CONCAT_WS: + case CONV: + case CONVERT_TZ: + case COS: + case COSH: + case COT: + case CRC32: + case CURDATE: + case CURTIME: + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case DATE: + case DATE_ADD: + case DATE_FORMAT: + case DATE_SUB: + case DATEDIFF: + case DAYNAME: + case DAYOFMONTH: + case DAYOFWEEK: + case DAYOFYEAR: + case DEGREES: + case DIVIDE: + case E: + case EXP: + case EXPM1: + case FLOOR: + case FROM_DAYS: + case FROM_UNIXTIME: + case IF: + case IFNULL: + case ISNULL: + case LAST_DAY: + case LENGTH: + case LN: + case LOCALTIME: + case LOCALTIMESTAMP: + case LOCATE: + case LOG: + case LOG10: + case LOG2: + case LOWER: + case LTRIM: + case MAKEDATE: + case MAKETIME: + case MODULUS: + case MONTHNAME: + case MULTIPLY: + case NOW: + case NULLIF: + case PERIOD_ADD: + case PERIOD_DIFF: + case PI: + case POW: + case POWER: + case RADIANS: + case RAND: + case REPLACE: + case RINT: + case ROUND: + case RTRIM: + case REVERSE: + case SEC_TO_TIME: + case SIGN: + case SIGNUM: + case SIN: + case SINH: + case SQRT: + case STR_TO_DATE: + case SUBDATE: + case SUBTIME: + case SUBTRACT: + case SYSDATE: + case TAN: + case TIME: + case TIMEDIFF: + case TIME_FORMAT: + case TIME_TO_SEC: + case TIMESTAMP: + case TRUNCATE: + case TO_DAYS: + case TO_SECONDS: + case UNIX_TIMESTAMP: + case UPPER: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + case D: + case T: + case TS: + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + case FIELD: + case HOUR_OF_DAY: + case MINUTE_OF_DAY: + case MINUTE_OF_HOUR: + case MONTH_OF_YEAR: + case NESTED: + case SECOND_OF_MINUTE: + case TYPEOF: + case WEEK_OF_YEAR: + case WEEKOFYEAR: + case WEEKDAY: + case SUBSTR: + case STRCMP: + case ADDDATE: + case YEARWEEK: + case TYPE: + case MOD: + case DOT: + case ID: + case BACKTICK_QUOTE_ID: + _localctx = new TableAsRelationContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(321); + tableName(); + setState(326); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 18014604735086720L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & -549621813217L) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & -4398046650369L) != 0) || ((((_la - 193)) & ~0x3f) == 0 && ((1L << (_la - 193)) & 9992430556348415L) != 0) || ((((_la - 257)) & ~0x3f) == 0 && ((1L << (_la - 257)) & 2306405959167240065L) != 0) || ((((_la - 327)) & ~0x3f) == 0 && ((1L << (_la - 327)) & 20971521L) != 0)) { + { + setState(323); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(322); + match(AS); + } + } + + setState(325); + alias(); + } + } + + } + break; + case LR_BRACKET: + _localctx = new SubqueryAsRelationContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(328); + match(LR_BRACKET); + setState(329); + ((SubqueryAsRelationContext)_localctx).subquery = querySpecification(); + setState(330); + match(RR_BRACKET); + setState(332); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AS) { + { + setState(331); + match(AS); + } + } + + setState(334); + alias(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WhereClauseContext extends ParserRuleContext { + public TerminalNode WHERE() { return getToken(OpenSearchSQLParser.WHERE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public WhereClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whereClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterWhereClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitWhereClause(this); + } + } + + public final WhereClauseContext whereClause() throws RecognitionException { + WhereClauseContext _localctx = new WhereClauseContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_whereClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(338); + match(WHERE); + setState(339); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GroupByClauseContext extends ParserRuleContext { + public TerminalNode GROUP() { return getToken(OpenSearchSQLParser.GROUP, 0); } + public TerminalNode BY() { return getToken(OpenSearchSQLParser.BY, 0); } + public GroupByElementsContext groupByElements() { + return getRuleContext(GroupByElementsContext.class,0); + } + public GroupByClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupByClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterGroupByClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitGroupByClause(this); + } + } + + public final GroupByClauseContext groupByClause() throws RecognitionException { + GroupByClauseContext _localctx = new GroupByClauseContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_groupByClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(341); + match(GROUP); + setState(342); + match(BY); + setState(343); + groupByElements(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GroupByElementsContext extends ParserRuleContext { + public List groupByElement() { + return getRuleContexts(GroupByElementContext.class); + } + public GroupByElementContext groupByElement(int i) { + return getRuleContext(GroupByElementContext.class,i); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public GroupByElementsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupByElements; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterGroupByElements(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitGroupByElements(this); + } + } + + public final GroupByElementsContext groupByElements() throws RecognitionException { + GroupByElementsContext _localctx = new GroupByElementsContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_groupByElements); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(345); + groupByElement(); + setState(350); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(346); + match(COMMA); + setState(347); + groupByElement(); + } + } + setState(352); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GroupByElementContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GroupByElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_groupByElement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterGroupByElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitGroupByElement(this); + } + } + + public final GroupByElementContext groupByElement() throws RecognitionException { + GroupByElementContext _localctx = new GroupByElementContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_groupByElement); + try { + enterOuterAlt(_localctx, 1); + { + setState(353); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HavingClauseContext extends ParserRuleContext { + public TerminalNode HAVING() { return getToken(OpenSearchSQLParser.HAVING, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public HavingClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_havingClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterHavingClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitHavingClause(this); + } + } + + public final HavingClauseContext havingClause() throws RecognitionException { + HavingClauseContext _localctx = new HavingClauseContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_havingClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(355); + match(HAVING); + setState(356); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OrderByClauseContext extends ParserRuleContext { + public TerminalNode ORDER() { return getToken(OpenSearchSQLParser.ORDER, 0); } + public TerminalNode BY() { return getToken(OpenSearchSQLParser.BY, 0); } + public List orderByElement() { + return getRuleContexts(OrderByElementContext.class); + } + public OrderByElementContext orderByElement(int i) { + return getRuleContext(OrderByElementContext.class,i); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public OrderByClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderByClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterOrderByClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitOrderByClause(this); + } + } + + public final OrderByClauseContext orderByClause() throws RecognitionException { + OrderByClauseContext _localctx = new OrderByClauseContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_orderByClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(358); + match(ORDER); + setState(359); + match(BY); + setState(360); + orderByElement(); + setState(365); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(361); + match(COMMA); + setState(362); + orderByElement(); + } + } + setState(367); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OrderByElementContext extends ParserRuleContext { + public Token order; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode NULLS() { return getToken(OpenSearchSQLParser.NULLS, 0); } + public TerminalNode FIRST() { return getToken(OpenSearchSQLParser.FIRST, 0); } + public TerminalNode LAST() { return getToken(OpenSearchSQLParser.LAST, 0); } + public TerminalNode ASC() { return getToken(OpenSearchSQLParser.ASC, 0); } + public TerminalNode DESC() { return getToken(OpenSearchSQLParser.DESC, 0); } + public OrderByElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderByElement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterOrderByElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitOrderByElement(this); + } + } + + public final OrderByElementContext orderByElement() throws RecognitionException { + OrderByElementContext _localctx = new OrderByElementContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_orderByElement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(368); + expression(0); + setState(370); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASC || _la==DESC) { + { + setState(369); + ((OrderByElementContext)_localctx).order = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ASC || _la==DESC) ) { + ((OrderByElementContext)_localctx).order = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(374); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NULLS) { + { + setState(372); + match(NULLS); + setState(373); + _la = _input.LA(1); + if ( !(_la==FIRST || _la==LAST) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LimitClauseContext extends ParserRuleContext { + public DecimalLiteralContext offset; + public DecimalLiteralContext limit; + public TerminalNode LIMIT() { return getToken(OpenSearchSQLParser.LIMIT, 0); } + public List decimalLiteral() { + return getRuleContexts(DecimalLiteralContext.class); + } + public DecimalLiteralContext decimalLiteral(int i) { + return getRuleContext(DecimalLiteralContext.class,i); + } + public TerminalNode COMMA() { return getToken(OpenSearchSQLParser.COMMA, 0); } + public TerminalNode OFFSET() { return getToken(OpenSearchSQLParser.OFFSET, 0); } + public LimitClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_limitClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterLimitClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitLimitClause(this); + } + } + + public final LimitClauseContext limitClause() throws RecognitionException { + LimitClauseContext _localctx = new LimitClauseContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_limitClause); + try { + setState(388); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(376); + match(LIMIT); + setState(380); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + case 1: + { + setState(377); + ((LimitClauseContext)_localctx).offset = decimalLiteral(); + setState(378); + match(COMMA); + } + break; + } + setState(382); + ((LimitClauseContext)_localctx).limit = decimalLiteral(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(383); + match(LIMIT); + setState(384); + ((LimitClauseContext)_localctx).limit = decimalLiteral(); + setState(385); + match(OFFSET); + setState(386); + ((LimitClauseContext)_localctx).offset = decimalLiteral(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WindowFunctionClauseContext extends ParserRuleContext { + public WindowFunctionContext function; + public OverClauseContext overClause() { + return getRuleContext(OverClauseContext.class,0); + } + public WindowFunctionContext windowFunction() { + return getRuleContext(WindowFunctionContext.class,0); + } + public WindowFunctionClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_windowFunctionClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterWindowFunctionClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitWindowFunctionClause(this); + } + } + + public final WindowFunctionClauseContext windowFunctionClause() throws RecognitionException { + WindowFunctionClauseContext _localctx = new WindowFunctionClauseContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_windowFunctionClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(390); + ((WindowFunctionClauseContext)_localctx).function = windowFunction(); + setState(391); + overClause(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WindowFunctionContext extends ParserRuleContext { + public WindowFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_windowFunction; } + + public WindowFunctionContext() { } + public void copyFrom(WindowFunctionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AggregateWindowFunctionContext extends WindowFunctionContext { + public AggregateFunctionContext aggregateFunction() { + return getRuleContext(AggregateFunctionContext.class,0); + } + public AggregateWindowFunctionContext(WindowFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAggregateWindowFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAggregateWindowFunction(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ScalarWindowFunctionContext extends WindowFunctionContext { + public Token functionName; + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public TerminalNode ROW_NUMBER() { return getToken(OpenSearchSQLParser.ROW_NUMBER, 0); } + public TerminalNode RANK() { return getToken(OpenSearchSQLParser.RANK, 0); } + public TerminalNode DENSE_RANK() { return getToken(OpenSearchSQLParser.DENSE_RANK, 0); } + public FunctionArgsContext functionArgs() { + return getRuleContext(FunctionArgsContext.class,0); + } + public ScalarWindowFunctionContext(WindowFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterScalarWindowFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitScalarWindowFunction(this); + } + } + + public final WindowFunctionContext windowFunction() throws RecognitionException { + WindowFunctionContext _localctx = new WindowFunctionContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_windowFunction); + int _la; + try { + setState(400); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DENSE_RANK: + case RANK: + case ROW_NUMBER: + _localctx = new ScalarWindowFunctionContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(393); + ((ScalarWindowFunctionContext)_localctx).functionName = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 211)) & ~0x3f) == 0 && ((1L << (_la - 211)) & 7L) != 0)) ) { + ((ScalarWindowFunctionContext)_localctx).functionName = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(394); + match(LR_BRACKET); + setState(396); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + case 1: + { + setState(395); + functionArgs(); + } + break; + } + setState(398); + match(RR_BRACKET); + } + break; + case AVG: + case COUNT: + case MAX: + case MIN: + case SUM: + case VAR_POP: + case VAR_SAMP: + case VARIANCE: + case STD: + case STDDEV: + case STDDEV_POP: + case STDDEV_SAMP: + case PERCENTILE: + case PERCENTILE_APPROX: + _localctx = new AggregateWindowFunctionContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(399); + aggregateFunction(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OverClauseContext extends ParserRuleContext { + public TerminalNode OVER() { return getToken(OpenSearchSQLParser.OVER, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public PartitionByClauseContext partitionByClause() { + return getRuleContext(PartitionByClauseContext.class,0); + } + public OrderByClauseContext orderByClause() { + return getRuleContext(OrderByClauseContext.class,0); + } + public OverClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_overClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterOverClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitOverClause(this); + } + } + + public final OverClauseContext overClause() throws RecognitionException { + OverClauseContext _localctx = new OverClauseContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_overClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(402); + match(OVER); + setState(403); + match(LR_BRACKET); + setState(405); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PARTITION) { + { + setState(404); + partitionByClause(); + } + } + + setState(408); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ORDER) { + { + setState(407); + orderByClause(); + } + } + + setState(410); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PartitionByClauseContext extends ParserRuleContext { + public TerminalNode PARTITION() { return getToken(OpenSearchSQLParser.PARTITION, 0); } + public TerminalNode BY() { return getToken(OpenSearchSQLParser.BY, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public PartitionByClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_partitionByClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterPartitionByClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitPartitionByClause(this); + } + } + + public final PartitionByClauseContext partitionByClause() throws RecognitionException { + PartitionByClauseContext _localctx = new PartitionByClauseContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_partitionByClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(412); + match(PARTITION); + setState(413); + match(BY); + setState(414); + expression(0); + setState(419); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(415); + match(COMMA); + setState(416); + expression(0); + } + } + setState(421); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstantContext extends ParserRuleContext { + public ConstantContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constant; } + + public ConstantContext() { } + public void copyFrom(ConstantContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DatetimeContext extends ConstantContext { + public DatetimeLiteralContext datetimeLiteral() { + return getRuleContext(DatetimeLiteralContext.class,0); + } + public DatetimeContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDatetime(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDatetime(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class SignedDecimalContext extends ConstantContext { + public DecimalLiteralContext decimalLiteral() { + return getRuleContext(DecimalLiteralContext.class,0); + } + public SignContext sign() { + return getRuleContext(SignContext.class,0); + } + public SignedDecimalContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSignedDecimal(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSignedDecimal(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BooleanContext extends ConstantContext { + public BooleanLiteralContext booleanLiteral() { + return getRuleContext(BooleanLiteralContext.class,0); + } + public BooleanContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterBoolean(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitBoolean(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class StringContext extends ConstantContext { + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public StringContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterString(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitString(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NullContext extends ConstantContext { + public NullLiteralContext nullLiteral() { + return getRuleContext(NullLiteralContext.class,0); + } + public NullContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNull(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNull(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class IntervalContext extends ConstantContext { + public IntervalLiteralContext intervalLiteral() { + return getRuleContext(IntervalLiteralContext.class,0); + } + public IntervalContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterInterval(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitInterval(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class SignedRealContext extends ConstantContext { + public RealLiteralContext realLiteral() { + return getRuleContext(RealLiteralContext.class,0); + } + public SignContext sign() { + return getRuleContext(SignContext.class,0); + } + public SignedRealContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSignedReal(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSignedReal(this); + } + } + + public final ConstantContext constant() throws RecognitionException { + ConstantContext _localctx = new ConstantContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_constant); + int _la; + try { + setState(435); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: + _localctx = new StringContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(422); + stringLiteral(); + } + break; + case 2: + _localctx = new SignedDecimalContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(424); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PLUS || _la==MINUS) { + { + setState(423); + sign(); + } + } + + setState(426); + decimalLiteral(); + } + break; + case 3: + _localctx = new SignedRealContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PLUS || _la==MINUS) { + { + setState(427); + sign(); + } + } + + setState(430); + realLiteral(); + } + break; + case 4: + _localctx = new BooleanContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(431); + booleanLiteral(); + } + break; + case 5: + _localctx = new DatetimeContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(432); + datetimeLiteral(); + } + break; + case 6: + _localctx = new IntervalContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(433); + intervalLiteral(); + } + break; + case 7: + _localctx = new NullContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(434); + nullLiteral(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DecimalLiteralContext extends ParserRuleContext { + public TerminalNode DECIMAL_LITERAL() { return getToken(OpenSearchSQLParser.DECIMAL_LITERAL, 0); } + public TerminalNode ZERO_DECIMAL() { return getToken(OpenSearchSQLParser.ZERO_DECIMAL, 0); } + public TerminalNode ONE_DECIMAL() { return getToken(OpenSearchSQLParser.ONE_DECIMAL, 0); } + public TerminalNode TWO_DECIMAL() { return getToken(OpenSearchSQLParser.TWO_DECIMAL, 0); } + public DecimalLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_decimalLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDecimalLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDecimalLiteral(this); + } + } + + public final DecimalLiteralContext decimalLiteral() throws RecognitionException { + DecimalLiteralContext _localctx = new DecimalLiteralContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_decimalLiteral); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(437); + _la = _input.LA(1); + if ( !(((((_la - 335)) & ~0x3f) == 0 && ((1L << (_la - 335)) & 519L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NumericLiteralContext extends ParserRuleContext { + public DecimalLiteralContext decimalLiteral() { + return getRuleContext(DecimalLiteralContext.class,0); + } + public RealLiteralContext realLiteral() { + return getRuleContext(RealLiteralContext.class,0); + } + public NumericLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_numericLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNumericLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNumericLiteral(this); + } + } + + public final NumericLiteralContext numericLiteral() throws RecognitionException { + NumericLiteralContext _localctx = new NumericLiteralContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_numericLiteral); + try { + setState(441); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ZERO_DECIMAL: + case ONE_DECIMAL: + case TWO_DECIMAL: + case DECIMAL_LITERAL: + enterOuterAlt(_localctx, 1); + { + setState(439); + decimalLiteral(); + } + break; + case REAL_LITERAL: + enterOuterAlt(_localctx, 2); + { + setState(440); + realLiteral(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StringLiteralContext extends ParserRuleContext { + public TerminalNode STRING_LITERAL() { return getToken(OpenSearchSQLParser.STRING_LITERAL, 0); } + public TerminalNode DOUBLE_QUOTE_ID() { return getToken(OpenSearchSQLParser.DOUBLE_QUOTE_ID, 0); } + public StringLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stringLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterStringLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitStringLiteral(this); + } + } + + public final StringLiteralContext stringLiteral() throws RecognitionException { + StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_stringLiteral); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(443); + _la = _input.LA(1); + if ( !(_la==STRING_LITERAL || _la==DOUBLE_QUOTE_ID) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BooleanLiteralContext extends ParserRuleContext { + public TerminalNode TRUE() { return getToken(OpenSearchSQLParser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(OpenSearchSQLParser.FALSE, 0); } + public BooleanLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_booleanLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterBooleanLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitBooleanLiteral(this); + } + } + + public final BooleanLiteralContext booleanLiteral() throws RecognitionException { + BooleanLiteralContext _localctx = new BooleanLiteralContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_booleanLiteral); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(445); + _la = _input.LA(1); + if ( !(_la==FALSE || _la==TRUE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RealLiteralContext extends ParserRuleContext { + public TerminalNode REAL_LITERAL() { return getToken(OpenSearchSQLParser.REAL_LITERAL, 0); } + public RealLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_realLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRealLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRealLiteral(this); + } + } + + public final RealLiteralContext realLiteral() throws RecognitionException { + RealLiteralContext _localctx = new RealLiteralContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_realLiteral); + try { + enterOuterAlt(_localctx, 1); + { + setState(447); + match(REAL_LITERAL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SignContext extends ParserRuleContext { + public TerminalNode PLUS() { return getToken(OpenSearchSQLParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(OpenSearchSQLParser.MINUS, 0); } + public SignContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sign; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSign(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSign(this); + } + } + + public final SignContext sign() throws RecognitionException { + SignContext _localctx = new SignContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_sign); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(449); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NullLiteralContext extends ParserRuleContext { + public TerminalNode NULL_LITERAL() { return getToken(OpenSearchSQLParser.NULL_LITERAL, 0); } + public NullLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nullLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNullLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNullLiteral(this); + } + } + + public final NullLiteralContext nullLiteral() throws RecognitionException { + NullLiteralContext _localctx = new NullLiteralContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_nullLiteral); + try { + enterOuterAlt(_localctx, 1); + { + setState(451); + match(NULL_LITERAL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DatetimeLiteralContext extends ParserRuleContext { + public DateLiteralContext dateLiteral() { + return getRuleContext(DateLiteralContext.class,0); + } + public TimeLiteralContext timeLiteral() { + return getRuleContext(TimeLiteralContext.class,0); + } + public TimestampLiteralContext timestampLiteral() { + return getRuleContext(TimestampLiteralContext.class,0); + } + public DatetimeLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_datetimeLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDatetimeLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDatetimeLiteral(this); + } + } + + public final DatetimeLiteralContext datetimeLiteral() throws RecognitionException { + DatetimeLiteralContext _localctx = new DatetimeLiteralContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_datetimeLiteral); + try { + setState(456); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(453); + dateLiteral(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(454); + timeLiteral(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(455); + timestampLiteral(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DateLiteralContext extends ParserRuleContext { + public StringLiteralContext date; + public TerminalNode DATE() { return getToken(OpenSearchSQLParser.DATE, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public TerminalNode LEFT_BRACE() { return getToken(OpenSearchSQLParser.LEFT_BRACE, 0); } + public TerminalNode RIGHT_BRACE() { return getToken(OpenSearchSQLParser.RIGHT_BRACE, 0); } + public TerminalNode D() { return getToken(OpenSearchSQLParser.D, 0); } + public DateLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dateLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDateLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDateLiteral(this); + } + } + + public final DateLiteralContext dateLiteral() throws RecognitionException { + DateLiteralContext _localctx = new DateLiteralContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_dateLiteral); + int _la; + try { + setState(465); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DATE: + enterOuterAlt(_localctx, 1); + { + setState(458); + match(DATE); + setState(459); + ((DateLiteralContext)_localctx).date = stringLiteral(); + } + break; + case LEFT_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(460); + match(LEFT_BRACE); + setState(461); + _la = _input.LA(1); + if ( !(_la==DATE || _la==D) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(462); + ((DateLiteralContext)_localctx).date = stringLiteral(); + setState(463); + match(RIGHT_BRACE); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TimeLiteralContext extends ParserRuleContext { + public StringLiteralContext time; + public TerminalNode TIME() { return getToken(OpenSearchSQLParser.TIME, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public TerminalNode LEFT_BRACE() { return getToken(OpenSearchSQLParser.LEFT_BRACE, 0); } + public TerminalNode RIGHT_BRACE() { return getToken(OpenSearchSQLParser.RIGHT_BRACE, 0); } + public TerminalNode T() { return getToken(OpenSearchSQLParser.T, 0); } + public TimeLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_timeLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTimeLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTimeLiteral(this); + } + } + + public final TimeLiteralContext timeLiteral() throws RecognitionException { + TimeLiteralContext _localctx = new TimeLiteralContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_timeLiteral); + int _la; + try { + setState(474); + _errHandler.sync(this); + switch (_input.LA(1)) { + case TIME: + enterOuterAlt(_localctx, 1); + { + setState(467); + match(TIME); + setState(468); + ((TimeLiteralContext)_localctx).time = stringLiteral(); + } + break; + case LEFT_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(469); + match(LEFT_BRACE); + setState(470); + _la = _input.LA(1); + if ( !(_la==TIME || _la==T) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(471); + ((TimeLiteralContext)_localctx).time = stringLiteral(); + setState(472); + match(RIGHT_BRACE); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TimestampLiteralContext extends ParserRuleContext { + public StringLiteralContext timestamp; + public TerminalNode TIMESTAMP() { return getToken(OpenSearchSQLParser.TIMESTAMP, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public TerminalNode LEFT_BRACE() { return getToken(OpenSearchSQLParser.LEFT_BRACE, 0); } + public TerminalNode RIGHT_BRACE() { return getToken(OpenSearchSQLParser.RIGHT_BRACE, 0); } + public TerminalNode TS() { return getToken(OpenSearchSQLParser.TS, 0); } + public TimestampLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_timestampLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTimestampLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTimestampLiteral(this); + } + } + + public final TimestampLiteralContext timestampLiteral() throws RecognitionException { + TimestampLiteralContext _localctx = new TimestampLiteralContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_timestampLiteral); + int _la; + try { + setState(483); + _errHandler.sync(this); + switch (_input.LA(1)) { + case TIMESTAMP: + enterOuterAlt(_localctx, 1); + { + setState(476); + match(TIMESTAMP); + setState(477); + ((TimestampLiteralContext)_localctx).timestamp = stringLiteral(); + } + break; + case LEFT_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(478); + match(LEFT_BRACE); + setState(479); + _la = _input.LA(1); + if ( !(_la==TIMESTAMP || _la==TS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(480); + ((TimestampLiteralContext)_localctx).timestamp = stringLiteral(); + setState(481); + match(RIGHT_BRACE); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DatetimeConstantLiteralContext extends ParserRuleContext { + public TerminalNode CURRENT_DATE() { return getToken(OpenSearchSQLParser.CURRENT_DATE, 0); } + public TerminalNode CURRENT_TIME() { return getToken(OpenSearchSQLParser.CURRENT_TIME, 0); } + public TerminalNode CURRENT_TIMESTAMP() { return getToken(OpenSearchSQLParser.CURRENT_TIMESTAMP, 0); } + public TerminalNode LOCALTIME() { return getToken(OpenSearchSQLParser.LOCALTIME, 0); } + public TerminalNode LOCALTIMESTAMP() { return getToken(OpenSearchSQLParser.LOCALTIMESTAMP, 0); } + public TerminalNode UTC_TIMESTAMP() { return getToken(OpenSearchSQLParser.UTC_TIMESTAMP, 0); } + public TerminalNode UTC_DATE() { return getToken(OpenSearchSQLParser.UTC_DATE, 0); } + public TerminalNode UTC_TIME() { return getToken(OpenSearchSQLParser.UTC_TIME, 0); } + public DatetimeConstantLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_datetimeConstantLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDatetimeConstantLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDatetimeConstantLiteral(this); + } + } + + public final DatetimeConstantLiteralContext datetimeConstantLiteral() throws RecognitionException { + DatetimeConstantLiteralContext _localctx = new DatetimeConstantLiteralContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_datetimeConstantLiteral); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(485); + _la = _input.LA(1); + if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 805306375L) != 0) || ((((_la - 203)) & ~0x3f) == 0 && ((1L << (_la - 203)) & 7L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IntervalLiteralContext extends ParserRuleContext { + public TerminalNode INTERVAL() { return getToken(OpenSearchSQLParser.INTERVAL, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IntervalUnitContext intervalUnit() { + return getRuleContext(IntervalUnitContext.class,0); + } + public IntervalLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intervalLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterIntervalLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitIntervalLiteral(this); + } + } + + public final IntervalLiteralContext intervalLiteral() throws RecognitionException { + IntervalLiteralContext _localctx = new IntervalLiteralContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_intervalLiteral); + try { + enterOuterAlt(_localctx, 1); + { + setState(487); + match(INTERVAL); + setState(488); + expression(0); + setState(489); + intervalUnit(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IntervalUnitContext extends ParserRuleContext { + public TerminalNode MICROSECOND() { return getToken(OpenSearchSQLParser.MICROSECOND, 0); } + public TerminalNode SECOND() { return getToken(OpenSearchSQLParser.SECOND, 0); } + public TerminalNode MINUTE() { return getToken(OpenSearchSQLParser.MINUTE, 0); } + public TerminalNode HOUR() { return getToken(OpenSearchSQLParser.HOUR, 0); } + public TerminalNode DAY() { return getToken(OpenSearchSQLParser.DAY, 0); } + public TerminalNode WEEK() { return getToken(OpenSearchSQLParser.WEEK, 0); } + public TerminalNode MONTH() { return getToken(OpenSearchSQLParser.MONTH, 0); } + public TerminalNode QUARTER() { return getToken(OpenSearchSQLParser.QUARTER, 0); } + public TerminalNode YEAR() { return getToken(OpenSearchSQLParser.YEAR, 0); } + public TerminalNode SECOND_MICROSECOND() { return getToken(OpenSearchSQLParser.SECOND_MICROSECOND, 0); } + public TerminalNode MINUTE_MICROSECOND() { return getToken(OpenSearchSQLParser.MINUTE_MICROSECOND, 0); } + public TerminalNode MINUTE_SECOND() { return getToken(OpenSearchSQLParser.MINUTE_SECOND, 0); } + public TerminalNode HOUR_MICROSECOND() { return getToken(OpenSearchSQLParser.HOUR_MICROSECOND, 0); } + public TerminalNode HOUR_SECOND() { return getToken(OpenSearchSQLParser.HOUR_SECOND, 0); } + public TerminalNode HOUR_MINUTE() { return getToken(OpenSearchSQLParser.HOUR_MINUTE, 0); } + public TerminalNode DAY_MICROSECOND() { return getToken(OpenSearchSQLParser.DAY_MICROSECOND, 0); } + public TerminalNode DAY_SECOND() { return getToken(OpenSearchSQLParser.DAY_SECOND, 0); } + public TerminalNode DAY_MINUTE() { return getToken(OpenSearchSQLParser.DAY_MINUTE, 0); } + public TerminalNode DAY_HOUR() { return getToken(OpenSearchSQLParser.DAY_HOUR, 0); } + public TerminalNode YEAR_MONTH() { return getToken(OpenSearchSQLParser.YEAR_MONTH, 0); } + public IntervalUnitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intervalUnit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterIntervalUnit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitIntervalUnit(this); + } + } + + public final IntervalUnitContext intervalUnit() throws RecognitionException { + IntervalUnitContext _localctx = new IntervalUnitContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_intervalUnit); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(491); + _la = _input.LA(1); + if ( !(((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & 1048575L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionContext extends ParserRuleContext { + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + + public ExpressionContext() { } + public void copyFrom(ExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class OrExpressionContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + public TerminalNode OR() { return getToken(OpenSearchSQLParser.OR, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public OrExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterOrExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitOrExpression(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AndExpressionContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + public TerminalNode AND() { return getToken(OpenSearchSQLParser.AND, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public AndExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAndExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAndExpression(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NotExpressionContext extends ExpressionContext { + public TerminalNode NOT() { return getToken(OpenSearchSQLParser.NOT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public NotExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNotExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNotExpression(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class PredicateExpressionContext extends ExpressionContext { + public PredicateContext predicate() { + return getRuleContext(PredicateContext.class,0); + } + public PredicateExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterPredicateExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitPredicateExpression(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + return expression(0); + } + + private ExpressionContext expression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); + ExpressionContext _prevctx = _localctx; + int _startState = 90; + enterRecursionRule(_localctx, 90, RULE_expression, _p); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(497); + _errHandler.sync(this); + switch (_input.LA(1)) { + case NOT: + { + _localctx = new NotExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(494); + match(NOT); + setState(495); + expression(4); + } + break; + case CASE: + case CAST: + case DATETIME: + case FALSE: + case FIRST: + case LAST: + case LEFT: + case MATCH: + case NULL_LITERAL: + case RIGHT: + case TRUE: + case AVG: + case COUNT: + case MAX: + case MIN: + case SUM: + case VAR_POP: + case VAR_SAMP: + case VARIANCE: + case STD: + case STDDEV: + case STDDEV_POP: + case STDDEV_SAMP: + case SUBSTRING: + case TRIM: + case FULL: + case INTERVAL: + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + case ABS: + case ACOS: + case ADD: + case ADDTIME: + case ASCII: + case ASIN: + case ATAN: + case ATAN2: + case CBRT: + case CEIL: + case CEILING: + case CONCAT: + case CONCAT_WS: + case CONV: + case CONVERT_TZ: + case COS: + case COSH: + case COT: + case CRC32: + case CURDATE: + case CURTIME: + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case DATE: + case DATE_ADD: + case DATE_FORMAT: + case DATE_SUB: + case DATEDIFF: + case DAYNAME: + case DAYOFMONTH: + case DAYOFWEEK: + case DAYOFYEAR: + case DEGREES: + case DIVIDE: + case E: + case EXP: + case EXPM1: + case EXTRACT: + case FLOOR: + case FROM_DAYS: + case FROM_UNIXTIME: + case GET_FORMAT: + case IF: + case IFNULL: + case ISNULL: + case LAST_DAY: + case LENGTH: + case LN: + case LOCALTIME: + case LOCALTIMESTAMP: + case LOCATE: + case LOG: + case LOG10: + case LOG2: + case LOWER: + case LTRIM: + case MAKEDATE: + case MAKETIME: + case MODULUS: + case MONTHNAME: + case MULTIPLY: + case NOW: + case NULLIF: + case PERIOD_ADD: + case PERIOD_DIFF: + case PI: + case POSITION: + case POW: + case POWER: + case RADIANS: + case RAND: + case REPLACE: + case RINT: + case ROUND: + case RTRIM: + case REVERSE: + case SEC_TO_TIME: + case SIGN: + case SIGNUM: + case SIN: + case SINH: + case SQRT: + case STR_TO_DATE: + case SUBDATE: + case SUBTIME: + case SUBTRACT: + case SYSDATE: + case TAN: + case TIME: + case TIMEDIFF: + case TIME_FORMAT: + case TIME_TO_SEC: + case TIMESTAMP: + case TRUNCATE: + case TO_DAYS: + case TO_SECONDS: + case UNIX_TIMESTAMP: + case UPPER: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + case D: + case T: + case TS: + case LEFT_BRACE: + case DENSE_RANK: + case RANK: + case ROW_NUMBER: + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + case FIELD: + case HOUR_OF_DAY: + case MATCHPHRASE: + case MATCH_PHRASE: + case MATCHPHRASEQUERY: + case SIMPLE_QUERY_STRING: + case QUERY_STRING: + case MATCH_PHRASE_PREFIX: + case MATCHQUERY: + case MATCH_QUERY: + case MINUTE_OF_DAY: + case MINUTE_OF_HOUR: + case MONTH_OF_YEAR: + case MULTIMATCH: + case MULTI_MATCH: + case MULTIMATCHQUERY: + case NESTED: + case PERCENTILE: + case PERCENTILE_APPROX: + case QUERY: + case SCORE: + case SCOREQUERY: + case SCORE_QUERY: + case SECOND_OF_MINUTE: + case TIMESTAMPADD: + case TIMESTAMPDIFF: + case TYPEOF: + case WEEK_OF_YEAR: + case WEEKOFYEAR: + case WEEKDAY: + case WILDCARDQUERY: + case WILDCARD_QUERY: + case SUBSTR: + case STRCMP: + case ADDDATE: + case YEARWEEK: + case TYPE: + case HIGHLIGHT: + case MATCH_BOOL_PREFIX: + case PLUS: + case MINUS: + case MOD: + case DOT: + case LR_BRACKET: + case ZERO_DECIMAL: + case ONE_DECIMAL: + case TWO_DECIMAL: + case STRING_LITERAL: + case DECIMAL_LITERAL: + case REAL_LITERAL: + case ID: + case DOUBLE_QUOTE_ID: + case BACKTICK_QUOTE_ID: + { + _localctx = new PredicateExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(496); + predicate(0); + } + break; + default: + throw new NoViableAltException(this); + } + _ctx.stop = _input.LT(-1); + setState(507); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(505); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + { + _localctx = new AndExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((AndExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(499); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(500); + match(AND); + setState(501); + ((AndExpressionContext)_localctx).right = expression(4); + } + break; + case 2: + { + _localctx = new OrExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((OrExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(502); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(503); + match(OR); + setState(504); + ((OrExpressionContext)_localctx).right = expression(3); + } + break; + } + } + } + setState(509); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PredicateContext extends ParserRuleContext { + public PredicateContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_predicate; } + + public PredicateContext() { } + public void copyFrom(PredicateContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ExpressionAtomPredicateContext extends PredicateContext { + public ExpressionAtomContext expressionAtom() { + return getRuleContext(ExpressionAtomContext.class,0); + } + public ExpressionAtomPredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterExpressionAtomPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitExpressionAtomPredicate(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BinaryComparisonPredicateContext extends PredicateContext { + public PredicateContext left; + public PredicateContext right; + public ComparisonOperatorContext comparisonOperator() { + return getRuleContext(ComparisonOperatorContext.class,0); + } + public List predicate() { + return getRuleContexts(PredicateContext.class); + } + public PredicateContext predicate(int i) { + return getRuleContext(PredicateContext.class,i); + } + public BinaryComparisonPredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterBinaryComparisonPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitBinaryComparisonPredicate(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class InPredicateContext extends PredicateContext { + public PredicateContext predicate() { + return getRuleContext(PredicateContext.class,0); + } + public TerminalNode IN() { return getToken(OpenSearchSQLParser.IN, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public ExpressionsContext expressions() { + return getRuleContext(ExpressionsContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public TerminalNode NOT() { return getToken(OpenSearchSQLParser.NOT, 0); } + public InPredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterInPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitInPredicate(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BetweenPredicateContext extends PredicateContext { + public List predicate() { + return getRuleContexts(PredicateContext.class); + } + public PredicateContext predicate(int i) { + return getRuleContext(PredicateContext.class,i); + } + public TerminalNode BETWEEN() { return getToken(OpenSearchSQLParser.BETWEEN, 0); } + public TerminalNode AND() { return getToken(OpenSearchSQLParser.AND, 0); } + public TerminalNode NOT() { return getToken(OpenSearchSQLParser.NOT, 0); } + public BetweenPredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterBetweenPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitBetweenPredicate(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class IsNullPredicateContext extends PredicateContext { + public PredicateContext predicate() { + return getRuleContext(PredicateContext.class,0); + } + public TerminalNode IS() { return getToken(OpenSearchSQLParser.IS, 0); } + public NullNotnullContext nullNotnull() { + return getRuleContext(NullNotnullContext.class,0); + } + public IsNullPredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterIsNullPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitIsNullPredicate(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class LikePredicateContext extends PredicateContext { + public PredicateContext left; + public PredicateContext right; + public TerminalNode LIKE() { return getToken(OpenSearchSQLParser.LIKE, 0); } + public List predicate() { + return getRuleContexts(PredicateContext.class); + } + public PredicateContext predicate(int i) { + return getRuleContext(PredicateContext.class,i); + } + public TerminalNode NOT() { return getToken(OpenSearchSQLParser.NOT, 0); } + public LikePredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterLikePredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitLikePredicate(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class RegexpPredicateContext extends PredicateContext { + public PredicateContext left; + public PredicateContext right; + public TerminalNode REGEXP() { return getToken(OpenSearchSQLParser.REGEXP, 0); } + public List predicate() { + return getRuleContexts(PredicateContext.class); + } + public PredicateContext predicate(int i) { + return getRuleContext(PredicateContext.class,i); + } + public RegexpPredicateContext(PredicateContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRegexpPredicate(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRegexpPredicate(this); + } + } + + public final PredicateContext predicate() throws RecognitionException { + return predicate(0); + } + + private PredicateContext predicate(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + PredicateContext _localctx = new PredicateContext(_ctx, _parentState); + PredicateContext _prevctx = _localctx; + int _startState = 92; + enterRecursionRule(_localctx, 92, RULE_predicate, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + { + _localctx = new ExpressionAtomPredicateContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(511); + expressionAtom(0); + } + _ctx.stop = _input.LT(-1); + setState(549); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,48,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(547); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + { + _localctx = new BinaryComparisonPredicateContext(new PredicateContext(_parentctx, _parentState)); + ((BinaryComparisonPredicateContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_predicate); + setState(513); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(514); + comparisonOperator(); + setState(515); + ((BinaryComparisonPredicateContext)_localctx).right = predicate(7); + } + break; + case 2: + { + _localctx = new BetweenPredicateContext(new PredicateContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_predicate); + setState(517); + if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); + setState(519); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(518); + match(NOT); + } + } + + setState(521); + match(BETWEEN); + setState(522); + predicate(0); + setState(523); + match(AND); + setState(524); + predicate(5); + } + break; + case 3: + { + _localctx = new LikePredicateContext(new PredicateContext(_parentctx, _parentState)); + ((LikePredicateContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_predicate); + setState(526); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(528); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(527); + match(NOT); + } + } + + setState(530); + match(LIKE); + setState(531); + ((LikePredicateContext)_localctx).right = predicate(4); + } + break; + case 4: + { + _localctx = new RegexpPredicateContext(new PredicateContext(_parentctx, _parentState)); + ((RegexpPredicateContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_predicate); + setState(532); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(533); + match(REGEXP); + setState(534); + ((RegexpPredicateContext)_localctx).right = predicate(3); + } + break; + case 5: + { + _localctx = new IsNullPredicateContext(new PredicateContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_predicate); + setState(535); + if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); + setState(536); + match(IS); + setState(537); + nullNotnull(); + } + break; + case 6: + { + _localctx = new InPredicateContext(new PredicateContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_predicate); + setState(538); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(540); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(539); + match(NOT); + } + } + + setState(542); + match(IN); + setState(543); + match(LR_BRACKET); + setState(544); + expressions(); + setState(545); + match(RR_BRACKET); + } + break; + } + } + } + setState(551); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,48,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionsContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public ExpressionsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expressions; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterExpressions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitExpressions(this); + } + } + + public final ExpressionsContext expressions() throws RecognitionException { + ExpressionsContext _localctx = new ExpressionsContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_expressions); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(552); + expression(0); + setState(557); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(553); + match(COMMA); + setState(554); + expression(0); + } + } + setState(559); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionAtomContext extends ParserRuleContext { + public ExpressionAtomContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expressionAtom; } + + public ExpressionAtomContext() { } + public void copyFrom(ExpressionAtomContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ConstantExpressionAtomContext extends ExpressionAtomContext { + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public ConstantExpressionAtomContext(ExpressionAtomContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterConstantExpressionAtom(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitConstantExpressionAtom(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class FunctionCallExpressionAtomContext extends ExpressionAtomContext { + public FunctionCallContext functionCall() { + return getRuleContext(FunctionCallContext.class,0); + } + public FunctionCallExpressionAtomContext(ExpressionAtomContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFunctionCallExpressionAtom(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFunctionCallExpressionAtom(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class FullColumnNameExpressionAtomContext extends ExpressionAtomContext { + public ColumnNameContext columnName() { + return getRuleContext(ColumnNameContext.class,0); + } + public FullColumnNameExpressionAtomContext(ExpressionAtomContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFullColumnNameExpressionAtom(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFullColumnNameExpressionAtom(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NestedExpressionAtomContext extends ExpressionAtomContext { + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public NestedExpressionAtomContext(ExpressionAtomContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNestedExpressionAtom(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNestedExpressionAtom(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class MathExpressionAtomContext extends ExpressionAtomContext { + public ExpressionAtomContext left; + public Token mathOperator; + public ExpressionAtomContext right; + public List expressionAtom() { + return getRuleContexts(ExpressionAtomContext.class); + } + public ExpressionAtomContext expressionAtom(int i) { + return getRuleContext(ExpressionAtomContext.class,i); + } + public TerminalNode STAR() { return getToken(OpenSearchSQLParser.STAR, 0); } + public TerminalNode SLASH() { return getToken(OpenSearchSQLParser.SLASH, 0); } + public TerminalNode MODULE() { return getToken(OpenSearchSQLParser.MODULE, 0); } + public TerminalNode PLUS() { return getToken(OpenSearchSQLParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(OpenSearchSQLParser.MINUS, 0); } + public MathExpressionAtomContext(ExpressionAtomContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterMathExpressionAtom(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitMathExpressionAtom(this); + } + } + + public final ExpressionAtomContext expressionAtom() throws RecognitionException { + return expressionAtom(0); + } + + private ExpressionAtomContext expressionAtom(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + ExpressionAtomContext _localctx = new ExpressionAtomContext(_ctx, _parentState); + ExpressionAtomContext _prevctx = _localctx; + int _startState = 96; + enterRecursionRule(_localctx, 96, RULE_expressionAtom, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(568); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + case 1: + { + _localctx = new ConstantExpressionAtomContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(561); + constant(); + } + break; + case 2: + { + _localctx = new FullColumnNameExpressionAtomContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(562); + columnName(); + } + break; + case 3: + { + _localctx = new FunctionCallExpressionAtomContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(563); + functionCall(); + } + break; + case 4: + { + _localctx = new NestedExpressionAtomContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(564); + match(LR_BRACKET); + setState(565); + expression(0); + setState(566); + match(RR_BRACKET); + } + break; + } + _ctx.stop = _input.LT(-1); + setState(578); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,52,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(576); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + case 1: + { + _localctx = new MathExpressionAtomContext(new ExpressionAtomContext(_parentctx, _parentState)); + ((MathExpressionAtomContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expressionAtom); + setState(570); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(571); + ((MathExpressionAtomContext)_localctx).mathOperator = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 312)) & ~0x3f) == 0 && ((1L << (_la - 312)) & 7L) != 0)) ) { + ((MathExpressionAtomContext)_localctx).mathOperator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(572); + ((MathExpressionAtomContext)_localctx).right = expressionAtom(3); + } + break; + case 2: + { + _localctx = new MathExpressionAtomContext(new ExpressionAtomContext(_parentctx, _parentState)); + ((MathExpressionAtomContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expressionAtom); + setState(573); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(574); + ((MathExpressionAtomContext)_localctx).mathOperator = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + ((MathExpressionAtomContext)_localctx).mathOperator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(575); + ((MathExpressionAtomContext)_localctx).right = expressionAtom(2); + } + break; + } + } + } + setState(580); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,52,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ComparisonOperatorContext extends ParserRuleContext { + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public TerminalNode GREATER_SYMBOL() { return getToken(OpenSearchSQLParser.GREATER_SYMBOL, 0); } + public TerminalNode LESS_SYMBOL() { return getToken(OpenSearchSQLParser.LESS_SYMBOL, 0); } + public TerminalNode EXCLAMATION_SYMBOL() { return getToken(OpenSearchSQLParser.EXCLAMATION_SYMBOL, 0); } + public ComparisonOperatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_comparisonOperator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterComparisonOperator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitComparisonOperator(this); + } + } + + public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { + ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_comparisonOperator); + try { + setState(592); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(581); + match(EQUAL_SYMBOL); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(582); + match(GREATER_SYMBOL); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(583); + match(LESS_SYMBOL); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(584); + match(LESS_SYMBOL); + setState(585); + match(EQUAL_SYMBOL); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(586); + match(GREATER_SYMBOL); + setState(587); + match(EQUAL_SYMBOL); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(588); + match(LESS_SYMBOL); + setState(589); + match(GREATER_SYMBOL); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(590); + match(EXCLAMATION_SYMBOL); + setState(591); + match(EQUAL_SYMBOL); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NullNotnullContext extends ParserRuleContext { + public TerminalNode NULL_LITERAL() { return getToken(OpenSearchSQLParser.NULL_LITERAL, 0); } + public TerminalNode NOT() { return getToken(OpenSearchSQLParser.NOT, 0); } + public NullNotnullContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nullNotnull; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNullNotnull(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNullNotnull(this); + } + } + + public final NullNotnullContext nullNotnull() throws RecognitionException { + NullNotnullContext _localctx = new NullNotnullContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_nullNotnull); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(595); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(594); + match(NOT); + } + } + + setState(597); + match(NULL_LITERAL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionCallContext extends ParserRuleContext { + public FunctionCallContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionCall; } + + public FunctionCallContext() { } + public void copyFrom(FunctionCallContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class PositionFunctionCallContext extends FunctionCallContext { + public PositionFunctionContext positionFunction() { + return getRuleContext(PositionFunctionContext.class,0); + } + public PositionFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterPositionFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitPositionFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class SpecificFunctionCallContext extends FunctionCallContext { + public SpecificFunctionContext specificFunction() { + return getRuleContext(SpecificFunctionContext.class,0); + } + public SpecificFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSpecificFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSpecificFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ScoreRelevanceFunctionCallContext extends FunctionCallContext { + public ScoreRelevanceFunctionContext scoreRelevanceFunction() { + return getRuleContext(ScoreRelevanceFunctionContext.class,0); + } + public ScoreRelevanceFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterScoreRelevanceFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitScoreRelevanceFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class HighlightFunctionCallContext extends FunctionCallContext { + public HighlightFunctionContext highlightFunction() { + return getRuleContext(HighlightFunctionContext.class,0); + } + public HighlightFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterHighlightFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitHighlightFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ExtractFunctionCallContext extends FunctionCallContext { + public ExtractFunctionContext extractFunction() { + return getRuleContext(ExtractFunctionContext.class,0); + } + public ExtractFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterExtractFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitExtractFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class RelevanceFunctionCallContext extends FunctionCallContext { + public RelevanceFunctionContext relevanceFunction() { + return getRuleContext(RelevanceFunctionContext.class,0); + } + public RelevanceFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class TimestampFunctionCallContext extends FunctionCallContext { + public TimestampFunctionContext timestampFunction() { + return getRuleContext(TimestampFunctionContext.class,0); + } + public TimestampFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTimestampFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTimestampFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NestedAllFunctionCallContext extends FunctionCallContext { + public NestedFunctionNameContext nestedFunctionName() { + return getRuleContext(NestedFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public AllTupleFieldsContext allTupleFields() { + return getRuleContext(AllTupleFieldsContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public NestedAllFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNestedAllFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNestedAllFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class FilteredAggregationFunctionCallContext extends FunctionCallContext { + public AggregateFunctionContext aggregateFunction() { + return getRuleContext(AggregateFunctionContext.class,0); + } + public FilterClauseContext filterClause() { + return getRuleContext(FilterClauseContext.class,0); + } + public OrderByClauseContext orderByClause() { + return getRuleContext(OrderByClauseContext.class,0); + } + public FilteredAggregationFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFilteredAggregationFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFilteredAggregationFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class WindowFunctionCallContext extends FunctionCallContext { + public WindowFunctionClauseContext windowFunctionClause() { + return getRuleContext(WindowFunctionClauseContext.class,0); + } + public WindowFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterWindowFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitWindowFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AggregateFunctionCallContext extends FunctionCallContext { + public AggregateFunctionContext aggregateFunction() { + return getRuleContext(AggregateFunctionContext.class,0); + } + public AggregateFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAggregateFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAggregateFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class GetFormatFunctionCallContext extends FunctionCallContext { + public GetFormatFunctionContext getFormatFunction() { + return getRuleContext(GetFormatFunctionContext.class,0); + } + public GetFormatFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterGetFormatFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitGetFormatFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ScalarFunctionCallContext extends FunctionCallContext { + public ScalarFunctionNameContext scalarFunctionName() { + return getRuleContext(ScalarFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public FunctionArgsContext functionArgs() { + return getRuleContext(FunctionArgsContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public ScalarFunctionCallContext(FunctionCallContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterScalarFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitScalarFunctionCall(this); + } + } + + public final FunctionCallContext functionCall() throws RecognitionException { + FunctionCallContext _localctx = new FunctionCallContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_functionCall); + int _la; + try { + setState(625); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + case 1: + _localctx = new NestedAllFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(599); + nestedFunctionName(); + setState(600); + match(LR_BRACKET); + setState(601); + allTupleFields(); + setState(602); + match(RR_BRACKET); + } + break; + case 2: + _localctx = new ScalarFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(604); + scalarFunctionName(); + setState(605); + match(LR_BRACKET); + setState(606); + functionArgs(); + setState(607); + match(RR_BRACKET); + } + break; + case 3: + _localctx = new SpecificFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(609); + specificFunction(); + } + break; + case 4: + _localctx = new WindowFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(610); + windowFunctionClause(); + } + break; + case 5: + _localctx = new AggregateFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(611); + aggregateFunction(); + } + break; + case 6: + _localctx = new FilteredAggregationFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(612); + aggregateFunction(); + setState(614); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ORDER) { + { + setState(613); + orderByClause(); + } + } + + setState(616); + filterClause(); + } + break; + case 7: + _localctx = new ScoreRelevanceFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(618); + scoreRelevanceFunction(); + } + break; + case 8: + _localctx = new RelevanceFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 8); + { + setState(619); + relevanceFunction(); + } + break; + case 9: + _localctx = new HighlightFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 9); + { + setState(620); + highlightFunction(); + } + break; + case 10: + _localctx = new PositionFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 10); + { + setState(621); + positionFunction(); + } + break; + case 11: + _localctx = new ExtractFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 11); + { + setState(622); + extractFunction(); + } + break; + case 12: + _localctx = new GetFormatFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 12); + { + setState(623); + getFormatFunction(); + } + break; + case 13: + _localctx = new TimestampFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 13); + { + setState(624); + timestampFunction(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TimestampFunctionContext extends ParserRuleContext { + public FunctionArgContext firstArg; + public FunctionArgContext secondArg; + public TimestampFunctionNameContext timestampFunctionName() { + return getRuleContext(TimestampFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public SimpleDateTimePartContext simpleDateTimePart() { + return getRuleContext(SimpleDateTimePartContext.class,0); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public List functionArg() { + return getRuleContexts(FunctionArgContext.class); + } + public FunctionArgContext functionArg(int i) { + return getRuleContext(FunctionArgContext.class,i); + } + public TimestampFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_timestampFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTimestampFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTimestampFunction(this); + } + } + + public final TimestampFunctionContext timestampFunction() throws RecognitionException { + TimestampFunctionContext _localctx = new TimestampFunctionContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_timestampFunction); + try { + enterOuterAlt(_localctx, 1); + { + setState(627); + timestampFunctionName(); + setState(628); + match(LR_BRACKET); + setState(629); + simpleDateTimePart(); + setState(630); + match(COMMA); + setState(631); + ((TimestampFunctionContext)_localctx).firstArg = functionArg(); + setState(632); + match(COMMA); + setState(633); + ((TimestampFunctionContext)_localctx).secondArg = functionArg(); + setState(634); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TimestampFunctionNameContext extends ParserRuleContext { + public TerminalNode TIMESTAMPADD() { return getToken(OpenSearchSQLParser.TIMESTAMPADD, 0); } + public TerminalNode TIMESTAMPDIFF() { return getToken(OpenSearchSQLParser.TIMESTAMPDIFF, 0); } + public TimestampFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_timestampFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTimestampFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTimestampFunctionName(this); + } + } + + public final TimestampFunctionNameContext timestampFunctionName() throws RecognitionException { + TimestampFunctionNameContext _localctx = new TimestampFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_timestampFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(636); + _la = _input.LA(1); + if ( !(_la==TIMESTAMPADD || _la==TIMESTAMPDIFF) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GetFormatFunctionContext extends ParserRuleContext { + public TerminalNode GET_FORMAT() { return getToken(OpenSearchSQLParser.GET_FORMAT, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public GetFormatTypeContext getFormatType() { + return getRuleContext(GetFormatTypeContext.class,0); + } + public TerminalNode COMMA() { return getToken(OpenSearchSQLParser.COMMA, 0); } + public FunctionArgContext functionArg() { + return getRuleContext(FunctionArgContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public GetFormatFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_getFormatFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterGetFormatFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitGetFormatFunction(this); + } + } + + public final GetFormatFunctionContext getFormatFunction() throws RecognitionException { + GetFormatFunctionContext _localctx = new GetFormatFunctionContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_getFormatFunction); + try { + enterOuterAlt(_localctx, 1); + { + setState(638); + match(GET_FORMAT); + setState(639); + match(LR_BRACKET); + setState(640); + getFormatType(); + setState(641); + match(COMMA); + setState(642); + functionArg(); + setState(643); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GetFormatTypeContext extends ParserRuleContext { + public TerminalNode DATE() { return getToken(OpenSearchSQLParser.DATE, 0); } + public TerminalNode DATETIME() { return getToken(OpenSearchSQLParser.DATETIME, 0); } + public TerminalNode TIME() { return getToken(OpenSearchSQLParser.TIME, 0); } + public TerminalNode TIMESTAMP() { return getToken(OpenSearchSQLParser.TIMESTAMP, 0); } + public GetFormatTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_getFormatType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterGetFormatType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitGetFormatType(this); + } + } + + public final GetFormatTypeContext getFormatType() throws RecognitionException { + GetFormatTypeContext _localctx = new GetFormatTypeContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_getFormatType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(645); + _la = _input.LA(1); + if ( !(_la==DATETIME || _la==DATE || _la==TIME || _la==TIMESTAMP) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExtractFunctionContext extends ParserRuleContext { + public TerminalNode EXTRACT() { return getToken(OpenSearchSQLParser.EXTRACT, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public DatetimePartContext datetimePart() { + return getRuleContext(DatetimePartContext.class,0); + } + public TerminalNode FROM() { return getToken(OpenSearchSQLParser.FROM, 0); } + public FunctionArgContext functionArg() { + return getRuleContext(FunctionArgContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public ExtractFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_extractFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterExtractFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitExtractFunction(this); + } + } + + public final ExtractFunctionContext extractFunction() throws RecognitionException { + ExtractFunctionContext _localctx = new ExtractFunctionContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_extractFunction); + try { + enterOuterAlt(_localctx, 1); + { + setState(647); + match(EXTRACT); + setState(648); + match(LR_BRACKET); + setState(649); + datetimePart(); + setState(650); + match(FROM); + setState(651); + functionArg(); + setState(652); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SimpleDateTimePartContext extends ParserRuleContext { + public TerminalNode MICROSECOND() { return getToken(OpenSearchSQLParser.MICROSECOND, 0); } + public TerminalNode SECOND() { return getToken(OpenSearchSQLParser.SECOND, 0); } + public TerminalNode MINUTE() { return getToken(OpenSearchSQLParser.MINUTE, 0); } + public TerminalNode HOUR() { return getToken(OpenSearchSQLParser.HOUR, 0); } + public TerminalNode DAY() { return getToken(OpenSearchSQLParser.DAY, 0); } + public TerminalNode WEEK() { return getToken(OpenSearchSQLParser.WEEK, 0); } + public TerminalNode MONTH() { return getToken(OpenSearchSQLParser.MONTH, 0); } + public TerminalNode QUARTER() { return getToken(OpenSearchSQLParser.QUARTER, 0); } + public TerminalNode YEAR() { return getToken(OpenSearchSQLParser.YEAR, 0); } + public SimpleDateTimePartContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simpleDateTimePart; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSimpleDateTimePart(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSimpleDateTimePart(this); + } + } + + public final SimpleDateTimePartContext simpleDateTimePart() throws RecognitionException { + SimpleDateTimePartContext _localctx = new SimpleDateTimePartContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_simpleDateTimePart); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(654); + _la = _input.LA(1); + if ( !(((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & 511L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ComplexDateTimePartContext extends ParserRuleContext { + public TerminalNode SECOND_MICROSECOND() { return getToken(OpenSearchSQLParser.SECOND_MICROSECOND, 0); } + public TerminalNode MINUTE_MICROSECOND() { return getToken(OpenSearchSQLParser.MINUTE_MICROSECOND, 0); } + public TerminalNode MINUTE_SECOND() { return getToken(OpenSearchSQLParser.MINUTE_SECOND, 0); } + public TerminalNode HOUR_MICROSECOND() { return getToken(OpenSearchSQLParser.HOUR_MICROSECOND, 0); } + public TerminalNode HOUR_SECOND() { return getToken(OpenSearchSQLParser.HOUR_SECOND, 0); } + public TerminalNode HOUR_MINUTE() { return getToken(OpenSearchSQLParser.HOUR_MINUTE, 0); } + public TerminalNode DAY_MICROSECOND() { return getToken(OpenSearchSQLParser.DAY_MICROSECOND, 0); } + public TerminalNode DAY_SECOND() { return getToken(OpenSearchSQLParser.DAY_SECOND, 0); } + public TerminalNode DAY_MINUTE() { return getToken(OpenSearchSQLParser.DAY_MINUTE, 0); } + public TerminalNode DAY_HOUR() { return getToken(OpenSearchSQLParser.DAY_HOUR, 0); } + public TerminalNode YEAR_MONTH() { return getToken(OpenSearchSQLParser.YEAR_MONTH, 0); } + public ComplexDateTimePartContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_complexDateTimePart; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterComplexDateTimePart(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitComplexDateTimePart(this); + } + } + + public final ComplexDateTimePartContext complexDateTimePart() throws RecognitionException { + ComplexDateTimePartContext _localctx = new ComplexDateTimePartContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_complexDateTimePart); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(656); + _la = _input.LA(1); + if ( !(((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & 2047L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DatetimePartContext extends ParserRuleContext { + public SimpleDateTimePartContext simpleDateTimePart() { + return getRuleContext(SimpleDateTimePartContext.class,0); + } + public ComplexDateTimePartContext complexDateTimePart() { + return getRuleContext(ComplexDateTimePartContext.class,0); + } + public DatetimePartContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_datetimePart; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDatetimePart(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDatetimePart(this); + } + } + + public final DatetimePartContext datetimePart() throws RecognitionException { + DatetimePartContext _localctx = new DatetimePartContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_datetimePart); + try { + setState(660); + _errHandler.sync(this); + switch (_input.LA(1)) { + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + enterOuterAlt(_localctx, 1); + { + setState(658); + simpleDateTimePart(); + } + break; + case SECOND_MICROSECOND: + case MINUTE_MICROSECOND: + case MINUTE_SECOND: + case HOUR_MICROSECOND: + case HOUR_SECOND: + case HOUR_MINUTE: + case DAY_MICROSECOND: + case DAY_SECOND: + case DAY_MINUTE: + case DAY_HOUR: + case YEAR_MONTH: + enterOuterAlt(_localctx, 2); + { + setState(659); + complexDateTimePart(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HighlightFunctionContext extends ParserRuleContext { + public TerminalNode HIGHLIGHT() { return getToken(OpenSearchSQLParser.HIGHLIGHT, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public RelevanceFieldContext relevanceField() { + return getRuleContext(RelevanceFieldContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public List highlightArg() { + return getRuleContexts(HighlightArgContext.class); + } + public HighlightArgContext highlightArg(int i) { + return getRuleContext(HighlightArgContext.class,i); + } + public HighlightFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_highlightFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterHighlightFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitHighlightFunction(this); + } + } + + public final HighlightFunctionContext highlightFunction() throws RecognitionException { + HighlightFunctionContext _localctx = new HighlightFunctionContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_highlightFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(662); + match(HIGHLIGHT); + setState(663); + match(LR_BRACKET); + setState(664); + relevanceField(); + setState(669); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(665); + match(COMMA); + setState(666); + highlightArg(); + } + } + setState(671); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(672); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PositionFunctionContext extends ParserRuleContext { + public TerminalNode POSITION() { return getToken(OpenSearchSQLParser.POSITION, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public List functionArg() { + return getRuleContexts(FunctionArgContext.class); + } + public FunctionArgContext functionArg(int i) { + return getRuleContext(FunctionArgContext.class,i); + } + public TerminalNode IN() { return getToken(OpenSearchSQLParser.IN, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public PositionFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_positionFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterPositionFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitPositionFunction(this); + } + } + + public final PositionFunctionContext positionFunction() throws RecognitionException { + PositionFunctionContext _localctx = new PositionFunctionContext(_ctx, getState()); + enterRule(_localctx, 122, RULE_positionFunction); + try { + enterOuterAlt(_localctx, 1); + { + setState(674); + match(POSITION); + setState(675); + match(LR_BRACKET); + setState(676); + functionArg(); + setState(677); + match(IN); + setState(678); + functionArg(); + setState(679); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MatchQueryAltSyntaxFunctionContext extends ParserRuleContext { + public RelevanceFieldContext field; + public RelevanceQueryContext query; + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public TerminalNode MATCH_QUERY() { return getToken(OpenSearchSQLParser.MATCH_QUERY, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public RelevanceFieldContext relevanceField() { + return getRuleContext(RelevanceFieldContext.class,0); + } + public RelevanceQueryContext relevanceQuery() { + return getRuleContext(RelevanceQueryContext.class,0); + } + public MatchQueryAltSyntaxFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchQueryAltSyntaxFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterMatchQueryAltSyntaxFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitMatchQueryAltSyntaxFunction(this); + } + } + + public final MatchQueryAltSyntaxFunctionContext matchQueryAltSyntaxFunction() throws RecognitionException { + MatchQueryAltSyntaxFunctionContext _localctx = new MatchQueryAltSyntaxFunctionContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_matchQueryAltSyntaxFunction); + try { + enterOuterAlt(_localctx, 1); + { + setState(681); + ((MatchQueryAltSyntaxFunctionContext)_localctx).field = relevanceField(); + setState(682); + match(EQUAL_SYMBOL); + setState(683); + match(MATCH_QUERY); + setState(684); + match(LR_BRACKET); + setState(685); + ((MatchQueryAltSyntaxFunctionContext)_localctx).query = relevanceQuery(); + setState(686); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ScalarFunctionNameContext extends ParserRuleContext { + public MathematicalFunctionNameContext mathematicalFunctionName() { + return getRuleContext(MathematicalFunctionNameContext.class,0); + } + public DateTimeFunctionNameContext dateTimeFunctionName() { + return getRuleContext(DateTimeFunctionNameContext.class,0); + } + public TextFunctionNameContext textFunctionName() { + return getRuleContext(TextFunctionNameContext.class,0); + } + public FlowControlFunctionNameContext flowControlFunctionName() { + return getRuleContext(FlowControlFunctionNameContext.class,0); + } + public SystemFunctionNameContext systemFunctionName() { + return getRuleContext(SystemFunctionNameContext.class,0); + } + public NestedFunctionNameContext nestedFunctionName() { + return getRuleContext(NestedFunctionNameContext.class,0); + } + public ScalarFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_scalarFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterScalarFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitScalarFunctionName(this); + } + } + + public final ScalarFunctionNameContext scalarFunctionName() throws RecognitionException { + ScalarFunctionNameContext _localctx = new ScalarFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_scalarFunctionName); + try { + setState(694); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ABS: + case ACOS: + case ADD: + case ASIN: + case ATAN: + case ATAN2: + case CBRT: + case CEIL: + case CEILING: + case CONV: + case COS: + case COSH: + case COT: + case CRC32: + case DEGREES: + case DIVIDE: + case E: + case EXP: + case EXPM1: + case FLOOR: + case LN: + case LOG: + case LOG10: + case LOG2: + case MODULUS: + case MULTIPLY: + case PI: + case POW: + case POWER: + case RADIANS: + case RAND: + case RINT: + case ROUND: + case SIGN: + case SIGNUM: + case SIN: + case SINH: + case SQRT: + case SUBTRACT: + case TAN: + case TRUNCATE: + case MOD: + enterOuterAlt(_localctx, 1); + { + setState(688); + mathematicalFunctionName(); + } + break; + case DATETIME: + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + case ADDTIME: + case CONVERT_TZ: + case CURDATE: + case CURTIME: + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case DATE: + case DATE_ADD: + case DATE_FORMAT: + case DATE_SUB: + case DATEDIFF: + case DAYNAME: + case DAYOFMONTH: + case DAYOFWEEK: + case DAYOFYEAR: + case FROM_DAYS: + case FROM_UNIXTIME: + case LAST_DAY: + case LOCALTIME: + case LOCALTIMESTAMP: + case MAKEDATE: + case MAKETIME: + case MONTHNAME: + case NOW: + case PERIOD_ADD: + case PERIOD_DIFF: + case SEC_TO_TIME: + case STR_TO_DATE: + case SUBDATE: + case SUBTIME: + case SYSDATE: + case TIME: + case TIMEDIFF: + case TIME_FORMAT: + case TIME_TO_SEC: + case TIMESTAMP: + case TO_DAYS: + case TO_SECONDS: + case UNIX_TIMESTAMP: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + case HOUR_OF_DAY: + case MINUTE_OF_DAY: + case MINUTE_OF_HOUR: + case MONTH_OF_YEAR: + case SECOND_OF_MINUTE: + case WEEK_OF_YEAR: + case WEEKOFYEAR: + case WEEKDAY: + case ADDDATE: + case YEARWEEK: + enterOuterAlt(_localctx, 2); + { + setState(689); + dateTimeFunctionName(); + } + break; + case LEFT: + case RIGHT: + case SUBSTRING: + case TRIM: + case ASCII: + case CONCAT: + case CONCAT_WS: + case LENGTH: + case LOCATE: + case LOWER: + case LTRIM: + case REPLACE: + case RTRIM: + case REVERSE: + case UPPER: + case SUBSTR: + case STRCMP: + enterOuterAlt(_localctx, 3); + { + setState(690); + textFunctionName(); + } + break; + case IF: + case IFNULL: + case ISNULL: + case NULLIF: + enterOuterAlt(_localctx, 4); + { + setState(691); + flowControlFunctionName(); + } + break; + case TYPEOF: + enterOuterAlt(_localctx, 5); + { + setState(692); + systemFunctionName(); + } + break; + case NESTED: + enterOuterAlt(_localctx, 6); + { + setState(693); + nestedFunctionName(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SpecificFunctionContext extends ParserRuleContext { + public SpecificFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_specificFunction; } + + public SpecificFunctionContext() { } + public void copyFrom(SpecificFunctionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class CaseFunctionCallContext extends SpecificFunctionContext { + public FunctionArgContext elseArg; + public TerminalNode CASE() { return getToken(OpenSearchSQLParser.CASE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode END() { return getToken(OpenSearchSQLParser.END, 0); } + public List caseFuncAlternative() { + return getRuleContexts(CaseFuncAlternativeContext.class); + } + public CaseFuncAlternativeContext caseFuncAlternative(int i) { + return getRuleContext(CaseFuncAlternativeContext.class,i); + } + public TerminalNode ELSE() { return getToken(OpenSearchSQLParser.ELSE, 0); } + public FunctionArgContext functionArg() { + return getRuleContext(FunctionArgContext.class,0); + } + public CaseFunctionCallContext(SpecificFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterCaseFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitCaseFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DataTypeFunctionCallContext extends SpecificFunctionContext { + public TerminalNode CAST() { return getToken(OpenSearchSQLParser.CAST, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode AS() { return getToken(OpenSearchSQLParser.AS, 0); } + public ConvertedDataTypeContext convertedDataType() { + return getRuleContext(ConvertedDataTypeContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public DataTypeFunctionCallContext(SpecificFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDataTypeFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDataTypeFunctionCall(this); + } + } + + public final SpecificFunctionContext specificFunction() throws RecognitionException { + SpecificFunctionContext _localctx = new SpecificFunctionContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_specificFunction); + int _la; + try { + setState(728); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + case 1: + _localctx = new CaseFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(696); + match(CASE); + setState(697); + expression(0); + setState(699); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(698); + caseFuncAlternative(); + } + } + setState(701); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==WHEN ); + setState(705); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ELSE) { + { + setState(703); + match(ELSE); + setState(704); + ((CaseFunctionCallContext)_localctx).elseArg = functionArg(); + } + } + + setState(707); + match(END); + } + break; + case 2: + _localctx = new CaseFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(709); + match(CASE); + setState(711); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(710); + caseFuncAlternative(); + } + } + setState(713); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==WHEN ); + setState(717); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ELSE) { + { + setState(715); + match(ELSE); + setState(716); + ((CaseFunctionCallContext)_localctx).elseArg = functionArg(); + } + } + + setState(719); + match(END); + } + break; + case 3: + _localctx = new DataTypeFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(721); + match(CAST); + setState(722); + match(LR_BRACKET); + setState(723); + expression(0); + setState(724); + match(AS); + setState(725); + convertedDataType(); + setState(726); + match(RR_BRACKET); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceFunctionContext extends ParserRuleContext { + public NoFieldRelevanceFunctionContext noFieldRelevanceFunction() { + return getRuleContext(NoFieldRelevanceFunctionContext.class,0); + } + public SingleFieldRelevanceFunctionContext singleFieldRelevanceFunction() { + return getRuleContext(SingleFieldRelevanceFunctionContext.class,0); + } + public MultiFieldRelevanceFunctionContext multiFieldRelevanceFunction() { + return getRuleContext(MultiFieldRelevanceFunctionContext.class,0); + } + public AltSingleFieldRelevanceFunctionContext altSingleFieldRelevanceFunction() { + return getRuleContext(AltSingleFieldRelevanceFunctionContext.class,0); + } + public AltMultiFieldRelevanceFunctionContext altMultiFieldRelevanceFunction() { + return getRuleContext(AltMultiFieldRelevanceFunctionContext.class,0); + } + public RelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceFunction(this); + } + } + + public final RelevanceFunctionContext relevanceFunction() throws RecognitionException { + RelevanceFunctionContext _localctx = new RelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_relevanceFunction); + try { + setState(735); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(730); + noFieldRelevanceFunction(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(731); + singleFieldRelevanceFunction(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(732); + multiFieldRelevanceFunction(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(733); + altSingleFieldRelevanceFunction(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(734); + altMultiFieldRelevanceFunction(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ScoreRelevanceFunctionContext extends ParserRuleContext { + public RelevanceFieldWeightContext weight; + public ScoreRelevanceFunctionNameContext scoreRelevanceFunctionName() { + return getRuleContext(ScoreRelevanceFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public RelevanceFunctionContext relevanceFunction() { + return getRuleContext(RelevanceFunctionContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public TerminalNode COMMA() { return getToken(OpenSearchSQLParser.COMMA, 0); } + public RelevanceFieldWeightContext relevanceFieldWeight() { + return getRuleContext(RelevanceFieldWeightContext.class,0); + } + public ScoreRelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_scoreRelevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterScoreRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitScoreRelevanceFunction(this); + } + } + + public final ScoreRelevanceFunctionContext scoreRelevanceFunction() throws RecognitionException { + ScoreRelevanceFunctionContext _localctx = new ScoreRelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 132, RULE_scoreRelevanceFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(737); + scoreRelevanceFunctionName(); + setState(738); + match(LR_BRACKET); + setState(739); + relevanceFunction(); + setState(742); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(740); + match(COMMA); + setState(741); + ((ScoreRelevanceFunctionContext)_localctx).weight = relevanceFieldWeight(); + } + } + + setState(744); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NoFieldRelevanceFunctionContext extends ParserRuleContext { + public RelevanceQueryContext query; + public NoFieldRelevanceFunctionNameContext noFieldRelevanceFunctionName() { + return getRuleContext(NoFieldRelevanceFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public RelevanceQueryContext relevanceQuery() { + return getRuleContext(RelevanceQueryContext.class,0); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public List relevanceArg() { + return getRuleContexts(RelevanceArgContext.class); + } + public RelevanceArgContext relevanceArg(int i) { + return getRuleContext(RelevanceArgContext.class,i); + } + public NoFieldRelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_noFieldRelevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNoFieldRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNoFieldRelevanceFunction(this); + } + } + + public final NoFieldRelevanceFunctionContext noFieldRelevanceFunction() throws RecognitionException { + NoFieldRelevanceFunctionContext _localctx = new NoFieldRelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 134, RULE_noFieldRelevanceFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(746); + noFieldRelevanceFunctionName(); + setState(747); + match(LR_BRACKET); + setState(748); + ((NoFieldRelevanceFunctionContext)_localctx).query = relevanceQuery(); + setState(753); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(749); + match(COMMA); + setState(750); + relevanceArg(); + } + } + setState(755); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(756); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SingleFieldRelevanceFunctionContext extends ParserRuleContext { + public RelevanceFieldContext field; + public RelevanceQueryContext query; + public SingleFieldRelevanceFunctionNameContext singleFieldRelevanceFunctionName() { + return getRuleContext(SingleFieldRelevanceFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public RelevanceFieldContext relevanceField() { + return getRuleContext(RelevanceFieldContext.class,0); + } + public RelevanceQueryContext relevanceQuery() { + return getRuleContext(RelevanceQueryContext.class,0); + } + public List relevanceArg() { + return getRuleContexts(RelevanceArgContext.class); + } + public RelevanceArgContext relevanceArg(int i) { + return getRuleContext(RelevanceArgContext.class,i); + } + public SingleFieldRelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleFieldRelevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSingleFieldRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSingleFieldRelevanceFunction(this); + } + } + + public final SingleFieldRelevanceFunctionContext singleFieldRelevanceFunction() throws RecognitionException { + SingleFieldRelevanceFunctionContext _localctx = new SingleFieldRelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 136, RULE_singleFieldRelevanceFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(758); + singleFieldRelevanceFunctionName(); + setState(759); + match(LR_BRACKET); + setState(760); + ((SingleFieldRelevanceFunctionContext)_localctx).field = relevanceField(); + setState(761); + match(COMMA); + setState(762); + ((SingleFieldRelevanceFunctionContext)_localctx).query = relevanceQuery(); + setState(767); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(763); + match(COMMA); + setState(764); + relevanceArg(); + } + } + setState(769); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(770); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MultiFieldRelevanceFunctionContext extends ParserRuleContext { + public RelevanceFieldAndWeightContext field; + public RelevanceQueryContext query; + public MultiFieldRelevanceFunctionNameContext multiFieldRelevanceFunctionName() { + return getRuleContext(MultiFieldRelevanceFunctionNameContext.class,0); + } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode LT_SQR_PRTHS() { return getToken(OpenSearchSQLParser.LT_SQR_PRTHS, 0); } + public TerminalNode RT_SQR_PRTHS() { return getToken(OpenSearchSQLParser.RT_SQR_PRTHS, 0); } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public List relevanceFieldAndWeight() { + return getRuleContexts(RelevanceFieldAndWeightContext.class); + } + public RelevanceFieldAndWeightContext relevanceFieldAndWeight(int i) { + return getRuleContext(RelevanceFieldAndWeightContext.class,i); + } + public RelevanceQueryContext relevanceQuery() { + return getRuleContext(RelevanceQueryContext.class,0); + } + public List relevanceArg() { + return getRuleContexts(RelevanceArgContext.class); + } + public RelevanceArgContext relevanceArg(int i) { + return getRuleContext(RelevanceArgContext.class,i); + } + public AlternateMultiMatchQueryContext alternateMultiMatchQuery() { + return getRuleContext(AlternateMultiMatchQueryContext.class,0); + } + public AlternateMultiMatchFieldContext alternateMultiMatchField() { + return getRuleContext(AlternateMultiMatchFieldContext.class,0); + } + public MultiFieldRelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiFieldRelevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterMultiFieldRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitMultiFieldRelevanceFunction(this); + } + } + + public final MultiFieldRelevanceFunctionContext multiFieldRelevanceFunction() throws RecognitionException { + MultiFieldRelevanceFunctionContext _localctx = new MultiFieldRelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 138, RULE_multiFieldRelevanceFunction); + int _la; + try { + setState(809); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(772); + multiFieldRelevanceFunctionName(); + setState(773); + match(LR_BRACKET); + setState(774); + match(LT_SQR_PRTHS); + setState(775); + ((MultiFieldRelevanceFunctionContext)_localctx).field = relevanceFieldAndWeight(); + setState(780); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(776); + match(COMMA); + setState(777); + ((MultiFieldRelevanceFunctionContext)_localctx).field = relevanceFieldAndWeight(); + } + } + setState(782); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(783); + match(RT_SQR_PRTHS); + setState(784); + match(COMMA); + setState(785); + ((MultiFieldRelevanceFunctionContext)_localctx).query = relevanceQuery(); + setState(790); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(786); + match(COMMA); + setState(787); + relevanceArg(); + } + } + setState(792); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(793); + match(RR_BRACKET); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(795); + multiFieldRelevanceFunctionName(); + setState(796); + match(LR_BRACKET); + setState(797); + alternateMultiMatchQuery(); + setState(798); + match(COMMA); + setState(799); + alternateMultiMatchField(); + setState(804); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(800); + match(COMMA); + setState(801); + relevanceArg(); + } + } + setState(806); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(807); + match(RR_BRACKET); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AltSingleFieldRelevanceFunctionContext extends ParserRuleContext { + public RelevanceFieldContext field; + public AltSingleFieldRelevanceFunctionNameContext altSyntaxFunctionName; + public RelevanceQueryContext query; + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public RelevanceFieldContext relevanceField() { + return getRuleContext(RelevanceFieldContext.class,0); + } + public AltSingleFieldRelevanceFunctionNameContext altSingleFieldRelevanceFunctionName() { + return getRuleContext(AltSingleFieldRelevanceFunctionNameContext.class,0); + } + public RelevanceQueryContext relevanceQuery() { + return getRuleContext(RelevanceQueryContext.class,0); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public List relevanceArg() { + return getRuleContexts(RelevanceArgContext.class); + } + public RelevanceArgContext relevanceArg(int i) { + return getRuleContext(RelevanceArgContext.class,i); + } + public AltSingleFieldRelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_altSingleFieldRelevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAltSingleFieldRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAltSingleFieldRelevanceFunction(this); + } + } + + public final AltSingleFieldRelevanceFunctionContext altSingleFieldRelevanceFunction() throws RecognitionException { + AltSingleFieldRelevanceFunctionContext _localctx = new AltSingleFieldRelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 140, RULE_altSingleFieldRelevanceFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(811); + ((AltSingleFieldRelevanceFunctionContext)_localctx).field = relevanceField(); + setState(812); + match(EQUAL_SYMBOL); + setState(813); + ((AltSingleFieldRelevanceFunctionContext)_localctx).altSyntaxFunctionName = altSingleFieldRelevanceFunctionName(); + setState(814); + match(LR_BRACKET); + setState(815); + ((AltSingleFieldRelevanceFunctionContext)_localctx).query = relevanceQuery(); + setState(820); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(816); + match(COMMA); + setState(817); + relevanceArg(); + } + } + setState(822); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(823); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AltMultiFieldRelevanceFunctionContext extends ParserRuleContext { + public RelevanceFieldContext field; + public AltMultiFieldRelevanceFunctionNameContext altSyntaxFunctionName; + public RelevanceQueryContext query; + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public RelevanceFieldContext relevanceField() { + return getRuleContext(RelevanceFieldContext.class,0); + } + public AltMultiFieldRelevanceFunctionNameContext altMultiFieldRelevanceFunctionName() { + return getRuleContext(AltMultiFieldRelevanceFunctionNameContext.class,0); + } + public RelevanceQueryContext relevanceQuery() { + return getRuleContext(RelevanceQueryContext.class,0); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public List relevanceArg() { + return getRuleContexts(RelevanceArgContext.class); + } + public RelevanceArgContext relevanceArg(int i) { + return getRuleContext(RelevanceArgContext.class,i); + } + public AltMultiFieldRelevanceFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_altMultiFieldRelevanceFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAltMultiFieldRelevanceFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAltMultiFieldRelevanceFunction(this); + } + } + + public final AltMultiFieldRelevanceFunctionContext altMultiFieldRelevanceFunction() throws RecognitionException { + AltMultiFieldRelevanceFunctionContext _localctx = new AltMultiFieldRelevanceFunctionContext(_ctx, getState()); + enterRule(_localctx, 142, RULE_altMultiFieldRelevanceFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(825); + ((AltMultiFieldRelevanceFunctionContext)_localctx).field = relevanceField(); + setState(826); + match(EQUAL_SYMBOL); + setState(827); + ((AltMultiFieldRelevanceFunctionContext)_localctx).altSyntaxFunctionName = altMultiFieldRelevanceFunctionName(); + setState(828); + match(LR_BRACKET); + setState(829); + ((AltMultiFieldRelevanceFunctionContext)_localctx).query = relevanceQuery(); + setState(834); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(830); + match(COMMA); + setState(831); + relevanceArg(); + } + } + setState(836); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(837); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConvertedDataTypeContext extends ParserRuleContext { + public Token typeName; + public TerminalNode DATE() { return getToken(OpenSearchSQLParser.DATE, 0); } + public TerminalNode TIME() { return getToken(OpenSearchSQLParser.TIME, 0); } + public TerminalNode TIMESTAMP() { return getToken(OpenSearchSQLParser.TIMESTAMP, 0); } + public TerminalNode INT() { return getToken(OpenSearchSQLParser.INT, 0); } + public TerminalNode INTEGER() { return getToken(OpenSearchSQLParser.INTEGER, 0); } + public TerminalNode DOUBLE() { return getToken(OpenSearchSQLParser.DOUBLE, 0); } + public TerminalNode LONG() { return getToken(OpenSearchSQLParser.LONG, 0); } + public TerminalNode FLOAT() { return getToken(OpenSearchSQLParser.FLOAT, 0); } + public TerminalNode STRING() { return getToken(OpenSearchSQLParser.STRING, 0); } + public TerminalNode BOOLEAN() { return getToken(OpenSearchSQLParser.BOOLEAN, 0); } + public ConvertedDataTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_convertedDataType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterConvertedDataType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitConvertedDataType(this); + } + } + + public final ConvertedDataTypeContext convertedDataType() throws RecognitionException { + ConvertedDataTypeContext _localctx = new ConvertedDataTypeContext(_ctx, getState()); + enterRule(_localctx, 144, RULE_convertedDataType); + try { + setState(849); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DATE: + enterOuterAlt(_localctx, 1); + { + setState(839); + ((ConvertedDataTypeContext)_localctx).typeName = match(DATE); + } + break; + case TIME: + enterOuterAlt(_localctx, 2); + { + setState(840); + ((ConvertedDataTypeContext)_localctx).typeName = match(TIME); + } + break; + case TIMESTAMP: + enterOuterAlt(_localctx, 3); + { + setState(841); + ((ConvertedDataTypeContext)_localctx).typeName = match(TIMESTAMP); + } + break; + case INT: + enterOuterAlt(_localctx, 4); + { + setState(842); + ((ConvertedDataTypeContext)_localctx).typeName = match(INT); + } + break; + case INTEGER: + enterOuterAlt(_localctx, 5); + { + setState(843); + ((ConvertedDataTypeContext)_localctx).typeName = match(INTEGER); + } + break; + case DOUBLE: + enterOuterAlt(_localctx, 6); + { + setState(844); + ((ConvertedDataTypeContext)_localctx).typeName = match(DOUBLE); + } + break; + case LONG: + enterOuterAlt(_localctx, 7); + { + setState(845); + ((ConvertedDataTypeContext)_localctx).typeName = match(LONG); + } + break; + case FLOAT: + enterOuterAlt(_localctx, 8); + { + setState(846); + ((ConvertedDataTypeContext)_localctx).typeName = match(FLOAT); + } + break; + case STRING: + enterOuterAlt(_localctx, 9); + { + setState(847); + ((ConvertedDataTypeContext)_localctx).typeName = match(STRING); + } + break; + case BOOLEAN: + enterOuterAlt(_localctx, 10); + { + setState(848); + ((ConvertedDataTypeContext)_localctx).typeName = match(BOOLEAN); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CaseFuncAlternativeContext extends ParserRuleContext { + public FunctionArgContext condition; + public FunctionArgContext consequent; + public TerminalNode WHEN() { return getToken(OpenSearchSQLParser.WHEN, 0); } + public TerminalNode THEN() { return getToken(OpenSearchSQLParser.THEN, 0); } + public List functionArg() { + return getRuleContexts(FunctionArgContext.class); + } + public FunctionArgContext functionArg(int i) { + return getRuleContext(FunctionArgContext.class,i); + } + public CaseFuncAlternativeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_caseFuncAlternative; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterCaseFuncAlternative(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitCaseFuncAlternative(this); + } + } + + public final CaseFuncAlternativeContext caseFuncAlternative() throws RecognitionException { + CaseFuncAlternativeContext _localctx = new CaseFuncAlternativeContext(_ctx, getState()); + enterRule(_localctx, 146, RULE_caseFuncAlternative); + try { + enterOuterAlt(_localctx, 1); + { + setState(851); + match(WHEN); + setState(852); + ((CaseFuncAlternativeContext)_localctx).condition = functionArg(); + setState(853); + match(THEN); + setState(854); + ((CaseFuncAlternativeContext)_localctx).consequent = functionArg(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AggregateFunctionContext extends ParserRuleContext { + public AggregateFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_aggregateFunction; } + + public AggregateFunctionContext() { } + public void copyFrom(AggregateFunctionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DistinctCountFunctionCallContext extends AggregateFunctionContext { + public TerminalNode COUNT() { return getToken(OpenSearchSQLParser.COUNT, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode DISTINCT() { return getToken(OpenSearchSQLParser.DISTINCT, 0); } + public FunctionArgContext functionArg() { + return getRuleContext(FunctionArgContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public DistinctCountFunctionCallContext(AggregateFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDistinctCountFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDistinctCountFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class PercentileApproxFunctionCallContext extends AggregateFunctionContext { + public PercentileApproxFunctionContext percentileApproxFunction() { + return getRuleContext(PercentileApproxFunctionContext.class,0); + } + public PercentileApproxFunctionCallContext(AggregateFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterPercentileApproxFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitPercentileApproxFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class CountStarFunctionCallContext extends AggregateFunctionContext { + public TerminalNode COUNT() { return getToken(OpenSearchSQLParser.COUNT, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode STAR() { return getToken(OpenSearchSQLParser.STAR, 0); } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public CountStarFunctionCallContext(AggregateFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterCountStarFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitCountStarFunctionCall(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class RegularAggregateFunctionCallContext extends AggregateFunctionContext { + public AggregationFunctionNameContext functionName; + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public FunctionArgContext functionArg() { + return getRuleContext(FunctionArgContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public AggregationFunctionNameContext aggregationFunctionName() { + return getRuleContext(AggregationFunctionNameContext.class,0); + } + public RegularAggregateFunctionCallContext(AggregateFunctionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRegularAggregateFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRegularAggregateFunctionCall(this); + } + } + + public final AggregateFunctionContext aggregateFunction() throws RecognitionException { + AggregateFunctionContext _localctx = new AggregateFunctionContext(_ctx, getState()); + enterRule(_localctx, 148, RULE_aggregateFunction); + try { + setState(872); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + case 1: + _localctx = new RegularAggregateFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(856); + ((RegularAggregateFunctionCallContext)_localctx).functionName = aggregationFunctionName(); + setState(857); + match(LR_BRACKET); + setState(858); + functionArg(); + setState(859); + match(RR_BRACKET); + } + break; + case 2: + _localctx = new CountStarFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(861); + match(COUNT); + setState(862); + match(LR_BRACKET); + setState(863); + match(STAR); + setState(864); + match(RR_BRACKET); + } + break; + case 3: + _localctx = new DistinctCountFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(865); + match(COUNT); + setState(866); + match(LR_BRACKET); + setState(867); + match(DISTINCT); + setState(868); + functionArg(); + setState(869); + match(RR_BRACKET); + } + break; + case 4: + _localctx = new PercentileApproxFunctionCallContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(871); + percentileApproxFunction(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PercentileApproxFunctionContext extends ParserRuleContext { + public FunctionArgContext aggField; + public NumericLiteralContext percent; + public NumericLiteralContext compression; + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public TerminalNode PERCENTILE() { return getToken(OpenSearchSQLParser.PERCENTILE, 0); } + public TerminalNode PERCENTILE_APPROX() { return getToken(OpenSearchSQLParser.PERCENTILE_APPROX, 0); } + public FunctionArgContext functionArg() { + return getRuleContext(FunctionArgContext.class,0); + } + public List numericLiteral() { + return getRuleContexts(NumericLiteralContext.class); + } + public NumericLiteralContext numericLiteral(int i) { + return getRuleContext(NumericLiteralContext.class,i); + } + public PercentileApproxFunctionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_percentileApproxFunction; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterPercentileApproxFunction(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitPercentileApproxFunction(this); + } + } + + public final PercentileApproxFunctionContext percentileApproxFunction() throws RecognitionException { + PercentileApproxFunctionContext _localctx = new PercentileApproxFunctionContext(_ctx, getState()); + enterRule(_localctx, 150, RULE_percentileApproxFunction); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(874); + _la = _input.LA(1); + if ( !(_la==PERCENTILE || _la==PERCENTILE_APPROX) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(875); + match(LR_BRACKET); + setState(876); + ((PercentileApproxFunctionContext)_localctx).aggField = functionArg(); + setState(877); + match(COMMA); + setState(878); + ((PercentileApproxFunctionContext)_localctx).percent = numericLiteral(); + setState(881); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(879); + match(COMMA); + setState(880); + ((PercentileApproxFunctionContext)_localctx).compression = numericLiteral(); + } + } + + setState(883); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FilterClauseContext extends ParserRuleContext { + public TerminalNode FILTER() { return getToken(OpenSearchSQLParser.FILTER, 0); } + public TerminalNode LR_BRACKET() { return getToken(OpenSearchSQLParser.LR_BRACKET, 0); } + public TerminalNode WHERE() { return getToken(OpenSearchSQLParser.WHERE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode RR_BRACKET() { return getToken(OpenSearchSQLParser.RR_BRACKET, 0); } + public FilterClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_filterClause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFilterClause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFilterClause(this); + } + } + + public final FilterClauseContext filterClause() throws RecognitionException { + FilterClauseContext _localctx = new FilterClauseContext(_ctx, getState()); + enterRule(_localctx, 152, RULE_filterClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(885); + match(FILTER); + setState(886); + match(LR_BRACKET); + setState(887); + match(WHERE); + setState(888); + expression(0); + setState(889); + match(RR_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AggregationFunctionNameContext extends ParserRuleContext { + public TerminalNode AVG() { return getToken(OpenSearchSQLParser.AVG, 0); } + public TerminalNode COUNT() { return getToken(OpenSearchSQLParser.COUNT, 0); } + public TerminalNode SUM() { return getToken(OpenSearchSQLParser.SUM, 0); } + public TerminalNode MIN() { return getToken(OpenSearchSQLParser.MIN, 0); } + public TerminalNode MAX() { return getToken(OpenSearchSQLParser.MAX, 0); } + public TerminalNode VAR_POP() { return getToken(OpenSearchSQLParser.VAR_POP, 0); } + public TerminalNode VAR_SAMP() { return getToken(OpenSearchSQLParser.VAR_SAMP, 0); } + public TerminalNode VARIANCE() { return getToken(OpenSearchSQLParser.VARIANCE, 0); } + public TerminalNode STD() { return getToken(OpenSearchSQLParser.STD, 0); } + public TerminalNode STDDEV() { return getToken(OpenSearchSQLParser.STDDEV, 0); } + public TerminalNode STDDEV_POP() { return getToken(OpenSearchSQLParser.STDDEV_POP, 0); } + public TerminalNode STDDEV_SAMP() { return getToken(OpenSearchSQLParser.STDDEV_SAMP, 0); } + public AggregationFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_aggregationFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAggregationFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAggregationFunctionName(this); + } + } + + public final AggregationFunctionNameContext aggregationFunctionName() throws RecognitionException { + AggregationFunctionNameContext _localctx = new AggregationFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 154, RULE_aggregationFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(891); + _la = _input.LA(1); + if ( !(((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 4095L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MathematicalFunctionNameContext extends ParserRuleContext { + public TerminalNode ABS() { return getToken(OpenSearchSQLParser.ABS, 0); } + public TerminalNode CBRT() { return getToken(OpenSearchSQLParser.CBRT, 0); } + public TerminalNode CEIL() { return getToken(OpenSearchSQLParser.CEIL, 0); } + public TerminalNode CEILING() { return getToken(OpenSearchSQLParser.CEILING, 0); } + public TerminalNode CONV() { return getToken(OpenSearchSQLParser.CONV, 0); } + public TerminalNode CRC32() { return getToken(OpenSearchSQLParser.CRC32, 0); } + public TerminalNode E() { return getToken(OpenSearchSQLParser.E, 0); } + public TerminalNode EXP() { return getToken(OpenSearchSQLParser.EXP, 0); } + public TerminalNode EXPM1() { return getToken(OpenSearchSQLParser.EXPM1, 0); } + public TerminalNode FLOOR() { return getToken(OpenSearchSQLParser.FLOOR, 0); } + public TerminalNode LN() { return getToken(OpenSearchSQLParser.LN, 0); } + public TerminalNode LOG() { return getToken(OpenSearchSQLParser.LOG, 0); } + public TerminalNode LOG10() { return getToken(OpenSearchSQLParser.LOG10, 0); } + public TerminalNode LOG2() { return getToken(OpenSearchSQLParser.LOG2, 0); } + public TerminalNode MOD() { return getToken(OpenSearchSQLParser.MOD, 0); } + public TerminalNode PI() { return getToken(OpenSearchSQLParser.PI, 0); } + public TerminalNode POW() { return getToken(OpenSearchSQLParser.POW, 0); } + public TerminalNode POWER() { return getToken(OpenSearchSQLParser.POWER, 0); } + public TerminalNode RAND() { return getToken(OpenSearchSQLParser.RAND, 0); } + public TerminalNode RINT() { return getToken(OpenSearchSQLParser.RINT, 0); } + public TerminalNode ROUND() { return getToken(OpenSearchSQLParser.ROUND, 0); } + public TerminalNode SIGN() { return getToken(OpenSearchSQLParser.SIGN, 0); } + public TerminalNode SIGNUM() { return getToken(OpenSearchSQLParser.SIGNUM, 0); } + public TerminalNode SQRT() { return getToken(OpenSearchSQLParser.SQRT, 0); } + public TerminalNode TRUNCATE() { return getToken(OpenSearchSQLParser.TRUNCATE, 0); } + public TrigonometricFunctionNameContext trigonometricFunctionName() { + return getRuleContext(TrigonometricFunctionNameContext.class,0); + } + public ArithmeticFunctionNameContext arithmeticFunctionName() { + return getRuleContext(ArithmeticFunctionNameContext.class,0); + } + public MathematicalFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mathematicalFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterMathematicalFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitMathematicalFunctionName(this); + } + } + + public final MathematicalFunctionNameContext mathematicalFunctionName() throws RecognitionException { + MathematicalFunctionNameContext _localctx = new MathematicalFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 156, RULE_mathematicalFunctionName); + try { + setState(920); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(893); + match(ABS); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(894); + match(CBRT); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(895); + match(CEIL); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(896); + match(CEILING); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(897); + match(CONV); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(898); + match(CRC32); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(899); + match(E); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(900); + match(EXP); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(901); + match(EXPM1); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(902); + match(FLOOR); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(903); + match(LN); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(904); + match(LOG); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(905); + match(LOG10); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(906); + match(LOG2); + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(907); + match(MOD); + } + break; + case 16: + enterOuterAlt(_localctx, 16); + { + setState(908); + match(PI); + } + break; + case 17: + enterOuterAlt(_localctx, 17); + { + setState(909); + match(POW); + } + break; + case 18: + enterOuterAlt(_localctx, 18); + { + setState(910); + match(POWER); + } + break; + case 19: + enterOuterAlt(_localctx, 19); + { + setState(911); + match(RAND); + } + break; + case 20: + enterOuterAlt(_localctx, 20); + { + setState(912); + match(RINT); + } + break; + case 21: + enterOuterAlt(_localctx, 21); + { + setState(913); + match(ROUND); + } + break; + case 22: + enterOuterAlt(_localctx, 22); + { + setState(914); + match(SIGN); + } + break; + case 23: + enterOuterAlt(_localctx, 23); + { + setState(915); + match(SIGNUM); + } + break; + case 24: + enterOuterAlt(_localctx, 24); + { + setState(916); + match(SQRT); + } + break; + case 25: + enterOuterAlt(_localctx, 25); + { + setState(917); + match(TRUNCATE); + } + break; + case 26: + enterOuterAlt(_localctx, 26); + { + setState(918); + trigonometricFunctionName(); + } + break; + case 27: + enterOuterAlt(_localctx, 27); + { + setState(919); + arithmeticFunctionName(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TrigonometricFunctionNameContext extends ParserRuleContext { + public TerminalNode ACOS() { return getToken(OpenSearchSQLParser.ACOS, 0); } + public TerminalNode ASIN() { return getToken(OpenSearchSQLParser.ASIN, 0); } + public TerminalNode ATAN() { return getToken(OpenSearchSQLParser.ATAN, 0); } + public TerminalNode ATAN2() { return getToken(OpenSearchSQLParser.ATAN2, 0); } + public TerminalNode COS() { return getToken(OpenSearchSQLParser.COS, 0); } + public TerminalNode COSH() { return getToken(OpenSearchSQLParser.COSH, 0); } + public TerminalNode COT() { return getToken(OpenSearchSQLParser.COT, 0); } + public TerminalNode DEGREES() { return getToken(OpenSearchSQLParser.DEGREES, 0); } + public TerminalNode RADIANS() { return getToken(OpenSearchSQLParser.RADIANS, 0); } + public TerminalNode SIN() { return getToken(OpenSearchSQLParser.SIN, 0); } + public TerminalNode SINH() { return getToken(OpenSearchSQLParser.SINH, 0); } + public TerminalNode TAN() { return getToken(OpenSearchSQLParser.TAN, 0); } + public TrigonometricFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_trigonometricFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTrigonometricFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTrigonometricFunctionName(this); + } + } + + public final TrigonometricFunctionNameContext trigonometricFunctionName() throws RecognitionException { + TrigonometricFunctionNameContext _localctx = new TrigonometricFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 158, RULE_trigonometricFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(922); + _la = _input.LA(1); + if ( !(((((_la - 105)) & ~0x3f) == 0 && ((1L << (_la - 105)) & 4295082097L) != 0) || ((((_la - 174)) & ~0x3f) == 0 && ((1L << (_la - 174)) & 265217L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArithmeticFunctionNameContext extends ParserRuleContext { + public TerminalNode ADD() { return getToken(OpenSearchSQLParser.ADD, 0); } + public TerminalNode SUBTRACT() { return getToken(OpenSearchSQLParser.SUBTRACT, 0); } + public TerminalNode MULTIPLY() { return getToken(OpenSearchSQLParser.MULTIPLY, 0); } + public TerminalNode DIVIDE() { return getToken(OpenSearchSQLParser.DIVIDE, 0); } + public TerminalNode MOD() { return getToken(OpenSearchSQLParser.MOD, 0); } + public TerminalNode MODULUS() { return getToken(OpenSearchSQLParser.MODULUS, 0); } + public ArithmeticFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arithmeticFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterArithmeticFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitArithmeticFunctionName(this); + } + } + + public final ArithmeticFunctionNameContext arithmeticFunctionName() throws RecognitionException { + ArithmeticFunctionNameContext _localctx = new ArithmeticFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 160, RULE_arithmeticFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(924); + _la = _input.LA(1); + if ( !(((((_la - 106)) & ~0x3f) == 0 && ((1L << (_la - 106)) & 720575944674246657L) != 0) || _la==SUBTRACT || _la==MOD) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DateTimeFunctionNameContext extends ParserRuleContext { + public DatetimeConstantLiteralContext datetimeConstantLiteral() { + return getRuleContext(DatetimeConstantLiteralContext.class,0); + } + public TerminalNode ADDDATE() { return getToken(OpenSearchSQLParser.ADDDATE, 0); } + public TerminalNode ADDTIME() { return getToken(OpenSearchSQLParser.ADDTIME, 0); } + public TerminalNode CONVERT_TZ() { return getToken(OpenSearchSQLParser.CONVERT_TZ, 0); } + public TerminalNode CURDATE() { return getToken(OpenSearchSQLParser.CURDATE, 0); } + public TerminalNode CURTIME() { return getToken(OpenSearchSQLParser.CURTIME, 0); } + public TerminalNode DATE() { return getToken(OpenSearchSQLParser.DATE, 0); } + public TerminalNode DATE_ADD() { return getToken(OpenSearchSQLParser.DATE_ADD, 0); } + public TerminalNode DATE_FORMAT() { return getToken(OpenSearchSQLParser.DATE_FORMAT, 0); } + public TerminalNode DATE_SUB() { return getToken(OpenSearchSQLParser.DATE_SUB, 0); } + public TerminalNode DATEDIFF() { return getToken(OpenSearchSQLParser.DATEDIFF, 0); } + public TerminalNode DATETIME() { return getToken(OpenSearchSQLParser.DATETIME, 0); } + public TerminalNode DAY() { return getToken(OpenSearchSQLParser.DAY, 0); } + public TerminalNode DAYNAME() { return getToken(OpenSearchSQLParser.DAYNAME, 0); } + public TerminalNode DAYOFMONTH() { return getToken(OpenSearchSQLParser.DAYOFMONTH, 0); } + public TerminalNode DAY_OF_MONTH() { return getToken(OpenSearchSQLParser.DAY_OF_MONTH, 0); } + public TerminalNode DAYOFWEEK() { return getToken(OpenSearchSQLParser.DAYOFWEEK, 0); } + public TerminalNode DAYOFYEAR() { return getToken(OpenSearchSQLParser.DAYOFYEAR, 0); } + public TerminalNode DAY_OF_YEAR() { return getToken(OpenSearchSQLParser.DAY_OF_YEAR, 0); } + public TerminalNode DAY_OF_WEEK() { return getToken(OpenSearchSQLParser.DAY_OF_WEEK, 0); } + public TerminalNode FROM_DAYS() { return getToken(OpenSearchSQLParser.FROM_DAYS, 0); } + public TerminalNode FROM_UNIXTIME() { return getToken(OpenSearchSQLParser.FROM_UNIXTIME, 0); } + public TerminalNode HOUR() { return getToken(OpenSearchSQLParser.HOUR, 0); } + public TerminalNode HOUR_OF_DAY() { return getToken(OpenSearchSQLParser.HOUR_OF_DAY, 0); } + public TerminalNode LAST_DAY() { return getToken(OpenSearchSQLParser.LAST_DAY, 0); } + public TerminalNode MAKEDATE() { return getToken(OpenSearchSQLParser.MAKEDATE, 0); } + public TerminalNode MAKETIME() { return getToken(OpenSearchSQLParser.MAKETIME, 0); } + public TerminalNode MICROSECOND() { return getToken(OpenSearchSQLParser.MICROSECOND, 0); } + public TerminalNode MINUTE() { return getToken(OpenSearchSQLParser.MINUTE, 0); } + public TerminalNode MINUTE_OF_DAY() { return getToken(OpenSearchSQLParser.MINUTE_OF_DAY, 0); } + public TerminalNode MINUTE_OF_HOUR() { return getToken(OpenSearchSQLParser.MINUTE_OF_HOUR, 0); } + public TerminalNode MONTH() { return getToken(OpenSearchSQLParser.MONTH, 0); } + public TerminalNode MONTHNAME() { return getToken(OpenSearchSQLParser.MONTHNAME, 0); } + public TerminalNode MONTH_OF_YEAR() { return getToken(OpenSearchSQLParser.MONTH_OF_YEAR, 0); } + public TerminalNode NOW() { return getToken(OpenSearchSQLParser.NOW, 0); } + public TerminalNode PERIOD_ADD() { return getToken(OpenSearchSQLParser.PERIOD_ADD, 0); } + public TerminalNode PERIOD_DIFF() { return getToken(OpenSearchSQLParser.PERIOD_DIFF, 0); } + public TerminalNode QUARTER() { return getToken(OpenSearchSQLParser.QUARTER, 0); } + public TerminalNode SEC_TO_TIME() { return getToken(OpenSearchSQLParser.SEC_TO_TIME, 0); } + public TerminalNode SECOND() { return getToken(OpenSearchSQLParser.SECOND, 0); } + public TerminalNode SECOND_OF_MINUTE() { return getToken(OpenSearchSQLParser.SECOND_OF_MINUTE, 0); } + public TerminalNode SUBDATE() { return getToken(OpenSearchSQLParser.SUBDATE, 0); } + public TerminalNode SUBTIME() { return getToken(OpenSearchSQLParser.SUBTIME, 0); } + public TerminalNode SYSDATE() { return getToken(OpenSearchSQLParser.SYSDATE, 0); } + public TerminalNode STR_TO_DATE() { return getToken(OpenSearchSQLParser.STR_TO_DATE, 0); } + public TerminalNode TIME() { return getToken(OpenSearchSQLParser.TIME, 0); } + public TerminalNode TIME_FORMAT() { return getToken(OpenSearchSQLParser.TIME_FORMAT, 0); } + public TerminalNode TIME_TO_SEC() { return getToken(OpenSearchSQLParser.TIME_TO_SEC, 0); } + public TerminalNode TIMEDIFF() { return getToken(OpenSearchSQLParser.TIMEDIFF, 0); } + public TerminalNode TIMESTAMP() { return getToken(OpenSearchSQLParser.TIMESTAMP, 0); } + public TerminalNode TO_DAYS() { return getToken(OpenSearchSQLParser.TO_DAYS, 0); } + public TerminalNode TO_SECONDS() { return getToken(OpenSearchSQLParser.TO_SECONDS, 0); } + public TerminalNode UNIX_TIMESTAMP() { return getToken(OpenSearchSQLParser.UNIX_TIMESTAMP, 0); } + public TerminalNode WEEK() { return getToken(OpenSearchSQLParser.WEEK, 0); } + public TerminalNode WEEKDAY() { return getToken(OpenSearchSQLParser.WEEKDAY, 0); } + public TerminalNode WEEK_OF_YEAR() { return getToken(OpenSearchSQLParser.WEEK_OF_YEAR, 0); } + public TerminalNode WEEKOFYEAR() { return getToken(OpenSearchSQLParser.WEEKOFYEAR, 0); } + public TerminalNode YEAR() { return getToken(OpenSearchSQLParser.YEAR, 0); } + public TerminalNode YEARWEEK() { return getToken(OpenSearchSQLParser.YEARWEEK, 0); } + public DateTimeFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dateTimeFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterDateTimeFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitDateTimeFunctionName(this); + } + } + + public final DateTimeFunctionNameContext dateTimeFunctionName() throws RecognitionException { + DateTimeFunctionNameContext _localctx = new DateTimeFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 162, RULE_dateTimeFunctionName); + try { + setState(985); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case LOCALTIME: + case LOCALTIMESTAMP: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + enterOuterAlt(_localctx, 1); + { + setState(926); + datetimeConstantLiteral(); + } + break; + case ADDDATE: + enterOuterAlt(_localctx, 2); + { + setState(927); + match(ADDDATE); + } + break; + case ADDTIME: + enterOuterAlt(_localctx, 3); + { + setState(928); + match(ADDTIME); + } + break; + case CONVERT_TZ: + enterOuterAlt(_localctx, 4); + { + setState(929); + match(CONVERT_TZ); + } + break; + case CURDATE: + enterOuterAlt(_localctx, 5); + { + setState(930); + match(CURDATE); + } + break; + case CURTIME: + enterOuterAlt(_localctx, 6); + { + setState(931); + match(CURTIME); + } + break; + case DATE: + enterOuterAlt(_localctx, 7); + { + setState(932); + match(DATE); + } + break; + case DATE_ADD: + enterOuterAlt(_localctx, 8); + { + setState(933); + match(DATE_ADD); + } + break; + case DATE_FORMAT: + enterOuterAlt(_localctx, 9); + { + setState(934); + match(DATE_FORMAT); + } + break; + case DATE_SUB: + enterOuterAlt(_localctx, 10); + { + setState(935); + match(DATE_SUB); + } + break; + case DATEDIFF: + enterOuterAlt(_localctx, 11); + { + setState(936); + match(DATEDIFF); + } + break; + case DATETIME: + enterOuterAlt(_localctx, 12); + { + setState(937); + match(DATETIME); + } + break; + case DAY: + enterOuterAlt(_localctx, 13); + { + setState(938); + match(DAY); + } + break; + case DAYNAME: + enterOuterAlt(_localctx, 14); + { + setState(939); + match(DAYNAME); + } + break; + case DAYOFMONTH: + enterOuterAlt(_localctx, 15); + { + setState(940); + match(DAYOFMONTH); + } + break; + case DAY_OF_MONTH: + enterOuterAlt(_localctx, 16); + { + setState(941); + match(DAY_OF_MONTH); + } + break; + case DAYOFWEEK: + enterOuterAlt(_localctx, 17); + { + setState(942); + match(DAYOFWEEK); + } + break; + case DAYOFYEAR: + enterOuterAlt(_localctx, 18); + { + setState(943); + match(DAYOFYEAR); + } + break; + case DAY_OF_YEAR: + enterOuterAlt(_localctx, 19); + { + setState(944); + match(DAY_OF_YEAR); + } + break; + case DAY_OF_WEEK: + enterOuterAlt(_localctx, 20); + { + setState(945); + match(DAY_OF_WEEK); + } + break; + case FROM_DAYS: + enterOuterAlt(_localctx, 21); + { + setState(946); + match(FROM_DAYS); + } + break; + case FROM_UNIXTIME: + enterOuterAlt(_localctx, 22); + { + setState(947); + match(FROM_UNIXTIME); + } + break; + case HOUR: + enterOuterAlt(_localctx, 23); + { + setState(948); + match(HOUR); + } + break; + case HOUR_OF_DAY: + enterOuterAlt(_localctx, 24); + { + setState(949); + match(HOUR_OF_DAY); + } + break; + case LAST_DAY: + enterOuterAlt(_localctx, 25); + { + setState(950); + match(LAST_DAY); + } + break; + case MAKEDATE: + enterOuterAlt(_localctx, 26); + { + setState(951); + match(MAKEDATE); + } + break; + case MAKETIME: + enterOuterAlt(_localctx, 27); + { + setState(952); + match(MAKETIME); + } + break; + case MICROSECOND: + enterOuterAlt(_localctx, 28); + { + setState(953); + match(MICROSECOND); + } + break; + case MINUTE: + enterOuterAlt(_localctx, 29); + { + setState(954); + match(MINUTE); + } + break; + case MINUTE_OF_DAY: + enterOuterAlt(_localctx, 30); + { + setState(955); + match(MINUTE_OF_DAY); + } + break; + case MINUTE_OF_HOUR: + enterOuterAlt(_localctx, 31); + { + setState(956); + match(MINUTE_OF_HOUR); + } + break; + case MONTH: + enterOuterAlt(_localctx, 32); + { + setState(957); + match(MONTH); + } + break; + case MONTHNAME: + enterOuterAlt(_localctx, 33); + { + setState(958); + match(MONTHNAME); + } + break; + case MONTH_OF_YEAR: + enterOuterAlt(_localctx, 34); + { + setState(959); + match(MONTH_OF_YEAR); + } + break; + case NOW: + enterOuterAlt(_localctx, 35); + { + setState(960); + match(NOW); + } + break; + case PERIOD_ADD: + enterOuterAlt(_localctx, 36); + { + setState(961); + match(PERIOD_ADD); + } + break; + case PERIOD_DIFF: + enterOuterAlt(_localctx, 37); + { + setState(962); + match(PERIOD_DIFF); + } + break; + case QUARTER: + enterOuterAlt(_localctx, 38); + { + setState(963); + match(QUARTER); + } + break; + case SEC_TO_TIME: + enterOuterAlt(_localctx, 39); + { + setState(964); + match(SEC_TO_TIME); + } + break; + case SECOND: + enterOuterAlt(_localctx, 40); + { + setState(965); + match(SECOND); + } + break; + case SECOND_OF_MINUTE: + enterOuterAlt(_localctx, 41); + { + setState(966); + match(SECOND_OF_MINUTE); + } + break; + case SUBDATE: + enterOuterAlt(_localctx, 42); + { + setState(967); + match(SUBDATE); + } + break; + case SUBTIME: + enterOuterAlt(_localctx, 43); + { + setState(968); + match(SUBTIME); + } + break; + case SYSDATE: + enterOuterAlt(_localctx, 44); + { + setState(969); + match(SYSDATE); + } + break; + case STR_TO_DATE: + enterOuterAlt(_localctx, 45); + { + setState(970); + match(STR_TO_DATE); + } + break; + case TIME: + enterOuterAlt(_localctx, 46); + { + setState(971); + match(TIME); + } + break; + case TIME_FORMAT: + enterOuterAlt(_localctx, 47); + { + setState(972); + match(TIME_FORMAT); + } + break; + case TIME_TO_SEC: + enterOuterAlt(_localctx, 48); + { + setState(973); + match(TIME_TO_SEC); + } + break; + case TIMEDIFF: + enterOuterAlt(_localctx, 49); + { + setState(974); + match(TIMEDIFF); + } + break; + case TIMESTAMP: + enterOuterAlt(_localctx, 50); + { + setState(975); + match(TIMESTAMP); + } + break; + case TO_DAYS: + enterOuterAlt(_localctx, 51); + { + setState(976); + match(TO_DAYS); + } + break; + case TO_SECONDS: + enterOuterAlt(_localctx, 52); + { + setState(977); + match(TO_SECONDS); + } + break; + case UNIX_TIMESTAMP: + enterOuterAlt(_localctx, 53); + { + setState(978); + match(UNIX_TIMESTAMP); + } + break; + case WEEK: + enterOuterAlt(_localctx, 54); + { + setState(979); + match(WEEK); + } + break; + case WEEKDAY: + enterOuterAlt(_localctx, 55); + { + setState(980); + match(WEEKDAY); + } + break; + case WEEK_OF_YEAR: + enterOuterAlt(_localctx, 56); + { + setState(981); + match(WEEK_OF_YEAR); + } + break; + case WEEKOFYEAR: + enterOuterAlt(_localctx, 57); + { + setState(982); + match(WEEKOFYEAR); + } + break; + case YEAR: + enterOuterAlt(_localctx, 58); + { + setState(983); + match(YEAR); + } + break; + case YEARWEEK: + enterOuterAlt(_localctx, 59); + { + setState(984); + match(YEARWEEK); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TextFunctionNameContext extends ParserRuleContext { + public TerminalNode SUBSTR() { return getToken(OpenSearchSQLParser.SUBSTR, 0); } + public TerminalNode SUBSTRING() { return getToken(OpenSearchSQLParser.SUBSTRING, 0); } + public TerminalNode TRIM() { return getToken(OpenSearchSQLParser.TRIM, 0); } + public TerminalNode LTRIM() { return getToken(OpenSearchSQLParser.LTRIM, 0); } + public TerminalNode RTRIM() { return getToken(OpenSearchSQLParser.RTRIM, 0); } + public TerminalNode LOWER() { return getToken(OpenSearchSQLParser.LOWER, 0); } + public TerminalNode UPPER() { return getToken(OpenSearchSQLParser.UPPER, 0); } + public TerminalNode CONCAT() { return getToken(OpenSearchSQLParser.CONCAT, 0); } + public TerminalNode CONCAT_WS() { return getToken(OpenSearchSQLParser.CONCAT_WS, 0); } + public TerminalNode LENGTH() { return getToken(OpenSearchSQLParser.LENGTH, 0); } + public TerminalNode STRCMP() { return getToken(OpenSearchSQLParser.STRCMP, 0); } + public TerminalNode RIGHT() { return getToken(OpenSearchSQLParser.RIGHT, 0); } + public TerminalNode LEFT() { return getToken(OpenSearchSQLParser.LEFT, 0); } + public TerminalNode ASCII() { return getToken(OpenSearchSQLParser.ASCII, 0); } + public TerminalNode LOCATE() { return getToken(OpenSearchSQLParser.LOCATE, 0); } + public TerminalNode REPLACE() { return getToken(OpenSearchSQLParser.REPLACE, 0); } + public TerminalNode REVERSE() { return getToken(OpenSearchSQLParser.REVERSE, 0); } + public TextFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_textFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTextFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTextFunctionName(this); + } + } + + public final TextFunctionNameContext textFunctionName() throws RecognitionException { + TextFunctionNameContext _localctx = new TextFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 164, RULE_textFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(987); + _la = _input.LA(1); + if ( !(_la==LEFT || _la==RIGHT || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 826781204483L) != 0) || ((((_la - 151)) & ~0x3f) == 0 && ((1L << (_la - 151)) & 2251800652546833L) != 0) || _la==SUBSTR || _la==STRCMP) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FlowControlFunctionNameContext extends ParserRuleContext { + public TerminalNode IF() { return getToken(OpenSearchSQLParser.IF, 0); } + public TerminalNode IFNULL() { return getToken(OpenSearchSQLParser.IFNULL, 0); } + public TerminalNode NULLIF() { return getToken(OpenSearchSQLParser.NULLIF, 0); } + public TerminalNode ISNULL() { return getToken(OpenSearchSQLParser.ISNULL, 0); } + public FlowControlFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_flowControlFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFlowControlFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFlowControlFunctionName(this); + } + } + + public final FlowControlFunctionNameContext flowControlFunctionName() throws RecognitionException { + FlowControlFunctionNameContext _localctx = new FlowControlFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 166, RULE_flowControlFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(989); + _la = _input.LA(1); + if ( !(((((_la - 147)) & ~0x3f) == 0 && ((1L << (_la - 147)) & 1048583L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NoFieldRelevanceFunctionNameContext extends ParserRuleContext { + public TerminalNode QUERY() { return getToken(OpenSearchSQLParser.QUERY, 0); } + public NoFieldRelevanceFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_noFieldRelevanceFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNoFieldRelevanceFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNoFieldRelevanceFunctionName(this); + } + } + + public final NoFieldRelevanceFunctionNameContext noFieldRelevanceFunctionName() throws RecognitionException { + NoFieldRelevanceFunctionNameContext _localctx = new NoFieldRelevanceFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 168, RULE_noFieldRelevanceFunctionName); + try { + enterOuterAlt(_localctx, 1); + { + setState(991); + match(QUERY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SystemFunctionNameContext extends ParserRuleContext { + public TerminalNode TYPEOF() { return getToken(OpenSearchSQLParser.TYPEOF, 0); } + public SystemFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_systemFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSystemFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSystemFunctionName(this); + } + } + + public final SystemFunctionNameContext systemFunctionName() throws RecognitionException { + SystemFunctionNameContext _localctx = new SystemFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 170, RULE_systemFunctionName); + try { + enterOuterAlt(_localctx, 1); + { + setState(993); + match(TYPEOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NestedFunctionNameContext extends ParserRuleContext { + public TerminalNode NESTED() { return getToken(OpenSearchSQLParser.NESTED, 0); } + public NestedFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nestedFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterNestedFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitNestedFunctionName(this); + } + } + + public final NestedFunctionNameContext nestedFunctionName() throws RecognitionException { + NestedFunctionNameContext _localctx = new NestedFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 172, RULE_nestedFunctionName); + try { + enterOuterAlt(_localctx, 1); + { + setState(995); + match(NESTED); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ScoreRelevanceFunctionNameContext extends ParserRuleContext { + public TerminalNode SCORE() { return getToken(OpenSearchSQLParser.SCORE, 0); } + public TerminalNode SCOREQUERY() { return getToken(OpenSearchSQLParser.SCOREQUERY, 0); } + public TerminalNode SCORE_QUERY() { return getToken(OpenSearchSQLParser.SCORE_QUERY, 0); } + public ScoreRelevanceFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_scoreRelevanceFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterScoreRelevanceFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitScoreRelevanceFunctionName(this); + } + } + + public final ScoreRelevanceFunctionNameContext scoreRelevanceFunctionName() throws RecognitionException { + ScoreRelevanceFunctionNameContext _localctx = new ScoreRelevanceFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 174, RULE_scoreRelevanceFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(997); + _la = _input.LA(1); + if ( !(((((_la - 254)) & ~0x3f) == 0 && ((1L << (_la - 254)) & 7L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SingleFieldRelevanceFunctionNameContext extends ParserRuleContext { + public TerminalNode MATCH() { return getToken(OpenSearchSQLParser.MATCH, 0); } + public TerminalNode MATCHQUERY() { return getToken(OpenSearchSQLParser.MATCHQUERY, 0); } + public TerminalNode MATCH_QUERY() { return getToken(OpenSearchSQLParser.MATCH_QUERY, 0); } + public TerminalNode MATCH_PHRASE() { return getToken(OpenSearchSQLParser.MATCH_PHRASE, 0); } + public TerminalNode MATCHPHRASE() { return getToken(OpenSearchSQLParser.MATCHPHRASE, 0); } + public TerminalNode MATCHPHRASEQUERY() { return getToken(OpenSearchSQLParser.MATCHPHRASEQUERY, 0); } + public TerminalNode MATCH_BOOL_PREFIX() { return getToken(OpenSearchSQLParser.MATCH_BOOL_PREFIX, 0); } + public TerminalNode MATCH_PHRASE_PREFIX() { return getToken(OpenSearchSQLParser.MATCH_PHRASE_PREFIX, 0); } + public TerminalNode WILDCARD_QUERY() { return getToken(OpenSearchSQLParser.WILDCARD_QUERY, 0); } + public TerminalNode WILDCARDQUERY() { return getToken(OpenSearchSQLParser.WILDCARDQUERY, 0); } + public SingleFieldRelevanceFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleFieldRelevanceFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterSingleFieldRelevanceFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitSingleFieldRelevanceFunctionName(this); + } + } + + public final SingleFieldRelevanceFunctionNameContext singleFieldRelevanceFunctionName() throws RecognitionException { + SingleFieldRelevanceFunctionNameContext _localctx = new SingleFieldRelevanceFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 176, RULE_singleFieldRelevanceFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(999); + _la = _input.LA(1); + if ( !(_la==MATCH || ((((_la - 232)) & ~0x3f) == 0 && ((1L << (_la - 232)) & 206158430439L) != 0) || _la==MATCH_BOOL_PREFIX) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MultiFieldRelevanceFunctionNameContext extends ParserRuleContext { + public TerminalNode MULTI_MATCH() { return getToken(OpenSearchSQLParser.MULTI_MATCH, 0); } + public TerminalNode MULTIMATCH() { return getToken(OpenSearchSQLParser.MULTIMATCH, 0); } + public TerminalNode MULTIMATCHQUERY() { return getToken(OpenSearchSQLParser.MULTIMATCHQUERY, 0); } + public TerminalNode SIMPLE_QUERY_STRING() { return getToken(OpenSearchSQLParser.SIMPLE_QUERY_STRING, 0); } + public TerminalNode QUERY_STRING() { return getToken(OpenSearchSQLParser.QUERY_STRING, 0); } + public MultiFieldRelevanceFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiFieldRelevanceFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterMultiFieldRelevanceFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitMultiFieldRelevanceFunctionName(this); + } + } + + public final MultiFieldRelevanceFunctionNameContext multiFieldRelevanceFunctionName() throws RecognitionException { + MultiFieldRelevanceFunctionNameContext _localctx = new MultiFieldRelevanceFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 178, RULE_multiFieldRelevanceFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1001); + _la = _input.LA(1); + if ( !(((((_la - 235)) & ~0x3f) == 0 && ((1L << (_la - 235)) & 1795L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AltSingleFieldRelevanceFunctionNameContext extends ParserRuleContext { + public TerminalNode MATCH_QUERY() { return getToken(OpenSearchSQLParser.MATCH_QUERY, 0); } + public TerminalNode MATCHQUERY() { return getToken(OpenSearchSQLParser.MATCHQUERY, 0); } + public TerminalNode MATCH_PHRASE() { return getToken(OpenSearchSQLParser.MATCH_PHRASE, 0); } + public TerminalNode MATCHPHRASE() { return getToken(OpenSearchSQLParser.MATCHPHRASE, 0); } + public AltSingleFieldRelevanceFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_altSingleFieldRelevanceFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAltSingleFieldRelevanceFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAltSingleFieldRelevanceFunctionName(this); + } + } + + public final AltSingleFieldRelevanceFunctionNameContext altSingleFieldRelevanceFunctionName() throws RecognitionException { + AltSingleFieldRelevanceFunctionNameContext _localctx = new AltSingleFieldRelevanceFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 180, RULE_altSingleFieldRelevanceFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1003); + _la = _input.LA(1); + if ( !(((((_la - 232)) & ~0x3f) == 0 && ((1L << (_la - 232)) & 195L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AltMultiFieldRelevanceFunctionNameContext extends ParserRuleContext { + public TerminalNode MULTI_MATCH() { return getToken(OpenSearchSQLParser.MULTI_MATCH, 0); } + public TerminalNode MULTIMATCH() { return getToken(OpenSearchSQLParser.MULTIMATCH, 0); } + public AltMultiFieldRelevanceFunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_altMultiFieldRelevanceFunctionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAltMultiFieldRelevanceFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAltMultiFieldRelevanceFunctionName(this); + } + } + + public final AltMultiFieldRelevanceFunctionNameContext altMultiFieldRelevanceFunctionName() throws RecognitionException { + AltMultiFieldRelevanceFunctionNameContext _localctx = new AltMultiFieldRelevanceFunctionNameContext(_ctx, getState()); + enterRule(_localctx, 182, RULE_altMultiFieldRelevanceFunctionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1005); + _la = _input.LA(1); + if ( !(_la==MULTIMATCH || _la==MULTI_MATCH) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionArgsContext extends ParserRuleContext { + public List functionArg() { + return getRuleContexts(FunctionArgContext.class); + } + public FunctionArgContext functionArg(int i) { + return getRuleContext(FunctionArgContext.class,i); + } + public List COMMA() { return getTokens(OpenSearchSQLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(OpenSearchSQLParser.COMMA, i); + } + public FunctionArgsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionArgs; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFunctionArgs(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFunctionArgs(this); + } + } + + public final FunctionArgsContext functionArgs() throws RecognitionException { + FunctionArgsContext _localctx = new FunctionArgsContext(_ctx, getState()); + enterRule(_localctx, 184, RULE_functionArgs); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1015); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 594530332636688384L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & -549621678081L) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & -1L) != 0) || ((((_la - 193)) & ~0x3f) == 0 && ((1L << (_la - 193)) & -1603281948214689793L) != 0) || ((((_la - 257)) & ~0x3f) == 0 && ((1L << (_la - 257)) & 3191363285945548721L) != 0) || ((((_la - 327)) & ~0x3f) == 0 && ((1L << (_la - 327)) & 30082819L) != 0)) { + { + setState(1007); + functionArg(); + setState(1012); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1008); + match(COMMA); + setState(1009); + functionArg(); + } + } + setState(1014); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionArgContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public FunctionArgContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionArg; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterFunctionArg(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitFunctionArg(this); + } + } + + public final FunctionArgContext functionArg() throws RecognitionException { + FunctionArgContext _localctx = new FunctionArgContext(_ctx, getState()); + enterRule(_localctx, 186, RULE_functionArg); + try { + enterOuterAlt(_localctx, 1); + { + setState(1017); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceArgContext extends ParserRuleContext { + public StringLiteralContext argName; + public RelevanceArgValueContext argVal; + public RelevanceArgNameContext relevanceArgName() { + return getRuleContext(RelevanceArgNameContext.class,0); + } + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public RelevanceArgValueContext relevanceArgValue() { + return getRuleContext(RelevanceArgValueContext.class,0); + } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public RelevanceArgContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceArg; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceArg(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceArg(this); + } + } + + public final RelevanceArgContext relevanceArg() throws RecognitionException { + RelevanceArgContext _localctx = new RelevanceArgContext(_ctx, getState()); + enterRule(_localctx, 188, RULE_relevanceArg); + try { + setState(1027); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ALLOW_LEADING_WILDCARD: + case ANALYZER: + case ANALYZE_WILDCARD: + case AUTO_GENERATE_SYNONYMS_PHRASE_QUERY: + case BOOST: + case CASE_INSENSITIVE: + case CUTOFF_FREQUENCY: + case DEFAULT_FIELD: + case DEFAULT_OPERATOR: + case ESCAPE: + case ENABLE_POSITION_INCREMENTS: + case FIELDS: + case FLAGS: + case FUZZINESS: + case FUZZY_MAX_EXPANSIONS: + case FUZZY_PREFIX_LENGTH: + case FUZZY_REWRITE: + case FUZZY_TRANSPOSITIONS: + case LENIENT: + case LOW_FREQ_OPERATOR: + case MAX_DETERMINIZED_STATES: + case MAX_EXPANSIONS: + case MINIMUM_SHOULD_MATCH: + case OPERATOR: + case PHRASE_SLOP: + case PREFIX_LENGTH: + case QUOTE_ANALYZER: + case QUOTE_FIELD_SUFFIX: + case REWRITE: + case SLOP: + case TIE_BREAKER: + case TIME_ZONE: + case TYPE: + case ZERO_TERMS_QUERY: + enterOuterAlt(_localctx, 1); + { + setState(1019); + relevanceArgName(); + setState(1020); + match(EQUAL_SYMBOL); + setState(1021); + relevanceArgValue(); + } + break; + case STRING_LITERAL: + case DOUBLE_QUOTE_ID: + enterOuterAlt(_localctx, 2); + { + setState(1023); + ((RelevanceArgContext)_localctx).argName = stringLiteral(); + setState(1024); + match(EQUAL_SYMBOL); + setState(1025); + ((RelevanceArgContext)_localctx).argVal = relevanceArgValue(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HighlightArgContext extends ParserRuleContext { + public HighlightArgNameContext highlightArgName() { + return getRuleContext(HighlightArgNameContext.class,0); + } + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public HighlightArgValueContext highlightArgValue() { + return getRuleContext(HighlightArgValueContext.class,0); + } + public HighlightArgContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_highlightArg; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterHighlightArg(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitHighlightArg(this); + } + } + + public final HighlightArgContext highlightArg() throws RecognitionException { + HighlightArgContext _localctx = new HighlightArgContext(_ctx, getState()); + enterRule(_localctx, 190, RULE_highlightArg); + try { + enterOuterAlt(_localctx, 1); + { + setState(1029); + highlightArgName(); + setState(1030); + match(EQUAL_SYMBOL); + setState(1031); + highlightArgValue(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceArgNameContext extends ParserRuleContext { + public TerminalNode ALLOW_LEADING_WILDCARD() { return getToken(OpenSearchSQLParser.ALLOW_LEADING_WILDCARD, 0); } + public TerminalNode ANALYZER() { return getToken(OpenSearchSQLParser.ANALYZER, 0); } + public TerminalNode ANALYZE_WILDCARD() { return getToken(OpenSearchSQLParser.ANALYZE_WILDCARD, 0); } + public TerminalNode AUTO_GENERATE_SYNONYMS_PHRASE_QUERY() { return getToken(OpenSearchSQLParser.AUTO_GENERATE_SYNONYMS_PHRASE_QUERY, 0); } + public TerminalNode BOOST() { return getToken(OpenSearchSQLParser.BOOST, 0); } + public TerminalNode CASE_INSENSITIVE() { return getToken(OpenSearchSQLParser.CASE_INSENSITIVE, 0); } + public TerminalNode CUTOFF_FREQUENCY() { return getToken(OpenSearchSQLParser.CUTOFF_FREQUENCY, 0); } + public TerminalNode DEFAULT_FIELD() { return getToken(OpenSearchSQLParser.DEFAULT_FIELD, 0); } + public TerminalNode DEFAULT_OPERATOR() { return getToken(OpenSearchSQLParser.DEFAULT_OPERATOR, 0); } + public TerminalNode ENABLE_POSITION_INCREMENTS() { return getToken(OpenSearchSQLParser.ENABLE_POSITION_INCREMENTS, 0); } + public TerminalNode ESCAPE() { return getToken(OpenSearchSQLParser.ESCAPE, 0); } + public TerminalNode FIELDS() { return getToken(OpenSearchSQLParser.FIELDS, 0); } + public TerminalNode FLAGS() { return getToken(OpenSearchSQLParser.FLAGS, 0); } + public TerminalNode FUZZINESS() { return getToken(OpenSearchSQLParser.FUZZINESS, 0); } + public TerminalNode FUZZY_MAX_EXPANSIONS() { return getToken(OpenSearchSQLParser.FUZZY_MAX_EXPANSIONS, 0); } + public TerminalNode FUZZY_PREFIX_LENGTH() { return getToken(OpenSearchSQLParser.FUZZY_PREFIX_LENGTH, 0); } + public TerminalNode FUZZY_REWRITE() { return getToken(OpenSearchSQLParser.FUZZY_REWRITE, 0); } + public TerminalNode FUZZY_TRANSPOSITIONS() { return getToken(OpenSearchSQLParser.FUZZY_TRANSPOSITIONS, 0); } + public TerminalNode LENIENT() { return getToken(OpenSearchSQLParser.LENIENT, 0); } + public TerminalNode LOW_FREQ_OPERATOR() { return getToken(OpenSearchSQLParser.LOW_FREQ_OPERATOR, 0); } + public TerminalNode MAX_DETERMINIZED_STATES() { return getToken(OpenSearchSQLParser.MAX_DETERMINIZED_STATES, 0); } + public TerminalNode MAX_EXPANSIONS() { return getToken(OpenSearchSQLParser.MAX_EXPANSIONS, 0); } + public TerminalNode MINIMUM_SHOULD_MATCH() { return getToken(OpenSearchSQLParser.MINIMUM_SHOULD_MATCH, 0); } + public TerminalNode OPERATOR() { return getToken(OpenSearchSQLParser.OPERATOR, 0); } + public TerminalNode PHRASE_SLOP() { return getToken(OpenSearchSQLParser.PHRASE_SLOP, 0); } + public TerminalNode PREFIX_LENGTH() { return getToken(OpenSearchSQLParser.PREFIX_LENGTH, 0); } + public TerminalNode QUOTE_ANALYZER() { return getToken(OpenSearchSQLParser.QUOTE_ANALYZER, 0); } + public TerminalNode QUOTE_FIELD_SUFFIX() { return getToken(OpenSearchSQLParser.QUOTE_FIELD_SUFFIX, 0); } + public TerminalNode REWRITE() { return getToken(OpenSearchSQLParser.REWRITE, 0); } + public TerminalNode SLOP() { return getToken(OpenSearchSQLParser.SLOP, 0); } + public TerminalNode TIE_BREAKER() { return getToken(OpenSearchSQLParser.TIE_BREAKER, 0); } + public TerminalNode TIME_ZONE() { return getToken(OpenSearchSQLParser.TIME_ZONE, 0); } + public TerminalNode TYPE() { return getToken(OpenSearchSQLParser.TYPE, 0); } + public TerminalNode ZERO_TERMS_QUERY() { return getToken(OpenSearchSQLParser.ZERO_TERMS_QUERY, 0); } + public RelevanceArgNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceArgName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceArgName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceArgName(this); + } + } + + public final RelevanceArgNameContext relevanceArgName() throws RecognitionException { + RelevanceArgNameContext _localctx = new RelevanceArgNameContext(_ctx, getState()); + enterRule(_localctx, 192, RULE_relevanceArgName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1033); + _la = _input.LA(1); + if ( !(((((_la - 274)) & ~0x3f) == 0 && ((1L << (_la - 274)) & 17179869183L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HighlightArgNameContext extends ParserRuleContext { + public TerminalNode HIGHLIGHT_POST_TAGS() { return getToken(OpenSearchSQLParser.HIGHLIGHT_POST_TAGS, 0); } + public TerminalNode HIGHLIGHT_PRE_TAGS() { return getToken(OpenSearchSQLParser.HIGHLIGHT_PRE_TAGS, 0); } + public HighlightArgNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_highlightArgName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterHighlightArgName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitHighlightArgName(this); + } + } + + public final HighlightArgNameContext highlightArgName() throws RecognitionException { + HighlightArgNameContext _localctx = new HighlightArgNameContext(_ctx, getState()); + enterRule(_localctx, 194, RULE_highlightArgName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1035); + _la = _input.LA(1); + if ( !(_la==HIGHLIGHT_PRE_TAGS || _la==HIGHLIGHT_POST_TAGS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceFieldAndWeightContext extends ParserRuleContext { + public RelevanceFieldContext field; + public RelevanceFieldWeightContext weight; + public RelevanceFieldContext relevanceField() { + return getRuleContext(RelevanceFieldContext.class,0); + } + public RelevanceFieldWeightContext relevanceFieldWeight() { + return getRuleContext(RelevanceFieldWeightContext.class,0); + } + public TerminalNode BIT_XOR_OP() { return getToken(OpenSearchSQLParser.BIT_XOR_OP, 0); } + public RelevanceFieldAndWeightContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceFieldAndWeight; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceFieldAndWeight(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceFieldAndWeight(this); + } + } + + public final RelevanceFieldAndWeightContext relevanceFieldAndWeight() throws RecognitionException { + RelevanceFieldAndWeightContext _localctx = new RelevanceFieldAndWeightContext(_ctx, getState()); + enterRule(_localctx, 196, RULE_relevanceFieldAndWeight); + try { + setState(1045); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1037); + ((RelevanceFieldAndWeightContext)_localctx).field = relevanceField(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1038); + ((RelevanceFieldAndWeightContext)_localctx).field = relevanceField(); + setState(1039); + ((RelevanceFieldAndWeightContext)_localctx).weight = relevanceFieldWeight(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1041); + ((RelevanceFieldAndWeightContext)_localctx).field = relevanceField(); + setState(1042); + match(BIT_XOR_OP); + setState(1043); + ((RelevanceFieldAndWeightContext)_localctx).weight = relevanceFieldWeight(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceFieldWeightContext extends ParserRuleContext { + public NumericLiteralContext numericLiteral() { + return getRuleContext(NumericLiteralContext.class,0); + } + public RelevanceFieldWeightContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceFieldWeight; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceFieldWeight(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceFieldWeight(this); + } + } + + public final RelevanceFieldWeightContext relevanceFieldWeight() throws RecognitionException { + RelevanceFieldWeightContext _localctx = new RelevanceFieldWeightContext(_ctx, getState()); + enterRule(_localctx, 198, RULE_relevanceFieldWeight); + try { + enterOuterAlt(_localctx, 1); + { + setState(1047); + numericLiteral(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceFieldContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public RelevanceFieldContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceField; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceField(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceField(this); + } + } + + public final RelevanceFieldContext relevanceField() throws RecognitionException { + RelevanceFieldContext _localctx = new RelevanceFieldContext(_ctx, getState()); + enterRule(_localctx, 200, RULE_relevanceField); + try { + setState(1051); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DATETIME: + case FIRST: + case LAST: + case LEFT: + case RIGHT: + case AVG: + case COUNT: + case MAX: + case MIN: + case SUM: + case SUBSTRING: + case TRIM: + case FULL: + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + case ABS: + case ACOS: + case ADD: + case ADDTIME: + case ASCII: + case ASIN: + case ATAN: + case ATAN2: + case CBRT: + case CEIL: + case CEILING: + case CONCAT: + case CONCAT_WS: + case CONV: + case CONVERT_TZ: + case COS: + case COSH: + case COT: + case CRC32: + case CURDATE: + case CURTIME: + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case DATE: + case DATE_ADD: + case DATE_FORMAT: + case DATE_SUB: + case DATEDIFF: + case DAYNAME: + case DAYOFMONTH: + case DAYOFWEEK: + case DAYOFYEAR: + case DEGREES: + case DIVIDE: + case E: + case EXP: + case EXPM1: + case FLOOR: + case FROM_DAYS: + case FROM_UNIXTIME: + case IF: + case IFNULL: + case ISNULL: + case LAST_DAY: + case LENGTH: + case LN: + case LOCALTIME: + case LOCALTIMESTAMP: + case LOCATE: + case LOG: + case LOG10: + case LOG2: + case LOWER: + case LTRIM: + case MAKEDATE: + case MAKETIME: + case MODULUS: + case MONTHNAME: + case MULTIPLY: + case NOW: + case NULLIF: + case PERIOD_ADD: + case PERIOD_DIFF: + case PI: + case POW: + case POWER: + case RADIANS: + case RAND: + case REPLACE: + case RINT: + case ROUND: + case RTRIM: + case REVERSE: + case SEC_TO_TIME: + case SIGN: + case SIGNUM: + case SIN: + case SINH: + case SQRT: + case STR_TO_DATE: + case SUBDATE: + case SUBTIME: + case SUBTRACT: + case SYSDATE: + case TAN: + case TIME: + case TIMEDIFF: + case TIME_FORMAT: + case TIME_TO_SEC: + case TIMESTAMP: + case TRUNCATE: + case TO_DAYS: + case TO_SECONDS: + case UNIX_TIMESTAMP: + case UPPER: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + case D: + case T: + case TS: + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + case FIELD: + case HOUR_OF_DAY: + case MINUTE_OF_DAY: + case MINUTE_OF_HOUR: + case MONTH_OF_YEAR: + case NESTED: + case SECOND_OF_MINUTE: + case TYPEOF: + case WEEK_OF_YEAR: + case WEEKOFYEAR: + case WEEKDAY: + case SUBSTR: + case STRCMP: + case ADDDATE: + case YEARWEEK: + case TYPE: + case MOD: + case DOT: + case ID: + case BACKTICK_QUOTE_ID: + enterOuterAlt(_localctx, 1); + { + setState(1049); + qualifiedName(); + } + break; + case STRING_LITERAL: + case DOUBLE_QUOTE_ID: + enterOuterAlt(_localctx, 2); + { + setState(1050); + stringLiteral(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceQueryContext extends ParserRuleContext { + public RelevanceArgValueContext relevanceArgValue() { + return getRuleContext(RelevanceArgValueContext.class,0); + } + public RelevanceQueryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceQuery; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceQuery(this); + } + } + + public final RelevanceQueryContext relevanceQuery() throws RecognitionException { + RelevanceQueryContext _localctx = new RelevanceQueryContext(_ctx, getState()); + enterRule(_localctx, 202, RULE_relevanceQuery); + try { + enterOuterAlt(_localctx, 1); + { + setState(1053); + relevanceArgValue(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RelevanceArgValueContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public RelevanceArgValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relevanceArgValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterRelevanceArgValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitRelevanceArgValue(this); + } + } + + public final RelevanceArgValueContext relevanceArgValue() throws RecognitionException { + RelevanceArgValueContext _localctx = new RelevanceArgValueContext(_ctx, getState()); + enterRule(_localctx, 204, RULE_relevanceArgValue); + try { + setState(1057); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1055); + qualifiedName(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1056); + constant(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class HighlightArgValueContext extends ParserRuleContext { + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public HighlightArgValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_highlightArgValue; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterHighlightArgValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitHighlightArgValue(this); + } + } + + public final HighlightArgValueContext highlightArgValue() throws RecognitionException { + HighlightArgValueContext _localctx = new HighlightArgValueContext(_ctx, getState()); + enterRule(_localctx, 206, RULE_highlightArgValue); + try { + enterOuterAlt(_localctx, 1); + { + setState(1059); + stringLiteral(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AlternateMultiMatchArgNameContext extends ParserRuleContext { + public TerminalNode FIELDS() { return getToken(OpenSearchSQLParser.FIELDS, 0); } + public TerminalNode QUERY() { return getToken(OpenSearchSQLParser.QUERY, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public AlternateMultiMatchArgNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_alternateMultiMatchArgName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAlternateMultiMatchArgName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAlternateMultiMatchArgName(this); + } + } + + public final AlternateMultiMatchArgNameContext alternateMultiMatchArgName() throws RecognitionException { + AlternateMultiMatchArgNameContext _localctx = new AlternateMultiMatchArgNameContext(_ctx, getState()); + enterRule(_localctx, 208, RULE_alternateMultiMatchArgName); + try { + setState(1064); + _errHandler.sync(this); + switch (_input.LA(1)) { + case FIELDS: + enterOuterAlt(_localctx, 1); + { + setState(1061); + match(FIELDS); + } + break; + case QUERY: + enterOuterAlt(_localctx, 2); + { + setState(1062); + match(QUERY); + } + break; + case STRING_LITERAL: + case DOUBLE_QUOTE_ID: + enterOuterAlt(_localctx, 3); + { + setState(1063); + stringLiteral(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AlternateMultiMatchQueryContext extends ParserRuleContext { + public AlternateMultiMatchArgNameContext argName; + public RelevanceArgValueContext argVal; + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public AlternateMultiMatchArgNameContext alternateMultiMatchArgName() { + return getRuleContext(AlternateMultiMatchArgNameContext.class,0); + } + public RelevanceArgValueContext relevanceArgValue() { + return getRuleContext(RelevanceArgValueContext.class,0); + } + public AlternateMultiMatchQueryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_alternateMultiMatchQuery; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAlternateMultiMatchQuery(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAlternateMultiMatchQuery(this); + } + } + + public final AlternateMultiMatchQueryContext alternateMultiMatchQuery() throws RecognitionException { + AlternateMultiMatchQueryContext _localctx = new AlternateMultiMatchQueryContext(_ctx, getState()); + enterRule(_localctx, 210, RULE_alternateMultiMatchQuery); + try { + enterOuterAlt(_localctx, 1); + { + setState(1066); + ((AlternateMultiMatchQueryContext)_localctx).argName = alternateMultiMatchArgName(); + setState(1067); + match(EQUAL_SYMBOL); + setState(1068); + ((AlternateMultiMatchQueryContext)_localctx).argVal = relevanceArgValue(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AlternateMultiMatchFieldContext extends ParserRuleContext { + public AlternateMultiMatchArgNameContext argName; + public RelevanceArgValueContext argVal; + public TerminalNode EQUAL_SYMBOL() { return getToken(OpenSearchSQLParser.EQUAL_SYMBOL, 0); } + public AlternateMultiMatchArgNameContext alternateMultiMatchArgName() { + return getRuleContext(AlternateMultiMatchArgNameContext.class,0); + } + public RelevanceArgValueContext relevanceArgValue() { + return getRuleContext(RelevanceArgValueContext.class,0); + } + public TerminalNode LT_SQR_PRTHS() { return getToken(OpenSearchSQLParser.LT_SQR_PRTHS, 0); } + public TerminalNode RT_SQR_PRTHS() { return getToken(OpenSearchSQLParser.RT_SQR_PRTHS, 0); } + public AlternateMultiMatchFieldContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_alternateMultiMatchField; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAlternateMultiMatchField(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAlternateMultiMatchField(this); + } + } + + public final AlternateMultiMatchFieldContext alternateMultiMatchField() throws RecognitionException { + AlternateMultiMatchFieldContext _localctx = new AlternateMultiMatchFieldContext(_ctx, getState()); + enterRule(_localctx, 212, RULE_alternateMultiMatchField); + try { + setState(1080); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1070); + ((AlternateMultiMatchFieldContext)_localctx).argName = alternateMultiMatchArgName(); + setState(1071); + match(EQUAL_SYMBOL); + setState(1072); + ((AlternateMultiMatchFieldContext)_localctx).argVal = relevanceArgValue(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1074); + ((AlternateMultiMatchFieldContext)_localctx).argName = alternateMultiMatchArgName(); + setState(1075); + match(EQUAL_SYMBOL); + setState(1076); + match(LT_SQR_PRTHS); + setState(1077); + ((AlternateMultiMatchFieldContext)_localctx).argVal = relevanceArgValue(); + setState(1078); + match(RT_SQR_PRTHS); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TableNameContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TableNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tableName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterTableName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitTableName(this); + } + } + + public final TableNameContext tableName() throws RecognitionException { + TableNameContext _localctx = new TableNameContext(_ctx, getState()); + enterRule(_localctx, 214, RULE_tableName); + try { + enterOuterAlt(_localctx, 1); + { + setState(1082); + qualifiedName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ColumnNameContext extends ParserRuleContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public ColumnNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_columnName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterColumnName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitColumnName(this); + } + } + + public final ColumnNameContext columnName() throws RecognitionException { + ColumnNameContext _localctx = new ColumnNameContext(_ctx, getState()); + enterRule(_localctx, 216, RULE_columnName); + try { + enterOuterAlt(_localctx, 1); + { + setState(1084); + qualifiedName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AllTupleFieldsContext extends ParserRuleContext { + public QualifiedNameContext path; + public TerminalNode DOT() { return getToken(OpenSearchSQLParser.DOT, 0); } + public TerminalNode STAR() { return getToken(OpenSearchSQLParser.STAR, 0); } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public AllTupleFieldsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_allTupleFields; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAllTupleFields(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAllTupleFields(this); + } + } + + public final AllTupleFieldsContext allTupleFields() throws RecognitionException { + AllTupleFieldsContext _localctx = new AllTupleFieldsContext(_ctx, getState()); + enterRule(_localctx, 218, RULE_allTupleFields); + try { + enterOuterAlt(_localctx, 1); + { + setState(1086); + ((AllTupleFieldsContext)_localctx).path = qualifiedName(); + setState(1087); + match(DOT); + setState(1088); + match(STAR); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AliasContext extends ParserRuleContext { + public IdentContext ident() { + return getRuleContext(IdentContext.class,0); + } + public AliasContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_alias; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterAlias(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitAlias(this); + } + } + + public final AliasContext alias() throws RecognitionException { + AliasContext _localctx = new AliasContext(_ctx, getState()); + enterRule(_localctx, 220, RULE_alias); + try { + enterOuterAlt(_localctx, 1); + { + setState(1090); + ident(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QualifiedNameContext extends ParserRuleContext { + public List ident() { + return getRuleContexts(IdentContext.class); + } + public IdentContext ident(int i) { + return getRuleContext(IdentContext.class,i); + } + public List DOT() { return getTokens(OpenSearchSQLParser.DOT); } + public TerminalNode DOT(int i) { + return getToken(OpenSearchSQLParser.DOT, i); + } + public QualifiedNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterQualifiedName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitQualifiedName(this); + } + } + + public final QualifiedNameContext qualifiedName() throws RecognitionException { + QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); + enterRule(_localctx, 222, RULE_qualifiedName); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1092); + ident(); + setState(1097); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1093); + match(DOT); + setState(1094); + ident(); + } + } + } + setState(1099); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentContext extends ParserRuleContext { + public TerminalNode ID() { return getToken(OpenSearchSQLParser.ID, 0); } + public TerminalNode DOT() { return getToken(OpenSearchSQLParser.DOT, 0); } + public TerminalNode BACKTICK_QUOTE_ID() { return getToken(OpenSearchSQLParser.BACKTICK_QUOTE_ID, 0); } + public KeywordsCanBeIdContext keywordsCanBeId() { + return getRuleContext(KeywordsCanBeIdContext.class,0); + } + public ScalarFunctionNameContext scalarFunctionName() { + return getRuleContext(ScalarFunctionNameContext.class,0); + } + public IdentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ident; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterIdent(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitIdent(this); + } + } + + public final IdentContext ident() throws RecognitionException { + IdentContext _localctx = new IdentContext(_ctx, getState()); + enterRule(_localctx, 224, RULE_ident); + int _la; + try { + setState(1107); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DOT: + case ID: + enterOuterAlt(_localctx, 1); + { + setState(1101); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==DOT) { + { + setState(1100); + match(DOT); + } + } + + setState(1103); + match(ID); + } + break; + case BACKTICK_QUOTE_ID: + enterOuterAlt(_localctx, 2); + { + setState(1104); + match(BACKTICK_QUOTE_ID); + } + break; + case FIRST: + case LAST: + case AVG: + case COUNT: + case MAX: + case MIN: + case SUM: + case FULL: + case D: + case T: + case TS: + case FIELD: + case TYPE: + enterOuterAlt(_localctx, 3); + { + setState(1105); + keywordsCanBeId(); + } + break; + case DATETIME: + case LEFT: + case RIGHT: + case SUBSTRING: + case TRIM: + case MICROSECOND: + case SECOND: + case MINUTE: + case HOUR: + case DAY: + case WEEK: + case MONTH: + case QUARTER: + case YEAR: + case ABS: + case ACOS: + case ADD: + case ADDTIME: + case ASCII: + case ASIN: + case ATAN: + case ATAN2: + case CBRT: + case CEIL: + case CEILING: + case CONCAT: + case CONCAT_WS: + case CONV: + case CONVERT_TZ: + case COS: + case COSH: + case COT: + case CRC32: + case CURDATE: + case CURTIME: + case CURRENT_DATE: + case CURRENT_TIME: + case CURRENT_TIMESTAMP: + case DATE: + case DATE_ADD: + case DATE_FORMAT: + case DATE_SUB: + case DATEDIFF: + case DAYNAME: + case DAYOFMONTH: + case DAYOFWEEK: + case DAYOFYEAR: + case DEGREES: + case DIVIDE: + case E: + case EXP: + case EXPM1: + case FLOOR: + case FROM_DAYS: + case FROM_UNIXTIME: + case IF: + case IFNULL: + case ISNULL: + case LAST_DAY: + case LENGTH: + case LN: + case LOCALTIME: + case LOCALTIMESTAMP: + case LOCATE: + case LOG: + case LOG10: + case LOG2: + case LOWER: + case LTRIM: + case MAKEDATE: + case MAKETIME: + case MODULUS: + case MONTHNAME: + case MULTIPLY: + case NOW: + case NULLIF: + case PERIOD_ADD: + case PERIOD_DIFF: + case PI: + case POW: + case POWER: + case RADIANS: + case RAND: + case REPLACE: + case RINT: + case ROUND: + case RTRIM: + case REVERSE: + case SEC_TO_TIME: + case SIGN: + case SIGNUM: + case SIN: + case SINH: + case SQRT: + case STR_TO_DATE: + case SUBDATE: + case SUBTIME: + case SUBTRACT: + case SYSDATE: + case TAN: + case TIME: + case TIMEDIFF: + case TIME_FORMAT: + case TIME_TO_SEC: + case TIMESTAMP: + case TRUNCATE: + case TO_DAYS: + case TO_SECONDS: + case UNIX_TIMESTAMP: + case UPPER: + case UTC_DATE: + case UTC_TIME: + case UTC_TIMESTAMP: + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + case HOUR_OF_DAY: + case MINUTE_OF_DAY: + case MINUTE_OF_HOUR: + case MONTH_OF_YEAR: + case NESTED: + case SECOND_OF_MINUTE: + case TYPEOF: + case WEEK_OF_YEAR: + case WEEKOFYEAR: + case WEEKDAY: + case SUBSTR: + case STRCMP: + case ADDDATE: + case YEARWEEK: + case MOD: + enterOuterAlt(_localctx, 4); + { + setState(1106); + scalarFunctionName(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class KeywordsCanBeIdContext extends ParserRuleContext { + public TerminalNode FULL() { return getToken(OpenSearchSQLParser.FULL, 0); } + public TerminalNode FIELD() { return getToken(OpenSearchSQLParser.FIELD, 0); } + public TerminalNode D() { return getToken(OpenSearchSQLParser.D, 0); } + public TerminalNode T() { return getToken(OpenSearchSQLParser.T, 0); } + public TerminalNode TS() { return getToken(OpenSearchSQLParser.TS, 0); } + public TerminalNode COUNT() { return getToken(OpenSearchSQLParser.COUNT, 0); } + public TerminalNode SUM() { return getToken(OpenSearchSQLParser.SUM, 0); } + public TerminalNode AVG() { return getToken(OpenSearchSQLParser.AVG, 0); } + public TerminalNode MAX() { return getToken(OpenSearchSQLParser.MAX, 0); } + public TerminalNode MIN() { return getToken(OpenSearchSQLParser.MIN, 0); } + public TerminalNode FIRST() { return getToken(OpenSearchSQLParser.FIRST, 0); } + public TerminalNode LAST() { return getToken(OpenSearchSQLParser.LAST, 0); } + public TerminalNode TYPE() { return getToken(OpenSearchSQLParser.TYPE, 0); } + public KeywordsCanBeIdContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_keywordsCanBeId; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).enterKeywordsCanBeId(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof OpenSearchSQLParserListener ) ((OpenSearchSQLParserListener)listener).exitKeywordsCanBeId(this); + } + } + + public final KeywordsCanBeIdContext keywordsCanBeId() throws RecognitionException { + KeywordsCanBeIdContext _localctx = new KeywordsCanBeIdContext(_ctx, getState()); + enterRule(_localctx, 226, RULE_keywordsCanBeId); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1109); + _la = _input.LA(1); + if ( !(((((_la - 26)) & ~0x3f) == 0 && ((1L << (_la - 26)) & 18031440939713537L) != 0) || ((((_la - 206)) & ~0x3f) == 0 && ((1L << (_la - 206)) & 16391L) != 0) || _la==TYPE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 45: + return expression_sempred((ExpressionContext)_localctx, predIndex); + case 46: + return predicate_sempred((PredicateContext)_localctx, predIndex); + case 48: + return expressionAtom_sempred((ExpressionAtomContext)_localctx, predIndex); + } + return true; + } + private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return precpred(_ctx, 3); + case 1: + return precpred(_ctx, 2); + } + return true; + } + private boolean predicate_sempred(PredicateContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return precpred(_ctx, 6); + case 3: + return precpred(_ctx, 4); + case 4: + return precpred(_ctx, 3); + case 5: + return precpred(_ctx, 2); + case 6: + return precpred(_ctx, 5); + case 7: + return precpred(_ctx, 1); + } + return true; + } + private boolean expressionAtom_sempred(ExpressionAtomContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return precpred(_ctx, 2); + case 9: + return precpred(_ctx, 1); + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0001\u0160\u0458\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ + "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ + "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ + "\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ + "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ + "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ + "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ + "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+ + "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+ + "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+ + "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+ + "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+ + ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+ + "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+ + "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+ + ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+ + "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007"+ + "E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007"+ + "J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007"+ + "O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007"+ + "T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007"+ + "Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007"+ + "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+ + "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+ + "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007"+ + "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0001\u0000"+ + "\u0003\u0000\u00e6\b\u0000\u0001\u0000\u0003\u0000\u00e9\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0003\u0001\u00ef\b\u0001\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0003"+ + "\u0004\u00f7\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u0101\b\u0006\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0003\t\u010c\b\t\u0001\n\u0004\n\u010f\b\n\u000b\n\f\n\u0110"+ + "\u0001\u000b\u0001\u000b\u0003\u000b\u0115\b\u000b\u0001\u000b\u0003\u000b"+ + "\u0118\b\u000b\u0001\f\u0001\f\u0003\f\u011c\b\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0003\u000e\u0124\b\u000e\u0001\u000e"+ + "\u0001\u000e\u0005\u000e\u0128\b\u000e\n\u000e\f\u000e\u012b\t\u000e\u0001"+ + "\u000f\u0001\u000f\u0003\u000f\u012f\b\u000f\u0001\u000f\u0003\u000f\u0132"+ + "\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0137\b\u0010"+ + "\u0001\u0010\u0003\u0010\u013a\b\u0010\u0001\u0010\u0003\u0010\u013d\b"+ + "\u0010\u0001\u0010\u0003\u0010\u0140\b\u0010\u0001\u0011\u0001\u0011\u0003"+ + "\u0011\u0144\b\u0011\u0001\u0011\u0003\u0011\u0147\b\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u014d\b\u0011\u0001\u0011"+ + "\u0001\u0011\u0003\u0011\u0151\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0005\u0014\u015d\b\u0014\n\u0014\f\u0014\u0160\t\u0014\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0005\u0017\u016c\b\u0017\n"+ + "\u0017\f\u0017\u016f\t\u0017\u0001\u0018\u0001\u0018\u0003\u0018\u0173"+ + "\b\u0018\u0001\u0018\u0001\u0018\u0003\u0018\u0177\b\u0018\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u017d\b\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019"+ + "\u0185\b\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0003\u001b\u018d\b\u001b\u0001\u001b\u0001\u001b\u0003\u001b"+ + "\u0191\b\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u0196\b"+ + "\u001c\u0001\u001c\u0003\u001c\u0199\b\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d\u01a2"+ + "\b\u001d\n\u001d\f\u001d\u01a5\t\u001d\u0001\u001e\u0001\u001e\u0003\u001e"+ + "\u01a9\b\u001e\u0001\u001e\u0001\u001e\u0003\u001e\u01ad\b\u001e\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0003\u001e\u01b4"+ + "\b\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0003 \u01ba\b \u0001!"+ + "\u0001!\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0003&\u01c9\b&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0003\'\u01d2\b\'\u0001(\u0001(\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0003(\u01db\b(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0001)\u0003)\u01e4\b)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0003-\u01f2\b-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0005-\u01fa\b-\n-\f-\u01fd\t-\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0208\b.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u0211\b.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u021d\b.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0005.\u0224\b.\n.\f.\u0227\t.\u0001/\u0001"+ + "/\u0001/\u0005/\u022c\b/\n/\f/\u022f\t/\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00010\u00030\u0239\b0\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00050\u0241\b0\n0\f0\u0244\t0\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00011\u00031\u0251\b1\u00012\u0003"+ + "2\u0254\b2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00033\u0267"+ + "\b3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0003"+ + "3\u0272\b3\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u0001"+ + "4\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u0001"+ + "9\u0001:\u0001:\u0001;\u0001;\u0003;\u0295\b;\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0005<\u029c\b<\n<\f<\u029f\t<\u0001<\u0001<\u0001=\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0003?\u02b7\b?\u0001"+ + "@\u0001@\u0001@\u0004@\u02bc\b@\u000b@\f@\u02bd\u0001@\u0001@\u0003@\u02c2"+ + "\b@\u0001@\u0001@\u0001@\u0001@\u0004@\u02c8\b@\u000b@\f@\u02c9\u0001"+ + "@\u0001@\u0003@\u02ce\b@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0003@\u02d9\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0003"+ + "A\u02e0\bA\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u02e7\bB\u0001B\u0001"+ + "B\u0001C\u0001C\u0001C\u0001C\u0001C\u0005C\u02f0\bC\nC\fC\u02f3\tC\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0005D\u02fe"+ + "\bD\nD\fD\u0301\tD\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0005E\u030b\bE\nE\fE\u030e\tE\u0001E\u0001E\u0001E\u0001E\u0001E\u0005"+ + "E\u0315\bE\nE\fE\u0318\tE\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0005E\u0323\bE\nE\fE\u0326\tE\u0001E\u0001E\u0003E\u032a"+ + "\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0005F\u0333\bF\n"+ + "F\fF\u0336\tF\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G"+ + "\u0001G\u0005G\u0341\bG\nG\fG\u0344\tG\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0003H\u0352\bH\u0001"+ + "I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0003J\u0369\bJ\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0003"+ + "K\u0372\bK\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0003N\u0399"+ + "\bN\u0001O\u0001O\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0003Q\u03da\bQ\u0001R\u0001R\u0001S\u0001S\u0001"+ + "T\u0001T\u0001U\u0001U\u0001V\u0001V\u0001W\u0001W\u0001X\u0001X\u0001"+ + "Y\u0001Y\u0001Z\u0001Z\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0005\\\u03f3"+ + "\b\\\n\\\f\\\u03f6\t\\\u0003\\\u03f8\b\\\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0003^\u0404\b^\u0001_\u0001_\u0001"+ + "_\u0001_\u0001`\u0001`\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0003b\u0416\bb\u0001c\u0001c\u0001d\u0001d\u0003"+ + "d\u041c\bd\u0001e\u0001e\u0001f\u0001f\u0003f\u0422\bf\u0001g\u0001g\u0001"+ + "h\u0001h\u0001h\u0003h\u0429\bh\u0001i\u0001i\u0001i\u0001i\u0001j\u0001"+ + "j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0003j\u0439"+ + "\bj\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ + "n\u0001o\u0001o\u0001o\u0005o\u0448\bo\no\fo\u044b\to\u0001p\u0003p\u044e"+ + "\bp\u0001p\u0001p\u0001p\u0001p\u0003p\u0454\bp\u0001q\u0001q\u0001q\u0001"+ + "\u0110\u0003Z\\`r\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ + "\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfh"+ + "jlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092"+ + "\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa"+ + "\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2"+ + "\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da"+ + "\u00dc\u00de\u00e0\u00e2\u0000!\u0002\u0000\u013a\u013a\u015d\u015d\u0002"+ + "\u0000\u0005\u0005\u0014\u0014\u0002\u0000\b\b\u0012\u0012\u0002\u0000"+ + "\u001a\u001a$$\u0001\u0000\u00d3\u00d5\u0002\u0000\u014f\u0151\u0158\u0158"+ + "\u0002\u0000\u0157\u0157\u015e\u015e\u0002\u0000\u0018\u0018;;\u0001\u0000"+ + "\u013b\u013c\u0002\u0000\u0080\u0080\u00ce\u00ce\u0002\u0000\u00c1\u00c1"+ + "\u00cf\u00cf\u0002\u0000\u00c5\u00c5\u00d0\u00d0\u0003\u0000}\u007f\u0099"+ + "\u009a\u00cb\u00cd\u0001\u0000Sf\u0001\u0000\u0138\u013a\u0001\u0000\u0105"+ + "\u0106\u0004\u0000\u0010\u0010\u0080\u0080\u00c1\u00c1\u00c5\u00c5\u0001"+ + "\u0000S[\u0001\u0000\\f\u0001\u0000\u00f8\u00f9\u0001\u0000AL\u0007\u0000"+ + "iimowy\u0089\u0089\u00ae\u00ae\u00b8\u00b9\u00c0\u00c0\u0006\u0000jj\u008a"+ + "\u008a\u00a3\u00a3\u00a5\u00a5\u00be\u00be\u013e\u013e\f\u0000%%66MNl"+ + "lst\u0097\u0097\u009b\u009b\u009f\u00a0\u00b0\u00b0\u00b3\u00b4\u00ca"+ + "\u00ca\u010e\u010f\u0002\u0000\u0093\u0095\u00a7\u00a7\u0001\u0000\u00fe"+ + "\u0100\u0005\u0000))\u00e8\u00ea\u00ed\u00ef\u010c\u010d\u0137\u0137\u0002"+ + "\u0000\u00eb\u00ec\u00f3\u00f5\u0002\u0000\u00e8\u00e9\u00ee\u00ef\u0001"+ + "\u0000\u00f3\u00f4\u0001\u0000\u0112\u0133\u0001\u0000\u0135\u0136\u0007"+ + "\u0000\u001a\u001a$$AEPP\u00ce\u00d0\u00dc\u00dc\u0132\u0132\u04c4\u0000"+ + "\u00e5\u0001\u0000\u0000\u0000\u0002\u00ee\u0001\u0000\u0000\u0000\u0004"+ + "\u00f0\u0001\u0000\u0000\u0000\u0006\u00f2\u0001\u0000\u0000\u0000\b\u00f6"+ + "\u0001\u0000\u0000\u0000\n\u00f8\u0001\u0000\u0000\u0000\f\u00fc\u0001"+ + "\u0000\u0000\u0000\u000e\u0102\u0001\u0000\u0000\u0000\u0010\u0106\u0001"+ + "\u0000\u0000\u0000\u0012\u010b\u0001\u0000\u0000\u0000\u0014\u010e\u0001"+ + "\u0000\u0000\u0000\u0016\u0112\u0001\u0000\u0000\u0000\u0018\u0119\u0001"+ + "\u0000\u0000\u0000\u001a\u011f\u0001\u0000\u0000\u0000\u001c\u0123\u0001"+ + "\u0000\u0000\u0000\u001e\u012c\u0001\u0000\u0000\u0000 \u0133\u0001\u0000"+ + "\u0000\u0000\"\u0150\u0001\u0000\u0000\u0000$\u0152\u0001\u0000\u0000"+ + "\u0000&\u0155\u0001\u0000\u0000\u0000(\u0159\u0001\u0000\u0000\u0000*"+ + "\u0161\u0001\u0000\u0000\u0000,\u0163\u0001\u0000\u0000\u0000.\u0166\u0001"+ + "\u0000\u0000\u00000\u0170\u0001\u0000\u0000\u00002\u0184\u0001\u0000\u0000"+ + "\u00004\u0186\u0001\u0000\u0000\u00006\u0190\u0001\u0000\u0000\u00008"+ + "\u0192\u0001\u0000\u0000\u0000:\u019c\u0001\u0000\u0000\u0000<\u01b3\u0001"+ + "\u0000\u0000\u0000>\u01b5\u0001\u0000\u0000\u0000@\u01b9\u0001\u0000\u0000"+ + "\u0000B\u01bb\u0001\u0000\u0000\u0000D\u01bd\u0001\u0000\u0000\u0000F"+ + "\u01bf\u0001\u0000\u0000\u0000H\u01c1\u0001\u0000\u0000\u0000J\u01c3\u0001"+ + "\u0000\u0000\u0000L\u01c8\u0001\u0000\u0000\u0000N\u01d1\u0001\u0000\u0000"+ + "\u0000P\u01da\u0001\u0000\u0000\u0000R\u01e3\u0001\u0000\u0000\u0000T"+ + "\u01e5\u0001\u0000\u0000\u0000V\u01e7\u0001\u0000\u0000\u0000X\u01eb\u0001"+ + "\u0000\u0000\u0000Z\u01f1\u0001\u0000\u0000\u0000\\\u01fe\u0001\u0000"+ + "\u0000\u0000^\u0228\u0001\u0000\u0000\u0000`\u0238\u0001\u0000\u0000\u0000"+ + "b\u0250\u0001\u0000\u0000\u0000d\u0253\u0001\u0000\u0000\u0000f\u0271"+ + "\u0001\u0000\u0000\u0000h\u0273\u0001\u0000\u0000\u0000j\u027c\u0001\u0000"+ + "\u0000\u0000l\u027e\u0001\u0000\u0000\u0000n\u0285\u0001\u0000\u0000\u0000"+ + "p\u0287\u0001\u0000\u0000\u0000r\u028e\u0001\u0000\u0000\u0000t\u0290"+ + "\u0001\u0000\u0000\u0000v\u0294\u0001\u0000\u0000\u0000x\u0296\u0001\u0000"+ + "\u0000\u0000z\u02a2\u0001\u0000\u0000\u0000|\u02a9\u0001\u0000\u0000\u0000"+ + "~\u02b6\u0001\u0000\u0000\u0000\u0080\u02d8\u0001\u0000\u0000\u0000\u0082"+ + "\u02df\u0001\u0000\u0000\u0000\u0084\u02e1\u0001\u0000\u0000\u0000\u0086"+ + "\u02ea\u0001\u0000\u0000\u0000\u0088\u02f6\u0001\u0000\u0000\u0000\u008a"+ + "\u0329\u0001\u0000\u0000\u0000\u008c\u032b\u0001\u0000\u0000\u0000\u008e"+ + "\u0339\u0001\u0000\u0000\u0000\u0090\u0351\u0001\u0000\u0000\u0000\u0092"+ + "\u0353\u0001\u0000\u0000\u0000\u0094\u0368\u0001\u0000\u0000\u0000\u0096"+ + "\u036a\u0001\u0000\u0000\u0000\u0098\u0375\u0001\u0000\u0000\u0000\u009a"+ + "\u037b\u0001\u0000\u0000\u0000\u009c\u0398\u0001\u0000\u0000\u0000\u009e"+ + "\u039a\u0001\u0000\u0000\u0000\u00a0\u039c\u0001\u0000\u0000\u0000\u00a2"+ + "\u03d9\u0001\u0000\u0000\u0000\u00a4\u03db\u0001\u0000\u0000\u0000\u00a6"+ + "\u03dd\u0001\u0000\u0000\u0000\u00a8\u03df\u0001\u0000\u0000\u0000\u00aa"+ + "\u03e1\u0001\u0000\u0000\u0000\u00ac\u03e3\u0001\u0000\u0000\u0000\u00ae"+ + "\u03e5\u0001\u0000\u0000\u0000\u00b0\u03e7\u0001\u0000\u0000\u0000\u00b2"+ + "\u03e9\u0001\u0000\u0000\u0000\u00b4\u03eb\u0001\u0000\u0000\u0000\u00b6"+ + "\u03ed\u0001\u0000\u0000\u0000\u00b8\u03f7\u0001\u0000\u0000\u0000\u00ba"+ + "\u03f9\u0001\u0000\u0000\u0000\u00bc\u0403\u0001\u0000\u0000\u0000\u00be"+ + "\u0405\u0001\u0000\u0000\u0000\u00c0\u0409\u0001\u0000\u0000\u0000\u00c2"+ + "\u040b\u0001\u0000\u0000\u0000\u00c4\u0415\u0001\u0000\u0000\u0000\u00c6"+ + "\u0417\u0001\u0000\u0000\u0000\u00c8\u041b\u0001\u0000\u0000\u0000\u00ca"+ + "\u041d\u0001\u0000\u0000\u0000\u00cc\u0421\u0001\u0000\u0000\u0000\u00ce"+ + "\u0423\u0001\u0000\u0000\u0000\u00d0\u0428\u0001\u0000\u0000\u0000\u00d2"+ + "\u042a\u0001\u0000\u0000\u0000\u00d4\u0438\u0001\u0000\u0000\u0000\u00d6"+ + "\u043a\u0001\u0000\u0000\u0000\u00d8\u043c\u0001\u0000\u0000\u0000\u00da"+ + "\u043e\u0001\u0000\u0000\u0000\u00dc\u0442\u0001\u0000\u0000\u0000\u00de"+ + "\u0444\u0001\u0000\u0000\u0000\u00e0\u0453\u0001\u0000\u0000\u0000\u00e2"+ + "\u0455\u0001\u0000\u0000\u0000\u00e4\u00e6\u0003\u0002\u0001\u0000\u00e5"+ + "\u00e4\u0001\u0000\u0000\u0000\u00e5\u00e6\u0001\u0000\u0000\u0000\u00e6"+ + "\u00e8\u0001\u0000\u0000\u0000\u00e7\u00e9\u0005\u014d\u0000\u0000\u00e8"+ + "\u00e7\u0001\u0000\u0000\u0000\u00e8\u00e9\u0001\u0000\u0000\u0000\u00e9"+ + "\u00ea\u0001\u0000\u0000\u0000\u00ea\u00eb\u0005\u0000\u0000\u0001\u00eb"+ + "\u0001\u0001\u0000\u0000\u0000\u00ec\u00ef\u0003\u0004\u0002\u0000\u00ed"+ + "\u00ef\u0003\b\u0004\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ee\u00ed"+ + "\u0001\u0000\u0000\u0000\u00ef\u0003\u0001\u0000\u0000\u0000\u00f0\u00f1"+ + "\u0003\u0006\u0003\u0000\u00f1\u0005\u0001\u0000\u0000\u0000\u00f2\u00f3"+ + "\u0003\u0016\u000b\u0000\u00f3\u0007\u0001\u0000\u0000\u0000\u00f4\u00f7"+ + "\u0003\n\u0005\u0000\u00f5\u00f7\u0003\f\u0006\u0000\u00f6\u00f4\u0001"+ + "\u0000\u0000\u0000\u00f6\u00f5\u0001\u0000\u0000\u0000\u00f7\t\u0001\u0000"+ + "\u0000\u0000\u00f8\u00f9\u00058\u0000\u0000\u00f9\u00fa\u0005g\u0000\u0000"+ + "\u00fa\u00fb\u0003\u0010\b\u0000\u00fb\u000b\u0001\u0000\u0000\u0000\u00fc"+ + "\u00fd\u0005\u0013\u0000\u0000\u00fd\u00fe\u0005g\u0000\u0000\u00fe\u0100"+ + "\u0003\u0010\b\u0000\u00ff\u0101\u0003\u000e\u0007\u0000\u0100\u00ff\u0001"+ + "\u0000\u0000\u0000\u0100\u0101\u0001\u0000\u0000\u0000\u0101\r\u0001\u0000"+ + "\u0000\u0000\u0102\u0103\u0005\u000f\u0000\u0000\u0103\u0104\u0005&\u0000"+ + "\u0000\u0104\u0105\u0003\u0012\t\u0000\u0105\u000f\u0001\u0000\u0000\u0000"+ + "\u0106\u0107\u0005&\u0000\u0000\u0107\u0108\u0003\u0012\t\u0000\u0108"+ + "\u0011\u0001\u0000\u0000\u0000\u0109\u010c\u0003\u0014\n\u0000\u010a\u010c"+ + "\u0003B!\u0000\u010b\u0109\u0001\u0000\u0000\u0000\u010b\u010a\u0001\u0000"+ + "\u0000\u0000\u010c\u0013\u0001\u0000\u0000\u0000\u010d\u010f\u0007\u0000"+ + "\u0000\u0000\u010e\u010d\u0001\u0000\u0000\u0000\u010f\u0110\u0001\u0000"+ + "\u0000\u0000\u0110\u0111\u0001\u0000\u0000\u0000\u0110\u010e\u0001\u0000"+ + "\u0000\u0000\u0111\u0015\u0001\u0000\u0000\u0000\u0112\u0114\u0003\u0018"+ + "\f\u0000\u0113\u0115\u0003 \u0010\u0000\u0114\u0113\u0001\u0000\u0000"+ + "\u0000\u0114\u0115\u0001\u0000\u0000\u0000\u0115\u0117\u0001\u0000\u0000"+ + "\u0000\u0116\u0118\u00032\u0019\u0000\u0117\u0116\u0001\u0000\u0000\u0000"+ + "\u0117\u0118\u0001\u0000\u0000\u0000\u0118\u0017\u0001\u0000\u0000\u0000"+ + "\u0119\u011b\u00057\u0000\u0000\u011a\u011c\u0003\u001a\r\u0000\u011b"+ + "\u011a\u0001\u0000\u0000\u0000\u011b\u011c\u0001\u0000\u0000\u0000\u011c"+ + "\u011d\u0001\u0000\u0000\u0000\u011d\u011e\u0003\u001c\u000e\u0000\u011e"+ + "\u0019\u0001\u0000\u0000\u0000\u011f\u0120\u0007\u0001\u0000\u0000\u0120"+ + "\u001b\u0001\u0000\u0000\u0000\u0121\u0124\u0005\u0138\u0000\u0000\u0122"+ + "\u0124\u0003\u001e\u000f\u0000\u0123\u0121\u0001\u0000\u0000\u0000\u0123"+ + "\u0122\u0001\u0000\u0000\u0000\u0124\u0129\u0001\u0000\u0000\u0000\u0125"+ + "\u0126\u0005\u014c\u0000\u0000\u0126\u0128\u0003\u001e\u000f\u0000\u0127"+ + "\u0125\u0001\u0000\u0000\u0000\u0128\u012b\u0001\u0000\u0000\u0000\u0129"+ + "\u0127\u0001\u0000\u0000\u0000\u0129\u012a\u0001\u0000\u0000\u0000\u012a"+ + "\u001d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000\u012c"+ + "\u0131\u0003Z-\u0000\u012d\u012f\u0005\u0007\u0000\u0000\u012e\u012d\u0001"+ + "\u0000\u0000\u0000\u012e\u012f\u0001\u0000\u0000\u0000\u012f\u0130\u0001"+ + "\u0000\u0000\u0000\u0130\u0132\u0003\u00dcn\u0000\u0131\u012e\u0001\u0000"+ + "\u0000\u0000\u0131\u0132\u0001\u0000\u0000\u0000\u0132\u001f\u0001\u0000"+ + "\u0000\u0000\u0133\u0134\u0005\u001b\u0000\u0000\u0134\u0136\u0003\"\u0011"+ + "\u0000\u0135\u0137\u0003$\u0012\u0000\u0136\u0135\u0001\u0000\u0000\u0000"+ + "\u0136\u0137\u0001\u0000\u0000\u0000\u0137\u0139\u0001\u0000\u0000\u0000"+ + "\u0138\u013a\u0003&\u0013\u0000\u0139\u0138\u0001\u0000\u0000\u0000\u0139"+ + "\u013a\u0001\u0000\u0000\u0000\u013a\u013c\u0001\u0000\u0000\u0000\u013b"+ + "\u013d\u0003,\u0016\u0000\u013c\u013b\u0001\u0000\u0000\u0000\u013c\u013d"+ + "\u0001\u0000\u0000\u0000\u013d\u013f\u0001\u0000\u0000\u0000\u013e\u0140"+ + "\u0003.\u0017\u0000\u013f\u013e\u0001\u0000\u0000\u0000\u013f\u0140\u0001"+ + "\u0000\u0000\u0000\u0140!\u0001\u0000\u0000\u0000\u0141\u0146\u0003\u00d6"+ + "k\u0000\u0142\u0144\u0005\u0007\u0000\u0000\u0143\u0142\u0001\u0000\u0000"+ + "\u0000\u0143\u0144\u0001\u0000\u0000\u0000\u0144\u0145\u0001\u0000\u0000"+ + "\u0000\u0145\u0147\u0003\u00dcn\u0000\u0146\u0143\u0001\u0000\u0000\u0000"+ + "\u0146\u0147\u0001\u0000\u0000\u0000\u0147\u0151\u0001\u0000\u0000\u0000"+ + "\u0148\u0149\u0005\u0148\u0000\u0000\u0149\u014a\u0003\u0016\u000b\u0000"+ + "\u014a\u014c\u0005\u0149\u0000\u0000\u014b\u014d\u0005\u0007\u0000\u0000"+ + "\u014c\u014b\u0001\u0000\u0000\u0000\u014c\u014d\u0001\u0000\u0000\u0000"+ + "\u014d\u014e\u0001\u0000\u0000\u0000\u014e\u014f\u0003\u00dcn\u0000\u014f"+ + "\u0151\u0001\u0000\u0000\u0000\u0150\u0141\u0001\u0000\u0000\u0000\u0150"+ + "\u0148\u0001\u0000\u0000\u0000\u0151#\u0001\u0000\u0000\u0000\u0152\u0153"+ + "\u0005?\u0000\u0000\u0153\u0154\u0003Z-\u0000\u0154%\u0001\u0000\u0000"+ + "\u0000\u0155\u0156\u0005\u001c\u0000\u0000\u0156\u0157\u0005\u000b\u0000"+ + "\u0000\u0157\u0158\u0003(\u0014\u0000\u0158\'\u0001\u0000\u0000\u0000"+ + "\u0159\u015e\u0003*\u0015\u0000\u015a\u015b\u0005\u014c\u0000\u0000\u015b"+ + "\u015d\u0003*\u0015\u0000\u015c\u015a\u0001\u0000\u0000\u0000\u015d\u0160"+ + "\u0001\u0000\u0000\u0000\u015e\u015c\u0001\u0000\u0000\u0000\u015e\u015f"+ + "\u0001\u0000\u0000\u0000\u015f)\u0001\u0000\u0000\u0000\u0160\u015e\u0001"+ + "\u0000\u0000\u0000\u0161\u0162\u0003Z-\u0000\u0162+\u0001\u0000\u0000"+ + "\u0000\u0163\u0164\u0005\u001d\u0000\u0000\u0164\u0165\u0003Z-\u0000\u0165"+ + "-\u0001\u0000\u0000\u0000\u0166\u0167\u00051\u0000\u0000\u0167\u0168\u0005"+ + "\u000b\u0000\u0000\u0168\u016d\u00030\u0018\u0000\u0169\u016a\u0005\u014c"+ + "\u0000\u0000\u016a\u016c\u00030\u0018\u0000\u016b\u0169\u0001\u0000\u0000"+ + "\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016b\u0001\u0000\u0000"+ + "\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e/\u0001\u0000\u0000\u0000"+ + "\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0172\u0003Z-\u0000\u0171\u0173"+ + "\u0007\u0002\u0000\u0000\u0172\u0171\u0001\u0000\u0000\u0000\u0172\u0173"+ + "\u0001\u0000\u0000\u0000\u0173\u0176\u0001\u0000\u0000\u0000\u0174\u0175"+ + "\u0005.\u0000\u0000\u0175\u0177\u0007\u0003\u0000\u0000\u0176\u0174\u0001"+ + "\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u01771\u0001\u0000"+ + "\u0000\u0000\u0178\u017c\u0005\'\u0000\u0000\u0179\u017a\u0003>\u001f"+ + "\u0000\u017a\u017b\u0005\u014c\u0000\u0000\u017b\u017d\u0001\u0000\u0000"+ + "\u0000\u017c\u0179\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000"+ + "\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u0185\u0003>\u001f\u0000"+ + "\u017f\u0180\u0005\'\u0000\u0000\u0180\u0181\u0003>\u001f\u0000\u0181"+ + "\u0182\u0005Q\u0000\u0000\u0182\u0183\u0003>\u001f\u0000\u0183\u0185\u0001"+ + "\u0000\u0000\u0000\u0184\u0178\u0001\u0000\u0000\u0000\u0184\u017f\u0001"+ + "\u0000\u0000\u0000\u01853\u0001\u0000\u0000\u0000\u0186\u0187\u00036\u001b"+ + "\u0000\u0187\u0188\u00038\u001c\u0000\u01885\u0001\u0000\u0000\u0000\u0189"+ + "\u018a\u0007\u0004\u0000\u0000\u018a\u018c\u0005\u0148\u0000\u0000\u018b"+ + "\u018d\u0003\u00b8\\\u0000\u018c\u018b\u0001\u0000\u0000\u0000\u018c\u018d"+ + "\u0001\u0000\u0000\u0000\u018d\u018e\u0001\u0000\u0000\u0000\u018e\u0191"+ + "\u0005\u0149\u0000\u0000\u018f\u0191\u0003\u0094J\u0000\u0190\u0189\u0001"+ + "\u0000\u0000\u0000\u0190\u018f\u0001\u0000\u0000\u0000\u01917\u0001\u0000"+ + "\u0000\u0000\u0192\u0193\u00053\u0000\u0000\u0193\u0195\u0005\u0148\u0000"+ + "\u0000\u0194\u0196\u0003:\u001d\u0000\u0195\u0194\u0001\u0000\u0000\u0000"+ + "\u0195\u0196\u0001\u0000\u0000\u0000\u0196\u0198\u0001\u0000\u0000\u0000"+ + "\u0197\u0199\u0003.\u0017\u0000\u0198\u0197\u0001\u0000\u0000\u0000\u0198"+ + "\u0199\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a"+ + "\u019b\u0005\u0149\u0000\u0000\u019b9\u0001\u0000\u0000\u0000\u019c\u019d"+ + "\u00054\u0000\u0000\u019d\u019e\u0005\u000b\u0000\u0000\u019e\u01a3\u0003"+ + "Z-\u0000\u019f\u01a0\u0005\u014c\u0000\u0000\u01a0\u01a2\u0003Z-\u0000"+ + "\u01a1\u019f\u0001\u0000\u0000\u0000\u01a2\u01a5\u0001\u0000\u0000\u0000"+ + "\u01a3\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a4\u0001\u0000\u0000\u0000"+ + "\u01a4;\u0001\u0000\u0000\u0000\u01a5\u01a3\u0001\u0000\u0000\u0000\u01a6"+ + "\u01b4\u0003B!\u0000\u01a7\u01a9\u0003H$\u0000\u01a8\u01a7\u0001\u0000"+ + "\u0000\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000"+ + "\u0000\u0000\u01aa\u01b4\u0003>\u001f\u0000\u01ab\u01ad\u0003H$\u0000"+ + "\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000"+ + "\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01b4\u0003F#\u0000\u01af\u01b4"+ + "\u0003D\"\u0000\u01b0\u01b4\u0003L&\u0000\u01b1\u01b4\u0003V+\u0000\u01b2"+ + "\u01b4\u0003J%\u0000\u01b3\u01a6\u0001\u0000\u0000\u0000\u01b3\u01a8\u0001"+ + "\u0000\u0000\u0000\u01b3\u01ac\u0001\u0000\u0000\u0000\u01b3\u01af\u0001"+ + "\u0000\u0000\u0000\u01b3\u01b0\u0001\u0000\u0000\u0000\u01b3\u01b1\u0001"+ + "\u0000\u0000\u0000\u01b3\u01b2\u0001\u0000\u0000\u0000\u01b4=\u0001\u0000"+ + "\u0000\u0000\u01b5\u01b6\u0007\u0005\u0000\u0000\u01b6?\u0001\u0000\u0000"+ + "\u0000\u01b7\u01ba\u0003>\u001f\u0000\u01b8\u01ba\u0003F#\u0000\u01b9"+ + "\u01b7\u0001\u0000\u0000\u0000\u01b9\u01b8\u0001\u0000\u0000\u0000\u01ba"+ + "A\u0001\u0000\u0000\u0000\u01bb\u01bc\u0007\u0006\u0000\u0000\u01bcC\u0001"+ + "\u0000\u0000\u0000\u01bd\u01be\u0007\u0007\u0000\u0000\u01beE\u0001\u0000"+ + "\u0000\u0000\u01bf\u01c0\u0005\u015a\u0000\u0000\u01c0G\u0001\u0000\u0000"+ + "\u0000\u01c1\u01c2\u0007\b\u0000\u0000\u01c2I\u0001\u0000\u0000\u0000"+ + "\u01c3\u01c4\u0005-\u0000\u0000\u01c4K\u0001\u0000\u0000\u0000\u01c5\u01c9"+ + "\u0003N\'\u0000\u01c6\u01c9\u0003P(\u0000\u01c7\u01c9\u0003R)\u0000\u01c8"+ + "\u01c5\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c8"+ + "\u01c7\u0001\u0000\u0000\u0000\u01c9M\u0001\u0000\u0000\u0000\u01ca\u01cb"+ + "\u0005\u0080\u0000\u0000\u01cb\u01d2\u0003B!\u0000\u01cc\u01cd\u0005\u00d1"+ + "\u0000\u0000\u01cd\u01ce\u0007\t\u0000\u0000\u01ce\u01cf\u0003B!\u0000"+ + "\u01cf\u01d0\u0005\u00d2\u0000\u0000\u01d0\u01d2\u0001\u0000\u0000\u0000"+ + "\u01d1\u01ca\u0001\u0000\u0000\u0000\u01d1\u01cc\u0001\u0000\u0000\u0000"+ + "\u01d2O\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005\u00c1\u0000\u0000\u01d4"+ + "\u01db\u0003B!\u0000\u01d5\u01d6\u0005\u00d1\u0000\u0000\u01d6\u01d7\u0007"+ + "\n\u0000\u0000\u01d7\u01d8\u0003B!\u0000\u01d8\u01d9\u0005\u00d2\u0000"+ + "\u0000\u01d9\u01db\u0001\u0000\u0000\u0000\u01da\u01d3\u0001\u0000\u0000"+ + "\u0000\u01da\u01d5\u0001\u0000\u0000\u0000\u01dbQ\u0001\u0000\u0000\u0000"+ + "\u01dc\u01dd\u0005\u00c5\u0000\u0000\u01dd\u01e4\u0003B!\u0000\u01de\u01df"+ + "\u0005\u00d1\u0000\u0000\u01df\u01e0\u0007\u000b\u0000\u0000\u01e0\u01e1"+ + "\u0003B!\u0000\u01e1\u01e2\u0005\u00d2\u0000\u0000\u01e2\u01e4\u0001\u0000"+ + "\u0000\u0000\u01e3\u01dc\u0001\u0000\u0000\u0000\u01e3\u01de\u0001\u0000"+ + "\u0000\u0000\u01e4S\u0001\u0000\u0000\u0000\u01e5\u01e6\u0007\f\u0000"+ + "\u0000\u01e6U\u0001\u0000\u0000\u0000\u01e7\u01e8\u0005R\u0000\u0000\u01e8"+ + "\u01e9\u0003Z-\u0000\u01e9\u01ea\u0003X,\u0000\u01eaW\u0001\u0000\u0000"+ + "\u0000\u01eb\u01ec\u0007\r\u0000\u0000\u01ecY\u0001\u0000\u0000\u0000"+ + "\u01ed\u01ee\u0006-\uffff\uffff\u0000\u01ee\u01ef\u0005,\u0000\u0000\u01ef"+ + "\u01f2\u0003Z-\u0004\u01f0\u01f2\u0003\\.\u0000\u01f1\u01ed\u0001\u0000"+ + "\u0000\u0000\u01f1\u01f0\u0001\u0000\u0000\u0000\u01f2\u01fb\u0001\u0000"+ + "\u0000\u0000\u01f3\u01f4\n\u0003\u0000\u0000\u01f4\u01f5\u0005\u0006\u0000"+ + "\u0000\u01f5\u01fa\u0003Z-\u0004\u01f6\u01f7\n\u0002\u0000\u0000\u01f7"+ + "\u01f8\u00050\u0000\u0000\u01f8\u01fa\u0003Z-\u0003\u01f9\u01f3\u0001"+ + "\u0000\u0000\u0000\u01f9\u01f6\u0001\u0000\u0000\u0000\u01fa\u01fd\u0001"+ + "\u0000\u0000\u0000\u01fb\u01f9\u0001\u0000\u0000\u0000\u01fb\u01fc\u0001"+ + "\u0000\u0000\u0000\u01fc[\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001\u0000"+ + "\u0000\u0000\u01fe\u01ff\u0006.\uffff\uffff\u0000\u01ff\u0200\u0003`0"+ + "\u0000\u0200\u0225\u0001\u0000\u0000\u0000\u0201\u0202\n\u0006\u0000\u0000"+ + "\u0202\u0203\u0003b1\u0000\u0203\u0204\u0003\\.\u0007\u0204\u0224\u0001"+ + "\u0000\u0000\u0000\u0205\u0207\n\u0004\u0000\u0000\u0206\u0208\u0005,"+ + "\u0000\u0000\u0207\u0206\u0001\u0000\u0000\u0000\u0207\u0208\u0001\u0000"+ + "\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209\u020a\u0005\n\u0000"+ + "\u0000\u020a\u020b\u0003\\.\u0000\u020b\u020c\u0005\u0006\u0000\u0000"+ + "\u020c\u020d\u0003\\.\u0005\u020d\u0224\u0001\u0000\u0000\u0000\u020e"+ + "\u0210\n\u0003\u0000\u0000\u020f\u0211\u0005,\u0000\u0000\u0210\u020f"+ + "\u0001\u0000\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212"+ + "\u0001\u0000\u0000\u0000\u0212\u0213\u0005&\u0000\u0000\u0213\u0224\u0003"+ + "\\.\u0004\u0214\u0215\n\u0002\u0000\u0000\u0215\u0216\u00055\u0000\u0000"+ + "\u0216\u0224\u0003\\.\u0003\u0217\u0218\n\u0005\u0000\u0000\u0218\u0219"+ + "\u0005\"\u0000\u0000\u0219\u0224\u0003d2\u0000\u021a\u021c\n\u0001\u0000"+ + "\u0000\u021b\u021d\u0005,\u0000\u0000\u021c\u021b\u0001\u0000\u0000\u0000"+ + "\u021c\u021d\u0001\u0000\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000"+ + "\u021e\u021f\u0005\u001e\u0000\u0000\u021f\u0220\u0005\u0148\u0000\u0000"+ + "\u0220\u0221\u0003^/\u0000\u0221\u0222\u0005\u0149\u0000\u0000\u0222\u0224"+ + "\u0001\u0000\u0000\u0000\u0223\u0201\u0001\u0000\u0000\u0000\u0223\u0205"+ + "\u0001\u0000\u0000\u0000\u0223\u020e\u0001\u0000\u0000\u0000\u0223\u0214"+ + "\u0001\u0000\u0000\u0000\u0223\u0217\u0001\u0000\u0000\u0000\u0223\u021a"+ + "\u0001\u0000\u0000\u0000\u0224\u0227\u0001\u0000\u0000\u0000\u0225\u0223"+ + "\u0001\u0000\u0000\u0000\u0225\u0226\u0001\u0000\u0000\u0000\u0226]\u0001"+ + "\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0228\u022d\u0003"+ + "Z-\u0000\u0229\u022a\u0005\u014c\u0000\u0000\u022a\u022c\u0003Z-\u0000"+ + "\u022b\u0229\u0001\u0000\u0000\u0000\u022c\u022f\u0001\u0000\u0000\u0000"+ + "\u022d\u022b\u0001\u0000\u0000\u0000\u022d\u022e\u0001\u0000\u0000\u0000"+ + "\u022e_\u0001\u0000\u0000\u0000\u022f\u022d\u0001\u0000\u0000\u0000\u0230"+ + "\u0231\u00060\uffff\uffff\u0000\u0231\u0239\u0003<\u001e\u0000\u0232\u0239"+ + "\u0003\u00d8l\u0000\u0233\u0239\u0003f3\u0000\u0234\u0235\u0005\u0148"+ + "\u0000\u0000\u0235\u0236\u0003Z-\u0000\u0236\u0237\u0005\u0149\u0000\u0000"+ + "\u0237\u0239\u0001\u0000\u0000\u0000\u0238\u0230\u0001\u0000\u0000\u0000"+ + "\u0238\u0232\u0001\u0000\u0000\u0000\u0238\u0233\u0001\u0000\u0000\u0000"+ + "\u0238\u0234\u0001\u0000\u0000\u0000\u0239\u0242\u0001\u0000\u0000\u0000"+ + "\u023a\u023b\n\u0002\u0000\u0000\u023b\u023c\u0007\u000e\u0000\u0000\u023c"+ + "\u0241\u0003`0\u0003\u023d\u023e\n\u0001\u0000\u0000\u023e\u023f\u0007"+ + "\b\u0000\u0000\u023f\u0241\u0003`0\u0002\u0240\u023a\u0001\u0000\u0000"+ + "\u0000\u0240\u023d\u0001\u0000\u0000\u0000\u0241\u0244\u0001\u0000\u0000"+ + "\u0000\u0242\u0240\u0001\u0000\u0000\u0000\u0242\u0243\u0001\u0000\u0000"+ + "\u0000\u0243a\u0001\u0000\u0000\u0000\u0244\u0242\u0001\u0000\u0000\u0000"+ + "\u0245\u0251\u0005\u013f\u0000\u0000\u0246\u0251\u0005\u0140\u0000\u0000"+ + "\u0247\u0251\u0005\u0141\u0000\u0000\u0248\u0249\u0005\u0141\u0000\u0000"+ + "\u0249\u0251\u0005\u013f\u0000\u0000\u024a\u024b\u0005\u0140\u0000\u0000"+ + "\u024b\u0251\u0005\u013f\u0000\u0000\u024c\u024d\u0005\u0141\u0000\u0000"+ + "\u024d\u0251\u0005\u0140\u0000\u0000\u024e\u024f\u0005\u0142\u0000\u0000"+ + "\u024f\u0251\u0005\u013f\u0000\u0000\u0250\u0245\u0001\u0000\u0000\u0000"+ + "\u0250\u0246\u0001\u0000\u0000\u0000\u0250\u0247\u0001\u0000\u0000\u0000"+ + "\u0250\u0248\u0001\u0000\u0000\u0000\u0250\u024a\u0001\u0000\u0000\u0000"+ + "\u0250\u024c\u0001\u0000\u0000\u0000\u0250\u024e\u0001\u0000\u0000\u0000"+ + "\u0251c\u0001\u0000\u0000\u0000\u0252\u0254\u0005,\u0000\u0000\u0253\u0252"+ + "\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000\u0000\u0000\u0254\u0255"+ + "\u0001\u0000\u0000\u0000\u0255\u0256\u0005-\u0000\u0000\u0256e\u0001\u0000"+ + "\u0000\u0000\u0257\u0258\u0003\u00acV\u0000\u0258\u0259\u0005\u0148\u0000"+ + "\u0000\u0259\u025a\u0003\u00dam\u0000\u025a\u025b\u0005\u0149\u0000\u0000"+ + "\u025b\u0272\u0001\u0000\u0000\u0000\u025c\u025d\u0003~?\u0000\u025d\u025e"+ + "\u0005\u0148\u0000\u0000\u025e\u025f\u0003\u00b8\\\u0000\u025f\u0260\u0005"+ + "\u0149\u0000\u0000\u0260\u0272\u0001\u0000\u0000\u0000\u0261\u0272\u0003"+ + "\u0080@\u0000\u0262\u0272\u00034\u001a\u0000\u0263\u0272\u0003\u0094J"+ + "\u0000\u0264\u0266\u0003\u0094J\u0000\u0265\u0267\u0003.\u0017\u0000\u0266"+ + "\u0265\u0001\u0000\u0000\u0000\u0266\u0267\u0001\u0000\u0000\u0000\u0267"+ + "\u0268\u0001\u0000\u0000\u0000\u0268\u0269\u0003\u0098L\u0000\u0269\u0272"+ + "\u0001\u0000\u0000\u0000\u026a\u0272\u0003\u0084B\u0000\u026b\u0272\u0003"+ + "\u0082A\u0000\u026c\u0272\u0003x<\u0000\u026d\u0272\u0003z=\u0000\u026e"+ + "\u0272\u0003p8\u0000\u026f\u0272\u0003l6\u0000\u0270\u0272\u0003h4\u0000"+ + "\u0271\u0257\u0001\u0000\u0000\u0000\u0271\u025c\u0001\u0000\u0000\u0000"+ + "\u0271\u0261\u0001\u0000\u0000\u0000\u0271\u0262\u0001\u0000\u0000\u0000"+ + "\u0271\u0263\u0001\u0000\u0000\u0000\u0271\u0264\u0001\u0000\u0000\u0000"+ + "\u0271\u026a\u0001\u0000\u0000\u0000\u0271\u026b\u0001\u0000\u0000\u0000"+ + "\u0271\u026c\u0001\u0000\u0000\u0000\u0271\u026d\u0001\u0000\u0000\u0000"+ + "\u0271\u026e\u0001\u0000\u0000\u0000\u0271\u026f\u0001\u0000\u0000\u0000"+ + "\u0271\u0270\u0001\u0000\u0000\u0000\u0272g\u0001\u0000\u0000\u0000\u0273"+ + "\u0274\u0003j5\u0000\u0274\u0275\u0005\u0148\u0000\u0000\u0275\u0276\u0003"+ + "r9\u0000\u0276\u0277\u0005\u014c\u0000\u0000\u0277\u0278\u0003\u00ba]"+ + "\u0000\u0278\u0279\u0005\u014c\u0000\u0000\u0279\u027a\u0003\u00ba]\u0000"+ + "\u027a\u027b\u0005\u0149\u0000\u0000\u027bi\u0001\u0000\u0000\u0000\u027c"+ + "\u027d\u0007\u000f\u0000\u0000\u027dk\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0005\u0092\u0000\u0000\u027f\u0280\u0005\u0148\u0000\u0000\u0280\u0281"+ + "\u0003n7\u0000\u0281\u0282\u0005\u014c\u0000\u0000\u0282\u0283\u0003\u00ba"+ + "]\u0000\u0283\u0284\u0005\u0149\u0000\u0000\u0284m\u0001\u0000\u0000\u0000"+ + "\u0285\u0286\u0007\u0010\u0000\u0000\u0286o\u0001\u0000\u0000\u0000\u0287"+ + "\u0288\u0005\u008e\u0000\u0000\u0288\u0289\u0005\u0148\u0000\u0000\u0289"+ + "\u028a\u0003v;\u0000\u028a\u028b\u0005\u001b\u0000\u0000\u028b\u028c\u0003"+ + "\u00ba]\u0000\u028c\u028d\u0005\u0149\u0000\u0000\u028dq\u0001\u0000\u0000"+ + "\u0000\u028e\u028f\u0007\u0011\u0000\u0000\u028fs\u0001\u0000\u0000\u0000"+ + "\u0290\u0291\u0007\u0012\u0000\u0000\u0291u\u0001\u0000\u0000\u0000\u0292"+ + "\u0295\u0003r9\u0000\u0293\u0295\u0003t:\u0000\u0294\u0292\u0001\u0000"+ + "\u0000\u0000\u0294\u0293\u0001\u0000\u0000\u0000\u0295w\u0001\u0000\u0000"+ + "\u0000\u0296\u0297\u0005\u0134\u0000\u0000\u0297\u0298\u0005\u0148\u0000"+ + "\u0000\u0298\u029d\u0003\u00c8d\u0000\u0299\u029a\u0005\u014c\u0000\u0000"+ + "\u029a\u029c\u0003\u00be_\u0000\u029b\u0299\u0001\u0000\u0000\u0000\u029c"+ + "\u029f\u0001\u0000\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029d"+ + "\u029e\u0001\u0000\u0000\u0000\u029e\u02a0\u0001\u0000\u0000\u0000\u029f"+ + "\u029d\u0001\u0000\u0000\u0000\u02a0\u02a1\u0005\u0149\u0000\u0000\u02a1"+ + "y\u0001\u0000\u0000\u0000\u02a2\u02a3\u0005\u00ab\u0000\u0000\u02a3\u02a4"+ + "\u0005\u0148\u0000\u0000\u02a4\u02a5\u0003\u00ba]\u0000\u02a5\u02a6\u0005"+ + "\u001e\u0000\u0000\u02a6\u02a7\u0003\u00ba]\u0000\u02a7\u02a8\u0005\u0149"+ + "\u0000\u0000\u02a8{\u0001\u0000\u0000\u0000\u02a9\u02aa\u0003\u00c8d\u0000"+ + "\u02aa\u02ab\u0005\u013f\u0000\u0000\u02ab\u02ac\u0005\u00ef\u0000\u0000"+ + "\u02ac\u02ad\u0005\u0148\u0000\u0000\u02ad\u02ae\u0003\u00cae\u0000\u02ae"+ + "\u02af\u0005\u0149\u0000\u0000\u02af}\u0001\u0000\u0000\u0000\u02b0\u02b7"+ + "\u0003\u009cN\u0000\u02b1\u02b7\u0003\u00a2Q\u0000\u02b2\u02b7\u0003\u00a4"+ + "R\u0000\u02b3\u02b7\u0003\u00a6S\u0000\u02b4\u02b7\u0003\u00aaU\u0000"+ + "\u02b5\u02b7\u0003\u00acV\u0000\u02b6\u02b0\u0001\u0000\u0000\u0000\u02b6"+ + "\u02b1\u0001\u0000\u0000\u0000\u02b6\u02b2\u0001\u0000\u0000\u0000\u02b6"+ + "\u02b3\u0001\u0000\u0000\u0000\u02b6\u02b4\u0001\u0000\u0000\u0000\u02b6"+ + "\u02b5\u0001\u0000\u0000\u0000\u02b7\u007f\u0001\u0000\u0000\u0000\u02b8"+ + "\u02b9\u0005\f\u0000\u0000\u02b9\u02bb\u0003Z-\u0000\u02ba\u02bc\u0003"+ + "\u0092I\u0000\u02bb\u02ba\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000"+ + "\u0000\u0000\u02bd\u02bb\u0001\u0000\u0000\u0000\u02bd\u02be\u0001\u0000"+ + "\u0000\u0000\u02be\u02c1\u0001\u0000\u0000\u0000\u02bf\u02c0\u0005\u0016"+ + "\u0000\u0000\u02c0\u02c2\u0003\u00ba]\u0000\u02c1\u02bf\u0001\u0000\u0000"+ + "\u0000\u02c1\u02c2\u0001\u0000\u0000\u0000\u02c2\u02c3\u0001\u0000\u0000"+ + "\u0000\u02c3\u02c4\u0005O\u0000\u0000\u02c4\u02d9\u0001\u0000\u0000\u0000"+ + "\u02c5\u02c7\u0005\f\u0000\u0000\u02c6\u02c8\u0003\u0092I\u0000\u02c7"+ + "\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9"+ + "\u02c7\u0001\u0000\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000\u02ca"+ + "\u02cd\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005\u0016\u0000\u0000\u02cc"+ + "\u02ce\u0003\u00ba]\u0000\u02cd\u02cb\u0001\u0000\u0000\u0000\u02cd\u02ce"+ + "\u0001\u0000\u0000\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02d0"+ + "\u0005O\u0000\u0000\u02d0\u02d9\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005"+ + "\r\u0000\u0000\u02d2\u02d3\u0005\u0148\u0000\u0000\u02d3\u02d4\u0003Z"+ + "-\u0000\u02d4\u02d5\u0005\u0007\u0000\u0000\u02d5\u02d6\u0003\u0090H\u0000"+ + "\u02d6\u02d7\u0005\u0149\u0000\u0000\u02d7\u02d9\u0001\u0000\u0000\u0000"+ + "\u02d8\u02b8\u0001\u0000\u0000\u0000\u02d8\u02c5\u0001\u0000\u0000\u0000"+ + "\u02d8\u02d1\u0001\u0000\u0000\u0000\u02d9\u0081\u0001\u0000\u0000\u0000"+ + "\u02da\u02e0\u0003\u0086C\u0000\u02db\u02e0\u0003\u0088D\u0000\u02dc\u02e0"+ + "\u0003\u008aE\u0000\u02dd\u02e0\u0003\u008cF\u0000\u02de\u02e0\u0003\u008e"+ + "G\u0000\u02df\u02da\u0001\u0000\u0000\u0000\u02df\u02db\u0001\u0000\u0000"+ + "\u0000\u02df\u02dc\u0001\u0000\u0000\u0000\u02df\u02dd\u0001\u0000\u0000"+ + "\u0000\u02df\u02de\u0001\u0000\u0000\u0000\u02e0\u0083\u0001\u0000\u0000"+ + "\u0000\u02e1\u02e2\u0003\u00aeW\u0000\u02e2\u02e3\u0005\u0148\u0000\u0000"+ + "\u02e3\u02e6\u0003\u0082A\u0000\u02e4\u02e5\u0005\u014c\u0000\u0000\u02e5"+ + "\u02e7\u0003\u00c6c\u0000\u02e6\u02e4\u0001\u0000\u0000\u0000\u02e6\u02e7"+ + "\u0001\u0000\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000\u02e8\u02e9"+ + "\u0005\u0149\u0000\u0000\u02e9\u0085\u0001\u0000\u0000\u0000\u02ea\u02eb"+ + "\u0003\u00a8T\u0000\u02eb\u02ec\u0005\u0148\u0000\u0000\u02ec\u02f1\u0003"+ + "\u00cae\u0000\u02ed\u02ee\u0005\u014c\u0000\u0000\u02ee\u02f0\u0003\u00bc"+ + "^\u0000\u02ef\u02ed\u0001\u0000\u0000\u0000\u02f0\u02f3\u0001\u0000\u0000"+ + "\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001\u0000\u0000"+ + "\u0000\u02f2\u02f4\u0001\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000"+ + "\u0000\u02f4\u02f5\u0005\u0149\u0000\u0000\u02f5\u0087\u0001\u0000\u0000"+ + "\u0000\u02f6\u02f7\u0003\u00b0X\u0000\u02f7\u02f8\u0005\u0148\u0000\u0000"+ + "\u02f8\u02f9\u0003\u00c8d\u0000\u02f9\u02fa\u0005\u014c\u0000\u0000\u02fa"+ + "\u02ff\u0003\u00cae\u0000\u02fb\u02fc\u0005\u014c\u0000\u0000\u02fc\u02fe"+ + "\u0003\u00bc^\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fe\u0301\u0001"+ + "\u0000\u0000\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000\u02ff\u0300\u0001"+ + "\u0000\u0000\u0000\u0300\u0302\u0001\u0000\u0000\u0000\u0301\u02ff\u0001"+ + "\u0000\u0000\u0000\u0302\u0303\u0005\u0149\u0000\u0000\u0303\u0089\u0001"+ + "\u0000\u0000\u0000\u0304\u0305\u0003\u00b2Y\u0000\u0305\u0306\u0005\u0148"+ + "\u0000\u0000\u0306\u0307\u0005\u014a\u0000\u0000\u0307\u030c\u0003\u00c4"+ + "b\u0000\u0308\u0309\u0005\u014c\u0000\u0000\u0309\u030b\u0003\u00c4b\u0000"+ + "\u030a\u0308\u0001\u0000\u0000\u0000\u030b\u030e\u0001\u0000\u0000\u0000"+ + "\u030c\u030a\u0001\u0000\u0000\u0000\u030c\u030d\u0001\u0000\u0000\u0000"+ + "\u030d\u030f\u0001\u0000\u0000\u0000\u030e\u030c\u0001\u0000\u0000\u0000"+ + "\u030f\u0310\u0005\u014b\u0000\u0000\u0310\u0311\u0005\u014c\u0000\u0000"+ + "\u0311\u0316\u0003\u00cae\u0000\u0312\u0313\u0005\u014c\u0000\u0000\u0313"+ + "\u0315\u0003\u00bc^\u0000\u0314\u0312\u0001\u0000\u0000\u0000\u0315\u0318"+ + "\u0001\u0000\u0000\u0000\u0316\u0314\u0001\u0000\u0000\u0000\u0316\u0317"+ + "\u0001\u0000\u0000\u0000\u0317\u0319\u0001\u0000\u0000\u0000\u0318\u0316"+ + "\u0001\u0000\u0000\u0000\u0319\u031a\u0005\u0149\u0000\u0000\u031a\u032a"+ + "\u0001\u0000\u0000\u0000\u031b\u031c\u0003\u00b2Y\u0000\u031c\u031d\u0005"+ + "\u0148\u0000\u0000\u031d\u031e\u0003\u00d2i\u0000\u031e\u031f\u0005\u014c"+ + "\u0000\u0000\u031f\u0324\u0003\u00d4j\u0000\u0320\u0321\u0005\u014c\u0000"+ + "\u0000\u0321\u0323\u0003\u00bc^\u0000\u0322\u0320\u0001\u0000\u0000\u0000"+ + "\u0323\u0326\u0001\u0000\u0000\u0000\u0324\u0322\u0001\u0000\u0000\u0000"+ + "\u0324\u0325\u0001\u0000\u0000\u0000\u0325\u0327\u0001\u0000\u0000\u0000"+ + "\u0326\u0324\u0001\u0000\u0000\u0000\u0327\u0328\u0005\u0149\u0000\u0000"+ + "\u0328\u032a\u0001\u0000\u0000\u0000\u0329\u0304\u0001\u0000\u0000\u0000"+ + "\u0329\u031b\u0001\u0000\u0000\u0000\u032a\u008b\u0001\u0000\u0000\u0000"+ + "\u032b\u032c\u0003\u00c8d\u0000\u032c\u032d\u0005\u013f\u0000\u0000\u032d"+ + "\u032e\u0003\u00b4Z\u0000\u032e\u032f\u0005\u0148\u0000\u0000\u032f\u0334"+ + "\u0003\u00cae\u0000\u0330\u0331\u0005\u014c\u0000\u0000\u0331\u0333\u0003"+ + "\u00bc^\u0000\u0332\u0330\u0001\u0000\u0000\u0000\u0333\u0336\u0001\u0000"+ + "\u0000\u0000\u0334\u0332\u0001\u0000\u0000\u0000\u0334\u0335\u0001\u0000"+ + "\u0000\u0000\u0335\u0337\u0001\u0000\u0000\u0000\u0336\u0334\u0001\u0000"+ + "\u0000\u0000\u0337\u0338\u0005\u0149\u0000\u0000\u0338\u008d\u0001\u0000"+ + "\u0000\u0000\u0339\u033a\u0003\u00c8d\u0000\u033a\u033b\u0005\u013f\u0000"+ + "\u0000\u033b\u033c\u0003\u00b6[\u0000\u033c\u033d\u0005\u0148\u0000\u0000"+ + "\u033d\u0342\u0003\u00cae\u0000\u033e\u033f\u0005\u014c\u0000\u0000\u033f"+ + "\u0341\u0003\u00bc^\u0000\u0340\u033e\u0001\u0000\u0000\u0000\u0341\u0344"+ + "\u0001\u0000\u0000\u0000\u0342\u0340\u0001\u0000\u0000\u0000\u0342\u0343"+ + "\u0001\u0000\u0000\u0000\u0343\u0345\u0001\u0000\u0000\u0000\u0344\u0342"+ + "\u0001\u0000\u0000\u0000\u0345\u0346\u0005\u0149\u0000\u0000\u0346\u008f"+ + "\u0001\u0000\u0000\u0000\u0347\u0352\u0005\u0080\u0000\u0000\u0348\u0352"+ + "\u0005\u00c1\u0000\u0000\u0349\u0352\u0005\u00c5\u0000\u0000\u034a\u0352"+ + "\u0005 \u0000\u0000\u034b\u0352\u0005!\u0000\u0000\u034c\u0352\u0005\u0015"+ + "\u0000\u0000\u034d\u0352\u0005(\u0000\u0000\u034e\u0352\u0005\u0019\u0000"+ + "\u0000\u034f\u0352\u00059\u0000\u0000\u0350\u0352\u0005\t\u0000\u0000"+ + "\u0351\u0347\u0001\u0000\u0000\u0000\u0351\u0348\u0001\u0000\u0000\u0000"+ + "\u0351\u0349\u0001\u0000\u0000\u0000\u0351\u034a\u0001\u0000\u0000\u0000"+ + "\u0351\u034b\u0001\u0000\u0000\u0000\u0351\u034c\u0001\u0000\u0000\u0000"+ + "\u0351\u034d\u0001\u0000\u0000\u0000\u0351\u034e\u0001\u0000\u0000\u0000"+ + "\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0350\u0001\u0000\u0000\u0000"+ + "\u0352\u0091\u0001\u0000\u0000\u0000\u0353\u0354\u0005>\u0000\u0000\u0354"+ + "\u0355\u0003\u00ba]\u0000\u0355\u0356\u0005:\u0000\u0000\u0356\u0357\u0003"+ + "\u00ba]\u0000\u0357\u0093\u0001\u0000\u0000\u0000\u0358\u0359\u0003\u009a"+ + "M\u0000\u0359\u035a\u0005\u0148\u0000\u0000\u035a\u035b\u0003\u00ba]\u0000"+ + "\u035b\u035c\u0005\u0149\u0000\u0000\u035c\u0369\u0001\u0000\u0000\u0000"+ + "\u035d\u035e\u0005B\u0000\u0000\u035e\u035f\u0005\u0148\u0000\u0000\u035f"+ + "\u0360\u0005\u0138\u0000\u0000\u0360\u0369\u0005\u0149\u0000\u0000\u0361"+ + "\u0362\u0005B\u0000\u0000\u0362\u0363\u0005\u0148\u0000\u0000\u0363\u0364"+ + "\u0005\u0014\u0000\u0000\u0364\u0365\u0003\u00ba]\u0000\u0365\u0366\u0005"+ + "\u0149\u0000\u0000\u0366\u0369\u0001\u0000\u0000\u0000\u0367\u0369\u0003"+ + "\u0096K\u0000\u0368\u0358\u0001\u0000\u0000\u0000\u0368\u035d\u0001\u0000"+ + "\u0000\u0000\u0368\u0361\u0001\u0000\u0000\u0000\u0368\u0367\u0001\u0000"+ + "\u0000\u0000\u0369\u0095\u0001\u0000\u0000\u0000\u036a\u036b\u0007\u0013"+ + "\u0000\u0000\u036b\u036c\u0005\u0148\u0000\u0000\u036c\u036d\u0003\u00ba"+ + "]\u0000\u036d\u036e\u0005\u014c\u0000\u0000\u036e\u0371\u0003@ \u0000"+ + "\u036f\u0370\u0005\u014c\u0000\u0000\u0370\u0372\u0003@ \u0000\u0371\u036f"+ + "\u0001\u0000\u0000\u0000\u0371\u0372\u0001\u0000\u0000\u0000\u0372\u0373"+ + "\u0001\u0000\u0000\u0000\u0373\u0374\u0005\u0149\u0000\u0000\u0374\u0097"+ + "\u0001\u0000\u0000\u0000\u0375\u0376\u0005\u00dd\u0000\u0000\u0376\u0377"+ + "\u0005\u0148\u0000\u0000\u0377\u0378\u0005?\u0000\u0000\u0378\u0379\u0003"+ + "Z-\u0000\u0379\u037a\u0005\u0149\u0000\u0000\u037a\u0099\u0001\u0000\u0000"+ + "\u0000\u037b\u037c\u0007\u0014\u0000\u0000\u037c\u009b\u0001\u0000\u0000"+ + "\u0000\u037d\u0399\u0005h\u0000\u0000\u037e\u0399\u0005p\u0000\u0000\u037f"+ + "\u0399\u0005q\u0000\u0000\u0380\u0399\u0005r\u0000\u0000\u0381\u0399\u0005"+ + "u\u0000\u0000\u0382\u0399\u0005z\u0000\u0000\u0383\u0399\u0005\u008b\u0000"+ + "\u0000\u0384\u0399\u0005\u008c\u0000\u0000\u0385\u0399\u0005\u008d\u0000"+ + "\u0000\u0386\u0399\u0005\u008f\u0000\u0000\u0387\u0399\u0005\u0098\u0000"+ + "\u0000\u0388\u0399\u0005\u009c\u0000\u0000\u0389\u0399\u0005\u009d\u0000"+ + "\u0000\u038a\u0399\u0005\u009e\u0000\u0000\u038b\u0399\u0005\u013e\u0000"+ + "\u0000\u038c\u0399\u0005\u00aa\u0000\u0000\u038d\u0399\u0005\u00ac\u0000"+ + "\u0000\u038e\u0399\u0005\u00ad\u0000\u0000\u038f\u0399\u0005\u00af\u0000"+ + "\u0000\u0390\u0399\u0005\u00b1\u0000\u0000\u0391\u0399\u0005\u00b2\u0000"+ + "\u0000\u0392\u0399\u0005\u00b6\u0000\u0000\u0393\u0399\u0005\u00b7\u0000"+ + "\u0000\u0394\u0399\u0005\u00ba\u0000\u0000\u0395\u0399\u0005\u00c6\u0000"+ + "\u0000\u0396\u0399\u0003\u009eO\u0000\u0397\u0399\u0003\u00a0P\u0000\u0398"+ + "\u037d\u0001\u0000\u0000\u0000\u0398\u037e\u0001\u0000\u0000\u0000\u0398"+ + "\u037f\u0001\u0000\u0000\u0000\u0398\u0380\u0001\u0000\u0000\u0000\u0398"+ + "\u0381\u0001\u0000\u0000\u0000\u0398\u0382\u0001\u0000\u0000\u0000\u0398"+ + "\u0383\u0001\u0000\u0000\u0000\u0398\u0384\u0001\u0000\u0000\u0000\u0398"+ + "\u0385\u0001\u0000\u0000\u0000\u0398\u0386\u0001\u0000\u0000\u0000\u0398"+ + "\u0387\u0001\u0000\u0000\u0000\u0398\u0388\u0001\u0000\u0000\u0000\u0398"+ + "\u0389\u0001\u0000\u0000\u0000\u0398\u038a\u0001\u0000\u0000\u0000\u0398"+ + "\u038b\u0001\u0000\u0000\u0000\u0398\u038c\u0001\u0000\u0000\u0000\u0398"+ + "\u038d\u0001\u0000\u0000\u0000\u0398\u038e\u0001\u0000\u0000\u0000\u0398"+ + "\u038f\u0001\u0000\u0000\u0000\u0398\u0390\u0001\u0000\u0000\u0000\u0398"+ + "\u0391\u0001\u0000\u0000\u0000\u0398\u0392\u0001\u0000\u0000\u0000\u0398"+ + "\u0393\u0001\u0000\u0000\u0000\u0398\u0394\u0001\u0000\u0000\u0000\u0398"+ + "\u0395\u0001\u0000\u0000\u0000\u0398\u0396\u0001\u0000\u0000\u0000\u0398"+ + "\u0397\u0001\u0000\u0000\u0000\u0399\u009d\u0001\u0000\u0000\u0000\u039a"+ + "\u039b\u0007\u0015\u0000\u0000\u039b\u009f\u0001\u0000\u0000\u0000\u039c"+ + "\u039d\u0007\u0016\u0000\u0000\u039d\u00a1\u0001\u0000\u0000\u0000\u039e"+ + "\u03da\u0003T*\u0000\u039f\u03da\u0005\u0110\u0000\u0000\u03a0\u03da\u0005"+ + "k\u0000\u0000\u03a1\u03da\u0005v\u0000\u0000\u03a2\u03da\u0005{\u0000"+ + "\u0000\u03a3\u03da\u0005|\u0000\u0000\u03a4\u03da\u0005\u0080\u0000\u0000"+ + "\u03a5\u03da\u0005\u0081\u0000\u0000\u03a6\u03da\u0005\u0082\u0000\u0000"+ + "\u03a7\u03da\u0005\u0083\u0000\u0000\u03a8\u03da\u0005\u0084\u0000\u0000"+ + "\u03a9\u03da\u0005\u0010\u0000\u0000\u03aa\u03da\u0005W\u0000\u0000\u03ab"+ + "\u03da\u0005\u0085\u0000\u0000\u03ac\u03da\u0005\u0086\u0000\u0000\u03ad"+ + "\u03da\u0005\u00d7\u0000\u0000\u03ae\u03da\u0005\u0087\u0000\u0000\u03af"+ + "\u03da\u0005\u0088\u0000\u0000\u03b0\u03da\u0005\u00d8\u0000\u0000\u03b1"+ + "\u03da\u0005\u00d9\u0000\u0000\u03b2\u03da\u0005\u0090\u0000\u0000\u03b3"+ + "\u03da\u0005\u0091\u0000\u0000\u03b4\u03da\u0005V\u0000\u0000\u03b5\u03da"+ + "\u0005\u00e5\u0000\u0000\u03b6\u03da\u0005\u0096\u0000\u0000\u03b7\u03da"+ + "\u0005\u00a1\u0000\u0000\u03b8\u03da\u0005\u00a2\u0000\u0000\u03b9\u03da"+ + "\u0005S\u0000\u0000\u03ba\u03da\u0005U\u0000\u0000\u03bb\u03da\u0005\u00f0"+ + "\u0000\u0000\u03bc\u03da\u0005\u00f1\u0000\u0000\u03bd\u03da\u0005Y\u0000"+ + "\u0000\u03be\u03da\u0005\u00a4\u0000\u0000\u03bf\u03da\u0005\u00f2\u0000"+ + "\u0000\u03c0\u03da\u0005\u00a6\u0000\u0000\u03c1\u03da\u0005\u00a8\u0000"+ + "\u0000\u03c2\u03da\u0005\u00a9\u0000\u0000\u03c3\u03da\u0005Z\u0000\u0000"+ + "\u03c4\u03da\u0005\u00b5\u0000\u0000\u03c5\u03da\u0005T\u0000\u0000\u03c6"+ + "\u03da\u0005\u0101\u0000\u0000\u03c7\u03da\u0005\u00bc\u0000\u0000\u03c8"+ + "\u03da\u0005\u00bd\u0000\u0000\u03c9\u03da\u0005\u00bf\u0000\u0000\u03ca"+ + "\u03da\u0005\u00bb\u0000\u0000\u03cb\u03da\u0005\u00c1\u0000\u0000\u03cc"+ + "\u03da\u0005\u00c3\u0000\u0000\u03cd\u03da\u0005\u00c4\u0000\u0000\u03ce"+ + "\u03da\u0005\u00c2\u0000\u0000\u03cf\u03da\u0005\u00c5\u0000\u0000\u03d0"+ + "\u03da\u0005\u00c7\u0000\u0000\u03d1\u03da\u0005\u00c8\u0000\u0000\u03d2"+ + "\u03da\u0005\u00c9\u0000\u0000\u03d3\u03da\u0005X\u0000\u0000\u03d4\u03da"+ + "\u0005\u010b\u0000\u0000\u03d5\u03da\u0005\u0109\u0000\u0000\u03d6\u03da"+ + "\u0005\u010a\u0000\u0000\u03d7\u03da\u0005[\u0000\u0000\u03d8\u03da\u0005"+ + "\u0111\u0000\u0000\u03d9\u039e\u0001\u0000\u0000\u0000\u03d9\u039f\u0001"+ + "\u0000\u0000\u0000\u03d9\u03a0\u0001\u0000\u0000\u0000\u03d9\u03a1\u0001"+ + "\u0000\u0000\u0000\u03d9\u03a2\u0001\u0000\u0000\u0000\u03d9\u03a3\u0001"+ + "\u0000\u0000\u0000\u03d9\u03a4\u0001\u0000\u0000\u0000\u03d9\u03a5\u0001"+ + "\u0000\u0000\u0000\u03d9\u03a6\u0001\u0000\u0000\u0000\u03d9\u03a7\u0001"+ + "\u0000\u0000\u0000\u03d9\u03a8\u0001\u0000\u0000\u0000\u03d9\u03a9\u0001"+ + "\u0000\u0000\u0000\u03d9\u03aa\u0001\u0000\u0000\u0000\u03d9\u03ab\u0001"+ + "\u0000\u0000\u0000\u03d9\u03ac\u0001\u0000\u0000\u0000\u03d9\u03ad\u0001"+ + "\u0000\u0000\u0000\u03d9\u03ae\u0001\u0000\u0000\u0000\u03d9\u03af\u0001"+ + "\u0000\u0000\u0000\u03d9\u03b0\u0001\u0000\u0000\u0000\u03d9\u03b1\u0001"+ + "\u0000\u0000\u0000\u03d9\u03b2\u0001\u0000\u0000\u0000\u03d9\u03b3\u0001"+ + "\u0000\u0000\u0000\u03d9\u03b4\u0001\u0000\u0000\u0000\u03d9\u03b5\u0001"+ + "\u0000\u0000\u0000\u03d9\u03b6\u0001\u0000\u0000\u0000\u03d9\u03b7\u0001"+ + "\u0000\u0000\u0000\u03d9\u03b8\u0001\u0000\u0000\u0000\u03d9\u03b9\u0001"+ + "\u0000\u0000\u0000\u03d9\u03ba\u0001\u0000\u0000\u0000\u03d9\u03bb\u0001"+ + "\u0000\u0000\u0000\u03d9\u03bc\u0001\u0000\u0000\u0000\u03d9\u03bd\u0001"+ + "\u0000\u0000\u0000\u03d9\u03be\u0001\u0000\u0000\u0000\u03d9\u03bf\u0001"+ + "\u0000\u0000\u0000\u03d9\u03c0\u0001\u0000\u0000\u0000\u03d9\u03c1\u0001"+ + "\u0000\u0000\u0000\u03d9\u03c2\u0001\u0000\u0000\u0000\u03d9\u03c3\u0001"+ + "\u0000\u0000\u0000\u03d9\u03c4\u0001\u0000\u0000\u0000\u03d9\u03c5\u0001"+ + "\u0000\u0000\u0000\u03d9\u03c6\u0001\u0000\u0000\u0000\u03d9\u03c7\u0001"+ + "\u0000\u0000\u0000\u03d9\u03c8\u0001\u0000\u0000\u0000\u03d9\u03c9\u0001"+ + "\u0000\u0000\u0000\u03d9\u03ca\u0001\u0000\u0000\u0000\u03d9\u03cb\u0001"+ + "\u0000\u0000\u0000\u03d9\u03cc\u0001\u0000\u0000\u0000\u03d9\u03cd\u0001"+ + "\u0000\u0000\u0000\u03d9\u03ce\u0001\u0000\u0000\u0000\u03d9\u03cf\u0001"+ + "\u0000\u0000\u0000\u03d9\u03d0\u0001\u0000\u0000\u0000\u03d9\u03d1\u0001"+ + "\u0000\u0000\u0000\u03d9\u03d2\u0001\u0000\u0000\u0000\u03d9\u03d3\u0001"+ + "\u0000\u0000\u0000\u03d9\u03d4\u0001\u0000\u0000\u0000\u03d9\u03d5\u0001"+ + "\u0000\u0000\u0000\u03d9\u03d6\u0001\u0000\u0000\u0000\u03d9\u03d7\u0001"+ + "\u0000\u0000\u0000\u03d9\u03d8\u0001\u0000\u0000\u0000\u03da\u00a3\u0001"+ + "\u0000\u0000\u0000\u03db\u03dc\u0007\u0017\u0000\u0000\u03dc\u00a5\u0001"+ + "\u0000\u0000\u0000\u03dd\u03de\u0007\u0018\u0000\u0000\u03de\u00a7\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0005\u00fc\u0000\u0000\u03e0\u00a9\u0001"+ + "\u0000\u0000\u0000\u03e1\u03e2\u0005\u0108\u0000\u0000\u03e2\u00ab\u0001"+ + "\u0000\u0000\u0000\u03e3\u03e4\u0005\u00f6\u0000\u0000\u03e4\u00ad\u0001"+ + "\u0000\u0000\u0000\u03e5\u03e6\u0007\u0019\u0000\u0000\u03e6\u00af\u0001"+ + "\u0000\u0000\u0000\u03e7\u03e8\u0007\u001a\u0000\u0000\u03e8\u00b1\u0001"+ + "\u0000\u0000\u0000\u03e9\u03ea\u0007\u001b\u0000\u0000\u03ea\u00b3\u0001"+ + "\u0000\u0000\u0000\u03eb\u03ec\u0007\u001c\u0000\u0000\u03ec\u00b5\u0001"+ + "\u0000\u0000\u0000\u03ed\u03ee\u0007\u001d\u0000\u0000\u03ee\u00b7\u0001"+ + "\u0000\u0000\u0000\u03ef\u03f4\u0003\u00ba]\u0000\u03f0\u03f1\u0005\u014c"+ + "\u0000\u0000\u03f1\u03f3\u0003\u00ba]\u0000\u03f2\u03f0\u0001\u0000\u0000"+ + "\u0000\u03f3\u03f6\u0001\u0000\u0000\u0000\u03f4\u03f2\u0001\u0000\u0000"+ + "\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f8\u0001\u0000\u0000"+ + "\u0000\u03f6\u03f4\u0001\u0000\u0000\u0000\u03f7\u03ef\u0001\u0000\u0000"+ + "\u0000\u03f7\u03f8\u0001\u0000\u0000\u0000\u03f8\u00b9\u0001\u0000\u0000"+ + "\u0000\u03f9\u03fa\u0003Z-\u0000\u03fa\u00bb\u0001\u0000\u0000\u0000\u03fb"+ + "\u03fc\u0003\u00c0`\u0000\u03fc\u03fd\u0005\u013f\u0000\u0000\u03fd\u03fe"+ + "\u0003\u00ccf\u0000\u03fe\u0404\u0001\u0000\u0000\u0000\u03ff\u0400\u0003"+ + "B!\u0000\u0400\u0401\u0005\u013f\u0000\u0000\u0401\u0402\u0003\u00ccf"+ + "\u0000\u0402\u0404\u0001\u0000\u0000\u0000\u0403\u03fb\u0001\u0000\u0000"+ + "\u0000\u0403\u03ff\u0001\u0000\u0000\u0000\u0404\u00bd\u0001\u0000\u0000"+ + "\u0000\u0405\u0406\u0003\u00c2a\u0000\u0406\u0407\u0005\u013f\u0000\u0000"+ + "\u0407\u0408\u0003\u00ceg\u0000\u0408\u00bf\u0001\u0000\u0000\u0000\u0409"+ + "\u040a\u0007\u001e\u0000\u0000\u040a\u00c1\u0001\u0000\u0000\u0000\u040b"+ + "\u040c\u0007\u001f\u0000\u0000\u040c\u00c3\u0001\u0000\u0000\u0000\u040d"+ + "\u0416\u0003\u00c8d\u0000\u040e\u040f\u0003\u00c8d\u0000\u040f\u0410\u0003"+ + "\u00c6c\u0000\u0410\u0416\u0001\u0000\u0000\u0000\u0411\u0412\u0003\u00c8"+ + "d\u0000\u0412\u0413\u0005\u0146\u0000\u0000\u0413\u0414\u0003\u00c6c\u0000"+ + "\u0414\u0416\u0001\u0000\u0000\u0000\u0415\u040d\u0001\u0000\u0000\u0000"+ + "\u0415\u040e\u0001\u0000\u0000\u0000\u0415\u0411\u0001\u0000\u0000\u0000"+ + "\u0416\u00c5\u0001\u0000\u0000\u0000\u0417\u0418\u0003@ \u0000\u0418\u00c7"+ + "\u0001\u0000\u0000\u0000\u0419\u041c\u0003\u00deo\u0000\u041a\u041c\u0003"+ + "B!\u0000\u041b\u0419\u0001\u0000\u0000\u0000\u041b\u041a\u0001\u0000\u0000"+ + "\u0000\u041c\u00c9\u0001\u0000\u0000\u0000\u041d\u041e\u0003\u00ccf\u0000"+ + "\u041e\u00cb\u0001\u0000\u0000\u0000\u041f\u0422\u0003\u00deo\u0000\u0420"+ + "\u0422\u0003<\u001e\u0000\u0421\u041f\u0001\u0000\u0000\u0000\u0421\u0420"+ + "\u0001\u0000\u0000\u0000\u0422\u00cd\u0001\u0000\u0000\u0000\u0423\u0424"+ + "\u0003B!\u0000\u0424\u00cf\u0001\u0000\u0000\u0000\u0425\u0429\u0005\u011d"+ + "\u0000\u0000\u0426\u0429\u0005\u00fc\u0000\u0000\u0427\u0429\u0003B!\u0000"+ + "\u0428\u0425\u0001\u0000\u0000\u0000\u0428\u0426\u0001\u0000\u0000\u0000"+ + "\u0428\u0427\u0001\u0000\u0000\u0000\u0429\u00d1\u0001\u0000\u0000\u0000"+ + "\u042a\u042b\u0003\u00d0h\u0000\u042b\u042c\u0005\u013f\u0000\u0000\u042c"+ + "\u042d\u0003\u00ccf\u0000\u042d\u00d3\u0001\u0000\u0000\u0000\u042e\u042f"+ + "\u0003\u00d0h\u0000\u042f\u0430\u0005\u013f\u0000\u0000\u0430\u0431\u0003"+ + "\u00ccf\u0000\u0431\u0439\u0001\u0000\u0000\u0000\u0432\u0433\u0003\u00d0"+ + "h\u0000\u0433\u0434\u0005\u013f\u0000\u0000\u0434\u0435\u0005\u014a\u0000"+ + "\u0000\u0435\u0436\u0003\u00ccf\u0000\u0436\u0437\u0005\u014b\u0000\u0000"+ + "\u0437\u0439\u0001\u0000\u0000\u0000\u0438\u042e\u0001\u0000\u0000\u0000"+ + "\u0438\u0432\u0001\u0000\u0000\u0000\u0439\u00d5\u0001\u0000\u0000\u0000"+ + "\u043a\u043b\u0003\u00deo\u0000\u043b\u00d7\u0001\u0000\u0000\u0000\u043c"+ + "\u043d\u0003\u00deo\u0000\u043d\u00d9\u0001\u0000\u0000\u0000\u043e\u043f"+ + "\u0003\u00deo\u0000\u043f\u0440\u0005\u0147\u0000\u0000\u0440\u0441\u0005"+ + "\u0138\u0000\u0000\u0441\u00db\u0001\u0000\u0000\u0000\u0442\u0443\u0003"+ + "\u00e0p\u0000\u0443\u00dd\u0001\u0000\u0000\u0000\u0444\u0449\u0003\u00e0"+ + "p\u0000\u0445\u0446\u0005\u0147\u0000\u0000\u0446\u0448\u0003\u00e0p\u0000"+ + "\u0447\u0445\u0001\u0000\u0000\u0000\u0448\u044b\u0001\u0000\u0000\u0000"+ + "\u0449\u0447\u0001\u0000\u0000\u0000\u0449\u044a\u0001\u0000\u0000\u0000"+ + "\u044a\u00df\u0001\u0000\u0000\u0000\u044b\u0449\u0001\u0000\u0000\u0000"+ + "\u044c\u044e\u0005\u0147\u0000\u0000\u044d\u044c\u0001\u0000\u0000\u0000"+ + "\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f\u0001\u0000\u0000\u0000"+ + "\u044f\u0454\u0005\u015d\u0000\u0000\u0450\u0454\u0005\u015f\u0000\u0000"+ + "\u0451\u0454\u0003\u00e2q\u0000\u0452\u0454\u0003~?\u0000\u0453\u044d"+ + "\u0001\u0000\u0000\u0000\u0453\u0450\u0001\u0000\u0000\u0000\u0453\u0451"+ + "\u0001\u0000\u0000\u0000\u0453\u0452\u0001\u0000\u0000\u0000\u0454\u00e1"+ + "\u0001\u0000\u0000\u0000\u0455\u0456\u0007 \u0000\u0000\u0456\u00e3\u0001"+ + "\u0000\u0000\u0000[\u00e5\u00e8\u00ee\u00f6\u0100\u010b\u0110\u0114\u0117"+ + "\u011b\u0123\u0129\u012e\u0131\u0136\u0139\u013c\u013f\u0143\u0146\u014c"+ + "\u0150\u015e\u016d\u0172\u0176\u017c\u0184\u018c\u0190\u0195\u0198\u01a3"+ + "\u01a8\u01ac\u01b3\u01b9\u01c8\u01d1\u01da\u01e3\u01f1\u01f9\u01fb\u0207"+ + "\u0210\u021c\u0223\u0225\u022d\u0238\u0240\u0242\u0250\u0253\u0266\u0271"+ + "\u0294\u029d\u02b6\u02bd\u02c1\u02c9\u02cd\u02d8\u02df\u02e6\u02f1\u02ff"+ + "\u030c\u0316\u0324\u0329\u0334\u0342\u0351\u0368\u0371\u0398\u03d9\u03f4"+ + "\u03f7\u0403\u0415\u041b\u0421\u0428\u0438\u0449\u044d\u0453"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.tokens b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.tokens new file mode 100644 index 00000000000..80703f8b9ac --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParser.tokens @@ -0,0 +1,689 @@ +SPACE=1 +SPEC_SQL_COMMENT=2 +COMMENT_INPUT=3 +LINE_COMMENT=4 +ALL=5 +AND=6 +AS=7 +ASC=8 +BOOLEAN=9 +BETWEEN=10 +BY=11 +CASE=12 +CAST=13 +CROSS=14 +COLUMNS=15 +DATETIME=16 +DELETE=17 +DESC=18 +DESCRIBE=19 +DISTINCT=20 +DOUBLE=21 +ELSE=22 +EXISTS=23 +FALSE=24 +FLOAT=25 +FIRST=26 +FROM=27 +GROUP=28 +HAVING=29 +IN=30 +INNER=31 +INT=32 +INTEGER=33 +IS=34 +JOIN=35 +LAST=36 +LEFT=37 +LIKE=38 +LIMIT=39 +LONG=40 +MATCH=41 +NATURAL=42 +MISSING_LITERAL=43 +NOT=44 +NULL_LITERAL=45 +NULLS=46 +ON=47 +OR=48 +ORDER=49 +OUTER=50 +OVER=51 +PARTITION=52 +REGEXP=53 +RIGHT=54 +SELECT=55 +SHOW=56 +STRING=57 +THEN=58 +TRUE=59 +UNION=60 +USING=61 +WHEN=62 +WHERE=63 +EXCEPT=64 +AVG=65 +COUNT=66 +MAX=67 +MIN=68 +SUM=69 +VAR_POP=70 +VAR_SAMP=71 +VARIANCE=72 +STD=73 +STDDEV=74 +STDDEV_POP=75 +STDDEV_SAMP=76 +SUBSTRING=77 +TRIM=78 +END=79 +FULL=80 +OFFSET=81 +INTERVAL=82 +MICROSECOND=83 +SECOND=84 +MINUTE=85 +HOUR=86 +DAY=87 +WEEK=88 +MONTH=89 +QUARTER=90 +YEAR=91 +SECOND_MICROSECOND=92 +MINUTE_MICROSECOND=93 +MINUTE_SECOND=94 +HOUR_MICROSECOND=95 +HOUR_SECOND=96 +HOUR_MINUTE=97 +DAY_MICROSECOND=98 +DAY_SECOND=99 +DAY_MINUTE=100 +DAY_HOUR=101 +YEAR_MONTH=102 +TABLES=103 +ABS=104 +ACOS=105 +ADD=106 +ADDTIME=107 +ASCII=108 +ASIN=109 +ATAN=110 +ATAN2=111 +CBRT=112 +CEIL=113 +CEILING=114 +CONCAT=115 +CONCAT_WS=116 +CONV=117 +CONVERT_TZ=118 +COS=119 +COSH=120 +COT=121 +CRC32=122 +CURDATE=123 +CURTIME=124 +CURRENT_DATE=125 +CURRENT_TIME=126 +CURRENT_TIMESTAMP=127 +DATE=128 +DATE_ADD=129 +DATE_FORMAT=130 +DATE_SUB=131 +DATEDIFF=132 +DAYNAME=133 +DAYOFMONTH=134 +DAYOFWEEK=135 +DAYOFYEAR=136 +DEGREES=137 +DIVIDE=138 +E=139 +EXP=140 +EXPM1=141 +EXTRACT=142 +FLOOR=143 +FROM_DAYS=144 +FROM_UNIXTIME=145 +GET_FORMAT=146 +IF=147 +IFNULL=148 +ISNULL=149 +LAST_DAY=150 +LENGTH=151 +LN=152 +LOCALTIME=153 +LOCALTIMESTAMP=154 +LOCATE=155 +LOG=156 +LOG10=157 +LOG2=158 +LOWER=159 +LTRIM=160 +MAKEDATE=161 +MAKETIME=162 +MODULUS=163 +MONTHNAME=164 +MULTIPLY=165 +NOW=166 +NULLIF=167 +PERIOD_ADD=168 +PERIOD_DIFF=169 +PI=170 +POSITION=171 +POW=172 +POWER=173 +RADIANS=174 +RAND=175 +REPLACE=176 +RINT=177 +ROUND=178 +RTRIM=179 +REVERSE=180 +SEC_TO_TIME=181 +SIGN=182 +SIGNUM=183 +SIN=184 +SINH=185 +SQRT=186 +STR_TO_DATE=187 +SUBDATE=188 +SUBTIME=189 +SUBTRACT=190 +SYSDATE=191 +TAN=192 +TIME=193 +TIMEDIFF=194 +TIME_FORMAT=195 +TIME_TO_SEC=196 +TIMESTAMP=197 +TRUNCATE=198 +TO_DAYS=199 +TO_SECONDS=200 +UNIX_TIMESTAMP=201 +UPPER=202 +UTC_DATE=203 +UTC_TIME=204 +UTC_TIMESTAMP=205 +D=206 +T=207 +TS=208 +LEFT_BRACE=209 +RIGHT_BRACE=210 +DENSE_RANK=211 +RANK=212 +ROW_NUMBER=213 +DATE_HISTOGRAM=214 +DAY_OF_MONTH=215 +DAY_OF_YEAR=216 +DAY_OF_WEEK=217 +EXCLUDE=218 +EXTENDED_STATS=219 +FIELD=220 +FILTER=221 +GEO_BOUNDING_BOX=222 +GEO_CELL=223 +GEO_DISTANCE=224 +GEO_DISTANCE_RANGE=225 +GEO_INTERSECTS=226 +GEO_POLYGON=227 +HISTOGRAM=228 +HOUR_OF_DAY=229 +INCLUDE=230 +IN_TERMS=231 +MATCHPHRASE=232 +MATCH_PHRASE=233 +MATCHPHRASEQUERY=234 +SIMPLE_QUERY_STRING=235 +QUERY_STRING=236 +MATCH_PHRASE_PREFIX=237 +MATCHQUERY=238 +MATCH_QUERY=239 +MINUTE_OF_DAY=240 +MINUTE_OF_HOUR=241 +MONTH_OF_YEAR=242 +MULTIMATCH=243 +MULTI_MATCH=244 +MULTIMATCHQUERY=245 +NESTED=246 +PERCENTILES=247 +PERCENTILE=248 +PERCENTILE_APPROX=249 +REGEXP_QUERY=250 +REVERSE_NESTED=251 +QUERY=252 +RANGE=253 +SCORE=254 +SCOREQUERY=255 +SCORE_QUERY=256 +SECOND_OF_MINUTE=257 +STATS=258 +TERM=259 +TERMS=260 +TIMESTAMPADD=261 +TIMESTAMPDIFF=262 +TOPHITS=263 +TYPEOF=264 +WEEK_OF_YEAR=265 +WEEKOFYEAR=266 +WEEKDAY=267 +WILDCARDQUERY=268 +WILDCARD_QUERY=269 +SUBSTR=270 +STRCMP=271 +ADDDATE=272 +YEARWEEK=273 +ALLOW_LEADING_WILDCARD=274 +ANALYZER=275 +ANALYZE_WILDCARD=276 +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY=277 +BOOST=278 +CASE_INSENSITIVE=279 +CUTOFF_FREQUENCY=280 +DEFAULT_FIELD=281 +DEFAULT_OPERATOR=282 +ESCAPE=283 +ENABLE_POSITION_INCREMENTS=284 +FIELDS=285 +FLAGS=286 +FUZZINESS=287 +FUZZY_MAX_EXPANSIONS=288 +FUZZY_PREFIX_LENGTH=289 +FUZZY_REWRITE=290 +FUZZY_TRANSPOSITIONS=291 +LENIENT=292 +LOW_FREQ_OPERATOR=293 +MAX_DETERMINIZED_STATES=294 +MAX_EXPANSIONS=295 +MINIMUM_SHOULD_MATCH=296 +OPERATOR=297 +PHRASE_SLOP=298 +PREFIX_LENGTH=299 +QUOTE_ANALYZER=300 +QUOTE_FIELD_SUFFIX=301 +REWRITE=302 +SLOP=303 +TIE_BREAKER=304 +TIME_ZONE=305 +TYPE=306 +ZERO_TERMS_QUERY=307 +HIGHLIGHT=308 +HIGHLIGHT_PRE_TAGS=309 +HIGHLIGHT_POST_TAGS=310 +MATCH_BOOL_PREFIX=311 +STAR=312 +SLASH=313 +MODULE=314 +PLUS=315 +MINUS=316 +DIV=317 +MOD=318 +EQUAL_SYMBOL=319 +GREATER_SYMBOL=320 +LESS_SYMBOL=321 +EXCLAMATION_SYMBOL=322 +BIT_NOT_OP=323 +BIT_OR_OP=324 +BIT_AND_OP=325 +BIT_XOR_OP=326 +DOT=327 +LR_BRACKET=328 +RR_BRACKET=329 +LT_SQR_PRTHS=330 +RT_SQR_PRTHS=331 +COMMA=332 +SEMI=333 +AT_SIGN=334 +ZERO_DECIMAL=335 +ONE_DECIMAL=336 +TWO_DECIMAL=337 +SINGLE_QUOTE_SYMB=338 +DOUBLE_QUOTE_SYMB=339 +REVERSE_QUOTE_SYMB=340 +COLON_SYMB=341 +START_NATIONAL_STRING_LITERAL=342 +STRING_LITERAL=343 +DECIMAL_LITERAL=344 +HEXADECIMAL_LITERAL=345 +REAL_LITERAL=346 +NULL_SPEC_LITERAL=347 +BIT_STRING=348 +ID=349 +DOUBLE_QUOTE_ID=350 +BACKTICK_QUOTE_ID=351 +ERROR_RECOGNITION=352 +'ALL'=5 +'AND'=6 +'AS'=7 +'ASC'=8 +'BOOLEAN'=9 +'BETWEEN'=10 +'BY'=11 +'CASE'=12 +'CAST'=13 +'CROSS'=14 +'COLUMNS'=15 +'DATETIME'=16 +'DELETE'=17 +'DESC'=18 +'DESCRIBE'=19 +'DISTINCT'=20 +'DOUBLE'=21 +'ELSE'=22 +'EXISTS'=23 +'FALSE'=24 +'FLOAT'=25 +'FIRST'=26 +'FROM'=27 +'GROUP'=28 +'HAVING'=29 +'IN'=30 +'INNER'=31 +'INT'=32 +'INTEGER'=33 +'IS'=34 +'JOIN'=35 +'LAST'=36 +'LEFT'=37 +'LIKE'=38 +'LIMIT'=39 +'LONG'=40 +'MATCH'=41 +'NATURAL'=42 +'MISSING'=43 +'NOT'=44 +'NULL'=45 +'NULLS'=46 +'ON'=47 +'OR'=48 +'ORDER'=49 +'OUTER'=50 +'OVER'=51 +'PARTITION'=52 +'REGEXP'=53 +'RIGHT'=54 +'SELECT'=55 +'SHOW'=56 +'STRING'=57 +'THEN'=58 +'TRUE'=59 +'UNION'=60 +'USING'=61 +'WHEN'=62 +'WHERE'=63 +'MINUS'=64 +'AVG'=65 +'COUNT'=66 +'MAX'=67 +'MIN'=68 +'SUM'=69 +'VAR_POP'=70 +'VAR_SAMP'=71 +'VARIANCE'=72 +'STD'=73 +'STDDEV'=74 +'STDDEV_POP'=75 +'STDDEV_SAMP'=76 +'SUBSTRING'=77 +'TRIM'=78 +'END'=79 +'FULL'=80 +'OFFSET'=81 +'INTERVAL'=82 +'MICROSECOND'=83 +'SECOND'=84 +'MINUTE'=85 +'HOUR'=86 +'DAY'=87 +'WEEK'=88 +'MONTH'=89 +'QUARTER'=90 +'YEAR'=91 +'SECOND_MICROSECOND'=92 +'MINUTE_MICROSECOND'=93 +'MINUTE_SECOND'=94 +'HOUR_MICROSECOND'=95 +'HOUR_SECOND'=96 +'HOUR_MINUTE'=97 +'DAY_MICROSECOND'=98 +'DAY_SECOND'=99 +'DAY_MINUTE'=100 +'DAY_HOUR'=101 +'YEAR_MONTH'=102 +'TABLES'=103 +'ABS'=104 +'ACOS'=105 +'ADD'=106 +'ADDTIME'=107 +'ASCII'=108 +'ASIN'=109 +'ATAN'=110 +'ATAN2'=111 +'CBRT'=112 +'CEIL'=113 +'CEILING'=114 +'CONCAT'=115 +'CONCAT_WS'=116 +'CONV'=117 +'CONVERT_TZ'=118 +'COS'=119 +'COSH'=120 +'COT'=121 +'CRC32'=122 +'CURDATE'=123 +'CURTIME'=124 +'CURRENT_DATE'=125 +'CURRENT_TIME'=126 +'CURRENT_TIMESTAMP'=127 +'DATE'=128 +'DATE_ADD'=129 +'DATE_FORMAT'=130 +'DATE_SUB'=131 +'DATEDIFF'=132 +'DAYNAME'=133 +'DAYOFMONTH'=134 +'DAYOFWEEK'=135 +'DAYOFYEAR'=136 +'DEGREES'=137 +'DIVIDE'=138 +'E'=139 +'EXP'=140 +'EXPM1'=141 +'EXTRACT'=142 +'FLOOR'=143 +'FROM_DAYS'=144 +'FROM_UNIXTIME'=145 +'GET_FORMAT'=146 +'IF'=147 +'IFNULL'=148 +'ISNULL'=149 +'LAST_DAY'=150 +'LENGTH'=151 +'LN'=152 +'LOCALTIME'=153 +'LOCALTIMESTAMP'=154 +'LOCATE'=155 +'LOG'=156 +'LOG10'=157 +'LOG2'=158 +'LOWER'=159 +'LTRIM'=160 +'MAKEDATE'=161 +'MAKETIME'=162 +'MODULUS'=163 +'MONTHNAME'=164 +'MULTIPLY'=165 +'NOW'=166 +'NULLIF'=167 +'PERIOD_ADD'=168 +'PERIOD_DIFF'=169 +'PI'=170 +'POSITION'=171 +'POW'=172 +'POWER'=173 +'RADIANS'=174 +'RAND'=175 +'REPLACE'=176 +'RINT'=177 +'ROUND'=178 +'RTRIM'=179 +'REVERSE'=180 +'SEC_TO_TIME'=181 +'SIGN'=182 +'SIGNUM'=183 +'SIN'=184 +'SINH'=185 +'SQRT'=186 +'STR_TO_DATE'=187 +'SUBDATE'=188 +'SUBTIME'=189 +'SUBTRACT'=190 +'SYSDATE'=191 +'TAN'=192 +'TIME'=193 +'TIMEDIFF'=194 +'TIME_FORMAT'=195 +'TIME_TO_SEC'=196 +'TIMESTAMP'=197 +'TRUNCATE'=198 +'TO_DAYS'=199 +'TO_SECONDS'=200 +'UNIX_TIMESTAMP'=201 +'UPPER'=202 +'UTC_DATE'=203 +'UTC_TIME'=204 +'UTC_TIMESTAMP'=205 +'D'=206 +'T'=207 +'TS'=208 +'{'=209 +'}'=210 +'DENSE_RANK'=211 +'RANK'=212 +'ROW_NUMBER'=213 +'DATE_HISTOGRAM'=214 +'DAY_OF_MONTH'=215 +'DAY_OF_YEAR'=216 +'DAY_OF_WEEK'=217 +'EXCLUDE'=218 +'EXTENDED_STATS'=219 +'FIELD'=220 +'FILTER'=221 +'GEO_BOUNDING_BOX'=222 +'GEO_CELL'=223 +'GEO_DISTANCE'=224 +'GEO_DISTANCE_RANGE'=225 +'GEO_INTERSECTS'=226 +'GEO_POLYGON'=227 +'HISTOGRAM'=228 +'HOUR_OF_DAY'=229 +'INCLUDE'=230 +'IN_TERMS'=231 +'MATCHPHRASE'=232 +'MATCH_PHRASE'=233 +'MATCHPHRASEQUERY'=234 +'SIMPLE_QUERY_STRING'=235 +'QUERY_STRING'=236 +'MATCH_PHRASE_PREFIX'=237 +'MATCHQUERY'=238 +'MATCH_QUERY'=239 +'MINUTE_OF_DAY'=240 +'MINUTE_OF_HOUR'=241 +'MONTH_OF_YEAR'=242 +'MULTIMATCH'=243 +'MULTI_MATCH'=244 +'MULTIMATCHQUERY'=245 +'NESTED'=246 +'PERCENTILES'=247 +'PERCENTILE'=248 +'PERCENTILE_APPROX'=249 +'REGEXP_QUERY'=250 +'REVERSE_NESTED'=251 +'QUERY'=252 +'RANGE'=253 +'SCORE'=254 +'SCOREQUERY'=255 +'SCORE_QUERY'=256 +'SECOND_OF_MINUTE'=257 +'STATS'=258 +'TERM'=259 +'TERMS'=260 +'TIMESTAMPADD'=261 +'TIMESTAMPDIFF'=262 +'TOPHITS'=263 +'TYPEOF'=264 +'WEEK_OF_YEAR'=265 +'WEEKOFYEAR'=266 +'WEEKDAY'=267 +'WILDCARDQUERY'=268 +'WILDCARD_QUERY'=269 +'SUBSTR'=270 +'STRCMP'=271 +'ADDDATE'=272 +'YEARWEEK'=273 +'ALLOW_LEADING_WILDCARD'=274 +'ANALYZER'=275 +'ANALYZE_WILDCARD'=276 +'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'=277 +'BOOST'=278 +'CASE_INSENSITIVE'=279 +'CUTOFF_FREQUENCY'=280 +'DEFAULT_FIELD'=281 +'DEFAULT_OPERATOR'=282 +'ESCAPE'=283 +'ENABLE_POSITION_INCREMENTS'=284 +'FIELDS'=285 +'FLAGS'=286 +'FUZZINESS'=287 +'FUZZY_MAX_EXPANSIONS'=288 +'FUZZY_PREFIX_LENGTH'=289 +'FUZZY_REWRITE'=290 +'FUZZY_TRANSPOSITIONS'=291 +'LENIENT'=292 +'LOW_FREQ_OPERATOR'=293 +'MAX_DETERMINIZED_STATES'=294 +'MAX_EXPANSIONS'=295 +'MINIMUM_SHOULD_MATCH'=296 +'OPERATOR'=297 +'PHRASE_SLOP'=298 +'PREFIX_LENGTH'=299 +'QUOTE_ANALYZER'=300 +'QUOTE_FIELD_SUFFIX'=301 +'REWRITE'=302 +'SLOP'=303 +'TIE_BREAKER'=304 +'TIME_ZONE'=305 +'TYPE'=306 +'ZERO_TERMS_QUERY'=307 +'HIGHLIGHT'=308 +'PRE_TAGS'=309 +'POST_TAGS'=310 +'MATCH_BOOL_PREFIX'=311 +'*'=312 +'/'=313 +'%'=314 +'+'=315 +'-'=316 +'DIV'=317 +'MOD'=318 +'='=319 +'>'=320 +'<'=321 +'!'=322 +'~'=323 +'|'=324 +'&'=325 +'^'=326 +'.'=327 +'('=328 +')'=329 +'['=330 +']'=331 +','=332 +';'=333 +'@'=334 +'0'=335 +'1'=336 +'2'=337 +'\''=338 +'"'=339 +'`'=340 +':'=341 diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserBaseListener.java b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserBaseListener.java new file mode 100644 index 00000000000..a1e204aa46b --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserBaseListener.java @@ -0,0 +1,1851 @@ +// Generated from /home/ubuntu/ws/OpenSearch-Dashboards/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 by ANTLR 4.13.1 + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link OpenSearchSQLParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class OpenSearchSQLParserBaseListener implements OpenSearchSQLParserListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRoot(OpenSearchSQLParser.RootContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRoot(OpenSearchSQLParser.RootContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSqlStatement(OpenSearchSQLParser.SqlStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSqlStatement(OpenSearchSQLParser.SqlStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDmlStatement(OpenSearchSQLParser.DmlStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDmlStatement(OpenSearchSQLParser.DmlStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSimpleSelect(OpenSearchSQLParser.SimpleSelectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSimpleSelect(OpenSearchSQLParser.SimpleSelectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAdminStatement(OpenSearchSQLParser.AdminStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAdminStatement(OpenSearchSQLParser.AdminStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowStatement(OpenSearchSQLParser.ShowStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowStatement(OpenSearchSQLParser.ShowStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDescribeStatement(OpenSearchSQLParser.DescribeStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDescribeStatement(OpenSearchSQLParser.DescribeStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterColumnFilter(OpenSearchSQLParser.ColumnFilterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitColumnFilter(OpenSearchSQLParser.ColumnFilterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableFilter(OpenSearchSQLParser.TableFilterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableFilter(OpenSearchSQLParser.TableFilterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShowDescribePattern(OpenSearchSQLParser.ShowDescribePatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShowDescribePattern(OpenSearchSQLParser.ShowDescribePatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCompatibleID(OpenSearchSQLParser.CompatibleIDContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCompatibleID(OpenSearchSQLParser.CompatibleIDContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuerySpecification(OpenSearchSQLParser.QuerySpecificationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuerySpecification(OpenSearchSQLParser.QuerySpecificationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSelectClause(OpenSearchSQLParser.SelectClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSelectClause(OpenSearchSQLParser.SelectClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSelectSpec(OpenSearchSQLParser.SelectSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSelectSpec(OpenSearchSQLParser.SelectSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSelectElements(OpenSearchSQLParser.SelectElementsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSelectElements(OpenSearchSQLParser.SelectElementsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSelectElement(OpenSearchSQLParser.SelectElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSelectElement(OpenSearchSQLParser.SelectElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFromClause(OpenSearchSQLParser.FromClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFromClause(OpenSearchSQLParser.FromClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableAsRelation(OpenSearchSQLParser.TableAsRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableAsRelation(OpenSearchSQLParser.TableAsRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSubqueryAsRelation(OpenSearchSQLParser.SubqueryAsRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSubqueryAsRelation(OpenSearchSQLParser.SubqueryAsRelationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWhereClause(OpenSearchSQLParser.WhereClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWhereClause(OpenSearchSQLParser.WhereClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupByClause(OpenSearchSQLParser.GroupByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupByClause(OpenSearchSQLParser.GroupByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupByElements(OpenSearchSQLParser.GroupByElementsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupByElements(OpenSearchSQLParser.GroupByElementsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGroupByElement(OpenSearchSQLParser.GroupByElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGroupByElement(OpenSearchSQLParser.GroupByElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHavingClause(OpenSearchSQLParser.HavingClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHavingClause(OpenSearchSQLParser.HavingClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderByClause(OpenSearchSQLParser.OrderByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderByClause(OpenSearchSQLParser.OrderByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderByElement(OpenSearchSQLParser.OrderByElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderByElement(OpenSearchSQLParser.OrderByElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLimitClause(OpenSearchSQLParser.LimitClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLimitClause(OpenSearchSQLParser.LimitClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWindowFunctionClause(OpenSearchSQLParser.WindowFunctionClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWindowFunctionClause(OpenSearchSQLParser.WindowFunctionClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterScalarWindowFunction(OpenSearchSQLParser.ScalarWindowFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitScalarWindowFunction(OpenSearchSQLParser.ScalarWindowFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAggregateWindowFunction(OpenSearchSQLParser.AggregateWindowFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAggregateWindowFunction(OpenSearchSQLParser.AggregateWindowFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOverClause(OpenSearchSQLParser.OverClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOverClause(OpenSearchSQLParser.OverClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPartitionByClause(OpenSearchSQLParser.PartitionByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPartitionByClause(OpenSearchSQLParser.PartitionByClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterString(OpenSearchSQLParser.StringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitString(OpenSearchSQLParser.StringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSignedDecimal(OpenSearchSQLParser.SignedDecimalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSignedDecimal(OpenSearchSQLParser.SignedDecimalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSignedReal(OpenSearchSQLParser.SignedRealContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSignedReal(OpenSearchSQLParser.SignedRealContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolean(OpenSearchSQLParser.BooleanContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolean(OpenSearchSQLParser.BooleanContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDatetime(OpenSearchSQLParser.DatetimeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDatetime(OpenSearchSQLParser.DatetimeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterval(OpenSearchSQLParser.IntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterval(OpenSearchSQLParser.IntervalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNull(OpenSearchSQLParser.NullContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNull(OpenSearchSQLParser.NullContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDecimalLiteral(OpenSearchSQLParser.DecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDecimalLiteral(OpenSearchSQLParser.DecimalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNumericLiteral(OpenSearchSQLParser.NumericLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNumericLiteral(OpenSearchSQLParser.NumericLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStringLiteral(OpenSearchSQLParser.StringLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStringLiteral(OpenSearchSQLParser.StringLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBooleanLiteral(OpenSearchSQLParser.BooleanLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBooleanLiteral(OpenSearchSQLParser.BooleanLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRealLiteral(OpenSearchSQLParser.RealLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRealLiteral(OpenSearchSQLParser.RealLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSign(OpenSearchSQLParser.SignContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSign(OpenSearchSQLParser.SignContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNullLiteral(OpenSearchSQLParser.NullLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNullLiteral(OpenSearchSQLParser.NullLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDatetimeLiteral(OpenSearchSQLParser.DatetimeLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDatetimeLiteral(OpenSearchSQLParser.DatetimeLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDateLiteral(OpenSearchSQLParser.DateLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDateLiteral(OpenSearchSQLParser.DateLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTimeLiteral(OpenSearchSQLParser.TimeLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTimeLiteral(OpenSearchSQLParser.TimeLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTimestampLiteral(OpenSearchSQLParser.TimestampLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTimestampLiteral(OpenSearchSQLParser.TimestampLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDatetimeConstantLiteral(OpenSearchSQLParser.DatetimeConstantLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDatetimeConstantLiteral(OpenSearchSQLParser.DatetimeConstantLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntervalLiteral(OpenSearchSQLParser.IntervalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntervalLiteral(OpenSearchSQLParser.IntervalLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntervalUnit(OpenSearchSQLParser.IntervalUnitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntervalUnit(OpenSearchSQLParser.IntervalUnitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrExpression(OpenSearchSQLParser.OrExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrExpression(OpenSearchSQLParser.OrExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAndExpression(OpenSearchSQLParser.AndExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAndExpression(OpenSearchSQLParser.AndExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNotExpression(OpenSearchSQLParser.NotExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNotExpression(OpenSearchSQLParser.NotExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPredicateExpression(OpenSearchSQLParser.PredicateExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPredicateExpression(OpenSearchSQLParser.PredicateExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpressionAtomPredicate(OpenSearchSQLParser.ExpressionAtomPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpressionAtomPredicate(OpenSearchSQLParser.ExpressionAtomPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBinaryComparisonPredicate(OpenSearchSQLParser.BinaryComparisonPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBinaryComparisonPredicate(OpenSearchSQLParser.BinaryComparisonPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInPredicate(OpenSearchSQLParser.InPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInPredicate(OpenSearchSQLParser.InPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBetweenPredicate(OpenSearchSQLParser.BetweenPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBetweenPredicate(OpenSearchSQLParser.BetweenPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIsNullPredicate(OpenSearchSQLParser.IsNullPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIsNullPredicate(OpenSearchSQLParser.IsNullPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLikePredicate(OpenSearchSQLParser.LikePredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLikePredicate(OpenSearchSQLParser.LikePredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRegexpPredicate(OpenSearchSQLParser.RegexpPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRegexpPredicate(OpenSearchSQLParser.RegexpPredicateContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpressions(OpenSearchSQLParser.ExpressionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpressions(OpenSearchSQLParser.ExpressionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstantExpressionAtom(OpenSearchSQLParser.ConstantExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstantExpressionAtom(OpenSearchSQLParser.ConstantExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionCallExpressionAtom(OpenSearchSQLParser.FunctionCallExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionCallExpressionAtom(OpenSearchSQLParser.FunctionCallExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFullColumnNameExpressionAtom(OpenSearchSQLParser.FullColumnNameExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFullColumnNameExpressionAtom(OpenSearchSQLParser.FullColumnNameExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNestedExpressionAtom(OpenSearchSQLParser.NestedExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNestedExpressionAtom(OpenSearchSQLParser.NestedExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMathExpressionAtom(OpenSearchSQLParser.MathExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMathExpressionAtom(OpenSearchSQLParser.MathExpressionAtomContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComparisonOperator(OpenSearchSQLParser.ComparisonOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComparisonOperator(OpenSearchSQLParser.ComparisonOperatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNullNotnull(OpenSearchSQLParser.NullNotnullContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNullNotnull(OpenSearchSQLParser.NullNotnullContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNestedAllFunctionCall(OpenSearchSQLParser.NestedAllFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNestedAllFunctionCall(OpenSearchSQLParser.NestedAllFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterScalarFunctionCall(OpenSearchSQLParser.ScalarFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitScalarFunctionCall(OpenSearchSQLParser.ScalarFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSpecificFunctionCall(OpenSearchSQLParser.SpecificFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSpecificFunctionCall(OpenSearchSQLParser.SpecificFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWindowFunctionCall(OpenSearchSQLParser.WindowFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWindowFunctionCall(OpenSearchSQLParser.WindowFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAggregateFunctionCall(OpenSearchSQLParser.AggregateFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAggregateFunctionCall(OpenSearchSQLParser.AggregateFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFilteredAggregationFunctionCall(OpenSearchSQLParser.FilteredAggregationFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFilteredAggregationFunctionCall(OpenSearchSQLParser.FilteredAggregationFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterScoreRelevanceFunctionCall(OpenSearchSQLParser.ScoreRelevanceFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitScoreRelevanceFunctionCall(OpenSearchSQLParser.ScoreRelevanceFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceFunctionCall(OpenSearchSQLParser.RelevanceFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceFunctionCall(OpenSearchSQLParser.RelevanceFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHighlightFunctionCall(OpenSearchSQLParser.HighlightFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHighlightFunctionCall(OpenSearchSQLParser.HighlightFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPositionFunctionCall(OpenSearchSQLParser.PositionFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPositionFunctionCall(OpenSearchSQLParser.PositionFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExtractFunctionCall(OpenSearchSQLParser.ExtractFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExtractFunctionCall(OpenSearchSQLParser.ExtractFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGetFormatFunctionCall(OpenSearchSQLParser.GetFormatFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGetFormatFunctionCall(OpenSearchSQLParser.GetFormatFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTimestampFunctionCall(OpenSearchSQLParser.TimestampFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTimestampFunctionCall(OpenSearchSQLParser.TimestampFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTimestampFunction(OpenSearchSQLParser.TimestampFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTimestampFunction(OpenSearchSQLParser.TimestampFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTimestampFunctionName(OpenSearchSQLParser.TimestampFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTimestampFunctionName(OpenSearchSQLParser.TimestampFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGetFormatFunction(OpenSearchSQLParser.GetFormatFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGetFormatFunction(OpenSearchSQLParser.GetFormatFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGetFormatType(OpenSearchSQLParser.GetFormatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGetFormatType(OpenSearchSQLParser.GetFormatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExtractFunction(OpenSearchSQLParser.ExtractFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExtractFunction(OpenSearchSQLParser.ExtractFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSimpleDateTimePart(OpenSearchSQLParser.SimpleDateTimePartContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSimpleDateTimePart(OpenSearchSQLParser.SimpleDateTimePartContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterComplexDateTimePart(OpenSearchSQLParser.ComplexDateTimePartContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitComplexDateTimePart(OpenSearchSQLParser.ComplexDateTimePartContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDatetimePart(OpenSearchSQLParser.DatetimePartContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDatetimePart(OpenSearchSQLParser.DatetimePartContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHighlightFunction(OpenSearchSQLParser.HighlightFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHighlightFunction(OpenSearchSQLParser.HighlightFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPositionFunction(OpenSearchSQLParser.PositionFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPositionFunction(OpenSearchSQLParser.PositionFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMatchQueryAltSyntaxFunction(OpenSearchSQLParser.MatchQueryAltSyntaxFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMatchQueryAltSyntaxFunction(OpenSearchSQLParser.MatchQueryAltSyntaxFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterScalarFunctionName(OpenSearchSQLParser.ScalarFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitScalarFunctionName(OpenSearchSQLParser.ScalarFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCaseFunctionCall(OpenSearchSQLParser.CaseFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCaseFunctionCall(OpenSearchSQLParser.CaseFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDataTypeFunctionCall(OpenSearchSQLParser.DataTypeFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDataTypeFunctionCall(OpenSearchSQLParser.DataTypeFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceFunction(OpenSearchSQLParser.RelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceFunction(OpenSearchSQLParser.RelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterScoreRelevanceFunction(OpenSearchSQLParser.ScoreRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitScoreRelevanceFunction(OpenSearchSQLParser.ScoreRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNoFieldRelevanceFunction(OpenSearchSQLParser.NoFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNoFieldRelevanceFunction(OpenSearchSQLParser.NoFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleFieldRelevanceFunction(OpenSearchSQLParser.SingleFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleFieldRelevanceFunction(OpenSearchSQLParser.SingleFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiFieldRelevanceFunction(OpenSearchSQLParser.MultiFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiFieldRelevanceFunction(OpenSearchSQLParser.MultiFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAltSingleFieldRelevanceFunction(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAltSingleFieldRelevanceFunction(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAltMultiFieldRelevanceFunction(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAltMultiFieldRelevanceFunction(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConvertedDataType(OpenSearchSQLParser.ConvertedDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConvertedDataType(OpenSearchSQLParser.ConvertedDataTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCaseFuncAlternative(OpenSearchSQLParser.CaseFuncAlternativeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCaseFuncAlternative(OpenSearchSQLParser.CaseFuncAlternativeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRegularAggregateFunctionCall(OpenSearchSQLParser.RegularAggregateFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRegularAggregateFunctionCall(OpenSearchSQLParser.RegularAggregateFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCountStarFunctionCall(OpenSearchSQLParser.CountStarFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCountStarFunctionCall(OpenSearchSQLParser.CountStarFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDistinctCountFunctionCall(OpenSearchSQLParser.DistinctCountFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDistinctCountFunctionCall(OpenSearchSQLParser.DistinctCountFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPercentileApproxFunctionCall(OpenSearchSQLParser.PercentileApproxFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPercentileApproxFunctionCall(OpenSearchSQLParser.PercentileApproxFunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPercentileApproxFunction(OpenSearchSQLParser.PercentileApproxFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPercentileApproxFunction(OpenSearchSQLParser.PercentileApproxFunctionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFilterClause(OpenSearchSQLParser.FilterClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFilterClause(OpenSearchSQLParser.FilterClauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAggregationFunctionName(OpenSearchSQLParser.AggregationFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAggregationFunctionName(OpenSearchSQLParser.AggregationFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMathematicalFunctionName(OpenSearchSQLParser.MathematicalFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMathematicalFunctionName(OpenSearchSQLParser.MathematicalFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTrigonometricFunctionName(OpenSearchSQLParser.TrigonometricFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTrigonometricFunctionName(OpenSearchSQLParser.TrigonometricFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArithmeticFunctionName(OpenSearchSQLParser.ArithmeticFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArithmeticFunctionName(OpenSearchSQLParser.ArithmeticFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDateTimeFunctionName(OpenSearchSQLParser.DateTimeFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDateTimeFunctionName(OpenSearchSQLParser.DateTimeFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTextFunctionName(OpenSearchSQLParser.TextFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTextFunctionName(OpenSearchSQLParser.TextFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFlowControlFunctionName(OpenSearchSQLParser.FlowControlFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFlowControlFunctionName(OpenSearchSQLParser.FlowControlFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNoFieldRelevanceFunctionName(OpenSearchSQLParser.NoFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNoFieldRelevanceFunctionName(OpenSearchSQLParser.NoFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSystemFunctionName(OpenSearchSQLParser.SystemFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSystemFunctionName(OpenSearchSQLParser.SystemFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNestedFunctionName(OpenSearchSQLParser.NestedFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNestedFunctionName(OpenSearchSQLParser.NestedFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterScoreRelevanceFunctionName(OpenSearchSQLParser.ScoreRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitScoreRelevanceFunctionName(OpenSearchSQLParser.ScoreRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSingleFieldRelevanceFunctionName(OpenSearchSQLParser.SingleFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSingleFieldRelevanceFunctionName(OpenSearchSQLParser.SingleFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiFieldRelevanceFunctionName(OpenSearchSQLParser.MultiFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiFieldRelevanceFunctionName(OpenSearchSQLParser.MultiFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAltSingleFieldRelevanceFunctionName(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAltSingleFieldRelevanceFunctionName(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAltMultiFieldRelevanceFunctionName(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAltMultiFieldRelevanceFunctionName(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionArgs(OpenSearchSQLParser.FunctionArgsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionArgs(OpenSearchSQLParser.FunctionArgsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionArg(OpenSearchSQLParser.FunctionArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionArg(OpenSearchSQLParser.FunctionArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceArg(OpenSearchSQLParser.RelevanceArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceArg(OpenSearchSQLParser.RelevanceArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHighlightArg(OpenSearchSQLParser.HighlightArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHighlightArg(OpenSearchSQLParser.HighlightArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceArgName(OpenSearchSQLParser.RelevanceArgNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceArgName(OpenSearchSQLParser.RelevanceArgNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHighlightArgName(OpenSearchSQLParser.HighlightArgNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHighlightArgName(OpenSearchSQLParser.HighlightArgNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceFieldAndWeight(OpenSearchSQLParser.RelevanceFieldAndWeightContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceFieldAndWeight(OpenSearchSQLParser.RelevanceFieldAndWeightContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceFieldWeight(OpenSearchSQLParser.RelevanceFieldWeightContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceFieldWeight(OpenSearchSQLParser.RelevanceFieldWeightContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceField(OpenSearchSQLParser.RelevanceFieldContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceField(OpenSearchSQLParser.RelevanceFieldContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceQuery(OpenSearchSQLParser.RelevanceQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceQuery(OpenSearchSQLParser.RelevanceQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelevanceArgValue(OpenSearchSQLParser.RelevanceArgValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelevanceArgValue(OpenSearchSQLParser.RelevanceArgValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterHighlightArgValue(OpenSearchSQLParser.HighlightArgValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitHighlightArgValue(OpenSearchSQLParser.HighlightArgValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlternateMultiMatchArgName(OpenSearchSQLParser.AlternateMultiMatchArgNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlternateMultiMatchArgName(OpenSearchSQLParser.AlternateMultiMatchArgNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlternateMultiMatchQuery(OpenSearchSQLParser.AlternateMultiMatchQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlternateMultiMatchQuery(OpenSearchSQLParser.AlternateMultiMatchQueryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlternateMultiMatchField(OpenSearchSQLParser.AlternateMultiMatchFieldContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlternateMultiMatchField(OpenSearchSQLParser.AlternateMultiMatchFieldContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTableName(OpenSearchSQLParser.TableNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTableName(OpenSearchSQLParser.TableNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterColumnName(OpenSearchSQLParser.ColumnNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitColumnName(OpenSearchSQLParser.ColumnNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAllTupleFields(OpenSearchSQLParser.AllTupleFieldsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAllTupleFields(OpenSearchSQLParser.AllTupleFieldsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAlias(OpenSearchSQLParser.AliasContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAlias(OpenSearchSQLParser.AliasContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualifiedName(OpenSearchSQLParser.QualifiedNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualifiedName(OpenSearchSQLParser.QualifiedNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdent(OpenSearchSQLParser.IdentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdent(OpenSearchSQLParser.IdentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterKeywordsCanBeId(OpenSearchSQLParser.KeywordsCanBeIdContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitKeywordsCanBeId(OpenSearchSQLParser.KeywordsCanBeIdContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserListener.java b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserListener.java new file mode 100644 index 00000000000..d09bc19e746 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/.antlr/OpenSearchSQLParserListener.java @@ -0,0 +1,1613 @@ +// Generated from /home/ubuntu/ws/OpenSearch-Dashboards/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 by ANTLR 4.13.1 +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link OpenSearchSQLParser}. + */ +public interface OpenSearchSQLParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#root}. + * @param ctx the parse tree + */ + void enterRoot(OpenSearchSQLParser.RootContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#root}. + * @param ctx the parse tree + */ + void exitRoot(OpenSearchSQLParser.RootContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#sqlStatement}. + * @param ctx the parse tree + */ + void enterSqlStatement(OpenSearchSQLParser.SqlStatementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#sqlStatement}. + * @param ctx the parse tree + */ + void exitSqlStatement(OpenSearchSQLParser.SqlStatementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#dmlStatement}. + * @param ctx the parse tree + */ + void enterDmlStatement(OpenSearchSQLParser.DmlStatementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#dmlStatement}. + * @param ctx the parse tree + */ + void exitDmlStatement(OpenSearchSQLParser.DmlStatementContext ctx); + /** + * Enter a parse tree produced by the {@code simpleSelect} + * labeled alternative in {@link OpenSearchSQLParser#selectStatement}. + * @param ctx the parse tree + */ + void enterSimpleSelect(OpenSearchSQLParser.SimpleSelectContext ctx); + /** + * Exit a parse tree produced by the {@code simpleSelect} + * labeled alternative in {@link OpenSearchSQLParser#selectStatement}. + * @param ctx the parse tree + */ + void exitSimpleSelect(OpenSearchSQLParser.SimpleSelectContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#adminStatement}. + * @param ctx the parse tree + */ + void enterAdminStatement(OpenSearchSQLParser.AdminStatementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#adminStatement}. + * @param ctx the parse tree + */ + void exitAdminStatement(OpenSearchSQLParser.AdminStatementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#showStatement}. + * @param ctx the parse tree + */ + void enterShowStatement(OpenSearchSQLParser.ShowStatementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#showStatement}. + * @param ctx the parse tree + */ + void exitShowStatement(OpenSearchSQLParser.ShowStatementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#describeStatement}. + * @param ctx the parse tree + */ + void enterDescribeStatement(OpenSearchSQLParser.DescribeStatementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#describeStatement}. + * @param ctx the parse tree + */ + void exitDescribeStatement(OpenSearchSQLParser.DescribeStatementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#columnFilter}. + * @param ctx the parse tree + */ + void enterColumnFilter(OpenSearchSQLParser.ColumnFilterContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#columnFilter}. + * @param ctx the parse tree + */ + void exitColumnFilter(OpenSearchSQLParser.ColumnFilterContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#tableFilter}. + * @param ctx the parse tree + */ + void enterTableFilter(OpenSearchSQLParser.TableFilterContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#tableFilter}. + * @param ctx the parse tree + */ + void exitTableFilter(OpenSearchSQLParser.TableFilterContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#showDescribePattern}. + * @param ctx the parse tree + */ + void enterShowDescribePattern(OpenSearchSQLParser.ShowDescribePatternContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#showDescribePattern}. + * @param ctx the parse tree + */ + void exitShowDescribePattern(OpenSearchSQLParser.ShowDescribePatternContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#compatibleID}. + * @param ctx the parse tree + */ + void enterCompatibleID(OpenSearchSQLParser.CompatibleIDContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#compatibleID}. + * @param ctx the parse tree + */ + void exitCompatibleID(OpenSearchSQLParser.CompatibleIDContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#querySpecification}. + * @param ctx the parse tree + */ + void enterQuerySpecification(OpenSearchSQLParser.QuerySpecificationContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#querySpecification}. + * @param ctx the parse tree + */ + void exitQuerySpecification(OpenSearchSQLParser.QuerySpecificationContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#selectClause}. + * @param ctx the parse tree + */ + void enterSelectClause(OpenSearchSQLParser.SelectClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#selectClause}. + * @param ctx the parse tree + */ + void exitSelectClause(OpenSearchSQLParser.SelectClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#selectSpec}. + * @param ctx the parse tree + */ + void enterSelectSpec(OpenSearchSQLParser.SelectSpecContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#selectSpec}. + * @param ctx the parse tree + */ + void exitSelectSpec(OpenSearchSQLParser.SelectSpecContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#selectElements}. + * @param ctx the parse tree + */ + void enterSelectElements(OpenSearchSQLParser.SelectElementsContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#selectElements}. + * @param ctx the parse tree + */ + void exitSelectElements(OpenSearchSQLParser.SelectElementsContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#selectElement}. + * @param ctx the parse tree + */ + void enterSelectElement(OpenSearchSQLParser.SelectElementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#selectElement}. + * @param ctx the parse tree + */ + void exitSelectElement(OpenSearchSQLParser.SelectElementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#fromClause}. + * @param ctx the parse tree + */ + void enterFromClause(OpenSearchSQLParser.FromClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#fromClause}. + * @param ctx the parse tree + */ + void exitFromClause(OpenSearchSQLParser.FromClauseContext ctx); + /** + * Enter a parse tree produced by the {@code tableAsRelation} + * labeled alternative in {@link OpenSearchSQLParser#relation}. + * @param ctx the parse tree + */ + void enterTableAsRelation(OpenSearchSQLParser.TableAsRelationContext ctx); + /** + * Exit a parse tree produced by the {@code tableAsRelation} + * labeled alternative in {@link OpenSearchSQLParser#relation}. + * @param ctx the parse tree + */ + void exitTableAsRelation(OpenSearchSQLParser.TableAsRelationContext ctx); + /** + * Enter a parse tree produced by the {@code subqueryAsRelation} + * labeled alternative in {@link OpenSearchSQLParser#relation}. + * @param ctx the parse tree + */ + void enterSubqueryAsRelation(OpenSearchSQLParser.SubqueryAsRelationContext ctx); + /** + * Exit a parse tree produced by the {@code subqueryAsRelation} + * labeled alternative in {@link OpenSearchSQLParser#relation}. + * @param ctx the parse tree + */ + void exitSubqueryAsRelation(OpenSearchSQLParser.SubqueryAsRelationContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#whereClause}. + * @param ctx the parse tree + */ + void enterWhereClause(OpenSearchSQLParser.WhereClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#whereClause}. + * @param ctx the parse tree + */ + void exitWhereClause(OpenSearchSQLParser.WhereClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#groupByClause}. + * @param ctx the parse tree + */ + void enterGroupByClause(OpenSearchSQLParser.GroupByClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#groupByClause}. + * @param ctx the parse tree + */ + void exitGroupByClause(OpenSearchSQLParser.GroupByClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#groupByElements}. + * @param ctx the parse tree + */ + void enterGroupByElements(OpenSearchSQLParser.GroupByElementsContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#groupByElements}. + * @param ctx the parse tree + */ + void exitGroupByElements(OpenSearchSQLParser.GroupByElementsContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#groupByElement}. + * @param ctx the parse tree + */ + void enterGroupByElement(OpenSearchSQLParser.GroupByElementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#groupByElement}. + * @param ctx the parse tree + */ + void exitGroupByElement(OpenSearchSQLParser.GroupByElementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#havingClause}. + * @param ctx the parse tree + */ + void enterHavingClause(OpenSearchSQLParser.HavingClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#havingClause}. + * @param ctx the parse tree + */ + void exitHavingClause(OpenSearchSQLParser.HavingClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#orderByClause}. + * @param ctx the parse tree + */ + void enterOrderByClause(OpenSearchSQLParser.OrderByClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#orderByClause}. + * @param ctx the parse tree + */ + void exitOrderByClause(OpenSearchSQLParser.OrderByClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#orderByElement}. + * @param ctx the parse tree + */ + void enterOrderByElement(OpenSearchSQLParser.OrderByElementContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#orderByElement}. + * @param ctx the parse tree + */ + void exitOrderByElement(OpenSearchSQLParser.OrderByElementContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#limitClause}. + * @param ctx the parse tree + */ + void enterLimitClause(OpenSearchSQLParser.LimitClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#limitClause}. + * @param ctx the parse tree + */ + void exitLimitClause(OpenSearchSQLParser.LimitClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#windowFunctionClause}. + * @param ctx the parse tree + */ + void enterWindowFunctionClause(OpenSearchSQLParser.WindowFunctionClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#windowFunctionClause}. + * @param ctx the parse tree + */ + void exitWindowFunctionClause(OpenSearchSQLParser.WindowFunctionClauseContext ctx); + /** + * Enter a parse tree produced by the {@code scalarWindowFunction} + * labeled alternative in {@link OpenSearchSQLParser#windowFunction}. + * @param ctx the parse tree + */ + void enterScalarWindowFunction(OpenSearchSQLParser.ScalarWindowFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code scalarWindowFunction} + * labeled alternative in {@link OpenSearchSQLParser#windowFunction}. + * @param ctx the parse tree + */ + void exitScalarWindowFunction(OpenSearchSQLParser.ScalarWindowFunctionContext ctx); + /** + * Enter a parse tree produced by the {@code aggregateWindowFunction} + * labeled alternative in {@link OpenSearchSQLParser#windowFunction}. + * @param ctx the parse tree + */ + void enterAggregateWindowFunction(OpenSearchSQLParser.AggregateWindowFunctionContext ctx); + /** + * Exit a parse tree produced by the {@code aggregateWindowFunction} + * labeled alternative in {@link OpenSearchSQLParser#windowFunction}. + * @param ctx the parse tree + */ + void exitAggregateWindowFunction(OpenSearchSQLParser.AggregateWindowFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#overClause}. + * @param ctx the parse tree + */ + void enterOverClause(OpenSearchSQLParser.OverClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#overClause}. + * @param ctx the parse tree + */ + void exitOverClause(OpenSearchSQLParser.OverClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#partitionByClause}. + * @param ctx the parse tree + */ + void enterPartitionByClause(OpenSearchSQLParser.PartitionByClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#partitionByClause}. + * @param ctx the parse tree + */ + void exitPartitionByClause(OpenSearchSQLParser.PartitionByClauseContext ctx); + /** + * Enter a parse tree produced by the {@code string} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterString(OpenSearchSQLParser.StringContext ctx); + /** + * Exit a parse tree produced by the {@code string} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitString(OpenSearchSQLParser.StringContext ctx); + /** + * Enter a parse tree produced by the {@code signedDecimal} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterSignedDecimal(OpenSearchSQLParser.SignedDecimalContext ctx); + /** + * Exit a parse tree produced by the {@code signedDecimal} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitSignedDecimal(OpenSearchSQLParser.SignedDecimalContext ctx); + /** + * Enter a parse tree produced by the {@code signedReal} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterSignedReal(OpenSearchSQLParser.SignedRealContext ctx); + /** + * Exit a parse tree produced by the {@code signedReal} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitSignedReal(OpenSearchSQLParser.SignedRealContext ctx); + /** + * Enter a parse tree produced by the {@code boolean} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterBoolean(OpenSearchSQLParser.BooleanContext ctx); + /** + * Exit a parse tree produced by the {@code boolean} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitBoolean(OpenSearchSQLParser.BooleanContext ctx); + /** + * Enter a parse tree produced by the {@code datetime} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterDatetime(OpenSearchSQLParser.DatetimeContext ctx); + /** + * Exit a parse tree produced by the {@code datetime} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitDatetime(OpenSearchSQLParser.DatetimeContext ctx); + /** + * Enter a parse tree produced by the {@code interval} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterInterval(OpenSearchSQLParser.IntervalContext ctx); + /** + * Exit a parse tree produced by the {@code interval} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitInterval(OpenSearchSQLParser.IntervalContext ctx); + /** + * Enter a parse tree produced by the {@code null} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void enterNull(OpenSearchSQLParser.NullContext ctx); + /** + * Exit a parse tree produced by the {@code null} + * labeled alternative in {@link OpenSearchSQLParser#constant}. + * @param ctx the parse tree + */ + void exitNull(OpenSearchSQLParser.NullContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#decimalLiteral}. + * @param ctx the parse tree + */ + void enterDecimalLiteral(OpenSearchSQLParser.DecimalLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#decimalLiteral}. + * @param ctx the parse tree + */ + void exitDecimalLiteral(OpenSearchSQLParser.DecimalLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#numericLiteral}. + * @param ctx the parse tree + */ + void enterNumericLiteral(OpenSearchSQLParser.NumericLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#numericLiteral}. + * @param ctx the parse tree + */ + void exitNumericLiteral(OpenSearchSQLParser.NumericLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#stringLiteral}. + * @param ctx the parse tree + */ + void enterStringLiteral(OpenSearchSQLParser.StringLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#stringLiteral}. + * @param ctx the parse tree + */ + void exitStringLiteral(OpenSearchSQLParser.StringLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#booleanLiteral}. + * @param ctx the parse tree + */ + void enterBooleanLiteral(OpenSearchSQLParser.BooleanLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#booleanLiteral}. + * @param ctx the parse tree + */ + void exitBooleanLiteral(OpenSearchSQLParser.BooleanLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#realLiteral}. + * @param ctx the parse tree + */ + void enterRealLiteral(OpenSearchSQLParser.RealLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#realLiteral}. + * @param ctx the parse tree + */ + void exitRealLiteral(OpenSearchSQLParser.RealLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#sign}. + * @param ctx the parse tree + */ + void enterSign(OpenSearchSQLParser.SignContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#sign}. + * @param ctx the parse tree + */ + void exitSign(OpenSearchSQLParser.SignContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#nullLiteral}. + * @param ctx the parse tree + */ + void enterNullLiteral(OpenSearchSQLParser.NullLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#nullLiteral}. + * @param ctx the parse tree + */ + void exitNullLiteral(OpenSearchSQLParser.NullLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#datetimeLiteral}. + * @param ctx the parse tree + */ + void enterDatetimeLiteral(OpenSearchSQLParser.DatetimeLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#datetimeLiteral}. + * @param ctx the parse tree + */ + void exitDatetimeLiteral(OpenSearchSQLParser.DatetimeLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#dateLiteral}. + * @param ctx the parse tree + */ + void enterDateLiteral(OpenSearchSQLParser.DateLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#dateLiteral}. + * @param ctx the parse tree + */ + void exitDateLiteral(OpenSearchSQLParser.DateLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#timeLiteral}. + * @param ctx the parse tree + */ + void enterTimeLiteral(OpenSearchSQLParser.TimeLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#timeLiteral}. + * @param ctx the parse tree + */ + void exitTimeLiteral(OpenSearchSQLParser.TimeLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#timestampLiteral}. + * @param ctx the parse tree + */ + void enterTimestampLiteral(OpenSearchSQLParser.TimestampLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#timestampLiteral}. + * @param ctx the parse tree + */ + void exitTimestampLiteral(OpenSearchSQLParser.TimestampLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#datetimeConstantLiteral}. + * @param ctx the parse tree + */ + void enterDatetimeConstantLiteral(OpenSearchSQLParser.DatetimeConstantLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#datetimeConstantLiteral}. + * @param ctx the parse tree + */ + void exitDatetimeConstantLiteral(OpenSearchSQLParser.DatetimeConstantLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#intervalLiteral}. + * @param ctx the parse tree + */ + void enterIntervalLiteral(OpenSearchSQLParser.IntervalLiteralContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#intervalLiteral}. + * @param ctx the parse tree + */ + void exitIntervalLiteral(OpenSearchSQLParser.IntervalLiteralContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#intervalUnit}. + * @param ctx the parse tree + */ + void enterIntervalUnit(OpenSearchSQLParser.IntervalUnitContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#intervalUnit}. + * @param ctx the parse tree + */ + void exitIntervalUnit(OpenSearchSQLParser.IntervalUnitContext ctx); + /** + * Enter a parse tree produced by the {@code orExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void enterOrExpression(OpenSearchSQLParser.OrExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code orExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void exitOrExpression(OpenSearchSQLParser.OrExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code andExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void enterAndExpression(OpenSearchSQLParser.AndExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code andExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void exitAndExpression(OpenSearchSQLParser.AndExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code notExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void enterNotExpression(OpenSearchSQLParser.NotExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code notExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void exitNotExpression(OpenSearchSQLParser.NotExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code predicateExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void enterPredicateExpression(OpenSearchSQLParser.PredicateExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code predicateExpression} + * labeled alternative in {@link OpenSearchSQLParser#expression}. + * @param ctx the parse tree + */ + void exitPredicateExpression(OpenSearchSQLParser.PredicateExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code expressionAtomPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterExpressionAtomPredicate(OpenSearchSQLParser.ExpressionAtomPredicateContext ctx); + /** + * Exit a parse tree produced by the {@code expressionAtomPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitExpressionAtomPredicate(OpenSearchSQLParser.ExpressionAtomPredicateContext ctx); + /** + * Enter a parse tree produced by the {@code binaryComparisonPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterBinaryComparisonPredicate(OpenSearchSQLParser.BinaryComparisonPredicateContext ctx); + /** + * Exit a parse tree produced by the {@code binaryComparisonPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitBinaryComparisonPredicate(OpenSearchSQLParser.BinaryComparisonPredicateContext ctx); + /** + * Enter a parse tree produced by the {@code inPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterInPredicate(OpenSearchSQLParser.InPredicateContext ctx); + /** + * Exit a parse tree produced by the {@code inPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitInPredicate(OpenSearchSQLParser.InPredicateContext ctx); + /** + * Enter a parse tree produced by the {@code betweenPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterBetweenPredicate(OpenSearchSQLParser.BetweenPredicateContext ctx); + /** + * Exit a parse tree produced by the {@code betweenPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitBetweenPredicate(OpenSearchSQLParser.BetweenPredicateContext ctx); + /** + * Enter a parse tree produced by the {@code isNullPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterIsNullPredicate(OpenSearchSQLParser.IsNullPredicateContext ctx); + /** + * Exit a parse tree produced by the {@code isNullPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitIsNullPredicate(OpenSearchSQLParser.IsNullPredicateContext ctx); + /** + * Enter a parse tree produced by the {@code likePredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterLikePredicate(OpenSearchSQLParser.LikePredicateContext ctx); + /** + * Exit a parse tree produced by the {@code likePredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitLikePredicate(OpenSearchSQLParser.LikePredicateContext ctx); + /** + * Enter a parse tree produced by the {@code regexpPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void enterRegexpPredicate(OpenSearchSQLParser.RegexpPredicateContext ctx); + /** + * Exit a parse tree produced by the {@code regexpPredicate} + * labeled alternative in {@link OpenSearchSQLParser#predicate}. + * @param ctx the parse tree + */ + void exitRegexpPredicate(OpenSearchSQLParser.RegexpPredicateContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#expressions}. + * @param ctx the parse tree + */ + void enterExpressions(OpenSearchSQLParser.ExpressionsContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#expressions}. + * @param ctx the parse tree + */ + void exitExpressions(OpenSearchSQLParser.ExpressionsContext ctx); + /** + * Enter a parse tree produced by the {@code constantExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void enterConstantExpressionAtom(OpenSearchSQLParser.ConstantExpressionAtomContext ctx); + /** + * Exit a parse tree produced by the {@code constantExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void exitConstantExpressionAtom(OpenSearchSQLParser.ConstantExpressionAtomContext ctx); + /** + * Enter a parse tree produced by the {@code functionCallExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void enterFunctionCallExpressionAtom(OpenSearchSQLParser.FunctionCallExpressionAtomContext ctx); + /** + * Exit a parse tree produced by the {@code functionCallExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void exitFunctionCallExpressionAtom(OpenSearchSQLParser.FunctionCallExpressionAtomContext ctx); + /** + * Enter a parse tree produced by the {@code fullColumnNameExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void enterFullColumnNameExpressionAtom(OpenSearchSQLParser.FullColumnNameExpressionAtomContext ctx); + /** + * Exit a parse tree produced by the {@code fullColumnNameExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void exitFullColumnNameExpressionAtom(OpenSearchSQLParser.FullColumnNameExpressionAtomContext ctx); + /** + * Enter a parse tree produced by the {@code nestedExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void enterNestedExpressionAtom(OpenSearchSQLParser.NestedExpressionAtomContext ctx); + /** + * Exit a parse tree produced by the {@code nestedExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void exitNestedExpressionAtom(OpenSearchSQLParser.NestedExpressionAtomContext ctx); + /** + * Enter a parse tree produced by the {@code mathExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void enterMathExpressionAtom(OpenSearchSQLParser.MathExpressionAtomContext ctx); + /** + * Exit a parse tree produced by the {@code mathExpressionAtom} + * labeled alternative in {@link OpenSearchSQLParser#expressionAtom}. + * @param ctx the parse tree + */ + void exitMathExpressionAtom(OpenSearchSQLParser.MathExpressionAtomContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#comparisonOperator}. + * @param ctx the parse tree + */ + void enterComparisonOperator(OpenSearchSQLParser.ComparisonOperatorContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#comparisonOperator}. + * @param ctx the parse tree + */ + void exitComparisonOperator(OpenSearchSQLParser.ComparisonOperatorContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#nullNotnull}. + * @param ctx the parse tree + */ + void enterNullNotnull(OpenSearchSQLParser.NullNotnullContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#nullNotnull}. + * @param ctx the parse tree + */ + void exitNullNotnull(OpenSearchSQLParser.NullNotnullContext ctx); + /** + * Enter a parse tree produced by the {@code nestedAllFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterNestedAllFunctionCall(OpenSearchSQLParser.NestedAllFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code nestedAllFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitNestedAllFunctionCall(OpenSearchSQLParser.NestedAllFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code scalarFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterScalarFunctionCall(OpenSearchSQLParser.ScalarFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code scalarFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitScalarFunctionCall(OpenSearchSQLParser.ScalarFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code specificFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterSpecificFunctionCall(OpenSearchSQLParser.SpecificFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code specificFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitSpecificFunctionCall(OpenSearchSQLParser.SpecificFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code windowFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterWindowFunctionCall(OpenSearchSQLParser.WindowFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code windowFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitWindowFunctionCall(OpenSearchSQLParser.WindowFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code aggregateFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterAggregateFunctionCall(OpenSearchSQLParser.AggregateFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code aggregateFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitAggregateFunctionCall(OpenSearchSQLParser.AggregateFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code filteredAggregationFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterFilteredAggregationFunctionCall(OpenSearchSQLParser.FilteredAggregationFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code filteredAggregationFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitFilteredAggregationFunctionCall(OpenSearchSQLParser.FilteredAggregationFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code scoreRelevanceFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterScoreRelevanceFunctionCall(OpenSearchSQLParser.ScoreRelevanceFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code scoreRelevanceFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitScoreRelevanceFunctionCall(OpenSearchSQLParser.ScoreRelevanceFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code relevanceFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterRelevanceFunctionCall(OpenSearchSQLParser.RelevanceFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code relevanceFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitRelevanceFunctionCall(OpenSearchSQLParser.RelevanceFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code highlightFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterHighlightFunctionCall(OpenSearchSQLParser.HighlightFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code highlightFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitHighlightFunctionCall(OpenSearchSQLParser.HighlightFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code positionFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterPositionFunctionCall(OpenSearchSQLParser.PositionFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code positionFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitPositionFunctionCall(OpenSearchSQLParser.PositionFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code extractFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterExtractFunctionCall(OpenSearchSQLParser.ExtractFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code extractFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitExtractFunctionCall(OpenSearchSQLParser.ExtractFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code getFormatFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterGetFormatFunctionCall(OpenSearchSQLParser.GetFormatFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code getFormatFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitGetFormatFunctionCall(OpenSearchSQLParser.GetFormatFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code timestampFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void enterTimestampFunctionCall(OpenSearchSQLParser.TimestampFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code timestampFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#functionCall}. + * @param ctx the parse tree + */ + void exitTimestampFunctionCall(OpenSearchSQLParser.TimestampFunctionCallContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#timestampFunction}. + * @param ctx the parse tree + */ + void enterTimestampFunction(OpenSearchSQLParser.TimestampFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#timestampFunction}. + * @param ctx the parse tree + */ + void exitTimestampFunction(OpenSearchSQLParser.TimestampFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#timestampFunctionName}. + * @param ctx the parse tree + */ + void enterTimestampFunctionName(OpenSearchSQLParser.TimestampFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#timestampFunctionName}. + * @param ctx the parse tree + */ + void exitTimestampFunctionName(OpenSearchSQLParser.TimestampFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#getFormatFunction}. + * @param ctx the parse tree + */ + void enterGetFormatFunction(OpenSearchSQLParser.GetFormatFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#getFormatFunction}. + * @param ctx the parse tree + */ + void exitGetFormatFunction(OpenSearchSQLParser.GetFormatFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#getFormatType}. + * @param ctx the parse tree + */ + void enterGetFormatType(OpenSearchSQLParser.GetFormatTypeContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#getFormatType}. + * @param ctx the parse tree + */ + void exitGetFormatType(OpenSearchSQLParser.GetFormatTypeContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#extractFunction}. + * @param ctx the parse tree + */ + void enterExtractFunction(OpenSearchSQLParser.ExtractFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#extractFunction}. + * @param ctx the parse tree + */ + void exitExtractFunction(OpenSearchSQLParser.ExtractFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#simpleDateTimePart}. + * @param ctx the parse tree + */ + void enterSimpleDateTimePart(OpenSearchSQLParser.SimpleDateTimePartContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#simpleDateTimePart}. + * @param ctx the parse tree + */ + void exitSimpleDateTimePart(OpenSearchSQLParser.SimpleDateTimePartContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#complexDateTimePart}. + * @param ctx the parse tree + */ + void enterComplexDateTimePart(OpenSearchSQLParser.ComplexDateTimePartContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#complexDateTimePart}. + * @param ctx the parse tree + */ + void exitComplexDateTimePart(OpenSearchSQLParser.ComplexDateTimePartContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#datetimePart}. + * @param ctx the parse tree + */ + void enterDatetimePart(OpenSearchSQLParser.DatetimePartContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#datetimePart}. + * @param ctx the parse tree + */ + void exitDatetimePart(OpenSearchSQLParser.DatetimePartContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#highlightFunction}. + * @param ctx the parse tree + */ + void enterHighlightFunction(OpenSearchSQLParser.HighlightFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#highlightFunction}. + * @param ctx the parse tree + */ + void exitHighlightFunction(OpenSearchSQLParser.HighlightFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#positionFunction}. + * @param ctx the parse tree + */ + void enterPositionFunction(OpenSearchSQLParser.PositionFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#positionFunction}. + * @param ctx the parse tree + */ + void exitPositionFunction(OpenSearchSQLParser.PositionFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#matchQueryAltSyntaxFunction}. + * @param ctx the parse tree + */ + void enterMatchQueryAltSyntaxFunction(OpenSearchSQLParser.MatchQueryAltSyntaxFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#matchQueryAltSyntaxFunction}. + * @param ctx the parse tree + */ + void exitMatchQueryAltSyntaxFunction(OpenSearchSQLParser.MatchQueryAltSyntaxFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#scalarFunctionName}. + * @param ctx the parse tree + */ + void enterScalarFunctionName(OpenSearchSQLParser.ScalarFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#scalarFunctionName}. + * @param ctx the parse tree + */ + void exitScalarFunctionName(OpenSearchSQLParser.ScalarFunctionNameContext ctx); + /** + * Enter a parse tree produced by the {@code caseFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#specificFunction}. + * @param ctx the parse tree + */ + void enterCaseFunctionCall(OpenSearchSQLParser.CaseFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code caseFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#specificFunction}. + * @param ctx the parse tree + */ + void exitCaseFunctionCall(OpenSearchSQLParser.CaseFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code dataTypeFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#specificFunction}. + * @param ctx the parse tree + */ + void enterDataTypeFunctionCall(OpenSearchSQLParser.DataTypeFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code dataTypeFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#specificFunction}. + * @param ctx the parse tree + */ + void exitDataTypeFunctionCall(OpenSearchSQLParser.DataTypeFunctionCallContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceFunction}. + * @param ctx the parse tree + */ + void enterRelevanceFunction(OpenSearchSQLParser.RelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceFunction}. + * @param ctx the parse tree + */ + void exitRelevanceFunction(OpenSearchSQLParser.RelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#scoreRelevanceFunction}. + * @param ctx the parse tree + */ + void enterScoreRelevanceFunction(OpenSearchSQLParser.ScoreRelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#scoreRelevanceFunction}. + * @param ctx the parse tree + */ + void exitScoreRelevanceFunction(OpenSearchSQLParser.ScoreRelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#noFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void enterNoFieldRelevanceFunction(OpenSearchSQLParser.NoFieldRelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#noFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void exitNoFieldRelevanceFunction(OpenSearchSQLParser.NoFieldRelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#singleFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void enterSingleFieldRelevanceFunction(OpenSearchSQLParser.SingleFieldRelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#singleFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void exitSingleFieldRelevanceFunction(OpenSearchSQLParser.SingleFieldRelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#multiFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void enterMultiFieldRelevanceFunction(OpenSearchSQLParser.MultiFieldRelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#multiFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void exitMultiFieldRelevanceFunction(OpenSearchSQLParser.MultiFieldRelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#altSingleFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void enterAltSingleFieldRelevanceFunction(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#altSingleFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void exitAltSingleFieldRelevanceFunction(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#altMultiFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void enterAltMultiFieldRelevanceFunction(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#altMultiFieldRelevanceFunction}. + * @param ctx the parse tree + */ + void exitAltMultiFieldRelevanceFunction(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#convertedDataType}. + * @param ctx the parse tree + */ + void enterConvertedDataType(OpenSearchSQLParser.ConvertedDataTypeContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#convertedDataType}. + * @param ctx the parse tree + */ + void exitConvertedDataType(OpenSearchSQLParser.ConvertedDataTypeContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#caseFuncAlternative}. + * @param ctx the parse tree + */ + void enterCaseFuncAlternative(OpenSearchSQLParser.CaseFuncAlternativeContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#caseFuncAlternative}. + * @param ctx the parse tree + */ + void exitCaseFuncAlternative(OpenSearchSQLParser.CaseFuncAlternativeContext ctx); + /** + * Enter a parse tree produced by the {@code regularAggregateFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void enterRegularAggregateFunctionCall(OpenSearchSQLParser.RegularAggregateFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code regularAggregateFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void exitRegularAggregateFunctionCall(OpenSearchSQLParser.RegularAggregateFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code countStarFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void enterCountStarFunctionCall(OpenSearchSQLParser.CountStarFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code countStarFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void exitCountStarFunctionCall(OpenSearchSQLParser.CountStarFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code distinctCountFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void enterDistinctCountFunctionCall(OpenSearchSQLParser.DistinctCountFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code distinctCountFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void exitDistinctCountFunctionCall(OpenSearchSQLParser.DistinctCountFunctionCallContext ctx); + /** + * Enter a parse tree produced by the {@code percentileApproxFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void enterPercentileApproxFunctionCall(OpenSearchSQLParser.PercentileApproxFunctionCallContext ctx); + /** + * Exit a parse tree produced by the {@code percentileApproxFunctionCall} + * labeled alternative in {@link OpenSearchSQLParser#aggregateFunction}. + * @param ctx the parse tree + */ + void exitPercentileApproxFunctionCall(OpenSearchSQLParser.PercentileApproxFunctionCallContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#percentileApproxFunction}. + * @param ctx the parse tree + */ + void enterPercentileApproxFunction(OpenSearchSQLParser.PercentileApproxFunctionContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#percentileApproxFunction}. + * @param ctx the parse tree + */ + void exitPercentileApproxFunction(OpenSearchSQLParser.PercentileApproxFunctionContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#filterClause}. + * @param ctx the parse tree + */ + void enterFilterClause(OpenSearchSQLParser.FilterClauseContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#filterClause}. + * @param ctx the parse tree + */ + void exitFilterClause(OpenSearchSQLParser.FilterClauseContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#aggregationFunctionName}. + * @param ctx the parse tree + */ + void enterAggregationFunctionName(OpenSearchSQLParser.AggregationFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#aggregationFunctionName}. + * @param ctx the parse tree + */ + void exitAggregationFunctionName(OpenSearchSQLParser.AggregationFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#mathematicalFunctionName}. + * @param ctx the parse tree + */ + void enterMathematicalFunctionName(OpenSearchSQLParser.MathematicalFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#mathematicalFunctionName}. + * @param ctx the parse tree + */ + void exitMathematicalFunctionName(OpenSearchSQLParser.MathematicalFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#trigonometricFunctionName}. + * @param ctx the parse tree + */ + void enterTrigonometricFunctionName(OpenSearchSQLParser.TrigonometricFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#trigonometricFunctionName}. + * @param ctx the parse tree + */ + void exitTrigonometricFunctionName(OpenSearchSQLParser.TrigonometricFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#arithmeticFunctionName}. + * @param ctx the parse tree + */ + void enterArithmeticFunctionName(OpenSearchSQLParser.ArithmeticFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#arithmeticFunctionName}. + * @param ctx the parse tree + */ + void exitArithmeticFunctionName(OpenSearchSQLParser.ArithmeticFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#dateTimeFunctionName}. + * @param ctx the parse tree + */ + void enterDateTimeFunctionName(OpenSearchSQLParser.DateTimeFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#dateTimeFunctionName}. + * @param ctx the parse tree + */ + void exitDateTimeFunctionName(OpenSearchSQLParser.DateTimeFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#textFunctionName}. + * @param ctx the parse tree + */ + void enterTextFunctionName(OpenSearchSQLParser.TextFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#textFunctionName}. + * @param ctx the parse tree + */ + void exitTextFunctionName(OpenSearchSQLParser.TextFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#flowControlFunctionName}. + * @param ctx the parse tree + */ + void enterFlowControlFunctionName(OpenSearchSQLParser.FlowControlFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#flowControlFunctionName}. + * @param ctx the parse tree + */ + void exitFlowControlFunctionName(OpenSearchSQLParser.FlowControlFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#noFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void enterNoFieldRelevanceFunctionName(OpenSearchSQLParser.NoFieldRelevanceFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#noFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void exitNoFieldRelevanceFunctionName(OpenSearchSQLParser.NoFieldRelevanceFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#systemFunctionName}. + * @param ctx the parse tree + */ + void enterSystemFunctionName(OpenSearchSQLParser.SystemFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#systemFunctionName}. + * @param ctx the parse tree + */ + void exitSystemFunctionName(OpenSearchSQLParser.SystemFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#nestedFunctionName}. + * @param ctx the parse tree + */ + void enterNestedFunctionName(OpenSearchSQLParser.NestedFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#nestedFunctionName}. + * @param ctx the parse tree + */ + void exitNestedFunctionName(OpenSearchSQLParser.NestedFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#scoreRelevanceFunctionName}. + * @param ctx the parse tree + */ + void enterScoreRelevanceFunctionName(OpenSearchSQLParser.ScoreRelevanceFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#scoreRelevanceFunctionName}. + * @param ctx the parse tree + */ + void exitScoreRelevanceFunctionName(OpenSearchSQLParser.ScoreRelevanceFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#singleFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void enterSingleFieldRelevanceFunctionName(OpenSearchSQLParser.SingleFieldRelevanceFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#singleFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void exitSingleFieldRelevanceFunctionName(OpenSearchSQLParser.SingleFieldRelevanceFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#multiFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void enterMultiFieldRelevanceFunctionName(OpenSearchSQLParser.MultiFieldRelevanceFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#multiFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void exitMultiFieldRelevanceFunctionName(OpenSearchSQLParser.MultiFieldRelevanceFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#altSingleFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void enterAltSingleFieldRelevanceFunctionName(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#altSingleFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void exitAltSingleFieldRelevanceFunctionName(OpenSearchSQLParser.AltSingleFieldRelevanceFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#altMultiFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void enterAltMultiFieldRelevanceFunctionName(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#altMultiFieldRelevanceFunctionName}. + * @param ctx the parse tree + */ + void exitAltMultiFieldRelevanceFunctionName(OpenSearchSQLParser.AltMultiFieldRelevanceFunctionNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#functionArgs}. + * @param ctx the parse tree + */ + void enterFunctionArgs(OpenSearchSQLParser.FunctionArgsContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#functionArgs}. + * @param ctx the parse tree + */ + void exitFunctionArgs(OpenSearchSQLParser.FunctionArgsContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#functionArg}. + * @param ctx the parse tree + */ + void enterFunctionArg(OpenSearchSQLParser.FunctionArgContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#functionArg}. + * @param ctx the parse tree + */ + void exitFunctionArg(OpenSearchSQLParser.FunctionArgContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceArg}. + * @param ctx the parse tree + */ + void enterRelevanceArg(OpenSearchSQLParser.RelevanceArgContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceArg}. + * @param ctx the parse tree + */ + void exitRelevanceArg(OpenSearchSQLParser.RelevanceArgContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#highlightArg}. + * @param ctx the parse tree + */ + void enterHighlightArg(OpenSearchSQLParser.HighlightArgContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#highlightArg}. + * @param ctx the parse tree + */ + void exitHighlightArg(OpenSearchSQLParser.HighlightArgContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceArgName}. + * @param ctx the parse tree + */ + void enterRelevanceArgName(OpenSearchSQLParser.RelevanceArgNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceArgName}. + * @param ctx the parse tree + */ + void exitRelevanceArgName(OpenSearchSQLParser.RelevanceArgNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#highlightArgName}. + * @param ctx the parse tree + */ + void enterHighlightArgName(OpenSearchSQLParser.HighlightArgNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#highlightArgName}. + * @param ctx the parse tree + */ + void exitHighlightArgName(OpenSearchSQLParser.HighlightArgNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceFieldAndWeight}. + * @param ctx the parse tree + */ + void enterRelevanceFieldAndWeight(OpenSearchSQLParser.RelevanceFieldAndWeightContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceFieldAndWeight}. + * @param ctx the parse tree + */ + void exitRelevanceFieldAndWeight(OpenSearchSQLParser.RelevanceFieldAndWeightContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceFieldWeight}. + * @param ctx the parse tree + */ + void enterRelevanceFieldWeight(OpenSearchSQLParser.RelevanceFieldWeightContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceFieldWeight}. + * @param ctx the parse tree + */ + void exitRelevanceFieldWeight(OpenSearchSQLParser.RelevanceFieldWeightContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceField}. + * @param ctx the parse tree + */ + void enterRelevanceField(OpenSearchSQLParser.RelevanceFieldContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceField}. + * @param ctx the parse tree + */ + void exitRelevanceField(OpenSearchSQLParser.RelevanceFieldContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceQuery}. + * @param ctx the parse tree + */ + void enterRelevanceQuery(OpenSearchSQLParser.RelevanceQueryContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceQuery}. + * @param ctx the parse tree + */ + void exitRelevanceQuery(OpenSearchSQLParser.RelevanceQueryContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#relevanceArgValue}. + * @param ctx the parse tree + */ + void enterRelevanceArgValue(OpenSearchSQLParser.RelevanceArgValueContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#relevanceArgValue}. + * @param ctx the parse tree + */ + void exitRelevanceArgValue(OpenSearchSQLParser.RelevanceArgValueContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#highlightArgValue}. + * @param ctx the parse tree + */ + void enterHighlightArgValue(OpenSearchSQLParser.HighlightArgValueContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#highlightArgValue}. + * @param ctx the parse tree + */ + void exitHighlightArgValue(OpenSearchSQLParser.HighlightArgValueContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#alternateMultiMatchArgName}. + * @param ctx the parse tree + */ + void enterAlternateMultiMatchArgName(OpenSearchSQLParser.AlternateMultiMatchArgNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#alternateMultiMatchArgName}. + * @param ctx the parse tree + */ + void exitAlternateMultiMatchArgName(OpenSearchSQLParser.AlternateMultiMatchArgNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#alternateMultiMatchQuery}. + * @param ctx the parse tree + */ + void enterAlternateMultiMatchQuery(OpenSearchSQLParser.AlternateMultiMatchQueryContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#alternateMultiMatchQuery}. + * @param ctx the parse tree + */ + void exitAlternateMultiMatchQuery(OpenSearchSQLParser.AlternateMultiMatchQueryContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#alternateMultiMatchField}. + * @param ctx the parse tree + */ + void enterAlternateMultiMatchField(OpenSearchSQLParser.AlternateMultiMatchFieldContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#alternateMultiMatchField}. + * @param ctx the parse tree + */ + void exitAlternateMultiMatchField(OpenSearchSQLParser.AlternateMultiMatchFieldContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#tableName}. + * @param ctx the parse tree + */ + void enterTableName(OpenSearchSQLParser.TableNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#tableName}. + * @param ctx the parse tree + */ + void exitTableName(OpenSearchSQLParser.TableNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#columnName}. + * @param ctx the parse tree + */ + void enterColumnName(OpenSearchSQLParser.ColumnNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#columnName}. + * @param ctx the parse tree + */ + void exitColumnName(OpenSearchSQLParser.ColumnNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#allTupleFields}. + * @param ctx the parse tree + */ + void enterAllTupleFields(OpenSearchSQLParser.AllTupleFieldsContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#allTupleFields}. + * @param ctx the parse tree + */ + void exitAllTupleFields(OpenSearchSQLParser.AllTupleFieldsContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#alias}. + * @param ctx the parse tree + */ + void enterAlias(OpenSearchSQLParser.AliasContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#alias}. + * @param ctx the parse tree + */ + void exitAlias(OpenSearchSQLParser.AliasContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#qualifiedName}. + * @param ctx the parse tree + */ + void enterQualifiedName(OpenSearchSQLParser.QualifiedNameContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#qualifiedName}. + * @param ctx the parse tree + */ + void exitQualifiedName(OpenSearchSQLParser.QualifiedNameContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#ident}. + * @param ctx the parse tree + */ + void enterIdent(OpenSearchSQLParser.IdentContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#ident}. + * @param ctx the parse tree + */ + void exitIdent(OpenSearchSQLParser.IdentContext ctx); + /** + * Enter a parse tree produced by {@link OpenSearchSQLParser#keywordsCanBeId}. + * @param ctx the parse tree + */ + void enterKeywordsCanBeId(OpenSearchSQLParser.KeywordsCanBeIdContext ctx); + /** + * Exit a parse tree produced by {@link OpenSearchSQLParser#keywordsCanBeId}. + * @param ctx the parse tree + */ + void exitKeywordsCanBeId(OpenSearchSQLParser.KeywordsCanBeIdContext ctx); +} \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 b/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 new file mode 100644 index 00000000000..fac704ac840 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 @@ -0,0 +1,489 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +/* +MySQL (Positive Technologies) grammar +The MIT License (MIT). +Copyright (c) 2015-2017, Ivan Kochurkin (kvanttt@gmail.com), Positive Technologies. +Copyright (c) 2017, Ivan Khudyashev (IHudyashov@ptsecurity.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +lexer grammar OpenSearchSQLLexer; + +channels { SQLCOMMENT, ERRORCHANNEL } + +options { + caseInsensitive = true; +} + + +// SKIP + +SPACE: [ \t\r\n]+ -> channel(HIDDEN); +SPEC_SQL_COMMENT: '/*!' .+? '*/' -> channel(SQLCOMMENT); +COMMENT_INPUT: '/*' .*? '*/' -> channel(HIDDEN); +LINE_COMMENT: ( + ('-- ' | '#') ~[\r\n]* ('\r'? '\n' | EOF) + | '--' ('\r'? '\n' | EOF) + ) -> channel(HIDDEN); + + +// Keywords +// Common Keywords + +ALL: 'ALL'; +AND: 'AND'; +AS: 'AS'; +ASC: 'ASC'; +BOOLEAN: 'BOOLEAN'; +BETWEEN: 'BETWEEN'; +BY: 'BY'; +CASE: 'CASE'; +CAST: 'CAST'; +CROSS: 'CROSS'; +COLUMNS: 'COLUMNS'; +DATETIME: 'DATETIME'; +DELETE: 'DELETE'; +DESC: 'DESC'; +DESCRIBE: 'DESCRIBE'; +DISTINCT: 'DISTINCT'; +DOUBLE: 'DOUBLE'; +ELSE: 'ELSE'; +EXISTS: 'EXISTS'; +FALSE: 'FALSE'; +FLOAT: 'FLOAT'; +FIRST: 'FIRST'; +FROM: 'FROM'; +GROUP: 'GROUP'; +HAVING: 'HAVING'; +IN: 'IN'; +INNER: 'INNER'; +INT: 'INT'; +INTEGER: 'INTEGER'; +IS: 'IS'; +JOIN: 'JOIN'; +LAST: 'LAST'; +LEFT: 'LEFT'; +LIKE: 'LIKE'; +LIMIT: 'LIMIT'; +LONG: 'LONG'; +MATCH: 'MATCH'; +NATURAL: 'NATURAL'; +MISSING_LITERAL: 'MISSING'; +NOT: 'NOT'; +NULL_LITERAL: 'NULL'; +NULLS: 'NULLS'; +ON: 'ON'; +OR: 'OR'; +ORDER: 'ORDER'; +OUTER: 'OUTER'; +OVER: 'OVER'; +PARTITION: 'PARTITION'; +REGEXP: 'REGEXP'; +RIGHT: 'RIGHT'; +SELECT: 'SELECT'; +SHOW: 'SHOW'; +STRING: 'STRING'; +THEN: 'THEN'; +TRUE: 'TRUE'; +UNION: 'UNION'; +USING: 'USING'; +WHEN: 'WHEN'; +WHERE: 'WHERE'; + + +// OD SQL special keyword +// MISSING: 'MISSING'; +EXCEPT: 'MINUS'; + + +// Group function Keywords + +AVG: 'AVG'; +COUNT: 'COUNT'; +MAX: 'MAX'; +MIN: 'MIN'; +SUM: 'SUM'; +VAR_POP: 'VAR_POP'; +VAR_SAMP: 'VAR_SAMP'; +VARIANCE: 'VARIANCE'; +STD: 'STD'; +STDDEV: 'STDDEV'; +STDDEV_POP: 'STDDEV_POP'; +STDDEV_SAMP: 'STDDEV_SAMP'; + + +// Common function Keywords + +SUBSTRING: 'SUBSTRING'; +TRIM: 'TRIM'; + +// Keywords, but can be ID +// Common Keywords, but can be ID + +END: 'END'; +FULL: 'FULL'; +OFFSET: 'OFFSET'; + +// INTERVAL AND UNIT KEYWORDS +INTERVAL: 'INTERVAL'; +MICROSECOND: 'MICROSECOND'; +SECOND: 'SECOND'; +MINUTE: 'MINUTE'; +HOUR: 'HOUR'; +DAY: 'DAY'; +WEEK: 'WEEK'; +MONTH: 'MONTH'; +QUARTER: 'QUARTER'; +YEAR: 'YEAR'; +SECOND_MICROSECOND: 'SECOND_MICROSECOND'; +MINUTE_MICROSECOND: 'MINUTE_MICROSECOND'; +MINUTE_SECOND: 'MINUTE_SECOND'; +HOUR_MICROSECOND: 'HOUR_MICROSECOND'; +HOUR_SECOND: 'HOUR_SECOND'; +HOUR_MINUTE: 'HOUR_MINUTE'; +DAY_MICROSECOND: 'DAY_MICROSECOND'; +DAY_SECOND: 'DAY_SECOND'; +DAY_MINUTE: 'DAY_MINUTE'; +DAY_HOUR: 'DAY_HOUR'; +YEAR_MONTH: 'YEAR_MONTH'; + + +// PRIVILEGES + +TABLES: 'TABLES'; + + +// Common function names + +ABS: 'ABS'; +ACOS: 'ACOS'; +ADD: 'ADD'; +ADDTIME: 'ADDTIME'; +ASCII: 'ASCII'; +ASIN: 'ASIN'; +ATAN: 'ATAN'; +ATAN2: 'ATAN2'; +CBRT: 'CBRT'; +CEIL: 'CEIL'; +CEILING: 'CEILING'; +CONCAT: 'CONCAT'; +CONCAT_WS: 'CONCAT_WS'; +CONV: 'CONV'; +CONVERT_TZ: 'CONVERT_TZ'; +COS: 'COS'; +COSH: 'COSH'; +COT: 'COT'; +CRC32: 'CRC32'; +CURDATE: 'CURDATE'; +CURTIME: 'CURTIME'; +CURRENT_DATE: 'CURRENT_DATE'; +CURRENT_TIME: 'CURRENT_TIME'; +CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; +DATE: 'DATE'; +DATE_ADD: 'DATE_ADD'; +DATE_FORMAT: 'DATE_FORMAT'; +DATE_SUB: 'DATE_SUB'; +DATEDIFF: 'DATEDIFF'; +DAYNAME: 'DAYNAME'; +DAYOFMONTH: 'DAYOFMONTH'; +DAYOFWEEK: 'DAYOFWEEK'; +DAYOFYEAR: 'DAYOFYEAR'; +DEGREES: 'DEGREES'; +DIVIDE: 'DIVIDE'; +E: 'E'; +EXP: 'EXP'; +EXPM1: 'EXPM1'; +EXTRACT: 'EXTRACT'; +FLOOR: 'FLOOR'; +FROM_DAYS: 'FROM_DAYS'; +FROM_UNIXTIME: 'FROM_UNIXTIME'; +GET_FORMAT: 'GET_FORMAT'; +IF: 'IF'; +IFNULL: 'IFNULL'; +ISNULL: 'ISNULL'; +LAST_DAY: 'LAST_DAY'; +LENGTH: 'LENGTH'; +LN: 'LN'; +LOCALTIME: 'LOCALTIME'; +LOCALTIMESTAMP: 'LOCALTIMESTAMP'; +LOCATE: 'LOCATE'; +LOG: 'LOG'; +LOG10: 'LOG10'; +LOG2: 'LOG2'; +LOWER: 'LOWER'; +LTRIM: 'LTRIM'; +MAKEDATE: 'MAKEDATE'; +MAKETIME: 'MAKETIME'; +MODULUS: 'MODULUS'; +MONTHNAME: 'MONTHNAME'; +MULTIPLY: 'MULTIPLY'; +NOW: 'NOW'; +NULLIF: 'NULLIF'; +PERIOD_ADD: 'PERIOD_ADD'; +PERIOD_DIFF: 'PERIOD_DIFF'; +PI: 'PI'; +POSITION: 'POSITION'; +POW: 'POW'; +POWER: 'POWER'; +RADIANS: 'RADIANS'; +RAND: 'RAND'; +REPLACE: 'REPLACE'; +RINT: 'RINT'; +ROUND: 'ROUND'; +RTRIM: 'RTRIM'; +REVERSE: 'REVERSE'; +SEC_TO_TIME: 'SEC_TO_TIME'; +SIGN: 'SIGN'; +SIGNUM: 'SIGNUM'; +SIN: 'SIN'; +SINH: 'SINH'; +SQRT: 'SQRT'; +STR_TO_DATE: 'STR_TO_DATE'; +SUBDATE: 'SUBDATE'; +SUBTIME: 'SUBTIME'; +SUBTRACT: 'SUBTRACT'; +SYSDATE: 'SYSDATE'; +TAN: 'TAN'; +TIME: 'TIME'; +TIMEDIFF: 'TIMEDIFF'; +TIME_FORMAT: 'TIME_FORMAT'; +TIME_TO_SEC: 'TIME_TO_SEC'; +TIMESTAMP: 'TIMESTAMP'; +TRUNCATE: 'TRUNCATE'; +TO_DAYS: 'TO_DAYS'; +TO_SECONDS: 'TO_SECONDS'; +UNIX_TIMESTAMP: 'UNIX_TIMESTAMP'; +UPPER: 'UPPER'; +UTC_DATE: 'UTC_DATE'; +UTC_TIME: 'UTC_TIME'; +UTC_TIMESTAMP: 'UTC_TIMESTAMP'; + +D: 'D'; +T: 'T'; +TS: 'TS'; +LEFT_BRACE: '{'; +RIGHT_BRACE: '}'; + + +// Window function names +DENSE_RANK: 'DENSE_RANK'; +RANK: 'RANK'; +ROW_NUMBER: 'ROW_NUMBER'; + +// OD SQL special functions +DATE_HISTOGRAM: 'DATE_HISTOGRAM'; +DAY_OF_MONTH: 'DAY_OF_MONTH'; +DAY_OF_YEAR: 'DAY_OF_YEAR'; +DAY_OF_WEEK: 'DAY_OF_WEEK'; +EXCLUDE: 'EXCLUDE'; +EXTENDED_STATS: 'EXTENDED_STATS'; +FIELD: 'FIELD'; +FILTER: 'FILTER'; +GEO_BOUNDING_BOX: 'GEO_BOUNDING_BOX'; +GEO_CELL: 'GEO_CELL'; +GEO_DISTANCE: 'GEO_DISTANCE'; +GEO_DISTANCE_RANGE: 'GEO_DISTANCE_RANGE'; +GEO_INTERSECTS: 'GEO_INTERSECTS'; +GEO_POLYGON: 'GEO_POLYGON'; +HISTOGRAM: 'HISTOGRAM'; +HOUR_OF_DAY: 'HOUR_OF_DAY'; +INCLUDE: 'INCLUDE'; +IN_TERMS: 'IN_TERMS'; +MATCHPHRASE: 'MATCHPHRASE'; +MATCH_PHRASE: 'MATCH_PHRASE'; +MATCHPHRASEQUERY: 'MATCHPHRASEQUERY'; +SIMPLE_QUERY_STRING: 'SIMPLE_QUERY_STRING'; +QUERY_STRING: 'QUERY_STRING'; +MATCH_PHRASE_PREFIX: 'MATCH_PHRASE_PREFIX'; +MATCHQUERY: 'MATCHQUERY'; +MATCH_QUERY: 'MATCH_QUERY'; +MINUTE_OF_DAY: 'MINUTE_OF_DAY'; +MINUTE_OF_HOUR: 'MINUTE_OF_HOUR'; +MONTH_OF_YEAR: 'MONTH_OF_YEAR'; +MULTIMATCH: 'MULTIMATCH'; +MULTI_MATCH: 'MULTI_MATCH'; +MULTIMATCHQUERY: 'MULTIMATCHQUERY'; +NESTED: 'NESTED'; +PERCENTILES: 'PERCENTILES'; +PERCENTILE: 'PERCENTILE'; +PERCENTILE_APPROX: 'PERCENTILE_APPROX'; +REGEXP_QUERY: 'REGEXP_QUERY'; +REVERSE_NESTED: 'REVERSE_NESTED'; +QUERY: 'QUERY'; +RANGE: 'RANGE'; +SCORE: 'SCORE'; +SCOREQUERY: 'SCOREQUERY'; +SCORE_QUERY: 'SCORE_QUERY'; +SECOND_OF_MINUTE: 'SECOND_OF_MINUTE'; +STATS: 'STATS'; +TERM: 'TERM'; +TERMS: 'TERMS'; +TIMESTAMPADD: 'TIMESTAMPADD'; +TIMESTAMPDIFF: 'TIMESTAMPDIFF'; +TOPHITS: 'TOPHITS'; +TYPEOF: 'TYPEOF'; +WEEK_OF_YEAR: 'WEEK_OF_YEAR'; +WEEKOFYEAR: 'WEEKOFYEAR'; +WEEKDAY: 'WEEKDAY'; +WILDCARDQUERY: 'WILDCARDQUERY'; +WILDCARD_QUERY: 'WILDCARD_QUERY'; + +// TEXT FUNCTIONS +SUBSTR: 'SUBSTR'; +STRCMP: 'STRCMP'; + +// DATE AND TIME FUNCTIONS +ADDDATE: 'ADDDATE'; +YEARWEEK: 'YEARWEEK'; + +// RELEVANCE FUNCTIONS AND PARAMETERS +ALLOW_LEADING_WILDCARD: 'ALLOW_LEADING_WILDCARD'; +ANALYZER: 'ANALYZER'; +ANALYZE_WILDCARD: 'ANALYZE_WILDCARD'; +AUTO_GENERATE_SYNONYMS_PHRASE_QUERY:'AUTO_GENERATE_SYNONYMS_PHRASE_QUERY'; +BOOST: 'BOOST'; +CASE_INSENSITIVE: 'CASE_INSENSITIVE'; +CUTOFF_FREQUENCY: 'CUTOFF_FREQUENCY'; +DEFAULT_FIELD: 'DEFAULT_FIELD'; +DEFAULT_OPERATOR: 'DEFAULT_OPERATOR'; +ESCAPE: 'ESCAPE'; +ENABLE_POSITION_INCREMENTS: 'ENABLE_POSITION_INCREMENTS'; +FIELDS: 'FIELDS'; +FLAGS: 'FLAGS'; +FUZZINESS: 'FUZZINESS'; +FUZZY_MAX_EXPANSIONS: 'FUZZY_MAX_EXPANSIONS'; +FUZZY_PREFIX_LENGTH: 'FUZZY_PREFIX_LENGTH'; +FUZZY_REWRITE: 'FUZZY_REWRITE'; +FUZZY_TRANSPOSITIONS: 'FUZZY_TRANSPOSITIONS'; +LENIENT: 'LENIENT'; +LOW_FREQ_OPERATOR: 'LOW_FREQ_OPERATOR'; +MAX_DETERMINIZED_STATES: 'MAX_DETERMINIZED_STATES'; +MAX_EXPANSIONS: 'MAX_EXPANSIONS'; +MINIMUM_SHOULD_MATCH: 'MINIMUM_SHOULD_MATCH'; +OPERATOR: 'OPERATOR'; +PHRASE_SLOP: 'PHRASE_SLOP'; +PREFIX_LENGTH: 'PREFIX_LENGTH'; +QUOTE_ANALYZER: 'QUOTE_ANALYZER'; +QUOTE_FIELD_SUFFIX: 'QUOTE_FIELD_SUFFIX'; +REWRITE: 'REWRITE'; +SLOP: 'SLOP'; +TIE_BREAKER: 'TIE_BREAKER'; +TIME_ZONE: 'TIME_ZONE'; +TYPE: 'TYPE'; +ZERO_TERMS_QUERY: 'ZERO_TERMS_QUERY'; +HIGHLIGHT: 'HIGHLIGHT'; +HIGHLIGHT_PRE_TAGS: 'PRE_TAGS'; +HIGHLIGHT_POST_TAGS: 'POST_TAGS'; + +// RELEVANCE FUNCTIONS +MATCH_BOOL_PREFIX: 'MATCH_BOOL_PREFIX'; +// Operators + +// Operators. Arithmetics + +STAR: '*'; +SLASH: '/'; +MODULE: '%'; +PLUS: '+'; +MINUS: '-'; +DIV: 'DIV'; +MOD: 'MOD'; + + +// Operators. Comparation + +EQUAL_SYMBOL: '='; +GREATER_SYMBOL: '>'; +LESS_SYMBOL: '<'; +EXCLAMATION_SYMBOL: '!'; + + +// Operators. Bit + +BIT_NOT_OP: '~'; +BIT_OR_OP: '|'; +BIT_AND_OP: '&'; +BIT_XOR_OP: '^'; + + +// Constructors symbols + +DOT: '.'; +LR_BRACKET: '('; +RR_BRACKET: ')'; +LT_SQR_PRTHS: '['; +RT_SQR_PRTHS: ']'; +COMMA: ','; +SEMI: ';'; +AT_SIGN: '@'; +ZERO_DECIMAL: '0'; +ONE_DECIMAL: '1'; +TWO_DECIMAL: '2'; +SINGLE_QUOTE_SYMB: '\''; +DOUBLE_QUOTE_SYMB: '"'; +REVERSE_QUOTE_SYMB: '`'; +COLON_SYMB: ':'; + + +// Literal Primitives + +START_NATIONAL_STRING_LITERAL: 'N' SQUOTA_STRING; +STRING_LITERAL: SQUOTA_STRING; +DECIMAL_LITERAL: DEC_DIGIT+; +HEXADECIMAL_LITERAL: 'X' '\'' (HEX_DIGIT HEX_DIGIT)+ '\'' + | '0X' HEX_DIGIT+; + +REAL_LITERAL: (DEC_DIGIT+)? '.' DEC_DIGIT+ + | DEC_DIGIT+ '.' EXPONENT_NUM_PART + | (DEC_DIGIT+)? '.' (DEC_DIGIT+ EXPONENT_NUM_PART) + | DEC_DIGIT+ EXPONENT_NUM_PART; +NULL_SPEC_LITERAL: '\\' 'N'; +BIT_STRING: BIT_STRING_L; + + + +// Identifiers + +ID: ID_LITERAL; +DOUBLE_QUOTE_ID: DQUOTA_STRING; +BACKTICK_QUOTE_ID: BQUOTA_STRING; + + +// Fragments for Literal primitives +fragment EXPONENT_NUM_PART: 'E' [-+]? DEC_DIGIT+; +// fragment ID_LITERAL: [a-zA-Z_][a-zA-Z_0-9]*; +fragment ID_LITERAL: ([@*A-Z_])+ ([*A-Z_\-0-9])*; +fragment DQUOTA_STRING: '"' ( '\\'. | '""' | ~('"'| '\\') )* '"'; +fragment SQUOTA_STRING: '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\''; +fragment BQUOTA_STRING: '`' ( '\\'. | '``' | ~('`'|'\\'))* '`'; +fragment HEX_DIGIT: [0-9A-F]; +fragment DEC_DIGIT: [0-9]; +fragment BIT_STRING_L: 'B' '\'' [01]+ '\''; +// Last tokens must generate Errors + +// Identifiers cannot start with a single '_' since this an OpenSearch reserved +// metadata field. Two underscores (or more) is acceptable, such as '__field'. +// fragment ID_LITERAL: ([@*A-Z_])+?[*A-Z_\-0-9]*; + +ERROR_RECOGNITION: . -> channel(ERRORCHANNEL); \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 b/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 new file mode 100644 index 00000000000..08a645cb7f1 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4 @@ -0,0 +1,849 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +/* +MySQL (Positive Technologies) grammar +The MIT License (MIT). +Copyright (c) 2015-2017, Ivan Kochurkin (kvanttt@gmail.com), Positive Technologies. +Copyright (c) 2017, Ivan Khudyashev (IHudyashov@ptsecurity.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +parser grammar OpenSearchSQLParser; + + +options { tokenVocab = OpenSearchSQLLexer; } +// Top Level Description + +// Root rule + +root + : sqlStatement? SEMI? EOF + ; + +// Only SELECT +sqlStatement + : dmlStatement + | adminStatement + ; + +dmlStatement + : selectStatement + ; + +// Data Manipulation Language + +// Primary DML Statements +selectStatement + : querySpecification # simpleSelect + ; + +adminStatement + : showStatement + | describeStatement + ; + +showStatement + : SHOW TABLES tableFilter + ; + +describeStatement + : DESCRIBE TABLES tableFilter columnFilter? + ; + +columnFilter + : COLUMNS LIKE showDescribePattern + ; + +tableFilter + : LIKE showDescribePattern + ; + +showDescribePattern + : oldID=compatibleID | stringLiteral + ; + +compatibleID + : (MODULE | ID)+? + ; + + +// Select Statement's Details +querySpecification + : selectClause fromClause? limitClause? + ; + +selectClause + : SELECT selectSpec? selectElements + ; + +selectSpec + : (ALL | DISTINCT) + ; + +selectElements + : (star = STAR | selectElement) (COMMA selectElement)* + ; + +selectElement + : expression (AS? alias)? + ; + +fromClause + : FROM relation (whereClause)? (groupByClause)? (havingClause)? (orderByClause)? // Place it under FROM for now but actually not necessary ex. A UNION B ORDER BY + + ; + +relation + : tableName (AS? alias)? # tableAsRelation + | LR_BRACKET subquery = querySpecification RR_BRACKET AS? alias # subqueryAsRelation + ; + +whereClause + : WHERE expression + ; + +groupByClause + : GROUP BY groupByElements + ; + +groupByElements + : groupByElement (COMMA groupByElement)* + ; + +groupByElement + : expression + ; + +havingClause + : HAVING expression + ; + +orderByClause + : ORDER BY orderByElement (COMMA orderByElement)* + ; + +orderByElement + : expression order = (ASC | DESC)? (NULLS (FIRST | LAST))? + ; + +limitClause + : LIMIT (offset = decimalLiteral COMMA)? limit = decimalLiteral + | LIMIT limit = decimalLiteral OFFSET offset = decimalLiteral + ; + +// Window Function's Details +windowFunctionClause + : function = windowFunction overClause + ; + +windowFunction + : functionName = (ROW_NUMBER | RANK | DENSE_RANK) LR_BRACKET functionArgs? RR_BRACKET # scalarWindowFunction + | aggregateFunction # aggregateWindowFunction + ; + +overClause + : OVER LR_BRACKET partitionByClause? orderByClause? RR_BRACKET + ; + +partitionByClause + : PARTITION BY expression (COMMA expression)* + ; + +// Literals +constant + : stringLiteral # string + | sign? decimalLiteral # signedDecimal + | sign? realLiteral # signedReal + | booleanLiteral # boolean + | datetimeLiteral # datetime + | intervalLiteral # interval + | nullLiteral # null + // Doesn't support the following types for now + //| BIT_STRING + //| NOT? nullLiteral=(NULL_LITERAL | NULL_SPEC_LITERAL) + ; + +decimalLiteral + : DECIMAL_LITERAL + | ZERO_DECIMAL + | ONE_DECIMAL + | TWO_DECIMAL + ; + +numericLiteral + : decimalLiteral + | realLiteral + ; + +stringLiteral + : STRING_LITERAL + | DOUBLE_QUOTE_ID + ; + +booleanLiteral + : TRUE + | FALSE + ; + +realLiteral + : REAL_LITERAL + ; + +sign + : PLUS + | MINUS + ; + +nullLiteral + : NULL_LITERAL + ; + +// Date and Time Literal, follow ANSI 92 +datetimeLiteral + : dateLiteral + | timeLiteral + | timestampLiteral + ; + +dateLiteral + : DATE date = stringLiteral + | LEFT_BRACE (DATE | D) date = stringLiteral RIGHT_BRACE + ; + +timeLiteral + : TIME time = stringLiteral + | LEFT_BRACE (TIME | T) time = stringLiteral RIGHT_BRACE + ; + +timestampLiteral + : TIMESTAMP timestamp = stringLiteral + | LEFT_BRACE (TIMESTAMP | TS) timestamp = stringLiteral RIGHT_BRACE + ; + +// Actually, these constants are shortcuts to the corresponding functions +datetimeConstantLiteral + : CURRENT_DATE + | CURRENT_TIME + | CURRENT_TIMESTAMP + | LOCALTIME + | LOCALTIMESTAMP + | UTC_TIMESTAMP + | UTC_DATE + | UTC_TIME + ; + +intervalLiteral + : INTERVAL expression intervalUnit + ; + +intervalUnit + : MICROSECOND + | SECOND + | MINUTE + | HOUR + | DAY + | WEEK + | MONTH + | QUARTER + | YEAR + | SECOND_MICROSECOND + | MINUTE_MICROSECOND + | MINUTE_SECOND + | HOUR_MICROSECOND + | HOUR_SECOND + | HOUR_MINUTE + | DAY_MICROSECOND + | DAY_SECOND + | DAY_MINUTE + | DAY_HOUR + | YEAR_MONTH + ; + +// predicates + +// Simplified approach for expression +expression + : NOT expression # notExpression + | left = expression AND right = expression # andExpression + | left = expression OR right = expression # orExpression + | predicate # predicateExpression + ; + +predicate + : expressionAtom # expressionAtomPredicate + | left = predicate comparisonOperator right = predicate # binaryComparisonPredicate + | predicate IS nullNotnull # isNullPredicate + | predicate NOT? BETWEEN predicate AND predicate # betweenPredicate + | left = predicate NOT? LIKE right = predicate # likePredicate + | left = predicate REGEXP right = predicate # regexpPredicate + | predicate NOT? IN '(' expressions ')' # inPredicate + ; + +expressions + : expression (',' expression)* + ; + +expressionAtom + : constant # constantExpressionAtom + | columnName # fullColumnNameExpressionAtom + | functionCall # functionCallExpressionAtom + | LR_BRACKET expression RR_BRACKET # nestedExpressionAtom + | left = expressionAtom mathOperator = (STAR | SLASH | MODULE) right = expressionAtom # mathExpressionAtom + | left = expressionAtom mathOperator = (PLUS | MINUS) right = expressionAtom # mathExpressionAtom + ; + +comparisonOperator + : '=' + | '>' + | '<' + | '<' '=' + | '>' '=' + | '<' '>' + | '!' '=' + ; + +nullNotnull + : NOT? NULL_LITERAL + ; + +functionCall + : nestedFunctionName LR_BRACKET allTupleFields RR_BRACKET # nestedAllFunctionCall + | scalarFunctionName LR_BRACKET functionArgs RR_BRACKET # scalarFunctionCall + | specificFunction # specificFunctionCall + | windowFunctionClause # windowFunctionCall + | aggregateFunction # aggregateFunctionCall + | aggregateFunction (orderByClause)? filterClause # filteredAggregationFunctionCall + | scoreRelevanceFunction # scoreRelevanceFunctionCall + | relevanceFunction # relevanceFunctionCall + | highlightFunction # highlightFunctionCall + | positionFunction # positionFunctionCall + | extractFunction # extractFunctionCall + | getFormatFunction # getFormatFunctionCall + | timestampFunction # timestampFunctionCall + ; + +timestampFunction + : timestampFunctionName LR_BRACKET simpleDateTimePart COMMA firstArg = functionArg COMMA secondArg = functionArg RR_BRACKET + ; + +timestampFunctionName + : TIMESTAMPADD + | TIMESTAMPDIFF + ; + +getFormatFunction + : GET_FORMAT LR_BRACKET getFormatType COMMA functionArg RR_BRACKET + ; + +getFormatType + : DATE + | DATETIME + | TIME + | TIMESTAMP + ; + +extractFunction + : EXTRACT LR_BRACKET datetimePart FROM functionArg RR_BRACKET + ; + +simpleDateTimePart + : MICROSECOND + | SECOND + | MINUTE + | HOUR + | DAY + | WEEK + | MONTH + | QUARTER + | YEAR + ; + +complexDateTimePart + : SECOND_MICROSECOND + | MINUTE_MICROSECOND + | MINUTE_SECOND + | HOUR_MICROSECOND + | HOUR_SECOND + | HOUR_MINUTE + | DAY_MICROSECOND + | DAY_SECOND + | DAY_MINUTE + | DAY_HOUR + | YEAR_MONTH + ; + +datetimePart + : simpleDateTimePart + | complexDateTimePart + ; + +highlightFunction + : HIGHLIGHT LR_BRACKET relevanceField (COMMA highlightArg)* RR_BRACKET + ; + +positionFunction + : POSITION LR_BRACKET functionArg IN functionArg RR_BRACKET + ; + +matchQueryAltSyntaxFunction + : field = relevanceField EQUAL_SYMBOL MATCH_QUERY LR_BRACKET query = relevanceQuery RR_BRACKET + ; + +scalarFunctionName + : mathematicalFunctionName + | dateTimeFunctionName + | textFunctionName + | flowControlFunctionName + | systemFunctionName + | nestedFunctionName + ; + +specificFunction + : CASE expression caseFuncAlternative+ (ELSE elseArg = functionArg)? END # caseFunctionCall + | CASE caseFuncAlternative+ (ELSE elseArg = functionArg)? END # caseFunctionCall + | CAST '(' expression AS convertedDataType ')' # dataTypeFunctionCall + ; + +relevanceFunction + : noFieldRelevanceFunction + | singleFieldRelevanceFunction + | multiFieldRelevanceFunction + | altSingleFieldRelevanceFunction + | altMultiFieldRelevanceFunction + ; + +scoreRelevanceFunction + : scoreRelevanceFunctionName LR_BRACKET relevanceFunction (COMMA weight = relevanceFieldWeight)? RR_BRACKET + ; + +noFieldRelevanceFunction + : noFieldRelevanceFunctionName LR_BRACKET query = relevanceQuery (COMMA relevanceArg)* RR_BRACKET + ; + +// Field is a single column +singleFieldRelevanceFunction + : singleFieldRelevanceFunctionName LR_BRACKET field = relevanceField COMMA query = relevanceQuery (COMMA relevanceArg)* RR_BRACKET + ; + +// Field is a list of columns +multiFieldRelevanceFunction + : multiFieldRelevanceFunctionName LR_BRACKET LT_SQR_PRTHS field = relevanceFieldAndWeight (COMMA field = relevanceFieldAndWeight)* RT_SQR_PRTHS COMMA query = relevanceQuery (COMMA relevanceArg)* RR_BRACKET + | multiFieldRelevanceFunctionName LR_BRACKET alternateMultiMatchQuery COMMA alternateMultiMatchField (COMMA relevanceArg)* RR_BRACKET + ; + +altSingleFieldRelevanceFunction + : field = relevanceField EQUAL_SYMBOL altSyntaxFunctionName = altSingleFieldRelevanceFunctionName LR_BRACKET query = relevanceQuery (COMMA relevanceArg)* RR_BRACKET + ; + +altMultiFieldRelevanceFunction + : field = relevanceField EQUAL_SYMBOL altSyntaxFunctionName = altMultiFieldRelevanceFunctionName LR_BRACKET query = relevanceQuery (COMMA relevanceArg)* RR_BRACKET + ; + +convertedDataType + : typeName = DATE + | typeName = TIME + | typeName = TIMESTAMP + | typeName = INT + | typeName = INTEGER + | typeName = DOUBLE + | typeName = LONG + | typeName = FLOAT + | typeName = STRING + | typeName = BOOLEAN + ; + +caseFuncAlternative + : WHEN condition = functionArg THEN consequent = functionArg + ; + +aggregateFunction + : functionName = aggregationFunctionName LR_BRACKET functionArg RR_BRACKET # regularAggregateFunctionCall + | COUNT LR_BRACKET STAR RR_BRACKET # countStarFunctionCall + | COUNT LR_BRACKET DISTINCT functionArg RR_BRACKET # distinctCountFunctionCall + | percentileApproxFunction # percentileApproxFunctionCall + ; + +percentileApproxFunction + : (PERCENTILE | PERCENTILE_APPROX) LR_BRACKET aggField = functionArg + COMMA percent = numericLiteral (COMMA compression = numericLiteral)? RR_BRACKET + ; + +filterClause + : FILTER LR_BRACKET WHERE expression RR_BRACKET + ; + +aggregationFunctionName + : AVG + | COUNT + | SUM + | MIN + | MAX + | VAR_POP + | VAR_SAMP + | VARIANCE + | STD + | STDDEV + | STDDEV_POP + | STDDEV_SAMP + ; + +mathematicalFunctionName + : ABS + | CBRT + | CEIL + | CEILING + | CONV + | CRC32 + | E + | EXP + | EXPM1 + | FLOOR + | LN + | LOG + | LOG10 + | LOG2 + | MOD + | PI + | POW + | POWER + | RAND + | RINT + | ROUND + | SIGN + | SIGNUM + | SQRT + | TRUNCATE + | trigonometricFunctionName + | arithmeticFunctionName + ; + +trigonometricFunctionName + : ACOS + | ASIN + | ATAN + | ATAN2 + | COS + | COSH + | COT + | DEGREES + | RADIANS + | SIN + | SINH + | TAN + ; + +arithmeticFunctionName + : ADD + | SUBTRACT + | MULTIPLY + | DIVIDE + | MOD + | MODULUS + ; + +dateTimeFunctionName + : datetimeConstantLiteral + | ADDDATE + | ADDTIME + | CONVERT_TZ + | CURDATE + | CURTIME + | DATE + | DATE_ADD + | DATE_FORMAT + | DATE_SUB + | DATEDIFF + | DATETIME + | DAY + | DAYNAME + | DAYOFMONTH + | DAY_OF_MONTH + | DAYOFWEEK + | DAYOFYEAR + | DAY_OF_YEAR + | DAY_OF_WEEK + | FROM_DAYS + | FROM_UNIXTIME + | HOUR + | HOUR_OF_DAY + | LAST_DAY + | MAKEDATE + | MAKETIME + | MICROSECOND + | MINUTE + | MINUTE_OF_DAY + | MINUTE_OF_HOUR + | MONTH + | MONTHNAME + | MONTH_OF_YEAR + | NOW + | PERIOD_ADD + | PERIOD_DIFF + | QUARTER + | SEC_TO_TIME + | SECOND + | SECOND_OF_MINUTE + | SUBDATE + | SUBTIME + | SYSDATE + | STR_TO_DATE + | TIME + | TIME_FORMAT + | TIME_TO_SEC + | TIMEDIFF + | TIMESTAMP + | TO_DAYS + | TO_SECONDS + | UNIX_TIMESTAMP + | WEEK + | WEEKDAY + | WEEK_OF_YEAR + | WEEKOFYEAR + | YEAR + | YEARWEEK + ; + +textFunctionName + : SUBSTR + | SUBSTRING + | TRIM + | LTRIM + | RTRIM + | LOWER + | UPPER + | CONCAT + | CONCAT_WS + | SUBSTR + | LENGTH + | STRCMP + | RIGHT + | LEFT + | ASCII + | LOCATE + | REPLACE + | REVERSE + ; + +flowControlFunctionName + : IF + | IFNULL + | NULLIF + | ISNULL + ; + +noFieldRelevanceFunctionName + : QUERY + ; + +systemFunctionName + : TYPEOF + ; + +nestedFunctionName + : NESTED + ; + +scoreRelevanceFunctionName + : SCORE + | SCOREQUERY + | SCORE_QUERY + ; + +singleFieldRelevanceFunctionName + : MATCH + | MATCHQUERY + | MATCH_QUERY + | MATCH_PHRASE + | MATCHPHRASE + | MATCHPHRASEQUERY + | MATCH_BOOL_PREFIX + | MATCH_PHRASE_PREFIX + | WILDCARD_QUERY + | WILDCARDQUERY + ; + +multiFieldRelevanceFunctionName + : MULTI_MATCH + | MULTIMATCH + | MULTIMATCHQUERY + | SIMPLE_QUERY_STRING + | QUERY_STRING + ; + +altSingleFieldRelevanceFunctionName + : MATCH_QUERY + | MATCHQUERY + | MATCH_PHRASE + | MATCHPHRASE + ; + +altMultiFieldRelevanceFunctionName + : MULTI_MATCH + | MULTIMATCH + ; + +functionArgs + : (functionArg (COMMA functionArg)*)? + ; + +functionArg + : expression + ; + +relevanceArg + : relevanceArgName EQUAL_SYMBOL relevanceArgValue + | argName = stringLiteral EQUAL_SYMBOL argVal = relevanceArgValue + ; + +highlightArg + : highlightArgName EQUAL_SYMBOL highlightArgValue + ; + +relevanceArgName + : ALLOW_LEADING_WILDCARD + | ANALYZER + | ANALYZE_WILDCARD + | AUTO_GENERATE_SYNONYMS_PHRASE_QUERY + | BOOST + | CASE_INSENSITIVE + | CUTOFF_FREQUENCY + | DEFAULT_FIELD + | DEFAULT_OPERATOR + | ENABLE_POSITION_INCREMENTS + | ESCAPE + | FIELDS + | FLAGS + | FUZZINESS + | FUZZY_MAX_EXPANSIONS + | FUZZY_PREFIX_LENGTH + | FUZZY_REWRITE + | FUZZY_TRANSPOSITIONS + | LENIENT + | LOW_FREQ_OPERATOR + | MAX_DETERMINIZED_STATES + | MAX_EXPANSIONS + | MINIMUM_SHOULD_MATCH + | OPERATOR + | PHRASE_SLOP + | PREFIX_LENGTH + | QUOTE_ANALYZER + | QUOTE_FIELD_SUFFIX + | REWRITE + | SLOP + | TIE_BREAKER + | TIME_ZONE + | TYPE + | ZERO_TERMS_QUERY + ; + +highlightArgName + : HIGHLIGHT_POST_TAGS + | HIGHLIGHT_PRE_TAGS + ; + +relevanceFieldAndWeight + : field = relevanceField + | field = relevanceField weight = relevanceFieldWeight + | field = relevanceField BIT_XOR_OP weight = relevanceFieldWeight + ; + +relevanceFieldWeight + : numericLiteral + ; + +relevanceField + : qualifiedName + | stringLiteral + ; + +relevanceQuery + : relevanceArgValue + ; + +relevanceArgValue + : qualifiedName + | constant + ; + +highlightArgValue + : stringLiteral + ; + +alternateMultiMatchArgName + : FIELDS + | QUERY + | stringLiteral + ; + +alternateMultiMatchQuery + : argName = alternateMultiMatchArgName EQUAL_SYMBOL argVal = relevanceArgValue + ; + +alternateMultiMatchField + : argName = alternateMultiMatchArgName EQUAL_SYMBOL argVal = relevanceArgValue + | argName = alternateMultiMatchArgName EQUAL_SYMBOL LT_SQR_PRTHS argVal = relevanceArgValue RT_SQR_PRTHS + ; + +// Identifiers +tableName + : qualifiedName + ; + +columnName + : qualifiedName + ; + +allTupleFields + : path = qualifiedName DOT STAR + ; + +alias + : ident + ; + +qualifiedName + : ident (DOT ident)* + ; + +ident + : DOT? ID + | BACKTICK_QUOTE_ID + | keywordsCanBeId + | scalarFunctionName + ; + +keywordsCanBeId + : FULL + | FIELD + | D + | T + | TS // OD SQL and ODBC special + | COUNT + | SUM + | AVG + | MAX + | MIN + | FIRST + | LAST + | TYPE // TODO: Type is keyword required by relevancy function. Remove this when relevancy functions moved out + ; \ No newline at end of file diff --git a/src/plugins/data/public/antlr/opensearch_sql/opensearch_sql_autocomplete.ts b/src/plugins/data/public/antlr/opensearch_sql/opensearch_sql_autocomplete.ts new file mode 100644 index 00000000000..153ab584464 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/opensearch_sql_autocomplete.ts @@ -0,0 +1,272 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ParseTree, TokenStream } from 'antlr4ng'; +import * as c3 from 'antlr4-c3'; +import { ColumnAliasSymbol, TableSymbol } from './symbol_table'; +import { + AutocompleteData, + AutocompleteResultBase, + CursorPosition, + ISymbolTableVisitor, + ProcessVisitedRulesResult, + TableOrViewSuggestion, + OpenSearchSqlAutocompleteResult, +} from '../shared/types'; +import { OpenSearchSQLLexer } from './.generated/OpenSearchSQLLexer'; +import { + OpenSearchSQLParser, + SelectElementsContext, + TableNameContext, +} from './.generated/OpenSearchSQLParser'; +import { OpenSearchSQLParserVisitor } from './.generated/OpenSearchSQLParserVisitor'; +import { + TableQueryPosition, + TokenDictionary, + getContextSuggestions, + getPreviousToken, +} from './table'; +import { shouldSuggestTemplates } from './parse'; + +const tokenDictionary: TokenDictionary = { + SPACE: OpenSearchSQLParser.SPACE, + FROM: OpenSearchSQLParser.FROM, + OPENING_BRACKET: OpenSearchSQLParser.LR_BRACKET, + CLOSING_BRACKET: OpenSearchSQLParser.RR_BRACKET, + JOIN: OpenSearchSQLParser.JOIN, + SEMICOLON: OpenSearchSQLParser.SEMI, + SELECT: OpenSearchSQLParser.SELECT, +}; + +// These are keywords that we do not want to show in autocomplete +function getIgnoredTokens(): number[] { + const tokens = []; + + const firstOperatorIndex = OpenSearchSQLParser.SLASH; + const lastOperatorIndex = OpenSearchSQLParser.ERROR_RECOGNITION; + for (let i = firstOperatorIndex; i <= lastOperatorIndex; i++) { + // We actually want Star to appear in autocomplete + tokens.push(i); + } + + // Ignoring functions for now, need custom logic for them later + const firstFunctionIndex = OpenSearchSQLParser.AVG; + const lastFunctionIndex = OpenSearchSQLParser.TRIM; + for (let i = firstFunctionIndex; i <= lastFunctionIndex; i++) { + tokens.push(i); + } + + const firstCommonFunctionIndex = OpenSearchSQLParser.ABS; + const lastCommonFunctionIndex = OpenSearchSQLParser.MATCH_BOOL_PREFIX; + for (let i = firstCommonFunctionIndex; i <= lastCommonFunctionIndex; i++) { + tokens.push(i); + } + + tokens.push(OpenSearchSQLParser.EOF); + + return tokens; +} + +const ignoredTokens = new Set(getIgnoredTokens()); + +const rulesToVisit = new Set([ + OpenSearchSQLParser.RULE_constant, + OpenSearchSQLParser.RULE_columnName, + OpenSearchSQLParser.RULE_tableName, + OpenSearchSQLParser.RULE_aggregateFunction, + OpenSearchSQLParser.RULE_scalarFunctionName, + OpenSearchSQLParser.RULE_specificFunction, + OpenSearchSQLParser.RULE_windowFunctionClause, + OpenSearchSQLParser.RULE_comparisonOperator, +]); + +class OpenSearchSqlSymbolTableVisitor + extends OpenSearchSQLParserVisitor<{}> + implements ISymbolTableVisitor { + symbolTable: c3.SymbolTable; + scope: c3.ScopedSymbol; + + constructor() { + super(); + this.symbolTable = new c3.SymbolTable('', { allowDuplicateSymbols: true }); + this.scope = this.symbolTable.addNewSymbolOfType(c3.ScopedSymbol, undefined); + } + + visitTableName = (context: TableNameContext): {} => { + try { + this.symbolTable.addNewSymbolOfType(TableSymbol, this.scope, context.getText()); + } catch (error) { + if (!(error instanceof c3.DuplicateSymbolError)) { + throw error; + } + } + + return this.visitChildren(context) as {}; + }; + + visitSelectElementAlias = (context: SelectElementsContext): {} => { + try { + this.symbolTable.addNewSymbolOfType(ColumnAliasSymbol, this.scope, context.uid().getText()); + } catch (error) { + if (!(error instanceof c3.DuplicateSymbolError)) { + throw error; + } + } + + return this.visitChildren(context) as {}; + }; +} + +function processVisitedRules( + rules: c3.CandidatesCollection['rules'], + cursorTokenIndex: number, + tokenStream: TokenStream +): ProcessVisitedRulesResult { + let suggestViewsOrTables: OpenSearchSqlAutocompleteResult['suggestViewsOrTables']; + let suggestAggregateFunctions = false; + let suggestScalarFunctions = false; + let shouldSuggestColumns = false; + let shouldSuggestColumnAliases = false; + let suggestValuesForColumn: string | undefined; + + for (const [ruleId, rule] of rules) { + switch (ruleId) { + case OpenSearchSQLParser.RULE_tableName: { + if ( + getPreviousToken( + tokenStream, + tokenDictionary, + cursorTokenIndex, + OpenSearchSQLParser.TABLES + ) + ) { + suggestViewsOrTables = TableOrViewSuggestion.TABLES; + } else { + suggestViewsOrTables = TableOrViewSuggestion.ALL; + } + break; + } + case OpenSearchSQLParser.RULE_aggregateFunction: { + suggestAggregateFunctions = true; + shouldSuggestColumns = true; + break; + } + case OpenSearchSQLParser.RULE_scalarFunctionName: { + suggestScalarFunctions = true; + break; + } + case OpenSearchSQLParser.RULE_columnName: { + shouldSuggestColumns = true; + if ( + rule.ruleList.includes(OpenSearchSQLParser.RULE_groupByElements) || + rule.ruleList.includes(OpenSearchSQLParser.RULE_orderByElement) + ) { + shouldSuggestColumnAliases = true; + } + break; + } + case OpenSearchSQLParser.RULE_constant: { + const previousToken = getPreviousToken( + tokenStream, + tokenDictionary, + cursorTokenIndex, + OpenSearchSQLLexer.ID + ); + if (previousToken) { + suggestValuesForColumn = previousToken.text; + } + break; + } + } + } + + return { + suggestViewsOrTables, + suggestAggregateFunctions, + suggestScalarFunctions, + shouldSuggestColumns, + shouldSuggestColumnAliases, + suggestValuesForColumn, + }; +} + +function getParseTree( + parser: OpenSearchSQLParser, + type?: TableQueryPosition['type'] | 'select' +): ParseTree { + if (!type) { + return parser.root(); + } + + switch (type) { + case 'from': + return parser.fromClause(); + case 'select': + return parser.selectStatement(); + default: + return parser.root(); + } +} + +function enrichAutocompleteResult( + baseResult: AutocompleteResultBase, + rules: c3.CandidatesCollection['rules'], + tokenStream: TokenStream, + cursorTokenIndex: number, + cursor: CursorPosition, + query: string +): OpenSearchSqlAutocompleteResult { + const { + shouldSuggestColumns, + shouldSuggestColumnAliases, + shouldSuggestConstraints, + ...suggestionsFromRules + } = processVisitedRules(rules, cursorTokenIndex, tokenStream); + const suggestTemplates = shouldSuggestTemplates(query, cursor); + const result: OpenSearchSqlAutocompleteResult = { + ...baseResult, + ...suggestionsFromRules, + suggestTemplates, + }; + const contextSuggestionsNeeded = + shouldSuggestColumns || shouldSuggestConstraints || shouldSuggestColumnAliases; + if (contextSuggestionsNeeded) { + const visitor = new OpenSearchSqlSymbolTableVisitor(); + const { tableContextSuggestion, suggestColumnAliases } = getContextSuggestions( + OpenSearchSQLLexer, + OpenSearchSQLParser, + visitor, + tokenDictionary, + getParseTree, + tokenStream, + cursor, + query + ); + + if (shouldSuggestColumns && tableContextSuggestion) { + result.suggestColumns = tableContextSuggestion; + } + + if (shouldSuggestColumnAliases && suggestColumnAliases) { + result.suggestColumnAliases = suggestColumnAliases; + } + } + + return result; +} + +export const openSearchSqlAutocompleteData: AutocompleteData< + OpenSearchSqlAutocompleteResult, + OpenSearchSQLLexer, + OpenSearchSQLParser +> = { + Lexer: OpenSearchSQLLexer, + Parser: OpenSearchSQLParser, + tokenDictionary, + ignoredTokens, + rulesToVisit, + getParseTree, + enrichAutocompleteResult, +}; diff --git a/src/plugins/data/public/antlr/opensearch_sql/parse.test.ts b/src/plugins/data/public/antlr/opensearch_sql/parse.test.ts new file mode 100644 index 00000000000..03e6bd38cf8 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/parse.test.ts @@ -0,0 +1,84 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { CharStream, CommonTokenStream, Lexer as LexerType, Parser as ParserType } from 'antlr4ng'; +import { getCurrentStatement, shouldSuggestTemplates, createParser } from './parse'; // Update the path +import { CursorPosition, LexerConstructor, ParserConstructor } from '../shared/types'; +import { getCursorIndex } from '../shared/cursor'; + +jest.mock('../shared/cursor', () => ({ + getCursorIndex: jest.fn(), +})); + +jest.mock('antlr4ng', () => { + const actual = jest.requireActual('antlr4ng'); + return { + ...actual, + CharStream: { + fromString: jest.fn((input) => ({ input })), + }, + CommonTokenStream: jest.fn().mockImplementation((lexer) => ({ + lexer, + fill: jest.fn(), + })), + }; +}); + +describe('getCurrentStatement', () => { + it('should return the current statement and cursor index when there are no semicolons', () => { + const query = 'SELECT * FROM table'; + const cursorIndex = 10; + const result = getCurrentStatement(query, cursorIndex); + expect(result).toEqual({ statement: 'SELECT * FROM table', cursorIndex: 10 }); + }); + + it('should return the current statement and cursor index when there are semicolons', () => { + const query = 'SELECT * FROM table1; SELECT * FROM table2;'; + const cursorIndex = 25; + const result = getCurrentStatement(query, cursorIndex); + expect(result).toEqual({ statement: ' SELECT * FROM table2', cursorIndex: 4 }); + }); + + it('should handle the cursor at the start of the statement', () => { + const query = 'SELECT * FROM table1; SELECT * FROM table2;'; + const cursorIndex = 22; + const result = getCurrentStatement(query, cursorIndex); + expect(result).toEqual({ statement: ' SELECT * FROM table2', cursorIndex: 1 }); + }); +}); + +describe('shouldSuggestTemplates', () => { + it('should return true if the cursor is at the start of the query', () => { + const query = 'SELECT * FROM table'; + const cursor: CursorPosition = { line: 1, column: 0 }; + (getCursorIndex as jest.Mock).mockReturnValue(0); + const result = shouldSuggestTemplates(query, cursor); + expect(result).toBe(true); + }); + + it('should return true if the cursor is before the first keyword in the statement', () => { + const query = 'SELECT * FROM table'; + const cursor: CursorPosition = { line: 1, column: 1 }; + (getCursorIndex as jest.Mock).mockReturnValue(1); + const result = shouldSuggestTemplates(query, cursor); + expect(result).toBe(true); + }); + + it('should return true if the current statement is an explain statement', () => { + const query = 'EXPLAIN SELECT * FROM table'; + const cursor: CursorPosition = { line: 1, column: 8 }; + (getCursorIndex as jest.Mock).mockReturnValue(8); + const result = shouldSuggestTemplates(query, cursor); + expect(result).toBe(true); + }); + + it('should return false if the cursor is after the first keyword in the statement', () => { + const query = 'SELECT * FROM table'; + const cursor: CursorPosition = { line: 1, column: 10 }; + (getCursorIndex as jest.Mock).mockReturnValue(10); + const result = shouldSuggestTemplates(query, cursor); + expect(result).toBe(false); + }); +}); diff --git a/src/plugins/data/public/antlr/opensearch_sql/parse.ts b/src/plugins/data/public/antlr/opensearch_sql/parse.ts new file mode 100644 index 00000000000..5b639432e93 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/parse.ts @@ -0,0 +1,55 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { CharStream, CommonTokenStream, Lexer as LexerType, Parser as ParserType } from 'antlr4ng'; +import { CursorPosition, LexerConstructor, ParserConstructor } from '../shared/types'; +import { getCursorIndex } from '../shared/cursor'; +const spaceSymbols = '(\\s|\r\n|\n|\r)+'; +const explainRegex = new RegExp(`^(${spaceSymbols})?explain${spaceSymbols}$`); +const multipleKeywordsRegex = new RegExp(`^(${spaceSymbols})?\\S+${spaceSymbols}`); + +export function getCurrentStatement( + query: string, + cursorIndex: number +): { statement: string; cursorIndex: number } { + const textBeforeCursor = query.slice(0, cursorIndex); + const textAfterCursor = query.slice(cursorIndex); + const semiColonBeforeIndex = textBeforeCursor.lastIndexOf(';'); + const semiColonAfterIndex = textAfterCursor.indexOf(';'); + const statementStartIndex = semiColonBeforeIndex > -1 ? semiColonBeforeIndex + 1 : 0; + const statementEndIndex = + semiColonAfterIndex > -1 ? semiColonAfterIndex + cursorIndex : query.length; + const statement = query.slice(statementStartIndex, statementEndIndex); + const newCursorIndex = cursorIndex - statementStartIndex; + + return { statement, cursorIndex: newCursorIndex }; +} + +// TODO Find a better way to suggestTemplates +export function shouldSuggestTemplates(query: string, cursor: CursorPosition): boolean { + const cursorIndex = getCursorIndex(query, cursor); + const currentStatement = getCurrentStatement(query, cursorIndex); + const currentStatementBeforeCursor = currentStatement.statement + .slice(0, currentStatement.cursorIndex) + .toLowerCase(); + + return Boolean( + cursorIndex === 0 || + // First keyword in statement + !currentStatementBeforeCursor.match(multipleKeywordsRegex) || + // Explain statement + currentStatementBeforeCursor.match(explainRegex) + ); +} + +export function createParser( + Lexer: LexerConstructor, + Parser: ParserConstructor

, + query: string +): P { + const parser = new Parser(new CommonTokenStream(new Lexer(CharStream.fromString(query)))); + parser.removeErrorListeners(); + return parser; +} diff --git a/src/plugins/data/public/antlr/opensearch_sql/sql_error_listener.test.ts b/src/plugins/data/public/antlr/opensearch_sql/sql_error_listener.test.ts new file mode 100644 index 00000000000..7b8ffb8c576 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/sql_error_listener.test.ts @@ -0,0 +1,71 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ATNSimulator, Recognizer, Token } from 'antlr4ng'; +import { SqlErrorListener } from './sql_error_listerner'; // Update the path +import { getTokenPosition, TokenPosition } from '../shared/cursor'; + +jest.mock('../shared/cursor', () => ({ + getTokenPosition: jest.fn(), +})); + +describe('SqlErrorListener', () => { + let errorListener: SqlErrorListener; + const mockWhitespaceToken = 1; + + beforeEach(() => { + errorListener = new SqlErrorListener(mockWhitespaceToken); + }); + + it('should initialize with an empty errors array', () => { + expect(errorListener.errors).toEqual([]); + }); + + it('should add an error with token position when a token is provided', () => { + const mockToken = { line: 1, column: 1 } as Token; + const mockTokenPosition: TokenPosition = { + startLine: 1, + startColumn: 1, + endLine: 1, + endColumn: 5, + }; + (getTokenPosition as jest.Mock).mockReturnValue(mockTokenPosition); + + const mockRecognizer = {} as Recognizer; + + errorListener.syntaxError(mockRecognizer, mockToken, 1, 1, 'Syntax error'); + + expect(getTokenPosition).toHaveBeenCalledWith(mockToken, mockWhitespaceToken); + expect(errorListener.errors).toEqual([{ message: 'Syntax error', ...mockTokenPosition }]); + }); + + it('should add an error with start and end positions when no token is provided', () => { + const mockRecognizer = {} as Recognizer; + + errorListener.syntaxError(mockRecognizer, null, 1, 1, 'Syntax error'); + + expect(errorListener.errors).toEqual([ + { + message: 'Syntax error', + startLine: 1, + startColumn: 1, + endLine: 1, + endColumn: 1, + }, + ]); + }); + + it('should handle reportAmbiguity without errors', () => { + expect(() => errorListener.reportAmbiguity()).not.toThrow(); + }); + + it('should handle reportAttemptingFullContext without errors', () => { + expect(() => errorListener.reportAttemptingFullContext()).not.toThrow(); + }); + + it('should handle reportContextSensitivity without errors', () => { + expect(() => errorListener.reportContextSensitivity()).not.toThrow(); + }); +}); diff --git a/src/plugins/data/public/antlr/opensearch_sql/sql_error_listerner.ts b/src/plugins/data/public/antlr/opensearch_sql/sql_error_listerner.ts new file mode 100644 index 00000000000..6271eeb375e --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/sql_error_listerner.ts @@ -0,0 +1,47 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ANTLRErrorListener, ATNSimulator, Recognizer, Token } from 'antlr4ng'; + +import { TokenPosition, getTokenPosition } from '../shared/cursor'; + +interface ParserSyntaxError extends TokenPosition { + message: string; +} + +export class SqlErrorListener implements ANTLRErrorListener { + errors: ParserSyntaxError[]; + whitespaceToken: number; + + constructor(whitespaceToken: number) { + this.errors = []; + this.whitespaceToken = whitespaceToken; + } + + syntaxError( + _recognizer: Recognizer, + token: S | null, + startLine: number, + startColumn: number, + message: string + ): void { + if (token) { + const tokenPosition = getTokenPosition(token, this.whitespaceToken); + this.errors.push({ message, ...tokenPosition }); + } else { + this.errors.push({ + message, + startLine, + startColumn, + endLine: startLine, + endColumn: startColumn, + }); + } + } + + reportAmbiguity(): void {} + reportAttemptingFullContext(): void {} + reportContextSensitivity(): void {} +} diff --git a/src/plugins/data/public/antlr/opensearch_sql/symbol_table.test.ts b/src/plugins/data/public/antlr/opensearch_sql/symbol_table.test.ts new file mode 100644 index 00000000000..df07637f910 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/symbol_table.test.ts @@ -0,0 +1,95 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + TableSymbol, + getTablesFromSymbolTable, + getUniqueTableSuggestions, + ColumnAliasSymbol, + getColumnAliasesFromSymbolTable, +} from './symbol_table'; // Update the path +import { SymbolTableVisitor } from '../shared/types'; + +describe('TableSymbol', () => { + it('should create a TableSymbol instance', () => { + const symbol = new TableSymbol('tableName', 'aliasName', undefined); + expect(symbol.name).toBe('tableName'); + expect(symbol.alias).toBe('aliasName'); + expect(symbol.type).toBeUndefined(); + }); + + it('should create a TableSymbol instance without alias', () => { + const symbol = new TableSymbol('tableName', undefined, undefined); + expect(symbol.name).toBe('tableName'); + expect(symbol.alias).toBeUndefined(); + expect(symbol.type).toBeUndefined(); + }); +}); + +describe('getUniqueTableSuggestions', () => { + it('should return unique table suggestions with aliases', () => { + const symbols = [ + new TableSymbol('table1', 'alias1'), + new TableSymbol('table1', 'alias2'), + new TableSymbol('table2'), + ]; + + const suggestions = getUniqueTableSuggestions(symbols); + expect(suggestions).toEqual([ + { name: 'table1', alias: 'alias1' }, + { name: 'table1', alias: 'alias2' }, + { name: 'table2' }, + ]); + }); + + it('should return unique table suggestions without aliases', () => { + const symbols = [new TableSymbol('table1'), new TableSymbol('table2')]; + + const suggestions = getUniqueTableSuggestions(symbols); + expect(suggestions).toEqual([{ name: 'table1' }, { name: 'table2' }]); + }); +}); + +describe('getTablesFromSymbolTable', () => { + it('should return table suggestions from the symbol table', () => { + const mockVisitor = ({ + symbolTable: { + getNestedSymbolsOfTypeSync: jest + .fn() + .mockReturnValue([new TableSymbol('table1', 'alias1'), new TableSymbol('table2')]), + }, + } as unknown) as SymbolTableVisitor; + + const tables = getTablesFromSymbolTable(mockVisitor); + expect(tables).toEqual([{ name: 'table1', alias: 'alias1' }, { name: 'table2' }]); + expect(mockVisitor.symbolTable.getNestedSymbolsOfTypeSync).toHaveBeenCalledWith(TableSymbol); + }); +}); + +describe('ColumnAliasSymbol', () => { + it('should create a ColumnAliasSymbol instance', () => { + const symbol = new ColumnAliasSymbol('columnName', undefined); + expect(symbol.name).toBe('columnName'); + expect(symbol.type).toBeUndefined(); + }); +}); + +describe('getColumnAliasesFromSymbolTable', () => { + it('should return column alias suggestions from the symbol table', () => { + const mockVisitor = ({ + symbolTable: { + getNestedSymbolsOfTypeSync: jest + .fn() + .mockReturnValue([new ColumnAliasSymbol('alias1'), new ColumnAliasSymbol('alias2')]), + }, + } as unknown) as SymbolTableVisitor; + + const aliases = getColumnAliasesFromSymbolTable(mockVisitor); + expect(aliases).toEqual([{ name: 'alias1' }, { name: 'alias2' }]); + expect(mockVisitor.symbolTable.getNestedSymbolsOfTypeSync).toHaveBeenCalledWith( + ColumnAliasSymbol + ); + }); +}); diff --git a/src/plugins/data/public/antlr/opensearch_sql/symbol_table.ts b/src/plugins/data/public/antlr/opensearch_sql/symbol_table.ts new file mode 100644 index 00000000000..460b51d8c5f --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/symbol_table.ts @@ -0,0 +1,68 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable max-classes-per-file */ + +import * as c3 from 'antlr4-c3'; +import { ColumnAliasSuggestion, SymbolTableVisitor, Table } from '../shared/types'; + +export class TableSymbol extends c3.TypedSymbol { + name: string; + alias: string | undefined; + + constructor(name: string, alias?: string, type?: c3.IType) { + super(name, type); + + this.name = name; + this.alias = alias; + } +} + +export function getUniqueTableSuggestions(symbols: TableSymbol[] = []): Table[] { + const suggestionsMap = symbols.reduce((acc, table) => { + const aliases = acc[table.name] ?? new Set(); + if (table.alias) { + aliases.add(table.alias); + } + + acc[table.name] = aliases; + return acc; + }, {} as Record>); + return Object.keys(suggestionsMap).reduce((acc, tableName) => { + const aliases = suggestionsMap[tableName] as Set; + if (aliases.size > 0) { + aliases?.forEach((alias) => { + acc.push({ name: tableName, alias }); + }); + } else { + acc.push({ name: tableName }); + } + + return acc; + }, [] as Table[]); +} + +export function getTablesFromSymbolTable(visitor: SymbolTableVisitor): Table[] { + const suggestions = visitor.symbolTable.getNestedSymbolsOfTypeSync(TableSymbol); + return getUniqueTableSuggestions(suggestions); +} + +export class ColumnAliasSymbol extends c3.TypedSymbol { + name: string; + + constructor(name: string, type?: c3.IType) { + super(name, type); + + this.name = name; + } +} + +export function getColumnAliasesFromSymbolTable( + visitor: SymbolTableVisitor +): ColumnAliasSuggestion[] { + return visitor.symbolTable + .getNestedSymbolsOfTypeSync(ColumnAliasSymbol) + .map(({ name }) => ({ name })); +} diff --git a/src/plugins/data/public/antlr/opensearch_sql/table.test.ts b/src/plugins/data/public/antlr/opensearch_sql/table.test.ts new file mode 100644 index 00000000000..566d4e20872 --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/table.test.ts @@ -0,0 +1,120 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { TokenStream, Token } from 'antlr4ng'; +import { + getClosingBracketIndex, + getTableQueryPosition, + getJoinIndex, + getPreviousToken, + TokenDictionary, +} from './table'; + +const mockTokenStream = (tokens: Array>): TokenStream => { + return { + size: tokens.length, + get: (index: number) => tokens[index] as Token, + } as TokenStream; +}; + +const tokenDictionary: TokenDictionary = { + SPACE: 1, + FROM: 2, + OPENING_BRACKET: 3, + CLOSING_BRACKET: 4, + JOIN: 5, + SEMICOLON: 6, + SELECT: 7, +}; + +describe('Autocomplete Utils', () => { + describe('getClosingBracketIndex', () => { + it('should return undefined if no closing bracket is found', () => { + const tokens = [ + { type: tokenDictionary.OPENING_BRACKET, start: 0 }, + { type: tokenDictionary.FROM, start: 1 }, + { type: tokenDictionary.SPACE, start: 2 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect(getClosingBracketIndex(tokenStream, 0, tokenDictionary)).toBeUndefined(); + }); + }); + + describe('getTableQueryPosition', () => { + it('should return the table query position', () => { + const tokens = [ + { type: tokenDictionary.SPACE, start: 0 }, + { type: tokenDictionary.FROM, start: 1 }, + { type: tokenDictionary.SPACE, start: 2 }, + { type: tokenDictionary.CLOSING_BRACKET, start: 3 }, + { type: tokenDictionary.SEMICOLON, start: 4 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect(getTableQueryPosition(tokenStream, 1, tokenDictionary)).toEqual({ + start: 1, + end: 3, + type: 'from', + joinTableQueryPosition: undefined, + selectTableQueryPosition: undefined, + }); + }); + + it('should return undefined if no FROM keyword is found', () => { + const tokens = [ + { type: tokenDictionary.SPACE, start: 0 }, + { type: tokenDictionary.SPACE, start: 1 }, + { type: tokenDictionary.CLOSING_BRACKET, start: 2 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect(getTableQueryPosition(tokenStream, 1, tokenDictionary)).toBeUndefined(); + }); + }); + + describe('getJoinIndex', () => { + it('should return the index of the JOIN token', () => { + const tokens = [ + { type: tokenDictionary.SPACE, start: 0 }, + { type: tokenDictionary.JOIN, start: 1, stop: 1 }, + { type: tokenDictionary.SPACE, start: 2 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect(getJoinIndex(tokenStream, 0, 3, tokenDictionary)).toEqual(2); + }); + + it('should return undefined if no JOIN token is found', () => { + const tokens = [ + { type: tokenDictionary.SPACE, start: 0 }, + { type: tokenDictionary.SPACE, start: 1 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect(getJoinIndex(tokenStream, 0, 2, tokenDictionary)).toBeUndefined(); + }); + }); + + describe('getPreviousToken', () => { + it('should return the previous token of the specified type', () => { + const tokens = [ + { type: tokenDictionary.SPACE, start: 0 }, + { type: tokenDictionary.SELECT, start: 1 }, + { type: tokenDictionary.SPACE, start: 2 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect(getPreviousToken(tokenStream, tokenDictionary, 2, tokenDictionary.SELECT)).toEqual( + tokens[1] + ); + }); + + it('should return undefined if no previous token of the specified type is found', () => { + const tokens = [ + { type: tokenDictionary.SPACE, start: 0 }, + { type: tokenDictionary.SPACE, start: 1 }, + ]; + const tokenStream = mockTokenStream(tokens); + expect( + getPreviousToken(tokenStream, tokenDictionary, 1, tokenDictionary.SELECT) + ).toBeUndefined(); + }); + }); +}); diff --git a/src/plugins/data/public/antlr/opensearch_sql/table.ts b/src/plugins/data/public/antlr/opensearch_sql/table.ts new file mode 100644 index 00000000000..976400728aa --- /dev/null +++ b/src/plugins/data/public/antlr/opensearch_sql/table.ts @@ -0,0 +1,320 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { TokenStream, Lexer as LexerType, Parser as ParserType, Token } from 'antlr4ng'; +import { createParser } from './parse'; +import { getColumnAliasesFromSymbolTable, getTablesFromSymbolTable } from './symbol_table'; +import { + AutocompleteResultBase, + CursorPosition, + GetParseTree, + LexerConstructor, + ParserConstructor, + SymbolTableVisitor, + TableContextSuggestion, +} from '../shared/types'; +import { findCursorTokenIndex } from '../shared/cursor'; + +export interface TokenDictionary { + SPACE: number; + FROM: number; + OPENING_BRACKET: number; + CLOSING_BRACKET: number; + JOIN: number; + SEMICOLON: number; + SELECT: number; +} + +export interface TableQueryPosition extends TableQueryPositionBase { + type: 'from' | 'alter' | 'insert' | 'update'; + joinTableQueryPosition?: TableQueryPositionBase; + selectTableQueryPosition?: TableQueryPositionBase; +} + +export interface TableQueryPositionBase { + start: number; + end: number; +} + +export interface ContextSuggestions { + tableContextSuggestion?: TableContextSuggestion; + suggestColumnAliases?: AutocompleteResultBase['suggestColumnAliases']; +} + +/** + * Finds the index of the closing bracket or semicolon in the token stream starting from a given index. + * @param tokenStream - The token stream to search within. + * @param tokenIndex - The index to start searching from. + * @param dictionary - The token dictionary containing token types. + * @returns The index of the closing bracket or semicolon or undefined if not found. + */ +export function getClosingBracketIndex( + tokenStream: TokenStream, + tokenIndex: number, + dictionary: TokenDictionary +): { cursorIndex: number; tokenIndex: number } | undefined { + let currentIndex = tokenIndex; + + while (currentIndex < tokenStream.size) { + const token = tokenStream.get(currentIndex); + + if (token.type === dictionary.CLOSING_BRACKET || token.type === dictionary.SEMICOLON) { + return { cursorIndex: token.start, tokenIndex: currentIndex }; + } + + if (token.type === dictionary.OPENING_BRACKET) { + return undefined; + } + + currentIndex++; + } + + const lastIndex = tokenStream.size - 1; + return { cursorIndex: tokenStream.get(lastIndex).start, tokenIndex: lastIndex }; +} + +/** + * Determines the position of a table query within the token stream. + * @param tokenStream - The token stream to search within. + * @param tokenIndex - The index to start searching from. + * @param dictionary - The token dictionary containing token types. + * @returns The position of the table query or undefined if not found. + */ +export function getTableQueryPosition( + tokenStream: TokenStream, + tokenIndex: number, + dictionary: TokenDictionary +): TableQueryPosition | undefined { + let currentIndex = tokenIndex; + let isAscending = false; + + // Go backward at first + while (currentIndex >= 0 && currentIndex < tokenStream.size) { + const token = tokenStream.get(currentIndex); + + // We don't want to check nested statement + if ( + token.type === dictionary.OPENING_BRACKET || + token.type === dictionary.CLOSING_BRACKET || + token.type === dictionary.SEMICOLON + ) { + if (isAscending) { + break; + } else { + currentIndex = tokenIndex; + isAscending = true; + } + } + + if (token.type === dictionary.FROM) { + const closingBracketIndex = getClosingBracketIndex(tokenStream, tokenIndex, dictionary); + + if (!closingBracketIndex) { + break; + } + + const joinIndex = getJoinIndex( + tokenStream, + currentIndex, + closingBracketIndex.tokenIndex, + dictionary + ); + const joinTableQueryPosition = joinIndex + ? ({ + start: joinIndex, + end: closingBracketIndex.cursorIndex, + } as const) + : undefined; + + const selectToken = getPreviousToken( + tokenStream, + dictionary, + closingBracketIndex.tokenIndex, + dictionary.SELECT + ); + const selectTableQueryPosition = selectToken + ? ({ + start: selectToken.start, + end: closingBracketIndex.cursorIndex, + } as const) + : undefined; + + return { + start: token.start, + end: closingBracketIndex.cursorIndex, + type: 'from', + joinTableQueryPosition, + selectTableQueryPosition, + }; + } + + if (isAscending) { + currentIndex++; + } else { + currentIndex--; + } + + // Go forward if nothing is found + if (currentIndex === -1) { + currentIndex = tokenIndex; + isAscending = true; + } + } + + // Could not find FROM, so we look for other keywords + currentIndex = tokenIndex; + while (currentIndex >= 0) { + const token = tokenStream.get(currentIndex); + + if (token.type === dictionary.SEMICOLON) { + return undefined; + } + + currentIndex--; + } + + return undefined; +} + +export function getJoinIndex( + tokenStream: TokenStream, + startIndex: number, + endIndex: number, + dictionary: TokenDictionary +): number | undefined { + let currentIndex = startIndex; + + while (currentIndex < endIndex) { + const token = tokenStream.get(currentIndex); + + if (token.type === dictionary.JOIN) { + return token.stop + 1; + } + + currentIndex++; + } + + return undefined; +} + +/** + * Finds the previous token of a specified type in the token stream starting from a given index. + * @param tokenStream - The token stream to search within. + * @param dictionary - The token dictionary containing token types. + * @param tokenIndex - The index to start searching from. + * @param tokenType - The type of token to search for. + * @returns The previous token of the specified type or undefined if not found. + */ +export function getPreviousToken( + tokenStream: TokenStream, + dictionary: TokenDictionary, + tokenIndex: number, + tokenType: number +): Token | undefined { + let currentIndex = tokenIndex - 1; + + while (currentIndex > -1) { + const token = tokenStream.get(currentIndex); + // This is the end of previous statement, so we want to exit + if (token.type === dictionary.SEMICOLON) { + return undefined; + } + + if (token.type === tokenType) { + return token; + } + + currentIndex--; + } + + return undefined; +} + +/** + * Generates context suggestions for autocomplete based on the given query and cursor position. + * @param Lexer - The lexer constructor. + * @param Parser - The parser constructor. + * @param symbolTableVisitor - The symbol table visitor. + * @param tokenDictionary - The token dictionary containing token types. + * @param getParseTree - The function to get the parse tree. + * @param tokenStream - The token stream of the query. + * @param cursor - The cursor position in the query. + * @param query - The SQL query string. + * @param explicitlyParseJoin - Whether to explicitly parse JOIN statements. + * @returns The context suggestions for autocomplete. + */ +export function getContextSuggestions( + Lexer: LexerConstructor, + Parser: ParserConstructor

, + symbolTableVisitor: SymbolTableVisitor, + tokenDictionary: TokenDictionary, + getParseTree: GetParseTree

, + tokenStream: TokenStream, + cursor: CursorPosition, + query: string, + explicitlyParseJoin?: boolean +): ContextSuggestions { + // The actual token index, without special logic for spaces + const actualCursorTokenIndex = findCursorTokenIndex( + tokenStream, + cursor, + tokenDictionary.SPACE, + true + ); + if (!actualCursorTokenIndex) { + throw new Error( + `Could not find actualCursorTokenIndex at Ln ${cursor.line}, Col ${cursor.column}` + ); + } + + const contextSuggestions: ContextSuggestions = {}; + const tableQueryPosition = getTableQueryPosition( + tokenStream, + actualCursorTokenIndex, + tokenDictionary + ); + + if (tableQueryPosition) { + const tableQuery = query.slice(tableQueryPosition.start, tableQueryPosition.end); + const parser = createParser(Lexer, Parser, tableQuery); + const parseTree = getParseTree(parser, tableQueryPosition.type); + + symbolTableVisitor.visit(parseTree); + + if (explicitlyParseJoin && tableQueryPosition.joinTableQueryPosition) { + const joinTableQuery = query.slice( + tableQueryPosition.joinTableQueryPosition.start, + tableQueryPosition.joinTableQueryPosition.end + ); + const joinParser = createParser(Lexer, Parser, joinTableQuery); + const joinParseTree = getParseTree(joinParser, 'from'); + symbolTableVisitor.visit(joinParseTree); + } + + if (tableQueryPosition.selectTableQueryPosition) { + const selectTableQuery = query.slice( + tableQueryPosition.selectTableQueryPosition.start, + tableQueryPosition.selectTableQueryPosition.end + ); + const selectParser = createParser(Lexer, Parser, selectTableQuery); + const selectParseTree = getParseTree(selectParser, 'select'); + symbolTableVisitor.visit(selectParseTree); + } + + const tables = getTablesFromSymbolTable(symbolTableVisitor); + if (tables.length) { + contextSuggestions.tableContextSuggestion = { + tables, + }; + } + + const columnAliases = getColumnAliasesFromSymbolTable(symbolTableVisitor); + if (columnAliases.length) { + contextSuggestions.suggestColumnAliases = columnAliases.map(({ name }) => ({ name })); + } + } + + return contextSuggestions; +} diff --git a/src/plugins/data/public/antlr/shared/cursor.test.ts b/src/plugins/data/public/antlr/shared/cursor.test.ts new file mode 100644 index 00000000000..d2adac47ed3 --- /dev/null +++ b/src/plugins/data/public/antlr/shared/cursor.test.ts @@ -0,0 +1,65 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { CharStream, CommonTokenStream } from 'antlr4ng'; +import { findCursorTokenIndex } from './cursor'; +import { openSearchSqlAutocompleteData } from '../opensearch_sql/opensearch_sql_autocomplete'; +import { CursorPosition } from './types'; + +function getCursorIndex(query: string, cursor: CursorPosition): number | undefined { + const inputStream = CharStream.fromString(query); + const lexer = new openSearchSqlAutocompleteData.Lexer(inputStream); + const tokenStream = new CommonTokenStream(lexer); + const parser = new openSearchSqlAutocompleteData.Parser(tokenStream); + parser.removeErrorListeners(); + openSearchSqlAutocompleteData.getParseTree(parser); + + return findCursorTokenIndex( + tokenStream, + cursor, + openSearchSqlAutocompleteData.tokenDictionary.SPACE + ); +} + +describe('find correct cursor token index', () => { + test('returs correct cursorTokenIndex on empty query', () => { + const cursorTokenIndex = getCursorIndex('', { line: 1, column: 1 }); + + expect(cursorTokenIndex).toEqual(0); + }); + + test('returns correct cursorTokenIndex on start typing', () => { + const cursorTokenIndex = getCursorIndex('S', { line: 1, column: 2 }); + + expect(cursorTokenIndex).toEqual(0); + }); + + test('returs correct cursorTokenIndex on space', () => { + const cursorTokenIndex = getCursorIndex('SELECT ', { line: 1, column: 8 }); + + expect(cursorTokenIndex).toEqual(2); + }); + + test('returs correct cursorTokenIndex on word end', () => { + const cursorTokenIndex = getCursorIndex('SELECT', { line: 1, column: 7 }); + + expect(cursorTokenIndex).toEqual(0); + }); + + test('returs correct cursorTokenIndex on newline', () => { + const cursorTokenIndex = getCursorIndex('SELECT\n', { line: 2, column: 1 }); + + expect(cursorTokenIndex).toEqual(2); + }); + + test('returs correct cursorTokenIndex on big query', () => { + const cursorTokenIndex = getCursorIndex('SELECT * FROM test_table WHERE ', { + line: 1, + column: 32, + }); + + expect(cursorTokenIndex).toEqual(10); + }); +}); diff --git a/src/plugins/data/public/antlr/shared/cursor.ts b/src/plugins/data/public/antlr/shared/cursor.ts new file mode 100644 index 00000000000..032900a8bbd --- /dev/null +++ b/src/plugins/data/public/antlr/shared/cursor.ts @@ -0,0 +1,119 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Token, TokenStream } from 'antlr4ng'; +import { ICandidateRule } from 'antlr4-c3'; +import { CursorPosition } from '../shared/types'; + +export interface TokenPosition { + startLine: number; + startColumn: number; + endLine: number; + endColumn: number; +} + +const possibleIdentifierPrefixRegex = /[\w]$/; + +export const lineSeparatorRegex = /\r\n|\n|\r/g; + +export function getTokenPosition(token: Token, whitespaceToken: number): TokenPosition { + const startColumn = token.column; + const endColumn = token.column + (token.text?.length || 0); + const startLine = token.line; + const endLine = + token.type !== whitespaceToken || !token.text + ? startLine + : startLine + (token.text.match(lineSeparatorRegex)?.length || 0); + + return { startColumn, startLine, endColumn, endLine }; +} + +export function findCursorTokenIndex( + tokenStream: TokenStream, + cursor: CursorPosition, + whitespaceToken: number, + actualIndex?: boolean +): number | undefined { + // Cursor position is 1-based, while token's charPositionInLine is 0-based + const cursorCol = cursor.column - 1; + + for (let i = 0; i < tokenStream.size; i++) { + const token = tokenStream.get(i); + const { startColumn, startLine, endColumn, endLine } = getTokenPosition(token, whitespaceToken); + + // endColumn makes sense only if startLine === endLine + if (endLine > cursor.line || (startLine === cursor.line && endColumn > cursorCol)) { + if (actualIndex) { + return i; + } + + if ( + i > 0 && + startLine === cursor.line && + startColumn === cursorCol && + // If previous token is an identifier (i.e. word, not a symbol), + // then we want to return previous token index + possibleIdentifierPrefixRegex.test(tokenStream.get(i - 1).text || '') + ) { + return i - 1; + } else if (tokenStream.get(i).type === whitespaceToken) { + return i + 1; + } + return i; + } + } + + return undefined; +} + +export function getCursorIndex(query: string, cursor: CursorPosition): number { + const lines = query.split(lineSeparatorRegex); + const separatorMatch = query.match(lineSeparatorRegex); + let separator: string | undefined = ''; + + if (separatorMatch) { + separator = separatorMatch[0]; + } + + let cursorIndex = 0; + + lines.reduce((text, line, index) => { + if (cursor.line - 1 === index) { + if (!text.length) { + cursorIndex = cursor.column - 1; + } else { + cursorIndex = text.length + cursor.column; + } + } + + if (index === 0) { + return line; + } + + return text + separator + line; + }, ''); + + return cursorIndex; +} + +/* +Sometimes a preferredRule is triggered multiple times, and we haven't found a case where we'd want it. +We only want it to be triggered only once. + +E.g. + +root: 'DROP' 'INDEX' indexName; +indexName: identifier 'test'; + +case TestParser.RULE_indexName: { + suggestIndexes = true; +} + +If we'll write 'DROP INDEX index_name', 'test' token will fire the preferredRule event, and we'll try to suggest indexes. +In this case we need to check if our RULE_indexName is being triggered at the first 'identifier', and not 'test'. And this function was created for that. +*/ +export function isStartingToWriteRule(cursorTokenIndex: number, rule: ICandidateRule): boolean { + return cursorTokenIndex === rule.startTokenIndex; +} diff --git a/src/plugins/data/public/antlr/shared/types.ts b/src/plugins/data/public/antlr/shared/types.ts new file mode 100644 index 00000000000..299cb8a3c37 --- /dev/null +++ b/src/plugins/data/public/antlr/shared/types.ts @@ -0,0 +1,124 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as c3 from 'antlr4-c3'; +import { + AbstractParseTreeVisitor, + CharStream, + CommonTokenStream, + ParseTree, + ParserRuleContext, + TokenStream, + Lexer as LexerType, + Parser as ParserType, +} from 'antlr4ng'; +import { TableQueryPosition, TokenDictionary } from '../opensearch_sql/table'; + +export interface AutocompleteResultBase { + errors: ParserSyntaxError[]; + suggestKeywords?: KeywordSuggestion[]; + suggestTemplates?: boolean; + suggestAggregateFunctions?: boolean; + suggestScalarFunctions?: boolean; + suggestColumns?: ColumnSuggestion; + suggestColumnAliases?: ColumnAliasSuggestion[]; + suggestDatabases?: boolean; + suggestValuesForColumn?: string; +} + +export interface ParserSyntaxError extends TokenPosition { + message: string; +} + +export interface TokenPosition { + startLine: number; + startColumn: number; + endLine: number; + endColumn: number; +} + +export interface KeywordSuggestion { + value: string; +} + +export type ColumnSuggestion = TableContextSuggestion; + +export interface TableContextSuggestion { + tables?: Table[]; +} + +export interface Table { + name: string; + alias?: string; +} + +export interface ColumnAliasSuggestion { + name: string; +} + +export type LexerConstructor = new (input: CharStream) => T; + +export type ParserConstructor = new (input: CommonTokenStream) => T; + +export type SymbolTableVisitorConstructor = new () => T; + +export type GetParseTree

= ( + parser: P, + type?: TableQueryPosition['type'] | 'select' +) => ParseTree; + +export type EnrichAutocompleteResult = ( + result: AutocompleteResultBase, + rules: c3.CandidatesCollection['rules'], + tokenStream: TokenStream, + cursorTokenIndex: number, + cursor: CursorPosition, + query: string +) => A; + +export interface CursorPosition { + line: number; + column: number; +} + +export interface OpenSearchSqlAutocompleteResult extends AutocompleteResultBase { + suggestViewsOrTables?: TableOrViewSuggestion; +} + +export enum TableOrViewSuggestion { + ALL = 'ALL', + TABLES = 'TABLES', + VIEWS = 'VIEWS', +} + +export type ConstraintSuggestion = TableContextSuggestion; + +export interface ISymbolTableVisitor { + symbolTable: c3.SymbolTable; + scope: c3.ScopedSymbol; +} + +export type SymbolTableVisitor = ISymbolTableVisitor & AbstractParseTreeVisitor<{}>; + +export interface AutocompleteData< + A extends AutocompleteResultBase, + L extends LexerType, + P extends ParserType +> { + Lexer: LexerConstructor; + Parser: ParserConstructor

; + getParseTree: GetParseTree

; + tokenDictionary: TokenDictionary; + ignoredTokens: Set; + rulesToVisit: Set; + enrichAutocompleteResult: EnrichAutocompleteResult; + context?: ParserRuleContext; +} + +export type ProcessVisitedRulesResult = Partial & { + shouldSuggestColumns?: boolean; + shouldSuggestColumnAliases?: boolean; + shouldSuggestConstraints?: boolean; +}; diff --git a/src/plugins/data/public/antlr/shared/utils.test.ts b/src/plugins/data/public/antlr/shared/utils.test.ts new file mode 100644 index 00000000000..d72fa0ab87a --- /dev/null +++ b/src/plugins/data/public/antlr/shared/utils.test.ts @@ -0,0 +1,159 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { of } from 'rxjs'; +import { getRawSuggestionData$, fetchData, fetchTableSchemas, fetchColumnValues } from './utils'; + +describe('getRawSuggestionData$', () => { + it('should return default request handler data when connection is undefined', (done) => { + const mockConnectionsService = { + getSelectedConnection$: jest.fn().mockReturnValue(of(undefined)), + }; + const mockDefaultRequestHandler = jest.fn().mockResolvedValue('defaultData'); + const mockDataSourceRequestHandler = jest.fn(); + + getRawSuggestionData$( + mockConnectionsService, + mockDataSourceRequestHandler, + mockDefaultRequestHandler + ).subscribe((result) => { + expect(result).toBe('defaultData'); + expect(mockDefaultRequestHandler).toHaveBeenCalled(); + expect(mockDataSourceRequestHandler).not.toHaveBeenCalled(); + done(); + }); + }); + + it('should return data source request handler data when connection is defined', (done) => { + const mockConnectionsService = { + getSelectedConnection$: jest.fn().mockReturnValue( + of({ + id: 'testId', + attributes: { title: 'testTitle' }, + }) + ), + }; + const mockDefaultRequestHandler = jest.fn(); + const mockDataSourceRequestHandler = jest.fn().mockResolvedValue('dataSourceData'); + + getRawSuggestionData$( + mockConnectionsService, + mockDataSourceRequestHandler, + mockDefaultRequestHandler + ).subscribe((result) => { + expect(result).toBe('dataSourceData'); + expect(mockDataSourceRequestHandler).toHaveBeenCalledWith({ + dataSourceId: 'testId', + title: 'testTitle', + }); + expect(mockDefaultRequestHandler).not.toHaveBeenCalled(); + done(); + }); + }); +}); + +describe('fetchData', () => { + it('should fetch data using the dataSourceRequestHandler', async () => { + const mockTables = ['table1', 'table2']; + const mockQueryFormatter = jest.fn((table) => ({ query: `formatted ${table}` })); + const mockApi = { + http: { + fetch: jest.fn().mockResolvedValue('fetchedData'), + }, + }; + const mockConnectionService = { + getSelectedConnection$: jest + .fn() + .mockReturnValue(of({ id: 'testId', attributes: { title: 'testTitle' } })), + }; + + const result = await fetchData(mockTables, mockQueryFormatter, mockApi, mockConnectionService); + expect(result).toEqual(['fetchedData', 'fetchedData']); + expect(mockApi.http.fetch).toHaveBeenCalledTimes(2); + }); + + it('should fetch data using the defaultRequestHandler', async () => { + const mockTables = ['table1', 'table2']; + const mockQueryFormatter = jest.fn((table) => ({ query: `formatted ${table}` })); + const mockApi = { + http: { + fetch: jest.fn().mockResolvedValue('fetchedData'), + }, + }; + const mockConnectionService = { + getSelectedConnection$: jest.fn().mockReturnValue(of(undefined)), + }; + + const result = await fetchData(mockTables, mockQueryFormatter, mockApi, mockConnectionService); + expect(result).toEqual(['fetchedData', 'fetchedData']); + expect(mockApi.http.fetch).toHaveBeenCalledTimes(2); + }); +}); + +describe('fetchTableSchemas', () => { + it('should fetch table schemas', async () => { + const mockApi = { + http: { + fetch: jest.fn().mockResolvedValue('schemaData'), + }, + }; + const mockConnectionService = { + getSelectedConnection$: jest + .fn() + .mockReturnValue(of({ id: 'testId', attributes: { title: 'testTitle' } })), + }; + + const result = await fetchTableSchemas(['table1'], mockApi, mockConnectionService); + expect(result).toEqual(['schemaData']); + expect(mockApi.http.fetch).toHaveBeenCalledWith({ + method: 'POST', + path: '/api/enhancements/search/sql', + body: JSON.stringify({ + query: { qs: 'DESCRIBE TABLES LIKE table1', format: 'jdbc' }, + df: { + meta: { + queryConfig: { + dataSourceId: 'testId', + title: 'testTitle', + }, + }, + }, + }), + }); + }); +}); + +describe('fetchColumnValues', () => { + it('should fetch column values', async () => { + const mockApi = { + http: { + fetch: jest.fn().mockResolvedValue('columnData'), + }, + }; + const mockConnectionService = { + getSelectedConnection$: jest + .fn() + .mockReturnValue(of({ id: 'testId', attributes: { title: 'testTitle' } })), + }; + + const result = await fetchColumnValues(['table1'], 'column1', mockApi, mockConnectionService); + expect(result).toEqual(['columnData']); + expect(mockApi.http.fetch).toHaveBeenCalledWith({ + method: 'POST', + path: '/api/enhancements/search/sql', + body: JSON.stringify({ + query: { qs: 'SELECT DISTINCT column1 FROM table1 LIMIT 10', format: 'jdbc' }, + df: { + meta: { + queryConfig: { + dataSourceId: 'testId', + title: 'testTitle', + }, + }, + }, + }), + }); + }); +}); diff --git a/src/plugins/data/public/antlr/shared/utils.ts b/src/plugins/data/public/antlr/shared/utils.ts new file mode 100644 index 00000000000..b2658b304e0 --- /dev/null +++ b/src/plugins/data/public/antlr/shared/utils.ts @@ -0,0 +1,118 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { from } from 'rxjs'; +import { distinctUntilChanged, switchMap } from 'rxjs/operators'; + +export interface IDataSourceRequestHandlerParams { + dataSourceId: string; + title: string; +} + +export const getRawSuggestionData$ = ( + connectionsService, + dataSourceReuqstHandler: ({ + dataSourceId, + title, + }: IDataSourceRequestHandlerParams) => Promise, + defaultReuqstHandler: () => any +) => + connectionsService.getSelectedConnection$().pipe( + distinctUntilChanged(), + switchMap((connection) => { + if (connection === undefined) { + return from(defaultReuqstHandler()); + } + const dataSourceId = connection?.id; + const title = connection?.attributes?.title; + return from(dataSourceReuqstHandler({ dataSourceId, title })); + }) + ); + +export const fetchData = ( + tables: string[], + queryFormatter: (table: string, dataSourceId?: string, title?: string) => any, + api, + connectionService +): Promise => { + return new Promise((resolve, reject) => { + getRawSuggestionData$( + connectionService, + ({ dataSourceId, title }) => { + return Promise.all( + tables.map(async (table) => { + const body = JSON.stringify(queryFormatter(table, dataSourceId, title)); + return api.http.fetch({ + method: 'POST', + path: '/api/enhancements/search/sql', + body, + }); + }) + ); + }, + () => { + return Promise.all( + tables.map(async (table) => { + const body = JSON.stringify(queryFormatter(table)); + return api.http.fetch({ + method: 'POST', + path: '/api/enhancements/search/sql', + body, + }); + }) + ); + } + ).subscribe({ + next: (dataFrames) => resolve(dataFrames), + error: (err) => { + // TODO: pipe error to UI + reject(err); + }, + }); + }); +}; + +export const fetchTableSchemas = (tables: string[], api, connectionService): Promise => { + return fetchData( + tables, + (table, dataSourceId, title) => ({ + query: { qs: `DESCRIBE TABLES LIKE ${table}`, format: 'jdbc' }, + df: { + meta: { + queryConfig: { + dataSourceId: dataSourceId || undefined, + title: title || undefined, + }, + }, + }, + }), + api, + connectionService + ); +}; + +export const fetchColumnValues = ( + tables: string[], + column: string, + api, + connectionService +): Promise => { + return fetchData( + tables, + (table, dataSourceId, title) => ({ + query: { qs: `SELECT DISTINCT ${column} FROM ${table} LIMIT 10`, format: 'jdbc' }, + df: { + meta: { + queryConfig: { + dataSourceId: dataSourceId || undefined, + title: title || undefined, + }, + }, + }, + }), + api, + connectionService + ); +}; diff --git a/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts b/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts index 80a7a7d1412..a1a7aef8a5e 100644 --- a/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts +++ b/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts @@ -28,6 +28,7 @@ * under the License. */ +import { monaco } from 'packages/osd-monaco/target'; import { IFieldType, IIndexPattern } from '../../../common/index_patterns'; export enum QuerySuggestionTypes { @@ -51,6 +52,8 @@ export interface QuerySuggestionGetFnArgs { selectionEnd: number; signal?: AbortSignal; boolFilter?: any; + position?: monaco.Position; + connectionService?: any; // will need to add type when ConnectionService is properly exposed from queryEnhancements } /** @public **/ diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index ea0470d0e1a..ba1fbbf5abb 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -93,6 +93,7 @@ import { DataSourceFactory } from './data_sources/datasource'; import { registerDefaultDataSource } from './data_sources/register_default_datasource'; import { DefaultDslDataSource } from './data_sources/default_datasource'; import { DEFAULT_DATA_SOURCE_TYPE } from './data_sources/constants'; +import { getSuggestions as getSQLSuggestions } from './antlr/opensearch_sql/code_completion'; declare module '../../ui_actions/public' { export interface ActionContextMapping { @@ -165,6 +166,9 @@ export class DataPublicPlugin const uiService = this.uiService.setup(core, {}); + const ac = this.autocomplete.setup(core); + ac.addQuerySuggestionProvider('SQL', getSQLSuggestions); + return { // TODO: MQL autocomplete: this.autocomplete.setup(core), diff --git a/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss b/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss index 9b25e874b19..d76aa88eaf9 100644 --- a/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss +++ b/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss @@ -1,6 +1,7 @@ // SASSTODO: Probably not the right file for this selector, but temporary until the files get re-organized .globalQueryBar { padding: 0 $euiSizeS $euiSizeS $euiSizeS; + height: 160px; } .globalQueryBar:first-child { diff --git a/src/plugins/data/public/ui/query_editor/_language_switcher.scss b/src/plugins/data/public/ui/query_editor/_language_switcher.scss new file mode 100644 index 00000000000..176d072c102 --- /dev/null +++ b/src/plugins/data/public/ui/query_editor/_language_switcher.scss @@ -0,0 +1,8 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +.languageSelect { + max-width: 150px; + transform: translateY(-1px) translateX(-0.5px); +} diff --git a/src/plugins/data/public/ui/query_editor/language_switcher.tsx b/src/plugins/data/public/ui/query_editor/language_switcher.tsx new file mode 100644 index 00000000000..be22ebffd77 --- /dev/null +++ b/src/plugins/data/public/ui/query_editor/language_switcher.tsx @@ -0,0 +1,102 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { EuiComboBox, EuiComboBoxOptionOption, PopoverAnchorPosition } from '@elastic/eui'; +import { i18n } from '@osd/i18n'; +import React from 'react'; +import { getSearchService, getUiService } from '../../services'; + +interface Props { + language: string; + onSelectLanguage: (newLanguage: string) => void; + anchorPosition?: PopoverAnchorPosition; + appName?: string; +} + +function mapExternalLanguageToOptions(language: string) { + return { + label: language, + value: language, + }; +} + +export function QueryLanguageSwitcher(props: Props) { + const dqlLabel = i18n.translate('data.query.queryBar.dqlLanguageName', { + defaultMessage: 'DQL', + }); + const luceneLabel = i18n.translate('data.query.queryBar.luceneLanguageName', { + defaultMessage: 'Lucene', + }); + + const languageOptions: EuiComboBoxOptionOption[] = [ + { + label: dqlLabel, + value: 'kuery', + }, + { + label: luceneLabel, + value: 'lucene', + }, + ]; + + const uiService = getUiService(); + const searchService = getSearchService(); + + const queryEnhancements = uiService.queryEnhancements; + if (uiService.isEnhancementsEnabled) { + queryEnhancements.forEach((enhancement) => { + if ( + enhancement.supportedAppNames && + props.appName && + !enhancement.supportedAppNames.includes(props.appName) + ) + return; + languageOptions.push(mapExternalLanguageToOptions(enhancement.language)); + }); + } + + const selectedLanguage = { + label: + (languageOptions.find( + (option) => (option.value as string).toLowerCase() === props.language.toLowerCase() + )?.label as string) ?? languageOptions[0].label, + }; + + const setSearchEnhance = (queryLanguage: string) => { + if (!uiService.isEnhancementsEnabled) return; + const queryEnhancement = queryEnhancements.get(queryLanguage); + searchService.__enhance({ + searchInterceptor: queryEnhancement + ? queryEnhancement.search + : searchService.getDefaultSearchInterceptor(), + }); + + if (!queryEnhancement) { + searchService.df.clear(); + } + uiService.Settings.setUiOverridesByUserQueryLanguage(queryLanguage); + }; + + const handleLanguageChange = (newLanguage: EuiComboBoxOptionOption[]) => { + const queryLanguage = newLanguage[0].value as string; + props.onSelectLanguage(queryLanguage); + setSearchEnhance(queryLanguage); + }; + + setSearchEnhance(props.language); + + return ( + + ); +} diff --git a/src/plugins/data/public/ui/query_editor/query_editor.tsx b/src/plugins/data/public/ui/query_editor/query_editor.tsx index 69d332c65c0..44d000de1e8 100644 --- a/src/plugins/data/public/ui/query_editor/query_editor.tsx +++ b/src/plugins/data/public/ui/query_editor/query_editor.tsx @@ -36,6 +36,10 @@ import { fetchIndexPatterns } from './fetch_index_patterns'; import { QueryLanguageSelector } from './language_selector'; import { QueryEditorExtensions } from './query_editor_extensions'; import { QueryEditorBtnCollapse } from './query_editor_btn_collapse'; + +const LANGUAGE_ID = 'SQL'; +monaco.languages.register({ id: LANGUAGE_ID }); + export interface QueryEditorProps { indexPatterns: Array; dataSource?: DataSource; @@ -313,6 +317,60 @@ export default class QueryEditorUI extends Component { } }; + getCodeEditorSuggestionsType = (columnType: string) => { + switch (columnType) { + case 'text': + return monaco.languages.CompletionItemKind.Text; + case 'function': + return monaco.languages.CompletionItemKind.Function; + case 'object': + return monaco.languages.CompletionItemKind.Struct; + case 'field': + return monaco.languages.CompletionItemKind.Field; + case 'value': + return monaco.languages.CompletionItemKind.Value; + default: + return monaco.languages.CompletionItemKind.Text; + } + }; + + provideCompletionItems = async ( + model: monaco.editor.ITextModel, + position: monaco.Position + ): Promise => { + const wordUntil = model.getWordUntilPosition(position); + const wordRange = new monaco.Range( + position.lineNumber, + wordUntil.startColumn, + position.lineNumber, + wordUntil.endColumn + ); + const enhancements = this.props.settings.getQueryEnhancements(this.props.query.language); + const connectionService = enhancements?.connectionService; + const suggestions = await this.services.data.autocomplete.getQuerySuggestions({ + query: this.getQueryString(), + selectionStart: model.getOffsetAt(position), + selectionEnd: model.getOffsetAt(position), + language: this.props.query.language, + indexPatterns: this.state.indexPatterns, + position, + connectionService, + }); + + return { + suggestions: + suggestions && suggestions.length > 0 + ? suggestions.map((s) => ({ + label: s.text, + kind: this.getCodeEditorSuggestionsType(s.type), + insertText: s.text, + range: wordRange, + })) + : [], + incomplete: false, + }; + }; + editorDidMount = (editor: monaco.editor.IStandaloneCodeEditor) => { this.setState({ lineCount: editor.getModel()?.getLineCount() }); this.inputRef = editor; @@ -403,7 +461,7 @@ export default class QueryEditorUI extends Component {

@@ -462,7 +524,7 @@ export default class QueryEditorUI extends Component { {!this.state.isCollapsed && useQueryEditor && ( { wrappingIndent: 'indent', lineDecorationsWidth: 0, lineNumbersMinChars: 2, + wordBasedSuggestions: false, + }} + suggestionProvider={{ + provideCompletionItems: this.provideCompletionItems, }} /> )} diff --git a/src/plugins/data/public/ui/query_string_input/query_string_input.tsx b/src/plugins/data/public/ui/query_string_input/query_string_input.tsx index dbbaad9cc3d..4a010534362 100644 --- a/src/plugins/data/public/ui/query_string_input/query_string_input.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_string_input.tsx @@ -30,7 +30,6 @@ import React, { Component, RefObject, createRef } from 'react'; import { i18n } from '@osd/i18n'; - import classNames from 'classnames'; import { EuiCompressedTextArea, @@ -191,7 +190,6 @@ export default class QueryStringInputUI extends Component { selectionEnd, signal: this.abortController.signal, })) || []; - return [...suggestions, ...recentSearchSuggestions]; } catch (e) { // TODO: Waiting on https://github.com/elastic/kibana/issues/51406 for a properly typed error diff --git a/src/plugins/data/public/ui/types.ts b/src/plugins/data/public/ui/types.ts index afa0c813050..9beb78e8e6b 100644 --- a/src/plugins/data/public/ui/types.ts +++ b/src/plugins/data/public/ui/types.ts @@ -44,6 +44,7 @@ export interface QueryEnhancement { // List of supported app names that this enhancement should be enabled for, // if not provided it will be enabled for all apps supportedAppNames?: string[]; + connectionService?: any; // temporary workaround until we settle the way to reference the connection service } export interface UiEnhancements { diff --git a/src/plugins/query_enhancements/public/plugin.tsx b/src/plugins/query_enhancements/public/plugin.tsx index 0ea557db8ce..d65676b70e7 100644 --- a/src/plugins/query_enhancements/public/plugin.tsx +++ b/src/plugins/query_enhancements/public/plugin.tsx @@ -97,6 +97,7 @@ export class QueryEnhancementsPlugin visualizable: false, }, supportedAppNames: ['discover'], + connectionService: this.connectionsService, }, }, }); @@ -119,6 +120,7 @@ export class QueryEnhancementsPlugin }, showDocLinks: false, supportedAppNames: ['discover'], + connectionService: this.connectionsService, }, }, }); @@ -141,6 +143,7 @@ export class QueryEnhancementsPlugin }, showDocLinks: false, supportedAppNames: ['discover'], + connectionService: this.connectionsService, }, }, }); diff --git a/yarn.lock b/yarn.lock index 63a9d856328..fe0e220dae4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -250,7 +250,22 @@ "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-class-features-plugin@^7.24.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== @@ -297,7 +312,14 @@ dependencies: "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.22.15": +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== @@ -327,7 +349,12 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.20": +"@babel/helper-plugin-utils@^7.24.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== + +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== @@ -345,6 +372,15 @@ "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -366,16 +402,33 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" @@ -647,10 +700,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz#73380c632c095b03e8503c24fd38f95ad41ffacb" - integrity sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w== +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.22.15" @@ -1216,6 +1278,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1744,6 +1815,18 @@ "@hapi/bourne" "2.x.x" "@hapi/hoek" "9.x.x" +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2634,6 +2717,11 @@ resolved "https://registry.yarnpkg.com/@percy/sdk-utils/-/sdk-utils-1.10.4.tgz#5cab2f29f75588372743713b634e0780abdc681e" integrity sha512-5MTB30SSKLMMX3Mc19Ig62stZJeKbEyRZpVj8df47GQB4s5vbB3qtRwy0cmJBwcbDZxU5LWYQABsfr9UdAKvVg== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@popperjs/core@^2.4.0": version "2.11.4" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.4.tgz#d8c7b8db9226d2d7664553a0741ad7d0397ee503" @@ -4383,11 +4471,33 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= +antlr4-c3@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/antlr4-c3/-/antlr4-c3-3.4.1.tgz#2c2973af98b7e1ed9b5ad1fea9c41aa78e34240f" + integrity sha512-YLO/ncwUp8w2GNK/lnsYXtMkd8izHCWjxtk7EaTGIZq07THfvI5aHDuhls/RctX3EYDlM9zeTKdqn54eLYNglQ== + dependencies: + antlr4ng "^3.0.1" + +antlr4ng-cli@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/antlr4ng-cli/-/antlr4ng-cli-2.0.0.tgz#4f86f3c3818a2170aa1041d4e1633b489af00131" + integrity sha512-oAt5OSSYhRQn1PgahtpAP4Vp3BApCoCqlzX7Q8ZUWWls4hX59ryYuu0t7Hwrnfk796OxP/vgIJaqxdltd/oEvQ== + +antlr4ng@^3.0.1, antlr4ng@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/antlr4ng/-/antlr4ng-3.0.4.tgz#71a47e6148ae75f72fa5f27fbed5ef3462815c7c" + integrity sha512-u1Ww6wVv9hq70E9AaYe5qW3ba8hvnjJdO3ZsKnb3iJWFV/medLEEhbyWwXCvvD2ef0ptdaiIUgmaazS/WE6uyQ== + any-base@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" @@ -7062,6 +7172,19 @@ eachr@^4.5.0: dependencies: typechecker "^6.2.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ejs@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" @@ -8438,6 +8561,19 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -8746,6 +8882,17 @@ glob@7.2.0, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glo once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.3.7: + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" + glob@~5.0.0: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -10345,6 +10492,15 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" @@ -11540,6 +11696,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + lru-cache@^4.0.0, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -11923,6 +12084,27 @@ minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimatch@~3.0.4: + version "3.0.8" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" + integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + dependencies: + brace-expansion "^1.1.7" + minimist-options@4.1.0, minimist-options@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -11970,6 +12152,11 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -13054,6 +13241,14 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -14581,6 +14776,13 @@ rimraf@^3.0.0, rimraf@^3.0.2, rimraf@~3.0.2: dependencies: glob "^7.1.3" +rimraf@^5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" + integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== + dependencies: + glob "^10.3.7" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -14993,6 +15195,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-git@^3.16.0: version "3.16.0" resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.16.0.tgz#421773e24680f5716999cc4a1d60127b4b6a9dec" @@ -15422,6 +15629,15 @@ string-similarity@^4.0.1: resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -15448,14 +15664,14 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string.prototype.matchall@^4.0.6: version "4.0.7" @@ -15526,6 +15742,13 @@ stringify-entities@^3.0.1: character-entities-legacy "^1.0.0" xtend "^4.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@*: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -15561,12 +15784,12 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom-string@1.X: version "1.0.0" @@ -17706,6 +17929,15 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" @@ -17723,14 +17955,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" From 0bae18c0799666aa50a5fff5c01eec05981b65e9 Mon Sep 17 00:00:00 2001 From: Suchit Sahoo <38322563+LDrago27@users.noreply.github.com> Date: Tue, 23 Jul 2024 00:33:09 -0700 Subject: [PATCH 3/9] Move TopNavLinks to new Nav Bar Discover (#7326) This PR aims to introduce a new Nav bar in Discover that would contain the Date Picker as well as the Navigation links that are currently part of headers. The Navigation Links have been replaced with the corresponding Icons to provide a modern UX. These setting are currently controlled by query:enhancements:enabled Advanced Setting Flag and would be visible when the above flag is turned on. Signed-off-by: Suchit Sahoo (cherry picked from commit e46e54a85fac05684c4a052325331e4f7331b6ce) --- src/core/public/application/types.ts | 2 + .../ui/query_editor/query_editor_top_row.tsx | 20 +++- .../query_string_input/query_bar_top_row.tsx | 10 +- .../ui/search_bar/create_search_bar.tsx | 1 + .../data/public/ui/search_bar/search_bar.tsx | 3 + .../__snapshots__/app_container.test.tsx.snap | 10 +- .../public/components/app_container.scss | 10 ++ .../public/components/app_container.tsx | 108 ++++++++++++------ .../public/components/constants.ts | 6 + src/plugins/discover/common/index.ts | 1 + .../components/top_nav/get_top_nav_links.tsx | 28 ++++- .../canvas/discover_canvas.scss | 6 + .../view_components/canvas/index.tsx | 12 +- .../view_components/canvas/top_nav.tsx | 69 ++++++++--- .../public/top_nav_menu/top_nav_menu.tsx | 1 + .../public/top_nav_menu/top_nav_menu_data.tsx | 1 - 16 files changed, 218 insertions(+), 70 deletions(-) create mode 100644 src/plugins/data_explorer/public/components/constants.ts diff --git a/src/core/public/application/types.ts b/src/core/public/application/types.ts index 1e84ae309bd..7546b49620a 100644 --- a/src/core/public/application/types.ts +++ b/src/core/public/application/types.ts @@ -539,6 +539,8 @@ export interface AppMountParameters { * Optional datasource id to pass while mounting app */ dataSourceId?: string; + + optionalRef?: Record>; } /** diff --git a/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx b/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx index 8304fdc252e..a482d741641 100644 --- a/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx +++ b/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx @@ -15,6 +15,7 @@ import { import classNames from 'classnames'; import { compact, isEqual } from 'lodash'; import React, { useState } from 'react'; +import { createPortal } from 'react-dom'; import { DataSource, IDataPluginServices, @@ -64,6 +65,7 @@ export interface QueryEditorTopRowProps { isDirty: boolean; timeHistory?: TimeHistoryContract; indicateNoData?: boolean; + datePickerRef?: React.RefObject; } // Needed for React.lazy @@ -294,7 +296,7 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) { return ( - + {renderDatePicker()} {button} @@ -359,6 +361,14 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) { 'osdQueryEditor--withDatePicker': props.showDatePicker, }); + const datePicker = ( + + + {renderUpdateButton()} + + + ); + return ( - - - {renderUpdateButton()} - - + {props?.datePickerRef?.current && uiSettings.get(UI_SETTINGS.QUERY_ENHANCEMENTS_ENABLED) + ? createPortal(datePicker, props.datePickerRef.current) + : datePicker} {renderQueryEditor()} diff --git a/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx b/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx index 72b28830652..3383df9d4e6 100644 --- a/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx @@ -46,6 +46,7 @@ import { import { EuiSuperUpdateButton, OnRefreshProps, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@osd/i18n/react'; import { Toast } from 'src/core/public'; +import { createPortal } from 'react-dom'; import { IDataPluginServices, IIndexPattern, TimeRange, TimeHistoryContract, Query } from '../..'; import { useOpenSearchDashboards, @@ -83,6 +84,7 @@ export interface QueryBarTopRowProps { isDirty: boolean; timeHistory?: TimeHistoryContract; indicateNoData?: boolean; + datePickerRef?: React.RefObject; } // Needed for React.lazy @@ -262,7 +264,7 @@ export default function QueryBarTopRow(props: QueryBarTopRowProps) { return ( - + {renderDatePicker()} {button} @@ -393,7 +395,11 @@ export default function QueryBarTopRow(props: QueryBarTopRowProps) { > {renderQueryInput()} {renderSharingMetaFields()} - {renderUpdateButton()} + + {props?.datePickerRef?.current && uiSettings.get(UI_SETTINGS.QUERY_ENHANCEMENTS_ENABLED) + ? createPortal(renderUpdateButton(), props.datePickerRef.current) + : renderUpdateButton()} + ); diff --git a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx index 244f4296216..31f3401dc76 100644 --- a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx @@ -237,6 +237,7 @@ export function createSearchBar({ onClearSavedQuery={defaultOnClearSavedQuery(props, clearSavedQuery)} onSavedQueryUpdated={defaultOnSavedQueryUpdated(props, setSavedQuery)} onSaved={defaultOnSavedQueryUpdated(props, setSavedQuery)} + datePickerRef={props.datePickerRef} {...overrideDefaultBehaviors(props)} /> diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index 11914f13444..b2ff6766e81 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -77,6 +77,7 @@ export interface SearchBarOwnProps { refreshInterval?: number; dateRangeFrom?: string; dateRangeTo?: string; + datePickerRef?: React.RefObject; // Query bar - should be in SearchBarInjectedDeps query?: Query; settings?: Settings; @@ -482,6 +483,7 @@ class SearchBarUI extends Component { } dataTestSubj={this.props.dataTestSubj} indicateNoData={this.props.indicateNoData} + datePickerRef={this.props.datePickerRef} /> ); } @@ -518,6 +520,7 @@ class SearchBarUI extends Component { filterBar={filterBar} dataTestSubj={this.props.dataTestSubj} indicateNoData={this.props.indicateNoData} + datePickerRef={this.props.datePickerRef} /> ); } diff --git a/src/plugins/data_explorer/public/components/__snapshots__/app_container.test.tsx.snap b/src/plugins/data_explorer/public/components/__snapshots__/app_container.test.tsx.snap index 29b8e5ab54e..6e79926aa72 100644 --- a/src/plugins/data_explorer/public/components/__snapshots__/app_container.test.tsx.snap +++ b/src/plugins/data_explorer/public/components/__snapshots__/app_container.test.tsx.snap @@ -3,10 +3,14 @@ exports[`DataExplorerApp should render the canvas and panel when selected 1`] = `
-
- Context +
+
+ Context +
diff --git a/src/plugins/data_explorer/public/components/app_container.scss b/src/plugins/data_explorer/public/components/app_container.scss index 7bd5ed6f69f..07f070be3b1 100644 --- a/src/plugins/data_explorer/public/components/app_container.scss +++ b/src/plugins/data_explorer/public/components/app_container.scss @@ -20,3 +20,13 @@ $osdHeaderOffset: $euiHeaderHeightCompensation; .headerIsExpanded .deLayout { height: calc(100vh - #{$osdHeaderOffset * 2}); } + +.mainPage { + overflow-x: hidden; + overflow-y: auto; + + .navBar { + padding: $euiSizeXS $euiSizeXS $euiSizeXS $euiSizeM; + border-bottom: $euiBorderThin; + } +} diff --git a/src/plugins/data_explorer/public/components/app_container.tsx b/src/plugins/data_explorer/public/components/app_container.tsx index bf4a02bd223..d334fb2ae0d 100644 --- a/src/plugins/data_explorer/public/components/app_container.tsx +++ b/src/plugins/data_explorer/public/components/app_container.tsx @@ -3,8 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { memo } from 'react'; -import { EuiPage, EuiPageBody, EuiResizableContainer, useIsWithinBreakpoints } from '@elastic/eui'; +import React, { memo, useRef } from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiPage, + EuiPageBody, + EuiResizableContainer, + useIsWithinBreakpoints, +} from '@elastic/eui'; import { Suspense } from 'react'; import { AppMountParameters } from '../../../../core/public'; import { Sidebar } from './sidebar'; @@ -12,11 +19,19 @@ import { NoView } from './no_view'; import { View } from '../services/view_service/view'; import { shallowEqual } from '../utils/use/shallow_equal'; import './app_container.scss'; +import { useOpenSearchDashboards } from '../../../opensearch_dashboards_react/public'; +import { IDataPluginServices } from '../../../data/public'; +import { QUERY_ENHANCEMENT_ENABLED_SETTING } from './constants'; export const AppContainer = React.memo( ({ view, params }: { view?: View; params: AppMountParameters }) => { const isMobile = useIsWithinBreakpoints(['xs', 's', 'm']); - // TODO: Make this more robust. + + const opensearchDashboards = useOpenSearchDashboards(); + const { uiSettings } = opensearchDashboards.services; + + const topLinkRef = useRef(null); + const datePickerRef = useRef(null); if (!view) { return ; } @@ -26,38 +41,67 @@ export const AppContainer = React.memo( const MemoizedPanel = memo(Panel); const MemoizedCanvas = memo(Canvas); + params.optionalRef = { + topLinkRef, + datePickerRef, + }; + // Render the application DOM. return ( - - {/* TODO: improve fallback state */} - Loading...
}> - - - {(EuiResizablePanel, EuiResizableButton) => ( - <> - - - - - - +
+ {uiSettings?.get(QUERY_ENHANCEMENT_ENABLED_SETTING) && ( + + +
+ + +
+ + + )} + + + {/* TODO: improve fallback state */} + Loading...
}> + + + {(EuiResizablePanel, EuiResizableButton) => ( + <> + + + + + + - - - - - - - )} - - - - + + + + + + + )} + + + + +
); }, (prevProps, nextProps) => { diff --git a/src/plugins/data_explorer/public/components/constants.ts b/src/plugins/data_explorer/public/components/constants.ts new file mode 100644 index 00000000000..85d0f9ec146 --- /dev/null +++ b/src/plugins/data_explorer/public/components/constants.ts @@ -0,0 +1,6 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const QUERY_ENHANCEMENT_ENABLED_SETTING = 'query:enhancements:enabled'; diff --git a/src/plugins/discover/common/index.ts b/src/plugins/discover/common/index.ts index 45887df880a..b47e163a6c5 100644 --- a/src/plugins/discover/common/index.ts +++ b/src/plugins/discover/common/index.ts @@ -15,3 +15,4 @@ export const CONTEXT_DEFAULT_SIZE_SETTING = 'context:defaultSize'; export const CONTEXT_STEP_SETTING = 'context:step'; export const CONTEXT_TIE_BREAKER_FIELDS_SETTING = 'context:tieBreakerFields'; export const MODIFY_COLUMNS_ON_SWITCH = 'discover:modifyColumnsOnSwitch'; +export const QUERY_ENHANCEMENT_ENABLED_SETTING = 'query:enhancements:enabled'; diff --git a/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx b/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx index 592cc23afff..3e0b0084693 100644 --- a/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx +++ b/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx @@ -29,7 +29,8 @@ import { OpenSearchPanel } from './open_search_panel'; export const getTopNavLinks = ( services: DiscoverViewServices, inspectorAdapters: Adapters, - savedSearch: SavedSearch + savedSearch: SavedSearch, + isEnhancementEnabled: boolean = false ) => { const { history, @@ -44,7 +45,7 @@ export const getTopNavLinks = ( osdUrlStateStorage, } = services; - const newSearch = { + const newSearch: TopNavMenuData = { id: 'new', label: i18n.translate('discover.localMenu.localMenu.newSearchTitle', { defaultMessage: 'New', @@ -61,6 +62,7 @@ export const getTopNavLinks = ( ariaLabel: i18n.translate('discover.topNav.discoverNewButtonLabel', { defaultMessage: `New Search`, }), + iconType: 'plusInCircle', }; const saveSearch: TopNavMenuData = { @@ -160,9 +162,10 @@ export const getTopNavLinks = ( ); showSaveModal(saveModal, core.i18n.Context); }, + iconType: 'save', }; - const openSearch = { + const openSearch: TopNavMenuData = { id: 'open', label: i18n.translate('discover.localMenu.openTitle', { defaultMessage: 'Open', @@ -190,6 +193,7 @@ export const getTopNavLinks = ( ) ); }, + iconType: 'folderOpen', }; const shareSearch: TopNavMenuData = { @@ -225,9 +229,10 @@ export const getTopNavLinks = ( isDirty: !savedSearch.id || state.isDirty || false, }); }, + iconType: 'share', }; - const inspectSearch = { + const inspectSearch: TopNavMenuData = { id: 'inspect', label: i18n.translate('discover.localMenu.inspectTitle', { defaultMessage: 'Inspect', @@ -244,15 +249,28 @@ export const getTopNavLinks = ( title: savedSearch?.title || undefined, }); }, + iconType: 'inspect', }; - return [ + const topNavLinksArray = [ newSearch, ...(capabilities.discover?.save ? [saveSearch] : []), openSearch, ...(share ? [shareSearch] : []), // Show share option only if share plugin is available inspectSearch, ]; + + if (!isEnhancementEnabled) { + return topNavLinksArray.map((topNavLink) => { + if (topNavLink) { + const { iconType, ...rest } = topNavLink; // Removing the Icon Type property to maintain consistency with older Nav Bar + return rest; + } + return topNavLink; + }); + } + + return topNavLinksArray; }; // TODO: This does not seem to affect the share menu. need to look into it in future diff --git a/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss b/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss index 2c2c8dfe8eb..e0ab20a1529 100644 --- a/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss +++ b/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss @@ -45,3 +45,9 @@ } } } + +.topNav { + .hidden { + display: none; + } +} diff --git a/src/plugins/discover/public/application/view_components/canvas/index.tsx b/src/plugins/discover/public/application/view_components/canvas/index.tsx index 5c5fcb35860..54489824227 100644 --- a/src/plugins/discover/public/application/view_components/canvas/index.tsx +++ b/src/plugins/discover/public/application/view_components/canvas/index.tsx @@ -25,14 +25,18 @@ import { setColumns, useDispatch, useSelector } from '../../utils/state_manageme import { DiscoverViewServices } from '../../../build_services'; import { useOpenSearchDashboards } from '../../../../../opensearch_dashboards_react/public'; import { filterColumns } from '../utils/filter_columns'; -import { DEFAULT_COLUMNS_SETTING, MODIFY_COLUMNS_ON_SWITCH } from '../../../../common'; +import { + DEFAULT_COLUMNS_SETTING, + MODIFY_COLUMNS_ON_SWITCH, + QUERY_ENHANCEMENT_ENABLED_SETTING, +} from '../../../../common'; import { OpenSearchSearchHit } from '../../../application/doc_views/doc_views_types'; import { buildColumns } from '../../utils/columns'; import './discover_canvas.scss'; import { getNewDiscoverSetting, setNewDiscoverSetting } from '../../components/utils/local_storage'; // eslint-disable-next-line import/no-default-export -export default function DiscoverCanvas({ setHeaderActionMenu, history }: ViewProps) { +export default function DiscoverCanvas({ setHeaderActionMenu, history, optionalRef }: ViewProps) { const panelRef = useRef(null); const { data$, refetch$, indexPattern } = useDiscoverContext(); const { @@ -46,6 +50,7 @@ export default function DiscoverCanvas({ setHeaderActionMenu, history }: ViewPro columns: stateColumns !== undefined ? stateColumns : buildColumns([]), }; }); + const isEnhancementsEnabled = uiSettings.get(QUERY_ENHANCEMENT_ENABLED_SETTING); const filteredColumns = filterColumns( columns, indexPattern, @@ -171,12 +176,15 @@ export default function DiscoverCanvas({ setHeaderActionMenu, history }: ViewPro className="dscCanvas" > + {fetchState.status === ResultStatus.NO_RESULTS && ( )} diff --git a/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx b/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx index adb4152cc40..b6547e1b00a 100644 --- a/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx +++ b/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx @@ -5,6 +5,8 @@ import React, { useEffect, useMemo, useState } from 'react'; import { Query, TimeRange } from 'src/plugins/data/common'; +import { createPortal } from 'react-dom'; +import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import { AppMountParameters } from '../../../../../../core/public'; import { connectStorageToQueryState, opensearchFilters } from '../../../../../data/public'; import { useOpenSearchDashboards } from '../../../../../opensearch_dashboards_react/public'; @@ -15,16 +17,19 @@ import { getTopNavLinks } from '../../components/top_nav/get_top_nav_links'; import { getRootBreadcrumbs } from '../../helpers/breadcrumbs'; import { useDiscoverContext } from '../context'; import { useDispatch, setSavedQuery, useSelector } from '../../utils/state_management'; +import './discover_canvas.scss'; export interface TopNavProps { opts: { setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; onQuerySubmit: (payload: { dateRange: TimeRange; query?: Query }, isUpdate?: boolean) => void; + optionalRef?: Record>; }; showSaveQuery: boolean; + isEnhancementsEnabled?: boolean; } -export const TopNav = ({ opts, showSaveQuery }: TopNavProps) => { +export const TopNav = ({ opts, showSaveQuery, isEnhancementsEnabled }: TopNavProps) => { const { services } = useOpenSearchDashboards(); const { inspectorAdapters, savedSearch, indexPattern } = useDiscoverContext(); const [indexPatterns, setIndexPatterns] = useState(undefined); @@ -43,7 +48,9 @@ export const TopNav = ({ opts, showSaveQuery }: TopNavProps) => { osdUrlStateStorage, } = services; - const topNavLinks = savedSearch ? getTopNavLinks(services, inspectorAdapters, savedSearch) : []; + const topNavLinks = savedSearch + ? getTopNavLinks(services, inspectorAdapters, savedSearch, isEnhancementsEnabled) + : []; connectStorageToQueryState(services.data.query, osdUrlStateStorage, { filters: opensearchFilters.FilterStateStore.APP_STATE, @@ -88,22 +95,46 @@ export const TopNav = ({ opts, showSaveQuery }: TopNavProps) => { }; return ( - + <> + {isEnhancementsEnabled && + !!opts?.optionalRef?.topLinkRef?.current && + createPortal( + + {topNavLinks.map((topNavLink) => ( + + + { + topNavLink.run(event.currentTarget); + }} + iconType={topNavLink.iconType} + aria-label={topNavLink.ariaLabel} + /> + + + ))} + , + opts.optionalRef.topLinkRef.current + )} + + ); }; diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx index c7aaa276369..7bce0e01470 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx @@ -55,6 +55,7 @@ export type TopNavMenuProps = StatefulSearchBarProps & showDataSourceMenu?: boolean; data?: DataPublicPluginStart; className?: string; + datePickerRef?: any; /** * If provided, the menu part of the component will be rendered as a portal inside the given mount point. * diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_data.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_data.tsx index 322ed11d639..c7a3220a896 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_data.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_data.tsx @@ -30,7 +30,6 @@ import { EuiButtonProps } from '@elastic/eui'; import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { string } from 'mathjs'; export type TopNavMenuAction = (anchorElement: HTMLElement) => void; From 0726becd9e46b76623939b10750a9808ff6f564e Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 24 Jul 2024 15:52:50 +0800 Subject: [PATCH 4/9] [navigation-next]fix: breadcrumb issue found in data source management and other similar cases. (#7401) * feat: add scoped breadcrumbs Signed-off-by: SuZhou-Joe * Changeset file for PR #7401 created/updated * feat: move data source management register logic up a little bit Signed-off-by: SuZhou-Joe * feat: add unit test Signed-off-by: SuZhou-Joe * feat: revert the home related change Signed-off-by: SuZhou-Joe * fix: overview error in all use case when workspace is enabled Signed-off-by: SuZhou-Joe * fix: update snapshot Signed-off-by: SuZhou-Joe * Changeset file for PR #7401 created/updated * fix: hide nav groups that should be displayed Signed-off-by: SuZhou-Joe * feat: hide expand icon in left navigation Signed-off-by: SuZhou-Joe * feat: update Signed-off-by: SuZhou-Joe --------- Signed-off-by: SuZhou-Joe Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com> Co-authored-by: ZilongX <99905560+ZilongX@users.noreply.github.com> (cherry picked from commit 3f78c94e640209027d9e7cc5cd349403f70dea18) --- changelogs/fragments/7401.yml | 2 + ...ollapsible_nav_group_enabled.test.tsx.snap | 102 ++++++++---- .../header/__snapshots__/header.test.tsx.snap | 148 ++++++++++++++++++ .../collapsible_nav_group_enabled.test.tsx | 55 ++++++- .../header/collapsible_nav_group_enabled.tsx | 21 +-- .../collapsible_nav_group_enabled_top.tsx | 2 + .../public/chrome/ui/header/header.test.tsx | 18 +++ src/core/public/chrome/ui/header/header.tsx | 54 ++++--- .../advanced_settings/public/plugin.ts | 4 +- .../data_source_management/public/plugin.ts | 14 +- .../index_pattern_management/public/plugin.ts | 4 +- .../public/react_router_navigate/index.ts | 6 +- .../react_router_navigate.test.tsx | 41 +++++ .../react_router_navigate.tsx | 13 +- .../saved_objects_management/public/plugin.ts | 4 +- src/plugins/workspace/public/plugin.test.ts | 2 +- src/plugins/workspace/public/plugin.ts | 10 +- 17 files changed, 411 insertions(+), 89 deletions(-) create mode 100644 changelogs/fragments/7401.yml create mode 100644 src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.test.tsx diff --git a/changelogs/fragments/7401.yml b/changelogs/fragments/7401.yml new file mode 100644 index 00000000000..5aebdb15669 --- /dev/null +++ b/changelogs/fragments/7401.yml @@ -0,0 +1,2 @@ +fix: +- Make breadcrumb of 4 new added applications comply with BrowserRouter. ([#7401](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7401)) \ No newline at end of file diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav_group_enabled.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav_group_enabled.test.tsx.snap index 1bd0458ef1b..4201e514666 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav_group_enabled.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav_group_enabled.test.tsx.snap @@ -1,34 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` should hide left navigation when in home page when workspace is enabled 1`] = ` -
-
-
-
-
-
-
-
-
-
-
-`; - exports[` should render correctly 1`] = `
should show all use case by default and
`; +exports[` should show all use case when current nav group is \`all\` 1`] = ` +
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+`; + exports[` should render correctly 1`] = `
', () => { function mockProps( props?: Partial & { navGroupsMap?: Record; + currentNavGroupId?: string; + navLinks?: ChromeNavLink[]; } ): CollapsibleNavGroupEnabledProps { - const currentNavGroup$ = new BehaviorSubject(undefined); const navGroupsMap$ = new BehaviorSubject>({ [ALL_USE_CASE_ID]: { ...DEFAULT_NAV_GROUPS[ALL_USE_CASE_ID], @@ -121,6 +122,9 @@ describe('', () => { }, ...props?.navGroupsMap, }); + const currentNavGroup$ = new BehaviorSubject( + props?.currentNavGroupId ? navGroupsMap$.getValue()[props.currentNavGroupId] : undefined + ); return { appId$: new BehaviorSubject('test'), basePath: mockBasePath, @@ -146,6 +150,7 @@ describe('', () => { baseUrl: '', href: '', }, + ...(props?.navLinks || []), ]), storage: new StubBrowserStorage(), onIsLockedUpdate: () => {}, @@ -226,8 +231,9 @@ describe('', () => { expect(getAllByTestId('collapsibleNavAppLink-link-in-analytics').length).toEqual(2); }); - it('should hide left navigation when in home page when workspace is enabled', async () => { + it('should show all use case when current nav group is `all`', async () => { const props = mockProps({ + currentNavGroupId: ALL_USE_CASE_ID, navGroupsMap: { [DEFAULT_NAV_GROUPS.analytics.id]: { ...DEFAULT_NAV_GROUPS.analytics, @@ -241,12 +247,45 @@ describe('', () => { }, }, }); - props.appId$ = new BehaviorSubject('home'); - if (props.capabilities.workspaces) { - (props.capabilities.workspaces as Record) = {}; - (props.capabilities.workspaces as Record).enabled = true; - } - const { container } = render(); + const { container, getAllByTestId, getByTestId } = render( + + ); + fireEvent.click(getAllByTestId('collapsibleNavAppLink-link-in-analytics')[1]); + expect(getAllByTestId('collapsibleNavAppLink-link-in-analytics').length).toEqual(1); expect(container).toMatchSnapshot(); + fireEvent.click(getByTestId('back')); + expect(getAllByTestId('collapsibleNavAppLink-link-in-analytics').length).toEqual(2); + }); + + it('should not show group if the nav link is hidden', async () => { + const props = mockProps({ + currentNavGroupId: ALL_USE_CASE_ID, + navGroupsMap: { + [DEFAULT_NAV_GROUPS.analytics.id]: { + ...DEFAULT_NAV_GROUPS.analytics, + navLinks: [ + { + id: 'link-in-analytics-but-hidden', + title: 'link-in-analytics-but-hidden', + showInAllNavGroup: true, + }, + ], + }, + }, + navLinks: [ + { + id: 'link-in-analytics-but-hidden', + hidden: true, + title: 'link-in-analytics-but-hidden', + baseUrl: '', + href: '', + }, + ], + }); + const { queryAllByTestId } = render(); + expect(queryAllByTestId('collapsibleNavAppLink-link-in-analytics-but-hidden').length).toEqual( + 0 + ); + expect(queryAllByTestId('collapsibleNavAppLink-link-in-all').length).toEqual(1); }); }); diff --git a/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.tsx b/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.tsx index c6669a6b99f..ea5510ad599 100644 --- a/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.tsx +++ b/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.tsx @@ -177,7 +177,7 @@ export function CollapsibleNavGroupEnabled({ basePath, id, isLocked, - isNavOpen: isNavOpenProps, + isNavOpen, storage = window.localStorage, onIsLockedUpdate, closeNav, @@ -194,7 +194,7 @@ export function CollapsibleNavGroupEnabled({ const currentNavGroup = useObservable(observables.currentNavGroup$, undefined); const navLinksForRender: ChromeNavLink[] = useMemo(() => { - if (currentNavGroup) { + if (currentNavGroup && currentNavGroup.id !== ALL_USE_CASE_ID) { return fulfillRegistrationLinksToChromeNavLinks( navGroupsMap[currentNavGroup.id].navLinks || [], navLinks @@ -241,7 +241,10 @@ export function CollapsibleNavGroupEnabled({ label: group.title, order: group.order, }; - const linksForAllUseCaseWithinNavGroup = group.navLinks + const linksForAllUseCaseWithinNavGroup = fulfillRegistrationLinksToChromeNavLinks( + group.navLinks, + navLinks + ) .filter((navLink) => navLink.showInAllNavGroup) .map((navLink) => ({ ...navLink, @@ -263,18 +266,6 @@ export function CollapsibleNavGroupEnabled({ return fulfillRegistrationLinksToChromeNavLinks(navLinksForAll, navLinks); }, [navLinks, navGroupsMap, currentNavGroup]); - const isNavOpen = useMemo(() => { - // For now, only home page need to always collapse left navigation - // when workspace is enabled. - // If there are more pages need to collapse left navigation in the future - // need to come up with a mechanism to register. - if (capabilities.workspaces.enabled && appId === 'home') { - return false; - } - - return isNavOpenProps; - }, [isNavOpenProps, capabilities.workspaces.enabled, appId]); - const width = useMemo(() => { if (!isNavOpen) { return 50; diff --git a/src/core/public/chrome/ui/header/collapsible_nav_group_enabled_top.tsx b/src/core/public/chrome/ui/header/collapsible_nav_group_enabled_top.tsx index 9e89155a8e4..568290da727 100644 --- a/src/core/public/chrome/ui/header/collapsible_nav_group_enabled_top.tsx +++ b/src/core/public/chrome/ui/header/collapsible_nav_group_enabled_top.tsx @@ -18,6 +18,7 @@ import { i18n } from '@osd/i18n'; import { createEuiListItem } from './nav_link'; import { NavGroupItemInMap } from '../../nav_group'; import { ChromeNavLink } from '../../nav_links'; +import { ALL_USE_CASE_ID } from '../../../../../core/utils'; export interface CollapsibleNavTopProps { navLinks: ChromeNavLink[]; @@ -44,6 +45,7 @@ export const CollapsibleNavTop = ({ const shouldShowBackButton = useMemo( () => + currentNavGroup?.id !== ALL_USE_CASE_ID && !shouldShrinkNavigation && Object.values(navGroupsMap).filter((item) => !item.type).length > 1 && currentNavGroup, diff --git a/src/core/public/chrome/ui/header/header.test.tsx b/src/core/public/chrome/ui/header/header.test.tsx index 4e3539f2e53..bef0f152c6a 100644 --- a/src/core/public/chrome/ui/header/header.test.tsx +++ b/src/core/public/chrome/ui/header/header.test.tsx @@ -187,4 +187,22 @@ describe('Header', () => { expect(component.find('CollapsibleNavGroupEnabled').exists()).toBeTruthy(); }); + + it('show hide expand icon in top left navigation when workspace enabled + homepage + new navigation enabled', () => { + const branding = { + useExpandedHeader: false, + }; + const props = { + ...mockProps(), + branding, + }; + props.application.currentAppId$ = new BehaviorSubject('home'); + props.application.capabilities = { ...props.application.capabilities }; + (props.application.capabilities.workspaces as Record) = {}; + (props.application.capabilities.workspaces as Record).enabled = true; + + const component = mountWithIntl(
); + + expect(component.find('.header__toggleNavButtonSection').exists()).toBeFalsy(); + }); }); diff --git a/src/core/public/chrome/ui/header/header.tsx b/src/core/public/chrome/ui/header/header.tsx index dc161456ba8..adcbba00fe8 100644 --- a/src/core/public/chrome/ui/header/header.tsx +++ b/src/core/public/chrome/ui/header/header.tsx @@ -131,9 +131,17 @@ export function Header({ }: HeaderProps) { const isVisible = useObservable(observables.isVisible$, false); const isLocked = useObservable(observables.isLocked$, false); + const appId = useObservable(application.currentAppId$, ''); const [isNavOpen, setIsNavOpen] = useState(false); const sidecarConfig = useObservable(observables.sidecarConfig$, undefined); + /** + * This is a workaround on 2.16 to hide the navigation items within left navigation + * when user is in homepage with workspace enabled + new navigation enabled + */ + const shouldHideExpandIcon = + navGroupEnabled && appId === 'home' && application.capabilities.workspaces.enabled; + const sidecarPaddingStyle = useMemo(() => { return getOsdSidecarPaddingStyle(sidecarConfig); }, [sidecarConfig]); @@ -198,29 +206,31 @@ export function Header({ - - - + setIsNavOpen(!isNavOpen)} - aria-expanded={isNavOpen} - aria-pressed={isNavOpen} - aria-controls={navId} - ref={toggleCollapsibleNavRef} + delay="long" + position="bottom" > - - - - + setIsNavOpen(!isNavOpen)} + aria-expanded={isNavOpen} + aria-pressed={isNavOpen} + aria-controls={navId} + ref={toggleCollapsibleNavRef} + > + + + + + )} @@ -293,7 +303,7 @@ export function Header({ id={navId} isLocked={isLocked} navLinks$={observables.navLinks$} - isNavOpen={isNavOpen} + isNavOpen={shouldHideExpandIcon ? false : isNavOpen} basePath={basePath} navigateToApp={application.navigateToApp} navigateToUrl={application.navigateToUrl} diff --git a/src/plugins/advanced_settings/public/plugin.ts b/src/plugins/advanced_settings/public/plugin.ts index fefe3e39c77..73a1ce24411 100644 --- a/src/plugins/advanced_settings/public/plugin.ts +++ b/src/plugins/advanced_settings/public/plugin.ts @@ -34,6 +34,7 @@ import { FeatureCatalogueCategory } from '../../home/public'; import { ComponentRegistry } from './component_registry'; import { AdvancedSettingsSetup, AdvancedSettingsStart, AdvancedSettingsPluginSetup } from './types'; import { DEFAULT_NAV_GROUPS, AppNavLinkStatus, WorkspaceAvailability } from '../../../core/public'; +import { getScopedBreadcrumbs } from '../../opensearch_dashboards_react/public'; const component = new ComponentRegistry(); @@ -80,7 +81,8 @@ export class AdvancedSettingsPlugin { ...params, basePath: core.http.basePath.get(), - setBreadcrumbs: coreStart.chrome.setBreadcrumbs, + setBreadcrumbs: (breadCrumbs) => + coreStart.chrome.setBreadcrumbs(getScopedBreadcrumbs(breadCrumbs, params.history)), wrapInPage: true, }, component.start diff --git a/src/plugins/data_source_management/public/plugin.ts b/src/plugins/data_source_management/public/plugin.ts index c51be57e4bb..c384e30089f 100644 --- a/src/plugins/data_source_management/public/plugin.ts +++ b/src/plugins/data_source_management/public/plugin.ts @@ -50,6 +50,7 @@ import { import { AccelerationDetailsFlyout } from './components/direct_query_data_sources_components/acceleration_management/acceleration_details_flyout'; import { CreateAcceleration } from './components/direct_query_data_sources_components/acceleration_creation/create/create_acceleration'; import { AssociatedObjectsDetailsFlyout } from './components/direct_query_data_sources_components/associated_object_management/associated_objects_details_flyout'; +import { getScopedBreadcrumbs } from '../../opensearch_dashboards_react/public'; export const [ getRenderAccelerationDetailsFlyout, @@ -141,11 +142,6 @@ export class DataSourceManagementPlugin }, }); - // when the feature flag is disabled, we don't need to register any of the mds components - if (!this.featureFlagStatus) { - return undefined; - } - /** * The data sources features in observability has the same name as `DSM_APP_ID` * Add a suffix to avoid duplication @@ -166,7 +162,8 @@ export class DataSourceManagementPlugin { ...params, basePath: core.http.basePath.get(), - setBreadcrumbs: coreStart.chrome.setBreadcrumbs, + setBreadcrumbs: (breadCrumbs) => + coreStart.chrome.setBreadcrumbs(getScopedBreadcrumbs(breadCrumbs, params.history)), wrapInPage: true, }, this.authMethodsRegistry, @@ -224,6 +221,11 @@ export class DataSourceManagementPlugin }, ]); + // when the feature flag is disabled, we don't need to register any of the mds components + if (!this.featureFlagStatus) { + return undefined; + } + const registerAuthenticationMethod = (authMethod: AuthenticationMethod) => { if (this.started) { throw new Error( diff --git a/src/plugins/index_pattern_management/public/plugin.ts b/src/plugins/index_pattern_management/public/plugin.ts index ef462374129..36bc22c5d65 100644 --- a/src/plugins/index_pattern_management/public/plugin.ts +++ b/src/plugins/index_pattern_management/public/plugin.ts @@ -47,6 +47,7 @@ import { import { ManagementSetup } from '../../management/public'; import { DEFAULT_NAV_GROUPS, AppStatus, DEFAULT_APP_CATEGORIES } from '../../../core/public'; +import { getScopedBreadcrumbs } from '../../opensearch_dashboards_react/public'; export interface IndexPatternManagementSetupDependencies { management: ManagementSetup; @@ -148,7 +149,8 @@ export class IndexPatternManagementPlugin { ...params, basePath: core.http.basePath.get(), - setBreadcrumbs: coreStart.chrome.setBreadcrumbs, + setBreadcrumbs: (breadCrumbs) => + coreStart.chrome.setBreadcrumbs(getScopedBreadcrumbs(breadCrumbs, params.history)), wrapInPage: true, }, () => this.indexPatternManagementService.environmentService.getEnvironment().ml(), diff --git a/src/plugins/opensearch_dashboards_react/public/react_router_navigate/index.ts b/src/plugins/opensearch_dashboards_react/public/react_router_navigate/index.ts index 8ba6b1e2fe9..f5a3ecceac3 100644 --- a/src/plugins/opensearch_dashboards_react/public/react_router_navigate/index.ts +++ b/src/plugins/opensearch_dashboards_react/public/react_router_navigate/index.ts @@ -28,4 +28,8 @@ * under the License. */ -export { reactRouterNavigate, reactRouterOnClickHandler } from './react_router_navigate'; +export { + reactRouterNavigate, + reactRouterOnClickHandler, + getScopedBreadcrumbs, +} from './react_router_navigate'; diff --git a/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.test.tsx b/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.test.tsx new file mode 100644 index 00000000000..138e33906ac --- /dev/null +++ b/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.test.tsx @@ -0,0 +1,41 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { scopedHistoryMock } from '../../../../core/public/mocks'; +import { getScopedBreadcrumbs } from './react_router_navigate'; + +describe('getScopedBreadcrumbs', () => { + it('should return scoped bread crumbs when given an array', () => { + const history = scopedHistoryMock.create({ + pathname: '/base', + }); + history.createHref.mockImplementation((location) => `/base${location.pathname}`); + const scopedBreadcrumbs = getScopedBreadcrumbs( + [ + { + text: 'Home', + href: '/', + }, + { + text: 'Dashboard', + href: '/dashboard', + }, + ], + history + ); + expect(scopedBreadcrumbs[0]).toEqual( + expect.objectContaining({ + href: '/base/', + text: 'Home', + }) + ); + expect(scopedBreadcrumbs[1]).toEqual( + expect.objectContaining({ + href: '/base/dashboard', + text: 'Dashboard', + }) + ); + }); +}); diff --git a/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.tsx b/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.tsx index 5e367f8cb94..ae249bdadea 100644 --- a/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.tsx +++ b/src/plugins/opensearch_dashboards_react/public/react_router_navigate/react_router_navigate.tsx @@ -28,7 +28,7 @@ * under the License. */ -import { ScopedHistory } from 'opensearch-dashboards/public'; +import { ChromeBreadcrumb, ScopedHistory } from 'opensearch-dashboards/public'; import { History } from 'history'; interface LocationObject { @@ -79,3 +79,14 @@ export const reactRouterOnClickHandler = ( event.preventDefault(); history.push(toLocationObject(to)); }; + +export const getScopedBreadcrumbs = ( + crumbs: ChromeBreadcrumb[] = [], + appHistory: ScopedHistory +) => { + const wrapBreadcrumb = (item: ChromeBreadcrumb, scopedHistory: ScopedHistory) => ({ + ...item, + ...(item.href ? reactRouterNavigate(scopedHistory, item.href) : {}), + }); + return crumbs.map((item) => wrapBreadcrumb(item, appHistory)); +}; diff --git a/src/plugins/saved_objects_management/public/plugin.ts b/src/plugins/saved_objects_management/public/plugin.ts index 1247b56b555..8529a955568 100644 --- a/src/plugins/saved_objects_management/public/plugin.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -66,6 +66,7 @@ import { bootstrap } from './ui_actions_bootstrap'; import { DEFAULT_NAV_GROUPS, DEFAULT_APP_CATEGORIES } from '../../../core/public'; import { RecentWork } from './management_section/recent_work'; import { HOME_CONTENT_AREAS } from '../../../plugins/home/public'; +import { getScopedBreadcrumbs } from '../../opensearch_dashboards_react/public'; export interface SavedObjectsManagementPluginSetup { actions: SavedObjectsManagementActionServiceSetup; @@ -173,7 +174,8 @@ export class SavedObjectsManagementPlugin mountParams: { ...params, basePath: core.http.basePath.get(), - setBreadcrumbs: coreStart.chrome.setBreadcrumbs, + setBreadcrumbs: (breadCrumbs) => + coreStart.chrome.setBreadcrumbs(getScopedBreadcrumbs(breadCrumbs, params.history)), wrapInPage: true, }, dataSourceEnabled: !!dataSource, diff --git a/src/plugins/workspace/public/plugin.test.ts b/src/plugins/workspace/public/plugin.test.ts index 36226bbeca9..02d36297ca1 100644 --- a/src/plugins/workspace/public/plugin.test.ts +++ b/src/plugins/workspace/public/plugin.test.ts @@ -185,7 +185,7 @@ describe('Workspace plugin', () => { expect(setupMock.application.register).toHaveBeenCalledWith( expect.objectContaining({ id: 'workspace_detail', - navLinkStatus: AppNavLinkStatus.visible, + navLinkStatus: AppNavLinkStatus.hidden, }) ); diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index 5452bdd7f2f..dd4dc78fdf2 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -115,6 +115,12 @@ export class WorkspacePlugin if (app.id === 'home' && isAllUseCase) { return { navLinkStatus: AppNavLinkStatus.hidden }; } + + // show the overview page in all use case + if (app.id === WORKSPACE_DETAIL_APP_ID && isAllUseCase) { + return { navLinkStatus: AppNavLinkStatus.visible }; + } + if (isAppAccessibleInWorkspace(app, currentWorkspace, registeredUseCases)) { return; } @@ -334,9 +340,7 @@ export class WorkspacePlugin title: i18n.translate('workspace.settings.workspaceDetail', { defaultMessage: 'Workspace Detail', }), - navLinkStatus: core.chrome.navGroup.getNavGroupEnabled() - ? AppNavLinkStatus.visible - : AppNavLinkStatus.hidden, + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const { renderDetailApp } = await import('./application'); return mountWorkspaceApp(params, renderDetailApp); From 4e8d8ef1ab3d4ad0a8a585c8c5816acb74a5c493 Mon Sep 17 00:00:00 2001 From: yuboluo Date: Thu, 25 Jul 2024 01:39:01 +0800 Subject: [PATCH 5/9] [Bug][Data Source] Move data source manageable feature flag to DSM plugin (#7440) * Move data source manageable feature flag to DSM plugin Signed-off-by: yubonluo * Changeset file for PR #7440 created/updated --------- Signed-off-by: yubonluo Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com> (cherry picked from commit dfcd2e15d06e2db57c55c4a48e1d5abe68d28395) --- changelogs/fragments/7440.yml | 2 ++ config/opensearch_dashboards.yml | 2 +- .../data_source/common/data_sources/types.ts | 6 ---- src/plugins/data_source/config.ts | 4 --- src/plugins/data_source/server/plugin.ts | 21 ------------- .../data_source_management/common/index.ts | 1 + .../data_source_management/common/types.ts | 10 +++++++ src/plugins/data_source_management/config.ts | 15 ++++++++++ .../opensearch_dashboards.json | 3 +- .../data_source_management/server/index.ts | 7 ++++- .../data_source_management/server/plugin.ts | 30 ++++++++++++++++++- 11 files changed, 66 insertions(+), 35 deletions(-) create mode 100644 changelogs/fragments/7440.yml create mode 100644 src/plugins/data_source_management/common/types.ts create mode 100644 src/plugins/data_source_management/config.ts diff --git a/changelogs/fragments/7440.yml b/changelogs/fragments/7440.yml new file mode 100644 index 00000000000..9c314cc7263 --- /dev/null +++ b/changelogs/fragments/7440.yml @@ -0,0 +1,2 @@ +fix: +- [Bug][Data Source] Move data source manageable feature flag to DSM plugin ([#7440](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7440)) \ No newline at end of file diff --git a/config/opensearch_dashboards.yml b/config/opensearch_dashboards.yml index 0c3c82975e3..5e09c2359aa 100644 --- a/config/opensearch_dashboards.yml +++ b/config/opensearch_dashboards.yml @@ -325,7 +325,7 @@ # "none": The data source is readonly for all users. # "dashboard_admin": The data source can only be managed by dashboard admin. # "all": The data source can be managed by all users. Default to "all". -# data_source.manageableBy: "all" +# data_source_management.manageableBy: "all" # Set the value of this setting to false to hide the help menu link to the OpenSearch Dashboards user survey # opensearchDashboards.survey.url: "https://survey.opensearch.org" diff --git a/src/plugins/data_source/common/data_sources/types.ts b/src/plugins/data_source/common/data_sources/types.ts index bd147ac00c0..cde21f648c6 100644 --- a/src/plugins/data_source/common/data_sources/types.ts +++ b/src/plugins/data_source/common/data_sources/types.ts @@ -60,9 +60,3 @@ export enum DataSourceEngineType { Elasticsearch = 'Elasticsearch', NA = 'No Engine Type Available', } - -export enum ManageableBy { - All = 'all', - DashboardAdmin = 'dashboard_admin', - None = 'none', -} diff --git a/src/plugins/data_source/config.ts b/src/plugins/data_source/config.ts index 36c298cde11..30824b48625 100644 --- a/src/plugins/data_source/config.ts +++ b/src/plugins/data_source/config.ts @@ -59,10 +59,6 @@ export const configSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), }), }), - manageableBy: schema.oneOf( - [schema.literal('all'), schema.literal('dashboard_admin'), schema.literal('none')], - { defaultValue: 'all' } - ), }); export type DataSourcePluginConfigType = TypeOf; diff --git a/src/plugins/data_source/server/plugin.ts b/src/plugins/data_source/server/plugin.ts index fa3085a6393..bbf5a89d1b5 100644 --- a/src/plugins/data_source/server/plugin.ts +++ b/src/plugins/data_source/server/plugin.ts @@ -33,8 +33,6 @@ import { registerTestConnectionRoute } from './routes/test_connection'; import { registerFetchDataSourceMetaDataRoute } from './routes/fetch_data_source_metadata'; import { AuthenticationMethodRegistry, IAuthenticationMethodRegistry } from './auth_registry'; import { CustomApiSchemaRegistry } from './schema_registry'; -import { ManageableBy } from '../common/data_sources'; -import { getWorkspaceState } from '../../../../src/core/server/utils'; export class DataSourcePlugin implements Plugin { private readonly logger: Logger; @@ -83,25 +81,6 @@ export class DataSourcePlugin implements Plugin ({ - dataSource: { - canManage: false, - }, - })); - - core.capabilities.registerSwitcher((request) => { - const { requestWorkspaceId, isDashboardAdmin } = getWorkspaceState(request); - // User can not manage data source in the workspace. - const canManage = - (manageableBy === ManageableBy.All && !requestWorkspaceId) || - (manageableBy === ManageableBy.DashboardAdmin && - isDashboardAdmin !== false && - !requestWorkspaceId); - - return { dataSource: { canManage } }; - }); - core.logging.configure( this.config$.pipe( map((dataSourceConfig) => ({ diff --git a/src/plugins/data_source_management/common/index.ts b/src/plugins/data_source_management/common/index.ts index 980bf893945..2b9b3a4454b 100644 --- a/src/plugins/data_source_management/common/index.ts +++ b/src/plugins/data_source_management/common/index.ts @@ -6,3 +6,4 @@ export const PLUGIN_ID = 'dataSourceManagement'; export const PLUGIN_NAME = 'Data sources'; export const DEFAULT_DATA_SOURCE_UI_SETTINGS_ID = 'defaultDataSource'; +export * from './types'; diff --git a/src/plugins/data_source_management/common/types.ts b/src/plugins/data_source_management/common/types.ts new file mode 100644 index 00000000000..23b2f437e24 --- /dev/null +++ b/src/plugins/data_source_management/common/types.ts @@ -0,0 +1,10 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export enum ManageableBy { + All = 'all', + DashboardAdmin = 'dashboard_admin', + None = 'none', +} diff --git a/src/plugins/data_source_management/config.ts b/src/plugins/data_source_management/config.ts new file mode 100644 index 00000000000..1a56a126a94 --- /dev/null +++ b/src/plugins/data_source_management/config.ts @@ -0,0 +1,15 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { schema, TypeOf } from '@osd/config-schema'; + +export const configSchema = schema.object({ + manageableBy: schema.oneOf( + [schema.literal('all'), schema.literal('dashboard_admin'), schema.literal('none')], + { defaultValue: 'all' } + ), +}); + +export type ConfigSchema = TypeOf; diff --git a/src/plugins/data_source_management/opensearch_dashboards.json b/src/plugins/data_source_management/opensearch_dashboards.json index a8790d04823..fb37a16eea0 100644 --- a/src/plugins/data_source_management/opensearch_dashboards.json +++ b/src/plugins/data_source_management/opensearch_dashboards.json @@ -6,5 +6,6 @@ "requiredPlugins": ["management", "indexPatternManagement"], "optionalPlugins": ["dataSource"], "requiredBundles": ["opensearchDashboardsReact", "dataSource", "opensearchDashboardsUtils"], - "extraPublicDirs": ["public/components/utils"] + "extraPublicDirs": ["public/components/utils"], + "configPath": ["data_source_management"] } diff --git a/src/plugins/data_source_management/server/index.ts b/src/plugins/data_source_management/server/index.ts index bf4fb4377c9..f3d229ea3f1 100644 --- a/src/plugins/data_source_management/server/index.ts +++ b/src/plugins/data_source_management/server/index.ts @@ -3,7 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { PluginInitializerContext } from '../../../core/server'; +import { PluginConfigDescriptor, PluginInitializerContext } from '../../../core/server'; +import { ConfigSchema, configSchema } from '../config'; import { DataSourceManagementPlugin } from './plugin'; // This exports static code and TypeScript types, @@ -13,4 +14,8 @@ export function plugin(initializerContext: PluginInitializerContext) { return new DataSourceManagementPlugin(initializerContext); } +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + export { DataSourceManagementPluginSetup, DataSourceManagementPluginStart } from './types'; diff --git a/src/plugins/data_source_management/server/plugin.ts b/src/plugins/data_source_management/server/plugin.ts index 97ac8cacc23..de8dcf74cf9 100644 --- a/src/plugins/data_source_management/server/plugin.ts +++ b/src/plugins/data_source_management/server/plugin.ts @@ -5,6 +5,8 @@ // eslint-disable-next-line @osd/eslint/no-restricted-paths import { DataSourcePluginSetup } from 'src/plugins/data_source/server/types'; +import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; import { CoreSetup, CoreStart, @@ -18,6 +20,9 @@ import { setupRoutes } from './routes'; import { DataSourceManagementPluginSetup, DataSourceManagementPluginStart } from './types'; import { OpenSearchDataSourceManagementPlugin } from './adaptors/opensearch_data_source_management_plugin'; import { PPLPlugin } from './adaptors/ppl_plugin'; +import { ConfigSchema } from '../config'; +import { getWorkspaceState } from '../../../../src/core/server/utils'; +import { ManageableBy } from '../common'; export interface DataSourceManagementPluginDependencies { dataSource: DataSourcePluginSetup; @@ -25,13 +30,15 @@ export interface DataSourceManagementPluginDependencies { export class DataSourceManagementPlugin implements Plugin { + private readonly config$: Observable; private readonly logger: Logger; constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); + this.config$ = initializerContext.config.create(); } - public setup( + public async setup( core: CoreSetup, deps: { dataSource: DataSourceManagementPluginDependencies; @@ -39,6 +46,8 @@ export class DataSourceManagementPlugin ) { const { dataSource } = deps; + const config: ConfigSchema = await this.config$.pipe(first()).toPromise(); + const dataSourceEnabled = !!dataSource; const openSearchDataSourceManagementClient: ILegacyClusterClient = core.opensearch.legacy.createClient( @@ -51,6 +60,25 @@ export class DataSourceManagementPlugin this.logger.debug('dataSourceManagement: Setup'); const router = core.http.createRouter(); + const { manageableBy } = config; + core.capabilities.registerProvider(() => ({ + dataSource: { + canManage: false, + }, + })); + + core.capabilities.registerSwitcher((request) => { + const { requestWorkspaceId, isDashboardAdmin } = getWorkspaceState(request); + // User can not manage data source in the workspace. + const canManage = + (manageableBy === ManageableBy.All && !requestWorkspaceId) || + (manageableBy === ManageableBy.DashboardAdmin && + isDashboardAdmin !== false && + !requestWorkspaceId); + + return { dataSource: { canManage } }; + }); + if (dataSourceEnabled) { dataSource.registerCustomApiSchema(PPLPlugin); dataSource.registerCustomApiSchema(OpenSearchDataSourceManagementPlugin); From 45d4904a015ea96cb994042410a9d9bd70bf03f1 Mon Sep 17 00:00:00 2001 From: Kawika Avilla Date: Wed, 24 Jul 2024 13:56:33 -0700 Subject: [PATCH 6/9] [Discover-next] data set picker (#7426) * update using query manager Signed-off-by: Kawika Avilla * aggs not working Signed-off-by: Kawika Avilla * almost there Signed-off-by: Kawika Avilla * stablish Signed-off-by: Kawika Avilla * thanks ashwin Signed-off-by: Kawika Avilla * update ref name Signed-off-by: Kawika Avilla * fix timefields Signed-off-by: Kawika Avilla * clean up some console logs Signed-off-by: Kawika Avilla * go safer route of setting language Signed-off-by: Kawika Avilla * its working again Signed-off-by: Kawika Avilla * fix names Signed-off-by: Kawika Avilla * restore code editor and indices Signed-off-by: Kawika Avilla * sql df Signed-off-by: Kawika Avilla * fix external datasources again Signed-off-by: Kawika Avilla --------- Signed-off-by: Kawika Avilla (cherry picked from commit 6a079d3eb61e9e229457eba7d26213b50ee7a7c6) --- changelogs/fragments/7368.yml | 2 + package.json | 2 +- src/plugins/data/common/data_frames/utils.ts | 23 - .../utils => data/common/data_sets}/index.ts | 2 +- src/plugins/data/common/data_sets/types.ts | 38 + src/plugins/data/common/index.ts | 1 + .../index_patterns/index_patterns.ts | 6 +- .../common/search/opensearch_search/types.ts | 4 + .../search/search_source/search_source.ts | 11 +- src/plugins/data/common/types.ts | 1 + src/plugins/data/public/antlr/shared/utils.ts | 24 +- src/plugins/data/public/index.ts | 1 + .../dataset_manager/dataset_manager.mock.ts | 22 + .../dataset_manager/dataset_manager.test.ts | 33 + .../query/dataset_manager/dataset_manager.ts | 77 ++ .../public/query/dataset_manager/index.ts | 6 + src/plugins/data/public/query/index.tsx | 1 + .../data/public/query/query_service.ts | 17 +- .../state_sync/connect_to_query_state.ts | 65 +- .../create_global_query_observable.ts | 8 + .../query/state_sync/sync_state_with_url.ts | 12 +- .../data/public/query/state_sync/types.ts | 3 +- .../data/public/search/search_service.ts | 23 +- src/plugins/data/public/ui/_index.scss | 1 + .../dataset_navigator/_dataset_navigator.scss | 16 + .../public/ui/dataset_navigator/_index.scss | 1 + .../create_dataset_navigator.tsx | 26 + .../dataset_navigator/dataset_navigator.tsx | 736 ++++++++++++++++++ .../public/ui/dataset_navigator/index.tsx | 7 + .../lib/catalog_cache/cache_intercept.ts | 23 + .../lib/catalog_cache/cache_loader.tsx | 470 +++++++++++ .../lib/catalog_cache/cache_manager.ts | 416 ++++++++++ .../lib/catalog_cache/index.tsx | 8 + .../ui/dataset_navigator/lib/constants.ts | 101 +++ .../lib/hooks/direct_query_hook.tsx | 99 +++ .../ui/dataset_navigator/lib/hooks/index.tsx} | 2 +- .../public/ui/dataset_navigator/lib/index.tsx | 9 + .../dataset_navigator/lib/requests/index.tsx} | 2 +- .../ui/dataset_navigator/lib/requests/sql.ts | 60 ++ .../public/ui/dataset_navigator/lib/types.tsx | 330 ++++++++ .../lib/utils/fetch_catalog_cache_status.ts | 26 + .../lib/utils/fetch_data_sources.ts | 19 + .../lib/utils/fetch_external_data_sources.ts | 33 + .../lib/utils/fetch_index_patterns.ts | 34 + .../lib/utils/fetch_indices.ts | 46 ++ .../ui/dataset_navigator/lib/utils/index.ts | 13 + .../lib/utils/query_session_utils.ts | 16 + .../ui/dataset_navigator/lib/utils/shared.ts | 332 ++++++++ .../lib/utils/use_polling.ts | 137 ++++ src/plugins/data/public/ui/index.ts | 1 + .../ui/query_editor/_language_switcher.scss | 8 - .../public/ui/query_editor/_query_editor.scss | 6 + .../query_editor/language_selector.test.tsx | 1 - .../ui/query_editor/language_switcher.tsx | 102 --- .../public/ui/query_editor/query_editor.tsx | 86 +- .../ui/query_editor/query_editor_top_row.tsx | 13 +- .../ui/search_bar/create_search_bar.tsx | 19 +- .../ui/search_bar/lib/use_dataset_manager.ts | 39 + .../data/public/ui/search_bar/search_bar.tsx | 6 +- .../data/public/ui/settings/settings.ts | 4 +- src/plugins/data/public/ui/types.ts | 11 +- src/plugins/data/public/ui/ui_service.ts | 23 +- .../data/server/search/search_service.ts | 7 +- .../public/components/sidebar/index.tsx | 36 +- src/plugins/data_explorer/public/index.ts | 1 + .../utils/state_management/metadata_slice.ts | 7 +- .../public/utils/state_management/store.ts | 2 +- .../utils/state_management/index.ts | 3 +- .../utils/update_search_source.ts | 7 +- .../view_components/utils/use_search.ts | 4 +- .../opensearch_dashboards.json | 2 +- .../components/connections_bar.tsx | 94 --- .../public/data_source_connection/index.ts | 7 - .../utils/create_extension.tsx | 34 - .../query_enhancements/public/plugin.tsx | 87 +-- .../components/query_assist_bar.tsx | 4 +- .../query_assist/utils/create_extension.tsx | 4 +- .../query_enhancements/public/search/index.ts | 1 - .../public/search/ppl_search_interceptor.ts | 40 +- .../search/sql_async_search_interceptor.ts | 137 ---- .../public/search/sql_search_interceptor.ts | 115 ++- .../query_enhancements/public/services.ts | 11 - .../services/connections_service.ts | 4 +- .../public/services/index.ts | 13 + .../routes/data_source_connection/routes.ts | 5 +- .../search/sql_async_search_strategy.ts | 2 +- .../server/search/sql_search_strategy.ts | 2 +- .../query_enhancements/server/types.ts | 2 +- 88 files changed, 3583 insertions(+), 712 deletions(-) create mode 100644 changelogs/fragments/7368.yml rename src/plugins/{query_enhancements/public/data_source_connection/utils => data/common/data_sets}/index.ts (70%) create mode 100644 src/plugins/data/common/data_sets/types.ts create mode 100644 src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts create mode 100644 src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts create mode 100644 src/plugins/data/public/query/dataset_manager/dataset_manager.ts create mode 100644 src/plugins/data/public/query/dataset_manager/index.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss create mode 100644 src/plugins/data/public/ui/dataset_navigator/_index.scss create mode 100644 src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx create mode 100644 src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx create mode 100644 src/plugins/data/public/ui/dataset_navigator/index.tsx create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/constants.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx rename src/plugins/{query_enhancements/public/data_source_connection/components/index.ts => data/public/ui/dataset_navigator/lib/hooks/index.tsx} (61%) create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/index.tsx rename src/plugins/{query_enhancements/public/data_source_connection/services/index.ts => data/public/ui/dataset_navigator/lib/requests/index.tsx} (58%) create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/types.tsx create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts create mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts delete mode 100644 src/plugins/data/public/ui/query_editor/_language_switcher.scss delete mode 100644 src/plugins/data/public/ui/query_editor/language_switcher.tsx create mode 100644 src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts delete mode 100644 src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx delete mode 100644 src/plugins/query_enhancements/public/data_source_connection/index.ts delete mode 100644 src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx delete mode 100644 src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts delete mode 100644 src/plugins/query_enhancements/public/services.ts rename src/plugins/query_enhancements/public/{data_source_connection => }/services/connections_service.ts (95%) create mode 100644 src/plugins/query_enhancements/public/services/index.ts diff --git a/changelogs/fragments/7368.yml b/changelogs/fragments/7368.yml new file mode 100644 index 00000000000..c8316dc939f --- /dev/null +++ b/changelogs/fragments/7368.yml @@ -0,0 +1,2 @@ +feat: +- [Discover] Adds a dataset selector for Discover ([#7368](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7368)) \ No newline at end of file diff --git a/package.json b/package.json index 30cc500cdb6..e86a19ae5d7 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "start": "scripts/use_node scripts/opensearch_dashboards --dev", "start:docker": "scripts/use_node scripts/opensearch_dashboards --dev --opensearch.hosts=$OPENSEARCH_HOSTS --opensearch.ignoreVersionMismatch=true --server.host=$SERVER_HOST", "start:security": "scripts/use_node scripts/opensearch_dashboards --dev --security", - "start:enhancements": "scripts/use_node scripts/opensearch_dashboards --dev --uiSettings.overrides['query:enhancements:enabled']=true", + "start:enhancements": "scripts/use_node scripts/opensearch_dashboards --dev --uiSettings.overrides['query:enhancements:enabled']=true --uiSettings.overrides['home:useNewHomePage']=true", "debug": "scripts/use_node --nolazy --inspect scripts/opensearch_dashboards --dev", "debug-break": "scripts/use_node --nolazy --inspect-brk scripts/opensearch_dashboards --dev", "lint": "yarn run lint:es && yarn run lint:style", diff --git a/src/plugins/data/common/data_frames/utils.ts b/src/plugins/data/common/data_frames/utils.ts index 31df2626a98..0da02cda295 100644 --- a/src/plugins/data/common/data_frames/utils.ts +++ b/src/plugins/data/common/data_frames/utils.ts @@ -45,29 +45,6 @@ export const getRawQueryString = ( ); }; -/** - * Parses a raw query string and extracts the query string and data source. - * @param rawQueryString - The raw query string to parse. - * @returns An object containing the parsed query string and data source (if found). - */ -export const parseRawQueryString = (rawQueryString: string) => { - const rawDataSource = rawQueryString.match(/::(.*?)::/); - return { - qs: rawQueryString.replace(/::.*?::/, ''), - formattedQs(key: string = '.'): string { - const parts = rawQueryString.split('::'); - if (parts.length > 1) { - return (parts.slice(0, 1).join('') + parts.slice(1).join(key)).replace( - new RegExp(key + '$'), - '' - ); - } - return rawQueryString; - }, - ...(rawDataSource && { dataSource: rawDataSource[1] }), - }; -}; - /** * Returns the raw aggregations from the search request. * diff --git a/src/plugins/query_enhancements/public/data_source_connection/utils/index.ts b/src/plugins/data/common/data_sets/index.ts similarity index 70% rename from src/plugins/query_enhancements/public/data_source_connection/utils/index.ts rename to src/plugins/data/common/data_sets/index.ts index 9eccc9e6f35..9f269633f30 100644 --- a/src/plugins/query_enhancements/public/data_source_connection/utils/index.ts +++ b/src/plugins/data/common/data_sets/index.ts @@ -3,4 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -export * from './create_extension'; +export * from './types'; diff --git a/src/plugins/data/common/data_sets/types.ts b/src/plugins/data/common/data_sets/types.ts new file mode 100644 index 00000000000..23ab74bed03 --- /dev/null +++ b/src/plugins/data/common/data_sets/types.ts @@ -0,0 +1,38 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @public **/ +export enum SIMPLE_DATA_SOURCE_TYPES { + DEFAULT = 'data-source', + EXTERNAL = 'external-source', +} + +/** @public **/ +export enum SIMPLE_DATA_SET_TYPES { + INDEX_PATTERN = 'index-pattern', + TEMPORARY = 'temporary', + TEMPORARY_ASYNC = 'temporary-async', +} + +export interface SimpleObject { + id: string; + title?: string; + dataSourceRef?: SimpleDataSource; +} + +export interface SimpleDataSource { + id: string; + name: string; + indices?: SimpleObject[]; + tables?: SimpleObject[]; + type: SIMPLE_DATA_SOURCE_TYPES; +} + +export interface SimpleDataSet extends SimpleObject { + fields?: any[]; + timeFieldName?: string; + timeFields?: any[]; + type?: SIMPLE_DATA_SET_TYPES; +} diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index d7b7e56e228..0250a6ec2e0 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -31,6 +31,7 @@ export * from './constants'; export * from './opensearch_query'; export * from './data_frames'; +export * from './data_sets'; export * from './field_formats'; export * from './field_mapping'; export * from './index_patterns'; diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index 3d7bd8fbb4a..3d0dbe15dab 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -433,11 +433,13 @@ export class IndexPatternsService { /** * Get an index pattern by id. Cache optimized * @param id + * @param onlyCheckCache - Only check cache for index pattern if it doesn't exist it will not error out */ - get = async (id: string): Promise => { + get = async (id: string, onlyCheckCache: boolean = false): Promise => { const cache = indexPatternCache.get(id); - if (cache) { + + if (cache || onlyCheckCache) { return cache; } diff --git a/src/plugins/data/common/search/opensearch_search/types.ts b/src/plugins/data/common/search/opensearch_search/types.ts index f90a3f1de24..6d24e8c36dd 100644 --- a/src/plugins/data/common/search/opensearch_search/types.ts +++ b/src/plugins/data/common/search/opensearch_search/types.ts @@ -48,6 +48,10 @@ export interface ISearchOptions { * Use this option to enable support for long numerals. */ withLongNumeralsSupport?: boolean; + /** + * Use this option to enable support for async. + */ + isAsync?: boolean; } export type ISearchRequestParams> = { diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index d9518e6a6ca..da00e73f54f 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -94,7 +94,6 @@ import { convertResult, createDataFrame, getRawQueryString, - parseRawQueryString, } from '../../data_frames'; import { IOpenSearchSearchRequest, IOpenSearchSearchResponse, ISearchOptions } from '../..'; import { IOpenSearchDashboardsSearchRequest, IOpenSearchDashboardsSearchResponse } from '../types'; @@ -324,7 +323,12 @@ export class SearchSource { const dataFrame = createDataFrame({ name: searchRequest.index.title || searchRequest.index, fields: [], - ...(rawQueryString && { meta: { queryConfig: parseRawQueryString(rawQueryString) } }), + ...(rawQueryString && { + meta: { + queryConfig: { qs: rawQueryString }, + ...(searchRequest.dataSourceId && { dataSource: searchRequest.dataSourceId }), + }, + }), }); await this.setDataFrame(dataFrame); return this.getDataFrame(); @@ -426,7 +430,8 @@ export class SearchSource { private async fetchExternalSearch(searchRequest: SearchRequest, options: ISearchOptions) { const { search, getConfig, onResponse } = this.dependencies; - if (!this.getDataFrame()) { + const currentDataframe = this.getDataFrame(); + if (!currentDataframe || currentDataframe.name !== searchRequest.index?.id) { await this.createDataFrame(searchRequest); } diff --git a/src/plugins/data/common/types.ts b/src/plugins/data/common/types.ts index 6a1f6e5a99d..1670fbf72d5 100644 --- a/src/plugins/data/common/types.ts +++ b/src/plugins/data/common/types.ts @@ -35,6 +35,7 @@ export * from './query/types'; export * from './osd_field_types/types'; export * from './index_patterns/types'; export * from './data_frames/types'; +export * from './data_sets/types'; /** * If a service is being shared on both the client and the server, and diff --git a/src/plugins/data/public/antlr/shared/utils.ts b/src/plugins/data/public/antlr/shared/utils.ts index b2658b304e0..8be6e6524fc 100644 --- a/src/plugins/data/public/antlr/shared/utils.ts +++ b/src/plugins/data/public/antlr/shared/utils.ts @@ -12,7 +12,7 @@ export interface IDataSourceRequestHandlerParams { } export const getRawSuggestionData$ = ( - connectionsService, + connectionsService: any, dataSourceReuqstHandler: ({ dataSourceId, title, @@ -21,11 +21,11 @@ export const getRawSuggestionData$ = ( ) => connectionsService.getSelectedConnection$().pipe( distinctUntilChanged(), - switchMap((connection) => { + switchMap((connection: any) => { if (connection === undefined) { return from(defaultReuqstHandler()); } - const dataSourceId = connection?.id; + const dataSourceId = connection?.dataSource?.id; const title = connection?.attributes?.title; return from(dataSourceReuqstHandler({ dataSourceId, title })); }) @@ -34,8 +34,8 @@ export const getRawSuggestionData$ = ( export const fetchData = ( tables: string[], queryFormatter: (table: string, dataSourceId?: string, title?: string) => any, - api, - connectionService + api: any, + connectionService: any ): Promise => { return new Promise((resolve, reject) => { getRawSuggestionData$( @@ -65,8 +65,8 @@ export const fetchData = ( ); } ).subscribe({ - next: (dataFrames) => resolve(dataFrames), - error: (err) => { + next: (dataFrames: any) => resolve(dataFrames), + error: (err: any) => { // TODO: pipe error to UI reject(err); }, @@ -74,7 +74,11 @@ export const fetchData = ( }); }; -export const fetchTableSchemas = (tables: string[], api, connectionService): Promise => { +export const fetchTableSchemas = ( + tables: string[], + api: any, + connectionService: any +): Promise => { return fetchData( tables, (table, dataSourceId, title) => ({ @@ -96,8 +100,8 @@ export const fetchTableSchemas = (tables: string[], api, connectionService): Pro export const fetchColumnValues = ( tables: string[], column: string, - api, - connectionService + api: any, + connectionService: any ): Promise => { return fetchData( tables, diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index f1ac419e9ec..208359352e4 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -445,6 +445,7 @@ export { QueryEditorTopRow, // for BWC, keeping the old name IUiStart as DataPublicPluginStartUi, + DataSetNavigator, } from './ui'; /** diff --git a/src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts b/src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts new file mode 100644 index 00000000000..2f1f5144274 --- /dev/null +++ b/src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts @@ -0,0 +1,22 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { DataSetContract } from '.'; + +const createSetupContractMock = () => { + const dataSetManagerMock: jest.Mocked = { + init: jest.fn(), + getDataSet: jest.fn(), + setDataSet: jest.fn(), + getUpdates$: jest.fn(), + getDefaultDataSet: jest.fn(), + }; + return dataSetManagerMock; +}; + +export const dataSetManagerMock = { + createSetupContract: createSetupContractMock, + createStartContract: createSetupContractMock, +}; diff --git a/src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts b/src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts new file mode 100644 index 00000000000..fcf91e6b8f8 --- /dev/null +++ b/src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts @@ -0,0 +1,33 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { DataSetManager } from './dataset_manager'; +import { coreMock } from '../../../../../core/public/mocks'; +import { SimpleDataSet } from '../../../common/data_sets'; + +describe('DataSetManager', () => { + let service: DataSetManager; + + beforeEach(() => { + service = new DataSetManager(coreMock.createSetup().uiSettings); + }); + + test('getUpdates$ is a cold emits only after query changes', () => { + const obs$ = service.getUpdates$(); + const emittedValues: SimpleDataSet[] = []; + obs$.subscribe((v) => { + emittedValues.push(v!); + }); + expect(emittedValues).toHaveLength(0); + + const newDataSet: SimpleDataSet = { id: 'test_dataset', title: 'Test Dataset' }; + service.setDataSet(newDataSet); + expect(emittedValues).toHaveLength(1); + expect(emittedValues[0]).toEqual(newDataSet); + + service.setDataSet({ ...newDataSet }); + expect(emittedValues).toHaveLength(2); + }); +}); diff --git a/src/plugins/data/public/query/dataset_manager/dataset_manager.ts b/src/plugins/data/public/query/dataset_manager/dataset_manager.ts new file mode 100644 index 00000000000..018eba50ad7 --- /dev/null +++ b/src/plugins/data/public/query/dataset_manager/dataset_manager.ts @@ -0,0 +1,77 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { BehaviorSubject } from 'rxjs'; +import { skip } from 'rxjs/operators'; +import { CoreStart } from 'opensearch-dashboards/public'; +import { + IndexPatternsService, + SIMPLE_DATA_SET_TYPES, + SimpleDataSet, + SimpleDataSource, +} from '../../../common'; + +export class DataSetManager { + private dataSet$: BehaviorSubject; + private indexPatterns?: IndexPatternsService; + + constructor(private readonly uiSettings: CoreStart['uiSettings']) { + this.dataSet$ = new BehaviorSubject(undefined); + } + + public init = (indexPatterns: IndexPatternsService) => { + this.indexPatterns = indexPatterns; + }; + + public getUpdates$ = () => { + return this.dataSet$.asObservable().pipe(skip(1)); + }; + + public getDataSet = () => { + return this.dataSet$.getValue(); + }; + + /** + * Updates the query. + * @param {Query} query + */ + public setDataSet = (dataSet: SimpleDataSet | undefined) => { + this.dataSet$.next(dataSet); + }; + + public getDefaultDataSet = async (): Promise => { + const defaultIndexPatternId = await this.uiSettings.get('defaultIndex'); + if (!defaultIndexPatternId) { + return undefined; + } + + const indexPattern = await this.indexPatterns?.get(defaultIndexPatternId); + if (!indexPattern) { + return undefined; + } + + if (!indexPattern.id) { + return undefined; + } + + return { + id: indexPattern.id, + title: indexPattern.title, + type: SIMPLE_DATA_SET_TYPES.INDEX_PATTERN, + timeFieldName: indexPattern.timeFieldName, + ...(indexPattern.dataSourceRef + ? { + dataSourceRef: { + id: indexPattern.dataSourceRef?.id, + name: indexPattern.dataSourceRef?.name, + type: indexPattern.dataSourceRef?.type, + } as SimpleDataSource, + } + : {}), + }; + }; +} + +export type DataSetContract = PublicMethodsOf; diff --git a/src/plugins/data/public/query/dataset_manager/index.ts b/src/plugins/data/public/query/dataset_manager/index.ts new file mode 100644 index 00000000000..8a9a39b8112 --- /dev/null +++ b/src/plugins/data/public/query/dataset_manager/index.ts @@ -0,0 +1,6 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export { DataSetContract, DataSetManager } from './dataset_manager'; diff --git a/src/plugins/data/public/query/index.tsx b/src/plugins/data/public/query/index.tsx index 505f095aeda..42c6349bcc8 100644 --- a/src/plugins/data/public/query/index.tsx +++ b/src/plugins/data/public/query/index.tsx @@ -32,6 +32,7 @@ export * from './lib'; export * from './query_service'; export * from './filter_manager'; +export * from './dataset_manager'; export * from './timefilter'; export * from './saved_query'; export * from './persisted_log'; diff --git a/src/plugins/data/public/query/query_service.ts b/src/plugins/data/public/query/query_service.ts index 1b758d18bda..7d3bdca2f9b 100644 --- a/src/plugins/data/public/query/query_service.ts +++ b/src/plugins/data/public/query/query_service.ts @@ -37,7 +37,8 @@ import { TimefilterService, TimefilterSetup } from './timefilter'; import { createSavedQueryService } from './saved_query/saved_query_service'; import { createQueryStateObservable } from './state_sync/create_global_query_observable'; import { QueryStringManager, QueryStringContract } from './query_string'; -import { buildOpenSearchQuery, getOpenSearchQueryConfig } from '../../common'; +import { DataSetManager, DataSetContract } from './dataset_manager'; +import { buildOpenSearchQuery, getOpenSearchQueryConfig, IndexPatternsService } from '../../common'; import { getUiSettings } from '../services'; import { IndexPattern } from '..'; @@ -55,12 +56,14 @@ interface QueryServiceStartDependencies { savedObjectsClient: SavedObjectsClientContract; storage: IStorageWrapper; uiSettings: IUiSettingsClient; + indexPatterns: IndexPatternsService; } export class QueryService { filterManager!: FilterManager; timefilter!: TimefilterSetup; queryStringManager!: QueryStringContract; + dataSetManager!: DataSetContract; state$!: ReturnType; @@ -74,22 +77,31 @@ export class QueryService { }); this.queryStringManager = new QueryStringManager(storage, uiSettings); + this.dataSetManager = new DataSetManager(uiSettings); this.state$ = createQueryStateObservable({ filterManager: this.filterManager, timefilter: this.timefilter, queryString: this.queryStringManager, + dataSet: this.dataSetManager, }).pipe(share()); return { filterManager: this.filterManager, timefilter: this.timefilter, queryString: this.queryStringManager, + dataSet: this.dataSetManager, state$: this.state$, }; } - public start({ savedObjectsClient, storage, uiSettings }: QueryServiceStartDependencies) { + public start({ + savedObjectsClient, + storage, + uiSettings, + indexPatterns, + }: QueryServiceStartDependencies) { + this.dataSetManager.init(indexPatterns); return { addToQueryLog: createAddToQueryLog({ storage, @@ -97,6 +109,7 @@ export class QueryService { }), filterManager: this.filterManager, queryString: this.queryStringManager, + dataSet: this.dataSetManager, savedQueries: createSavedQueryService(savedObjectsClient), state$: this.state$, timefilter: this.timefilter, diff --git a/src/plugins/data/public/query/state_sync/connect_to_query_state.ts b/src/plugins/data/public/query/state_sync/connect_to_query_state.ts index 8b850b36eab..5db81e597b8 100644 --- a/src/plugins/data/public/query/state_sync/connect_to_query_state.ts +++ b/src/plugins/data/public/query/state_sync/connect_to_query_state.ts @@ -48,16 +48,21 @@ import { validateTimeRange } from '../timefilter'; * @param OsdUrlStateStorage to use for syncing and store data * @param syncConfig app filter and query */ -export const connectStorageToQueryState = ( +export const connectStorageToQueryState = async ( { + dataSet, filterManager, queryString, state$, - }: Pick, + }: Pick< + QueryStart | QuerySetup, + 'timefilter' | 'filterManager' | 'queryString' | 'dataSet' | 'state$' + >, OsdUrlStateStorage: IOsdUrlStateStorage, syncConfig: { filters: FilterStateStore; query: boolean; + dataSet?: boolean; } ) => { try { @@ -68,10 +73,14 @@ export const connectStorageToQueryState = ( if (syncConfig.filters === FilterStateStore.APP_STATE) { syncKeys.push('appFilters'); } + if (syncConfig.dataSet) { + syncKeys.push('dataSet'); + } const initialStateFromURL: QueryState = OsdUrlStateStorage.get('_q') ?? { query: queryString.getDefaultQuery(), filters: filterManager.getAppFilters(), + dataSet: await dataSet.getDefaultDataSet(), }; // set up initial '_q' flag in the URL to sync query and filter changes @@ -87,6 +96,17 @@ export const connectStorageToQueryState = ( } } + if (syncConfig.dataSet && !_.isEqual(initialStateFromURL.dataSet, dataSet.getDataSet())) { + if (initialStateFromURL.dataSet) { + dataSet.setDataSet(_.cloneDeep(initialStateFromURL.dataSet)); + } else { + const defaultDataSet = await dataSet.getDefaultDataSet(); + if (defaultDataSet) { + dataSet.setDataSet(defaultDataSet); + } + } + } + if (syncConfig.filters === FilterStateStore.APP_STATE) { if ( !initialStateFromURL.filters || @@ -119,6 +139,10 @@ export const connectStorageToQueryState = ( newState.filters = filterManager.getAppFilters(); } + if (syncConfig.dataSet && changes.dataSet) { + newState.dataSet = dataSet.getDataSet(); + } + return newState; }) ) @@ -143,19 +167,24 @@ export const connectStorageToQueryState = ( * @param QueryService: either setup or start * @param stateContainer to use for syncing */ -export const connectToQueryState = ( +export const connectToQueryState = async ( { timefilter: { timefilter }, filterManager, queryString, + dataSet, state$, - }: Pick, + }: Pick< + QueryStart | QuerySetup, + 'timefilter' | 'filterManager' | 'dataSet' | 'queryString' | 'state$' + >, stateContainer: BaseStateContainer, syncConfig: { time?: boolean; refreshInterval?: boolean; filters?: FilterStateStore | boolean; query?: boolean; + dataSet?: boolean; } ) => { const syncKeys: Array = []; @@ -181,6 +210,9 @@ export const connectToQueryState = ( break; } } + if (syncConfig.dataSet) { + syncKeys.push('dataSet'); + } // initial syncing // TODO: @@ -235,6 +267,11 @@ export const connectToQueryState = ( } } + if (syncConfig.dataSet && !initialState.dataSet) { + initialState.dataSet = await dataSet.getDefaultDataSet(); + initialDirty = true; + } + if (initialDirty) { stateContainer.set({ ...stateContainer.get(), ...initialState }); } @@ -272,13 +309,16 @@ export const connectToQueryState = ( newState.filters = filterManager.getAppFilters(); } } + if (syncConfig.dataSet && changes.dataSet) { + newState.dataSet = dataSet.getDataSet(); + } return newState; }) ) .subscribe((newState) => { stateContainer.set({ ...stateContainer.get(), ...newState }); }), - stateContainer.state$.subscribe((state) => { + stateContainer.state$.subscribe(async (state) => { updateInProgress = true; // cloneDeep is required because services are mutating passed objects @@ -331,6 +371,21 @@ export const connectToQueryState = ( } } + if (syncConfig.dataSet) { + const currentDataSet = dataSet.getDataSet(); + if (!_.isEqual(state.dataSet, currentDataSet)) { + if (state.dataSet) { + dataSet.setDataSet(state.dataSet); + } else { + const defaultDataSet = await dataSet.getDefaultDataSet(); + if (defaultDataSet) { + dataSet.setDataSet(defaultDataSet); + stateContainer.set({ ...stateContainer.get(), dataSet: defaultDataSet }); + } + } + } + } + updateInProgress = false; }), ]; diff --git a/src/plugins/data/public/query/state_sync/create_global_query_observable.ts b/src/plugins/data/public/query/state_sync/create_global_query_observable.ts index 8abcb3ece18..440ea836383 100644 --- a/src/plugins/data/public/query/state_sync/create_global_query_observable.ts +++ b/src/plugins/data/public/query/state_sync/create_global_query_observable.ts @@ -36,15 +36,18 @@ import { QueryState, QueryStateChange } from './index'; import { createStateContainer } from '../../../../opensearch_dashboards_utils/public'; import { isFilterPinned, compareFilters, COMPARE_ALL_OPTIONS } from '../../../common'; import { QueryStringContract } from '../query_string'; +import { DataSetContract } from '../dataset_manager'; export function createQueryStateObservable({ timefilter: { timefilter }, filterManager, queryString, + dataSet, }: { timefilter: TimefilterSetup; filterManager: FilterManager; queryString: QueryStringContract; + dataSet: DataSetContract; }): Observable<{ changes: QueryStateChange; state: QueryState }> { return new Observable((subscriber) => { const state = createStateContainer({ @@ -52,6 +55,7 @@ export function createQueryStateObservable({ refreshInterval: timefilter.getRefreshInterval(), filters: filterManager.getFilters(), query: queryString.getQuery(), + dataSet: dataSet.getDataSet(), }); let currentChange: QueryStateChange = {}; @@ -60,6 +64,10 @@ export function createQueryStateObservable({ currentChange.query = true; state.set({ ...state.get(), query: queryString.getQuery() }); }), + dataSet.getUpdates$().subscribe(() => { + currentChange.dataSet = true; + state.set({ ...state.get(), dataSet: dataSet.getDataSet() }); + }), timefilter.getTimeUpdate$().subscribe(() => { currentChange.time = true; state.set({ ...state.get(), time: timefilter.getTime() }); diff --git a/src/plugins/data/public/query/state_sync/sync_state_with_url.ts b/src/plugins/data/public/query/state_sync/sync_state_with_url.ts index 67245fd693a..3b92cff04d2 100644 --- a/src/plugins/data/public/query/state_sync/sync_state_with_url.ts +++ b/src/plugins/data/public/query/state_sync/sync_state_with_url.ts @@ -46,17 +46,22 @@ const GLOBAL_STATE_STORAGE_KEY = '_g'; * @param osdUrlStateStorage to use for syncing */ export const syncQueryStateWithUrl = ( - query: Pick, + query: Pick< + QueryStart | QuerySetup, + 'filterManager' | 'timefilter' | 'queryString' | 'dataSet' | 'state$' + >, osdUrlStateStorage: IOsdUrlStateStorage ) => { const { timefilter: { timefilter }, filterManager, + dataSet, } = query; const defaultState: QueryState = { time: timefilter.getTime(), refreshInterval: timefilter.getRefreshInterval(), filters: filterManager.getGlobalFilters(), + dataSet: dataSet.getDataSet(), }; // retrieve current state from `_g` url @@ -78,6 +83,7 @@ export const syncQueryStateWithUrl = ( refreshInterval: true, time: true, filters: FilterStateStore.GLOBAL_STATE, + dataSet: true, }); // if there weren't any initial state in url, @@ -107,8 +113,8 @@ export const syncQueryStateWithUrl = ( start(); return { - stop: () => { - stopSyncingWithStateContainer(); + stop: async () => { + (await stopSyncingWithStateContainer)(); stopSyncingWithUrl(); }, hasInheritedQueryFromUrl, diff --git a/src/plugins/data/public/query/state_sync/types.ts b/src/plugins/data/public/query/state_sync/types.ts index 0ee0ad1c463..8134a7208f1 100644 --- a/src/plugins/data/public/query/state_sync/types.ts +++ b/src/plugins/data/public/query/state_sync/types.ts @@ -28,7 +28,7 @@ * under the License. */ -import { Filter, RefreshInterval, TimeRange, Query } from '../../../common'; +import { Filter, RefreshInterval, TimeRange, Query, SimpleDataSet } from '../../../common'; /** * All query state service state @@ -38,6 +38,7 @@ export interface QueryState { refreshInterval?: RefreshInterval; filters?: Filter[]; query?: Query; + dataSet?: SimpleDataSet; } type QueryStateChangePartial = { diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 712f437d2e2..d2a2dd67a6b 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -64,6 +64,8 @@ import { createDataFrameCache, dataFrameToSpec, } from '../../common/data_frames'; +import { getQueryService, getUiService } from '../services'; +import { UI_SETTINGS } from '../../common'; /** @internal */ export interface SearchServiceSetupDependencies { @@ -133,7 +135,21 @@ export class SearchService implements Plugin { { fieldFormats, indexPatterns }: SearchServiceStartDependencies ): ISearchStart { const search = ((request, options) => { - return this.searchInterceptor.search(request, options); + const selectedLanguage = getQueryService().queryString.getQuery().language; + const uiService = getUiService(); + const enhancement = uiService.Settings.getQueryEnhancements(selectedLanguage); + uiService.Settings.setUiOverridesByUserQueryLanguage(selectedLanguage); + const isEnhancedEnabled = uiSettings.get(UI_SETTINGS.QUERY_ENHANCEMENTS_ENABLED); + + if (enhancement) { + if (!isEnhancedEnabled) { + notifications.toasts.addWarning( + `Query enhancements are disabled. Please enable to use: ${selectedLanguage}.` + ); + } + return enhancement.search.search(request, options); + } + return this.defaultSearchInterceptor.search(request, options); }) as ISearchGeneric; const loadingCount$ = new BehaviorSubject(0); @@ -156,7 +172,8 @@ export class SearchService implements Plugin { dataFrame.meta.queryConfig.dataSourceId = dataSource?.id; } this.dfCache.set(dataFrame); - const existingIndexPattern = indexPatterns.getByTitle(dataFrame.name!, true); + const dataSetName = `${dataFrame.meta?.queryConfig?.dataSourceId ?? ''}.${dataFrame.name}`; + const existingIndexPattern = await indexPatterns.get(dataSetName, true); const dataSet = await indexPatterns.create( dataFrameToSpec(dataFrame, existingIndexPattern?.id), !existingIndexPattern?.id @@ -166,8 +183,6 @@ export class SearchService implements Plugin { }, clear: () => { if (this.dfCache.get() === undefined) return; - // name because the id is not unique for temporary index pattern created - indexPatterns.clearCache(this.dfCache.get()!.name, false); this.dfCache.clear(); }, }; diff --git a/src/plugins/data/public/ui/_index.scss b/src/plugins/data/public/ui/_index.scss index f7c738b8d09..4aa425041f5 100644 --- a/src/plugins/data/public/ui/_index.scss +++ b/src/plugins/data/public/ui/_index.scss @@ -2,5 +2,6 @@ @import "./typeahead/index"; @import "./saved_query_management/index"; @import "./query_string_input/index"; +@import "./dataset_navigator/index"; @import "./query_editor/index"; @import "./shard_failure_modal/shard_failure_modal"; diff --git a/src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss b/src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss new file mode 100644 index 00000000000..73a8c871950 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss @@ -0,0 +1,16 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +.datasetNavigator { + min-width: 350px; + border-bottom: $euiBorderThin !important; +} + +.dataSetNavigatorFormWrapper { + padding: $euiSizeS; +} + +.dataSetNavigator__loading { + padding: $euiSizeS; +} diff --git a/src/plugins/data/public/ui/dataset_navigator/_index.scss b/src/plugins/data/public/ui/dataset_navigator/_index.scss new file mode 100644 index 00000000000..53acdffad43 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/_index.scss @@ -0,0 +1 @@ +@import "./dataset_navigator"; diff --git a/src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx b/src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx new file mode 100644 index 00000000000..c1ab4b3f846 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx @@ -0,0 +1,26 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { HttpStart, SavedObjectsClientContract } from 'opensearch-dashboards/public'; +import { DataSetNavigator, DataSetNavigatorProps } from './'; +import { DataSetContract } from '../../query'; + +// Updated function signature to include additional dependencies +export function createDataSetNavigator( + savedObjectsClient: SavedObjectsClientContract, + http: HttpStart, + dataSet: DataSetContract +) { + // Return a function that takes props, omitting the dependencies from the props type + return (props: Omit) => ( + + ); +} diff --git a/src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx b/src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx new file mode 100644 index 00000000000..ad4490ff134 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx @@ -0,0 +1,736 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useCallback, useEffect, useState } from 'react'; +import { + EuiButton, + EuiButtonEmpty, + EuiContextMenu, + EuiForm, + EuiFormRow, + EuiLoadingSpinner, + EuiPanel, + EuiPopover, + EuiSelect, +} from '@elastic/eui'; +import { HttpStart, SavedObjectsClientContract } from 'opensearch-dashboards/public'; +import _ from 'lodash'; +import { i18n } from '@osd/i18n'; +import { + SIMPLE_DATA_SET_TYPES, + SIMPLE_DATA_SOURCE_TYPES, + SimpleDataSet, + SimpleDataSource, + SimpleObject, +} from '../../../common'; +import { + useLoadDatabasesToCache, + useLoadExternalDataSourcesToCache, + useLoadTablesToCache, +} from './lib/catalog_cache/cache_loader'; +import { CatalogCacheManager } from './lib/catalog_cache/cache_manager'; +import { CachedDataSourceStatus, DirectQueryLoadingStatus } from './lib/types'; +import { + getIndexPatterns, + getNotifications, + getQueryService, + getSearchService, + getUiService, +} from '../../services'; +import { + fetchDataSources, + fetchIndexPatterns, + fetchIndices, + isCatalogCacheFetching, + fetchIfExternalDataSourcesEnabled, +} from './lib'; +import { useDataSetManager } from '../search_bar/lib/use_dataset_manager'; +import { DataSetContract } from '../../query'; + +export interface DataSetNavigatorProps { + savedObjectsClient?: SavedObjectsClientContract; + http?: HttpStart; + dataSet?: DataSetContract; +} + +interface DataSetNavigatorState { + isMounted: boolean; + isOpen: boolean; + isLoading: boolean; + isExternalDataSourcesEnabled: boolean; + indexPatterns: any[]; + dataSources: SimpleDataSource[]; + externalDataSources: SimpleDataSource[]; + cachedDatabases: any[]; + cachedTables: SimpleObject[]; +} + +interface SelectedDataSetState extends SimpleDataSet { + isExternal: boolean; + database?: any | undefined; +} + +export const DataSetNavigator = (props: DataSetNavigatorProps) => { + const { savedObjectsClient, http, dataSet: dataSetManager } = props; + const searchService = getSearchService(); + const queryService = getQueryService(); + const uiService = getUiService(); + const indexPatternsService = getIndexPatterns(); + const notifications = getNotifications(); + + const { dataSet } = useDataSetManager({ dataSetManager: dataSetManager! }); + + const [navigatorState, setNavigatorState] = useState({ + isOpen: false, + isLoading: false, + isMounted: false, + isExternalDataSourcesEnabled: false, + dataSources: [], + externalDataSources: [], + indexPatterns: [], + cachedDatabases: [], + cachedTables: [], + }); + + const [selectedDataSetState, setSelectedDataSetState] = useState({ + id: dataSet?.id ?? '', + title: dataSet?.title, + type: dataSet?.type, + isExternal: false, + dataSourceRef: dataSet?.dataSourceRef, + database: undefined, + timeFieldName: dataSet?.timeFieldName, + fields: dataSet?.fields, + }); + + const { + loadStatus: dataSourcesLoadStatus, + loadExternalDataSources: startLoadingDataSources, + } = useLoadExternalDataSourcesToCache(http!, notifications); + const { + loadStatus: databasesLoadStatus, + startLoading: startLoadingDatabases, + } = useLoadDatabasesToCache(http!, notifications); + const { loadStatus: tablesLoadStatus, startLoading: startLoadingTables } = useLoadTablesToCache( + http!, + notifications + ); + + const onClick = () => { + setNavigatorState((prevState) => ({ + ...prevState, + isOpen: !prevState.isOpen, + })); + }; + + const isLoading = (loading: boolean) => { + setNavigatorState((prevState) => ({ + ...prevState, + isLoading: loading, + })); + }; + + const closePopover = () => { + setNavigatorState((prevState) => ({ + ...prevState, + isOpen: false, + externalDataSources: [], + cachedDatabases: [], + cachedTables: [], + })); + }; + + const onRefresh = () => { + if (!isCatalogCacheFetching(dataSourcesLoadStatus) && navigatorState.dataSources.length > 0) { + startLoadingDataSources(navigatorState.dataSources.map((dataSource) => dataSource.id)); + } + }; + + useEffect(() => { + setNavigatorState((prevState) => ({ ...prevState, isMounted: true, isLoading: true })); + Promise.all([ + fetchIndexPatterns(savedObjectsClient!, ''), + fetchDataSources(savedObjectsClient!), + fetchIfExternalDataSourcesEnabled(http!), + ]) + .then(([indexPatterns, dataSources, isExternalDataSourcesEnabled]) => { + if (!navigatorState.isMounted) return; + setNavigatorState((prevState) => ({ + ...prevState, + isExternalDataSourcesEnabled, + indexPatterns, + dataSources, + })); + const selectedPattern = indexPatterns.find( + (pattern) => pattern.id === props.dataSet?.getDataSet()?.id + ); + if (selectedPattern) { + setSelectedDataSetState({ + id: selectedPattern.id, + title: selectedPattern.title, + type: SIMPLE_DATA_SET_TYPES.INDEX_PATTERN, + timeFieldName: selectedPattern.timeFieldName, + fields: selectedPattern.fields, + ...(selectedPattern.dataSourceRef + ? { + dataSourceRef: { + id: selectedPattern.dataSourceRef.id, + name: selectedPattern.dataSourceRef.name, + type: selectedPattern.dataSourceRef.type, + }, + } + : { dataSource: undefined }), + database: undefined, + isExternal: false, + }); + } + }) + .finally(() => { + isLoading(false); + }); + return () => { + setNavigatorState((prevState) => ({ ...prevState, isMounted: false })); + }; + }, [savedObjectsClient, http, navigatorState.isMounted, props.dataSet]); + + useEffect(() => { + const status = dataSourcesLoadStatus.toLowerCase(); + const externalDataSourcesCache = CatalogCacheManager.getExternalDataSourcesCache(); + if (status === DirectQueryLoadingStatus.SUCCESS) { + setNavigatorState((prevState) => ({ + ...prevState, + externalDataSources: externalDataSourcesCache.externalDataSources.map((ds) => ({ + id: ds.dataSourceRef, + name: ds.name, + type: SIMPLE_DATA_SOURCE_TYPES.EXTERNAL, + })), + })); + } else if ( + status === DirectQueryLoadingStatus.CANCELED || + status === DirectQueryLoadingStatus.FAILED + ) { + setNavigatorState((prevState) => ({ ...prevState, failed: true })); + } + }, [dataSourcesLoadStatus]); + + useEffect(() => { + const status = databasesLoadStatus.toLowerCase(); + if (selectedDataSetState.isExternal && selectedDataSetState.dataSourceRef) { + const dataSourceCache = CatalogCacheManager.getOrCreateDataSource( + selectedDataSetState.dataSourceRef.name, + selectedDataSetState.dataSourceRef.id + ); + if (status === DirectQueryLoadingStatus.SUCCESS) { + setNavigatorState((prevState) => ({ + ...prevState, + cachedDatabases: dataSourceCache.databases, + })); + } else if ( + status === DirectQueryLoadingStatus.CANCELED || + status === DirectQueryLoadingStatus.FAILED + ) { + setNavigatorState((prevState) => ({ ...prevState, failed: true })); + } + } + }, [databasesLoadStatus, selectedDataSetState.isExternal, selectedDataSetState.dataSourceRef]); + + const handleSelectExternalDataSource = useCallback( + async (dataSource) => { + if (selectedDataSetState.isExternal && dataSource) { + const dataSourceCache = CatalogCacheManager.getOrCreateDataSource( + dataSource.name, + dataSource.id + ); + if ( + (dataSourceCache.status === CachedDataSourceStatus.Empty || + dataSourceCache.status === CachedDataSourceStatus.Failed) && + !isCatalogCacheFetching(databasesLoadStatus) + ) { + await startLoadingDatabases({ + dataSourceName: dataSource.name, + dataSourceMDSId: dataSource.id, + }); + } else if (dataSourceCache.status === CachedDataSourceStatus.Updated) { + setNavigatorState((prevState) => ({ + ...prevState, + cachedDatabases: dataSourceCache.databases, + })); + setSelectedDataSetState((prevState) => ({ + ...prevState, + dataSource, + isExternal: true, + })); + } + } + }, + [databasesLoadStatus, selectedDataSetState.isExternal, startLoadingDatabases] + ); + + // Start loading tables for selected database + const handleSelectExternalDatabase = useCallback( + (externalDatabase: SimpleDataSource) => { + if (selectedDataSetState.dataSourceRef && externalDatabase) { + let databaseCache; + try { + databaseCache = CatalogCacheManager.getDatabase( + selectedDataSetState.dataSourceRef.name, + externalDatabase.name, + selectedDataSetState.dataSourceRef.id + ); + } catch (error) { + return; + } + if ( + databaseCache.status === CachedDataSourceStatus.Empty || + (databaseCache.status === CachedDataSourceStatus.Failed && + !isCatalogCacheFetching(tablesLoadStatus)) + ) { + startLoadingTables({ + dataSourceName: selectedDataSetState.dataSourceRef.name, + databaseName: externalDatabase.name, + dataSourceMDSId: selectedDataSetState.dataSourceRef.id, + }); + setSelectedDataSetState((prevState) => ({ + ...prevState, + database: externalDatabase, + })); + } else if (databaseCache.status === CachedDataSourceStatus.Updated) { + setNavigatorState((prevState) => ({ + ...prevState, + cachedTables: databaseCache.tables, + })); + } + } + }, + [selectedDataSetState.dataSourceRef, tablesLoadStatus, startLoadingTables] + ); + + // Retrieve tables from cache upon success + useEffect(() => { + if ( + selectedDataSetState.dataSourceRef && + selectedDataSetState.isExternal && + selectedDataSetState.database + ) { + const tablesStatus = tablesLoadStatus.toLowerCase(); + let databaseCache; + try { + databaseCache = CatalogCacheManager.getDatabase( + selectedDataSetState.dataSourceRef.name, + selectedDataSetState.database, + selectedDataSetState.dataSourceRef.id + ); + } catch (error) { + return; + } + if (tablesStatus === DirectQueryLoadingStatus.SUCCESS) { + setNavigatorState((prevState) => ({ + ...prevState, + cachedTables: databaseCache.tables, + })); + } else if ( + tablesStatus === DirectQueryLoadingStatus.CANCELED || + tablesStatus === DirectQueryLoadingStatus.FAILED + ) { + notifications.toasts.addWarning('Error loading tables'); + } + } + }, [ + tablesLoadStatus, + selectedDataSetState.dataSourceRef, + selectedDataSetState.isExternal, + selectedDataSetState.database, + notifications.toasts, + ]); + + const handleSelectedDataSource = useCallback( + async (source: SimpleDataSource) => { + if (source) { + isLoading(true); + const indices = await fetchIndices(searchService, source.id); + setSelectedDataSetState((prevState) => ({ + ...prevState, + isExternal: false, + dataSourceRef: { + ...source, + indices: indices.map((indexName: string) => ({ + id: indexName, + title: indexName, + dataSourceRef: { + id: source.id, + name: source.name, + type: source.type, + }, + })), + }, + })); + isLoading(false); + } + }, + [searchService] + ); + + const handleSelectedObject = useCallback( + async (object) => { + isLoading(true); + if (object) { + const fields = await indexPatternsService.getFieldsForWildcard({ + pattern: object.title, + dataSourceId: object.dataSourceRef?.id, + }); + + const timeFields = fields.filter((field: any) => field.type === 'date'); + const timeFieldName = timeFields?.length > 0 ? timeFields[0].name : undefined; + setSelectedDataSetState((prevState) => ({ + ...prevState, + id: object.id, + title: object.title, + fields, + timeFields, + timeFieldName, + type: SIMPLE_DATA_SET_TYPES.TEMPORARY, + })); + isLoading(false); + } + }, + [indexPatternsService] + ); + + const handleSelectedDataSet = useCallback( + async (ds?: SimpleDataSet) => { + const selectedDataSet = ds ?? selectedDataSetState; + if (!selectedDataSet || !selectedDataSet.id) return; + + const language = uiService.Settings.getUserQueryLanguage(); + const queryEnhancements = uiService.Settings.getQueryEnhancements(language); + const initialInput = queryEnhancements?.searchBar?.queryStringInput?.initialValue; + + // Update query + const query = initialInput + ? initialInput.replace('', selectedDataSet.title!) + : ''; + uiService.Settings.setUserQueryString(query); + queryService.queryString.setQuery({ query, language }); + + // Update dataset + queryService.dataSet.setDataSet(selectedDataSet); + + // Add to recent datasets + CatalogCacheManager.addRecentDataSet({ + id: selectedDataSet.id, + title: selectedDataSet.title ?? selectedDataSet.id!, + dataSourceRef: selectedDataSet.dataSourceRef, + timeFieldName: selectedDataSet.timeFieldName, + type: selectedDataSet.type, + }); + + // Update data set manager + dataSetManager!.setDataSet({ + id: selectedDataSet.id, + title: selectedDataSet.title, + dataSourceRef: selectedDataSet.dataSourceRef, + timeFieldName: selectedDataSet.timeFieldName, + type: selectedDataSet.type, + }); + + closePopover(); + }, + [ + dataSetManager, + queryService.dataSet, + queryService.queryString, + selectedDataSetState, + uiService.Settings, + ] + ); + + const indexPatternsLabel = i18n.translate('data.query.dataSetNavigator.indexPatternsName', { + defaultMessage: 'Index patterns', + }); + const indicesLabel = i18n.translate('data.query.dataSetNavigator.indicesName', { + defaultMessage: 'Indexes', + }); + const S3DataSourcesLabel = i18n.translate('data.query.dataSetNavigator.S3DataSourcesLabel', { + defaultMessage: 'S3', + }); + + const createRefreshButton = () => ( + + ); + + const createLoadingSpinner = () => ( + + + + ); + + const createIndexPatternsPanel = () => ({ + id: 1, + title: indexPatternsLabel, + items: navigatorState.indexPatterns.map((indexPattern) => ({ + name: indexPattern.title, + onClick: async () => await handleSelectedDataSet(indexPattern), + })), + content:
{navigatorState.indexPatterns.length === 0 && createLoadingSpinner()}
, + }); + + const createIndexesPanel = () => ({ + id: 2, + title: indicesLabel, + items: [ + ...navigatorState.dataSources.map((dataSource) => ({ + name: dataSource.name, + panel: 3, + onClick: async () => await handleSelectedDataSource(dataSource), + })), + ], + content:
{navigatorState.isLoading && createLoadingSpinner()}
, + }); + + const createDataSourcesPanel = () => ({ + id: 3, + title: selectedDataSetState.dataSourceRef?.name ?? indicesLabel, + items: selectedDataSetState.dataSourceRef?.indices?.map((object) => ({ + name: object.title, + panel: 7, + onClick: async () => + await handleSelectedObject({ ...object, type: SIMPLE_DATA_SET_TYPES.TEMPORARY }), + })), + content:
{navigatorState.isLoading && createLoadingSpinner()}
, + }); + + const createS3DataSourcesPanel = () => ({ + id: 4, + title: ( +
+ {S3DataSourcesLabel} + {CatalogCacheManager.getExternalDataSourcesCache().status === + CachedDataSourceStatus.Updated && createRefreshButton()} +
+ ), + items: [ + ...navigatorState.externalDataSources.map((dataSource) => ({ + name: dataSource.name, + onClick: async () => await handleSelectExternalDataSource(dataSource), + panel: 5, + })), + ], + content:
{dataSourcesLoadStatus && createLoadingSpinner()}
, + }); + + const createDatabasesPanel = () => ({ + id: 5, + title: selectedDataSetState.dataSourceRef?.name + ? selectedDataSetState.dataSourceRef?.name + : 'Databases', + items: [ + ...navigatorState.externalDataSources.map((db) => ({ + name: db.name, + onClick: async () => { + await handleSelectExternalDatabase(db); + }, + panel: 6, + })), + ], + content:
{isCatalogCacheFetching(databasesLoadStatus) && createLoadingSpinner()}
, + }); + + return ( + + {dataSet?.dataSourceRef?.name + ? `${dataSet.dataSourceRef?.name}::${dataSet?.title}` + : dataSet?.title} +
+ } + isOpen={navigatorState.isOpen} + closePopover={closePopover} + anchorPosition="downLeft" + panelPaddingSize="none" + > + 0 + ? [ + { + name: 'Recently Used', + panel: 8, + }, + ] + : []), + { + name: indexPatternsLabel, + panel: 1, + }, + { + name: indicesLabel, + panel: 2, + }, + ...(navigatorState.isExternalDataSourcesEnabled + ? [ + { + name: S3DataSourcesLabel, + panel: 4, + onClick: async () => { + const externalDataSourcesCache = CatalogCacheManager.getExternalDataSourcesCache(); + if ( + (externalDataSourcesCache.status === CachedDataSourceStatus.Empty || + externalDataSourcesCache.status === CachedDataSourceStatus.Failed) && + !isCatalogCacheFetching(dataSourcesLoadStatus) && + navigatorState.dataSources.length > 0 + ) { + startLoadingDataSources( + navigatorState.dataSources.map((dataSource) => dataSource.id) + ); + } else if ( + externalDataSourcesCache.status === CachedDataSourceStatus.Updated + ) { + setNavigatorState((prevState) => ({ + ...prevState, + externalDataSources: externalDataSourcesCache.externalDataSources.map( + (ds) => ({ + id: ds.name, + name: ds.name, + type: SIMPLE_DATA_SOURCE_TYPES.EXTERNAL, + }) + ), + })); + } + }, + }, + ] + : []), + ], + }, + createIndexPatternsPanel(), + createIndexesPanel(), + createDataSourcesPanel(), + createS3DataSourcesPanel(), + createDatabasesPanel(), + { + id: 6, + title: selectedDataSetState.database ? selectedDataSetState.database : 'Tables', + items: [ + ...navigatorState.cachedTables.map((table) => ({ + name: table.title, + onClick: async () => { + setSelectedDataSetState((prevState) => ({ + ...prevState, + object: { + id: `${selectedDataSetState.dataSourceRef!.name}.${ + selectedDataSetState.database + }.${table.title}`, + title: `${selectedDataSetState.dataSourceRef!.name}.${ + selectedDataSetState.database + }.${table.title}`, + dataSource: { + id: selectedDataSetState.dataSourceRef!.id, + name: selectedDataSetState.dataSourceRef!.name, + type: selectedDataSetState.dataSourceRef!.type, + }, + type: SIMPLE_DATA_SET_TYPES.TEMPORARY_ASYNC, + }, + })); + }, + })), + ], + content: ( +
{isCatalogCacheFetching(tablesLoadStatus) && createLoadingSpinner()}
+ ), + }, + { + id: 7, + title: selectedDataSetState.title, + content: + navigatorState.isLoading || !selectedDataSetState.title ? ( +
{createLoadingSpinner()}
+ ) : ( + + + 0 + ? [ + ...selectedDataSetState.timeFields!.map((field: any) => ({ + value: field.name, + text: field.name, + })), + ] + : []), + { value: 'no-time-filter', text: "I don't want to use a time filter" }, + ]} + onChange={(event) => { + setSelectedDataSetState((prevState) => ({ + ...prevState, + timeFieldName: + event.target.value !== 'no-time-filter' + ? event.target.value + : undefined, + })); + }} + aria-label="Select a date field" + /> + + { + await handleSelectedDataSet(); + }} + > + Select + + + ), + }, + { + id: 8, + title: 'Recently Used', + items: CatalogCacheManager.getRecentDataSets().map((ds) => ({ + name: ds.title, + onClick: async () => { + setSelectedDataSetState({ + id: ds.id ?? ds.title, + title: ds.title, + dataSourceRef: ds.dataSourceRef, + database: undefined, + isExternal: !ds.dataSourceRef?.type?.startsWith('data-source'), + timeFieldName: ds.timeFieldName, + }); + await handleSelectedDataSet(); + }, + })), + }, + ]} + /> + + ); +}; + +// eslint-disable-next-line import/no-default-export +export default DataSetNavigator; diff --git a/src/plugins/data/public/ui/dataset_navigator/index.tsx b/src/plugins/data/public/ui/dataset_navigator/index.tsx new file mode 100644 index 00000000000..e98e52c8421 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/index.tsx @@ -0,0 +1,7 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export { DataSetNavigator, DataSetNavigatorProps } from './dataset_navigator'; +export { createDataSetNavigator } from './create_dataset_navigator'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts new file mode 100644 index 00000000000..0526cfd5121 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts @@ -0,0 +1,23 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { HttpFetchOptionsWithPath, IHttpInterceptController } from 'opensearch-dashboards/public'; +import { SECURITY_DASHBOARDS_LOGOUT_URL } from '../constants'; +import { CatalogCacheManager } from './cache_manager'; + +export function catalogRequestIntercept(): any { + return ( + fetchOptions: Readonly, + _controller: IHttpInterceptController + ) => { + if (fetchOptions.path.includes(SECURITY_DASHBOARDS_LOGOUT_URL)) { + // Clears all user catalog cache details + CatalogCacheManager.clearDataSourceCache(); + CatalogCacheManager.clearAccelerationsCache(); + CatalogCacheManager.clearExternalDataSourcesCache(); + CatalogCacheManager.clearRecentDataSetsCache(); + } + }; +} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx new file mode 100644 index 00000000000..9a42bfc74aa --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx @@ -0,0 +1,470 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useEffect, useRef, useState } from 'react'; +import { HttpStart, NotificationsStart } from 'opensearch-dashboards/public'; +import { ASYNC_POLLING_INTERVAL, SPARK_HIVE_TABLE_REGEX, SPARK_PARTITION_INFO } from '../constants'; +import { + AsyncPollingResult, + CachedColumn, + CachedDataSourceStatus, + CachedTable, + LoadCacheType, + StartLoadingParams, + DirectQueryLoadingStatus, + DirectQueryRequest, +} from '../types'; +import { getAsyncSessionId, setAsyncSessionId } from '../utils/query_session_utils'; +import { + addBackticksIfNeeded, + combineSchemaAndDatarows, + get as getObjValue, + formatError, +} from '../utils/shared'; +import { usePolling } from '../utils/use_polling'; +import { SQLService } from '../requests/sql'; +import { CatalogCacheManager } from './cache_manager'; +import { fetchExternalDataSources } from '../utils'; + +export const updateDatabasesToCache = ( + dataSourceName: string, + pollingResult: AsyncPollingResult, + dataSourceMDSId?: string +) => { + const cachedDataSource = CatalogCacheManager.getOrCreateDataSource( + dataSourceName, + dataSourceMDSId + ); + + const currentTime = new Date().toUTCString(); + + if (!pollingResult) { + CatalogCacheManager.addOrUpdateDataSource( + { + ...cachedDataSource, + databases: [], + lastUpdated: currentTime, + status: CachedDataSourceStatus.Failed, + ...(dataSourceMDSId && { dataSourceMDSId }), + }, + dataSourceMDSId + ); + return; + } + + const combinedData = combineSchemaAndDatarows(pollingResult.schema, pollingResult.datarows); + const newDatabases = combinedData.map((row: any) => ({ + name: row.namespace, + tables: [], + lastUpdated: '', + status: CachedDataSourceStatus.Empty, + })); + + CatalogCacheManager.addOrUpdateDataSource( + { + ...cachedDataSource, + databases: newDatabases, + lastUpdated: currentTime, + status: CachedDataSourceStatus.Updated, + ...(dataSourceMDSId && { dataSourceMDSId }), + }, + dataSourceMDSId + ); +}; + +export const updateTablesToCache = ( + dataSourceName: string, + databaseName: string, + pollingResult: AsyncPollingResult, + dataSourceMDSId?: string +) => { + try { + const cachedDatabase = CatalogCacheManager.getDatabase( + dataSourceName, + databaseName, + dataSourceMDSId + ); + const currentTime = new Date().toUTCString(); + + if (!pollingResult) { + CatalogCacheManager.updateDatabase( + dataSourceName, + { + ...cachedDatabase, + tables: [], + lastUpdated: currentTime, + status: CachedDataSourceStatus.Failed, + }, + dataSourceMDSId + ); + return; + } + + const combinedData = combineSchemaAndDatarows(pollingResult.schema, pollingResult.datarows); + const newTables = combinedData + .filter((row: any) => !SPARK_HIVE_TABLE_REGEX.test(row.information)) + .map((row: any) => ({ + name: row.tableName, + })); + + CatalogCacheManager.updateDatabase( + dataSourceName, + { + ...cachedDatabase, + tables: newTables, + lastUpdated: currentTime, + status: CachedDataSourceStatus.Updated, + }, + dataSourceMDSId + ); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } +}; + +export const updateAccelerationsToCache = ( + dataSourceName: string, + pollingResult: AsyncPollingResult, + dataSourceMDSId?: string +) => { + const currentTime = new Date().toUTCString(); + + if (!pollingResult) { + CatalogCacheManager.addOrUpdateAccelerationsByDataSource({ + name: dataSourceName, + accelerations: [], + lastUpdated: currentTime, + status: CachedDataSourceStatus.Failed, + ...(dataSourceMDSId && { dataSourceMDSId }), + }); + return; + } + + const combinedData = combineSchemaAndDatarows(pollingResult.schema, pollingResult.datarows); + + const newAccelerations: any[] = combinedData.map((row: any) => ({ + flintIndexName: row.flint_index_name, + type: row.kind === 'mv' ? 'materialized' : row.kind, + database: row.database, + table: row.table, + indexName: row.index_name, + autoRefresh: row.auto_refresh, + status: row.status, + })); + + CatalogCacheManager.addOrUpdateAccelerationsByDataSource({ + name: dataSourceName, + accelerations: newAccelerations, + lastUpdated: currentTime, + status: CachedDataSourceStatus.Updated, + ...(dataSourceMDSId && { dataSourceMDSId }), + }); +}; + +export const updateTableColumnsToCache = ( + dataSourceName: string, + databaseName: string, + tableName: string, + pollingResult: AsyncPollingResult, + dataSourceMDSId?: string +) => { + try { + if (!pollingResult) { + return; + } + const cachedDatabase = CatalogCacheManager.getDatabase( + dataSourceName, + databaseName, + dataSourceMDSId + ); + const currentTime = new Date().toUTCString(); + + const combinedData: Array<{ col_name: string; data_type: string }> = combineSchemaAndDatarows( + pollingResult.schema, + pollingResult.datarows + ); + + const tableColumns: CachedColumn[] = []; + for (const row of combinedData) { + if (row.col_name === SPARK_PARTITION_INFO) { + break; + } + tableColumns.push({ + fieldName: row.col_name, + dataType: row.data_type, + }); + } + + const newTables: CachedTable[] = cachedDatabase.tables.map((ts) => + ts.name === tableName ? { ...ts, columns: tableColumns } : { ...ts } + ); + + if (cachedDatabase.status === CachedDataSourceStatus.Updated) { + CatalogCacheManager.updateDatabase( + dataSourceName, + { + ...cachedDatabase, + tables: newTables, + lastUpdated: currentTime, + status: CachedDataSourceStatus.Updated, + }, + dataSourceMDSId + ); + } + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } +}; + +export const updateToCache = ( + pollResults: any, + loadCacheType: LoadCacheType, + dataSourceName: string, + databaseName?: string, + tableName?: string, + dataSourceMDSId?: string +) => { + switch (loadCacheType) { + case 'databases': + updateDatabasesToCache(dataSourceName, pollResults, dataSourceMDSId); + break; + case 'tables': + updateTablesToCache(dataSourceName, databaseName!, pollResults, dataSourceMDSId); + break; + case 'accelerations': + updateAccelerationsToCache(dataSourceName, pollResults, dataSourceMDSId); + break; + case 'tableColumns': + updateTableColumnsToCache( + dataSourceName, + databaseName!, + tableName!, + pollResults, + dataSourceMDSId + ); + default: + break; + } +}; + +export const createLoadQuery = ( + loadCacheType: LoadCacheType, + dataSourceName: string, + databaseName?: string, + tableName?: string +) => { + let query; + switch (loadCacheType) { + case 'databases': + query = `SHOW SCHEMAS IN ${addBackticksIfNeeded(dataSourceName)}`; + break; + case 'tables': + query = `SHOW TABLE EXTENDED IN ${addBackticksIfNeeded( + dataSourceName + )}.${addBackticksIfNeeded(databaseName!)} LIKE '*'`; + break; + case 'accelerations': + query = `SHOW FLINT INDEX in ${addBackticksIfNeeded(dataSourceName)}`; + break; + case 'tableColumns': + query = `DESC ${addBackticksIfNeeded(dataSourceName)}.${addBackticksIfNeeded( + databaseName! + )}.${addBackticksIfNeeded(tableName!)}`; + break; + default: + query = ''; + break; + } + return query; +}; + +export const useLoadToCache = ( + loadCacheType: LoadCacheType, + http: HttpStart, + notifications: NotificationsStart +) => { + const sqlService = new SQLService(http); + const [currentDataSourceName, setCurrentDataSourceName] = useState(''); + const [currentDatabaseName, setCurrentDatabaseName] = useState(''); + const [currentTableName, setCurrentTableName] = useState(''); + const [loadStatus, setLoadStatus] = useState( + DirectQueryLoadingStatus.INITIAL + ); + const dataSourceMDSClientId = useRef(''); + + const { + data: pollingResult, + loading: _pollingLoading, + error: pollingError, + startPolling, + stopPolling: stopLoading, + } = usePolling((params) => { + return sqlService.fetchWithJobId(params, dataSourceMDSClientId.current); + }, ASYNC_POLLING_INTERVAL); + + const onLoadingFailed = () => { + setLoadStatus(DirectQueryLoadingStatus.FAILED); + updateToCache( + null, + loadCacheType, + currentDataSourceName, + currentDatabaseName, + currentTableName, + dataSourceMDSClientId.current + ); + }; + + const startLoading = async ({ + dataSourceName, + dataSourceMDSId, + databaseName, + tableName, + }: StartLoadingParams) => { + setLoadStatus(DirectQueryLoadingStatus.SCHEDULED); + setCurrentDataSourceName(dataSourceName); + setCurrentDatabaseName(databaseName); + setCurrentTableName(tableName); + dataSourceMDSClientId.current = dataSourceMDSId || ''; + + let requestPayload: DirectQueryRequest = { + lang: 'sql', + query: createLoadQuery(loadCacheType, dataSourceName, databaseName, tableName), + datasource: dataSourceName, + }; + + const sessionId = getAsyncSessionId(dataSourceName); + if (sessionId) { + requestPayload = { ...requestPayload, sessionId }; + } + await sqlService + .fetch(requestPayload, dataSourceMDSId) + .then((result) => { + setAsyncSessionId(dataSourceName, getObjValue(result, 'sessionId', null)); + if (result.queryId) { + startPolling({ + queryId: result.queryId, + }); + } else { + // eslint-disable-next-line no-console + console.error('No query id found in response'); + onLoadingFailed(); + } + }) + .catch((e) => { + onLoadingFailed(); + const formattedError = formatError( + '', + 'The query failed to execute and the operation could not be complete.', + e.body?.message + ); + notifications.toasts.addError(formattedError, { + title: 'Query Failed', + }); + // eslint-disable-next-line no-console + console.error(e); + }); + }; + + useEffect(() => { + // cancel direct query + if (!pollingResult) return; + const { status: anyCaseStatus, datarows, error } = pollingResult; + const status = anyCaseStatus?.toLowerCase(); + + if (status === DirectQueryLoadingStatus.SUCCESS || datarows) { + setLoadStatus(status); + stopLoading(); + updateToCache( + pollingResult, + loadCacheType, + currentDataSourceName, + currentDatabaseName, + currentTableName, + dataSourceMDSClientId.current + ); + } else if (status === DirectQueryLoadingStatus.FAILED) { + onLoadingFailed(); + stopLoading(); + + const formattedError = formatError( + '', + 'The query failed to execute and the operation could not be complete.', + error + ); + notifications.toasts.addError(formattedError, { + title: 'Query Failed', + }); + } else { + setLoadStatus(status); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pollingResult, pollingError]); + + return { loadStatus, startLoading, stopLoading }; +}; + +export const useLoadDatabasesToCache = (http: HttpStart, notifications: NotificationsStart) => { + const { loadStatus, startLoading, stopLoading } = useLoadToCache( + 'databases', + http, + notifications + ); + return { loadStatus, startLoading, stopLoading }; +}; + +export const useLoadTablesToCache = (http: HttpStart, notifications: NotificationsStart) => { + const { loadStatus, startLoading, stopLoading } = useLoadToCache('tables', http, notifications); + return { loadStatus, startLoading, stopLoading }; +}; + +export const useLoadTableColumnsToCache = (http: HttpStart, notifications: NotificationsStart) => { + const { loadStatus, startLoading, stopLoading } = useLoadToCache( + 'tableColumns', + http, + notifications + ); + return { loadStatus, startLoading, stopLoading }; +}; + +export const useLoadAccelerationsToCache = (http: HttpStart, notifications: NotificationsStart) => { + const { loadStatus, startLoading, stopLoading } = useLoadToCache( + 'accelerations', + http, + notifications + ); + return { loadStatus, startLoading, stopLoading }; +}; + +export const useLoadExternalDataSourcesToCache = ( + http: HttpStart, + notifications: NotificationsStart +) => { + const [loadStatus, setLoadStatus] = useState( + DirectQueryLoadingStatus.INITIAL + ); + + const loadExternalDataSources = async (connectedClusters: string[]) => { + setLoadStatus(DirectQueryLoadingStatus.SCHEDULED); + CatalogCacheManager.setExternalDataSourcesLoadingStatus(CachedDataSourceStatus.Empty); + + try { + const externalDataSources = await fetchExternalDataSources(http, connectedClusters); + CatalogCacheManager.updateExternalDataSources(externalDataSources); + setLoadStatus(DirectQueryLoadingStatus.SUCCESS); + CatalogCacheManager.setExternalDataSourcesLoadingStatus(CachedDataSourceStatus.Updated); + } catch (error) { + setLoadStatus(DirectQueryLoadingStatus.FAILED); + CatalogCacheManager.setExternalDataSourcesLoadingStatus(CachedDataSourceStatus.Failed); + notifications.toasts.addError(error, { + title: 'Failed to load external datasources', + }); + } + }; + + return { loadStatus, loadExternalDataSources }; +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts new file mode 100644 index 00000000000..3d0a8e0c982 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts @@ -0,0 +1,416 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + ASYNC_QUERY_EXTERNAL_DATASOURCES_CACHE, + CATALOG_CACHE_VERSION, + RECENT_DATASET_OPTIONS_CACHE, +} from '../constants'; +import { ASYNC_QUERY_ACCELERATIONS_CACHE, ASYNC_QUERY_DATASOURCE_CACHE } from '../utils/shared'; +import { + AccelerationsCacheData, + CachedAccelerationByDataSource, + CachedDataSource, + CachedDataSourceStatus, + CachedDatabase, + DataSetOption, + DataSourceCacheData, + ExternalDataSource, + ExternalDataSourcesCacheData, + RecentDataSetOptionsCacheData, +} from '../types'; +import { SimpleDataSet, SimpleObject } from '../../../../../common'; + +/** + * Manages caching for catalog data including data sources and accelerations. + */ +export class CatalogCacheManager { + /** + * Key for the data source cache in local storage. + */ + private static readonly datasourceCacheKey = ASYNC_QUERY_DATASOURCE_CACHE; + + /** + * Key for the accelerations cache in local storage. + */ + private static readonly accelerationsCacheKey = ASYNC_QUERY_ACCELERATIONS_CACHE; + + /** + * Key for external datasources cache in local storage + */ + private static readonly externalDataSourcesCacheKey = ASYNC_QUERY_EXTERNAL_DATASOURCES_CACHE; + + /** + * Key for recently selected datasets in local storage + */ + private static readonly recentDataSetCacheKey = RECENT_DATASET_OPTIONS_CACHE; + + // TODO: make this an advanced setting + private static readonly maxRecentDataSet = 4; + + /** + * Saves data source cache to local storage. + * @param {DataSourceCacheData} cacheData - The data source cache data to save. + */ + static saveDataSourceCache(cacheData: DataSourceCacheData): void { + sessionStorage.setItem(this.datasourceCacheKey, JSON.stringify(cacheData)); + } + + /** + * Retrieves data source cache from local storage. + * @returns {DataSourceCacheData} The retrieved data source cache. + */ + static getDataSourceCache(): DataSourceCacheData { + const catalogData = sessionStorage.getItem(this.datasourceCacheKey); + + if (catalogData) { + return JSON.parse(catalogData); + } else { + const defaultCacheObject = { version: CATALOG_CACHE_VERSION, dataSources: [] }; + this.saveDataSourceCache(defaultCacheObject); + return defaultCacheObject; + } + } + + /** + * Saves accelerations cache to local storage. + * @param {AccelerationsCacheData} cacheData - The accelerations cache data to save. + */ + static saveAccelerationsCache(cacheData: AccelerationsCacheData): void { + sessionStorage.setItem(this.accelerationsCacheKey, JSON.stringify(cacheData)); + } + + /** + * Retrieves accelerations cache from local storage. + * @returns {AccelerationsCacheData} The retrieved accelerations cache. + */ + static getAccelerationsCache(): AccelerationsCacheData { + const accelerationCacheData = sessionStorage.getItem(this.accelerationsCacheKey); + + if (accelerationCacheData) { + return JSON.parse(accelerationCacheData); + } else { + const defaultCacheObject = { + version: CATALOG_CACHE_VERSION, + dataSources: [], + }; + this.saveAccelerationsCache(defaultCacheObject); + return defaultCacheObject; + } + } + + /** + * Adds or updates a data source in the accelerations cache. + * @param {CachedAccelerationByDataSource} dataSource - The data source to add or update. + */ + static addOrUpdateAccelerationsByDataSource( + dataSource: CachedAccelerationByDataSource, + dataSourceMDSId?: string + ): void { + let index = -1; + const accCacheData = this.getAccelerationsCache(); + if (dataSourceMDSId) { + index = accCacheData.dataSources.findIndex( + (ds: CachedAccelerationByDataSource) => + ds.name === dataSource.name && ds.dataSourceMDSId === dataSourceMDSId + ); + } else { + index = accCacheData.dataSources.findIndex( + (ds: CachedAccelerationByDataSource) => ds.name === dataSource.name + ); + } + if (index !== -1) { + accCacheData.dataSources[index] = dataSource; + } else { + accCacheData.dataSources.push(dataSource); + } + this.saveAccelerationsCache(accCacheData); + } + + /** + * Retrieves accelerations cache from local storage by the datasource name. + * @param {string} dataSourceName - The name of the data source. + * @returns {CachedAccelerationByDataSource} The retrieved accelerations by datasource in cache. + * @throws {Error} If the data source is not found. + */ + static getOrCreateAccelerationsByDataSource( + dataSourceName: string, + dataSourceMDSId?: string + ): CachedAccelerationByDataSource { + const accCacheData = this.getAccelerationsCache(); + let cachedDataSource; + if (dataSourceMDSId) { + cachedDataSource = accCacheData.dataSources.find( + (ds) => ds.name === dataSourceName && ds.dataSourceMDSId === dataSourceMDSId + ); + } else { + cachedDataSource = accCacheData.dataSources.find((ds) => ds.name === dataSourceName); + } + if (cachedDataSource) return cachedDataSource; + else { + let defaultDataSourceObject: CachedAccelerationByDataSource = { + name: dataSourceName, + lastUpdated: '', + status: CachedDataSourceStatus.Empty, + accelerations: [], + }; + + if (dataSourceMDSId !== '' && dataSourceMDSId !== undefined) { + defaultDataSourceObject = { ...defaultDataSourceObject, dataSourceMDSId }; + } + this.addOrUpdateAccelerationsByDataSource(defaultDataSourceObject, dataSourceMDSId); + return defaultDataSourceObject; + } + } + + /** + * Adds or updates a data source in the cache. + * @param {CachedDataSource} dataSource - The data source to add or update. + */ + static addOrUpdateDataSource(dataSource: CachedDataSource, dataSourceMDSId?: string): void { + const cacheData = this.getDataSourceCache(); + let index; + if (dataSourceMDSId) { + index = cacheData.dataSources.findIndex( + (ds: CachedDataSource) => + ds.name === dataSource.name && ds.dataSourceMDSId === dataSourceMDSId + ); + } + index = cacheData.dataSources.findIndex((ds: CachedDataSource) => ds.name === dataSource.name); + if (index !== -1) { + cacheData.dataSources[index] = dataSource; + } else { + cacheData.dataSources.push(dataSource); + } + this.saveDataSourceCache(cacheData); + } + + /** + * Retrieves or creates a data source with the specified name. + * @param {string} dataSourceName - The name of the data source. + * @returns {CachedDataSource} The retrieved or created data source. + */ + static getOrCreateDataSource(dataSourceName: string, dataSourceMDSId?: string): CachedDataSource { + let cachedDataSource; + if (dataSourceMDSId) { + cachedDataSource = this.getDataSourceCache().dataSources.find( + (ds) => ds.dataSourceMDSId === dataSourceMDSId && ds.name === dataSourceName + ); + } else { + cachedDataSource = this.getDataSourceCache().dataSources.find( + (ds) => ds.name === dataSourceName + ); + } + if (cachedDataSource) { + return cachedDataSource; + } else { + let defaultDataSourceObject: CachedDataSource = { + name: dataSourceName, + lastUpdated: '', + status: CachedDataSourceStatus.Empty, + databases: [], + }; + if (dataSourceMDSId !== '' && dataSourceMDSId !== undefined) { + defaultDataSourceObject = { ...defaultDataSourceObject, dataSourceMDSId }; + } + this.addOrUpdateDataSource(defaultDataSourceObject, dataSourceMDSId); + return defaultDataSourceObject; + } + } + + /** + * Retrieves a database from the cache. + * @param {string} dataSourceName - The name of the data source containing the database. + * @param {string} databaseName - The name of the database. + * @returns {CachedDatabase} The retrieved database. + * @throws {Error} If the data source or database is not found. + */ + static getDatabase( + dataSourceName: string, + databaseName: string, + dataSourceMDSId?: string + ): CachedDatabase { + let cachedDataSource; + if (dataSourceMDSId) { + cachedDataSource = this.getDataSourceCache().dataSources.find( + (ds) => ds.dataSourceMDSId === dataSourceMDSId && ds.name === dataSourceName + ); + } else { + cachedDataSource = this.getDataSourceCache().dataSources.find( + (ds) => ds.name === dataSourceName + ); + } + if (!cachedDataSource) { + throw new Error('DataSource not found exception: ' + dataSourceName); + } + + const cachedDatabase = cachedDataSource.databases.find((db) => db.name === databaseName); + if (!cachedDatabase) { + throw new Error('Database not found exception: ' + databaseName); + } + + return cachedDatabase; + } + + /** + * Retrieves a table from the cache. + * @param {string} dataSourceName - The name of the data source containing the database. + * @param {string} databaseName - The name of the database. + * @param {string} tableName - The name of the database. + * @returns {Cachedtable} The retrieved database. + * @throws {Error} If the data source, database or table is not found. + */ + static getTable( + dataSourceName: string, + databaseName: string, + tableName: string, + dataSourceMDSId?: string + ): SimpleObject { + const cachedDatabase = this.getDatabase(dataSourceName, databaseName, dataSourceMDSId); + + const cachedTable = cachedDatabase.tables!.find((table) => table.title === tableName); + if (!cachedTable) { + throw new Error('Table not found exception: ' + tableName); + } + return cachedTable; + } + + /** + * Updates a database in the cache. + * @param {string} dataSourceName - The name of the data source containing the database. + * @param {CachedDatabase} database - The database to be updated. + * @throws {Error} If the data source or database is not found. + */ + static updateDatabase( + dataSourceName: string, + database: CachedDatabase, + dataSourceMDSId?: string + ): void { + let cachedDataSource; + if (dataSourceMDSId) { + cachedDataSource = this.getDataSourceCache().dataSources.find( + (ds) => ds.dataSourceMDSId === dataSourceMDSId && ds.name === dataSourceName + ); + } else { + cachedDataSource = this.getDataSourceCache().dataSources.find( + (ds) => ds.name === dataSourceName + ); + } + + if (!cachedDataSource) { + throw new Error('DataSource not found exception: ' + dataSourceName); + } + + const index = cachedDataSource.databases.findIndex((db) => db.name === database.name); + if (index !== -1) { + cachedDataSource.databases[index] = database; + this.addOrUpdateDataSource(cachedDataSource, dataSourceMDSId); + } else { + throw new Error('Database not found exception: ' + database.name); + } + } + + /** + * Clears the data source cache from local storage. + */ + static clearDataSourceCache(): void { + sessionStorage.removeItem(this.datasourceCacheKey); + this.clearExternalDataSourcesCache(); + } + + /** + * Clears the accelerations cache from local storage. + */ + static clearAccelerationsCache(): void { + sessionStorage.removeItem(this.accelerationsCacheKey); + } + + static saveExternalDataSourcesCache(cacheData: ExternalDataSourcesCacheData): void { + sessionStorage.setItem(this.externalDataSourcesCacheKey, JSON.stringify(cacheData)); + } + + static getExternalDataSourcesCache(): ExternalDataSourcesCacheData { + const externalDataSourcesData = sessionStorage.getItem(this.externalDataSourcesCacheKey); + + if (externalDataSourcesData) { + return JSON.parse(externalDataSourcesData); + } else { + const defaultCacheObject: ExternalDataSourcesCacheData = { + version: CATALOG_CACHE_VERSION, + externalDataSources: [], + lastUpdated: '', + status: CachedDataSourceStatus.Empty, + }; + this.saveExternalDataSourcesCache(defaultCacheObject); + return defaultCacheObject; + } + } + + static updateExternalDataSources(externalDataSources: ExternalDataSource[]): void { + const currentTime = new Date().toUTCString(); + const cacheData = this.getExternalDataSourcesCache(); + cacheData.externalDataSources = externalDataSources; + cacheData.lastUpdated = currentTime; + cacheData.status = CachedDataSourceStatus.Updated; + this.saveExternalDataSourcesCache(cacheData); + } + + static getExternalDataSources(): ExternalDataSourcesCacheData { + return this.getExternalDataSourcesCache(); + } + + static clearExternalDataSourcesCache(): void { + sessionStorage.removeItem(this.externalDataSourcesCacheKey); + } + + static setExternalDataSourcesLoadingStatus(status: CachedDataSourceStatus): void { + const cacheData = this.getExternalDataSourcesCache(); + cacheData.status = status; + this.saveExternalDataSourcesCache(cacheData); + } + + static saveRecentDataSetsCache(cacheData: RecentDataSetOptionsCacheData): void { + sessionStorage.setItem(this.recentDataSetCacheKey, JSON.stringify(cacheData)); + } + + static getRecentDataSetsCache(): RecentDataSetOptionsCacheData { + const recentDataSetOptionsData = sessionStorage.getItem(this.recentDataSetCacheKey); + + if (recentDataSetOptionsData) { + return JSON.parse(recentDataSetOptionsData); + } else { + const defaultCacheObject: RecentDataSetOptionsCacheData = { + version: CATALOG_CACHE_VERSION, + recentDataSets: [], + }; + this.saveRecentDataSetsCache(defaultCacheObject); + return defaultCacheObject; + } + } + + static addRecentDataSet(dataSet: SimpleDataSet): void { + const cacheData = this.getRecentDataSetsCache(); + + cacheData.recentDataSets = cacheData.recentDataSets.filter( + (option) => option.id !== dataSet.id + ); + + cacheData.recentDataSets.push(dataSet); + + if (cacheData.recentDataSets.length > this.maxRecentDataSet) { + cacheData.recentDataSets.shift(); + } + + this.saveRecentDataSetsCache(cacheData); + } + + static getRecentDataSets(): SimpleDataSet[] { + return this.getRecentDataSetsCache().recentDataSets; + } + + static clearRecentDataSetsCache(): void { + sessionStorage.removeItem(this.recentDataSetCacheKey); + } +} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx new file mode 100644 index 00000000000..5449277b2bd --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './cache_intercept'; +export * from './cache_loader'; +export * from './cache_manager'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/constants.ts b/src/plugins/data/public/ui/dataset_navigator/lib/constants.ts new file mode 100644 index 00000000000..e22da95ff4c --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/constants.ts @@ -0,0 +1,101 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const ASYNC_QUERY_SESSION_ID = 'async-query-session-id'; +export const ASYNC_QUERY_EXTERNAL_DATASOURCES_CACHE = 'async_query_external_datasources_cache'; +export const RECENT_DATASET_OPTIONS_CACHE = 'recent_dataset_options_cache'; + +export const DATA_SOURCE_NAME_URL_PARAM_KEY = 'datasourceName'; +export const DATA_SOURCE_TYPE_URL_PARAM_KEY = 'datasourceType'; +export const OLLY_QUESTION_URL_PARAM_KEY = 'olly_q'; +export const INDEX_URL_PARAM_KEY = 'indexPattern'; +export const DEFAULT_DATA_SOURCE_TYPE = 'DEFAULT_INDEX_PATTERNS'; +export const DEFAULT_DATA_SOURCE_NAME = 'Default cluster'; +export const DEFAULT_DATA_SOURCE_OBSERVABILITY_DISPLAY_NAME = 'OpenSearch'; +export const DEFAULT_DATA_SOURCE_TYPE_NAME = 'Default Group'; +export const enum QUERY_LANGUAGE { + PPL = 'PPL', + SQL = 'SQL', + DQL = 'DQL', +} +export enum DATA_SOURCE_TYPES { + DEFAULT_CLUSTER_TYPE = DEFAULT_DATA_SOURCE_TYPE, + SPARK = 'spark', + S3Glue = 's3glue', +} +export const ASYNC_POLLING_INTERVAL = 2000; + +export const CATALOG_CACHE_VERSION = '1.0'; +export const ACCELERATION_DEFUALT_SKIPPING_INDEX_NAME = 'skipping'; +export const ACCELERATION_TIME_INTERVAL = [ + { text: 'millisecond(s)', value: 'millisecond' }, + { text: 'second(s)', value: 'second' }, + { text: 'minutes(s)', value: 'minute' }, + { text: 'hour(s)', value: 'hour' }, + { text: 'day(s)', value: 'day' }, + { text: 'week(s)', value: 'week' }, +]; +export const ACCELERATION_REFRESH_TIME_INTERVAL = [ + { text: 'minutes(s)', value: 'minute' }, + { text: 'hour(s)', value: 'hour' }, + { text: 'day(s)', value: 'day' }, + { text: 'week(s)', value: 'week' }, +]; + +export const ACCELERATION_ADD_FIELDS_TEXT = '(add fields here)'; +export const ACCELERATION_INDEX_NAME_REGEX = /^[a-z0-9_]+$/; +export const ACCELERATION_S3_URL_REGEX = /^(s3|s3a):\/\/[a-zA-Z0-9.\-]+/; +export const SPARK_HIVE_TABLE_REGEX = /Provider:\s*hive/; +export const SANITIZE_QUERY_REGEX = /\s+/g; +export const SPARK_TIMESTAMP_DATATYPE = 'timestamp'; +export const SPARK_STRING_DATATYPE = 'string'; + +export const ACCELERATION_INDEX_TYPES = [ + { label: 'Skipping Index', value: 'skipping' }, + { label: 'Covering Index', value: 'covering' }, + { label: 'Materialized View', value: 'materialized' }, +]; + +export const ACC_INDEX_TYPE_DOCUMENTATION_URL = + 'https://github.com/opensearch-project/opensearch-spark/blob/main/docs/index.md'; +export const ACC_CHECKPOINT_DOCUMENTATION_URL = + 'https://github.com/opensearch-project/opensearch-spark/blob/main/docs/index.md#create-index-options'; + +export const ACCELERATION_INDEX_NAME_INFO = `All OpenSearch acceleration indices have a naming format of pattern: \`prefix__suffix\`. They share a common prefix structure, which is \`flint____\`. Additionally, they may have a suffix that varies based on the index type. +##### Skipping Index +- For 'Skipping' indices, a fixed index name 'skipping' is used, and this name cannot be modified by the user. The suffix added to this type is \`_index\`. + - An example of a 'Skipping' index name would be: \`flint_mydatasource_mydb_mytable_skipping_index\`. +##### Covering Index +- 'Covering' indices allow users to specify their index name. The suffix added to this type is \`_index\`. + - For instance, a 'Covering' index name could be: \`flint_mydatasource_mydb_mytable_myindexname_index\`. +##### Materialized View Index +- 'Materialized View' indices also enable users to define their index name, but they do not have a suffix. + - An example of a 'Materialized View' index name might look like: \`flint_mydatasource_mydb_mytable_myindexname\`. +##### Note: +- All user given index names must be in lowercase letters, numbers and underscore. Spaces, commas, and characters -, :, ", *, +, /, \, |, ?, #, >, or < are not allowed. + `; + +export const SKIPPING_INDEX_ACCELERATION_METHODS = [ + { value: 'PARTITION', text: 'Partition' }, + { value: 'VALUE_SET', text: 'Value Set' }, + { value: 'MIN_MAX', text: 'Min Max' }, + { value: 'BLOOM_FILTER', text: 'Bloom Filter' }, +]; + +export const ACCELERATION_AGGREGRATION_FUNCTIONS = [ + { label: 'window.start' }, + { label: 'count' }, + { label: 'sum' }, + { label: 'avg' }, + { label: 'max' }, + { label: 'min' }, +]; + +export const SPARK_PARTITION_INFO = `# Partition Information`; +export const OBS_DEFAULT_CLUSTER = 'observability-default'; // prefix key for generating data source id for default cluster in data selector +export const OBS_S3_DATA_SOURCE = 'observability-s3'; // prefix key for generating data source id for s3 data sources in data selector +export const S3_DATA_SOURCE_GROUP_DISPLAY_NAME = 'Amazon S3'; // display group name for Amazon-managed-s3 data sources in data selector +export const S3_DATA_SOURCE_GROUP_SPARK_DISPLAY_NAME = 'Spark'; // display group name for OpenSearch-spark-s3 data sources in data selector +export const SECURITY_DASHBOARDS_LOGOUT_URL = '/logout'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx new file mode 100644 index 00000000000..a2b05f47e9e --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx @@ -0,0 +1,99 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useEffect, useState } from 'react'; +import { HttpStart, NotificationsStart } from 'opensearch-dashboards/public'; +import { ASYNC_POLLING_INTERVAL } from '../constants'; +import { DirectQueryLoadingStatus, DirectQueryRequest } from '../types'; +import { getAsyncSessionId, setAsyncSessionId } from '../utils/query_session_utils'; +import { get as getObjValue, formatError } from '../utils/shared'; +import { usePolling } from '../utils/use_polling'; +import { SQLService } from '../requests/sql'; + +export const useDirectQuery = ( + http: HttpStart, + notifications: NotificationsStart, + dataSourceMDSId?: string +) => { + const sqlService = new SQLService(http); + const [loadStatus, setLoadStatus] = useState( + DirectQueryLoadingStatus.SCHEDULED + ); + + const { + data: pollingResult, + loading: _pollingLoading, + error: pollingError, + startPolling, + stopPolling: stopLoading, + } = usePolling((params) => { + return sqlService.fetchWithJobId(params, dataSourceMDSId || ''); + }, ASYNC_POLLING_INTERVAL); + + const startLoading = (requestPayload: DirectQueryRequest) => { + setLoadStatus(DirectQueryLoadingStatus.SCHEDULED); + + const sessionId = getAsyncSessionId(requestPayload.datasource); + if (sessionId) { + requestPayload = { ...requestPayload, sessionId }; + } + + sqlService + .fetch(requestPayload, dataSourceMDSId) + .then((result) => { + setAsyncSessionId(requestPayload.datasource, getObjValue(result, 'sessionId', null)); + if (result.queryId) { + startPolling({ + queryId: result.queryId, + }); + } else { + // eslint-disable-next-line no-console + console.error('No query id found in response'); + setLoadStatus(DirectQueryLoadingStatus.FAILED); + } + }) + .catch((e) => { + setLoadStatus(DirectQueryLoadingStatus.FAILED); + const formattedError = formatError( + '', + 'The query failed to execute and the operation could not be complete.', + e.body?.message + ); + notifications.toasts.addError(formattedError, { + title: 'Query Failed', + }); + // eslint-disable-next-line no-console + console.error(e); + }); + }; + + useEffect(() => { + // cancel direct query + if (!pollingResult) return; + const { status: anyCaseStatus, datarows, error } = pollingResult; + const status = anyCaseStatus?.toLowerCase(); + + if (status === DirectQueryLoadingStatus.SUCCESS || datarows) { + setLoadStatus(status); + stopLoading(); + } else if (status === DirectQueryLoadingStatus.FAILED) { + setLoadStatus(status); + stopLoading(); + const formattedError = formatError( + '', + 'The query failed to execute and the operation could not be complete.', + error + ); + notifications.toasts.addError(formattedError, { + title: 'Query Failed', + }); + } else { + setLoadStatus(status); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pollingResult, pollingError, stopLoading]); + + return { loadStatus, startLoading, stopLoading, pollingResult }; +}; diff --git a/src/plugins/query_enhancements/public/data_source_connection/components/index.ts b/src/plugins/data/public/ui/dataset_navigator/lib/hooks/index.tsx similarity index 61% rename from src/plugins/query_enhancements/public/data_source_connection/components/index.ts rename to src/plugins/data/public/ui/dataset_navigator/lib/hooks/index.tsx index 1ee969a1d07..88974a7c942 100644 --- a/src/plugins/query_enhancements/public/data_source_connection/components/index.ts +++ b/src/plugins/data/public/ui/dataset_navigator/lib/hooks/index.tsx @@ -3,4 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -export { ConnectionsBar } from './connections_bar'; +export * from './direct_query_hook'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/index.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/index.tsx new file mode 100644 index 00000000000..771fbd6eef3 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/index.tsx @@ -0,0 +1,9 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './catalog_cache'; +export * from './hooks'; +export * from './requests'; +export * from './utils'; diff --git a/src/plugins/query_enhancements/public/data_source_connection/services/index.ts b/src/plugins/data/public/ui/dataset_navigator/lib/requests/index.tsx similarity index 58% rename from src/plugins/query_enhancements/public/data_source_connection/services/index.ts rename to src/plugins/data/public/ui/dataset_navigator/lib/requests/index.tsx index 08eeda5a7aa..3918a896bd0 100644 --- a/src/plugins/query_enhancements/public/data_source_connection/services/index.ts +++ b/src/plugins/data/public/ui/dataset_navigator/lib/requests/index.tsx @@ -3,4 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -export { ConnectionsService } from './connections_service'; +export * from './sql'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts b/src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts new file mode 100644 index 00000000000..f2c9c30c79b --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts @@ -0,0 +1,60 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { HttpStart } from 'opensearch-dashboards/public'; +import { DirectQueryRequest } from '../types'; + +export class SQLService { + private http: HttpStart; + + constructor(http: HttpStart) { + this.http = http; + } + + fetch = async ( + params: DirectQueryRequest, + dataSourceMDSId?: string, + errorHandler?: (error: any) => void + ) => { + const query = { + dataSourceMDSId, + }; + return this.http + .post('/api/observability/query/jobs', { + body: JSON.stringify(params), + query, + }) + .catch((error) => { + // eslint-disable-next-line no-console + console.error('fetch error: ', error.body); + if (errorHandler) errorHandler(error); + throw error; + }); + }; + + fetchWithJobId = async ( + params: { queryId: string }, + dataSourceMDSId?: string, + errorHandler?: (error: any) => void + ) => { + return this.http + .get(`/api/observability/query/jobs/${params.queryId}/${dataSourceMDSId ?? ''}`) + .catch((error) => { + // eslint-disable-next-line no-console + console.error('fetch error: ', error.body); + if (errorHandler) errorHandler(error); + throw error; + }); + }; + + deleteWithJobId = async (params: { queryId: string }, errorHandler?: (error: any) => void) => { + return this.http.delete(`/api/observability/query/jobs/${params.queryId}`).catch((error) => { + // eslint-disable-next-line no-console + console.error('delete error: ', error.body); + if (errorHandler) errorHandler(error); + throw error; + }); + }; +} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/types.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/types.tsx new file mode 100644 index 00000000000..03d844ff568 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/types.tsx @@ -0,0 +1,330 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { EuiComboBoxOptionOption } from '@elastic/eui'; +import { SimpleDataSet, SimpleObject } from '../../../../common'; + +export enum DirectQueryLoadingStatus { + SUCCESS = 'success', + FAILED = 'failed', + RUNNING = 'running', + SCHEDULED = 'scheduled', + CANCELED = 'canceled', + WAITING = 'waiting', + INITIAL = 'initial', +} + +export interface DirectQueryRequest { + query: string; + lang: string; + datasource: string; + sessionId?: string; +} + +export type AccelerationStatus = 'ACTIVE' | 'INACTIVE'; + +export interface PermissionsConfigurationProps { + roles: Role[]; + selectedRoles: Role[]; + setSelectedRoles: React.Dispatch>; + layout: 'horizontal' | 'vertical'; + hasSecurityAccess: boolean; +} + +export interface TableColumn { + name: string; + dataType: string; +} + +export interface Acceleration { + name: string; + status: AccelerationStatus; + type: string; + database: string; + table: string; + destination: string; + dateCreated: number; + dateUpdated: number; + index: string; + sql: string; +} + +export interface AssociatedObject { + tableName: string; + datasource: string; + id: string; + name: string; + database: string; + type: AssociatedObjectIndexType; + accelerations: CachedAcceleration[] | AssociatedObject; + columns?: CachedColumn[]; +} + +export type Role = EuiComboBoxOptionOption; + +export type DatasourceType = 'S3GLUE' | 'PROMETHEUS'; + +export interface S3GlueProperties { + 'glue.indexstore.opensearch.uri': string; + 'glue.indexstore.opensearch.region': string; +} + +export interface PrometheusProperties { + 'prometheus.uri': string; +} + +export type DatasourceStatus = 'ACTIVE' | 'DISABLED'; + +export interface DatasourceDetails { + allowedRoles: string[]; + name: string; + connector: DatasourceType; + description: string; + properties: S3GlueProperties | PrometheusProperties; + status: DatasourceStatus; +} + +interface AsyncApiDataResponse { + status: string; + schema?: Array<{ name: string; type: string }>; + datarows?: any; + total?: number; + size?: number; + error?: string; +} + +export interface AsyncApiResponse { + data: { + ok: boolean; + resp: AsyncApiDataResponse; + }; +} + +export type PollingCallback = (statusObj: AsyncApiResponse) => void; + +export type AssociatedObjectIndexType = AccelerationIndexType | 'table'; + +export type AccelerationIndexType = 'skipping' | 'covering' | 'materialized'; + +export type LoadCacheType = 'databases' | 'tables' | 'accelerations' | 'tableColumns'; + +export enum CachedDataSourceStatus { + Updated = 'Updated', + Failed = 'Failed', + Empty = 'Empty', +} + +export interface CachedColumn { + fieldName: string; + dataType: string; +} + +export interface CachedDatabase { + name: string; + tables: SimpleObject[]; + lastUpdated: string; // date string in UTC format + status: CachedDataSourceStatus; +} + +export interface CachedDataSource { + name: string; + lastUpdated: string; // date string in UTC format + status: CachedDataSourceStatus; + databases: CachedDatabase[]; + dataSourceMDSId?: string; +} + +export interface DataSourceCacheData { + version: string; + dataSources: CachedDataSource[]; +} + +export interface CachedAcceleration { + flintIndexName: string; + type: AccelerationIndexType; + database: string; + table: string; + indexName: string; + autoRefresh: boolean; + status: string; +} + +export interface CachedAccelerationByDataSource { + name: string; + accelerations: CachedAcceleration[]; + lastUpdated: string; // date string in UTC format + status: CachedDataSourceStatus; + dataSourceMDSId?: string; +} + +export interface AccelerationsCacheData { + version: string; + dataSources: CachedAccelerationByDataSource[]; +} + +export interface PollingSuccessResult { + schema: Array<{ name: string; type: string }>; + datarows: Array>; +} + +export type AsyncPollingResult = PollingSuccessResult | null; + +export type AggregationFunctionType = 'count' | 'sum' | 'avg' | 'max' | 'min' | 'window.start'; + +export interface MaterializedViewColumn { + id: string; + functionName: AggregationFunctionType; + functionParam?: string; + fieldAlias?: string; +} + +export type SkippingIndexAccMethodType = 'PARTITION' | 'VALUE_SET' | 'MIN_MAX' | 'BLOOM_FILTER'; + +export interface SkippingIndexRowType { + id: string; + fieldName: string; + dataType: string; + accelerationMethod: SkippingIndexAccMethodType; +} + +export interface DataTableFieldsType { + id: string; + fieldName: string; + dataType: string; +} + +export interface RefreshIntervalType { + refreshWindow: number; + refreshInterval: string; +} + +export interface WatermarkDelayType { + delayWindow: number; + delayInterval: string; +} + +export interface GroupByTumbleType { + timeField: string; + tumbleWindow: number; + tumbleInterval: string; +} + +export interface MaterializedViewQueryType { + columnsValues: MaterializedViewColumn[]; + groupByTumbleValue: GroupByTumbleType; +} + +export interface FormErrorsType { + dataSourceError: string[]; + databaseError: string[]; + dataTableError: string[]; + skippingIndexError: string[]; + coveringIndexError: string[]; + materializedViewError: string[]; + indexNameError: string[]; + primaryShardsError: string[]; + replicaShardsError: string[]; + refreshIntervalError: string[]; + checkpointLocationError: string[]; + watermarkDelayError: string[]; +} + +export type AccelerationRefreshType = 'autoInterval' | 'manual' | 'manualIncrement'; + +export interface CreateAccelerationForm { + dataSource: string; + database: string; + dataTable: string; + dataTableFields: DataTableFieldsType[]; + accelerationIndexType: AccelerationIndexType; + skippingIndexQueryData: SkippingIndexRowType[]; + coveringIndexQueryData: string[]; + materializedViewQueryData: MaterializedViewQueryType; + accelerationIndexName: string; + primaryShardsCount: number; + replicaShardsCount: number; + refreshType: AccelerationRefreshType; + checkpointLocation: string | undefined; + watermarkDelay: WatermarkDelayType; + refreshIntervalOptions: RefreshIntervalType; + formErrors: FormErrorsType; +} + +export interface LoadCachehookOutput { + loadStatus: DirectQueryLoadingStatus; + startLoading: (params: StartLoadingParams) => void; + stopLoading: () => void; +} + +export interface StartLoadingParams { + dataSourceName: string; + dataSourceMDSId?: string; + databaseName?: string; + tableName?: string; +} + +export interface RenderAccelerationFlyoutParams { + dataSourceName: string; + dataSourceMDSId?: string; + databaseName?: string; + tableName?: string; + handleRefresh?: () => void; +} + +export interface RenderAssociatedObjectsDetailsFlyoutParams { + tableDetail: AssociatedObject; + dataSourceName: string; + handleRefresh?: () => void; + dataSourceMDSId?: string; +} + +export interface RenderAccelerationDetailsFlyoutParams { + acceleration: CachedAcceleration; + dataSourceName: string; + handleRefresh?: () => void; + dataSourceMDSId?: string; +} + +export interface DataSetOption { + id?: string; + name: string; + dataSourceRef?: string; +} + +export interface RecentDataSetOptionsCacheData { + version: string; + recentDataSets: SimpleDataSet[]; +} + +export interface ExternalDataSource { + name: string; + status: string; + dataSourceRef: string; +} + +export interface ExternalDataSourcesCacheData { + version: string; + externalDataSources: ExternalDataSource[]; + lastUpdated: string; + status: CachedDataSourceStatus; +} + +interface DataSourceMeta { + // ref: string; // MDS ID + // dsName?: string; // flint datasource + id: string; + name: string; + type?: string; +} + +export interface DataSet { + id: string | undefined; // index pattern ID, index name, or flintdatasource.database.table + datasource?: DataSourceMeta; + meta?: { + timestampField: string; + mapping?: any; + }; + type?: 'dataSet' | 'temporary'; +} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts new file mode 100644 index 00000000000..697852fdd77 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts @@ -0,0 +1,26 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export enum DirectQueryLoadingStatus { + SUCCESS = 'success', + FAILED = 'failed', + RUNNING = 'running', + SCHEDULED = 'scheduled', + CANCELED = 'canceled', + WAITING = 'waiting', + INITIAL = 'initial', +} + +const catalogCacheFetchingStatus = [ + DirectQueryLoadingStatus.RUNNING, + DirectQueryLoadingStatus.WAITING, + DirectQueryLoadingStatus.SCHEDULED, +]; + +export const isCatalogCacheFetching = (...statuses: DirectQueryLoadingStatus[]) => { + return statuses.some((status: DirectQueryLoadingStatus) => + catalogCacheFetchingStatus.includes(status) + ); +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts new file mode 100644 index 00000000000..7a10d7badb5 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts @@ -0,0 +1,19 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { SavedObjectsClientContract } from 'opensearch-dashboards/public'; +import { SimpleDataSource } from '../../../../../common'; + +export const fetchDataSources = async (client: SavedObjectsClientContract) => { + const resp = await client.find({ + type: 'data-source', + perPage: 10000, + }); + return resp.savedObjects.map((savedObject) => ({ + id: savedObject.id, + name: savedObject.attributes.title, + type: 'data-source', + })) as SimpleDataSource[]; +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts new file mode 100644 index 00000000000..a9272155e60 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts @@ -0,0 +1,33 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { HttpStart } from 'opensearch-dashboards/public'; + +export const fetchIfExternalDataSourcesEnabled = async (http: HttpStart) => { + try { + await http.get('/api/dataconnections'); + return true; + } catch (e) { + return false; + } +}; + +export const fetchExternalDataSources = async (http: HttpStart, connectedClusters: string[]) => { + const results = await Promise.all( + connectedClusters.map(async (cluster) => { + const dataSources = await http.get(`/api/dataconnections/dataSourceMDSId=${cluster}`); + return dataSources + .filter((dataSource) => dataSource.connector === 'S3GLUE') + .map((dataSource) => ({ + name: dataSource.name, + status: dataSource.status, + dataSourceRef: cluster, + })); + }) + ); + + const flattenedResults = results.flat(); + return flattenedResults; +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts new file mode 100644 index 00000000000..3f2cd230300 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts @@ -0,0 +1,34 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { SavedObjectsClientContract } from 'opensearch-dashboards/public'; +import { IIndexPattern } from '../.././../..'; +import { SIMPLE_DATA_SOURCE_TYPES, SIMPLE_DATA_SET_TYPES } from '../../../../../common'; + +export const fetchIndexPatterns = async (client: SavedObjectsClientContract, search: string) => { + const resp = await client.find({ + type: 'index-pattern', + fields: ['title', 'timeFieldName', 'references', 'fields'], + search: `${search}*`, + searchFields: ['title'], + perPage: 100, + }); + return resp.savedObjects.map((savedObject) => ({ + id: savedObject.id, + title: savedObject.attributes.title, + timeFieldName: savedObject.attributes.timeFieldName, + fields: savedObject.attributes.fields, + type: SIMPLE_DATA_SET_TYPES.INDEX_PATTERN, + ...(savedObject.references[0] + ? { + dataSourceRef: { + id: savedObject.references[0]?.id, + name: savedObject.references[0]?.name, + type: SIMPLE_DATA_SOURCE_TYPES.DEFAULT, + }, + } + : {}), + })); +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts new file mode 100644 index 00000000000..ef10c72bc08 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts @@ -0,0 +1,46 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { map } from 'rxjs/operators'; +import { ISearchStart } from '../../../../search'; + +export const fetchIndices = async (search: ISearchStart, dataSourceId?: string) => { + const buildSearchRequest = () => { + const request = { + params: { + ignoreUnavailable: true, + expand_wildcards: 'all', + index: '*', + body: { + size: 0, // no hits + aggs: { + indices: { + terms: { + field: '_index', + size: 100, + }, + }, + }, + }, + }, + dataSourceId, + }; + + return request; + }; + + const searchResponseToArray = (response: any) => { + const { rawResponse } = response; + return rawResponse.aggregations + ? rawResponse.aggregations.indices.buckets.map((bucket: { key: any }) => bucket.key) + : []; + }; + + return search + .getDefaultSearchInterceptor() + .search(buildSearchRequest()) + .pipe(map(searchResponseToArray)) + .toPromise(); +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts new file mode 100644 index 00000000000..7dbe7ec2d4f --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './fetch_catalog_cache_status'; +export * from './fetch_data_sources'; +export * from './fetch_external_data_sources'; +export * from './fetch_index_patterns'; +export * from './fetch_indices'; +export * from './query_session_utils'; +export * from './shared'; +export * from './use_polling'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts new file mode 100644 index 00000000000..beabcb48c19 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts @@ -0,0 +1,16 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ASYNC_QUERY_SESSION_ID } from '../constants'; + +export const setAsyncSessionId = (dataSource: string, value: string | null) => { + if (value !== null) { + sessionStorage.setItem(`${ASYNC_QUERY_SESSION_ID}_${dataSource}`, value); + } +}; + +export const getAsyncSessionId = (dataSource: string) => { + return sessionStorage.getItem(`${ASYNC_QUERY_SESSION_ID}_${dataSource}`); +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts new file mode 100644 index 00000000000..3e4afc94e80 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts @@ -0,0 +1,332 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * TODO making this method type-safe is nontrivial: if you just define + * `Nested = { [k: string]: Nested | T }` then you can't accumulate because `T` is not `Nested` + * There might be a way to define a recursive type that accumulates cleanly but it's probably not + * worth the effort. + */ + +export function get(obj: Record, path: string, defaultValue?: T): T { + return path.split('.').reduce((acc: any, part: string) => acc && acc[part], obj) || defaultValue; +} + +export function addBackticksIfNeeded(input: string): string { + if (input === undefined) { + return ''; + } + // Check if the string already has backticks + if (input.startsWith('`') && input.endsWith('`')) { + return input; // Return the string as it is + } else { + // Add backticks to the string + return '`' + input + '`'; + } +} + +export function combineSchemaAndDatarows( + schema: Array<{ name: string; type: string }>, + datarows: Array> +): object[] { + const combinedData: object[] = []; + + datarows.forEach((row) => { + const rowData: { [key: string]: string | number | boolean } = {}; + schema.forEach((field, index) => { + rowData[field.name] = row[index]; + }); + combinedData.push(rowData); + }); + + return combinedData; +} + +export const formatError = (name: string, message: string, details: string) => { + return { + name, + message, + body: { + attributes: { + error: { + caused_by: { + type: '', + reason: details, + }, + }, + }, + }, + }; +}; + +// TODO: relocate to a more appropriate location +// Client route +export const PPL_BASE = '/api/ppl'; +export const PPL_SEARCH = '/search'; +export const DSL_BASE = '/api/dsl'; +export const DSL_SEARCH = '/search'; +export const DSL_CAT = '/cat.indices'; +export const DSL_MAPPING = '/indices.getFieldMapping'; +export const DSL_SETTINGS = '/indices.getFieldSettings'; +export const OBSERVABILITY_BASE = '/api/observability'; +export const INTEGRATIONS_BASE = '/api/integrations'; +export const JOBS_BASE = '/query/jobs'; +export const DATACONNECTIONS_BASE = '/api/dataconnections'; +export const EDIT = '/edit'; +export const DATACONNECTIONS_UPDATE_STATUS = '/status'; +export const SECURITY_ROLES = '/api/v1/configuration/roles'; +export const EVENT_ANALYTICS = '/event_analytics'; +export const SAVED_OBJECTS = '/saved_objects'; +export const SAVED_QUERY = '/query'; +export const SAVED_VISUALIZATION = '/vis'; +export const CONSOLE_PROXY = '/api/console/proxy'; +export const SECURITY_PLUGIN_ACCOUNT_API = '/api/v1/configuration/account'; + +// Server route +export const PPL_ENDPOINT = '/_plugins/_ppl'; +export const SQL_ENDPOINT = '/_plugins/_sql'; +export const DSL_ENDPOINT = '/_plugins/_dsl'; +export const DATACONNECTIONS_ENDPOINT = '/_plugins/_query/_datasources'; +export const JOBS_ENDPOINT_BASE = '/_plugins/_async_query'; +export const JOB_RESULT_ENDPOINT = '/result'; + +export const observabilityID = 'observability-logs'; +export const observabilityTitle = 'Observability'; +export const observabilityPluginOrder = 1500; + +export const observabilityApplicationsID = 'observability-applications'; +export const observabilityApplicationsTitle = 'Applications'; +export const observabilityApplicationsPluginOrder = 5090; + +export const observabilityLogsID = 'observability-logs'; +export const observabilityLogsTitle = 'Logs'; +export const observabilityLogsPluginOrder = 5091; + +export const observabilityMetricsID = 'observability-metrics'; +export const observabilityMetricsTitle = 'Metrics'; +export const observabilityMetricsPluginOrder = 5092; + +export const observabilityTracesID = 'observability-traces'; +export const observabilityTracesTitle = 'Traces'; +export const observabilityTracesPluginOrder = 5093; + +export const observabilityNotebookID = 'observability-notebooks'; +export const observabilityNotebookTitle = 'Notebooks'; +export const observabilityNotebookPluginOrder = 5094; + +export const observabilityPanelsID = 'observability-dashboards'; +export const observabilityPanelsTitle = 'Dashboards'; +export const observabilityPanelsPluginOrder = 5095; + +export const observabilityIntegrationsID = 'integrations'; +export const observabilityIntegrationsTitle = 'Integrations'; +export const observabilityIntegrationsPluginOrder = 9020; + +export const observabilityDataConnectionsID = 'datasources'; +export const observabilityDataConnectionsTitle = 'Data sources'; +export const observabilityDataConnectionsPluginOrder = 9030; + +export const queryWorkbenchPluginID = 'opensearch-query-workbench'; +export const queryWorkbenchPluginCheck = 'plugin:queryWorkbenchDashboards'; + +// Shared Constants +export const SQL_DOCUMENTATION_URL = 'https://opensearch.org/docs/latest/search-plugins/sql/index/'; +export const PPL_DOCUMENTATION_URL = + 'https://opensearch.org/docs/latest/search-plugins/sql/ppl/index'; +export const PPL_PATTERNS_DOCUMENTATION_URL = + 'https://github.com/opensearch-project/sql/blob/2.x/docs/user/ppl/cmd/patterns.rst#description'; +export const UI_DATE_FORMAT = 'MM/DD/YYYY hh:mm A'; +export const PPL_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSSSSS'; +export const OTEL_DATE_FORMAT = 'YYYY-MM-DDTHH:mm:ss'; +export const SPAN_REGEX = /span/; + +export const PROMQL_METRIC_SUBTYPE = 'promqlmetric'; +export const OTEL_METRIC_SUBTYPE = 'openTelemetryMetric'; +export const PPL_METRIC_SUBTYPE = 'metric'; + +export const PPL_SPAN_REGEX = /by\s*span/i; +export const PPL_STATS_REGEX = /\|\s*stats/i; +export const PPL_INDEX_INSERT_POINT_REGEX = /(search source|source|index)\s*=\s*([^|\s]+)(.*)/i; +export const PPL_INDEX_REGEX = /(search source|source|index)\s*=\s*([^|\s]+)/i; +export const PPL_WHERE_CLAUSE_REGEX = /\s*where\s+/i; +export const PPL_NEWLINE_REGEX = /[\n\r]+/g; +export const PPL_DESCRIBE_INDEX_REGEX = /(describe)\s+([^|\s]+)/i; + +// Observability plugin URI +const BASE_OBSERVABILITY_URI = '/_plugins/_observability'; +const BASE_DATACONNECTIONS_URI = '/_plugins/_query/_datasources'; +export const OPENSEARCH_PANELS_API = { + OBJECT: `${BASE_OBSERVABILITY_URI}/object`, +}; +export const OPENSEARCH_DATACONNECTIONS_API = { + DATACONNECTION: `${BASE_DATACONNECTIONS_URI}`, +}; + +// Saved Objects +export const SAVED_OBJECT = '/object'; + +// Color Constants +export const PLOTLY_COLOR = [ + '#3CA1C7', + '#54B399', + '#DB748A', + '#F2BE4B', + '#68CCC2', + '#2A7866', + '#843769', + '#374FB8', + '#BD6F26', + '#4C636F', +]; + +export const LONG_CHART_COLOR = PLOTLY_COLOR[1]; + +export const pageStyles: CSS.Properties = { + float: 'left', + width: '100%', + maxWidth: '1130px', +}; + +export enum VIS_CHART_TYPES { + Bar = 'bar', + HorizontalBar = 'horizontal_bar', + Line = 'line', + Pie = 'pie', + HeatMap = 'heatmap', + Text = 'text', + Histogram = 'histogram', +} + +export const NUMERICAL_FIELDS = ['short', 'integer', 'long', 'float', 'double']; + +export const ENABLED_VIS_TYPES = [ + VIS_CHART_TYPES.Bar, + VIS_CHART_TYPES.HorizontalBar, + VIS_CHART_TYPES.Line, + VIS_CHART_TYPES.Pie, + VIS_CHART_TYPES.HeatMap, + VIS_CHART_TYPES.Text, +]; + +// Live tail constants +export const LIVE_OPTIONS = [ + { + label: '5s', + startTime: 'now-5s', + delayTime: 5000, + }, + { + label: '10s', + startTime: 'now-10s', + delayTime: 10000, + }, + { + label: '30s', + startTime: 'now-30s', + delayTime: 30000, + }, + { + label: '1m', + startTime: 'now-1m', + delayTime: 60000, + }, + { + label: '5m', + startTime: 'now-5m', + delayTime: 60000 * 5, + }, + { + label: '15m', + startTime: 'now-15m', + delayTime: 60000 * 15, + }, + { + label: '30m', + startTime: 'now-30m', + delayTime: 60000 * 30, + }, + { + label: '1h', + startTime: 'now-1h', + delayTime: 60000 * 60, + }, + { + label: '2h', + startTime: 'now-2h', + delayTime: 60000 * 120, + }, +]; + +export const LIVE_END_TIME = 'now'; + +export interface DefaultChartStylesProps { + DefaultModeLine: string; + Interpolation: string; + LineWidth: number; + FillOpacity: number; + MarkerSize: number; + ShowLegend: string; + LegendPosition: string; + LabelAngle: number; + DefaultSortSectors: string; + DefaultModeScatter: string; +} + +export const DEFAULT_CHART_STYLES: DefaultChartStylesProps = { + DefaultModeLine: 'lines+markers', + Interpolation: 'spline', + LineWidth: 0, + FillOpacity: 100, + MarkerSize: 25, + ShowLegend: 'show', + LegendPosition: 'v', + LabelAngle: 0, + DefaultSortSectors: 'largest_to_smallest', + DefaultModeScatter: 'markers', +}; + +export const FILLOPACITY_DIV_FACTOR = 200; +export const SLIDER_MIN_VALUE = 0; +export const SLIDER_MAX_VALUE = 100; +export const SLIDER_STEP = 1; +export const THRESHOLD_LINE_WIDTH = 3; +export const THRESHOLD_LINE_OPACITY = 0.7; +export const MAX_BUCKET_LENGTH = 16; + +export enum BarOrientation { + horizontal = 'h', + vertical = 'v', +} + +export const PLOT_MARGIN = { + l: 30, + r: 5, + b: 30, + t: 50, + pad: 4, +}; + +export const WAITING_TIME_ON_USER_ACTIONS = 300; + +export const VISUALIZATION_ERROR = { + NO_DATA: 'No data found.', + INVALID_DATA: 'Invalid visualization data', + NO_SERIES: 'Add a field to start', + NO_METRIC: 'Invalid Metric MetaData', +}; + +export const S3_DATA_SOURCE_TYPE = 's3glue'; + +export const ASYNC_QUERY_SESSION_ID = 'async-query-session-id'; +export const ASYNC_QUERY_DATASOURCE_CACHE = 'async-query-catalog-cache'; +export const ASYNC_QUERY_ACCELERATIONS_CACHE = 'async-query-acclerations-cache'; + +export const DIRECT_DUMMY_QUERY = 'select 1'; + +export const DEFAULT_START_TIME = 'now-15m'; +export const QUERY_ASSIST_START_TIME = 'now-40y'; +export const QUERY_ASSIST_END_TIME = 'now'; + +export const TIMESTAMP_DATETIME_TYPES = ['date', 'date_nanos']; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts new file mode 100644 index 00000000000..74fedd6cf11 --- /dev/null +++ b/src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts @@ -0,0 +1,137 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useEffect, useRef, useState } from 'react'; + +type FetchFunction = (params?: P) => Promise; + +export interface PollingConfigurations { + tabId: string; +} + +export class UsePolling { + public data: T | null = null; + public error: Error | null = null; + public loading: boolean = true; + private shouldPoll: boolean = false; + private intervalRef?: NodeJS.Timeout; + + constructor( + private fetchFunction: FetchFunction, + private interval: number = 5000, + private onPollingSuccess?: (data: T, configurations: PollingConfigurations) => boolean, + private onPollingError?: (error: Error) => boolean, + private configurations?: PollingConfigurations + ) {} + + async fetchData(params?: P) { + this.loading = true; + try { + const result = await this.fetchFunction(params); + this.data = result; + this.loading = false; + + if (this.onPollingSuccess && this.onPollingSuccess(result, this.configurations!)) { + this.stopPolling(); + } + } catch (err) { + this.error = err as Error; + this.loading = false; + + if (this.onPollingError && this.onPollingError(this.error)) { + this.stopPolling(); + } + } + } + + startPolling(params?: P) { + this.shouldPoll = true; + if (!this.intervalRef) { + this.intervalRef = setInterval(() => { + if (this.shouldPoll) { + this.fetchData(params); + } + }, this.interval); + } + } + + stopPolling() { + this.shouldPoll = false; + if (this.intervalRef) { + clearInterval(this.intervalRef); + this.intervalRef = undefined; + } + } +} + +interface UsePollingReturn { + data: T | null; + loading: boolean; + error: Error | null; + startPolling: (params?: any) => void; + stopPolling: () => void; +} + +export function usePolling( + fetchFunction: FetchFunction, + interval: number = 5000, + onPollingSuccess?: (data: T, configurations: PollingConfigurations) => boolean, + onPollingError?: (error: Error) => boolean, + configurations?: PollingConfigurations +): UsePollingReturn { + const [data, setData] = useState(null); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(true); + const intervalRef = useRef(undefined); + const unmounted = useRef(false); + + const shouldPoll = useRef(false); + + const startPolling = (params?: P) => { + shouldPoll.current = true; + const intervalId = setInterval(() => { + if (shouldPoll.current) { + fetchData(params); + } + }, interval); + intervalRef.current = intervalId; + if (unmounted.current) { + clearInterval(intervalId); + } + }; + + const stopPolling = () => { + shouldPoll.current = false; + clearInterval(intervalRef.current); + }; + + const fetchData = async (params?: P) => { + try { + const result = await fetchFunction(params); + setData(result); + // Check the success condition and stop polling if it's met + if (onPollingSuccess && onPollingSuccess(result, configurations)) { + stopPolling(); + } + } catch (err: unknown) { + setError(err as Error); + + // Check the error condition and stop polling if it's met + if (onPollingError && onPollingError(err as Error)) { + stopPolling(); + } + } finally { + setLoading(false); + } + }; + + useEffect(() => { + return () => { + unmounted.current = true; + }; + }, []); + + return { data, loading, error, startPolling, stopPolling }; +} diff --git a/src/plugins/data/public/ui/index.ts b/src/plugins/data/public/ui/index.ts index 5483b540d5b..400887e51d5 100644 --- a/src/plugins/data/public/ui/index.ts +++ b/src/plugins/data/public/ui/index.ts @@ -49,3 +49,4 @@ export { } from './query_editor'; export { SearchBar, SearchBarProps, StatefulSearchBarProps } from './search_bar'; export { SuggestionsComponent } from './typeahead'; +export { DataSetNavigator } from './dataset_navigator'; diff --git a/src/plugins/data/public/ui/query_editor/_language_switcher.scss b/src/plugins/data/public/ui/query_editor/_language_switcher.scss deleted file mode 100644 index 176d072c102..00000000000 --- a/src/plugins/data/public/ui/query_editor/_language_switcher.scss +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ -.languageSelect { - max-width: 150px; - transform: translateY(-1px) translateX(-0.5px); -} diff --git a/src/plugins/data/public/ui/query_editor/_query_editor.scss b/src/plugins/data/public/ui/query_editor/_query_editor.scss index 8fc81308b53..ac411b38ab8 100644 --- a/src/plugins/data/public/ui/query_editor/_query_editor.scss +++ b/src/plugins/data/public/ui/query_editor/_query_editor.scss @@ -86,6 +86,12 @@ } } +.osdQueryEditor__dataSetNavigatorWrapper { + :first-child { + border-bottom: $euiBorderThin !important; + } +} + @include euiBreakpoint("xs", "s") { .osdQueryEditor--withDatePicker { > :first-child { diff --git a/src/plugins/data/public/ui/query_editor/language_selector.test.tsx b/src/plugins/data/public/ui/query_editor/language_selector.test.tsx index f61134211a4..62c4ebea288 100644 --- a/src/plugins/data/public/ui/query_editor/language_selector.test.tsx +++ b/src/plugins/data/public/ui/query_editor/language_selector.test.tsx @@ -8,7 +8,6 @@ import { QueryLanguageSelector } from './language_selector'; import { OpenSearchDashboardsContextProvider } from 'src/plugins/opensearch_dashboards_react/public'; import { coreMock } from '../../../../../core/public/mocks'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { EuiCompressedComboBox } from '@elastic/eui'; import { QueryEnhancement } from '../types'; const startMock = coreMock.createStart(); diff --git a/src/plugins/data/public/ui/query_editor/language_switcher.tsx b/src/plugins/data/public/ui/query_editor/language_switcher.tsx deleted file mode 100644 index be22ebffd77..00000000000 --- a/src/plugins/data/public/ui/query_editor/language_switcher.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { EuiComboBox, EuiComboBoxOptionOption, PopoverAnchorPosition } from '@elastic/eui'; -import { i18n } from '@osd/i18n'; -import React from 'react'; -import { getSearchService, getUiService } from '../../services'; - -interface Props { - language: string; - onSelectLanguage: (newLanguage: string) => void; - anchorPosition?: PopoverAnchorPosition; - appName?: string; -} - -function mapExternalLanguageToOptions(language: string) { - return { - label: language, - value: language, - }; -} - -export function QueryLanguageSwitcher(props: Props) { - const dqlLabel = i18n.translate('data.query.queryBar.dqlLanguageName', { - defaultMessage: 'DQL', - }); - const luceneLabel = i18n.translate('data.query.queryBar.luceneLanguageName', { - defaultMessage: 'Lucene', - }); - - const languageOptions: EuiComboBoxOptionOption[] = [ - { - label: dqlLabel, - value: 'kuery', - }, - { - label: luceneLabel, - value: 'lucene', - }, - ]; - - const uiService = getUiService(); - const searchService = getSearchService(); - - const queryEnhancements = uiService.queryEnhancements; - if (uiService.isEnhancementsEnabled) { - queryEnhancements.forEach((enhancement) => { - if ( - enhancement.supportedAppNames && - props.appName && - !enhancement.supportedAppNames.includes(props.appName) - ) - return; - languageOptions.push(mapExternalLanguageToOptions(enhancement.language)); - }); - } - - const selectedLanguage = { - label: - (languageOptions.find( - (option) => (option.value as string).toLowerCase() === props.language.toLowerCase() - )?.label as string) ?? languageOptions[0].label, - }; - - const setSearchEnhance = (queryLanguage: string) => { - if (!uiService.isEnhancementsEnabled) return; - const queryEnhancement = queryEnhancements.get(queryLanguage); - searchService.__enhance({ - searchInterceptor: queryEnhancement - ? queryEnhancement.search - : searchService.getDefaultSearchInterceptor(), - }); - - if (!queryEnhancement) { - searchService.df.clear(); - } - uiService.Settings.setUiOverridesByUserQueryLanguage(queryLanguage); - }; - - const handleLanguageChange = (newLanguage: EuiComboBoxOptionOption[]) => { - const queryLanguage = newLanguage[0].value as string; - props.onSelectLanguage(queryLanguage); - setSearchEnhance(queryLanguage); - }; - - setSearchEnhance(props.language); - - return ( - - ); -} diff --git a/src/plugins/data/public/ui/query_editor/query_editor.tsx b/src/plugins/data/public/ui/query_editor/query_editor.tsx index 44d000de1e8..db4984b637d 100644 --- a/src/plugins/data/public/ui/query_editor/query_editor.tsx +++ b/src/plugins/data/public/ui/query_editor/query_editor.tsx @@ -3,14 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { - EuiFlexGroup, - EuiFlexItem, - EuiForm, - EuiFormRow, - htmlIdGenerator, - PopoverAnchorPosition, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, htmlIdGenerator, PopoverAnchorPosition } from '@elastic/eui'; import classNames from 'classnames'; import { isEqual } from 'lodash'; import React, { Component, createRef, RefObject } from 'react'; @@ -44,10 +37,7 @@ export interface QueryEditorProps { indexPatterns: Array; dataSource?: DataSource; query: Query; - container?: HTMLDivElement; - dataSourceContainerRef?: React.RefCallback; - containerRef?: React.RefCallback; - languageSelectorContainerRef?: React.RefCallback; + dataSetContainerRef?: React.RefCallback; settings: Settings; disableAutoFocus?: boolean; screenTitle?: string; @@ -60,7 +50,7 @@ export interface QueryEditorProps { onChange?: (query: Query, dateRange?: TimeRange) => void; onChangeQueryEditorFocus?: (isFocused: boolean) => void; onSubmit?: (query: Query, dateRange?: TimeRange) => void; - getQueryStringInitialValue?: (language: string) => string; + getQueryStringInitialValue?: (language: string, dataSetName?: string) => string; dataTestSubj?: string; size?: SuggestionsListSize; className?: string; @@ -77,8 +67,6 @@ interface Props extends QueryEditorProps { } interface State { - isDataSourcesVisible: boolean; - isDataSetsVisible: boolean; isSuggestionsVisible: boolean; index: number | null; suggestions: QuerySuggestion[]; @@ -105,8 +93,6 @@ const KEY_CODES = { // eslint-disable-next-line import/no-default-export export default class QueryEditorUI extends Component { public state: State = { - isDataSourcesVisible: false, - isDataSetsVisible: true, isSuggestionsVisible: false, index: null, suggestions: [], @@ -121,7 +107,6 @@ export default class QueryEditorUI extends Component { private persistedLog: PersistedLog | undefined; private abortController?: AbortController; private services = this.props.opensearchDashboards.services; - private componentIsUnmounting = false; private headerRef: RefObject = createRef(); private bannerRef: RefObject = createRef(); private extensionMap = this.props.settings?.getQueryEditorExtensionMap(); @@ -250,10 +235,6 @@ export default class QueryEditorUI extends Component { : undefined; this.onChange(newQuery, dateRange); this.onSubmit(newQuery, dateRange); - this.setState({ - isDataSourcesVisible: enhancement?.searchBar?.showDataSourcesSelector ?? true, - isDataSetsVisible: enhancement?.searchBar?.showDataSetsSelector ?? true, - }); }; private initPersistedLog = () => { @@ -263,20 +244,6 @@ export default class QueryEditorUI extends Component { : getQueryLog(uiSettings, storage, appName, this.props.query.language); }; - private initDataSourcesVisibility = () => { - if (this.componentIsUnmounting) return; - - return this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar - ?.showDataSourcesSelector; - }; - - private initDataSetsVisibility = () => { - if (this.componentIsUnmounting) return; - - return this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar - ?.showDataSetsSelector; - }; - public onMouseEnterSuggestion = (index: number) => { this.setState({ index }); }; @@ -291,10 +258,6 @@ export default class QueryEditorUI extends Component { this.initPersistedLog(); // this.fetchIndexPatterns().then(this.updateSuggestions); - this.setState({ - isDataSourcesVisible: this.initDataSourcesVisibility() || true, - isDataSetsVisible: this.initDataSetsVisibility() || true, - }); } public componentDidUpdate(prevProps: Props) { @@ -308,7 +271,6 @@ export default class QueryEditorUI extends Component { public componentWillUnmount() { if (this.abortController) this.abortController.abort(); - this.componentIsUnmounting = true; } handleOnFocus = () => { @@ -431,6 +393,15 @@ export default class QueryEditorUI extends Component { const useQueryEditor = this.props.query.language !== 'kuery' && this.props.query.language !== 'lucene'; + const languageSelector = ( + + ); + return (
@@ -443,17 +414,9 @@ export default class QueryEditorUI extends Component { isCollapsed={!this.state.isCollapsed} /> - {this.state.isDataSourcesVisible && ( - -
- - )} - - {this.state.isDataSetsVisible && ( - -
- - )} + +
+ {(this.state.isCollapsed || !useQueryEditor) && ( @@ -496,14 +459,7 @@ export default class QueryEditorUI extends Component { )} {!useQueryEditor && ( -
- -
+
{languageSelector}
)}
@@ -557,15 +513,7 @@ export default class QueryEditorUI extends Component { } > - - - + {languageSelector} {this.state.lineCount} {this.state.lineCount === 1 ? 'line' : 'lines'} diff --git a/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx b/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx index a482d741641..971d13cfc05 100644 --- a/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx +++ b/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx @@ -39,8 +39,7 @@ const QueryEditor = withOpenSearchDashboards(QueryEditorUI); // @internal export interface QueryEditorTopRowProps { query?: Query; - dataSourceContainerRef?: React.RefCallback; - containerRef?: React.RefCallback; + dataSetContainerRef?: React.RefCallback; settings?: Settings; onSubmit: (payload: { dateRange: TimeRange; query?: Query }) => void; onChange: (payload: { dateRange: TimeRange; query?: Query }) => void; @@ -208,11 +207,10 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) { ) return ''; - const defaultDataSource = indexPatterns[0]; - const dataSource = - typeof defaultDataSource === 'string' ? defaultDataSource : defaultDataSource.title; + const defaultDataSet = indexPatterns[0]; + const dataSet = typeof defaultDataSet === 'string' ? defaultDataSet : defaultDataSet.title; - return input.replace('', dataSource); + return input.replace('', dataSet); } function renderQueryEditor() { @@ -225,8 +223,7 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) { dataSource={props.dataSource} prepend={props.prepend} query={parsedQuery} - dataSourceContainerRef={props.dataSourceContainerRef} - containerRef={props.containerRef} + dataSetContainerRef={props.dataSetContainerRef} settings={props.settings!} screenTitle={props.screenTitle} onChange={onQueryChange} diff --git a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx index 31f3401dc76..d722aeda510 100644 --- a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx @@ -48,8 +48,7 @@ interface StatefulSearchBarDeps { data: Omit; storage: IStorageWrapper; settings: Settings; - setDataSourceContainerRef: (ref: HTMLDivElement | null) => void; - setContainerRef: (ref: HTMLDivElement | null) => void; + setDataSetContainerRef: (ref: HTMLDivElement | null) => void; } export type StatefulSearchBarProps = SearchBarOwnProps & { @@ -139,8 +138,7 @@ export function createSearchBar({ storage, data, settings, - setDataSourceContainerRef, - setContainerRef, + setDataSetContainerRef, }: StatefulSearchBarDeps) { // App name should come from the core application service. // Until it's available, we'll ask the user to provide it for the pre-wired component. @@ -176,15 +174,9 @@ export function createSearchBar({ notifications: core.notifications, }); - const dataSourceContainerRef = useCallback((node) => { + const dataSetContainerRef = useCallback((node) => { if (node) { - setDataSourceContainerRef(node); - } - }, []); - - const containerRef = useCallback((node) => { - if (node) { - setContainerRef(node); + setDataSetContainerRef(node); } }, []); @@ -228,8 +220,7 @@ export function createSearchBar({ filters={filters} query={query} settings={settings} - dataSourceContainerRef={dataSourceContainerRef} - containerRef={containerRef} + dataSetContainerRef={dataSetContainerRef} onFiltersUpdated={defaultFiltersUpdated(data.query)} onRefreshChange={defaultOnRefreshChange(data.query)} savedQuery={savedQuery} diff --git a/src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts b/src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts new file mode 100644 index 00000000000..7a92d03e9f3 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts @@ -0,0 +1,39 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useState, useEffect } from 'react'; +import { Subscription } from 'rxjs'; +import { SimpleDataSet } from '../../../../../data/common'; +import { DataSetContract } from '../../../query'; + +interface UseDataSetManagerProps { + dataSet?: SimpleDataSet; + dataSetManager: DataSetContract; +} + +export const useDataSetManager = (props: UseDataSetManagerProps) => { + const [dataSet, setDataSet] = useState( + props.dataSet || props.dataSetManager.getDataSet() + ); + + useEffect(() => { + const subscriptions = new Subscription(); + + subscriptions.add( + props.dataSetManager.getUpdates$().subscribe({ + next: () => { + const newDataSet = props.dataSetManager.getDataSet(); + setDataSet(newDataSet); + }, + }) + ); + + return () => { + subscriptions.unsubscribe(); + }; + }, [dataSet, props.dataSet, props.dataSetManager]); + + return { dataSet }; +}; diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index b2ff6766e81..4dddba69ff9 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -81,8 +81,7 @@ export interface SearchBarOwnProps { // Query bar - should be in SearchBarInjectedDeps query?: Query; settings?: Settings; - dataSourceContainerRef?: React.RefCallback; - containerRef?: React.RefCallback; + dataSetContainerRef?: React.RefCallback; // Show when user has privileges to save showSaveQuery?: boolean; savedQuery?: SavedQuery; @@ -493,8 +492,7 @@ class SearchBarUI extends Component { queryEditor = ( ; + /** + * @experimental - Subject to change + */ + DataSetNavigator: React.ComponentType; SearchBar: React.ComponentType; SuggestionsComponent: React.ComponentType; + /** + * @experimental - Subject to change + */ Settings: Settings; - dataSourceContainer$: Observable; - container$: Observable; + dataSetContainer$: Observable; } diff --git a/src/plugins/data/public/ui/ui_service.ts b/src/plugins/data/public/ui/ui_service.ts index 1e0e6be8b78..4f403597467 100644 --- a/src/plugins/data/public/ui/ui_service.ts +++ b/src/plugins/data/public/ui/ui_service.ts @@ -8,6 +8,7 @@ import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core import { IStorageWrapper } from '../../../opensearch_dashboards_utils/public'; import { ConfigSchema } from '../../config'; import { DataPublicPluginStart } from '../types'; +import { createDataSetNavigator } from './dataset_navigator'; import { createIndexPatternSelect } from './index_pattern_select'; import { QueryEditorExtensionConfig } from './query_editor'; import { createSearchBar } from './search_bar/create_search_bar'; @@ -29,8 +30,7 @@ export class UiService implements Plugin { enhancementsConfig: ConfigSchema['enhancements']; private queryEnhancements: Map = new Map(); private queryEditorExtensionMap: Record = {}; - private dataSourceContainer$ = new BehaviorSubject(null); - private container$ = new BehaviorSubject(null); + private dataSetContainer$ = new BehaviorSubject(null); constructor(initializerContext: PluginInitializerContext) { const { enhancements } = initializerContext.config.get(); @@ -62,12 +62,8 @@ export class UiService implements Plugin { queryEditorExtensionMap: this.queryEditorExtensionMap, }); - const setDataSourceContainerRef = (ref: HTMLDivElement | null) => { - this.dataSourceContainer$.next(ref); - }; - - const setContainerRef = (ref: HTMLDivElement | null) => { - this.container$.next(ref); + const setDataSetContainerRef = (ref: HTMLDivElement | null) => { + this.dataSetContainer$.next(ref); }; const SearchBar = createSearchBar({ @@ -75,17 +71,20 @@ export class UiService implements Plugin { data: dataServices, storage, settings: Settings, - setDataSourceContainerRef, - setContainerRef, + setDataSetContainerRef, }); return { IndexPatternSelect: createIndexPatternSelect(core.savedObjects.client), + DataSetNavigator: createDataSetNavigator( + core.savedObjects.client, + core.http, + dataServices.query.dataSet + ), SearchBar, SuggestionsComponent, Settings, - dataSourceContainer$: this.dataSourceContainer$, - container$: this.container$, + dataSetContainer$: this.dataSetContainer$, }; } diff --git a/src/plugins/data/server/search/search_service.ts b/src/plugins/data/server/search/search_service.ts index ecc17dbfe71..02ca0c30161 100644 --- a/src/plugins/data/server/search/search_service.ts +++ b/src/plugins/data/server/search/search_service.ts @@ -229,7 +229,10 @@ export class SearchService implements Plugin { dataFrame.meta.queryConfig.dataSourceId = dataSource?.id; } this.dfCache.set(dataFrame); - const existingIndexPattern = scopedIndexPatterns.getByTitle(dataFrame.name!, true); + const dataSetName = `${dataFrame.meta?.queryConfig?.dataSourceId ?? ''}.${ + dataFrame.name + }`; + const existingIndexPattern = await scopedIndexPatterns.get(dataSetName, true); const dataSet = await scopedIndexPatterns.create( dataFrameToSpec(dataFrame, existingIndexPattern?.id), !existingIndexPattern?.id @@ -239,8 +242,6 @@ export class SearchService implements Plugin { }, clear: () => { if (this.dfCache.get() === undefined) return; - // name because the id is not unique for temporary index pattern created - scopedIndexPatterns.clearCache(this.dfCache.get()!.name, false); this.dfCache.clear(); }, }; diff --git a/src/plugins/data_explorer/public/components/sidebar/index.tsx b/src/plugins/data_explorer/public/components/sidebar/index.tsx index eea1860dc95..616be16e9f5 100644 --- a/src/plugins/data_explorer/public/components/sidebar/index.tsx +++ b/src/plugins/data_explorer/public/components/sidebar/index.tsx @@ -30,6 +30,8 @@ export const Sidebar: FC = ({ children }) => { }, } = useOpenSearchDashboards(); + const { DataSetNavigator } = ui; + useEffect(() => { const subscriptions = ui.Settings.getEnabledQueryEnhancementsUpdated$().subscribe( (enabledQueryEnhancements) => { @@ -48,17 +50,17 @@ export const Sidebar: FC = ({ children }) => { useEffect(() => { if (!isEnhancementsEnabled) return; - const subscriptions = ui.container$.subscribe((container) => { - if (container === null) return; + const subscriptions = ui.dataSetContainer$.subscribe((dataSetContainer) => { + if (dataSetContainer === null) return; if (containerRef.current) { - setContainerRef(container); + setContainerRef(dataSetContainer); } }); return () => { subscriptions.unsubscribe(); }; - }, [ui.container$, containerRef, setContainerRef, isEnhancementsEnabled]); + }, [ui.dataSetContainer$, containerRef, setContainerRef, isEnhancementsEnabled]); useEffect(() => { let isMounted = true; @@ -134,19 +136,6 @@ export const Sidebar: FC = ({ children }) => { dataSources.dataSourceService.reload(); }, [dataSources.dataSourceService]); - const dataSourceSelector = ( - - ); - return ( { containerRef.current = node; }} > - {dataSourceSelector} + )} {!isEnhancementsEnabled && ( @@ -171,7 +160,16 @@ export const Sidebar: FC = ({ children }) => { color="transparent" className="deSidebar_dataSource" > - {dataSourceSelector} + )} diff --git a/src/plugins/data_explorer/public/index.ts b/src/plugins/data_explorer/public/index.ts index f8adda434ce..6b0561261c1 100644 --- a/src/plugins/data_explorer/public/index.ts +++ b/src/plugins/data_explorer/public/index.ts @@ -18,4 +18,5 @@ export { useTypedSelector, useTypedDispatch, setIndexPattern, + setDataSet, } from './utils/state_management'; diff --git a/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts b/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts index e9fe8471312..fa41a29259e 100644 --- a/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts +++ b/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts @@ -5,11 +5,13 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { DataExplorerServices } from '../../types'; +import { SimpleDataSet } from '../../../../data/common'; export interface MetadataState { indexPattern?: string; originatingApp?: string; view?: string; + dataSet?: Omit; } const initialState: MetadataState = {}; @@ -40,6 +42,9 @@ export const slice = createSlice({ setIndexPattern: (state, action: PayloadAction) => { state.indexPattern = action.payload; }, + setDataSet: (state, action: PayloadAction>) => { + state.dataSet = action.payload; + }, setOriginatingApp: (state, action: PayloadAction) => { state.originatingApp = action.payload; }, @@ -53,4 +58,4 @@ export const slice = createSlice({ }); export const { reducer } = slice; -export const { setIndexPattern, setOriginatingApp, setView, setState } = slice.actions; +export const { setIndexPattern, setDataSet, setOriginatingApp, setView, setState } = slice.actions; diff --git a/src/plugins/data_explorer/public/utils/state_management/store.ts b/src/plugins/data_explorer/public/utils/state_management/store.ts index daf0b3d7e36..9d320de4b54 100644 --- a/src/plugins/data_explorer/public/utils/state_management/store.ts +++ b/src/plugins/data_explorer/public/utils/state_management/store.ts @@ -116,4 +116,4 @@ export type RenderState = Omit; // Remaining state after export type Store = ReturnType; export type AppDispatch = Store['dispatch']; -export { MetadataState, setIndexPattern, setOriginatingApp } from './metadata_slice'; +export { MetadataState, setIndexPattern, setDataSet, setOriginatingApp } from './metadata_slice'; diff --git a/src/plugins/discover/public/application/utils/state_management/index.ts b/src/plugins/discover/public/application/utils/state_management/index.ts index 989b2662f0d..e6df7e4774b 100644 --- a/src/plugins/discover/public/application/utils/state_management/index.ts +++ b/src/plugins/discover/public/application/utils/state_management/index.ts @@ -7,6 +7,7 @@ import { TypedUseSelectorHook } from 'react-redux'; import { RootState, setIndexPattern as updateIndexPattern, + setDataSet as updateDataSet, useTypedDispatch, useTypedSelector, } from '../../../../../data_explorer/public'; @@ -20,4 +21,4 @@ export interface DiscoverRootState extends RootState { export const useSelector: TypedUseSelectorHook = useTypedSelector; export const useDispatch = useTypedDispatch; -export { updateIndexPattern }; +export { updateIndexPattern, updateDataSet }; diff --git a/src/plugins/discover/public/application/view_components/utils/update_search_source.ts b/src/plugins/discover/public/application/view_components/utils/update_search_source.ts index a8480fdad18..05d4a2dbd8b 100644 --- a/src/plugins/discover/public/application/view_components/utils/update_search_source.ts +++ b/src/plugins/discover/public/application/view_components/utils/update_search_source.ts @@ -30,7 +30,12 @@ export const updateSearchSource = async ({ histogramConfigs, }: Props) => { const { uiSettings, data } = services; - let dataSet = indexPattern; + const queryDataSet = data.query.dataSet.getDataSet(); + + let dataSet = + indexPattern.id === queryDataSet?.id + ? await data.indexPatterns.getByTitle(queryDataSet?.title!) + : indexPattern; const dataFrame = searchSource?.getDataFrame(); if ( searchSource && diff --git a/src/plugins/discover/public/application/view_components/utils/use_search.ts b/src/plugins/discover/public/application/view_components/utils/use_search.ts index 8c2ace81b04..1e40cf40a8a 100644 --- a/src/plugins/discover/public/application/view_components/utils/use_search.ts +++ b/src/plugins/discover/public/application/view_components/utils/use_search.ts @@ -250,7 +250,8 @@ export const useSearch = (services: DiscoverViewServices) => { timefilter.getFetch$(), timefilter.getTimeUpdate$(), timefilter.getAutoRefreshFetch$(), - data.query.queryString.getUpdates$() + data.query.queryString.getUpdates$(), + data.query.dataSet.getUpdates$() ).pipe(debounceTime(100)); const subscription = fetch$.subscribe(() => { @@ -280,6 +281,7 @@ export const useSearch = (services: DiscoverViewServices) => { fetch, core.fatalErrors, shouldSearchOnPageLoad, + data.query.dataSet, ]); // Get savedSearch if it exists diff --git a/src/plugins/query_enhancements/opensearch_dashboards.json b/src/plugins/query_enhancements/opensearch_dashboards.json index b09494aab0c..69d8fd3bd66 100644 --- a/src/plugins/query_enhancements/opensearch_dashboards.json +++ b/src/plugins/query_enhancements/opensearch_dashboards.json @@ -3,7 +3,7 @@ "version": "opensearchDashboards", "server": true, "ui": true, - "requiredPlugins": ["data", "opensearchDashboardsReact", "opensearchDashboardsUtils", "dataSourceManagement", "savedObjects", "uiActions"], + "requiredPlugins": ["data", "opensearchDashboardsReact", "opensearchDashboardsUtils", "savedObjects", "uiActions"], "optionalPlugins": ["dataSource"] } diff --git a/src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx b/src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx deleted file mode 100644 index 3fd592e50b3..00000000000 --- a/src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import React, { useEffect, useRef, useState } from 'react'; -import { EuiPortal } from '@elastic/eui'; -import { distinctUntilChanged } from 'rxjs/operators'; -import { ToastsSetup } from 'opensearch-dashboards/public'; -import { DataPublicPluginStart, QueryEditorExtensionDependencies } from '../../../../data/public'; -import { DataSourceSelector } from '../../../../data_source_management/public'; -import { ConnectionsService } from '../services'; - -interface ConnectionsProps { - dependencies: QueryEditorExtensionDependencies; - toasts: ToastsSetup; - connectionsService: ConnectionsService; -} - -export const ConnectionsBar: React.FC = ({ connectionsService, toasts }) => { - const [isDataSourceEnabled, setIsDataSourceEnabled] = useState(false); - const [uiService, setUiService] = useState(undefined); - const containerRef = useRef(null); - - useEffect(() => { - const uiServiceSubscription = connectionsService.getUiService().subscribe(setUiService); - const dataSourceEnabledSubscription = connectionsService - .getIsDataSourceEnabled$() - .subscribe(setIsDataSourceEnabled); - - return () => { - uiServiceSubscription.unsubscribe(); - dataSourceEnabledSubscription.unsubscribe(); - }; - }, [connectionsService]); - - useEffect(() => { - if (!uiService || !isDataSourceEnabled || !containerRef.current) return; - const subscriptions = uiService.dataSourceContainer$.subscribe((container) => { - if (container && containerRef.current) { - container.append(containerRef.current); - } - }); - - return () => subscriptions.unsubscribe(); - }, [uiService, isDataSourceEnabled]); - - useEffect(() => { - const selectedConnectionSubscription = connectionsService - .getSelectedConnection$() - .pipe(distinctUntilChanged()) - .subscribe((connection) => { - if (connection) { - // Assuming setSelectedConnection$ is meant to update some state or perform an action outside this component - connectionsService.setSelectedConnection$(connection); - } - }); - - return () => selectedConnectionSubscription.unsubscribe(); - }, [connectionsService]); - - const handleSelectedConnection = (id: string | undefined) => { - if (!id) { - connectionsService.setSelectedConnection$(undefined); - return; - } - connectionsService.getConnectionById(id).subscribe((connection) => { - connectionsService.setSelectedConnection$(connection); - }); - }; - - return ( - { - containerRef.current = node; - }} - > -
- - handleSelectedConnection(dataSource[0]?.id || undefined) - } - /> -
-
- ); -}; diff --git a/src/plugins/query_enhancements/public/data_source_connection/index.ts b/src/plugins/query_enhancements/public/data_source_connection/index.ts deleted file mode 100644 index e334163d91d..00000000000 --- a/src/plugins/query_enhancements/public/data_source_connection/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export { createDataSourceConnectionExtension } from './utils'; -export * from './services'; diff --git a/src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx b/src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx deleted file mode 100644 index e5822c4b378..00000000000 --- a/src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import React from 'react'; -import { ToastsSetup } from 'opensearch-dashboards/public'; -import { QueryEditorExtensionConfig } from '../../../../data/public'; -import { ConfigSchema } from '../../../common/config'; -import { ConnectionsBar } from '../components'; -import { ConnectionsService } from '../services'; - -export const createDataSourceConnectionExtension = ( - connectionsService: ConnectionsService, - toasts: ToastsSetup, - config: ConfigSchema -): QueryEditorExtensionConfig => { - return { - id: 'data-source-connection', - order: 2000, - isEnabled$: (dependencies) => { - return connectionsService.getIsDataSourceEnabled$(); - }, - getComponent: (dependencies) => { - return ( - - ); - }, - }; -}; diff --git a/src/plugins/query_enhancements/public/plugin.tsx b/src/plugins/query_enhancements/public/plugin.tsx index d65676b70e7..b74c00ced7e 100644 --- a/src/plugins/query_enhancements/public/plugin.tsx +++ b/src/plugins/query_enhancements/public/plugin.tsx @@ -7,10 +7,9 @@ import moment from 'moment'; import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '../../../core/public'; import { IStorageWrapper, Storage } from '../../opensearch_dashboards_utils/public'; import { ConfigSchema } from '../common/config'; -import { ConnectionsService, createDataSourceConnectionExtension } from './data_source_connection'; +import { ConnectionsService, setData, setStorage } from './services'; import { createQueryAssistExtension } from './query_assist'; -import { PPLSearchInterceptor, SQLAsyncSearchInterceptor, SQLSearchInterceptor } from './search'; -import { setData, setStorage } from './services'; +import { PPLSearchInterceptor, SQLSearchInterceptor } from './search'; import { QueryEnhancementsPluginSetup, QueryEnhancementsPluginSetupDependencies, @@ -44,38 +43,21 @@ export class QueryEnhancementsPlugin http: core.http, }); - const pplSearchInterceptor = new PPLSearchInterceptor( - { - toasts: core.notifications.toasts, - http: core.http, - uiSettings: core.uiSettings, - startServices: core.getStartServices(), - usageCollector: data.search.usageCollector, - }, - this.connectionsService - ); - - const sqlSearchInterceptor = new SQLSearchInterceptor( - { - toasts: core.notifications.toasts, - http: core.http, - uiSettings: core.uiSettings, - startServices: core.getStartServices(), - usageCollector: data.search.usageCollector, - }, - this.connectionsService - ); + const pplSearchInterceptor = new PPLSearchInterceptor({ + toasts: core.notifications.toasts, + http: core.http, + uiSettings: core.uiSettings, + startServices: core.getStartServices(), + usageCollector: data.search.usageCollector, + }); - const sqlAsyncSearchInterceptor = new SQLAsyncSearchInterceptor( - { - toasts: core.notifications.toasts, - http: core.http, - uiSettings: core.uiSettings, - startServices: core.getStartServices(), - usageCollector: data.search.usageCollector, - }, - this.connectionsService - ); + const sqlSearchInterceptor = new SQLSearchInterceptor({ + toasts: core.notifications.toasts, + http: core.http, + uiSettings: core.uiSettings, + startServices: core.getStartServices(), + usageCollector: data.search.usageCollector, + }); data.__enhance({ ui: { @@ -89,7 +71,7 @@ export class QueryEnhancementsPlugin initialTo: moment().add(2, 'days').toISOString(), }, showFilterBar: false, - showDataSetsSelector: false, + showDataSetsSelector: true, showDataSourcesSelector: true, }, fields: { @@ -110,7 +92,7 @@ export class QueryEnhancementsPlugin searchBar: { showDatePicker: false, showFilterBar: false, - showDataSetsSelector: false, + showDataSetsSelector: true, showDataSourcesSelector: true, queryStringInput: { initialValue: 'SELECT * FROM ' }, }, @@ -125,29 +107,6 @@ export class QueryEnhancementsPlugin }, }); - data.__enhance({ - ui: { - query: { - language: 'SQLAsync', - search: sqlAsyncSearchInterceptor, - searchBar: { - showDatePicker: false, - showFilterBar: false, - showDataSetsSelector: false, - showDataSourcesSelector: true, - queryStringInput: { initialValue: 'SHOW DATABASES IN ::mys3::' }, - }, - fields: { - filterable: false, - visualizable: false, - }, - showDocLinks: false, - supportedAppNames: ['discover'], - connectionService: this.connectionsService, - }, - }, - }); - data.__enhance({ ui: { queryEditorExtension: createQueryAssistExtension( @@ -158,16 +117,6 @@ export class QueryEnhancementsPlugin }, }); - data.__enhance({ - ui: { - queryEditorExtension: createDataSourceConnectionExtension( - this.connectionsService, - core.notifications.toasts, - this.config - ), - }, - }); - return {}; } diff --git a/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx b/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx index e87e74ce299..c28c5cb8b0b 100644 --- a/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx +++ b/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx @@ -12,7 +12,7 @@ import { } from '../../../../data/public'; import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public'; import { QueryAssistParameters } from '../../../common/query_assist'; -import { ConnectionsService } from '../../data_source_connection'; +import { ConnectionsService } from '../../services'; import { getStorage } from '../../services'; import { useGenerateQuery } from '../hooks'; import { getPersistedLog, ProhibitedQueryError } from '../utils'; @@ -45,7 +45,7 @@ export const QueryAssistBar: React.FC = (props) => { const subscription = props.connectionsService .getSelectedConnection$() .subscribe((connection) => { - dataSourceIdRef.current = connection?.dataSource.id; + dataSourceIdRef.current = connection?.dataSource?.id; }); return () => subscription.unsubscribe(); }, [props.connectionsService]); diff --git a/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx b/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx index e088457a071..23611e39501 100644 --- a/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx +++ b/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx @@ -13,7 +13,7 @@ import { } from '../../../../data/public'; import { API } from '../../../common'; import { ConfigSchema } from '../../../common/config'; -import { ConnectionsService } from '../../data_source_connection'; +import { ConnectionsService } from '../../services'; import { QueryAssistBar, QueryAssistBanner } from '../components'; /** @@ -28,7 +28,7 @@ const getAvailableLanguages$ = ( connectionsService.getSelectedConnection$().pipe( distinctUntilChanged(), switchMap(async (connection) => { - const dataSourceId = connection?.dataSource.id; + const dataSourceId = connection?.dataSource?.id; const cached = availableLanguagesByDataSource.get(dataSourceId); if (cached !== undefined) return cached; const languages = await http diff --git a/src/plugins/query_enhancements/public/search/index.ts b/src/plugins/query_enhancements/public/search/index.ts index 9835c1345f0..624e7cf6e7b 100644 --- a/src/plugins/query_enhancements/public/search/index.ts +++ b/src/plugins/query_enhancements/public/search/index.ts @@ -5,4 +5,3 @@ export { PPLSearchInterceptor } from './ppl_search_interceptor'; export { SQLSearchInterceptor } from './sql_search_interceptor'; -export { SQLAsyncSearchInterceptor } from './sql_async_search_interceptor'; diff --git a/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts b/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts index bca9961fea3..13d6bc25874 100644 --- a/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts +++ b/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts @@ -5,7 +5,6 @@ import { trimEnd } from 'lodash'; import { Observable, throwError } from 'rxjs'; -import { i18n } from '@osd/i18n'; import { concatMap } from 'rxjs/operators'; import { DataFrameAggConfig, @@ -34,16 +33,12 @@ import { fetchDataFrame, } from '../../common'; import { QueryEnhancementsPluginStartDependencies } from '../types'; -import { ConnectionsService } from '../data_source_connection'; export class PPLSearchInterceptor extends SearchInterceptor { protected queryService!: DataPublicPluginStart['query']; protected aggsService!: DataPublicPluginStart['search']['aggs']; - constructor( - deps: SearchInterceptorDeps, - private readonly connectionsService: ConnectionsService - ) { + constructor(deps: SearchInterceptorDeps) { super(deps); deps.startServices.then(([coreStart, depsStart]) => { @@ -147,34 +142,23 @@ export class PPLSearchInterceptor extends SearchInterceptor { }; const dataFrame = getRawDataFrame(searchRequest); - if (!dataFrame) { - return throwError( - this.handleSearchError( - { - stack: 'DataFrame is not defined', - }, - request, - signal! - ) - ); - } let queryString = dataFrame.meta?.queryConfig?.qs ?? getRawQueryString(searchRequest) ?? ''; dataFrame.meta = { ...dataFrame.meta, + aggConfig: { + ...dataFrame.meta.aggConfig, + ...(this.aggsService.types.get.bind(this) && + getAggConfig(searchRequest, {}, this.aggsService.types.get.bind(this))), + }, queryConfig: { ...dataFrame.meta.queryConfig, - ...(this.connectionsService.getSelectedConnection() && { - dataSourceId: this.connectionsService.getSelectedConnection()?.id, + ...(this.queryService.dataSet.getDataSet() && { + dataSourceId: this.queryService.dataSet.getDataSet()?.dataSourceRef?.id, }), }, }; - const aggConfig = getAggConfig( - searchRequest, - {}, - this.aggsService.types.get.bind(this) - ) as DataFrameAggConfig; if (!dataFrame.schema) { return fetchDataFrame(dfContext, queryString, dataFrame).pipe( @@ -184,14 +168,14 @@ export class PPLSearchInterceptor extends SearchInterceptor { const jsError = new Error(df.error.response); return throwError(jsError); } - const timeField = getTimeField(df, aggConfig); + const timeField = getTimeField(df, dataFrame.meta?.aggConfig); if (timeField) { const timeFilter = getTimeFilter(timeField); const newQuery = insertTimeFilter(queryString, timeFilter); updateDataFrameMeta({ dataFrame: df, qs: newQuery, - aggConfig, + aggConfig: dataFrame.meta?.aggConfig, timeField, timeFilter, getAggQsFn: getAggQsFn.bind(this), @@ -204,14 +188,14 @@ export class PPLSearchInterceptor extends SearchInterceptor { } if (dataFrame.schema) { - const timeField = getTimeField(dataFrame, aggConfig); + const timeField = getTimeField(dataFrame, dataFrame.meta?.aggConfig); if (timeField) { const timeFilter = getTimeFilter(timeField); const newQuery = insertTimeFilter(queryString, timeFilter); updateDataFrameMeta({ dataFrame, qs: newQuery, - aggConfig, + aggConfig: dataFrame.meta?.aggConfig, timeField, timeFilter, getAggQsFn: getAggQsFn.bind(this), diff --git a/src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts b/src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts deleted file mode 100644 index 9232ef146cd..00000000000 --- a/src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { trimEnd } from 'lodash'; -import { BehaviorSubject, Observable, throwError } from 'rxjs'; -import { i18n } from '@osd/i18n'; -import { concatMap, map } from 'rxjs/operators'; -import { - DATA_FRAME_TYPES, - DataPublicPluginStart, - IOpenSearchDashboardsSearchRequest, - IOpenSearchDashboardsSearchResponse, - ISearchOptions, - SearchInterceptor, - SearchInterceptorDeps, -} from '../../../data/public'; -import { getRawDataFrame, getRawQueryString, IDataFrameResponse } from '../../../data/common'; -import { - API, - DataFramePolling, - FetchDataFrameContext, - SEARCH_STRATEGY, - fetchDataFrame, - fetchDataFramePolling, -} from '../../common'; -import { QueryEnhancementsPluginStartDependencies } from '../types'; -import { ConnectionsService } from '../data_source_connection'; - -export class SQLAsyncSearchInterceptor extends SearchInterceptor { - protected queryService!: DataPublicPluginStart['query']; - protected aggsService!: DataPublicPluginStart['search']['aggs']; - protected indexPatterns!: DataPublicPluginStart['indexPatterns']; - protected dataFrame$ = new BehaviorSubject(undefined); - - constructor( - deps: SearchInterceptorDeps, - private readonly connectionsService: ConnectionsService - ) { - super(deps); - - deps.startServices.then(([coreStart, depsStart]) => { - this.queryService = (depsStart as QueryEnhancementsPluginStartDependencies).data.query; - this.aggsService = (depsStart as QueryEnhancementsPluginStartDependencies).data.search.aggs; - }); - } - - protected runSearch( - request: IOpenSearchDashboardsSearchRequest, - signal?: AbortSignal, - strategy?: string - ): Observable { - const { id, ...searchRequest } = request; - const path = trimEnd(API.SQL_ASYNC_SEARCH); - const dfContext: FetchDataFrameContext = { - http: this.deps.http, - path, - signal, - }; - - const dataFrame = getRawDataFrame(searchRequest); - if (!dataFrame) { - return throwError(this.handleSearchError('DataFrame is not defined', request, signal!)); - } - - const queryString = - dataFrame.meta?.queryConfig?.formattedQs() ?? getRawQueryString(searchRequest) ?? ''; - - dataFrame.meta = { - ...dataFrame.meta, - queryConfig: { - ...dataFrame.meta.queryConfig, - ...(this.connectionsService.getSelectedConnection() && - this.connectionsService.getSelectedConnection()?.dataSource && { - dataSourceId: this.connectionsService.getSelectedConnection()?.dataSource.id, - }), - }, - }; - - const onPollingSuccess = (pollingResult: any) => { - if (pollingResult && pollingResult.body.meta.status === 'SUCCESS') { - return false; - } - if (pollingResult && pollingResult.body.meta.status === 'FAILED') { - const jsError = new Error(pollingResult.data.error.response); - this.deps.toasts.addError(jsError, { - title: i18n.translate('queryEnhancements.sqlQueryError', { - defaultMessage: 'Could not complete the SQL async query', - }), - toastMessage: pollingResult.data.error.response, - }); - return false; - } - - this.deps.toasts.addInfo({ - title: i18n.translate('queryEnhancements.sqlQueryPolling', { - defaultMessage: 'Polling query job results...', - }), - }); - - return true; - }; - - const onPollingError = (error: Error) => { - throw new Error(error.message); - }; - - this.deps.toasts.addInfo({ - title: i18n.translate('queryEnhancements.sqlQueryInfo', { - defaultMessage: 'Starting query job...', - }), - }); - return fetchDataFrame(dfContext, queryString, dataFrame).pipe( - concatMap((jobResponse) => { - const df = jobResponse.body; - const dataFramePolling = new DataFramePolling( - () => fetchDataFramePolling(dfContext, df), - 5000, - onPollingSuccess, - onPollingError - ); - return dataFramePolling.fetch().pipe( - map(() => { - const dfPolling = dataFramePolling.data; - dfPolling.type = DATA_FRAME_TYPES.DEFAULT; - return dfPolling; - }) - ); - }) - ); - } - - public search(request: IOpenSearchDashboardsSearchRequest, options: ISearchOptions) { - return this.runSearch(request, options.abortSignal, SEARCH_STRATEGY.SQL_ASYNC); - } -} diff --git a/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts b/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts index 5a3b8278c65..de7fb5938d2 100644 --- a/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts +++ b/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts @@ -6,8 +6,13 @@ import { trimEnd } from 'lodash'; import { Observable, throwError } from 'rxjs'; import { i18n } from '@osd/i18n'; -import { concatMap } from 'rxjs/operators'; -import { getRawDataFrame, getRawQueryString } from '../../../data/common'; +import { concatMap, map } from 'rxjs/operators'; +import { + DATA_FRAME_TYPES, + getRawDataFrame, + getRawQueryString, + SIMPLE_DATA_SET_TYPES, +} from '../../../data/common'; import { DataPublicPluginStart, IOpenSearchDashboardsSearchRequest, @@ -16,18 +21,21 @@ import { SearchInterceptor, SearchInterceptorDeps, } from '../../../data/public'; -import { API, FetchDataFrameContext, SEARCH_STRATEGY, fetchDataFrame } from '../../common'; +import { + API, + DataFramePolling, + FetchDataFrameContext, + SEARCH_STRATEGY, + fetchDataFrame, + fetchDataFramePolling, +} from '../../common'; import { QueryEnhancementsPluginStartDependencies } from '../types'; -import { ConnectionsService } from '../data_source_connection'; export class SQLSearchInterceptor extends SearchInterceptor { protected queryService!: DataPublicPluginStart['query']; protected aggsService!: DataPublicPluginStart['search']['aggs']; - constructor( - deps: SearchInterceptorDeps, - private readonly connectionsService: ConnectionsService - ) { + constructor(deps: SearchInterceptorDeps) { super(deps); deps.startServices.then(([coreStart, depsStart]) => { @@ -49,9 +57,6 @@ export class SQLSearchInterceptor extends SearchInterceptor { }; const dataFrame = getRawDataFrame(searchRequest); - if (!dataFrame) { - return throwError(this.handleSearchError('DataFrame is not defined', request, signal!)); - } const queryString = dataFrame.meta?.queryConfig?.qs ?? getRawQueryString(searchRequest) ?? ''; @@ -59,8 +64,8 @@ export class SQLSearchInterceptor extends SearchInterceptor { ...dataFrame.meta, queryConfig: { ...dataFrame.meta.queryConfig, - ...(this.connectionsService.getSelectedConnection() && { - dataSourceId: this.connectionsService.getSelectedConnection()?.id, + ...(this.queryService.dataSet.getDataSet() && { + dataSourceId: this.queryService.dataSet.getDataSet()?.dataSourceRef?.id, }), }, }; @@ -81,7 +86,91 @@ export class SQLSearchInterceptor extends SearchInterceptor { return fetchDataFrame(dfContext, queryString, dataFrame); } + protected runSearchAsync( + request: IOpenSearchDashboardsSearchRequest, + signal?: AbortSignal, + strategy?: string + ): Observable { + const { id, ...searchRequest } = request; + const path = trimEnd(API.SQL_ASYNC_SEARCH); + const dfContext: FetchDataFrameContext = { + http: this.deps.http, + path, + signal, + }; + + const dataFrame = getRawDataFrame(searchRequest); + if (!dataFrame) { + return throwError(this.handleSearchError('DataFrame is not defined', request, signal!)); + } + + const queryString = getRawQueryString(searchRequest) ?? ''; + + dataFrame.meta = { + ...dataFrame.meta, + queryConfig: { + ...dataFrame.meta.queryConfig, + }, + }; + + const onPollingSuccess = (pollingResult: any) => { + if (pollingResult && pollingResult.body.meta.status === 'SUCCESS') { + return false; + } + if (pollingResult && pollingResult.body.meta.status === 'FAILED') { + const jsError = new Error(pollingResult.data.error.response); + this.deps.toasts.addError(jsError, { + title: i18n.translate('queryEnhancements.sqlQueryError', { + defaultMessage: 'Could not complete the SQL async query', + }), + toastMessage: pollingResult.data.error.response, + }); + return false; + } + + this.deps.toasts.addInfo({ + title: i18n.translate('queryEnhancements.sqlQueryPolling', { + defaultMessage: 'Polling query job results...', + }), + }); + + return true; + }; + + const onPollingError = (error: Error) => { + throw new Error(error.message); + }; + + this.deps.toasts.addInfo({ + title: i18n.translate('queryEnhancements.sqlQueryInfo', { + defaultMessage: 'Starting query job...', + }), + }); + return fetchDataFrame(dfContext, queryString, dataFrame).pipe( + concatMap((jobResponse) => { + const df = jobResponse.body; + const dataFramePolling = new DataFramePolling( + () => fetchDataFramePolling(dfContext, df), + 5000, + onPollingSuccess, + onPollingError + ); + return dataFramePolling.fetch().pipe( + map(() => { + const dfPolling = dataFramePolling.data; + dfPolling.type = DATA_FRAME_TYPES.DEFAULT; + return dfPolling; + }) + ); + }) + ); + } + public search(request: IOpenSearchDashboardsSearchRequest, options: ISearchOptions) { + const dataSet = this.queryService.dataSet.getDataSet(); + if (dataSet?.type === SIMPLE_DATA_SET_TYPES.TEMPORARY_ASYNC) { + return this.runSearchAsync(request, options.abortSignal, SEARCH_STRATEGY.SQL_ASYNC); + } return this.runSearch(request, options.abortSignal, SEARCH_STRATEGY.SQL); } } diff --git a/src/plugins/query_enhancements/public/services.ts b/src/plugins/query_enhancements/public/services.ts deleted file mode 100644 index d11233be2dc..00000000000 --- a/src/plugins/query_enhancements/public/services.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { createGetterSetter } from '../../opensearch_dashboards_utils/common'; -import { IStorageWrapper } from '../../opensearch_dashboards_utils/public'; -import { DataPublicPluginStart } from '../../data/public'; - -export const [getStorage, setStorage] = createGetterSetter('storage'); -export const [getData, setData] = createGetterSetter('data'); diff --git a/src/plugins/query_enhancements/public/data_source_connection/services/connections_service.ts b/src/plugins/query_enhancements/public/services/connections_service.ts similarity index 95% rename from src/plugins/query_enhancements/public/data_source_connection/services/connections_service.ts rename to src/plugins/query_enhancements/public/services/connections_service.ts index 6afec4b51a9..97a59c2cd94 100644 --- a/src/plugins/query_enhancements/public/data_source_connection/services/connections_service.ts +++ b/src/plugins/query_enhancements/public/services/connections_service.ts @@ -6,8 +6,8 @@ import { BehaviorSubject, Observable, from } from 'rxjs'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { CoreStart } from 'opensearch-dashboards/public'; -import { API } from '../../../common'; -import { Connection, ConnectionsServiceDeps } from '../../types'; +import { API } from '../../common'; +import { Connection, ConnectionsServiceDeps } from '../types'; export class ConnectionsService { protected http!: ConnectionsServiceDeps['http']; diff --git a/src/plugins/query_enhancements/public/services/index.ts b/src/plugins/query_enhancements/public/services/index.ts new file mode 100644 index 00000000000..bb0284408fa --- /dev/null +++ b/src/plugins/query_enhancements/public/services/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { createGetterSetter } from '../../../opensearch_dashboards_utils/common'; +import { IStorageWrapper } from '../../../opensearch_dashboards_utils/public'; +import { DataPublicPluginStart } from '../../../data/public'; + +export const [getStorage, setStorage] = createGetterSetter('storage'); +export const [getData, setData] = createGetterSetter('data'); + +export { ConnectionsService } from './connections_service'; diff --git a/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts b/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts index f4fe42779da..162cc7e8f10 100644 --- a/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts +++ b/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts @@ -5,7 +5,6 @@ import { schema } from '@osd/config-schema'; import { IRouter } from 'opensearch-dashboards/server'; -import { DataSourceAttributes } from '../../../../data_source/common/data_sources'; import { API } from '../../../common'; export function registerDataSourceConnectionsRoutes(router: IRouter) { @@ -18,7 +17,7 @@ export function registerDataSourceConnectionsRoutes(router: IRouter) { }, async (context, request, response) => { const fields = ['id', 'title', 'auth.type']; - const resp = await context.core.savedObjects.client.find({ + const resp = await context.core.savedObjects.client.find({ type: 'data-source', fields, perPage: 10000, @@ -38,7 +37,7 @@ export function registerDataSourceConnectionsRoutes(router: IRouter) { }, }, async (context, request, response) => { - const resp = await context.core.savedObjects.client.get( + const resp = await context.core.savedObjects.client.get( 'data-source', request.params.dataSourceId ); diff --git a/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts b/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts index acd0027d0bc..8cd5014335e 100644 --- a/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts +++ b/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts @@ -55,7 +55,7 @@ export const sqlAsyncSearchStrategyProvider = ( const sessionId = rawResponse.data?.sessionId; const partial: PartialDataFrame = { - name: '', + ...request.body.df, fields: rawResponse?.data?.schema || [], }; const dataFrame = createDataFrame(partial); diff --git a/src/plugins/query_enhancements/server/search/sql_search_strategy.ts b/src/plugins/query_enhancements/server/search/sql_search_strategy.ts index c5ebb40f882..0a468356730 100644 --- a/src/plugins/query_enhancements/server/search/sql_search_strategy.ts +++ b/src/plugins/query_enhancements/server/search/sql_search_strategy.ts @@ -39,7 +39,7 @@ export const sqlSearchStrategyProvider = ( } const partial: PartialDataFrame = { - name: '', + ...request.body.df, fields: rawResponse.data?.schema || [], }; const dataFrame = createDataFrame(partial); diff --git a/src/plugins/query_enhancements/server/types.ts b/src/plugins/query_enhancements/server/types.ts index 1ad76c7bbf8..b6a03b672de 100644 --- a/src/plugins/query_enhancements/server/types.ts +++ b/src/plugins/query_enhancements/server/types.ts @@ -4,7 +4,7 @@ */ import { PluginSetup } from 'src/plugins/data/server'; -import { DataSourcePluginSetup } from '../../data_source/server'; +import { DataSourcePluginSetup } from 'src/plugins/data_source/server'; import { Logger } from '../../../core/server'; import { ConfigSchema } from '../common/config'; From 6768bba07eeeecf159b2a7dc9ac766c838b1768f Mon Sep 17 00:00:00 2001 From: "Qingyang(Abby) Hu" Date: Wed, 24 Jul 2024 15:23:02 -0700 Subject: [PATCH 7/9] Fix add filter for numeric scripted field (#7022) * Fix add filter for scripted field Signed-off-by: abbyhu2000 * add unit test Signed-off-by: abbyhu2000 * change from nested ternary to if else Signed-off-by: abbyhu2000 * add more unit tests Signed-off-by: abbyhu2000 * change unit tests Signed-off-by: abbyhu2000 * fix typo Signed-off-by: abbyhu2000 --------- Signed-off-by: abbyhu2000 (cherry picked from commit 7c1f8fc18c5dada2cb1d6787262baf40e4d1e4eb) --- .../filter_editor/value_input_type.test.tsx | 80 +++++++++++++++++++ .../filter_editor/value_input_type.tsx | 13 ++- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.test.tsx diff --git a/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.test.tsx b/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.test.tsx new file mode 100644 index 00000000000..aa4f4b4cd21 --- /dev/null +++ b/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { ValueInputType } from './value_input_type'; + +let onChangeMock: any; + +describe('Value input type', () => { + beforeAll(() => { + onChangeMock = jest.fn(); + }); + it('is number', async () => { + const valueInputProps = { + value: 1, + type: 'number', + onChange: onChangeMock, + onBlur: () => {}, + placeholder: '', + }; + const component = mountWithIntl(); + expect(component.find('EuiFieldNumber').exists()).toBeTruthy(); + expect(component.find('EuiFieldNumber').prop('value')).toBe(1); + }); + + it('is string', async () => { + const valueInputProps = { + value: 'value', + type: 'string', + onChange: () => {}, + onBlur: () => {}, + placeholder: '', + }; + const component = mountWithIntl(); + expect(component.find('EuiFieldText').exists()).toBeTruthy(); + expect(component.find('EuiFieldText').prop('value')).toBe('value'); + }); + + it('is boolean', async () => { + const valueInputProps = { + value: 'true', + type: 'boolean', + onChange: () => {}, + onBlur: () => {}, + placeholder: '', + }; + const component = mountWithIntl(); + expect(component.find('EuiSelect').exists()).toBeTruthy(); + expect(component.find('EuiSelect').prop('value')).toBe('true'); + }); + + it('is date', async () => { + const valueInputProps = { + value: 'Jun 18, 2024 @ 12:01:55.000', + type: 'date', + onChange: () => {}, + onBlur: () => {}, + placeholder: '', + }; + const component = mountWithIntl(); + expect(component.find('EuiFieldText').exists()).toBeTruthy(); + expect(component.find('EuiFieldText').prop('value')).toBe('Jun 18, 2024 @ 12:01:55.000'); + }); + + it('is ip', async () => { + const valueInputProps = { + value: '127.0.0.1', + type: 'ip', + onChange: () => {}, + onBlur: () => {}, + placeholder: '', + }; + const component = mountWithIntl(); + expect(component.find('EuiFieldText').exists()).toBeTruthy(); + expect(component.find('EuiFieldText').prop('value')).toBe('127.0.0.1'); + }); +}); diff --git a/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.tsx b/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.tsx index 9d7709a5f66..fd1743e96c1 100644 --- a/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.tsx +++ b/src/plugins/data/public/ui/filter_bar/filter_editor/value_input_type.tsx @@ -79,7 +79,7 @@ class ValueInputTypeUI extends Component { ? (value as BigInt).toString() : value } - onChange={this.onChange} + onChange={this.onNumberChange} controlOnly={this.props.controlOnly} className={this.props.className} /> @@ -151,6 +151,17 @@ class ValueInputTypeUI extends Component { this.props.onChange(boolValue); }; + private onNumberChange = (event: React.ChangeEvent) => { + const params = event.target.value; + let numValue; + if (typeof params === 'string') { + numValue = parseFloat(params); + } else if (typeof params === 'bigint') { + numValue = (params as BigInt).toString(); + } + this.props.onChange(numValue ?? params); + }; + private onChange = (event: React.ChangeEvent) => { const params = event.target.value; this.props.onChange(params); From e9ca5a7fddfd497e5912e4db57ccb3265af6a21d Mon Sep 17 00:00:00 2001 From: yuboluo Date: Thu, 25 Jul 2024 08:50:51 +0800 Subject: [PATCH 8/9] [Bug][Workspace] Add permission validation at workspace detail page (#7435) * [Bug][Workspace] Add permission validate at workspace detail page Signed-off-by: yubonluo * Changeset file for PR #7435 created/updated --------- Signed-off-by: yubonluo Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com> (cherry picked from commit 45d34b5516d06d673c2a445ee8e254988369b15b) --- changelogs/fragments/7435.yml | 2 ++ .../public/components/workspace_detail/workspace_updater.tsx | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 changelogs/fragments/7435.yml diff --git a/changelogs/fragments/7435.yml b/changelogs/fragments/7435.yml new file mode 100644 index 00000000000..c5cf951ee51 --- /dev/null +++ b/changelogs/fragments/7435.yml @@ -0,0 +1,2 @@ +fix: +- [Bug][Workspace] Add permission validation at workspace detail page ([#7435](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7435)) \ No newline at end of file diff --git a/src/plugins/workspace/public/components/workspace_detail/workspace_updater.tsx b/src/plugins/workspace/public/components/workspace_detail/workspace_updater.tsx index 7ba838303a8..9005646fd80 100644 --- a/src/plugins/workspace/public/components/workspace_detail/workspace_updater.tsx +++ b/src/plugins/workspace/public/components/workspace_detail/workspace_updater.tsx @@ -65,6 +65,7 @@ export const WorkspaceUpdater = (props: WorkspaceUpdaterProps) => { dataSourceManagement?: DataSourceManagementPluginSetup; }>(); + const isPermissionEnabled = application?.capabilities.workspaces.permissionEnabled; const currentWorkspace = useObservable(workspaces ? workspaces.currentWorkspace$ : of(null)); const availableUseCases = useObservable(props.registeredUseCases$, []); const [currentWorkspaceFormData, setCurrentWorkspaceFormData] = useState(); @@ -160,6 +161,7 @@ export const WorkspaceUpdater = (props: WorkspaceUpdaterProps) => { onSubmit={handleWorkspaceFormSubmit} operationType={WorkspaceOperationType.Update} savedObjects={savedObjects} + permissionEnabled={isPermissionEnabled} detailTab={props.detailTab} dataSourceManagement={dataSourceManagement} availableUseCases={availableUseCases} From 69ace22abb16c785c897b4ff20f038ffe04ce970 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 25 Jul 2024 09:39:02 -0700 Subject: [PATCH 9/9] Revert "[Discover-next] data set picker (#7426)" (#7479) This reverts commit 6a079d3eb61e9e229457eba7d26213b50ee7a7c6. --- changelogs/fragments/7368.yml | 2 - package.json | 2 +- src/plugins/data/common/data_frames/utils.ts | 23 + src/plugins/data/common/data_sets/types.ts | 38 - src/plugins/data/common/index.ts | 1 - .../index_patterns/index_patterns.ts | 6 +- .../common/search/opensearch_search/types.ts | 4 - .../search/search_source/search_source.ts | 11 +- src/plugins/data/common/types.ts | 1 - src/plugins/data/public/antlr/shared/utils.ts | 24 +- src/plugins/data/public/index.ts | 1 - .../dataset_manager/dataset_manager.mock.ts | 22 - .../dataset_manager/dataset_manager.test.ts | 33 - .../query/dataset_manager/dataset_manager.ts | 77 -- .../public/query/dataset_manager/index.ts | 6 - src/plugins/data/public/query/index.tsx | 1 - .../data/public/query/query_service.ts | 17 +- .../state_sync/connect_to_query_state.ts | 65 +- .../create_global_query_observable.ts | 8 - .../query/state_sync/sync_state_with_url.ts | 12 +- .../data/public/query/state_sync/types.ts | 3 +- .../data/public/search/search_service.ts | 23 +- src/plugins/data/public/ui/_index.scss | 1 - .../dataset_navigator/_dataset_navigator.scss | 16 - .../public/ui/dataset_navigator/_index.scss | 1 - .../create_dataset_navigator.tsx | 26 - .../dataset_navigator/dataset_navigator.tsx | 736 ------------------ .../public/ui/dataset_navigator/index.tsx | 7 - .../lib/catalog_cache/cache_intercept.ts | 23 - .../lib/catalog_cache/cache_loader.tsx | 470 ----------- .../lib/catalog_cache/cache_manager.ts | 416 ---------- .../lib/catalog_cache/index.tsx | 8 - .../ui/dataset_navigator/lib/constants.ts | 101 --- .../lib/hooks/direct_query_hook.tsx | 99 --- .../public/ui/dataset_navigator/lib/index.tsx | 9 - .../ui/dataset_navigator/lib/requests/sql.ts | 60 -- .../public/ui/dataset_navigator/lib/types.tsx | 330 -------- .../lib/utils/fetch_catalog_cache_status.ts | 26 - .../lib/utils/fetch_data_sources.ts | 19 - .../lib/utils/fetch_external_data_sources.ts | 33 - .../lib/utils/fetch_index_patterns.ts | 34 - .../lib/utils/fetch_indices.ts | 46 -- .../ui/dataset_navigator/lib/utils/index.ts | 13 - .../lib/utils/query_session_utils.ts | 16 - .../ui/dataset_navigator/lib/utils/shared.ts | 332 -------- .../lib/utils/use_polling.ts | 137 ---- src/plugins/data/public/ui/index.ts | 1 - .../ui/query_editor/_language_switcher.scss | 8 + .../public/ui/query_editor/_query_editor.scss | 6 - .../query_editor/language_selector.test.tsx | 1 + .../ui/query_editor/language_switcher.tsx | 102 +++ .../public/ui/query_editor/query_editor.tsx | 86 +- .../ui/query_editor/query_editor_top_row.tsx | 13 +- .../ui/search_bar/create_search_bar.tsx | 19 +- .../ui/search_bar/lib/use_dataset_manager.ts | 39 - .../data/public/ui/search_bar/search_bar.tsx | 6 +- .../data/public/ui/settings/settings.ts | 4 +- src/plugins/data/public/ui/types.ts | 11 +- src/plugins/data/public/ui/ui_service.ts | 23 +- .../data/server/search/search_service.ts | 7 +- .../public/components/sidebar/index.tsx | 36 +- src/plugins/data_explorer/public/index.ts | 1 - .../utils/state_management/metadata_slice.ts | 7 +- .../public/utils/state_management/store.ts | 2 +- .../utils/state_management/index.ts | 3 +- .../utils/update_search_source.ts | 7 +- .../view_components/utils/use_search.ts | 4 +- .../opensearch_dashboards.json | 2 +- .../components/connections_bar.tsx | 94 +++ .../components/index.ts} | 2 +- .../public/data_source_connection/index.ts | 7 + .../services/connections_service.ts | 4 +- .../data_source_connection/services/index.ts} | 2 +- .../utils/create_extension.tsx | 34 + .../data_source_connection/utils}/index.ts | 2 +- .../query_enhancements/public/plugin.tsx | 87 ++- .../components/query_assist_bar.tsx | 4 +- .../query_assist/utils/create_extension.tsx | 4 +- .../query_enhancements/public/search/index.ts | 1 + .../public/search/ppl_search_interceptor.ts | 40 +- .../search/sql_async_search_interceptor.ts | 137 ++++ .../public/search/sql_search_interceptor.ts | 115 +-- .../query_enhancements/public/services.ts | 11 + .../public/services/index.ts | 13 - .../routes/data_source_connection/routes.ts | 5 +- .../search/sql_async_search_strategy.ts | 2 +- .../server/search/sql_search_strategy.ts | 2 +- .../query_enhancements/server/types.ts | 2 +- 88 files changed, 712 insertions(+), 3583 deletions(-) delete mode 100644 changelogs/fragments/7368.yml delete mode 100644 src/plugins/data/common/data_sets/types.ts delete mode 100644 src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts delete mode 100644 src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts delete mode 100644 src/plugins/data/public/query/dataset_manager/dataset_manager.ts delete mode 100644 src/plugins/data/public/query/dataset_manager/index.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss delete mode 100644 src/plugins/data/public/ui/dataset_navigator/_index.scss delete mode 100644 src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/index.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/constants.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/index.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/types.tsx delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts delete mode 100644 src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts create mode 100644 src/plugins/data/public/ui/query_editor/_language_switcher.scss create mode 100644 src/plugins/data/public/ui/query_editor/language_switcher.tsx delete mode 100644 src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts create mode 100644 src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx rename src/plugins/{data/public/ui/dataset_navigator/lib/hooks/index.tsx => query_enhancements/public/data_source_connection/components/index.ts} (61%) create mode 100644 src/plugins/query_enhancements/public/data_source_connection/index.ts rename src/plugins/query_enhancements/public/{ => data_source_connection}/services/connections_service.ts (95%) rename src/plugins/{data/public/ui/dataset_navigator/lib/requests/index.tsx => query_enhancements/public/data_source_connection/services/index.ts} (58%) create mode 100644 src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx rename src/plugins/{data/common/data_sets => query_enhancements/public/data_source_connection/utils}/index.ts (70%) create mode 100644 src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts create mode 100644 src/plugins/query_enhancements/public/services.ts delete mode 100644 src/plugins/query_enhancements/public/services/index.ts diff --git a/changelogs/fragments/7368.yml b/changelogs/fragments/7368.yml deleted file mode 100644 index c8316dc939f..00000000000 --- a/changelogs/fragments/7368.yml +++ /dev/null @@ -1,2 +0,0 @@ -feat: -- [Discover] Adds a dataset selector for Discover ([#7368](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7368)) \ No newline at end of file diff --git a/package.json b/package.json index e86a19ae5d7..30cc500cdb6 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "start": "scripts/use_node scripts/opensearch_dashboards --dev", "start:docker": "scripts/use_node scripts/opensearch_dashboards --dev --opensearch.hosts=$OPENSEARCH_HOSTS --opensearch.ignoreVersionMismatch=true --server.host=$SERVER_HOST", "start:security": "scripts/use_node scripts/opensearch_dashboards --dev --security", - "start:enhancements": "scripts/use_node scripts/opensearch_dashboards --dev --uiSettings.overrides['query:enhancements:enabled']=true --uiSettings.overrides['home:useNewHomePage']=true", + "start:enhancements": "scripts/use_node scripts/opensearch_dashboards --dev --uiSettings.overrides['query:enhancements:enabled']=true", "debug": "scripts/use_node --nolazy --inspect scripts/opensearch_dashboards --dev", "debug-break": "scripts/use_node --nolazy --inspect-brk scripts/opensearch_dashboards --dev", "lint": "yarn run lint:es && yarn run lint:style", diff --git a/src/plugins/data/common/data_frames/utils.ts b/src/plugins/data/common/data_frames/utils.ts index 0da02cda295..31df2626a98 100644 --- a/src/plugins/data/common/data_frames/utils.ts +++ b/src/plugins/data/common/data_frames/utils.ts @@ -45,6 +45,29 @@ export const getRawQueryString = ( ); }; +/** + * Parses a raw query string and extracts the query string and data source. + * @param rawQueryString - The raw query string to parse. + * @returns An object containing the parsed query string and data source (if found). + */ +export const parseRawQueryString = (rawQueryString: string) => { + const rawDataSource = rawQueryString.match(/::(.*?)::/); + return { + qs: rawQueryString.replace(/::.*?::/, ''), + formattedQs(key: string = '.'): string { + const parts = rawQueryString.split('::'); + if (parts.length > 1) { + return (parts.slice(0, 1).join('') + parts.slice(1).join(key)).replace( + new RegExp(key + '$'), + '' + ); + } + return rawQueryString; + }, + ...(rawDataSource && { dataSource: rawDataSource[1] }), + }; +}; + /** * Returns the raw aggregations from the search request. * diff --git a/src/plugins/data/common/data_sets/types.ts b/src/plugins/data/common/data_sets/types.ts deleted file mode 100644 index 23ab74bed03..00000000000 --- a/src/plugins/data/common/data_sets/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -/** @public **/ -export enum SIMPLE_DATA_SOURCE_TYPES { - DEFAULT = 'data-source', - EXTERNAL = 'external-source', -} - -/** @public **/ -export enum SIMPLE_DATA_SET_TYPES { - INDEX_PATTERN = 'index-pattern', - TEMPORARY = 'temporary', - TEMPORARY_ASYNC = 'temporary-async', -} - -export interface SimpleObject { - id: string; - title?: string; - dataSourceRef?: SimpleDataSource; -} - -export interface SimpleDataSource { - id: string; - name: string; - indices?: SimpleObject[]; - tables?: SimpleObject[]; - type: SIMPLE_DATA_SOURCE_TYPES; -} - -export interface SimpleDataSet extends SimpleObject { - fields?: any[]; - timeFieldName?: string; - timeFields?: any[]; - type?: SIMPLE_DATA_SET_TYPES; -} diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index 0250a6ec2e0..d7b7e56e228 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -31,7 +31,6 @@ export * from './constants'; export * from './opensearch_query'; export * from './data_frames'; -export * from './data_sets'; export * from './field_formats'; export * from './field_mapping'; export * from './index_patterns'; diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index 3d0dbe15dab..3d7bd8fbb4a 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -433,13 +433,11 @@ export class IndexPatternsService { /** * Get an index pattern by id. Cache optimized * @param id - * @param onlyCheckCache - Only check cache for index pattern if it doesn't exist it will not error out */ - get = async (id: string, onlyCheckCache: boolean = false): Promise => { + get = async (id: string): Promise => { const cache = indexPatternCache.get(id); - - if (cache || onlyCheckCache) { + if (cache) { return cache; } diff --git a/src/plugins/data/common/search/opensearch_search/types.ts b/src/plugins/data/common/search/opensearch_search/types.ts index 6d24e8c36dd..f90a3f1de24 100644 --- a/src/plugins/data/common/search/opensearch_search/types.ts +++ b/src/plugins/data/common/search/opensearch_search/types.ts @@ -48,10 +48,6 @@ export interface ISearchOptions { * Use this option to enable support for long numerals. */ withLongNumeralsSupport?: boolean; - /** - * Use this option to enable support for async. - */ - isAsync?: boolean; } export type ISearchRequestParams> = { diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index da00e73f54f..d9518e6a6ca 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -94,6 +94,7 @@ import { convertResult, createDataFrame, getRawQueryString, + parseRawQueryString, } from '../../data_frames'; import { IOpenSearchSearchRequest, IOpenSearchSearchResponse, ISearchOptions } from '../..'; import { IOpenSearchDashboardsSearchRequest, IOpenSearchDashboardsSearchResponse } from '../types'; @@ -323,12 +324,7 @@ export class SearchSource { const dataFrame = createDataFrame({ name: searchRequest.index.title || searchRequest.index, fields: [], - ...(rawQueryString && { - meta: { - queryConfig: { qs: rawQueryString }, - ...(searchRequest.dataSourceId && { dataSource: searchRequest.dataSourceId }), - }, - }), + ...(rawQueryString && { meta: { queryConfig: parseRawQueryString(rawQueryString) } }), }); await this.setDataFrame(dataFrame); return this.getDataFrame(); @@ -430,8 +426,7 @@ export class SearchSource { private async fetchExternalSearch(searchRequest: SearchRequest, options: ISearchOptions) { const { search, getConfig, onResponse } = this.dependencies; - const currentDataframe = this.getDataFrame(); - if (!currentDataframe || currentDataframe.name !== searchRequest.index?.id) { + if (!this.getDataFrame()) { await this.createDataFrame(searchRequest); } diff --git a/src/plugins/data/common/types.ts b/src/plugins/data/common/types.ts index 1670fbf72d5..6a1f6e5a99d 100644 --- a/src/plugins/data/common/types.ts +++ b/src/plugins/data/common/types.ts @@ -35,7 +35,6 @@ export * from './query/types'; export * from './osd_field_types/types'; export * from './index_patterns/types'; export * from './data_frames/types'; -export * from './data_sets/types'; /** * If a service is being shared on both the client and the server, and diff --git a/src/plugins/data/public/antlr/shared/utils.ts b/src/plugins/data/public/antlr/shared/utils.ts index 8be6e6524fc..b2658b304e0 100644 --- a/src/plugins/data/public/antlr/shared/utils.ts +++ b/src/plugins/data/public/antlr/shared/utils.ts @@ -12,7 +12,7 @@ export interface IDataSourceRequestHandlerParams { } export const getRawSuggestionData$ = ( - connectionsService: any, + connectionsService, dataSourceReuqstHandler: ({ dataSourceId, title, @@ -21,11 +21,11 @@ export const getRawSuggestionData$ = ( ) => connectionsService.getSelectedConnection$().pipe( distinctUntilChanged(), - switchMap((connection: any) => { + switchMap((connection) => { if (connection === undefined) { return from(defaultReuqstHandler()); } - const dataSourceId = connection?.dataSource?.id; + const dataSourceId = connection?.id; const title = connection?.attributes?.title; return from(dataSourceReuqstHandler({ dataSourceId, title })); }) @@ -34,8 +34,8 @@ export const getRawSuggestionData$ = ( export const fetchData = ( tables: string[], queryFormatter: (table: string, dataSourceId?: string, title?: string) => any, - api: any, - connectionService: any + api, + connectionService ): Promise => { return new Promise((resolve, reject) => { getRawSuggestionData$( @@ -65,8 +65,8 @@ export const fetchData = ( ); } ).subscribe({ - next: (dataFrames: any) => resolve(dataFrames), - error: (err: any) => { + next: (dataFrames) => resolve(dataFrames), + error: (err) => { // TODO: pipe error to UI reject(err); }, @@ -74,11 +74,7 @@ export const fetchData = ( }); }; -export const fetchTableSchemas = ( - tables: string[], - api: any, - connectionService: any -): Promise => { +export const fetchTableSchemas = (tables: string[], api, connectionService): Promise => { return fetchData( tables, (table, dataSourceId, title) => ({ @@ -100,8 +96,8 @@ export const fetchTableSchemas = ( export const fetchColumnValues = ( tables: string[], column: string, - api: any, - connectionService: any + api, + connectionService ): Promise => { return fetchData( tables, diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 208359352e4..f1ac419e9ec 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -445,7 +445,6 @@ export { QueryEditorTopRow, // for BWC, keeping the old name IUiStart as DataPublicPluginStartUi, - DataSetNavigator, } from './ui'; /** diff --git a/src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts b/src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts deleted file mode 100644 index 2f1f5144274..00000000000 --- a/src/plugins/data/public/query/dataset_manager/dataset_manager.mock.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { DataSetContract } from '.'; - -const createSetupContractMock = () => { - const dataSetManagerMock: jest.Mocked = { - init: jest.fn(), - getDataSet: jest.fn(), - setDataSet: jest.fn(), - getUpdates$: jest.fn(), - getDefaultDataSet: jest.fn(), - }; - return dataSetManagerMock; -}; - -export const dataSetManagerMock = { - createSetupContract: createSetupContractMock, - createStartContract: createSetupContractMock, -}; diff --git a/src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts b/src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts deleted file mode 100644 index fcf91e6b8f8..00000000000 --- a/src/plugins/data/public/query/dataset_manager/dataset_manager.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { DataSetManager } from './dataset_manager'; -import { coreMock } from '../../../../../core/public/mocks'; -import { SimpleDataSet } from '../../../common/data_sets'; - -describe('DataSetManager', () => { - let service: DataSetManager; - - beforeEach(() => { - service = new DataSetManager(coreMock.createSetup().uiSettings); - }); - - test('getUpdates$ is a cold emits only after query changes', () => { - const obs$ = service.getUpdates$(); - const emittedValues: SimpleDataSet[] = []; - obs$.subscribe((v) => { - emittedValues.push(v!); - }); - expect(emittedValues).toHaveLength(0); - - const newDataSet: SimpleDataSet = { id: 'test_dataset', title: 'Test Dataset' }; - service.setDataSet(newDataSet); - expect(emittedValues).toHaveLength(1); - expect(emittedValues[0]).toEqual(newDataSet); - - service.setDataSet({ ...newDataSet }); - expect(emittedValues).toHaveLength(2); - }); -}); diff --git a/src/plugins/data/public/query/dataset_manager/dataset_manager.ts b/src/plugins/data/public/query/dataset_manager/dataset_manager.ts deleted file mode 100644 index 018eba50ad7..00000000000 --- a/src/plugins/data/public/query/dataset_manager/dataset_manager.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { BehaviorSubject } from 'rxjs'; -import { skip } from 'rxjs/operators'; -import { CoreStart } from 'opensearch-dashboards/public'; -import { - IndexPatternsService, - SIMPLE_DATA_SET_TYPES, - SimpleDataSet, - SimpleDataSource, -} from '../../../common'; - -export class DataSetManager { - private dataSet$: BehaviorSubject; - private indexPatterns?: IndexPatternsService; - - constructor(private readonly uiSettings: CoreStart['uiSettings']) { - this.dataSet$ = new BehaviorSubject(undefined); - } - - public init = (indexPatterns: IndexPatternsService) => { - this.indexPatterns = indexPatterns; - }; - - public getUpdates$ = () => { - return this.dataSet$.asObservable().pipe(skip(1)); - }; - - public getDataSet = () => { - return this.dataSet$.getValue(); - }; - - /** - * Updates the query. - * @param {Query} query - */ - public setDataSet = (dataSet: SimpleDataSet | undefined) => { - this.dataSet$.next(dataSet); - }; - - public getDefaultDataSet = async (): Promise => { - const defaultIndexPatternId = await this.uiSettings.get('defaultIndex'); - if (!defaultIndexPatternId) { - return undefined; - } - - const indexPattern = await this.indexPatterns?.get(defaultIndexPatternId); - if (!indexPattern) { - return undefined; - } - - if (!indexPattern.id) { - return undefined; - } - - return { - id: indexPattern.id, - title: indexPattern.title, - type: SIMPLE_DATA_SET_TYPES.INDEX_PATTERN, - timeFieldName: indexPattern.timeFieldName, - ...(indexPattern.dataSourceRef - ? { - dataSourceRef: { - id: indexPattern.dataSourceRef?.id, - name: indexPattern.dataSourceRef?.name, - type: indexPattern.dataSourceRef?.type, - } as SimpleDataSource, - } - : {}), - }; - }; -} - -export type DataSetContract = PublicMethodsOf; diff --git a/src/plugins/data/public/query/dataset_manager/index.ts b/src/plugins/data/public/query/dataset_manager/index.ts deleted file mode 100644 index 8a9a39b8112..00000000000 --- a/src/plugins/data/public/query/dataset_manager/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export { DataSetContract, DataSetManager } from './dataset_manager'; diff --git a/src/plugins/data/public/query/index.tsx b/src/plugins/data/public/query/index.tsx index 42c6349bcc8..505f095aeda 100644 --- a/src/plugins/data/public/query/index.tsx +++ b/src/plugins/data/public/query/index.tsx @@ -32,7 +32,6 @@ export * from './lib'; export * from './query_service'; export * from './filter_manager'; -export * from './dataset_manager'; export * from './timefilter'; export * from './saved_query'; export * from './persisted_log'; diff --git a/src/plugins/data/public/query/query_service.ts b/src/plugins/data/public/query/query_service.ts index 7d3bdca2f9b..1b758d18bda 100644 --- a/src/plugins/data/public/query/query_service.ts +++ b/src/plugins/data/public/query/query_service.ts @@ -37,8 +37,7 @@ import { TimefilterService, TimefilterSetup } from './timefilter'; import { createSavedQueryService } from './saved_query/saved_query_service'; import { createQueryStateObservable } from './state_sync/create_global_query_observable'; import { QueryStringManager, QueryStringContract } from './query_string'; -import { DataSetManager, DataSetContract } from './dataset_manager'; -import { buildOpenSearchQuery, getOpenSearchQueryConfig, IndexPatternsService } from '../../common'; +import { buildOpenSearchQuery, getOpenSearchQueryConfig } from '../../common'; import { getUiSettings } from '../services'; import { IndexPattern } from '..'; @@ -56,14 +55,12 @@ interface QueryServiceStartDependencies { savedObjectsClient: SavedObjectsClientContract; storage: IStorageWrapper; uiSettings: IUiSettingsClient; - indexPatterns: IndexPatternsService; } export class QueryService { filterManager!: FilterManager; timefilter!: TimefilterSetup; queryStringManager!: QueryStringContract; - dataSetManager!: DataSetContract; state$!: ReturnType; @@ -77,31 +74,22 @@ export class QueryService { }); this.queryStringManager = new QueryStringManager(storage, uiSettings); - this.dataSetManager = new DataSetManager(uiSettings); this.state$ = createQueryStateObservable({ filterManager: this.filterManager, timefilter: this.timefilter, queryString: this.queryStringManager, - dataSet: this.dataSetManager, }).pipe(share()); return { filterManager: this.filterManager, timefilter: this.timefilter, queryString: this.queryStringManager, - dataSet: this.dataSetManager, state$: this.state$, }; } - public start({ - savedObjectsClient, - storage, - uiSettings, - indexPatterns, - }: QueryServiceStartDependencies) { - this.dataSetManager.init(indexPatterns); + public start({ savedObjectsClient, storage, uiSettings }: QueryServiceStartDependencies) { return { addToQueryLog: createAddToQueryLog({ storage, @@ -109,7 +97,6 @@ export class QueryService { }), filterManager: this.filterManager, queryString: this.queryStringManager, - dataSet: this.dataSetManager, savedQueries: createSavedQueryService(savedObjectsClient), state$: this.state$, timefilter: this.timefilter, diff --git a/src/plugins/data/public/query/state_sync/connect_to_query_state.ts b/src/plugins/data/public/query/state_sync/connect_to_query_state.ts index 5db81e597b8..8b850b36eab 100644 --- a/src/plugins/data/public/query/state_sync/connect_to_query_state.ts +++ b/src/plugins/data/public/query/state_sync/connect_to_query_state.ts @@ -48,21 +48,16 @@ import { validateTimeRange } from '../timefilter'; * @param OsdUrlStateStorage to use for syncing and store data * @param syncConfig app filter and query */ -export const connectStorageToQueryState = async ( +export const connectStorageToQueryState = ( { - dataSet, filterManager, queryString, state$, - }: Pick< - QueryStart | QuerySetup, - 'timefilter' | 'filterManager' | 'queryString' | 'dataSet' | 'state$' - >, + }: Pick, OsdUrlStateStorage: IOsdUrlStateStorage, syncConfig: { filters: FilterStateStore; query: boolean; - dataSet?: boolean; } ) => { try { @@ -73,14 +68,10 @@ export const connectStorageToQueryState = async ( if (syncConfig.filters === FilterStateStore.APP_STATE) { syncKeys.push('appFilters'); } - if (syncConfig.dataSet) { - syncKeys.push('dataSet'); - } const initialStateFromURL: QueryState = OsdUrlStateStorage.get('_q') ?? { query: queryString.getDefaultQuery(), filters: filterManager.getAppFilters(), - dataSet: await dataSet.getDefaultDataSet(), }; // set up initial '_q' flag in the URL to sync query and filter changes @@ -96,17 +87,6 @@ export const connectStorageToQueryState = async ( } } - if (syncConfig.dataSet && !_.isEqual(initialStateFromURL.dataSet, dataSet.getDataSet())) { - if (initialStateFromURL.dataSet) { - dataSet.setDataSet(_.cloneDeep(initialStateFromURL.dataSet)); - } else { - const defaultDataSet = await dataSet.getDefaultDataSet(); - if (defaultDataSet) { - dataSet.setDataSet(defaultDataSet); - } - } - } - if (syncConfig.filters === FilterStateStore.APP_STATE) { if ( !initialStateFromURL.filters || @@ -139,10 +119,6 @@ export const connectStorageToQueryState = async ( newState.filters = filterManager.getAppFilters(); } - if (syncConfig.dataSet && changes.dataSet) { - newState.dataSet = dataSet.getDataSet(); - } - return newState; }) ) @@ -167,24 +143,19 @@ export const connectStorageToQueryState = async ( * @param QueryService: either setup or start * @param stateContainer to use for syncing */ -export const connectToQueryState = async ( +export const connectToQueryState = ( { timefilter: { timefilter }, filterManager, queryString, - dataSet, state$, - }: Pick< - QueryStart | QuerySetup, - 'timefilter' | 'filterManager' | 'dataSet' | 'queryString' | 'state$' - >, + }: Pick, stateContainer: BaseStateContainer, syncConfig: { time?: boolean; refreshInterval?: boolean; filters?: FilterStateStore | boolean; query?: boolean; - dataSet?: boolean; } ) => { const syncKeys: Array = []; @@ -210,9 +181,6 @@ export const connectToQueryState = async ( break; } } - if (syncConfig.dataSet) { - syncKeys.push('dataSet'); - } // initial syncing // TODO: @@ -267,11 +235,6 @@ export const connectToQueryState = async ( } } - if (syncConfig.dataSet && !initialState.dataSet) { - initialState.dataSet = await dataSet.getDefaultDataSet(); - initialDirty = true; - } - if (initialDirty) { stateContainer.set({ ...stateContainer.get(), ...initialState }); } @@ -309,16 +272,13 @@ export const connectToQueryState = async ( newState.filters = filterManager.getAppFilters(); } } - if (syncConfig.dataSet && changes.dataSet) { - newState.dataSet = dataSet.getDataSet(); - } return newState; }) ) .subscribe((newState) => { stateContainer.set({ ...stateContainer.get(), ...newState }); }), - stateContainer.state$.subscribe(async (state) => { + stateContainer.state$.subscribe((state) => { updateInProgress = true; // cloneDeep is required because services are mutating passed objects @@ -371,21 +331,6 @@ export const connectToQueryState = async ( } } - if (syncConfig.dataSet) { - const currentDataSet = dataSet.getDataSet(); - if (!_.isEqual(state.dataSet, currentDataSet)) { - if (state.dataSet) { - dataSet.setDataSet(state.dataSet); - } else { - const defaultDataSet = await dataSet.getDefaultDataSet(); - if (defaultDataSet) { - dataSet.setDataSet(defaultDataSet); - stateContainer.set({ ...stateContainer.get(), dataSet: defaultDataSet }); - } - } - } - } - updateInProgress = false; }), ]; diff --git a/src/plugins/data/public/query/state_sync/create_global_query_observable.ts b/src/plugins/data/public/query/state_sync/create_global_query_observable.ts index 440ea836383..8abcb3ece18 100644 --- a/src/plugins/data/public/query/state_sync/create_global_query_observable.ts +++ b/src/plugins/data/public/query/state_sync/create_global_query_observable.ts @@ -36,18 +36,15 @@ import { QueryState, QueryStateChange } from './index'; import { createStateContainer } from '../../../../opensearch_dashboards_utils/public'; import { isFilterPinned, compareFilters, COMPARE_ALL_OPTIONS } from '../../../common'; import { QueryStringContract } from '../query_string'; -import { DataSetContract } from '../dataset_manager'; export function createQueryStateObservable({ timefilter: { timefilter }, filterManager, queryString, - dataSet, }: { timefilter: TimefilterSetup; filterManager: FilterManager; queryString: QueryStringContract; - dataSet: DataSetContract; }): Observable<{ changes: QueryStateChange; state: QueryState }> { return new Observable((subscriber) => { const state = createStateContainer({ @@ -55,7 +52,6 @@ export function createQueryStateObservable({ refreshInterval: timefilter.getRefreshInterval(), filters: filterManager.getFilters(), query: queryString.getQuery(), - dataSet: dataSet.getDataSet(), }); let currentChange: QueryStateChange = {}; @@ -64,10 +60,6 @@ export function createQueryStateObservable({ currentChange.query = true; state.set({ ...state.get(), query: queryString.getQuery() }); }), - dataSet.getUpdates$().subscribe(() => { - currentChange.dataSet = true; - state.set({ ...state.get(), dataSet: dataSet.getDataSet() }); - }), timefilter.getTimeUpdate$().subscribe(() => { currentChange.time = true; state.set({ ...state.get(), time: timefilter.getTime() }); diff --git a/src/plugins/data/public/query/state_sync/sync_state_with_url.ts b/src/plugins/data/public/query/state_sync/sync_state_with_url.ts index 3b92cff04d2..67245fd693a 100644 --- a/src/plugins/data/public/query/state_sync/sync_state_with_url.ts +++ b/src/plugins/data/public/query/state_sync/sync_state_with_url.ts @@ -46,22 +46,17 @@ const GLOBAL_STATE_STORAGE_KEY = '_g'; * @param osdUrlStateStorage to use for syncing */ export const syncQueryStateWithUrl = ( - query: Pick< - QueryStart | QuerySetup, - 'filterManager' | 'timefilter' | 'queryString' | 'dataSet' | 'state$' - >, + query: Pick, osdUrlStateStorage: IOsdUrlStateStorage ) => { const { timefilter: { timefilter }, filterManager, - dataSet, } = query; const defaultState: QueryState = { time: timefilter.getTime(), refreshInterval: timefilter.getRefreshInterval(), filters: filterManager.getGlobalFilters(), - dataSet: dataSet.getDataSet(), }; // retrieve current state from `_g` url @@ -83,7 +78,6 @@ export const syncQueryStateWithUrl = ( refreshInterval: true, time: true, filters: FilterStateStore.GLOBAL_STATE, - dataSet: true, }); // if there weren't any initial state in url, @@ -113,8 +107,8 @@ export const syncQueryStateWithUrl = ( start(); return { - stop: async () => { - (await stopSyncingWithStateContainer)(); + stop: () => { + stopSyncingWithStateContainer(); stopSyncingWithUrl(); }, hasInheritedQueryFromUrl, diff --git a/src/plugins/data/public/query/state_sync/types.ts b/src/plugins/data/public/query/state_sync/types.ts index 8134a7208f1..0ee0ad1c463 100644 --- a/src/plugins/data/public/query/state_sync/types.ts +++ b/src/plugins/data/public/query/state_sync/types.ts @@ -28,7 +28,7 @@ * under the License. */ -import { Filter, RefreshInterval, TimeRange, Query, SimpleDataSet } from '../../../common'; +import { Filter, RefreshInterval, TimeRange, Query } from '../../../common'; /** * All query state service state @@ -38,7 +38,6 @@ export interface QueryState { refreshInterval?: RefreshInterval; filters?: Filter[]; query?: Query; - dataSet?: SimpleDataSet; } type QueryStateChangePartial = { diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index d2a2dd67a6b..712f437d2e2 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -64,8 +64,6 @@ import { createDataFrameCache, dataFrameToSpec, } from '../../common/data_frames'; -import { getQueryService, getUiService } from '../services'; -import { UI_SETTINGS } from '../../common'; /** @internal */ export interface SearchServiceSetupDependencies { @@ -135,21 +133,7 @@ export class SearchService implements Plugin { { fieldFormats, indexPatterns }: SearchServiceStartDependencies ): ISearchStart { const search = ((request, options) => { - const selectedLanguage = getQueryService().queryString.getQuery().language; - const uiService = getUiService(); - const enhancement = uiService.Settings.getQueryEnhancements(selectedLanguage); - uiService.Settings.setUiOverridesByUserQueryLanguage(selectedLanguage); - const isEnhancedEnabled = uiSettings.get(UI_SETTINGS.QUERY_ENHANCEMENTS_ENABLED); - - if (enhancement) { - if (!isEnhancedEnabled) { - notifications.toasts.addWarning( - `Query enhancements are disabled. Please enable to use: ${selectedLanguage}.` - ); - } - return enhancement.search.search(request, options); - } - return this.defaultSearchInterceptor.search(request, options); + return this.searchInterceptor.search(request, options); }) as ISearchGeneric; const loadingCount$ = new BehaviorSubject(0); @@ -172,8 +156,7 @@ export class SearchService implements Plugin { dataFrame.meta.queryConfig.dataSourceId = dataSource?.id; } this.dfCache.set(dataFrame); - const dataSetName = `${dataFrame.meta?.queryConfig?.dataSourceId ?? ''}.${dataFrame.name}`; - const existingIndexPattern = await indexPatterns.get(dataSetName, true); + const existingIndexPattern = indexPatterns.getByTitle(dataFrame.name!, true); const dataSet = await indexPatterns.create( dataFrameToSpec(dataFrame, existingIndexPattern?.id), !existingIndexPattern?.id @@ -183,6 +166,8 @@ export class SearchService implements Plugin { }, clear: () => { if (this.dfCache.get() === undefined) return; + // name because the id is not unique for temporary index pattern created + indexPatterns.clearCache(this.dfCache.get()!.name, false); this.dfCache.clear(); }, }; diff --git a/src/plugins/data/public/ui/_index.scss b/src/plugins/data/public/ui/_index.scss index 4aa425041f5..f7c738b8d09 100644 --- a/src/plugins/data/public/ui/_index.scss +++ b/src/plugins/data/public/ui/_index.scss @@ -2,6 +2,5 @@ @import "./typeahead/index"; @import "./saved_query_management/index"; @import "./query_string_input/index"; -@import "./dataset_navigator/index"; @import "./query_editor/index"; @import "./shard_failure_modal/shard_failure_modal"; diff --git a/src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss b/src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss deleted file mode 100644 index 73a8c871950..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/_dataset_navigator.scss +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ -.datasetNavigator { - min-width: 350px; - border-bottom: $euiBorderThin !important; -} - -.dataSetNavigatorFormWrapper { - padding: $euiSizeS; -} - -.dataSetNavigator__loading { - padding: $euiSizeS; -} diff --git a/src/plugins/data/public/ui/dataset_navigator/_index.scss b/src/plugins/data/public/ui/dataset_navigator/_index.scss deleted file mode 100644 index 53acdffad43..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import "./dataset_navigator"; diff --git a/src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx b/src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx deleted file mode 100644 index c1ab4b3f846..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/create_dataset_navigator.tsx +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import React from 'react'; -import { HttpStart, SavedObjectsClientContract } from 'opensearch-dashboards/public'; -import { DataSetNavigator, DataSetNavigatorProps } from './'; -import { DataSetContract } from '../../query'; - -// Updated function signature to include additional dependencies -export function createDataSetNavigator( - savedObjectsClient: SavedObjectsClientContract, - http: HttpStart, - dataSet: DataSetContract -) { - // Return a function that takes props, omitting the dependencies from the props type - return (props: Omit) => ( - - ); -} diff --git a/src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx b/src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx deleted file mode 100644 index ad4490ff134..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/dataset_navigator.tsx +++ /dev/null @@ -1,736 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import React, { useCallback, useEffect, useState } from 'react'; -import { - EuiButton, - EuiButtonEmpty, - EuiContextMenu, - EuiForm, - EuiFormRow, - EuiLoadingSpinner, - EuiPanel, - EuiPopover, - EuiSelect, -} from '@elastic/eui'; -import { HttpStart, SavedObjectsClientContract } from 'opensearch-dashboards/public'; -import _ from 'lodash'; -import { i18n } from '@osd/i18n'; -import { - SIMPLE_DATA_SET_TYPES, - SIMPLE_DATA_SOURCE_TYPES, - SimpleDataSet, - SimpleDataSource, - SimpleObject, -} from '../../../common'; -import { - useLoadDatabasesToCache, - useLoadExternalDataSourcesToCache, - useLoadTablesToCache, -} from './lib/catalog_cache/cache_loader'; -import { CatalogCacheManager } from './lib/catalog_cache/cache_manager'; -import { CachedDataSourceStatus, DirectQueryLoadingStatus } from './lib/types'; -import { - getIndexPatterns, - getNotifications, - getQueryService, - getSearchService, - getUiService, -} from '../../services'; -import { - fetchDataSources, - fetchIndexPatterns, - fetchIndices, - isCatalogCacheFetching, - fetchIfExternalDataSourcesEnabled, -} from './lib'; -import { useDataSetManager } from '../search_bar/lib/use_dataset_manager'; -import { DataSetContract } from '../../query'; - -export interface DataSetNavigatorProps { - savedObjectsClient?: SavedObjectsClientContract; - http?: HttpStart; - dataSet?: DataSetContract; -} - -interface DataSetNavigatorState { - isMounted: boolean; - isOpen: boolean; - isLoading: boolean; - isExternalDataSourcesEnabled: boolean; - indexPatterns: any[]; - dataSources: SimpleDataSource[]; - externalDataSources: SimpleDataSource[]; - cachedDatabases: any[]; - cachedTables: SimpleObject[]; -} - -interface SelectedDataSetState extends SimpleDataSet { - isExternal: boolean; - database?: any | undefined; -} - -export const DataSetNavigator = (props: DataSetNavigatorProps) => { - const { savedObjectsClient, http, dataSet: dataSetManager } = props; - const searchService = getSearchService(); - const queryService = getQueryService(); - const uiService = getUiService(); - const indexPatternsService = getIndexPatterns(); - const notifications = getNotifications(); - - const { dataSet } = useDataSetManager({ dataSetManager: dataSetManager! }); - - const [navigatorState, setNavigatorState] = useState({ - isOpen: false, - isLoading: false, - isMounted: false, - isExternalDataSourcesEnabled: false, - dataSources: [], - externalDataSources: [], - indexPatterns: [], - cachedDatabases: [], - cachedTables: [], - }); - - const [selectedDataSetState, setSelectedDataSetState] = useState({ - id: dataSet?.id ?? '', - title: dataSet?.title, - type: dataSet?.type, - isExternal: false, - dataSourceRef: dataSet?.dataSourceRef, - database: undefined, - timeFieldName: dataSet?.timeFieldName, - fields: dataSet?.fields, - }); - - const { - loadStatus: dataSourcesLoadStatus, - loadExternalDataSources: startLoadingDataSources, - } = useLoadExternalDataSourcesToCache(http!, notifications); - const { - loadStatus: databasesLoadStatus, - startLoading: startLoadingDatabases, - } = useLoadDatabasesToCache(http!, notifications); - const { loadStatus: tablesLoadStatus, startLoading: startLoadingTables } = useLoadTablesToCache( - http!, - notifications - ); - - const onClick = () => { - setNavigatorState((prevState) => ({ - ...prevState, - isOpen: !prevState.isOpen, - })); - }; - - const isLoading = (loading: boolean) => { - setNavigatorState((prevState) => ({ - ...prevState, - isLoading: loading, - })); - }; - - const closePopover = () => { - setNavigatorState((prevState) => ({ - ...prevState, - isOpen: false, - externalDataSources: [], - cachedDatabases: [], - cachedTables: [], - })); - }; - - const onRefresh = () => { - if (!isCatalogCacheFetching(dataSourcesLoadStatus) && navigatorState.dataSources.length > 0) { - startLoadingDataSources(navigatorState.dataSources.map((dataSource) => dataSource.id)); - } - }; - - useEffect(() => { - setNavigatorState((prevState) => ({ ...prevState, isMounted: true, isLoading: true })); - Promise.all([ - fetchIndexPatterns(savedObjectsClient!, ''), - fetchDataSources(savedObjectsClient!), - fetchIfExternalDataSourcesEnabled(http!), - ]) - .then(([indexPatterns, dataSources, isExternalDataSourcesEnabled]) => { - if (!navigatorState.isMounted) return; - setNavigatorState((prevState) => ({ - ...prevState, - isExternalDataSourcesEnabled, - indexPatterns, - dataSources, - })); - const selectedPattern = indexPatterns.find( - (pattern) => pattern.id === props.dataSet?.getDataSet()?.id - ); - if (selectedPattern) { - setSelectedDataSetState({ - id: selectedPattern.id, - title: selectedPattern.title, - type: SIMPLE_DATA_SET_TYPES.INDEX_PATTERN, - timeFieldName: selectedPattern.timeFieldName, - fields: selectedPattern.fields, - ...(selectedPattern.dataSourceRef - ? { - dataSourceRef: { - id: selectedPattern.dataSourceRef.id, - name: selectedPattern.dataSourceRef.name, - type: selectedPattern.dataSourceRef.type, - }, - } - : { dataSource: undefined }), - database: undefined, - isExternal: false, - }); - } - }) - .finally(() => { - isLoading(false); - }); - return () => { - setNavigatorState((prevState) => ({ ...prevState, isMounted: false })); - }; - }, [savedObjectsClient, http, navigatorState.isMounted, props.dataSet]); - - useEffect(() => { - const status = dataSourcesLoadStatus.toLowerCase(); - const externalDataSourcesCache = CatalogCacheManager.getExternalDataSourcesCache(); - if (status === DirectQueryLoadingStatus.SUCCESS) { - setNavigatorState((prevState) => ({ - ...prevState, - externalDataSources: externalDataSourcesCache.externalDataSources.map((ds) => ({ - id: ds.dataSourceRef, - name: ds.name, - type: SIMPLE_DATA_SOURCE_TYPES.EXTERNAL, - })), - })); - } else if ( - status === DirectQueryLoadingStatus.CANCELED || - status === DirectQueryLoadingStatus.FAILED - ) { - setNavigatorState((prevState) => ({ ...prevState, failed: true })); - } - }, [dataSourcesLoadStatus]); - - useEffect(() => { - const status = databasesLoadStatus.toLowerCase(); - if (selectedDataSetState.isExternal && selectedDataSetState.dataSourceRef) { - const dataSourceCache = CatalogCacheManager.getOrCreateDataSource( - selectedDataSetState.dataSourceRef.name, - selectedDataSetState.dataSourceRef.id - ); - if (status === DirectQueryLoadingStatus.SUCCESS) { - setNavigatorState((prevState) => ({ - ...prevState, - cachedDatabases: dataSourceCache.databases, - })); - } else if ( - status === DirectQueryLoadingStatus.CANCELED || - status === DirectQueryLoadingStatus.FAILED - ) { - setNavigatorState((prevState) => ({ ...prevState, failed: true })); - } - } - }, [databasesLoadStatus, selectedDataSetState.isExternal, selectedDataSetState.dataSourceRef]); - - const handleSelectExternalDataSource = useCallback( - async (dataSource) => { - if (selectedDataSetState.isExternal && dataSource) { - const dataSourceCache = CatalogCacheManager.getOrCreateDataSource( - dataSource.name, - dataSource.id - ); - if ( - (dataSourceCache.status === CachedDataSourceStatus.Empty || - dataSourceCache.status === CachedDataSourceStatus.Failed) && - !isCatalogCacheFetching(databasesLoadStatus) - ) { - await startLoadingDatabases({ - dataSourceName: dataSource.name, - dataSourceMDSId: dataSource.id, - }); - } else if (dataSourceCache.status === CachedDataSourceStatus.Updated) { - setNavigatorState((prevState) => ({ - ...prevState, - cachedDatabases: dataSourceCache.databases, - })); - setSelectedDataSetState((prevState) => ({ - ...prevState, - dataSource, - isExternal: true, - })); - } - } - }, - [databasesLoadStatus, selectedDataSetState.isExternal, startLoadingDatabases] - ); - - // Start loading tables for selected database - const handleSelectExternalDatabase = useCallback( - (externalDatabase: SimpleDataSource) => { - if (selectedDataSetState.dataSourceRef && externalDatabase) { - let databaseCache; - try { - databaseCache = CatalogCacheManager.getDatabase( - selectedDataSetState.dataSourceRef.name, - externalDatabase.name, - selectedDataSetState.dataSourceRef.id - ); - } catch (error) { - return; - } - if ( - databaseCache.status === CachedDataSourceStatus.Empty || - (databaseCache.status === CachedDataSourceStatus.Failed && - !isCatalogCacheFetching(tablesLoadStatus)) - ) { - startLoadingTables({ - dataSourceName: selectedDataSetState.dataSourceRef.name, - databaseName: externalDatabase.name, - dataSourceMDSId: selectedDataSetState.dataSourceRef.id, - }); - setSelectedDataSetState((prevState) => ({ - ...prevState, - database: externalDatabase, - })); - } else if (databaseCache.status === CachedDataSourceStatus.Updated) { - setNavigatorState((prevState) => ({ - ...prevState, - cachedTables: databaseCache.tables, - })); - } - } - }, - [selectedDataSetState.dataSourceRef, tablesLoadStatus, startLoadingTables] - ); - - // Retrieve tables from cache upon success - useEffect(() => { - if ( - selectedDataSetState.dataSourceRef && - selectedDataSetState.isExternal && - selectedDataSetState.database - ) { - const tablesStatus = tablesLoadStatus.toLowerCase(); - let databaseCache; - try { - databaseCache = CatalogCacheManager.getDatabase( - selectedDataSetState.dataSourceRef.name, - selectedDataSetState.database, - selectedDataSetState.dataSourceRef.id - ); - } catch (error) { - return; - } - if (tablesStatus === DirectQueryLoadingStatus.SUCCESS) { - setNavigatorState((prevState) => ({ - ...prevState, - cachedTables: databaseCache.tables, - })); - } else if ( - tablesStatus === DirectQueryLoadingStatus.CANCELED || - tablesStatus === DirectQueryLoadingStatus.FAILED - ) { - notifications.toasts.addWarning('Error loading tables'); - } - } - }, [ - tablesLoadStatus, - selectedDataSetState.dataSourceRef, - selectedDataSetState.isExternal, - selectedDataSetState.database, - notifications.toasts, - ]); - - const handleSelectedDataSource = useCallback( - async (source: SimpleDataSource) => { - if (source) { - isLoading(true); - const indices = await fetchIndices(searchService, source.id); - setSelectedDataSetState((prevState) => ({ - ...prevState, - isExternal: false, - dataSourceRef: { - ...source, - indices: indices.map((indexName: string) => ({ - id: indexName, - title: indexName, - dataSourceRef: { - id: source.id, - name: source.name, - type: source.type, - }, - })), - }, - })); - isLoading(false); - } - }, - [searchService] - ); - - const handleSelectedObject = useCallback( - async (object) => { - isLoading(true); - if (object) { - const fields = await indexPatternsService.getFieldsForWildcard({ - pattern: object.title, - dataSourceId: object.dataSourceRef?.id, - }); - - const timeFields = fields.filter((field: any) => field.type === 'date'); - const timeFieldName = timeFields?.length > 0 ? timeFields[0].name : undefined; - setSelectedDataSetState((prevState) => ({ - ...prevState, - id: object.id, - title: object.title, - fields, - timeFields, - timeFieldName, - type: SIMPLE_DATA_SET_TYPES.TEMPORARY, - })); - isLoading(false); - } - }, - [indexPatternsService] - ); - - const handleSelectedDataSet = useCallback( - async (ds?: SimpleDataSet) => { - const selectedDataSet = ds ?? selectedDataSetState; - if (!selectedDataSet || !selectedDataSet.id) return; - - const language = uiService.Settings.getUserQueryLanguage(); - const queryEnhancements = uiService.Settings.getQueryEnhancements(language); - const initialInput = queryEnhancements?.searchBar?.queryStringInput?.initialValue; - - // Update query - const query = initialInput - ? initialInput.replace('', selectedDataSet.title!) - : ''; - uiService.Settings.setUserQueryString(query); - queryService.queryString.setQuery({ query, language }); - - // Update dataset - queryService.dataSet.setDataSet(selectedDataSet); - - // Add to recent datasets - CatalogCacheManager.addRecentDataSet({ - id: selectedDataSet.id, - title: selectedDataSet.title ?? selectedDataSet.id!, - dataSourceRef: selectedDataSet.dataSourceRef, - timeFieldName: selectedDataSet.timeFieldName, - type: selectedDataSet.type, - }); - - // Update data set manager - dataSetManager!.setDataSet({ - id: selectedDataSet.id, - title: selectedDataSet.title, - dataSourceRef: selectedDataSet.dataSourceRef, - timeFieldName: selectedDataSet.timeFieldName, - type: selectedDataSet.type, - }); - - closePopover(); - }, - [ - dataSetManager, - queryService.dataSet, - queryService.queryString, - selectedDataSetState, - uiService.Settings, - ] - ); - - const indexPatternsLabel = i18n.translate('data.query.dataSetNavigator.indexPatternsName', { - defaultMessage: 'Index patterns', - }); - const indicesLabel = i18n.translate('data.query.dataSetNavigator.indicesName', { - defaultMessage: 'Indexes', - }); - const S3DataSourcesLabel = i18n.translate('data.query.dataSetNavigator.S3DataSourcesLabel', { - defaultMessage: 'S3', - }); - - const createRefreshButton = () => ( - - ); - - const createLoadingSpinner = () => ( - - - - ); - - const createIndexPatternsPanel = () => ({ - id: 1, - title: indexPatternsLabel, - items: navigatorState.indexPatterns.map((indexPattern) => ({ - name: indexPattern.title, - onClick: async () => await handleSelectedDataSet(indexPattern), - })), - content:
{navigatorState.indexPatterns.length === 0 && createLoadingSpinner()}
, - }); - - const createIndexesPanel = () => ({ - id: 2, - title: indicesLabel, - items: [ - ...navigatorState.dataSources.map((dataSource) => ({ - name: dataSource.name, - panel: 3, - onClick: async () => await handleSelectedDataSource(dataSource), - })), - ], - content:
{navigatorState.isLoading && createLoadingSpinner()}
, - }); - - const createDataSourcesPanel = () => ({ - id: 3, - title: selectedDataSetState.dataSourceRef?.name ?? indicesLabel, - items: selectedDataSetState.dataSourceRef?.indices?.map((object) => ({ - name: object.title, - panel: 7, - onClick: async () => - await handleSelectedObject({ ...object, type: SIMPLE_DATA_SET_TYPES.TEMPORARY }), - })), - content:
{navigatorState.isLoading && createLoadingSpinner()}
, - }); - - const createS3DataSourcesPanel = () => ({ - id: 4, - title: ( -
- {S3DataSourcesLabel} - {CatalogCacheManager.getExternalDataSourcesCache().status === - CachedDataSourceStatus.Updated && createRefreshButton()} -
- ), - items: [ - ...navigatorState.externalDataSources.map((dataSource) => ({ - name: dataSource.name, - onClick: async () => await handleSelectExternalDataSource(dataSource), - panel: 5, - })), - ], - content:
{dataSourcesLoadStatus && createLoadingSpinner()}
, - }); - - const createDatabasesPanel = () => ({ - id: 5, - title: selectedDataSetState.dataSourceRef?.name - ? selectedDataSetState.dataSourceRef?.name - : 'Databases', - items: [ - ...navigatorState.externalDataSources.map((db) => ({ - name: db.name, - onClick: async () => { - await handleSelectExternalDatabase(db); - }, - panel: 6, - })), - ], - content:
{isCatalogCacheFetching(databasesLoadStatus) && createLoadingSpinner()}
, - }); - - return ( - - {dataSet?.dataSourceRef?.name - ? `${dataSet.dataSourceRef?.name}::${dataSet?.title}` - : dataSet?.title} -
- } - isOpen={navigatorState.isOpen} - closePopover={closePopover} - anchorPosition="downLeft" - panelPaddingSize="none" - > - 0 - ? [ - { - name: 'Recently Used', - panel: 8, - }, - ] - : []), - { - name: indexPatternsLabel, - panel: 1, - }, - { - name: indicesLabel, - panel: 2, - }, - ...(navigatorState.isExternalDataSourcesEnabled - ? [ - { - name: S3DataSourcesLabel, - panel: 4, - onClick: async () => { - const externalDataSourcesCache = CatalogCacheManager.getExternalDataSourcesCache(); - if ( - (externalDataSourcesCache.status === CachedDataSourceStatus.Empty || - externalDataSourcesCache.status === CachedDataSourceStatus.Failed) && - !isCatalogCacheFetching(dataSourcesLoadStatus) && - navigatorState.dataSources.length > 0 - ) { - startLoadingDataSources( - navigatorState.dataSources.map((dataSource) => dataSource.id) - ); - } else if ( - externalDataSourcesCache.status === CachedDataSourceStatus.Updated - ) { - setNavigatorState((prevState) => ({ - ...prevState, - externalDataSources: externalDataSourcesCache.externalDataSources.map( - (ds) => ({ - id: ds.name, - name: ds.name, - type: SIMPLE_DATA_SOURCE_TYPES.EXTERNAL, - }) - ), - })); - } - }, - }, - ] - : []), - ], - }, - createIndexPatternsPanel(), - createIndexesPanel(), - createDataSourcesPanel(), - createS3DataSourcesPanel(), - createDatabasesPanel(), - { - id: 6, - title: selectedDataSetState.database ? selectedDataSetState.database : 'Tables', - items: [ - ...navigatorState.cachedTables.map((table) => ({ - name: table.title, - onClick: async () => { - setSelectedDataSetState((prevState) => ({ - ...prevState, - object: { - id: `${selectedDataSetState.dataSourceRef!.name}.${ - selectedDataSetState.database - }.${table.title}`, - title: `${selectedDataSetState.dataSourceRef!.name}.${ - selectedDataSetState.database - }.${table.title}`, - dataSource: { - id: selectedDataSetState.dataSourceRef!.id, - name: selectedDataSetState.dataSourceRef!.name, - type: selectedDataSetState.dataSourceRef!.type, - }, - type: SIMPLE_DATA_SET_TYPES.TEMPORARY_ASYNC, - }, - })); - }, - })), - ], - content: ( -
{isCatalogCacheFetching(tablesLoadStatus) && createLoadingSpinner()}
- ), - }, - { - id: 7, - title: selectedDataSetState.title, - content: - navigatorState.isLoading || !selectedDataSetState.title ? ( -
{createLoadingSpinner()}
- ) : ( - - - 0 - ? [ - ...selectedDataSetState.timeFields!.map((field: any) => ({ - value: field.name, - text: field.name, - })), - ] - : []), - { value: 'no-time-filter', text: "I don't want to use a time filter" }, - ]} - onChange={(event) => { - setSelectedDataSetState((prevState) => ({ - ...prevState, - timeFieldName: - event.target.value !== 'no-time-filter' - ? event.target.value - : undefined, - })); - }} - aria-label="Select a date field" - /> - - { - await handleSelectedDataSet(); - }} - > - Select - - - ), - }, - { - id: 8, - title: 'Recently Used', - items: CatalogCacheManager.getRecentDataSets().map((ds) => ({ - name: ds.title, - onClick: async () => { - setSelectedDataSetState({ - id: ds.id ?? ds.title, - title: ds.title, - dataSourceRef: ds.dataSourceRef, - database: undefined, - isExternal: !ds.dataSourceRef?.type?.startsWith('data-source'), - timeFieldName: ds.timeFieldName, - }); - await handleSelectedDataSet(); - }, - })), - }, - ]} - /> - - ); -}; - -// eslint-disable-next-line import/no-default-export -export default DataSetNavigator; diff --git a/src/plugins/data/public/ui/dataset_navigator/index.tsx b/src/plugins/data/public/ui/dataset_navigator/index.tsx deleted file mode 100644 index e98e52c8421..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export { DataSetNavigator, DataSetNavigatorProps } from './dataset_navigator'; -export { createDataSetNavigator } from './create_dataset_navigator'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts deleted file mode 100644 index 0526cfd5121..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_intercept.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { HttpFetchOptionsWithPath, IHttpInterceptController } from 'opensearch-dashboards/public'; -import { SECURITY_DASHBOARDS_LOGOUT_URL } from '../constants'; -import { CatalogCacheManager } from './cache_manager'; - -export function catalogRequestIntercept(): any { - return ( - fetchOptions: Readonly, - _controller: IHttpInterceptController - ) => { - if (fetchOptions.path.includes(SECURITY_DASHBOARDS_LOGOUT_URL)) { - // Clears all user catalog cache details - CatalogCacheManager.clearDataSourceCache(); - CatalogCacheManager.clearAccelerationsCache(); - CatalogCacheManager.clearExternalDataSourcesCache(); - CatalogCacheManager.clearRecentDataSetsCache(); - } - }; -} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx deleted file mode 100644 index 9a42bfc74aa..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_loader.tsx +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { useEffect, useRef, useState } from 'react'; -import { HttpStart, NotificationsStart } from 'opensearch-dashboards/public'; -import { ASYNC_POLLING_INTERVAL, SPARK_HIVE_TABLE_REGEX, SPARK_PARTITION_INFO } from '../constants'; -import { - AsyncPollingResult, - CachedColumn, - CachedDataSourceStatus, - CachedTable, - LoadCacheType, - StartLoadingParams, - DirectQueryLoadingStatus, - DirectQueryRequest, -} from '../types'; -import { getAsyncSessionId, setAsyncSessionId } from '../utils/query_session_utils'; -import { - addBackticksIfNeeded, - combineSchemaAndDatarows, - get as getObjValue, - formatError, -} from '../utils/shared'; -import { usePolling } from '../utils/use_polling'; -import { SQLService } from '../requests/sql'; -import { CatalogCacheManager } from './cache_manager'; -import { fetchExternalDataSources } from '../utils'; - -export const updateDatabasesToCache = ( - dataSourceName: string, - pollingResult: AsyncPollingResult, - dataSourceMDSId?: string -) => { - const cachedDataSource = CatalogCacheManager.getOrCreateDataSource( - dataSourceName, - dataSourceMDSId - ); - - const currentTime = new Date().toUTCString(); - - if (!pollingResult) { - CatalogCacheManager.addOrUpdateDataSource( - { - ...cachedDataSource, - databases: [], - lastUpdated: currentTime, - status: CachedDataSourceStatus.Failed, - ...(dataSourceMDSId && { dataSourceMDSId }), - }, - dataSourceMDSId - ); - return; - } - - const combinedData = combineSchemaAndDatarows(pollingResult.schema, pollingResult.datarows); - const newDatabases = combinedData.map((row: any) => ({ - name: row.namespace, - tables: [], - lastUpdated: '', - status: CachedDataSourceStatus.Empty, - })); - - CatalogCacheManager.addOrUpdateDataSource( - { - ...cachedDataSource, - databases: newDatabases, - lastUpdated: currentTime, - status: CachedDataSourceStatus.Updated, - ...(dataSourceMDSId && { dataSourceMDSId }), - }, - dataSourceMDSId - ); -}; - -export const updateTablesToCache = ( - dataSourceName: string, - databaseName: string, - pollingResult: AsyncPollingResult, - dataSourceMDSId?: string -) => { - try { - const cachedDatabase = CatalogCacheManager.getDatabase( - dataSourceName, - databaseName, - dataSourceMDSId - ); - const currentTime = new Date().toUTCString(); - - if (!pollingResult) { - CatalogCacheManager.updateDatabase( - dataSourceName, - { - ...cachedDatabase, - tables: [], - lastUpdated: currentTime, - status: CachedDataSourceStatus.Failed, - }, - dataSourceMDSId - ); - return; - } - - const combinedData = combineSchemaAndDatarows(pollingResult.schema, pollingResult.datarows); - const newTables = combinedData - .filter((row: any) => !SPARK_HIVE_TABLE_REGEX.test(row.information)) - .map((row: any) => ({ - name: row.tableName, - })); - - CatalogCacheManager.updateDatabase( - dataSourceName, - { - ...cachedDatabase, - tables: newTables, - lastUpdated: currentTime, - status: CachedDataSourceStatus.Updated, - }, - dataSourceMDSId - ); - } catch (error) { - // eslint-disable-next-line no-console - console.error(error); - } -}; - -export const updateAccelerationsToCache = ( - dataSourceName: string, - pollingResult: AsyncPollingResult, - dataSourceMDSId?: string -) => { - const currentTime = new Date().toUTCString(); - - if (!pollingResult) { - CatalogCacheManager.addOrUpdateAccelerationsByDataSource({ - name: dataSourceName, - accelerations: [], - lastUpdated: currentTime, - status: CachedDataSourceStatus.Failed, - ...(dataSourceMDSId && { dataSourceMDSId }), - }); - return; - } - - const combinedData = combineSchemaAndDatarows(pollingResult.schema, pollingResult.datarows); - - const newAccelerations: any[] = combinedData.map((row: any) => ({ - flintIndexName: row.flint_index_name, - type: row.kind === 'mv' ? 'materialized' : row.kind, - database: row.database, - table: row.table, - indexName: row.index_name, - autoRefresh: row.auto_refresh, - status: row.status, - })); - - CatalogCacheManager.addOrUpdateAccelerationsByDataSource({ - name: dataSourceName, - accelerations: newAccelerations, - lastUpdated: currentTime, - status: CachedDataSourceStatus.Updated, - ...(dataSourceMDSId && { dataSourceMDSId }), - }); -}; - -export const updateTableColumnsToCache = ( - dataSourceName: string, - databaseName: string, - tableName: string, - pollingResult: AsyncPollingResult, - dataSourceMDSId?: string -) => { - try { - if (!pollingResult) { - return; - } - const cachedDatabase = CatalogCacheManager.getDatabase( - dataSourceName, - databaseName, - dataSourceMDSId - ); - const currentTime = new Date().toUTCString(); - - const combinedData: Array<{ col_name: string; data_type: string }> = combineSchemaAndDatarows( - pollingResult.schema, - pollingResult.datarows - ); - - const tableColumns: CachedColumn[] = []; - for (const row of combinedData) { - if (row.col_name === SPARK_PARTITION_INFO) { - break; - } - tableColumns.push({ - fieldName: row.col_name, - dataType: row.data_type, - }); - } - - const newTables: CachedTable[] = cachedDatabase.tables.map((ts) => - ts.name === tableName ? { ...ts, columns: tableColumns } : { ...ts } - ); - - if (cachedDatabase.status === CachedDataSourceStatus.Updated) { - CatalogCacheManager.updateDatabase( - dataSourceName, - { - ...cachedDatabase, - tables: newTables, - lastUpdated: currentTime, - status: CachedDataSourceStatus.Updated, - }, - dataSourceMDSId - ); - } - } catch (error) { - // eslint-disable-next-line no-console - console.error(error); - } -}; - -export const updateToCache = ( - pollResults: any, - loadCacheType: LoadCacheType, - dataSourceName: string, - databaseName?: string, - tableName?: string, - dataSourceMDSId?: string -) => { - switch (loadCacheType) { - case 'databases': - updateDatabasesToCache(dataSourceName, pollResults, dataSourceMDSId); - break; - case 'tables': - updateTablesToCache(dataSourceName, databaseName!, pollResults, dataSourceMDSId); - break; - case 'accelerations': - updateAccelerationsToCache(dataSourceName, pollResults, dataSourceMDSId); - break; - case 'tableColumns': - updateTableColumnsToCache( - dataSourceName, - databaseName!, - tableName!, - pollResults, - dataSourceMDSId - ); - default: - break; - } -}; - -export const createLoadQuery = ( - loadCacheType: LoadCacheType, - dataSourceName: string, - databaseName?: string, - tableName?: string -) => { - let query; - switch (loadCacheType) { - case 'databases': - query = `SHOW SCHEMAS IN ${addBackticksIfNeeded(dataSourceName)}`; - break; - case 'tables': - query = `SHOW TABLE EXTENDED IN ${addBackticksIfNeeded( - dataSourceName - )}.${addBackticksIfNeeded(databaseName!)} LIKE '*'`; - break; - case 'accelerations': - query = `SHOW FLINT INDEX in ${addBackticksIfNeeded(dataSourceName)}`; - break; - case 'tableColumns': - query = `DESC ${addBackticksIfNeeded(dataSourceName)}.${addBackticksIfNeeded( - databaseName! - )}.${addBackticksIfNeeded(tableName!)}`; - break; - default: - query = ''; - break; - } - return query; -}; - -export const useLoadToCache = ( - loadCacheType: LoadCacheType, - http: HttpStart, - notifications: NotificationsStart -) => { - const sqlService = new SQLService(http); - const [currentDataSourceName, setCurrentDataSourceName] = useState(''); - const [currentDatabaseName, setCurrentDatabaseName] = useState(''); - const [currentTableName, setCurrentTableName] = useState(''); - const [loadStatus, setLoadStatus] = useState( - DirectQueryLoadingStatus.INITIAL - ); - const dataSourceMDSClientId = useRef(''); - - const { - data: pollingResult, - loading: _pollingLoading, - error: pollingError, - startPolling, - stopPolling: stopLoading, - } = usePolling((params) => { - return sqlService.fetchWithJobId(params, dataSourceMDSClientId.current); - }, ASYNC_POLLING_INTERVAL); - - const onLoadingFailed = () => { - setLoadStatus(DirectQueryLoadingStatus.FAILED); - updateToCache( - null, - loadCacheType, - currentDataSourceName, - currentDatabaseName, - currentTableName, - dataSourceMDSClientId.current - ); - }; - - const startLoading = async ({ - dataSourceName, - dataSourceMDSId, - databaseName, - tableName, - }: StartLoadingParams) => { - setLoadStatus(DirectQueryLoadingStatus.SCHEDULED); - setCurrentDataSourceName(dataSourceName); - setCurrentDatabaseName(databaseName); - setCurrentTableName(tableName); - dataSourceMDSClientId.current = dataSourceMDSId || ''; - - let requestPayload: DirectQueryRequest = { - lang: 'sql', - query: createLoadQuery(loadCacheType, dataSourceName, databaseName, tableName), - datasource: dataSourceName, - }; - - const sessionId = getAsyncSessionId(dataSourceName); - if (sessionId) { - requestPayload = { ...requestPayload, sessionId }; - } - await sqlService - .fetch(requestPayload, dataSourceMDSId) - .then((result) => { - setAsyncSessionId(dataSourceName, getObjValue(result, 'sessionId', null)); - if (result.queryId) { - startPolling({ - queryId: result.queryId, - }); - } else { - // eslint-disable-next-line no-console - console.error('No query id found in response'); - onLoadingFailed(); - } - }) - .catch((e) => { - onLoadingFailed(); - const formattedError = formatError( - '', - 'The query failed to execute and the operation could not be complete.', - e.body?.message - ); - notifications.toasts.addError(formattedError, { - title: 'Query Failed', - }); - // eslint-disable-next-line no-console - console.error(e); - }); - }; - - useEffect(() => { - // cancel direct query - if (!pollingResult) return; - const { status: anyCaseStatus, datarows, error } = pollingResult; - const status = anyCaseStatus?.toLowerCase(); - - if (status === DirectQueryLoadingStatus.SUCCESS || datarows) { - setLoadStatus(status); - stopLoading(); - updateToCache( - pollingResult, - loadCacheType, - currentDataSourceName, - currentDatabaseName, - currentTableName, - dataSourceMDSClientId.current - ); - } else if (status === DirectQueryLoadingStatus.FAILED) { - onLoadingFailed(); - stopLoading(); - - const formattedError = formatError( - '', - 'The query failed to execute and the operation could not be complete.', - error - ); - notifications.toasts.addError(formattedError, { - title: 'Query Failed', - }); - } else { - setLoadStatus(status); - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pollingResult, pollingError]); - - return { loadStatus, startLoading, stopLoading }; -}; - -export const useLoadDatabasesToCache = (http: HttpStart, notifications: NotificationsStart) => { - const { loadStatus, startLoading, stopLoading } = useLoadToCache( - 'databases', - http, - notifications - ); - return { loadStatus, startLoading, stopLoading }; -}; - -export const useLoadTablesToCache = (http: HttpStart, notifications: NotificationsStart) => { - const { loadStatus, startLoading, stopLoading } = useLoadToCache('tables', http, notifications); - return { loadStatus, startLoading, stopLoading }; -}; - -export const useLoadTableColumnsToCache = (http: HttpStart, notifications: NotificationsStart) => { - const { loadStatus, startLoading, stopLoading } = useLoadToCache( - 'tableColumns', - http, - notifications - ); - return { loadStatus, startLoading, stopLoading }; -}; - -export const useLoadAccelerationsToCache = (http: HttpStart, notifications: NotificationsStart) => { - const { loadStatus, startLoading, stopLoading } = useLoadToCache( - 'accelerations', - http, - notifications - ); - return { loadStatus, startLoading, stopLoading }; -}; - -export const useLoadExternalDataSourcesToCache = ( - http: HttpStart, - notifications: NotificationsStart -) => { - const [loadStatus, setLoadStatus] = useState( - DirectQueryLoadingStatus.INITIAL - ); - - const loadExternalDataSources = async (connectedClusters: string[]) => { - setLoadStatus(DirectQueryLoadingStatus.SCHEDULED); - CatalogCacheManager.setExternalDataSourcesLoadingStatus(CachedDataSourceStatus.Empty); - - try { - const externalDataSources = await fetchExternalDataSources(http, connectedClusters); - CatalogCacheManager.updateExternalDataSources(externalDataSources); - setLoadStatus(DirectQueryLoadingStatus.SUCCESS); - CatalogCacheManager.setExternalDataSourcesLoadingStatus(CachedDataSourceStatus.Updated); - } catch (error) { - setLoadStatus(DirectQueryLoadingStatus.FAILED); - CatalogCacheManager.setExternalDataSourcesLoadingStatus(CachedDataSourceStatus.Failed); - notifications.toasts.addError(error, { - title: 'Failed to load external datasources', - }); - } - }; - - return { loadStatus, loadExternalDataSources }; -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts deleted file mode 100644 index 3d0a8e0c982..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/cache_manager.ts +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { - ASYNC_QUERY_EXTERNAL_DATASOURCES_CACHE, - CATALOG_CACHE_VERSION, - RECENT_DATASET_OPTIONS_CACHE, -} from '../constants'; -import { ASYNC_QUERY_ACCELERATIONS_CACHE, ASYNC_QUERY_DATASOURCE_CACHE } from '../utils/shared'; -import { - AccelerationsCacheData, - CachedAccelerationByDataSource, - CachedDataSource, - CachedDataSourceStatus, - CachedDatabase, - DataSetOption, - DataSourceCacheData, - ExternalDataSource, - ExternalDataSourcesCacheData, - RecentDataSetOptionsCacheData, -} from '../types'; -import { SimpleDataSet, SimpleObject } from '../../../../../common'; - -/** - * Manages caching for catalog data including data sources and accelerations. - */ -export class CatalogCacheManager { - /** - * Key for the data source cache in local storage. - */ - private static readonly datasourceCacheKey = ASYNC_QUERY_DATASOURCE_CACHE; - - /** - * Key for the accelerations cache in local storage. - */ - private static readonly accelerationsCacheKey = ASYNC_QUERY_ACCELERATIONS_CACHE; - - /** - * Key for external datasources cache in local storage - */ - private static readonly externalDataSourcesCacheKey = ASYNC_QUERY_EXTERNAL_DATASOURCES_CACHE; - - /** - * Key for recently selected datasets in local storage - */ - private static readonly recentDataSetCacheKey = RECENT_DATASET_OPTIONS_CACHE; - - // TODO: make this an advanced setting - private static readonly maxRecentDataSet = 4; - - /** - * Saves data source cache to local storage. - * @param {DataSourceCacheData} cacheData - The data source cache data to save. - */ - static saveDataSourceCache(cacheData: DataSourceCacheData): void { - sessionStorage.setItem(this.datasourceCacheKey, JSON.stringify(cacheData)); - } - - /** - * Retrieves data source cache from local storage. - * @returns {DataSourceCacheData} The retrieved data source cache. - */ - static getDataSourceCache(): DataSourceCacheData { - const catalogData = sessionStorage.getItem(this.datasourceCacheKey); - - if (catalogData) { - return JSON.parse(catalogData); - } else { - const defaultCacheObject = { version: CATALOG_CACHE_VERSION, dataSources: [] }; - this.saveDataSourceCache(defaultCacheObject); - return defaultCacheObject; - } - } - - /** - * Saves accelerations cache to local storage. - * @param {AccelerationsCacheData} cacheData - The accelerations cache data to save. - */ - static saveAccelerationsCache(cacheData: AccelerationsCacheData): void { - sessionStorage.setItem(this.accelerationsCacheKey, JSON.stringify(cacheData)); - } - - /** - * Retrieves accelerations cache from local storage. - * @returns {AccelerationsCacheData} The retrieved accelerations cache. - */ - static getAccelerationsCache(): AccelerationsCacheData { - const accelerationCacheData = sessionStorage.getItem(this.accelerationsCacheKey); - - if (accelerationCacheData) { - return JSON.parse(accelerationCacheData); - } else { - const defaultCacheObject = { - version: CATALOG_CACHE_VERSION, - dataSources: [], - }; - this.saveAccelerationsCache(defaultCacheObject); - return defaultCacheObject; - } - } - - /** - * Adds or updates a data source in the accelerations cache. - * @param {CachedAccelerationByDataSource} dataSource - The data source to add or update. - */ - static addOrUpdateAccelerationsByDataSource( - dataSource: CachedAccelerationByDataSource, - dataSourceMDSId?: string - ): void { - let index = -1; - const accCacheData = this.getAccelerationsCache(); - if (dataSourceMDSId) { - index = accCacheData.dataSources.findIndex( - (ds: CachedAccelerationByDataSource) => - ds.name === dataSource.name && ds.dataSourceMDSId === dataSourceMDSId - ); - } else { - index = accCacheData.dataSources.findIndex( - (ds: CachedAccelerationByDataSource) => ds.name === dataSource.name - ); - } - if (index !== -1) { - accCacheData.dataSources[index] = dataSource; - } else { - accCacheData.dataSources.push(dataSource); - } - this.saveAccelerationsCache(accCacheData); - } - - /** - * Retrieves accelerations cache from local storage by the datasource name. - * @param {string} dataSourceName - The name of the data source. - * @returns {CachedAccelerationByDataSource} The retrieved accelerations by datasource in cache. - * @throws {Error} If the data source is not found. - */ - static getOrCreateAccelerationsByDataSource( - dataSourceName: string, - dataSourceMDSId?: string - ): CachedAccelerationByDataSource { - const accCacheData = this.getAccelerationsCache(); - let cachedDataSource; - if (dataSourceMDSId) { - cachedDataSource = accCacheData.dataSources.find( - (ds) => ds.name === dataSourceName && ds.dataSourceMDSId === dataSourceMDSId - ); - } else { - cachedDataSource = accCacheData.dataSources.find((ds) => ds.name === dataSourceName); - } - if (cachedDataSource) return cachedDataSource; - else { - let defaultDataSourceObject: CachedAccelerationByDataSource = { - name: dataSourceName, - lastUpdated: '', - status: CachedDataSourceStatus.Empty, - accelerations: [], - }; - - if (dataSourceMDSId !== '' && dataSourceMDSId !== undefined) { - defaultDataSourceObject = { ...defaultDataSourceObject, dataSourceMDSId }; - } - this.addOrUpdateAccelerationsByDataSource(defaultDataSourceObject, dataSourceMDSId); - return defaultDataSourceObject; - } - } - - /** - * Adds or updates a data source in the cache. - * @param {CachedDataSource} dataSource - The data source to add or update. - */ - static addOrUpdateDataSource(dataSource: CachedDataSource, dataSourceMDSId?: string): void { - const cacheData = this.getDataSourceCache(); - let index; - if (dataSourceMDSId) { - index = cacheData.dataSources.findIndex( - (ds: CachedDataSource) => - ds.name === dataSource.name && ds.dataSourceMDSId === dataSourceMDSId - ); - } - index = cacheData.dataSources.findIndex((ds: CachedDataSource) => ds.name === dataSource.name); - if (index !== -1) { - cacheData.dataSources[index] = dataSource; - } else { - cacheData.dataSources.push(dataSource); - } - this.saveDataSourceCache(cacheData); - } - - /** - * Retrieves or creates a data source with the specified name. - * @param {string} dataSourceName - The name of the data source. - * @returns {CachedDataSource} The retrieved or created data source. - */ - static getOrCreateDataSource(dataSourceName: string, dataSourceMDSId?: string): CachedDataSource { - let cachedDataSource; - if (dataSourceMDSId) { - cachedDataSource = this.getDataSourceCache().dataSources.find( - (ds) => ds.dataSourceMDSId === dataSourceMDSId && ds.name === dataSourceName - ); - } else { - cachedDataSource = this.getDataSourceCache().dataSources.find( - (ds) => ds.name === dataSourceName - ); - } - if (cachedDataSource) { - return cachedDataSource; - } else { - let defaultDataSourceObject: CachedDataSource = { - name: dataSourceName, - lastUpdated: '', - status: CachedDataSourceStatus.Empty, - databases: [], - }; - if (dataSourceMDSId !== '' && dataSourceMDSId !== undefined) { - defaultDataSourceObject = { ...defaultDataSourceObject, dataSourceMDSId }; - } - this.addOrUpdateDataSource(defaultDataSourceObject, dataSourceMDSId); - return defaultDataSourceObject; - } - } - - /** - * Retrieves a database from the cache. - * @param {string} dataSourceName - The name of the data source containing the database. - * @param {string} databaseName - The name of the database. - * @returns {CachedDatabase} The retrieved database. - * @throws {Error} If the data source or database is not found. - */ - static getDatabase( - dataSourceName: string, - databaseName: string, - dataSourceMDSId?: string - ): CachedDatabase { - let cachedDataSource; - if (dataSourceMDSId) { - cachedDataSource = this.getDataSourceCache().dataSources.find( - (ds) => ds.dataSourceMDSId === dataSourceMDSId && ds.name === dataSourceName - ); - } else { - cachedDataSource = this.getDataSourceCache().dataSources.find( - (ds) => ds.name === dataSourceName - ); - } - if (!cachedDataSource) { - throw new Error('DataSource not found exception: ' + dataSourceName); - } - - const cachedDatabase = cachedDataSource.databases.find((db) => db.name === databaseName); - if (!cachedDatabase) { - throw new Error('Database not found exception: ' + databaseName); - } - - return cachedDatabase; - } - - /** - * Retrieves a table from the cache. - * @param {string} dataSourceName - The name of the data source containing the database. - * @param {string} databaseName - The name of the database. - * @param {string} tableName - The name of the database. - * @returns {Cachedtable} The retrieved database. - * @throws {Error} If the data source, database or table is not found. - */ - static getTable( - dataSourceName: string, - databaseName: string, - tableName: string, - dataSourceMDSId?: string - ): SimpleObject { - const cachedDatabase = this.getDatabase(dataSourceName, databaseName, dataSourceMDSId); - - const cachedTable = cachedDatabase.tables!.find((table) => table.title === tableName); - if (!cachedTable) { - throw new Error('Table not found exception: ' + tableName); - } - return cachedTable; - } - - /** - * Updates a database in the cache. - * @param {string} dataSourceName - The name of the data source containing the database. - * @param {CachedDatabase} database - The database to be updated. - * @throws {Error} If the data source or database is not found. - */ - static updateDatabase( - dataSourceName: string, - database: CachedDatabase, - dataSourceMDSId?: string - ): void { - let cachedDataSource; - if (dataSourceMDSId) { - cachedDataSource = this.getDataSourceCache().dataSources.find( - (ds) => ds.dataSourceMDSId === dataSourceMDSId && ds.name === dataSourceName - ); - } else { - cachedDataSource = this.getDataSourceCache().dataSources.find( - (ds) => ds.name === dataSourceName - ); - } - - if (!cachedDataSource) { - throw new Error('DataSource not found exception: ' + dataSourceName); - } - - const index = cachedDataSource.databases.findIndex((db) => db.name === database.name); - if (index !== -1) { - cachedDataSource.databases[index] = database; - this.addOrUpdateDataSource(cachedDataSource, dataSourceMDSId); - } else { - throw new Error('Database not found exception: ' + database.name); - } - } - - /** - * Clears the data source cache from local storage. - */ - static clearDataSourceCache(): void { - sessionStorage.removeItem(this.datasourceCacheKey); - this.clearExternalDataSourcesCache(); - } - - /** - * Clears the accelerations cache from local storage. - */ - static clearAccelerationsCache(): void { - sessionStorage.removeItem(this.accelerationsCacheKey); - } - - static saveExternalDataSourcesCache(cacheData: ExternalDataSourcesCacheData): void { - sessionStorage.setItem(this.externalDataSourcesCacheKey, JSON.stringify(cacheData)); - } - - static getExternalDataSourcesCache(): ExternalDataSourcesCacheData { - const externalDataSourcesData = sessionStorage.getItem(this.externalDataSourcesCacheKey); - - if (externalDataSourcesData) { - return JSON.parse(externalDataSourcesData); - } else { - const defaultCacheObject: ExternalDataSourcesCacheData = { - version: CATALOG_CACHE_VERSION, - externalDataSources: [], - lastUpdated: '', - status: CachedDataSourceStatus.Empty, - }; - this.saveExternalDataSourcesCache(defaultCacheObject); - return defaultCacheObject; - } - } - - static updateExternalDataSources(externalDataSources: ExternalDataSource[]): void { - const currentTime = new Date().toUTCString(); - const cacheData = this.getExternalDataSourcesCache(); - cacheData.externalDataSources = externalDataSources; - cacheData.lastUpdated = currentTime; - cacheData.status = CachedDataSourceStatus.Updated; - this.saveExternalDataSourcesCache(cacheData); - } - - static getExternalDataSources(): ExternalDataSourcesCacheData { - return this.getExternalDataSourcesCache(); - } - - static clearExternalDataSourcesCache(): void { - sessionStorage.removeItem(this.externalDataSourcesCacheKey); - } - - static setExternalDataSourcesLoadingStatus(status: CachedDataSourceStatus): void { - const cacheData = this.getExternalDataSourcesCache(); - cacheData.status = status; - this.saveExternalDataSourcesCache(cacheData); - } - - static saveRecentDataSetsCache(cacheData: RecentDataSetOptionsCacheData): void { - sessionStorage.setItem(this.recentDataSetCacheKey, JSON.stringify(cacheData)); - } - - static getRecentDataSetsCache(): RecentDataSetOptionsCacheData { - const recentDataSetOptionsData = sessionStorage.getItem(this.recentDataSetCacheKey); - - if (recentDataSetOptionsData) { - return JSON.parse(recentDataSetOptionsData); - } else { - const defaultCacheObject: RecentDataSetOptionsCacheData = { - version: CATALOG_CACHE_VERSION, - recentDataSets: [], - }; - this.saveRecentDataSetsCache(defaultCacheObject); - return defaultCacheObject; - } - } - - static addRecentDataSet(dataSet: SimpleDataSet): void { - const cacheData = this.getRecentDataSetsCache(); - - cacheData.recentDataSets = cacheData.recentDataSets.filter( - (option) => option.id !== dataSet.id - ); - - cacheData.recentDataSets.push(dataSet); - - if (cacheData.recentDataSets.length > this.maxRecentDataSet) { - cacheData.recentDataSets.shift(); - } - - this.saveRecentDataSetsCache(cacheData); - } - - static getRecentDataSets(): SimpleDataSet[] { - return this.getRecentDataSetsCache().recentDataSets; - } - - static clearRecentDataSetsCache(): void { - sessionStorage.removeItem(this.recentDataSetCacheKey); - } -} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx deleted file mode 100644 index 5449277b2bd..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/catalog_cache/index.tsx +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export * from './cache_intercept'; -export * from './cache_loader'; -export * from './cache_manager'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/constants.ts b/src/plugins/data/public/ui/dataset_navigator/lib/constants.ts deleted file mode 100644 index e22da95ff4c..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/constants.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export const ASYNC_QUERY_SESSION_ID = 'async-query-session-id'; -export const ASYNC_QUERY_EXTERNAL_DATASOURCES_CACHE = 'async_query_external_datasources_cache'; -export const RECENT_DATASET_OPTIONS_CACHE = 'recent_dataset_options_cache'; - -export const DATA_SOURCE_NAME_URL_PARAM_KEY = 'datasourceName'; -export const DATA_SOURCE_TYPE_URL_PARAM_KEY = 'datasourceType'; -export const OLLY_QUESTION_URL_PARAM_KEY = 'olly_q'; -export const INDEX_URL_PARAM_KEY = 'indexPattern'; -export const DEFAULT_DATA_SOURCE_TYPE = 'DEFAULT_INDEX_PATTERNS'; -export const DEFAULT_DATA_SOURCE_NAME = 'Default cluster'; -export const DEFAULT_DATA_SOURCE_OBSERVABILITY_DISPLAY_NAME = 'OpenSearch'; -export const DEFAULT_DATA_SOURCE_TYPE_NAME = 'Default Group'; -export const enum QUERY_LANGUAGE { - PPL = 'PPL', - SQL = 'SQL', - DQL = 'DQL', -} -export enum DATA_SOURCE_TYPES { - DEFAULT_CLUSTER_TYPE = DEFAULT_DATA_SOURCE_TYPE, - SPARK = 'spark', - S3Glue = 's3glue', -} -export const ASYNC_POLLING_INTERVAL = 2000; - -export const CATALOG_CACHE_VERSION = '1.0'; -export const ACCELERATION_DEFUALT_SKIPPING_INDEX_NAME = 'skipping'; -export const ACCELERATION_TIME_INTERVAL = [ - { text: 'millisecond(s)', value: 'millisecond' }, - { text: 'second(s)', value: 'second' }, - { text: 'minutes(s)', value: 'minute' }, - { text: 'hour(s)', value: 'hour' }, - { text: 'day(s)', value: 'day' }, - { text: 'week(s)', value: 'week' }, -]; -export const ACCELERATION_REFRESH_TIME_INTERVAL = [ - { text: 'minutes(s)', value: 'minute' }, - { text: 'hour(s)', value: 'hour' }, - { text: 'day(s)', value: 'day' }, - { text: 'week(s)', value: 'week' }, -]; - -export const ACCELERATION_ADD_FIELDS_TEXT = '(add fields here)'; -export const ACCELERATION_INDEX_NAME_REGEX = /^[a-z0-9_]+$/; -export const ACCELERATION_S3_URL_REGEX = /^(s3|s3a):\/\/[a-zA-Z0-9.\-]+/; -export const SPARK_HIVE_TABLE_REGEX = /Provider:\s*hive/; -export const SANITIZE_QUERY_REGEX = /\s+/g; -export const SPARK_TIMESTAMP_DATATYPE = 'timestamp'; -export const SPARK_STRING_DATATYPE = 'string'; - -export const ACCELERATION_INDEX_TYPES = [ - { label: 'Skipping Index', value: 'skipping' }, - { label: 'Covering Index', value: 'covering' }, - { label: 'Materialized View', value: 'materialized' }, -]; - -export const ACC_INDEX_TYPE_DOCUMENTATION_URL = - 'https://github.com/opensearch-project/opensearch-spark/blob/main/docs/index.md'; -export const ACC_CHECKPOINT_DOCUMENTATION_URL = - 'https://github.com/opensearch-project/opensearch-spark/blob/main/docs/index.md#create-index-options'; - -export const ACCELERATION_INDEX_NAME_INFO = `All OpenSearch acceleration indices have a naming format of pattern: \`prefix__suffix\`. They share a common prefix structure, which is \`flint___
_\`. Additionally, they may have a suffix that varies based on the index type. -##### Skipping Index -- For 'Skipping' indices, a fixed index name 'skipping' is used, and this name cannot be modified by the user. The suffix added to this type is \`_index\`. - - An example of a 'Skipping' index name would be: \`flint_mydatasource_mydb_mytable_skipping_index\`. -##### Covering Index -- 'Covering' indices allow users to specify their index name. The suffix added to this type is \`_index\`. - - For instance, a 'Covering' index name could be: \`flint_mydatasource_mydb_mytable_myindexname_index\`. -##### Materialized View Index -- 'Materialized View' indices also enable users to define their index name, but they do not have a suffix. - - An example of a 'Materialized View' index name might look like: \`flint_mydatasource_mydb_mytable_myindexname\`. -##### Note: -- All user given index names must be in lowercase letters, numbers and underscore. Spaces, commas, and characters -, :, ", *, +, /, \, |, ?, #, >, or < are not allowed. - `; - -export const SKIPPING_INDEX_ACCELERATION_METHODS = [ - { value: 'PARTITION', text: 'Partition' }, - { value: 'VALUE_SET', text: 'Value Set' }, - { value: 'MIN_MAX', text: 'Min Max' }, - { value: 'BLOOM_FILTER', text: 'Bloom Filter' }, -]; - -export const ACCELERATION_AGGREGRATION_FUNCTIONS = [ - { label: 'window.start' }, - { label: 'count' }, - { label: 'sum' }, - { label: 'avg' }, - { label: 'max' }, - { label: 'min' }, -]; - -export const SPARK_PARTITION_INFO = `# Partition Information`; -export const OBS_DEFAULT_CLUSTER = 'observability-default'; // prefix key for generating data source id for default cluster in data selector -export const OBS_S3_DATA_SOURCE = 'observability-s3'; // prefix key for generating data source id for s3 data sources in data selector -export const S3_DATA_SOURCE_GROUP_DISPLAY_NAME = 'Amazon S3'; // display group name for Amazon-managed-s3 data sources in data selector -export const S3_DATA_SOURCE_GROUP_SPARK_DISPLAY_NAME = 'Spark'; // display group name for OpenSearch-spark-s3 data sources in data selector -export const SECURITY_DASHBOARDS_LOGOUT_URL = '/logout'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx deleted file mode 100644 index a2b05f47e9e..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/hooks/direct_query_hook.tsx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { useEffect, useState } from 'react'; -import { HttpStart, NotificationsStart } from 'opensearch-dashboards/public'; -import { ASYNC_POLLING_INTERVAL } from '../constants'; -import { DirectQueryLoadingStatus, DirectQueryRequest } from '../types'; -import { getAsyncSessionId, setAsyncSessionId } from '../utils/query_session_utils'; -import { get as getObjValue, formatError } from '../utils/shared'; -import { usePolling } from '../utils/use_polling'; -import { SQLService } from '../requests/sql'; - -export const useDirectQuery = ( - http: HttpStart, - notifications: NotificationsStart, - dataSourceMDSId?: string -) => { - const sqlService = new SQLService(http); - const [loadStatus, setLoadStatus] = useState( - DirectQueryLoadingStatus.SCHEDULED - ); - - const { - data: pollingResult, - loading: _pollingLoading, - error: pollingError, - startPolling, - stopPolling: stopLoading, - } = usePolling((params) => { - return sqlService.fetchWithJobId(params, dataSourceMDSId || ''); - }, ASYNC_POLLING_INTERVAL); - - const startLoading = (requestPayload: DirectQueryRequest) => { - setLoadStatus(DirectQueryLoadingStatus.SCHEDULED); - - const sessionId = getAsyncSessionId(requestPayload.datasource); - if (sessionId) { - requestPayload = { ...requestPayload, sessionId }; - } - - sqlService - .fetch(requestPayload, dataSourceMDSId) - .then((result) => { - setAsyncSessionId(requestPayload.datasource, getObjValue(result, 'sessionId', null)); - if (result.queryId) { - startPolling({ - queryId: result.queryId, - }); - } else { - // eslint-disable-next-line no-console - console.error('No query id found in response'); - setLoadStatus(DirectQueryLoadingStatus.FAILED); - } - }) - .catch((e) => { - setLoadStatus(DirectQueryLoadingStatus.FAILED); - const formattedError = formatError( - '', - 'The query failed to execute and the operation could not be complete.', - e.body?.message - ); - notifications.toasts.addError(formattedError, { - title: 'Query Failed', - }); - // eslint-disable-next-line no-console - console.error(e); - }); - }; - - useEffect(() => { - // cancel direct query - if (!pollingResult) return; - const { status: anyCaseStatus, datarows, error } = pollingResult; - const status = anyCaseStatus?.toLowerCase(); - - if (status === DirectQueryLoadingStatus.SUCCESS || datarows) { - setLoadStatus(status); - stopLoading(); - } else if (status === DirectQueryLoadingStatus.FAILED) { - setLoadStatus(status); - stopLoading(); - const formattedError = formatError( - '', - 'The query failed to execute and the operation could not be complete.', - error - ); - notifications.toasts.addError(formattedError, { - title: 'Query Failed', - }); - } else { - setLoadStatus(status); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pollingResult, pollingError, stopLoading]); - - return { loadStatus, startLoading, stopLoading, pollingResult }; -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/index.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/index.tsx deleted file mode 100644 index 771fbd6eef3..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export * from './catalog_cache'; -export * from './hooks'; -export * from './requests'; -export * from './utils'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts b/src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts deleted file mode 100644 index f2c9c30c79b..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/requests/sql.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { HttpStart } from 'opensearch-dashboards/public'; -import { DirectQueryRequest } from '../types'; - -export class SQLService { - private http: HttpStart; - - constructor(http: HttpStart) { - this.http = http; - } - - fetch = async ( - params: DirectQueryRequest, - dataSourceMDSId?: string, - errorHandler?: (error: any) => void - ) => { - const query = { - dataSourceMDSId, - }; - return this.http - .post('/api/observability/query/jobs', { - body: JSON.stringify(params), - query, - }) - .catch((error) => { - // eslint-disable-next-line no-console - console.error('fetch error: ', error.body); - if (errorHandler) errorHandler(error); - throw error; - }); - }; - - fetchWithJobId = async ( - params: { queryId: string }, - dataSourceMDSId?: string, - errorHandler?: (error: any) => void - ) => { - return this.http - .get(`/api/observability/query/jobs/${params.queryId}/${dataSourceMDSId ?? ''}`) - .catch((error) => { - // eslint-disable-next-line no-console - console.error('fetch error: ', error.body); - if (errorHandler) errorHandler(error); - throw error; - }); - }; - - deleteWithJobId = async (params: { queryId: string }, errorHandler?: (error: any) => void) => { - return this.http.delete(`/api/observability/query/jobs/${params.queryId}`).catch((error) => { - // eslint-disable-next-line no-console - console.error('delete error: ', error.body); - if (errorHandler) errorHandler(error); - throw error; - }); - }; -} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/types.tsx b/src/plugins/data/public/ui/dataset_navigator/lib/types.tsx deleted file mode 100644 index 03d844ff568..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/types.tsx +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { EuiComboBoxOptionOption } from '@elastic/eui'; -import { SimpleDataSet, SimpleObject } from '../../../../common'; - -export enum DirectQueryLoadingStatus { - SUCCESS = 'success', - FAILED = 'failed', - RUNNING = 'running', - SCHEDULED = 'scheduled', - CANCELED = 'canceled', - WAITING = 'waiting', - INITIAL = 'initial', -} - -export interface DirectQueryRequest { - query: string; - lang: string; - datasource: string; - sessionId?: string; -} - -export type AccelerationStatus = 'ACTIVE' | 'INACTIVE'; - -export interface PermissionsConfigurationProps { - roles: Role[]; - selectedRoles: Role[]; - setSelectedRoles: React.Dispatch>; - layout: 'horizontal' | 'vertical'; - hasSecurityAccess: boolean; -} - -export interface TableColumn { - name: string; - dataType: string; -} - -export interface Acceleration { - name: string; - status: AccelerationStatus; - type: string; - database: string; - table: string; - destination: string; - dateCreated: number; - dateUpdated: number; - index: string; - sql: string; -} - -export interface AssociatedObject { - tableName: string; - datasource: string; - id: string; - name: string; - database: string; - type: AssociatedObjectIndexType; - accelerations: CachedAcceleration[] | AssociatedObject; - columns?: CachedColumn[]; -} - -export type Role = EuiComboBoxOptionOption; - -export type DatasourceType = 'S3GLUE' | 'PROMETHEUS'; - -export interface S3GlueProperties { - 'glue.indexstore.opensearch.uri': string; - 'glue.indexstore.opensearch.region': string; -} - -export interface PrometheusProperties { - 'prometheus.uri': string; -} - -export type DatasourceStatus = 'ACTIVE' | 'DISABLED'; - -export interface DatasourceDetails { - allowedRoles: string[]; - name: string; - connector: DatasourceType; - description: string; - properties: S3GlueProperties | PrometheusProperties; - status: DatasourceStatus; -} - -interface AsyncApiDataResponse { - status: string; - schema?: Array<{ name: string; type: string }>; - datarows?: any; - total?: number; - size?: number; - error?: string; -} - -export interface AsyncApiResponse { - data: { - ok: boolean; - resp: AsyncApiDataResponse; - }; -} - -export type PollingCallback = (statusObj: AsyncApiResponse) => void; - -export type AssociatedObjectIndexType = AccelerationIndexType | 'table'; - -export type AccelerationIndexType = 'skipping' | 'covering' | 'materialized'; - -export type LoadCacheType = 'databases' | 'tables' | 'accelerations' | 'tableColumns'; - -export enum CachedDataSourceStatus { - Updated = 'Updated', - Failed = 'Failed', - Empty = 'Empty', -} - -export interface CachedColumn { - fieldName: string; - dataType: string; -} - -export interface CachedDatabase { - name: string; - tables: SimpleObject[]; - lastUpdated: string; // date string in UTC format - status: CachedDataSourceStatus; -} - -export interface CachedDataSource { - name: string; - lastUpdated: string; // date string in UTC format - status: CachedDataSourceStatus; - databases: CachedDatabase[]; - dataSourceMDSId?: string; -} - -export interface DataSourceCacheData { - version: string; - dataSources: CachedDataSource[]; -} - -export interface CachedAcceleration { - flintIndexName: string; - type: AccelerationIndexType; - database: string; - table: string; - indexName: string; - autoRefresh: boolean; - status: string; -} - -export interface CachedAccelerationByDataSource { - name: string; - accelerations: CachedAcceleration[]; - lastUpdated: string; // date string in UTC format - status: CachedDataSourceStatus; - dataSourceMDSId?: string; -} - -export interface AccelerationsCacheData { - version: string; - dataSources: CachedAccelerationByDataSource[]; -} - -export interface PollingSuccessResult { - schema: Array<{ name: string; type: string }>; - datarows: Array>; -} - -export type AsyncPollingResult = PollingSuccessResult | null; - -export type AggregationFunctionType = 'count' | 'sum' | 'avg' | 'max' | 'min' | 'window.start'; - -export interface MaterializedViewColumn { - id: string; - functionName: AggregationFunctionType; - functionParam?: string; - fieldAlias?: string; -} - -export type SkippingIndexAccMethodType = 'PARTITION' | 'VALUE_SET' | 'MIN_MAX' | 'BLOOM_FILTER'; - -export interface SkippingIndexRowType { - id: string; - fieldName: string; - dataType: string; - accelerationMethod: SkippingIndexAccMethodType; -} - -export interface DataTableFieldsType { - id: string; - fieldName: string; - dataType: string; -} - -export interface RefreshIntervalType { - refreshWindow: number; - refreshInterval: string; -} - -export interface WatermarkDelayType { - delayWindow: number; - delayInterval: string; -} - -export interface GroupByTumbleType { - timeField: string; - tumbleWindow: number; - tumbleInterval: string; -} - -export interface MaterializedViewQueryType { - columnsValues: MaterializedViewColumn[]; - groupByTumbleValue: GroupByTumbleType; -} - -export interface FormErrorsType { - dataSourceError: string[]; - databaseError: string[]; - dataTableError: string[]; - skippingIndexError: string[]; - coveringIndexError: string[]; - materializedViewError: string[]; - indexNameError: string[]; - primaryShardsError: string[]; - replicaShardsError: string[]; - refreshIntervalError: string[]; - checkpointLocationError: string[]; - watermarkDelayError: string[]; -} - -export type AccelerationRefreshType = 'autoInterval' | 'manual' | 'manualIncrement'; - -export interface CreateAccelerationForm { - dataSource: string; - database: string; - dataTable: string; - dataTableFields: DataTableFieldsType[]; - accelerationIndexType: AccelerationIndexType; - skippingIndexQueryData: SkippingIndexRowType[]; - coveringIndexQueryData: string[]; - materializedViewQueryData: MaterializedViewQueryType; - accelerationIndexName: string; - primaryShardsCount: number; - replicaShardsCount: number; - refreshType: AccelerationRefreshType; - checkpointLocation: string | undefined; - watermarkDelay: WatermarkDelayType; - refreshIntervalOptions: RefreshIntervalType; - formErrors: FormErrorsType; -} - -export interface LoadCachehookOutput { - loadStatus: DirectQueryLoadingStatus; - startLoading: (params: StartLoadingParams) => void; - stopLoading: () => void; -} - -export interface StartLoadingParams { - dataSourceName: string; - dataSourceMDSId?: string; - databaseName?: string; - tableName?: string; -} - -export interface RenderAccelerationFlyoutParams { - dataSourceName: string; - dataSourceMDSId?: string; - databaseName?: string; - tableName?: string; - handleRefresh?: () => void; -} - -export interface RenderAssociatedObjectsDetailsFlyoutParams { - tableDetail: AssociatedObject; - dataSourceName: string; - handleRefresh?: () => void; - dataSourceMDSId?: string; -} - -export interface RenderAccelerationDetailsFlyoutParams { - acceleration: CachedAcceleration; - dataSourceName: string; - handleRefresh?: () => void; - dataSourceMDSId?: string; -} - -export interface DataSetOption { - id?: string; - name: string; - dataSourceRef?: string; -} - -export interface RecentDataSetOptionsCacheData { - version: string; - recentDataSets: SimpleDataSet[]; -} - -export interface ExternalDataSource { - name: string; - status: string; - dataSourceRef: string; -} - -export interface ExternalDataSourcesCacheData { - version: string; - externalDataSources: ExternalDataSource[]; - lastUpdated: string; - status: CachedDataSourceStatus; -} - -interface DataSourceMeta { - // ref: string; // MDS ID - // dsName?: string; // flint datasource - id: string; - name: string; - type?: string; -} - -export interface DataSet { - id: string | undefined; // index pattern ID, index name, or flintdatasource.database.table - datasource?: DataSourceMeta; - meta?: { - timestampField: string; - mapping?: any; - }; - type?: 'dataSet' | 'temporary'; -} diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts deleted file mode 100644 index 697852fdd77..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_catalog_cache_status.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export enum DirectQueryLoadingStatus { - SUCCESS = 'success', - FAILED = 'failed', - RUNNING = 'running', - SCHEDULED = 'scheduled', - CANCELED = 'canceled', - WAITING = 'waiting', - INITIAL = 'initial', -} - -const catalogCacheFetchingStatus = [ - DirectQueryLoadingStatus.RUNNING, - DirectQueryLoadingStatus.WAITING, - DirectQueryLoadingStatus.SCHEDULED, -]; - -export const isCatalogCacheFetching = (...statuses: DirectQueryLoadingStatus[]) => { - return statuses.some((status: DirectQueryLoadingStatus) => - catalogCacheFetchingStatus.includes(status) - ); -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts deleted file mode 100644 index 7a10d7badb5..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_data_sources.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { SavedObjectsClientContract } from 'opensearch-dashboards/public'; -import { SimpleDataSource } from '../../../../../common'; - -export const fetchDataSources = async (client: SavedObjectsClientContract) => { - const resp = await client.find({ - type: 'data-source', - perPage: 10000, - }); - return resp.savedObjects.map((savedObject) => ({ - id: savedObject.id, - name: savedObject.attributes.title, - type: 'data-source', - })) as SimpleDataSource[]; -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts deleted file mode 100644 index a9272155e60..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_external_data_sources.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { HttpStart } from 'opensearch-dashboards/public'; - -export const fetchIfExternalDataSourcesEnabled = async (http: HttpStart) => { - try { - await http.get('/api/dataconnections'); - return true; - } catch (e) { - return false; - } -}; - -export const fetchExternalDataSources = async (http: HttpStart, connectedClusters: string[]) => { - const results = await Promise.all( - connectedClusters.map(async (cluster) => { - const dataSources = await http.get(`/api/dataconnections/dataSourceMDSId=${cluster}`); - return dataSources - .filter((dataSource) => dataSource.connector === 'S3GLUE') - .map((dataSource) => ({ - name: dataSource.name, - status: dataSource.status, - dataSourceRef: cluster, - })); - }) - ); - - const flattenedResults = results.flat(); - return flattenedResults; -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts deleted file mode 100644 index 3f2cd230300..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_index_patterns.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { SavedObjectsClientContract } from 'opensearch-dashboards/public'; -import { IIndexPattern } from '../.././../..'; -import { SIMPLE_DATA_SOURCE_TYPES, SIMPLE_DATA_SET_TYPES } from '../../../../../common'; - -export const fetchIndexPatterns = async (client: SavedObjectsClientContract, search: string) => { - const resp = await client.find({ - type: 'index-pattern', - fields: ['title', 'timeFieldName', 'references', 'fields'], - search: `${search}*`, - searchFields: ['title'], - perPage: 100, - }); - return resp.savedObjects.map((savedObject) => ({ - id: savedObject.id, - title: savedObject.attributes.title, - timeFieldName: savedObject.attributes.timeFieldName, - fields: savedObject.attributes.fields, - type: SIMPLE_DATA_SET_TYPES.INDEX_PATTERN, - ...(savedObject.references[0] - ? { - dataSourceRef: { - id: savedObject.references[0]?.id, - name: savedObject.references[0]?.name, - type: SIMPLE_DATA_SOURCE_TYPES.DEFAULT, - }, - } - : {}), - })); -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts deleted file mode 100644 index ef10c72bc08..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/fetch_indices.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { map } from 'rxjs/operators'; -import { ISearchStart } from '../../../../search'; - -export const fetchIndices = async (search: ISearchStart, dataSourceId?: string) => { - const buildSearchRequest = () => { - const request = { - params: { - ignoreUnavailable: true, - expand_wildcards: 'all', - index: '*', - body: { - size: 0, // no hits - aggs: { - indices: { - terms: { - field: '_index', - size: 100, - }, - }, - }, - }, - }, - dataSourceId, - }; - - return request; - }; - - const searchResponseToArray = (response: any) => { - const { rawResponse } = response; - return rawResponse.aggregations - ? rawResponse.aggregations.indices.buckets.map((bucket: { key: any }) => bucket.key) - : []; - }; - - return search - .getDefaultSearchInterceptor() - .search(buildSearchRequest()) - .pipe(map(searchResponseToArray)) - .toPromise(); -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts deleted file mode 100644 index 7dbe7ec2d4f..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -export * from './fetch_catalog_cache_status'; -export * from './fetch_data_sources'; -export * from './fetch_external_data_sources'; -export * from './fetch_index_patterns'; -export * from './fetch_indices'; -export * from './query_session_utils'; -export * from './shared'; -export * from './use_polling'; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts deleted file mode 100644 index beabcb48c19..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/query_session_utils.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { ASYNC_QUERY_SESSION_ID } from '../constants'; - -export const setAsyncSessionId = (dataSource: string, value: string | null) => { - if (value !== null) { - sessionStorage.setItem(`${ASYNC_QUERY_SESSION_ID}_${dataSource}`, value); - } -}; - -export const getAsyncSessionId = (dataSource: string) => { - return sessionStorage.getItem(`${ASYNC_QUERY_SESSION_ID}_${dataSource}`); -}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts deleted file mode 100644 index 3e4afc94e80..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/shared.ts +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * TODO making this method type-safe is nontrivial: if you just define - * `Nested = { [k: string]: Nested | T }` then you can't accumulate because `T` is not `Nested` - * There might be a way to define a recursive type that accumulates cleanly but it's probably not - * worth the effort. - */ - -export function get(obj: Record, path: string, defaultValue?: T): T { - return path.split('.').reduce((acc: any, part: string) => acc && acc[part], obj) || defaultValue; -} - -export function addBackticksIfNeeded(input: string): string { - if (input === undefined) { - return ''; - } - // Check if the string already has backticks - if (input.startsWith('`') && input.endsWith('`')) { - return input; // Return the string as it is - } else { - // Add backticks to the string - return '`' + input + '`'; - } -} - -export function combineSchemaAndDatarows( - schema: Array<{ name: string; type: string }>, - datarows: Array> -): object[] { - const combinedData: object[] = []; - - datarows.forEach((row) => { - const rowData: { [key: string]: string | number | boolean } = {}; - schema.forEach((field, index) => { - rowData[field.name] = row[index]; - }); - combinedData.push(rowData); - }); - - return combinedData; -} - -export const formatError = (name: string, message: string, details: string) => { - return { - name, - message, - body: { - attributes: { - error: { - caused_by: { - type: '', - reason: details, - }, - }, - }, - }, - }; -}; - -// TODO: relocate to a more appropriate location -// Client route -export const PPL_BASE = '/api/ppl'; -export const PPL_SEARCH = '/search'; -export const DSL_BASE = '/api/dsl'; -export const DSL_SEARCH = '/search'; -export const DSL_CAT = '/cat.indices'; -export const DSL_MAPPING = '/indices.getFieldMapping'; -export const DSL_SETTINGS = '/indices.getFieldSettings'; -export const OBSERVABILITY_BASE = '/api/observability'; -export const INTEGRATIONS_BASE = '/api/integrations'; -export const JOBS_BASE = '/query/jobs'; -export const DATACONNECTIONS_BASE = '/api/dataconnections'; -export const EDIT = '/edit'; -export const DATACONNECTIONS_UPDATE_STATUS = '/status'; -export const SECURITY_ROLES = '/api/v1/configuration/roles'; -export const EVENT_ANALYTICS = '/event_analytics'; -export const SAVED_OBJECTS = '/saved_objects'; -export const SAVED_QUERY = '/query'; -export const SAVED_VISUALIZATION = '/vis'; -export const CONSOLE_PROXY = '/api/console/proxy'; -export const SECURITY_PLUGIN_ACCOUNT_API = '/api/v1/configuration/account'; - -// Server route -export const PPL_ENDPOINT = '/_plugins/_ppl'; -export const SQL_ENDPOINT = '/_plugins/_sql'; -export const DSL_ENDPOINT = '/_plugins/_dsl'; -export const DATACONNECTIONS_ENDPOINT = '/_plugins/_query/_datasources'; -export const JOBS_ENDPOINT_BASE = '/_plugins/_async_query'; -export const JOB_RESULT_ENDPOINT = '/result'; - -export const observabilityID = 'observability-logs'; -export const observabilityTitle = 'Observability'; -export const observabilityPluginOrder = 1500; - -export const observabilityApplicationsID = 'observability-applications'; -export const observabilityApplicationsTitle = 'Applications'; -export const observabilityApplicationsPluginOrder = 5090; - -export const observabilityLogsID = 'observability-logs'; -export const observabilityLogsTitle = 'Logs'; -export const observabilityLogsPluginOrder = 5091; - -export const observabilityMetricsID = 'observability-metrics'; -export const observabilityMetricsTitle = 'Metrics'; -export const observabilityMetricsPluginOrder = 5092; - -export const observabilityTracesID = 'observability-traces'; -export const observabilityTracesTitle = 'Traces'; -export const observabilityTracesPluginOrder = 5093; - -export const observabilityNotebookID = 'observability-notebooks'; -export const observabilityNotebookTitle = 'Notebooks'; -export const observabilityNotebookPluginOrder = 5094; - -export const observabilityPanelsID = 'observability-dashboards'; -export const observabilityPanelsTitle = 'Dashboards'; -export const observabilityPanelsPluginOrder = 5095; - -export const observabilityIntegrationsID = 'integrations'; -export const observabilityIntegrationsTitle = 'Integrations'; -export const observabilityIntegrationsPluginOrder = 9020; - -export const observabilityDataConnectionsID = 'datasources'; -export const observabilityDataConnectionsTitle = 'Data sources'; -export const observabilityDataConnectionsPluginOrder = 9030; - -export const queryWorkbenchPluginID = 'opensearch-query-workbench'; -export const queryWorkbenchPluginCheck = 'plugin:queryWorkbenchDashboards'; - -// Shared Constants -export const SQL_DOCUMENTATION_URL = 'https://opensearch.org/docs/latest/search-plugins/sql/index/'; -export const PPL_DOCUMENTATION_URL = - 'https://opensearch.org/docs/latest/search-plugins/sql/ppl/index'; -export const PPL_PATTERNS_DOCUMENTATION_URL = - 'https://github.com/opensearch-project/sql/blob/2.x/docs/user/ppl/cmd/patterns.rst#description'; -export const UI_DATE_FORMAT = 'MM/DD/YYYY hh:mm A'; -export const PPL_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSSSSS'; -export const OTEL_DATE_FORMAT = 'YYYY-MM-DDTHH:mm:ss'; -export const SPAN_REGEX = /span/; - -export const PROMQL_METRIC_SUBTYPE = 'promqlmetric'; -export const OTEL_METRIC_SUBTYPE = 'openTelemetryMetric'; -export const PPL_METRIC_SUBTYPE = 'metric'; - -export const PPL_SPAN_REGEX = /by\s*span/i; -export const PPL_STATS_REGEX = /\|\s*stats/i; -export const PPL_INDEX_INSERT_POINT_REGEX = /(search source|source|index)\s*=\s*([^|\s]+)(.*)/i; -export const PPL_INDEX_REGEX = /(search source|source|index)\s*=\s*([^|\s]+)/i; -export const PPL_WHERE_CLAUSE_REGEX = /\s*where\s+/i; -export const PPL_NEWLINE_REGEX = /[\n\r]+/g; -export const PPL_DESCRIBE_INDEX_REGEX = /(describe)\s+([^|\s]+)/i; - -// Observability plugin URI -const BASE_OBSERVABILITY_URI = '/_plugins/_observability'; -const BASE_DATACONNECTIONS_URI = '/_plugins/_query/_datasources'; -export const OPENSEARCH_PANELS_API = { - OBJECT: `${BASE_OBSERVABILITY_URI}/object`, -}; -export const OPENSEARCH_DATACONNECTIONS_API = { - DATACONNECTION: `${BASE_DATACONNECTIONS_URI}`, -}; - -// Saved Objects -export const SAVED_OBJECT = '/object'; - -// Color Constants -export const PLOTLY_COLOR = [ - '#3CA1C7', - '#54B399', - '#DB748A', - '#F2BE4B', - '#68CCC2', - '#2A7866', - '#843769', - '#374FB8', - '#BD6F26', - '#4C636F', -]; - -export const LONG_CHART_COLOR = PLOTLY_COLOR[1]; - -export const pageStyles: CSS.Properties = { - float: 'left', - width: '100%', - maxWidth: '1130px', -}; - -export enum VIS_CHART_TYPES { - Bar = 'bar', - HorizontalBar = 'horizontal_bar', - Line = 'line', - Pie = 'pie', - HeatMap = 'heatmap', - Text = 'text', - Histogram = 'histogram', -} - -export const NUMERICAL_FIELDS = ['short', 'integer', 'long', 'float', 'double']; - -export const ENABLED_VIS_TYPES = [ - VIS_CHART_TYPES.Bar, - VIS_CHART_TYPES.HorizontalBar, - VIS_CHART_TYPES.Line, - VIS_CHART_TYPES.Pie, - VIS_CHART_TYPES.HeatMap, - VIS_CHART_TYPES.Text, -]; - -// Live tail constants -export const LIVE_OPTIONS = [ - { - label: '5s', - startTime: 'now-5s', - delayTime: 5000, - }, - { - label: '10s', - startTime: 'now-10s', - delayTime: 10000, - }, - { - label: '30s', - startTime: 'now-30s', - delayTime: 30000, - }, - { - label: '1m', - startTime: 'now-1m', - delayTime: 60000, - }, - { - label: '5m', - startTime: 'now-5m', - delayTime: 60000 * 5, - }, - { - label: '15m', - startTime: 'now-15m', - delayTime: 60000 * 15, - }, - { - label: '30m', - startTime: 'now-30m', - delayTime: 60000 * 30, - }, - { - label: '1h', - startTime: 'now-1h', - delayTime: 60000 * 60, - }, - { - label: '2h', - startTime: 'now-2h', - delayTime: 60000 * 120, - }, -]; - -export const LIVE_END_TIME = 'now'; - -export interface DefaultChartStylesProps { - DefaultModeLine: string; - Interpolation: string; - LineWidth: number; - FillOpacity: number; - MarkerSize: number; - ShowLegend: string; - LegendPosition: string; - LabelAngle: number; - DefaultSortSectors: string; - DefaultModeScatter: string; -} - -export const DEFAULT_CHART_STYLES: DefaultChartStylesProps = { - DefaultModeLine: 'lines+markers', - Interpolation: 'spline', - LineWidth: 0, - FillOpacity: 100, - MarkerSize: 25, - ShowLegend: 'show', - LegendPosition: 'v', - LabelAngle: 0, - DefaultSortSectors: 'largest_to_smallest', - DefaultModeScatter: 'markers', -}; - -export const FILLOPACITY_DIV_FACTOR = 200; -export const SLIDER_MIN_VALUE = 0; -export const SLIDER_MAX_VALUE = 100; -export const SLIDER_STEP = 1; -export const THRESHOLD_LINE_WIDTH = 3; -export const THRESHOLD_LINE_OPACITY = 0.7; -export const MAX_BUCKET_LENGTH = 16; - -export enum BarOrientation { - horizontal = 'h', - vertical = 'v', -} - -export const PLOT_MARGIN = { - l: 30, - r: 5, - b: 30, - t: 50, - pad: 4, -}; - -export const WAITING_TIME_ON_USER_ACTIONS = 300; - -export const VISUALIZATION_ERROR = { - NO_DATA: 'No data found.', - INVALID_DATA: 'Invalid visualization data', - NO_SERIES: 'Add a field to start', - NO_METRIC: 'Invalid Metric MetaData', -}; - -export const S3_DATA_SOURCE_TYPE = 's3glue'; - -export const ASYNC_QUERY_SESSION_ID = 'async-query-session-id'; -export const ASYNC_QUERY_DATASOURCE_CACHE = 'async-query-catalog-cache'; -export const ASYNC_QUERY_ACCELERATIONS_CACHE = 'async-query-acclerations-cache'; - -export const DIRECT_DUMMY_QUERY = 'select 1'; - -export const DEFAULT_START_TIME = 'now-15m'; -export const QUERY_ASSIST_START_TIME = 'now-40y'; -export const QUERY_ASSIST_END_TIME = 'now'; - -export const TIMESTAMP_DATETIME_TYPES = ['date', 'date_nanos']; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts b/src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts deleted file mode 100644 index 74fedd6cf11..00000000000 --- a/src/plugins/data/public/ui/dataset_navigator/lib/utils/use_polling.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { useEffect, useRef, useState } from 'react'; - -type FetchFunction = (params?: P) => Promise; - -export interface PollingConfigurations { - tabId: string; -} - -export class UsePolling { - public data: T | null = null; - public error: Error | null = null; - public loading: boolean = true; - private shouldPoll: boolean = false; - private intervalRef?: NodeJS.Timeout; - - constructor( - private fetchFunction: FetchFunction, - private interval: number = 5000, - private onPollingSuccess?: (data: T, configurations: PollingConfigurations) => boolean, - private onPollingError?: (error: Error) => boolean, - private configurations?: PollingConfigurations - ) {} - - async fetchData(params?: P) { - this.loading = true; - try { - const result = await this.fetchFunction(params); - this.data = result; - this.loading = false; - - if (this.onPollingSuccess && this.onPollingSuccess(result, this.configurations!)) { - this.stopPolling(); - } - } catch (err) { - this.error = err as Error; - this.loading = false; - - if (this.onPollingError && this.onPollingError(this.error)) { - this.stopPolling(); - } - } - } - - startPolling(params?: P) { - this.shouldPoll = true; - if (!this.intervalRef) { - this.intervalRef = setInterval(() => { - if (this.shouldPoll) { - this.fetchData(params); - } - }, this.interval); - } - } - - stopPolling() { - this.shouldPoll = false; - if (this.intervalRef) { - clearInterval(this.intervalRef); - this.intervalRef = undefined; - } - } -} - -interface UsePollingReturn { - data: T | null; - loading: boolean; - error: Error | null; - startPolling: (params?: any) => void; - stopPolling: () => void; -} - -export function usePolling( - fetchFunction: FetchFunction, - interval: number = 5000, - onPollingSuccess?: (data: T, configurations: PollingConfigurations) => boolean, - onPollingError?: (error: Error) => boolean, - configurations?: PollingConfigurations -): UsePollingReturn { - const [data, setData] = useState(null); - const [error, setError] = useState(null); - const [loading, setLoading] = useState(true); - const intervalRef = useRef(undefined); - const unmounted = useRef(false); - - const shouldPoll = useRef(false); - - const startPolling = (params?: P) => { - shouldPoll.current = true; - const intervalId = setInterval(() => { - if (shouldPoll.current) { - fetchData(params); - } - }, interval); - intervalRef.current = intervalId; - if (unmounted.current) { - clearInterval(intervalId); - } - }; - - const stopPolling = () => { - shouldPoll.current = false; - clearInterval(intervalRef.current); - }; - - const fetchData = async (params?: P) => { - try { - const result = await fetchFunction(params); - setData(result); - // Check the success condition and stop polling if it's met - if (onPollingSuccess && onPollingSuccess(result, configurations)) { - stopPolling(); - } - } catch (err: unknown) { - setError(err as Error); - - // Check the error condition and stop polling if it's met - if (onPollingError && onPollingError(err as Error)) { - stopPolling(); - } - } finally { - setLoading(false); - } - }; - - useEffect(() => { - return () => { - unmounted.current = true; - }; - }, []); - - return { data, loading, error, startPolling, stopPolling }; -} diff --git a/src/plugins/data/public/ui/index.ts b/src/plugins/data/public/ui/index.ts index 400887e51d5..5483b540d5b 100644 --- a/src/plugins/data/public/ui/index.ts +++ b/src/plugins/data/public/ui/index.ts @@ -49,4 +49,3 @@ export { } from './query_editor'; export { SearchBar, SearchBarProps, StatefulSearchBarProps } from './search_bar'; export { SuggestionsComponent } from './typeahead'; -export { DataSetNavigator } from './dataset_navigator'; diff --git a/src/plugins/data/public/ui/query_editor/_language_switcher.scss b/src/plugins/data/public/ui/query_editor/_language_switcher.scss new file mode 100644 index 00000000000..176d072c102 --- /dev/null +++ b/src/plugins/data/public/ui/query_editor/_language_switcher.scss @@ -0,0 +1,8 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +.languageSelect { + max-width: 150px; + transform: translateY(-1px) translateX(-0.5px); +} diff --git a/src/plugins/data/public/ui/query_editor/_query_editor.scss b/src/plugins/data/public/ui/query_editor/_query_editor.scss index ac411b38ab8..8fc81308b53 100644 --- a/src/plugins/data/public/ui/query_editor/_query_editor.scss +++ b/src/plugins/data/public/ui/query_editor/_query_editor.scss @@ -86,12 +86,6 @@ } } -.osdQueryEditor__dataSetNavigatorWrapper { - :first-child { - border-bottom: $euiBorderThin !important; - } -} - @include euiBreakpoint("xs", "s") { .osdQueryEditor--withDatePicker { > :first-child { diff --git a/src/plugins/data/public/ui/query_editor/language_selector.test.tsx b/src/plugins/data/public/ui/query_editor/language_selector.test.tsx index 62c4ebea288..f61134211a4 100644 --- a/src/plugins/data/public/ui/query_editor/language_selector.test.tsx +++ b/src/plugins/data/public/ui/query_editor/language_selector.test.tsx @@ -8,6 +8,7 @@ import { QueryLanguageSelector } from './language_selector'; import { OpenSearchDashboardsContextProvider } from 'src/plugins/opensearch_dashboards_react/public'; import { coreMock } from '../../../../../core/public/mocks'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { EuiCompressedComboBox } from '@elastic/eui'; import { QueryEnhancement } from '../types'; const startMock = coreMock.createStart(); diff --git a/src/plugins/data/public/ui/query_editor/language_switcher.tsx b/src/plugins/data/public/ui/query_editor/language_switcher.tsx new file mode 100644 index 00000000000..be22ebffd77 --- /dev/null +++ b/src/plugins/data/public/ui/query_editor/language_switcher.tsx @@ -0,0 +1,102 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { EuiComboBox, EuiComboBoxOptionOption, PopoverAnchorPosition } from '@elastic/eui'; +import { i18n } from '@osd/i18n'; +import React from 'react'; +import { getSearchService, getUiService } from '../../services'; + +interface Props { + language: string; + onSelectLanguage: (newLanguage: string) => void; + anchorPosition?: PopoverAnchorPosition; + appName?: string; +} + +function mapExternalLanguageToOptions(language: string) { + return { + label: language, + value: language, + }; +} + +export function QueryLanguageSwitcher(props: Props) { + const dqlLabel = i18n.translate('data.query.queryBar.dqlLanguageName', { + defaultMessage: 'DQL', + }); + const luceneLabel = i18n.translate('data.query.queryBar.luceneLanguageName', { + defaultMessage: 'Lucene', + }); + + const languageOptions: EuiComboBoxOptionOption[] = [ + { + label: dqlLabel, + value: 'kuery', + }, + { + label: luceneLabel, + value: 'lucene', + }, + ]; + + const uiService = getUiService(); + const searchService = getSearchService(); + + const queryEnhancements = uiService.queryEnhancements; + if (uiService.isEnhancementsEnabled) { + queryEnhancements.forEach((enhancement) => { + if ( + enhancement.supportedAppNames && + props.appName && + !enhancement.supportedAppNames.includes(props.appName) + ) + return; + languageOptions.push(mapExternalLanguageToOptions(enhancement.language)); + }); + } + + const selectedLanguage = { + label: + (languageOptions.find( + (option) => (option.value as string).toLowerCase() === props.language.toLowerCase() + )?.label as string) ?? languageOptions[0].label, + }; + + const setSearchEnhance = (queryLanguage: string) => { + if (!uiService.isEnhancementsEnabled) return; + const queryEnhancement = queryEnhancements.get(queryLanguage); + searchService.__enhance({ + searchInterceptor: queryEnhancement + ? queryEnhancement.search + : searchService.getDefaultSearchInterceptor(), + }); + + if (!queryEnhancement) { + searchService.df.clear(); + } + uiService.Settings.setUiOverridesByUserQueryLanguage(queryLanguage); + }; + + const handleLanguageChange = (newLanguage: EuiComboBoxOptionOption[]) => { + const queryLanguage = newLanguage[0].value as string; + props.onSelectLanguage(queryLanguage); + setSearchEnhance(queryLanguage); + }; + + setSearchEnhance(props.language); + + return ( + + ); +} diff --git a/src/plugins/data/public/ui/query_editor/query_editor.tsx b/src/plugins/data/public/ui/query_editor/query_editor.tsx index db4984b637d..44d000de1e8 100644 --- a/src/plugins/data/public/ui/query_editor/query_editor.tsx +++ b/src/plugins/data/public/ui/query_editor/query_editor.tsx @@ -3,7 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiFlexGroup, EuiFlexItem, htmlIdGenerator, PopoverAnchorPosition } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiFormRow, + htmlIdGenerator, + PopoverAnchorPosition, +} from '@elastic/eui'; import classNames from 'classnames'; import { isEqual } from 'lodash'; import React, { Component, createRef, RefObject } from 'react'; @@ -37,7 +44,10 @@ export interface QueryEditorProps { indexPatterns: Array; dataSource?: DataSource; query: Query; - dataSetContainerRef?: React.RefCallback; + container?: HTMLDivElement; + dataSourceContainerRef?: React.RefCallback; + containerRef?: React.RefCallback; + languageSelectorContainerRef?: React.RefCallback; settings: Settings; disableAutoFocus?: boolean; screenTitle?: string; @@ -50,7 +60,7 @@ export interface QueryEditorProps { onChange?: (query: Query, dateRange?: TimeRange) => void; onChangeQueryEditorFocus?: (isFocused: boolean) => void; onSubmit?: (query: Query, dateRange?: TimeRange) => void; - getQueryStringInitialValue?: (language: string, dataSetName?: string) => string; + getQueryStringInitialValue?: (language: string) => string; dataTestSubj?: string; size?: SuggestionsListSize; className?: string; @@ -67,6 +77,8 @@ interface Props extends QueryEditorProps { } interface State { + isDataSourcesVisible: boolean; + isDataSetsVisible: boolean; isSuggestionsVisible: boolean; index: number | null; suggestions: QuerySuggestion[]; @@ -93,6 +105,8 @@ const KEY_CODES = { // eslint-disable-next-line import/no-default-export export default class QueryEditorUI extends Component { public state: State = { + isDataSourcesVisible: false, + isDataSetsVisible: true, isSuggestionsVisible: false, index: null, suggestions: [], @@ -107,6 +121,7 @@ export default class QueryEditorUI extends Component { private persistedLog: PersistedLog | undefined; private abortController?: AbortController; private services = this.props.opensearchDashboards.services; + private componentIsUnmounting = false; private headerRef: RefObject = createRef(); private bannerRef: RefObject = createRef(); private extensionMap = this.props.settings?.getQueryEditorExtensionMap(); @@ -235,6 +250,10 @@ export default class QueryEditorUI extends Component { : undefined; this.onChange(newQuery, dateRange); this.onSubmit(newQuery, dateRange); + this.setState({ + isDataSourcesVisible: enhancement?.searchBar?.showDataSourcesSelector ?? true, + isDataSetsVisible: enhancement?.searchBar?.showDataSetsSelector ?? true, + }); }; private initPersistedLog = () => { @@ -244,6 +263,20 @@ export default class QueryEditorUI extends Component { : getQueryLog(uiSettings, storage, appName, this.props.query.language); }; + private initDataSourcesVisibility = () => { + if (this.componentIsUnmounting) return; + + return this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar + ?.showDataSourcesSelector; + }; + + private initDataSetsVisibility = () => { + if (this.componentIsUnmounting) return; + + return this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar + ?.showDataSetsSelector; + }; + public onMouseEnterSuggestion = (index: number) => { this.setState({ index }); }; @@ -258,6 +291,10 @@ export default class QueryEditorUI extends Component { this.initPersistedLog(); // this.fetchIndexPatterns().then(this.updateSuggestions); + this.setState({ + isDataSourcesVisible: this.initDataSourcesVisibility() || true, + isDataSetsVisible: this.initDataSetsVisibility() || true, + }); } public componentDidUpdate(prevProps: Props) { @@ -271,6 +308,7 @@ export default class QueryEditorUI extends Component { public componentWillUnmount() { if (this.abortController) this.abortController.abort(); + this.componentIsUnmounting = true; } handleOnFocus = () => { @@ -393,15 +431,6 @@ export default class QueryEditorUI extends Component { const useQueryEditor = this.props.query.language !== 'kuery' && this.props.query.language !== 'lucene'; - const languageSelector = ( - - ); - return (
@@ -414,9 +443,17 @@ export default class QueryEditorUI extends Component { isCollapsed={!this.state.isCollapsed} /> - -
- + {this.state.isDataSourcesVisible && ( + +
+ + )} + + {this.state.isDataSetsVisible && ( + +
+ + )} {(this.state.isCollapsed || !useQueryEditor) && ( @@ -459,7 +496,14 @@ export default class QueryEditorUI extends Component { )} {!useQueryEditor && ( -
{languageSelector}
+
+ +
)}
@@ -513,7 +557,15 @@ export default class QueryEditorUI extends Component { } > - {languageSelector} + + + {this.state.lineCount} {this.state.lineCount === 1 ? 'line' : 'lines'} diff --git a/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx b/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx index 971d13cfc05..a482d741641 100644 --- a/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx +++ b/src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx @@ -39,7 +39,8 @@ const QueryEditor = withOpenSearchDashboards(QueryEditorUI); // @internal export interface QueryEditorTopRowProps { query?: Query; - dataSetContainerRef?: React.RefCallback; + dataSourceContainerRef?: React.RefCallback; + containerRef?: React.RefCallback; settings?: Settings; onSubmit: (payload: { dateRange: TimeRange; query?: Query }) => void; onChange: (payload: { dateRange: TimeRange; query?: Query }) => void; @@ -207,10 +208,11 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) { ) return ''; - const defaultDataSet = indexPatterns[0]; - const dataSet = typeof defaultDataSet === 'string' ? defaultDataSet : defaultDataSet.title; + const defaultDataSource = indexPatterns[0]; + const dataSource = + typeof defaultDataSource === 'string' ? defaultDataSource : defaultDataSource.title; - return input.replace('', dataSet); + return input.replace('', dataSource); } function renderQueryEditor() { @@ -223,7 +225,8 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) { dataSource={props.dataSource} prepend={props.prepend} query={parsedQuery} - dataSetContainerRef={props.dataSetContainerRef} + dataSourceContainerRef={props.dataSourceContainerRef} + containerRef={props.containerRef} settings={props.settings!} screenTitle={props.screenTitle} onChange={onQueryChange} diff --git a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx index d722aeda510..31f3401dc76 100644 --- a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx @@ -48,7 +48,8 @@ interface StatefulSearchBarDeps { data: Omit; storage: IStorageWrapper; settings: Settings; - setDataSetContainerRef: (ref: HTMLDivElement | null) => void; + setDataSourceContainerRef: (ref: HTMLDivElement | null) => void; + setContainerRef: (ref: HTMLDivElement | null) => void; } export type StatefulSearchBarProps = SearchBarOwnProps & { @@ -138,7 +139,8 @@ export function createSearchBar({ storage, data, settings, - setDataSetContainerRef, + setDataSourceContainerRef, + setContainerRef, }: StatefulSearchBarDeps) { // App name should come from the core application service. // Until it's available, we'll ask the user to provide it for the pre-wired component. @@ -174,9 +176,15 @@ export function createSearchBar({ notifications: core.notifications, }); - const dataSetContainerRef = useCallback((node) => { + const dataSourceContainerRef = useCallback((node) => { if (node) { - setDataSetContainerRef(node); + setDataSourceContainerRef(node); + } + }, []); + + const containerRef = useCallback((node) => { + if (node) { + setContainerRef(node); } }, []); @@ -220,7 +228,8 @@ export function createSearchBar({ filters={filters} query={query} settings={settings} - dataSetContainerRef={dataSetContainerRef} + dataSourceContainerRef={dataSourceContainerRef} + containerRef={containerRef} onFiltersUpdated={defaultFiltersUpdated(data.query)} onRefreshChange={defaultOnRefreshChange(data.query)} savedQuery={savedQuery} diff --git a/src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts b/src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts deleted file mode 100644 index 7a92d03e9f3..00000000000 --- a/src/plugins/data/public/ui/search_bar/lib/use_dataset_manager.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { useState, useEffect } from 'react'; -import { Subscription } from 'rxjs'; -import { SimpleDataSet } from '../../../../../data/common'; -import { DataSetContract } from '../../../query'; - -interface UseDataSetManagerProps { - dataSet?: SimpleDataSet; - dataSetManager: DataSetContract; -} - -export const useDataSetManager = (props: UseDataSetManagerProps) => { - const [dataSet, setDataSet] = useState( - props.dataSet || props.dataSetManager.getDataSet() - ); - - useEffect(() => { - const subscriptions = new Subscription(); - - subscriptions.add( - props.dataSetManager.getUpdates$().subscribe({ - next: () => { - const newDataSet = props.dataSetManager.getDataSet(); - setDataSet(newDataSet); - }, - }) - ); - - return () => { - subscriptions.unsubscribe(); - }; - }, [dataSet, props.dataSet, props.dataSetManager]); - - return { dataSet }; -}; diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index 4dddba69ff9..b2ff6766e81 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -81,7 +81,8 @@ export interface SearchBarOwnProps { // Query bar - should be in SearchBarInjectedDeps query?: Query; settings?: Settings; - dataSetContainerRef?: React.RefCallback; + dataSourceContainerRef?: React.RefCallback; + containerRef?: React.RefCallback; // Show when user has privileges to save showSaveQuery?: boolean; savedQuery?: SavedQuery; @@ -492,7 +493,8 @@ class SearchBarUI extends Component { queryEditor = ( ; - /** - * @experimental - Subject to change - */ - DataSetNavigator: React.ComponentType; SearchBar: React.ComponentType; SuggestionsComponent: React.ComponentType; - /** - * @experimental - Subject to change - */ Settings: Settings; - dataSetContainer$: Observable; + dataSourceContainer$: Observable; + container$: Observable; } diff --git a/src/plugins/data/public/ui/ui_service.ts b/src/plugins/data/public/ui/ui_service.ts index 4f403597467..1e0e6be8b78 100644 --- a/src/plugins/data/public/ui/ui_service.ts +++ b/src/plugins/data/public/ui/ui_service.ts @@ -8,7 +8,6 @@ import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core import { IStorageWrapper } from '../../../opensearch_dashboards_utils/public'; import { ConfigSchema } from '../../config'; import { DataPublicPluginStart } from '../types'; -import { createDataSetNavigator } from './dataset_navigator'; import { createIndexPatternSelect } from './index_pattern_select'; import { QueryEditorExtensionConfig } from './query_editor'; import { createSearchBar } from './search_bar/create_search_bar'; @@ -30,7 +29,8 @@ export class UiService implements Plugin { enhancementsConfig: ConfigSchema['enhancements']; private queryEnhancements: Map = new Map(); private queryEditorExtensionMap: Record = {}; - private dataSetContainer$ = new BehaviorSubject(null); + private dataSourceContainer$ = new BehaviorSubject(null); + private container$ = new BehaviorSubject(null); constructor(initializerContext: PluginInitializerContext) { const { enhancements } = initializerContext.config.get(); @@ -62,8 +62,12 @@ export class UiService implements Plugin { queryEditorExtensionMap: this.queryEditorExtensionMap, }); - const setDataSetContainerRef = (ref: HTMLDivElement | null) => { - this.dataSetContainer$.next(ref); + const setDataSourceContainerRef = (ref: HTMLDivElement | null) => { + this.dataSourceContainer$.next(ref); + }; + + const setContainerRef = (ref: HTMLDivElement | null) => { + this.container$.next(ref); }; const SearchBar = createSearchBar({ @@ -71,20 +75,17 @@ export class UiService implements Plugin { data: dataServices, storage, settings: Settings, - setDataSetContainerRef, + setDataSourceContainerRef, + setContainerRef, }); return { IndexPatternSelect: createIndexPatternSelect(core.savedObjects.client), - DataSetNavigator: createDataSetNavigator( - core.savedObjects.client, - core.http, - dataServices.query.dataSet - ), SearchBar, SuggestionsComponent, Settings, - dataSetContainer$: this.dataSetContainer$, + dataSourceContainer$: this.dataSourceContainer$, + container$: this.container$, }; } diff --git a/src/plugins/data/server/search/search_service.ts b/src/plugins/data/server/search/search_service.ts index 02ca0c30161..ecc17dbfe71 100644 --- a/src/plugins/data/server/search/search_service.ts +++ b/src/plugins/data/server/search/search_service.ts @@ -229,10 +229,7 @@ export class SearchService implements Plugin { dataFrame.meta.queryConfig.dataSourceId = dataSource?.id; } this.dfCache.set(dataFrame); - const dataSetName = `${dataFrame.meta?.queryConfig?.dataSourceId ?? ''}.${ - dataFrame.name - }`; - const existingIndexPattern = await scopedIndexPatterns.get(dataSetName, true); + const existingIndexPattern = scopedIndexPatterns.getByTitle(dataFrame.name!, true); const dataSet = await scopedIndexPatterns.create( dataFrameToSpec(dataFrame, existingIndexPattern?.id), !existingIndexPattern?.id @@ -242,6 +239,8 @@ export class SearchService implements Plugin { }, clear: () => { if (this.dfCache.get() === undefined) return; + // name because the id is not unique for temporary index pattern created + scopedIndexPatterns.clearCache(this.dfCache.get()!.name, false); this.dfCache.clear(); }, }; diff --git a/src/plugins/data_explorer/public/components/sidebar/index.tsx b/src/plugins/data_explorer/public/components/sidebar/index.tsx index 616be16e9f5..eea1860dc95 100644 --- a/src/plugins/data_explorer/public/components/sidebar/index.tsx +++ b/src/plugins/data_explorer/public/components/sidebar/index.tsx @@ -30,8 +30,6 @@ export const Sidebar: FC = ({ children }) => { }, } = useOpenSearchDashboards(); - const { DataSetNavigator } = ui; - useEffect(() => { const subscriptions = ui.Settings.getEnabledQueryEnhancementsUpdated$().subscribe( (enabledQueryEnhancements) => { @@ -50,17 +48,17 @@ export const Sidebar: FC = ({ children }) => { useEffect(() => { if (!isEnhancementsEnabled) return; - const subscriptions = ui.dataSetContainer$.subscribe((dataSetContainer) => { - if (dataSetContainer === null) return; + const subscriptions = ui.container$.subscribe((container) => { + if (container === null) return; if (containerRef.current) { - setContainerRef(dataSetContainer); + setContainerRef(container); } }); return () => { subscriptions.unsubscribe(); }; - }, [ui.dataSetContainer$, containerRef, setContainerRef, isEnhancementsEnabled]); + }, [ui.container$, containerRef, setContainerRef, isEnhancementsEnabled]); useEffect(() => { let isMounted = true; @@ -136,6 +134,19 @@ export const Sidebar: FC = ({ children }) => { dataSources.dataSourceService.reload(); }, [dataSources.dataSourceService]); + const dataSourceSelector = ( + + ); + return ( { containerRef.current = node; }} > - + {dataSourceSelector} )} {!isEnhancementsEnabled && ( @@ -160,16 +171,7 @@ export const Sidebar: FC = ({ children }) => { color="transparent" className="deSidebar_dataSource" > - + {dataSourceSelector} )} diff --git a/src/plugins/data_explorer/public/index.ts b/src/plugins/data_explorer/public/index.ts index 6b0561261c1..f8adda434ce 100644 --- a/src/plugins/data_explorer/public/index.ts +++ b/src/plugins/data_explorer/public/index.ts @@ -18,5 +18,4 @@ export { useTypedSelector, useTypedDispatch, setIndexPattern, - setDataSet, } from './utils/state_management'; diff --git a/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts b/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts index fa41a29259e..e9fe8471312 100644 --- a/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts +++ b/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts @@ -5,13 +5,11 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { DataExplorerServices } from '../../types'; -import { SimpleDataSet } from '../../../../data/common'; export interface MetadataState { indexPattern?: string; originatingApp?: string; view?: string; - dataSet?: Omit; } const initialState: MetadataState = {}; @@ -42,9 +40,6 @@ export const slice = createSlice({ setIndexPattern: (state, action: PayloadAction) => { state.indexPattern = action.payload; }, - setDataSet: (state, action: PayloadAction>) => { - state.dataSet = action.payload; - }, setOriginatingApp: (state, action: PayloadAction) => { state.originatingApp = action.payload; }, @@ -58,4 +53,4 @@ export const slice = createSlice({ }); export const { reducer } = slice; -export const { setIndexPattern, setDataSet, setOriginatingApp, setView, setState } = slice.actions; +export const { setIndexPattern, setOriginatingApp, setView, setState } = slice.actions; diff --git a/src/plugins/data_explorer/public/utils/state_management/store.ts b/src/plugins/data_explorer/public/utils/state_management/store.ts index 9d320de4b54..daf0b3d7e36 100644 --- a/src/plugins/data_explorer/public/utils/state_management/store.ts +++ b/src/plugins/data_explorer/public/utils/state_management/store.ts @@ -116,4 +116,4 @@ export type RenderState = Omit; // Remaining state after export type Store = ReturnType; export type AppDispatch = Store['dispatch']; -export { MetadataState, setIndexPattern, setDataSet, setOriginatingApp } from './metadata_slice'; +export { MetadataState, setIndexPattern, setOriginatingApp } from './metadata_slice'; diff --git a/src/plugins/discover/public/application/utils/state_management/index.ts b/src/plugins/discover/public/application/utils/state_management/index.ts index e6df7e4774b..989b2662f0d 100644 --- a/src/plugins/discover/public/application/utils/state_management/index.ts +++ b/src/plugins/discover/public/application/utils/state_management/index.ts @@ -7,7 +7,6 @@ import { TypedUseSelectorHook } from 'react-redux'; import { RootState, setIndexPattern as updateIndexPattern, - setDataSet as updateDataSet, useTypedDispatch, useTypedSelector, } from '../../../../../data_explorer/public'; @@ -21,4 +20,4 @@ export interface DiscoverRootState extends RootState { export const useSelector: TypedUseSelectorHook = useTypedSelector; export const useDispatch = useTypedDispatch; -export { updateIndexPattern, updateDataSet }; +export { updateIndexPattern }; diff --git a/src/plugins/discover/public/application/view_components/utils/update_search_source.ts b/src/plugins/discover/public/application/view_components/utils/update_search_source.ts index 05d4a2dbd8b..a8480fdad18 100644 --- a/src/plugins/discover/public/application/view_components/utils/update_search_source.ts +++ b/src/plugins/discover/public/application/view_components/utils/update_search_source.ts @@ -30,12 +30,7 @@ export const updateSearchSource = async ({ histogramConfigs, }: Props) => { const { uiSettings, data } = services; - const queryDataSet = data.query.dataSet.getDataSet(); - - let dataSet = - indexPattern.id === queryDataSet?.id - ? await data.indexPatterns.getByTitle(queryDataSet?.title!) - : indexPattern; + let dataSet = indexPattern; const dataFrame = searchSource?.getDataFrame(); if ( searchSource && diff --git a/src/plugins/discover/public/application/view_components/utils/use_search.ts b/src/plugins/discover/public/application/view_components/utils/use_search.ts index 1e40cf40a8a..8c2ace81b04 100644 --- a/src/plugins/discover/public/application/view_components/utils/use_search.ts +++ b/src/plugins/discover/public/application/view_components/utils/use_search.ts @@ -250,8 +250,7 @@ export const useSearch = (services: DiscoverViewServices) => { timefilter.getFetch$(), timefilter.getTimeUpdate$(), timefilter.getAutoRefreshFetch$(), - data.query.queryString.getUpdates$(), - data.query.dataSet.getUpdates$() + data.query.queryString.getUpdates$() ).pipe(debounceTime(100)); const subscription = fetch$.subscribe(() => { @@ -281,7 +280,6 @@ export const useSearch = (services: DiscoverViewServices) => { fetch, core.fatalErrors, shouldSearchOnPageLoad, - data.query.dataSet, ]); // Get savedSearch if it exists diff --git a/src/plugins/query_enhancements/opensearch_dashboards.json b/src/plugins/query_enhancements/opensearch_dashboards.json index 69d8fd3bd66..b09494aab0c 100644 --- a/src/plugins/query_enhancements/opensearch_dashboards.json +++ b/src/plugins/query_enhancements/opensearch_dashboards.json @@ -3,7 +3,7 @@ "version": "opensearchDashboards", "server": true, "ui": true, - "requiredPlugins": ["data", "opensearchDashboardsReact", "opensearchDashboardsUtils", "savedObjects", "uiActions"], + "requiredPlugins": ["data", "opensearchDashboardsReact", "opensearchDashboardsUtils", "dataSourceManagement", "savedObjects", "uiActions"], "optionalPlugins": ["dataSource"] } diff --git a/src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx b/src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx new file mode 100644 index 00000000000..3fd592e50b3 --- /dev/null +++ b/src/plugins/query_enhancements/public/data_source_connection/components/connections_bar.tsx @@ -0,0 +1,94 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useEffect, useRef, useState } from 'react'; +import { EuiPortal } from '@elastic/eui'; +import { distinctUntilChanged } from 'rxjs/operators'; +import { ToastsSetup } from 'opensearch-dashboards/public'; +import { DataPublicPluginStart, QueryEditorExtensionDependencies } from '../../../../data/public'; +import { DataSourceSelector } from '../../../../data_source_management/public'; +import { ConnectionsService } from '../services'; + +interface ConnectionsProps { + dependencies: QueryEditorExtensionDependencies; + toasts: ToastsSetup; + connectionsService: ConnectionsService; +} + +export const ConnectionsBar: React.FC = ({ connectionsService, toasts }) => { + const [isDataSourceEnabled, setIsDataSourceEnabled] = useState(false); + const [uiService, setUiService] = useState(undefined); + const containerRef = useRef(null); + + useEffect(() => { + const uiServiceSubscription = connectionsService.getUiService().subscribe(setUiService); + const dataSourceEnabledSubscription = connectionsService + .getIsDataSourceEnabled$() + .subscribe(setIsDataSourceEnabled); + + return () => { + uiServiceSubscription.unsubscribe(); + dataSourceEnabledSubscription.unsubscribe(); + }; + }, [connectionsService]); + + useEffect(() => { + if (!uiService || !isDataSourceEnabled || !containerRef.current) return; + const subscriptions = uiService.dataSourceContainer$.subscribe((container) => { + if (container && containerRef.current) { + container.append(containerRef.current); + } + }); + + return () => subscriptions.unsubscribe(); + }, [uiService, isDataSourceEnabled]); + + useEffect(() => { + const selectedConnectionSubscription = connectionsService + .getSelectedConnection$() + .pipe(distinctUntilChanged()) + .subscribe((connection) => { + if (connection) { + // Assuming setSelectedConnection$ is meant to update some state or perform an action outside this component + connectionsService.setSelectedConnection$(connection); + } + }); + + return () => selectedConnectionSubscription.unsubscribe(); + }, [connectionsService]); + + const handleSelectedConnection = (id: string | undefined) => { + if (!id) { + connectionsService.setSelectedConnection$(undefined); + return; + } + connectionsService.getConnectionById(id).subscribe((connection) => { + connectionsService.setSelectedConnection$(connection); + }); + }; + + return ( + { + containerRef.current = node; + }} + > +
+ + handleSelectedConnection(dataSource[0]?.id || undefined) + } + /> +
+
+ ); +}; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/hooks/index.tsx b/src/plugins/query_enhancements/public/data_source_connection/components/index.ts similarity index 61% rename from src/plugins/data/public/ui/dataset_navigator/lib/hooks/index.tsx rename to src/plugins/query_enhancements/public/data_source_connection/components/index.ts index 88974a7c942..1ee969a1d07 100644 --- a/src/plugins/data/public/ui/dataset_navigator/lib/hooks/index.tsx +++ b/src/plugins/query_enhancements/public/data_source_connection/components/index.ts @@ -3,4 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -export * from './direct_query_hook'; +export { ConnectionsBar } from './connections_bar'; diff --git a/src/plugins/query_enhancements/public/data_source_connection/index.ts b/src/plugins/query_enhancements/public/data_source_connection/index.ts new file mode 100644 index 00000000000..e334163d91d --- /dev/null +++ b/src/plugins/query_enhancements/public/data_source_connection/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export { createDataSourceConnectionExtension } from './utils'; +export * from './services'; diff --git a/src/plugins/query_enhancements/public/services/connections_service.ts b/src/plugins/query_enhancements/public/data_source_connection/services/connections_service.ts similarity index 95% rename from src/plugins/query_enhancements/public/services/connections_service.ts rename to src/plugins/query_enhancements/public/data_source_connection/services/connections_service.ts index 97a59c2cd94..6afec4b51a9 100644 --- a/src/plugins/query_enhancements/public/services/connections_service.ts +++ b/src/plugins/query_enhancements/public/data_source_connection/services/connections_service.ts @@ -6,8 +6,8 @@ import { BehaviorSubject, Observable, from } from 'rxjs'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { CoreStart } from 'opensearch-dashboards/public'; -import { API } from '../../common'; -import { Connection, ConnectionsServiceDeps } from '../types'; +import { API } from '../../../common'; +import { Connection, ConnectionsServiceDeps } from '../../types'; export class ConnectionsService { protected http!: ConnectionsServiceDeps['http']; diff --git a/src/plugins/data/public/ui/dataset_navigator/lib/requests/index.tsx b/src/plugins/query_enhancements/public/data_source_connection/services/index.ts similarity index 58% rename from src/plugins/data/public/ui/dataset_navigator/lib/requests/index.tsx rename to src/plugins/query_enhancements/public/data_source_connection/services/index.ts index 3918a896bd0..08eeda5a7aa 100644 --- a/src/plugins/data/public/ui/dataset_navigator/lib/requests/index.tsx +++ b/src/plugins/query_enhancements/public/data_source_connection/services/index.ts @@ -3,4 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -export * from './sql'; +export { ConnectionsService } from './connections_service'; diff --git a/src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx b/src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx new file mode 100644 index 00000000000..e5822c4b378 --- /dev/null +++ b/src/plugins/query_enhancements/public/data_source_connection/utils/create_extension.tsx @@ -0,0 +1,34 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { ToastsSetup } from 'opensearch-dashboards/public'; +import { QueryEditorExtensionConfig } from '../../../../data/public'; +import { ConfigSchema } from '../../../common/config'; +import { ConnectionsBar } from '../components'; +import { ConnectionsService } from '../services'; + +export const createDataSourceConnectionExtension = ( + connectionsService: ConnectionsService, + toasts: ToastsSetup, + config: ConfigSchema +): QueryEditorExtensionConfig => { + return { + id: 'data-source-connection', + order: 2000, + isEnabled$: (dependencies) => { + return connectionsService.getIsDataSourceEnabled$(); + }, + getComponent: (dependencies) => { + return ( + + ); + }, + }; +}; diff --git a/src/plugins/data/common/data_sets/index.ts b/src/plugins/query_enhancements/public/data_source_connection/utils/index.ts similarity index 70% rename from src/plugins/data/common/data_sets/index.ts rename to src/plugins/query_enhancements/public/data_source_connection/utils/index.ts index 9f269633f30..9eccc9e6f35 100644 --- a/src/plugins/data/common/data_sets/index.ts +++ b/src/plugins/query_enhancements/public/data_source_connection/utils/index.ts @@ -3,4 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -export * from './types'; +export * from './create_extension'; diff --git a/src/plugins/query_enhancements/public/plugin.tsx b/src/plugins/query_enhancements/public/plugin.tsx index b74c00ced7e..d65676b70e7 100644 --- a/src/plugins/query_enhancements/public/plugin.tsx +++ b/src/plugins/query_enhancements/public/plugin.tsx @@ -7,9 +7,10 @@ import moment from 'moment'; import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '../../../core/public'; import { IStorageWrapper, Storage } from '../../opensearch_dashboards_utils/public'; import { ConfigSchema } from '../common/config'; -import { ConnectionsService, setData, setStorage } from './services'; +import { ConnectionsService, createDataSourceConnectionExtension } from './data_source_connection'; import { createQueryAssistExtension } from './query_assist'; -import { PPLSearchInterceptor, SQLSearchInterceptor } from './search'; +import { PPLSearchInterceptor, SQLAsyncSearchInterceptor, SQLSearchInterceptor } from './search'; +import { setData, setStorage } from './services'; import { QueryEnhancementsPluginSetup, QueryEnhancementsPluginSetupDependencies, @@ -43,21 +44,38 @@ export class QueryEnhancementsPlugin http: core.http, }); - const pplSearchInterceptor = new PPLSearchInterceptor({ - toasts: core.notifications.toasts, - http: core.http, - uiSettings: core.uiSettings, - startServices: core.getStartServices(), - usageCollector: data.search.usageCollector, - }); + const pplSearchInterceptor = new PPLSearchInterceptor( + { + toasts: core.notifications.toasts, + http: core.http, + uiSettings: core.uiSettings, + startServices: core.getStartServices(), + usageCollector: data.search.usageCollector, + }, + this.connectionsService + ); - const sqlSearchInterceptor = new SQLSearchInterceptor({ - toasts: core.notifications.toasts, - http: core.http, - uiSettings: core.uiSettings, - startServices: core.getStartServices(), - usageCollector: data.search.usageCollector, - }); + const sqlSearchInterceptor = new SQLSearchInterceptor( + { + toasts: core.notifications.toasts, + http: core.http, + uiSettings: core.uiSettings, + startServices: core.getStartServices(), + usageCollector: data.search.usageCollector, + }, + this.connectionsService + ); + + const sqlAsyncSearchInterceptor = new SQLAsyncSearchInterceptor( + { + toasts: core.notifications.toasts, + http: core.http, + uiSettings: core.uiSettings, + startServices: core.getStartServices(), + usageCollector: data.search.usageCollector, + }, + this.connectionsService + ); data.__enhance({ ui: { @@ -71,7 +89,7 @@ export class QueryEnhancementsPlugin initialTo: moment().add(2, 'days').toISOString(), }, showFilterBar: false, - showDataSetsSelector: true, + showDataSetsSelector: false, showDataSourcesSelector: true, }, fields: { @@ -92,7 +110,7 @@ export class QueryEnhancementsPlugin searchBar: { showDatePicker: false, showFilterBar: false, - showDataSetsSelector: true, + showDataSetsSelector: false, showDataSourcesSelector: true, queryStringInput: { initialValue: 'SELECT * FROM ' }, }, @@ -107,6 +125,29 @@ export class QueryEnhancementsPlugin }, }); + data.__enhance({ + ui: { + query: { + language: 'SQLAsync', + search: sqlAsyncSearchInterceptor, + searchBar: { + showDatePicker: false, + showFilterBar: false, + showDataSetsSelector: false, + showDataSourcesSelector: true, + queryStringInput: { initialValue: 'SHOW DATABASES IN ::mys3::' }, + }, + fields: { + filterable: false, + visualizable: false, + }, + showDocLinks: false, + supportedAppNames: ['discover'], + connectionService: this.connectionsService, + }, + }, + }); + data.__enhance({ ui: { queryEditorExtension: createQueryAssistExtension( @@ -117,6 +158,16 @@ export class QueryEnhancementsPlugin }, }); + data.__enhance({ + ui: { + queryEditorExtension: createDataSourceConnectionExtension( + this.connectionsService, + core.notifications.toasts, + this.config + ), + }, + }); + return {}; } diff --git a/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx b/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx index c28c5cb8b0b..e87e74ce299 100644 --- a/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx +++ b/src/plugins/query_enhancements/public/query_assist/components/query_assist_bar.tsx @@ -12,7 +12,7 @@ import { } from '../../../../data/public'; import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public'; import { QueryAssistParameters } from '../../../common/query_assist'; -import { ConnectionsService } from '../../services'; +import { ConnectionsService } from '../../data_source_connection'; import { getStorage } from '../../services'; import { useGenerateQuery } from '../hooks'; import { getPersistedLog, ProhibitedQueryError } from '../utils'; @@ -45,7 +45,7 @@ export const QueryAssistBar: React.FC = (props) => { const subscription = props.connectionsService .getSelectedConnection$() .subscribe((connection) => { - dataSourceIdRef.current = connection?.dataSource?.id; + dataSourceIdRef.current = connection?.dataSource.id; }); return () => subscription.unsubscribe(); }, [props.connectionsService]); diff --git a/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx b/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx index 23611e39501..e088457a071 100644 --- a/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx +++ b/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx @@ -13,7 +13,7 @@ import { } from '../../../../data/public'; import { API } from '../../../common'; import { ConfigSchema } from '../../../common/config'; -import { ConnectionsService } from '../../services'; +import { ConnectionsService } from '../../data_source_connection'; import { QueryAssistBar, QueryAssistBanner } from '../components'; /** @@ -28,7 +28,7 @@ const getAvailableLanguages$ = ( connectionsService.getSelectedConnection$().pipe( distinctUntilChanged(), switchMap(async (connection) => { - const dataSourceId = connection?.dataSource?.id; + const dataSourceId = connection?.dataSource.id; const cached = availableLanguagesByDataSource.get(dataSourceId); if (cached !== undefined) return cached; const languages = await http diff --git a/src/plugins/query_enhancements/public/search/index.ts b/src/plugins/query_enhancements/public/search/index.ts index 624e7cf6e7b..9835c1345f0 100644 --- a/src/plugins/query_enhancements/public/search/index.ts +++ b/src/plugins/query_enhancements/public/search/index.ts @@ -5,3 +5,4 @@ export { PPLSearchInterceptor } from './ppl_search_interceptor'; export { SQLSearchInterceptor } from './sql_search_interceptor'; +export { SQLAsyncSearchInterceptor } from './sql_async_search_interceptor'; diff --git a/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts b/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts index 13d6bc25874..bca9961fea3 100644 --- a/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts +++ b/src/plugins/query_enhancements/public/search/ppl_search_interceptor.ts @@ -5,6 +5,7 @@ import { trimEnd } from 'lodash'; import { Observable, throwError } from 'rxjs'; +import { i18n } from '@osd/i18n'; import { concatMap } from 'rxjs/operators'; import { DataFrameAggConfig, @@ -33,12 +34,16 @@ import { fetchDataFrame, } from '../../common'; import { QueryEnhancementsPluginStartDependencies } from '../types'; +import { ConnectionsService } from '../data_source_connection'; export class PPLSearchInterceptor extends SearchInterceptor { protected queryService!: DataPublicPluginStart['query']; protected aggsService!: DataPublicPluginStart['search']['aggs']; - constructor(deps: SearchInterceptorDeps) { + constructor( + deps: SearchInterceptorDeps, + private readonly connectionsService: ConnectionsService + ) { super(deps); deps.startServices.then(([coreStart, depsStart]) => { @@ -142,23 +147,34 @@ export class PPLSearchInterceptor extends SearchInterceptor { }; const dataFrame = getRawDataFrame(searchRequest); + if (!dataFrame) { + return throwError( + this.handleSearchError( + { + stack: 'DataFrame is not defined', + }, + request, + signal! + ) + ); + } let queryString = dataFrame.meta?.queryConfig?.qs ?? getRawQueryString(searchRequest) ?? ''; dataFrame.meta = { ...dataFrame.meta, - aggConfig: { - ...dataFrame.meta.aggConfig, - ...(this.aggsService.types.get.bind(this) && - getAggConfig(searchRequest, {}, this.aggsService.types.get.bind(this))), - }, queryConfig: { ...dataFrame.meta.queryConfig, - ...(this.queryService.dataSet.getDataSet() && { - dataSourceId: this.queryService.dataSet.getDataSet()?.dataSourceRef?.id, + ...(this.connectionsService.getSelectedConnection() && { + dataSourceId: this.connectionsService.getSelectedConnection()?.id, }), }, }; + const aggConfig = getAggConfig( + searchRequest, + {}, + this.aggsService.types.get.bind(this) + ) as DataFrameAggConfig; if (!dataFrame.schema) { return fetchDataFrame(dfContext, queryString, dataFrame).pipe( @@ -168,14 +184,14 @@ export class PPLSearchInterceptor extends SearchInterceptor { const jsError = new Error(df.error.response); return throwError(jsError); } - const timeField = getTimeField(df, dataFrame.meta?.aggConfig); + const timeField = getTimeField(df, aggConfig); if (timeField) { const timeFilter = getTimeFilter(timeField); const newQuery = insertTimeFilter(queryString, timeFilter); updateDataFrameMeta({ dataFrame: df, qs: newQuery, - aggConfig: dataFrame.meta?.aggConfig, + aggConfig, timeField, timeFilter, getAggQsFn: getAggQsFn.bind(this), @@ -188,14 +204,14 @@ export class PPLSearchInterceptor extends SearchInterceptor { } if (dataFrame.schema) { - const timeField = getTimeField(dataFrame, dataFrame.meta?.aggConfig); + const timeField = getTimeField(dataFrame, aggConfig); if (timeField) { const timeFilter = getTimeFilter(timeField); const newQuery = insertTimeFilter(queryString, timeFilter); updateDataFrameMeta({ dataFrame, qs: newQuery, - aggConfig: dataFrame.meta?.aggConfig, + aggConfig, timeField, timeFilter, getAggQsFn: getAggQsFn.bind(this), diff --git a/src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts b/src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts new file mode 100644 index 00000000000..9232ef146cd --- /dev/null +++ b/src/plugins/query_enhancements/public/search/sql_async_search_interceptor.ts @@ -0,0 +1,137 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { trimEnd } from 'lodash'; +import { BehaviorSubject, Observable, throwError } from 'rxjs'; +import { i18n } from '@osd/i18n'; +import { concatMap, map } from 'rxjs/operators'; +import { + DATA_FRAME_TYPES, + DataPublicPluginStart, + IOpenSearchDashboardsSearchRequest, + IOpenSearchDashboardsSearchResponse, + ISearchOptions, + SearchInterceptor, + SearchInterceptorDeps, +} from '../../../data/public'; +import { getRawDataFrame, getRawQueryString, IDataFrameResponse } from '../../../data/common'; +import { + API, + DataFramePolling, + FetchDataFrameContext, + SEARCH_STRATEGY, + fetchDataFrame, + fetchDataFramePolling, +} from '../../common'; +import { QueryEnhancementsPluginStartDependencies } from '../types'; +import { ConnectionsService } from '../data_source_connection'; + +export class SQLAsyncSearchInterceptor extends SearchInterceptor { + protected queryService!: DataPublicPluginStart['query']; + protected aggsService!: DataPublicPluginStart['search']['aggs']; + protected indexPatterns!: DataPublicPluginStart['indexPatterns']; + protected dataFrame$ = new BehaviorSubject(undefined); + + constructor( + deps: SearchInterceptorDeps, + private readonly connectionsService: ConnectionsService + ) { + super(deps); + + deps.startServices.then(([coreStart, depsStart]) => { + this.queryService = (depsStart as QueryEnhancementsPluginStartDependencies).data.query; + this.aggsService = (depsStart as QueryEnhancementsPluginStartDependencies).data.search.aggs; + }); + } + + protected runSearch( + request: IOpenSearchDashboardsSearchRequest, + signal?: AbortSignal, + strategy?: string + ): Observable { + const { id, ...searchRequest } = request; + const path = trimEnd(API.SQL_ASYNC_SEARCH); + const dfContext: FetchDataFrameContext = { + http: this.deps.http, + path, + signal, + }; + + const dataFrame = getRawDataFrame(searchRequest); + if (!dataFrame) { + return throwError(this.handleSearchError('DataFrame is not defined', request, signal!)); + } + + const queryString = + dataFrame.meta?.queryConfig?.formattedQs() ?? getRawQueryString(searchRequest) ?? ''; + + dataFrame.meta = { + ...dataFrame.meta, + queryConfig: { + ...dataFrame.meta.queryConfig, + ...(this.connectionsService.getSelectedConnection() && + this.connectionsService.getSelectedConnection()?.dataSource && { + dataSourceId: this.connectionsService.getSelectedConnection()?.dataSource.id, + }), + }, + }; + + const onPollingSuccess = (pollingResult: any) => { + if (pollingResult && pollingResult.body.meta.status === 'SUCCESS') { + return false; + } + if (pollingResult && pollingResult.body.meta.status === 'FAILED') { + const jsError = new Error(pollingResult.data.error.response); + this.deps.toasts.addError(jsError, { + title: i18n.translate('queryEnhancements.sqlQueryError', { + defaultMessage: 'Could not complete the SQL async query', + }), + toastMessage: pollingResult.data.error.response, + }); + return false; + } + + this.deps.toasts.addInfo({ + title: i18n.translate('queryEnhancements.sqlQueryPolling', { + defaultMessage: 'Polling query job results...', + }), + }); + + return true; + }; + + const onPollingError = (error: Error) => { + throw new Error(error.message); + }; + + this.deps.toasts.addInfo({ + title: i18n.translate('queryEnhancements.sqlQueryInfo', { + defaultMessage: 'Starting query job...', + }), + }); + return fetchDataFrame(dfContext, queryString, dataFrame).pipe( + concatMap((jobResponse) => { + const df = jobResponse.body; + const dataFramePolling = new DataFramePolling( + () => fetchDataFramePolling(dfContext, df), + 5000, + onPollingSuccess, + onPollingError + ); + return dataFramePolling.fetch().pipe( + map(() => { + const dfPolling = dataFramePolling.data; + dfPolling.type = DATA_FRAME_TYPES.DEFAULT; + return dfPolling; + }) + ); + }) + ); + } + + public search(request: IOpenSearchDashboardsSearchRequest, options: ISearchOptions) { + return this.runSearch(request, options.abortSignal, SEARCH_STRATEGY.SQL_ASYNC); + } +} diff --git a/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts b/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts index de7fb5938d2..5a3b8278c65 100644 --- a/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts +++ b/src/plugins/query_enhancements/public/search/sql_search_interceptor.ts @@ -6,13 +6,8 @@ import { trimEnd } from 'lodash'; import { Observable, throwError } from 'rxjs'; import { i18n } from '@osd/i18n'; -import { concatMap, map } from 'rxjs/operators'; -import { - DATA_FRAME_TYPES, - getRawDataFrame, - getRawQueryString, - SIMPLE_DATA_SET_TYPES, -} from '../../../data/common'; +import { concatMap } from 'rxjs/operators'; +import { getRawDataFrame, getRawQueryString } from '../../../data/common'; import { DataPublicPluginStart, IOpenSearchDashboardsSearchRequest, @@ -21,21 +16,18 @@ import { SearchInterceptor, SearchInterceptorDeps, } from '../../../data/public'; -import { - API, - DataFramePolling, - FetchDataFrameContext, - SEARCH_STRATEGY, - fetchDataFrame, - fetchDataFramePolling, -} from '../../common'; +import { API, FetchDataFrameContext, SEARCH_STRATEGY, fetchDataFrame } from '../../common'; import { QueryEnhancementsPluginStartDependencies } from '../types'; +import { ConnectionsService } from '../data_source_connection'; export class SQLSearchInterceptor extends SearchInterceptor { protected queryService!: DataPublicPluginStart['query']; protected aggsService!: DataPublicPluginStart['search']['aggs']; - constructor(deps: SearchInterceptorDeps) { + constructor( + deps: SearchInterceptorDeps, + private readonly connectionsService: ConnectionsService + ) { super(deps); deps.startServices.then(([coreStart, depsStart]) => { @@ -57,6 +49,9 @@ export class SQLSearchInterceptor extends SearchInterceptor { }; const dataFrame = getRawDataFrame(searchRequest); + if (!dataFrame) { + return throwError(this.handleSearchError('DataFrame is not defined', request, signal!)); + } const queryString = dataFrame.meta?.queryConfig?.qs ?? getRawQueryString(searchRequest) ?? ''; @@ -64,8 +59,8 @@ export class SQLSearchInterceptor extends SearchInterceptor { ...dataFrame.meta, queryConfig: { ...dataFrame.meta.queryConfig, - ...(this.queryService.dataSet.getDataSet() && { - dataSourceId: this.queryService.dataSet.getDataSet()?.dataSourceRef?.id, + ...(this.connectionsService.getSelectedConnection() && { + dataSourceId: this.connectionsService.getSelectedConnection()?.id, }), }, }; @@ -86,91 +81,7 @@ export class SQLSearchInterceptor extends SearchInterceptor { return fetchDataFrame(dfContext, queryString, dataFrame); } - protected runSearchAsync( - request: IOpenSearchDashboardsSearchRequest, - signal?: AbortSignal, - strategy?: string - ): Observable { - const { id, ...searchRequest } = request; - const path = trimEnd(API.SQL_ASYNC_SEARCH); - const dfContext: FetchDataFrameContext = { - http: this.deps.http, - path, - signal, - }; - - const dataFrame = getRawDataFrame(searchRequest); - if (!dataFrame) { - return throwError(this.handleSearchError('DataFrame is not defined', request, signal!)); - } - - const queryString = getRawQueryString(searchRequest) ?? ''; - - dataFrame.meta = { - ...dataFrame.meta, - queryConfig: { - ...dataFrame.meta.queryConfig, - }, - }; - - const onPollingSuccess = (pollingResult: any) => { - if (pollingResult && pollingResult.body.meta.status === 'SUCCESS') { - return false; - } - if (pollingResult && pollingResult.body.meta.status === 'FAILED') { - const jsError = new Error(pollingResult.data.error.response); - this.deps.toasts.addError(jsError, { - title: i18n.translate('queryEnhancements.sqlQueryError', { - defaultMessage: 'Could not complete the SQL async query', - }), - toastMessage: pollingResult.data.error.response, - }); - return false; - } - - this.deps.toasts.addInfo({ - title: i18n.translate('queryEnhancements.sqlQueryPolling', { - defaultMessage: 'Polling query job results...', - }), - }); - - return true; - }; - - const onPollingError = (error: Error) => { - throw new Error(error.message); - }; - - this.deps.toasts.addInfo({ - title: i18n.translate('queryEnhancements.sqlQueryInfo', { - defaultMessage: 'Starting query job...', - }), - }); - return fetchDataFrame(dfContext, queryString, dataFrame).pipe( - concatMap((jobResponse) => { - const df = jobResponse.body; - const dataFramePolling = new DataFramePolling( - () => fetchDataFramePolling(dfContext, df), - 5000, - onPollingSuccess, - onPollingError - ); - return dataFramePolling.fetch().pipe( - map(() => { - const dfPolling = dataFramePolling.data; - dfPolling.type = DATA_FRAME_TYPES.DEFAULT; - return dfPolling; - }) - ); - }) - ); - } - public search(request: IOpenSearchDashboardsSearchRequest, options: ISearchOptions) { - const dataSet = this.queryService.dataSet.getDataSet(); - if (dataSet?.type === SIMPLE_DATA_SET_TYPES.TEMPORARY_ASYNC) { - return this.runSearchAsync(request, options.abortSignal, SEARCH_STRATEGY.SQL_ASYNC); - } return this.runSearch(request, options.abortSignal, SEARCH_STRATEGY.SQL); } } diff --git a/src/plugins/query_enhancements/public/services.ts b/src/plugins/query_enhancements/public/services.ts new file mode 100644 index 00000000000..d11233be2dc --- /dev/null +++ b/src/plugins/query_enhancements/public/services.ts @@ -0,0 +1,11 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { createGetterSetter } from '../../opensearch_dashboards_utils/common'; +import { IStorageWrapper } from '../../opensearch_dashboards_utils/public'; +import { DataPublicPluginStart } from '../../data/public'; + +export const [getStorage, setStorage] = createGetterSetter('storage'); +export const [getData, setData] = createGetterSetter('data'); diff --git a/src/plugins/query_enhancements/public/services/index.ts b/src/plugins/query_enhancements/public/services/index.ts deleted file mode 100644 index bb0284408fa..00000000000 --- a/src/plugins/query_enhancements/public/services/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { createGetterSetter } from '../../../opensearch_dashboards_utils/common'; -import { IStorageWrapper } from '../../../opensearch_dashboards_utils/public'; -import { DataPublicPluginStart } from '../../../data/public'; - -export const [getStorage, setStorage] = createGetterSetter('storage'); -export const [getData, setData] = createGetterSetter('data'); - -export { ConnectionsService } from './connections_service'; diff --git a/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts b/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts index 162cc7e8f10..f4fe42779da 100644 --- a/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts +++ b/src/plugins/query_enhancements/server/routes/data_source_connection/routes.ts @@ -5,6 +5,7 @@ import { schema } from '@osd/config-schema'; import { IRouter } from 'opensearch-dashboards/server'; +import { DataSourceAttributes } from '../../../../data_source/common/data_sources'; import { API } from '../../../common'; export function registerDataSourceConnectionsRoutes(router: IRouter) { @@ -17,7 +18,7 @@ export function registerDataSourceConnectionsRoutes(router: IRouter) { }, async (context, request, response) => { const fields = ['id', 'title', 'auth.type']; - const resp = await context.core.savedObjects.client.find({ + const resp = await context.core.savedObjects.client.find({ type: 'data-source', fields, perPage: 10000, @@ -37,7 +38,7 @@ export function registerDataSourceConnectionsRoutes(router: IRouter) { }, }, async (context, request, response) => { - const resp = await context.core.savedObjects.client.get( + const resp = await context.core.savedObjects.client.get( 'data-source', request.params.dataSourceId ); diff --git a/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts b/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts index 8cd5014335e..acd0027d0bc 100644 --- a/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts +++ b/src/plugins/query_enhancements/server/search/sql_async_search_strategy.ts @@ -55,7 +55,7 @@ export const sqlAsyncSearchStrategyProvider = ( const sessionId = rawResponse.data?.sessionId; const partial: PartialDataFrame = { - ...request.body.df, + name: '', fields: rawResponse?.data?.schema || [], }; const dataFrame = createDataFrame(partial); diff --git a/src/plugins/query_enhancements/server/search/sql_search_strategy.ts b/src/plugins/query_enhancements/server/search/sql_search_strategy.ts index 0a468356730..c5ebb40f882 100644 --- a/src/plugins/query_enhancements/server/search/sql_search_strategy.ts +++ b/src/plugins/query_enhancements/server/search/sql_search_strategy.ts @@ -39,7 +39,7 @@ export const sqlSearchStrategyProvider = ( } const partial: PartialDataFrame = { - ...request.body.df, + name: '', fields: rawResponse.data?.schema || [], }; const dataFrame = createDataFrame(partial); diff --git a/src/plugins/query_enhancements/server/types.ts b/src/plugins/query_enhancements/server/types.ts index b6a03b672de..1ad76c7bbf8 100644 --- a/src/plugins/query_enhancements/server/types.ts +++ b/src/plugins/query_enhancements/server/types.ts @@ -4,7 +4,7 @@ */ import { PluginSetup } from 'src/plugins/data/server'; -import { DataSourcePluginSetup } from 'src/plugins/data_source/server'; +import { DataSourcePluginSetup } from '../../data_source/server'; import { Logger } from '../../../core/server'; import { ConfigSchema } from '../common/config';