├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .postcssrc.js
├── README.md
├── build
├── build.js
├── check-versions.js
├── logo.png
├── utils.js
├── vue-loader.conf.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
└── webpack.prod.conf.js
├── config
├── dev.env.js
├── index.js
└── prod.env.js
├── index.html
├── package-lock.json
├── package.json
├── src
├── App.vue
├── assets
│ └── logo.png
├── components
│ ├── SelfsqlEditor.vue
│ └── SparksqlEditor.vue
├── main.js
├── plugins
│ └── axiosPlugin.js
├── router
│ └── index.js
├── selfsql
│ └── selfsql.js
└── sparkSql
│ ├── ParseErrorListener.js
│ ├── SqlBase.interp
│ ├── SqlBase.tokens
│ ├── SqlBaseLexer.interp
│ ├── SqlBaseLexer.js
│ ├── SqlBaseLexer.tokens
│ ├── SqlBaseParser.js
│ ├── UpperCaseCharStream.js
│ └── sparksql-lint.js
└── static
└── .gitkeep
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-vue-jsx", "transform-runtime"]
12 | }
13 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /config/
3 | /dist/
4 | /*.js
5 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | // https://eslint.org/docs/user-guide/configuring
2 |
3 | module.exports = {
4 | root: true,
5 | parserOptions: {
6 | parser: 'babel-eslint'
7 | },
8 | env: {
9 | browser: true,
10 | },
11 | extends: [
12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
14 | 'plugin:vue/essential',
15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md
16 | 'standard'
17 | ],
18 | // required to lint *.vue files
19 | plugins: [
20 | 'vue'
21 | ],
22 | // add your custom rules here
23 | rules: {
24 | // allow async-await
25 | 'generator-star-spacing': 'off',
26 | // allow debugger during development
27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | /dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Editor directories and files
9 | .idea
10 | .vscode
11 | *.suo
12 | *.ntvs*
13 | *.njsproj
14 | *.sln
15 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # spark-sql-online-editor
2 |
3 | 中文介绍可以看[这里](https://waltyou.github.io/Spark-Sql-Online-Editor/)。
4 |
5 | ## Base info
6 |
7 | ### feature
8 |
9 | 1. [x] syntax highlighting
10 | 2. [x] auto complete (Use 'Ctrl' key)
11 | 3. [x] show syntax error
12 | 4. [ ] check sql line one by one
13 | 5. [ ] sql context involve
14 |
15 | ### tech stack
16 |
17 | 1. codemirror
18 | 2. vue
19 | 3. js
20 |
21 | ## Usage
22 |
23 | ``` bash
24 | # install dependencies
25 | npm install
26 |
27 | # serve with hot reload at localhost:8080
28 | npm run dev
29 | ```
30 |
31 | ## Introduce
32 |
33 | ### 1. Demo from official webset
34 |
35 | All feature's implement are base on [Codemirror](https://codemirror.net/).
36 | There already have "spark-sql" mode in [Codemirror sql mode](https://github.com/codemirror/CodeMirror/blob/master/mode/sql/sql.js).
37 |
38 | You can run this project and access 'http://localhost:8080' to find the Spark-Sql editor.
39 |
40 | ### 2. self defined word highlighting and autoComplete
41 |
42 | Try to access 'http://localhost:8080/#/selfsql' to see what happened. The implement you can find in `SelfsqlEditor.vue` and `selfsql.js`.
43 |
44 | ### 3. show syntax error
45 |
46 | Spark SQL uses module [Spark-Catalyst](https://github.com/apache/spark/tree/master/sql/catalyst) to do SQL parse.
47 | And Spark-Catalyst use ANTLR4 to generate Gammer Parser in Java.
48 |
49 | So if we want to use ANTLR4 for syntax check in webpage, we need generate code in JS. Refer to [here](https://github.com/antlr/antlr4/blob/master/doc/javascript-target.md).
50 | There also have a npm implement in github which named [antlr4-tool](https://github.com/mcchatman8009/antlr4-tool).
51 |
52 | The steps are as blow:
53 |
54 | 1. Get the [G4 file](https://github.com/apache/spark/blob/master/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4) from Spark-Catalyst.
55 | 2. Generate antlr4 related js by using antlr4-tool
56 | 3. According to [parsePlan#ParseDriver.scala](https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala), create JS function.
57 | 4. Register lint to codemirror
58 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | require('./check-versions')()
3 |
4 | process.env.NODE_ENV = 'production'
5 |
6 | const ora = require('ora')
7 | const rm = require('rimraf')
8 | const path = require('path')
9 | const chalk = require('chalk')
10 | const webpack = require('webpack')
11 | const config = require('../config')
12 | const webpackConfig = require('./webpack.prod.conf')
13 |
14 | const spinner = ora('building for production...')
15 | spinner.start()
16 |
17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
18 | if (err) throw err
19 | webpack(webpackConfig, (err, stats) => {
20 | spinner.stop()
21 | if (err) throw err
22 | process.stdout.write(stats.toString({
23 | colors: true,
24 | modules: false,
25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
26 | chunks: false,
27 | chunkModules: false
28 | }) + '\n\n')
29 |
30 | if (stats.hasErrors()) {
31 | console.log(chalk.red(' Build failed with errors.\n'))
32 | process.exit(1)
33 | }
34 |
35 | console.log(chalk.cyan(' Build complete.\n'))
36 | console.log(chalk.yellow(
37 | ' Tip: built files are meant to be served over an HTTP server.\n' +
38 | ' Opening index.html over file:// won\'t work.\n'
39 | ))
40 | })
41 | })
42 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const chalk = require('chalk')
3 | const semver = require('semver')
4 | const packageConfig = require('../package.json')
5 | const shell = require('shelljs')
6 |
7 | function exec (cmd) {
8 | return require('child_process').execSync(cmd).toString().trim()
9 | }
10 |
11 | const versionRequirements = [
12 | {
13 | name: 'node',
14 | currentVersion: semver.clean(process.version),
15 | versionRequirement: packageConfig.engines.node
16 | }
17 | ]
18 |
19 | if (shell.which('npm')) {
20 | versionRequirements.push({
21 | name: 'npm',
22 | currentVersion: exec('npm --version'),
23 | versionRequirement: packageConfig.engines.npm
24 | })
25 | }
26 |
27 | module.exports = function () {
28 | const warnings = []
29 |
30 | for (let i = 0; i < versionRequirements.length; i++) {
31 | const mod = versionRequirements[i]
32 |
33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
34 | warnings.push(mod.name + ': ' +
35 | chalk.red(mod.currentVersion) + ' should be ' +
36 | chalk.green(mod.versionRequirement)
37 | )
38 | }
39 | }
40 |
41 | if (warnings.length) {
42 | console.log('')
43 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
44 | console.log()
45 |
46 | for (let i = 0; i < warnings.length; i++) {
47 | const warning = warnings[i]
48 | console.log(' ' + warning)
49 | }
50 |
51 | console.log()
52 | process.exit(1)
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/build/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/waltyou/spark-sql-online-editor/c8b049b2745b4252cc6021fce28b82f5bd69d2c8/build/logo.png
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const config = require('../config')
4 | const ExtractTextPlugin = require('extract-text-webpack-plugin')
5 | const packageConfig = require('../package.json')
6 |
7 | exports.assetsPath = function (_path) {
8 | const assetsSubDirectory = process.env.NODE_ENV === 'production'
9 | ? config.build.assetsSubDirectory
10 | : config.dev.assetsSubDirectory
11 |
12 | return path.posix.join(assetsSubDirectory, _path)
13 | }
14 |
15 | exports.cssLoaders = function (options) {
16 | options = options || {}
17 |
18 | const cssLoader = {
19 | loader: 'css-loader',
20 | options: {
21 | sourceMap: options.sourceMap
22 | }
23 | }
24 |
25 | const postcssLoader = {
26 | loader: 'postcss-loader',
27 | options: {
28 | sourceMap: options.sourceMap
29 | }
30 | }
31 |
32 | // generate loader string to be used with extract text plugin
33 | function generateLoaders (loader, loaderOptions) {
34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
35 |
36 | if (loader) {
37 | loaders.push({
38 | loader: loader + '-loader',
39 | options: Object.assign({}, loaderOptions, {
40 | sourceMap: options.sourceMap
41 | })
42 | })
43 | }
44 |
45 | // Extract CSS when that option is specified
46 | // (which is the case during production build)
47 | if (options.extract) {
48 | return ExtractTextPlugin.extract({
49 | use: loaders,
50 | fallback: 'vue-style-loader'
51 | })
52 | } else {
53 | return ['vue-style-loader'].concat(loaders)
54 | }
55 | }
56 |
57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
58 | return {
59 | css: generateLoaders(),
60 | postcss: generateLoaders(),
61 | less: generateLoaders('less'),
62 | sass: generateLoaders('sass', { indentedSyntax: true }),
63 | scss: generateLoaders('sass'),
64 | stylus: generateLoaders('stylus'),
65 | styl: generateLoaders('stylus')
66 | }
67 | }
68 |
69 | // Generate loaders for standalone style files (outside of .vue)
70 | exports.styleLoaders = function (options) {
71 | const output = []
72 | const loaders = exports.cssLoaders(options)
73 |
74 | for (const extension in loaders) {
75 | const loader = loaders[extension]
76 | output.push({
77 | test: new RegExp('\\.' + extension + '$'),
78 | use: loader
79 | })
80 | }
81 |
82 | return output
83 | }
84 |
85 | exports.createNotifierCallback = () => {
86 | const notifier = require('node-notifier')
87 |
88 | return (severity, errors) => {
89 | if (severity !== 'error') return
90 |
91 | const error = errors[0]
92 | const filename = error.file && error.file.split('!').pop()
93 |
94 | notifier.notify({
95 | title: packageConfig.name,
96 | message: severity + ': ' + error.name,
97 | subtitle: filename || '',
98 | icon: path.join(__dirname, 'logo.png')
99 | })
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const utils = require('./utils')
3 | const config = require('../config')
4 | const isProduction = process.env.NODE_ENV === 'production'
5 | const sourceMapEnabled = isProduction
6 | ? config.build.productionSourceMap
7 | : config.dev.cssSourceMap
8 |
9 | module.exports = {
10 | loaders: utils.cssLoaders({
11 | sourceMap: sourceMapEnabled,
12 | extract: isProduction
13 | }),
14 | cssSourceMap: sourceMapEnabled,
15 | cacheBusting: config.dev.cacheBusting,
16 | transformToRequire: {
17 | video: ['src', 'poster'],
18 | source: 'src',
19 | img: 'src',
20 | image: 'xlink:href'
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const utils = require('./utils')
4 | const config = require('../config')
5 | const vueLoaderConfig = require('./vue-loader.conf')
6 |
7 | function resolve (dir) {
8 | return path.join(__dirname, '..', dir)
9 | }
10 |
11 | const createLintingRule = () => ({
12 | test: /\.(js|vue)$/,
13 | loader: 'eslint-loader',
14 | enforce: 'pre',
15 | include: [resolve('src'), resolve('test')],
16 | options: {
17 | formatter: require('eslint-friendly-formatter'),
18 | emitWarning: !config.dev.showEslintErrorsInOverlay
19 | }
20 | })
21 |
22 | module.exports = {
23 | context: path.resolve(__dirname, '../'),
24 | entry: {
25 | app: './src/main.js'
26 | },
27 | output: {
28 | path: config.build.assetsRoot,
29 | filename: '[name].js',
30 | publicPath: process.env.NODE_ENV === 'production'
31 | ? config.build.assetsPublicPath
32 | : config.dev.assetsPublicPath
33 | },
34 | resolve: {
35 | extensions: ['.js', '.vue', '.json'],
36 | alias: {
37 | 'vue$': 'vue/dist/vue.esm.js',
38 | '@': resolve('src'),
39 | }
40 | },
41 | module: {
42 | rules: [
43 | ...(config.dev.useEslint ? [createLintingRule()] : []),
44 | {
45 | test: /\.vue$/,
46 | loader: 'vue-loader',
47 | options: vueLoaderConfig
48 | },
49 | {
50 | test: /\.js$/,
51 | loader: 'babel-loader',
52 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
53 | },
54 | {
55 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
56 | loader: 'url-loader',
57 | options: {
58 | limit: 10000,
59 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
60 | }
61 | },
62 | {
63 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
64 | loader: 'url-loader',
65 | options: {
66 | limit: 10000,
67 | name: utils.assetsPath('media/[name].[hash:7].[ext]')
68 | }
69 | },
70 | {
71 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
72 | loader: 'url-loader',
73 | options: {
74 | limit: 10000,
75 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
76 | }
77 | }
78 | ]
79 | },
80 | node: {
81 | // prevent webpack from injecting useless setImmediate polyfill because Vue
82 | // source contains it (although only uses it if it's native).
83 | setImmediate: false,
84 | // prevent webpack from injecting mocks to Node native modules
85 | // that does not make sense for the client
86 | dgram: 'empty',
87 | fs: 'empty',
88 | net: 'empty',
89 | tls: 'empty',
90 | child_process: 'empty'
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const utils = require('./utils')
3 | const webpack = require('webpack')
4 | const config = require('../config')
5 | const merge = require('webpack-merge')
6 | const path = require('path')
7 | const baseWebpackConfig = require('./webpack.base.conf')
8 | const CopyWebpackPlugin = require('copy-webpack-plugin')
9 | const HtmlWebpackPlugin = require('html-webpack-plugin')
10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
11 | const portfinder = require('portfinder')
12 |
13 | const HOST = process.env.HOST
14 | const PORT = process.env.PORT && Number(process.env.PORT)
15 |
16 | const devWebpackConfig = merge(baseWebpackConfig, {
17 | module: {
18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
19 | },
20 | // cheap-module-eval-source-map is faster for development
21 | devtool: config.dev.devtool,
22 |
23 | // these devServer options should be customized in /config/index.js
24 | devServer: {
25 | clientLogLevel: 'warning',
26 | historyApiFallback: {
27 | rewrites: [
28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
29 | ],
30 | },
31 | hot: true,
32 | contentBase: false, // since we use CopyWebpackPlugin.
33 | compress: true,
34 | host: HOST || config.dev.host,
35 | port: PORT || config.dev.port,
36 | open: config.dev.autoOpenBrowser,
37 | overlay: config.dev.errorOverlay
38 | ? { warnings: false, errors: true }
39 | : false,
40 | publicPath: config.dev.assetsPublicPath,
41 | proxy: config.dev.proxyTable,
42 | quiet: true, // necessary for FriendlyErrorsPlugin
43 | watchOptions: {
44 | poll: config.dev.poll,
45 | }
46 | },
47 | plugins: [
48 | new webpack.DefinePlugin({
49 | 'process.env': require('../config/dev.env')
50 | }),
51 | new webpack.HotModuleReplacementPlugin(),
52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
53 | new webpack.NoEmitOnErrorsPlugin(),
54 | // https://github.com/ampedandwired/html-webpack-plugin
55 | new HtmlWebpackPlugin({
56 | filename: 'index.html',
57 | template: 'index.html',
58 | inject: true
59 | }),
60 | // copy custom static assets
61 | new CopyWebpackPlugin([
62 | {
63 | from: path.resolve(__dirname, '../static'),
64 | to: config.dev.assetsSubDirectory,
65 | ignore: ['.*']
66 | }
67 | ])
68 | ]
69 | })
70 |
71 | module.exports = new Promise((resolve, reject) => {
72 | portfinder.basePort = process.env.PORT || config.dev.port
73 | portfinder.getPort((err, port) => {
74 | if (err) {
75 | reject(err)
76 | } else {
77 | // publish the new Port, necessary for e2e tests
78 | process.env.PORT = port
79 | // add port to devServer config
80 | devWebpackConfig.devServer.port = port
81 |
82 | // Add FriendlyErrorsPlugin
83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
84 | compilationSuccessInfo: {
85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
86 | },
87 | onErrors: config.dev.notifyOnErrors
88 | ? utils.createNotifierCallback()
89 | : undefined
90 | }))
91 |
92 | resolve(devWebpackConfig)
93 | }
94 | })
95 | })
96 |
--------------------------------------------------------------------------------
/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const utils = require('./utils')
4 | const webpack = require('webpack')
5 | const config = require('../config')
6 | const merge = require('webpack-merge')
7 | const baseWebpackConfig = require('./webpack.base.conf')
8 | const CopyWebpackPlugin = require('copy-webpack-plugin')
9 | const HtmlWebpackPlugin = require('html-webpack-plugin')
10 | const ExtractTextPlugin = require('extract-text-webpack-plugin')
11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
13 |
14 | const env = require('../config/prod.env')
15 |
16 | const webpackConfig = merge(baseWebpackConfig, {
17 | module: {
18 | rules: utils.styleLoaders({
19 | sourceMap: config.build.productionSourceMap,
20 | extract: true,
21 | usePostCSS: true
22 | })
23 | },
24 | devtool: config.build.productionSourceMap ? config.build.devtool : false,
25 | output: {
26 | path: config.build.assetsRoot,
27 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
29 | },
30 | plugins: [
31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
32 | new webpack.DefinePlugin({
33 | 'process.env': env
34 | }),
35 | new UglifyJsPlugin({
36 | uglifyOptions: {
37 | compress: {
38 | warnings: false
39 | }
40 | },
41 | sourceMap: config.build.productionSourceMap,
42 | parallel: true
43 | }),
44 | // extract css into its own file
45 | new ExtractTextPlugin({
46 | filename: utils.assetsPath('css/[name].[contenthash].css'),
47 | // Setting the following option to `false` will not extract CSS from codesplit chunks.
48 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
49 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
50 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
51 | allChunks: true,
52 | }),
53 | // Compress extracted CSS. We are using this plugin so that possible
54 | // duplicated CSS from different components can be deduped.
55 | new OptimizeCSSPlugin({
56 | cssProcessorOptions: config.build.productionSourceMap
57 | ? { safe: true, map: { inline: false } }
58 | : { safe: true }
59 | }),
60 | // generate dist index.html with correct asset hash for caching.
61 | // you can customize output by editing /index.html
62 | // see https://github.com/ampedandwired/html-webpack-plugin
63 | new HtmlWebpackPlugin({
64 | filename: config.build.index,
65 | template: 'index.html',
66 | inject: true,
67 | minify: {
68 | removeComments: true,
69 | collapseWhitespace: true,
70 | removeAttributeQuotes: true
71 | // more options:
72 | // https://github.com/kangax/html-minifier#options-quick-reference
73 | },
74 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
75 | chunksSortMode: 'dependency'
76 | }),
77 | // keep module.id stable when vendor modules does not change
78 | new webpack.HashedModuleIdsPlugin(),
79 | // enable scope hoisting
80 | new webpack.optimize.ModuleConcatenationPlugin(),
81 | // split vendor js into its own file
82 | new webpack.optimize.CommonsChunkPlugin({
83 | name: 'vendor',
84 | minChunks (module) {
85 | // any required modules inside node_modules are extracted to vendor
86 | return (
87 | module.resource &&
88 | /\.js$/.test(module.resource) &&
89 | module.resource.indexOf(
90 | path.join(__dirname, '../node_modules')
91 | ) === 0
92 | )
93 | }
94 | }),
95 | // extract webpack runtime and module manifest to its own file in order to
96 | // prevent vendor hash from being updated whenever app bundle is updated
97 | new webpack.optimize.CommonsChunkPlugin({
98 | name: 'manifest',
99 | minChunks: Infinity
100 | }),
101 | // This instance extracts shared chunks from code splitted chunks and bundles them
102 | // in a separate chunk, similar to the vendor chunk
103 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
104 | new webpack.optimize.CommonsChunkPlugin({
105 | name: 'app',
106 | async: 'vendor-async',
107 | children: true,
108 | minChunks: 3
109 | }),
110 |
111 | // copy custom static assets
112 | new CopyWebpackPlugin([
113 | {
114 | from: path.resolve(__dirname, '../static'),
115 | to: config.build.assetsSubDirectory,
116 | ignore: ['.*']
117 | }
118 | ])
119 | ]
120 | })
121 |
122 | if (config.build.productionGzip) {
123 | const CompressionWebpackPlugin = require('compression-webpack-plugin')
124 |
125 | webpackConfig.plugins.push(
126 | new CompressionWebpackPlugin({
127 | asset: '[path].gz[query]',
128 | algorithm: 'gzip',
129 | test: new RegExp(
130 | '\\.(' +
131 | config.build.productionGzipExtensions.join('|') +
132 | ')$'
133 | ),
134 | threshold: 10240,
135 | minRatio: 0.8
136 | })
137 | )
138 | }
139 |
140 | if (config.build.bundleAnalyzerReport) {
141 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
142 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
143 | }
144 |
145 | module.exports = webpackConfig
146 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | // Template version: 1.3.1
3 | // see http://vuejs-templates.github.io/webpack for documentation.
4 |
5 | const path = require('path')
6 |
7 | module.exports = {
8 | dev: {
9 |
10 | // Paths
11 | assetsSubDirectory: 'static',
12 | assetsPublicPath: '/',
13 | proxyTable: {},
14 |
15 | // Various Dev Server settings
16 | host: 'localhost', // can be overwritten by process.env.HOST
17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
18 | autoOpenBrowser: false,
19 | errorOverlay: true,
20 | notifyOnErrors: true,
21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
22 |
23 | // Use Eslint Loader?
24 | // If true, your code will be linted during bundling and
25 | // linting errors and warnings will be shown in the console.
26 | useEslint: true,
27 | // If true, eslint errors and warnings will also be shown in the error overlay
28 | // in the browser.
29 | showEslintErrorsInOverlay: false,
30 |
31 | /**
32 | * Source Maps
33 | */
34 |
35 | // https://webpack.js.org/configuration/devtool/#development
36 | devtool: 'cheap-module-eval-source-map',
37 |
38 | // If you have problems debugging vue-files in devtools,
39 | // set this to false - it *may* help
40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting
41 | cacheBusting: true,
42 |
43 | cssSourceMap: true
44 | },
45 |
46 | build: {
47 | // Template for index.html
48 | index: path.resolve(__dirname, '../dist/index.html'),
49 |
50 | // Paths
51 | assetsRoot: path.resolve(__dirname, '../dist'),
52 | assetsSubDirectory: 'static',
53 | assetsPublicPath: '/',
54 |
55 | /**
56 | * Source Maps
57 | */
58 |
59 | productionSourceMap: true,
60 | // https://webpack.js.org/configuration/devtool/#production
61 | devtool: '#source-map',
62 |
63 | // Gzip off by default as many popular static hosts such as
64 | // Surge or Netlify already gzip all static assets for you.
65 | // Before setting to `true`, make sure to:
66 | // npm install --save-dev compression-webpack-plugin
67 | productionGzip: false,
68 | productionGzipExtensions: ['js', 'css'],
69 |
70 | // Run the build command with an extra argument to
71 | // View the bundle analyzer report after build finishes:
72 | // `npm run build --report`
73 | // Set to `true` or `false` to always turn it on or off
74 | bundleAnalyzerReport: process.env.npm_config_report
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | spark-sql-online-editor
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "spark-sql-online-editor",
3 | "version": "1.0.0",
4 | "description": "A Vue.js project",
5 | "author": "waltyou",
6 | "private": true,
7 | "scripts": {
8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
9 | "start": "npm run dev",
10 | "lint": "eslint --ext .js,.vue src",
11 | "build": "node build/build.js"
12 | },
13 | "dependencies": {
14 | "antlr4": "^4.7.2",
15 | "axios": "^0.19.0",
16 | "element-ui": "^2.12.0",
17 | "vue": "^2.5.2",
18 | "vue-codemirror": "^4.0.6",
19 | "vue-router": "^3.0.1"
20 | },
21 | "devDependencies": {
22 | "autoprefixer": "^7.1.2",
23 | "babel-core": "^6.22.1",
24 | "babel-eslint": "^8.2.1",
25 | "babel-helper-vue-jsx-merge-props": "^2.0.3",
26 | "babel-loader": "^7.1.1",
27 | "babel-plugin-syntax-jsx": "^6.18.0",
28 | "babel-plugin-transform-runtime": "^6.22.0",
29 | "babel-plugin-transform-vue-jsx": "^3.5.0",
30 | "babel-preset-env": "^1.3.2",
31 | "babel-preset-stage-2": "^6.22.0",
32 | "chalk": "^2.0.1",
33 | "copy-webpack-plugin": "^4.0.1",
34 | "css-loader": "^3.2.0",
35 | "eslint": "^4.15.0",
36 | "eslint-config-standard": "^10.2.1",
37 | "eslint-friendly-formatter": "^3.0.0",
38 | "eslint-loader": "^1.7.1",
39 | "eslint-plugin-import": "^2.7.0",
40 | "eslint-plugin-node": "^5.2.0",
41 | "eslint-plugin-promise": "^3.4.0",
42 | "eslint-plugin-standard": "^3.0.1",
43 | "eslint-plugin-vue": "^4.0.0",
44 | "extract-text-webpack-plugin": "^3.0.0",
45 | "file-loader": "^1.1.4",
46 | "friendly-errors-webpack-plugin": "^1.6.1",
47 | "html-webpack-plugin": "^2.30.1",
48 | "node-notifier": "^5.1.2",
49 | "optimize-css-assets-webpack-plugin": "^3.2.0",
50 | "ora": "^1.2.0",
51 | "portfinder": "^1.0.13",
52 | "postcss-import": "^11.0.0",
53 | "postcss-loader": "^2.0.8",
54 | "postcss-url": "^7.2.1",
55 | "rimraf": "^2.6.0",
56 | "semver": "^5.3.0",
57 | "shelljs": "^0.7.6",
58 | "uglifyjs-webpack-plugin": "^1.1.1",
59 | "url-loader": "^2.2.0",
60 | "vue-loader": "^13.3.0",
61 | "vue-style-loader": "^3.0.1",
62 | "vue-template-compiler": "^2.5.2",
63 | "webpack": "^3.6.0",
64 | "webpack-bundle-analyzer": "^3.6.0",
65 | "webpack-dev-server": "^2.9.1",
66 | "webpack-merge": "^4.1.0"
67 | },
68 | "engines": {
69 | "node": ">= 6.0.0",
70 | "npm": ">= 3.0.0"
71 | },
72 | "browserslist": [
73 | "> 1%",
74 | "last 2 versions",
75 | "not ie <= 8"
76 | ]
77 | }
78 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/waltyou/spark-sql-online-editor/c8b049b2745b4252cc6021fce28b82f5bd69d2c8/src/assets/logo.png
--------------------------------------------------------------------------------
/src/components/SelfsqlEditor.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Self Sql Online Editor
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
51 |
52 |
58 |
--------------------------------------------------------------------------------
/src/components/SparksqlEditor.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Spark Sql Online Editor
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
50 |
51 |
57 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue'
4 | import App from './App'
5 | import router from './router'
6 | import VueCodemirror from 'vue-codemirror'
7 | // require styles
8 | import 'codemirror/lib/codemirror.css'
9 | // require more codemirror resource...
10 |
11 | // you can set default global options and events when use
12 | Vue.use(VueCodemirror /* {
13 | options: { theme: 'base16-dark', ... },
14 | events: ['scroll', ...]
15 | } */)
16 |
17 | Vue.config.productionTip = false
18 |
19 | /* eslint-disable no-new */
20 | new Vue({
21 | el: '#app',
22 | router,
23 | components: { App },
24 | template: ''
25 | })
26 |
--------------------------------------------------------------------------------
/src/plugins/axiosPlugin.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 | import {
3 | Message
4 | } from 'element-ui'
5 |
6 | // axios config
7 | axios.defaults.baseURL = '/api'
8 |
9 | const Axios = axios.create({
10 | baseURL: '/', // remember to do reverse proxy
11 | timeout: 10000,
12 | responseType: 'json',
13 | // set withCredentials to true will make axios send request with cookie
14 | withCredentials: true
15 | })
16 |
17 | // request interceptor
18 | Axios.interceptors.request.use(
19 | config => {
20 | return config
21 | },
22 | error => {
23 | Message({
24 | showClose: true,
25 | message: error.data.err_msg ? error.data.err_msg : error.data,
26 | type: 'error'
27 | })
28 | return Promise.reject(error)
29 | }
30 | )
31 |
32 | export default Axios
33 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import SparksqlEditor from '@/components/SparksqlEditor'
4 | import SelfsqlEditor from '@/components/SelfsqlEditor'
5 |
6 | Vue.use(Router)
7 |
8 | export default new Router({
9 | routes: [
10 | {
11 | path: '/',
12 | name: 'SparksqlEditor',
13 | component: SparksqlEditor
14 | },
15 | {
16 | path: '/selfsql',
17 | name: 'SelfsqlEditor',
18 | component: SelfsqlEditor
19 | }
20 | ]
21 | })
22 |
--------------------------------------------------------------------------------
/src/selfsql/selfsql.js:
--------------------------------------------------------------------------------
1 | import CodeMirror from 'codemirror'
2 |
3 | // turn a space-separated list into an array
4 | function set (str) {
5 | var obj = {}
6 | var words = str.split(' ')
7 | for (var i = 0; i < words.length; ++i) obj[words[i]] = true
8 | return obj
9 | }
10 |
11 | var defaultBuiltin = 'tinyint smallint int bigint boolean float double string binary timestamp decimal array map struct uniontype delimited serde sequencefile textfile rcfile inputformat outputformat'
12 | var sparklSqlKeywords = 'add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases datata dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with'
13 | // ====================== self defined keywords ================================
14 | var selfsqlLoadType = 'pig parquet csv json avro'
15 | var selfsqlAllKeywords = defaultBuiltin + ' ' + sparklSqlKeywords + ' ' + selfsqlLoadType
16 |
17 | CodeMirror.defineMIME('text/x-selfsql', {
18 | name: 'sql',
19 | keywords: set(selfsqlAllKeywords)
20 | })
21 |
--------------------------------------------------------------------------------
/src/sparkSql/ParseErrorListener.js:
--------------------------------------------------------------------------------
1 | const antlr4 = require('antlr4')
2 |
3 | var ParseErrorListener = function () {
4 | antlr4.error.ErrorListener.call(this)
5 | this.annotations = []
6 | return this
7 | }
8 |
9 | ParseErrorListener.prototype = Object.create(antlr4.error.ErrorListener.prototype)
10 | ParseErrorListener.prototype.constructor = ParseErrorListener
11 |
12 | ParseErrorListener.prototype.syntaxError = function (recognizer, offendingSymbol, line, column, msg, e) {
13 | this.annotations.push({
14 | row: line - 1,
15 | col: column,
16 | text: msg
17 | })
18 | }
19 |
20 | ParseErrorListener.prototype.getErrors = function () {
21 | return this.annotations
22 | }
23 |
24 | export {
25 | ParseErrorListener
26 | }
27 |
--------------------------------------------------------------------------------
/src/sparkSql/SqlBase.tokens:
--------------------------------------------------------------------------------
1 | T__0=1
2 | T__1=2
3 | T__2=3
4 | T__3=4
5 | T__4=5
6 | T__5=6
7 | T__6=7
8 | T__7=8
9 | T__8=9
10 | T__9=10
11 | ADD=11
12 | AFTER=12
13 | ALL=13
14 | ALTER=14
15 | ANALYZE=15
16 | AND=16
17 | ANTI=17
18 | ANY=18
19 | ARCHIVE=19
20 | ARRAY=20
21 | AS=21
22 | ASC=22
23 | AT=23
24 | AUTHORIZATION=24
25 | BETWEEN=25
26 | BOTH=26
27 | BUCKET=27
28 | BUCKETS=28
29 | BY=29
30 | CACHE=30
31 | CASCADE=31
32 | CASE=32
33 | CAST=33
34 | CHANGE=34
35 | CHECK=35
36 | CLEAR=36
37 | CLUSTER=37
38 | CLUSTERED=38
39 | CODEGEN=39
40 | COLLATE=40
41 | COLLECTION=41
42 | COLUMN=42
43 | COLUMNS=43
44 | COMMENT=44
45 | COMMIT=45
46 | COMPACT=46
47 | COMPACTIONS=47
48 | COMPUTE=48
49 | CONCATENATE=49
50 | CONSTRAINT=50
51 | COST=51
52 | CREATE=52
53 | CROSS=53
54 | CUBE=54
55 | CURRENT=55
56 | CURRENT_DATE=56
57 | CURRENT_TIME=57
58 | CURRENT_TIMESTAMP=58
59 | CURRENT_USER=59
60 | DATA=60
61 | DATABASE=61
62 | DATABASES=62
63 | DAY=63
64 | DAYS=64
65 | DBPROPERTIES=65
66 | DEFINED=66
67 | DELETE=67
68 | DELIMITED=68
69 | DESC=69
70 | DESCRIBE=70
71 | DFS=71
72 | DIRECTORIES=72
73 | DIRECTORY=73
74 | DISTINCT=74
75 | DISTRIBUTE=75
76 | DROP=76
77 | ELSE=77
78 | END=78
79 | ESCAPED=79
80 | EXCEPT=80
81 | EXCHANGE=81
82 | EXISTS=82
83 | EXPLAIN=83
84 | EXPORT=84
85 | EXTENDED=85
86 | EXTERNAL=86
87 | EXTRACT=87
88 | FALSE=88
89 | FETCH=89
90 | FIELDS=90
91 | FILEFORMAT=91
92 | FIRST=92
93 | FIRST_VALUE=93
94 | FOLLOWING=94
95 | FOR=95
96 | FOREIGN=96
97 | FORMAT=97
98 | FORMATTED=98
99 | FROM=99
100 | FULL=100
101 | FUNCTION=101
102 | FUNCTIONS=102
103 | GLOBAL=103
104 | GRANT=104
105 | GROUP=105
106 | GROUPING=106
107 | HAVING=107
108 | HOUR=108
109 | HOURS=109
110 | IF=110
111 | IGNORE=111
112 | IMPORT=112
113 | IN=113
114 | INDEX=114
115 | INDEXES=115
116 | INNER=116
117 | INPATH=117
118 | INPUTFORMAT=118
119 | INSERT=119
120 | INTERSECT=120
121 | INTERVAL=121
122 | INTO=122
123 | IS=123
124 | ITEMS=124
125 | JOIN=125
126 | KEYS=126
127 | LAST=127
128 | LAST_VALUE=128
129 | LATERAL=129
130 | LAZY=130
131 | LEADING=131
132 | LEFT=132
133 | LIKE=133
134 | LIMIT=134
135 | LINES=135
136 | LIST=136
137 | LOAD=137
138 | LOCAL=138
139 | LOCATION=139
140 | LOCK=140
141 | LOCKS=141
142 | LOGICAL=142
143 | MACRO=143
144 | MAP=144
145 | MICROSECOND=145
146 | MICROSECONDS=146
147 | MILLISECOND=147
148 | MILLISECONDS=148
149 | MINUTE=149
150 | MINUTES=150
151 | MONTH=151
152 | MONTHS=152
153 | MSCK=153
154 | NAMESPACE=154
155 | NAMESPACES=155
156 | NATURAL=156
157 | NO=157
158 | NOT=158
159 | NULL=159
160 | NULLS=160
161 | OF=161
162 | ON=162
163 | ONLY=163
164 | OPTION=164
165 | OPTIONS=165
166 | OR=166
167 | ORDER=167
168 | OUT=168
169 | OUTER=169
170 | OUTPUTFORMAT=170
171 | OVER=171
172 | OVERLAPS=172
173 | OVERLAY=173
174 | OVERWRITE=174
175 | PARTITION=175
176 | PARTITIONED=176
177 | PARTITIONS=177
178 | PERCENTLIT=178
179 | PIVOT=179
180 | PLACING=180
181 | POSITION=181
182 | PRECEDING=182
183 | PRIMARY=183
184 | PRINCIPALS=184
185 | PURGE=185
186 | QUERY=186
187 | RANGE=187
188 | RECORDREADER=188
189 | RECORDWRITER=189
190 | RECOVER=190
191 | REDUCE=191
192 | REFERENCES=192
193 | REFRESH=193
194 | RENAME=194
195 | REPAIR=195
196 | REPLACE=196
197 | RESET=197
198 | RESPECT=198
199 | RESTRICT=199
200 | REVOKE=200
201 | RIGHT=201
202 | RLIKE=202
203 | ROLE=203
204 | ROLES=204
205 | ROLLBACK=205
206 | ROLLUP=206
207 | ROW=207
208 | ROWS=208
209 | SCHEMA=209
210 | SECOND=210
211 | SECONDS=211
212 | SELECT=212
213 | SEMI=213
214 | SEPARATED=214
215 | SERDE=215
216 | SERDEPROPERTIES=216
217 | SESSION_USER=217
218 | SET=218
219 | SETMINUS=219
220 | SETS=220
221 | SHOW=221
222 | SKEWED=222
223 | SOME=223
224 | SORT=224
225 | SORTED=225
226 | START=226
227 | STATISTICS=227
228 | STORED=228
229 | STRATIFY=229
230 | STRUCT=230
231 | SUBSTR=231
232 | SUBSTRING=232
233 | TABLE=233
234 | TABLES=234
235 | TABLESAMPLE=235
236 | TBLPROPERTIES=236
237 | TEMPORARY=237
238 | TERMINATED=238
239 | THEN=239
240 | TO=240
241 | TOUCH=241
242 | TRAILING=242
243 | TRANSACTION=243
244 | TRANSACTIONS=244
245 | TRANSFORM=245
246 | TRIM=246
247 | TRUE=247
248 | TRUNCATE=248
249 | TYPE=249
250 | UNARCHIVE=250
251 | UNBOUNDED=251
252 | UNCACHE=252
253 | UNION=253
254 | UNIQUE=254
255 | UNKNOWN=255
256 | UNLOCK=256
257 | UNSET=257
258 | UPDATE=258
259 | USE=259
260 | USER=260
261 | USING=261
262 | VALUES=262
263 | VIEW=263
264 | WEEK=264
265 | WEEKS=265
266 | WHEN=266
267 | WHERE=267
268 | WINDOW=268
269 | WITH=269
270 | YEAR=270
271 | YEARS=271
272 | EQ=272
273 | NSEQ=273
274 | NEQ=274
275 | NEQJ=275
276 | LT=276
277 | LTE=277
278 | GT=278
279 | GTE=279
280 | PLUS=280
281 | MINUS=281
282 | ASTERISK=282
283 | SLASH=283
284 | PERCENT=284
285 | DIV=285
286 | TILDE=286
287 | AMPERSAND=287
288 | PIPE=288
289 | CONCAT_PIPE=289
290 | HAT=290
291 | STRING=291
292 | BIGINT_LITERAL=292
293 | SMALLINT_LITERAL=293
294 | TINYINT_LITERAL=294
295 | INTEGER_VALUE=295
296 | DECIMAL_VALUE=296
297 | DOUBLE_LITERAL=297
298 | BIGDECIMAL_LITERAL=298
299 | IDENTIFIER=299
300 | BACKQUOTED_IDENTIFIER=300
301 | SIMPLE_COMMENT=301
302 | BRACKETED_EMPTY_COMMENT=302
303 | BRACKETED_COMMENT=303
304 | WS=304
305 | UNRECOGNIZED=305
306 | '('=1
307 | ')'=2
308 | ','=3
309 | '.'=4
310 | '/*+'=5
311 | '*/'=6
312 | '->'=7
313 | '['=8
314 | ']'=9
315 | ':'=10
316 | 'ADD'=11
317 | 'AFTER'=12
318 | 'ALL'=13
319 | 'ALTER'=14
320 | 'ANALYZE'=15
321 | 'AND'=16
322 | 'ANTI'=17
323 | 'ANY'=18
324 | 'ARCHIVE'=19
325 | 'ARRAY'=20
326 | 'AS'=21
327 | 'ASC'=22
328 | 'AT'=23
329 | 'AUTHORIZATION'=24
330 | 'BETWEEN'=25
331 | 'BOTH'=26
332 | 'BUCKET'=27
333 | 'BUCKETS'=28
334 | 'BY'=29
335 | 'CACHE'=30
336 | 'CASCADE'=31
337 | 'CASE'=32
338 | 'CAST'=33
339 | 'CHANGE'=34
340 | 'CHECK'=35
341 | 'CLEAR'=36
342 | 'CLUSTER'=37
343 | 'CLUSTERED'=38
344 | 'CODEGEN'=39
345 | 'COLLATE'=40
346 | 'COLLECTION'=41
347 | 'COLUMN'=42
348 | 'COLUMNS'=43
349 | 'COMMENT'=44
350 | 'COMMIT'=45
351 | 'COMPACT'=46
352 | 'COMPACTIONS'=47
353 | 'COMPUTE'=48
354 | 'CONCATENATE'=49
355 | 'CONSTRAINT'=50
356 | 'COST'=51
357 | 'CREATE'=52
358 | 'CROSS'=53
359 | 'CUBE'=54
360 | 'CURRENT'=55
361 | 'CURRENT_DATE'=56
362 | 'CURRENT_TIME'=57
363 | 'CURRENT_TIMESTAMP'=58
364 | 'CURRENT_USER'=59
365 | 'DATA'=60
366 | 'DATABASE'=61
367 | 'DAY'=63
368 | 'DAYS'=64
369 | 'DBPROPERTIES'=65
370 | 'DEFINED'=66
371 | 'DELETE'=67
372 | 'DELIMITED'=68
373 | 'DESC'=69
374 | 'DESCRIBE'=70
375 | 'DFS'=71
376 | 'DIRECTORIES'=72
377 | 'DIRECTORY'=73
378 | 'DISTINCT'=74
379 | 'DISTRIBUTE'=75
380 | 'DROP'=76
381 | 'ELSE'=77
382 | 'END'=78
383 | 'ESCAPED'=79
384 | 'EXCEPT'=80
385 | 'EXCHANGE'=81
386 | 'EXISTS'=82
387 | 'EXPLAIN'=83
388 | 'EXPORT'=84
389 | 'EXTENDED'=85
390 | 'EXTERNAL'=86
391 | 'EXTRACT'=87
392 | 'FALSE'=88
393 | 'FETCH'=89
394 | 'FIELDS'=90
395 | 'FILEFORMAT'=91
396 | 'FIRST'=92
397 | 'FIRST_VALUE'=93
398 | 'FOLLOWING'=94
399 | 'FOR'=95
400 | 'FOREIGN'=96
401 | 'FORMAT'=97
402 | 'FORMATTED'=98
403 | 'FROM'=99
404 | 'FULL'=100
405 | 'FUNCTION'=101
406 | 'FUNCTIONS'=102
407 | 'GLOBAL'=103
408 | 'GRANT'=104
409 | 'GROUP'=105
410 | 'GROUPING'=106
411 | 'HAVING'=107
412 | 'HOUR'=108
413 | 'HOURS'=109
414 | 'IF'=110
415 | 'IGNORE'=111
416 | 'IMPORT'=112
417 | 'IN'=113
418 | 'INDEX'=114
419 | 'INDEXES'=115
420 | 'INNER'=116
421 | 'INPATH'=117
422 | 'INPUTFORMAT'=118
423 | 'INSERT'=119
424 | 'INTERSECT'=120
425 | 'INTERVAL'=121
426 | 'INTO'=122
427 | 'IS'=123
428 | 'ITEMS'=124
429 | 'JOIN'=125
430 | 'KEYS'=126
431 | 'LAST'=127
432 | 'LAST_VALUE'=128
433 | 'LATERAL'=129
434 | 'LAZY'=130
435 | 'LEADING'=131
436 | 'LEFT'=132
437 | 'LIKE'=133
438 | 'LIMIT'=134
439 | 'LINES'=135
440 | 'LIST'=136
441 | 'LOAD'=137
442 | 'LOCAL'=138
443 | 'LOCATION'=139
444 | 'LOCK'=140
445 | 'LOCKS'=141
446 | 'LOGICAL'=142
447 | 'MACRO'=143
448 | 'MAP'=144
449 | 'MICROSECOND'=145
450 | 'MICROSECONDS'=146
451 | 'MILLISECOND'=147
452 | 'MILLISECONDS'=148
453 | 'MINUTE'=149
454 | 'MINUTES'=150
455 | 'MONTH'=151
456 | 'MONTHS'=152
457 | 'MSCK'=153
458 | 'NAMESPACE'=154
459 | 'NAMESPACES'=155
460 | 'NATURAL'=156
461 | 'NO'=157
462 | 'NULL'=159
463 | 'NULLS'=160
464 | 'OF'=161
465 | 'ON'=162
466 | 'ONLY'=163
467 | 'OPTION'=164
468 | 'OPTIONS'=165
469 | 'OR'=166
470 | 'ORDER'=167
471 | 'OUT'=168
472 | 'OUTER'=169
473 | 'OUTPUTFORMAT'=170
474 | 'OVER'=171
475 | 'OVERLAPS'=172
476 | 'OVERLAY'=173
477 | 'OVERWRITE'=174
478 | 'PARTITION'=175
479 | 'PARTITIONED'=176
480 | 'PARTITIONS'=177
481 | 'PERCENT'=178
482 | 'PIVOT'=179
483 | 'PLACING'=180
484 | 'POSITION'=181
485 | 'PRECEDING'=182
486 | 'PRIMARY'=183
487 | 'PRINCIPALS'=184
488 | 'PURGE'=185
489 | 'QUERY'=186
490 | 'RANGE'=187
491 | 'RECORDREADER'=188
492 | 'RECORDWRITER'=189
493 | 'RECOVER'=190
494 | 'REDUCE'=191
495 | 'REFERENCES'=192
496 | 'REFRESH'=193
497 | 'RENAME'=194
498 | 'REPAIR'=195
499 | 'REPLACE'=196
500 | 'RESET'=197
501 | 'RESPECT'=198
502 | 'RESTRICT'=199
503 | 'REVOKE'=200
504 | 'RIGHT'=201
505 | 'ROLE'=203
506 | 'ROLES'=204
507 | 'ROLLBACK'=205
508 | 'ROLLUP'=206
509 | 'ROW'=207
510 | 'ROWS'=208
511 | 'SCHEMA'=209
512 | 'SECOND'=210
513 | 'SECONDS'=211
514 | 'SELECT'=212
515 | 'SEMI'=213
516 | 'SEPARATED'=214
517 | 'SERDE'=215
518 | 'SERDEPROPERTIES'=216
519 | 'SESSION_USER'=217
520 | 'SET'=218
521 | 'MINUS'=219
522 | 'SETS'=220
523 | 'SHOW'=221
524 | 'SKEWED'=222
525 | 'SOME'=223
526 | 'SORT'=224
527 | 'SORTED'=225
528 | 'START'=226
529 | 'STATISTICS'=227
530 | 'STORED'=228
531 | 'STRATIFY'=229
532 | 'STRUCT'=230
533 | 'SUBSTR'=231
534 | 'SUBSTRING'=232
535 | 'TABLE'=233
536 | 'TABLES'=234
537 | 'TABLESAMPLE'=235
538 | 'TBLPROPERTIES'=236
539 | 'TERMINATED'=238
540 | 'THEN'=239
541 | 'TO'=240
542 | 'TOUCH'=241
543 | 'TRAILING'=242
544 | 'TRANSACTION'=243
545 | 'TRANSACTIONS'=244
546 | 'TRANSFORM'=245
547 | 'TRIM'=246
548 | 'TRUE'=247
549 | 'TRUNCATE'=248
550 | 'TYPE'=249
551 | 'UNARCHIVE'=250
552 | 'UNBOUNDED'=251
553 | 'UNCACHE'=252
554 | 'UNION'=253
555 | 'UNIQUE'=254
556 | 'UNKNOWN'=255
557 | 'UNLOCK'=256
558 | 'UNSET'=257
559 | 'UPDATE'=258
560 | 'USE'=259
561 | 'USER'=260
562 | 'USING'=261
563 | 'VALUES'=262
564 | 'VIEW'=263
565 | 'WEEK'=264
566 | 'WEEKS'=265
567 | 'WHEN'=266
568 | 'WHERE'=267
569 | 'WINDOW'=268
570 | 'WITH'=269
571 | 'YEAR'=270
572 | 'YEARS'=271
573 | '<=>'=273
574 | '<>'=274
575 | '!='=275
576 | '<'=276
577 | '>'=278
578 | '+'=280
579 | '-'=281
580 | '*'=282
581 | '/'=283
582 | '%'=284
583 | 'DIV'=285
584 | '~'=286
585 | '&'=287
586 | '|'=288
587 | '||'=289
588 | '^'=290
589 | '/**/'=302
590 |
--------------------------------------------------------------------------------
/src/sparkSql/SqlBaseLexer.interp:
--------------------------------------------------------------------------------
1 | token literal names:
2 | null
3 | '('
4 | ')'
5 | ','
6 | '.'
7 | '/*+'
8 | '*/'
9 | '->'
10 | '['
11 | ']'
12 | ':'
13 | 'ADD'
14 | 'AFTER'
15 | 'ALL'
16 | 'ALTER'
17 | 'ANALYZE'
18 | 'AND'
19 | 'ANTI'
20 | 'ANY'
21 | 'ARCHIVE'
22 | 'ARRAY'
23 | 'AS'
24 | 'ASC'
25 | 'AT'
26 | 'AUTHORIZATION'
27 | 'BETWEEN'
28 | 'BOTH'
29 | 'BUCKET'
30 | 'BUCKETS'
31 | 'BY'
32 | 'CACHE'
33 | 'CASCADE'
34 | 'CASE'
35 | 'CAST'
36 | 'CHANGE'
37 | 'CHECK'
38 | 'CLEAR'
39 | 'CLUSTER'
40 | 'CLUSTERED'
41 | 'CODEGEN'
42 | 'COLLATE'
43 | 'COLLECTION'
44 | 'COLUMN'
45 | 'COLUMNS'
46 | 'COMMENT'
47 | 'COMMIT'
48 | 'COMPACT'
49 | 'COMPACTIONS'
50 | 'COMPUTE'
51 | 'CONCATENATE'
52 | 'CONSTRAINT'
53 | 'COST'
54 | 'CREATE'
55 | 'CROSS'
56 | 'CUBE'
57 | 'CURRENT'
58 | 'CURRENT_DATE'
59 | 'CURRENT_TIME'
60 | 'CURRENT_TIMESTAMP'
61 | 'CURRENT_USER'
62 | 'DATA'
63 | 'DATABASE'
64 | null
65 | 'DAY'
66 | 'DAYS'
67 | 'DBPROPERTIES'
68 | 'DEFINED'
69 | 'DELETE'
70 | 'DELIMITED'
71 | 'DESC'
72 | 'DESCRIBE'
73 | 'DFS'
74 | 'DIRECTORIES'
75 | 'DIRECTORY'
76 | 'DISTINCT'
77 | 'DISTRIBUTE'
78 | 'DROP'
79 | 'ELSE'
80 | 'END'
81 | 'ESCAPED'
82 | 'EXCEPT'
83 | 'EXCHANGE'
84 | 'EXISTS'
85 | 'EXPLAIN'
86 | 'EXPORT'
87 | 'EXTENDED'
88 | 'EXTERNAL'
89 | 'EXTRACT'
90 | 'FALSE'
91 | 'FETCH'
92 | 'FIELDS'
93 | 'FILEFORMAT'
94 | 'FIRST'
95 | 'FIRST_VALUE'
96 | 'FOLLOWING'
97 | 'FOR'
98 | 'FOREIGN'
99 | 'FORMAT'
100 | 'FORMATTED'
101 | 'FROM'
102 | 'FULL'
103 | 'FUNCTION'
104 | 'FUNCTIONS'
105 | 'GLOBAL'
106 | 'GRANT'
107 | 'GROUP'
108 | 'GROUPING'
109 | 'HAVING'
110 | 'HOUR'
111 | 'HOURS'
112 | 'IF'
113 | 'IGNORE'
114 | 'IMPORT'
115 | 'IN'
116 | 'INDEX'
117 | 'INDEXES'
118 | 'INNER'
119 | 'INPATH'
120 | 'INPUTFORMAT'
121 | 'INSERT'
122 | 'INTERSECT'
123 | 'INTERVAL'
124 | 'INTO'
125 | 'IS'
126 | 'ITEMS'
127 | 'JOIN'
128 | 'KEYS'
129 | 'LAST'
130 | 'LAST_VALUE'
131 | 'LATERAL'
132 | 'LAZY'
133 | 'LEADING'
134 | 'LEFT'
135 | 'LIKE'
136 | 'LIMIT'
137 | 'LINES'
138 | 'LIST'
139 | 'LOAD'
140 | 'LOCAL'
141 | 'LOCATION'
142 | 'LOCK'
143 | 'LOCKS'
144 | 'LOGICAL'
145 | 'MACRO'
146 | 'MAP'
147 | 'MICROSECOND'
148 | 'MICROSECONDS'
149 | 'MILLISECOND'
150 | 'MILLISECONDS'
151 | 'MINUTE'
152 | 'MINUTES'
153 | 'MONTH'
154 | 'MONTHS'
155 | 'MSCK'
156 | 'NAMESPACE'
157 | 'NAMESPACES'
158 | 'NATURAL'
159 | 'NO'
160 | null
161 | 'NULL'
162 | 'NULLS'
163 | 'OF'
164 | 'ON'
165 | 'ONLY'
166 | 'OPTION'
167 | 'OPTIONS'
168 | 'OR'
169 | 'ORDER'
170 | 'OUT'
171 | 'OUTER'
172 | 'OUTPUTFORMAT'
173 | 'OVER'
174 | 'OVERLAPS'
175 | 'OVERLAY'
176 | 'OVERWRITE'
177 | 'PARTITION'
178 | 'PARTITIONED'
179 | 'PARTITIONS'
180 | 'PERCENT'
181 | 'PIVOT'
182 | 'PLACING'
183 | 'POSITION'
184 | 'PRECEDING'
185 | 'PRIMARY'
186 | 'PRINCIPALS'
187 | 'PURGE'
188 | 'QUERY'
189 | 'RANGE'
190 | 'RECORDREADER'
191 | 'RECORDWRITER'
192 | 'RECOVER'
193 | 'REDUCE'
194 | 'REFERENCES'
195 | 'REFRESH'
196 | 'RENAME'
197 | 'REPAIR'
198 | 'REPLACE'
199 | 'RESET'
200 | 'RESPECT'
201 | 'RESTRICT'
202 | 'REVOKE'
203 | 'RIGHT'
204 | null
205 | 'ROLE'
206 | 'ROLES'
207 | 'ROLLBACK'
208 | 'ROLLUP'
209 | 'ROW'
210 | 'ROWS'
211 | 'SCHEMA'
212 | 'SECOND'
213 | 'SECONDS'
214 | 'SELECT'
215 | 'SEMI'
216 | 'SEPARATED'
217 | 'SERDE'
218 | 'SERDEPROPERTIES'
219 | 'SESSION_USER'
220 | 'SET'
221 | 'MINUS'
222 | 'SETS'
223 | 'SHOW'
224 | 'SKEWED'
225 | 'SOME'
226 | 'SORT'
227 | 'SORTED'
228 | 'START'
229 | 'STATISTICS'
230 | 'STORED'
231 | 'STRATIFY'
232 | 'STRUCT'
233 | 'SUBSTR'
234 | 'SUBSTRING'
235 | 'TABLE'
236 | 'TABLES'
237 | 'TABLESAMPLE'
238 | 'TBLPROPERTIES'
239 | null
240 | 'TERMINATED'
241 | 'THEN'
242 | 'TO'
243 | 'TOUCH'
244 | 'TRAILING'
245 | 'TRANSACTION'
246 | 'TRANSACTIONS'
247 | 'TRANSFORM'
248 | 'TRIM'
249 | 'TRUE'
250 | 'TRUNCATE'
251 | 'TYPE'
252 | 'UNARCHIVE'
253 | 'UNBOUNDED'
254 | 'UNCACHE'
255 | 'UNION'
256 | 'UNIQUE'
257 | 'UNKNOWN'
258 | 'UNLOCK'
259 | 'UNSET'
260 | 'UPDATE'
261 | 'USE'
262 | 'USER'
263 | 'USING'
264 | 'VALUES'
265 | 'VIEW'
266 | 'WEEK'
267 | 'WEEKS'
268 | 'WHEN'
269 | 'WHERE'
270 | 'WINDOW'
271 | 'WITH'
272 | 'YEAR'
273 | 'YEARS'
274 | null
275 | '<=>'
276 | '<>'
277 | '!='
278 | '<'
279 | null
280 | '>'
281 | null
282 | '+'
283 | '-'
284 | '*'
285 | '/'
286 | '%'
287 | 'DIV'
288 | '~'
289 | '&'
290 | '|'
291 | '||'
292 | '^'
293 | null
294 | null
295 | null
296 | null
297 | null
298 | null
299 | null
300 | null
301 | null
302 | null
303 | null
304 | '/**/'
305 | null
306 | null
307 | null
308 |
309 | token symbolic names:
310 | null
311 | null
312 | null
313 | null
314 | null
315 | null
316 | null
317 | null
318 | null
319 | null
320 | null
321 | ADD
322 | AFTER
323 | ALL
324 | ALTER
325 | ANALYZE
326 | AND
327 | ANTI
328 | ANY
329 | ARCHIVE
330 | ARRAY
331 | AS
332 | ASC
333 | AT
334 | AUTHORIZATION
335 | BETWEEN
336 | BOTH
337 | BUCKET
338 | BUCKETS
339 | BY
340 | CACHE
341 | CASCADE
342 | CASE
343 | CAST
344 | CHANGE
345 | CHECK
346 | CLEAR
347 | CLUSTER
348 | CLUSTERED
349 | CODEGEN
350 | COLLATE
351 | COLLECTION
352 | COLUMN
353 | COLUMNS
354 | COMMENT
355 | COMMIT
356 | COMPACT
357 | COMPACTIONS
358 | COMPUTE
359 | CONCATENATE
360 | CONSTRAINT
361 | COST
362 | CREATE
363 | CROSS
364 | CUBE
365 | CURRENT
366 | CURRENT_DATE
367 | CURRENT_TIME
368 | CURRENT_TIMESTAMP
369 | CURRENT_USER
370 | DATA
371 | DATABASE
372 | DATABASES
373 | DAY
374 | DAYS
375 | DBPROPERTIES
376 | DEFINED
377 | DELETE
378 | DELIMITED
379 | DESC
380 | DESCRIBE
381 | DFS
382 | DIRECTORIES
383 | DIRECTORY
384 | DISTINCT
385 | DISTRIBUTE
386 | DROP
387 | ELSE
388 | END
389 | ESCAPED
390 | EXCEPT
391 | EXCHANGE
392 | EXISTS
393 | EXPLAIN
394 | EXPORT
395 | EXTENDED
396 | EXTERNAL
397 | EXTRACT
398 | FALSE
399 | FETCH
400 | FIELDS
401 | FILEFORMAT
402 | FIRST
403 | FIRST_VALUE
404 | FOLLOWING
405 | FOR
406 | FOREIGN
407 | FORMAT
408 | FORMATTED
409 | FROM
410 | FULL
411 | FUNCTION
412 | FUNCTIONS
413 | GLOBAL
414 | GRANT
415 | GROUP
416 | GROUPING
417 | HAVING
418 | HOUR
419 | HOURS
420 | IF
421 | IGNORE
422 | IMPORT
423 | IN
424 | INDEX
425 | INDEXES
426 | INNER
427 | INPATH
428 | INPUTFORMAT
429 | INSERT
430 | INTERSECT
431 | INTERVAL
432 | INTO
433 | IS
434 | ITEMS
435 | JOIN
436 | KEYS
437 | LAST
438 | LAST_VALUE
439 | LATERAL
440 | LAZY
441 | LEADING
442 | LEFT
443 | LIKE
444 | LIMIT
445 | LINES
446 | LIST
447 | LOAD
448 | LOCAL
449 | LOCATION
450 | LOCK
451 | LOCKS
452 | LOGICAL
453 | MACRO
454 | MAP
455 | MICROSECOND
456 | MICROSECONDS
457 | MILLISECOND
458 | MILLISECONDS
459 | MINUTE
460 | MINUTES
461 | MONTH
462 | MONTHS
463 | MSCK
464 | NAMESPACE
465 | NAMESPACES
466 | NATURAL
467 | NO
468 | NOT
469 | NULL
470 | NULLS
471 | OF
472 | ON
473 | ONLY
474 | OPTION
475 | OPTIONS
476 | OR
477 | ORDER
478 | OUT
479 | OUTER
480 | OUTPUTFORMAT
481 | OVER
482 | OVERLAPS
483 | OVERLAY
484 | OVERWRITE
485 | PARTITION
486 | PARTITIONED
487 | PARTITIONS
488 | PERCENTLIT
489 | PIVOT
490 | PLACING
491 | POSITION
492 | PRECEDING
493 | PRIMARY
494 | PRINCIPALS
495 | PURGE
496 | QUERY
497 | RANGE
498 | RECORDREADER
499 | RECORDWRITER
500 | RECOVER
501 | REDUCE
502 | REFERENCES
503 | REFRESH
504 | RENAME
505 | REPAIR
506 | REPLACE
507 | RESET
508 | RESPECT
509 | RESTRICT
510 | REVOKE
511 | RIGHT
512 | RLIKE
513 | ROLE
514 | ROLES
515 | ROLLBACK
516 | ROLLUP
517 | ROW
518 | ROWS
519 | SCHEMA
520 | SECOND
521 | SECONDS
522 | SELECT
523 | SEMI
524 | SEPARATED
525 | SERDE
526 | SERDEPROPERTIES
527 | SESSION_USER
528 | SET
529 | SETMINUS
530 | SETS
531 | SHOW
532 | SKEWED
533 | SOME
534 | SORT
535 | SORTED
536 | START
537 | STATISTICS
538 | STORED
539 | STRATIFY
540 | STRUCT
541 | SUBSTR
542 | SUBSTRING
543 | TABLE
544 | TABLES
545 | TABLESAMPLE
546 | TBLPROPERTIES
547 | TEMPORARY
548 | TERMINATED
549 | THEN
550 | TO
551 | TOUCH
552 | TRAILING
553 | TRANSACTION
554 | TRANSACTIONS
555 | TRANSFORM
556 | TRIM
557 | TRUE
558 | TRUNCATE
559 | TYPE
560 | UNARCHIVE
561 | UNBOUNDED
562 | UNCACHE
563 | UNION
564 | UNIQUE
565 | UNKNOWN
566 | UNLOCK
567 | UNSET
568 | UPDATE
569 | USE
570 | USER
571 | USING
572 | VALUES
573 | VIEW
574 | WEEK
575 | WEEKS
576 | WHEN
577 | WHERE
578 | WINDOW
579 | WITH
580 | YEAR
581 | YEARS
582 | EQ
583 | NSEQ
584 | NEQ
585 | NEQJ
586 | LT
587 | LTE
588 | GT
589 | GTE
590 | PLUS
591 | MINUS
592 | ASTERISK
593 | SLASH
594 | PERCENT
595 | DIV
596 | TILDE
597 | AMPERSAND
598 | PIPE
599 | CONCAT_PIPE
600 | HAT
601 | STRING
602 | BIGINT_LITERAL
603 | SMALLINT_LITERAL
604 | TINYINT_LITERAL
605 | INTEGER_VALUE
606 | DECIMAL_VALUE
607 | DOUBLE_LITERAL
608 | BIGDECIMAL_LITERAL
609 | IDENTIFIER
610 | BACKQUOTED_IDENTIFIER
611 | SIMPLE_COMMENT
612 | BRACKETED_EMPTY_COMMENT
613 | BRACKETED_COMMENT
614 | WS
615 | UNRECOGNIZED
616 |
617 | rule names:
618 | T__0
619 | T__1
620 | T__2
621 | T__3
622 | T__4
623 | T__5
624 | T__6
625 | T__7
626 | T__8
627 | T__9
628 | ADD
629 | AFTER
630 | ALL
631 | ALTER
632 | ANALYZE
633 | AND
634 | ANTI
635 | ANY
636 | ARCHIVE
637 | ARRAY
638 | AS
639 | ASC
640 | AT
641 | AUTHORIZATION
642 | BETWEEN
643 | BOTH
644 | BUCKET
645 | BUCKETS
646 | BY
647 | CACHE
648 | CASCADE
649 | CASE
650 | CAST
651 | CHANGE
652 | CHECK
653 | CLEAR
654 | CLUSTER
655 | CLUSTERED
656 | CODEGEN
657 | COLLATE
658 | COLLECTION
659 | COLUMN
660 | COLUMNS
661 | COMMENT
662 | COMMIT
663 | COMPACT
664 | COMPACTIONS
665 | COMPUTE
666 | CONCATENATE
667 | CONSTRAINT
668 | COST
669 | CREATE
670 | CROSS
671 | CUBE
672 | CURRENT
673 | CURRENT_DATE
674 | CURRENT_TIME
675 | CURRENT_TIMESTAMP
676 | CURRENT_USER
677 | DATA
678 | DATABASE
679 | DATABASES
680 | DAY
681 | DAYS
682 | DBPROPERTIES
683 | DEFINED
684 | DELETE
685 | DELIMITED
686 | DESC
687 | DESCRIBE
688 | DFS
689 | DIRECTORIES
690 | DIRECTORY
691 | DISTINCT
692 | DISTRIBUTE
693 | DROP
694 | ELSE
695 | END
696 | ESCAPED
697 | EXCEPT
698 | EXCHANGE
699 | EXISTS
700 | EXPLAIN
701 | EXPORT
702 | EXTENDED
703 | EXTERNAL
704 | EXTRACT
705 | FALSE
706 | FETCH
707 | FIELDS
708 | FILEFORMAT
709 | FIRST
710 | FIRST_VALUE
711 | FOLLOWING
712 | FOR
713 | FOREIGN
714 | FORMAT
715 | FORMATTED
716 | FROM
717 | FULL
718 | FUNCTION
719 | FUNCTIONS
720 | GLOBAL
721 | GRANT
722 | GROUP
723 | GROUPING
724 | HAVING
725 | HOUR
726 | HOURS
727 | IF
728 | IGNORE
729 | IMPORT
730 | IN
731 | INDEX
732 | INDEXES
733 | INNER
734 | INPATH
735 | INPUTFORMAT
736 | INSERT
737 | INTERSECT
738 | INTERVAL
739 | INTO
740 | IS
741 | ITEMS
742 | JOIN
743 | KEYS
744 | LAST
745 | LAST_VALUE
746 | LATERAL
747 | LAZY
748 | LEADING
749 | LEFT
750 | LIKE
751 | LIMIT
752 | LINES
753 | LIST
754 | LOAD
755 | LOCAL
756 | LOCATION
757 | LOCK
758 | LOCKS
759 | LOGICAL
760 | MACRO
761 | MAP
762 | MICROSECOND
763 | MICROSECONDS
764 | MILLISECOND
765 | MILLISECONDS
766 | MINUTE
767 | MINUTES
768 | MONTH
769 | MONTHS
770 | MSCK
771 | NAMESPACE
772 | NAMESPACES
773 | NATURAL
774 | NO
775 | NOT
776 | NULL
777 | NULLS
778 | OF
779 | ON
780 | ONLY
781 | OPTION
782 | OPTIONS
783 | OR
784 | ORDER
785 | OUT
786 | OUTER
787 | OUTPUTFORMAT
788 | OVER
789 | OVERLAPS
790 | OVERLAY
791 | OVERWRITE
792 | PARTITION
793 | PARTITIONED
794 | PARTITIONS
795 | PERCENTLIT
796 | PIVOT
797 | PLACING
798 | POSITION
799 | PRECEDING
800 | PRIMARY
801 | PRINCIPALS
802 | PURGE
803 | QUERY
804 | RANGE
805 | RECORDREADER
806 | RECORDWRITER
807 | RECOVER
808 | REDUCE
809 | REFERENCES
810 | REFRESH
811 | RENAME
812 | REPAIR
813 | REPLACE
814 | RESET
815 | RESPECT
816 | RESTRICT
817 | REVOKE
818 | RIGHT
819 | RLIKE
820 | ROLE
821 | ROLES
822 | ROLLBACK
823 | ROLLUP
824 | ROW
825 | ROWS
826 | SCHEMA
827 | SECOND
828 | SECONDS
829 | SELECT
830 | SEMI
831 | SEPARATED
832 | SERDE
833 | SERDEPROPERTIES
834 | SESSION_USER
835 | SET
836 | SETMINUS
837 | SETS
838 | SHOW
839 | SKEWED
840 | SOME
841 | SORT
842 | SORTED
843 | START
844 | STATISTICS
845 | STORED
846 | STRATIFY
847 | STRUCT
848 | SUBSTR
849 | SUBSTRING
850 | TABLE
851 | TABLES
852 | TABLESAMPLE
853 | TBLPROPERTIES
854 | TEMPORARY
855 | TERMINATED
856 | THEN
857 | TO
858 | TOUCH
859 | TRAILING
860 | TRANSACTION
861 | TRANSACTIONS
862 | TRANSFORM
863 | TRIM
864 | TRUE
865 | TRUNCATE
866 | TYPE
867 | UNARCHIVE
868 | UNBOUNDED
869 | UNCACHE
870 | UNION
871 | UNIQUE
872 | UNKNOWN
873 | UNLOCK
874 | UNSET
875 | UPDATE
876 | USE
877 | USER
878 | USING
879 | VALUES
880 | VIEW
881 | WEEK
882 | WEEKS
883 | WHEN
884 | WHERE
885 | WINDOW
886 | WITH
887 | YEAR
888 | YEARS
889 | EQ
890 | NSEQ
891 | NEQ
892 | NEQJ
893 | LT
894 | LTE
895 | GT
896 | GTE
897 | PLUS
898 | MINUS
899 | ASTERISK
900 | SLASH
901 | PERCENT
902 | DIV
903 | TILDE
904 | AMPERSAND
905 | PIPE
906 | CONCAT_PIPE
907 | HAT
908 | STRING
909 | BIGINT_LITERAL
910 | SMALLINT_LITERAL
911 | TINYINT_LITERAL
912 | INTEGER_VALUE
913 | DECIMAL_VALUE
914 | DOUBLE_LITERAL
915 | BIGDECIMAL_LITERAL
916 | IDENTIFIER
917 | BACKQUOTED_IDENTIFIER
918 | DECIMAL_DIGITS
919 | EXPONENT
920 | DIGIT
921 | LETTER
922 | SIMPLE_COMMENT
923 | BRACKETED_EMPTY_COMMENT
924 | BRACKETED_COMMENT
925 | WS
926 | UNRECOGNIZED
927 |
928 | channel names:
929 | DEFAULT_TOKEN_CHANNEL
930 | HIDDEN
931 |
932 | mode names:
933 | DEFAULT_MODE
934 |
935 | atn:
936 | [3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 307, 2848, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 4, 186, 9, 186, 4, 187, 9, 187, 4, 188, 9, 188, 4, 189, 9, 189, 4, 190, 9, 190, 4, 191, 9, 191, 4, 192, 9, 192, 4, 193, 9, 193, 4, 194, 9, 194, 4, 195, 9, 195, 4, 196, 9, 196, 4, 197, 9, 197, 4, 198, 9, 198, 4, 199, 9, 199, 4, 200, 9, 200, 4, 201, 9, 201, 4, 202, 9, 202, 4, 203, 9, 203, 4, 204, 9, 204, 4, 205, 9, 205, 4, 206, 9, 206, 4, 207, 9, 207, 4, 208, 9, 208, 4, 209, 9, 209, 4, 210, 9, 210, 4, 211, 9, 211, 4, 212, 9, 212, 4, 213, 9, 213, 4, 214, 9, 214, 4, 215, 9, 215, 4, 216, 9, 216, 4, 217, 9, 217, 4, 218, 9, 218, 4, 219, 9, 219, 4, 220, 9, 220, 4, 221, 9, 221, 4, 222, 9, 222, 4, 223, 9, 223, 4, 224, 9, 224, 4, 225, 9, 225, 4, 226, 9, 226, 4, 227, 9, 227, 4, 228, 9, 228, 4, 229, 9, 229, 4, 230, 9, 230, 4, 231, 9, 231, 4, 232, 9, 232, 4, 233, 9, 233, 4, 234, 9, 234, 4, 235, 9, 235, 4, 236, 9, 236, 4, 237, 9, 237, 4, 238, 9, 238, 4, 239, 9, 239, 4, 240, 9, 240, 4, 241, 9, 241, 4, 242, 9, 242, 4, 243, 9, 243, 4, 244, 9, 244, 4, 245, 9, 245, 4, 246, 9, 246, 4, 247, 9, 247, 4, 248, 9, 248, 4, 249, 9, 249, 4, 250, 9, 250, 4, 251, 9, 251, 4, 252, 9, 252, 4, 253, 9, 253, 4, 254, 9, 254, 4, 255, 9, 255, 4, 256, 9, 256, 4, 257, 9, 257, 4, 258, 9, 258, 4, 259, 9, 259, 4, 260, 9, 260, 4, 261, 9, 261, 4, 262, 9, 262, 4, 263, 9, 263, 4, 264, 9, 264, 4, 265, 9, 265, 4, 266, 9, 266, 4, 267, 9, 267, 4, 268, 9, 268, 4, 269, 9, 269, 4, 270, 9, 270, 4, 271, 9, 271, 4, 272, 9, 272, 4, 273, 9, 273, 4, 274, 9, 274, 4, 275, 9, 275, 4, 276, 9, 276, 4, 277, 9, 277, 4, 278, 9, 278, 4, 279, 9, 279, 4, 280, 9, 280, 4, 281, 9, 281, 4, 282, 9, 282, 4, 283, 9, 283, 4, 284, 9, 284, 4, 285, 9, 285, 4, 286, 9, 286, 4, 287, 9, 287, 4, 288, 9, 288, 4, 289, 9, 289, 4, 290, 9, 290, 4, 291, 9, 291, 4, 292, 9, 292, 4, 293, 9, 293, 4, 294, 9, 294, 4, 295, 9, 295, 4, 296, 9, 296, 4, 297, 9, 297, 4, 298, 9, 298, 4, 299, 9, 299, 4, 300, 9, 300, 4, 301, 9, 301, 4, 302, 9, 302, 4, 303, 9, 303, 4, 304, 9, 304, 4, 305, 9, 305, 4, 306, 9, 306, 4, 307, 9, 307, 4, 308, 9, 308, 4, 309, 9, 309, 4, 310, 9, 310, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 5, 63, 1043, 10, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 5, 159, 1741, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 5, 203, 2084, 10, 203, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 208, 3, 208, 3, 208, 3, 208, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 219, 3, 219, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 5, 238, 2354, 10, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 241, 3, 241, 3, 241, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 254, 3, 254, 3, 254, 3, 254, 3, 254, 3, 254, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 260, 3, 260, 3, 260, 3, 260, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 265, 3, 265, 3, 265, 3, 265, 3, 265, 3, 266, 3, 266, 3, 266, 3, 266, 3, 266, 3, 266, 3, 267, 3, 267, 3, 267, 3, 267, 3, 267, 3, 268, 3, 268, 3, 268, 3, 268, 3, 268, 3, 268, 3, 269, 3, 269, 3, 269, 3, 269, 3, 269, 3, 269, 3, 269, 3, 270, 3, 270, 3, 270, 3, 270, 3, 270, 3, 271, 3, 271, 3, 271, 3, 271, 3, 271, 3, 272, 3, 272, 3, 272, 3, 272, 3, 272, 3, 272, 3, 273, 3, 273, 3, 273, 5, 273, 2593, 10, 273, 3, 274, 3, 274, 3, 274, 3, 274, 3, 275, 3, 275, 3, 275, 3, 276, 3, 276, 3, 276, 3, 277, 3, 277, 3, 278, 3, 278, 3, 278, 3, 278, 5, 278, 2611, 10, 278, 3, 279, 3, 279, 3, 280, 3, 280, 3, 280, 3, 280, 5, 280, 2619, 10, 280, 3, 281, 3, 281, 3, 282, 3, 282, 3, 283, 3, 283, 3, 284, 3, 284, 3, 285, 3, 285, 3, 286, 3, 286, 3, 286, 3, 286, 3, 287, 3, 287, 3, 288, 3, 288, 3, 289, 3, 289, 3, 290, 3, 290, 3, 290, 3, 291, 3, 291, 3, 292, 3, 292, 3, 292, 3, 292, 7, 292, 2650, 10, 292, 12, 292, 14, 292, 2653, 11, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 7, 292, 2660, 10, 292, 12, 292, 14, 292, 2663, 11, 292, 3, 292, 5, 292, 2666, 10, 292, 3, 293, 6, 293, 2669, 10, 293, 13, 293, 14, 293, 2670, 3, 293, 3, 293, 3, 294, 6, 294, 2676, 10, 294, 13, 294, 14, 294, 2677, 3, 294, 3, 294, 3, 295, 6, 295, 2683, 10, 295, 13, 295, 14, 295, 2684, 3, 295, 3, 295, 3, 296, 6, 296, 2690, 10, 296, 13, 296, 14, 296, 2691, 3, 297, 6, 297, 2695, 10, 297, 13, 297, 14, 297, 2696, 3, 297, 3, 297, 3, 297, 3, 297, 5, 297, 2703, 10, 297, 3, 297, 3, 297, 5, 297, 2707, 10, 297, 3, 298, 6, 298, 2710, 10, 298, 13, 298, 14, 298, 2711, 3, 298, 5, 298, 2715, 10, 298, 3, 298, 3, 298, 3, 298, 3, 298, 5, 298, 2721, 10, 298, 3, 298, 3, 298, 3, 298, 5, 298, 2726, 10, 298, 3, 299, 6, 299, 2729, 10, 299, 13, 299, 14, 299, 2730, 3, 299, 5, 299, 2734, 10, 299, 3, 299, 3, 299, 3, 299, 3, 299, 3, 299, 5, 299, 2741, 10, 299, 3, 299, 3, 299, 3, 299, 3, 299, 3, 299, 5, 299, 2748, 10, 299, 3, 300, 3, 300, 3, 300, 6, 300, 2753, 10, 300, 13, 300, 14, 300, 2754, 3, 301, 3, 301, 3, 301, 3, 301, 7, 301, 2761, 10, 301, 12, 301, 14, 301, 2764, 11, 301, 3, 301, 3, 301, 3, 302, 6, 302, 2769, 10, 302, 13, 302, 14, 302, 2770, 3, 302, 3, 302, 7, 302, 2775, 10, 302, 12, 302, 14, 302, 2778, 11, 302, 3, 302, 3, 302, 6, 302, 2782, 10, 302, 13, 302, 14, 302, 2783, 5, 302, 2786, 10, 302, 3, 303, 3, 303, 5, 303, 2790, 10, 303, 3, 303, 6, 303, 2793, 10, 303, 13, 303, 14, 303, 2794, 3, 304, 3, 304, 3, 305, 3, 305, 3, 306, 3, 306, 3, 306, 3, 306, 7, 306, 2805, 10, 306, 12, 306, 14, 306, 2808, 11, 306, 3, 306, 5, 306, 2811, 10, 306, 3, 306, 5, 306, 2814, 10, 306, 3, 306, 3, 306, 3, 307, 3, 307, 3, 307, 3, 307, 3, 307, 3, 307, 3, 307, 3, 308, 3, 308, 3, 308, 3, 308, 3, 308, 7, 308, 2830, 10, 308, 12, 308, 14, 308, 2833, 11, 308, 3, 308, 3, 308, 3, 308, 3, 308, 3, 308, 3, 309, 6, 309, 2841, 10, 309, 13, 309, 14, 309, 2842, 3, 309, 3, 309, 3, 310, 3, 310, 3, 2831, 2, 311, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 170, 339, 171, 341, 172, 343, 173, 345, 174, 347, 175, 349, 176, 351, 177, 353, 178, 355, 179, 357, 180, 359, 181, 361, 182, 363, 183, 365, 184, 367, 185, 369, 186, 371, 187, 373, 188, 375, 189, 377, 190, 379, 191, 381, 192, 383, 193, 385, 194, 387, 195, 389, 196, 391, 197, 393, 198, 395, 199, 397, 200, 399, 201, 401, 202, 403, 203, 405, 204, 407, 205, 409, 206, 411, 207, 413, 208, 415, 209, 417, 210, 419, 211, 421, 212, 423, 213, 425, 214, 427, 215, 429, 216, 431, 217, 433, 218, 435, 219, 437, 220, 439, 221, 441, 222, 443, 223, 445, 224, 447, 225, 449, 226, 451, 227, 453, 228, 455, 229, 457, 230, 459, 231, 461, 232, 463, 233, 465, 234, 467, 235, 469, 236, 471, 237, 473, 238, 475, 239, 477, 240, 479, 241, 481, 242, 483, 243, 485, 244, 487, 245, 489, 246, 491, 247, 493, 248, 495, 249, 497, 250, 499, 251, 501, 252, 503, 253, 505, 254, 507, 255, 509, 256, 511, 257, 513, 258, 515, 259, 517, 260, 519, 261, 521, 262, 523, 263, 525, 264, 527, 265, 529, 266, 531, 267, 533, 268, 535, 269, 537, 270, 539, 271, 541, 272, 543, 273, 545, 274, 547, 275, 549, 276, 551, 277, 553, 278, 555, 279, 557, 280, 559, 281, 561, 282, 563, 283, 565, 284, 567, 285, 569, 286, 571, 287, 573, 288, 575, 289, 577, 290, 579, 291, 581, 292, 583, 293, 585, 294, 587, 295, 589, 296, 591, 297, 593, 298, 595, 299, 597, 300, 599, 301, 601, 302, 603, 2, 605, 2, 607, 2, 609, 2, 611, 303, 613, 304, 615, 305, 617, 306, 619, 307, 3, 2, 11, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 98, 98, 4, 2, 45, 45, 47, 47, 3, 2, 50, 59, 3, 2, 67, 92, 4, 2, 12, 12, 15, 15, 3, 2, 45, 45, 5, 2, 11, 12, 15, 15, 34, 34, 2, 2886, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 337, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 2, 371, 3, 2, 2, 2, 2, 373, 3, 2, 2, 2, 2, 375, 3, 2, 2, 2, 2, 377, 3, 2, 2, 2, 2, 379, 3, 2, 2, 2, 2, 381, 3, 2, 2, 2, 2, 383, 3, 2, 2, 2, 2, 385, 3, 2, 2, 2, 2, 387, 3, 2, 2, 2, 2, 389, 3, 2, 2, 2, 2, 391, 3, 2, 2, 2, 2, 393, 3, 2, 2, 2, 2, 395, 3, 2, 2, 2, 2, 397, 3, 2, 2, 2, 2, 399, 3, 2, 2, 2, 2, 401, 3, 2, 2, 2, 2, 403, 3, 2, 2, 2, 2, 405, 3, 2, 2, 2, 2, 407, 3, 2, 2, 2, 2, 409, 3, 2, 2, 2, 2, 411, 3, 2, 2, 2, 2, 413, 3, 2, 2, 2, 2, 415, 3, 2, 2, 2, 2, 417, 3, 2, 2, 2, 2, 419, 3, 2, 2, 2, 2, 421, 3, 2, 2, 2, 2, 423, 3, 2, 2, 2, 2, 425, 3, 2, 2, 2, 2, 427, 3, 2, 2, 2, 2, 429, 3, 2, 2, 2, 2, 431, 3, 2, 2, 2, 2, 433, 3, 2, 2, 2, 2, 435, 3, 2, 2, 2, 2, 437, 3, 2, 2, 2, 2, 439, 3, 2, 2, 2, 2, 441, 3, 2, 2, 2, 2, 443, 3, 2, 2, 2, 2, 445, 3, 2, 2, 2, 2, 447, 3, 2, 2, 2, 2, 449, 3, 2, 2, 2, 2, 451, 3, 2, 2, 2, 2, 453, 3, 2, 2, 2, 2, 455, 3, 2, 2, 2, 2, 457, 3, 2, 2, 2, 2, 459, 3, 2, 2, 2, 2, 461, 3, 2, 2, 2, 2, 463, 3, 2, 2, 2, 2, 465, 3, 2, 2, 2, 2, 467, 3, 2, 2, 2, 2, 469, 3, 2, 2, 2, 2, 471, 3, 2, 2, 2, 2, 473, 3, 2, 2, 2, 2, 475, 3, 2, 2, 2, 2, 477, 3, 2, 2, 2, 2, 479, 3, 2, 2, 2, 2, 481, 3, 2, 2, 2, 2, 483, 3, 2, 2, 2, 2, 485, 3, 2, 2, 2, 2, 487, 3, 2, 2, 2, 2, 489, 3, 2, 2, 2, 2, 491, 3, 2, 2, 2, 2, 493, 3, 2, 2, 2, 2, 495, 3, 2, 2, 2, 2, 497, 3, 2, 2, 2, 2, 499, 3, 2, 2, 2, 2, 501, 3, 2, 2, 2, 2, 503, 3, 2, 2, 2, 2, 505, 3, 2, 2, 2, 2, 507, 3, 2, 2, 2, 2, 509, 3, 2, 2, 2, 2, 511, 3, 2, 2, 2, 2, 513, 3, 2, 2, 2, 2, 515, 3, 2, 2, 2, 2, 517, 3, 2, 2, 2, 2, 519, 3, 2, 2, 2, 2, 521, 3, 2, 2, 2, 2, 523, 3, 2, 2, 2, 2, 525, 3, 2, 2, 2, 2, 527, 3, 2, 2, 2, 2, 529, 3, 2, 2, 2, 2, 531, 3, 2, 2, 2, 2, 533, 3, 2, 2, 2, 2, 535, 3, 2, 2, 2, 2, 537, 3, 2, 2, 2, 2, 539, 3, 2, 2, 2, 2, 541, 3, 2, 2, 2, 2, 543, 3, 2, 2, 2, 2, 545, 3, 2, 2, 2, 2, 547, 3, 2, 2, 2, 2, 549, 3, 2, 2, 2, 2, 551, 3, 2, 2, 2, 2, 553, 3, 2, 2, 2, 2, 555, 3, 2, 2, 2, 2, 557, 3, 2, 2, 2, 2, 559, 3, 2, 2, 2, 2, 561, 3, 2, 2, 2, 2, 563, 3, 2, 2, 2, 2, 565, 3, 2, 2, 2, 2, 567, 3, 2, 2, 2, 2, 569, 3, 2, 2, 2, 2, 571, 3, 2, 2, 2, 2, 573, 3, 2, 2, 2, 2, 575, 3, 2, 2, 2, 2, 577, 3, 2, 2, 2, 2, 579, 3, 2, 2, 2, 2, 581, 3, 2, 2, 2, 2, 583, 3, 2, 2, 2, 2, 585, 3, 2, 2, 2, 2, 587, 3, 2, 2, 2, 2, 589, 3, 2, 2, 2, 2, 591, 3, 2, 2, 2, 2, 593, 3, 2, 2, 2, 2, 595, 3, 2, 2, 2, 2, 597, 3, 2, 2, 2, 2, 599, 3, 2, 2, 2, 2, 601, 3, 2, 2, 2, 2, 611, 3, 2, 2, 2, 2, 613, 3, 2, 2, 2, 2, 615, 3, 2, 2, 2, 2, 617, 3, 2, 2, 2, 2, 619, 3, 2, 2, 2, 3, 621, 3, 2, 2, 2, 5, 623, 3, 2, 2, 2, 7, 625, 3, 2, 2, 2, 9, 627, 3, 2, 2, 2, 11, 629, 3, 2, 2, 2, 13, 633, 3, 2, 2, 2, 15, 636, 3, 2, 2, 2, 17, 639, 3, 2, 2, 2, 19, 641, 3, 2, 2, 2, 21, 643, 3, 2, 2, 2, 23, 645, 3, 2, 2, 2, 25, 649, 3, 2, 2, 2, 27, 655, 3, 2, 2, 2, 29, 659, 3, 2, 2, 2, 31, 665, 3, 2, 2, 2, 33, 673, 3, 2, 2, 2, 35, 677, 3, 2, 2, 2, 37, 682, 3, 2, 2, 2, 39, 686, 3, 2, 2, 2, 41, 694, 3, 2, 2, 2, 43, 700, 3, 2, 2, 2, 45, 703, 3, 2, 2, 2, 47, 707, 3, 2, 2, 2, 49, 710, 3, 2, 2, 2, 51, 724, 3, 2, 2, 2, 53, 732, 3, 2, 2, 2, 55, 737, 3, 2, 2, 2, 57, 744, 3, 2, 2, 2, 59, 752, 3, 2, 2, 2, 61, 755, 3, 2, 2, 2, 63, 761, 3, 2, 2, 2, 65, 769, 3, 2, 2, 2, 67, 774, 3, 2, 2, 2, 69, 779, 3, 2, 2, 2, 71, 786, 3, 2, 2, 2, 73, 792, 3, 2, 2, 2, 75, 798, 3, 2, 2, 2, 77, 806, 3, 2, 2, 2, 79, 816, 3, 2, 2, 2, 81, 824, 3, 2, 2, 2, 83, 832, 3, 2, 2, 2, 85, 843, 3, 2, 2, 2, 87, 850, 3, 2, 2, 2, 89, 858, 3, 2, 2, 2, 91, 866, 3, 2, 2, 2, 93, 873, 3, 2, 2, 2, 95, 881, 3, 2, 2, 2, 97, 893, 3, 2, 2, 2, 99, 901, 3, 2, 2, 2, 101, 913, 3, 2, 2, 2, 103, 924, 3, 2, 2, 2, 105, 929, 3, 2, 2, 2, 107, 936, 3, 2, 2, 2, 109, 942, 3, 2, 2, 2, 111, 947, 3, 2, 2, 2, 113, 955, 3, 2, 2, 2, 115, 968, 3, 2, 2, 2, 117, 981, 3, 2, 2, 2, 119, 999, 3, 2, 2, 2, 121, 1012, 3, 2, 2, 2, 123, 1017, 3, 2, 2, 2, 125, 1042, 3, 2, 2, 2, 127, 1044, 3, 2, 2, 2, 129, 1048, 3, 2, 2, 2, 131, 1053, 3, 2, 2, 2, 133, 1066, 3, 2, 2, 2, 135, 1074, 3, 2, 2, 2, 137, 1081, 3, 2, 2, 2, 139, 1091, 3, 2, 2, 2, 141, 1096, 3, 2, 2, 2, 143, 1105, 3, 2, 2, 2, 145, 1109, 3, 2, 2, 2, 147, 1121, 3, 2, 2, 2, 149, 1131, 3, 2, 2, 2, 151, 1140, 3, 2, 2, 2, 153, 1151, 3, 2, 2, 2, 155, 1156, 3, 2, 2, 2, 157, 1161, 3, 2, 2, 2, 159, 1165, 3, 2, 2, 2, 161, 1173, 3, 2, 2, 2, 163, 1180, 3, 2, 2, 2, 165, 1189, 3, 2, 2, 2, 167, 1196, 3, 2, 2, 2, 169, 1204, 3, 2, 2, 2, 171, 1211, 3, 2, 2, 2, 173, 1220, 3, 2, 2, 2, 175, 1229, 3, 2, 2, 2, 177, 1237, 3, 2, 2, 2, 179, 1243, 3, 2, 2, 2, 181, 1249, 3, 2, 2, 2, 183, 1256, 3, 2, 2, 2, 185, 1267, 3, 2, 2, 2, 187, 1273, 3, 2, 2, 2, 189, 1285, 3, 2, 2, 2, 191, 1295, 3, 2, 2, 2, 193, 1299, 3, 2, 2, 2, 195, 1307, 3, 2, 2, 2, 197, 1314, 3, 2, 2, 2, 199, 1324, 3, 2, 2, 2, 201, 1329, 3, 2, 2, 2, 203, 1334, 3, 2, 2, 2, 205, 1343, 3, 2, 2, 2, 207, 1353, 3, 2, 2, 2, 209, 1360, 3, 2, 2, 2, 211, 1366, 3, 2, 2, 2, 213, 1372, 3, 2, 2, 2, 215, 1381, 3, 2, 2, 2, 217, 1388, 3, 2, 2, 2, 219, 1393, 3, 2, 2, 2, 221, 1399, 3, 2, 2, 2, 223, 1402, 3, 2, 2, 2, 225, 1409, 3, 2, 2, 2, 227, 1416, 3, 2, 2, 2, 229, 1419, 3, 2, 2, 2, 231, 1425, 3, 2, 2, 2, 233, 1433, 3, 2, 2, 2, 235, 1439, 3, 2, 2, 2, 237, 1446, 3, 2, 2, 2, 239, 1458, 3, 2, 2, 2, 241, 1465, 3, 2, 2, 2, 243, 1475, 3, 2, 2, 2, 245, 1484, 3, 2, 2, 2, 247, 1489, 3, 2, 2, 2, 249, 1492, 3, 2, 2, 2, 251, 1498, 3, 2, 2, 2, 253, 1503, 3, 2, 2, 2, 255, 1508, 3, 2, 2, 2, 257, 1513, 3, 2, 2, 2, 259, 1524, 3, 2, 2, 2, 261, 1532, 3, 2, 2, 2, 263, 1537, 3, 2, 2, 2, 265, 1545, 3, 2, 2, 2, 267, 1550, 3, 2, 2, 2, 269, 1555, 3, 2, 2, 2, 271, 1561, 3, 2, 2, 2, 273, 1567, 3, 2, 2, 2, 275, 1572, 3, 2, 2, 2, 277, 1577, 3, 2, 2, 2, 279, 1583, 3, 2, 2, 2, 281, 1592, 3, 2, 2, 2, 283, 1597, 3, 2, 2, 2, 285, 1603, 3, 2, 2, 2, 287, 1611, 3, 2, 2, 2, 289, 1617, 3, 2, 2, 2, 291, 1621, 3, 2, 2, 2, 293, 1633, 3, 2, 2, 2, 295, 1646, 3, 2, 2, 2, 297, 1658, 3, 2, 2, 2, 299, 1671, 3, 2, 2, 2, 301, 1678, 3, 2, 2, 2, 303, 1686, 3, 2, 2, 2, 305, 1692, 3, 2, 2, 2, 307, 1699, 3, 2, 2, 2, 309, 1704, 3, 2, 2, 2, 311, 1714, 3, 2, 2, 2, 313, 1725, 3, 2, 2, 2, 315, 1733, 3, 2, 2, 2, 317, 1740, 3, 2, 2, 2, 319, 1742, 3, 2, 2, 2, 321, 1747, 3, 2, 2, 2, 323, 1753, 3, 2, 2, 2, 325, 1756, 3, 2, 2, 2, 327, 1759, 3, 2, 2, 2, 329, 1764, 3, 2, 2, 2, 331, 1771, 3, 2, 2, 2, 333, 1779, 3, 2, 2, 2, 335, 1782, 3, 2, 2, 2, 337, 1788, 3, 2, 2, 2, 339, 1792, 3, 2, 2, 2, 341, 1798, 3, 2, 2, 2, 343, 1811, 3, 2, 2, 2, 345, 1816, 3, 2, 2, 2, 347, 1825, 3, 2, 2, 2, 349, 1833, 3, 2, 2, 2, 351, 1843, 3, 2, 2, 2, 353, 1853, 3, 2, 2, 2, 355, 1865, 3, 2, 2, 2, 357, 1876, 3, 2, 2, 2, 359, 1884, 3, 2, 2, 2, 361, 1890, 3, 2, 2, 2, 363, 1898, 3, 2, 2, 2, 365, 1907, 3, 2, 2, 2, 367, 1917, 3, 2, 2, 2, 369, 1925, 3, 2, 2, 2, 371, 1936, 3, 2, 2, 2, 373, 1942, 3, 2, 2, 2, 375, 1948, 3, 2, 2, 2, 377, 1954, 3, 2, 2, 2, 379, 1967, 3, 2, 2, 2, 381, 1980, 3, 2, 2, 2, 383, 1988, 3, 2, 2, 2, 385, 1995, 3, 2, 2, 2, 387, 2006, 3, 2, 2, 2, 389, 2014, 3, 2, 2, 2, 391, 2021, 3, 2, 2, 2, 393, 2028, 3, 2, 2, 2, 395, 2036, 3, 2, 2, 2, 397, 2042, 3, 2, 2, 2, 399, 2050, 3, 2, 2, 2, 401, 2059, 3, 2, 2, 2, 403, 2066, 3, 2, 2, 2, 405, 2083, 3, 2, 2, 2, 407, 2085, 3, 2, 2, 2, 409, 2090, 3, 2, 2, 2, 411, 2096, 3, 2, 2, 2, 413, 2105, 3, 2, 2, 2, 415, 2112, 3, 2, 2, 2, 417, 2116, 3, 2, 2, 2, 419, 2121, 3, 2, 2, 2, 421, 2128, 3, 2, 2, 2, 423, 2135, 3, 2, 2, 2, 425, 2143, 3, 2, 2, 2, 427, 2150, 3, 2, 2, 2, 429, 2155, 3, 2, 2, 2, 431, 2165, 3, 2, 2, 2, 433, 2171, 3, 2, 2, 2, 435, 2187, 3, 2, 2, 2, 437, 2200, 3, 2, 2, 2, 439, 2204, 3, 2, 2, 2, 441, 2210, 3, 2, 2, 2, 443, 2215, 3, 2, 2, 2, 445, 2220, 3, 2, 2, 2, 447, 2227, 3, 2, 2, 2, 449, 2232, 3, 2, 2, 2, 451, 2237, 3, 2, 2, 2, 453, 2244, 3, 2, 2, 2, 455, 2250, 3, 2, 2, 2, 457, 2261, 3, 2, 2, 2, 459, 2268, 3, 2, 2, 2, 461, 2277, 3, 2, 2, 2, 463, 2284, 3, 2, 2, 2, 465, 2291, 3, 2, 2, 2, 467, 2301, 3, 2, 2, 2, 469, 2307, 3, 2, 2, 2, 471, 2314, 3, 2, 2, 2, 473, 2326, 3, 2, 2, 2, 475, 2353, 3, 2, 2, 2, 477, 2355, 3, 2, 2, 2, 479, 2366, 3, 2, 2, 2, 481, 2371, 3, 2, 2, 2, 483, 2374, 3, 2, 2, 2, 485, 2380, 3, 2, 2, 2, 487, 2389, 3, 2, 2, 2, 489, 2401, 3, 2, 2, 2, 491, 2414, 3, 2, 2, 2, 493, 2424, 3, 2, 2, 2, 495, 2429, 3, 2, 2, 2, 497, 2434, 3, 2, 2, 2, 499, 2443, 3, 2, 2, 2, 501, 2448, 3, 2, 2, 2, 503, 2458, 3, 2, 2, 2, 505, 2468, 3, 2, 2, 2, 507, 2476, 3, 2, 2, 2, 509, 2482, 3, 2, 2, 2, 511, 2489, 3, 2, 2, 2, 513, 2497, 3, 2, 2, 2, 515, 2504, 3, 2, 2, 2, 517, 2510, 3, 2, 2, 2, 519, 2517, 3, 2, 2, 2, 521, 2521, 3, 2, 2, 2, 523, 2526, 3, 2, 2, 2, 525, 2532, 3, 2, 2, 2, 527, 2539, 3, 2, 2, 2, 529, 2544, 3, 2, 2, 2, 531, 2549, 3, 2, 2, 2, 533, 2555, 3, 2, 2, 2, 535, 2560, 3, 2, 2, 2, 537, 2566, 3, 2, 2, 2, 539, 2573, 3, 2, 2, 2, 541, 2578, 3, 2, 2, 2, 543, 2583, 3, 2, 2, 2, 545, 2592, 3, 2, 2, 2, 547, 2594, 3, 2, 2, 2, 549, 2598, 3, 2, 2, 2, 551, 2601, 3, 2, 2, 2, 553, 2604, 3, 2, 2, 2, 555, 2610, 3, 2, 2, 2, 557, 2612, 3, 2, 2, 2, 559, 2618, 3, 2, 2, 2, 561, 2620, 3, 2, 2, 2, 563, 2622, 3, 2, 2, 2, 565, 2624, 3, 2, 2, 2, 567, 2626, 3, 2, 2, 2, 569, 2628, 3, 2, 2, 2, 571, 2630, 3, 2, 2, 2, 573, 2634, 3, 2, 2, 2, 575, 2636, 3, 2, 2, 2, 577, 2638, 3, 2, 2, 2, 579, 2640, 3, 2, 2, 2, 581, 2643, 3, 2, 2, 2, 583, 2665, 3, 2, 2, 2, 585, 2668, 3, 2, 2, 2, 587, 2675, 3, 2, 2, 2, 589, 2682, 3, 2, 2, 2, 591, 2689, 3, 2, 2, 2, 593, 2706, 3, 2, 2, 2, 595, 2725, 3, 2, 2, 2, 597, 2747, 3, 2, 2, 2, 599, 2752, 3, 2, 2, 2, 601, 2756, 3, 2, 2, 2, 603, 2785, 3, 2, 2, 2, 605, 2787, 3, 2, 2, 2, 607, 2796, 3, 2, 2, 2, 609, 2798, 3, 2, 2, 2, 611, 2800, 3, 2, 2, 2, 613, 2817, 3, 2, 2, 2, 615, 2824, 3, 2, 2, 2, 617, 2840, 3, 2, 2, 2, 619, 2846, 3, 2, 2, 2, 621, 622, 7, 42, 2, 2, 622, 4, 3, 2, 2, 2, 623, 624, 7, 43, 2, 2, 624, 6, 3, 2, 2, 2, 625, 626, 7, 46, 2, 2, 626, 8, 3, 2, 2, 2, 627, 628, 7, 48, 2, 2, 628, 10, 3, 2, 2, 2, 629, 630, 7, 49, 2, 2, 630, 631, 7, 44, 2, 2, 631, 632, 7, 45, 2, 2, 632, 12, 3, 2, 2, 2, 633, 634, 7, 44, 2, 2, 634, 635, 7, 49, 2, 2, 635, 14, 3, 2, 2, 2, 636, 637, 7, 47, 2, 2, 637, 638, 7, 64, 2, 2, 638, 16, 3, 2, 2, 2, 639, 640, 7, 93, 2, 2, 640, 18, 3, 2, 2, 2, 641, 642, 7, 95, 2, 2, 642, 20, 3, 2, 2, 2, 643, 644, 7, 60, 2, 2, 644, 22, 3, 2, 2, 2, 645, 646, 7, 67, 2, 2, 646, 647, 7, 70, 2, 2, 647, 648, 7, 70, 2, 2, 648, 24, 3, 2, 2, 2, 649, 650, 7, 67, 2, 2, 650, 651, 7, 72, 2, 2, 651, 652, 7, 86, 2, 2, 652, 653, 7, 71, 2, 2, 653, 654, 7, 84, 2, 2, 654, 26, 3, 2, 2, 2, 655, 656, 7, 67, 2, 2, 656, 657, 7, 78, 2, 2, 657, 658, 7, 78, 2, 2, 658, 28, 3, 2, 2, 2, 659, 660, 7, 67, 2, 2, 660, 661, 7, 78, 2, 2, 661, 662, 7, 86, 2, 2, 662, 663, 7, 71, 2, 2, 663, 664, 7, 84, 2, 2, 664, 30, 3, 2, 2, 2, 665, 666, 7, 67, 2, 2, 666, 667, 7, 80, 2, 2, 667, 668, 7, 67, 2, 2, 668, 669, 7, 78, 2, 2, 669, 670, 7, 91, 2, 2, 670, 671, 7, 92, 2, 2, 671, 672, 7, 71, 2, 2, 672, 32, 3, 2, 2, 2, 673, 674, 7, 67, 2, 2, 674, 675, 7, 80, 2, 2, 675, 676, 7, 70, 2, 2, 676, 34, 3, 2, 2, 2, 677, 678, 7, 67, 2, 2, 678, 679, 7, 80, 2, 2, 679, 680, 7, 86, 2, 2, 680, 681, 7, 75, 2, 2, 681, 36, 3, 2, 2, 2, 682, 683, 7, 67, 2, 2, 683, 684, 7, 80, 2, 2, 684, 685, 7, 91, 2, 2, 685, 38, 3, 2, 2, 2, 686, 687, 7, 67, 2, 2, 687, 688, 7, 84, 2, 2, 688, 689, 7, 69, 2, 2, 689, 690, 7, 74, 2, 2, 690, 691, 7, 75, 2, 2, 691, 692, 7, 88, 2, 2, 692, 693, 7, 71, 2, 2, 693, 40, 3, 2, 2, 2, 694, 695, 7, 67, 2, 2, 695, 696, 7, 84, 2, 2, 696, 697, 7, 84, 2, 2, 697, 698, 7, 67, 2, 2, 698, 699, 7, 91, 2, 2, 699, 42, 3, 2, 2, 2, 700, 701, 7, 67, 2, 2, 701, 702, 7, 85, 2, 2, 702, 44, 3, 2, 2, 2, 703, 704, 7, 67, 2, 2, 704, 705, 7, 85, 2, 2, 705, 706, 7, 69, 2, 2, 706, 46, 3, 2, 2, 2, 707, 708, 7, 67, 2, 2, 708, 709, 7, 86, 2, 2, 709, 48, 3, 2, 2, 2, 710, 711, 7, 67, 2, 2, 711, 712, 7, 87, 2, 2, 712, 713, 7, 86, 2, 2, 713, 714, 7, 74, 2, 2, 714, 715, 7, 81, 2, 2, 715, 716, 7, 84, 2, 2, 716, 717, 7, 75, 2, 2, 717, 718, 7, 92, 2, 2, 718, 719, 7, 67, 2, 2, 719, 720, 7, 86, 2, 2, 720, 721, 7, 75, 2, 2, 721, 722, 7, 81, 2, 2, 722, 723, 7, 80, 2, 2, 723, 50, 3, 2, 2, 2, 724, 725, 7, 68, 2, 2, 725, 726, 7, 71, 2, 2, 726, 727, 7, 86, 2, 2, 727, 728, 7, 89, 2, 2, 728, 729, 7, 71, 2, 2, 729, 730, 7, 71, 2, 2, 730, 731, 7, 80, 2, 2, 731, 52, 3, 2, 2, 2, 732, 733, 7, 68, 2, 2, 733, 734, 7, 81, 2, 2, 734, 735, 7, 86, 2, 2, 735, 736, 7, 74, 2, 2, 736, 54, 3, 2, 2, 2, 737, 738, 7, 68, 2, 2, 738, 739, 7, 87, 2, 2, 739, 740, 7, 69, 2, 2, 740, 741, 7, 77, 2, 2, 741, 742, 7, 71, 2, 2, 742, 743, 7, 86, 2, 2, 743, 56, 3, 2, 2, 2, 744, 745, 7, 68, 2, 2, 745, 746, 7, 87, 2, 2, 746, 747, 7, 69, 2, 2, 747, 748, 7, 77, 2, 2, 748, 749, 7, 71, 2, 2, 749, 750, 7, 86, 2, 2, 750, 751, 7, 85, 2, 2, 751, 58, 3, 2, 2, 2, 752, 753, 7, 68, 2, 2, 753, 754, 7, 91, 2, 2, 754, 60, 3, 2, 2, 2, 755, 756, 7, 69, 2, 2, 756, 757, 7, 67, 2, 2, 757, 758, 7, 69, 2, 2, 758, 759, 7, 74, 2, 2, 759, 760, 7, 71, 2, 2, 760, 62, 3, 2, 2, 2, 761, 762, 7, 69, 2, 2, 762, 763, 7, 67, 2, 2, 763, 764, 7, 85, 2, 2, 764, 765, 7, 69, 2, 2, 765, 766, 7, 67, 2, 2, 766, 767, 7, 70, 2, 2, 767, 768, 7, 71, 2, 2, 768, 64, 3, 2, 2, 2, 769, 770, 7, 69, 2, 2, 770, 771, 7, 67, 2, 2, 771, 772, 7, 85, 2, 2, 772, 773, 7, 71, 2, 2, 773, 66, 3, 2, 2, 2, 774, 775, 7, 69, 2, 2, 775, 776, 7, 67, 2, 2, 776, 777, 7, 85, 2, 2, 777, 778, 7, 86, 2, 2, 778, 68, 3, 2, 2, 2, 779, 780, 7, 69, 2, 2, 780, 781, 7, 74, 2, 2, 781, 782, 7, 67, 2, 2, 782, 783, 7, 80, 2, 2, 783, 784, 7, 73, 2, 2, 784, 785, 7, 71, 2, 2, 785, 70, 3, 2, 2, 2, 786, 787, 7, 69, 2, 2, 787, 788, 7, 74, 2, 2, 788, 789, 7, 71, 2, 2, 789, 790, 7, 69, 2, 2, 790, 791, 7, 77, 2, 2, 791, 72, 3, 2, 2, 2, 792, 793, 7, 69, 2, 2, 793, 794, 7, 78, 2, 2, 794, 795, 7, 71, 2, 2, 795, 796, 7, 67, 2, 2, 796, 797, 7, 84, 2, 2, 797, 74, 3, 2, 2, 2, 798, 799, 7, 69, 2, 2, 799, 800, 7, 78, 2, 2, 800, 801, 7, 87, 2, 2, 801, 802, 7, 85, 2, 2, 802, 803, 7, 86, 2, 2, 803, 804, 7, 71, 2, 2, 804, 805, 7, 84, 2, 2, 805, 76, 3, 2, 2, 2, 806, 807, 7, 69, 2, 2, 807, 808, 7, 78, 2, 2, 808, 809, 7, 87, 2, 2, 809, 810, 7, 85, 2, 2, 810, 811, 7, 86, 2, 2, 811, 812, 7, 71, 2, 2, 812, 813, 7, 84, 2, 2, 813, 814, 7, 71, 2, 2, 814, 815, 7, 70, 2, 2, 815, 78, 3, 2, 2, 2, 816, 817, 7, 69, 2, 2, 817, 818, 7, 81, 2, 2, 818, 819, 7, 70, 2, 2, 819, 820, 7, 71, 2, 2, 820, 821, 7, 73, 2, 2, 821, 822, 7, 71, 2, 2, 822, 823, 7, 80, 2, 2, 823, 80, 3, 2, 2, 2, 824, 825, 7, 69, 2, 2, 825, 826, 7, 81, 2, 2, 826, 827, 7, 78, 2, 2, 827, 828, 7, 78, 2, 2, 828, 829, 7, 67, 2, 2, 829, 830, 7, 86, 2, 2, 830, 831, 7, 71, 2, 2, 831, 82, 3, 2, 2, 2, 832, 833, 7, 69, 2, 2, 833, 834, 7, 81, 2, 2, 834, 835, 7, 78, 2, 2, 835, 836, 7, 78, 2, 2, 836, 837, 7, 71, 2, 2, 837, 838, 7, 69, 2, 2, 838, 839, 7, 86, 2, 2, 839, 840, 7, 75, 2, 2, 840, 841, 7, 81, 2, 2, 841, 842, 7, 80, 2, 2, 842, 84, 3, 2, 2, 2, 843, 844, 7, 69, 2, 2, 844, 845, 7, 81, 2, 2, 845, 846, 7, 78, 2, 2, 846, 847, 7, 87, 2, 2, 847, 848, 7, 79, 2, 2, 848, 849, 7, 80, 2, 2, 849, 86, 3, 2, 2, 2, 850, 851, 7, 69, 2, 2, 851, 852, 7, 81, 2, 2, 852, 853, 7, 78, 2, 2, 853, 854, 7, 87, 2, 2, 854, 855, 7, 79, 2, 2, 855, 856, 7, 80, 2, 2, 856, 857, 7, 85, 2, 2, 857, 88, 3, 2, 2, 2, 858, 859, 7, 69, 2, 2, 859, 860, 7, 81, 2, 2, 860, 861, 7, 79, 2, 2, 861, 862, 7, 79, 2, 2, 862, 863, 7, 71, 2, 2, 863, 864, 7, 80, 2, 2, 864, 865, 7, 86, 2, 2, 865, 90, 3, 2, 2, 2, 866, 867, 7, 69, 2, 2, 867, 868, 7, 81, 2, 2, 868, 869, 7, 79, 2, 2, 869, 870, 7, 79, 2, 2, 870, 871, 7, 75, 2, 2, 871, 872, 7, 86, 2, 2, 872, 92, 3, 2, 2, 2, 873, 874, 7, 69, 2, 2, 874, 875, 7, 81, 2, 2, 875, 876, 7, 79, 2, 2, 876, 877, 7, 82, 2, 2, 877, 878, 7, 67, 2, 2, 878, 879, 7, 69, 2, 2, 879, 880, 7, 86, 2, 2, 880, 94, 3, 2, 2, 2, 881, 882, 7, 69, 2, 2, 882, 883, 7, 81, 2, 2, 883, 884, 7, 79, 2, 2, 884, 885, 7, 82, 2, 2, 885, 886, 7, 67, 2, 2, 886, 887, 7, 69, 2, 2, 887, 888, 7, 86, 2, 2, 888, 889, 7, 75, 2, 2, 889, 890, 7, 81, 2, 2, 890, 891, 7, 80, 2, 2, 891, 892, 7, 85, 2, 2, 892, 96, 3, 2, 2, 2, 893, 894, 7, 69, 2, 2, 894, 895, 7, 81, 2, 2, 895, 896, 7, 79, 2, 2, 896, 897, 7, 82, 2, 2, 897, 898, 7, 87, 2, 2, 898, 899, 7, 86, 2, 2, 899, 900, 7, 71, 2, 2, 900, 98, 3, 2, 2, 2, 901, 902, 7, 69, 2, 2, 902, 903, 7, 81, 2, 2, 903, 904, 7, 80, 2, 2, 904, 905, 7, 69, 2, 2, 905, 906, 7, 67, 2, 2, 906, 907, 7, 86, 2, 2, 907, 908, 7, 71, 2, 2, 908, 909, 7, 80, 2, 2, 909, 910, 7, 67, 2, 2, 910, 911, 7, 86, 2, 2, 911, 912, 7, 71, 2, 2, 912, 100, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 7, 81, 2, 2, 915, 916, 7, 80, 2, 2, 916, 917, 7, 85, 2, 2, 917, 918, 7, 86, 2, 2, 918, 919, 7, 84, 2, 2, 919, 920, 7, 67, 2, 2, 920, 921, 7, 75, 2, 2, 921, 922, 7, 80, 2, 2, 922, 923, 7, 86, 2, 2, 923, 102, 3, 2, 2, 2, 924, 925, 7, 69, 2, 2, 925, 926, 7, 81, 2, 2, 926, 927, 7, 85, 2, 2, 927, 928, 7, 86, 2, 2, 928, 104, 3, 2, 2, 2, 929, 930, 7, 69, 2, 2, 930, 931, 7, 84, 2, 2, 931, 932, 7, 71, 2, 2, 932, 933, 7, 67, 2, 2, 933, 934, 7, 86, 2, 2, 934, 935, 7, 71, 2, 2, 935, 106, 3, 2, 2, 2, 936, 937, 7, 69, 2, 2, 937, 938, 7, 84, 2, 2, 938, 939, 7, 81, 2, 2, 939, 940, 7, 85, 2, 2, 940, 941, 7, 85, 2, 2, 941, 108, 3, 2, 2, 2, 942, 943, 7, 69, 2, 2, 943, 944, 7, 87, 2, 2, 944, 945, 7, 68, 2, 2, 945, 946, 7, 71, 2, 2, 946, 110, 3, 2, 2, 2, 947, 948, 7, 69, 2, 2, 948, 949, 7, 87, 2, 2, 949, 950, 7, 84, 2, 2, 950, 951, 7, 84, 2, 2, 951, 952, 7, 71, 2, 2, 952, 953, 7, 80, 2, 2, 953, 954, 7, 86, 2, 2, 954, 112, 3, 2, 2, 2, 955, 956, 7, 69, 2, 2, 956, 957, 7, 87, 2, 2, 957, 958, 7, 84, 2, 2, 958, 959, 7, 84, 2, 2, 959, 960, 7, 71, 2, 2, 960, 961, 7, 80, 2, 2, 961, 962, 7, 86, 2, 2, 962, 963, 7, 97, 2, 2, 963, 964, 7, 70, 2, 2, 964, 965, 7, 67, 2, 2, 965, 966, 7, 86, 2, 2, 966, 967, 7, 71, 2, 2, 967, 114, 3, 2, 2, 2, 968, 969, 7, 69, 2, 2, 969, 970, 7, 87, 2, 2, 970, 971, 7, 84, 2, 2, 971, 972, 7, 84, 2, 2, 972, 973, 7, 71, 2, 2, 973, 974, 7, 80, 2, 2, 974, 975, 7, 86, 2, 2, 975, 976, 7, 97, 2, 2, 976, 977, 7, 86, 2, 2, 977, 978, 7, 75, 2, 2, 978, 979, 7, 79, 2, 2, 979, 980, 7, 71, 2, 2, 980, 116, 3, 2, 2, 2, 981, 982, 7, 69, 2, 2, 982, 983, 7, 87, 2, 2, 983, 984, 7, 84, 2, 2, 984, 985, 7, 84, 2, 2, 985, 986, 7, 71, 2, 2, 986, 987, 7, 80, 2, 2, 987, 988, 7, 86, 2, 2, 988, 989, 7, 97, 2, 2, 989, 990, 7, 86, 2, 2, 990, 991, 7, 75, 2, 2, 991, 992, 7, 79, 2, 2, 992, 993, 7, 71, 2, 2, 993, 994, 7, 85, 2, 2, 994, 995, 7, 86, 2, 2, 995, 996, 7, 67, 2, 2, 996, 997, 7, 79, 2, 2, 997, 998, 7, 82, 2, 2, 998, 118, 3, 2, 2, 2, 999, 1000, 7, 69, 2, 2, 1000, 1001, 7, 87, 2, 2, 1001, 1002, 7, 84, 2, 2, 1002, 1003, 7, 84, 2, 2, 1003, 1004, 7, 71, 2, 2, 1004, 1005, 7, 80, 2, 2, 1005, 1006, 7, 86, 2, 2, 1006, 1007, 7, 97, 2, 2, 1007, 1008, 7, 87, 2, 2, 1008, 1009, 7, 85, 2, 2, 1009, 1010, 7, 71, 2, 2, 1010, 1011, 7, 84, 2, 2, 1011, 120, 3, 2, 2, 2, 1012, 1013, 7, 70, 2, 2, 1013, 1014, 7, 67, 2, 2, 1014, 1015, 7, 86, 2, 2, 1015, 1016, 7, 67, 2, 2, 1016, 122, 3, 2, 2, 2, 1017, 1018, 7, 70, 2, 2, 1018, 1019, 7, 67, 2, 2, 1019, 1020, 7, 86, 2, 2, 1020, 1021, 7, 67, 2, 2, 1021, 1022, 7, 68, 2, 2, 1022, 1023, 7, 67, 2, 2, 1023, 1024, 7, 85, 2, 2, 1024, 1025, 7, 71, 2, 2, 1025, 124, 3, 2, 2, 2, 1026, 1027, 7, 70, 2, 2, 1027, 1028, 7, 67, 2, 2, 1028, 1029, 7, 86, 2, 2, 1029, 1030, 7, 67, 2, 2, 1030, 1031, 7, 68, 2, 2, 1031, 1032, 7, 67, 2, 2, 1032, 1033, 7, 85, 2, 2, 1033, 1034, 7, 71, 2, 2, 1034, 1043, 7, 85, 2, 2, 1035, 1036, 7, 85, 2, 2, 1036, 1037, 7, 69, 2, 2, 1037, 1038, 7, 74, 2, 2, 1038, 1039, 7, 71, 2, 2, 1039, 1040, 7, 79, 2, 2, 1040, 1041, 7, 67, 2, 2, 1041, 1043, 7, 85, 2, 2, 1042, 1026, 3, 2, 2, 2, 1042, 1035, 3, 2, 2, 2, 1043, 126, 3, 2, 2, 2, 1044, 1045, 7, 70, 2, 2, 1045, 1046, 7, 67, 2, 2, 1046, 1047, 7, 91, 2, 2, 1047, 128, 3, 2, 2, 2, 1048, 1049, 7, 70, 2, 2, 1049, 1050, 7, 67, 2, 2, 1050, 1051, 7, 91, 2, 2, 1051, 1052, 7, 85, 2, 2, 1052, 130, 3, 2, 2, 2, 1053, 1054, 7, 70, 2, 2, 1054, 1055, 7, 68, 2, 2, 1055, 1056, 7, 82, 2, 2, 1056, 1057, 7, 84, 2, 2, 1057, 1058, 7, 81, 2, 2, 1058, 1059, 7, 82, 2, 2, 1059, 1060, 7, 71, 2, 2, 1060, 1061, 7, 84, 2, 2, 1061, 1062, 7, 86, 2, 2, 1062, 1063, 7, 75, 2, 2, 1063, 1064, 7, 71, 2, 2, 1064, 1065, 7, 85, 2, 2, 1065, 132, 3, 2, 2, 2, 1066, 1067, 7, 70, 2, 2, 1067, 1068, 7, 71, 2, 2, 1068, 1069, 7, 72, 2, 2, 1069, 1070, 7, 75, 2, 2, 1070, 1071, 7, 80, 2, 2, 1071, 1072, 7, 71, 2, 2, 1072, 1073, 7, 70, 2, 2, 1073, 134, 3, 2, 2, 2, 1074, 1075, 7, 70, 2, 2, 1075, 1076, 7, 71, 2, 2, 1076, 1077, 7, 78, 2, 2, 1077, 1078, 7, 71, 2, 2, 1078, 1079, 7, 86, 2, 2, 1079, 1080, 7, 71, 2, 2, 1080, 136, 3, 2, 2, 2, 1081, 1082, 7, 70, 2, 2, 1082, 1083, 7, 71, 2, 2, 1083, 1084, 7, 78, 2, 2, 1084, 1085, 7, 75, 2, 2, 1085, 1086, 7, 79, 2, 2, 1086, 1087, 7, 75, 2, 2, 1087, 1088, 7, 86, 2, 2, 1088, 1089, 7, 71, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 138, 3, 2, 2, 2, 1091, 1092, 7, 70, 2, 2, 1092, 1093, 7, 71, 2, 2, 1093, 1094, 7, 85, 2, 2, 1094, 1095, 7, 69, 2, 2, 1095, 140, 3, 2, 2, 2, 1096, 1097, 7, 70, 2, 2, 1097, 1098, 7, 71, 2, 2, 1098, 1099, 7, 85, 2, 2, 1099, 1100, 7, 69, 2, 2, 1100, 1101, 7, 84, 2, 2, 1101, 1102, 7, 75, 2, 2, 1102, 1103, 7, 68, 2, 2, 1103, 1104, 7, 71, 2, 2, 1104, 142, 3, 2, 2, 2, 1105, 1106, 7, 70, 2, 2, 1106, 1107, 7, 72, 2, 2, 1107, 1108, 7, 85, 2, 2, 1108, 144, 3, 2, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1111, 7, 75, 2, 2, 1111, 1112, 7, 84, 2, 2, 1112, 1113, 7, 71, 2, 2, 1113, 1114, 7, 69, 2, 2, 1114, 1115, 7, 86, 2, 2, 1115, 1116, 7, 81, 2, 2, 1116, 1117, 7, 84, 2, 2, 1117, 1118, 7, 75, 2, 2, 1118, 1119, 7, 71, 2, 2, 1119, 1120, 7, 85, 2, 2, 1120, 146, 3, 2, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1123, 7, 75, 2, 2, 1123, 1124, 7, 84, 2, 2, 1124, 1125, 7, 71, 2, 2, 1125, 1126, 7, 69, 2, 2, 1126, 1127, 7, 86, 2, 2, 1127, 1128, 7, 81, 2, 2, 1128, 1129, 7, 84, 2, 2, 1129, 1130, 7, 91, 2, 2, 1130, 148, 3, 2, 2, 2, 1131, 1132, 7, 70, 2, 2, 1132, 1133, 7, 75, 2, 2, 1133, 1134, 7, 85, 2, 2, 1134, 1135, 7, 86, 2, 2, 1135, 1136, 7, 75, 2, 2, 1136, 1137, 7, 80, 2, 2, 1137, 1138, 7, 69, 2, 2, 1138, 1139, 7, 86, 2, 2, 1139, 150, 3, 2, 2, 2, 1140, 1141, 7, 70, 2, 2, 1141, 1142, 7, 75, 2, 2, 1142, 1143, 7, 85, 2, 2, 1143, 1144, 7, 86, 2, 2, 1144, 1145, 7, 84, 2, 2, 1145, 1146, 7, 75, 2, 2, 1146, 1147, 7, 68, 2, 2, 1147, 1148, 7, 87, 2, 2, 1148, 1149, 7, 86, 2, 2, 1149, 1150, 7, 71, 2, 2, 1150, 152, 3, 2, 2, 2, 1151, 1152, 7, 70, 2, 2, 1152, 1153, 7, 84, 2, 2, 1153, 1154, 7, 81, 2, 2, 1154, 1155, 7, 82, 2, 2, 1155, 154, 3, 2, 2, 2, 1156, 1157, 7, 71, 2, 2, 1157, 1158, 7, 78, 2, 2, 1158, 1159, 7, 85, 2, 2, 1159, 1160, 7, 71, 2, 2, 1160, 156, 3, 2, 2, 2, 1161, 1162, 7, 71, 2, 2, 1162, 1163, 7, 80, 2, 2, 1163, 1164, 7, 70, 2, 2, 1164, 158, 3, 2, 2, 2, 1165, 1166, 7, 71, 2, 2, 1166, 1167, 7, 85, 2, 2, 1167, 1168, 7, 69, 2, 2, 1168, 1169, 7, 67, 2, 2, 1169, 1170, 7, 82, 2, 2, 1170, 1171, 7, 71, 2, 2, 1171, 1172, 7, 70, 2, 2, 1172, 160, 3, 2, 2, 2, 1173, 1174, 7, 71, 2, 2, 1174, 1175, 7, 90, 2, 2, 1175, 1176, 7, 69, 2, 2, 1176, 1177, 7, 71, 2, 2, 1177, 1178, 7, 82, 2, 2, 1178, 1179, 7, 86, 2, 2, 1179, 162, 3, 2, 2, 2, 1180, 1181, 7, 71, 2, 2, 1181, 1182, 7, 90, 2, 2, 1182, 1183, 7, 69, 2, 2, 1183, 1184, 7, 74, 2, 2, 1184, 1185, 7, 67, 2, 2, 1185, 1186, 7, 80, 2, 2, 1186, 1187, 7, 73, 2, 2, 1187, 1188, 7, 71, 2, 2, 1188, 164, 3, 2, 2, 2, 1189, 1190, 7, 71, 2, 2, 1190, 1191, 7, 90, 2, 2, 1191, 1192, 7, 75, 2, 2, 1192, 1193, 7, 85, 2, 2, 1193, 1194, 7, 86, 2, 2, 1194, 1195, 7, 85, 2, 2, 1195, 166, 3, 2, 2, 2, 1196, 1197, 7, 71, 2, 2, 1197, 1198, 7, 90, 2, 2, 1198, 1199, 7, 82, 2, 2, 1199, 1200, 7, 78, 2, 2, 1200, 1201, 7, 67, 2, 2, 1201, 1202, 7, 75, 2, 2, 1202, 1203, 7, 80, 2, 2, 1203, 168, 3, 2, 2, 2, 1204, 1205, 7, 71, 2, 2, 1205, 1206, 7, 90, 2, 2, 1206, 1207, 7, 82, 2, 2, 1207, 1208, 7, 81, 2, 2, 1208, 1209, 7, 84, 2, 2, 1209, 1210, 7, 86, 2, 2, 1210, 170, 3, 2, 2, 2, 1211, 1212, 7, 71, 2, 2, 1212, 1213, 7, 90, 2, 2, 1213, 1214, 7, 86, 2, 2, 1214, 1215, 7, 71, 2, 2, 1215, 1216, 7, 80, 2, 2, 1216, 1217, 7, 70, 2, 2, 1217, 1218, 7, 71, 2, 2, 1218, 1219, 7, 70, 2, 2, 1219, 172, 3, 2, 2, 2, 1220, 1221, 7, 71, 2, 2, 1221, 1222, 7, 90, 2, 2, 1222, 1223, 7, 86, 2, 2, 1223, 1224, 7, 71, 2, 2, 1224, 1225, 7, 84, 2, 2, 1225, 1226, 7, 80, 2, 2, 1226, 1227, 7, 67, 2, 2, 1227, 1228, 7, 78, 2, 2, 1228, 174, 3, 2, 2, 2, 1229, 1230, 7, 71, 2, 2, 1230, 1231, 7, 90, 2, 2, 1231, 1232, 7, 86, 2, 2, 1232, 1233, 7, 84, 2, 2, 1233, 1234, 7, 67, 2, 2, 1234, 1235, 7, 69, 2, 2, 1235, 1236, 7, 86, 2, 2, 1236, 176, 3, 2, 2, 2, 1237, 1238, 7, 72, 2, 2, 1238, 1239, 7, 67, 2, 2, 1239, 1240, 7, 78, 2, 2, 1240, 1241, 7, 85, 2, 2, 1241, 1242, 7, 71, 2, 2, 1242, 178, 3, 2, 2, 2, 1243, 1244, 7, 72, 2, 2, 1244, 1245, 7, 71, 2, 2, 1245, 1246, 7, 86, 2, 2, 1246, 1247, 7, 69, 2, 2, 1247, 1248, 7, 74, 2, 2, 1248, 180, 3, 2, 2, 2, 1249, 1250, 7, 72, 2, 2, 1250, 1251, 7, 75, 2, 2, 1251, 1252, 7, 71, 2, 2, 1252, 1253, 7, 78, 2, 2, 1253, 1254, 7, 70, 2, 2, 1254, 1255, 7, 85, 2, 2, 1255, 182, 3, 2, 2, 2, 1256, 1257, 7, 72, 2, 2, 1257, 1258, 7, 75, 2, 2, 1258, 1259, 7, 78, 2, 2, 1259, 1260, 7, 71, 2, 2, 1260, 1261, 7, 72, 2, 2, 1261, 1262, 7, 81, 2, 2, 1262, 1263, 7, 84, 2, 2, 1263, 1264, 7, 79, 2, 2, 1264, 1265, 7, 67, 2, 2, 1265, 1266, 7, 86, 2, 2, 1266, 184, 3, 2, 2, 2, 1267, 1268, 7, 72, 2, 2, 1268, 1269, 7, 75, 2, 2, 1269, 1270, 7, 84, 2, 2, 1270, 1271, 7, 85, 2, 2, 1271, 1272, 7, 86, 2, 2, 1272, 186, 3, 2, 2, 2, 1273, 1274, 7, 72, 2, 2, 1274, 1275, 7, 75, 2, 2, 1275, 1276, 7, 84, 2, 2, 1276, 1277, 7, 85, 2, 2, 1277, 1278, 7, 86, 2, 2, 1278, 1279, 7, 97, 2, 2, 1279, 1280, 7, 88, 2, 2, 1280, 1281, 7, 67, 2, 2, 1281, 1282, 7, 78, 2, 2, 1282, 1283, 7, 87, 2, 2, 1283, 1284, 7, 71, 2, 2, 1284, 188, 3, 2, 2, 2, 1285, 1286, 7, 72, 2, 2, 1286, 1287, 7, 81, 2, 2, 1287, 1288, 7, 78, 2, 2, 1288, 1289, 7, 78, 2, 2, 1289, 1290, 7, 81, 2, 2, 1290, 1291, 7, 89, 2, 2, 1291, 1292, 7, 75, 2, 2, 1292, 1293, 7, 80, 2, 2, 1293, 1294, 7, 73, 2, 2, 1294, 190, 3, 2, 2, 2, 1295, 1296, 7, 72, 2, 2, 1296, 1297, 7, 81, 2, 2, 1297, 1298, 7, 84, 2, 2, 1298, 192, 3, 2, 2, 2, 1299, 1300, 7, 72, 2, 2, 1300, 1301, 7, 81, 2, 2, 1301, 1302, 7, 84, 2, 2, 1302, 1303, 7, 71, 2, 2, 1303, 1304, 7, 75, 2, 2, 1304, 1305, 7, 73, 2, 2, 1305, 1306, 7, 80, 2, 2, 1306, 194, 3, 2, 2, 2, 1307, 1308, 7, 72, 2, 2, 1308, 1309, 7, 81, 2, 2, 1309, 1310, 7, 84, 2, 2, 1310, 1311, 7, 79, 2, 2, 1311, 1312, 7, 67, 2, 2, 1312, 1313, 7, 86, 2, 2, 1313, 196, 3, 2, 2, 2, 1314, 1315, 7, 72, 2, 2, 1315, 1316, 7, 81, 2, 2, 1316, 1317, 7, 84, 2, 2, 1317, 1318, 7, 79, 2, 2, 1318, 1319, 7, 67, 2, 2, 1319, 1320, 7, 86, 2, 2, 1320, 1321, 7, 86, 2, 2, 1321, 1322, 7, 71, 2, 2, 1322, 1323, 7, 70, 2, 2, 1323, 198, 3, 2, 2, 2, 1324, 1325, 7, 72, 2, 2, 1325, 1326, 7, 84, 2, 2, 1326, 1327, 7, 81, 2, 2, 1327, 1328, 7, 79, 2, 2, 1328, 200, 3, 2, 2, 2, 1329, 1330, 7, 72, 2, 2, 1330, 1331, 7, 87, 2, 2, 1331, 1332, 7, 78, 2, 2, 1332, 1333, 7, 78, 2, 2, 1333, 202, 3, 2, 2, 2, 1334, 1335, 7, 72, 2, 2, 1335, 1336, 7, 87, 2, 2, 1336, 1337, 7, 80, 2, 2, 1337, 1338, 7, 69, 2, 2, 1338, 1339, 7, 86, 2, 2, 1339, 1340, 7, 75, 2, 2, 1340, 1341, 7, 81, 2, 2, 1341, 1342, 7, 80, 2, 2, 1342, 204, 3, 2, 2, 2, 1343, 1344, 7, 72, 2, 2, 1344, 1345, 7, 87, 2, 2, 1345, 1346, 7, 80, 2, 2, 1346, 1347, 7, 69, 2, 2, 1347, 1348, 7, 86, 2, 2, 1348, 1349, 7, 75, 2, 2, 1349, 1350, 7, 81, 2, 2, 1350, 1351, 7, 80, 2, 2, 1351, 1352, 7, 85, 2, 2, 1352, 206, 3, 2, 2, 2, 1353, 1354, 7, 73, 2, 2, 1354, 1355, 7, 78, 2, 2, 1355, 1356, 7, 81, 2, 2, 1356, 1357, 7, 68, 2, 2, 1357, 1358, 7, 67, 2, 2, 1358, 1359, 7, 78, 2, 2, 1359, 208, 3, 2, 2, 2, 1360, 1361, 7, 73, 2, 2, 1361, 1362, 7, 84, 2, 2, 1362, 1363, 7, 67, 2, 2, 1363, 1364, 7, 80, 2, 2, 1364, 1365, 7, 86, 2, 2, 1365, 210, 3, 2, 2, 2, 1366, 1367, 7, 73, 2, 2, 1367, 1368, 7, 84, 2, 2, 1368, 1369, 7, 81, 2, 2, 1369, 1370, 7, 87, 2, 2, 1370, 1371, 7, 82, 2, 2, 1371, 212, 3, 2, 2, 2, 1372, 1373, 7, 73, 2, 2, 1373, 1374, 7, 84, 2, 2, 1374, 1375, 7, 81, 2, 2, 1375, 1376, 7, 87, 2, 2, 1376, 1377, 7, 82, 2, 2, 1377, 1378, 7, 75, 2, 2, 1378, 1379, 7, 80, 2, 2, 1379, 1380, 7, 73, 2, 2, 1380, 214, 3, 2, 2, 2, 1381, 1382, 7, 74, 2, 2, 1382, 1383, 7, 67, 2, 2, 1383, 1384, 7, 88, 2, 2, 1384, 1385, 7, 75, 2, 2, 1385, 1386, 7, 80, 2, 2, 1386, 1387, 7, 73, 2, 2, 1387, 216, 3, 2, 2, 2, 1388, 1389, 7, 74, 2, 2, 1389, 1390, 7, 81, 2, 2, 1390, 1391, 7, 87, 2, 2, 1391, 1392, 7, 84, 2, 2, 1392, 218, 3, 2, 2, 2, 1393, 1394, 7, 74, 2, 2, 1394, 1395, 7, 81, 2, 2, 1395, 1396, 7, 87, 2, 2, 1396, 1397, 7, 84, 2, 2, 1397, 1398, 7, 85, 2, 2, 1398, 220, 3, 2, 2, 2, 1399, 1400, 7, 75, 2, 2, 1400, 1401, 7, 72, 2, 2, 1401, 222, 3, 2, 2, 2, 1402, 1403, 7, 75, 2, 2, 1403, 1404, 7, 73, 2, 2, 1404, 1405, 7, 80, 2, 2, 1405, 1406, 7, 81, 2, 2, 1406, 1407, 7, 84, 2, 2, 1407, 1408, 7, 71, 2, 2, 1408, 224, 3, 2, 2, 2, 1409, 1410, 7, 75, 2, 2, 1410, 1411, 7, 79, 2, 2, 1411, 1412, 7, 82, 2, 2, 1412, 1413, 7, 81, 2, 2, 1413, 1414, 7, 84, 2, 2, 1414, 1415, 7, 86, 2, 2, 1415, 226, 3, 2, 2, 2, 1416, 1417, 7, 75, 2, 2, 1417, 1418, 7, 80, 2, 2, 1418, 228, 3, 2, 2, 2, 1419, 1420, 7, 75, 2, 2, 1420, 1421, 7, 80, 2, 2, 1421, 1422, 7, 70, 2, 2, 1422, 1423, 7, 71, 2, 2, 1423, 1424, 7, 90, 2, 2, 1424, 230, 3, 2, 2, 2, 1425, 1426, 7, 75, 2, 2, 1426, 1427, 7, 80, 2, 2, 1427, 1428, 7, 70, 2, 2, 1428, 1429, 7, 71, 2, 2, 1429, 1430, 7, 90, 2, 2, 1430, 1431, 7, 71, 2, 2, 1431, 1432, 7, 85, 2, 2, 1432, 232, 3, 2, 2, 2, 1433, 1434, 7, 75, 2, 2, 1434, 1435, 7, 80, 2, 2, 1435, 1436, 7, 80, 2, 2, 1436, 1437, 7, 71, 2, 2, 1437, 1438, 7, 84, 2, 2, 1438, 234, 3, 2, 2, 2, 1439, 1440, 7, 75, 2, 2, 1440, 1441, 7, 80, 2, 2, 1441, 1442, 7, 82, 2, 2, 1442, 1443, 7, 67, 2, 2, 1443, 1444, 7, 86, 2, 2, 1444, 1445, 7, 74, 2, 2, 1445, 236, 3, 2, 2, 2, 1446, 1447, 7, 75, 2, 2, 1447, 1448, 7, 80, 2, 2, 1448, 1449, 7, 82, 2, 2, 1449, 1450, 7, 87, 2, 2, 1450, 1451, 7, 86, 2, 2, 1451, 1452, 7, 72, 2, 2, 1452, 1453, 7, 81, 2, 2, 1453, 1454, 7, 84, 2, 2, 1454, 1455, 7, 79, 2, 2, 1455, 1456, 7, 67, 2, 2, 1456, 1457, 7, 86, 2, 2, 1457, 238, 3, 2, 2, 2, 1458, 1459, 7, 75, 2, 2, 1459, 1460, 7, 80, 2, 2, 1460, 1461, 7, 85, 2, 2, 1461, 1462, 7, 71, 2, 2, 1462, 1463, 7, 84, 2, 2, 1463, 1464, 7, 86, 2, 2, 1464, 240, 3, 2, 2, 2, 1465, 1466, 7, 75, 2, 2, 1466, 1467, 7, 80, 2, 2, 1467, 1468, 7, 86, 2, 2, 1468, 1469, 7, 71, 2, 2, 1469, 1470, 7, 84, 2, 2, 1470, 1471, 7, 85, 2, 2, 1471, 1472, 7, 71, 2, 2, 1472, 1473, 7, 69, 2, 2, 1473, 1474, 7, 86, 2, 2, 1474, 242, 3, 2, 2, 2, 1475, 1476, 7, 75, 2, 2, 1476, 1477, 7, 80, 2, 2, 1477, 1478, 7, 86, 2, 2, 1478, 1479, 7, 71, 2, 2, 1479, 1480, 7, 84, 2, 2, 1480, 1481, 7, 88, 2, 2, 1481, 1482, 7, 67, 2, 2, 1482, 1483, 7, 78, 2, 2, 1483, 244, 3, 2, 2, 2, 1484, 1485, 7, 75, 2, 2, 1485, 1486, 7, 80, 2, 2, 1486, 1487, 7, 86, 2, 2, 1487, 1488, 7, 81, 2, 2, 1488, 246, 3, 2, 2, 2, 1489, 1490, 7, 75, 2, 2, 1490, 1491, 7, 85, 2, 2, 1491, 248, 3, 2, 2, 2, 1492, 1493, 7, 75, 2, 2, 1493, 1494, 7, 86, 2, 2, 1494, 1495, 7, 71, 2, 2, 1495, 1496, 7, 79, 2, 2, 1496, 1497, 7, 85, 2, 2, 1497, 250, 3, 2, 2, 2, 1498, 1499, 7, 76, 2, 2, 1499, 1500, 7, 81, 2, 2, 1500, 1501, 7, 75, 2, 2, 1501, 1502, 7, 80, 2, 2, 1502, 252, 3, 2, 2, 2, 1503, 1504, 7, 77, 2, 2, 1504, 1505, 7, 71, 2, 2, 1505, 1506, 7, 91, 2, 2, 1506, 1507, 7, 85, 2, 2, 1507, 254, 3, 2, 2, 2, 1508, 1509, 7, 78, 2, 2, 1509, 1510, 7, 67, 2, 2, 1510, 1511, 7, 85, 2, 2, 1511, 1512, 7, 86, 2, 2, 1512, 256, 3, 2, 2, 2, 1513, 1514, 7, 78, 2, 2, 1514, 1515, 7, 67, 2, 2, 1515, 1516, 7, 85, 2, 2, 1516, 1517, 7, 86, 2, 2, 1517, 1518, 7, 97, 2, 2, 1518, 1519, 7, 88, 2, 2, 1519, 1520, 7, 67, 2, 2, 1520, 1521, 7, 78, 2, 2, 1521, 1522, 7, 87, 2, 2, 1522, 1523, 7, 71, 2, 2, 1523, 258, 3, 2, 2, 2, 1524, 1525, 7, 78, 2, 2, 1525, 1526, 7, 67, 2, 2, 1526, 1527, 7, 86, 2, 2, 1527, 1528, 7, 71, 2, 2, 1528, 1529, 7, 84, 2, 2, 1529, 1530, 7, 67, 2, 2, 1530, 1531, 7, 78, 2, 2, 1531, 260, 3, 2, 2, 2, 1532, 1533, 7, 78, 2, 2, 1533, 1534, 7, 67, 2, 2, 1534, 1535, 7, 92, 2, 2, 1535, 1536, 7, 91, 2, 2, 1536, 262, 3, 2, 2, 2, 1537, 1538, 7, 78, 2, 2, 1538, 1539, 7, 71, 2, 2, 1539, 1540, 7, 67, 2, 2, 1540, 1541, 7, 70, 2, 2, 1541, 1542, 7, 75, 2, 2, 1542, 1543, 7, 80, 2, 2, 1543, 1544, 7, 73, 2, 2, 1544, 264, 3, 2, 2, 2, 1545, 1546, 7, 78, 2, 2, 1546, 1547, 7, 71, 2, 2, 1547, 1548, 7, 72, 2, 2, 1548, 1549, 7, 86, 2, 2, 1549, 266, 3, 2, 2, 2, 1550, 1551, 7, 78, 2, 2, 1551, 1552, 7, 75, 2, 2, 1552, 1553, 7, 77, 2, 2, 1553, 1554, 7, 71, 2, 2, 1554, 268, 3, 2, 2, 2, 1555, 1556, 7, 78, 2, 2, 1556, 1557, 7, 75, 2, 2, 1557, 1558, 7, 79, 2, 2, 1558, 1559, 7, 75, 2, 2, 1559, 1560, 7, 86, 2, 2, 1560, 270, 3, 2, 2, 2, 1561, 1562, 7, 78, 2, 2, 1562, 1563, 7, 75, 2, 2, 1563, 1564, 7, 80, 2, 2, 1564, 1565, 7, 71, 2, 2, 1565, 1566, 7, 85, 2, 2, 1566, 272, 3, 2, 2, 2, 1567, 1568, 7, 78, 2, 2, 1568, 1569, 7, 75, 2, 2, 1569, 1570, 7, 85, 2, 2, 1570, 1571, 7, 86, 2, 2, 1571, 274, 3, 2, 2, 2, 1572, 1573, 7, 78, 2, 2, 1573, 1574, 7, 81, 2, 2, 1574, 1575, 7, 67, 2, 2, 1575, 1576, 7, 70, 2, 2, 1576, 276, 3, 2, 2, 2, 1577, 1578, 7, 78, 2, 2, 1578, 1579, 7, 81, 2, 2, 1579, 1580, 7, 69, 2, 2, 1580, 1581, 7, 67, 2, 2, 1581, 1582, 7, 78, 2, 2, 1582, 278, 3, 2, 2, 2, 1583, 1584, 7, 78, 2, 2, 1584, 1585, 7, 81, 2, 2, 1585, 1586, 7, 69, 2, 2, 1586, 1587, 7, 67, 2, 2, 1587, 1588, 7, 86, 2, 2, 1588, 1589, 7, 75, 2, 2, 1589, 1590, 7, 81, 2, 2, 1590, 1591, 7, 80, 2, 2, 1591, 280, 3, 2, 2, 2, 1592, 1593, 7, 78, 2, 2, 1593, 1594, 7, 81, 2, 2, 1594, 1595, 7, 69, 2, 2, 1595, 1596, 7, 77, 2, 2, 1596, 282, 3, 2, 2, 2, 1597, 1598, 7, 78, 2, 2, 1598, 1599, 7, 81, 2, 2, 1599, 1600, 7, 69, 2, 2, 1600, 1601, 7, 77, 2, 2, 1601, 1602, 7, 85, 2, 2, 1602, 284, 3, 2, 2, 2, 1603, 1604, 7, 78, 2, 2, 1604, 1605, 7, 81, 2, 2, 1605, 1606, 7, 73, 2, 2, 1606, 1607, 7, 75, 2, 2, 1607, 1608, 7, 69, 2, 2, 1608, 1609, 7, 67, 2, 2, 1609, 1610, 7, 78, 2, 2, 1610, 286, 3, 2, 2, 2, 1611, 1612, 7, 79, 2, 2, 1612, 1613, 7, 67, 2, 2, 1613, 1614, 7, 69, 2, 2, 1614, 1615, 7, 84, 2, 2, 1615, 1616, 7, 81, 2, 2, 1616, 288, 3, 2, 2, 2, 1617, 1618, 7, 79, 2, 2, 1618, 1619, 7, 67, 2, 2, 1619, 1620, 7, 82, 2, 2, 1620, 290, 3, 2, 2, 2, 1621, 1622, 7, 79, 2, 2, 1622, 1623, 7, 75, 2, 2, 1623, 1624, 7, 69, 2, 2, 1624, 1625, 7, 84, 2, 2, 1625, 1626, 7, 81, 2, 2, 1626, 1627, 7, 85, 2, 2, 1627, 1628, 7, 71, 2, 2, 1628, 1629, 7, 69, 2, 2, 1629, 1630, 7, 81, 2, 2, 1630, 1631, 7, 80, 2, 2, 1631, 1632, 7, 70, 2, 2, 1632, 292, 3, 2, 2, 2, 1633, 1634, 7, 79, 2, 2, 1634, 1635, 7, 75, 2, 2, 1635, 1636, 7, 69, 2, 2, 1636, 1637, 7, 84, 2, 2, 1637, 1638, 7, 81, 2, 2, 1638, 1639, 7, 85, 2, 2, 1639, 1640, 7, 71, 2, 2, 1640, 1641, 7, 69, 2, 2, 1641, 1642, 7, 81, 2, 2, 1642, 1643, 7, 80, 2, 2, 1643, 1644, 7, 70, 2, 2, 1644, 1645, 7, 85, 2, 2, 1645, 294, 3, 2, 2, 2, 1646, 1647, 7, 79, 2, 2, 1647, 1648, 7, 75, 2, 2, 1648, 1649, 7, 78, 2, 2, 1649, 1650, 7, 78, 2, 2, 1650, 1651, 7, 75, 2, 2, 1651, 1652, 7, 85, 2, 2, 1652, 1653, 7, 71, 2, 2, 1653, 1654, 7, 69, 2, 2, 1654, 1655, 7, 81, 2, 2, 1655, 1656, 7, 80, 2, 2, 1656, 1657, 7, 70, 2, 2, 1657, 296, 3, 2, 2, 2, 1658, 1659, 7, 79, 2, 2, 1659, 1660, 7, 75, 2, 2, 1660, 1661, 7, 78, 2, 2, 1661, 1662, 7, 78, 2, 2, 1662, 1663, 7, 75, 2, 2, 1663, 1664, 7, 85, 2, 2, 1664, 1665, 7, 71, 2, 2, 1665, 1666, 7, 69, 2, 2, 1666, 1667, 7, 81, 2, 2, 1667, 1668, 7, 80, 2, 2, 1668, 1669, 7, 70, 2, 2, 1669, 1670, 7, 85, 2, 2, 1670, 298, 3, 2, 2, 2, 1671, 1672, 7, 79, 2, 2, 1672, 1673, 7, 75, 2, 2, 1673, 1674, 7, 80, 2, 2, 1674, 1675, 7, 87, 2, 2, 1675, 1676, 7, 86, 2, 2, 1676, 1677, 7, 71, 2, 2, 1677, 300, 3, 2, 2, 2, 1678, 1679, 7, 79, 2, 2, 1679, 1680, 7, 75, 2, 2, 1680, 1681, 7, 80, 2, 2, 1681, 1682, 7, 87, 2, 2, 1682, 1683, 7, 86, 2, 2, 1683, 1684, 7, 71, 2, 2, 1684, 1685, 7, 85, 2, 2, 1685, 302, 3, 2, 2, 2, 1686, 1687, 7, 79, 2, 2, 1687, 1688, 7, 81, 2, 2, 1688, 1689, 7, 80, 2, 2, 1689, 1690, 7, 86, 2, 2, 1690, 1691, 7, 74, 2, 2, 1691, 304, 3, 2, 2, 2, 1692, 1693, 7, 79, 2, 2, 1693, 1694, 7, 81, 2, 2, 1694, 1695, 7, 80, 2, 2, 1695, 1696, 7, 86, 2, 2, 1696, 1697, 7, 74, 2, 2, 1697, 1698, 7, 85, 2, 2, 1698, 306, 3, 2, 2, 2, 1699, 1700, 7, 79, 2, 2, 1700, 1701, 7, 85, 2, 2, 1701, 1702, 7, 69, 2, 2, 1702, 1703, 7, 77, 2, 2, 1703, 308, 3, 2, 2, 2, 1704, 1705, 7, 80, 2, 2, 1705, 1706, 7, 67, 2, 2, 1706, 1707, 7, 79, 2, 2, 1707, 1708, 7, 71, 2, 2, 1708, 1709, 7, 85, 2, 2, 1709, 1710, 7, 82, 2, 2, 1710, 1711, 7, 67, 2, 2, 1711, 1712, 7, 69, 2, 2, 1712, 1713, 7, 71, 2, 2, 1713, 310, 3, 2, 2, 2, 1714, 1715, 7, 80, 2, 2, 1715, 1716, 7, 67, 2, 2, 1716, 1717, 7, 79, 2, 2, 1717, 1718, 7, 71, 2, 2, 1718, 1719, 7, 85, 2, 2, 1719, 1720, 7, 82, 2, 2, 1720, 1721, 7, 67, 2, 2, 1721, 1722, 7, 69, 2, 2, 1722, 1723, 7, 71, 2, 2, 1723, 1724, 7, 85, 2, 2, 1724, 312, 3, 2, 2, 2, 1725, 1726, 7, 80, 2, 2, 1726, 1727, 7, 67, 2, 2, 1727, 1728, 7, 86, 2, 2, 1728, 1729, 7, 87, 2, 2, 1729, 1730, 7, 84, 2, 2, 1730, 1731, 7, 67, 2, 2, 1731, 1732, 7, 78, 2, 2, 1732, 314, 3, 2, 2, 2, 1733, 1734, 7, 80, 2, 2, 1734, 1735, 7, 81, 2, 2, 1735, 316, 3, 2, 2, 2, 1736, 1737, 7, 80, 2, 2, 1737, 1738, 7, 81, 2, 2, 1738, 1741, 7, 86, 2, 2, 1739, 1741, 7, 35, 2, 2, 1740, 1736, 3, 2, 2, 2, 1740, 1739, 3, 2, 2, 2, 1741, 318, 3, 2, 2, 2, 1742, 1743, 7, 80, 2, 2, 1743, 1744, 7, 87, 2, 2, 1744, 1745, 7, 78, 2, 2, 1745, 1746, 7, 78, 2, 2, 1746, 320, 3, 2, 2, 2, 1747, 1748, 7, 80, 2, 2, 1748, 1749, 7, 87, 2, 2, 1749, 1750, 7, 78, 2, 2, 1750, 1751, 7, 78, 2, 2, 1751, 1752, 7, 85, 2, 2, 1752, 322, 3, 2, 2, 2, 1753, 1754, 7, 81, 2, 2, 1754, 1755, 7, 72, 2, 2, 1755, 324, 3, 2, 2, 2, 1756, 1757, 7, 81, 2, 2, 1757, 1758, 7, 80, 2, 2, 1758, 326, 3, 2, 2, 2, 1759, 1760, 7, 81, 2, 2, 1760, 1761, 7, 80, 2, 2, 1761, 1762, 7, 78, 2, 2, 1762, 1763, 7, 91, 2, 2, 1763, 328, 3, 2, 2, 2, 1764, 1765, 7, 81, 2, 2, 1765, 1766, 7, 82, 2, 2, 1766, 1767, 7, 86, 2, 2, 1767, 1768, 7, 75, 2, 2, 1768, 1769, 7, 81, 2, 2, 1769, 1770, 7, 80, 2, 2, 1770, 330, 3, 2, 2, 2, 1771, 1772, 7, 81, 2, 2, 1772, 1773, 7, 82, 2, 2, 1773, 1774, 7, 86, 2, 2, 1774, 1775, 7, 75, 2, 2, 1775, 1776, 7, 81, 2, 2, 1776, 1777, 7, 80, 2, 2, 1777, 1778, 7, 85, 2, 2, 1778, 332, 3, 2, 2, 2, 1779, 1780, 7, 81, 2, 2, 1780, 1781, 7, 84, 2, 2, 1781, 334, 3, 2, 2, 2, 1782, 1783, 7, 81, 2, 2, 1783, 1784, 7, 84, 2, 2, 1784, 1785, 7, 70, 2, 2, 1785, 1786, 7, 71, 2, 2, 1786, 1787, 7, 84, 2, 2, 1787, 336, 3, 2, 2, 2, 1788, 1789, 7, 81, 2, 2, 1789, 1790, 7, 87, 2, 2, 1790, 1791, 7, 86, 2, 2, 1791, 338, 3, 2, 2, 2, 1792, 1793, 7, 81, 2, 2, 1793, 1794, 7, 87, 2, 2, 1794, 1795, 7, 86, 2, 2, 1795, 1796, 7, 71, 2, 2, 1796, 1797, 7, 84, 2, 2, 1797, 340, 3, 2, 2, 2, 1798, 1799, 7, 81, 2, 2, 1799, 1800, 7, 87, 2, 2, 1800, 1801, 7, 86, 2, 2, 1801, 1802, 7, 82, 2, 2, 1802, 1803, 7, 87, 2, 2, 1803, 1804, 7, 86, 2, 2, 1804, 1805, 7, 72, 2, 2, 1805, 1806, 7, 81, 2, 2, 1806, 1807, 7, 84, 2, 2, 1807, 1808, 7, 79, 2, 2, 1808, 1809, 7, 67, 2, 2, 1809, 1810, 7, 86, 2, 2, 1810, 342, 3, 2, 2, 2, 1811, 1812, 7, 81, 2, 2, 1812, 1813, 7, 88, 2, 2, 1813, 1814, 7, 71, 2, 2, 1814, 1815, 7, 84, 2, 2, 1815, 344, 3, 2, 2, 2, 1816, 1817, 7, 81, 2, 2, 1817, 1818, 7, 88, 2, 2, 1818, 1819, 7, 71, 2, 2, 1819, 1820, 7, 84, 2, 2, 1820, 1821, 7, 78, 2, 2, 1821, 1822, 7, 67, 2, 2, 1822, 1823, 7, 82, 2, 2, 1823, 1824, 7, 85, 2, 2, 1824, 346, 3, 2, 2, 2, 1825, 1826, 7, 81, 2, 2, 1826, 1827, 7, 88, 2, 2, 1827, 1828, 7, 71, 2, 2, 1828, 1829, 7, 84, 2, 2, 1829, 1830, 7, 78, 2, 2, 1830, 1831, 7, 67, 2, 2, 1831, 1832, 7, 91, 2, 2, 1832, 348, 3, 2, 2, 2, 1833, 1834, 7, 81, 2, 2, 1834, 1835, 7, 88, 2, 2, 1835, 1836, 7, 71, 2, 2, 1836, 1837, 7, 84, 2, 2, 1837, 1838, 7, 89, 2, 2, 1838, 1839, 7, 84, 2, 2, 1839, 1840, 7, 75, 2, 2, 1840, 1841, 7, 86, 2, 2, 1841, 1842, 7, 71, 2, 2, 1842, 350, 3, 2, 2, 2, 1843, 1844, 7, 82, 2, 2, 1844, 1845, 7, 67, 2, 2, 1845, 1846, 7, 84, 2, 2, 1846, 1847, 7, 86, 2, 2, 1847, 1848, 7, 75, 2, 2, 1848, 1849, 7, 86, 2, 2, 1849, 1850, 7, 75, 2, 2, 1850, 1851, 7, 81, 2, 2, 1851, 1852, 7, 80, 2, 2, 1852, 352, 3, 2, 2, 2, 1853, 1854, 7, 82, 2, 2, 1854, 1855, 7, 67, 2, 2, 1855, 1856, 7, 84, 2, 2, 1856, 1857, 7, 86, 2, 2, 1857, 1858, 7, 75, 2, 2, 1858, 1859, 7, 86, 2, 2, 1859, 1860, 7, 75, 2, 2, 1860, 1861, 7, 81, 2, 2, 1861, 1862, 7, 80, 2, 2, 1862, 1863, 7, 71, 2, 2, 1863, 1864, 7, 70, 2, 2, 1864, 354, 3, 2, 2, 2, 1865, 1866, 7, 82, 2, 2, 1866, 1867, 7, 67, 2, 2, 1867, 1868, 7, 84, 2, 2, 1868, 1869, 7, 86, 2, 2, 1869, 1870, 7, 75, 2, 2, 1870, 1871, 7, 86, 2, 2, 1871, 1872, 7, 75, 2, 2, 1872, 1873, 7, 81, 2, 2, 1873, 1874, 7, 80, 2, 2, 1874, 1875, 7, 85, 2, 2, 1875, 356, 3, 2, 2, 2, 1876, 1877, 7, 82, 2, 2, 1877, 1878, 7, 71, 2, 2, 1878, 1879, 7, 84, 2, 2, 1879, 1880, 7, 69, 2, 2, 1880, 1881, 7, 71, 2, 2, 1881, 1882, 7, 80, 2, 2, 1882, 1883, 7, 86, 2, 2, 1883, 358, 3, 2, 2, 2, 1884, 1885, 7, 82, 2, 2, 1885, 1886, 7, 75, 2, 2, 1886, 1887, 7, 88, 2, 2, 1887, 1888, 7, 81, 2, 2, 1888, 1889, 7, 86, 2, 2, 1889, 360, 3, 2, 2, 2, 1890, 1891, 7, 82, 2, 2, 1891, 1892, 7, 78, 2, 2, 1892, 1893, 7, 67, 2, 2, 1893, 1894, 7, 69, 2, 2, 1894, 1895, 7, 75, 2, 2, 1895, 1896, 7, 80, 2, 2, 1896, 1897, 7, 73, 2, 2, 1897, 362, 3, 2, 2, 2, 1898, 1899, 7, 82, 2, 2, 1899, 1900, 7, 81, 2, 2, 1900, 1901, 7, 85, 2, 2, 1901, 1902, 7, 75, 2, 2, 1902, 1903, 7, 86, 2, 2, 1903, 1904, 7, 75, 2, 2, 1904, 1905, 7, 81, 2, 2, 1905, 1906, 7, 80, 2, 2, 1906, 364, 3, 2, 2, 2, 1907, 1908, 7, 82, 2, 2, 1908, 1909, 7, 84, 2, 2, 1909, 1910, 7, 71, 2, 2, 1910, 1911, 7, 69, 2, 2, 1911, 1912, 7, 71, 2, 2, 1912, 1913, 7, 70, 2, 2, 1913, 1914, 7, 75, 2, 2, 1914, 1915, 7, 80, 2, 2, 1915, 1916, 7, 73, 2, 2, 1916, 366, 3, 2, 2, 2, 1917, 1918, 7, 82, 2, 2, 1918, 1919, 7, 84, 2, 2, 1919, 1920, 7, 75, 2, 2, 1920, 1921, 7, 79, 2, 2, 1921, 1922, 7, 67, 2, 2, 1922, 1923, 7, 84, 2, 2, 1923, 1924, 7, 91, 2, 2, 1924, 368, 3, 2, 2, 2, 1925, 1926, 7, 82, 2, 2, 1926, 1927, 7, 84, 2, 2, 1927, 1928, 7, 75, 2, 2, 1928, 1929, 7, 80, 2, 2, 1929, 1930, 7, 69, 2, 2, 1930, 1931, 7, 75, 2, 2, 1931, 1932, 7, 82, 2, 2, 1932, 1933, 7, 67, 2, 2, 1933, 1934, 7, 78, 2, 2, 1934, 1935, 7, 85, 2, 2, 1935, 370, 3, 2, 2, 2, 1936, 1937, 7, 82, 2, 2, 1937, 1938, 7, 87, 2, 2, 1938, 1939, 7, 84, 2, 2, 1939, 1940, 7, 73, 2, 2, 1940, 1941, 7, 71, 2, 2, 1941, 372, 3, 2, 2, 2, 1942, 1943, 7, 83, 2, 2, 1943, 1944, 7, 87, 2, 2, 1944, 1945, 7, 71, 2, 2, 1945, 1946, 7, 84, 2, 2, 1946, 1947, 7, 91, 2, 2, 1947, 374, 3, 2, 2, 2, 1948, 1949, 7, 84, 2, 2, 1949, 1950, 7, 67, 2, 2, 1950, 1951, 7, 80, 2, 2, 1951, 1952, 7, 73, 2, 2, 1952, 1953, 7, 71, 2, 2, 1953, 376, 3, 2, 2, 2, 1954, 1955, 7, 84, 2, 2, 1955, 1956, 7, 71, 2, 2, 1956, 1957, 7, 69, 2, 2, 1957, 1958, 7, 81, 2, 2, 1958, 1959, 7, 84, 2, 2, 1959, 1960, 7, 70, 2, 2, 1960, 1961, 7, 84, 2, 2, 1961, 1962, 7, 71, 2, 2, 1962, 1963, 7, 67, 2, 2, 1963, 1964, 7, 70, 2, 2, 1964, 1965, 7, 71, 2, 2, 1965, 1966, 7, 84, 2, 2, 1966, 378, 3, 2, 2, 2, 1967, 1968, 7, 84, 2, 2, 1968, 1969, 7, 71, 2, 2, 1969, 1970, 7, 69, 2, 2, 1970, 1971, 7, 81, 2, 2, 1971, 1972, 7, 84, 2, 2, 1972, 1973, 7, 70, 2, 2, 1973, 1974, 7, 89, 2, 2, 1974, 1975, 7, 84, 2, 2, 1975, 1976, 7, 75, 2, 2, 1976, 1977, 7, 86, 2, 2, 1977, 1978, 7, 71, 2, 2, 1978, 1979, 7, 84, 2, 2, 1979, 380, 3, 2, 2, 2, 1980, 1981, 7, 84, 2, 2, 1981, 1982, 7, 71, 2, 2, 1982, 1983, 7, 69, 2, 2, 1983, 1984, 7, 81, 2, 2, 1984, 1985, 7, 88, 2, 2, 1985, 1986, 7, 71, 2, 2, 1986, 1987, 7, 84, 2, 2, 1987, 382, 3, 2, 2, 2, 1988, 1989, 7, 84, 2, 2, 1989, 1990, 7, 71, 2, 2, 1990, 1991, 7, 70, 2, 2, 1991, 1992, 7, 87, 2, 2, 1992, 1993, 7, 69, 2, 2, 1993, 1994, 7, 71, 2, 2, 1994, 384, 3, 2, 2, 2, 1995, 1996, 7, 84, 2, 2, 1996, 1997, 7, 71, 2, 2, 1997, 1998, 7, 72, 2, 2, 1998, 1999, 7, 71, 2, 2, 1999, 2000, 7, 84, 2, 2, 2000, 2001, 7, 71, 2, 2, 2001, 2002, 7, 80, 2, 2, 2002, 2003, 7, 69, 2, 2, 2003, 2004, 7, 71, 2, 2, 2004, 2005, 7, 85, 2, 2, 2005, 386, 3, 2, 2, 2, 2006, 2007, 7, 84, 2, 2, 2007, 2008, 7, 71, 2, 2, 2008, 2009, 7, 72, 2, 2, 2009, 2010, 7, 84, 2, 2, 2010, 2011, 7, 71, 2, 2, 2011, 2012, 7, 85, 2, 2, 2012, 2013, 7, 74, 2, 2, 2013, 388, 3, 2, 2, 2, 2014, 2015, 7, 84, 2, 2, 2015, 2016, 7, 71, 2, 2, 2016, 2017, 7, 80, 2, 2, 2017, 2018, 7, 67, 2, 2, 2018, 2019, 7, 79, 2, 2, 2019, 2020, 7, 71, 2, 2, 2020, 390, 3, 2, 2, 2, 2021, 2022, 7, 84, 2, 2, 2022, 2023, 7, 71, 2, 2, 2023, 2024, 7, 82, 2, 2, 2024, 2025, 7, 67, 2, 2, 2025, 2026, 7, 75, 2, 2, 2026, 2027, 7, 84, 2, 2, 2027, 392, 3, 2, 2, 2, 2028, 2029, 7, 84, 2, 2, 2029, 2030, 7, 71, 2, 2, 2030, 2031, 7, 82, 2, 2, 2031, 2032, 7, 78, 2, 2, 2032, 2033, 7, 67, 2, 2, 2033, 2034, 7, 69, 2, 2, 2034, 2035, 7, 71, 2, 2, 2035, 394, 3, 2, 2, 2, 2036, 2037, 7, 84, 2, 2, 2037, 2038, 7, 71, 2, 2, 2038, 2039, 7, 85, 2, 2, 2039, 2040, 7, 71, 2, 2, 2040, 2041, 7, 86, 2, 2, 2041, 396, 3, 2, 2, 2, 2042, 2043, 7, 84, 2, 2, 2043, 2044, 7, 71, 2, 2, 2044, 2045, 7, 85, 2, 2, 2045, 2046, 7, 82, 2, 2, 2046, 2047, 7, 71, 2, 2, 2047, 2048, 7, 69, 2, 2, 2048, 2049, 7, 86, 2, 2, 2049, 398, 3, 2, 2, 2, 2050, 2051, 7, 84, 2, 2, 2051, 2052, 7, 71, 2, 2, 2052, 2053, 7, 85, 2, 2, 2053, 2054, 7, 86, 2, 2, 2054, 2055, 7, 84, 2, 2, 2055, 2056, 7, 75, 2, 2, 2056, 2057, 7, 69, 2, 2, 2057, 2058, 7, 86, 2, 2, 2058, 400, 3, 2, 2, 2, 2059, 2060, 7, 84, 2, 2, 2060, 2061, 7, 71, 2, 2, 2061, 2062, 7, 88, 2, 2, 2062, 2063, 7, 81, 2, 2, 2063, 2064, 7, 77, 2, 2, 2064, 2065, 7, 71, 2, 2, 2065, 402, 3, 2, 2, 2, 2066, 2067, 7, 84, 2, 2, 2067, 2068, 7, 75, 2, 2, 2068, 2069, 7, 73, 2, 2, 2069, 2070, 7, 74, 2, 2, 2070, 2071, 7, 86, 2, 2, 2071, 404, 3, 2, 2, 2, 2072, 2073, 7, 84, 2, 2, 2073, 2074, 7, 78, 2, 2, 2074, 2075, 7, 75, 2, 2, 2075, 2076, 7, 77, 2, 2, 2076, 2084, 7, 71, 2, 2, 2077, 2078, 7, 84, 2, 2, 2078, 2079, 7, 71, 2, 2, 2079, 2080, 7, 73, 2, 2, 2080, 2081, 7, 71, 2, 2, 2081, 2082, 7, 90, 2, 2, 2082, 2084, 7, 82, 2, 2, 2083, 2072, 3, 2, 2, 2, 2083, 2077, 3, 2, 2, 2, 2084, 406, 3, 2, 2, 2, 2085, 2086, 7, 84, 2, 2, 2086, 2087, 7, 81, 2, 2, 2087, 2088, 7, 78, 2, 2, 2088, 2089, 7, 71, 2, 2, 2089, 408, 3, 2, 2, 2, 2090, 2091, 7, 84, 2, 2, 2091, 2092, 7, 81, 2, 2, 2092, 2093, 7, 78, 2, 2, 2093, 2094, 7, 71, 2, 2, 2094, 2095, 7, 85, 2, 2, 2095, 410, 3, 2, 2, 2, 2096, 2097, 7, 84, 2, 2, 2097, 2098, 7, 81, 2, 2, 2098, 2099, 7, 78, 2, 2, 2099, 2100, 7, 78, 2, 2, 2100, 2101, 7, 68, 2, 2, 2101, 2102, 7, 67, 2, 2, 2102, 2103, 7, 69, 2, 2, 2103, 2104, 7, 77, 2, 2, 2104, 412, 3, 2, 2, 2, 2105, 2106, 7, 84, 2, 2, 2106, 2107, 7, 81, 2, 2, 2107, 2108, 7, 78, 2, 2, 2108, 2109, 7, 78, 2, 2, 2109, 2110, 7, 87, 2, 2, 2110, 2111, 7, 82, 2, 2, 2111, 414, 3, 2, 2, 2, 2112, 2113, 7, 84, 2, 2, 2113, 2114, 7, 81, 2, 2, 2114, 2115, 7, 89, 2, 2, 2115, 416, 3, 2, 2, 2, 2116, 2117, 7, 84, 2, 2, 2117, 2118, 7, 81, 2, 2, 2118, 2119, 7, 89, 2, 2, 2119, 2120, 7, 85, 2, 2, 2120, 418, 3, 2, 2, 2, 2121, 2122, 7, 85, 2, 2, 2122, 2123, 7, 69, 2, 2, 2123, 2124, 7, 74, 2, 2, 2124, 2125, 7, 71, 2, 2, 2125, 2126, 7, 79, 2, 2, 2126, 2127, 7, 67, 2, 2, 2127, 420, 3, 2, 2, 2, 2128, 2129, 7, 85, 2, 2, 2129, 2130, 7, 71, 2, 2, 2130, 2131, 7, 69, 2, 2, 2131, 2132, 7, 81, 2, 2, 2132, 2133, 7, 80, 2, 2, 2133, 2134, 7, 70, 2, 2, 2134, 422, 3, 2, 2, 2, 2135, 2136, 7, 85, 2, 2, 2136, 2137, 7, 71, 2, 2, 2137, 2138, 7, 69, 2, 2, 2138, 2139, 7, 81, 2, 2, 2139, 2140, 7, 80, 2, 2, 2140, 2141, 7, 70, 2, 2, 2141, 2142, 7, 85, 2, 2, 2142, 424, 3, 2, 2, 2, 2143, 2144, 7, 85, 2, 2, 2144, 2145, 7, 71, 2, 2, 2145, 2146, 7, 78, 2, 2, 2146, 2147, 7, 71, 2, 2, 2147, 2148, 7, 69, 2, 2, 2148, 2149, 7, 86, 2, 2, 2149, 426, 3, 2, 2, 2, 2150, 2151, 7, 85, 2, 2, 2151, 2152, 7, 71, 2, 2, 2152, 2153, 7, 79, 2, 2, 2153, 2154, 7, 75, 2, 2, 2154, 428, 3, 2, 2, 2, 2155, 2156, 7, 85, 2, 2, 2156, 2157, 7, 71, 2, 2, 2157, 2158, 7, 82, 2, 2, 2158, 2159, 7, 67, 2, 2, 2159, 2160, 7, 84, 2, 2, 2160, 2161, 7, 67, 2, 2, 2161, 2162, 7, 86, 2, 2, 2162, 2163, 7, 71, 2, 2, 2163, 2164, 7, 70, 2, 2, 2164, 430, 3, 2, 2, 2, 2165, 2166, 7, 85, 2, 2, 2166, 2167, 7, 71, 2, 2, 2167, 2168, 7, 84, 2, 2, 2168, 2169, 7, 70, 2, 2, 2169, 2170, 7, 71, 2, 2, 2170, 432, 3, 2, 2, 2, 2171, 2172, 7, 85, 2, 2, 2172, 2173, 7, 71, 2, 2, 2173, 2174, 7, 84, 2, 2, 2174, 2175, 7, 70, 2, 2, 2175, 2176, 7, 71, 2, 2, 2176, 2177, 7, 82, 2, 2, 2177, 2178, 7, 84, 2, 2, 2178, 2179, 7, 81, 2, 2, 2179, 2180, 7, 82, 2, 2, 2180, 2181, 7, 71, 2, 2, 2181, 2182, 7, 84, 2, 2, 2182, 2183, 7, 86, 2, 2, 2183, 2184, 7, 75, 2, 2, 2184, 2185, 7, 71, 2, 2, 2185, 2186, 7, 85, 2, 2, 2186, 434, 3, 2, 2, 2, 2187, 2188, 7, 85, 2, 2, 2188, 2189, 7, 71, 2, 2, 2189, 2190, 7, 85, 2, 2, 2190, 2191, 7, 85, 2, 2, 2191, 2192, 7, 75, 2, 2, 2192, 2193, 7, 81, 2, 2, 2193, 2194, 7, 80, 2, 2, 2194, 2195, 7, 97, 2, 2, 2195, 2196, 7, 87, 2, 2, 2196, 2197, 7, 85, 2, 2, 2197, 2198, 7, 71, 2, 2, 2198, 2199, 7, 84, 2, 2, 2199, 436, 3, 2, 2, 2, 2200, 2201, 7, 85, 2, 2, 2201, 2202, 7, 71, 2, 2, 2202, 2203, 7, 86, 2, 2, 2203, 438, 3, 2, 2, 2, 2204, 2205, 7, 79, 2, 2, 2205, 2206, 7, 75, 2, 2, 2206, 2207, 7, 80, 2, 2, 2207, 2208, 7, 87, 2, 2, 2208, 2209, 7, 85, 2, 2, 2209, 440, 3, 2, 2, 2, 2210, 2211, 7, 85, 2, 2, 2211, 2212, 7, 71, 2, 2, 2212, 2213, 7, 86, 2, 2, 2213, 2214, 7, 85, 2, 2, 2214, 442, 3, 2, 2, 2, 2215, 2216, 7, 85, 2, 2, 2216, 2217, 7, 74, 2, 2, 2217, 2218, 7, 81, 2, 2, 2218, 2219, 7, 89, 2, 2, 2219, 444, 3, 2, 2, 2, 2220, 2221, 7, 85, 2, 2, 2221, 2222, 7, 77, 2, 2, 2222, 2223, 7, 71, 2, 2, 2223, 2224, 7, 89, 2, 2, 2224, 2225, 7, 71, 2, 2, 2225, 2226, 7, 70, 2, 2, 2226, 446, 3, 2, 2, 2, 2227, 2228, 7, 85, 2, 2, 2228, 2229, 7, 81, 2, 2, 2229, 2230, 7, 79, 2, 2, 2230, 2231, 7, 71, 2, 2, 2231, 448, 3, 2, 2, 2, 2232, 2233, 7, 85, 2, 2, 2233, 2234, 7, 81, 2, 2, 2234, 2235, 7, 84, 2, 2, 2235, 2236, 7, 86, 2, 2, 2236, 450, 3, 2, 2, 2, 2237, 2238, 7, 85, 2, 2, 2238, 2239, 7, 81, 2, 2, 2239, 2240, 7, 84, 2, 2, 2240, 2241, 7, 86, 2, 2, 2241, 2242, 7, 71, 2, 2, 2242, 2243, 7, 70, 2, 2, 2243, 452, 3, 2, 2, 2, 2244, 2245, 7, 85, 2, 2, 2245, 2246, 7, 86, 2, 2, 2246, 2247, 7, 67, 2, 2, 2247, 2248, 7, 84, 2, 2, 2248, 2249, 7, 86, 2, 2, 2249, 454, 3, 2, 2, 2, 2250, 2251, 7, 85, 2, 2, 2251, 2252, 7, 86, 2, 2, 2252, 2253, 7, 67, 2, 2, 2253, 2254, 7, 86, 2, 2, 2254, 2255, 7, 75, 2, 2, 2255, 2256, 7, 85, 2, 2, 2256, 2257, 7, 86, 2, 2, 2257, 2258, 7, 75, 2, 2, 2258, 2259, 7, 69, 2, 2, 2259, 2260, 7, 85, 2, 2, 2260, 456, 3, 2, 2, 2, 2261, 2262, 7, 85, 2, 2, 2262, 2263, 7, 86, 2, 2, 2263, 2264, 7, 81, 2, 2, 2264, 2265, 7, 84, 2, 2, 2265, 2266, 7, 71, 2, 2, 2266, 2267, 7, 70, 2, 2, 2267, 458, 3, 2, 2, 2, 2268, 2269, 7, 85, 2, 2, 2269, 2270, 7, 86, 2, 2, 2270, 2271, 7, 84, 2, 2, 2271, 2272, 7, 67, 2, 2, 2272, 2273, 7, 86, 2, 2, 2273, 2274, 7, 75, 2, 2, 2274, 2275, 7, 72, 2, 2, 2275, 2276, 7, 91, 2, 2, 2276, 460, 3, 2, 2, 2, 2277, 2278, 7, 85, 2, 2, 2278, 2279, 7, 86, 2, 2, 2279, 2280, 7, 84, 2, 2, 2280, 2281, 7, 87, 2, 2, 2281, 2282, 7, 69, 2, 2, 2282, 2283, 7, 86, 2, 2, 2283, 462, 3, 2, 2, 2, 2284, 2285, 7, 85, 2, 2, 2285, 2286, 7, 87, 2, 2, 2286, 2287, 7, 68, 2, 2, 2287, 2288, 7, 85, 2, 2, 2288, 2289, 7, 86, 2, 2, 2289, 2290, 7, 84, 2, 2, 2290, 464, 3, 2, 2, 2, 2291, 2292, 7, 85, 2, 2, 2292, 2293, 7, 87, 2, 2, 2293, 2294, 7, 68, 2, 2, 2294, 2295, 7, 85, 2, 2, 2295, 2296, 7, 86, 2, 2, 2296, 2297, 7, 84, 2, 2, 2297, 2298, 7, 75, 2, 2, 2298, 2299, 7, 80, 2, 2, 2299, 2300, 7, 73, 2, 2, 2300, 466, 3, 2, 2, 2, 2301, 2302, 7, 86, 2, 2, 2302, 2303, 7, 67, 2, 2, 2303, 2304, 7, 68, 2, 2, 2304, 2305, 7, 78, 2, 2, 2305, 2306, 7, 71, 2, 2, 2306, 468, 3, 2, 2, 2, 2307, 2308, 7, 86, 2, 2, 2308, 2309, 7, 67, 2, 2, 2309, 2310, 7, 68, 2, 2, 2310, 2311, 7, 78, 2, 2, 2311, 2312, 7, 71, 2, 2, 2312, 2313, 7, 85, 2, 2, 2313, 470, 3, 2, 2, 2, 2314, 2315, 7, 86, 2, 2, 2315, 2316, 7, 67, 2, 2, 2316, 2317, 7, 68, 2, 2, 2317, 2318, 7, 78, 2, 2, 2318, 2319, 7, 71, 2, 2, 2319, 2320, 7, 85, 2, 2, 2320, 2321, 7, 67, 2, 2, 2321, 2322, 7, 79, 2, 2, 2322, 2323, 7, 82, 2, 2, 2323, 2324, 7, 78, 2, 2, 2324, 2325, 7, 71, 2, 2, 2325, 472, 3, 2, 2, 2, 2326, 2327, 7, 86, 2, 2, 2327, 2328, 7, 68, 2, 2, 2328, 2329, 7, 78, 2, 2, 2329, 2330, 7, 82, 2, 2, 2330, 2331, 7, 84, 2, 2, 2331, 2332, 7, 81, 2, 2, 2332, 2333, 7, 82, 2, 2, 2333, 2334, 7, 71, 2, 2, 2334, 2335, 7, 84, 2, 2, 2335, 2336, 7, 86, 2, 2, 2336, 2337, 7, 75, 2, 2, 2337, 2338, 7, 71, 2, 2, 2338, 2339, 7, 85, 2, 2, 2339, 474, 3, 2, 2, 2, 2340, 2341, 7, 86, 2, 2, 2341, 2342, 7, 71, 2, 2, 2342, 2343, 7, 79, 2, 2, 2343, 2344, 7, 82, 2, 2, 2344, 2345, 7, 81, 2, 2, 2345, 2346, 7, 84, 2, 2, 2346, 2347, 7, 67, 2, 2, 2347, 2348, 7, 84, 2, 2, 2348, 2354, 7, 91, 2, 2, 2349, 2350, 7, 86, 2, 2, 2350, 2351, 7, 71, 2, 2, 2351, 2352, 7, 79, 2, 2, 2352, 2354, 7, 82, 2, 2, 2353, 2340, 3, 2, 2, 2, 2353, 2349, 3, 2, 2, 2, 2354, 476, 3, 2, 2, 2, 2355, 2356, 7, 86, 2, 2, 2356, 2357, 7, 71, 2, 2, 2357, 2358, 7, 84, 2, 2, 2358, 2359, 7, 79, 2, 2, 2359, 2360, 7, 75, 2, 2, 2360, 2361, 7, 80, 2, 2, 2361, 2362, 7, 67, 2, 2, 2362, 2363, 7, 86, 2, 2, 2363, 2364, 7, 71, 2, 2, 2364, 2365, 7, 70, 2, 2, 2365, 478, 3, 2, 2, 2, 2366, 2367, 7, 86, 2, 2, 2367, 2368, 7, 74, 2, 2, 2368, 2369, 7, 71, 2, 2, 2369, 2370, 7, 80, 2, 2, 2370, 480, 3, 2, 2, 2, 2371, 2372, 7, 86, 2, 2, 2372, 2373, 7, 81, 2, 2, 2373, 482, 3, 2, 2, 2, 2374, 2375, 7, 86, 2, 2, 2375, 2376, 7, 81, 2, 2, 2376, 2377, 7, 87, 2, 2, 2377, 2378, 7, 69, 2, 2, 2378, 2379, 7, 74, 2, 2, 2379, 484, 3, 2, 2, 2, 2380, 2381, 7, 86, 2, 2, 2381, 2382, 7, 84, 2, 2, 2382, 2383, 7, 67, 2, 2, 2383, 2384, 7, 75, 2, 2, 2384, 2385, 7, 78, 2, 2, 2385, 2386, 7, 75, 2, 2, 2386, 2387, 7, 80, 2, 2, 2387, 2388, 7, 73, 2, 2, 2388, 486, 3, 2, 2, 2, 2389, 2390, 7, 86, 2, 2, 2390, 2391, 7, 84, 2, 2, 2391, 2392, 7, 67, 2, 2, 2392, 2393, 7, 80, 2, 2, 2393, 2394, 7, 85, 2, 2, 2394, 2395, 7, 67, 2, 2, 2395, 2396, 7, 69, 2, 2, 2396, 2397, 7, 86, 2, 2, 2397, 2398, 7, 75, 2, 2, 2398, 2399, 7, 81, 2, 2, 2399, 2400, 7, 80, 2, 2, 2400, 488, 3, 2, 2, 2, 2401, 2402, 7, 86, 2, 2, 2402, 2403, 7, 84, 2, 2, 2403, 2404, 7, 67, 2, 2, 2404, 2405, 7, 80, 2, 2, 2405, 2406, 7, 85, 2, 2, 2406, 2407, 7, 67, 2, 2, 2407, 2408, 7, 69, 2, 2, 2408, 2409, 7, 86, 2, 2, 2409, 2410, 7, 75, 2, 2, 2410, 2411, 7, 81, 2, 2, 2411, 2412, 7, 80, 2, 2, 2412, 2413, 7, 85, 2, 2, 2413, 490, 3, 2, 2, 2, 2414, 2415, 7, 86, 2, 2, 2415, 2416, 7, 84, 2, 2, 2416, 2417, 7, 67, 2, 2, 2417, 2418, 7, 80, 2, 2, 2418, 2419, 7, 85, 2, 2, 2419, 2420, 7, 72, 2, 2, 2420, 2421, 7, 81, 2, 2, 2421, 2422, 7, 84, 2, 2, 2422, 2423, 7, 79, 2, 2, 2423, 492, 3, 2, 2, 2, 2424, 2425, 7, 86, 2, 2, 2425, 2426, 7, 84, 2, 2, 2426, 2427, 7, 75, 2, 2, 2427, 2428, 7, 79, 2, 2, 2428, 494, 3, 2, 2, 2, 2429, 2430, 7, 86, 2, 2, 2430, 2431, 7, 84, 2, 2, 2431, 2432, 7, 87, 2, 2, 2432, 2433, 7, 71, 2, 2, 2433, 496, 3, 2, 2, 2, 2434, 2435, 7, 86, 2, 2, 2435, 2436, 7, 84, 2, 2, 2436, 2437, 7, 87, 2, 2, 2437, 2438, 7, 80, 2, 2, 2438, 2439, 7, 69, 2, 2, 2439, 2440, 7, 67, 2, 2, 2440, 2441, 7, 86, 2, 2, 2441, 2442, 7, 71, 2, 2, 2442, 498, 3, 2, 2, 2, 2443, 2444, 7, 86, 2, 2, 2444, 2445, 7, 91, 2, 2, 2445, 2446, 7, 82, 2, 2, 2446, 2447, 7, 71, 2, 2, 2447, 500, 3, 2, 2, 2, 2448, 2449, 7, 87, 2, 2, 2449, 2450, 7, 80, 2, 2, 2450, 2451, 7, 67, 2, 2, 2451, 2452, 7, 84, 2, 2, 2452, 2453, 7, 69, 2, 2, 2453, 2454, 7, 74, 2, 2, 2454, 2455, 7, 75, 2, 2, 2455, 2456, 7, 88, 2, 2, 2456, 2457, 7, 71, 2, 2, 2457, 502, 3, 2, 2, 2, 2458, 2459, 7, 87, 2, 2, 2459, 2460, 7, 80, 2, 2, 2460, 2461, 7, 68, 2, 2, 2461, 2462, 7, 81, 2, 2, 2462, 2463, 7, 87, 2, 2, 2463, 2464, 7, 80, 2, 2, 2464, 2465, 7, 70, 2, 2, 2465, 2466, 7, 71, 2, 2, 2466, 2467, 7, 70, 2, 2, 2467, 504, 3, 2, 2, 2, 2468, 2469, 7, 87, 2, 2, 2469, 2470, 7, 80, 2, 2, 2470, 2471, 7, 69, 2, 2, 2471, 2472, 7, 67, 2, 2, 2472, 2473, 7, 69, 2, 2, 2473, 2474, 7, 74, 2, 2, 2474, 2475, 7, 71, 2, 2, 2475, 506, 3, 2, 2, 2, 2476, 2477, 7, 87, 2, 2, 2477, 2478, 7, 80, 2, 2, 2478, 2479, 7, 75, 2, 2, 2479, 2480, 7, 81, 2, 2, 2480, 2481, 7, 80, 2, 2, 2481, 508, 3, 2, 2, 2, 2482, 2483, 7, 87, 2, 2, 2483, 2484, 7, 80, 2, 2, 2484, 2485, 7, 75, 2, 2, 2485, 2486, 7, 83, 2, 2, 2486, 2487, 7, 87, 2, 2, 2487, 2488, 7, 71, 2, 2, 2488, 510, 3, 2, 2, 2, 2489, 2490, 7, 87, 2, 2, 2490, 2491, 7, 80, 2, 2, 2491, 2492, 7, 77, 2, 2, 2492, 2493, 7, 80, 2, 2, 2493, 2494, 7, 81, 2, 2, 2494, 2495, 7, 89, 2, 2, 2495, 2496, 7, 80, 2, 2, 2496, 512, 3, 2, 2, 2, 2497, 2498, 7, 87, 2, 2, 2498, 2499, 7, 80, 2, 2, 2499, 2500, 7, 78, 2, 2, 2500, 2501, 7, 81, 2, 2, 2501, 2502, 7, 69, 2, 2, 2502, 2503, 7, 77, 2, 2, 2503, 514, 3, 2, 2, 2, 2504, 2505, 7, 87, 2, 2, 2505, 2506, 7, 80, 2, 2, 2506, 2507, 7, 85, 2, 2, 2507, 2508, 7, 71, 2, 2, 2508, 2509, 7, 86, 2, 2, 2509, 516, 3, 2, 2, 2, 2510, 2511, 7, 87, 2, 2, 2511, 2512, 7, 82, 2, 2, 2512, 2513, 7, 70, 2, 2, 2513, 2514, 7, 67, 2, 2, 2514, 2515, 7, 86, 2, 2, 2515, 2516, 7, 71, 2, 2, 2516, 518, 3, 2, 2, 2, 2517, 2518, 7, 87, 2, 2, 2518, 2519, 7, 85, 2, 2, 2519, 2520, 7, 71, 2, 2, 2520, 520, 3, 2, 2, 2, 2521, 2522, 7, 87, 2, 2, 2522, 2523, 7, 85, 2, 2, 2523, 2524, 7, 71, 2, 2, 2524, 2525, 7, 84, 2, 2, 2525, 522, 3, 2, 2, 2, 2526, 2527, 7, 87, 2, 2, 2527, 2528, 7, 85, 2, 2, 2528, 2529, 7, 75, 2, 2, 2529, 2530, 7, 80, 2, 2, 2530, 2531, 7, 73, 2, 2, 2531, 524, 3, 2, 2, 2, 2532, 2533, 7, 88, 2, 2, 2533, 2534, 7, 67, 2, 2, 2534, 2535, 7, 78, 2, 2, 2535, 2536, 7, 87, 2, 2, 2536, 2537, 7, 71, 2, 2, 2537, 2538, 7, 85, 2, 2, 2538, 526, 3, 2, 2, 2, 2539, 2540, 7, 88, 2, 2, 2540, 2541, 7, 75, 2, 2, 2541, 2542, 7, 71, 2, 2, 2542, 2543, 7, 89, 2, 2, 2543, 528, 3, 2, 2, 2, 2544, 2545, 7, 89, 2, 2, 2545, 2546, 7, 71, 2, 2, 2546, 2547, 7, 71, 2, 2, 2547, 2548, 7, 77, 2, 2, 2548, 530, 3, 2, 2, 2, 2549, 2550, 7, 89, 2, 2, 2550, 2551, 7, 71, 2, 2, 2551, 2552, 7, 71, 2, 2, 2552, 2553, 7, 77, 2, 2, 2553, 2554, 7, 85, 2, 2, 2554, 532, 3, 2, 2, 2, 2555, 2556, 7, 89, 2, 2, 2556, 2557, 7, 74, 2, 2, 2557, 2558, 7, 71, 2, 2, 2558, 2559, 7, 80, 2, 2, 2559, 534, 3, 2, 2, 2, 2560, 2561, 7, 89, 2, 2, 2561, 2562, 7, 74, 2, 2, 2562, 2563, 7, 71, 2, 2, 2563, 2564, 7, 84, 2, 2, 2564, 2565, 7, 71, 2, 2, 2565, 536, 3, 2, 2, 2, 2566, 2567, 7, 89, 2, 2, 2567, 2568, 7, 75, 2, 2, 2568, 2569, 7, 80, 2, 2, 2569, 2570, 7, 70, 2, 2, 2570, 2571, 7, 81, 2, 2, 2571, 2572, 7, 89, 2, 2, 2572, 538, 3, 2, 2, 2, 2573, 2574, 7, 89, 2, 2, 2574, 2575, 7, 75, 2, 2, 2575, 2576, 7, 86, 2, 2, 2576, 2577, 7, 74, 2, 2, 2577, 540, 3, 2, 2, 2, 2578, 2579, 7, 91, 2, 2, 2579, 2580, 7, 71, 2, 2, 2580, 2581, 7, 67, 2, 2, 2581, 2582, 7, 84, 2, 2, 2582, 542, 3, 2, 2, 2, 2583, 2584, 7, 91, 2, 2, 2584, 2585, 7, 71, 2, 2, 2585, 2586, 7, 67, 2, 2, 2586, 2587, 7, 84, 2, 2, 2587, 2588, 7, 85, 2, 2, 2588, 544, 3, 2, 2, 2, 2589, 2593, 7, 63, 2, 2, 2590, 2591, 7, 63, 2, 2, 2591, 2593, 7, 63, 2, 2, 2592, 2589, 3, 2, 2, 2, 2592, 2590, 3, 2, 2, 2, 2593, 546, 3, 2, 2, 2, 2594, 2595, 7, 62, 2, 2, 2595, 2596, 7, 63, 2, 2, 2596, 2597, 7, 64, 2, 2, 2597, 548, 3, 2, 2, 2, 2598, 2599, 7, 62, 2, 2, 2599, 2600, 7, 64, 2, 2, 2600, 550, 3, 2, 2, 2, 2601, 2602, 7, 35, 2, 2, 2602, 2603, 7, 63, 2, 2, 2603, 552, 3, 2, 2, 2, 2604, 2605, 7, 62, 2, 2, 2605, 554, 3, 2, 2, 2, 2606, 2607, 7, 62, 2, 2, 2607, 2611, 7, 63, 2, 2, 2608, 2609, 7, 35, 2, 2, 2609, 2611, 7, 64, 2, 2, 2610, 2606, 3, 2, 2, 2, 2610, 2608, 3, 2, 2, 2, 2611, 556, 3, 2, 2, 2, 2612, 2613, 7, 64, 2, 2, 2613, 558, 3, 2, 2, 2, 2614, 2615, 7, 64, 2, 2, 2615, 2619, 7, 63, 2, 2, 2616, 2617, 7, 35, 2, 2, 2617, 2619, 7, 62, 2, 2, 2618, 2614, 3, 2, 2, 2, 2618, 2616, 3, 2, 2, 2, 2619, 560, 3, 2, 2, 2, 2620, 2621, 7, 45, 2, 2, 2621, 562, 3, 2, 2, 2, 2622, 2623, 7, 47, 2, 2, 2623, 564, 3, 2, 2, 2, 2624, 2625, 7, 44, 2, 2, 2625, 566, 3, 2, 2, 2, 2626, 2627, 7, 49, 2, 2, 2627, 568, 3, 2, 2, 2, 2628, 2629, 7, 39, 2, 2, 2629, 570, 3, 2, 2, 2, 2630, 2631, 7, 70, 2, 2, 2631, 2632, 7, 75, 2, 2, 2632, 2633, 7, 88, 2, 2, 2633, 572, 3, 2, 2, 2, 2634, 2635, 7, 128, 2, 2, 2635, 574, 3, 2, 2, 2, 2636, 2637, 7, 40, 2, 2, 2637, 576, 3, 2, 2, 2, 2638, 2639, 7, 126, 2, 2, 2639, 578, 3, 2, 2, 2, 2640, 2641, 7, 126, 2, 2, 2641, 2642, 7, 126, 2, 2, 2642, 580, 3, 2, 2, 2, 2643, 2644, 7, 96, 2, 2, 2644, 582, 3, 2, 2, 2, 2645, 2651, 7, 41, 2, 2, 2646, 2650, 10, 2, 2, 2, 2647, 2648, 7, 94, 2, 2, 2648, 2650, 11, 2, 2, 2, 2649, 2646, 3, 2, 2, 2, 2649, 2647, 3, 2, 2, 2, 2650, 2653, 3, 2, 2, 2, 2651, 2649, 3, 2, 2, 2, 2651, 2652, 3, 2, 2, 2, 2652, 2654, 3, 2, 2, 2, 2653, 2651, 3, 2, 2, 2, 2654, 2666, 7, 41, 2, 2, 2655, 2661, 7, 36, 2, 2, 2656, 2660, 10, 3, 2, 2, 2657, 2658, 7, 94, 2, 2, 2658, 2660, 11, 2, 2, 2, 2659, 2656, 3, 2, 2, 2, 2659, 2657, 3, 2, 2, 2, 2660, 2663, 3, 2, 2, 2, 2661, 2659, 3, 2, 2, 2, 2661, 2662, 3, 2, 2, 2, 2662, 2664, 3, 2, 2, 2, 2663, 2661, 3, 2, 2, 2, 2664, 2666, 7, 36, 2, 2, 2665, 2645, 3, 2, 2, 2, 2665, 2655, 3, 2, 2, 2, 2666, 584, 3, 2, 2, 2, 2667, 2669, 5, 607, 304, 2, 2668, 2667, 3, 2, 2, 2, 2669, 2670, 3, 2, 2, 2, 2670, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2672, 3, 2, 2, 2, 2672, 2673, 7, 78, 2, 2, 2673, 586, 3, 2, 2, 2, 2674, 2676, 5, 607, 304, 2, 2675, 2674, 3, 2, 2, 2, 2676, 2677, 3, 2, 2, 2, 2677, 2675, 3, 2, 2, 2, 2677, 2678, 3, 2, 2, 2, 2678, 2679, 3, 2, 2, 2, 2679, 2680, 7, 85, 2, 2, 2680, 588, 3, 2, 2, 2, 2681, 2683, 5, 607, 304, 2, 2682, 2681, 3, 2, 2, 2, 2683, 2684, 3, 2, 2, 2, 2684, 2682, 3, 2, 2, 2, 2684, 2685, 3, 2, 2, 2, 2685, 2686, 3, 2, 2, 2, 2686, 2687, 7, 91, 2, 2, 2687, 590, 3, 2, 2, 2, 2688, 2690, 5, 607, 304, 2, 2689, 2688, 3, 2, 2, 2, 2690, 2691, 3, 2, 2, 2, 2691, 2689, 3, 2, 2, 2, 2691, 2692, 3, 2, 2, 2, 2692, 592, 3, 2, 2, 2, 2693, 2695, 5, 607, 304, 2, 2694, 2693, 3, 2, 2, 2, 2695, 2696, 3, 2, 2, 2, 2696, 2694, 3, 2, 2, 2, 2696, 2697, 3, 2, 2, 2, 2697, 2698, 3, 2, 2, 2, 2698, 2699, 5, 605, 303, 2, 2699, 2707, 3, 2, 2, 2, 2700, 2702, 5, 603, 302, 2, 2701, 2703, 5, 605, 303, 2, 2702, 2701, 3, 2, 2, 2, 2702, 2703, 3, 2, 2, 2, 2703, 2704, 3, 2, 2, 2, 2704, 2705, 6, 297, 2, 2, 2705, 2707, 3, 2, 2, 2, 2706, 2694, 3, 2, 2, 2, 2706, 2700, 3, 2, 2, 2, 2707, 594, 3, 2, 2, 2, 2708, 2710, 5, 607, 304, 2, 2709, 2708, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2709, 3, 2, 2, 2, 2711, 2712, 3, 2, 2, 2, 2712, 2714, 3, 2, 2, 2, 2713, 2715, 5, 605, 303, 2, 2714, 2713, 3, 2, 2, 2, 2714, 2715, 3, 2, 2, 2, 2715, 2716, 3, 2, 2, 2, 2716, 2717, 7, 70, 2, 2, 2717, 2726, 3, 2, 2, 2, 2718, 2720, 5, 603, 302, 2, 2719, 2721, 5, 605, 303, 2, 2720, 2719, 3, 2, 2, 2, 2720, 2721, 3, 2, 2, 2, 2721, 2722, 3, 2, 2, 2, 2722, 2723, 7, 70, 2, 2, 2723, 2724, 6, 298, 3, 2, 2724, 2726, 3, 2, 2, 2, 2725, 2709, 3, 2, 2, 2, 2725, 2718, 3, 2, 2, 2, 2726, 596, 3, 2, 2, 2, 2727, 2729, 5, 607, 304, 2, 2728, 2727, 3, 2, 2, 2, 2729, 2730, 3, 2, 2, 2, 2730, 2728, 3, 2, 2, 2, 2730, 2731, 3, 2, 2, 2, 2731, 2733, 3, 2, 2, 2, 2732, 2734, 5, 605, 303, 2, 2733, 2732, 3, 2, 2, 2, 2733, 2734, 3, 2, 2, 2, 2734, 2735, 3, 2, 2, 2, 2735, 2736, 7, 68, 2, 2, 2736, 2737, 7, 70, 2, 2, 2737, 2748, 3, 2, 2, 2, 2738, 2740, 5, 603, 302, 2, 2739, 2741, 5, 605, 303, 2, 2740, 2739, 3, 2, 2, 2, 2740, 2741, 3, 2, 2, 2, 2741, 2742, 3, 2, 2, 2, 2742, 2743, 7, 68, 2, 2, 2743, 2744, 7, 70, 2, 2, 2744, 2745, 3, 2, 2, 2, 2745, 2746, 6, 299, 4, 2, 2746, 2748, 3, 2, 2, 2, 2747, 2728, 3, 2, 2, 2, 2747, 2738, 3, 2, 2, 2, 2748, 598, 3, 2, 2, 2, 2749, 2753, 5, 609, 305, 2, 2750, 2753, 5, 607, 304, 2, 2751, 2753, 7, 97, 2, 2, 2752, 2749, 3, 2, 2, 2, 2752, 2750, 3, 2, 2, 2, 2752, 2751, 3, 2, 2, 2, 2753, 2754, 3, 2, 2, 2, 2754, 2752, 3, 2, 2, 2, 2754, 2755, 3, 2, 2, 2, 2755, 600, 3, 2, 2, 2, 2756, 2762, 7, 98, 2, 2, 2757, 2761, 10, 4, 2, 2, 2758, 2759, 7, 98, 2, 2, 2759, 2761, 7, 98, 2, 2, 2760, 2757, 3, 2, 2, 2, 2760, 2758, 3, 2, 2, 2, 2761, 2764, 3, 2, 2, 2, 2762, 2760, 3, 2, 2, 2, 2762, 2763, 3, 2, 2, 2, 2763, 2765, 3, 2, 2, 2, 2764, 2762, 3, 2, 2, 2, 2765, 2766, 7, 98, 2, 2, 2766, 602, 3, 2, 2, 2, 2767, 2769, 5, 607, 304, 2, 2768, 2767, 3, 2, 2, 2, 2769, 2770, 3, 2, 2, 2, 2770, 2768, 3, 2, 2, 2, 2770, 2771, 3, 2, 2, 2, 2771, 2772, 3, 2, 2, 2, 2772, 2776, 7, 48, 2, 2, 2773, 2775, 5, 607, 304, 2, 2774, 2773, 3, 2, 2, 2, 2775, 2778, 3, 2, 2, 2, 2776, 2774, 3, 2, 2, 2, 2776, 2777, 3, 2, 2, 2, 2777, 2786, 3, 2, 2, 2, 2778, 2776, 3, 2, 2, 2, 2779, 2781, 7, 48, 2, 2, 2780, 2782, 5, 607, 304, 2, 2781, 2780, 3, 2, 2, 2, 2782, 2783, 3, 2, 2, 2, 2783, 2781, 3, 2, 2, 2, 2783, 2784, 3, 2, 2, 2, 2784, 2786, 3, 2, 2, 2, 2785, 2768, 3, 2, 2, 2, 2785, 2779, 3, 2, 2, 2, 2786, 604, 3, 2, 2, 2, 2787, 2789, 7, 71, 2, 2, 2788, 2790, 9, 5, 2, 2, 2789, 2788, 3, 2, 2, 2, 2789, 2790, 3, 2, 2, 2, 2790, 2792, 3, 2, 2, 2, 2791, 2793, 5, 607, 304, 2, 2792, 2791, 3, 2, 2, 2, 2793, 2794, 3, 2, 2, 2, 2794, 2792, 3, 2, 2, 2, 2794, 2795, 3, 2, 2, 2, 2795, 606, 3, 2, 2, 2, 2796, 2797, 9, 6, 2, 2, 2797, 608, 3, 2, 2, 2, 2798, 2799, 9, 7, 2, 2, 2799, 610, 3, 2, 2, 2, 2800, 2801, 7, 47, 2, 2, 2801, 2802, 7, 47, 2, 2, 2802, 2806, 3, 2, 2, 2, 2803, 2805, 10, 8, 2, 2, 2804, 2803, 3, 2, 2, 2, 2805, 2808, 3, 2, 2, 2, 2806, 2804, 3, 2, 2, 2, 2806, 2807, 3, 2, 2, 2, 2807, 2810, 3, 2, 2, 2, 2808, 2806, 3, 2, 2, 2, 2809, 2811, 7, 15, 2, 2, 2810, 2809, 3, 2, 2, 2, 2810, 2811, 3, 2, 2, 2, 2811, 2813, 3, 2, 2, 2, 2812, 2814, 7, 12, 2, 2, 2813, 2812, 3, 2, 2, 2, 2813, 2814, 3, 2, 2, 2, 2814, 2815, 3, 2, 2, 2, 2815, 2816, 8, 306, 2, 2, 2816, 612, 3, 2, 2, 2, 2817, 2818, 7, 49, 2, 2, 2818, 2819, 7, 44, 2, 2, 2819, 2820, 7, 44, 2, 2, 2820, 2821, 7, 49, 2, 2, 2821, 2822, 3, 2, 2, 2, 2822, 2823, 8, 307, 2, 2, 2823, 614, 3, 2, 2, 2, 2824, 2825, 7, 49, 2, 2, 2825, 2826, 7, 44, 2, 2, 2826, 2827, 3, 2, 2, 2, 2827, 2831, 10, 9, 2, 2, 2828, 2830, 11, 2, 2, 2, 2829, 2828, 3, 2, 2, 2, 2830, 2833, 3, 2, 2, 2, 2831, 2832, 3, 2, 2, 2, 2831, 2829, 3, 2, 2, 2, 2832, 2834, 3, 2, 2, 2, 2833, 2831, 3, 2, 2, 2, 2834, 2835, 7, 44, 2, 2, 2835, 2836, 7, 49, 2, 2, 2836, 2837, 3, 2, 2, 2, 2837, 2838, 8, 308, 2, 2, 2838, 616, 3, 2, 2, 2, 2839, 2841, 9, 10, 2, 2, 2840, 2839, 3, 2, 2, 2, 2841, 2842, 3, 2, 2, 2, 2842, 2840, 3, 2, 2, 2, 2842, 2843, 3, 2, 2, 2, 2843, 2844, 3, 2, 2, 2, 2844, 2845, 8, 309, 2, 2, 2845, 618, 3, 2, 2, 2, 2846, 2847, 11, 2, 2, 2, 2847, 620, 3, 2, 2, 2, 45, 2, 1042, 1740, 2083, 2353, 2592, 2610, 2618, 2649, 2651, 2659, 2661, 2665, 2670, 2677, 2684, 2691, 2696, 2702, 2706, 2711, 2714, 2720, 2725, 2730, 2733, 2740, 2747, 2752, 2754, 2760, 2762, 2770, 2776, 2783, 2785, 2789, 2794, 2806, 2810, 2813, 2831, 2842, 3, 2, 3, 2]
--------------------------------------------------------------------------------
/src/sparkSql/SqlBaseLexer.tokens:
--------------------------------------------------------------------------------
1 | T__0=1
2 | T__1=2
3 | T__2=3
4 | T__3=4
5 | T__4=5
6 | T__5=6
7 | T__6=7
8 | T__7=8
9 | T__8=9
10 | T__9=10
11 | ADD=11
12 | AFTER=12
13 | ALL=13
14 | ALTER=14
15 | ANALYZE=15
16 | AND=16
17 | ANTI=17
18 | ANY=18
19 | ARCHIVE=19
20 | ARRAY=20
21 | AS=21
22 | ASC=22
23 | AT=23
24 | AUTHORIZATION=24
25 | BETWEEN=25
26 | BOTH=26
27 | BUCKET=27
28 | BUCKETS=28
29 | BY=29
30 | CACHE=30
31 | CASCADE=31
32 | CASE=32
33 | CAST=33
34 | CHANGE=34
35 | CHECK=35
36 | CLEAR=36
37 | CLUSTER=37
38 | CLUSTERED=38
39 | CODEGEN=39
40 | COLLATE=40
41 | COLLECTION=41
42 | COLUMN=42
43 | COLUMNS=43
44 | COMMENT=44
45 | COMMIT=45
46 | COMPACT=46
47 | COMPACTIONS=47
48 | COMPUTE=48
49 | CONCATENATE=49
50 | CONSTRAINT=50
51 | COST=51
52 | CREATE=52
53 | CROSS=53
54 | CUBE=54
55 | CURRENT=55
56 | CURRENT_DATE=56
57 | CURRENT_TIME=57
58 | CURRENT_TIMESTAMP=58
59 | CURRENT_USER=59
60 | DATA=60
61 | DATABASE=61
62 | DATABASES=62
63 | DAY=63
64 | DAYS=64
65 | DBPROPERTIES=65
66 | DEFINED=66
67 | DELETE=67
68 | DELIMITED=68
69 | DESC=69
70 | DESCRIBE=70
71 | DFS=71
72 | DIRECTORIES=72
73 | DIRECTORY=73
74 | DISTINCT=74
75 | DISTRIBUTE=75
76 | DROP=76
77 | ELSE=77
78 | END=78
79 | ESCAPED=79
80 | EXCEPT=80
81 | EXCHANGE=81
82 | EXISTS=82
83 | EXPLAIN=83
84 | EXPORT=84
85 | EXTENDED=85
86 | EXTERNAL=86
87 | EXTRACT=87
88 | FALSE=88
89 | FETCH=89
90 | FIELDS=90
91 | FILEFORMAT=91
92 | FIRST=92
93 | FIRST_VALUE=93
94 | FOLLOWING=94
95 | FOR=95
96 | FOREIGN=96
97 | FORMAT=97
98 | FORMATTED=98
99 | FROM=99
100 | FULL=100
101 | FUNCTION=101
102 | FUNCTIONS=102
103 | GLOBAL=103
104 | GRANT=104
105 | GROUP=105
106 | GROUPING=106
107 | HAVING=107
108 | HOUR=108
109 | HOURS=109
110 | IF=110
111 | IGNORE=111
112 | IMPORT=112
113 | IN=113
114 | INDEX=114
115 | INDEXES=115
116 | INNER=116
117 | INPATH=117
118 | INPUTFORMAT=118
119 | INSERT=119
120 | INTERSECT=120
121 | INTERVAL=121
122 | INTO=122
123 | IS=123
124 | ITEMS=124
125 | JOIN=125
126 | KEYS=126
127 | LAST=127
128 | LAST_VALUE=128
129 | LATERAL=129
130 | LAZY=130
131 | LEADING=131
132 | LEFT=132
133 | LIKE=133
134 | LIMIT=134
135 | LINES=135
136 | LIST=136
137 | LOAD=137
138 | LOCAL=138
139 | LOCATION=139
140 | LOCK=140
141 | LOCKS=141
142 | LOGICAL=142
143 | MACRO=143
144 | MAP=144
145 | MICROSECOND=145
146 | MICROSECONDS=146
147 | MILLISECOND=147
148 | MILLISECONDS=148
149 | MINUTE=149
150 | MINUTES=150
151 | MONTH=151
152 | MONTHS=152
153 | MSCK=153
154 | NAMESPACE=154
155 | NAMESPACES=155
156 | NATURAL=156
157 | NO=157
158 | NOT=158
159 | NULL=159
160 | NULLS=160
161 | OF=161
162 | ON=162
163 | ONLY=163
164 | OPTION=164
165 | OPTIONS=165
166 | OR=166
167 | ORDER=167
168 | OUT=168
169 | OUTER=169
170 | OUTPUTFORMAT=170
171 | OVER=171
172 | OVERLAPS=172
173 | OVERLAY=173
174 | OVERWRITE=174
175 | PARTITION=175
176 | PARTITIONED=176
177 | PARTITIONS=177
178 | PERCENTLIT=178
179 | PIVOT=179
180 | PLACING=180
181 | POSITION=181
182 | PRECEDING=182
183 | PRIMARY=183
184 | PRINCIPALS=184
185 | PURGE=185
186 | QUERY=186
187 | RANGE=187
188 | RECORDREADER=188
189 | RECORDWRITER=189
190 | RECOVER=190
191 | REDUCE=191
192 | REFERENCES=192
193 | REFRESH=193
194 | RENAME=194
195 | REPAIR=195
196 | REPLACE=196
197 | RESET=197
198 | RESPECT=198
199 | RESTRICT=199
200 | REVOKE=200
201 | RIGHT=201
202 | RLIKE=202
203 | ROLE=203
204 | ROLES=204
205 | ROLLBACK=205
206 | ROLLUP=206
207 | ROW=207
208 | ROWS=208
209 | SCHEMA=209
210 | SECOND=210
211 | SECONDS=211
212 | SELECT=212
213 | SEMI=213
214 | SEPARATED=214
215 | SERDE=215
216 | SERDEPROPERTIES=216
217 | SESSION_USER=217
218 | SET=218
219 | SETMINUS=219
220 | SETS=220
221 | SHOW=221
222 | SKEWED=222
223 | SOME=223
224 | SORT=224
225 | SORTED=225
226 | START=226
227 | STATISTICS=227
228 | STORED=228
229 | STRATIFY=229
230 | STRUCT=230
231 | SUBSTR=231
232 | SUBSTRING=232
233 | TABLE=233
234 | TABLES=234
235 | TABLESAMPLE=235
236 | TBLPROPERTIES=236
237 | TEMPORARY=237
238 | TERMINATED=238
239 | THEN=239
240 | TO=240
241 | TOUCH=241
242 | TRAILING=242
243 | TRANSACTION=243
244 | TRANSACTIONS=244
245 | TRANSFORM=245
246 | TRIM=246
247 | TRUE=247
248 | TRUNCATE=248
249 | TYPE=249
250 | UNARCHIVE=250
251 | UNBOUNDED=251
252 | UNCACHE=252
253 | UNION=253
254 | UNIQUE=254
255 | UNKNOWN=255
256 | UNLOCK=256
257 | UNSET=257
258 | UPDATE=258
259 | USE=259
260 | USER=260
261 | USING=261
262 | VALUES=262
263 | VIEW=263
264 | WEEK=264
265 | WEEKS=265
266 | WHEN=266
267 | WHERE=267
268 | WINDOW=268
269 | WITH=269
270 | YEAR=270
271 | YEARS=271
272 | EQ=272
273 | NSEQ=273
274 | NEQ=274
275 | NEQJ=275
276 | LT=276
277 | LTE=277
278 | GT=278
279 | GTE=279
280 | PLUS=280
281 | MINUS=281
282 | ASTERISK=282
283 | SLASH=283
284 | PERCENT=284
285 | DIV=285
286 | TILDE=286
287 | AMPERSAND=287
288 | PIPE=288
289 | CONCAT_PIPE=289
290 | HAT=290
291 | STRING=291
292 | BIGINT_LITERAL=292
293 | SMALLINT_LITERAL=293
294 | TINYINT_LITERAL=294
295 | INTEGER_VALUE=295
296 | DECIMAL_VALUE=296
297 | DOUBLE_LITERAL=297
298 | BIGDECIMAL_LITERAL=298
299 | IDENTIFIER=299
300 | BACKQUOTED_IDENTIFIER=300
301 | SIMPLE_COMMENT=301
302 | BRACKETED_EMPTY_COMMENT=302
303 | BRACKETED_COMMENT=303
304 | WS=304
305 | UNRECOGNIZED=305
306 | '('=1
307 | ')'=2
308 | ','=3
309 | '.'=4
310 | '/*+'=5
311 | '*/'=6
312 | '->'=7
313 | '['=8
314 | ']'=9
315 | ':'=10
316 | 'ADD'=11
317 | 'AFTER'=12
318 | 'ALL'=13
319 | 'ALTER'=14
320 | 'ANALYZE'=15
321 | 'AND'=16
322 | 'ANTI'=17
323 | 'ANY'=18
324 | 'ARCHIVE'=19
325 | 'ARRAY'=20
326 | 'AS'=21
327 | 'ASC'=22
328 | 'AT'=23
329 | 'AUTHORIZATION'=24
330 | 'BETWEEN'=25
331 | 'BOTH'=26
332 | 'BUCKET'=27
333 | 'BUCKETS'=28
334 | 'BY'=29
335 | 'CACHE'=30
336 | 'CASCADE'=31
337 | 'CASE'=32
338 | 'CAST'=33
339 | 'CHANGE'=34
340 | 'CHECK'=35
341 | 'CLEAR'=36
342 | 'CLUSTER'=37
343 | 'CLUSTERED'=38
344 | 'CODEGEN'=39
345 | 'COLLATE'=40
346 | 'COLLECTION'=41
347 | 'COLUMN'=42
348 | 'COLUMNS'=43
349 | 'COMMENT'=44
350 | 'COMMIT'=45
351 | 'COMPACT'=46
352 | 'COMPACTIONS'=47
353 | 'COMPUTE'=48
354 | 'CONCATENATE'=49
355 | 'CONSTRAINT'=50
356 | 'COST'=51
357 | 'CREATE'=52
358 | 'CROSS'=53
359 | 'CUBE'=54
360 | 'CURRENT'=55
361 | 'CURRENT_DATE'=56
362 | 'CURRENT_TIME'=57
363 | 'CURRENT_TIMESTAMP'=58
364 | 'CURRENT_USER'=59
365 | 'DATA'=60
366 | 'DATABASE'=61
367 | 'DAY'=63
368 | 'DAYS'=64
369 | 'DBPROPERTIES'=65
370 | 'DEFINED'=66
371 | 'DELETE'=67
372 | 'DELIMITED'=68
373 | 'DESC'=69
374 | 'DESCRIBE'=70
375 | 'DFS'=71
376 | 'DIRECTORIES'=72
377 | 'DIRECTORY'=73
378 | 'DISTINCT'=74
379 | 'DISTRIBUTE'=75
380 | 'DROP'=76
381 | 'ELSE'=77
382 | 'END'=78
383 | 'ESCAPED'=79
384 | 'EXCEPT'=80
385 | 'EXCHANGE'=81
386 | 'EXISTS'=82
387 | 'EXPLAIN'=83
388 | 'EXPORT'=84
389 | 'EXTENDED'=85
390 | 'EXTERNAL'=86
391 | 'EXTRACT'=87
392 | 'FALSE'=88
393 | 'FETCH'=89
394 | 'FIELDS'=90
395 | 'FILEFORMAT'=91
396 | 'FIRST'=92
397 | 'FIRST_VALUE'=93
398 | 'FOLLOWING'=94
399 | 'FOR'=95
400 | 'FOREIGN'=96
401 | 'FORMAT'=97
402 | 'FORMATTED'=98
403 | 'FROM'=99
404 | 'FULL'=100
405 | 'FUNCTION'=101
406 | 'FUNCTIONS'=102
407 | 'GLOBAL'=103
408 | 'GRANT'=104
409 | 'GROUP'=105
410 | 'GROUPING'=106
411 | 'HAVING'=107
412 | 'HOUR'=108
413 | 'HOURS'=109
414 | 'IF'=110
415 | 'IGNORE'=111
416 | 'IMPORT'=112
417 | 'IN'=113
418 | 'INDEX'=114
419 | 'INDEXES'=115
420 | 'INNER'=116
421 | 'INPATH'=117
422 | 'INPUTFORMAT'=118
423 | 'INSERT'=119
424 | 'INTERSECT'=120
425 | 'INTERVAL'=121
426 | 'INTO'=122
427 | 'IS'=123
428 | 'ITEMS'=124
429 | 'JOIN'=125
430 | 'KEYS'=126
431 | 'LAST'=127
432 | 'LAST_VALUE'=128
433 | 'LATERAL'=129
434 | 'LAZY'=130
435 | 'LEADING'=131
436 | 'LEFT'=132
437 | 'LIKE'=133
438 | 'LIMIT'=134
439 | 'LINES'=135
440 | 'LIST'=136
441 | 'LOAD'=137
442 | 'LOCAL'=138
443 | 'LOCATION'=139
444 | 'LOCK'=140
445 | 'LOCKS'=141
446 | 'LOGICAL'=142
447 | 'MACRO'=143
448 | 'MAP'=144
449 | 'MICROSECOND'=145
450 | 'MICROSECONDS'=146
451 | 'MILLISECOND'=147
452 | 'MILLISECONDS'=148
453 | 'MINUTE'=149
454 | 'MINUTES'=150
455 | 'MONTH'=151
456 | 'MONTHS'=152
457 | 'MSCK'=153
458 | 'NAMESPACE'=154
459 | 'NAMESPACES'=155
460 | 'NATURAL'=156
461 | 'NO'=157
462 | 'NULL'=159
463 | 'NULLS'=160
464 | 'OF'=161
465 | 'ON'=162
466 | 'ONLY'=163
467 | 'OPTION'=164
468 | 'OPTIONS'=165
469 | 'OR'=166
470 | 'ORDER'=167
471 | 'OUT'=168
472 | 'OUTER'=169
473 | 'OUTPUTFORMAT'=170
474 | 'OVER'=171
475 | 'OVERLAPS'=172
476 | 'OVERLAY'=173
477 | 'OVERWRITE'=174
478 | 'PARTITION'=175
479 | 'PARTITIONED'=176
480 | 'PARTITIONS'=177
481 | 'PERCENT'=178
482 | 'PIVOT'=179
483 | 'PLACING'=180
484 | 'POSITION'=181
485 | 'PRECEDING'=182
486 | 'PRIMARY'=183
487 | 'PRINCIPALS'=184
488 | 'PURGE'=185
489 | 'QUERY'=186
490 | 'RANGE'=187
491 | 'RECORDREADER'=188
492 | 'RECORDWRITER'=189
493 | 'RECOVER'=190
494 | 'REDUCE'=191
495 | 'REFERENCES'=192
496 | 'REFRESH'=193
497 | 'RENAME'=194
498 | 'REPAIR'=195
499 | 'REPLACE'=196
500 | 'RESET'=197
501 | 'RESPECT'=198
502 | 'RESTRICT'=199
503 | 'REVOKE'=200
504 | 'RIGHT'=201
505 | 'ROLE'=203
506 | 'ROLES'=204
507 | 'ROLLBACK'=205
508 | 'ROLLUP'=206
509 | 'ROW'=207
510 | 'ROWS'=208
511 | 'SCHEMA'=209
512 | 'SECOND'=210
513 | 'SECONDS'=211
514 | 'SELECT'=212
515 | 'SEMI'=213
516 | 'SEPARATED'=214
517 | 'SERDE'=215
518 | 'SERDEPROPERTIES'=216
519 | 'SESSION_USER'=217
520 | 'SET'=218
521 | 'MINUS'=219
522 | 'SETS'=220
523 | 'SHOW'=221
524 | 'SKEWED'=222
525 | 'SOME'=223
526 | 'SORT'=224
527 | 'SORTED'=225
528 | 'START'=226
529 | 'STATISTICS'=227
530 | 'STORED'=228
531 | 'STRATIFY'=229
532 | 'STRUCT'=230
533 | 'SUBSTR'=231
534 | 'SUBSTRING'=232
535 | 'TABLE'=233
536 | 'TABLES'=234
537 | 'TABLESAMPLE'=235
538 | 'TBLPROPERTIES'=236
539 | 'TERMINATED'=238
540 | 'THEN'=239
541 | 'TO'=240
542 | 'TOUCH'=241
543 | 'TRAILING'=242
544 | 'TRANSACTION'=243
545 | 'TRANSACTIONS'=244
546 | 'TRANSFORM'=245
547 | 'TRIM'=246
548 | 'TRUE'=247
549 | 'TRUNCATE'=248
550 | 'TYPE'=249
551 | 'UNARCHIVE'=250
552 | 'UNBOUNDED'=251
553 | 'UNCACHE'=252
554 | 'UNION'=253
555 | 'UNIQUE'=254
556 | 'UNKNOWN'=255
557 | 'UNLOCK'=256
558 | 'UNSET'=257
559 | 'UPDATE'=258
560 | 'USE'=259
561 | 'USER'=260
562 | 'USING'=261
563 | 'VALUES'=262
564 | 'VIEW'=263
565 | 'WEEK'=264
566 | 'WEEKS'=265
567 | 'WHEN'=266
568 | 'WHERE'=267
569 | 'WINDOW'=268
570 | 'WITH'=269
571 | 'YEAR'=270
572 | 'YEARS'=271
573 | '<=>'=273
574 | '<>'=274
575 | '!='=275
576 | '<'=276
577 | '>'=278
578 | '+'=280
579 | '-'=281
580 | '*'=282
581 | '/'=283
582 | '%'=284
583 | 'DIV'=285
584 | '~'=286
585 | '&'=287
586 | '|'=288
587 | '||'=289
588 | '^'=290
589 | '/**/'=302
590 |
--------------------------------------------------------------------------------
/src/sparkSql/UpperCaseCharStream.js:
--------------------------------------------------------------------------------
1 | const UpperCaseCharStream = function (wrapped) {
2 | this.wrapped = wrapped
3 | }
4 |
5 | UpperCaseCharStream.prototype.consume = function () {
6 | this.wrapped.consume()
7 | }
8 | UpperCaseCharStream.prototype.getSourceName = function () {
9 | return this.wrapped.getSourceName
10 | }
11 |
12 | UpperCaseCharStream.prototype.index = function () {
13 | return this.wrapped.index
14 | }
15 |
16 | UpperCaseCharStream.prototype.mark = function () {
17 | return this.wrapped.mark
18 | }
19 |
20 | UpperCaseCharStream.prototype.release = function (marker) {
21 | return this.wrapped.release(marker)
22 | }
23 |
24 | UpperCaseCharStream.prototype.seek = function (where) {
25 | this.wrapped.seek(where)
26 | }
27 |
28 | UpperCaseCharStream.prototype.size = function () {
29 | return this.wrapped.size
30 | }
31 |
32 | UpperCaseCharStream.prototype.getText = function (interval) {
33 | if (this.size() > 0 && (interval.b - interval.a >= 0)) {
34 | return this.wrapped.getText(interval)
35 | } else {
36 | return ''
37 | }
38 | }
39 |
40 | /**
41 | * @return {number}
42 | */
43 | UpperCaseCharStream.prototype.LA = function (i) {
44 | const la = this.wrapped.LA(i)
45 | if (la >= 97 && la <= 122) {
46 | return la - 32
47 | } else {
48 | return la
49 | }
50 | }
51 |
52 | export {
53 | UpperCaseCharStream
54 | }
55 |
--------------------------------------------------------------------------------
/src/sparkSql/sparksql-lint.js:
--------------------------------------------------------------------------------
1 | import CodeMirror from 'codemirror'
2 |
3 | const antlr4 = require('antlr4')
4 | const SqlBaseLexer = require('./SqlBaseLexer.js').SqlBaseLexer
5 | const SqlBaseParser = require('./SqlBaseParser').SqlBaseParser
6 | const ParseErrorListener = require('./ParseErrorListener').ParseErrorListener
7 |
8 | CodeMirror.registerHelper('lint', 'sql', function (text, options) {
9 | const parserErrors = getAntlr4Errors(text)
10 | return parserErrors.map((err) => mapParseErrorToCodeMirrorError(err))
11 | })
12 |
13 | function getAntlr4Errors (input) {
14 | const stream = antlr4.CharStreams.fromString(input.toUpperCase())
15 | const lexer = new SqlBaseLexer(stream)
16 | lexer.removeErrorListeners()
17 | var listener = new ParseErrorListener()
18 | lexer.addErrorListener(listener)
19 | const tokens = new antlr4.CommonTokenStream(lexer)
20 | const parser = new SqlBaseParser(tokens)
21 | parser.removeErrorListeners()
22 | parser.addErrorListener(listener)
23 |
24 | parser.singleStatement()
25 |
26 | return listener.getErrors()
27 | }
28 |
29 | function mapParseErrorToCodeMirrorError (err) {
30 | return {
31 | from: CodeMirror.Pos(err.row, err.col),
32 | to: CodeMirror.Pos(err.row, err.col + 3),
33 | message: err.text,
34 | severity: 'error'
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/waltyou/spark-sql-online-editor/c8b049b2745b4252cc6021fce28b82f5bd69d2c8/static/.gitkeep
--------------------------------------------------------------------------------