Selaa lähdekoodia

ESQL: Remove OPTIONS clause in FROM command (#108692)

This remove the `OPTIONS` clause of the `FROM` command.
Bogdan Pintea 1 vuosi sitten
vanhempi
commit
3b21ec8818
36 muutettua tiedostoa jossa 1198 lisäystä ja 1865 poistoa
  1. 0 5
      docs/changelog/106636.yaml
  2. 0 52
      docs/reference/esql/esql-index-options.asciidoc
  3. 0 2
      docs/reference/esql/esql-language.asciidoc
  4. 1 13
      docs/reference/esql/source-commands/from.asciidoc
  5. 1 0
      server/src/main/java/org/elasticsearch/TransportVersions.java
  6. 1 1
      x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java
  7. 0 46
      x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClustersIT.java
  8. 0 80
      x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/RestEsqlTestCase.java
  9. 0 20
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/from.csv-spec
  10. 0 1
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4
  11. 50 52
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens
  12. 1 9
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4
  13. 50 52
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens
  14. 1 1
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java
  15. 4 11
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/PreAnalyzer.java
  16. 30 7
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java
  17. 0 3
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp
  18. 811 818
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java
  19. 0 4
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp
  20. 181 194
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java
  21. 0 24
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java
  22. 0 14
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java
  23. 0 20
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java
  24. 0 12
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java
  25. 1 16
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java
  26. 6 18
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/EsRelation.java
  27. 4 27
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/EsqlUnresolvedRelation.java
  28. 0 7
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/PlannerUtils.java
  29. 37 48
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java
  30. 1 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlFeatures.java
  31. 5 10
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlIndexResolver.java
  32. 3 7
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java
  33. 3 35
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypesTests.java
  34. 1 103
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java
  35. 0 135
      x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/options/EsSourceOptions.java
  36. 6 18
      x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/plan/logical/EsRelation.java

+ 0 - 5
docs/changelog/106636.yaml

@@ -1,5 +0,0 @@
-pr: 106636
-summary: "ESQL: Add OPTIONS clause to FROM command"
-area: ES|QL
-type: enhancement
-issues: []

+ 0 - 52
docs/reference/esql/esql-index-options.asciidoc

@@ -1,52 +0,0 @@
-[[esql-index-options]]
-=== {esql} index options
-
-++++
-<titleabbrev>Index options</titleabbrev>
-++++
-
-The `OPTIONS` directive of the <<esql-from,FROM>> command allows configuring
-the way {esql} accesses the data to be queried. The argument passed to this
-directive is a comma-separated list of option name-value pairs, with the option
-name and the corresponding value double-quoted.
-
-[source,esql]
-----
-FROM index_pattern [OPTIONS "option1"="value1"[,...[,"optionN"="valueN"]]]
-----
-
-These options can only be provided as part of a <<esql-from,FROM>> command,
-and they apply to all the indices provided or matched by an index pattern.
-
-The option names and their values are the same as used by the
-<<search-search-api-query-params,Search API>>, however note that the default
-values may differ.
-
-The currently supported options are:
-
-include::{es-ref-dir}/rest-api/common-parms.asciidoc[tag=allow-no-indices]
-+
-Defaults to `true`.
-
-// unlike "allow-no-indices", "index-ignore-unavailable" includes a default
-// in common-parms.asciidoc, which is different from QL's -- we need to
-// provide the full text here.
-`ignore_unavailable`::
-(Optional, Boolean) If `false`, the request returns an error if it targets a
-missing or closed index.
-+
-Defaults to `true`.
-
-include::{es-ref-dir}/search/search.asciidoc[tag=search-preference]
-
-*Examples*
-
-[source.merge.styled,esql]
-----
-include::{esql-specs}/from.csv-spec[tag=convertFromDatetimeWithOptions]
-----
-[%header.monospaced.styled,format=dsv,separator=|]
-|===
-include::{esql-specs}/from.csv-spec[tag=convertFromDatetimeWithOptions-result]
-|===
-

+ 0 - 2
docs/reference/esql/esql-language.asciidoc

@@ -10,7 +10,6 @@ Detailed reference documentation for the {esql} language:
 * <<esql-commands>>
 * <<esql-functions>>
 * <<esql-metadata-fields>>
-* <<esql-index-options>>
 * <<esql-multivalued-fields>>
 * <<esql-enrich-data>>
 * <<esql-process-data-with-dissect-and-grok>>
@@ -20,7 +19,6 @@ include::esql-syntax.asciidoc[]
 include::esql-commands.asciidoc[]
 include::esql-functions-operators.asciidoc[]
 include::metadata-fields.asciidoc[]
-include::esql-index-options.asciidoc[]
 include::multivalued-fields.asciidoc[]
 include::esql-process-data-with-dissect-grok.asciidoc[]
 include::esql-enrich-data.asciidoc[]

+ 1 - 13
docs/reference/esql/source-commands/from.asciidoc

@@ -6,7 +6,7 @@
 
 [source,esql]
 ----
-FROM index_pattern [METADATA fields] [OPTIONS options]
+FROM index_pattern [METADATA fields]
 ----
 
 *Parameters*
@@ -17,10 +17,6 @@ A list of indices, data streams or aliases. Supports wildcards and date math.
 `fields`::
 A comma-separated list of <<esql-metadata-fields,metadata fields>> to retrieve.
 
-`options`::
-A comma-separated list of <<esql-index-options,index options>> to configure
-data access.
-
 *Description*
 
 The `FROM` source command returns a table with data from a data stream, index,
@@ -86,11 +82,3 @@ Use the optional `METADATA` directive to enable <<esql-metadata-fields,metadata
 ----
 FROM employees METADATA _id
 ----
-
-Use the optional `OPTIONS` directive to specify <<esql-index-options,index access options>>.
-This directive must follow `METADATA`, if both are specified:
-
-[source,esql]
-----
-FROM employees* METADATA _index OPTIONS "ignore_unavailable"="true"
-----

+ 1 - 0
server/src/main/java/org/elasticsearch/TransportVersions.java

@@ -167,6 +167,7 @@ public class TransportVersions {
     public static final TransportVersion FAILURE_STORE_FIELD_PARITY = def(8_658_00_0);
     public static final TransportVersion ML_INFERENCE_AZURE_AI_STUDIO = def(8_659_00_0);
     public static final TransportVersion ML_INFERENCE_COHERE_COMPLETION_ADDED = def(8_660_00_0);
+    public static final TransportVersion ESQL_REMOVE_ES_SOURCE_OPTIONS = def(8_661_00_0);
 
     /*
      * STOP! READ THIS FIRST! No, really,

+ 1 - 1
x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java

@@ -196,7 +196,7 @@ public class MultiClusterSpecIT extends EsqlSpecTestCase {
         String first = commands[0].trim();
 
         if (commands[0].toLowerCase(Locale.ROOT).startsWith("from")) {
-            String[] parts = commands[0].split("(?i)(metadata|options)");
+            String[] parts = commands[0].split("(?i)metadata");
             assert parts.length >= 1 : parts;
             String fromStatement = parts[0];
 

+ 0 - 46
x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClustersIT.java

@@ -29,7 +29,6 @@ import org.junit.rules.TestRule;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
@@ -157,34 +156,6 @@ public class MultiClustersIT extends ESRestTestCase {
         }
     }
 
-    public void testCountWithOptions() throws Exception {
-        assumeTrue("remote cluster requires FROM OPTIONS support", remoteFeaturesService().clusterHasFeature("esql.from_options"));
-        {
-            Map<String, Object> result = run(
-                "FROM test-local-index,*:test-remote-index,doesnotexist "
-                    + "OPTIONS \"ignore_unavailable\"=\"true\",\"preference\"=\"_local\" | STATS c = COUNT(*)"
-            );
-            var columns = List.of(Map.of("name", "c", "type", "long"));
-            var values = List.of(List.of(localDocs.size() + remoteDocs.size()));
-            assertMap(result, matchesMap().entry("columns", columns).entry("values", values));
-        }
-        {
-            Map<String, Object> result = run(
-                "FROM *:test-remote-index,doesnotexit OPTIONS \"ignore_unavailable\"=\"true\",\"preference\"=\"_local\" "
-                    + "| STATS c = COUNT(*)"
-            );
-            var columns = List.of(Map.of("name", "c", "type", "long"));
-            var values = List.of(List.of(remoteDocs.size()));
-            assertMap(result, matchesMap().entry("columns", columns).entry("values", values));
-        }
-        {
-            Map<String, Object> result = run("FROM *:test-remote-index OPTIONS \"preference\"=\"_shards:999\" | STATS c = COUNT(*)");
-            var columns = List.of(Map.of("name", "c", "type", "long"));
-            var values = List.of(List.of(0)); // shard with id 999 above (non-existent) yields count 0
-            assertMap(result, matchesMap().entry("columns", columns).entry("values", values));
-        }
-    }
-
     public void testUngroupedAggs() throws Exception {
         {
             Map<String, Object> result = run("FROM test-local-index,*:test-remote-index | STATS total = SUM(data)");
@@ -233,21 +204,4 @@ public class MultiClustersIT extends ESRestTestCase {
         var clusterHosts = parseClusterHosts(remoteCluster.getHttpAddresses());
         return buildClient(restClientSettings(), clusterHosts.toArray(new HttpHost[0]));
     }
-
-    private TestFeatureService remoteFeaturesService() throws IOException {
-        if (remoteFeaturesService == null) {
-            try (var remoteFeaturesServiceClient = remoteClusterClient()) {
-                var remoteNodeVersions = readVersionsFromNodesInfo(remoteFeaturesServiceClient);
-                var semanticNodeVersions = remoteNodeVersions.stream()
-                    .map(ESRestTestCase::parseLegacyVersion)
-                    .flatMap(Optional::stream)
-                    .collect(Collectors.toSet());
-                remoteFeaturesService = createTestFeatureService(
-                    getClusterStateFeatures(remoteFeaturesServiceClient),
-                    semanticNodeVersions
-                );
-            }
-        }
-        return remoteFeaturesService;
-    }
 }

+ 0 - 80
x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/RestEsqlTestCase.java

@@ -16,12 +16,10 @@ import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.Response;
 import org.elasticsearch.client.ResponseException;
 import org.elasticsearch.client.WarningsHandler;
-import org.elasticsearch.common.Strings;
 import org.elasticsearch.common.bytes.BytesArray;
 import org.elasticsearch.common.io.Streams;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.xcontent.XContentHelper;
-import org.elasticsearch.core.CheckedFunction;
 import org.elasticsearch.core.Nullable;
 import org.elasticsearch.core.TimeValue;
 import org.elasticsearch.logging.LogManager;
@@ -223,84 +221,6 @@ public abstract class RestEsqlTestCase extends ESRestTestCase {
         assertThat(e.getMessage(), containsString("Unknown index [doesNotExist]"));
     }
 
-    public void testUseKnownIndexWithUnknownIndex() throws IOException {
-        // to ignore a concrete non-existent index, we need to opt in (which is not the default)
-        useKnownIndexWithOther("noSuchIndex", "ignore_unavailable");
-    }
-
-    public void testUseKnownIndexWithUnknownPattern() throws IOException {
-        // to not ignore a non-existing index, we need to opt in (which is the default)
-        useKnownIndexWithOther("noSuchPattern*", "allow_no_indices");
-    }
-
-    private void useKnownIndexWithOther(String other, String option) throws IOException {
-        final int count = randomIntBetween(1, 10);
-        bulkLoadTestData(count);
-
-        CheckedFunction<Boolean, RequestObjectBuilder, IOException> builder = o -> {
-            String q = fromIndex() + ',' + other;
-            q += " OPTIONS \"" + option + "\"=\"" + o + "\"";
-            q += " | KEEP keyword, integer | SORT integer asc | LIMIT 10";
-            return requestObjectBuilder().query(q);
-        };
-
-        // test failure
-        ResponseException e = expectThrows(ResponseException.class, () -> runEsql(builder.apply(false)));
-        assertEquals(404, e.getResponse().getStatusLine().getStatusCode());
-        assertThat(e.getMessage(), containsString("no such index [" + other + "]"));
-
-        // test success
-        assertEquals(expectedTextBody("txt", count, null), runEsqlAsTextWithFormat(builder.apply(true), "txt", null));
-    }
-
-    // https://github.com/elastic/elasticsearch/issues/106805
-    public void testUseUnknownIndexOnly() {
-        useUnknownIndex("ignore_unavailable");
-        useUnknownIndex("allow_no_indices");
-    }
-
-    private void useUnknownIndex(String option) {
-        CheckedFunction<Boolean, RequestObjectBuilder, IOException> builder = o -> {
-            String q = "FROM doesnotexist OPTIONS \"" + option + "\"=\"" + o + "\"";
-            q += " | KEEP keyword, integer | SORT integer asc | LIMIT 10";
-            return requestObjectBuilder().query(q);
-        };
-
-        // test failure 404 from resolver
-        ResponseException e = expectThrows(ResponseException.class, () -> runEsql(builder.apply(false)));
-        assertEquals(404, e.getResponse().getStatusLine().getStatusCode());
-        assertThat(e.getMessage(), containsString("index_not_found_exception"));
-        assertThat(e.getMessage(), containsString("no such index [doesnotexist]"));
-
-        // test failure 400 from verifier
-        e = expectThrows(ResponseException.class, () -> runEsql(builder.apply(true)));
-        assertEquals(400, e.getResponse().getStatusLine().getStatusCode());
-        assertThat(e.getMessage(), containsString("verification_exception"));
-        assertThat(e.getMessage(), containsString("Unknown index [doesnotexist]"));
-
-    }
-
-    public void testSearchPreference() throws IOException {
-        final int count = randomIntBetween(1, 10);
-        bulkLoadTestData(count);
-
-        CheckedFunction<String, RequestObjectBuilder, IOException> builder = o -> {
-            String q = fromIndex();
-            if (Strings.hasText(o)) {
-                q += " OPTIONS " + o;
-            }
-            q += " | KEEP keyword, integer | SORT integer asc | LIMIT 10";
-            return requestObjectBuilder().query(q);
-        };
-
-        // verify that it returns as expected
-        assertEquals(expectedTextBody("txt", count, null), runEsqlAsTextWithFormat(builder.apply(null), "txt", null));
-
-        // returns nothing (0 for count), given the non-existing shard as preference
-        String option = "\"preference\"=\"_shards:666\"";
-        assertEquals(expectedTextBody("txt", 0, null), runEsqlAsTextWithFormat(builder.apply(option), "txt", null));
-    }
-
     public void testNullInAggs() throws IOException {
         StringBuilder b = new StringBuilder();
         for (int i = 0; i < 1000; i++) {

+ 0 - 20
x-pack/plugin/esql/qa/testFixtures/src/main/resources/from.csv-spec

@@ -128,23 +128,3 @@ c:l | name:k
 1   | ddddd
 1   | eeeee
 ;
-
-convertFromDatetimeWithOptions
-required_capability: from_options
-
-// tag::convertFromDatetimeWithOptions[]
-  FROM employees OPTIONS "allow_no_indices"="false","preference"="_local"
-| SORT emp_no
-| EVAL hire_double = to_double(hire_date)
-| KEEP emp_no, hire_date, hire_double
-| LIMIT 3
-// end::convertFromDatetimeWithOptions[]
-;
-
-// tag::convertFromDatetimeWithOptions-result[]
-emp_no:integer |hire_date:date          |hire_double:double
-10001          |1986-06-26T00:00:00.000Z|5.20128E11
-10002          |1985-11-21T00:00:00.000Z|5.013792E11
-10003          |1986-08-28T00:00:00.000Z|5.255712E11
-// end::convertFromDatetimeWithOptions-result[]
-;

+ 0 - 1
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4

@@ -200,7 +200,6 @@ FROM_COMMA : COMMA -> type(COMMA);
 FROM_ASSIGN : ASSIGN -> type(ASSIGN);
 FROM_QUOTED_STRING : QUOTED_STRING -> type(QUOTED_STRING);
 
-OPTIONS : 'options';
 METADATA : 'metadata';
 
 FROM_INDEX_UNQUOTED_IDENTIFIER

+ 50 - 52
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens

@@ -71,50 +71,49 @@ QUOTED_IDENTIFIER=70
 EXPR_LINE_COMMENT=71
 EXPR_MULTILINE_COMMENT=72
 EXPR_WS=73
-OPTIONS=74
-METADATA=75
-FROM_LINE_COMMENT=76
-FROM_MULTILINE_COMMENT=77
-FROM_WS=78
-ID_PATTERN=79
-PROJECT_LINE_COMMENT=80
-PROJECT_MULTILINE_COMMENT=81
-PROJECT_WS=82
-AS=83
-RENAME_LINE_COMMENT=84
-RENAME_MULTILINE_COMMENT=85
-RENAME_WS=86
-ON=87
-WITH=88
-ENRICH_POLICY_NAME=89
-ENRICH_LINE_COMMENT=90
-ENRICH_MULTILINE_COMMENT=91
-ENRICH_WS=92
-ENRICH_FIELD_LINE_COMMENT=93
-ENRICH_FIELD_MULTILINE_COMMENT=94
-ENRICH_FIELD_WS=95
-MVEXPAND_LINE_COMMENT=96
-MVEXPAND_MULTILINE_COMMENT=97
-MVEXPAND_WS=98
-INFO=99
-SHOW_LINE_COMMENT=100
-SHOW_MULTILINE_COMMENT=101
-SHOW_WS=102
-FUNCTIONS=103
-META_LINE_COMMENT=104
-META_MULTILINE_COMMENT=105
-META_WS=106
-COLON=107
-SETTING=108
-SETTING_LINE_COMMENT=109
-SETTTING_MULTILINE_COMMENT=110
-SETTING_WS=111
-METRICS_LINE_COMMENT=112
-METRICS_MULTILINE_COMMENT=113
-METRICS_WS=114
-CLOSING_METRICS_LINE_COMMENT=115
-CLOSING_METRICS_MULTILINE_COMMENT=116
-CLOSING_METRICS_WS=117
+METADATA=74
+FROM_LINE_COMMENT=75
+FROM_MULTILINE_COMMENT=76
+FROM_WS=77
+ID_PATTERN=78
+PROJECT_LINE_COMMENT=79
+PROJECT_MULTILINE_COMMENT=80
+PROJECT_WS=81
+AS=82
+RENAME_LINE_COMMENT=83
+RENAME_MULTILINE_COMMENT=84
+RENAME_WS=85
+ON=86
+WITH=87
+ENRICH_POLICY_NAME=88
+ENRICH_LINE_COMMENT=89
+ENRICH_MULTILINE_COMMENT=90
+ENRICH_WS=91
+ENRICH_FIELD_LINE_COMMENT=92
+ENRICH_FIELD_MULTILINE_COMMENT=93
+ENRICH_FIELD_WS=94
+MVEXPAND_LINE_COMMENT=95
+MVEXPAND_MULTILINE_COMMENT=96
+MVEXPAND_WS=97
+INFO=98
+SHOW_LINE_COMMENT=99
+SHOW_MULTILINE_COMMENT=100
+SHOW_WS=101
+FUNCTIONS=102
+META_LINE_COMMENT=103
+META_MULTILINE_COMMENT=104
+META_WS=105
+COLON=106
+SETTING=107
+SETTING_LINE_COMMENT=108
+SETTTING_MULTILINE_COMMENT=109
+SETTING_WS=110
+METRICS_LINE_COMMENT=111
+METRICS_MULTILINE_COMMENT=112
+METRICS_WS=113
+CLOSING_METRICS_LINE_COMMENT=114
+CLOSING_METRICS_MULTILINE_COMMENT=115
+CLOSING_METRICS_WS=116
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -171,11 +170,10 @@ CLOSING_METRICS_WS=117
 '/'=65
 '%'=66
 ']'=68
-'options'=74
-'metadata'=75
-'as'=83
-'on'=87
-'with'=88
-'info'=99
-'functions'=103
-':'=107
+'metadata'=74
+'as'=82
+'on'=86
+'with'=87
+'info'=98
+'functions'=102
+':'=106

+ 1 - 9
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

@@ -105,21 +105,13 @@ field
     ;
 
 fromCommand
-    : FROM indexIdentifier (COMMA indexIdentifier)* metadata? fromOptions?
+    : FROM indexIdentifier (COMMA indexIdentifier)* metadata?
     ;
 
 indexIdentifier
     : INDEX_UNQUOTED_IDENTIFIER
     ;
 
-fromOptions
-    : OPTIONS configOption (COMMA configOption)*
-    ;
-
-configOption
-    : string ASSIGN string
-    ;
-
 metadata
     : metadataOption
     | deprecated_metadata

+ 50 - 52
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens

@@ -71,50 +71,49 @@ QUOTED_IDENTIFIER=70
 EXPR_LINE_COMMENT=71
 EXPR_MULTILINE_COMMENT=72
 EXPR_WS=73
-OPTIONS=74
-METADATA=75
-FROM_LINE_COMMENT=76
-FROM_MULTILINE_COMMENT=77
-FROM_WS=78
-ID_PATTERN=79
-PROJECT_LINE_COMMENT=80
-PROJECT_MULTILINE_COMMENT=81
-PROJECT_WS=82
-AS=83
-RENAME_LINE_COMMENT=84
-RENAME_MULTILINE_COMMENT=85
-RENAME_WS=86
-ON=87
-WITH=88
-ENRICH_POLICY_NAME=89
-ENRICH_LINE_COMMENT=90
-ENRICH_MULTILINE_COMMENT=91
-ENRICH_WS=92
-ENRICH_FIELD_LINE_COMMENT=93
-ENRICH_FIELD_MULTILINE_COMMENT=94
-ENRICH_FIELD_WS=95
-MVEXPAND_LINE_COMMENT=96
-MVEXPAND_MULTILINE_COMMENT=97
-MVEXPAND_WS=98
-INFO=99
-SHOW_LINE_COMMENT=100
-SHOW_MULTILINE_COMMENT=101
-SHOW_WS=102
-FUNCTIONS=103
-META_LINE_COMMENT=104
-META_MULTILINE_COMMENT=105
-META_WS=106
-COLON=107
-SETTING=108
-SETTING_LINE_COMMENT=109
-SETTTING_MULTILINE_COMMENT=110
-SETTING_WS=111
-METRICS_LINE_COMMENT=112
-METRICS_MULTILINE_COMMENT=113
-METRICS_WS=114
-CLOSING_METRICS_LINE_COMMENT=115
-CLOSING_METRICS_MULTILINE_COMMENT=116
-CLOSING_METRICS_WS=117
+METADATA=74
+FROM_LINE_COMMENT=75
+FROM_MULTILINE_COMMENT=76
+FROM_WS=77
+ID_PATTERN=78
+PROJECT_LINE_COMMENT=79
+PROJECT_MULTILINE_COMMENT=80
+PROJECT_WS=81
+AS=82
+RENAME_LINE_COMMENT=83
+RENAME_MULTILINE_COMMENT=84
+RENAME_WS=85
+ON=86
+WITH=87
+ENRICH_POLICY_NAME=88
+ENRICH_LINE_COMMENT=89
+ENRICH_MULTILINE_COMMENT=90
+ENRICH_WS=91
+ENRICH_FIELD_LINE_COMMENT=92
+ENRICH_FIELD_MULTILINE_COMMENT=93
+ENRICH_FIELD_WS=94
+MVEXPAND_LINE_COMMENT=95
+MVEXPAND_MULTILINE_COMMENT=96
+MVEXPAND_WS=97
+INFO=98
+SHOW_LINE_COMMENT=99
+SHOW_MULTILINE_COMMENT=100
+SHOW_WS=101
+FUNCTIONS=102
+META_LINE_COMMENT=103
+META_MULTILINE_COMMENT=104
+META_WS=105
+COLON=106
+SETTING=107
+SETTING_LINE_COMMENT=108
+SETTTING_MULTILINE_COMMENT=109
+SETTING_WS=110
+METRICS_LINE_COMMENT=111
+METRICS_MULTILINE_COMMENT=112
+METRICS_WS=113
+CLOSING_METRICS_LINE_COMMENT=114
+CLOSING_METRICS_MULTILINE_COMMENT=115
+CLOSING_METRICS_WS=116
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -171,11 +170,10 @@ CLOSING_METRICS_WS=117
 '/'=65
 '%'=66
 ']'=68
-'options'=74
-'metadata'=75
-'as'=83
-'on'=87
-'with'=88
-'info'=99
-'functions'=103
-':'=107
+'metadata'=74
+'as'=82
+'on'=86
+'with'=87
+'info'=98
+'functions'=102
+':'=106

+ 1 - 1
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java

@@ -178,7 +178,7 @@ public class Analyzer extends ParameterizedRuleExecutor<LogicalPlan, AnalyzerCon
             EsIndex esIndex = context.indexResolution().get();
             var attributes = mappingAsAttributes(plan.source(), esIndex.mapping());
             attributes.addAll(plan.metadataFields());
-            return new EsRelation(plan.source(), esIndex, attributes.isEmpty() ? NO_FIELDS : attributes, plan.esSourceOptions());
+            return new EsRelation(plan.source(), esIndex, attributes.isEmpty() ? NO_FIELDS : attributes);
         }
 
     }

+ 4 - 11
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/PreAnalyzer.java

@@ -10,7 +10,6 @@ package org.elasticsearch.xpack.esql.analysis;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
 import org.elasticsearch.xpack.esql.plan.logical.EsqlUnresolvedRelation;
 import org.elasticsearch.xpack.ql.analyzer.TableInfo;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.plan.logical.LogicalPlan;
 
 import java.util.ArrayList;
@@ -21,15 +20,13 @@ import static java.util.Collections.emptyList;
 public class PreAnalyzer {
 
     public static class PreAnalysis {
-        public static final PreAnalysis EMPTY = new PreAnalysis(emptyList(), emptyList(), emptyList());
+        public static final PreAnalysis EMPTY = new PreAnalysis(emptyList(), emptyList());
 
         public final List<TableInfo> indices;
-        public final List<EsSourceOptions> esSourceOptions;
         public final List<Enrich> enriches;
 
-        public PreAnalysis(List<TableInfo> indices, List<EsSourceOptions> esSourceOptions, List<Enrich> enriches) {
+        public PreAnalysis(List<TableInfo> indices, List<Enrich> enriches) {
             this.indices = indices;
-            this.esSourceOptions = esSourceOptions;
             this.enriches = enriches;
         }
     }
@@ -44,18 +41,14 @@ public class PreAnalyzer {
 
     protected PreAnalysis doPreAnalyze(LogicalPlan plan) {
         List<TableInfo> indices = new ArrayList<>();
-        List<EsSourceOptions> esSourceOptions = new ArrayList<>();
         List<Enrich> unresolvedEnriches = new ArrayList<>();
 
-        plan.forEachUp(EsqlUnresolvedRelation.class, p -> {
-            indices.add(new TableInfo(p.table(), p.frozen()));
-            esSourceOptions.add(p.esSourceOptions());
-        });
+        plan.forEachUp(EsqlUnresolvedRelation.class, p -> { indices.add(new TableInfo(p.table(), p.frozen())); });
         plan.forEachUp(Enrich.class, unresolvedEnriches::add);
 
         // mark plan as preAnalyzed (if it were marked, there would be no analysis)
         plan.forEachUp(LogicalPlan::setPreAnalyzed);
 
-        return new PreAnalysis(indices, esSourceOptions, unresolvedEnriches);
+        return new PreAnalysis(indices, unresolvedEnriches);
     }
 }

+ 30 - 7
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java

@@ -8,6 +8,7 @@
 package org.elasticsearch.xpack.esql.io.stream;
 
 import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.TransportVersion;
 import org.elasticsearch.TransportVersions;
 import org.elasticsearch.common.TriFunction;
 import org.elasticsearch.common.io.stream.NamedWriteable;
@@ -193,7 +194,6 @@ import org.elasticsearch.xpack.ql.expression.predicate.regex.RLikePattern;
 import org.elasticsearch.xpack.ql.expression.predicate.regex.RegexMatch;
 import org.elasticsearch.xpack.ql.expression.predicate.regex.WildcardPattern;
 import org.elasticsearch.xpack.ql.index.EsIndex;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.plan.logical.Filter;
 import org.elasticsearch.xpack.ql.plan.logical.Limit;
 import org.elasticsearch.xpack.ql.plan.logical.LogicalPlan;
@@ -796,11 +796,11 @@ public final class PlanNamedTypes {
         Source source = in.readSource();
         EsIndex esIndex = readEsIndex(in);
         List<Attribute> attributes = readAttributes(in);
-        EsSourceOptions esSourceOptions = in.getTransportVersion().onOrAfter(TransportVersions.ESQL_ES_SOURCE_OPTIONS)
-            ? new EsSourceOptions(in)
-            : EsSourceOptions.NO_OPTIONS;
+        if (supportingEsSourceOptions(in.getTransportVersion())) {
+            readEsSourceOptions(in); // consume optional strings sent by remote
+        }
         boolean frozen = in.readBoolean();
-        return new EsRelation(source, esIndex, attributes, esSourceOptions, frozen);
+        return new EsRelation(source, esIndex, attributes, frozen);
     }
 
     static void writeEsRelation(PlanStreamOutput out, EsRelation relation) throws IOException {
@@ -808,12 +808,35 @@ public final class PlanNamedTypes {
         out.writeNoSource();
         writeEsIndex(out, relation.index());
         writeAttributes(out, relation.output());
-        if (out.getTransportVersion().onOrAfter(TransportVersions.ESQL_ES_SOURCE_OPTIONS)) {
-            relation.esSourceOptions().writeEsSourceOptions(out);
+        if (supportingEsSourceOptions(out.getTransportVersion())) {
+            writeEsSourceOptions(out); // write (null) string fillers expected by remote
         }
         out.writeBoolean(relation.frozen());
     }
 
+    private static boolean supportingEsSourceOptions(TransportVersion version) {
+        return version.onOrAfter(TransportVersions.ESQL_ES_SOURCE_OPTIONS)
+            && version.before(TransportVersions.ESQL_REMOVE_ES_SOURCE_OPTIONS);
+    }
+
+    private static void readEsSourceOptions(PlanStreamInput in) throws IOException {
+        // allowNoIndices
+        in.readOptionalString();
+        // ignoreUnavailable
+        in.readOptionalString();
+        // preference
+        in.readOptionalString();
+    }
+
+    private static void writeEsSourceOptions(PlanStreamOutput out) throws IOException {
+        // allowNoIndices
+        out.writeOptionalString(null);
+        // ignoreUnavailable
+        out.writeOptionalString(null);
+        // preference
+        out.writeOptionalString(null);
+    }
+
     static Eval readEval(PlanStreamInput in) throws IOException {
         return new Eval(in.readSource(), in.readLogicalPlanNode(), readAliases(in));
     }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 3
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp


+ 811 - 818
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java

@@ -28,18 +28,18 @@ public class EsqlBaseLexer extends Lexer {
     RP=53, TRUE=54, EQ=55, CIEQ=56, NEQ=57, LT=58, LTE=59, GT=60, GTE=61, 
     PLUS=62, MINUS=63, ASTERISK=64, SLASH=65, PERCENT=66, OPENING_BRACKET=67, 
     CLOSING_BRACKET=68, UNQUOTED_IDENTIFIER=69, QUOTED_IDENTIFIER=70, EXPR_LINE_COMMENT=71, 
-    EXPR_MULTILINE_COMMENT=72, EXPR_WS=73, OPTIONS=74, METADATA=75, FROM_LINE_COMMENT=76, 
-    FROM_MULTILINE_COMMENT=77, FROM_WS=78, ID_PATTERN=79, PROJECT_LINE_COMMENT=80, 
-    PROJECT_MULTILINE_COMMENT=81, PROJECT_WS=82, AS=83, RENAME_LINE_COMMENT=84, 
-    RENAME_MULTILINE_COMMENT=85, RENAME_WS=86, ON=87, WITH=88, ENRICH_POLICY_NAME=89, 
-    ENRICH_LINE_COMMENT=90, ENRICH_MULTILINE_COMMENT=91, ENRICH_WS=92, ENRICH_FIELD_LINE_COMMENT=93, 
-    ENRICH_FIELD_MULTILINE_COMMENT=94, ENRICH_FIELD_WS=95, MVEXPAND_LINE_COMMENT=96, 
-    MVEXPAND_MULTILINE_COMMENT=97, MVEXPAND_WS=98, INFO=99, SHOW_LINE_COMMENT=100, 
-    SHOW_MULTILINE_COMMENT=101, SHOW_WS=102, FUNCTIONS=103, META_LINE_COMMENT=104, 
-    META_MULTILINE_COMMENT=105, META_WS=106, COLON=107, SETTING=108, SETTING_LINE_COMMENT=109, 
-    SETTTING_MULTILINE_COMMENT=110, SETTING_WS=111, METRICS_LINE_COMMENT=112, 
-    METRICS_MULTILINE_COMMENT=113, METRICS_WS=114, CLOSING_METRICS_LINE_COMMENT=115, 
-    CLOSING_METRICS_MULTILINE_COMMENT=116, CLOSING_METRICS_WS=117;
+    EXPR_MULTILINE_COMMENT=72, EXPR_WS=73, METADATA=74, FROM_LINE_COMMENT=75, 
+    FROM_MULTILINE_COMMENT=76, FROM_WS=77, ID_PATTERN=78, PROJECT_LINE_COMMENT=79, 
+    PROJECT_MULTILINE_COMMENT=80, PROJECT_WS=81, AS=82, RENAME_LINE_COMMENT=83, 
+    RENAME_MULTILINE_COMMENT=84, RENAME_WS=85, ON=86, WITH=87, ENRICH_POLICY_NAME=88, 
+    ENRICH_LINE_COMMENT=89, ENRICH_MULTILINE_COMMENT=90, ENRICH_WS=91, ENRICH_FIELD_LINE_COMMENT=92, 
+    ENRICH_FIELD_MULTILINE_COMMENT=93, ENRICH_FIELD_WS=94, MVEXPAND_LINE_COMMENT=95, 
+    MVEXPAND_MULTILINE_COMMENT=96, MVEXPAND_WS=97, INFO=98, SHOW_LINE_COMMENT=99, 
+    SHOW_MULTILINE_COMMENT=100, SHOW_WS=101, FUNCTIONS=102, META_LINE_COMMENT=103, 
+    META_MULTILINE_COMMENT=104, META_WS=105, COLON=106, SETTING=107, SETTING_LINE_COMMENT=108, 
+    SETTTING_MULTILINE_COMMENT=109, SETTING_WS=110, METRICS_LINE_COMMENT=111, 
+    METRICS_MULTILINE_COMMENT=112, METRICS_WS=113, CLOSING_METRICS_LINE_COMMENT=114, 
+    CLOSING_METRICS_MULTILINE_COMMENT=115, CLOSING_METRICS_WS=116;
   public static final int
     EXPLAIN_MODE=1, EXPRESSION_MODE=2, FROM_MODE=3, PROJECT_MODE=4, RENAME_MODE=5, 
     ENRICH_MODE=6, ENRICH_FIELD_MODE=7, MVEXPAND_MODE=8, SHOW_MODE=9, META_MODE=10, 
@@ -71,22 +71,21 @@ public class EsqlBaseLexer extends Lexer {
       "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", 
       "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", 
       "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", 
-      "FROM_COMMA", "FROM_ASSIGN", "FROM_QUOTED_STRING", "OPTIONS", "METADATA", 
-      "FROM_INDEX_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", 
-      "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", 
-      "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", 
-      "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", 
-      "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", 
-      "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", 
-      "ENRICH_POLICY_NAME", "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", 
-      "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", 
-      "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", 
-      "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", 
-      "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_PIPE", 
-      "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", "MVEXPAND_UNQUOTED_IDENTIFIER", 
-      "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", 
-      "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", 
-      "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", 
+      "FROM_COMMA", "FROM_ASSIGN", "FROM_QUOTED_STRING", "METADATA", "FROM_INDEX_UNQUOTED_IDENTIFIER", 
+      "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", 
+      "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", 
+      "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", 
+      "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", 
+      "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", 
+      "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", 
+      "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", 
+      "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", 
+      "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", 
+      "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", 
+      "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", 
+      "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", 
+      "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", 
+      "SHOW_WS", "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", 
       "META_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", 
       "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "METRICS_PIPE", "METRICS_INDEX_UNQUOTED_IDENTIFIER", 
       "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COMMA", 
@@ -107,10 +106,10 @@ public class EsqlBaseLexer extends Lexer {
       "'first'", "'last'", "'('", "'in'", "'is'", "'like'", "'not'", "'null'", 
       "'nulls'", "'or'", "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", 
       "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", 
-      null, "']'", null, null, null, null, null, "'options'", "'metadata'", 
-      null, null, null, null, null, null, null, "'as'", null, null, null, "'on'", 
-      "'with'", null, null, null, null, null, null, null, null, null, null, 
-      "'info'", null, null, null, "'functions'", null, null, null, "':'"
+      null, "']'", null, null, null, null, null, "'metadata'", null, null, 
+      null, null, null, null, null, "'as'", null, null, null, "'on'", "'with'", 
+      null, null, null, null, null, null, null, null, null, null, "'info'", 
+      null, null, null, "'functions'", null, null, null, "':'"
     };
   }
   private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -127,17 +126,17 @@ public class EsqlBaseLexer extends Lexer {
       "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", 
       "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", 
       "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", 
-      "OPTIONS", "METADATA", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", 
-      "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", 
-      "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", 
-      "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", 
-      "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", 
-      "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", 
-      "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", 
-      "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", 
-      "META_MULTILINE_COMMENT", "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", 
-      "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", 
-      "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", 
+      "METADATA", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", 
+      "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", 
+      "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", 
+      "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", 
+      "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", 
+      "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", 
+      "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", 
+      "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", 
+      "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", 
+      "SETTING_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", 
+      "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", 
       "CLOSING_METRICS_WS"
     };
   }
@@ -201,7 +200,7 @@ public class EsqlBaseLexer extends Lexer {
   public ATN getATN() { return _ATN; }
 
   public static final String _serializedATN =
-    "\u0004\u0000u\u051b\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
+    "\u0004\u0000t\u0511\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
     "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
     "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
     "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+
@@ -249,784 +248,778 @@ public class EsqlBaseLexer extends Lexer {
     "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+
     "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+
     "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+
-    "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0001\u0000\u0001\u0000\u0001"+
+    "\u00ac\u0007\u00ac\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
     "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
-    "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
-    "\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
-    "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
-    "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+
-    "\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
-    "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+
-    "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+
-    "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+
-    "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
+    "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+    "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
+    "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001"+
+    "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001"+
+    "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
+    "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+
+    "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+
+    "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+
+    "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
     "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
-    "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+
-    "\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
-    "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
+    "\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t"+
+    "\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001"+
+    "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001"+
     "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
-    "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+
-    "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+
-    "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+
-    "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+
-    "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+
-    "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
-    "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+
-    "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+
-    "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+
-    "\u0013\u0004\u0013\u020c\b\u0013\u000b\u0013\f\u0013\u020d\u0001\u0013"+
-    "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014"+
-    "\u0216\b\u0014\n\u0014\f\u0014\u0219\t\u0014\u0001\u0014\u0003\u0014\u021c"+
-    "\b\u0014\u0001\u0014\u0003\u0014\u021f\b\u0014\u0001\u0014\u0001\u0014"+
-    "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015"+
-    "\u0228\b\u0015\n\u0015\f\u0015\u022b\t\u0015\u0001\u0015\u0001\u0015\u0001"+
-    "\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0004\u0016\u0233\b\u0016\u000b"+
-    "\u0016\f\u0016\u0234\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+
-    "\u0017\u0003\u0017\u023c\b\u0017\u0001\u0018\u0004\u0018\u023f\b\u0018"+
-    "\u000b\u0018\f\u0018\u0240\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+
-    "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+
-    "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+
-    "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+
-    "\u0001 \u0001 \u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001#\u0001#\u0003"+
-    "#\u0268\b#\u0001#\u0004#\u026b\b#\u000b#\f#\u026c\u0001$\u0001$\u0001"+
-    "%\u0001%\u0001&\u0001&\u0001&\u0003&\u0276\b&\u0001\'\u0001\'\u0001(\u0001"+
-    "(\u0001(\u0003(\u027d\b(\u0001)\u0001)\u0001)\u0005)\u0282\b)\n)\f)\u0285"+
-    "\t)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0005)\u028d\b)\n)\f)\u0290"+
-    "\t)\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0297\b)\u0001)\u0003)\u029a"+
-    "\b)\u0003)\u029c\b)\u0001*\u0004*\u029f\b*\u000b*\f*\u02a0\u0001+\u0004"+
-    "+\u02a4\b+\u000b+\f+\u02a5\u0001+\u0001+\u0005+\u02aa\b+\n+\f+\u02ad\t"+
-    "+\u0001+\u0001+\u0004+\u02b1\b+\u000b+\f+\u02b2\u0001+\u0004+\u02b6\b"+
-    "+\u000b+\f+\u02b7\u0001+\u0001+\u0005+\u02bc\b+\n+\f+\u02bf\t+\u0003+"+
-    "\u02c1\b+\u0001+\u0001+\u0001+\u0001+\u0004+\u02c7\b+\u000b+\f+\u02c8"+
-    "\u0001+\u0001+\u0003+\u02cd\b+\u0001,\u0001,\u0001,\u0001-\u0001-\u0001"+
-    "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u0001"+
-    "0\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+
-    "4\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+
-    "5\u00015\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00018\u0001"+
-    "8\u00018\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001"+
-    ";\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001"+
-    "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+
-    "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001"+
-    "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001"+
-    "E\u0001E\u0001F\u0001F\u0001G\u0001G\u0001G\u0001H\u0001H\u0001I\u0001"+
-    "I\u0001I\u0001J\u0001J\u0001K\u0001K\u0001L\u0001L\u0001M\u0001M\u0001"+
-    "N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+
-    "P\u0001P\u0001Q\u0001Q\u0005Q\u0350\bQ\nQ\fQ\u0353\tQ\u0001Q\u0001Q\u0003"+
-    "Q\u0357\bQ\u0001Q\u0004Q\u035a\bQ\u000bQ\fQ\u035b\u0003Q\u035e\bQ\u0001"+
-    "R\u0001R\u0004R\u0362\bR\u000bR\fR\u0363\u0001R\u0001R\u0001S\u0001S\u0001"+
-    "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001"+
-    "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+
-    "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001"+
-    "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+
-    "]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+
-    "^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001"+
-    "`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001"+
-    "c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001"+
-    "e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0003f\u03c1\bf\u0001g\u0001"+
-    "g\u0003g\u03c5\bg\u0001g\u0005g\u03c8\bg\ng\fg\u03cb\tg\u0001g\u0001g"+
-    "\u0003g\u03cf\bg\u0001g\u0004g\u03d2\bg\u000bg\fg\u03d3\u0003g\u03d6\b"+
-    "g\u0001h\u0001h\u0004h\u03da\bh\u000bh\fh\u03db\u0001i\u0001i\u0001i\u0001"+
-    "i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001"+
-    "l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001"+
-    "n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001q\u0001"+
-    "q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001"+
-    "s\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001u\u0001"+
-    "v\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001"+
-    "x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001z\u0004"+
-    "z\u0427\bz\u000bz\fz\u0428\u0001z\u0001z\u0003z\u042d\bz\u0001z\u0004"+
-    "z\u0430\bz\u000bz\fz\u0431\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001"+
-    "|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001"+
-    "\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001"+
-    "\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001"+
-    "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+
-    "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001"+
-    "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+
-    "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+
-    "\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+
-    "\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001"+
-    "\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+
-    "\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001"+
-    "\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001"+
-    "\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001"+
-    "\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001"+
-    "\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+
-    "\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001"+
-    "\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+
-    "\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001"+
-    "\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+
-    "\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001"+
-    "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+
-    "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+
-    "\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+
-    "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0004\u009d\u04cc\b\u009d\u000b"+
-    "\u009d\f\u009d\u04cd\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+
-    "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001"+
-    "\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+
-    "\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+
-    "\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001"+
-    "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+
-    "\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001"+
-    "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001"+
-    "\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001"+
-    "\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001"+
-    "\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001"+
-    "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+
-    "\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0002"+
-    "\u0229\u028e\u0000\u00ae\u000e\u0001\u0010\u0002\u0012\u0003\u0014\u0004"+
-    "\u0016\u0005\u0018\u0006\u001a\u0007\u001c\b\u001e\t \n\"\u000b$\f&\r"+
-    "(\u000e*\u000f,\u0010.\u00110\u00122\u00134\u00146\u00158\u0016:\u0017"+
-    "<\u0000>\u0018@\u0000B\u0000D\u0019F\u001aH\u001bJ\u001cL\u0000N\u0000"+
-    "P\u0000R\u0000T\u0000V\u0000X\u0000Z\u0000\\\u0000^\u0000`\u001db\u001e"+
-    "d\u001ff h!j\"l#n$p%r&t\'v(x)z*|+~,\u0080-\u0082.\u0084/\u00860\u0088"+
-    "1\u008a2\u008c3\u008e4\u00905\u00926\u00947\u00968\u00989\u009a:\u009c"+
-    ";\u009e<\u00a0=\u00a2>\u00a4?\u00a6@\u00a8A\u00aaB\u00acC\u00aeD\u00b0"+
-    "E\u00b2\u0000\u00b4F\u00b6G\u00b8H\u00baI\u00bc\u0000\u00be\u0000\u00c0"+
-    "\u0000\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8J\u00caK\u00cc\u0000\u00ce"+
-    "L\u00d0M\u00d2N\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc"+
-    "\u0000\u00deO\u00e0P\u00e2Q\u00e4R\u00e6\u0000\u00e8\u0000\u00ea\u0000"+
-    "\u00ec\u0000\u00eeS\u00f0\u0000\u00f2T\u00f4U\u00f6V\u00f8\u0000\u00fa"+
-    "\u0000\u00fcW\u00feX\u0100\u0000\u0102Y\u0104\u0000\u0106\u0000\u0108"+
-    "Z\u010a[\u010c\\\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u0000\u0116"+
-    "\u0000\u0118\u0000\u011a\u0000\u011c]\u011e^\u0120_\u0122\u0000\u0124"+
-    "\u0000\u0126\u0000\u0128\u0000\u012a`\u012ca\u012eb\u0130\u0000\u0132"+
-    "c\u0134d\u0136e\u0138f\u013a\u0000\u013cg\u013eh\u0140i\u0142j\u0144\u0000"+
-    "\u0146k\u0148l\u014am\u014cn\u014eo\u0150\u0000\u0152\u0000\u0154p\u0156"+
-    "q\u0158r\u015a\u0000\u015cs\u015et\u0160u\u0162\u0000\u0164\u0000\u0166"+
-    "\u0000\u0168\u0000\u000e\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007"+
-    "\b\t\n\u000b\f\r\r\u0006\u0000\t\n\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003"+
-    "\u0000\t\n\r\r  \n\u0000\t\n\r\r  ,,//==[[]]``||\u0002\u0000**//\u0001"+
-    "\u000009\u0002\u0000AZaz\u0005\u0000\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r"+
-    "\"\"\\\\\u0002\u0000EEee\u0002\u0000++--\u0001\u0000``\u000b\u0000\t\n"+
-    "\r\r  \"#,,//::<<>?\\\\||\u0534\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+
-    "\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000"+
-    "\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000"+
-    "\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000"+
-    "\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000"+
-    " \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001"+
-    "\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000"+
-    "\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000"+
-    ".\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001"+
-    "\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000"+
-    "\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000"+
-    ">\u0001\u0000\u0000\u0000\u0001@\u0001\u0000\u0000\u0000\u0001B\u0001"+
-    "\u0000\u0000\u0000\u0001D\u0001\u0000\u0000\u0000\u0001F\u0001\u0000\u0000"+
-    "\u0000\u0001H\u0001\u0000\u0000\u0000\u0002J\u0001\u0000\u0000\u0000\u0002"+
-    "`\u0001\u0000\u0000\u0000\u0002b\u0001\u0000\u0000\u0000\u0002d\u0001"+
-    "\u0000\u0000\u0000\u0002f\u0001\u0000\u0000\u0000\u0002h\u0001\u0000\u0000"+
-    "\u0000\u0002j\u0001\u0000\u0000\u0000\u0002l\u0001\u0000\u0000\u0000\u0002"+
-    "n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001"+
-    "\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000"+
-    "\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002"+
-    "|\u0001\u0000\u0000\u0000\u0002~\u0001\u0000\u0000\u0000\u0002\u0080\u0001"+
-    "\u0000\u0000\u0000\u0002\u0082\u0001\u0000\u0000\u0000\u0002\u0084\u0001"+
-    "\u0000\u0000\u0000\u0002\u0086\u0001\u0000\u0000\u0000\u0002\u0088\u0001"+
-    "\u0000\u0000\u0000\u0002\u008a\u0001\u0000\u0000\u0000\u0002\u008c\u0001"+
-    "\u0000\u0000\u0000\u0002\u008e\u0001\u0000\u0000\u0000\u0002\u0090\u0001"+
-    "\u0000\u0000\u0000\u0002\u0092\u0001\u0000\u0000\u0000\u0002\u0094\u0001"+
-    "\u0000\u0000\u0000\u0002\u0096\u0001\u0000\u0000\u0000\u0002\u0098\u0001"+
-    "\u0000\u0000\u0000\u0002\u009a\u0001\u0000\u0000\u0000\u0002\u009c\u0001"+
-    "\u0000\u0000\u0000\u0002\u009e\u0001\u0000\u0000\u0000\u0002\u00a0\u0001"+
-    "\u0000\u0000\u0000\u0002\u00a2\u0001\u0000\u0000\u0000\u0002\u00a4\u0001"+
-    "\u0000\u0000\u0000\u0002\u00a6\u0001\u0000\u0000\u0000\u0002\u00a8\u0001"+
-    "\u0000\u0000\u0000\u0002\u00aa\u0001\u0000\u0000\u0000\u0002\u00ac\u0001"+
-    "\u0000\u0000\u0000\u0002\u00ae\u0001\u0000\u0000\u0000\u0002\u00b0\u0001"+
-    "\u0000\u0000\u0000\u0002\u00b4\u0001\u0000\u0000\u0000\u0002\u00b6\u0001"+
-    "\u0000\u0000\u0000\u0002\u00b8\u0001\u0000\u0000\u0000\u0002\u00ba\u0001"+
-    "\u0000\u0000\u0000\u0003\u00bc\u0001\u0000\u0000\u0000\u0003\u00be\u0001"+
-    "\u0000\u0000\u0000\u0003\u00c0\u0001\u0000\u0000\u0000\u0003\u00c2\u0001"+
-    "\u0000\u0000\u0000\u0003\u00c4\u0001\u0000\u0000\u0000\u0003\u00c6\u0001"+
-    "\u0000\u0000\u0000\u0003\u00c8\u0001\u0000\u0000\u0000\u0003\u00ca\u0001"+
-    "\u0000\u0000\u0000\u0003\u00cc\u0001\u0000\u0000\u0000\u0003\u00ce\u0001"+
-    "\u0000\u0000\u0000\u0003\u00d0\u0001\u0000\u0000\u0000\u0003\u00d2\u0001"+
-    "\u0000\u0000\u0000\u0004\u00d4\u0001\u0000\u0000\u0000\u0004\u00d6\u0001"+
-    "\u0000\u0000\u0000\u0004\u00d8\u0001\u0000\u0000\u0000\u0004\u00de\u0001"+
-    "\u0000\u0000\u0000\u0004\u00e0\u0001\u0000\u0000\u0000\u0004\u00e2\u0001"+
-    "\u0000\u0000\u0000\u0004\u00e4\u0001\u0000\u0000\u0000\u0005\u00e6\u0001"+
-    "\u0000\u0000\u0000\u0005\u00e8\u0001\u0000\u0000\u0000\u0005\u00ea\u0001"+
-    "\u0000\u0000\u0000\u0005\u00ec\u0001\u0000\u0000\u0000\u0005\u00ee\u0001"+
-    "\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005\u00f2\u0001"+
-    "\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005\u00f6\u0001"+
-    "\u0000\u0000\u0000\u0006\u00f8\u0001\u0000\u0000\u0000\u0006\u00fa\u0001"+
-    "\u0000\u0000\u0000\u0006\u00fc\u0001\u0000\u0000\u0000\u0006\u00fe\u0001"+
-    "\u0000\u0000\u0000\u0006\u0102\u0001\u0000\u0000\u0000\u0006\u0104\u0001"+
-    "\u0000\u0000\u0000\u0006\u0106\u0001\u0000\u0000\u0000\u0006\u0108\u0001"+
-    "\u0000\u0000\u0000\u0006\u010a\u0001\u0000\u0000\u0000\u0006\u010c\u0001"+
-    "\u0000\u0000\u0000\u0007\u010e\u0001\u0000\u0000\u0000\u0007\u0110\u0001"+
-    "\u0000\u0000\u0000\u0007\u0112\u0001\u0000\u0000\u0000\u0007\u0114\u0001"+
-    "\u0000\u0000\u0000\u0007\u0116\u0001\u0000\u0000\u0000\u0007\u0118\u0001"+
-    "\u0000\u0000\u0000\u0007\u011a\u0001\u0000\u0000\u0000\u0007\u011c\u0001"+
-    "\u0000\u0000\u0000\u0007\u011e\u0001\u0000\u0000\u0000\u0007\u0120\u0001"+
-    "\u0000\u0000\u0000\b\u0122\u0001\u0000\u0000\u0000\b\u0124\u0001\u0000"+
-    "\u0000\u0000\b\u0126\u0001\u0000\u0000\u0000\b\u0128\u0001\u0000\u0000"+
-    "\u0000\b\u012a\u0001\u0000\u0000\u0000\b\u012c\u0001\u0000\u0000\u0000"+
-    "\b\u012e\u0001\u0000\u0000\u0000\t\u0130\u0001\u0000\u0000\u0000\t\u0132"+
-    "\u0001\u0000\u0000\u0000\t\u0134\u0001\u0000\u0000\u0000\t\u0136\u0001"+
-    "\u0000\u0000\u0000\t\u0138\u0001\u0000\u0000\u0000\n\u013a\u0001\u0000"+
-    "\u0000\u0000\n\u013c\u0001\u0000\u0000\u0000\n\u013e\u0001\u0000\u0000"+
-    "\u0000\n\u0140\u0001\u0000\u0000\u0000\n\u0142\u0001\u0000\u0000\u0000"+
-    "\u000b\u0144\u0001\u0000\u0000\u0000\u000b\u0146\u0001\u0000\u0000\u0000"+
-    "\u000b\u0148\u0001\u0000\u0000\u0000\u000b\u014a\u0001\u0000\u0000\u0000"+
-    "\u000b\u014c\u0001\u0000\u0000\u0000\u000b\u014e\u0001\u0000\u0000\u0000"+
-    "\f\u0150\u0001\u0000\u0000\u0000\f\u0152\u0001\u0000\u0000\u0000\f\u0154"+
-    "\u0001\u0000\u0000\u0000\f\u0156\u0001\u0000\u0000\u0000\f\u0158\u0001"+
-    "\u0000\u0000\u0000\r\u015a\u0001\u0000\u0000\u0000\r\u015c\u0001\u0000"+
-    "\u0000\u0000\r\u015e\u0001\u0000\u0000\u0000\r\u0160\u0001\u0000\u0000"+
-    "\u0000\r\u0162\u0001\u0000\u0000\u0000\r\u0164\u0001\u0000\u0000\u0000"+
-    "\r\u0166\u0001\u0000\u0000\u0000\r\u0168\u0001\u0000\u0000\u0000\u000e"+
-    "\u016a\u0001\u0000\u0000\u0000\u0010\u0174\u0001\u0000\u0000\u0000\u0012"+
-    "\u017b\u0001\u0000\u0000\u0000\u0014\u0184\u0001\u0000\u0000\u0000\u0016"+
-    "\u018b\u0001\u0000\u0000\u0000\u0018\u0195\u0001\u0000\u0000\u0000\u001a"+
-    "\u019c\u0001\u0000\u0000\u0000\u001c\u01a3\u0001\u0000\u0000\u0000\u001e"+
-    "\u01b1\u0001\u0000\u0000\u0000 \u01b8\u0001\u0000\u0000\u0000\"\u01c0"+
-    "\u0001\u0000\u0000\u0000$\u01c7\u0001\u0000\u0000\u0000&\u01d1\u0001\u0000"+
-    "\u0000\u0000(\u01dd\u0001\u0000\u0000\u0000*\u01e6\u0001\u0000\u0000\u0000"+
-    ",\u01ec\u0001\u0000\u0000\u0000.\u01f3\u0001\u0000\u0000\u00000\u01fa"+
-    "\u0001\u0000\u0000\u00002\u0202\u0001\u0000\u0000\u00004\u020b\u0001\u0000"+
-    "\u0000\u00006\u0211\u0001\u0000\u0000\u00008\u0222\u0001\u0000\u0000\u0000"+
-    ":\u0232\u0001\u0000\u0000\u0000<\u023b\u0001\u0000\u0000\u0000>\u023e"+
-    "\u0001\u0000\u0000\u0000@\u0242\u0001\u0000\u0000\u0000B\u0247\u0001\u0000"+
-    "\u0000\u0000D\u024c\u0001\u0000\u0000\u0000F\u0250\u0001\u0000\u0000\u0000"+
-    "H\u0254\u0001\u0000\u0000\u0000J\u0258\u0001\u0000\u0000\u0000L\u025c"+
-    "\u0001\u0000\u0000\u0000N\u025e\u0001\u0000\u0000\u0000P\u0260\u0001\u0000"+
-    "\u0000\u0000R\u0263\u0001\u0000\u0000\u0000T\u0265\u0001\u0000\u0000\u0000"+
-    "V\u026e\u0001\u0000\u0000\u0000X\u0270\u0001\u0000\u0000\u0000Z\u0275"+
-    "\u0001\u0000\u0000\u0000\\\u0277\u0001\u0000\u0000\u0000^\u027c\u0001"+
-    "\u0000\u0000\u0000`\u029b\u0001\u0000\u0000\u0000b\u029e\u0001\u0000\u0000"+
-    "\u0000d\u02cc\u0001\u0000\u0000\u0000f\u02ce\u0001\u0000\u0000\u0000h"+
-    "\u02d1\u0001\u0000\u0000\u0000j\u02d5\u0001\u0000\u0000\u0000l\u02d9\u0001"+
-    "\u0000\u0000\u0000n\u02db\u0001\u0000\u0000\u0000p\u02de\u0001\u0000\u0000"+
-    "\u0000r\u02e0\u0001\u0000\u0000\u0000t\u02e5\u0001\u0000\u0000\u0000v"+
-    "\u02e7\u0001\u0000\u0000\u0000x\u02ed\u0001\u0000\u0000\u0000z\u02f3\u0001"+
-    "\u0000\u0000\u0000|\u02f8\u0001\u0000\u0000\u0000~\u02fa\u0001\u0000\u0000"+
-    "\u0000\u0080\u02fd\u0001\u0000\u0000\u0000\u0082\u0300\u0001\u0000\u0000"+
-    "\u0000\u0084\u0305\u0001\u0000\u0000\u0000\u0086\u0309\u0001\u0000\u0000"+
-    "\u0000\u0088\u030e\u0001\u0000\u0000\u0000\u008a\u0314\u0001\u0000\u0000"+
-    "\u0000\u008c\u0317\u0001\u0000\u0000\u0000\u008e\u0319\u0001\u0000\u0000"+
-    "\u0000\u0090\u031f\u0001\u0000\u0000\u0000\u0092\u0321\u0001\u0000\u0000"+
-    "\u0000\u0094\u0326\u0001\u0000\u0000\u0000\u0096\u0329\u0001\u0000\u0000"+
-    "\u0000\u0098\u032c\u0001\u0000\u0000\u0000\u009a\u032f\u0001\u0000\u0000"+
-    "\u0000\u009c\u0331\u0001\u0000\u0000\u0000\u009e\u0334\u0001\u0000\u0000"+
-    "\u0000\u00a0\u0336\u0001\u0000\u0000\u0000\u00a2\u0339\u0001\u0000\u0000"+
-    "\u0000\u00a4\u033b\u0001\u0000\u0000\u0000\u00a6\u033d\u0001\u0000\u0000"+
-    "\u0000\u00a8\u033f\u0001\u0000\u0000\u0000\u00aa\u0341\u0001\u0000\u0000"+
-    "\u0000\u00ac\u0343\u0001\u0000\u0000\u0000\u00ae\u0348\u0001\u0000\u0000"+
-    "\u0000\u00b0\u035d\u0001\u0000\u0000\u0000\u00b2\u035f\u0001\u0000\u0000"+
-    "\u0000\u00b4\u0367\u0001\u0000\u0000\u0000\u00b6\u0369\u0001\u0000\u0000"+
-    "\u0000\u00b8\u036d\u0001\u0000\u0000\u0000\u00ba\u0371\u0001\u0000\u0000"+
-    "\u0000\u00bc\u0375\u0001\u0000\u0000\u0000\u00be\u037a\u0001\u0000\u0000"+
-    "\u0000\u00c0\u037e\u0001\u0000\u0000\u0000\u00c2\u0382\u0001\u0000\u0000"+
-    "\u0000\u00c4\u0386\u0001\u0000\u0000\u0000\u00c6\u038a\u0001\u0000\u0000"+
-    "\u0000\u00c8\u038e\u0001\u0000\u0000\u0000\u00ca\u0396\u0001\u0000\u0000"+
-    "\u0000\u00cc\u039f\u0001\u0000\u0000\u0000\u00ce\u03a3\u0001\u0000\u0000"+
-    "\u0000\u00d0\u03a7\u0001\u0000\u0000\u0000\u00d2\u03ab\u0001\u0000\u0000"+
-    "\u0000\u00d4\u03af\u0001\u0000\u0000\u0000\u00d6\u03b4\u0001\u0000\u0000"+
-    "\u0000\u00d8\u03b8\u0001\u0000\u0000\u0000\u00da\u03c0\u0001\u0000\u0000"+
-    "\u0000\u00dc\u03d5\u0001\u0000\u0000\u0000\u00de\u03d9\u0001\u0000\u0000"+
-    "\u0000\u00e0\u03dd\u0001\u0000\u0000\u0000\u00e2\u03e1\u0001\u0000\u0000"+
-    "\u0000\u00e4\u03e5\u0001\u0000\u0000\u0000\u00e6\u03e9\u0001\u0000\u0000"+
-    "\u0000\u00e8\u03ee\u0001\u0000\u0000\u0000\u00ea\u03f2\u0001\u0000\u0000"+
-    "\u0000\u00ec\u03f6\u0001\u0000\u0000\u0000\u00ee\u03fa\u0001\u0000\u0000"+
-    "\u0000\u00f0\u03fd\u0001\u0000\u0000\u0000\u00f2\u0401\u0001\u0000\u0000"+
-    "\u0000\u00f4\u0405\u0001\u0000\u0000\u0000\u00f6\u0409\u0001\u0000\u0000"+
-    "\u0000\u00f8\u040d\u0001\u0000\u0000\u0000\u00fa\u0412\u0001\u0000\u0000"+
-    "\u0000\u00fc\u0417\u0001\u0000\u0000\u0000\u00fe\u041c\u0001\u0000\u0000"+
-    "\u0000\u0100\u0423\u0001\u0000\u0000\u0000\u0102\u042c\u0001\u0000\u0000"+
-    "\u0000\u0104\u0433\u0001\u0000\u0000\u0000\u0106\u0437\u0001\u0000\u0000"+
-    "\u0000\u0108\u043b\u0001\u0000\u0000\u0000\u010a\u043f\u0001\u0000\u0000"+
-    "\u0000\u010c\u0443\u0001\u0000\u0000\u0000\u010e\u0447\u0001\u0000\u0000"+
-    "\u0000\u0110\u044d\u0001\u0000\u0000\u0000\u0112\u0451\u0001\u0000\u0000"+
-    "\u0000\u0114\u0455\u0001\u0000\u0000\u0000\u0116\u0459\u0001\u0000\u0000"+
-    "\u0000\u0118\u045d\u0001\u0000\u0000\u0000\u011a\u0461\u0001\u0000\u0000"+
-    "\u0000\u011c\u0465\u0001\u0000\u0000\u0000\u011e\u0469\u0001\u0000\u0000"+
-    "\u0000\u0120\u046d\u0001\u0000\u0000\u0000\u0122\u0471\u0001\u0000\u0000"+
-    "\u0000\u0124\u0476\u0001\u0000\u0000\u0000\u0126\u047a\u0001\u0000\u0000"+
-    "\u0000\u0128\u047e\u0001\u0000\u0000\u0000\u012a\u0482\u0001\u0000\u0000"+
-    "\u0000\u012c\u0486\u0001\u0000\u0000\u0000\u012e\u048a\u0001\u0000\u0000"+
-    "\u0000\u0130\u048e\u0001\u0000\u0000\u0000\u0132\u0493\u0001\u0000\u0000"+
-    "\u0000\u0134\u0498\u0001\u0000\u0000\u0000\u0136\u049c\u0001\u0000\u0000"+
-    "\u0000\u0138\u04a0\u0001\u0000\u0000\u0000\u013a\u04a4\u0001\u0000\u0000"+
-    "\u0000\u013c\u04a9\u0001\u0000\u0000\u0000\u013e\u04b3\u0001\u0000\u0000"+
-    "\u0000\u0140\u04b7\u0001\u0000\u0000\u0000\u0142\u04bb\u0001\u0000\u0000"+
-    "\u0000\u0144\u04bf\u0001\u0000\u0000\u0000\u0146\u04c4\u0001\u0000\u0000"+
-    "\u0000\u0148\u04cb\u0001\u0000\u0000\u0000\u014a\u04cf\u0001\u0000\u0000"+
-    "\u0000\u014c\u04d3\u0001\u0000\u0000\u0000\u014e\u04d7\u0001\u0000\u0000"+
-    "\u0000\u0150\u04db\u0001\u0000\u0000\u0000\u0152\u04e0\u0001\u0000\u0000"+
-    "\u0000\u0154\u04e6\u0001\u0000\u0000\u0000\u0156\u04ea\u0001\u0000\u0000"+
-    "\u0000\u0158\u04ee\u0001\u0000\u0000\u0000\u015a\u04f2\u0001\u0000\u0000"+
-    "\u0000\u015c\u04f8\u0001\u0000\u0000\u0000\u015e\u04fc\u0001\u0000\u0000"+
-    "\u0000\u0160\u0500\u0001\u0000\u0000\u0000\u0162\u0504\u0001\u0000\u0000"+
-    "\u0000\u0164\u050a\u0001\u0000\u0000\u0000\u0166\u0510\u0001\u0000\u0000"+
-    "\u0000\u0168\u0516\u0001\u0000\u0000\u0000\u016a\u016b\u0005d\u0000\u0000"+
-    "\u016b\u016c\u0005i\u0000\u0000\u016c\u016d\u0005s\u0000\u0000\u016d\u016e"+
-    "\u0005s\u0000\u0000\u016e\u016f\u0005e\u0000\u0000\u016f\u0170\u0005c"+
-    "\u0000\u0000\u0170\u0171\u0005t\u0000\u0000\u0171\u0172\u0001\u0000\u0000"+
-    "\u0000\u0172\u0173\u0006\u0000\u0000\u0000\u0173\u000f\u0001\u0000\u0000"+
-    "\u0000\u0174\u0175\u0005d\u0000\u0000\u0175\u0176\u0005r\u0000\u0000\u0176"+
-    "\u0177\u0005o\u0000\u0000\u0177\u0178\u0005p\u0000\u0000\u0178\u0179\u0001"+
-    "\u0000\u0000\u0000\u0179\u017a\u0006\u0001\u0001\u0000\u017a\u0011\u0001"+
-    "\u0000\u0000\u0000\u017b\u017c\u0005e\u0000\u0000\u017c\u017d\u0005n\u0000"+
-    "\u0000\u017d\u017e\u0005r\u0000\u0000\u017e\u017f\u0005i\u0000\u0000\u017f"+
-    "\u0180\u0005c\u0000\u0000\u0180\u0181\u0005h\u0000\u0000\u0181\u0182\u0001"+
-    "\u0000\u0000\u0000\u0182\u0183\u0006\u0002\u0002\u0000\u0183\u0013\u0001"+
-    "\u0000\u0000\u0000\u0184\u0185\u0005e\u0000\u0000\u0185\u0186\u0005v\u0000"+
-    "\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188\u0005l\u0000\u0000\u0188"+
-    "\u0189\u0001\u0000\u0000\u0000\u0189\u018a\u0006\u0003\u0000\u0000\u018a"+
-    "\u0015\u0001\u0000\u0000\u0000\u018b\u018c\u0005e\u0000\u0000\u018c\u018d"+
-    "\u0005x\u0000\u0000\u018d\u018e\u0005p\u0000\u0000\u018e\u018f\u0005l"+
-    "\u0000\u0000\u018f\u0190\u0005a\u0000\u0000\u0190\u0191\u0005i\u0000\u0000"+
-    "\u0191\u0192\u0005n\u0000\u0000\u0192\u0193\u0001\u0000\u0000\u0000\u0193"+
-    "\u0194\u0006\u0004\u0003\u0000\u0194\u0017\u0001\u0000\u0000\u0000\u0195"+
-    "\u0196\u0005f\u0000\u0000\u0196\u0197\u0005r\u0000\u0000\u0197\u0198\u0005"+
-    "o\u0000\u0000\u0198\u0199\u0005m\u0000\u0000\u0199\u019a\u0001\u0000\u0000"+
-    "\u0000\u019a\u019b\u0006\u0005\u0004\u0000\u019b\u0019\u0001\u0000\u0000"+
-    "\u0000\u019c\u019d\u0005g\u0000\u0000\u019d\u019e\u0005r\u0000\u0000\u019e"+
-    "\u019f\u0005o\u0000\u0000\u019f\u01a0\u0005k\u0000\u0000\u01a0\u01a1\u0001"+
-    "\u0000\u0000\u0000\u01a1\u01a2\u0006\u0006\u0000\u0000\u01a2\u001b\u0001"+
-    "\u0000\u0000\u0000\u01a3\u01a4\u0005i\u0000\u0000\u01a4\u01a5\u0005n\u0000"+
-    "\u0000\u01a5\u01a6\u0005l\u0000\u0000\u01a6\u01a7\u0005i\u0000\u0000\u01a7"+
-    "\u01a8\u0005n\u0000\u0000\u01a8\u01a9\u0005e\u0000\u0000\u01a9\u01aa\u0005"+
-    "s\u0000\u0000\u01aa\u01ab\u0005t\u0000\u0000\u01ab\u01ac\u0005a\u0000"+
-    "\u0000\u01ac\u01ad\u0005t\u0000\u0000\u01ad\u01ae\u0005s\u0000\u0000\u01ae"+
-    "\u01af\u0001\u0000\u0000\u0000\u01af\u01b0\u0006\u0007\u0000\u0000\u01b0"+
-    "\u001d\u0001\u0000\u0000\u0000\u01b1\u01b2\u0005k\u0000\u0000\u01b2\u01b3"+
-    "\u0005e\u0000\u0000\u01b3\u01b4\u0005e\u0000\u0000\u01b4\u01b5\u0005p"+
-    "\u0000\u0000\u01b5\u01b6\u0001\u0000\u0000\u0000\u01b6\u01b7\u0006\b\u0001"+
-    "\u0000\u01b7\u001f\u0001\u0000\u0000\u0000\u01b8\u01b9\u0005l\u0000\u0000"+
-    "\u01b9\u01ba\u0005i\u0000\u0000\u01ba\u01bb\u0005m\u0000\u0000\u01bb\u01bc"+
-    "\u0005i\u0000\u0000\u01bc\u01bd\u0005t\u0000\u0000\u01bd\u01be\u0001\u0000"+
-    "\u0000\u0000\u01be\u01bf\u0006\t\u0000\u0000\u01bf!\u0001\u0000\u0000"+
-    "\u0000\u01c0\u01c1\u0005m\u0000\u0000\u01c1\u01c2\u0005e\u0000\u0000\u01c2"+
-    "\u01c3\u0005t\u0000\u0000\u01c3\u01c4\u0005a\u0000\u0000\u01c4\u01c5\u0001"+
-    "\u0000\u0000\u0000\u01c5\u01c6\u0006\n\u0005\u0000\u01c6#\u0001\u0000"+
-    "\u0000\u0000\u01c7\u01c8\u0005m\u0000\u0000\u01c8\u01c9\u0005e\u0000\u0000"+
-    "\u01c9\u01ca\u0005t\u0000\u0000\u01ca\u01cb\u0005r\u0000\u0000\u01cb\u01cc"+
-    "\u0005i\u0000\u0000\u01cc\u01cd\u0005c\u0000\u0000\u01cd\u01ce\u0005s"+
-    "\u0000\u0000\u01ce\u01cf\u0001\u0000\u0000\u0000\u01cf\u01d0\u0006\u000b"+
-    "\u0006\u0000\u01d0%\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005m\u0000\u0000"+
-    "\u01d2\u01d3\u0005v\u0000\u0000\u01d3\u01d4\u0005_\u0000\u0000\u01d4\u01d5"+
-    "\u0005e\u0000\u0000\u01d5\u01d6\u0005x\u0000\u0000\u01d6\u01d7\u0005p"+
-    "\u0000\u0000\u01d7\u01d8\u0005a\u0000\u0000\u01d8\u01d9\u0005n\u0000\u0000"+
-    "\u01d9\u01da\u0005d\u0000\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db"+
-    "\u01dc\u0006\f\u0007\u0000\u01dc\'\u0001\u0000\u0000\u0000\u01dd\u01de"+
-    "\u0005r\u0000\u0000\u01de\u01df\u0005e\u0000\u0000\u01df\u01e0\u0005n"+
-    "\u0000\u0000\u01e0\u01e1\u0005a\u0000\u0000\u01e1\u01e2\u0005m\u0000\u0000"+
-    "\u01e2\u01e3\u0005e\u0000\u0000\u01e3\u01e4\u0001\u0000\u0000\u0000\u01e4"+
-    "\u01e5\u0006\r\b\u0000\u01e5)\u0001\u0000\u0000\u0000\u01e6\u01e7\u0005"+
-    "r\u0000\u0000\u01e7\u01e8\u0005o\u0000\u0000\u01e8\u01e9\u0005w\u0000"+
-    "\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea\u01eb\u0006\u000e\u0000"+
-    "\u0000\u01eb+\u0001\u0000\u0000\u0000\u01ec\u01ed\u0005s\u0000\u0000\u01ed"+
-    "\u01ee\u0005h\u0000\u0000\u01ee\u01ef\u0005o\u0000\u0000\u01ef\u01f0\u0005"+
-    "w\u0000\u0000\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\u000f"+
-    "\t\u0000\u01f2-\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005s\u0000\u0000"+
-    "\u01f4\u01f5\u0005o\u0000\u0000\u01f5\u01f6\u0005r\u0000\u0000\u01f6\u01f7"+
-    "\u0005t\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8\u01f9\u0006"+
-    "\u0010\u0000\u0000\u01f9/\u0001\u0000\u0000\u0000\u01fa\u01fb\u0005s\u0000"+
-    "\u0000\u01fb\u01fc\u0005t\u0000\u0000\u01fc\u01fd\u0005a\u0000\u0000\u01fd"+
-    "\u01fe\u0005t\u0000\u0000\u01fe\u01ff\u0005s\u0000\u0000\u01ff\u0200\u0001"+
-    "\u0000\u0000\u0000\u0200\u0201\u0006\u0011\u0000\u0000\u02011\u0001\u0000"+
-    "\u0000\u0000\u0202\u0203\u0005w\u0000\u0000\u0203\u0204\u0005h\u0000\u0000"+
-    "\u0204\u0205\u0005e\u0000\u0000\u0205\u0206\u0005r\u0000\u0000\u0206\u0207"+
-    "\u0005e\u0000\u0000\u0207\u0208\u0001\u0000\u0000\u0000\u0208\u0209\u0006"+
-    "\u0012\u0000\u0000\u02093\u0001\u0000\u0000\u0000\u020a\u020c\b\u0000"+
-    "\u0000\u0000\u020b\u020a\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000"+
-    "\u0000\u0000\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020e\u0001\u0000"+
-    "\u0000\u0000\u020e\u020f\u0001\u0000\u0000\u0000\u020f\u0210\u0006\u0013"+
-    "\u0000\u0000\u02105\u0001\u0000\u0000\u0000\u0211\u0212\u0005/\u0000\u0000"+
-    "\u0212\u0213\u0005/\u0000\u0000\u0213\u0217\u0001\u0000\u0000\u0000\u0214"+
-    "\u0216\b\u0001\u0000\u0000\u0215\u0214\u0001\u0000\u0000\u0000\u0216\u0219"+
-    "\u0001\u0000\u0000\u0000\u0217\u0215\u0001\u0000\u0000\u0000\u0217\u0218"+
-    "\u0001\u0000\u0000\u0000\u0218\u021b\u0001\u0000\u0000\u0000\u0219\u0217"+
-    "\u0001\u0000\u0000\u0000\u021a\u021c\u0005\r\u0000\u0000\u021b\u021a\u0001"+
-    "\u0000\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c\u021e\u0001"+
-    "\u0000\u0000\u0000\u021d\u021f\u0005\n\u0000\u0000\u021e\u021d\u0001\u0000"+
-    "\u0000\u0000\u021e\u021f\u0001\u0000\u0000\u0000\u021f\u0220\u0001\u0000"+
-    "\u0000\u0000\u0220\u0221\u0006\u0014\n\u0000\u02217\u0001\u0000\u0000"+
-    "\u0000\u0222\u0223\u0005/\u0000\u0000\u0223\u0224\u0005*\u0000\u0000\u0224"+
-    "\u0229\u0001\u0000\u0000\u0000\u0225\u0228\u00038\u0015\u0000\u0226\u0228"+
-    "\t\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0226\u0001"+
-    "\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u022a\u0001"+
-    "\u0000\u0000\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022c\u0001"+
-    "\u0000\u0000\u0000\u022b\u0229\u0001\u0000\u0000\u0000\u022c\u022d\u0005"+
-    "*\u0000\u0000\u022d\u022e\u0005/\u0000\u0000\u022e\u022f\u0001\u0000\u0000"+
-    "\u0000\u022f\u0230\u0006\u0015\n\u0000\u02309\u0001\u0000\u0000\u0000"+
-    "\u0231\u0233\u0007\u0002\u0000\u0000\u0232\u0231\u0001\u0000\u0000\u0000"+
-    "\u0233\u0234\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000\u0000"+
-    "\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u0236\u0001\u0000\u0000\u0000"+
-    "\u0236\u0237\u0006\u0016\n\u0000\u0237;\u0001\u0000\u0000\u0000\u0238"+
-    "\u023c\b\u0003\u0000\u0000\u0239\u023a\u0005/\u0000\u0000\u023a\u023c"+
-    "\b\u0004\u0000\u0000\u023b\u0238\u0001\u0000\u0000\u0000\u023b\u0239\u0001"+
-    "\u0000\u0000\u0000\u023c=\u0001\u0000\u0000\u0000\u023d\u023f\u0003<\u0017"+
-    "\u0000\u023e\u023d\u0001\u0000\u0000\u0000\u023f\u0240\u0001\u0000\u0000"+
-    "\u0000\u0240\u023e\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000\u0000"+
-    "\u0000\u0241?\u0001\u0000\u0000\u0000\u0242\u0243\u0003\u00acO\u0000\u0243"+
-    "\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0006\u0019\u000b\u0000\u0245"+
-    "\u0246\u0006\u0019\f\u0000\u0246A\u0001\u0000\u0000\u0000\u0247\u0248"+
-    "\u0003J\u001e\u0000\u0248\u0249\u0001\u0000\u0000\u0000\u0249\u024a\u0006"+
-    "\u001a\r\u0000\u024a\u024b\u0006\u001a\u000e\u0000\u024bC\u0001\u0000"+
-    "\u0000\u0000\u024c\u024d\u0003:\u0016\u0000\u024d\u024e\u0001\u0000\u0000"+
-    "\u0000\u024e\u024f\u0006\u001b\n\u0000\u024fE\u0001\u0000\u0000\u0000"+
-    "\u0250\u0251\u00036\u0014\u0000\u0251\u0252\u0001\u0000\u0000\u0000\u0252"+
-    "\u0253\u0006\u001c\n\u0000\u0253G\u0001\u0000\u0000\u0000\u0254\u0255"+
-    "\u00038\u0015\u0000\u0255\u0256\u0001\u0000\u0000\u0000\u0256\u0257\u0006"+
-    "\u001d\n\u0000\u0257I\u0001\u0000\u0000\u0000\u0258\u0259\u0005|\u0000"+
-    "\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025b\u0006\u001e\u000e"+
-    "\u0000\u025bK\u0001\u0000\u0000\u0000\u025c\u025d\u0007\u0005\u0000\u0000"+
-    "\u025dM\u0001\u0000\u0000\u0000\u025e\u025f\u0007\u0006\u0000\u0000\u025f"+
-    "O\u0001\u0000\u0000\u0000\u0260\u0261\u0005\\\u0000\u0000\u0261\u0262"+
-    "\u0007\u0007\u0000\u0000\u0262Q\u0001\u0000\u0000\u0000\u0263\u0264\b"+
-    "\b\u0000\u0000\u0264S\u0001\u0000\u0000\u0000\u0265\u0267\u0007\t\u0000"+
-    "\u0000\u0266\u0268\u0007\n\u0000\u0000\u0267\u0266\u0001\u0000\u0000\u0000"+
-    "\u0267\u0268\u0001\u0000\u0000\u0000\u0268\u026a\u0001\u0000\u0000\u0000"+
-    "\u0269\u026b\u0003L\u001f\u0000\u026a\u0269\u0001\u0000\u0000\u0000\u026b"+
-    "\u026c\u0001\u0000\u0000\u0000\u026c\u026a\u0001\u0000\u0000\u0000\u026c"+
-    "\u026d\u0001\u0000\u0000\u0000\u026dU\u0001\u0000\u0000\u0000\u026e\u026f"+
-    "\u0005@\u0000\u0000\u026fW\u0001\u0000\u0000\u0000\u0270\u0271\u0005`"+
-    "\u0000\u0000\u0271Y\u0001\u0000\u0000\u0000\u0272\u0276\b\u000b\u0000"+
-    "\u0000\u0273\u0274\u0005`\u0000\u0000\u0274\u0276\u0005`\u0000\u0000\u0275"+
-    "\u0272\u0001\u0000\u0000\u0000\u0275\u0273\u0001\u0000\u0000\u0000\u0276"+
-    "[\u0001\u0000\u0000\u0000\u0277\u0278\u0005_\u0000\u0000\u0278]\u0001"+
-    "\u0000\u0000\u0000\u0279\u027d\u0003N \u0000\u027a\u027d\u0003L\u001f"+
-    "\u0000\u027b\u027d\u0003\\\'\u0000\u027c\u0279\u0001\u0000\u0000\u0000"+
-    "\u027c\u027a\u0001\u0000\u0000\u0000\u027c\u027b\u0001\u0000\u0000\u0000"+
-    "\u027d_\u0001\u0000\u0000\u0000\u027e\u0283\u0005\"\u0000\u0000\u027f"+
-    "\u0282\u0003P!\u0000\u0280\u0282\u0003R\"\u0000\u0281\u027f\u0001\u0000"+
-    "\u0000\u0000\u0281\u0280\u0001\u0000\u0000\u0000\u0282\u0285\u0001\u0000"+
-    "\u0000\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000"+
-    "\u0000\u0000\u0284\u0286\u0001\u0000\u0000\u0000\u0285\u0283\u0001\u0000"+
-    "\u0000\u0000\u0286\u029c\u0005\"\u0000\u0000\u0287\u0288\u0005\"\u0000"+
-    "\u0000\u0288\u0289\u0005\"\u0000\u0000\u0289\u028a\u0005\"\u0000\u0000"+
-    "\u028a\u028e\u0001\u0000\u0000\u0000\u028b\u028d\b\u0001\u0000\u0000\u028c"+
-    "\u028b\u0001\u0000\u0000\u0000\u028d\u0290\u0001\u0000\u0000\u0000\u028e"+
+    "\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+
+    "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+
+    "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+
+    "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001"+
+    "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001"+
+    "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
+    "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+
+    "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+
+    "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0004\u0013\u020a"+
+    "\b\u0013\u000b\u0013\f\u0013\u020b\u0001\u0013\u0001\u0013\u0001\u0014"+
+    "\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0214\b\u0014\n\u0014"+
+    "\f\u0014\u0217\t\u0014\u0001\u0014\u0003\u0014\u021a\b\u0014\u0001\u0014"+
+    "\u0003\u0014\u021d\b\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+
+    "\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u0226\b\u0015\n\u0015"+
+    "\f\u0015\u0229\t\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+
+    "\u0001\u0015\u0001\u0016\u0004\u0016\u0231\b\u0016\u000b\u0016\f\u0016"+
+    "\u0232\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0003"+
+    "\u0017\u023a\b\u0017\u0001\u0018\u0004\u0018\u023d\b\u0018\u000b\u0018"+
+    "\f\u0018\u023e\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
+    "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+
+    "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c"+
+    "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e"+
+    "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001"+
+    " \u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001#\u0001#\u0003#\u0266\b#\u0001"+
+    "#\u0004#\u0269\b#\u000b#\f#\u026a\u0001$\u0001$\u0001%\u0001%\u0001&\u0001"+
+    "&\u0001&\u0003&\u0274\b&\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0003(\u027b"+
+    "\b(\u0001)\u0001)\u0001)\u0005)\u0280\b)\n)\f)\u0283\t)\u0001)\u0001)"+
+    "\u0001)\u0001)\u0001)\u0001)\u0005)\u028b\b)\n)\f)\u028e\t)\u0001)\u0001"+
+    ")\u0001)\u0001)\u0001)\u0003)\u0295\b)\u0001)\u0003)\u0298\b)\u0003)\u029a"+
+    "\b)\u0001*\u0004*\u029d\b*\u000b*\f*\u029e\u0001+\u0004+\u02a2\b+\u000b"+
+    "+\f+\u02a3\u0001+\u0001+\u0005+\u02a8\b+\n+\f+\u02ab\t+\u0001+\u0001+"+
+    "\u0004+\u02af\b+\u000b+\f+\u02b0\u0001+\u0004+\u02b4\b+\u000b+\f+\u02b5"+
+    "\u0001+\u0001+\u0005+\u02ba\b+\n+\f+\u02bd\t+\u0003+\u02bf\b+\u0001+\u0001"+
+    "+\u0001+\u0001+\u0004+\u02c5\b+\u000b+\f+\u02c6\u0001+\u0001+\u0003+\u02cb"+
+    "\b+\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001"+
+    ".\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00011\u00011\u00012\u0001"+
+    "2\u00012\u00012\u00012\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+
+    "4\u00014\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+
+    "6\u00016\u00016\u00017\u00017\u00018\u00018\u00018\u00019\u00019\u0001"+
+    "9\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001"+
+    "<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+
+    "=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+
+    "@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001"+
+    "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+
+    "G\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+
+    "K\u0001K\u0001L\u0001L\u0001M\u0001M\u0001N\u0001N\u0001O\u0001O\u0001"+
+    "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0005"+
+    "Q\u034e\bQ\nQ\fQ\u0351\tQ\u0001Q\u0001Q\u0003Q\u0355\bQ\u0001Q\u0004Q"+
+    "\u0358\bQ\u000bQ\fQ\u0359\u0003Q\u035c\bQ\u0001R\u0001R\u0004R\u0360\b"+
+    "R\u000bR\fR\u0361\u0001R\u0001R\u0001S\u0001S\u0001T\u0001T\u0001T\u0001"+
+    "T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001"+
+    "W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+
+    "Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001"+
+    "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+
+    "]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+
+    "_\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001"+
+    "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001"+
+    "d\u0001d\u0001e\u0001e\u0001e\u0001e\u0003e\u03b7\be\u0001f\u0001f\u0003"+
+    "f\u03bb\bf\u0001f\u0005f\u03be\bf\nf\ff\u03c1\tf\u0001f\u0001f\u0003f"+
+    "\u03c5\bf\u0001f\u0004f\u03c8\bf\u000bf\ff\u03c9\u0003f\u03cc\bf\u0001"+
+    "g\u0001g\u0004g\u03d0\bg\u000bg\fg\u03d1\u0001h\u0001h\u0001h\u0001h\u0001"+
+    "i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001"+
+    "k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+
+    "m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+
+    "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+
+    "s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001u\u0001"+
+    "u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001w\u0001"+
+    "w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001y\u0004y\u041d"+
+    "\by\u000by\fy\u041e\u0001y\u0001y\u0003y\u0423\by\u0001y\u0004y\u0426"+
+    "\by\u000by\fy\u0427\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001"+
+    "{\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001~\u0001"+
+    "~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001"+
+    "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001"+
+    "\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001"+
+    "\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+
+    "\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+
+    "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+
+    "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001"+
+    "\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+
+    "\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+
+    "\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001"+
+    "\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001"+
+    "\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001"+
+    "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+
+    "\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001"+
+    "\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+
+    "\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001"+
+    "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001"+
+    "\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001"+
+    "\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+
+    "\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001"+
+    "\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+
+    "\u009a\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+
+    "\u009c\u0001\u009c\u0004\u009c\u04c2\b\u009c\u000b\u009c\f\u009c\u04c3"+
+    "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+
+    "\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f"+
+    "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1"+
+    "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2"+
+    "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3"+
+    "\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5"+
+    "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6"+
+    "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7"+
+    "\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9"+
+    "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa"+
+    "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab"+
+    "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac"+
+    "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0002\u0227\u028c\u0000"+
+    "\u00ad\u000e\u0001\u0010\u0002\u0012\u0003\u0014\u0004\u0016\u0005\u0018"+
+    "\u0006\u001a\u0007\u001c\b\u001e\t \n\"\u000b$\f&\r(\u000e*\u000f,\u0010"+
+    ".\u00110\u00122\u00134\u00146\u00158\u0016:\u0017<\u0000>\u0018@\u0000"+
+    "B\u0000D\u0019F\u001aH\u001bJ\u001cL\u0000N\u0000P\u0000R\u0000T\u0000"+
+    "V\u0000X\u0000Z\u0000\\\u0000^\u0000`\u001db\u001ed\u001ff h!j\"l#n$p"+
+    "%r&t\'v(x)z*|+~,\u0080-\u0082.\u0084/\u00860\u00881\u008a2\u008c3\u008e"+
+    "4\u00905\u00926\u00947\u00968\u00989\u009a:\u009c;\u009e<\u00a0=\u00a2"+
+    ">\u00a4?\u00a6@\u00a8A\u00aaB\u00acC\u00aeD\u00b0E\u00b2\u0000\u00b4F"+
+    "\u00b6G\u00b8H\u00baI\u00bc\u0000\u00be\u0000\u00c0\u0000\u00c2\u0000"+
+    "\u00c4\u0000\u00c6\u0000\u00c8J\u00ca\u0000\u00ccK\u00ceL\u00d0M\u00d2"+
+    "\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dcN\u00deO\u00e0"+
+    "P\u00e2Q\u00e4\u0000\u00e6\u0000\u00e8\u0000\u00ea\u0000\u00ecR\u00ee"+
+    "\u0000\u00f0S\u00f2T\u00f4U\u00f6\u0000\u00f8\u0000\u00faV\u00fcW\u00fe"+
+    "\u0000\u0100X\u0102\u0000\u0104\u0000\u0106Y\u0108Z\u010a[\u010c\u0000"+
+    "\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u0000\u0116\u0000\u0118\u0000"+
+    "\u011a\\\u011c]\u011e^\u0120\u0000\u0122\u0000\u0124\u0000\u0126\u0000"+
+    "\u0128_\u012a`\u012ca\u012e\u0000\u0130b\u0132c\u0134d\u0136e\u0138\u0000"+
+    "\u013af\u013cg\u013eh\u0140i\u0142\u0000\u0144j\u0146k\u0148l\u014am\u014c"+
+    "n\u014e\u0000\u0150\u0000\u0152o\u0154p\u0156q\u0158\u0000\u015ar\u015c"+
+    "s\u015et\u0160\u0000\u0162\u0000\u0164\u0000\u0166\u0000\u000e\u0000\u0001"+
+    "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\r\u0006\u0000\t\n"+
+    "\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r  \n\u0000\t\n\r\r"+
+    "  ,,//==[[]]``||\u0002\u0000**//\u0001\u000009\u0002\u0000AZaz\u0005\u0000"+
+    "\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000EEee\u0002\u0000"+
+    "++--\u0001\u0000``\u000b\u0000\t\n\r\r  \"#,,//::<<>?\\\\||\u052a\u0000"+
+    "\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000"+
+    "\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000"+
+    "\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000"+
+    "\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000"+
+    "\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\""+
+    "\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000"+
+    "\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000"+
+    "\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000"+
+    "\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000"+
+    "\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000"+
+    "\u0000:\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0001@"+
+    "\u0001\u0000\u0000\u0000\u0001B\u0001\u0000\u0000\u0000\u0001D\u0001\u0000"+
+    "\u0000\u0000\u0001F\u0001\u0000\u0000\u0000\u0001H\u0001\u0000\u0000\u0000"+
+    "\u0002J\u0001\u0000\u0000\u0000\u0002`\u0001\u0000\u0000\u0000\u0002b"+
+    "\u0001\u0000\u0000\u0000\u0002d\u0001\u0000\u0000\u0000\u0002f\u0001\u0000"+
+    "\u0000\u0000\u0002h\u0001\u0000\u0000\u0000\u0002j\u0001\u0000\u0000\u0000"+
+    "\u0002l\u0001\u0000\u0000\u0000\u0002n\u0001\u0000\u0000\u0000\u0002p"+
+    "\u0001\u0000\u0000\u0000\u0002r\u0001\u0000\u0000\u0000\u0002t\u0001\u0000"+
+    "\u0000\u0000\u0002v\u0001\u0000\u0000\u0000\u0002x\u0001\u0000\u0000\u0000"+
+    "\u0002z\u0001\u0000\u0000\u0000\u0002|\u0001\u0000\u0000\u0000\u0002~"+
+    "\u0001\u0000\u0000\u0000\u0002\u0080\u0001\u0000\u0000\u0000\u0002\u0082"+
+    "\u0001\u0000\u0000\u0000\u0002\u0084\u0001\u0000\u0000\u0000\u0002\u0086"+
+    "\u0001\u0000\u0000\u0000\u0002\u0088\u0001\u0000\u0000\u0000\u0002\u008a"+
+    "\u0001\u0000\u0000\u0000\u0002\u008c\u0001\u0000\u0000\u0000\u0002\u008e"+
+    "\u0001\u0000\u0000\u0000\u0002\u0090\u0001\u0000\u0000\u0000\u0002\u0092"+
+    "\u0001\u0000\u0000\u0000\u0002\u0094\u0001\u0000\u0000\u0000\u0002\u0096"+
+    "\u0001\u0000\u0000\u0000\u0002\u0098\u0001\u0000\u0000\u0000\u0002\u009a"+
+    "\u0001\u0000\u0000\u0000\u0002\u009c\u0001\u0000\u0000\u0000\u0002\u009e"+
+    "\u0001\u0000\u0000\u0000\u0002\u00a0\u0001\u0000\u0000\u0000\u0002\u00a2"+
+    "\u0001\u0000\u0000\u0000\u0002\u00a4\u0001\u0000\u0000\u0000\u0002\u00a6"+
+    "\u0001\u0000\u0000\u0000\u0002\u00a8\u0001\u0000\u0000\u0000\u0002\u00aa"+
+    "\u0001\u0000\u0000\u0000\u0002\u00ac\u0001\u0000\u0000\u0000\u0002\u00ae"+
+    "\u0001\u0000\u0000\u0000\u0002\u00b0\u0001\u0000\u0000\u0000\u0002\u00b4"+
+    "\u0001\u0000\u0000\u0000\u0002\u00b6\u0001\u0000\u0000\u0000\u0002\u00b8"+
+    "\u0001\u0000\u0000\u0000\u0002\u00ba\u0001\u0000\u0000\u0000\u0003\u00bc"+
+    "\u0001\u0000\u0000\u0000\u0003\u00be\u0001\u0000\u0000\u0000\u0003\u00c0"+
+    "\u0001\u0000\u0000\u0000\u0003\u00c2\u0001\u0000\u0000\u0000\u0003\u00c4"+
+    "\u0001\u0000\u0000\u0000\u0003\u00c6\u0001\u0000\u0000\u0000\u0003\u00c8"+
+    "\u0001\u0000\u0000\u0000\u0003\u00ca\u0001\u0000\u0000\u0000\u0003\u00cc"+
+    "\u0001\u0000\u0000\u0000\u0003\u00ce\u0001\u0000\u0000\u0000\u0003\u00d0"+
+    "\u0001\u0000\u0000\u0000\u0004\u00d2\u0001\u0000\u0000\u0000\u0004\u00d4"+
+    "\u0001\u0000\u0000\u0000\u0004\u00d6\u0001\u0000\u0000\u0000\u0004\u00dc"+
+    "\u0001\u0000\u0000\u0000\u0004\u00de\u0001\u0000\u0000\u0000\u0004\u00e0"+
+    "\u0001\u0000\u0000\u0000\u0004\u00e2\u0001\u0000\u0000\u0000\u0005\u00e4"+
+    "\u0001\u0000\u0000\u0000\u0005\u00e6\u0001\u0000\u0000\u0000\u0005\u00e8"+
+    "\u0001\u0000\u0000\u0000\u0005\u00ea\u0001\u0000\u0000\u0000\u0005\u00ec"+
+    "\u0001\u0000\u0000\u0000\u0005\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0"+
+    "\u0001\u0000\u0000\u0000\u0005\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4"+
+    "\u0001\u0000\u0000\u0000\u0006\u00f6\u0001\u0000\u0000\u0000\u0006\u00f8"+
+    "\u0001\u0000\u0000\u0000\u0006\u00fa\u0001\u0000\u0000\u0000\u0006\u00fc"+
+    "\u0001\u0000\u0000\u0000\u0006\u0100\u0001\u0000\u0000\u0000\u0006\u0102"+
+    "\u0001\u0000\u0000\u0000\u0006\u0104\u0001\u0000\u0000\u0000\u0006\u0106"+
+    "\u0001\u0000\u0000\u0000\u0006\u0108\u0001\u0000\u0000\u0000\u0006\u010a"+
+    "\u0001\u0000\u0000\u0000\u0007\u010c\u0001\u0000\u0000\u0000\u0007\u010e"+
+    "\u0001\u0000\u0000\u0000\u0007\u0110\u0001\u0000\u0000\u0000\u0007\u0112"+
+    "\u0001\u0000\u0000\u0000\u0007\u0114\u0001\u0000\u0000\u0000\u0007\u0116"+
+    "\u0001\u0000\u0000\u0000\u0007\u0118\u0001\u0000\u0000\u0000\u0007\u011a"+
+    "\u0001\u0000\u0000\u0000\u0007\u011c\u0001\u0000\u0000\u0000\u0007\u011e"+
+    "\u0001\u0000\u0000\u0000\b\u0120\u0001\u0000\u0000\u0000\b\u0122\u0001"+
+    "\u0000\u0000\u0000\b\u0124\u0001\u0000\u0000\u0000\b\u0126\u0001\u0000"+
+    "\u0000\u0000\b\u0128\u0001\u0000\u0000\u0000\b\u012a\u0001\u0000\u0000"+
+    "\u0000\b\u012c\u0001\u0000\u0000\u0000\t\u012e\u0001\u0000\u0000\u0000"+
+    "\t\u0130\u0001\u0000\u0000\u0000\t\u0132\u0001\u0000\u0000\u0000\t\u0134"+
+    "\u0001\u0000\u0000\u0000\t\u0136\u0001\u0000\u0000\u0000\n\u0138\u0001"+
+    "\u0000\u0000\u0000\n\u013a\u0001\u0000\u0000\u0000\n\u013c\u0001\u0000"+
+    "\u0000\u0000\n\u013e\u0001\u0000\u0000\u0000\n\u0140\u0001\u0000\u0000"+
+    "\u0000\u000b\u0142\u0001\u0000\u0000\u0000\u000b\u0144\u0001\u0000\u0000"+
+    "\u0000\u000b\u0146\u0001\u0000\u0000\u0000\u000b\u0148\u0001\u0000\u0000"+
+    "\u0000\u000b\u014a\u0001\u0000\u0000\u0000\u000b\u014c\u0001\u0000\u0000"+
+    "\u0000\f\u014e\u0001\u0000\u0000\u0000\f\u0150\u0001\u0000\u0000\u0000"+
+    "\f\u0152\u0001\u0000\u0000\u0000\f\u0154\u0001\u0000\u0000\u0000\f\u0156"+
+    "\u0001\u0000\u0000\u0000\r\u0158\u0001\u0000\u0000\u0000\r\u015a\u0001"+
+    "\u0000\u0000\u0000\r\u015c\u0001\u0000\u0000\u0000\r\u015e\u0001\u0000"+
+    "\u0000\u0000\r\u0160\u0001\u0000\u0000\u0000\r\u0162\u0001\u0000\u0000"+
+    "\u0000\r\u0164\u0001\u0000\u0000\u0000\r\u0166\u0001\u0000\u0000\u0000"+
+    "\u000e\u0168\u0001\u0000\u0000\u0000\u0010\u0172\u0001\u0000\u0000\u0000"+
+    "\u0012\u0179\u0001\u0000\u0000\u0000\u0014\u0182\u0001\u0000\u0000\u0000"+
+    "\u0016\u0189\u0001\u0000\u0000\u0000\u0018\u0193\u0001\u0000\u0000\u0000"+
+    "\u001a\u019a\u0001\u0000\u0000\u0000\u001c\u01a1\u0001\u0000\u0000\u0000"+
+    "\u001e\u01af\u0001\u0000\u0000\u0000 \u01b6\u0001\u0000\u0000\u0000\""+
+    "\u01be\u0001\u0000\u0000\u0000$\u01c5\u0001\u0000\u0000\u0000&\u01cf\u0001"+
+    "\u0000\u0000\u0000(\u01db\u0001\u0000\u0000\u0000*\u01e4\u0001\u0000\u0000"+
+    "\u0000,\u01ea\u0001\u0000\u0000\u0000.\u01f1\u0001\u0000\u0000\u00000"+
+    "\u01f8\u0001\u0000\u0000\u00002\u0200\u0001\u0000\u0000\u00004\u0209\u0001"+
+    "\u0000\u0000\u00006\u020f\u0001\u0000\u0000\u00008\u0220\u0001\u0000\u0000"+
+    "\u0000:\u0230\u0001\u0000\u0000\u0000<\u0239\u0001\u0000\u0000\u0000>"+
+    "\u023c\u0001\u0000\u0000\u0000@\u0240\u0001\u0000\u0000\u0000B\u0245\u0001"+
+    "\u0000\u0000\u0000D\u024a\u0001\u0000\u0000\u0000F\u024e\u0001\u0000\u0000"+
+    "\u0000H\u0252\u0001\u0000\u0000\u0000J\u0256\u0001\u0000\u0000\u0000L"+
+    "\u025a\u0001\u0000\u0000\u0000N\u025c\u0001\u0000\u0000\u0000P\u025e\u0001"+
+    "\u0000\u0000\u0000R\u0261\u0001\u0000\u0000\u0000T\u0263\u0001\u0000\u0000"+
+    "\u0000V\u026c\u0001\u0000\u0000\u0000X\u026e\u0001\u0000\u0000\u0000Z"+
+    "\u0273\u0001\u0000\u0000\u0000\\\u0275\u0001\u0000\u0000\u0000^\u027a"+
+    "\u0001\u0000\u0000\u0000`\u0299\u0001\u0000\u0000\u0000b\u029c\u0001\u0000"+
+    "\u0000\u0000d\u02ca\u0001\u0000\u0000\u0000f\u02cc\u0001\u0000\u0000\u0000"+
+    "h\u02cf\u0001\u0000\u0000\u0000j\u02d3\u0001\u0000\u0000\u0000l\u02d7"+
+    "\u0001\u0000\u0000\u0000n\u02d9\u0001\u0000\u0000\u0000p\u02dc\u0001\u0000"+
+    "\u0000\u0000r\u02de\u0001\u0000\u0000\u0000t\u02e3\u0001\u0000\u0000\u0000"+
+    "v\u02e5\u0001\u0000\u0000\u0000x\u02eb\u0001\u0000\u0000\u0000z\u02f1"+
+    "\u0001\u0000\u0000\u0000|\u02f6\u0001\u0000\u0000\u0000~\u02f8\u0001\u0000"+
+    "\u0000\u0000\u0080\u02fb\u0001\u0000\u0000\u0000\u0082\u02fe\u0001\u0000"+
+    "\u0000\u0000\u0084\u0303\u0001\u0000\u0000\u0000\u0086\u0307\u0001\u0000"+
+    "\u0000\u0000\u0088\u030c\u0001\u0000\u0000\u0000\u008a\u0312\u0001\u0000"+
+    "\u0000\u0000\u008c\u0315\u0001\u0000\u0000\u0000\u008e\u0317\u0001\u0000"+
+    "\u0000\u0000\u0090\u031d\u0001\u0000\u0000\u0000\u0092\u031f\u0001\u0000"+
+    "\u0000\u0000\u0094\u0324\u0001\u0000\u0000\u0000\u0096\u0327\u0001\u0000"+
+    "\u0000\u0000\u0098\u032a\u0001\u0000\u0000\u0000\u009a\u032d\u0001\u0000"+
+    "\u0000\u0000\u009c\u032f\u0001\u0000\u0000\u0000\u009e\u0332\u0001\u0000"+
+    "\u0000\u0000\u00a0\u0334\u0001\u0000\u0000\u0000\u00a2\u0337\u0001\u0000"+
+    "\u0000\u0000\u00a4\u0339\u0001\u0000\u0000\u0000\u00a6\u033b\u0001\u0000"+
+    "\u0000\u0000\u00a8\u033d\u0001\u0000\u0000\u0000\u00aa\u033f\u0001\u0000"+
+    "\u0000\u0000\u00ac\u0341\u0001\u0000\u0000\u0000\u00ae\u0346\u0001\u0000"+
+    "\u0000\u0000\u00b0\u035b\u0001\u0000\u0000\u0000\u00b2\u035d\u0001\u0000"+
+    "\u0000\u0000\u00b4\u0365\u0001\u0000\u0000\u0000\u00b6\u0367\u0001\u0000"+
+    "\u0000\u0000\u00b8\u036b\u0001\u0000\u0000\u0000\u00ba\u036f\u0001\u0000"+
+    "\u0000\u0000\u00bc\u0373\u0001\u0000\u0000\u0000\u00be\u0378\u0001\u0000"+
+    "\u0000\u0000\u00c0\u037c\u0001\u0000\u0000\u0000\u00c2\u0380\u0001\u0000"+
+    "\u0000\u0000\u00c4\u0384\u0001\u0000\u0000\u0000\u00c6\u0388\u0001\u0000"+
+    "\u0000\u0000\u00c8\u038c\u0001\u0000\u0000\u0000\u00ca\u0395\u0001\u0000"+
+    "\u0000\u0000\u00cc\u0399\u0001\u0000\u0000\u0000\u00ce\u039d\u0001\u0000"+
+    "\u0000\u0000\u00d0\u03a1\u0001\u0000\u0000\u0000\u00d2\u03a5\u0001\u0000"+
+    "\u0000\u0000\u00d4\u03aa\u0001\u0000\u0000\u0000\u00d6\u03ae\u0001\u0000"+
+    "\u0000\u0000\u00d8\u03b6\u0001\u0000\u0000\u0000\u00da\u03cb\u0001\u0000"+
+    "\u0000\u0000\u00dc\u03cf\u0001\u0000\u0000\u0000\u00de\u03d3\u0001\u0000"+
+    "\u0000\u0000\u00e0\u03d7\u0001\u0000\u0000\u0000\u00e2\u03db\u0001\u0000"+
+    "\u0000\u0000\u00e4\u03df\u0001\u0000\u0000\u0000\u00e6\u03e4\u0001\u0000"+
+    "\u0000\u0000\u00e8\u03e8\u0001\u0000\u0000\u0000\u00ea\u03ec\u0001\u0000"+
+    "\u0000\u0000\u00ec\u03f0\u0001\u0000\u0000\u0000\u00ee\u03f3\u0001\u0000"+
+    "\u0000\u0000\u00f0\u03f7\u0001\u0000\u0000\u0000\u00f2\u03fb\u0001\u0000"+
+    "\u0000\u0000\u00f4\u03ff\u0001\u0000\u0000\u0000\u00f6\u0403\u0001\u0000"+
+    "\u0000\u0000\u00f8\u0408\u0001\u0000\u0000\u0000\u00fa\u040d\u0001\u0000"+
+    "\u0000\u0000\u00fc\u0412\u0001\u0000\u0000\u0000\u00fe\u0419\u0001\u0000"+
+    "\u0000\u0000\u0100\u0422\u0001\u0000\u0000\u0000\u0102\u0429\u0001\u0000"+
+    "\u0000\u0000\u0104\u042d\u0001\u0000\u0000\u0000\u0106\u0431\u0001\u0000"+
+    "\u0000\u0000\u0108\u0435\u0001\u0000\u0000\u0000\u010a\u0439\u0001\u0000"+
+    "\u0000\u0000\u010c\u043d\u0001\u0000\u0000\u0000\u010e\u0443\u0001\u0000"+
+    "\u0000\u0000\u0110\u0447\u0001\u0000\u0000\u0000\u0112\u044b\u0001\u0000"+
+    "\u0000\u0000\u0114\u044f\u0001\u0000\u0000\u0000\u0116\u0453\u0001\u0000"+
+    "\u0000\u0000\u0118\u0457\u0001\u0000\u0000\u0000\u011a\u045b\u0001\u0000"+
+    "\u0000\u0000\u011c\u045f\u0001\u0000\u0000\u0000\u011e\u0463\u0001\u0000"+
+    "\u0000\u0000\u0120\u0467\u0001\u0000\u0000\u0000\u0122\u046c\u0001\u0000"+
+    "\u0000\u0000\u0124\u0470\u0001\u0000\u0000\u0000\u0126\u0474\u0001\u0000"+
+    "\u0000\u0000\u0128\u0478\u0001\u0000\u0000\u0000\u012a\u047c\u0001\u0000"+
+    "\u0000\u0000\u012c\u0480\u0001\u0000\u0000\u0000\u012e\u0484\u0001\u0000"+
+    "\u0000\u0000\u0130\u0489\u0001\u0000\u0000\u0000\u0132\u048e\u0001\u0000"+
+    "\u0000\u0000\u0134\u0492\u0001\u0000\u0000\u0000\u0136\u0496\u0001\u0000"+
+    "\u0000\u0000\u0138\u049a\u0001\u0000\u0000\u0000\u013a\u049f\u0001\u0000"+
+    "\u0000\u0000\u013c\u04a9\u0001\u0000\u0000\u0000\u013e\u04ad\u0001\u0000"+
+    "\u0000\u0000\u0140\u04b1\u0001\u0000\u0000\u0000\u0142\u04b5\u0001\u0000"+
+    "\u0000\u0000\u0144\u04ba\u0001\u0000\u0000\u0000\u0146\u04c1\u0001\u0000"+
+    "\u0000\u0000\u0148\u04c5\u0001\u0000\u0000\u0000\u014a\u04c9\u0001\u0000"+
+    "\u0000\u0000\u014c\u04cd\u0001\u0000\u0000\u0000\u014e\u04d1\u0001\u0000"+
+    "\u0000\u0000\u0150\u04d6\u0001\u0000\u0000\u0000\u0152\u04dc\u0001\u0000"+
+    "\u0000\u0000\u0154\u04e0\u0001\u0000\u0000\u0000\u0156\u04e4\u0001\u0000"+
+    "\u0000\u0000\u0158\u04e8\u0001\u0000\u0000\u0000\u015a\u04ee\u0001\u0000"+
+    "\u0000\u0000\u015c\u04f2\u0001\u0000\u0000\u0000\u015e\u04f6\u0001\u0000"+
+    "\u0000\u0000\u0160\u04fa\u0001\u0000\u0000\u0000\u0162\u0500\u0001\u0000"+
+    "\u0000\u0000\u0164\u0506\u0001\u0000\u0000\u0000\u0166\u050c\u0001\u0000"+
+    "\u0000\u0000\u0168\u0169\u0005d\u0000\u0000\u0169\u016a\u0005i\u0000\u0000"+
+    "\u016a\u016b\u0005s\u0000\u0000\u016b\u016c\u0005s\u0000\u0000\u016c\u016d"+
+    "\u0005e\u0000\u0000\u016d\u016e\u0005c\u0000\u0000\u016e\u016f\u0005t"+
+    "\u0000\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170\u0171\u0006\u0000"+
+    "\u0000\u0000\u0171\u000f\u0001\u0000\u0000\u0000\u0172\u0173\u0005d\u0000"+
+    "\u0000\u0173\u0174\u0005r\u0000\u0000\u0174\u0175\u0005o\u0000\u0000\u0175"+
+    "\u0176\u0005p\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u0178"+
+    "\u0006\u0001\u0001\u0000\u0178\u0011\u0001\u0000\u0000\u0000\u0179\u017a"+
+    "\u0005e\u0000\u0000\u017a\u017b\u0005n\u0000\u0000\u017b\u017c\u0005r"+
+    "\u0000\u0000\u017c\u017d\u0005i\u0000\u0000\u017d\u017e\u0005c\u0000\u0000"+
+    "\u017e\u017f\u0005h\u0000\u0000\u017f\u0180\u0001\u0000\u0000\u0000\u0180"+
+    "\u0181\u0006\u0002\u0002\u0000\u0181\u0013\u0001\u0000\u0000\u0000\u0182"+
+    "\u0183\u0005e\u0000\u0000\u0183\u0184\u0005v\u0000\u0000\u0184\u0185\u0005"+
+    "a\u0000\u0000\u0185\u0186\u0005l\u0000\u0000\u0186\u0187\u0001\u0000\u0000"+
+    "\u0000\u0187\u0188\u0006\u0003\u0000\u0000\u0188\u0015\u0001\u0000\u0000"+
+    "\u0000\u0189\u018a\u0005e\u0000\u0000\u018a\u018b\u0005x\u0000\u0000\u018b"+
+    "\u018c\u0005p\u0000\u0000\u018c\u018d\u0005l\u0000\u0000\u018d\u018e\u0005"+
+    "a\u0000\u0000\u018e\u018f\u0005i\u0000\u0000\u018f\u0190\u0005n\u0000"+
+    "\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u0192\u0006\u0004\u0003"+
+    "\u0000\u0192\u0017\u0001\u0000\u0000\u0000\u0193\u0194\u0005f\u0000\u0000"+
+    "\u0194\u0195\u0005r\u0000\u0000\u0195\u0196\u0005o\u0000\u0000\u0196\u0197"+
+    "\u0005m\u0000\u0000\u0197\u0198\u0001\u0000\u0000\u0000\u0198\u0199\u0006"+
+    "\u0005\u0004\u0000\u0199\u0019\u0001\u0000\u0000\u0000\u019a\u019b\u0005"+
+    "g\u0000\u0000\u019b\u019c\u0005r\u0000\u0000\u019c\u019d\u0005o\u0000"+
+    "\u0000\u019d\u019e\u0005k\u0000\u0000\u019e\u019f\u0001\u0000\u0000\u0000"+
+    "\u019f\u01a0\u0006\u0006\u0000\u0000\u01a0\u001b\u0001\u0000\u0000\u0000"+
+    "\u01a1\u01a2\u0005i\u0000\u0000\u01a2\u01a3\u0005n\u0000\u0000\u01a3\u01a4"+
+    "\u0005l\u0000\u0000\u01a4\u01a5\u0005i\u0000\u0000\u01a5\u01a6\u0005n"+
+    "\u0000\u0000\u01a6\u01a7\u0005e\u0000\u0000\u01a7\u01a8\u0005s\u0000\u0000"+
+    "\u01a8\u01a9\u0005t\u0000\u0000\u01a9\u01aa\u0005a\u0000\u0000\u01aa\u01ab"+
+    "\u0005t\u0000\u0000\u01ab\u01ac\u0005s\u0000\u0000\u01ac\u01ad\u0001\u0000"+
+    "\u0000\u0000\u01ad\u01ae\u0006\u0007\u0000\u0000\u01ae\u001d\u0001\u0000"+
+    "\u0000\u0000\u01af\u01b0\u0005k\u0000\u0000\u01b0\u01b1\u0005e\u0000\u0000"+
+    "\u01b1\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005p\u0000\u0000\u01b3\u01b4"+
+    "\u0001\u0000\u0000\u0000\u01b4\u01b5\u0006\b\u0001\u0000\u01b5\u001f\u0001"+
+    "\u0000\u0000\u0000\u01b6\u01b7\u0005l\u0000\u0000\u01b7\u01b8\u0005i\u0000"+
+    "\u0000\u01b8\u01b9\u0005m\u0000\u0000\u01b9\u01ba\u0005i\u0000\u0000\u01ba"+
+    "\u01bb\u0005t\u0000\u0000\u01bb\u01bc\u0001\u0000\u0000\u0000\u01bc\u01bd"+
+    "\u0006\t\u0000\u0000\u01bd!\u0001\u0000\u0000\u0000\u01be\u01bf\u0005"+
+    "m\u0000\u0000\u01bf\u01c0\u0005e\u0000\u0000\u01c0\u01c1\u0005t\u0000"+
+    "\u0000\u01c1\u01c2\u0005a\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000"+
+    "\u01c3\u01c4\u0006\n\u0005\u0000\u01c4#\u0001\u0000\u0000\u0000\u01c5"+
+    "\u01c6\u0005m\u0000\u0000\u01c6\u01c7\u0005e\u0000\u0000\u01c7\u01c8\u0005"+
+    "t\u0000\u0000\u01c8\u01c9\u0005r\u0000\u0000\u01c9\u01ca\u0005i\u0000"+
+    "\u0000\u01ca\u01cb\u0005c\u0000\u0000\u01cb\u01cc\u0005s\u0000\u0000\u01cc"+
+    "\u01cd\u0001\u0000\u0000\u0000\u01cd\u01ce\u0006\u000b\u0006\u0000\u01ce"+
+    "%\u0001\u0000\u0000\u0000\u01cf\u01d0\u0005m\u0000\u0000\u01d0\u01d1\u0005"+
+    "v\u0000\u0000\u01d1\u01d2\u0005_\u0000\u0000\u01d2\u01d3\u0005e\u0000"+
+    "\u0000\u01d3\u01d4\u0005x\u0000\u0000\u01d4\u01d5\u0005p\u0000\u0000\u01d5"+
+    "\u01d6\u0005a\u0000\u0000\u01d6\u01d7\u0005n\u0000\u0000\u01d7\u01d8\u0005"+
+    "d\u0000\u0000\u01d8\u01d9\u0001\u0000\u0000\u0000\u01d9\u01da\u0006\f"+
+    "\u0007\u0000\u01da\'\u0001\u0000\u0000\u0000\u01db\u01dc\u0005r\u0000"+
+    "\u0000\u01dc\u01dd\u0005e\u0000\u0000\u01dd\u01de\u0005n\u0000\u0000\u01de"+
+    "\u01df\u0005a\u0000\u0000\u01df\u01e0\u0005m\u0000\u0000\u01e0\u01e1\u0005"+
+    "e\u0000\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000\u01e2\u01e3\u0006\r"+
+    "\b\u0000\u01e3)\u0001\u0000\u0000\u0000\u01e4\u01e5\u0005r\u0000\u0000"+
+    "\u01e5\u01e6\u0005o\u0000\u0000\u01e6\u01e7\u0005w\u0000\u0000\u01e7\u01e8"+
+    "\u0001\u0000\u0000\u0000\u01e8\u01e9\u0006\u000e\u0000\u0000\u01e9+\u0001"+
+    "\u0000\u0000\u0000\u01ea\u01eb\u0005s\u0000\u0000\u01eb\u01ec\u0005h\u0000"+
+    "\u0000\u01ec\u01ed\u0005o\u0000\u0000\u01ed\u01ee\u0005w\u0000\u0000\u01ee"+
+    "\u01ef\u0001\u0000\u0000\u0000\u01ef\u01f0\u0006\u000f\t\u0000\u01f0-"+
+    "\u0001\u0000\u0000\u0000\u01f1\u01f2\u0005s\u0000\u0000\u01f2\u01f3\u0005"+
+    "o\u0000\u0000\u01f3\u01f4\u0005r\u0000\u0000\u01f4\u01f5\u0005t\u0000"+
+    "\u0000\u01f5\u01f6\u0001\u0000\u0000\u0000\u01f6\u01f7\u0006\u0010\u0000"+
+    "\u0000\u01f7/\u0001\u0000\u0000\u0000\u01f8\u01f9\u0005s\u0000\u0000\u01f9"+
+    "\u01fa\u0005t\u0000\u0000\u01fa\u01fb\u0005a\u0000\u0000\u01fb\u01fc\u0005"+
+    "t\u0000\u0000\u01fc\u01fd\u0005s\u0000\u0000\u01fd\u01fe\u0001\u0000\u0000"+
+    "\u0000\u01fe\u01ff\u0006\u0011\u0000\u0000\u01ff1\u0001\u0000\u0000\u0000"+
+    "\u0200\u0201\u0005w\u0000\u0000\u0201\u0202\u0005h\u0000\u0000\u0202\u0203"+
+    "\u0005e\u0000\u0000\u0203\u0204\u0005r\u0000\u0000\u0204\u0205\u0005e"+
+    "\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u0207\u0006\u0012"+
+    "\u0000\u0000\u02073\u0001\u0000\u0000\u0000\u0208\u020a\b\u0000\u0000"+
+    "\u0000\u0209\u0208\u0001\u0000\u0000\u0000\u020a\u020b\u0001\u0000\u0000"+
+    "\u0000\u020b\u0209\u0001\u0000\u0000\u0000\u020b\u020c\u0001\u0000\u0000"+
+    "\u0000\u020c\u020d\u0001\u0000\u0000\u0000\u020d\u020e\u0006\u0013\u0000"+
+    "\u0000\u020e5\u0001\u0000\u0000\u0000\u020f\u0210\u0005/\u0000\u0000\u0210"+
+    "\u0211\u0005/\u0000\u0000\u0211\u0215\u0001\u0000\u0000\u0000\u0212\u0214"+
+    "\b\u0001\u0000\u0000\u0213\u0212\u0001\u0000\u0000\u0000\u0214\u0217\u0001"+
+    "\u0000\u0000\u0000\u0215\u0213\u0001\u0000\u0000\u0000\u0215\u0216\u0001"+
+    "\u0000\u0000\u0000\u0216\u0219\u0001\u0000\u0000\u0000\u0217\u0215\u0001"+
+    "\u0000\u0000\u0000\u0218\u021a\u0005\r\u0000\u0000\u0219\u0218\u0001\u0000"+
+    "\u0000\u0000\u0219\u021a\u0001\u0000\u0000\u0000\u021a\u021c\u0001\u0000"+
+    "\u0000\u0000\u021b\u021d\u0005\n\u0000\u0000\u021c\u021b\u0001\u0000\u0000"+
+    "\u0000\u021c\u021d\u0001\u0000\u0000\u0000\u021d\u021e\u0001\u0000\u0000"+
+    "\u0000\u021e\u021f\u0006\u0014\n\u0000\u021f7\u0001\u0000\u0000\u0000"+
+    "\u0220\u0221\u0005/\u0000\u0000\u0221\u0222\u0005*\u0000\u0000\u0222\u0227"+
+    "\u0001\u0000\u0000\u0000\u0223\u0226\u00038\u0015\u0000\u0224\u0226\t"+
+    "\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0225\u0224\u0001"+
+    "\u0000\u0000\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0228\u0001"+
+    "\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0228\u022a\u0001"+
+    "\u0000\u0000\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022b\u0005"+
+    "*\u0000\u0000\u022b\u022c\u0005/\u0000\u0000\u022c\u022d\u0001\u0000\u0000"+
+    "\u0000\u022d\u022e\u0006\u0015\n\u0000\u022e9\u0001\u0000\u0000\u0000"+
+    "\u022f\u0231\u0007\u0002\u0000\u0000\u0230\u022f\u0001\u0000\u0000\u0000"+
+    "\u0231\u0232\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000"+
+    "\u0232\u0233\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000\u0000"+
+    "\u0234\u0235\u0006\u0016\n\u0000\u0235;\u0001\u0000\u0000\u0000\u0236"+
+    "\u023a\b\u0003\u0000\u0000\u0237\u0238\u0005/\u0000\u0000\u0238\u023a"+
+    "\b\u0004\u0000\u0000\u0239\u0236\u0001\u0000\u0000\u0000\u0239\u0237\u0001"+
+    "\u0000\u0000\u0000\u023a=\u0001\u0000\u0000\u0000\u023b\u023d\u0003<\u0017"+
+    "\u0000\u023c\u023b\u0001\u0000\u0000\u0000\u023d\u023e\u0001\u0000\u0000"+
+    "\u0000\u023e\u023c\u0001\u0000\u0000\u0000\u023e\u023f\u0001\u0000\u0000"+
+    "\u0000\u023f?\u0001\u0000\u0000\u0000\u0240\u0241\u0003\u00acO\u0000\u0241"+
+    "\u0242\u0001\u0000\u0000\u0000\u0242\u0243\u0006\u0019\u000b\u0000\u0243"+
+    "\u0244\u0006\u0019\f\u0000\u0244A\u0001\u0000\u0000\u0000\u0245\u0246"+
+    "\u0003J\u001e\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006"+
+    "\u001a\r\u0000\u0248\u0249\u0006\u001a\u000e\u0000\u0249C\u0001\u0000"+
+    "\u0000\u0000\u024a\u024b\u0003:\u0016\u0000\u024b\u024c\u0001\u0000\u0000"+
+    "\u0000\u024c\u024d\u0006\u001b\n\u0000\u024dE\u0001\u0000\u0000\u0000"+
+    "\u024e\u024f\u00036\u0014\u0000\u024f\u0250\u0001\u0000\u0000\u0000\u0250"+
+    "\u0251\u0006\u001c\n\u0000\u0251G\u0001\u0000\u0000\u0000\u0252\u0253"+
+    "\u00038\u0015\u0000\u0253\u0254\u0001\u0000\u0000\u0000\u0254\u0255\u0006"+
+    "\u001d\n\u0000\u0255I\u0001\u0000\u0000\u0000\u0256\u0257\u0005|\u0000"+
+    "\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259\u0006\u001e\u000e"+
+    "\u0000\u0259K\u0001\u0000\u0000\u0000\u025a\u025b\u0007\u0005\u0000\u0000"+
+    "\u025bM\u0001\u0000\u0000\u0000\u025c\u025d\u0007\u0006\u0000\u0000\u025d"+
+    "O\u0001\u0000\u0000\u0000\u025e\u025f\u0005\\\u0000\u0000\u025f\u0260"+
+    "\u0007\u0007\u0000\u0000\u0260Q\u0001\u0000\u0000\u0000\u0261\u0262\b"+
+    "\b\u0000\u0000\u0262S\u0001\u0000\u0000\u0000\u0263\u0265\u0007\t\u0000"+
+    "\u0000\u0264\u0266\u0007\n\u0000\u0000\u0265\u0264\u0001\u0000\u0000\u0000"+
+    "\u0265\u0266\u0001\u0000\u0000\u0000\u0266\u0268\u0001\u0000\u0000\u0000"+
+    "\u0267\u0269\u0003L\u001f\u0000\u0268\u0267\u0001\u0000\u0000\u0000\u0269"+
+    "\u026a\u0001\u0000\u0000\u0000\u026a\u0268\u0001\u0000\u0000\u0000\u026a"+
+    "\u026b\u0001\u0000\u0000\u0000\u026bU\u0001\u0000\u0000\u0000\u026c\u026d"+
+    "\u0005@\u0000\u0000\u026dW\u0001\u0000\u0000\u0000\u026e\u026f\u0005`"+
+    "\u0000\u0000\u026fY\u0001\u0000\u0000\u0000\u0270\u0274\b\u000b\u0000"+
+    "\u0000\u0271\u0272\u0005`\u0000\u0000\u0272\u0274\u0005`\u0000\u0000\u0273"+
+    "\u0270\u0001\u0000\u0000\u0000\u0273\u0271\u0001\u0000\u0000\u0000\u0274"+
+    "[\u0001\u0000\u0000\u0000\u0275\u0276\u0005_\u0000\u0000\u0276]\u0001"+
+    "\u0000\u0000\u0000\u0277\u027b\u0003N \u0000\u0278\u027b\u0003L\u001f"+
+    "\u0000\u0279\u027b\u0003\\\'\u0000\u027a\u0277\u0001\u0000\u0000\u0000"+
+    "\u027a\u0278\u0001\u0000\u0000\u0000\u027a\u0279\u0001\u0000\u0000\u0000"+
+    "\u027b_\u0001\u0000\u0000\u0000\u027c\u0281\u0005\"\u0000\u0000\u027d"+
+    "\u0280\u0003P!\u0000\u027e\u0280\u0003R\"\u0000\u027f\u027d\u0001\u0000"+
+    "\u0000\u0000\u027f\u027e\u0001\u0000\u0000\u0000\u0280\u0283\u0001\u0000"+
+    "\u0000\u0000\u0281\u027f\u0001\u0000\u0000\u0000\u0281\u0282\u0001\u0000"+
+    "\u0000\u0000\u0282\u0284\u0001\u0000\u0000\u0000\u0283\u0281\u0001\u0000"+
+    "\u0000\u0000\u0284\u029a\u0005\"\u0000\u0000\u0285\u0286\u0005\"\u0000"+
+    "\u0000\u0286\u0287\u0005\"\u0000\u0000\u0287\u0288\u0005\"\u0000\u0000"+
+    "\u0288\u028c\u0001\u0000\u0000\u0000\u0289\u028b\b\u0001\u0000\u0000\u028a"+
+    "\u0289\u0001\u0000\u0000\u0000\u028b\u028e\u0001\u0000\u0000\u0000\u028c"+
+    "\u028d\u0001\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000\u0000\u028d"+
     "\u028f\u0001\u0000\u0000\u0000\u028e\u028c\u0001\u0000\u0000\u0000\u028f"+
-    "\u0291\u0001\u0000\u0000\u0000\u0290\u028e\u0001\u0000\u0000\u0000\u0291"+
-    "\u0292\u0005\"\u0000\u0000\u0292\u0293\u0005\"\u0000\u0000\u0293\u0294"+
-    "\u0005\"\u0000\u0000\u0294\u0296\u0001\u0000\u0000\u0000\u0295\u0297\u0005"+
-    "\"\u0000\u0000\u0296\u0295\u0001\u0000\u0000\u0000\u0296\u0297\u0001\u0000"+
-    "\u0000\u0000\u0297\u0299\u0001\u0000\u0000\u0000\u0298\u029a\u0005\"\u0000"+
-    "\u0000\u0299\u0298\u0001\u0000\u0000\u0000\u0299\u029a\u0001\u0000\u0000"+
-    "\u0000\u029a\u029c\u0001\u0000\u0000\u0000\u029b\u027e\u0001\u0000\u0000"+
-    "\u0000\u029b\u0287\u0001\u0000\u0000\u0000\u029ca\u0001\u0000\u0000\u0000"+
-    "\u029d\u029f\u0003L\u001f\u0000\u029e\u029d\u0001\u0000\u0000\u0000\u029f"+
-    "\u02a0\u0001\u0000\u0000\u0000\u02a0\u029e\u0001\u0000\u0000\u0000\u02a0"+
-    "\u02a1\u0001\u0000\u0000\u0000\u02a1c\u0001\u0000\u0000\u0000\u02a2\u02a4"+
-    "\u0003L\u001f\u0000\u02a3\u02a2\u0001\u0000\u0000\u0000\u02a4\u02a5\u0001"+
-    "\u0000\u0000\u0000\u02a5\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a6\u0001"+
-    "\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u02ab\u0003"+
-    "t3\u0000\u02a8\u02aa\u0003L\u001f\u0000\u02a9\u02a8\u0001\u0000\u0000"+
-    "\u0000\u02aa\u02ad\u0001\u0000\u0000\u0000\u02ab\u02a9\u0001\u0000\u0000"+
-    "\u0000\u02ab\u02ac\u0001\u0000\u0000\u0000\u02ac\u02cd\u0001\u0000\u0000"+
-    "\u0000\u02ad\u02ab\u0001\u0000\u0000\u0000\u02ae\u02b0\u0003t3\u0000\u02af"+
-    "\u02b1\u0003L\u001f\u0000\u02b0\u02af\u0001\u0000\u0000\u0000\u02b1\u02b2"+
-    "\u0001\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b2\u02b3"+
-    "\u0001\u0000\u0000\u0000\u02b3\u02cd\u0001\u0000\u0000\u0000\u02b4\u02b6"+
-    "\u0003L\u001f\u0000\u02b5\u02b4\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001"+
-    "\u0000\u0000\u0000\u02b7\u02b5\u0001\u0000\u0000\u0000\u02b7\u02b8\u0001"+
-    "\u0000\u0000\u0000\u02b8\u02c0\u0001\u0000\u0000\u0000\u02b9\u02bd\u0003"+
-    "t3\u0000\u02ba\u02bc\u0003L\u001f\u0000\u02bb\u02ba\u0001\u0000\u0000"+
-    "\u0000\u02bc\u02bf\u0001\u0000\u0000\u0000\u02bd\u02bb\u0001\u0000\u0000"+
-    "\u0000\u02bd\u02be\u0001\u0000\u0000\u0000\u02be\u02c1\u0001\u0000\u0000"+
-    "\u0000\u02bf\u02bd\u0001\u0000\u0000\u0000\u02c0\u02b9\u0001\u0000\u0000"+
-    "\u0000\u02c0\u02c1\u0001\u0000\u0000\u0000\u02c1\u02c2\u0001\u0000\u0000"+
-    "\u0000\u02c2\u02c3\u0003T#\u0000\u02c3\u02cd\u0001\u0000\u0000\u0000\u02c4"+
-    "\u02c6\u0003t3\u0000\u02c5\u02c7\u0003L\u001f\u0000\u02c6\u02c5\u0001"+
-    "\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c6\u0001"+
-    "\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u0001"+
-    "\u0000\u0000\u0000\u02ca\u02cb\u0003T#\u0000\u02cb\u02cd\u0001\u0000\u0000"+
-    "\u0000\u02cc\u02a3\u0001\u0000\u0000\u0000\u02cc\u02ae\u0001\u0000\u0000"+
-    "\u0000\u02cc\u02b5\u0001\u0000\u0000\u0000\u02cc\u02c4\u0001\u0000\u0000"+
-    "\u0000\u02cde\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005b\u0000\u0000\u02cf"+
-    "\u02d0\u0005y\u0000\u0000\u02d0g\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005"+
-    "a\u0000\u0000\u02d2\u02d3\u0005n\u0000\u0000\u02d3\u02d4\u0005d\u0000"+
-    "\u0000\u02d4i\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005a\u0000\u0000\u02d6"+
-    "\u02d7\u0005s\u0000\u0000\u02d7\u02d8\u0005c\u0000\u0000\u02d8k\u0001"+
-    "\u0000\u0000\u0000\u02d9\u02da\u0005=\u0000\u0000\u02dam\u0001\u0000\u0000"+
-    "\u0000\u02db\u02dc\u0005:\u0000\u0000\u02dc\u02dd\u0005:\u0000\u0000\u02dd"+
-    "o\u0001\u0000\u0000\u0000\u02de\u02df\u0005,\u0000\u0000\u02dfq\u0001"+
-    "\u0000\u0000\u0000\u02e0\u02e1\u0005d\u0000\u0000\u02e1\u02e2\u0005e\u0000"+
-    "\u0000\u02e2\u02e3\u0005s\u0000\u0000\u02e3\u02e4\u0005c\u0000\u0000\u02e4"+
-    "s\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005.\u0000\u0000\u02e6u\u0001"+
-    "\u0000\u0000\u0000\u02e7\u02e8\u0005f\u0000\u0000\u02e8\u02e9\u0005a\u0000"+
-    "\u0000\u02e9\u02ea\u0005l\u0000\u0000\u02ea\u02eb\u0005s\u0000\u0000\u02eb"+
-    "\u02ec\u0005e\u0000\u0000\u02ecw\u0001\u0000\u0000\u0000\u02ed\u02ee\u0005"+
-    "f\u0000\u0000\u02ee\u02ef\u0005i\u0000\u0000\u02ef\u02f0\u0005r\u0000"+
-    "\u0000\u02f0\u02f1\u0005s\u0000\u0000\u02f1\u02f2\u0005t\u0000\u0000\u02f2"+
-    "y\u0001\u0000\u0000\u0000\u02f3\u02f4\u0005l\u0000\u0000\u02f4\u02f5\u0005"+
-    "a\u0000\u0000\u02f5\u02f6\u0005s\u0000\u0000\u02f6\u02f7\u0005t\u0000"+
-    "\u0000\u02f7{\u0001\u0000\u0000\u0000\u02f8\u02f9\u0005(\u0000\u0000\u02f9"+
-    "}\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005i\u0000\u0000\u02fb\u02fc\u0005"+
-    "n\u0000\u0000\u02fc\u007f\u0001\u0000\u0000\u0000\u02fd\u02fe\u0005i\u0000"+
-    "\u0000\u02fe\u02ff\u0005s\u0000\u0000\u02ff\u0081\u0001\u0000\u0000\u0000"+
-    "\u0300\u0301\u0005l\u0000\u0000\u0301\u0302\u0005i\u0000\u0000\u0302\u0303"+
-    "\u0005k\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304\u0083\u0001\u0000"+
-    "\u0000\u0000\u0305\u0306\u0005n\u0000\u0000\u0306\u0307\u0005o\u0000\u0000"+
-    "\u0307\u0308\u0005t\u0000\u0000\u0308\u0085\u0001\u0000\u0000\u0000\u0309"+
-    "\u030a\u0005n\u0000\u0000\u030a\u030b\u0005u\u0000\u0000\u030b\u030c\u0005"+
-    "l\u0000\u0000\u030c\u030d\u0005l\u0000\u0000\u030d\u0087\u0001\u0000\u0000"+
-    "\u0000\u030e\u030f\u0005n\u0000\u0000\u030f\u0310\u0005u\u0000\u0000\u0310"+
-    "\u0311\u0005l\u0000\u0000\u0311\u0312\u0005l\u0000\u0000\u0312\u0313\u0005"+
-    "s\u0000\u0000\u0313\u0089\u0001\u0000\u0000\u0000\u0314\u0315\u0005o\u0000"+
-    "\u0000\u0315\u0316\u0005r\u0000\u0000\u0316\u008b\u0001\u0000\u0000\u0000"+
-    "\u0317\u0318\u0005?\u0000\u0000\u0318\u008d\u0001\u0000\u0000\u0000\u0319"+
-    "\u031a\u0005r\u0000\u0000\u031a\u031b\u0005l\u0000\u0000\u031b\u031c\u0005"+
-    "i\u0000\u0000\u031c\u031d\u0005k\u0000\u0000\u031d\u031e\u0005e\u0000"+
-    "\u0000\u031e\u008f\u0001\u0000\u0000\u0000\u031f\u0320\u0005)\u0000\u0000"+
-    "\u0320\u0091\u0001\u0000\u0000\u0000\u0321\u0322\u0005t\u0000\u0000\u0322"+
-    "\u0323\u0005r\u0000\u0000\u0323\u0324\u0005u\u0000\u0000\u0324\u0325\u0005"+
-    "e\u0000\u0000\u0325\u0093\u0001\u0000\u0000\u0000\u0326\u0327\u0005=\u0000"+
-    "\u0000\u0327\u0328\u0005=\u0000\u0000\u0328\u0095\u0001\u0000\u0000\u0000"+
-    "\u0329\u032a\u0005=\u0000\u0000\u032a\u032b\u0005~\u0000\u0000\u032b\u0097"+
-    "\u0001\u0000\u0000\u0000\u032c\u032d\u0005!\u0000\u0000\u032d\u032e\u0005"+
-    "=\u0000\u0000\u032e\u0099\u0001\u0000\u0000\u0000\u032f\u0330\u0005<\u0000"+
-    "\u0000\u0330\u009b\u0001\u0000\u0000\u0000\u0331\u0332\u0005<\u0000\u0000"+
-    "\u0332\u0333\u0005=\u0000\u0000\u0333\u009d\u0001\u0000\u0000\u0000\u0334"+
-    "\u0335\u0005>\u0000\u0000\u0335\u009f\u0001\u0000\u0000\u0000\u0336\u0337"+
-    "\u0005>\u0000\u0000\u0337\u0338\u0005=\u0000\u0000\u0338\u00a1\u0001\u0000"+
-    "\u0000\u0000\u0339\u033a\u0005+\u0000\u0000\u033a\u00a3\u0001\u0000\u0000"+
-    "\u0000\u033b\u033c\u0005-\u0000\u0000\u033c\u00a5\u0001\u0000\u0000\u0000"+
-    "\u033d\u033e\u0005*\u0000\u0000\u033e\u00a7\u0001\u0000\u0000\u0000\u033f"+
-    "\u0340\u0005/\u0000\u0000\u0340\u00a9\u0001\u0000\u0000\u0000\u0341\u0342"+
-    "\u0005%\u0000\u0000\u0342\u00ab\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+
-    "[\u0000\u0000\u0344\u0345\u0001\u0000\u0000\u0000\u0345\u0346\u0006O\u0000"+
-    "\u0000\u0346\u0347\u0006O\u0000\u0000\u0347\u00ad\u0001\u0000\u0000\u0000"+
-    "\u0348\u0349\u0005]\u0000\u0000\u0349\u034a\u0001\u0000\u0000\u0000\u034a"+
-    "\u034b\u0006P\u000e\u0000\u034b\u034c\u0006P\u000e\u0000\u034c\u00af\u0001"+
-    "\u0000\u0000\u0000\u034d\u0351\u0003N \u0000\u034e\u0350\u0003^(\u0000"+
-    "\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0353\u0001\u0000\u0000\u0000"+
-    "\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352\u0001\u0000\u0000\u0000"+
-    "\u0352\u035e\u0001\u0000\u0000\u0000\u0353\u0351\u0001\u0000\u0000\u0000"+
-    "\u0354\u0357\u0003\\\'\u0000\u0355\u0357\u0003V$\u0000\u0356\u0354\u0001"+
-    "\u0000\u0000\u0000\u0356\u0355\u0001\u0000\u0000\u0000\u0357\u0359\u0001"+
-    "\u0000\u0000\u0000\u0358\u035a\u0003^(\u0000\u0359\u0358\u0001\u0000\u0000"+
-    "\u0000\u035a\u035b\u0001\u0000\u0000\u0000\u035b\u0359\u0001\u0000\u0000"+
-    "\u0000\u035b\u035c\u0001\u0000\u0000\u0000\u035c\u035e\u0001\u0000\u0000"+
-    "\u0000\u035d\u034d\u0001\u0000\u0000\u0000\u035d\u0356\u0001\u0000\u0000"+
-    "\u0000\u035e\u00b1\u0001\u0000\u0000\u0000\u035f\u0361\u0003X%\u0000\u0360"+
-    "\u0362\u0003Z&\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0362\u0363\u0001"+
-    "\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000\u0000\u0363\u0364\u0001"+
-    "\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365\u0366\u0003"+
-    "X%\u0000\u0366\u00b3\u0001\u0000\u0000\u0000\u0367\u0368\u0003\u00b2R"+
-    "\u0000\u0368\u00b5\u0001\u0000\u0000\u0000\u0369\u036a\u00036\u0014\u0000"+
-    "\u036a\u036b\u0001\u0000\u0000\u0000\u036b\u036c\u0006T\n\u0000\u036c"+
-    "\u00b7\u0001\u0000\u0000\u0000\u036d\u036e\u00038\u0015\u0000\u036e\u036f"+
-    "\u0001\u0000\u0000\u0000\u036f\u0370\u0006U\n\u0000\u0370\u00b9\u0001"+
-    "\u0000\u0000\u0000\u0371\u0372\u0003:\u0016\u0000\u0372\u0373\u0001\u0000"+
-    "\u0000\u0000\u0373\u0374\u0006V\n\u0000\u0374\u00bb\u0001\u0000\u0000"+
-    "\u0000\u0375\u0376\u0003J\u001e\u0000\u0376\u0377\u0001\u0000\u0000\u0000"+
-    "\u0377\u0378\u0006W\r\u0000\u0378\u0379\u0006W\u000e\u0000\u0379\u00bd"+
-    "\u0001\u0000\u0000\u0000\u037a\u037b\u0003\u00acO\u0000\u037b\u037c\u0001"+
-    "\u0000\u0000\u0000\u037c\u037d\u0006X\u000b\u0000\u037d\u00bf\u0001\u0000"+
-    "\u0000\u0000\u037e\u037f\u0003\u00aeP\u0000\u037f\u0380\u0001\u0000\u0000"+
-    "\u0000\u0380\u0381\u0006Y\u000f\u0000\u0381\u00c1\u0001\u0000\u0000\u0000"+
-    "\u0382\u0383\u0003p1\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384\u0385"+
-    "\u0006Z\u0010\u0000\u0385\u00c3\u0001\u0000\u0000\u0000\u0386\u0387\u0003"+
-    "l/\u0000\u0387\u0388\u0001\u0000\u0000\u0000\u0388\u0389\u0006[\u0011"+
-    "\u0000\u0389\u00c5\u0001\u0000\u0000\u0000\u038a\u038b\u0003`)\u0000\u038b"+
-    "\u038c\u0001\u0000\u0000\u0000\u038c\u038d\u0006\\\u0012\u0000\u038d\u00c7"+
-    "\u0001\u0000\u0000\u0000\u038e\u038f\u0005o\u0000\u0000\u038f\u0390\u0005"+
-    "p\u0000\u0000\u0390\u0391\u0005t\u0000\u0000\u0391\u0392\u0005i\u0000"+
-    "\u0000\u0392\u0393\u0005o\u0000\u0000\u0393\u0394\u0005n\u0000\u0000\u0394"+
-    "\u0395\u0005s\u0000\u0000\u0395\u00c9\u0001\u0000\u0000\u0000\u0396\u0397"+
-    "\u0005m\u0000\u0000\u0397\u0398\u0005e\u0000\u0000\u0398\u0399\u0005t"+
-    "\u0000\u0000\u0399\u039a\u0005a\u0000\u0000\u039a\u039b\u0005d\u0000\u0000"+
-    "\u039b\u039c\u0005a\u0000\u0000\u039c\u039d\u0005t\u0000\u0000\u039d\u039e"+
-    "\u0005a\u0000\u0000\u039e\u00cb\u0001\u0000\u0000\u0000\u039f\u03a0\u0003"+
-    ">\u0018\u0000\u03a0\u03a1\u0001\u0000\u0000\u0000\u03a1\u03a2\u0006_\u0013"+
-    "\u0000\u03a2\u00cd\u0001\u0000\u0000\u0000\u03a3\u03a4\u00036\u0014\u0000"+
-    "\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0006`\n\u0000\u03a6"+
-    "\u00cf\u0001\u0000\u0000\u0000\u03a7\u03a8\u00038\u0015\u0000\u03a8\u03a9"+
-    "\u0001\u0000\u0000\u0000\u03a9\u03aa\u0006a\n\u0000\u03aa\u00d1\u0001"+
-    "\u0000\u0000\u0000\u03ab\u03ac\u0003:\u0016\u0000\u03ac\u03ad\u0001\u0000"+
-    "\u0000\u0000\u03ad\u03ae\u0006b\n\u0000\u03ae\u00d3\u0001\u0000\u0000"+
-    "\u0000\u03af\u03b0\u0003J\u001e\u0000\u03b0\u03b1\u0001\u0000\u0000\u0000"+
-    "\u03b1\u03b2\u0006c\r\u0000\u03b2\u03b3\u0006c\u000e\u0000\u03b3\u00d5"+
-    "\u0001\u0000\u0000\u0000\u03b4\u03b5\u0003t3\u0000\u03b5\u03b6\u0001\u0000"+
-    "\u0000\u0000\u03b6\u03b7\u0006d\u0014\u0000\u03b7\u00d7\u0001\u0000\u0000"+
-    "\u0000\u03b8\u03b9\u0003p1\u0000\u03b9\u03ba\u0001\u0000\u0000\u0000\u03ba"+
-    "\u03bb\u0006e\u0010\u0000\u03bb\u00d9\u0001\u0000\u0000\u0000\u03bc\u03c1"+
-    "\u0003N \u0000\u03bd\u03c1\u0003L\u001f\u0000\u03be\u03c1\u0003\\\'\u0000"+
-    "\u03bf\u03c1\u0003\u00a6L\u0000\u03c0\u03bc\u0001\u0000\u0000\u0000\u03c0"+
-    "\u03bd\u0001\u0000\u0000\u0000\u03c0\u03be\u0001\u0000\u0000\u0000\u03c0"+
-    "\u03bf\u0001\u0000\u0000\u0000\u03c1\u00db\u0001\u0000\u0000\u0000\u03c2"+
-    "\u03c5\u0003N \u0000\u03c3\u03c5\u0003\u00a6L\u0000\u03c4\u03c2\u0001"+
-    "\u0000\u0000\u0000\u03c4\u03c3\u0001\u0000\u0000\u0000\u03c5\u03c9\u0001"+
-    "\u0000\u0000\u0000\u03c6\u03c8\u0003\u00daf\u0000\u03c7\u03c6\u0001\u0000"+
-    "\u0000\u0000\u03c8\u03cb\u0001\u0000\u0000\u0000\u03c9\u03c7\u0001\u0000"+
-    "\u0000\u0000\u03c9\u03ca\u0001\u0000\u0000\u0000\u03ca\u03d6\u0001\u0000"+
-    "\u0000\u0000\u03cb\u03c9\u0001\u0000\u0000\u0000\u03cc\u03cf\u0003\\\'"+
-    "\u0000\u03cd\u03cf\u0003V$\u0000\u03ce\u03cc\u0001\u0000\u0000\u0000\u03ce"+
-    "\u03cd\u0001\u0000\u0000\u0000\u03cf\u03d1\u0001\u0000\u0000\u0000\u03d0"+
-    "\u03d2\u0003\u00daf\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d2\u03d3"+
-    "\u0001\u0000\u0000\u0000\u03d3\u03d1\u0001\u0000\u0000\u0000\u03d3\u03d4"+
-    "\u0001\u0000\u0000\u0000\u03d4\u03d6\u0001\u0000\u0000\u0000\u03d5\u03c4"+
-    "\u0001\u0000\u0000\u0000\u03d5\u03ce\u0001\u0000\u0000\u0000\u03d6\u00dd"+
-    "\u0001\u0000\u0000\u0000\u03d7\u03da\u0003\u00dcg\u0000\u03d8\u03da\u0003"+
-    "\u00b2R\u0000\u03d9\u03d7\u0001\u0000\u0000\u0000\u03d9\u03d8\u0001\u0000"+
-    "\u0000\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03d9\u0001\u0000"+
-    "\u0000\u0000\u03db\u03dc\u0001\u0000\u0000\u0000\u03dc\u00df\u0001\u0000"+
-    "\u0000\u0000\u03dd\u03de\u00036\u0014\u0000\u03de\u03df\u0001\u0000\u0000"+
-    "\u0000\u03df\u03e0\u0006i\n\u0000\u03e0\u00e1\u0001\u0000\u0000\u0000"+
-    "\u03e1\u03e2\u00038\u0015\u0000\u03e2\u03e3\u0001\u0000\u0000\u0000\u03e3"+
-    "\u03e4\u0006j\n\u0000\u03e4\u00e3\u0001\u0000\u0000\u0000\u03e5\u03e6"+
-    "\u0003:\u0016\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e8\u0006"+
-    "k\n\u0000\u03e8\u00e5\u0001\u0000\u0000\u0000\u03e9\u03ea\u0003J\u001e"+
-    "\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03eb\u03ec\u0006l\r\u0000"+
-    "\u03ec\u03ed\u0006l\u000e\u0000\u03ed\u00e7\u0001\u0000\u0000\u0000\u03ee"+
-    "\u03ef\u0003l/\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0\u03f1\u0006"+
-    "m\u0011\u0000\u03f1\u00e9\u0001\u0000\u0000\u0000\u03f2\u03f3\u0003p1"+
-    "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0006n\u0010\u0000"+
-    "\u03f5\u00eb\u0001\u0000\u0000\u0000\u03f6\u03f7\u0003t3\u0000\u03f7\u03f8"+
-    "\u0001\u0000\u0000\u0000\u03f8\u03f9\u0006o\u0014\u0000\u03f9\u00ed\u0001"+
-    "\u0000\u0000\u0000\u03fa\u03fb\u0005a\u0000\u0000\u03fb\u03fc\u0005s\u0000"+
-    "\u0000\u03fc\u00ef\u0001\u0000\u0000\u0000\u03fd\u03fe\u0003\u00deh\u0000"+
-    "\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0006q\u0015\u0000\u0400"+
-    "\u00f1\u0001\u0000\u0000\u0000\u0401\u0402\u00036\u0014\u0000\u0402\u0403"+
-    "\u0001\u0000\u0000\u0000\u0403\u0404\u0006r\n\u0000\u0404\u00f3\u0001"+
-    "\u0000\u0000\u0000\u0405\u0406\u00038\u0015\u0000\u0406\u0407\u0001\u0000"+
-    "\u0000\u0000\u0407\u0408\u0006s\n\u0000\u0408\u00f5\u0001\u0000\u0000"+
-    "\u0000\u0409\u040a\u0003:\u0016\u0000\u040a\u040b\u0001\u0000\u0000\u0000"+
-    "\u040b\u040c\u0006t\n\u0000\u040c\u00f7\u0001\u0000\u0000\u0000\u040d"+
-    "\u040e\u0003J\u001e\u0000\u040e\u040f\u0001\u0000\u0000\u0000\u040f\u0410"+
-    "\u0006u\r\u0000\u0410\u0411\u0006u\u000e\u0000\u0411\u00f9\u0001\u0000"+
-    "\u0000\u0000\u0412\u0413\u0003\u00acO\u0000\u0413\u0414\u0001\u0000\u0000"+
-    "\u0000\u0414\u0415\u0006v\u000b\u0000\u0415\u0416\u0006v\u0016\u0000\u0416"+
-    "\u00fb\u0001\u0000\u0000\u0000\u0417\u0418\u0005o\u0000\u0000\u0418\u0419"+
-    "\u0005n\u0000\u0000\u0419\u041a\u0001\u0000\u0000\u0000\u041a\u041b\u0006"+
-    "w\u0017\u0000\u041b\u00fd\u0001\u0000\u0000\u0000\u041c\u041d\u0005w\u0000"+
-    "\u0000\u041d\u041e\u0005i\u0000\u0000\u041e\u041f\u0005t\u0000\u0000\u041f"+
-    "\u0420\u0005h\u0000\u0000\u0420\u0421\u0001\u0000\u0000\u0000\u0421\u0422"+
-    "\u0006x\u0017\u0000\u0422\u00ff\u0001\u0000\u0000\u0000\u0423\u0424\b"+
-    "\f\u0000\u0000\u0424\u0101\u0001\u0000\u0000\u0000\u0425\u0427\u0003\u0100"+
-    "y\u0000\u0426\u0425\u0001\u0000\u0000\u0000\u0427\u0428\u0001\u0000\u0000"+
-    "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0429\u0001\u0000\u0000"+
-    "\u0000\u0429\u042a\u0001\u0000\u0000\u0000\u042a\u042b\u0003\u0146\u009c"+
-    "\u0000\u042b\u042d\u0001\u0000\u0000\u0000\u042c\u0426\u0001\u0000\u0000"+
-    "\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d\u042f\u0001\u0000\u0000"+
-    "\u0000\u042e\u0430\u0003\u0100y\u0000\u042f\u042e\u0001\u0000\u0000\u0000"+
-    "\u0430\u0431\u0001\u0000\u0000\u0000\u0431\u042f\u0001\u0000\u0000\u0000"+
-    "\u0431\u0432\u0001\u0000\u0000\u0000\u0432\u0103\u0001\u0000\u0000\u0000"+
-    "\u0433\u0434\u0003\u00b4S\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435"+
-    "\u0436\u0006{\u0018\u0000\u0436\u0105\u0001\u0000\u0000\u0000\u0437\u0438"+
-    "\u0003\u0102z\u0000\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a\u0006"+
-    "|\u0019\u0000\u043a\u0107\u0001\u0000\u0000\u0000\u043b\u043c\u00036\u0014"+
-    "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0006}\n\u0000"+
-    "\u043e\u0109\u0001\u0000\u0000\u0000\u043f\u0440\u00038\u0015\u0000\u0440"+
-    "\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0006~\n\u0000\u0442\u010b"+
-    "\u0001\u0000\u0000\u0000\u0443\u0444\u0003:\u0016\u0000\u0444\u0445\u0001"+
-    "\u0000\u0000\u0000\u0445\u0446\u0006\u007f\n\u0000\u0446\u010d\u0001\u0000"+
-    "\u0000\u0000\u0447\u0448\u0003J\u001e\u0000\u0448\u0449\u0001\u0000\u0000"+
-    "\u0000\u0449\u044a\u0006\u0080\r\u0000\u044a\u044b\u0006\u0080\u000e\u0000"+
-    "\u044b\u044c\u0006\u0080\u000e\u0000\u044c\u010f\u0001\u0000\u0000\u0000"+
-    "\u044d\u044e\u0003l/\u0000\u044e\u044f\u0001\u0000\u0000\u0000\u044f\u0450"+
-    "\u0006\u0081\u0011\u0000\u0450\u0111\u0001\u0000\u0000\u0000\u0451\u0452"+
-    "\u0003p1\u0000\u0452\u0453\u0001\u0000\u0000\u0000\u0453\u0454\u0006\u0082"+
-    "\u0010\u0000\u0454\u0113\u0001\u0000\u0000\u0000\u0455\u0456\u0003t3\u0000"+
-    "\u0456\u0457\u0001\u0000\u0000\u0000\u0457\u0458\u0006\u0083\u0014\u0000"+
-    "\u0458\u0115\u0001\u0000\u0000\u0000\u0459\u045a\u0003\u00fex\u0000\u045a"+
-    "\u045b\u0001\u0000\u0000\u0000\u045b\u045c\u0006\u0084\u001a\u0000\u045c"+
-    "\u0117\u0001\u0000\u0000\u0000\u045d\u045e\u0003\u00deh\u0000\u045e\u045f"+
-    "\u0001\u0000\u0000\u0000\u045f\u0460\u0006\u0085\u0015\u0000\u0460\u0119"+
-    "\u0001\u0000\u0000\u0000\u0461\u0462\u0003\u00b4S\u0000\u0462\u0463\u0001"+
-    "\u0000\u0000\u0000\u0463\u0464\u0006\u0086\u0018\u0000\u0464\u011b\u0001"+
-    "\u0000\u0000\u0000\u0465\u0466\u00036\u0014\u0000\u0466\u0467\u0001\u0000"+
-    "\u0000\u0000\u0467\u0468\u0006\u0087\n\u0000\u0468\u011d\u0001\u0000\u0000"+
-    "\u0000\u0469\u046a\u00038\u0015\u0000\u046a\u046b\u0001\u0000\u0000\u0000"+
-    "\u046b\u046c\u0006\u0088\n\u0000\u046c\u011f\u0001\u0000\u0000\u0000\u046d"+
-    "\u046e\u0003:\u0016\u0000\u046e\u046f\u0001\u0000\u0000\u0000\u046f\u0470"+
-    "\u0006\u0089\n\u0000\u0470\u0121\u0001\u0000\u0000\u0000\u0471\u0472\u0003"+
-    "J\u001e\u0000\u0472\u0473\u0001\u0000\u0000\u0000\u0473\u0474\u0006\u008a"+
-    "\r\u0000\u0474\u0475\u0006\u008a\u000e\u0000\u0475\u0123\u0001\u0000\u0000"+
-    "\u0000\u0476\u0477\u0003t3\u0000\u0477\u0478\u0001\u0000\u0000\u0000\u0478"+
-    "\u0479\u0006\u008b\u0014\u0000\u0479\u0125\u0001\u0000\u0000\u0000\u047a"+
-    "\u047b\u0003\u00b4S\u0000\u047b\u047c\u0001\u0000\u0000\u0000\u047c\u047d"+
-    "\u0006\u008c\u0018\u0000\u047d\u0127\u0001\u0000\u0000\u0000\u047e\u047f"+
-    "\u0003\u00b0Q\u0000\u047f\u0480\u0001\u0000\u0000\u0000\u0480\u0481\u0006"+
-    "\u008d\u001b\u0000\u0481\u0129\u0001\u0000\u0000\u0000\u0482\u0483\u0003"+
-    "6\u0014\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0485\u0006\u008e"+
-    "\n\u0000\u0485\u012b\u0001\u0000\u0000\u0000\u0486\u0487\u00038\u0015"+
-    "\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0489\u0006\u008f\n\u0000"+
-    "\u0489\u012d\u0001\u0000\u0000\u0000\u048a\u048b\u0003:\u0016\u0000\u048b"+
-    "\u048c\u0001\u0000\u0000\u0000\u048c\u048d\u0006\u0090\n\u0000\u048d\u012f"+
-    "\u0001\u0000\u0000\u0000\u048e\u048f\u0003J\u001e\u0000\u048f\u0490\u0001"+
-    "\u0000\u0000\u0000\u0490\u0491\u0006\u0091\r\u0000\u0491\u0492\u0006\u0091"+
-    "\u000e\u0000\u0492\u0131\u0001\u0000\u0000\u0000\u0493\u0494\u0005i\u0000"+
-    "\u0000\u0494\u0495\u0005n\u0000\u0000\u0495\u0496\u0005f\u0000\u0000\u0496"+
-    "\u0497\u0005o\u0000\u0000\u0497\u0133\u0001\u0000\u0000\u0000\u0498\u0499"+
-    "\u00036\u0014\u0000\u0499\u049a\u0001\u0000\u0000\u0000\u049a\u049b\u0006"+
-    "\u0093\n\u0000\u049b\u0135\u0001\u0000\u0000\u0000\u049c\u049d\u00038"+
-    "\u0015\u0000\u049d\u049e\u0001\u0000\u0000\u0000\u049e\u049f\u0006\u0094"+
-    "\n\u0000\u049f\u0137\u0001\u0000\u0000\u0000\u04a0\u04a1\u0003:\u0016"+
-    "\u0000\u04a1\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3\u0006\u0095\n\u0000"+
-    "\u04a3\u0139\u0001\u0000\u0000\u0000\u04a4\u04a5\u0003J\u001e\u0000\u04a5"+
-    "\u04a6\u0001\u0000\u0000\u0000\u04a6\u04a7\u0006\u0096\r\u0000\u04a7\u04a8"+
-    "\u0006\u0096\u000e\u0000\u04a8\u013b\u0001\u0000\u0000\u0000\u04a9\u04aa"+
-    "\u0005f\u0000\u0000\u04aa\u04ab\u0005u\u0000\u0000\u04ab\u04ac\u0005n"+
-    "\u0000\u0000\u04ac\u04ad\u0005c\u0000\u0000\u04ad\u04ae\u0005t\u0000\u0000"+
-    "\u04ae\u04af\u0005i\u0000\u0000\u04af\u04b0\u0005o\u0000\u0000\u04b0\u04b1"+
-    "\u0005n\u0000\u0000\u04b1\u04b2\u0005s\u0000\u0000\u04b2\u013d\u0001\u0000"+
-    "\u0000\u0000\u04b3\u04b4\u00036\u0014\u0000\u04b4\u04b5\u0001\u0000\u0000"+
-    "\u0000\u04b5\u04b6\u0006\u0098\n\u0000\u04b6\u013f\u0001\u0000\u0000\u0000"+
-    "\u04b7\u04b8\u00038\u0015\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9"+
-    "\u04ba\u0006\u0099\n\u0000\u04ba\u0141\u0001\u0000\u0000\u0000\u04bb\u04bc"+
-    "\u0003:\u0016\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0006"+
-    "\u009a\n\u0000\u04be\u0143\u0001\u0000\u0000\u0000\u04bf\u04c0\u0003\u00ae"+
-    "P\u0000\u04c0\u04c1\u0001\u0000\u0000\u0000\u04c1\u04c2\u0006\u009b\u000f"+
-    "\u0000\u04c2\u04c3\u0006\u009b\u000e\u0000\u04c3\u0145\u0001\u0000\u0000"+
-    "\u0000\u04c4\u04c5\u0005:\u0000\u0000\u04c5\u0147\u0001\u0000\u0000\u0000"+
-    "\u04c6\u04cc\u0003V$\u0000\u04c7\u04cc\u0003L\u001f\u0000\u04c8\u04cc"+
-    "\u0003t3\u0000\u04c9\u04cc\u0003N \u0000\u04ca\u04cc\u0003\\\'\u0000\u04cb"+
-    "\u04c6\u0001\u0000\u0000\u0000\u04cb\u04c7\u0001\u0000\u0000\u0000\u04cb"+
-    "\u04c8\u0001\u0000\u0000\u0000\u04cb\u04c9\u0001\u0000\u0000\u0000\u04cb"+
-    "\u04ca\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000\u0000\u0000\u04cd"+
-    "\u04cb\u0001\u0000\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000\u04ce"+
-    "\u0149\u0001\u0000\u0000\u0000\u04cf\u04d0\u00036\u0014\u0000\u04d0\u04d1"+
-    "\u0001\u0000\u0000\u0000\u04d1\u04d2\u0006\u009e\n\u0000\u04d2\u014b\u0001"+
-    "\u0000\u0000\u0000\u04d3\u04d4\u00038\u0015\u0000\u04d4\u04d5\u0001\u0000"+
-    "\u0000\u0000\u04d5\u04d6\u0006\u009f\n\u0000\u04d6\u014d\u0001\u0000\u0000"+
-    "\u0000\u04d7\u04d8\u0003:\u0016\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000"+
-    "\u04d9\u04da\u0006\u00a0\n\u0000\u04da\u014f\u0001\u0000\u0000\u0000\u04db"+
-    "\u04dc\u0003J\u001e\u0000\u04dc\u04dd\u0001\u0000\u0000\u0000\u04dd\u04de"+
-    "\u0006\u00a1\r\u0000\u04de\u04df\u0006\u00a1\u000e\u0000\u04df\u0151\u0001"+
-    "\u0000\u0000\u0000\u04e0\u04e1\u0003>\u0018\u0000\u04e1\u04e2\u0001\u0000"+
-    "\u0000\u0000\u04e2\u04e3\u0006\u00a2\u0013\u0000\u04e3\u04e4\u0006\u00a2"+
-    "\u000e\u0000\u04e4\u04e5\u0006\u00a2\u001c\u0000\u04e5\u0153\u0001\u0000"+
-    "\u0000\u0000\u04e6\u04e7\u00036\u0014\u0000\u04e7\u04e8\u0001\u0000\u0000"+
-    "\u0000\u04e8\u04e9\u0006\u00a3\n\u0000\u04e9\u0155\u0001\u0000\u0000\u0000"+
-    "\u04ea\u04eb\u00038\u0015\u0000\u04eb\u04ec\u0001\u0000\u0000\u0000\u04ec"+
-    "\u04ed\u0006\u00a4\n\u0000\u04ed\u0157\u0001\u0000\u0000\u0000\u04ee\u04ef"+
-    "\u0003:\u0016\u0000\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0\u04f1\u0006"+
-    "\u00a5\n\u0000\u04f1\u0159\u0001\u0000\u0000\u0000\u04f2\u04f3\u0003p"+
-    "1\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f5\u0006\u00a6\u0010"+
-    "\u0000\u04f5\u04f6\u0006\u00a6\u000e\u0000\u04f6\u04f7\u0006\u00a6\u0006"+
-    "\u0000\u04f7\u015b\u0001\u0000\u0000\u0000\u04f8\u04f9\u00036\u0014\u0000"+
-    "\u04f9\u04fa\u0001\u0000\u0000\u0000\u04fa\u04fb\u0006\u00a7\n\u0000\u04fb"+
-    "\u015d\u0001\u0000\u0000\u0000\u04fc\u04fd\u00038\u0015\u0000\u04fd\u04fe"+
-    "\u0001\u0000\u0000\u0000\u04fe\u04ff\u0006\u00a8\n\u0000\u04ff\u015f\u0001"+
-    "\u0000\u0000\u0000\u0500\u0501\u0003:\u0016\u0000\u0501\u0502\u0001\u0000"+
-    "\u0000\u0000\u0502\u0503\u0006\u00a9\n\u0000\u0503\u0161\u0001\u0000\u0000"+
-    "\u0000\u0504\u0505\u0003\u00b4S\u0000\u0505\u0506\u0001\u0000\u0000\u0000"+
-    "\u0506\u0507\u0006\u00aa\u000e\u0000\u0507\u0508\u0006\u00aa\u0000\u0000"+
-    "\u0508\u0509\u0006\u00aa\u0018\u0000\u0509\u0163\u0001\u0000\u0000\u0000"+
-    "\u050a\u050b\u0003\u00b0Q\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c"+
-    "\u050d\u0006\u00ab\u000e\u0000\u050d\u050e\u0006\u00ab\u0000\u0000\u050e"+
-    "\u050f\u0006\u00ab\u001b\u0000\u050f\u0165\u0001\u0000\u0000\u0000\u0510"+
-    "\u0511\u0003f,\u0000\u0511\u0512\u0001\u0000\u0000\u0000\u0512\u0513\u0006"+
-    "\u00ac\u000e\u0000\u0513\u0514\u0006\u00ac\u0000\u0000\u0514\u0515\u0006"+
-    "\u00ac\u001d\u0000\u0515\u0167\u0001\u0000\u0000\u0000\u0516\u0517\u0003"+
-    "J\u001e\u0000\u0517\u0518\u0001\u0000\u0000\u0000\u0518\u0519\u0006\u00ad"+
-    "\r\u0000\u0519\u051a\u0006\u00ad\u000e\u0000\u051a\u0169\u0001\u0000\u0000"+
-    "\u0000<\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+
-    "\r\u020d\u0217\u021b\u021e\u0227\u0229\u0234\u023b\u0240\u0267\u026c\u0275"+
-    "\u027c\u0281\u0283\u028e\u0296\u0299\u029b\u02a0\u02a5\u02ab\u02b2\u02b7"+
-    "\u02bd\u02c0\u02c8\u02cc\u0351\u0356\u035b\u035d\u0363\u03c0\u03c4\u03c9"+
-    "\u03ce\u03d3\u03d5\u03d9\u03db\u0428\u042c\u0431\u04cb\u04cd\u001e\u0005"+
-    "\u0002\u0000\u0005\u0004\u0000\u0005\u0006\u0000\u0005\u0001\u0000\u0005"+
-    "\u0003\u0000\u0005\n\u0000\u0005\f\u0000\u0005\b\u0000\u0005\u0005\u0000"+
-    "\u0005\t\u0000\u0000\u0001\u0000\u0007C\u0000\u0005\u0000\u0000\u0007"+
-    "\u001c\u0000\u0004\u0000\u0000\u0007D\u0000\u0007%\u0000\u0007#\u0000"+
-    "\u0007\u001d\u0000\u0007\u0018\u0000\u0007\'\u0000\u0007O\u0000\u0005"+
-    "\u000b\u0000\u0005\u0007\u0000\u0007F\u0000\u0007Y\u0000\u0007X\u0000"+
-    "\u0007E\u0000\u0005\r\u0000\u0007 \u0000";
+    "\u0290\u0005\"\u0000\u0000\u0290\u0291\u0005\"\u0000\u0000\u0291\u0292"+
+    "\u0005\"\u0000\u0000\u0292\u0294\u0001\u0000\u0000\u0000\u0293\u0295\u0005"+
+    "\"\u0000\u0000\u0294\u0293\u0001\u0000\u0000\u0000\u0294\u0295\u0001\u0000"+
+    "\u0000\u0000\u0295\u0297\u0001\u0000\u0000\u0000\u0296\u0298\u0005\"\u0000"+
+    "\u0000\u0297\u0296\u0001\u0000\u0000\u0000\u0297\u0298\u0001\u0000\u0000"+
+    "\u0000\u0298\u029a\u0001\u0000\u0000\u0000\u0299\u027c\u0001\u0000\u0000"+
+    "\u0000\u0299\u0285\u0001\u0000\u0000\u0000\u029aa\u0001\u0000\u0000\u0000"+
+    "\u029b\u029d\u0003L\u001f\u0000\u029c\u029b\u0001\u0000\u0000\u0000\u029d"+
+    "\u029e\u0001\u0000\u0000\u0000\u029e\u029c\u0001\u0000\u0000\u0000\u029e"+
+    "\u029f\u0001\u0000\u0000\u0000\u029fc\u0001\u0000\u0000\u0000\u02a0\u02a2"+
+    "\u0003L\u001f\u0000\u02a1\u02a0\u0001\u0000\u0000\u0000\u02a2\u02a3\u0001"+
+    "\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000\u02a3\u02a4\u0001"+
+    "\u0000\u0000\u0000\u02a4\u02a5\u0001\u0000\u0000\u0000\u02a5\u02a9\u0003"+
+    "t3\u0000\u02a6\u02a8\u0003L\u001f\u0000\u02a7\u02a6\u0001\u0000\u0000"+
+    "\u0000\u02a8\u02ab\u0001\u0000\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000"+
+    "\u0000\u02a9\u02aa\u0001\u0000\u0000\u0000\u02aa\u02cb\u0001\u0000\u0000"+
+    "\u0000\u02ab\u02a9\u0001\u0000\u0000\u0000\u02ac\u02ae\u0003t3\u0000\u02ad"+
+    "\u02af\u0003L\u001f\u0000\u02ae\u02ad\u0001\u0000\u0000\u0000\u02af\u02b0"+
+    "\u0001\u0000\u0000\u0000\u02b0\u02ae\u0001\u0000\u0000\u0000\u02b0\u02b1"+
+    "\u0001\u0000\u0000\u0000\u02b1\u02cb\u0001\u0000\u0000\u0000\u02b2\u02b4"+
+    "\u0003L\u001f\u0000\u02b3\u02b2\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001"+
+    "\u0000\u0000\u0000\u02b5\u02b3\u0001\u0000\u0000\u0000\u02b5\u02b6\u0001"+
+    "\u0000\u0000\u0000\u02b6\u02be\u0001\u0000\u0000\u0000\u02b7\u02bb\u0003"+
+    "t3\u0000\u02b8\u02ba\u0003L\u001f\u0000\u02b9\u02b8\u0001\u0000\u0000"+
+    "\u0000\u02ba\u02bd\u0001\u0000\u0000\u0000\u02bb\u02b9\u0001\u0000\u0000"+
+    "\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc\u02bf\u0001\u0000\u0000"+
+    "\u0000\u02bd\u02bb\u0001\u0000\u0000\u0000\u02be\u02b7\u0001\u0000\u0000"+
+    "\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000\u0000"+
+    "\u0000\u02c0\u02c1\u0003T#\u0000\u02c1\u02cb\u0001\u0000\u0000\u0000\u02c2"+
+    "\u02c4\u0003t3\u0000\u02c3\u02c5\u0003L\u001f\u0000\u02c4\u02c3\u0001"+
+    "\u0000\u0000\u0000\u02c5\u02c6\u0001\u0000\u0000\u0000\u02c6\u02c4\u0001"+
+    "\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001"+
+    "\u0000\u0000\u0000\u02c8\u02c9\u0003T#\u0000\u02c9\u02cb\u0001\u0000\u0000"+
+    "\u0000\u02ca\u02a1\u0001\u0000\u0000\u0000\u02ca\u02ac\u0001\u0000\u0000"+
+    "\u0000\u02ca\u02b3\u0001\u0000\u0000\u0000\u02ca\u02c2\u0001\u0000\u0000"+
+    "\u0000\u02cbe\u0001\u0000\u0000\u0000\u02cc\u02cd\u0005b\u0000\u0000\u02cd"+
+    "\u02ce\u0005y\u0000\u0000\u02ceg\u0001\u0000\u0000\u0000\u02cf\u02d0\u0005"+
+    "a\u0000\u0000\u02d0\u02d1\u0005n\u0000\u0000\u02d1\u02d2\u0005d\u0000"+
+    "\u0000\u02d2i\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005a\u0000\u0000\u02d4"+
+    "\u02d5\u0005s\u0000\u0000\u02d5\u02d6\u0005c\u0000\u0000\u02d6k\u0001"+
+    "\u0000\u0000\u0000\u02d7\u02d8\u0005=\u0000\u0000\u02d8m\u0001\u0000\u0000"+
+    "\u0000\u02d9\u02da\u0005:\u0000\u0000\u02da\u02db\u0005:\u0000\u0000\u02db"+
+    "o\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005,\u0000\u0000\u02ddq\u0001"+
+    "\u0000\u0000\u0000\u02de\u02df\u0005d\u0000\u0000\u02df\u02e0\u0005e\u0000"+
+    "\u0000\u02e0\u02e1\u0005s\u0000\u0000\u02e1\u02e2\u0005c\u0000\u0000\u02e2"+
+    "s\u0001\u0000\u0000\u0000\u02e3\u02e4\u0005.\u0000\u0000\u02e4u\u0001"+
+    "\u0000\u0000\u0000\u02e5\u02e6\u0005f\u0000\u0000\u02e6\u02e7\u0005a\u0000"+
+    "\u0000\u02e7\u02e8\u0005l\u0000\u0000\u02e8\u02e9\u0005s\u0000\u0000\u02e9"+
+    "\u02ea\u0005e\u0000\u0000\u02eaw\u0001\u0000\u0000\u0000\u02eb\u02ec\u0005"+
+    "f\u0000\u0000\u02ec\u02ed\u0005i\u0000\u0000\u02ed\u02ee\u0005r\u0000"+
+    "\u0000\u02ee\u02ef\u0005s\u0000\u0000\u02ef\u02f0\u0005t\u0000\u0000\u02f0"+
+    "y\u0001\u0000\u0000\u0000\u02f1\u02f2\u0005l\u0000\u0000\u02f2\u02f3\u0005"+
+    "a\u0000\u0000\u02f3\u02f4\u0005s\u0000\u0000\u02f4\u02f5\u0005t\u0000"+
+    "\u0000\u02f5{\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005(\u0000\u0000\u02f7"+
+    "}\u0001\u0000\u0000\u0000\u02f8\u02f9\u0005i\u0000\u0000\u02f9\u02fa\u0005"+
+    "n\u0000\u0000\u02fa\u007f\u0001\u0000\u0000\u0000\u02fb\u02fc\u0005i\u0000"+
+    "\u0000\u02fc\u02fd\u0005s\u0000\u0000\u02fd\u0081\u0001\u0000\u0000\u0000"+
+    "\u02fe\u02ff\u0005l\u0000\u0000\u02ff\u0300\u0005i\u0000\u0000\u0300\u0301"+
+    "\u0005k\u0000\u0000\u0301\u0302\u0005e\u0000\u0000\u0302\u0083\u0001\u0000"+
+    "\u0000\u0000\u0303\u0304\u0005n\u0000\u0000\u0304\u0305\u0005o\u0000\u0000"+
+    "\u0305\u0306\u0005t\u0000\u0000\u0306\u0085\u0001\u0000\u0000\u0000\u0307"+
+    "\u0308\u0005n\u0000\u0000\u0308\u0309\u0005u\u0000\u0000\u0309\u030a\u0005"+
+    "l\u0000\u0000\u030a\u030b\u0005l\u0000\u0000\u030b\u0087\u0001\u0000\u0000"+
+    "\u0000\u030c\u030d\u0005n\u0000\u0000\u030d\u030e\u0005u\u0000\u0000\u030e"+
+    "\u030f\u0005l\u0000\u0000\u030f\u0310\u0005l\u0000\u0000\u0310\u0311\u0005"+
+    "s\u0000\u0000\u0311\u0089\u0001\u0000\u0000\u0000\u0312\u0313\u0005o\u0000"+
+    "\u0000\u0313\u0314\u0005r\u0000\u0000\u0314\u008b\u0001\u0000\u0000\u0000"+
+    "\u0315\u0316\u0005?\u0000\u0000\u0316\u008d\u0001\u0000\u0000\u0000\u0317"+
+    "\u0318\u0005r\u0000\u0000\u0318\u0319\u0005l\u0000\u0000\u0319\u031a\u0005"+
+    "i\u0000\u0000\u031a\u031b\u0005k\u0000\u0000\u031b\u031c\u0005e\u0000"+
+    "\u0000\u031c\u008f\u0001\u0000\u0000\u0000\u031d\u031e\u0005)\u0000\u0000"+
+    "\u031e\u0091\u0001\u0000\u0000\u0000\u031f\u0320\u0005t\u0000\u0000\u0320"+
+    "\u0321\u0005r\u0000\u0000\u0321\u0322\u0005u\u0000\u0000\u0322\u0323\u0005"+
+    "e\u0000\u0000\u0323\u0093\u0001\u0000\u0000\u0000\u0324\u0325\u0005=\u0000"+
+    "\u0000\u0325\u0326\u0005=\u0000\u0000\u0326\u0095\u0001\u0000\u0000\u0000"+
+    "\u0327\u0328\u0005=\u0000\u0000\u0328\u0329\u0005~\u0000\u0000\u0329\u0097"+
+    "\u0001\u0000\u0000\u0000\u032a\u032b\u0005!\u0000\u0000\u032b\u032c\u0005"+
+    "=\u0000\u0000\u032c\u0099\u0001\u0000\u0000\u0000\u032d\u032e\u0005<\u0000"+
+    "\u0000\u032e\u009b\u0001\u0000\u0000\u0000\u032f\u0330\u0005<\u0000\u0000"+
+    "\u0330\u0331\u0005=\u0000\u0000\u0331\u009d\u0001\u0000\u0000\u0000\u0332"+
+    "\u0333\u0005>\u0000\u0000\u0333\u009f\u0001\u0000\u0000\u0000\u0334\u0335"+
+    "\u0005>\u0000\u0000\u0335\u0336\u0005=\u0000\u0000\u0336\u00a1\u0001\u0000"+
+    "\u0000\u0000\u0337\u0338\u0005+\u0000\u0000\u0338\u00a3\u0001\u0000\u0000"+
+    "\u0000\u0339\u033a\u0005-\u0000\u0000\u033a\u00a5\u0001\u0000\u0000\u0000"+
+    "\u033b\u033c\u0005*\u0000\u0000\u033c\u00a7\u0001\u0000\u0000\u0000\u033d"+
+    "\u033e\u0005/\u0000\u0000\u033e\u00a9\u0001\u0000\u0000\u0000\u033f\u0340"+
+    "\u0005%\u0000\u0000\u0340\u00ab\u0001\u0000\u0000\u0000\u0341\u0342\u0005"+
+    "[\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344\u0006O\u0000"+
+    "\u0000\u0344\u0345\u0006O\u0000\u0000\u0345\u00ad\u0001\u0000\u0000\u0000"+
+    "\u0346\u0347\u0005]\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348"+
+    "\u0349\u0006P\u000e\u0000\u0349\u034a\u0006P\u000e\u0000\u034a\u00af\u0001"+
+    "\u0000\u0000\u0000\u034b\u034f\u0003N \u0000\u034c\u034e\u0003^(\u0000"+
+    "\u034d\u034c\u0001\u0000\u0000\u0000\u034e\u0351\u0001\u0000\u0000\u0000"+
+    "\u034f\u034d\u0001\u0000\u0000\u0000\u034f\u0350\u0001\u0000\u0000\u0000"+
+    "\u0350\u035c\u0001\u0000\u0000\u0000\u0351\u034f\u0001\u0000\u0000\u0000"+
+    "\u0352\u0355\u0003\\\'\u0000\u0353\u0355\u0003V$\u0000\u0354\u0352\u0001"+
+    "\u0000\u0000\u0000\u0354\u0353\u0001\u0000\u0000\u0000\u0355\u0357\u0001"+
+    "\u0000\u0000\u0000\u0356\u0358\u0003^(\u0000\u0357\u0356\u0001\u0000\u0000"+
+    "\u0000\u0358\u0359\u0001\u0000\u0000\u0000\u0359\u0357\u0001\u0000\u0000"+
+    "\u0000\u0359\u035a\u0001\u0000\u0000\u0000\u035a\u035c\u0001\u0000\u0000"+
+    "\u0000\u035b\u034b\u0001\u0000\u0000\u0000\u035b\u0354\u0001\u0000\u0000"+
+    "\u0000\u035c\u00b1\u0001\u0000\u0000\u0000\u035d\u035f\u0003X%\u0000\u035e"+
+    "\u0360\u0003Z&\u0000\u035f\u035e\u0001\u0000\u0000\u0000\u0360\u0361\u0001"+
+    "\u0000\u0000\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001"+
+    "\u0000\u0000\u0000\u0362\u0363\u0001\u0000\u0000\u0000\u0363\u0364\u0003"+
+    "X%\u0000\u0364\u00b3\u0001\u0000\u0000\u0000\u0365\u0366\u0003\u00b2R"+
+    "\u0000\u0366\u00b5\u0001\u0000\u0000\u0000\u0367\u0368\u00036\u0014\u0000"+
+    "\u0368\u0369\u0001\u0000\u0000\u0000\u0369\u036a\u0006T\n\u0000\u036a"+
+    "\u00b7\u0001\u0000\u0000\u0000\u036b\u036c\u00038\u0015\u0000\u036c\u036d"+
+    "\u0001\u0000\u0000\u0000\u036d\u036e\u0006U\n\u0000\u036e\u00b9\u0001"+
+    "\u0000\u0000\u0000\u036f\u0370\u0003:\u0016\u0000\u0370\u0371\u0001\u0000"+
+    "\u0000\u0000\u0371\u0372\u0006V\n\u0000\u0372\u00bb\u0001\u0000\u0000"+
+    "\u0000\u0373\u0374\u0003J\u001e\u0000\u0374\u0375\u0001\u0000\u0000\u0000"+
+    "\u0375\u0376\u0006W\r\u0000\u0376\u0377\u0006W\u000e\u0000\u0377\u00bd"+
+    "\u0001\u0000\u0000\u0000\u0378\u0379\u0003\u00acO\u0000\u0379\u037a\u0001"+
+    "\u0000\u0000\u0000\u037a\u037b\u0006X\u000b\u0000\u037b\u00bf\u0001\u0000"+
+    "\u0000\u0000\u037c\u037d\u0003\u00aeP\u0000\u037d\u037e\u0001\u0000\u0000"+
+    "\u0000\u037e\u037f\u0006Y\u000f\u0000\u037f\u00c1\u0001\u0000\u0000\u0000"+
+    "\u0380\u0381\u0003p1\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383"+
+    "\u0006Z\u0010\u0000\u0383\u00c3\u0001\u0000\u0000\u0000\u0384\u0385\u0003"+
+    "l/\u0000\u0385\u0386\u0001\u0000\u0000\u0000\u0386\u0387\u0006[\u0011"+
+    "\u0000\u0387\u00c5\u0001\u0000\u0000\u0000\u0388\u0389\u0003`)\u0000\u0389"+
+    "\u038a\u0001\u0000\u0000\u0000\u038a\u038b\u0006\\\u0012\u0000\u038b\u00c7"+
+    "\u0001\u0000\u0000\u0000\u038c\u038d\u0005m\u0000\u0000\u038d\u038e\u0005"+
+    "e\u0000\u0000\u038e\u038f\u0005t\u0000\u0000\u038f\u0390\u0005a\u0000"+
+    "\u0000\u0390\u0391\u0005d\u0000\u0000\u0391\u0392\u0005a\u0000\u0000\u0392"+
+    "\u0393\u0005t\u0000\u0000\u0393\u0394\u0005a\u0000\u0000\u0394\u00c9\u0001"+
+    "\u0000\u0000\u0000\u0395\u0396\u0003>\u0018\u0000\u0396\u0397\u0001\u0000"+
+    "\u0000\u0000\u0397\u0398\u0006^\u0013\u0000\u0398\u00cb\u0001\u0000\u0000"+
+    "\u0000\u0399\u039a\u00036\u0014\u0000\u039a\u039b\u0001\u0000\u0000\u0000"+
+    "\u039b\u039c\u0006_\n\u0000\u039c\u00cd\u0001\u0000\u0000\u0000\u039d"+
+    "\u039e\u00038\u0015\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0"+
+    "\u0006`\n\u0000\u03a0\u00cf\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003"+
+    ":\u0016\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0006a\n"+
+    "\u0000\u03a4\u00d1\u0001\u0000\u0000\u0000\u03a5\u03a6\u0003J\u001e\u0000"+
+    "\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u03a8\u0006b\r\u0000\u03a8"+
+    "\u03a9\u0006b\u000e\u0000\u03a9\u00d3\u0001\u0000\u0000\u0000\u03aa\u03ab"+
+    "\u0003t3\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0006c"+
+    "\u0014\u0000\u03ad\u00d5\u0001\u0000\u0000\u0000\u03ae\u03af\u0003p1\u0000"+
+    "\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1\u0006d\u0010\u0000\u03b1"+
+    "\u00d7\u0001\u0000\u0000\u0000\u03b2\u03b7\u0003N \u0000\u03b3\u03b7\u0003"+
+    "L\u001f\u0000\u03b4\u03b7\u0003\\\'\u0000\u03b5\u03b7\u0003\u00a6L\u0000"+
+    "\u03b6\u03b2\u0001\u0000\u0000\u0000\u03b6\u03b3\u0001\u0000\u0000\u0000"+
+    "\u03b6\u03b4\u0001\u0000\u0000\u0000\u03b6\u03b5\u0001\u0000\u0000\u0000"+
+    "\u03b7\u00d9\u0001\u0000\u0000\u0000\u03b8\u03bb\u0003N \u0000\u03b9\u03bb"+
+    "\u0003\u00a6L\u0000\u03ba\u03b8\u0001\u0000\u0000\u0000\u03ba\u03b9\u0001"+
+    "\u0000\u0000\u0000\u03bb\u03bf\u0001\u0000\u0000\u0000\u03bc\u03be\u0003"+
+    "\u00d8e\u0000\u03bd\u03bc\u0001\u0000\u0000\u0000\u03be\u03c1\u0001\u0000"+
+    "\u0000\u0000\u03bf\u03bd\u0001\u0000\u0000\u0000\u03bf\u03c0\u0001\u0000"+
+    "\u0000\u0000\u03c0\u03cc\u0001\u0000\u0000\u0000\u03c1\u03bf\u0001\u0000"+
+    "\u0000\u0000\u03c2\u03c5\u0003\\\'\u0000\u03c3\u03c5\u0003V$\u0000\u03c4"+
+    "\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c3\u0001\u0000\u0000\u0000\u03c5"+
+    "\u03c7\u0001\u0000\u0000\u0000\u03c6\u03c8\u0003\u00d8e\u0000\u03c7\u03c6"+
+    "\u0001\u0000\u0000\u0000\u03c8\u03c9\u0001\u0000\u0000\u0000\u03c9\u03c7"+
+    "\u0001\u0000\u0000\u0000\u03c9\u03ca\u0001\u0000\u0000\u0000\u03ca\u03cc"+
+    "\u0001\u0000\u0000\u0000\u03cb\u03ba\u0001\u0000\u0000\u0000\u03cb\u03c4"+
+    "\u0001\u0000\u0000\u0000\u03cc\u00db\u0001\u0000\u0000\u0000\u03cd\u03d0"+
+    "\u0003\u00daf\u0000\u03ce\u03d0\u0003\u00b2R\u0000\u03cf\u03cd\u0001\u0000"+
+    "\u0000\u0000\u03cf\u03ce\u0001\u0000\u0000\u0000\u03d0\u03d1\u0001\u0000"+
+    "\u0000\u0000\u03d1\u03cf\u0001\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000"+
+    "\u0000\u0000\u03d2\u00dd\u0001\u0000\u0000\u0000\u03d3\u03d4\u00036\u0014"+
+    "\u0000\u03d4\u03d5\u0001\u0000\u0000\u0000\u03d5\u03d6\u0006h\n\u0000"+
+    "\u03d6\u00df\u0001\u0000\u0000\u0000\u03d7\u03d8\u00038\u0015\u0000\u03d8"+
+    "\u03d9\u0001\u0000\u0000\u0000\u03d9\u03da\u0006i\n\u0000\u03da\u00e1"+
+    "\u0001\u0000\u0000\u0000\u03db\u03dc\u0003:\u0016\u0000\u03dc\u03dd\u0001"+
+    "\u0000\u0000\u0000\u03dd\u03de\u0006j\n\u0000\u03de\u00e3\u0001\u0000"+
+    "\u0000\u0000\u03df\u03e0\u0003J\u001e\u0000\u03e0\u03e1\u0001\u0000\u0000"+
+    "\u0000\u03e1\u03e2\u0006k\r\u0000\u03e2\u03e3\u0006k\u000e\u0000\u03e3"+
+    "\u00e5\u0001\u0000\u0000\u0000\u03e4\u03e5\u0003l/\u0000\u03e5\u03e6\u0001"+
+    "\u0000\u0000\u0000\u03e6\u03e7\u0006l\u0011\u0000\u03e7\u00e7\u0001\u0000"+
+    "\u0000\u0000\u03e8\u03e9\u0003p1\u0000\u03e9\u03ea\u0001\u0000\u0000\u0000"+
+    "\u03ea\u03eb\u0006m\u0010\u0000\u03eb\u00e9\u0001\u0000\u0000\u0000\u03ec"+
+    "\u03ed\u0003t3\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee\u03ef\u0006"+
+    "n\u0014\u0000\u03ef\u00eb\u0001\u0000\u0000\u0000\u03f0\u03f1\u0005a\u0000"+
+    "\u0000\u03f1\u03f2\u0005s\u0000\u0000\u03f2\u00ed\u0001\u0000\u0000\u0000"+
+    "\u03f3\u03f4\u0003\u00dcg\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5"+
+    "\u03f6\u0006p\u0015\u0000\u03f6\u00ef\u0001\u0000\u0000\u0000\u03f7\u03f8"+
+    "\u00036\u0014\u0000\u03f8\u03f9\u0001\u0000\u0000\u0000\u03f9\u03fa\u0006"+
+    "q\n\u0000\u03fa\u00f1\u0001\u0000\u0000\u0000\u03fb\u03fc\u00038\u0015"+
+    "\u0000\u03fc\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe\u0006r\n\u0000"+
+    "\u03fe\u00f3\u0001\u0000\u0000\u0000\u03ff\u0400\u0003:\u0016\u0000\u0400"+
+    "\u0401\u0001\u0000\u0000\u0000\u0401\u0402\u0006s\n\u0000\u0402\u00f5"+
+    "\u0001\u0000\u0000\u0000\u0403\u0404\u0003J\u001e\u0000\u0404\u0405\u0001"+
+    "\u0000\u0000\u0000\u0405\u0406\u0006t\r\u0000\u0406\u0407\u0006t\u000e"+
+    "\u0000\u0407\u00f7\u0001\u0000\u0000\u0000\u0408\u0409\u0003\u00acO\u0000"+
+    "\u0409\u040a\u0001\u0000\u0000\u0000\u040a\u040b\u0006u\u000b\u0000\u040b"+
+    "\u040c\u0006u\u0016\u0000\u040c\u00f9\u0001\u0000\u0000\u0000\u040d\u040e"+
+    "\u0005o\u0000\u0000\u040e\u040f\u0005n\u0000\u0000\u040f\u0410\u0001\u0000"+
+    "\u0000\u0000\u0410\u0411\u0006v\u0017\u0000\u0411\u00fb\u0001\u0000\u0000"+
+    "\u0000\u0412\u0413\u0005w\u0000\u0000\u0413\u0414\u0005i\u0000\u0000\u0414"+
+    "\u0415\u0005t\u0000\u0000\u0415\u0416\u0005h\u0000\u0000\u0416\u0417\u0001"+
+    "\u0000\u0000\u0000\u0417\u0418\u0006w\u0017\u0000\u0418\u00fd\u0001\u0000"+
+    "\u0000\u0000\u0419\u041a\b\f\u0000\u0000\u041a\u00ff\u0001\u0000\u0000"+
+    "\u0000\u041b\u041d\u0003\u00fex\u0000\u041c\u041b\u0001\u0000\u0000\u0000"+
+    "\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u041c\u0001\u0000\u0000\u0000"+
+    "\u041e\u041f\u0001\u0000\u0000\u0000\u041f\u0420\u0001\u0000\u0000\u0000"+
+    "\u0420\u0421\u0003\u0144\u009b\u0000\u0421\u0423\u0001\u0000\u0000\u0000"+
+    "\u0422\u041c\u0001\u0000\u0000\u0000\u0422\u0423\u0001\u0000\u0000\u0000"+
+    "\u0423\u0425\u0001\u0000\u0000\u0000\u0424\u0426\u0003\u00fex\u0000\u0425"+
+    "\u0424\u0001\u0000\u0000\u0000\u0426\u0427\u0001\u0000\u0000\u0000\u0427"+
+    "\u0425\u0001\u0000\u0000\u0000\u0427\u0428\u0001\u0000\u0000\u0000\u0428"+
+    "\u0101\u0001\u0000\u0000\u0000\u0429\u042a\u0003\u00b4S\u0000\u042a\u042b"+
+    "\u0001\u0000\u0000\u0000\u042b\u042c\u0006z\u0018\u0000\u042c\u0103\u0001"+
+    "\u0000\u0000\u0000\u042d\u042e\u0003\u0100y\u0000\u042e\u042f\u0001\u0000"+
+    "\u0000\u0000\u042f\u0430\u0006{\u0019\u0000\u0430\u0105\u0001\u0000\u0000"+
+    "\u0000\u0431\u0432\u00036\u0014\u0000\u0432\u0433\u0001\u0000\u0000\u0000"+
+    "\u0433\u0434\u0006|\n\u0000\u0434\u0107\u0001\u0000\u0000\u0000\u0435"+
+    "\u0436\u00038\u0015\u0000\u0436\u0437\u0001\u0000\u0000\u0000\u0437\u0438"+
+    "\u0006}\n\u0000\u0438\u0109\u0001\u0000\u0000\u0000\u0439\u043a\u0003"+
+    ":\u0016\u0000\u043a\u043b\u0001\u0000\u0000\u0000\u043b\u043c\u0006~\n"+
+    "\u0000\u043c\u010b\u0001\u0000\u0000\u0000\u043d\u043e\u0003J\u001e\u0000"+
+    "\u043e\u043f\u0001\u0000\u0000\u0000\u043f\u0440\u0006\u007f\r\u0000\u0440"+
+    "\u0441\u0006\u007f\u000e\u0000\u0441\u0442\u0006\u007f\u000e\u0000\u0442"+
+    "\u010d\u0001\u0000\u0000\u0000\u0443\u0444\u0003l/\u0000\u0444\u0445\u0001"+
+    "\u0000\u0000\u0000\u0445\u0446\u0006\u0080\u0011\u0000\u0446\u010f\u0001"+
+    "\u0000\u0000\u0000\u0447\u0448\u0003p1\u0000\u0448\u0449\u0001\u0000\u0000"+
+    "\u0000\u0449\u044a\u0006\u0081\u0010\u0000\u044a\u0111\u0001\u0000\u0000"+
+    "\u0000\u044b\u044c\u0003t3\u0000\u044c\u044d\u0001\u0000\u0000\u0000\u044d"+
+    "\u044e\u0006\u0082\u0014\u0000\u044e\u0113\u0001\u0000\u0000\u0000\u044f"+
+    "\u0450\u0003\u00fcw\u0000\u0450\u0451\u0001\u0000\u0000\u0000\u0451\u0452"+
+    "\u0006\u0083\u001a\u0000\u0452\u0115\u0001\u0000\u0000\u0000\u0453\u0454"+
+    "\u0003\u00dcg\u0000\u0454\u0455\u0001\u0000\u0000\u0000\u0455\u0456\u0006"+
+    "\u0084\u0015\u0000\u0456\u0117\u0001\u0000\u0000\u0000\u0457\u0458\u0003"+
+    "\u00b4S\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006\u0085"+
+    "\u0018\u0000\u045a\u0119\u0001\u0000\u0000\u0000\u045b\u045c\u00036\u0014"+
+    "\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u0006\u0086\n\u0000"+
+    "\u045e\u011b\u0001\u0000\u0000\u0000\u045f\u0460\u00038\u0015\u0000\u0460"+
+    "\u0461\u0001\u0000\u0000\u0000\u0461\u0462\u0006\u0087\n\u0000\u0462\u011d"+
+    "\u0001\u0000\u0000\u0000\u0463\u0464\u0003:\u0016\u0000\u0464\u0465\u0001"+
+    "\u0000\u0000\u0000\u0465\u0466\u0006\u0088\n\u0000\u0466\u011f\u0001\u0000"+
+    "\u0000\u0000\u0467\u0468\u0003J\u001e\u0000\u0468\u0469\u0001\u0000\u0000"+
+    "\u0000\u0469\u046a\u0006\u0089\r\u0000\u046a\u046b\u0006\u0089\u000e\u0000"+
+    "\u046b\u0121\u0001\u0000\u0000\u0000\u046c\u046d\u0003t3\u0000\u046d\u046e"+
+    "\u0001\u0000\u0000\u0000\u046e\u046f\u0006\u008a\u0014\u0000\u046f\u0123"+
+    "\u0001\u0000\u0000\u0000\u0470\u0471\u0003\u00b4S\u0000\u0471\u0472\u0001"+
+    "\u0000\u0000\u0000\u0472\u0473\u0006\u008b\u0018\u0000\u0473\u0125\u0001"+
+    "\u0000\u0000\u0000\u0474\u0475\u0003\u00b0Q\u0000\u0475\u0476\u0001\u0000"+
+    "\u0000\u0000\u0476\u0477\u0006\u008c\u001b\u0000\u0477\u0127\u0001\u0000"+
+    "\u0000\u0000\u0478\u0479\u00036\u0014\u0000\u0479\u047a\u0001\u0000\u0000"+
+    "\u0000\u047a\u047b\u0006\u008d\n\u0000\u047b\u0129\u0001\u0000\u0000\u0000"+
+    "\u047c\u047d\u00038\u0015\u0000\u047d\u047e\u0001\u0000\u0000\u0000\u047e"+
+    "\u047f\u0006\u008e\n\u0000\u047f\u012b\u0001\u0000\u0000\u0000\u0480\u0481"+
+    "\u0003:\u0016\u0000\u0481\u0482\u0001\u0000\u0000\u0000\u0482\u0483\u0006"+
+    "\u008f\n\u0000\u0483\u012d\u0001\u0000\u0000\u0000\u0484\u0485\u0003J"+
+    "\u001e\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0487\u0006\u0090"+
+    "\r\u0000\u0487\u0488\u0006\u0090\u000e\u0000\u0488\u012f\u0001\u0000\u0000"+
+    "\u0000\u0489\u048a\u0005i\u0000\u0000\u048a\u048b\u0005n\u0000\u0000\u048b"+
+    "\u048c\u0005f\u0000\u0000\u048c\u048d\u0005o\u0000\u0000\u048d\u0131\u0001"+
+    "\u0000\u0000\u0000\u048e\u048f\u00036\u0014\u0000\u048f\u0490\u0001\u0000"+
+    "\u0000\u0000\u0490\u0491\u0006\u0092\n\u0000\u0491\u0133\u0001\u0000\u0000"+
+    "\u0000\u0492\u0493\u00038\u0015\u0000\u0493\u0494\u0001\u0000\u0000\u0000"+
+    "\u0494\u0495\u0006\u0093\n\u0000\u0495\u0135\u0001\u0000\u0000\u0000\u0496"+
+    "\u0497\u0003:\u0016\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498\u0499"+
+    "\u0006\u0094\n\u0000\u0499\u0137\u0001\u0000\u0000\u0000\u049a\u049b\u0003"+
+    "J\u001e\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u0006\u0095"+
+    "\r\u0000\u049d\u049e\u0006\u0095\u000e\u0000\u049e\u0139\u0001\u0000\u0000"+
+    "\u0000\u049f\u04a0\u0005f\u0000\u0000\u04a0\u04a1\u0005u\u0000\u0000\u04a1"+
+    "\u04a2\u0005n\u0000\u0000\u04a2\u04a3\u0005c\u0000\u0000\u04a3\u04a4\u0005"+
+    "t\u0000\u0000\u04a4\u04a5\u0005i\u0000\u0000\u04a5\u04a6\u0005o\u0000"+
+    "\u0000\u04a6\u04a7\u0005n\u0000\u0000\u04a7\u04a8\u0005s\u0000\u0000\u04a8"+
+    "\u013b\u0001\u0000\u0000\u0000\u04a9\u04aa\u00036\u0014\u0000\u04aa\u04ab"+
+    "\u0001\u0000\u0000\u0000\u04ab\u04ac\u0006\u0097\n\u0000\u04ac\u013d\u0001"+
+    "\u0000\u0000\u0000\u04ad\u04ae\u00038\u0015\u0000\u04ae\u04af\u0001\u0000"+
+    "\u0000\u0000\u04af\u04b0\u0006\u0098\n\u0000\u04b0\u013f\u0001\u0000\u0000"+
+    "\u0000\u04b1\u04b2\u0003:\u0016\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000"+
+    "\u04b3\u04b4\u0006\u0099\n\u0000\u04b4\u0141\u0001\u0000\u0000\u0000\u04b5"+
+    "\u04b6\u0003\u00aeP\u0000\u04b6\u04b7\u0001\u0000\u0000\u0000\u04b7\u04b8"+
+    "\u0006\u009a\u000f\u0000\u04b8\u04b9\u0006\u009a\u000e\u0000\u04b9\u0143"+
+    "\u0001\u0000\u0000\u0000\u04ba\u04bb\u0005:\u0000\u0000\u04bb\u0145\u0001"+
+    "\u0000\u0000\u0000\u04bc\u04c2\u0003V$\u0000\u04bd\u04c2\u0003L\u001f"+
+    "\u0000\u04be\u04c2\u0003t3\u0000\u04bf\u04c2\u0003N \u0000\u04c0\u04c2"+
+    "\u0003\\\'\u0000\u04c1\u04bc\u0001\u0000\u0000\u0000\u04c1\u04bd\u0001"+
+    "\u0000\u0000\u0000\u04c1\u04be\u0001\u0000\u0000\u0000\u04c1\u04bf\u0001"+
+    "\u0000\u0000\u0000\u04c1\u04c0\u0001\u0000\u0000\u0000\u04c2\u04c3\u0001"+
+    "\u0000\u0000\u0000\u04c3\u04c1\u0001\u0000\u0000\u0000\u04c3\u04c4\u0001"+
+    "\u0000\u0000\u0000\u04c4\u0147\u0001\u0000\u0000\u0000\u04c5\u04c6\u0003"+
+    "6\u0014\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7\u04c8\u0006\u009d"+
+    "\n\u0000\u04c8\u0149\u0001\u0000\u0000\u0000\u04c9\u04ca\u00038\u0015"+
+    "\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb\u04cc\u0006\u009e\n\u0000"+
+    "\u04cc\u014b\u0001\u0000\u0000\u0000\u04cd\u04ce\u0003:\u0016\u0000\u04ce"+
+    "\u04cf\u0001\u0000\u0000\u0000\u04cf\u04d0\u0006\u009f\n\u0000\u04d0\u014d"+
+    "\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003J\u001e\u0000\u04d2\u04d3\u0001"+
+    "\u0000\u0000\u0000\u04d3\u04d4\u0006\u00a0\r\u0000\u04d4\u04d5\u0006\u00a0"+
+    "\u000e\u0000\u04d5\u014f\u0001\u0000\u0000\u0000\u04d6\u04d7\u0003>\u0018"+
+    "\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0006\u00a1\u0013"+
+    "\u0000\u04d9\u04da\u0006\u00a1\u000e\u0000\u04da\u04db\u0006\u00a1\u001c"+
+    "\u0000\u04db\u0151\u0001\u0000\u0000\u0000\u04dc\u04dd\u00036\u0014\u0000"+
+    "\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04df\u0006\u00a2\n\u0000\u04df"+
+    "\u0153\u0001\u0000\u0000\u0000\u04e0\u04e1\u00038\u0015\u0000\u04e1\u04e2"+
+    "\u0001\u0000\u0000\u0000\u04e2\u04e3\u0006\u00a3\n\u0000\u04e3\u0155\u0001"+
+    "\u0000\u0000\u0000\u04e4\u04e5\u0003:\u0016\u0000\u04e5\u04e6\u0001\u0000"+
+    "\u0000\u0000\u04e6\u04e7\u0006\u00a4\n\u0000\u04e7\u0157\u0001\u0000\u0000"+
+    "\u0000\u04e8\u04e9\u0003p1\u0000\u04e9\u04ea\u0001\u0000\u0000\u0000\u04ea"+
+    "\u04eb\u0006\u00a5\u0010\u0000\u04eb\u04ec\u0006\u00a5\u000e\u0000\u04ec"+
+    "\u04ed\u0006\u00a5\u0006\u0000\u04ed\u0159\u0001\u0000\u0000\u0000\u04ee"+
+    "\u04ef\u00036\u0014\u0000\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0\u04f1"+
+    "\u0006\u00a6\n\u0000\u04f1\u015b\u0001\u0000\u0000\u0000\u04f2\u04f3\u0003"+
+    "8\u0015\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f5\u0006\u00a7"+
+    "\n\u0000\u04f5\u015d\u0001\u0000\u0000\u0000\u04f6\u04f7\u0003:\u0016"+
+    "\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04f9\u0006\u00a8\n\u0000"+
+    "\u04f9\u015f\u0001\u0000\u0000\u0000\u04fa\u04fb\u0003\u00b4S\u0000\u04fb"+
+    "\u04fc\u0001\u0000\u0000\u0000\u04fc\u04fd\u0006\u00a9\u000e\u0000\u04fd"+
+    "\u04fe\u0006\u00a9\u0000\u0000\u04fe\u04ff\u0006\u00a9\u0018\u0000\u04ff"+
+    "\u0161\u0001\u0000\u0000\u0000\u0500\u0501\u0003\u00b0Q\u0000\u0501\u0502"+
+    "\u0001\u0000\u0000\u0000\u0502\u0503\u0006\u00aa\u000e\u0000\u0503\u0504"+
+    "\u0006\u00aa\u0000\u0000\u0504\u0505\u0006\u00aa\u001b\u0000\u0505\u0163"+
+    "\u0001\u0000\u0000\u0000\u0506\u0507\u0003f,\u0000\u0507\u0508\u0001\u0000"+
+    "\u0000\u0000\u0508\u0509\u0006\u00ab\u000e\u0000\u0509\u050a\u0006\u00ab"+
+    "\u0000\u0000\u050a\u050b\u0006\u00ab\u001d\u0000\u050b\u0165\u0001\u0000"+
+    "\u0000\u0000\u050c\u050d\u0003J\u001e\u0000\u050d\u050e\u0001\u0000\u0000"+
+    "\u0000\u050e\u050f\u0006\u00ac\r\u0000\u050f\u0510\u0006\u00ac\u000e\u0000"+
+    "\u0510\u0167\u0001\u0000\u0000\u0000<\u0000\u0001\u0002\u0003\u0004\u0005"+
+    "\u0006\u0007\b\t\n\u000b\f\r\u020b\u0215\u0219\u021c\u0225\u0227\u0232"+
+    "\u0239\u023e\u0265\u026a\u0273\u027a\u027f\u0281\u028c\u0294\u0297\u0299"+
+    "\u029e\u02a3\u02a9\u02b0\u02b5\u02bb\u02be\u02c6\u02ca\u034f\u0354\u0359"+
+    "\u035b\u0361\u03b6\u03ba\u03bf\u03c4\u03c9\u03cb\u03cf\u03d1\u041e\u0422"+
+    "\u0427\u04c1\u04c3\u001e\u0005\u0002\u0000\u0005\u0004\u0000\u0005\u0006"+
+    "\u0000\u0005\u0001\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\f\u0000"+
+    "\u0005\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0000\u0001\u0000\u0007"+
+    "C\u0000\u0005\u0000\u0000\u0007\u001c\u0000\u0004\u0000\u0000\u0007D\u0000"+
+    "\u0007%\u0000\u0007#\u0000\u0007\u001d\u0000\u0007\u0018\u0000\u0007\'"+
+    "\u0000\u0007N\u0000\u0005\u000b\u0000\u0005\u0007\u0000\u0007F\u0000\u0007"+
+    "X\u0000\u0007W\u0000\u0007E\u0000\u0005\r\u0000\u0007 \u0000";
   public static final ATN _ATN =
     new ATNDeserializer().deserialize(_serializedATN.toCharArray());
   static {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 4
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 181 - 194
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java


+ 0 - 24
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java

@@ -372,30 +372,6 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener {
    * <p>The default implementation does nothing.</p>
    */
   @Override public void exitIndexIdentifier(EsqlBaseParser.IndexIdentifierContext ctx) { }
-  /**
-   * {@inheritDoc}
-   *
-   * <p>The default implementation does nothing.</p>
-   */
-  @Override public void enterFromOptions(EsqlBaseParser.FromOptionsContext ctx) { }
-  /**
-   * {@inheritDoc}
-   *
-   * <p>The default implementation does nothing.</p>
-   */
-  @Override public void exitFromOptions(EsqlBaseParser.FromOptionsContext ctx) { }
-  /**
-   * {@inheritDoc}
-   *
-   * <p>The default implementation does nothing.</p>
-   */
-  @Override public void enterConfigOption(EsqlBaseParser.ConfigOptionContext ctx) { }
-  /**
-   * {@inheritDoc}
-   *
-   * <p>The default implementation does nothing.</p>
-   */
-  @Override public void exitConfigOption(EsqlBaseParser.ConfigOptionContext ctx) { }
   /**
    * {@inheritDoc}
    *

+ 0 - 14
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java

@@ -222,20 +222,6 @@ public class EsqlBaseParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
    * {@link #visitChildren} on {@code ctx}.</p>
    */
   @Override public T visitIndexIdentifier(EsqlBaseParser.IndexIdentifierContext ctx) { return visitChildren(ctx); }
-  /**
-   * {@inheritDoc}
-   *
-   * <p>The default implementation returns the result of calling
-   * {@link #visitChildren} on {@code ctx}.</p>
-   */
-  @Override public T visitFromOptions(EsqlBaseParser.FromOptionsContext ctx) { return visitChildren(ctx); }
-  /**
-   * {@inheritDoc}
-   *
-   * <p>The default implementation returns the result of calling
-   * {@link #visitChildren} on {@code ctx}.</p>
-   */
-  @Override public T visitConfigOption(EsqlBaseParser.ConfigOptionContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *

+ 0 - 20
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java

@@ -345,26 +345,6 @@ public interface EsqlBaseParserListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitIndexIdentifier(EsqlBaseParser.IndexIdentifierContext ctx);
-  /**
-   * Enter a parse tree produced by {@link EsqlBaseParser#fromOptions}.
-   * @param ctx the parse tree
-   */
-  void enterFromOptions(EsqlBaseParser.FromOptionsContext ctx);
-  /**
-   * Exit a parse tree produced by {@link EsqlBaseParser#fromOptions}.
-   * @param ctx the parse tree
-   */
-  void exitFromOptions(EsqlBaseParser.FromOptionsContext ctx);
-  /**
-   * Enter a parse tree produced by {@link EsqlBaseParser#configOption}.
-   * @param ctx the parse tree
-   */
-  void enterConfigOption(EsqlBaseParser.ConfigOptionContext ctx);
-  /**
-   * Exit a parse tree produced by {@link EsqlBaseParser#configOption}.
-   * @param ctx the parse tree
-   */
-  void exitConfigOption(EsqlBaseParser.ConfigOptionContext ctx);
   /**
    * Enter a parse tree produced by {@link EsqlBaseParser#metadata}.
    * @param ctx the parse tree

+ 0 - 12
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java

@@ -209,18 +209,6 @@ public interface EsqlBaseParserVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitIndexIdentifier(EsqlBaseParser.IndexIdentifierContext ctx);
-  /**
-   * Visit a parse tree produced by {@link EsqlBaseParser#fromOptions}.
-   * @param ctx the parse tree
-   * @return the visitor result
-   */
-  T visitFromOptions(EsqlBaseParser.FromOptionsContext ctx);
-  /**
-   * Visit a parse tree produced by {@link EsqlBaseParser#configOption}.
-   * @param ctx the parse tree
-   * @return the visitor result
-   */
-  T visitConfigOption(EsqlBaseParser.ConfigOptionContext ctx);
   /**
    * Visit a parse tree produced by {@link EsqlBaseParser#metadata}.
    * @param ctx the parse tree

+ 1 - 16
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java

@@ -47,7 +47,6 @@ import org.elasticsearch.xpack.ql.expression.ReferenceAttribute;
 import org.elasticsearch.xpack.ql.expression.UnresolvedAttribute;
 import org.elasticsearch.xpack.ql.expression.UnresolvedStar;
 import org.elasticsearch.xpack.ql.expression.function.UnresolvedFunction;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.parser.ParserUtils;
 import org.elasticsearch.xpack.ql.plan.TableIdentifier;
 import org.elasticsearch.xpack.ql.plan.logical.Filter;
@@ -235,21 +234,7 @@ public class LogicalPlanBuilder extends ExpressionBuilder {
                 }
             }
         }
-        EsSourceOptions esSourceOptions = new EsSourceOptions();
-        if (ctx.fromOptions() != null) {
-            for (var o : ctx.fromOptions().configOption()) {
-                var nameContext = o.string().get(0);
-                String name = visitString(nameContext).fold().toString();
-                String value = visitString(o.string().get(1)).fold().toString();
-                try {
-                    esSourceOptions.addOption(name, value);
-                } catch (IllegalArgumentException iae) {
-                    var cause = iae.getCause() != null ? ". " + iae.getCause().getMessage() : "";
-                    throw new ParsingException(iae, source(nameContext), "invalid options provided: " + iae.getMessage() + cause);
-                }
-            }
-        }
-        return new EsqlUnresolvedRelation(source, table, Arrays.asList(metadataMap.values().toArray(Attribute[]::new)), esSourceOptions);
+        return new EsqlUnresolvedRelation(source, table, Arrays.asList(metadataMap.values().toArray(Attribute[]::new)));
     }
 
     @Override

+ 6 - 18
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/EsRelation.java

@@ -9,7 +9,6 @@ package org.elasticsearch.xpack.esql.plan.logical;
 import org.elasticsearch.xpack.ql.expression.Attribute;
 import org.elasticsearch.xpack.ql.expression.FieldAttribute;
 import org.elasticsearch.xpack.ql.index.EsIndex;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.plan.logical.LeafPlan;
 import org.elasticsearch.xpack.ql.tree.NodeInfo;
 import org.elasticsearch.xpack.ql.tree.NodeUtils;
@@ -26,33 +25,26 @@ public class EsRelation extends LeafPlan {
 
     private final EsIndex index;
     private final List<Attribute> attrs;
-    private final EsSourceOptions esSourceOptions;
     private final boolean frozen;
 
     public EsRelation(Source source, EsIndex index, boolean frozen) {
-        this(source, index, flatten(source, index.mapping()), EsSourceOptions.NO_OPTIONS, frozen);
+        this(source, index, flatten(source, index.mapping()), frozen);
     }
 
     public EsRelation(Source source, EsIndex index, List<Attribute> attributes) {
-        this(source, index, attributes, EsSourceOptions.NO_OPTIONS, false);
+        this(source, index, attributes, false);
     }
 
-    public EsRelation(Source source, EsIndex index, List<Attribute> attributes, EsSourceOptions esSourceOptions) {
-        this(source, index, attributes, esSourceOptions, false);
-    }
-
-    public EsRelation(Source source, EsIndex index, List<Attribute> attributes, EsSourceOptions esSourceOptions, boolean frozen) {
+    public EsRelation(Source source, EsIndex index, List<Attribute> attributes, boolean frozen) {
         super(source);
         this.index = index;
         this.attrs = attributes;
-        Objects.requireNonNull(esSourceOptions);
-        this.esSourceOptions = esSourceOptions;
         this.frozen = frozen;
     }
 
     @Override
     protected NodeInfo<EsRelation> info() {
-        return NodeInfo.create(this, EsRelation::new, index, attrs, esSourceOptions, frozen);
+        return NodeInfo.create(this, EsRelation::new, index, attrs, frozen);
     }
 
     private static List<Attribute> flatten(Source source, Map<String, EsField> mapping) {
@@ -82,10 +74,6 @@ public class EsRelation extends LeafPlan {
         return index;
     }
 
-    public EsSourceOptions esSourceOptions() {
-        return esSourceOptions;
-    }
-
     public boolean frozen() {
         return frozen;
     }
@@ -102,7 +90,7 @@ public class EsRelation extends LeafPlan {
 
     @Override
     public int hashCode() {
-        return Objects.hash(index, esSourceOptions, frozen);
+        return Objects.hash(index, frozen);
     }
 
     @Override
@@ -116,7 +104,7 @@ public class EsRelation extends LeafPlan {
         }
 
         EsRelation other = (EsRelation) obj;
-        return Objects.equals(index, other.index) && Objects.equals(esSourceOptions, other.esSourceOptions) && frozen == other.frozen;
+        return Objects.equals(index, other.index) && frozen == other.frozen;
     }
 
     @Override

+ 4 - 27
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/EsqlUnresolvedRelation.java

@@ -8,54 +8,31 @@
 package org.elasticsearch.xpack.esql.plan.logical;
 
 import org.elasticsearch.xpack.ql.expression.Attribute;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.plan.TableIdentifier;
 import org.elasticsearch.xpack.ql.tree.NodeInfo;
 import org.elasticsearch.xpack.ql.tree.Source;
 
 import java.util.List;
-import java.util.Objects;
 
 public class EsqlUnresolvedRelation extends UnresolvedRelation {
 
     private final List<Attribute> metadataFields;
-    private final EsSourceOptions esSourceOptions;
-
-    public EsqlUnresolvedRelation(
-        Source source,
-        TableIdentifier table,
-        List<Attribute> metadataFields,
-        EsSourceOptions esSourceOptions,
-        String unresolvedMessage
-    ) {
-        super(source, table, "", false, unresolvedMessage);
-        this.metadataFields = metadataFields;
-        Objects.requireNonNull(esSourceOptions);
-        this.esSourceOptions = esSourceOptions;
-    }
 
     public EsqlUnresolvedRelation(Source source, TableIdentifier table, List<Attribute> metadataFields, String unresolvedMessage) {
-        this(source, table, metadataFields, EsSourceOptions.NO_OPTIONS, unresolvedMessage);
-    }
-
-    public EsqlUnresolvedRelation(Source source, TableIdentifier table, List<Attribute> metadataFields, EsSourceOptions esSourceOptions) {
-        this(source, table, metadataFields, esSourceOptions, null);
+        super(source, table, "", false, unresolvedMessage);
+        this.metadataFields = metadataFields;
     }
 
     public EsqlUnresolvedRelation(Source source, TableIdentifier table, List<Attribute> metadataFields) {
-        this(source, table, metadataFields, EsSourceOptions.NO_OPTIONS, null);
+        this(source, table, metadataFields, null);
     }
 
     public List<Attribute> metadataFields() {
         return metadataFields;
     }
 
-    public EsSourceOptions esSourceOptions() {
-        return esSourceOptions;
-    }
-
     @Override
     protected NodeInfo<UnresolvedRelation> info() {
-        return NodeInfo.create(this, EsqlUnresolvedRelation::new, table(), metadataFields(), esSourceOptions(), unresolvedMessage());
+        return NodeInfo.create(this, EsqlUnresolvedRelation::new, table(), metadataFields(), unresolvedMessage());
     }
 }

+ 0 - 7
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/PlannerUtils.java

@@ -43,7 +43,6 @@ import org.elasticsearch.xpack.ql.expression.AttributeSet;
 import org.elasticsearch.xpack.ql.expression.Expression;
 import org.elasticsearch.xpack.ql.expression.FieldAttribute;
 import org.elasticsearch.xpack.ql.expression.predicate.Predicates;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.plan.logical.Filter;
 import org.elasticsearch.xpack.ql.plan.logical.Limit;
 import org.elasticsearch.xpack.ql.plan.logical.LogicalPlan;
@@ -218,12 +217,6 @@ public class PlannerUtils {
         return Queries.combine(FILTER, asList(requestFilter));
     }
 
-    public static EsSourceOptions esSourceOptions(PhysicalPlan plan) {
-        Holder<EsSourceOptions> holder = new Holder<>();
-        plan.forEachUp(FragmentExec.class, f -> f.fragment().forEachUp(EsRelation.class, r -> holder.set(r.esSourceOptions())));
-        return holder.get();
-    }
-
     /**
      * Map QL's {@link DataType} to the compute engine's {@link ElementType}, for sortable types only.
      * This specifically excludes spatial data types, which are not themselves sortable.

+ 37 - 48
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java

@@ -72,7 +72,6 @@ import org.elasticsearch.xpack.esql.planner.EsPhysicalOperationProviders;
 import org.elasticsearch.xpack.esql.planner.LocalExecutionPlanner;
 import org.elasticsearch.xpack.esql.planner.PlannerUtils;
 import org.elasticsearch.xpack.esql.session.EsqlConfiguration;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -304,51 +303,42 @@ public class ComputeService {
         // Since it's used only for @timestamp, it is relatively safe to assume it's not needed
         // but it would be better to have a proper impl.
         QueryBuilder requestFilter = PlannerUtils.requestFilter(planWithReducer, x -> true);
-        EsSourceOptions esSourceOptions = PlannerUtils.esSourceOptions(planWithReducer);
-        lookupDataNodes(
-            parentTask,
-            clusterAlias,
-            requestFilter,
-            concreteIndices,
-            originalIndices,
-            esSourceOptions,
-            ActionListener.wrap(dataNodes -> {
-                try (RefCountingRunnable refs = new RefCountingRunnable(() -> parentListener.onResponse(null))) {
-                    // For each target node, first open a remote exchange on the remote node, then link the exchange source to
-                    // the new remote exchange sink, and initialize the computation on the target node via data-node-request.
-                    for (DataNode node : dataNodes) {
-                        var dataNodeListener = ActionListener.releaseAfter(dataNodeListenerSupplier.get(), refs.acquire());
-                        var queryPragmas = configuration.pragmas();
-                        ExchangeService.openExchange(
-                            transportService,
-                            node.connection,
-                            sessionId,
-                            queryPragmas.exchangeBufferSize(),
-                            esqlExecutor,
-                            dataNodeListener.delegateFailureAndWrap((delegate, unused) -> {
-                                var remoteSink = exchangeService.newRemoteSink(parentTask, sessionId, transportService, node.connection);
-                                exchangeSource.addRemoteSink(remoteSink, queryPragmas.concurrentExchangeClients());
-                                transportService.sendChildRequest(
-                                    node.connection,
-                                    DATA_ACTION_NAME,
-                                    new DataNodeRequest(
-                                        sessionId,
-                                        configuration,
-                                        clusterAlias,
-                                        node.shardIds,
-                                        node.aliasFilters,
-                                        planWithReducer
-                                    ),
-                                    parentTask,
-                                    TransportRequestOptions.EMPTY,
-                                    new ActionListenerResponseHandler<>(delegate, ComputeResponse::new, esqlExecutor)
-                                );
-                            })
-                        );
-                    }
+        lookupDataNodes(parentTask, clusterAlias, requestFilter, concreteIndices, originalIndices, ActionListener.wrap(dataNodes -> {
+            try (RefCountingRunnable refs = new RefCountingRunnable(() -> parentListener.onResponse(null))) {
+                // For each target node, first open a remote exchange on the remote node, then link the exchange source to
+                // the new remote exchange sink, and initialize the computation on the target node via data-node-request.
+                for (DataNode node : dataNodes) {
+                    var dataNodeListener = ActionListener.releaseAfter(dataNodeListenerSupplier.get(), refs.acquire());
+                    var queryPragmas = configuration.pragmas();
+                    ExchangeService.openExchange(
+                        transportService,
+                        node.connection,
+                        sessionId,
+                        queryPragmas.exchangeBufferSize(),
+                        esqlExecutor,
+                        dataNodeListener.delegateFailureAndWrap((delegate, unused) -> {
+                            var remoteSink = exchangeService.newRemoteSink(parentTask, sessionId, transportService, node.connection);
+                            exchangeSource.addRemoteSink(remoteSink, queryPragmas.concurrentExchangeClients());
+                            transportService.sendChildRequest(
+                                node.connection,
+                                DATA_ACTION_NAME,
+                                new DataNodeRequest(
+                                    sessionId,
+                                    configuration,
+                                    clusterAlias,
+                                    node.shardIds,
+                                    node.aliasFilters,
+                                    planWithReducer
+                                ),
+                                parentTask,
+                                TransportRequestOptions.EMPTY,
+                                new ActionListenerResponseHandler<>(delegate, ComputeResponse::new, esqlExecutor)
+                            );
+                        })
+                    );
                 }
-            }, parentListener::onFailure)
-        );
+            }
+        }, parentListener::onFailure));
     }
 
     private void startComputeOnRemoteClusters(
@@ -554,7 +544,6 @@ public class ComputeService {
         QueryBuilder filter,
         Set<String> concreteIndices,
         String[] originalIndices,
-        EsSourceOptions esSourceOptions,
         ActionListener<List<DataNode>> listener
     ) {
         ThreadContext threadContext = transportService.getThreadPool().getThreadContext();
@@ -598,10 +587,10 @@ public class ComputeService {
             threadContext.markAsSystemContext();
             SearchShardsRequest searchShardsRequest = new SearchShardsRequest(
                 originalIndices,
-                esSourceOptions.indicesOptions(SearchRequest.DEFAULT_INDICES_OPTIONS),
+                SearchRequest.DEFAULT_INDICES_OPTIONS,
                 filter,
                 null,
-                esSourceOptions.preference(),
+                null,
                 false,
                 clusterAlias
             );

+ 1 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlFeatures.java

@@ -111,6 +111,7 @@ public class EsqlFeatures implements FeatureSpecification {
     /**
      * Does ESQL support FROM OPTIONS?
      */
+    @Deprecated
     public static final NodeFeature FROM_OPTIONS = new NodeFeature("esql.from_options");
 
     /**

+ 5 - 10
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlIndexResolver.java

@@ -11,13 +11,13 @@ import org.elasticsearch.action.fieldcaps.FieldCapabilitiesIndexResponse;
 import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
 import org.elasticsearch.action.fieldcaps.FieldCapabilitiesResponse;
 import org.elasticsearch.action.fieldcaps.IndexFieldCapabilities;
-import org.elasticsearch.action.support.IndicesOptions;
 import org.elasticsearch.client.internal.Client;
 import org.elasticsearch.common.Strings;
 import org.elasticsearch.index.mapper.TimeSeriesParams;
 import org.elasticsearch.threadpool.ThreadPool;
 import org.elasticsearch.xpack.ql.index.EsIndex;
 import org.elasticsearch.xpack.ql.index.IndexResolution;
+import org.elasticsearch.xpack.ql.index.IndexResolver;
 import org.elasticsearch.xpack.ql.type.DataType;
 import org.elasticsearch.xpack.ql.type.DataTypeRegistry;
 import org.elasticsearch.xpack.ql.type.DateEsField;
@@ -55,14 +55,9 @@ public class EsqlIndexResolver {
     /**
      * Resolves a pattern to one (potentially compound meaning that spawns multiple indices) mapping.
      */
-    public void resolveAsMergedMapping(
-        String indexWildcard,
-        Set<String> fieldNames,
-        IndicesOptions indicesOptions,
-        ActionListener<IndexResolution> listener
-    ) {
+    public void resolveAsMergedMapping(String indexWildcard, Set<String> fieldNames, ActionListener<IndexResolution> listener) {
         client.fieldCaps(
-            createFieldCapsRequest(indexWildcard, fieldNames, indicesOptions),
+            createFieldCapsRequest(indexWildcard, fieldNames),
             listener.delegateFailureAndWrap((l, response) -> l.onResponse(mergedMappings(indexWildcard, response)))
         );
     }
@@ -244,13 +239,13 @@ public class EsqlIndexResolver {
         return new InvalidMappedField(name, "mapped as different metric types in indices: " + indices);
     }
 
-    private static FieldCapabilitiesRequest createFieldCapsRequest(String index, Set<String> fieldNames, IndicesOptions indicesOptions) {
+    private static FieldCapabilitiesRequest createFieldCapsRequest(String index, Set<String> fieldNames) {
         FieldCapabilitiesRequest req = new FieldCapabilitiesRequest().indices(Strings.commaDelimitedListToStringArray(index));
         req.fields(fieldNames.toArray(String[]::new));
         req.includeUnmapped(true);
         // lenient because we throw our own errors looking at the response e.g. if something was not resolved
         // also because this way security doesn't throw authorization exceptions but rather honors ignore_unavailable
-        req.indicesOptions(indicesOptions);
+        req.indicesOptions(IndexResolver.FIELD_CAPS_INDICES_OPTIONS);
         req.setMergeResults(false);
         return req;
     }

+ 3 - 7
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java

@@ -9,7 +9,6 @@ package org.elasticsearch.xpack.esql.session;
 
 import org.elasticsearch.action.ActionListener;
 import org.elasticsearch.action.fieldcaps.FieldCapabilities;
-import org.elasticsearch.action.support.IndicesOptions;
 import org.elasticsearch.common.Strings;
 import org.elasticsearch.common.regex.Regex;
 import org.elasticsearch.core.Assertions;
@@ -208,13 +207,11 @@ public class EsqlSession {
             TableInfo tableInfo = preAnalysis.indices.get(0);
             TableIdentifier table = tableInfo.id();
             var fieldNames = fieldNames(parsed, enrichPolicyMatchFields);
-            assert preAnalysis.esSourceOptions.size() == 1 : "Unexpected source options count: " + preAnalysis.esSourceOptions.size();
-            var indicesOptions = preAnalysis.esSourceOptions.get(0).indicesOptions(IndexResolver.FIELD_CAPS_INDICES_OPTIONS);
 
             if (Assertions.ENABLED) {
-                resolveMergedMappingAgainstBothResolvers(table.index(), fieldNames, indicesOptions, listener);
+                resolveMergedMappingAgainstBothResolvers(table.index(), fieldNames, listener);
             } else {
-                esqlIndexResolver.resolveAsMergedMapping(table.index(), fieldNames, indicesOptions, listener);
+                esqlIndexResolver.resolveAsMergedMapping(table.index(), fieldNames, listener);
             }
         } else {
             try {
@@ -234,13 +231,12 @@ public class EsqlSession {
     private void resolveMergedMappingAgainstBothResolvers(
         String indexWildcard,
         Set<String> fieldNames,
-        IndicesOptions indicesOptions,
         ActionListener<IndexResolution> listener
     ) {
         indexResolver.resolveAsMergedMapping(indexWildcard, fieldNames, false, Map.of(), new ActionListener<>() {
             @Override
             public void onResponse(IndexResolution fromQl) {
-                esqlIndexResolver.resolveAsMergedMapping(indexWildcard, fieldNames, indicesOptions, new ActionListener<>() {
+                esqlIndexResolver.resolveAsMergedMapping(indexWildcard, fieldNames, new ActionListener<>() {
                     @Override
                     public void onResponse(IndexResolution fromEsql) {
                         if (fromQl.isValid() == false) {

+ 3 - 35
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypesTests.java

@@ -88,7 +88,6 @@ import org.elasticsearch.xpack.ql.expression.Nullability;
 import org.elasticsearch.xpack.ql.expression.function.Function;
 import org.elasticsearch.xpack.ql.expression.predicate.operator.arithmetic.ArithmeticOperation;
 import org.elasticsearch.xpack.ql.index.EsIndex;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.plan.logical.Filter;
 import org.elasticsearch.xpack.ql.plan.logical.Limit;
 import org.elasticsearch.xpack.ql.plan.logical.LogicalPlan;
@@ -464,7 +463,7 @@ public class PlanNamedTypesTests extends ESTestCase {
     }
 
     public void testEsRelation() throws IOException {
-        var orig = new EsRelation(Source.EMPTY, randomEsIndex(), List.of(randomFieldAttribute()), randomEsSourceOptions(), randomBoolean());
+        var orig = new EsRelation(Source.EMPTY, randomEsIndex(), List.of(randomFieldAttribute()), randomBoolean());
         BytesStreamOutput bso = new BytesStreamOutput();
         PlanStreamOutput out = new PlanStreamOutput(bso, planNameRegistry, null);
         PlanNamedTypes.writeEsRelation(out, orig);
@@ -475,7 +474,7 @@ public class PlanNamedTypesTests extends ESTestCase {
     public void testEsqlProject() throws IOException {
         var orig = new EsqlProject(
             Source.EMPTY,
-            new EsRelation(Source.EMPTY, randomEsIndex(), List.of(randomFieldAttribute()), randomEsSourceOptions(), randomBoolean()),
+            new EsRelation(Source.EMPTY, randomEsIndex(), List.of(randomFieldAttribute()), randomBoolean()),
             List.of(randomFieldAttribute())
         );
         BytesStreamOutput bso = new BytesStreamOutput();
@@ -486,13 +485,7 @@ public class PlanNamedTypesTests extends ESTestCase {
     }
 
     public void testMvExpand() throws IOException {
-        var esRelation = new EsRelation(
-            Source.EMPTY,
-            randomEsIndex(),
-            List.of(randomFieldAttribute()),
-            randomEsSourceOptions(),
-            randomBoolean()
-        );
+        var esRelation = new EsRelation(Source.EMPTY, randomEsIndex(), List.of(randomFieldAttribute()), randomBoolean());
         var orig = new MvExpand(Source.EMPTY, esRelation, randomFieldAttribute(), randomFieldAttribute());
         BytesStreamOutput bso = new BytesStreamOutput();
         PlanStreamOutput out = new PlanStreamOutput(bso, planNameRegistry, null);
@@ -684,31 +677,6 @@ public class PlanNamedTypesTests extends ESTestCase {
         return Map.copyOf(map);
     }
 
-    static EsSourceOptions randomEsSourceOptions() {
-        EsSourceOptions eso = new EsSourceOptions();
-        if (randomBoolean()) {
-            eso.addOption("allow_no_indices", String.valueOf(randomBoolean()));
-        }
-        if (randomBoolean()) {
-            eso.addOption("ignore_unavailable", String.valueOf(randomBoolean()));
-        }
-        if (randomBoolean()) {
-            String idsList = String.join(",", randomList(1, 5, PlanNamedTypesTests::randomName));
-            eso.addOption(
-                "preference",
-                randomFrom(
-                    "_only_local",
-                    "_local",
-                    "_only_nodes:" + idsList,
-                    "_prefer_nodes:" + idsList,
-                    "_shards:" + idsList,
-                    randomName()
-                )
-            );
-        }
-        return eso;
-    }
-
     static List<DataType> DATA_TYPES = EsqlDataTypes.types().stream().toList();
 
     static DataType randomDataType() {

+ 1 - 103
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java

@@ -9,8 +9,6 @@ package org.elasticsearch.xpack.esql.parser;
 
 import org.apache.lucene.util.BytesRef;
 import org.elasticsearch.Build;
-import org.elasticsearch.action.search.SearchRequest;
-import org.elasticsearch.common.Randomness;
 import org.elasticsearch.core.Tuple;
 import org.elasticsearch.test.ESTestCase;
 import org.elasticsearch.xpack.esql.VerificationException;
@@ -594,7 +592,7 @@ public class StatementParserTests extends ESTestCase {
         expectError("show info metadata _index", "line 1:11: token recognition error at: 'm'");
         expectError(
             "explain [from foo] metadata _index",
-            "line 1:20: mismatched input 'metadata' expecting {'|', ',', OPENING_BRACKET, ']', 'options', 'metadata'}"
+            "line 1:20: mismatched input 'metadata' expecting {'|', ',', OPENING_BRACKET, ']', 'metadata'}"
         );
     }
 
@@ -618,106 +616,6 @@ public class StatementParserTests extends ESTestCase {
         expectError("from test metadata emp_no", "line 1:21: unsupported metadata field [emp_no]");
     }
 
-    public void testFromOptionsUnknownName() {
-        expectError(FROM + " options \"foo\"=\"oof\",\"bar\"=\"rab\"", "line 1:20: invalid options provided: unknown option named [foo]");
-    }
-
-    public void testFromOptionsPartialInvalid() {
-        expectError(
-            FROM + " options \"allow_no_indices\"=\"true\",\"bar\"=\"rab\"",
-            "line 1:46: invalid options provided: unknown option named [bar]"
-        );
-    }
-
-    public void testFromOptionsInvalidIndicesOptionValue() {
-        expectError(
-            FROM + " options \"allow_no_indices\"=\"foo\"",
-            "line 1:20: invalid options provided: Could not convert [allow_no_indices] to boolean"
-        );
-    }
-
-    public void testFromOptionsEmptyIndicesOptionName() {
-        expectError(FROM + " options \"\"=\"true\"", "line 1:20: invalid options provided: unknown option named []");
-    }
-
-    public void testFromOptionsEmptyIndicesOptionValue() {
-        expectError(
-            FROM + " options \"allow_no_indices\"=\"\"",
-            "line 1:20: invalid options provided: Could not convert [allow_no_indices] to boolean. "
-                + "Failed to parse value [] as only [true] or [false] are allowed."
-        );
-        expectError(
-            FROM + " options \"ignore_unavailable\"=\"TRUE\"",
-            "line 1:20: invalid options provided: Could not convert [ignore_unavailable] to boolean. "
-                + "Failed to parse value [TRUE] as only [true] or [false] are allowed."
-        );
-        expectError(FROM + " options \"preference\"=\"\"", "line 1:20: invalid options provided: no Preference for []");
-    }
-
-    public void testFromOptionsSuggestedOptionName() {
-        expectError(
-            FROM + " options \"allow_indices\"=\"true\"",
-            "line 1:20: invalid options provided: unknown option named [allow_indices], did you mean [allow_no_indices]?"
-        );
-    }
-
-    public void testFromOptionsInvalidPreferValue() {
-        expectError(FROM + " options \"preference\"=\"_foo\"", "line 1:20: invalid options provided: no Preference for [_foo]");
-    }
-
-    public void testFromOptionsUnquotedName() {
-        expectError(FROM + " options allow_no_indices=\"oof\"", "line 1:19: mismatched input 'allow_no_indices' expecting QUOTED_STRING");
-    }
-
-    public void testFromOptionsUnquotedValue() {
-        expectError(FROM + " options \"allow_no_indices\"=oof", "line 1:38: mismatched input 'oof' expecting QUOTED_STRING");
-    }
-
-    public void testFromOptionsDuplicates() {
-        for (var name : List.of("allow_no_indices", "ignore_unavailable", "preference")) {
-            String options = '"' + name + "\"=\"false\"";
-            options += ',' + options;
-            expectError(FROM + " options " + options, "invalid options provided: option [" + name + "] has already been provided");
-        }
-    }
-
-    public void testFromOptionsValues() {
-        boolean allowNoIndices = randomBoolean();
-        boolean ignoreUnavailable = randomBoolean();
-        String idsList = String.join(",", randomList(1, 5, () -> randomAlphaOfLengthBetween(1, 25)));
-        String preference = randomFrom(
-            "_only_local",
-            "_local",
-            "_only_nodes:" + idsList,
-            "_prefer_nodes:" + idsList,
-            "_shards:" + idsList,
-            randomAlphaOfLengthBetween(1, 25)
-        );
-        List<String> options = new ArrayList<>(3);
-        options.add("\"allow_no_indices\"=\"" + allowNoIndices + "\"");
-        options.add("\"ignore_unavailable\"=\"" + ignoreUnavailable + "\"");
-        options.add("\"preference\"=\"" + preference + "\"");
-        Randomness.shuffle(options);
-        String optionsList = String.join(",", options);
-
-        var plan = statement(FROM + " OPTIONS " + optionsList);
-        var unresolved = as(plan, EsqlUnresolvedRelation.class);
-        assertNotNull(unresolved.esSourceOptions());
-        var indicesOptions = unresolved.esSourceOptions().indicesOptions(SearchRequest.DEFAULT_INDICES_OPTIONS);
-        assertThat(indicesOptions.allowNoIndices(), is(allowNoIndices));
-        assertThat(indicesOptions.ignoreUnavailable(), is(ignoreUnavailable));
-        assertThat(unresolved.esSourceOptions().preference(), is(preference));
-    }
-
-    public void testFromOptionsWithMetadata() {
-        var plan = statement(FROM + " METADATA _id OPTIONS \"preference\"=\"foo\"");
-        var unresolved = as(plan, EsqlUnresolvedRelation.class);
-        assertNotNull(unresolved.esSourceOptions());
-        assertThat(unresolved.esSourceOptions().preference(), is("foo"));
-        assertFalse(unresolved.metadataFields().isEmpty());
-        assertThat(unresolved.metadataFields().get(0).qualifiedName(), is("_id"));
-    }
-
     public void testDissectPattern() {
         LogicalPlan cmd = processingCommand("dissect a \"%{foo}\"");
         assertEquals(Dissect.class, cmd.getClass());

+ 0 - 135
x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/options/EsSourceOptions.java

@@ -1,135 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-
-package org.elasticsearch.xpack.ql.options;
-
-import org.elasticsearch.action.support.IndicesOptions;
-import org.elasticsearch.cluster.routing.Preference;
-import org.elasticsearch.common.io.stream.StreamInput;
-import org.elasticsearch.common.io.stream.StreamOutput;
-import org.elasticsearch.core.Nullable;
-import org.elasticsearch.xpack.ql.util.StringUtils;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Objects;
-
-import static org.elasticsearch.action.support.IndicesOptions.ConcreteTargetOptions.IGNORE_UNAVAILABLE;
-import static org.elasticsearch.action.support.IndicesOptions.WildcardOptions.ALLOW_NO_INDICES;
-
-/*
- * This provides a repository for index resolution and/or search-time configuration options.
- * Such as: [search] preference and [search / index resolution] allow_no_indices, ignore_unavailable.
- *
- * Some of the options end up in a IndicesOptions instance. However, FieldCaps and Search APIs use IndicesOptions
- * defaults having conflicting values. So this class will just validate and record the user-provided settings first, and then apply these
- * onto a base (an API-specific default).
- */
-public class EsSourceOptions {
-
-    private static final String OPTION_PREFERENCE = "preference";
-    public static final EsSourceOptions NO_OPTIONS = new EsSourceOptions();
-
-    @Nullable
-    private String allowNoIndices;
-    @Nullable
-    private String ignoreUnavailable;
-    @Nullable
-    private String preference;
-
-    public EsSourceOptions() {}
-
-    public EsSourceOptions(StreamInput in) throws IOException {
-        this.allowNoIndices = in.readOptionalString();
-        this.ignoreUnavailable = in.readOptionalString();
-        this.preference = in.readOptionalString();
-    }
-
-    public IndicesOptions indicesOptions(IndicesOptions base) {
-        if (allowNoIndices == null && ignoreUnavailable == null) {
-            return base;
-        }
-        var wildcardOptions = allowNoIndices != null
-            ? IndicesOptions.WildcardOptions.parseParameters(null, allowNoIndices, base.wildcardOptions())
-            : base.wildcardOptions();
-        var targetOptions = ignoreUnavailable != null
-            ? IndicesOptions.ConcreteTargetOptions.fromParameter(ignoreUnavailable, base.concreteTargetOptions())
-            : base.concreteTargetOptions();
-        return new IndicesOptions(targetOptions, wildcardOptions, base.gatekeeperOptions(), base.failureStoreOptions());
-    }
-
-    @Nullable
-    public String preference() {
-        return preference;
-    }
-
-    public void addOption(String name, String value) {
-        switch (name) {
-            case ALLOW_NO_INDICES -> {
-                requireUnset(name, allowNoIndices);
-                IndicesOptions.WildcardOptions.parseParameters(null, value, null);
-                allowNoIndices = value;
-            }
-            case IGNORE_UNAVAILABLE -> {
-                requireUnset(name, ignoreUnavailable);
-                IndicesOptions.ConcreteTargetOptions.fromParameter(value, null);
-                ignoreUnavailable = value;
-            }
-            case OPTION_PREFERENCE -> {
-                requireUnset(name, preference);
-                // The validation applies only for the predefined settings (i.e. prefixed by '_') or empty one (i.e. delegate handling
-                // of this case).
-                if (value.isEmpty() || value.charAt(0) == '_') {
-                    // Note: _search will neither fail, nor warn about something like `preference=_shards:0,1|_doesnotexist`
-                    Preference.parse(value);
-                }
-                preference = value;
-            }
-            default -> {
-                String message = "unknown option named [" + name + "]";
-                List<String> matches = StringUtils.findSimilar(name, List.of(ALLOW_NO_INDICES, IGNORE_UNAVAILABLE, OPTION_PREFERENCE));
-                if (matches.isEmpty() == false) {
-                    String suggestions = matches.size() == 1 ? "[" + matches.get(0) + "]" : "any of " + matches;
-                    message += ", did you mean " + suggestions + "?";
-                }
-                throw new IllegalArgumentException(message);
-            }
-        }
-    }
-
-    private static void requireUnset(String name, String value) {
-        if (value != null) {
-            throw new IllegalArgumentException("option [" + name + "] has already been provided");
-        }
-    }
-
-    public void writeEsSourceOptions(StreamOutput out) throws IOException {
-        out.writeOptionalString(allowNoIndices);
-        out.writeOptionalString(ignoreUnavailable);
-        out.writeOptionalString(preference);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(allowNoIndices, ignoreUnavailable, preference);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-
-        EsSourceOptions other = (EsSourceOptions) obj;
-        return Objects.equals(allowNoIndices, other.allowNoIndices)
-            && Objects.equals(ignoreUnavailable, other.ignoreUnavailable)
-            && Objects.equals(preference, other.preference);
-    }
-}

+ 6 - 18
x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/plan/logical/EsRelation.java

@@ -9,7 +9,6 @@ package org.elasticsearch.xpack.ql.plan.logical;
 import org.elasticsearch.xpack.ql.expression.Attribute;
 import org.elasticsearch.xpack.ql.expression.FieldAttribute;
 import org.elasticsearch.xpack.ql.index.EsIndex;
-import org.elasticsearch.xpack.ql.options.EsSourceOptions;
 import org.elasticsearch.xpack.ql.tree.NodeInfo;
 import org.elasticsearch.xpack.ql.tree.NodeUtils;
 import org.elasticsearch.xpack.ql.tree.Source;
@@ -25,33 +24,26 @@ public class EsRelation extends LeafPlan {
 
     private final EsIndex index;
     private final List<Attribute> attrs;
-    private final EsSourceOptions esSourceOptions;
     private final boolean frozen;
 
     public EsRelation(Source source, EsIndex index, boolean frozen) {
-        this(source, index, flatten(source, index.mapping()), EsSourceOptions.NO_OPTIONS, frozen);
+        this(source, index, flatten(source, index.mapping()), frozen);
     }
 
     public EsRelation(Source source, EsIndex index, List<Attribute> attributes) {
-        this(source, index, attributes, EsSourceOptions.NO_OPTIONS, false);
+        this(source, index, attributes, false);
     }
 
-    public EsRelation(Source source, EsIndex index, List<Attribute> attributes, EsSourceOptions esSourceOptions) {
-        this(source, index, attributes, esSourceOptions, false);
-    }
-
-    public EsRelation(Source source, EsIndex index, List<Attribute> attributes, EsSourceOptions esSourceOptions, boolean frozen) {
+    public EsRelation(Source source, EsIndex index, List<Attribute> attributes, boolean frozen) {
         super(source);
         this.index = index;
         this.attrs = attributes;
-        Objects.requireNonNull(esSourceOptions);
-        this.esSourceOptions = esSourceOptions;
         this.frozen = frozen;
     }
 
     @Override
     protected NodeInfo<EsRelation> info() {
-        return NodeInfo.create(this, EsRelation::new, index, attrs, esSourceOptions, frozen);
+        return NodeInfo.create(this, EsRelation::new, index, attrs, frozen);
     }
 
     private static List<Attribute> flatten(Source source, Map<String, EsField> mapping) {
@@ -81,10 +73,6 @@ public class EsRelation extends LeafPlan {
         return index;
     }
 
-    public EsSourceOptions esSourceOptions() {
-        return esSourceOptions;
-    }
-
     public boolean frozen() {
         return frozen;
     }
@@ -101,7 +89,7 @@ public class EsRelation extends LeafPlan {
 
     @Override
     public int hashCode() {
-        return Objects.hash(index, esSourceOptions, frozen);
+        return Objects.hash(index, frozen);
     }
 
     @Override
@@ -115,7 +103,7 @@ public class EsRelation extends LeafPlan {
         }
 
         EsRelation other = (EsRelation) obj;
-        return Objects.equals(index, other.index) && Objects.equals(esSourceOptions, other.esSourceOptions) && frozen == other.frozen;
+        return Objects.equals(index, other.index) && frozen == other.frozen;
     }
 
     @Override

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä