diff --git a/docs/changelog/140004.yaml b/docs/changelog/140004.yaml new file mode 100644 index 0000000000000..ffabb5d429db8 --- /dev/null +++ b/docs/changelog/140004.yaml @@ -0,0 +1,6 @@ +pr: 140004 +summary: "Adding ES|QL command URI_PART" +area: ES|QL +type: feature +issues: + - 134885 diff --git a/docs/reference/query-languages/esql/_snippets/commands/examples/uri_parts.csv-spec/basic.md b/docs/reference/query-languages/esql/_snippets/commands/examples/uri_parts.csv-spec/basic.md new file mode 100644 index 0000000000000..1e153f495a924 --- /dev/null +++ b/docs/reference/query-languages/esql/_snippets/commands/examples/uri_parts.csv-spec/basic.md @@ -0,0 +1,11 @@ +% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it. + +```esql +ROW uri = "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment" +| URI_PARTS parts = uri +| KEEP parts.* +``` + +| parts.domain:keyword | parts.fragment:keyword | parts.path:keyword | parts.extension:keyword | parts.port:integer | parts.query:keyword | parts.scheme:keyword | parts.user_info:keyword | parts.username:keyword | parts.password:keyword | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| www.example.com | fragment | /foo.gif | gif | 80 | key1=val1&key2=val2 | http | myusername:mypassword | myusername | mypassword | diff --git a/docs/reference/query-languages/esql/_snippets/commands/layout/uri_parts.md b/docs/reference/query-languages/esql/_snippets/commands/layout/uri_parts.md new file mode 100644 index 0000000000000..f5cc0e13bc1ee --- /dev/null +++ b/docs/reference/query-languages/esql/_snippets/commands/layout/uri_parts.md @@ -0,0 +1,84 @@ +```yaml {applies_to} +serverless: preview +stack: preview +``` + +The `URI_PARTS` processing command parses a Uniform Resource Identifier (URI) string and extracts its components into new columns. + +::::{note} +This command doesn't support multi-value inputs. +:::: + + +**Syntax** + +```esql +URI_PARTS prefix = expression +``` + +**Parameters** + +`prefix` +: The prefix for the output columns. The extracted components are available as `prefix.component`. + +`expression` +: The string expression containing the URI to parse. + +**Description** + +The `URI_PARTS` command parses a URI string and extracts its components into new columns. +The new columns are prefixed with the specified `prefix` followed by a dot (`.`). + +This command is the query-time equivalent of the [URI parts ingest processor](/reference/enrich-processor/uri-parts-processor.md). + +The following columns are created: + +`prefix.domain` +: The host part of the URI. + +`prefix.fragment` +: The fragment part of the URI (the part after `#`). + +`prefix.path` +: The path part of the URI. + +`prefix.extension` +: The file extension extracted from the path. + +`prefix.port` +: The port number as an integer. + +`prefix.query` +: The query string part of the URI (the part after `?`). + +`prefix.scheme` +: The scheme (protocol) of the URI (e.g., `http`, `https`, `ftp`). + +`prefix.user_info` +: The user information part of the URI. + +`prefix.username` +: The username extracted from the user information. + +`prefix.password` +: The password extracted from the user information. + +If a component is missing from the URI, the corresponding column contains `null`. +If the expression evaluates to `null`, all output columns are `null`. +If the expression is not a valid URI, a warning is issued and all output columns are `null`. + +**Examples** + +The following example parses a URI and extracts its parts: + +:::{include} ../examples/uri_parts.csv-spec/basic.md +::: + +You can use the extracted parts in subsequent commands, for example to filter by domain: + +```esql +FROM web_logs +| URI_PARTS p = uri +| WHERE p.domain == "www.example.com" +| STATS COUNT(*) BY p.path +``` diff --git a/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md b/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md index 8bfb18bf668df..d43e3e428068e 100644 --- a/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md +++ b/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md @@ -17,4 +17,5 @@ * [`SAMPLE`](/reference/query-languages/esql/commands/sample.md) {applies_to}`stack: preview` {applies_to}`serverless: preview` * [`SORT`](/reference/query-languages/esql/commands/sort.md) * [`STATS`](/reference/query-languages/esql/commands/stats-by.md) +* [`URI_PARTS`](/reference/query-languages/esql/commands/uri-parts.md) {applies_to}`stack: preview` {applies_to}`serverless: preview` * [`WHERE`](/reference/query-languages/esql/commands/where.md) diff --git a/docs/reference/query-languages/esql/commands/uri-parts.md b/docs/reference/query-languages/esql/commands/uri-parts.md new file mode 100644 index 0000000000000..70a253b8f65ca --- /dev/null +++ b/docs/reference/query-languages/esql/commands/uri-parts.md @@ -0,0 +1,10 @@ +--- +navigation_title: "URI_PARTS" +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-uri_parts +--- + +# {{esql}} `URI_PARTS` command [esql-uri_parts] + +:::{include} ../_snippets/commands/layout/uri_parts.md +::: diff --git a/docs/reference/query-languages/esql/kibana/definition/commands/uriparts.json b/docs/reference/query-languages/esql/kibana/definition/commands/uriparts.json new file mode 100644 index 0000000000000..6eba8057c569d --- /dev/null +++ b/docs/reference/query-languages/esql/kibana/definition/commands/uriparts.json @@ -0,0 +1,5 @@ +{ + "comment" : "This is generated by ESQL’s DocsV3Support. Do not edit it. See ../README.md for how to regenerate it.", + "type" : "command", + "name" : "uriparts" +} diff --git a/docs/reference/query-languages/toc.yml b/docs/reference/query-languages/toc.yml index 6ed220830df1d..0672f799fe7a1 100644 --- a/docs/reference/query-languages/toc.yml +++ b/docs/reference/query-languages/toc.yml @@ -129,6 +129,7 @@ toc: - file: esql/commands/sample.md - file: esql/commands/sort.md - file: esql/commands/stats-by.md + - file: esql/commands/uri-parts.md - file: esql/commands/where.md - file: esql/esql-functions-operators.md children: diff --git a/libs/web-utils/build.gradle b/libs/web-utils/build.gradle index adad51f4f9ceb..fc40b5bad123e 100644 --- a/libs/web-utils/build.gradle +++ b/libs/web-utils/build.gradle @@ -7,6 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +apply plugin: 'elasticsearch.publish' + dependencies { api project(':libs:core') implementation "org.apache.httpcomponents:httpclient:${versions.httpclient}" diff --git a/libs/web-utils/src/main/java/org/elasticsearch/web/UriParts.java b/libs/web-utils/src/main/java/org/elasticsearch/web/UriParts.java index 14ef805348536..aa4a34c4ca749 100644 --- a/libs/web-utils/src/main/java/org/elasticsearch/web/UriParts.java +++ b/libs/web-utils/src/main/java/org/elasticsearch/web/UriParts.java @@ -21,16 +21,16 @@ public class UriParts { - private static final String DOMAIN = "domain"; - private static final String FRAGMENT = "fragment"; - private static final String PATH = "path"; - private static final String PORT = "port"; - private static final String QUERY = "query"; - private static final String SCHEME = "scheme"; - private static final String USER_INFO = "user_info"; - private static final String EXTENSION = "extension"; - private static final String USERNAME = "username"; - private static final String PASSWORD = "password"; + public static final String DOMAIN = "domain"; + public static final String FRAGMENT = "fragment"; + public static final String PATH = "path"; + public static final String EXTENSION = "extension"; + public static final String PORT = "port"; + public static final String QUERY = "query"; + public static final String SCHEME = "scheme"; + public static final String USER_INFO = "user_info"; + public static final String USERNAME = "username"; + public static final String PASSWORD = "password"; private static final LinkedHashMap> URI_PARTS_TYPES; @@ -39,10 +39,10 @@ public class UriParts { URI_PARTS_TYPES.putLast(DOMAIN, String.class); URI_PARTS_TYPES.putLast(FRAGMENT, String.class); URI_PARTS_TYPES.putLast(PATH, String.class); + URI_PARTS_TYPES.putLast(EXTENSION, String.class); URI_PARTS_TYPES.putLast(PORT, Integer.class); URI_PARTS_TYPES.putLast(QUERY, String.class); URI_PARTS_TYPES.putLast(SCHEME, String.class); - URI_PARTS_TYPES.putLast(EXTENSION, String.class); URI_PARTS_TYPES.putLast(USER_INFO, String.class); URI_PARTS_TYPES.putLast(USERNAME, String.class); URI_PARTS_TYPES.putLast(PASSWORD, String.class); diff --git a/x-pack/plugin/esql/build.gradle b/x-pack/plugin/esql/build.gradle index 8166ceac5a0c5..e04dc53cef46a 100644 --- a/x-pack/plugin/esql/build.gradle +++ b/x-pack/plugin/esql/build.gradle @@ -43,6 +43,7 @@ dependencies { implementation project('compute:ann') implementation project(':libs:dissect') implementation project(':libs:grok') + implementation project(':libs:web-utils') implementation project(':libs:exponential-histogram') api "org.apache.lucene:lucene-spatial3d:${versions.lucene}" api "org.antlr:antlr4-runtime:${versions.antlr4}" diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ColumnExtractOperator.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ColumnExtractOperator.java index e83a258957104..1f8c76f1d0d82 100644 --- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ColumnExtractOperator.java +++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ColumnExtractOperator.java @@ -15,24 +15,25 @@ import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator; import org.elasticsearch.core.Releasables; -import java.util.function.Supplier; - public class ColumnExtractOperator extends AbstractPageMappingOperator { - public record Factory( - ElementType[] types, - ExpressionEvaluator.Factory inputEvalSupplier, - Supplier evaluatorSupplier - ) implements OperatorFactory { + public record Factory(ElementType[] types, ExpressionEvaluator.Factory inputEvalSupplier, Evaluator.Factory evaluatorProvider) + implements + OperatorFactory { @Override public Operator get(DriverContext driverContext) { - return new ColumnExtractOperator(types, inputEvalSupplier.get(driverContext), evaluatorSupplier.get(), driverContext); + return new ColumnExtractOperator( + types, + inputEvalSupplier.get(driverContext), + evaluatorProvider.create(driverContext), + driverContext + ); } @Override public String describe() { - return "ColumnExtractOperator[evaluator=" + evaluatorSupplier.get() + "]"; + return "ColumnExtractOperator[evaluator=" + evaluatorProvider.describe() + "]"; } } @@ -60,6 +61,7 @@ protected Page process(Page page) { Block.Builder[] blockBuilders = new Block.Builder[types.length]; try { for (int i = 0; i < types.length; i++) { + // noinspection resource we release in the finally section blockBuilders[i] = types[i].newBlockBuilder(rowsCount, driverContext.blockFactory()); } @@ -76,11 +78,17 @@ protected Page process(Page page) { } Block[] blocks = new Block[blockBuilders.length]; - for (int i = 0; i < blockBuilders.length; i++) { - blocks[i] = blockBuilders[i].build(); - } + try { + for (int i = 0; i < blockBuilders.length; i++) { + blocks[i] = blockBuilders[i].build(); + } - return page.appendBlocks(blocks); + return page.appendBlocks(blocks); + } catch (Exception e) { + // If we built blocks but failed to append them, we need to release them + Releasables.closeExpectNoException(blocks); + throw e; + } } } finally { Releasables.closeExpectNoException(blockBuilders); @@ -98,6 +106,12 @@ public String toString() { } public interface Evaluator { + interface Factory { + Evaluator create(DriverContext driverContext); + + String describe(); + } + void computeRow(BytesRefBlock input, int row, Block.Builder[] target, BytesRef spare); } diff --git a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ColumnExtractOperatorTests.java b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ColumnExtractOperatorTests.java index f75d09b2a5e1a..a96940cab3c0d 100644 --- a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ColumnExtractOperatorTests.java +++ b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ColumnExtractOperatorTests.java @@ -20,7 +20,6 @@ import org.hamcrest.Matcher; import java.util.List; -import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.LongStream; @@ -51,7 +50,17 @@ public String toString() { @Override protected Operator.OperatorFactory simple(SimpleOptions options) { - Supplier expEval = () -> new FirstWord(0); + ColumnExtractOperator.Evaluator.Factory expEval = new ColumnExtractOperator.Evaluator.Factory() { + @Override + public ColumnExtractOperator.Evaluator create(DriverContext driverContext) { + return new FirstWord(0); + } + + @Override + public String describe() { + return "FirstWord"; + } + }; return new ColumnExtractOperator.Factory( new ElementType[] { ElementType.BYTES_REF }, dvrCtx -> new EvalOperator.ExpressionEvaluator() { diff --git a/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/generative/GenerativeRestTest.java b/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/generative/GenerativeRestTest.java index 4d024e9715de1..cb8e449375c37 100644 --- a/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/generative/GenerativeRestTest.java +++ b/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/generative/GenerativeRestTest.java @@ -180,7 +180,6 @@ public void run(CommandGenerator generator, CommandGenerator.CommandDescription final QueryExecuted result = previousResult == null ? execute(command, 0) : execute(previousResult.query() + command, previousResult.depth()); - previousResult = result; final boolean hasException = result.exception() != null; if (hasException || checkResults(List.of(), generator, current, previousResult, result).success() == false) { @@ -193,6 +192,7 @@ public void run(CommandGenerator generator, CommandGenerator.CommandDescription continueExecuting = true; currentSchema = result.outputSchema(); } + previousResult = result; } @Override diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java index 2089f2f893f0f..f09f1a0442d3a 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java @@ -195,6 +195,7 @@ public class CsvTestsDataLoader { private static final TestDataset DENSE_VECTOR = new TestDataset("dense_vector"); private static final TestDataset DENSE_VECTOR_BFLOAT16 = new TestDataset("dense_vector_bfloat16"); private static final TestDataset DENSE_VECTOR_ARITHMETIC = new TestDataset("dense_vector_arithmetic"); + private static final TestDataset WEB_LOGS = new TestDataset("web_logs"); private static final TestDataset COLORS = new TestDataset("colors"); private static final TestDataset COLORS_CMYK_LOOKUP = new TestDataset("colors_cmyk").withSetting("lookup-settings.json"); private static final TestDataset BASE_CONVERSION = new TestDataset("base_conversion"); @@ -302,6 +303,7 @@ public class CsvTestsDataLoader { Map.entry(DENSE_VECTOR.indexName, DENSE_VECTOR), Map.entry(DENSE_VECTOR_BFLOAT16.indexName, DENSE_VECTOR_BFLOAT16), Map.entry(DENSE_VECTOR_ARITHMETIC.indexName, DENSE_VECTOR_ARITHMETIC), + Map.entry(WEB_LOGS.indexName, WEB_LOGS), Map.entry(COLORS.indexName, COLORS), Map.entry(COLORS_CMYK_LOOKUP.indexName, COLORS_CMYK_LOOKUP), Map.entry(BASE_CONVERSION.indexName, BASE_CONVERSION), diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java index b09da810867f1..5763a39fbbc0f 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java @@ -27,6 +27,7 @@ import org.elasticsearch.xpack.esql.generator.command.pipe.SortGenerator; import org.elasticsearch.xpack.esql.generator.command.pipe.StatsGenerator; import org.elasticsearch.xpack.esql.generator.command.pipe.TimeSeriesStatsGenerator; +import org.elasticsearch.xpack.esql.generator.command.pipe.UriPartsGenerator; import org.elasticsearch.xpack.esql.generator.command.pipe.WhereGenerator; import org.elasticsearch.xpack.esql.generator.command.source.FromGenerator; import org.elasticsearch.xpack.esql.generator.command.source.PromQLGenerator; @@ -111,6 +112,7 @@ public class EsqlQueryGenerator { SampleGenerator.INSTANCE, SortGenerator.INSTANCE, StatsGenerator.INSTANCE, + UriPartsGenerator.INSTANCE, WhereGenerator.INSTANCE ); diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/LookupJoinGenerator.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/LookupJoinGenerator.java index a5752826595f4..9ca8b59b6ff8b 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/LookupJoinGenerator.java +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/LookupJoinGenerator.java @@ -115,9 +115,11 @@ public ValidationResult validateOutput( prevCols--; } - if (prevCols > columns.size()) { - return new ValidationResult(false, "Expecting at least [" + prevCols + "] columns, got [" + columns.size() + "]"); - } + // todo: awaits fix https://github.com/elastic/elasticsearch/issues/142636 + // if (prevCols > columns.size()) { + // return new ValidationResult(false, "Expecting at least [" + prevCols + "] columns, got [" + columns.size() + "]"); + // } + return VALIDATION_OK; } } diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/UriPartsGenerator.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/UriPartsGenerator.java new file mode 100644 index 0000000000000..104e349192dae --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/UriPartsGenerator.java @@ -0,0 +1,202 @@ +/* + * 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.esql.generator.command.pipe; + +import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.evaluator.command.UriPartsFunctionBridge; +import org.elasticsearch.xpack.esql.generator.Column; +import org.elasticsearch.xpack.esql.generator.EsqlQueryGenerator; +import org.elasticsearch.xpack.esql.generator.QueryExecutor; +import org.elasticsearch.xpack.esql.generator.command.CommandGenerator; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static org.elasticsearch.test.ESTestCase.randomBoolean; +import static org.elasticsearch.test.ESTestCase.randomFrom; + +public class UriPartsGenerator implements CommandGenerator { + + public static final CommandGenerator INSTANCE = new UriPartsGenerator(); + + public static final String URI_PARTS = "uri_parts"; + + /** + * Context key for the output field prefix (unquoted) used in the generated command. + */ + private static final String PREFIX = "prefix"; + + /** + * Expected URI_PARTS output field names and their ES|QL types. Computed once from + * {@link UriPartsFunctionBridge#getAllOutputFields()} and {@link DataType#fromJavaType}. + */ + private static final LinkedHashMap URI_PARTS_OUTPUT_FIELDS; + static { + LinkedHashMap> outputFields = UriPartsFunctionBridge.getAllOutputFields(); + URI_PARTS_OUTPUT_FIELDS = new LinkedHashMap<>(outputFields.size()); + for (Map.Entry> e : outputFields.entrySet()) { + URI_PARTS_OUTPUT_FIELDS.putLast(e.getKey(), Objects.requireNonNull(DataType.fromJavaType(e.getValue())).typeName()); + } + } + /** + * Valid literal URIs used so that at least some generated commands parse real URIs (happy path). + */ + private static final String[] LITERAL_URIS = new String[] { + "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment", + "https://www.elastic.co/downloads/elasticsearch", + "https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html", + "https://www.google.com/search?q=elasticsearch", + "https://github.com/elastic/elasticsearch", + "ftp://user:pass@files.internal/data.zip", + "/app/login?session=expired", + "/api/v1/users/123", + "https://www.example.com:8080/path?query=1#section" }; + + /** + * Column names that typically hold URI data (e.g. from web_logs). Prefer these when present. + */ + private static final Set URI_LIKE_FIELD_NAMES = Set.of("uri", "url"); + + @Override + public CommandDescription generate( + List previousCommands, + List previousOutput, + QuerySchema schema, + QueryExecutor executor + ) { + String inputExpression = pickUriInput(previousOutput); + if (inputExpression == null) { + return EMPTY_DESCRIPTION; // no string column or literal to use, skip + } + String prefixRaw = EsqlQueryGenerator.randomIdentifier(); + String prefixForCmd = EsqlQueryGenerator.needsQuoting(prefixRaw) ? EsqlQueryGenerator.quote(prefixRaw) : prefixRaw; + String cmdString = " | uri_parts " + prefixForCmd + " = " + inputExpression; + return new CommandDescription(URI_PARTS, this, cmdString, Map.of(PREFIX, prefixRaw)); + } + + /** + * Pick the input for URI_PARTS: either a literal valid URI (so we exercise the happy path) + * or a string field, preferring columns named "uri" or "url" when present. + */ + private static String pickUriInput(List previousOutput) { + if (randomBoolean()) { + return "\"" + randomFrom(LITERAL_URIS) + "\""; + } + return uriLikeFieldOrRandomString(previousOutput); + } + + private static String uriLikeFieldOrRandomString(List previousOutput) { + List stringColumns = previousOutput.stream() + .filter(c -> "keyword".equals(c.type()) || "text".equals(c.type())) + .filter(EsqlQueryGenerator::fieldCanBeUsed) + .toList(); + if (stringColumns.isEmpty()) { + return null; + } + for (Column c : stringColumns) { + String name = c.name(); + if (URI_LIKE_FIELD_NAMES.contains(EsqlQueryGenerator.unquote(name))) { + return EsqlQueryGenerator.needsQuoting(name) ? EsqlQueryGenerator.quote(name) : name; + } + } + Column chosen = randomFrom(stringColumns); + String name = chosen.name(); + return EsqlQueryGenerator.needsQuoting(name) ? EsqlQueryGenerator.quote(name) : name; + } + + @Override + public ValidationResult validateOutput( + List previousCommands, + CommandDescription commandDescription, + List previousColumns, + List> previousOutput, + List columns, + List> output + ) { + if (commandDescription == EMPTY_DESCRIPTION) { + return VALIDATION_OK; + } + + String prefix = (String) commandDescription.context().get(PREFIX); + if (prefix == null) { + return new ValidationResult(false, "Missing prefix in command context"); + } + + int expectedUriPartsColumns = URI_PARTS_OUTPUT_FIELDS.size(); + int expectedTotal = previousColumns.size() + expectedUriPartsColumns; + if (columns.size() != expectedTotal) { + return new ValidationResult( + false, + "Expecting [" + + expectedTotal + + "] columns (" + + previousColumns.size() + + " previous + " + + expectedUriPartsColumns + + " URI_PARTS), got [" + + columns.size() + + "]" + ); + } + + var it = columns.iterator(); + int pos = 0; + + // Previous columns must appear first, in order, with the same name and type + for (Column prev : previousColumns) { + if (it.hasNext() == false) { + return new ValidationResult(false, "Missing previous column [" + prev.name() + "] in output"); + } + Column actual = it.next(); + pos++; + if (actual.name().equals(prev.name()) == false) { + return new ValidationResult( + false, + "At position " + pos + ": expected column [" + prev.name() + "], got [" + actual.name() + "]" + ); + } + if (actual.type().equals(prev.type()) == false) { + return new ValidationResult( + false, + "Column [" + prev.name() + "] type changed from [" + prev.type() + "] to [" + actual.type() + "]" + ); + } + } + + // URI_PARTS columns must follow, in order, with the correct name and type + for (Map.Entry e : URI_PARTS_OUTPUT_FIELDS.entrySet()) { + if (it.hasNext() == false) { + return new ValidationResult( + false, + "Missing URI_PARTS column [" + prefix + "." + e.getKey() + "] (expected type [" + e.getValue() + "])" + ); + } + Column actual = it.next(); + pos++; + String expectedName = prefix + "." + e.getKey(); + String expectedType = e.getValue(); + if (actual.name().equals(expectedName) == false) { + return new ValidationResult( + false, + "At position " + pos + ": expected URI_PARTS column [" + expectedName + "], got [" + actual.name() + "]" + ); + } + if (actual.type().equals(expectedType) == false) { + return new ValidationResult( + false, + "URI_PARTS column [" + expectedName + "] expected type [" + expectedType + "], got [" + actual.type() + "]" + ); + } + } + + return CommandGenerator.expectSameRowCount(previousCommands, previousOutput, output); + } +} diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/data/web_logs.csv b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/data/web_logs.csv new file mode 100644 index 0000000000000..215f68e94df03 --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/data/web_logs.csv @@ -0,0 +1,11 @@ +timestamp:date,uri:keyword,user_agent:keyword,domain:keyword,public_ip:ip +2024-01-10T10:00:00.000Z,https://www.elastic.co/downloads/elasticsearch,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,www.elastic.co,8.8.8.8 +2024-01-10T10:01:30.500Z,/app/login?session=expired,curl/7.68.0,app.example.com,208.67.222.222 +2024-01-10T10:02:15.123Z,https://discuss.elastic.co/c/elasticsearch,Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X),discuss.elastic.co,1.1.1.1 +2024-01-10T10:03:00.000Z,/status,Uptime-Robot/1.0,monitoring.service.internal,127.0.0.1 +2024-01-10T10:04:45.987Z,https://www.google.com/search?q=elasticsearch,Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36,www.google.com,208.67.220.220 +2024-01-10T10:05:05.246Z,ftp://user:pass@files.internal/data.zip,FileZilla/3.57.0,files.internal,10.0.0.5 +2024-01-10T10:06:50.789Z,https://github.com/elastic/elasticsearch,Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36,github.com,8.8.4.4 +2024-01-10T10:07:22.111Z,https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html,Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0,www.elastic.co,1.0.0.1 +2024-01-10T10:08:33.444Z,/api/v1/users/123,Go-http-client/1.1,api.example.com,192.168.1.100 +2024-01-10T10:09:59.999Z,https://www.iana.org/domains/reserved,Lynx/2.8.9rel.1 libwww-FM/2.14,www.iana.org,2001:4860:4860::8888 diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/index/mappings/mapping-web_logs.json b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/index/mappings/mapping-web_logs.json new file mode 100644 index 0000000000000..9004620658a93 --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/index/mappings/mapping-web_logs.json @@ -0,0 +1,19 @@ +{ + "properties": { + "timestamp": { + "type": "date" + }, + "uri": { + "type": "keyword" + }, + "user_agent": { + "type": "keyword" + }, + "domain": { + "type": "keyword" + }, + "public_ip": { + "type": "ip" + } + } +} diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/uri_parts.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/uri_parts.csv-spec new file mode 100644 index 0000000000000..801abfb4ed06d --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/uri_parts.csv-spec @@ -0,0 +1,321 @@ +basic +required_capability: uri_parts_command + +// tag::basic[] +ROW uri = "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment" +| URI_PARTS parts = uri +| KEEP parts.* +// end::basic[] +; + +// tag::basic-result[] +parts.domain:keyword | parts.fragment:keyword | parts.path:keyword | parts.extension:keyword | parts.port:integer | parts.query:keyword | parts.scheme:keyword | parts.user_info:keyword | parts.username:keyword | parts.password:keyword +www.example.com | fragment | /foo.gif | gif | 80 | key1=val1&key2=val2 | http | myusername:mypassword | myusername | mypassword +// end::basic-result[] +; + + +rename +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080" +| URI_PARTS parts = uri +| KEEP parts.port, parts.scheme, parts.domain +| RENAME parts.port AS port, parts.scheme AS scheme, parts.domain AS domain +; + +port:integer | scheme:keyword | domain:keyword +8080 | https | www.example.com +; + + +testAfterFiltering +required_capability: uri_parts_command + +FROM web_logs +| WHERE domain == "www.elastic.co" +| URI_PARTS p = uri +| KEEP p.scheme, p.domain, p.path +| SORT p.path +; + +p.scheme:keyword | p.domain:keyword | p.path:keyword +https | www.elastic.co | /downloads/elasticsearch +https | www.elastic.co | /guide/en/elasticsearch/reference/current/esql.html +; + + +prefixSameAsInputFieldName +required_capability: uri_parts_command + +FROM web_logs +| WHERE timestamp == "2024-01-10T10:04:45.987Z" +| URI_PARTS uri = uri +| KEEP uri.scheme, uri.domain, uri.path +; + +uri.scheme:keyword | uri.domain:keyword | uri.path:keyword +https | www.google.com | /search +; + + +prefixSameAsInputFieldNameDropInputField +required_capability: uri_parts_command + +FROM web_logs +| URI_PARTS uri = uri +| WHERE timestamp == "2024-01-10T10:04:45.987Z" +| DROP uri +| KEEP uri.scheme, uri.domain, uri.path +; + +uri.scheme:keyword | uri.domain:keyword | uri.path:keyword +https | www.google.com | /search +; + + +prefixSameAsInputFieldNameEvalInputField +required_capability: uri_parts_command + +FROM web_logs +| URI_PARTS uri = uri +| WHERE timestamp == "2024-01-10T10:04:45.987Z" +| EVAL uri = 5 +| KEEP uri.scheme, uri.domain, uri.path +; + +uri.scheme:keyword | uri.domain:keyword | uri.path:keyword +https | www.google.com | /search +; + + +testBeforeFiltering +required_capability: uri_parts_command + +FROM web_logs +| URI_PARTS p = uri +| WHERE p.domain == "www.elastic.co" +| KEEP p.scheme, p.domain, p.path +| SORT p.path DESC +; + +p.scheme:keyword | p.domain:keyword | p.path:keyword +https | www.elastic.co | /guide/en/elasticsearch/reference/current/esql.html +https | www.elastic.co | /downloads/elasticsearch +; + + +testNonWebUri +required_capability: uri_parts_command + +FROM web_logs +| WHERE domain == "files.internal" +| URI_PARTS p = uri +| KEEP p.scheme, p.domain, p.path, p.username, p.password +; + +p.scheme:keyword | p.domain:keyword | p.path:keyword | p.username:keyword | p.password:keyword +ftp | files.internal | /data.zip | user | pass +; + + +testNoSchemeUri +required_capability: uri_parts_command + +FROM web_logs +| WHERE domain == "app.example.com" +| URI_PARTS p = uri +| KEEP p.scheme, p.domain, p.path, p.query +; + +p.scheme:keyword | p.domain:keyword | p.path:keyword | p.query:keyword +null | null | /app/login | session=expired +; + + +testInvalidUri +required_capability: uri_parts_command + +ROW uri = "not a valid uri" +| URI_PARTS parts = uri +| KEEP parts.scheme, parts.domain, parts.path +; +warningregex: Line 2:3: java.lang.IllegalArgumentException: unable to parse URI \[.*\] +warningregex: Line 2:3: evaluation of \[URI_PARTS.* parts = uri\] failed, treating result as null. Only first 20 failures recorded. + +parts.scheme:keyword | parts.domain:keyword | parts.path:keyword +null | null | null +; + + +dottedPrefix +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080" +| URI_PARTS a.b.c = uri +| KEEP a.b.c.port, a.b.c.scheme, a.b.c.domain +; + +a.b.c.port:integer | a.b.c.scheme:keyword | a.b.c.domain:keyword +8080 | https | www.example.com +; + + +dottedLiteralPrefix +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080" +| URI_PARTS `a.b.c` = uri +| KEEP `a.b.c`.port, `a.b.c`.scheme, `a.b.c`.domain +; + +a.b.c.port:integer | a.b.c.scheme:keyword | a.b.c.domain:keyword +8080 | https | www.example.com +; + + +literalPrefix +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080" +| URI_PARTS `a` = uri +| KEEP `a`.port, `a`.scheme, `a`.domain +; + +a.port:integer | a.scheme:keyword | a.domain:keyword +8080 | https | www.example.com +; + + +literalPrefixQuotingSubfields +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080" +| URI_PARTS `a` = uri +| KEEP `a.port`, `a.scheme`, `a.domain` +; + +a.port:integer | a.scheme:keyword | a.domain:keyword +8080 | https | www.example.com +; + + +nameShadowing +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080", x = 5, `x.port` = "shadowed" +| URI_PARTS x = uri +| KEEP x.port, x.scheme, x.domain, x +; + +x.port:integer | x.scheme:keyword | x.domain:keyword | x:integer +8080 | https | www.example.com | 5 +; + + +shadowingAnotherUriParts +required_capability: uri_parts_command + +ROW uri = "https://abc.asd:456", uri2 = "http://def.ghi:789" +| URI_PARTS x = uri +| URI_PARTS `x.port` = uri +| URI_PARTS x = uri2 +| KEEP x.port, `x.port`.port +; + +x.port:integer | x.port.port:integer +789 | 456 +; + + +uriPartsWithDrop +required_capability: uri_parts_command + +ROW uri = "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment" +| URI_PARTS parts = uri +| DROP uri, parts.fragment, parts.path, parts.extension, parts.query, parts.user_info, parts.username, parts.password +; + +parts.domain:keyword | parts.port:integer | parts.scheme:keyword +www.example.com | 80 | http +; + + +statsTest +required_capability: uri_parts_command + +ROW uri = "https://www.example.com:8080/path1" +| URI_PARTS parts = uri +| STATS VALUES(parts.port) BY parts.domain +; + +VALUES(parts.port):integer | parts.domain:keyword +8080 | www.example.com +; + + +multiValueTest +required_capability: uri_parts_command + +ROW uri = ["https://www.example.com:8080/path1", "http://www.example.com:80/path2"] +| URI_PARTS parts = uri +| KEEP parts.domain, parts.port, parts.scheme +; +warningregex: Line 2:3: evaluation of \[URI_PARTS.* parts = uri\] failed, treating result as null. Only first 20 failures recorded. +warningregex: Line 2:3: java.lang.IllegalArgumentException: This command doesn't support multi-value input + +parts.domain:keyword | parts.port:integer | parts.scheme:keyword +null | null | null +; + + +promqlSourceWithGrok +required_capability: uri_parts_command +required_capability: promql_command_v0 + +PROMQL index=k8s-downsampled step=1h oYJdEiiJ=(network.bytes_in{cluster!="qa",pod!="two"}) +| GROK _timeseries "%{WORD:zEyDkwmbYa} %{WORD:step} %{WORD:step}" +| URI_PARTS parts = _timeseries +| DROP _timeseries, oYJdEiiJ, step, zEyDkwmbYa +| LIMIT 1 +; +warningregex: Line 3:3: evaluation of \[URI_PARTS parts = _timeseries\] failed, treating result as null. Only first 20 failures recorded. +warningregex: Line 3:3: java.lang.IllegalArgumentException: unable to parse URI \[ + +parts.domain:keyword | parts.fragment:keyword | parts.path:keyword | parts.extension:keyword | parts.port:integer | parts.query:keyword | parts.scheme:keyword | parts.user_info:keyword | parts.username:keyword | parts.password:keyword +null | null | null | null | null | null | null | null | null | null +; + + +promqlSource +required_capability: uri_parts_command +required_capability: promql_command_v0 + +PROMQL index=k8s step=1m increase_cost=(sum(increase(network.total_cost[1m]))) +| LIMIT 2 +| EVAL uri = "https://www.elastic.co:443/downloads/elasticsearch" +| URI_PARTS parts = uri +| KEEP parts.domain, parts.port, parts.scheme +; + +parts.domain:keyword | parts.port:integer | parts.scheme:keyword +www.elastic.co | 443 | https +www.elastic.co | 443 | https +; + + +tsSource +required_capability: uri_parts_command +required_capability: ts_command_v0 + +TS k8s +| LIMIT 2 +| EVAL uri = "https://www.elastic.co:443/downloads/elasticsearch" +| URI_PARTS parts = uri +| KEEP parts.domain, parts.port, parts.scheme +; + +parts.domain:keyword | parts.port:integer | parts.scheme:keyword +www.elastic.co | 443 | https +www.elastic.co | 443 | https +; diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens index 2bb1a5499bd79..15755b80ee39c 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens @@ -15,153 +15,154 @@ SAMPLE=14 SORT=15 STATS=16 WHERE=17 -FROM=18 -TS=19 -EXTERNAL=20 -FORK=21 -FUSE=22 -INLINE=23 -INLINESTATS=24 -JOIN_LOOKUP=25 -DEV_JOIN_FULL=26 -DEV_JOIN_LEFT=27 -DEV_JOIN_RIGHT=28 -DEV_LOOKUP=29 -DEV_MMR=30 -MV_EXPAND=31 -DROP=32 -KEEP=33 -DEV_INSIST=34 -PROMQL=35 -RENAME=36 -SET=37 -SHOW=38 -UNKNOWN_CMD=39 -CHANGE_POINT_LINE_COMMENT=40 -CHANGE_POINT_MULTILINE_COMMENT=41 -CHANGE_POINT_WS=42 -ENRICH_POLICY_NAME=43 -ENRICH_LINE_COMMENT=44 -ENRICH_MULTILINE_COMMENT=45 -ENRICH_WS=46 -ENRICH_FIELD_LINE_COMMENT=47 -ENRICH_FIELD_MULTILINE_COMMENT=48 -ENRICH_FIELD_WS=49 -EXPLAIN_WS=50 -EXPLAIN_LINE_COMMENT=51 -EXPLAIN_MULTILINE_COMMENT=52 -PIPE=53 -QUOTED_STRING=54 -INTEGER_LITERAL=55 -DECIMAL_LITERAL=56 -AND=57 -ASC=58 -ASSIGN=59 -BY=60 -CAST_OP=61 -COLON=62 -SEMICOLON=63 -COMMA=64 -DESC=65 -DOT=66 -FALSE=67 -FIRST=68 -IN=69 -IS=70 -LAST=71 -LIKE=72 -NOT=73 -NULL=74 -NULLS=75 -ON=76 -OR=77 -PARAM=78 -RLIKE=79 -TRUE=80 -WITH=81 -EQ=82 -CIEQ=83 -NEQ=84 -LT=85 -LTE=86 -GT=87 -GTE=88 -PLUS=89 -MINUS=90 -ASTERISK=91 -SLASH=92 -PERCENT=93 -LEFT_BRACES=94 -RIGHT_BRACES=95 -DOUBLE_PARAMS=96 -NAMED_OR_POSITIONAL_PARAM=97 -NAMED_OR_POSITIONAL_DOUBLE_PARAMS=98 -OPENING_BRACKET=99 -CLOSING_BRACKET=100 -LP=101 -RP=102 -UNQUOTED_IDENTIFIER=103 -QUOTED_IDENTIFIER=104 -EXPR_LINE_COMMENT=105 -EXPR_MULTILINE_COMMENT=106 -EXPR_WS=107 -METADATA=108 -UNQUOTED_SOURCE=109 -FROM_LINE_COMMENT=110 -FROM_MULTILINE_COMMENT=111 -FROM_WS=112 -FORK_WS=113 -FORK_LINE_COMMENT=114 -FORK_MULTILINE_COMMENT=115 -GROUP=116 -SCORE=117 -KEY=118 -FUSE_LINE_COMMENT=119 -FUSE_MULTILINE_COMMENT=120 -FUSE_WS=121 -INLINE_STATS=122 -INLINE_LINE_COMMENT=123 -INLINE_MULTILINE_COMMENT=124 -INLINE_WS=125 -JOIN=126 -USING=127 -JOIN_LINE_COMMENT=128 -JOIN_MULTILINE_COMMENT=129 -JOIN_WS=130 -LOOKUP_LINE_COMMENT=131 -LOOKUP_MULTILINE_COMMENT=132 -LOOKUP_WS=133 -LOOKUP_FIELD_LINE_COMMENT=134 -LOOKUP_FIELD_MULTILINE_COMMENT=135 -LOOKUP_FIELD_WS=136 -MMR_LIMIT=137 -MMR_LINE_COMMENT=138 -MMR_MULTILINE_COMMENT=139 -MMR_WS=140 -MVEXPAND_LINE_COMMENT=141 -MVEXPAND_MULTILINE_COMMENT=142 -MVEXPAND_WS=143 -ID_PATTERN=144 -PROJECT_LINE_COMMENT=145 -PROJECT_MULTILINE_COMMENT=146 -PROJECT_WS=147 -PROMQL_PARAMS_LINE_COMMENT=148 -PROMQL_PARAMS_MULTILINE_COMMENT=149 -PROMQL_PARAMS_WS=150 -PROMQL_QUERY_COMMENT=151 -PROMQL_SINGLE_QUOTED_STRING=152 -PROMQL_OTHER_QUERY_CONTENT=153 -AS=154 -RENAME_LINE_COMMENT=155 -RENAME_MULTILINE_COMMENT=156 -RENAME_WS=157 -SET_LINE_COMMENT=158 -SET_MULTILINE_COMMENT=159 -SET_WS=160 -INFO=161 -SHOW_LINE_COMMENT=162 -SHOW_MULTILINE_COMMENT=163 -SHOW_WS=164 +URI_PARTS=18 +FROM=19 +TS=20 +EXTERNAL=21 +FORK=22 +FUSE=23 +INLINE=24 +INLINESTATS=25 +JOIN_LOOKUP=26 +DEV_JOIN_FULL=27 +DEV_JOIN_LEFT=28 +DEV_JOIN_RIGHT=29 +DEV_LOOKUP=30 +DEV_MMR=31 +MV_EXPAND=32 +DROP=33 +KEEP=34 +DEV_INSIST=35 +PROMQL=36 +RENAME=37 +SET=38 +SHOW=39 +UNKNOWN_CMD=40 +CHANGE_POINT_LINE_COMMENT=41 +CHANGE_POINT_MULTILINE_COMMENT=42 +CHANGE_POINT_WS=43 +ENRICH_POLICY_NAME=44 +ENRICH_LINE_COMMENT=45 +ENRICH_MULTILINE_COMMENT=46 +ENRICH_WS=47 +ENRICH_FIELD_LINE_COMMENT=48 +ENRICH_FIELD_MULTILINE_COMMENT=49 +ENRICH_FIELD_WS=50 +EXPLAIN_WS=51 +EXPLAIN_LINE_COMMENT=52 +EXPLAIN_MULTILINE_COMMENT=53 +PIPE=54 +QUOTED_STRING=55 +INTEGER_LITERAL=56 +DECIMAL_LITERAL=57 +AND=58 +ASC=59 +ASSIGN=60 +BY=61 +CAST_OP=62 +COLON=63 +SEMICOLON=64 +COMMA=65 +DESC=66 +DOT=67 +FALSE=68 +FIRST=69 +IN=70 +IS=71 +LAST=72 +LIKE=73 +NOT=74 +NULL=75 +NULLS=76 +ON=77 +OR=78 +PARAM=79 +RLIKE=80 +TRUE=81 +WITH=82 +EQ=83 +CIEQ=84 +NEQ=85 +LT=86 +LTE=87 +GT=88 +GTE=89 +PLUS=90 +MINUS=91 +ASTERISK=92 +SLASH=93 +PERCENT=94 +LEFT_BRACES=95 +RIGHT_BRACES=96 +DOUBLE_PARAMS=97 +NAMED_OR_POSITIONAL_PARAM=98 +NAMED_OR_POSITIONAL_DOUBLE_PARAMS=99 +OPENING_BRACKET=100 +CLOSING_BRACKET=101 +LP=102 +RP=103 +UNQUOTED_IDENTIFIER=104 +QUOTED_IDENTIFIER=105 +EXPR_LINE_COMMENT=106 +EXPR_MULTILINE_COMMENT=107 +EXPR_WS=108 +METADATA=109 +UNQUOTED_SOURCE=110 +FROM_LINE_COMMENT=111 +FROM_MULTILINE_COMMENT=112 +FROM_WS=113 +FORK_WS=114 +FORK_LINE_COMMENT=115 +FORK_MULTILINE_COMMENT=116 +GROUP=117 +SCORE=118 +KEY=119 +FUSE_LINE_COMMENT=120 +FUSE_MULTILINE_COMMENT=121 +FUSE_WS=122 +INLINE_STATS=123 +INLINE_LINE_COMMENT=124 +INLINE_MULTILINE_COMMENT=125 +INLINE_WS=126 +JOIN=127 +USING=128 +JOIN_LINE_COMMENT=129 +JOIN_MULTILINE_COMMENT=130 +JOIN_WS=131 +LOOKUP_LINE_COMMENT=132 +LOOKUP_MULTILINE_COMMENT=133 +LOOKUP_WS=134 +LOOKUP_FIELD_LINE_COMMENT=135 +LOOKUP_FIELD_MULTILINE_COMMENT=136 +LOOKUP_FIELD_WS=137 +MMR_LIMIT=138 +MMR_LINE_COMMENT=139 +MMR_MULTILINE_COMMENT=140 +MMR_WS=141 +MVEXPAND_LINE_COMMENT=142 +MVEXPAND_MULTILINE_COMMENT=143 +MVEXPAND_WS=144 +ID_PATTERN=145 +PROJECT_LINE_COMMENT=146 +PROJECT_MULTILINE_COMMENT=147 +PROJECT_WS=148 +PROMQL_PARAMS_LINE_COMMENT=149 +PROMQL_PARAMS_MULTILINE_COMMENT=150 +PROMQL_PARAMS_WS=151 +PROMQL_QUERY_COMMENT=152 +PROMQL_SINGLE_QUOTED_STRING=153 +PROMQL_OTHER_QUERY_CONTENT=154 +AS=155 +RENAME_LINE_COMMENT=156 +RENAME_MULTILINE_COMMENT=157 +RENAME_WS=158 +SET_LINE_COMMENT=159 +SET_MULTILINE_COMMENT=160 +SET_WS=161 +INFO=162 +SHOW_LINE_COMMENT=163 +SHOW_MULTILINE_COMMENT=164 +SHOW_WS=165 'change_point'=4 'enrich'=5 'completion'=7 @@ -174,68 +175,69 @@ SHOW_WS=164 'sample'=14 'sort'=15 'where'=17 -'from'=18 -'ts'=19 -'fork'=21 -'fuse'=22 -'inline'=23 -'inlinestats'=24 -'lookup'=25 -'mv_expand'=31 -'drop'=32 -'keep'=33 -'promql'=35 -'rename'=36 -'set'=37 -'show'=38 -'|'=53 -'and'=57 -'asc'=58 -'='=59 -'by'=60 -'::'=61 -':'=62 -';'=63 -','=64 -'desc'=65 -'.'=66 -'false'=67 -'first'=68 -'in'=69 -'is'=70 -'last'=71 -'like'=72 -'not'=73 -'null'=74 -'nulls'=75 -'on'=76 -'or'=77 -'?'=78 -'rlike'=79 -'true'=80 -'with'=81 -'=='=82 -'=~'=83 -'!='=84 -'<'=85 -'<='=86 -'>'=87 -'>='=88 -'+'=89 -'-'=90 -'*'=91 -'/'=92 -'%'=93 -'{'=94 -'}'=95 -'??'=96 -']'=100 -')'=102 -'metadata'=108 -'group'=116 -'score'=117 -'key'=118 -'join'=126 -'USING'=127 -'as'=154 -'info'=161 +'uri_parts'=18 +'from'=19 +'ts'=20 +'fork'=22 +'fuse'=23 +'inline'=24 +'inlinestats'=25 +'lookup'=26 +'mv_expand'=32 +'drop'=33 +'keep'=34 +'promql'=36 +'rename'=37 +'set'=38 +'show'=39 +'|'=54 +'and'=58 +'asc'=59 +'='=60 +'by'=61 +'::'=62 +':'=63 +';'=64 +','=65 +'desc'=66 +'.'=67 +'false'=68 +'first'=69 +'in'=70 +'is'=71 +'last'=72 +'like'=73 +'not'=74 +'null'=75 +'nulls'=76 +'on'=77 +'or'=78 +'?'=79 +'rlike'=80 +'true'=81 +'with'=82 +'=='=83 +'=~'=84 +'!='=85 +'<'=86 +'<='=87 +'>'=88 +'>='=89 +'+'=90 +'-'=91 +'*'=92 +'/'=93 +'%'=94 +'{'=95 +'}'=96 +'??'=97 +']'=101 +')'=103 +'metadata'=109 +'group'=117 +'score'=118 +'key'=119 +'join'=127 +'USING'=128 +'as'=155 +'info'=162 diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 index a1222a46b2a6c..9bd5056b7eb74 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 @@ -69,6 +69,7 @@ processingCommand | rerankCommand | inlineStatsCommand | fuseCommand + | uriPartsCommand // in development | {this.isDevVersion()}? lookupCommand | {this.isDevVersion()}? insistCommand @@ -364,6 +365,10 @@ insistCommand : DEV_INSIST qualifiedNamePatterns ; +uriPartsCommand + : URI_PARTS qualifiedName ASSIGN primaryExpression + ; + setCommand : SET setField SEMICOLON ; diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens index 2bb1a5499bd79..15755b80ee39c 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens @@ -15,153 +15,154 @@ SAMPLE=14 SORT=15 STATS=16 WHERE=17 -FROM=18 -TS=19 -EXTERNAL=20 -FORK=21 -FUSE=22 -INLINE=23 -INLINESTATS=24 -JOIN_LOOKUP=25 -DEV_JOIN_FULL=26 -DEV_JOIN_LEFT=27 -DEV_JOIN_RIGHT=28 -DEV_LOOKUP=29 -DEV_MMR=30 -MV_EXPAND=31 -DROP=32 -KEEP=33 -DEV_INSIST=34 -PROMQL=35 -RENAME=36 -SET=37 -SHOW=38 -UNKNOWN_CMD=39 -CHANGE_POINT_LINE_COMMENT=40 -CHANGE_POINT_MULTILINE_COMMENT=41 -CHANGE_POINT_WS=42 -ENRICH_POLICY_NAME=43 -ENRICH_LINE_COMMENT=44 -ENRICH_MULTILINE_COMMENT=45 -ENRICH_WS=46 -ENRICH_FIELD_LINE_COMMENT=47 -ENRICH_FIELD_MULTILINE_COMMENT=48 -ENRICH_FIELD_WS=49 -EXPLAIN_WS=50 -EXPLAIN_LINE_COMMENT=51 -EXPLAIN_MULTILINE_COMMENT=52 -PIPE=53 -QUOTED_STRING=54 -INTEGER_LITERAL=55 -DECIMAL_LITERAL=56 -AND=57 -ASC=58 -ASSIGN=59 -BY=60 -CAST_OP=61 -COLON=62 -SEMICOLON=63 -COMMA=64 -DESC=65 -DOT=66 -FALSE=67 -FIRST=68 -IN=69 -IS=70 -LAST=71 -LIKE=72 -NOT=73 -NULL=74 -NULLS=75 -ON=76 -OR=77 -PARAM=78 -RLIKE=79 -TRUE=80 -WITH=81 -EQ=82 -CIEQ=83 -NEQ=84 -LT=85 -LTE=86 -GT=87 -GTE=88 -PLUS=89 -MINUS=90 -ASTERISK=91 -SLASH=92 -PERCENT=93 -LEFT_BRACES=94 -RIGHT_BRACES=95 -DOUBLE_PARAMS=96 -NAMED_OR_POSITIONAL_PARAM=97 -NAMED_OR_POSITIONAL_DOUBLE_PARAMS=98 -OPENING_BRACKET=99 -CLOSING_BRACKET=100 -LP=101 -RP=102 -UNQUOTED_IDENTIFIER=103 -QUOTED_IDENTIFIER=104 -EXPR_LINE_COMMENT=105 -EXPR_MULTILINE_COMMENT=106 -EXPR_WS=107 -METADATA=108 -UNQUOTED_SOURCE=109 -FROM_LINE_COMMENT=110 -FROM_MULTILINE_COMMENT=111 -FROM_WS=112 -FORK_WS=113 -FORK_LINE_COMMENT=114 -FORK_MULTILINE_COMMENT=115 -GROUP=116 -SCORE=117 -KEY=118 -FUSE_LINE_COMMENT=119 -FUSE_MULTILINE_COMMENT=120 -FUSE_WS=121 -INLINE_STATS=122 -INLINE_LINE_COMMENT=123 -INLINE_MULTILINE_COMMENT=124 -INLINE_WS=125 -JOIN=126 -USING=127 -JOIN_LINE_COMMENT=128 -JOIN_MULTILINE_COMMENT=129 -JOIN_WS=130 -LOOKUP_LINE_COMMENT=131 -LOOKUP_MULTILINE_COMMENT=132 -LOOKUP_WS=133 -LOOKUP_FIELD_LINE_COMMENT=134 -LOOKUP_FIELD_MULTILINE_COMMENT=135 -LOOKUP_FIELD_WS=136 -MMR_LIMIT=137 -MMR_LINE_COMMENT=138 -MMR_MULTILINE_COMMENT=139 -MMR_WS=140 -MVEXPAND_LINE_COMMENT=141 -MVEXPAND_MULTILINE_COMMENT=142 -MVEXPAND_WS=143 -ID_PATTERN=144 -PROJECT_LINE_COMMENT=145 -PROJECT_MULTILINE_COMMENT=146 -PROJECT_WS=147 -PROMQL_PARAMS_LINE_COMMENT=148 -PROMQL_PARAMS_MULTILINE_COMMENT=149 -PROMQL_PARAMS_WS=150 -PROMQL_QUERY_COMMENT=151 -PROMQL_SINGLE_QUOTED_STRING=152 -PROMQL_OTHER_QUERY_CONTENT=153 -AS=154 -RENAME_LINE_COMMENT=155 -RENAME_MULTILINE_COMMENT=156 -RENAME_WS=157 -SET_LINE_COMMENT=158 -SET_MULTILINE_COMMENT=159 -SET_WS=160 -INFO=161 -SHOW_LINE_COMMENT=162 -SHOW_MULTILINE_COMMENT=163 -SHOW_WS=164 +URI_PARTS=18 +FROM=19 +TS=20 +EXTERNAL=21 +FORK=22 +FUSE=23 +INLINE=24 +INLINESTATS=25 +JOIN_LOOKUP=26 +DEV_JOIN_FULL=27 +DEV_JOIN_LEFT=28 +DEV_JOIN_RIGHT=29 +DEV_LOOKUP=30 +DEV_MMR=31 +MV_EXPAND=32 +DROP=33 +KEEP=34 +DEV_INSIST=35 +PROMQL=36 +RENAME=37 +SET=38 +SHOW=39 +UNKNOWN_CMD=40 +CHANGE_POINT_LINE_COMMENT=41 +CHANGE_POINT_MULTILINE_COMMENT=42 +CHANGE_POINT_WS=43 +ENRICH_POLICY_NAME=44 +ENRICH_LINE_COMMENT=45 +ENRICH_MULTILINE_COMMENT=46 +ENRICH_WS=47 +ENRICH_FIELD_LINE_COMMENT=48 +ENRICH_FIELD_MULTILINE_COMMENT=49 +ENRICH_FIELD_WS=50 +EXPLAIN_WS=51 +EXPLAIN_LINE_COMMENT=52 +EXPLAIN_MULTILINE_COMMENT=53 +PIPE=54 +QUOTED_STRING=55 +INTEGER_LITERAL=56 +DECIMAL_LITERAL=57 +AND=58 +ASC=59 +ASSIGN=60 +BY=61 +CAST_OP=62 +COLON=63 +SEMICOLON=64 +COMMA=65 +DESC=66 +DOT=67 +FALSE=68 +FIRST=69 +IN=70 +IS=71 +LAST=72 +LIKE=73 +NOT=74 +NULL=75 +NULLS=76 +ON=77 +OR=78 +PARAM=79 +RLIKE=80 +TRUE=81 +WITH=82 +EQ=83 +CIEQ=84 +NEQ=85 +LT=86 +LTE=87 +GT=88 +GTE=89 +PLUS=90 +MINUS=91 +ASTERISK=92 +SLASH=93 +PERCENT=94 +LEFT_BRACES=95 +RIGHT_BRACES=96 +DOUBLE_PARAMS=97 +NAMED_OR_POSITIONAL_PARAM=98 +NAMED_OR_POSITIONAL_DOUBLE_PARAMS=99 +OPENING_BRACKET=100 +CLOSING_BRACKET=101 +LP=102 +RP=103 +UNQUOTED_IDENTIFIER=104 +QUOTED_IDENTIFIER=105 +EXPR_LINE_COMMENT=106 +EXPR_MULTILINE_COMMENT=107 +EXPR_WS=108 +METADATA=109 +UNQUOTED_SOURCE=110 +FROM_LINE_COMMENT=111 +FROM_MULTILINE_COMMENT=112 +FROM_WS=113 +FORK_WS=114 +FORK_LINE_COMMENT=115 +FORK_MULTILINE_COMMENT=116 +GROUP=117 +SCORE=118 +KEY=119 +FUSE_LINE_COMMENT=120 +FUSE_MULTILINE_COMMENT=121 +FUSE_WS=122 +INLINE_STATS=123 +INLINE_LINE_COMMENT=124 +INLINE_MULTILINE_COMMENT=125 +INLINE_WS=126 +JOIN=127 +USING=128 +JOIN_LINE_COMMENT=129 +JOIN_MULTILINE_COMMENT=130 +JOIN_WS=131 +LOOKUP_LINE_COMMENT=132 +LOOKUP_MULTILINE_COMMENT=133 +LOOKUP_WS=134 +LOOKUP_FIELD_LINE_COMMENT=135 +LOOKUP_FIELD_MULTILINE_COMMENT=136 +LOOKUP_FIELD_WS=137 +MMR_LIMIT=138 +MMR_LINE_COMMENT=139 +MMR_MULTILINE_COMMENT=140 +MMR_WS=141 +MVEXPAND_LINE_COMMENT=142 +MVEXPAND_MULTILINE_COMMENT=143 +MVEXPAND_WS=144 +ID_PATTERN=145 +PROJECT_LINE_COMMENT=146 +PROJECT_MULTILINE_COMMENT=147 +PROJECT_WS=148 +PROMQL_PARAMS_LINE_COMMENT=149 +PROMQL_PARAMS_MULTILINE_COMMENT=150 +PROMQL_PARAMS_WS=151 +PROMQL_QUERY_COMMENT=152 +PROMQL_SINGLE_QUOTED_STRING=153 +PROMQL_OTHER_QUERY_CONTENT=154 +AS=155 +RENAME_LINE_COMMENT=156 +RENAME_MULTILINE_COMMENT=157 +RENAME_WS=158 +SET_LINE_COMMENT=159 +SET_MULTILINE_COMMENT=160 +SET_WS=161 +INFO=162 +SHOW_LINE_COMMENT=163 +SHOW_MULTILINE_COMMENT=164 +SHOW_WS=165 'change_point'=4 'enrich'=5 'completion'=7 @@ -174,68 +175,69 @@ SHOW_WS=164 'sample'=14 'sort'=15 'where'=17 -'from'=18 -'ts'=19 -'fork'=21 -'fuse'=22 -'inline'=23 -'inlinestats'=24 -'lookup'=25 -'mv_expand'=31 -'drop'=32 -'keep'=33 -'promql'=35 -'rename'=36 -'set'=37 -'show'=38 -'|'=53 -'and'=57 -'asc'=58 -'='=59 -'by'=60 -'::'=61 -':'=62 -';'=63 -','=64 -'desc'=65 -'.'=66 -'false'=67 -'first'=68 -'in'=69 -'is'=70 -'last'=71 -'like'=72 -'not'=73 -'null'=74 -'nulls'=75 -'on'=76 -'or'=77 -'?'=78 -'rlike'=79 -'true'=80 -'with'=81 -'=='=82 -'=~'=83 -'!='=84 -'<'=85 -'<='=86 -'>'=87 -'>='=88 -'+'=89 -'-'=90 -'*'=91 -'/'=92 -'%'=93 -'{'=94 -'}'=95 -'??'=96 -']'=100 -')'=102 -'metadata'=108 -'group'=116 -'score'=117 -'key'=118 -'join'=126 -'USING'=127 -'as'=154 -'info'=161 +'uri_parts'=18 +'from'=19 +'ts'=20 +'fork'=22 +'fuse'=23 +'inline'=24 +'inlinestats'=25 +'lookup'=26 +'mv_expand'=32 +'drop'=33 +'keep'=34 +'promql'=36 +'rename'=37 +'set'=38 +'show'=39 +'|'=54 +'and'=58 +'asc'=59 +'='=60 +'by'=61 +'::'=62 +':'=63 +';'=64 +','=65 +'desc'=66 +'.'=67 +'false'=68 +'first'=69 +'in'=70 +'is'=71 +'last'=72 +'like'=73 +'not'=74 +'null'=75 +'nulls'=76 +'on'=77 +'or'=78 +'?'=79 +'rlike'=80 +'true'=81 +'with'=82 +'=='=83 +'=~'=84 +'!='=85 +'<'=86 +'<='=87 +'>'=88 +'>='=89 +'+'=90 +'-'=91 +'*'=92 +'/'=93 +'%'=94 +'{'=95 +'}'=96 +'??'=97 +']'=101 +')'=103 +'metadata'=109 +'group'=117 +'score'=118 +'key'=119 +'join'=127 +'USING'=128 +'as'=155 +'info'=162 diff --git a/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 b/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 index 1d0dff47d8456..9b89ce23f8029 100644 --- a/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 +++ b/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 @@ -20,6 +20,7 @@ SAMPLE : 'sample' -> pushMode(EXPRESSION_MODE); SORT : 'sort' -> pushMode(EXPRESSION_MODE); STATS : 'stats' -> pushMode(EXPRESSION_MODE); WHERE : 'where' -> pushMode(EXPRESSION_MODE); +URI_PARTS: 'uri_parts' -> pushMode(EXPRESSION_MODE); mode EXPRESSION_MODE; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java index 0db297d620ef5..5888401585fcb 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java @@ -2150,6 +2150,11 @@ public enum Cap { */ MMR_V2(Build.current().isSnapshot()), + /** + * Supports the {@code URI_PARTS}) command. + */ + URI_PARTS_COMMAND, + // Last capability should still have a comma for fewer merge conflicts when adding new ones :) // This comment prevents the semicolon from being on the previous capability when Spotless formats the file. ; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java index c138f9946717b..18c93822ce73a 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java @@ -74,6 +74,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Row; import org.elasticsearch.xpack.esql.plan.logical.Sample; import org.elasticsearch.xpack.esql.plan.logical.TopN; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.physical.PhysicalPlan; @@ -170,7 +171,8 @@ public record QueryProperties(boolean hasGrouping, boolean canDecreaseRowCount, Rerank.class, Row.class, Sample.class, - TopN.class + TopN.class, + UriParts.class ); /** diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java index 0ff154aac83ed..6c86de977da57 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java @@ -603,6 +603,49 @@ public static DataType fromJava(Object value) { } + /** + * Infers the ES|QL DataType from a Java Class. + * This method mirrors the logic of {@link #fromJava(Object)} but operates on {@code Class} types, + * handling both primitive and wrapper classes equivalently. + * + * @param classType The Java Class to infer the DataType from. + * @return The corresponding ES|QL DataType, or {@code null} if no direct mapping is found or can be reliably inferred. + */ + public static DataType fromJavaType(Class classType) { + if (classType == null || classType == Void.class) { + return NULL; + } + + if (classType == int.class || classType == Integer.class) { + return INTEGER; + } else if (classType == long.class || classType == Long.class) { + return LONG; + } else if (classType == BigInteger.class) { + return UNSIGNED_LONG; + } else if (classType == boolean.class || classType == Boolean.class) { + return BOOLEAN; + } else if (classType == double.class || classType == Double.class) { + return DOUBLE; + } else if (classType == float.class || classType == Float.class) { + return FLOAT; + } else if (classType == byte.class || classType == Byte.class) { + return BYTE; + } else if (classType == short.class || classType == Short.class) { + return SHORT; + } else if (classType == ZonedDateTime.class) { + return DATETIME; + } else if (classType == String.class || classType == char.class || classType == Character.class || classType == BytesRef.class) { + // Note: BytesRef is an object, not a primitive or wrapper, so it's directly compared. + // char.class and Character.class map to KEYWORD + return KEYWORD; + } else if (List.class.isAssignableFrom(classType)) { + // Consistent with fromJava(Object) returning null for empty lists or lists with unknown element types. + return null; + } + // Fallback for any other Class type not explicitly handled + return null; + } + public static boolean isUnsupported(DataType from) { return from == UNSUPPORTED; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java new file mode 100644 index 0000000000000..7abd3d63c3609 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java @@ -0,0 +1,221 @@ +/* + * 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.esql.evaluator.command; + +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.compute.data.Block; +import org.elasticsearch.compute.data.BytesRefBlock; +import org.elasticsearch.compute.data.IntBlock; +import org.elasticsearch.compute.operator.ColumnExtractOperator; +import org.elasticsearch.compute.operator.DriverContext; +import org.elasticsearch.compute.operator.Warnings; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter; + +import java.util.Arrays; +import java.util.function.BiConsumer; +import java.util.function.IntPredicate; +import java.util.function.ObjIntConsumer; + +import static org.elasticsearch.common.lucene.BytesRefs.toBytesRef; + +/** + * The base evaluator that extracts compound output. Subclasses should implement the actual evaluation logic. + */ +public final class CompoundOutputEvaluator implements ColumnExtractOperator.Evaluator { + + private final OutputFieldsCollector outputFieldsCollector; + private final DataType inputType; + private final Warnings warnings; + + CompoundOutputEvaluator(DataType inputType, Warnings warnings, OutputFieldsCollector outputFieldsCollector) { + this.inputType = inputType; + this.warnings = warnings; + this.outputFieldsCollector = outputFieldsCollector; + } + + public interface OutputFieldsCollectorProvider { + OutputFieldsCollector createOutputFieldsCollector(); + + String collectorSimpleName(); + } + + public record Factory(DataType inputType, Source source, OutputFieldsCollectorProvider outputFieldsCollectorProvider) + implements + ColumnExtractOperator.Evaluator.Factory { + + public CompoundOutputEvaluator create(DriverContext driverContext) { + Warnings warnings = (driverContext == null || source == null) + ? Warnings.NOOP_WARNINGS + : Warnings.createWarnings(driverContext.warningsMode(), source); + OutputFieldsCollector outputFieldsCollector = outputFieldsCollectorProvider.createOutputFieldsCollector(); + return new CompoundOutputEvaluator(inputType, warnings, outputFieldsCollector); + } + + @Override + public String describe() { + return "CompoundOutputEvaluator[collector=" + outputFieldsCollectorProvider.collectorSimpleName() + "]"; + } + } + + /** + * Executes the evaluation of the corresponding function on the provided input. + * The {@code target} output array must have the same size as the {@code functionOutputFields} list that was provided in construction, + * and its elements must match this list's entries in type and order. Otherwise, this method will throw an exception. + * If an expected output field is missing from the actual output of the function, a null value will be appended to the corresponding + * target block. If the actual output of the function contains an entry that is not expected, it will be ignored. + * @param input the input to evaluate the function on + * @param row row index in the input + * @param target the output column blocks + * @param spare the {@link BytesRef} to use for value retrieval + */ + @Override + public void computeRow(BytesRefBlock input, int row, Block.Builder[] target, BytesRef spare) { + outputFieldsCollector.startRow(target); + try { + if (input.isNull(row) == false) { + try { + if (input.getValueCount(row) == 1) { + BytesRef bytes = input.getBytesRef(input.getFirstValueIndex(row), spare); + String inputAsString = getInputAsString(bytes, inputType); + outputFieldsCollector.evaluate(inputAsString); + } else { + warnings.registerException(new IllegalArgumentException("This command doesn't support multi-value input")); + } + } catch (IllegalArgumentException e) { + warnings.registerException(e); + } + } + } finally { + // this takes care of missing fields, partial evaluation and null input + outputFieldsCollector.endRow(); + } + + } + + private static String getInputAsString(BytesRef input, DataType inputType) { + if (inputType == DataType.IP) { + return EsqlDataTypeConverter.ipToString(input); + } else if (DataType.isString(inputType)) { + return input.utf8ToString(); + } else { + throw new IllegalArgumentException("Unsupported input type [" + inputType + "]"); + } + } + + @Override + public String toString() { + return "CompoundOutputEvaluator[collector=" + outputFieldsCollector + "]"; + } + + /** + * The base class for output fields collectors. + * Concrete collectors would implement interfaces that correspond to their corresponding evaluating function, in addition to + * extending this class. + */ + public abstract static class OutputFieldsCollector { + @Override + public String toString() { + return getClass().getSimpleName(); + } + + /** + * A {@link Block.Builder[]} holder that is being set before each row evaluation. + * In addition, it tracks the status of the output fields for the current row. + */ + protected final RowOutput rowOutput; + + protected OutputFieldsCollector(int outputFieldCount) { + this.rowOutput = new RowOutput(outputFieldCount); + } + + /** + * initialize the row output state for a new row evaluation. + * @param target the output column blocks + */ + final void startRow(Block.Builder[] target) { + rowOutput.startRow(target); + } + + final void endRow() { + rowOutput.fillMissingValues(); + rowOutput.reset(); + } + + /** + * Subclasses would apply the actual evaluation logic here and fill the target blocks accordingly. + * @param input the input string to evaluate the function on + */ + protected abstract void evaluate(String input); + } + + /** + * A {@link Block.Builder[]} holder that is being set before each row evaluation. + * In addition, it tracks the status of the output fields for the current row. + */ + public static final class RowOutput { + final boolean[] valuesSet; + Block.Builder[] blocks; + + RowOutput(int size) { + valuesSet = new boolean[size]; + } + + void startRow(Block.Builder[] blocks) { + this.blocks = blocks; + Arrays.fill(valuesSet, false); + } + + void appendValue(String value, int index) { + if (value != null) { + ((BytesRefBlock.Builder) blocks[index]).appendBytesRef(toBytesRef(value)); + valuesSet[index] = true; + } + } + + void appendValue(int value, int index) { + ((IntBlock.Builder) blocks[index]).appendInt(value); + valuesSet[index] = true; + } + + void fillMissingValues() { + for (int i = 0; i < valuesSet.length; i++) { + if (valuesSet[i] == false) { + blocks[i].appendNull(); + } + } + } + + void reset() { + // avoid leaking blocks + blocks = null; + } + } + + public static final BiConsumer NOOP_STRING_COLLECTOR = (blocks, value) -> {/*no-op*/}; + public static final ObjIntConsumer NOOP_INT_COLLECTOR = (value, index) -> {/*no-op*/}; + + public static BiConsumer stringValueCollector(final int index) { + return (rowOutput, value) -> rowOutput.appendValue(value, index); + } + + /** + * Creates a collector for primitive int values. + * @param index the index of the corresponding block in the target array + * @param predicate the predicate to apply on the int value to determine whether to append it or a null + * @return a primitive int collector + */ + public static ObjIntConsumer intValueCollector(final int index, final IntPredicate predicate) { + return (rowOutput, value) -> { + if (predicate.test(value)) { + rowOutput.appendValue(value, index); + } + }; + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/GrokEvaluatorExtracter.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/GrokEvaluatorExtracter.java index 45c695f5df6f4..eb51378db58d5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/GrokEvaluatorExtracter.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/GrokEvaluatorExtracter.java @@ -17,6 +17,7 @@ import org.elasticsearch.compute.data.IntBlock; import org.elasticsearch.compute.data.LongBlock; import org.elasticsearch.compute.operator.ColumnExtractOperator; +import org.elasticsearch.compute.operator.DriverContext; import org.elasticsearch.grok.FloatConsumer; import org.elasticsearch.grok.Grok; import org.elasticsearch.grok.GrokCaptureConfig; @@ -45,7 +46,7 @@ public class GrokEvaluatorExtracter implements ColumnExtractOperator.Evaluator, private final ElementType[] positionToType; private Block.Builder[] blocks; - public GrokEvaluatorExtracter( + private GrokEvaluatorExtracter( final Grok parser, final String pattern, final Map keyToBlock, @@ -171,6 +172,21 @@ public GrokCaptureExtracter forBoolean(Function, GrokCaptureEx } + public record Factory(Grok parser, String pattern, Map keyToBlock, Map types) + implements + ColumnExtractOperator.Evaluator.Factory { + + @Override + public GrokEvaluatorExtracter create(DriverContext driverContext) { + return new GrokEvaluatorExtracter(parser, pattern, keyToBlock, types); + } + + @Override + public String describe() { + return "GrokEvaluatorExtracter[pattern=" + pattern + "]"; + } + } + private static void append(Object value, Block.Builder block, ElementType type) { if (value instanceof Float f) { // Grok patterns can produce float values (Eg. %{WORD:x:float}) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/UriPartsFunctionBridge.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/UriPartsFunctionBridge.java new file mode 100644 index 0000000000000..0defe98f70688 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/UriPartsFunctionBridge.java @@ -0,0 +1,177 @@ +/* + * 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.esql.evaluator.command; + +import org.elasticsearch.web.UriParts; + +import java.util.LinkedHashMap; +import java.util.SequencedCollection; +import java.util.function.BiConsumer; +import java.util.function.ObjIntConsumer; + +import static org.elasticsearch.web.UriParts.DOMAIN; +import static org.elasticsearch.web.UriParts.EXTENSION; +import static org.elasticsearch.web.UriParts.FRAGMENT; +import static org.elasticsearch.web.UriParts.PASSWORD; +import static org.elasticsearch.web.UriParts.PATH; +import static org.elasticsearch.web.UriParts.PORT; +import static org.elasticsearch.web.UriParts.QUERY; +import static org.elasticsearch.web.UriParts.SCHEME; +import static org.elasticsearch.web.UriParts.USERNAME; +import static org.elasticsearch.web.UriParts.USER_INFO; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.NOOP_INT_COLLECTOR; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.NOOP_STRING_COLLECTOR; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.intValueCollector; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.stringValueCollector; + +/** + * A bridge for the function that extracts parts from a URI string. + * See {@link org.elasticsearch.web.UriParts} for the original logic that is being bridged. + */ +public final class UriPartsFunctionBridge { + + public static LinkedHashMap> getAllOutputFields() { + return UriParts.getUriPartsTypes(); + } + + public static final class UriPartsCollectorImpl extends CompoundOutputEvaluator.OutputFieldsCollector + implements + UriParts.UriPartsCollector { + private final BiConsumer domain; + private final BiConsumer fragment; + private final BiConsumer path; + private final BiConsumer extension; + private final ObjIntConsumer port; + private final BiConsumer query; + private final BiConsumer scheme; + private final BiConsumer userInfo; + private final BiConsumer username; + private final BiConsumer password; + + public UriPartsCollectorImpl(SequencedCollection outputFields) { + super(outputFields.size()); + + BiConsumer domain = NOOP_STRING_COLLECTOR; + BiConsumer fragment = NOOP_STRING_COLLECTOR; + BiConsumer path = NOOP_STRING_COLLECTOR; + BiConsumer extension = NOOP_STRING_COLLECTOR; + ObjIntConsumer port = NOOP_INT_COLLECTOR; + BiConsumer query = NOOP_STRING_COLLECTOR; + BiConsumer scheme = NOOP_STRING_COLLECTOR; + BiConsumer userInfo = NOOP_STRING_COLLECTOR; + BiConsumer username = NOOP_STRING_COLLECTOR; + BiConsumer password = NOOP_STRING_COLLECTOR; + + int index = 0; + for (String outputField : outputFields) { + switch (outputField) { + case DOMAIN: + domain = stringValueCollector(index); + break; + case FRAGMENT: + fragment = stringValueCollector(index); + break; + case PATH: + path = stringValueCollector(index); + break; + case EXTENSION: + extension = stringValueCollector(index); + break; + case PORT: + port = intValueCollector(index, value -> value >= 0); + break; + case QUERY: + query = stringValueCollector(index); + break; + case SCHEME: + scheme = stringValueCollector(index); + break; + case USER_INFO: + userInfo = stringValueCollector(index); + break; + case USERNAME: + username = stringValueCollector(index); + break; + case PASSWORD: + password = stringValueCollector(index); + break; + default: + // we may be asked to collect an unknow field, which we only need to ignore and the corresponding block will be + // filled with nulls + } + index++; + } + + this.domain = domain; + this.fragment = fragment; + this.path = path; + this.extension = extension; + this.port = port; + this.query = query; + this.scheme = scheme; + this.userInfo = userInfo; + this.username = username; + this.password = password; + } + + @Override + public void domain(String domain) { + this.domain.accept(rowOutput, domain); + } + + @Override + public void fragment(String fragment) { + this.fragment.accept(rowOutput, fragment); + } + + @Override + public void path(String path) { + this.path.accept(rowOutput, path); + } + + @Override + public void extension(String extension) { + this.extension.accept(rowOutput, extension); + } + + @Override + public void port(int port) { + this.port.accept(rowOutput, port); + } + + @Override + public void query(String query) { + this.query.accept(rowOutput, query); + } + + @Override + public void scheme(String scheme) { + this.scheme.accept(rowOutput, scheme); + } + + @Override + public void userInfo(String userInfo) { + this.userInfo.accept(rowOutput, userInfo); + } + + @Override + public void username(String username) { + this.username.accept(rowOutput, username); + } + + @Override + public void password(String password) { + this.password.accept(rowOutput, password); + } + + @Override + public void evaluate(String input) { + UriParts.parse(input, this); + } + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java index c036cdb6eecae..1f5edc1257716 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java @@ -45,6 +45,7 @@ import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownAndCombineLimits; import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownAndCombineOrderBy; import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownAndCombineSample; +import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownCompoundOutputEval; import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownConjunctionsToKnnPrefilters; import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownEnrich; import org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownEval; @@ -225,6 +226,7 @@ protected static Batch operators() { new PushDownInferencePlan(), new PushDownEval(), new PushDownRegexExtract(), + new PushDownCompoundOutputEval(), new PushDownEnrich(), new PushDownJoinPastProject(), new PushDownAndCombineOrderBy(), diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java index a18307d9e33f3..da7893d20cc00 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java @@ -19,6 +19,7 @@ import org.elasticsearch.xpack.esql.core.util.CollectionUtils; import org.elasticsearch.xpack.esql.expression.predicate.Predicates; import org.elasticsearch.xpack.esql.optimizer.LogicalOptimizerContext; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.Enrich; import org.elasticsearch.xpack.esql.plan.logical.Eval; import org.elasticsearch.xpack.esql.plan.logical.Filter; @@ -91,6 +92,10 @@ protected LogicalPlan rule(Filter filter, LogicalOptimizerContext ctx) { // Push down filters that do not rely on attributes created by RegexExtract var attributes = AttributeSet.of(Expressions.asAttributes(re.extractedFields())); plan = maybePushDownPastUnary(filter, re, attributes::contains, NO_OP); + } else if (child instanceof CompoundOutputEval coe) { + // Push down filters that do not rely on attributes created by CompoundOutputEval + var attributes = AttributeSet.of(Expressions.asAttributes(coe.generatedAttributes())); + plan = maybePushDownPastUnary(filter, coe, attributes::contains, NO_OP); } else if (child instanceof InferencePlan inferencePlan) { // Push down filters that do not rely on attributes created by Completion var attributes = AttributeSet.of(inferencePlan.generatedAttributes()); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineLimits.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineLimits.java index 715ef063ebb20..1f13b244b3b24 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineLimits.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineLimits.java @@ -13,6 +13,7 @@ import org.elasticsearch.xpack.esql.expression.function.fulltext.Score; import org.elasticsearch.xpack.esql.optimizer.LogicalOptimizerContext; import org.elasticsearch.xpack.esql.plan.logical.Aggregate; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.Enrich; import org.elasticsearch.xpack.esql.plan.logical.Eval; import org.elasticsearch.xpack.esql.plan.logical.Fork; @@ -52,7 +53,11 @@ public LogicalPlan rule(Limit limit, LogicalOptimizerContext ctx) { if (limit.child() instanceof Limit childLimit) { return combineLimits(limit, childLimit, ctx.foldCtx()); } else if (limit.child() instanceof UnaryPlan unary) { - if (unary instanceof Eval || unary instanceof Project || unary instanceof RegexExtract || unary instanceof InferencePlan) { + if (unary instanceof Eval + || unary instanceof Project + || unary instanceof RegexExtract + || unary instanceof CompoundOutputEval + || unary instanceof InferencePlan) { if (false == local && unary instanceof Eval && evalAliasNeedsData((Eval) unary)) { // do not push down the limit through an eval that needs data (e.g. a score function) during initial planning return limit; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineSample.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineSample.java index 35c95f200f4ff..97db4a6780dfd 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineSample.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineSample.java @@ -11,6 +11,7 @@ import org.elasticsearch.xpack.esql.core.expression.Literal; import org.elasticsearch.xpack.esql.expression.Foldables; import org.elasticsearch.xpack.esql.optimizer.LogicalOptimizerContext; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.Enrich; import org.elasticsearch.xpack.esql.plan.logical.Eval; import org.elasticsearch.xpack.esql.plan.logical.Filter; @@ -69,7 +70,8 @@ protected LogicalPlan rule(Sample sample, LogicalOptimizerContext context) { || child instanceof Insist || child instanceof OrderBy || child instanceof Project - || child instanceof RegexExtract) { + || child instanceof RegexExtract + || child instanceof CompoundOutputEval) { var unaryChild = (UnaryPlan) child; plan = unaryChild.replaceChild(sample.replaceChild(unaryChild.child())); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownCompoundOutputEval.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownCompoundOutputEval.java new file mode 100644 index 0000000000000..a5c15d90341bc --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownCompoundOutputEval.java @@ -0,0 +1,18 @@ +/* + * 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.esql.optimizer.rules.logical; + +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; +import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan; + +public final class PushDownCompoundOutputEval extends OptimizerRules.OptimizerRule> { + @Override + protected LogicalPlan rule(CompoundOutputEval coe) { + return PushDownUtils.pushGeneratingPlanPastProjectAndOrderBy(coe); + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/local/ReplaceFieldWithConstantOrNull.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/local/ReplaceFieldWithConstantOrNull.java index c40a7e4351d20..44dd8ecc01fa5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/local/ReplaceFieldWithConstantOrNull.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/local/ReplaceFieldWithConstantOrNull.java @@ -18,6 +18,7 @@ import org.elasticsearch.xpack.esql.core.type.PotentiallyUnmappedKeywordEsField; import org.elasticsearch.xpack.esql.optimizer.LocalLogicalOptimizerContext; import org.elasticsearch.xpack.esql.optimizer.rules.RuleUtils; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.EsRelation; import org.elasticsearch.xpack.esql.plan.logical.Eval; import org.elasticsearch.xpack.esql.plan.logical.Filter; @@ -121,6 +122,7 @@ private LogicalPlan replaceWithNullOrConstant( || plan instanceof Filter || plan instanceof OrderBy || plan instanceof RegexExtract + || plan instanceof CompoundOutputEval || plan instanceof TopN) { LogicalPlan transformed = plan.transformExpressionsOnlyUp(FieldAttribute.class, f -> { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 8ec197b21435e..08e9ef8f653df 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -17,6 +17,7 @@ null 'sort' null 'where' +'uri_parts' 'from' 'ts' null @@ -184,6 +185,7 @@ SAMPLE SORT STATS WHERE +URI_PARTS FROM TS EXTERNAL @@ -350,6 +352,7 @@ SAMPLE SORT STATS WHERE +URI_PARTS FROM TS EXTERNAL @@ -703,4 +706,4 @@ SET_MODE SHOW_MODE atn: -[4, 0, 164, 2482, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 709, 8, 0, 10, 0, 12, 0, 712, 9, 0, 1, 0, 3, 0, 715, 8, 0, 1, 0, 3, 0, 718, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 727, 8, 1, 10, 1, 12, 1, 730, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 738, 8, 2, 11, 2, 12, 2, 739, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 4, 38, 1055, 8, 38, 11, 38, 12, 38, 1056, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 4, 57, 1140, 8, 57, 11, 57, 12, 57, 1141, 1, 57, 1, 57, 3, 57, 1146, 8, 57, 1, 57, 4, 57, 1149, 8, 57, 11, 57, 12, 57, 1150, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 3, 90, 1283, 8, 90, 1, 90, 4, 90, 1286, 8, 90, 11, 90, 12, 90, 1287, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 3, 93, 1297, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 1304, 8, 95, 1, 96, 1, 96, 1, 96, 5, 96, 1309, 8, 96, 10, 96, 12, 96, 1312, 9, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 5, 96, 1320, 8, 96, 10, 96, 12, 96, 1323, 9, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1330, 8, 96, 1, 96, 3, 96, 1333, 8, 96, 3, 96, 1335, 8, 96, 1, 97, 4, 97, 1338, 8, 97, 11, 97, 12, 97, 1339, 1, 98, 4, 98, 1343, 8, 98, 11, 98, 12, 98, 1344, 1, 98, 1, 98, 5, 98, 1349, 8, 98, 10, 98, 12, 98, 1352, 9, 98, 1, 98, 1, 98, 4, 98, 1356, 8, 98, 11, 98, 12, 98, 1357, 1, 98, 4, 98, 1361, 8, 98, 11, 98, 12, 98, 1362, 1, 98, 1, 98, 5, 98, 1367, 8, 98, 10, 98, 12, 98, 1370, 9, 98, 3, 98, 1372, 8, 98, 1, 98, 1, 98, 1, 98, 1, 98, 4, 98, 1378, 8, 98, 11, 98, 12, 98, 1379, 1, 98, 1, 98, 3, 98, 1384, 8, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1525, 8, 140, 1, 140, 5, 140, 1528, 8, 140, 10, 140, 12, 140, 1531, 9, 140, 1, 140, 1, 140, 4, 140, 1535, 8, 140, 11, 140, 12, 140, 1536, 3, 140, 1539, 8, 140, 1, 141, 1, 141, 1, 141, 3, 141, 1544, 8, 141, 1, 141, 5, 141, 1547, 8, 141, 10, 141, 12, 141, 1550, 9, 141, 1, 141, 1, 141, 4, 141, 1554, 8, 141, 11, 141, 12, 141, 1555, 3, 141, 1558, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 5, 146, 1582, 8, 146, 10, 146, 12, 146, 1585, 9, 146, 1, 146, 1, 146, 3, 146, 1589, 8, 146, 1, 146, 4, 146, 1592, 8, 146, 11, 146, 12, 146, 1593, 3, 146, 1596, 8, 146, 1, 147, 1, 147, 4, 147, 1600, 8, 147, 11, 147, 12, 147, 1601, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 3, 163, 1678, 8, 163, 1, 164, 4, 164, 1681, 8, 164, 11, 164, 12, 164, 1682, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 3, 271, 2156, 8, 271, 1, 272, 1, 272, 3, 272, 2160, 8, 272, 1, 272, 5, 272, 2163, 8, 272, 10, 272, 12, 272, 2166, 9, 272, 1, 272, 1, 272, 3, 272, 2170, 8, 272, 1, 272, 4, 272, 2173, 8, 272, 11, 272, 12, 272, 2174, 3, 272, 2177, 8, 272, 1, 273, 1, 273, 4, 273, 2181, 8, 273, 11, 273, 12, 273, 2182, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 5, 293, 2270, 8, 293, 10, 293, 12, 293, 2273, 9, 293, 1, 293, 3, 293, 2276, 8, 293, 1, 293, 3, 293, 2279, 8, 293, 1, 294, 1, 294, 1, 294, 1, 294, 5, 294, 2285, 8, 294, 10, 294, 12, 294, 2288, 9, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 2, 728, 1321, 0, 342, 20, 1, 22, 2, 24, 3, 26, 4, 28, 5, 30, 6, 32, 7, 34, 8, 36, 9, 38, 10, 40, 11, 42, 12, 44, 13, 46, 14, 48, 15, 50, 16, 52, 17, 54, 18, 56, 19, 58, 20, 60, 21, 62, 22, 64, 23, 66, 24, 68, 25, 70, 26, 72, 27, 74, 28, 76, 29, 78, 30, 80, 31, 82, 32, 84, 33, 86, 34, 88, 35, 90, 36, 92, 37, 94, 38, 96, 39, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 0, 114, 0, 116, 0, 118, 40, 120, 41, 122, 42, 124, 0, 126, 0, 128, 0, 130, 0, 132, 0, 134, 43, 136, 0, 138, 0, 140, 44, 142, 45, 144, 46, 146, 0, 148, 0, 150, 0, 152, 0, 154, 0, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 47, 176, 48, 178, 49, 180, 0, 182, 0, 184, 50, 186, 51, 188, 52, 190, 53, 192, 0, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 0, 208, 0, 210, 0, 212, 54, 214, 55, 216, 56, 218, 57, 220, 58, 222, 59, 224, 60, 226, 61, 228, 62, 230, 63, 232, 64, 234, 65, 236, 66, 238, 67, 240, 68, 242, 69, 244, 70, 246, 71, 248, 72, 250, 73, 252, 74, 254, 75, 256, 76, 258, 77, 260, 78, 262, 79, 264, 80, 266, 81, 268, 82, 270, 83, 272, 84, 274, 85, 276, 86, 278, 87, 280, 88, 282, 89, 284, 90, 286, 91, 288, 92, 290, 93, 292, 94, 294, 95, 296, 96, 298, 0, 300, 97, 302, 98, 304, 99, 306, 100, 308, 101, 310, 102, 312, 103, 314, 0, 316, 104, 318, 105, 320, 106, 322, 107, 324, 0, 326, 0, 328, 0, 330, 0, 332, 0, 334, 108, 336, 0, 338, 0, 340, 0, 342, 0, 344, 0, 346, 0, 348, 109, 350, 0, 352, 0, 354, 110, 356, 111, 358, 112, 360, 0, 362, 0, 364, 0, 366, 113, 368, 114, 370, 115, 372, 0, 374, 0, 376, 116, 378, 117, 380, 118, 382, 0, 384, 0, 386, 0, 388, 0, 390, 0, 392, 0, 394, 0, 396, 0, 398, 0, 400, 0, 402, 119, 404, 120, 406, 121, 408, 122, 410, 123, 412, 124, 414, 125, 416, 0, 418, 126, 420, 0, 422, 0, 424, 127, 426, 0, 428, 0, 430, 0, 432, 128, 434, 129, 436, 130, 438, 0, 440, 0, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 131, 456, 132, 458, 133, 460, 0, 462, 0, 464, 0, 466, 0, 468, 0, 470, 134, 472, 135, 474, 136, 476, 137, 478, 0, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 138, 510, 139, 512, 140, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 141, 538, 142, 540, 143, 542, 0, 544, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 144, 568, 145, 570, 146, 572, 147, 574, 0, 576, 0, 578, 0, 580, 0, 582, 0, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 148, 602, 149, 604, 150, 606, 151, 608, 152, 610, 153, 612, 0, 614, 0, 616, 0, 618, 0, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 154, 636, 0, 638, 155, 640, 156, 642, 157, 644, 0, 646, 0, 648, 0, 650, 0, 652, 0, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 158, 690, 159, 692, 160, 694, 0, 696, 161, 698, 162, 700, 163, 702, 164, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 39, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 67, 67, 99, 99, 2, 0, 72, 72, 104, 104, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 71, 71, 103, 103, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 79, 79, 111, 111, 2, 0, 73, 73, 105, 105, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 88, 88, 120, 120, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 70, 70, 102, 102, 2, 0, 85, 85, 117, 117, 2, 0, 81, 81, 113, 113, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 12, 0, 9, 10, 13, 13, 32, 32, 34, 35, 40, 41, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 12, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 74, 74, 106, 106, 2, 0, 39, 39, 92, 92, 7, 0, 10, 10, 13, 13, 32, 32, 34, 35, 39, 41, 96, 96, 124, 124, 2509, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 3, 146, 1, 0, 0, 0, 3, 148, 1, 0, 0, 0, 3, 150, 1, 0, 0, 0, 3, 152, 1, 0, 0, 0, 3, 154, 1, 0, 0, 0, 3, 156, 1, 0, 0, 0, 3, 158, 1, 0, 0, 0, 3, 160, 1, 0, 0, 0, 3, 162, 1, 0, 0, 0, 3, 164, 1, 0, 0, 0, 3, 166, 1, 0, 0, 0, 3, 168, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 3, 172, 1, 0, 0, 0, 3, 174, 1, 0, 0, 0, 3, 176, 1, 0, 0, 0, 3, 178, 1, 0, 0, 0, 4, 180, 1, 0, 0, 0, 4, 182, 1, 0, 0, 0, 4, 184, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 4, 188, 1, 0, 0, 0, 5, 190, 1, 0, 0, 0, 5, 212, 1, 0, 0, 0, 5, 214, 1, 0, 0, 0, 5, 216, 1, 0, 0, 0, 5, 218, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 5, 258, 1, 0, 0, 0, 5, 260, 1, 0, 0, 0, 5, 262, 1, 0, 0, 0, 5, 264, 1, 0, 0, 0, 5, 266, 1, 0, 0, 0, 5, 268, 1, 0, 0, 0, 5, 270, 1, 0, 0, 0, 5, 272, 1, 0, 0, 0, 5, 274, 1, 0, 0, 0, 5, 276, 1, 0, 0, 0, 5, 278, 1, 0, 0, 0, 5, 280, 1, 0, 0, 0, 5, 282, 1, 0, 0, 0, 5, 284, 1, 0, 0, 0, 5, 286, 1, 0, 0, 0, 5, 288, 1, 0, 0, 0, 5, 290, 1, 0, 0, 0, 5, 292, 1, 0, 0, 0, 5, 294, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 5, 298, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 5, 302, 1, 0, 0, 0, 5, 304, 1, 0, 0, 0, 5, 306, 1, 0, 0, 0, 5, 308, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 5, 316, 1, 0, 0, 0, 5, 318, 1, 0, 0, 0, 5, 320, 1, 0, 0, 0, 5, 322, 1, 0, 0, 0, 6, 324, 1, 0, 0, 0, 6, 326, 1, 0, 0, 0, 6, 328, 1, 0, 0, 0, 6, 330, 1, 0, 0, 0, 6, 332, 1, 0, 0, 0, 6, 334, 1, 0, 0, 0, 6, 336, 1, 0, 0, 0, 6, 338, 1, 0, 0, 0, 6, 340, 1, 0, 0, 0, 6, 342, 1, 0, 0, 0, 6, 344, 1, 0, 0, 0, 6, 348, 1, 0, 0, 0, 6, 350, 1, 0, 0, 0, 6, 352, 1, 0, 0, 0, 6, 354, 1, 0, 0, 0, 6, 356, 1, 0, 0, 0, 6, 358, 1, 0, 0, 0, 7, 360, 1, 0, 0, 0, 7, 362, 1, 0, 0, 0, 7, 364, 1, 0, 0, 0, 7, 366, 1, 0, 0, 0, 7, 368, 1, 0, 0, 0, 7, 370, 1, 0, 0, 0, 8, 372, 1, 0, 0, 0, 8, 374, 1, 0, 0, 0, 8, 376, 1, 0, 0, 0, 8, 378, 1, 0, 0, 0, 8, 380, 1, 0, 0, 0, 8, 382, 1, 0, 0, 0, 8, 384, 1, 0, 0, 0, 8, 386, 1, 0, 0, 0, 8, 388, 1, 0, 0, 0, 8, 390, 1, 0, 0, 0, 8, 392, 1, 0, 0, 0, 8, 394, 1, 0, 0, 0, 8, 396, 1, 0, 0, 0, 8, 398, 1, 0, 0, 0, 8, 400, 1, 0, 0, 0, 8, 402, 1, 0, 0, 0, 8, 404, 1, 0, 0, 0, 8, 406, 1, 0, 0, 0, 9, 408, 1, 0, 0, 0, 9, 410, 1, 0, 0, 0, 9, 412, 1, 0, 0, 0, 9, 414, 1, 0, 0, 0, 10, 416, 1, 0, 0, 0, 10, 418, 1, 0, 0, 0, 10, 420, 1, 0, 0, 0, 10, 422, 1, 0, 0, 0, 10, 424, 1, 0, 0, 0, 10, 426, 1, 0, 0, 0, 10, 428, 1, 0, 0, 0, 10, 430, 1, 0, 0, 0, 10, 432, 1, 0, 0, 0, 10, 434, 1, 0, 0, 0, 10, 436, 1, 0, 0, 0, 11, 438, 1, 0, 0, 0, 11, 440, 1, 0, 0, 0, 11, 442, 1, 0, 0, 0, 11, 444, 1, 0, 0, 0, 11, 446, 1, 0, 0, 0, 11, 448, 1, 0, 0, 0, 11, 450, 1, 0, 0, 0, 11, 452, 1, 0, 0, 0, 11, 454, 1, 0, 0, 0, 11, 456, 1, 0, 0, 0, 11, 458, 1, 0, 0, 0, 12, 460, 1, 0, 0, 0, 12, 462, 1, 0, 0, 0, 12, 464, 1, 0, 0, 0, 12, 466, 1, 0, 0, 0, 12, 468, 1, 0, 0, 0, 12, 470, 1, 0, 0, 0, 12, 472, 1, 0, 0, 0, 12, 474, 1, 0, 0, 0, 13, 476, 1, 0, 0, 0, 13, 478, 1, 0, 0, 0, 13, 480, 1, 0, 0, 0, 13, 482, 1, 0, 0, 0, 13, 484, 1, 0, 0, 0, 13, 486, 1, 0, 0, 0, 13, 488, 1, 0, 0, 0, 13, 490, 1, 0, 0, 0, 13, 492, 1, 0, 0, 0, 13, 494, 1, 0, 0, 0, 13, 496, 1, 0, 0, 0, 13, 498, 1, 0, 0, 0, 13, 500, 1, 0, 0, 0, 13, 502, 1, 0, 0, 0, 13, 504, 1, 0, 0, 0, 13, 506, 1, 0, 0, 0, 13, 508, 1, 0, 0, 0, 13, 510, 1, 0, 0, 0, 13, 512, 1, 0, 0, 0, 14, 514, 1, 0, 0, 0, 14, 516, 1, 0, 0, 0, 14, 518, 1, 0, 0, 0, 14, 520, 1, 0, 0, 0, 14, 522, 1, 0, 0, 0, 14, 524, 1, 0, 0, 0, 14, 526, 1, 0, 0, 0, 14, 528, 1, 0, 0, 0, 14, 530, 1, 0, 0, 0, 14, 532, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 14, 536, 1, 0, 0, 0, 14, 538, 1, 0, 0, 0, 14, 540, 1, 0, 0, 0, 15, 542, 1, 0, 0, 0, 15, 544, 1, 0, 0, 0, 15, 546, 1, 0, 0, 0, 15, 548, 1, 0, 0, 0, 15, 550, 1, 0, 0, 0, 15, 552, 1, 0, 0, 0, 15, 554, 1, 0, 0, 0, 15, 556, 1, 0, 0, 0, 15, 558, 1, 0, 0, 0, 15, 560, 1, 0, 0, 0, 15, 566, 1, 0, 0, 0, 15, 568, 1, 0, 0, 0, 15, 570, 1, 0, 0, 0, 15, 572, 1, 0, 0, 0, 16, 574, 1, 0, 0, 0, 16, 576, 1, 0, 0, 0, 16, 578, 1, 0, 0, 0, 16, 580, 1, 0, 0, 0, 16, 582, 1, 0, 0, 0, 16, 584, 1, 0, 0, 0, 16, 586, 1, 0, 0, 0, 16, 588, 1, 0, 0, 0, 16, 590, 1, 0, 0, 0, 16, 592, 1, 0, 0, 0, 16, 594, 1, 0, 0, 0, 16, 596, 1, 0, 0, 0, 16, 598, 1, 0, 0, 0, 16, 600, 1, 0, 0, 0, 16, 602, 1, 0, 0, 0, 16, 604, 1, 0, 0, 0, 16, 606, 1, 0, 0, 0, 16, 608, 1, 0, 0, 0, 16, 610, 1, 0, 0, 0, 17, 612, 1, 0, 0, 0, 17, 614, 1, 0, 0, 0, 17, 616, 1, 0, 0, 0, 17, 618, 1, 0, 0, 0, 17, 620, 1, 0, 0, 0, 17, 622, 1, 0, 0, 0, 17, 624, 1, 0, 0, 0, 17, 626, 1, 0, 0, 0, 17, 628, 1, 0, 0, 0, 17, 630, 1, 0, 0, 0, 17, 632, 1, 0, 0, 0, 17, 634, 1, 0, 0, 0, 17, 636, 1, 0, 0, 0, 17, 638, 1, 0, 0, 0, 17, 640, 1, 0, 0, 0, 17, 642, 1, 0, 0, 0, 18, 644, 1, 0, 0, 0, 18, 646, 1, 0, 0, 0, 18, 648, 1, 0, 0, 0, 18, 650, 1, 0, 0, 0, 18, 652, 1, 0, 0, 0, 18, 654, 1, 0, 0, 0, 18, 656, 1, 0, 0, 0, 18, 658, 1, 0, 0, 0, 18, 660, 1, 0, 0, 0, 18, 662, 1, 0, 0, 0, 18, 664, 1, 0, 0, 0, 18, 666, 1, 0, 0, 0, 18, 668, 1, 0, 0, 0, 18, 670, 1, 0, 0, 0, 18, 672, 1, 0, 0, 0, 18, 674, 1, 0, 0, 0, 18, 676, 1, 0, 0, 0, 18, 678, 1, 0, 0, 0, 18, 680, 1, 0, 0, 0, 18, 682, 1, 0, 0, 0, 18, 684, 1, 0, 0, 0, 18, 686, 1, 0, 0, 0, 18, 688, 1, 0, 0, 0, 18, 690, 1, 0, 0, 0, 18, 692, 1, 0, 0, 0, 19, 694, 1, 0, 0, 0, 19, 696, 1, 0, 0, 0, 19, 698, 1, 0, 0, 0, 19, 700, 1, 0, 0, 0, 19, 702, 1, 0, 0, 0, 20, 704, 1, 0, 0, 0, 22, 721, 1, 0, 0, 0, 24, 737, 1, 0, 0, 0, 26, 743, 1, 0, 0, 0, 28, 758, 1, 0, 0, 0, 30, 767, 1, 0, 0, 0, 32, 778, 1, 0, 0, 0, 34, 791, 1, 0, 0, 0, 36, 801, 1, 0, 0, 0, 38, 808, 1, 0, 0, 0, 40, 815, 1, 0, 0, 0, 42, 823, 1, 0, 0, 0, 44, 832, 1, 0, 0, 0, 46, 838, 1, 0, 0, 0, 48, 847, 1, 0, 0, 0, 50, 854, 1, 0, 0, 0, 52, 862, 1, 0, 0, 0, 54, 870, 1, 0, 0, 0, 56, 877, 1, 0, 0, 0, 58, 882, 1, 0, 0, 0, 60, 894, 1, 0, 0, 0, 62, 901, 1, 0, 0, 0, 64, 908, 1, 0, 0, 0, 66, 917, 1, 0, 0, 0, 68, 931, 1, 0, 0, 0, 70, 940, 1, 0, 0, 0, 72, 948, 1, 0, 0, 0, 74, 956, 1, 0, 0, 0, 76, 965, 1, 0, 0, 0, 78, 977, 1, 0, 0, 0, 80, 984, 1, 0, 0, 0, 82, 996, 1, 0, 0, 0, 84, 1003, 1, 0, 0, 0, 86, 1010, 1, 0, 0, 0, 88, 1022, 1, 0, 0, 0, 90, 1031, 1, 0, 0, 0, 92, 1040, 1, 0, 0, 0, 94, 1046, 1, 0, 0, 0, 96, 1054, 1, 0, 0, 0, 98, 1060, 1, 0, 0, 0, 100, 1065, 1, 0, 0, 0, 102, 1071, 1, 0, 0, 0, 104, 1075, 1, 0, 0, 0, 106, 1079, 1, 0, 0, 0, 108, 1083, 1, 0, 0, 0, 110, 1087, 1, 0, 0, 0, 112, 1091, 1, 0, 0, 0, 114, 1095, 1, 0, 0, 0, 116, 1099, 1, 0, 0, 0, 118, 1103, 1, 0, 0, 0, 120, 1107, 1, 0, 0, 0, 122, 1111, 1, 0, 0, 0, 124, 1115, 1, 0, 0, 0, 126, 1120, 1, 0, 0, 0, 128, 1126, 1, 0, 0, 0, 130, 1131, 1, 0, 0, 0, 132, 1136, 1, 0, 0, 0, 134, 1145, 1, 0, 0, 0, 136, 1152, 1, 0, 0, 0, 138, 1156, 1, 0, 0, 0, 140, 1160, 1, 0, 0, 0, 142, 1164, 1, 0, 0, 0, 144, 1168, 1, 0, 0, 0, 146, 1172, 1, 0, 0, 0, 148, 1178, 1, 0, 0, 0, 150, 1185, 1, 0, 0, 0, 152, 1189, 1, 0, 0, 0, 154, 1193, 1, 0, 0, 0, 156, 1197, 1, 0, 0, 0, 158, 1201, 1, 0, 0, 0, 160, 1205, 1, 0, 0, 0, 162, 1209, 1, 0, 0, 0, 164, 1213, 1, 0, 0, 0, 166, 1217, 1, 0, 0, 0, 168, 1221, 1, 0, 0, 0, 170, 1225, 1, 0, 0, 0, 172, 1229, 1, 0, 0, 0, 174, 1233, 1, 0, 0, 0, 176, 1237, 1, 0, 0, 0, 178, 1241, 1, 0, 0, 0, 180, 1245, 1, 0, 0, 0, 182, 1250, 1, 0, 0, 0, 184, 1255, 1, 0, 0, 0, 186, 1259, 1, 0, 0, 0, 188, 1263, 1, 0, 0, 0, 190, 1267, 1, 0, 0, 0, 192, 1271, 1, 0, 0, 0, 194, 1273, 1, 0, 0, 0, 196, 1275, 1, 0, 0, 0, 198, 1278, 1, 0, 0, 0, 200, 1280, 1, 0, 0, 0, 202, 1289, 1, 0, 0, 0, 204, 1291, 1, 0, 0, 0, 206, 1296, 1, 0, 0, 0, 208, 1298, 1, 0, 0, 0, 210, 1303, 1, 0, 0, 0, 212, 1334, 1, 0, 0, 0, 214, 1337, 1, 0, 0, 0, 216, 1383, 1, 0, 0, 0, 218, 1385, 1, 0, 0, 0, 220, 1389, 1, 0, 0, 0, 222, 1393, 1, 0, 0, 0, 224, 1395, 1, 0, 0, 0, 226, 1398, 1, 0, 0, 0, 228, 1401, 1, 0, 0, 0, 230, 1403, 1, 0, 0, 0, 232, 1405, 1, 0, 0, 0, 234, 1407, 1, 0, 0, 0, 236, 1412, 1, 0, 0, 0, 238, 1414, 1, 0, 0, 0, 240, 1420, 1, 0, 0, 0, 242, 1426, 1, 0, 0, 0, 244, 1429, 1, 0, 0, 0, 246, 1432, 1, 0, 0, 0, 248, 1437, 1, 0, 0, 0, 250, 1442, 1, 0, 0, 0, 252, 1446, 1, 0, 0, 0, 254, 1451, 1, 0, 0, 0, 256, 1457, 1, 0, 0, 0, 258, 1460, 1, 0, 0, 0, 260, 1463, 1, 0, 0, 0, 262, 1465, 1, 0, 0, 0, 264, 1471, 1, 0, 0, 0, 266, 1476, 1, 0, 0, 0, 268, 1481, 1, 0, 0, 0, 270, 1484, 1, 0, 0, 0, 272, 1487, 1, 0, 0, 0, 274, 1490, 1, 0, 0, 0, 276, 1492, 1, 0, 0, 0, 278, 1495, 1, 0, 0, 0, 280, 1497, 1, 0, 0, 0, 282, 1500, 1, 0, 0, 0, 284, 1502, 1, 0, 0, 0, 286, 1504, 1, 0, 0, 0, 288, 1506, 1, 0, 0, 0, 290, 1508, 1, 0, 0, 0, 292, 1510, 1, 0, 0, 0, 294, 1512, 1, 0, 0, 0, 296, 1514, 1, 0, 0, 0, 298, 1517, 1, 0, 0, 0, 300, 1538, 1, 0, 0, 0, 302, 1557, 1, 0, 0, 0, 304, 1559, 1, 0, 0, 0, 306, 1564, 1, 0, 0, 0, 308, 1569, 1, 0, 0, 0, 310, 1574, 1, 0, 0, 0, 312, 1595, 1, 0, 0, 0, 314, 1597, 1, 0, 0, 0, 316, 1605, 1, 0, 0, 0, 318, 1607, 1, 0, 0, 0, 320, 1611, 1, 0, 0, 0, 322, 1615, 1, 0, 0, 0, 324, 1619, 1, 0, 0, 0, 326, 1624, 1, 0, 0, 0, 328, 1628, 1, 0, 0, 0, 330, 1632, 1, 0, 0, 0, 332, 1636, 1, 0, 0, 0, 334, 1640, 1, 0, 0, 0, 336, 1649, 1, 0, 0, 0, 338, 1655, 1, 0, 0, 0, 340, 1659, 1, 0, 0, 0, 342, 1663, 1, 0, 0, 0, 344, 1669, 1, 0, 0, 0, 346, 1677, 1, 0, 0, 0, 348, 1680, 1, 0, 0, 0, 350, 1684, 1, 0, 0, 0, 352, 1688, 1, 0, 0, 0, 354, 1692, 1, 0, 0, 0, 356, 1696, 1, 0, 0, 0, 358, 1700, 1, 0, 0, 0, 360, 1704, 1, 0, 0, 0, 362, 1709, 1, 0, 0, 0, 364, 1715, 1, 0, 0, 0, 366, 1720, 1, 0, 0, 0, 368, 1724, 1, 0, 0, 0, 370, 1728, 1, 0, 0, 0, 372, 1732, 1, 0, 0, 0, 374, 1737, 1, 0, 0, 0, 376, 1743, 1, 0, 0, 0, 378, 1749, 1, 0, 0, 0, 380, 1755, 1, 0, 0, 0, 382, 1759, 1, 0, 0, 0, 384, 1765, 1, 0, 0, 0, 386, 1769, 1, 0, 0, 0, 388, 1773, 1, 0, 0, 0, 390, 1777, 1, 0, 0, 0, 392, 1781, 1, 0, 0, 0, 394, 1785, 1, 0, 0, 0, 396, 1789, 1, 0, 0, 0, 398, 1793, 1, 0, 0, 0, 400, 1797, 1, 0, 0, 0, 402, 1801, 1, 0, 0, 0, 404, 1805, 1, 0, 0, 0, 406, 1809, 1, 0, 0, 0, 408, 1813, 1, 0, 0, 0, 410, 1822, 1, 0, 0, 0, 412, 1826, 1, 0, 0, 0, 414, 1830, 1, 0, 0, 0, 416, 1834, 1, 0, 0, 0, 418, 1839, 1, 0, 0, 0, 420, 1844, 1, 0, 0, 0, 422, 1848, 1, 0, 0, 0, 424, 1854, 1, 0, 0, 0, 426, 1863, 1, 0, 0, 0, 428, 1867, 1, 0, 0, 0, 430, 1871, 1, 0, 0, 0, 432, 1875, 1, 0, 0, 0, 434, 1879, 1, 0, 0, 0, 436, 1883, 1, 0, 0, 0, 438, 1887, 1, 0, 0, 0, 440, 1892, 1, 0, 0, 0, 442, 1898, 1, 0, 0, 0, 444, 1902, 1, 0, 0, 0, 446, 1906, 1, 0, 0, 0, 448, 1910, 1, 0, 0, 0, 450, 1915, 1, 0, 0, 0, 452, 1919, 1, 0, 0, 0, 454, 1923, 1, 0, 0, 0, 456, 1927, 1, 0, 0, 0, 458, 1931, 1, 0, 0, 0, 460, 1935, 1, 0, 0, 0, 462, 1941, 1, 0, 0, 0, 464, 1948, 1, 0, 0, 0, 466, 1952, 1, 0, 0, 0, 468, 1956, 1, 0, 0, 0, 470, 1960, 1, 0, 0, 0, 472, 1964, 1, 0, 0, 0, 474, 1968, 1, 0, 0, 0, 476, 1972, 1, 0, 0, 0, 478, 1977, 1, 0, 0, 0, 480, 1981, 1, 0, 0, 0, 482, 1985, 1, 0, 0, 0, 484, 1989, 1, 0, 0, 0, 486, 1993, 1, 0, 0, 0, 488, 1997, 1, 0, 0, 0, 490, 2001, 1, 0, 0, 0, 492, 2005, 1, 0, 0, 0, 494, 2009, 1, 0, 0, 0, 496, 2013, 1, 0, 0, 0, 498, 2017, 1, 0, 0, 0, 500, 2021, 1, 0, 0, 0, 502, 2025, 1, 0, 0, 0, 504, 2029, 1, 0, 0, 0, 506, 2033, 1, 0, 0, 0, 508, 2037, 1, 0, 0, 0, 510, 2041, 1, 0, 0, 0, 512, 2045, 1, 0, 0, 0, 514, 2049, 1, 0, 0, 0, 516, 2054, 1, 0, 0, 0, 518, 2060, 1, 0, 0, 0, 520, 2064, 1, 0, 0, 0, 522, 2068, 1, 0, 0, 0, 524, 2072, 1, 0, 0, 0, 526, 2076, 1, 0, 0, 0, 528, 2080, 1, 0, 0, 0, 530, 2084, 1, 0, 0, 0, 532, 2088, 1, 0, 0, 0, 534, 2092, 1, 0, 0, 0, 536, 2096, 1, 0, 0, 0, 538, 2100, 1, 0, 0, 0, 540, 2104, 1, 0, 0, 0, 542, 2108, 1, 0, 0, 0, 544, 2113, 1, 0, 0, 0, 546, 2119, 1, 0, 0, 0, 548, 2123, 1, 0, 0, 0, 550, 2127, 1, 0, 0, 0, 552, 2131, 1, 0, 0, 0, 554, 2135, 1, 0, 0, 0, 556, 2139, 1, 0, 0, 0, 558, 2143, 1, 0, 0, 0, 560, 2147, 1, 0, 0, 0, 562, 2155, 1, 0, 0, 0, 564, 2176, 1, 0, 0, 0, 566, 2180, 1, 0, 0, 0, 568, 2184, 1, 0, 0, 0, 570, 2188, 1, 0, 0, 0, 572, 2192, 1, 0, 0, 0, 574, 2196, 1, 0, 0, 0, 576, 2200, 1, 0, 0, 0, 578, 2204, 1, 0, 0, 0, 580, 2208, 1, 0, 0, 0, 582, 2212, 1, 0, 0, 0, 584, 2216, 1, 0, 0, 0, 586, 2220, 1, 0, 0, 0, 588, 2224, 1, 0, 0, 0, 590, 2228, 1, 0, 0, 0, 592, 2232, 1, 0, 0, 0, 594, 2237, 1, 0, 0, 0, 596, 2242, 1, 0, 0, 0, 598, 2248, 1, 0, 0, 0, 600, 2255, 1, 0, 0, 0, 602, 2259, 1, 0, 0, 0, 604, 2263, 1, 0, 0, 0, 606, 2267, 1, 0, 0, 0, 608, 2280, 1, 0, 0, 0, 610, 2291, 1, 0, 0, 0, 612, 2293, 1, 0, 0, 0, 614, 2298, 1, 0, 0, 0, 616, 2304, 1, 0, 0, 0, 618, 2308, 1, 0, 0, 0, 620, 2312, 1, 0, 0, 0, 622, 2316, 1, 0, 0, 0, 624, 2320, 1, 0, 0, 0, 626, 2324, 1, 0, 0, 0, 628, 2328, 1, 0, 0, 0, 630, 2332, 1, 0, 0, 0, 632, 2336, 1, 0, 0, 0, 634, 2340, 1, 0, 0, 0, 636, 2343, 1, 0, 0, 0, 638, 2347, 1, 0, 0, 0, 640, 2351, 1, 0, 0, 0, 642, 2355, 1, 0, 0, 0, 644, 2359, 1, 0, 0, 0, 646, 2363, 1, 0, 0, 0, 648, 2367, 1, 0, 0, 0, 650, 2371, 1, 0, 0, 0, 652, 2376, 1, 0, 0, 0, 654, 2380, 1, 0, 0, 0, 656, 2384, 1, 0, 0, 0, 658, 2388, 1, 0, 0, 0, 660, 2392, 1, 0, 0, 0, 662, 2396, 1, 0, 0, 0, 664, 2400, 1, 0, 0, 0, 666, 2404, 1, 0, 0, 0, 668, 2408, 1, 0, 0, 0, 670, 2412, 1, 0, 0, 0, 672, 2416, 1, 0, 0, 0, 674, 2420, 1, 0, 0, 0, 676, 2424, 1, 0, 0, 0, 678, 2428, 1, 0, 0, 0, 680, 2432, 1, 0, 0, 0, 682, 2436, 1, 0, 0, 0, 684, 2440, 1, 0, 0, 0, 686, 2444, 1, 0, 0, 0, 688, 2448, 1, 0, 0, 0, 690, 2452, 1, 0, 0, 0, 692, 2456, 1, 0, 0, 0, 694, 2460, 1, 0, 0, 0, 696, 2465, 1, 0, 0, 0, 698, 2470, 1, 0, 0, 0, 700, 2474, 1, 0, 0, 0, 702, 2478, 1, 0, 0, 0, 704, 705, 5, 47, 0, 0, 705, 706, 5, 47, 0, 0, 706, 710, 1, 0, 0, 0, 707, 709, 8, 0, 0, 0, 708, 707, 1, 0, 0, 0, 709, 712, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 714, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 713, 715, 5, 13, 0, 0, 714, 713, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 718, 5, 10, 0, 0, 717, 716, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 720, 6, 0, 0, 0, 720, 21, 1, 0, 0, 0, 721, 722, 5, 47, 0, 0, 722, 723, 5, 42, 0, 0, 723, 728, 1, 0, 0, 0, 724, 727, 3, 22, 1, 0, 725, 727, 9, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 725, 1, 0, 0, 0, 727, 730, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 731, 732, 5, 42, 0, 0, 732, 733, 5, 47, 0, 0, 733, 734, 1, 0, 0, 0, 734, 735, 6, 1, 0, 0, 735, 23, 1, 0, 0, 0, 736, 738, 7, 1, 0, 0, 737, 736, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 6, 2, 0, 0, 742, 25, 1, 0, 0, 0, 743, 744, 7, 2, 0, 0, 744, 745, 7, 3, 0, 0, 745, 746, 7, 4, 0, 0, 746, 747, 7, 5, 0, 0, 747, 748, 7, 6, 0, 0, 748, 749, 7, 7, 0, 0, 749, 750, 5, 95, 0, 0, 750, 751, 7, 8, 0, 0, 751, 752, 7, 9, 0, 0, 752, 753, 7, 10, 0, 0, 753, 754, 7, 5, 0, 0, 754, 755, 7, 11, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 6, 3, 1, 0, 757, 27, 1, 0, 0, 0, 758, 759, 7, 7, 0, 0, 759, 760, 7, 5, 0, 0, 760, 761, 7, 12, 0, 0, 761, 762, 7, 10, 0, 0, 762, 763, 7, 2, 0, 0, 763, 764, 7, 3, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 6, 4, 2, 0, 766, 29, 1, 0, 0, 0, 767, 768, 4, 5, 0, 0, 768, 769, 7, 7, 0, 0, 769, 770, 7, 13, 0, 0, 770, 771, 7, 8, 0, 0, 771, 772, 7, 14, 0, 0, 772, 773, 7, 4, 0, 0, 773, 774, 7, 10, 0, 0, 774, 775, 7, 5, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 6, 5, 3, 0, 777, 31, 1, 0, 0, 0, 778, 779, 7, 2, 0, 0, 779, 780, 7, 9, 0, 0, 780, 781, 7, 15, 0, 0, 781, 782, 7, 8, 0, 0, 782, 783, 7, 14, 0, 0, 783, 784, 7, 7, 0, 0, 784, 785, 7, 11, 0, 0, 785, 786, 7, 10, 0, 0, 786, 787, 7, 9, 0, 0, 787, 788, 7, 5, 0, 0, 788, 789, 1, 0, 0, 0, 789, 790, 6, 6, 4, 0, 790, 33, 1, 0, 0, 0, 791, 792, 7, 16, 0, 0, 792, 793, 7, 10, 0, 0, 793, 794, 7, 17, 0, 0, 794, 795, 7, 17, 0, 0, 795, 796, 7, 7, 0, 0, 796, 797, 7, 2, 0, 0, 797, 798, 7, 11, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 6, 7, 4, 0, 800, 35, 1, 0, 0, 0, 801, 802, 7, 7, 0, 0, 802, 803, 7, 18, 0, 0, 803, 804, 7, 4, 0, 0, 804, 805, 7, 14, 0, 0, 805, 806, 1, 0, 0, 0, 806, 807, 6, 8, 4, 0, 807, 37, 1, 0, 0, 0, 808, 809, 7, 6, 0, 0, 809, 810, 7, 12, 0, 0, 810, 811, 7, 9, 0, 0, 811, 812, 7, 19, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 6, 9, 4, 0, 814, 39, 1, 0, 0, 0, 815, 816, 7, 14, 0, 0, 816, 817, 7, 10, 0, 0, 817, 818, 7, 15, 0, 0, 818, 819, 7, 10, 0, 0, 819, 820, 7, 11, 0, 0, 820, 821, 1, 0, 0, 0, 821, 822, 6, 10, 4, 0, 822, 41, 1, 0, 0, 0, 823, 824, 7, 12, 0, 0, 824, 825, 7, 7, 0, 0, 825, 826, 7, 12, 0, 0, 826, 827, 7, 4, 0, 0, 827, 828, 7, 5, 0, 0, 828, 829, 7, 19, 0, 0, 829, 830, 1, 0, 0, 0, 830, 831, 6, 11, 4, 0, 831, 43, 1, 0, 0, 0, 832, 833, 7, 12, 0, 0, 833, 834, 7, 9, 0, 0, 834, 835, 7, 20, 0, 0, 835, 836, 1, 0, 0, 0, 836, 837, 6, 12, 4, 0, 837, 45, 1, 0, 0, 0, 838, 839, 7, 17, 0, 0, 839, 840, 7, 4, 0, 0, 840, 841, 7, 15, 0, 0, 841, 842, 7, 8, 0, 0, 842, 843, 7, 14, 0, 0, 843, 844, 7, 7, 0, 0, 844, 845, 1, 0, 0, 0, 845, 846, 6, 13, 4, 0, 846, 47, 1, 0, 0, 0, 847, 848, 7, 17, 0, 0, 848, 849, 7, 9, 0, 0, 849, 850, 7, 12, 0, 0, 850, 851, 7, 11, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 6, 14, 4, 0, 853, 49, 1, 0, 0, 0, 854, 855, 7, 17, 0, 0, 855, 856, 7, 11, 0, 0, 856, 857, 7, 4, 0, 0, 857, 858, 7, 11, 0, 0, 858, 859, 7, 17, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 6, 15, 4, 0, 861, 51, 1, 0, 0, 0, 862, 863, 7, 20, 0, 0, 863, 864, 7, 3, 0, 0, 864, 865, 7, 7, 0, 0, 865, 866, 7, 12, 0, 0, 866, 867, 7, 7, 0, 0, 867, 868, 1, 0, 0, 0, 868, 869, 6, 16, 4, 0, 869, 53, 1, 0, 0, 0, 870, 871, 7, 21, 0, 0, 871, 872, 7, 12, 0, 0, 872, 873, 7, 9, 0, 0, 873, 874, 7, 15, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 6, 17, 5, 0, 876, 55, 1, 0, 0, 0, 877, 878, 7, 11, 0, 0, 878, 879, 7, 17, 0, 0, 879, 880, 1, 0, 0, 0, 880, 881, 6, 18, 5, 0, 881, 57, 1, 0, 0, 0, 882, 883, 4, 19, 1, 0, 883, 884, 7, 7, 0, 0, 884, 885, 7, 13, 0, 0, 885, 886, 7, 11, 0, 0, 886, 887, 7, 7, 0, 0, 887, 888, 7, 12, 0, 0, 888, 889, 7, 5, 0, 0, 889, 890, 7, 4, 0, 0, 890, 891, 7, 14, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 6, 19, 5, 0, 893, 59, 1, 0, 0, 0, 894, 895, 7, 21, 0, 0, 895, 896, 7, 9, 0, 0, 896, 897, 7, 12, 0, 0, 897, 898, 7, 19, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 6, 20, 6, 0, 900, 61, 1, 0, 0, 0, 901, 902, 7, 21, 0, 0, 902, 903, 7, 22, 0, 0, 903, 904, 7, 17, 0, 0, 904, 905, 7, 7, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 6, 21, 7, 0, 907, 63, 1, 0, 0, 0, 908, 909, 7, 10, 0, 0, 909, 910, 7, 5, 0, 0, 910, 911, 7, 14, 0, 0, 911, 912, 7, 10, 0, 0, 912, 913, 7, 5, 0, 0, 913, 914, 7, 7, 0, 0, 914, 915, 1, 0, 0, 0, 915, 916, 6, 22, 8, 0, 916, 65, 1, 0, 0, 0, 917, 918, 7, 10, 0, 0, 918, 919, 7, 5, 0, 0, 919, 920, 7, 14, 0, 0, 920, 921, 7, 10, 0, 0, 921, 922, 7, 5, 0, 0, 922, 923, 7, 7, 0, 0, 923, 924, 7, 17, 0, 0, 924, 925, 7, 11, 0, 0, 925, 926, 7, 4, 0, 0, 926, 927, 7, 11, 0, 0, 927, 928, 7, 17, 0, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 23, 4, 0, 930, 67, 1, 0, 0, 0, 931, 932, 7, 14, 0, 0, 932, 933, 7, 9, 0, 0, 933, 934, 7, 9, 0, 0, 934, 935, 7, 19, 0, 0, 935, 936, 7, 22, 0, 0, 936, 937, 7, 8, 0, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 24, 9, 0, 939, 69, 1, 0, 0, 0, 940, 941, 4, 25, 2, 0, 941, 942, 7, 21, 0, 0, 942, 943, 7, 22, 0, 0, 943, 944, 7, 14, 0, 0, 944, 945, 7, 14, 0, 0, 945, 946, 1, 0, 0, 0, 946, 947, 6, 25, 9, 0, 947, 71, 1, 0, 0, 0, 948, 949, 4, 26, 3, 0, 949, 950, 7, 14, 0, 0, 950, 951, 7, 7, 0, 0, 951, 952, 7, 21, 0, 0, 952, 953, 7, 11, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 6, 26, 9, 0, 955, 73, 1, 0, 0, 0, 956, 957, 4, 27, 4, 0, 957, 958, 7, 12, 0, 0, 958, 959, 7, 10, 0, 0, 959, 960, 7, 6, 0, 0, 960, 961, 7, 3, 0, 0, 961, 962, 7, 11, 0, 0, 962, 963, 1, 0, 0, 0, 963, 964, 6, 27, 9, 0, 964, 75, 1, 0, 0, 0, 965, 966, 4, 28, 5, 0, 966, 967, 7, 14, 0, 0, 967, 968, 7, 9, 0, 0, 968, 969, 7, 9, 0, 0, 969, 970, 7, 19, 0, 0, 970, 971, 7, 22, 0, 0, 971, 972, 7, 8, 0, 0, 972, 973, 5, 95, 0, 0, 973, 974, 5, 128020, 0, 0, 974, 975, 1, 0, 0, 0, 975, 976, 6, 28, 10, 0, 976, 77, 1, 0, 0, 0, 977, 978, 4, 29, 6, 0, 978, 979, 7, 15, 0, 0, 979, 980, 7, 15, 0, 0, 980, 981, 7, 12, 0, 0, 981, 982, 1, 0, 0, 0, 982, 983, 6, 29, 11, 0, 983, 79, 1, 0, 0, 0, 984, 985, 7, 15, 0, 0, 985, 986, 7, 18, 0, 0, 986, 987, 5, 95, 0, 0, 987, 988, 7, 7, 0, 0, 988, 989, 7, 13, 0, 0, 989, 990, 7, 8, 0, 0, 990, 991, 7, 4, 0, 0, 991, 992, 7, 5, 0, 0, 992, 993, 7, 16, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 6, 30, 12, 0, 995, 81, 1, 0, 0, 0, 996, 997, 7, 16, 0, 0, 997, 998, 7, 12, 0, 0, 998, 999, 7, 9, 0, 0, 999, 1000, 7, 8, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 6, 31, 13, 0, 1002, 83, 1, 0, 0, 0, 1003, 1004, 7, 19, 0, 0, 1004, 1005, 7, 7, 0, 0, 1005, 1006, 7, 7, 0, 0, 1006, 1007, 7, 8, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 32, 13, 0, 1009, 85, 1, 0, 0, 0, 1010, 1011, 4, 33, 7, 0, 1011, 1012, 7, 10, 0, 0, 1012, 1013, 7, 5, 0, 0, 1013, 1014, 7, 17, 0, 0, 1014, 1015, 7, 10, 0, 0, 1015, 1016, 7, 17, 0, 0, 1016, 1017, 7, 11, 0, 0, 1017, 1018, 5, 95, 0, 0, 1018, 1019, 5, 128020, 0, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 33, 13, 0, 1021, 87, 1, 0, 0, 0, 1022, 1023, 7, 8, 0, 0, 1023, 1024, 7, 12, 0, 0, 1024, 1025, 7, 9, 0, 0, 1025, 1026, 7, 15, 0, 0, 1026, 1027, 7, 23, 0, 0, 1027, 1028, 7, 14, 0, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 34, 14, 0, 1030, 89, 1, 0, 0, 0, 1031, 1032, 7, 12, 0, 0, 1032, 1033, 7, 7, 0, 0, 1033, 1034, 7, 5, 0, 0, 1034, 1035, 7, 4, 0, 0, 1035, 1036, 7, 15, 0, 0, 1036, 1037, 7, 7, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 6, 35, 15, 0, 1039, 91, 1, 0, 0, 0, 1040, 1041, 7, 17, 0, 0, 1041, 1042, 7, 7, 0, 0, 1042, 1043, 7, 11, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 6, 36, 16, 0, 1045, 93, 1, 0, 0, 0, 1046, 1047, 7, 17, 0, 0, 1047, 1048, 7, 3, 0, 0, 1048, 1049, 7, 9, 0, 0, 1049, 1050, 7, 20, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1052, 6, 37, 17, 0, 1052, 95, 1, 0, 0, 0, 1053, 1055, 8, 24, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 38, 4, 0, 1059, 97, 1, 0, 0, 0, 1060, 1061, 3, 190, 85, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 39, 18, 0, 1063, 1064, 6, 39, 19, 0, 1064, 99, 1, 0, 0, 0, 1065, 1066, 3, 310, 145, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 6, 40, 20, 0, 1068, 1069, 6, 40, 19, 0, 1069, 1070, 6, 40, 19, 0, 1070, 101, 1, 0, 0, 0, 1071, 1072, 3, 256, 118, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 41, 21, 0, 1074, 103, 1, 0, 0, 0, 1075, 1076, 3, 634, 307, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 42, 22, 0, 1078, 105, 1, 0, 0, 0, 1079, 1080, 3, 236, 108, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 43, 23, 0, 1082, 107, 1, 0, 0, 0, 1083, 1084, 3, 232, 106, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 44, 24, 0, 1086, 109, 1, 0, 0, 0, 1087, 1088, 3, 304, 142, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 45, 25, 0, 1090, 111, 1, 0, 0, 0, 1091, 1092, 3, 306, 143, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 46, 26, 0, 1094, 113, 1, 0, 0, 0, 1095, 1096, 3, 316, 148, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 47, 27, 0, 1098, 115, 1, 0, 0, 0, 1099, 1100, 3, 312, 146, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 48, 28, 0, 1102, 117, 1, 0, 0, 0, 1103, 1104, 3, 20, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 6, 49, 0, 0, 1106, 119, 1, 0, 0, 0, 1107, 1108, 3, 22, 1, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 50, 0, 0, 1110, 121, 1, 0, 0, 0, 1111, 1112, 3, 24, 2, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 51, 0, 0, 1114, 123, 1, 0, 0, 0, 1115, 1116, 3, 190, 85, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 52, 18, 0, 1118, 1119, 6, 52, 19, 0, 1119, 125, 1, 0, 0, 0, 1120, 1121, 3, 310, 145, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 53, 20, 0, 1123, 1124, 6, 53, 19, 0, 1124, 1125, 6, 53, 19, 0, 1125, 127, 1, 0, 0, 0, 1126, 1127, 3, 256, 118, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 6, 54, 21, 0, 1129, 1130, 6, 54, 29, 0, 1130, 129, 1, 0, 0, 0, 1131, 1132, 3, 266, 123, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1134, 6, 55, 30, 0, 1134, 1135, 6, 55, 29, 0, 1135, 131, 1, 0, 0, 0, 1136, 1137, 8, 25, 0, 0, 1137, 133, 1, 0, 0, 0, 1138, 1140, 3, 132, 56, 0, 1139, 1138, 1, 0, 0, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 3, 228, 104, 0, 1144, 1146, 1, 0, 0, 0, 1145, 1139, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1148, 1, 0, 0, 0, 1147, 1149, 3, 132, 56, 0, 1148, 1147, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 135, 1, 0, 0, 0, 1152, 1153, 3, 134, 57, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 6, 58, 31, 0, 1155, 137, 1, 0, 0, 0, 1156, 1157, 3, 212, 96, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 6, 59, 32, 0, 1159, 139, 1, 0, 0, 0, 1160, 1161, 3, 20, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1163, 6, 60, 0, 0, 1163, 141, 1, 0, 0, 0, 1164, 1165, 3, 22, 1, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 6, 61, 0, 0, 1167, 143, 1, 0, 0, 0, 1168, 1169, 3, 24, 2, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 6, 62, 0, 0, 1171, 145, 1, 0, 0, 0, 1172, 1173, 3, 190, 85, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 6, 63, 18, 0, 1175, 1176, 6, 63, 19, 0, 1176, 1177, 6, 63, 19, 0, 1177, 147, 1, 0, 0, 0, 1178, 1179, 3, 310, 145, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 64, 20, 0, 1181, 1182, 6, 64, 19, 0, 1182, 1183, 6, 64, 19, 0, 1183, 1184, 6, 64, 19, 0, 1184, 149, 1, 0, 0, 0, 1185, 1186, 3, 304, 142, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1188, 6, 65, 25, 0, 1188, 151, 1, 0, 0, 0, 1189, 1190, 3, 306, 143, 0, 1190, 1191, 1, 0, 0, 0, 1191, 1192, 6, 66, 26, 0, 1192, 153, 1, 0, 0, 0, 1193, 1194, 3, 222, 101, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 6, 67, 33, 0, 1196, 155, 1, 0, 0, 0, 1197, 1198, 3, 232, 106, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1200, 6, 68, 24, 0, 1200, 157, 1, 0, 0, 0, 1201, 1202, 3, 236, 108, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 69, 23, 0, 1204, 159, 1, 0, 0, 0, 1205, 1206, 3, 266, 123, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 70, 30, 0, 1208, 161, 1, 0, 0, 0, 1209, 1210, 3, 566, 273, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 6, 71, 34, 0, 1212, 163, 1, 0, 0, 0, 1213, 1214, 3, 316, 148, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1216, 6, 72, 27, 0, 1216, 165, 1, 0, 0, 0, 1217, 1218, 3, 260, 120, 0, 1218, 1219, 1, 0, 0, 0, 1219, 1220, 6, 73, 35, 0, 1220, 167, 1, 0, 0, 0, 1221, 1222, 3, 300, 140, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1224, 6, 74, 36, 0, 1224, 169, 1, 0, 0, 0, 1225, 1226, 3, 296, 138, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 75, 37, 0, 1228, 171, 1, 0, 0, 0, 1229, 1230, 3, 302, 141, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 76, 38, 0, 1232, 173, 1, 0, 0, 0, 1233, 1234, 3, 20, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 6, 77, 0, 0, 1236, 175, 1, 0, 0, 0, 1237, 1238, 3, 22, 1, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 6, 78, 0, 0, 1240, 177, 1, 0, 0, 0, 1241, 1242, 3, 24, 2, 0, 1242, 1243, 1, 0, 0, 0, 1243, 1244, 6, 79, 0, 0, 1244, 179, 1, 0, 0, 0, 1245, 1246, 3, 308, 144, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 6, 80, 39, 0, 1248, 1249, 6, 80, 40, 0, 1249, 181, 1, 0, 0, 0, 1250, 1251, 3, 190, 85, 0, 1251, 1252, 1, 0, 0, 0, 1252, 1253, 6, 81, 18, 0, 1253, 1254, 6, 81, 19, 0, 1254, 183, 1, 0, 0, 0, 1255, 1256, 3, 24, 2, 0, 1256, 1257, 1, 0, 0, 0, 1257, 1258, 6, 82, 0, 0, 1258, 185, 1, 0, 0, 0, 1259, 1260, 3, 20, 0, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 6, 83, 0, 0, 1262, 187, 1, 0, 0, 0, 1263, 1264, 3, 22, 1, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 6, 84, 0, 0, 1266, 189, 1, 0, 0, 0, 1267, 1268, 5, 124, 0, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 6, 85, 19, 0, 1270, 191, 1, 0, 0, 0, 1271, 1272, 7, 26, 0, 0, 1272, 193, 1, 0, 0, 0, 1273, 1274, 7, 27, 0, 0, 1274, 195, 1, 0, 0, 0, 1275, 1276, 5, 92, 0, 0, 1276, 1277, 7, 28, 0, 0, 1277, 197, 1, 0, 0, 0, 1278, 1279, 8, 29, 0, 0, 1279, 199, 1, 0, 0, 0, 1280, 1282, 7, 7, 0, 0, 1281, 1283, 7, 30, 0, 0, 1282, 1281, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1286, 3, 192, 86, 0, 1285, 1284, 1, 0, 0, 0, 1286, 1287, 1, 0, 0, 0, 1287, 1285, 1, 0, 0, 0, 1287, 1288, 1, 0, 0, 0, 1288, 201, 1, 0, 0, 0, 1289, 1290, 5, 64, 0, 0, 1290, 203, 1, 0, 0, 0, 1291, 1292, 5, 96, 0, 0, 1292, 205, 1, 0, 0, 0, 1293, 1297, 8, 31, 0, 0, 1294, 1295, 5, 96, 0, 0, 1295, 1297, 5, 96, 0, 0, 1296, 1293, 1, 0, 0, 0, 1296, 1294, 1, 0, 0, 0, 1297, 207, 1, 0, 0, 0, 1298, 1299, 5, 95, 0, 0, 1299, 209, 1, 0, 0, 0, 1300, 1304, 3, 194, 87, 0, 1301, 1304, 3, 192, 86, 0, 1302, 1304, 3, 208, 94, 0, 1303, 1300, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1302, 1, 0, 0, 0, 1304, 211, 1, 0, 0, 0, 1305, 1310, 5, 34, 0, 0, 1306, 1309, 3, 196, 88, 0, 1307, 1309, 3, 198, 89, 0, 1308, 1306, 1, 0, 0, 0, 1308, 1307, 1, 0, 0, 0, 1309, 1312, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1313, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1313, 1335, 5, 34, 0, 0, 1314, 1315, 5, 34, 0, 0, 1315, 1316, 5, 34, 0, 0, 1316, 1317, 5, 34, 0, 0, 1317, 1321, 1, 0, 0, 0, 1318, 1320, 8, 0, 0, 0, 1319, 1318, 1, 0, 0, 0, 1320, 1323, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1321, 1319, 1, 0, 0, 0, 1322, 1324, 1, 0, 0, 0, 1323, 1321, 1, 0, 0, 0, 1324, 1325, 5, 34, 0, 0, 1325, 1326, 5, 34, 0, 0, 1326, 1327, 5, 34, 0, 0, 1327, 1329, 1, 0, 0, 0, 1328, 1330, 5, 34, 0, 0, 1329, 1328, 1, 0, 0, 0, 1329, 1330, 1, 0, 0, 0, 1330, 1332, 1, 0, 0, 0, 1331, 1333, 5, 34, 0, 0, 1332, 1331, 1, 0, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1335, 1, 0, 0, 0, 1334, 1305, 1, 0, 0, 0, 1334, 1314, 1, 0, 0, 0, 1335, 213, 1, 0, 0, 0, 1336, 1338, 3, 192, 86, 0, 1337, 1336, 1, 0, 0, 0, 1338, 1339, 1, 0, 0, 0, 1339, 1337, 1, 0, 0, 0, 1339, 1340, 1, 0, 0, 0, 1340, 215, 1, 0, 0, 0, 1341, 1343, 3, 192, 86, 0, 1342, 1341, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1342, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1350, 3, 236, 108, 0, 1347, 1349, 3, 192, 86, 0, 1348, 1347, 1, 0, 0, 0, 1349, 1352, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1350, 1351, 1, 0, 0, 0, 1351, 1384, 1, 0, 0, 0, 1352, 1350, 1, 0, 0, 0, 1353, 1355, 3, 236, 108, 0, 1354, 1356, 3, 192, 86, 0, 1355, 1354, 1, 0, 0, 0, 1356, 1357, 1, 0, 0, 0, 1357, 1355, 1, 0, 0, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1384, 1, 0, 0, 0, 1359, 1361, 3, 192, 86, 0, 1360, 1359, 1, 0, 0, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1360, 1, 0, 0, 0, 1362, 1363, 1, 0, 0, 0, 1363, 1371, 1, 0, 0, 0, 1364, 1368, 3, 236, 108, 0, 1365, 1367, 3, 192, 86, 0, 1366, 1365, 1, 0, 0, 0, 1367, 1370, 1, 0, 0, 0, 1368, 1366, 1, 0, 0, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1372, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1371, 1364, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1374, 3, 200, 90, 0, 1374, 1384, 1, 0, 0, 0, 1375, 1377, 3, 236, 108, 0, 1376, 1378, 3, 192, 86, 0, 1377, 1376, 1, 0, 0, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1377, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 3, 200, 90, 0, 1382, 1384, 1, 0, 0, 0, 1383, 1342, 1, 0, 0, 0, 1383, 1353, 1, 0, 0, 0, 1383, 1360, 1, 0, 0, 0, 1383, 1375, 1, 0, 0, 0, 1384, 217, 1, 0, 0, 0, 1385, 1386, 7, 4, 0, 0, 1386, 1387, 7, 5, 0, 0, 1387, 1388, 7, 16, 0, 0, 1388, 219, 1, 0, 0, 0, 1389, 1390, 7, 4, 0, 0, 1390, 1391, 7, 17, 0, 0, 1391, 1392, 7, 2, 0, 0, 1392, 221, 1, 0, 0, 0, 1393, 1394, 5, 61, 0, 0, 1394, 223, 1, 0, 0, 0, 1395, 1396, 7, 32, 0, 0, 1396, 1397, 7, 33, 0, 0, 1397, 225, 1, 0, 0, 0, 1398, 1399, 5, 58, 0, 0, 1399, 1400, 5, 58, 0, 0, 1400, 227, 1, 0, 0, 0, 1401, 1402, 5, 58, 0, 0, 1402, 229, 1, 0, 0, 0, 1403, 1404, 5, 59, 0, 0, 1404, 231, 1, 0, 0, 0, 1405, 1406, 5, 44, 0, 0, 1406, 233, 1, 0, 0, 0, 1407, 1408, 7, 16, 0, 0, 1408, 1409, 7, 7, 0, 0, 1409, 1410, 7, 17, 0, 0, 1410, 1411, 7, 2, 0, 0, 1411, 235, 1, 0, 0, 0, 1412, 1413, 5, 46, 0, 0, 1413, 237, 1, 0, 0, 0, 1414, 1415, 7, 21, 0, 0, 1415, 1416, 7, 4, 0, 0, 1416, 1417, 7, 14, 0, 0, 1417, 1418, 7, 17, 0, 0, 1418, 1419, 7, 7, 0, 0, 1419, 239, 1, 0, 0, 0, 1420, 1421, 7, 21, 0, 0, 1421, 1422, 7, 10, 0, 0, 1422, 1423, 7, 12, 0, 0, 1423, 1424, 7, 17, 0, 0, 1424, 1425, 7, 11, 0, 0, 1425, 241, 1, 0, 0, 0, 1426, 1427, 7, 10, 0, 0, 1427, 1428, 7, 5, 0, 0, 1428, 243, 1, 0, 0, 0, 1429, 1430, 7, 10, 0, 0, 1430, 1431, 7, 17, 0, 0, 1431, 245, 1, 0, 0, 0, 1432, 1433, 7, 14, 0, 0, 1433, 1434, 7, 4, 0, 0, 1434, 1435, 7, 17, 0, 0, 1435, 1436, 7, 11, 0, 0, 1436, 247, 1, 0, 0, 0, 1437, 1438, 7, 14, 0, 0, 1438, 1439, 7, 10, 0, 0, 1439, 1440, 7, 19, 0, 0, 1440, 1441, 7, 7, 0, 0, 1441, 249, 1, 0, 0, 0, 1442, 1443, 7, 5, 0, 0, 1443, 1444, 7, 9, 0, 0, 1444, 1445, 7, 11, 0, 0, 1445, 251, 1, 0, 0, 0, 1446, 1447, 7, 5, 0, 0, 1447, 1448, 7, 22, 0, 0, 1448, 1449, 7, 14, 0, 0, 1449, 1450, 7, 14, 0, 0, 1450, 253, 1, 0, 0, 0, 1451, 1452, 7, 5, 0, 0, 1452, 1453, 7, 22, 0, 0, 1453, 1454, 7, 14, 0, 0, 1454, 1455, 7, 14, 0, 0, 1455, 1456, 7, 17, 0, 0, 1456, 255, 1, 0, 0, 0, 1457, 1458, 7, 9, 0, 0, 1458, 1459, 7, 5, 0, 0, 1459, 257, 1, 0, 0, 0, 1460, 1461, 7, 9, 0, 0, 1461, 1462, 7, 12, 0, 0, 1462, 259, 1, 0, 0, 0, 1463, 1464, 5, 63, 0, 0, 1464, 261, 1, 0, 0, 0, 1465, 1466, 7, 12, 0, 0, 1466, 1467, 7, 14, 0, 0, 1467, 1468, 7, 10, 0, 0, 1468, 1469, 7, 19, 0, 0, 1469, 1470, 7, 7, 0, 0, 1470, 263, 1, 0, 0, 0, 1471, 1472, 7, 11, 0, 0, 1472, 1473, 7, 12, 0, 0, 1473, 1474, 7, 22, 0, 0, 1474, 1475, 7, 7, 0, 0, 1475, 265, 1, 0, 0, 0, 1476, 1477, 7, 20, 0, 0, 1477, 1478, 7, 10, 0, 0, 1478, 1479, 7, 11, 0, 0, 1479, 1480, 7, 3, 0, 0, 1480, 267, 1, 0, 0, 0, 1481, 1482, 5, 61, 0, 0, 1482, 1483, 5, 61, 0, 0, 1483, 269, 1, 0, 0, 0, 1484, 1485, 5, 61, 0, 0, 1485, 1486, 5, 126, 0, 0, 1486, 271, 1, 0, 0, 0, 1487, 1488, 5, 33, 0, 0, 1488, 1489, 5, 61, 0, 0, 1489, 273, 1, 0, 0, 0, 1490, 1491, 5, 60, 0, 0, 1491, 275, 1, 0, 0, 0, 1492, 1493, 5, 60, 0, 0, 1493, 1494, 5, 61, 0, 0, 1494, 277, 1, 0, 0, 0, 1495, 1496, 5, 62, 0, 0, 1496, 279, 1, 0, 0, 0, 1497, 1498, 5, 62, 0, 0, 1498, 1499, 5, 61, 0, 0, 1499, 281, 1, 0, 0, 0, 1500, 1501, 5, 43, 0, 0, 1501, 283, 1, 0, 0, 0, 1502, 1503, 5, 45, 0, 0, 1503, 285, 1, 0, 0, 0, 1504, 1505, 5, 42, 0, 0, 1505, 287, 1, 0, 0, 0, 1506, 1507, 5, 47, 0, 0, 1507, 289, 1, 0, 0, 0, 1508, 1509, 5, 37, 0, 0, 1509, 291, 1, 0, 0, 0, 1510, 1511, 5, 123, 0, 0, 1511, 293, 1, 0, 0, 0, 1512, 1513, 5, 125, 0, 0, 1513, 295, 1, 0, 0, 0, 1514, 1515, 5, 63, 0, 0, 1515, 1516, 5, 63, 0, 0, 1516, 297, 1, 0, 0, 0, 1517, 1518, 3, 52, 16, 0, 1518, 1519, 1, 0, 0, 0, 1519, 1520, 6, 139, 41, 0, 1520, 299, 1, 0, 0, 0, 1521, 1524, 3, 260, 120, 0, 1522, 1525, 3, 194, 87, 0, 1523, 1525, 3, 208, 94, 0, 1524, 1522, 1, 0, 0, 0, 1524, 1523, 1, 0, 0, 0, 1525, 1529, 1, 0, 0, 0, 1526, 1528, 3, 210, 95, 0, 1527, 1526, 1, 0, 0, 0, 1528, 1531, 1, 0, 0, 0, 1529, 1527, 1, 0, 0, 0, 1529, 1530, 1, 0, 0, 0, 1530, 1539, 1, 0, 0, 0, 1531, 1529, 1, 0, 0, 0, 1532, 1534, 3, 260, 120, 0, 1533, 1535, 3, 192, 86, 0, 1534, 1533, 1, 0, 0, 0, 1535, 1536, 1, 0, 0, 0, 1536, 1534, 1, 0, 0, 0, 1536, 1537, 1, 0, 0, 0, 1537, 1539, 1, 0, 0, 0, 1538, 1521, 1, 0, 0, 0, 1538, 1532, 1, 0, 0, 0, 1539, 301, 1, 0, 0, 0, 1540, 1543, 3, 296, 138, 0, 1541, 1544, 3, 194, 87, 0, 1542, 1544, 3, 208, 94, 0, 1543, 1541, 1, 0, 0, 0, 1543, 1542, 1, 0, 0, 0, 1544, 1548, 1, 0, 0, 0, 1545, 1547, 3, 210, 95, 0, 1546, 1545, 1, 0, 0, 0, 1547, 1550, 1, 0, 0, 0, 1548, 1546, 1, 0, 0, 0, 1548, 1549, 1, 0, 0, 0, 1549, 1558, 1, 0, 0, 0, 1550, 1548, 1, 0, 0, 0, 1551, 1553, 3, 296, 138, 0, 1552, 1554, 3, 192, 86, 0, 1553, 1552, 1, 0, 0, 0, 1554, 1555, 1, 0, 0, 0, 1555, 1553, 1, 0, 0, 0, 1555, 1556, 1, 0, 0, 0, 1556, 1558, 1, 0, 0, 0, 1557, 1540, 1, 0, 0, 0, 1557, 1551, 1, 0, 0, 0, 1558, 303, 1, 0, 0, 0, 1559, 1560, 5, 91, 0, 0, 1560, 1561, 1, 0, 0, 0, 1561, 1562, 6, 142, 4, 0, 1562, 1563, 6, 142, 4, 0, 1563, 305, 1, 0, 0, 0, 1564, 1565, 5, 93, 0, 0, 1565, 1566, 1, 0, 0, 0, 1566, 1567, 6, 143, 19, 0, 1567, 1568, 6, 143, 19, 0, 1568, 307, 1, 0, 0, 0, 1569, 1570, 5, 40, 0, 0, 1570, 1571, 1, 0, 0, 0, 1571, 1572, 6, 144, 4, 0, 1572, 1573, 6, 144, 4, 0, 1573, 309, 1, 0, 0, 0, 1574, 1575, 5, 41, 0, 0, 1575, 1576, 1, 0, 0, 0, 1576, 1577, 6, 145, 19, 0, 1577, 1578, 6, 145, 19, 0, 1578, 311, 1, 0, 0, 0, 1579, 1583, 3, 194, 87, 0, 1580, 1582, 3, 210, 95, 0, 1581, 1580, 1, 0, 0, 0, 1582, 1585, 1, 0, 0, 0, 1583, 1581, 1, 0, 0, 0, 1583, 1584, 1, 0, 0, 0, 1584, 1596, 1, 0, 0, 0, 1585, 1583, 1, 0, 0, 0, 1586, 1589, 3, 208, 94, 0, 1587, 1589, 3, 202, 91, 0, 1588, 1586, 1, 0, 0, 0, 1588, 1587, 1, 0, 0, 0, 1589, 1591, 1, 0, 0, 0, 1590, 1592, 3, 210, 95, 0, 1591, 1590, 1, 0, 0, 0, 1592, 1593, 1, 0, 0, 0, 1593, 1591, 1, 0, 0, 0, 1593, 1594, 1, 0, 0, 0, 1594, 1596, 1, 0, 0, 0, 1595, 1579, 1, 0, 0, 0, 1595, 1588, 1, 0, 0, 0, 1596, 313, 1, 0, 0, 0, 1597, 1599, 3, 204, 92, 0, 1598, 1600, 3, 206, 93, 0, 1599, 1598, 1, 0, 0, 0, 1600, 1601, 1, 0, 0, 0, 1601, 1599, 1, 0, 0, 0, 1601, 1602, 1, 0, 0, 0, 1602, 1603, 1, 0, 0, 0, 1603, 1604, 3, 204, 92, 0, 1604, 315, 1, 0, 0, 0, 1605, 1606, 3, 314, 147, 0, 1606, 317, 1, 0, 0, 0, 1607, 1608, 3, 20, 0, 0, 1608, 1609, 1, 0, 0, 0, 1609, 1610, 6, 149, 0, 0, 1610, 319, 1, 0, 0, 0, 1611, 1612, 3, 22, 1, 0, 1612, 1613, 1, 0, 0, 0, 1613, 1614, 6, 150, 0, 0, 1614, 321, 1, 0, 0, 0, 1615, 1616, 3, 24, 2, 0, 1616, 1617, 1, 0, 0, 0, 1617, 1618, 6, 151, 0, 0, 1618, 323, 1, 0, 0, 0, 1619, 1620, 3, 190, 85, 0, 1620, 1621, 1, 0, 0, 0, 1621, 1622, 6, 152, 18, 0, 1622, 1623, 6, 152, 19, 0, 1623, 325, 1, 0, 0, 0, 1624, 1625, 3, 228, 104, 0, 1625, 1626, 1, 0, 0, 0, 1626, 1627, 6, 153, 42, 0, 1627, 327, 1, 0, 0, 0, 1628, 1629, 3, 226, 103, 0, 1629, 1630, 1, 0, 0, 0, 1630, 1631, 6, 154, 43, 0, 1631, 329, 1, 0, 0, 0, 1632, 1633, 3, 232, 106, 0, 1633, 1634, 1, 0, 0, 0, 1634, 1635, 6, 155, 24, 0, 1635, 331, 1, 0, 0, 0, 1636, 1637, 3, 222, 101, 0, 1637, 1638, 1, 0, 0, 0, 1638, 1639, 6, 156, 33, 0, 1639, 333, 1, 0, 0, 0, 1640, 1641, 7, 15, 0, 0, 1641, 1642, 7, 7, 0, 0, 1642, 1643, 7, 11, 0, 0, 1643, 1644, 7, 4, 0, 0, 1644, 1645, 7, 16, 0, 0, 1645, 1646, 7, 4, 0, 0, 1646, 1647, 7, 11, 0, 0, 1647, 1648, 7, 4, 0, 0, 1648, 335, 1, 0, 0, 0, 1649, 1650, 3, 266, 123, 0, 1650, 1651, 1, 0, 0, 0, 1651, 1652, 6, 158, 30, 0, 1652, 1653, 6, 158, 19, 0, 1653, 1654, 6, 158, 4, 0, 1654, 337, 1, 0, 0, 0, 1655, 1656, 3, 260, 120, 0, 1656, 1657, 1, 0, 0, 0, 1657, 1658, 6, 159, 35, 0, 1658, 339, 1, 0, 0, 0, 1659, 1660, 3, 300, 140, 0, 1660, 1661, 1, 0, 0, 0, 1661, 1662, 6, 160, 36, 0, 1662, 341, 1, 0, 0, 0, 1663, 1664, 3, 310, 145, 0, 1664, 1665, 1, 0, 0, 0, 1665, 1666, 6, 161, 20, 0, 1666, 1667, 6, 161, 19, 0, 1667, 1668, 6, 161, 19, 0, 1668, 343, 1, 0, 0, 0, 1669, 1670, 3, 308, 144, 0, 1670, 1671, 1, 0, 0, 0, 1671, 1672, 6, 162, 39, 0, 1672, 1673, 6, 162, 40, 0, 1673, 345, 1, 0, 0, 0, 1674, 1678, 8, 34, 0, 0, 1675, 1676, 5, 47, 0, 0, 1676, 1678, 8, 35, 0, 0, 1677, 1674, 1, 0, 0, 0, 1677, 1675, 1, 0, 0, 0, 1678, 347, 1, 0, 0, 0, 1679, 1681, 3, 346, 163, 0, 1680, 1679, 1, 0, 0, 0, 1681, 1682, 1, 0, 0, 0, 1682, 1680, 1, 0, 0, 0, 1682, 1683, 1, 0, 0, 0, 1683, 349, 1, 0, 0, 0, 1684, 1685, 3, 348, 164, 0, 1685, 1686, 1, 0, 0, 0, 1686, 1687, 6, 165, 44, 0, 1687, 351, 1, 0, 0, 0, 1688, 1689, 3, 212, 96, 0, 1689, 1690, 1, 0, 0, 0, 1690, 1691, 6, 166, 32, 0, 1691, 353, 1, 0, 0, 0, 1692, 1693, 3, 20, 0, 0, 1693, 1694, 1, 0, 0, 0, 1694, 1695, 6, 167, 0, 0, 1695, 355, 1, 0, 0, 0, 1696, 1697, 3, 22, 1, 0, 1697, 1698, 1, 0, 0, 0, 1698, 1699, 6, 168, 0, 0, 1699, 357, 1, 0, 0, 0, 1700, 1701, 3, 24, 2, 0, 1701, 1702, 1, 0, 0, 0, 1702, 1703, 6, 169, 0, 0, 1703, 359, 1, 0, 0, 0, 1704, 1705, 3, 308, 144, 0, 1705, 1706, 1, 0, 0, 0, 1706, 1707, 6, 170, 39, 0, 1707, 1708, 6, 170, 40, 0, 1708, 361, 1, 0, 0, 0, 1709, 1710, 3, 310, 145, 0, 1710, 1711, 1, 0, 0, 0, 1711, 1712, 6, 171, 20, 0, 1712, 1713, 6, 171, 19, 0, 1713, 1714, 6, 171, 19, 0, 1714, 363, 1, 0, 0, 0, 1715, 1716, 3, 190, 85, 0, 1716, 1717, 1, 0, 0, 0, 1717, 1718, 6, 172, 18, 0, 1718, 1719, 6, 172, 19, 0, 1719, 365, 1, 0, 0, 0, 1720, 1721, 3, 24, 2, 0, 1721, 1722, 1, 0, 0, 0, 1722, 1723, 6, 173, 0, 0, 1723, 367, 1, 0, 0, 0, 1724, 1725, 3, 20, 0, 0, 1725, 1726, 1, 0, 0, 0, 1726, 1727, 6, 174, 0, 0, 1727, 369, 1, 0, 0, 0, 1728, 1729, 3, 22, 1, 0, 1729, 1730, 1, 0, 0, 0, 1730, 1731, 6, 175, 0, 0, 1731, 371, 1, 0, 0, 0, 1732, 1733, 3, 190, 85, 0, 1733, 1734, 1, 0, 0, 0, 1734, 1735, 6, 176, 18, 0, 1735, 1736, 6, 176, 19, 0, 1736, 373, 1, 0, 0, 0, 1737, 1738, 3, 310, 145, 0, 1738, 1739, 1, 0, 0, 0, 1739, 1740, 6, 177, 20, 0, 1740, 1741, 6, 177, 19, 0, 1741, 1742, 6, 177, 19, 0, 1742, 375, 1, 0, 0, 0, 1743, 1744, 7, 6, 0, 0, 1744, 1745, 7, 12, 0, 0, 1745, 1746, 7, 9, 0, 0, 1746, 1747, 7, 22, 0, 0, 1747, 1748, 7, 8, 0, 0, 1748, 377, 1, 0, 0, 0, 1749, 1750, 7, 17, 0, 0, 1750, 1751, 7, 2, 0, 0, 1751, 1752, 7, 9, 0, 0, 1752, 1753, 7, 12, 0, 0, 1753, 1754, 7, 7, 0, 0, 1754, 379, 1, 0, 0, 0, 1755, 1756, 7, 19, 0, 0, 1756, 1757, 7, 7, 0, 0, 1757, 1758, 7, 33, 0, 0, 1758, 381, 1, 0, 0, 0, 1759, 1760, 3, 266, 123, 0, 1760, 1761, 1, 0, 0, 0, 1761, 1762, 6, 181, 30, 0, 1762, 1763, 6, 181, 19, 0, 1763, 1764, 6, 181, 4, 0, 1764, 383, 1, 0, 0, 0, 1765, 1766, 3, 232, 106, 0, 1766, 1767, 1, 0, 0, 0, 1767, 1768, 6, 182, 24, 0, 1768, 385, 1, 0, 0, 0, 1769, 1770, 3, 236, 108, 0, 1770, 1771, 1, 0, 0, 0, 1771, 1772, 6, 183, 23, 0, 1772, 387, 1, 0, 0, 0, 1773, 1774, 3, 260, 120, 0, 1774, 1775, 1, 0, 0, 0, 1775, 1776, 6, 184, 35, 0, 1776, 389, 1, 0, 0, 0, 1777, 1778, 3, 300, 140, 0, 1778, 1779, 1, 0, 0, 0, 1779, 1780, 6, 185, 36, 0, 1780, 391, 1, 0, 0, 0, 1781, 1782, 3, 296, 138, 0, 1782, 1783, 1, 0, 0, 0, 1783, 1784, 6, 186, 37, 0, 1784, 393, 1, 0, 0, 0, 1785, 1786, 3, 302, 141, 0, 1786, 1787, 1, 0, 0, 0, 1787, 1788, 6, 187, 38, 0, 1788, 395, 1, 0, 0, 0, 1789, 1790, 3, 224, 102, 0, 1790, 1791, 1, 0, 0, 0, 1791, 1792, 6, 188, 45, 0, 1792, 397, 1, 0, 0, 0, 1793, 1794, 3, 316, 148, 0, 1794, 1795, 1, 0, 0, 0, 1795, 1796, 6, 189, 27, 0, 1796, 399, 1, 0, 0, 0, 1797, 1798, 3, 312, 146, 0, 1798, 1799, 1, 0, 0, 0, 1799, 1800, 6, 190, 28, 0, 1800, 401, 1, 0, 0, 0, 1801, 1802, 3, 20, 0, 0, 1802, 1803, 1, 0, 0, 0, 1803, 1804, 6, 191, 0, 0, 1804, 403, 1, 0, 0, 0, 1805, 1806, 3, 22, 1, 0, 1806, 1807, 1, 0, 0, 0, 1807, 1808, 6, 192, 0, 0, 1808, 405, 1, 0, 0, 0, 1809, 1810, 3, 24, 2, 0, 1810, 1811, 1, 0, 0, 0, 1811, 1812, 6, 193, 0, 0, 1812, 407, 1, 0, 0, 0, 1813, 1814, 7, 17, 0, 0, 1814, 1815, 7, 11, 0, 0, 1815, 1816, 7, 4, 0, 0, 1816, 1817, 7, 11, 0, 0, 1817, 1818, 7, 17, 0, 0, 1818, 1819, 1, 0, 0, 0, 1819, 1820, 6, 194, 19, 0, 1820, 1821, 6, 194, 4, 0, 1821, 409, 1, 0, 0, 0, 1822, 1823, 3, 20, 0, 0, 1823, 1824, 1, 0, 0, 0, 1824, 1825, 6, 195, 0, 0, 1825, 411, 1, 0, 0, 0, 1826, 1827, 3, 22, 1, 0, 1827, 1828, 1, 0, 0, 0, 1828, 1829, 6, 196, 0, 0, 1829, 413, 1, 0, 0, 0, 1830, 1831, 3, 24, 2, 0, 1831, 1832, 1, 0, 0, 0, 1832, 1833, 6, 197, 0, 0, 1833, 415, 1, 0, 0, 0, 1834, 1835, 3, 190, 85, 0, 1835, 1836, 1, 0, 0, 0, 1836, 1837, 6, 198, 18, 0, 1837, 1838, 6, 198, 19, 0, 1838, 417, 1, 0, 0, 0, 1839, 1840, 7, 36, 0, 0, 1840, 1841, 7, 9, 0, 0, 1841, 1842, 7, 10, 0, 0, 1842, 1843, 7, 5, 0, 0, 1843, 419, 1, 0, 0, 0, 1844, 1845, 3, 634, 307, 0, 1845, 1846, 1, 0, 0, 0, 1846, 1847, 6, 200, 22, 0, 1847, 421, 1, 0, 0, 0, 1848, 1849, 3, 256, 118, 0, 1849, 1850, 1, 0, 0, 0, 1850, 1851, 6, 201, 21, 0, 1851, 1852, 6, 201, 19, 0, 1852, 1853, 6, 201, 4, 0, 1853, 423, 1, 0, 0, 0, 1854, 1855, 7, 22, 0, 0, 1855, 1856, 7, 17, 0, 0, 1856, 1857, 7, 10, 0, 0, 1857, 1858, 7, 5, 0, 0, 1858, 1859, 7, 6, 0, 0, 1859, 1860, 1, 0, 0, 0, 1860, 1861, 6, 202, 19, 0, 1861, 1862, 6, 202, 4, 0, 1862, 425, 1, 0, 0, 0, 1863, 1864, 3, 348, 164, 0, 1864, 1865, 1, 0, 0, 0, 1865, 1866, 6, 203, 44, 0, 1866, 427, 1, 0, 0, 0, 1867, 1868, 3, 212, 96, 0, 1868, 1869, 1, 0, 0, 0, 1869, 1870, 6, 204, 32, 0, 1870, 429, 1, 0, 0, 0, 1871, 1872, 3, 228, 104, 0, 1872, 1873, 1, 0, 0, 0, 1873, 1874, 6, 205, 42, 0, 1874, 431, 1, 0, 0, 0, 1875, 1876, 3, 20, 0, 0, 1876, 1877, 1, 0, 0, 0, 1877, 1878, 6, 206, 0, 0, 1878, 433, 1, 0, 0, 0, 1879, 1880, 3, 22, 1, 0, 1880, 1881, 1, 0, 0, 0, 1881, 1882, 6, 207, 0, 0, 1882, 435, 1, 0, 0, 0, 1883, 1884, 3, 24, 2, 0, 1884, 1885, 1, 0, 0, 0, 1885, 1886, 6, 208, 0, 0, 1886, 437, 1, 0, 0, 0, 1887, 1888, 3, 190, 85, 0, 1888, 1889, 1, 0, 0, 0, 1889, 1890, 6, 209, 18, 0, 1890, 1891, 6, 209, 19, 0, 1891, 439, 1, 0, 0, 0, 1892, 1893, 3, 310, 145, 0, 1893, 1894, 1, 0, 0, 0, 1894, 1895, 6, 210, 20, 0, 1895, 1896, 6, 210, 19, 0, 1896, 1897, 6, 210, 19, 0, 1897, 441, 1, 0, 0, 0, 1898, 1899, 3, 228, 104, 0, 1899, 1900, 1, 0, 0, 0, 1900, 1901, 6, 211, 42, 0, 1901, 443, 1, 0, 0, 0, 1902, 1903, 3, 232, 106, 0, 1903, 1904, 1, 0, 0, 0, 1904, 1905, 6, 212, 24, 0, 1905, 445, 1, 0, 0, 0, 1906, 1907, 3, 236, 108, 0, 1907, 1908, 1, 0, 0, 0, 1908, 1909, 6, 213, 23, 0, 1909, 447, 1, 0, 0, 0, 1910, 1911, 3, 256, 118, 0, 1911, 1912, 1, 0, 0, 0, 1912, 1913, 6, 214, 21, 0, 1913, 1914, 6, 214, 46, 0, 1914, 449, 1, 0, 0, 0, 1915, 1916, 3, 348, 164, 0, 1916, 1917, 1, 0, 0, 0, 1917, 1918, 6, 215, 44, 0, 1918, 451, 1, 0, 0, 0, 1919, 1920, 3, 212, 96, 0, 1920, 1921, 1, 0, 0, 0, 1921, 1922, 6, 216, 32, 0, 1922, 453, 1, 0, 0, 0, 1923, 1924, 3, 20, 0, 0, 1924, 1925, 1, 0, 0, 0, 1925, 1926, 6, 217, 0, 0, 1926, 455, 1, 0, 0, 0, 1927, 1928, 3, 22, 1, 0, 1928, 1929, 1, 0, 0, 0, 1929, 1930, 6, 218, 0, 0, 1930, 457, 1, 0, 0, 0, 1931, 1932, 3, 24, 2, 0, 1932, 1933, 1, 0, 0, 0, 1933, 1934, 6, 219, 0, 0, 1934, 459, 1, 0, 0, 0, 1935, 1936, 3, 190, 85, 0, 1936, 1937, 1, 0, 0, 0, 1937, 1938, 6, 220, 18, 0, 1938, 1939, 6, 220, 19, 0, 1939, 1940, 6, 220, 19, 0, 1940, 461, 1, 0, 0, 0, 1941, 1942, 3, 310, 145, 0, 1942, 1943, 1, 0, 0, 0, 1943, 1944, 6, 221, 20, 0, 1944, 1945, 6, 221, 19, 0, 1945, 1946, 6, 221, 19, 0, 1946, 1947, 6, 221, 19, 0, 1947, 463, 1, 0, 0, 0, 1948, 1949, 3, 232, 106, 0, 1949, 1950, 1, 0, 0, 0, 1950, 1951, 6, 222, 24, 0, 1951, 465, 1, 0, 0, 0, 1952, 1953, 3, 236, 108, 0, 1953, 1954, 1, 0, 0, 0, 1954, 1955, 6, 223, 23, 0, 1955, 467, 1, 0, 0, 0, 1956, 1957, 3, 566, 273, 0, 1957, 1958, 1, 0, 0, 0, 1958, 1959, 6, 224, 34, 0, 1959, 469, 1, 0, 0, 0, 1960, 1961, 3, 20, 0, 0, 1961, 1962, 1, 0, 0, 0, 1962, 1963, 6, 225, 0, 0, 1963, 471, 1, 0, 0, 0, 1964, 1965, 3, 22, 1, 0, 1965, 1966, 1, 0, 0, 0, 1966, 1967, 6, 226, 0, 0, 1967, 473, 1, 0, 0, 0, 1968, 1969, 3, 24, 2, 0, 1969, 1970, 1, 0, 0, 0, 1970, 1971, 6, 227, 0, 0, 1971, 475, 1, 0, 0, 0, 1972, 1973, 3, 40, 10, 0, 1973, 1974, 1, 0, 0, 0, 1974, 1975, 6, 228, 19, 0, 1975, 1976, 6, 228, 4, 0, 1976, 477, 1, 0, 0, 0, 1977, 1978, 3, 256, 118, 0, 1978, 1979, 1, 0, 0, 0, 1979, 1980, 6, 229, 21, 0, 1980, 479, 1, 0, 0, 0, 1981, 1982, 3, 312, 146, 0, 1982, 1983, 1, 0, 0, 0, 1983, 1984, 6, 230, 28, 0, 1984, 481, 1, 0, 0, 0, 1985, 1986, 3, 304, 142, 0, 1986, 1987, 1, 0, 0, 0, 1987, 1988, 6, 231, 25, 0, 1988, 483, 1, 0, 0, 0, 1989, 1990, 3, 306, 143, 0, 1990, 1991, 1, 0, 0, 0, 1991, 1992, 6, 232, 26, 0, 1992, 485, 1, 0, 0, 0, 1993, 1994, 3, 232, 106, 0, 1994, 1995, 1, 0, 0, 0, 1995, 1996, 6, 233, 24, 0, 1996, 487, 1, 0, 0, 0, 1997, 1998, 3, 282, 131, 0, 1998, 1999, 1, 0, 0, 0, 1999, 2000, 6, 234, 47, 0, 2000, 489, 1, 0, 0, 0, 2001, 2002, 3, 284, 132, 0, 2002, 2003, 1, 0, 0, 0, 2003, 2004, 6, 235, 48, 0, 2004, 491, 1, 0, 0, 0, 2005, 2006, 3, 216, 98, 0, 2006, 2007, 1, 0, 0, 0, 2007, 2008, 6, 236, 49, 0, 2008, 493, 1, 0, 0, 0, 2009, 2010, 3, 214, 97, 0, 2010, 2011, 1, 0, 0, 0, 2011, 2012, 6, 237, 50, 0, 2012, 495, 1, 0, 0, 0, 2013, 2014, 3, 260, 120, 0, 2014, 2015, 1, 0, 0, 0, 2015, 2016, 6, 238, 35, 0, 2016, 497, 1, 0, 0, 0, 2017, 2018, 3, 300, 140, 0, 2018, 2019, 1, 0, 0, 0, 2019, 2020, 6, 239, 36, 0, 2020, 499, 1, 0, 0, 0, 2021, 2022, 3, 308, 144, 0, 2022, 2023, 1, 0, 0, 0, 2023, 2024, 6, 240, 39, 0, 2024, 501, 1, 0, 0, 0, 2025, 2026, 3, 310, 145, 0, 2026, 2027, 1, 0, 0, 0, 2027, 2028, 6, 241, 20, 0, 2028, 503, 1, 0, 0, 0, 2029, 2030, 3, 212, 96, 0, 2030, 2031, 1, 0, 0, 0, 2031, 2032, 6, 242, 32, 0, 2032, 505, 1, 0, 0, 0, 2033, 2034, 3, 226, 103, 0, 2034, 2035, 1, 0, 0, 0, 2035, 2036, 6, 243, 43, 0, 2036, 507, 1, 0, 0, 0, 2037, 2038, 3, 20, 0, 0, 2038, 2039, 1, 0, 0, 0, 2039, 2040, 6, 244, 0, 0, 2040, 509, 1, 0, 0, 0, 2041, 2042, 3, 22, 1, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2044, 6, 245, 0, 0, 2044, 511, 1, 0, 0, 0, 2045, 2046, 3, 24, 2, 0, 2046, 2047, 1, 0, 0, 0, 2047, 2048, 6, 246, 0, 0, 2048, 513, 1, 0, 0, 0, 2049, 2050, 3, 190, 85, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2052, 6, 247, 18, 0, 2052, 2053, 6, 247, 19, 0, 2053, 515, 1, 0, 0, 0, 2054, 2055, 3, 310, 145, 0, 2055, 2056, 1, 0, 0, 0, 2056, 2057, 6, 248, 20, 0, 2057, 2058, 6, 248, 19, 0, 2058, 2059, 6, 248, 19, 0, 2059, 517, 1, 0, 0, 0, 2060, 2061, 3, 304, 142, 0, 2061, 2062, 1, 0, 0, 0, 2062, 2063, 6, 249, 25, 0, 2063, 519, 1, 0, 0, 0, 2064, 2065, 3, 306, 143, 0, 2065, 2066, 1, 0, 0, 0, 2066, 2067, 6, 250, 26, 0, 2067, 521, 1, 0, 0, 0, 2068, 2069, 3, 236, 108, 0, 2069, 2070, 1, 0, 0, 0, 2070, 2071, 6, 251, 23, 0, 2071, 523, 1, 0, 0, 0, 2072, 2073, 3, 260, 120, 0, 2073, 2074, 1, 0, 0, 0, 2074, 2075, 6, 252, 35, 0, 2075, 525, 1, 0, 0, 0, 2076, 2077, 3, 300, 140, 0, 2077, 2078, 1, 0, 0, 0, 2078, 2079, 6, 253, 36, 0, 2079, 527, 1, 0, 0, 0, 2080, 2081, 3, 296, 138, 0, 2081, 2082, 1, 0, 0, 0, 2082, 2083, 6, 254, 37, 0, 2083, 529, 1, 0, 0, 0, 2084, 2085, 3, 302, 141, 0, 2085, 2086, 1, 0, 0, 0, 2086, 2087, 6, 255, 38, 0, 2087, 531, 1, 0, 0, 0, 2088, 2089, 3, 316, 148, 0, 2089, 2090, 1, 0, 0, 0, 2090, 2091, 6, 256, 27, 0, 2091, 533, 1, 0, 0, 0, 2092, 2093, 3, 312, 146, 0, 2093, 2094, 1, 0, 0, 0, 2094, 2095, 6, 257, 28, 0, 2095, 535, 1, 0, 0, 0, 2096, 2097, 3, 20, 0, 0, 2097, 2098, 1, 0, 0, 0, 2098, 2099, 6, 258, 0, 0, 2099, 537, 1, 0, 0, 0, 2100, 2101, 3, 22, 1, 0, 2101, 2102, 1, 0, 0, 0, 2102, 2103, 6, 259, 0, 0, 2103, 539, 1, 0, 0, 0, 2104, 2105, 3, 24, 2, 0, 2105, 2106, 1, 0, 0, 0, 2106, 2107, 6, 260, 0, 0, 2107, 541, 1, 0, 0, 0, 2108, 2109, 3, 190, 85, 0, 2109, 2110, 1, 0, 0, 0, 2110, 2111, 6, 261, 18, 0, 2111, 2112, 6, 261, 19, 0, 2112, 543, 1, 0, 0, 0, 2113, 2114, 3, 310, 145, 0, 2114, 2115, 1, 0, 0, 0, 2115, 2116, 6, 262, 20, 0, 2116, 2117, 6, 262, 19, 0, 2117, 2118, 6, 262, 19, 0, 2118, 545, 1, 0, 0, 0, 2119, 2120, 3, 236, 108, 0, 2120, 2121, 1, 0, 0, 0, 2121, 2122, 6, 263, 23, 0, 2122, 547, 1, 0, 0, 0, 2123, 2124, 3, 304, 142, 0, 2124, 2125, 1, 0, 0, 0, 2125, 2126, 6, 264, 25, 0, 2126, 549, 1, 0, 0, 0, 2127, 2128, 3, 306, 143, 0, 2128, 2129, 1, 0, 0, 0, 2129, 2130, 6, 265, 26, 0, 2130, 551, 1, 0, 0, 0, 2131, 2132, 3, 232, 106, 0, 2132, 2133, 1, 0, 0, 0, 2133, 2134, 6, 266, 24, 0, 2134, 553, 1, 0, 0, 0, 2135, 2136, 3, 260, 120, 0, 2136, 2137, 1, 0, 0, 0, 2137, 2138, 6, 267, 35, 0, 2138, 555, 1, 0, 0, 0, 2139, 2140, 3, 300, 140, 0, 2140, 2141, 1, 0, 0, 0, 2141, 2142, 6, 268, 36, 0, 2142, 557, 1, 0, 0, 0, 2143, 2144, 3, 296, 138, 0, 2144, 2145, 1, 0, 0, 0, 2145, 2146, 6, 269, 37, 0, 2146, 559, 1, 0, 0, 0, 2147, 2148, 3, 302, 141, 0, 2148, 2149, 1, 0, 0, 0, 2149, 2150, 6, 270, 38, 0, 2150, 561, 1, 0, 0, 0, 2151, 2156, 3, 194, 87, 0, 2152, 2156, 3, 192, 86, 0, 2153, 2156, 3, 208, 94, 0, 2154, 2156, 3, 286, 133, 0, 2155, 2151, 1, 0, 0, 0, 2155, 2152, 1, 0, 0, 0, 2155, 2153, 1, 0, 0, 0, 2155, 2154, 1, 0, 0, 0, 2156, 563, 1, 0, 0, 0, 2157, 2160, 3, 194, 87, 0, 2158, 2160, 3, 286, 133, 0, 2159, 2157, 1, 0, 0, 0, 2159, 2158, 1, 0, 0, 0, 2160, 2164, 1, 0, 0, 0, 2161, 2163, 3, 562, 271, 0, 2162, 2161, 1, 0, 0, 0, 2163, 2166, 1, 0, 0, 0, 2164, 2162, 1, 0, 0, 0, 2164, 2165, 1, 0, 0, 0, 2165, 2177, 1, 0, 0, 0, 2166, 2164, 1, 0, 0, 0, 2167, 2170, 3, 208, 94, 0, 2168, 2170, 3, 202, 91, 0, 2169, 2167, 1, 0, 0, 0, 2169, 2168, 1, 0, 0, 0, 2170, 2172, 1, 0, 0, 0, 2171, 2173, 3, 562, 271, 0, 2172, 2171, 1, 0, 0, 0, 2173, 2174, 1, 0, 0, 0, 2174, 2172, 1, 0, 0, 0, 2174, 2175, 1, 0, 0, 0, 2175, 2177, 1, 0, 0, 0, 2176, 2159, 1, 0, 0, 0, 2176, 2169, 1, 0, 0, 0, 2177, 565, 1, 0, 0, 0, 2178, 2181, 3, 564, 272, 0, 2179, 2181, 3, 314, 147, 0, 2180, 2178, 1, 0, 0, 0, 2180, 2179, 1, 0, 0, 0, 2181, 2182, 1, 0, 0, 0, 2182, 2180, 1, 0, 0, 0, 2182, 2183, 1, 0, 0, 0, 2183, 567, 1, 0, 0, 0, 2184, 2185, 3, 20, 0, 0, 2185, 2186, 1, 0, 0, 0, 2186, 2187, 6, 274, 0, 0, 2187, 569, 1, 0, 0, 0, 2188, 2189, 3, 22, 1, 0, 2189, 2190, 1, 0, 0, 0, 2190, 2191, 6, 275, 0, 0, 2191, 571, 1, 0, 0, 0, 2192, 2193, 3, 24, 2, 0, 2193, 2194, 1, 0, 0, 0, 2194, 2195, 6, 276, 0, 0, 2195, 573, 1, 0, 0, 0, 2196, 2197, 3, 312, 146, 0, 2197, 2198, 1, 0, 0, 0, 2198, 2199, 6, 277, 28, 0, 2199, 575, 1, 0, 0, 0, 2200, 2201, 3, 316, 148, 0, 2201, 2202, 1, 0, 0, 0, 2202, 2203, 6, 278, 27, 0, 2203, 577, 1, 0, 0, 0, 2204, 2205, 3, 222, 101, 0, 2205, 2206, 1, 0, 0, 0, 2206, 2207, 6, 279, 33, 0, 2207, 579, 1, 0, 0, 0, 2208, 2209, 3, 300, 140, 0, 2209, 2210, 1, 0, 0, 0, 2210, 2211, 6, 280, 36, 0, 2211, 581, 1, 0, 0, 0, 2212, 2213, 3, 348, 164, 0, 2213, 2214, 1, 0, 0, 0, 2214, 2215, 6, 281, 44, 0, 2215, 583, 1, 0, 0, 0, 2216, 2217, 3, 212, 96, 0, 2217, 2218, 1, 0, 0, 0, 2218, 2219, 6, 282, 32, 0, 2219, 585, 1, 0, 0, 0, 2220, 2221, 3, 228, 104, 0, 2221, 2222, 1, 0, 0, 0, 2222, 2223, 6, 283, 42, 0, 2223, 587, 1, 0, 0, 0, 2224, 2225, 3, 226, 103, 0, 2225, 2226, 1, 0, 0, 0, 2226, 2227, 6, 284, 43, 0, 2227, 589, 1, 0, 0, 0, 2228, 2229, 3, 232, 106, 0, 2229, 2230, 1, 0, 0, 0, 2230, 2231, 6, 285, 24, 0, 2231, 591, 1, 0, 0, 0, 2232, 2233, 3, 190, 85, 0, 2233, 2234, 1, 0, 0, 0, 2234, 2235, 6, 286, 18, 0, 2235, 2236, 6, 286, 19, 0, 2236, 593, 1, 0, 0, 0, 2237, 2238, 3, 308, 144, 0, 2238, 2239, 6, 287, 51, 0, 2239, 2240, 1, 0, 0, 0, 2240, 2241, 6, 287, 39, 0, 2241, 595, 1, 0, 0, 0, 2242, 2243, 5, 41, 0, 0, 2243, 2244, 4, 288, 8, 0, 2244, 2245, 6, 288, 52, 0, 2245, 2246, 1, 0, 0, 0, 2246, 2247, 6, 288, 20, 0, 2247, 597, 1, 0, 0, 0, 2248, 2249, 5, 41, 0, 0, 2249, 2250, 4, 289, 9, 0, 2250, 2251, 6, 289, 53, 0, 2251, 2252, 1, 0, 0, 0, 2252, 2253, 6, 289, 20, 0, 2253, 2254, 6, 289, 19, 0, 2254, 599, 1, 0, 0, 0, 2255, 2256, 3, 20, 0, 0, 2256, 2257, 1, 0, 0, 0, 2257, 2258, 6, 290, 0, 0, 2258, 601, 1, 0, 0, 0, 2259, 2260, 3, 22, 1, 0, 2260, 2261, 1, 0, 0, 0, 2261, 2262, 6, 291, 0, 0, 2262, 603, 1, 0, 0, 0, 2263, 2264, 3, 24, 2, 0, 2264, 2265, 1, 0, 0, 0, 2265, 2266, 6, 292, 0, 0, 2266, 605, 1, 0, 0, 0, 2267, 2271, 5, 35, 0, 0, 2268, 2270, 8, 0, 0, 0, 2269, 2268, 1, 0, 0, 0, 2270, 2273, 1, 0, 0, 0, 2271, 2269, 1, 0, 0, 0, 2271, 2272, 1, 0, 0, 0, 2272, 2275, 1, 0, 0, 0, 2273, 2271, 1, 0, 0, 0, 2274, 2276, 5, 13, 0, 0, 2275, 2274, 1, 0, 0, 0, 2275, 2276, 1, 0, 0, 0, 2276, 2278, 1, 0, 0, 0, 2277, 2279, 5, 10, 0, 0, 2278, 2277, 1, 0, 0, 0, 2278, 2279, 1, 0, 0, 0, 2279, 607, 1, 0, 0, 0, 2280, 2286, 5, 39, 0, 0, 2281, 2282, 5, 92, 0, 0, 2282, 2285, 9, 0, 0, 0, 2283, 2285, 8, 37, 0, 0, 2284, 2281, 1, 0, 0, 0, 2284, 2283, 1, 0, 0, 0, 2285, 2288, 1, 0, 0, 0, 2286, 2284, 1, 0, 0, 0, 2286, 2287, 1, 0, 0, 0, 2287, 2289, 1, 0, 0, 0, 2288, 2286, 1, 0, 0, 0, 2289, 2290, 5, 39, 0, 0, 2290, 609, 1, 0, 0, 0, 2291, 2292, 8, 38, 0, 0, 2292, 611, 1, 0, 0, 0, 2293, 2294, 3, 190, 85, 0, 2294, 2295, 1, 0, 0, 0, 2295, 2296, 6, 296, 18, 0, 2296, 2297, 6, 296, 19, 0, 2297, 613, 1, 0, 0, 0, 2298, 2299, 3, 310, 145, 0, 2299, 2300, 1, 0, 0, 0, 2300, 2301, 6, 297, 20, 0, 2301, 2302, 6, 297, 19, 0, 2302, 2303, 6, 297, 19, 0, 2303, 615, 1, 0, 0, 0, 2304, 2305, 3, 304, 142, 0, 2305, 2306, 1, 0, 0, 0, 2306, 2307, 6, 298, 25, 0, 2307, 617, 1, 0, 0, 0, 2308, 2309, 3, 306, 143, 0, 2309, 2310, 1, 0, 0, 0, 2310, 2311, 6, 299, 26, 0, 2311, 619, 1, 0, 0, 0, 2312, 2313, 3, 222, 101, 0, 2313, 2314, 1, 0, 0, 0, 2314, 2315, 6, 300, 33, 0, 2315, 621, 1, 0, 0, 0, 2316, 2317, 3, 232, 106, 0, 2317, 2318, 1, 0, 0, 0, 2318, 2319, 6, 301, 24, 0, 2319, 623, 1, 0, 0, 0, 2320, 2321, 3, 236, 108, 0, 2321, 2322, 1, 0, 0, 0, 2322, 2323, 6, 302, 23, 0, 2323, 625, 1, 0, 0, 0, 2324, 2325, 3, 260, 120, 0, 2325, 2326, 1, 0, 0, 0, 2326, 2327, 6, 303, 35, 0, 2327, 627, 1, 0, 0, 0, 2328, 2329, 3, 300, 140, 0, 2329, 2330, 1, 0, 0, 0, 2330, 2331, 6, 304, 36, 0, 2331, 629, 1, 0, 0, 0, 2332, 2333, 3, 296, 138, 0, 2333, 2334, 1, 0, 0, 0, 2334, 2335, 6, 305, 37, 0, 2335, 631, 1, 0, 0, 0, 2336, 2337, 3, 302, 141, 0, 2337, 2338, 1, 0, 0, 0, 2338, 2339, 6, 306, 38, 0, 2339, 633, 1, 0, 0, 0, 2340, 2341, 7, 4, 0, 0, 2341, 2342, 7, 17, 0, 0, 2342, 635, 1, 0, 0, 0, 2343, 2344, 3, 566, 273, 0, 2344, 2345, 1, 0, 0, 0, 2345, 2346, 6, 308, 34, 0, 2346, 637, 1, 0, 0, 0, 2347, 2348, 3, 20, 0, 0, 2348, 2349, 1, 0, 0, 0, 2349, 2350, 6, 309, 0, 0, 2350, 639, 1, 0, 0, 0, 2351, 2352, 3, 22, 1, 0, 2352, 2353, 1, 0, 0, 0, 2353, 2354, 6, 310, 0, 0, 2354, 641, 1, 0, 0, 0, 2355, 2356, 3, 24, 2, 0, 2356, 2357, 1, 0, 0, 0, 2357, 2358, 6, 311, 0, 0, 2358, 643, 1, 0, 0, 0, 2359, 2360, 3, 264, 122, 0, 2360, 2361, 1, 0, 0, 0, 2361, 2362, 6, 312, 54, 0, 2362, 645, 1, 0, 0, 0, 2363, 2364, 3, 238, 109, 0, 2364, 2365, 1, 0, 0, 0, 2365, 2366, 6, 313, 55, 0, 2366, 647, 1, 0, 0, 0, 2367, 2368, 3, 252, 116, 0, 2368, 2369, 1, 0, 0, 0, 2369, 2370, 6, 314, 56, 0, 2370, 649, 1, 0, 0, 0, 2371, 2372, 3, 230, 105, 0, 2372, 2373, 1, 0, 0, 0, 2373, 2374, 6, 315, 57, 0, 2374, 2375, 6, 315, 19, 0, 2375, 651, 1, 0, 0, 0, 2376, 2377, 3, 222, 101, 0, 2377, 2378, 1, 0, 0, 0, 2378, 2379, 6, 316, 33, 0, 2379, 653, 1, 0, 0, 0, 2380, 2381, 3, 212, 96, 0, 2381, 2382, 1, 0, 0, 0, 2382, 2383, 6, 317, 32, 0, 2383, 655, 1, 0, 0, 0, 2384, 2385, 3, 312, 146, 0, 2385, 2386, 1, 0, 0, 0, 2386, 2387, 6, 318, 28, 0, 2387, 657, 1, 0, 0, 0, 2388, 2389, 3, 316, 148, 0, 2389, 2390, 1, 0, 0, 0, 2390, 2391, 6, 319, 27, 0, 2391, 659, 1, 0, 0, 0, 2392, 2393, 3, 216, 98, 0, 2393, 2394, 1, 0, 0, 0, 2394, 2395, 6, 320, 49, 0, 2395, 661, 1, 0, 0, 0, 2396, 2397, 3, 214, 97, 0, 2397, 2398, 1, 0, 0, 0, 2398, 2399, 6, 321, 50, 0, 2399, 663, 1, 0, 0, 0, 2400, 2401, 3, 228, 104, 0, 2401, 2402, 1, 0, 0, 0, 2402, 2403, 6, 322, 42, 0, 2403, 665, 1, 0, 0, 0, 2404, 2405, 3, 232, 106, 0, 2405, 2406, 1, 0, 0, 0, 2406, 2407, 6, 323, 24, 0, 2407, 667, 1, 0, 0, 0, 2408, 2409, 3, 236, 108, 0, 2409, 2410, 1, 0, 0, 0, 2410, 2411, 6, 324, 23, 0, 2411, 669, 1, 0, 0, 0, 2412, 2413, 3, 260, 120, 0, 2413, 2414, 1, 0, 0, 0, 2414, 2415, 6, 325, 35, 0, 2415, 671, 1, 0, 0, 0, 2416, 2417, 3, 300, 140, 0, 2417, 2418, 1, 0, 0, 0, 2418, 2419, 6, 326, 36, 0, 2419, 673, 1, 0, 0, 0, 2420, 2421, 3, 292, 136, 0, 2421, 2422, 1, 0, 0, 0, 2422, 2423, 6, 327, 58, 0, 2423, 675, 1, 0, 0, 0, 2424, 2425, 3, 294, 137, 0, 2425, 2426, 1, 0, 0, 0, 2426, 2427, 6, 328, 59, 0, 2427, 677, 1, 0, 0, 0, 2428, 2429, 3, 296, 138, 0, 2429, 2430, 1, 0, 0, 0, 2430, 2431, 6, 329, 37, 0, 2431, 679, 1, 0, 0, 0, 2432, 2433, 3, 302, 141, 0, 2433, 2434, 1, 0, 0, 0, 2434, 2435, 6, 330, 38, 0, 2435, 681, 1, 0, 0, 0, 2436, 2437, 3, 304, 142, 0, 2437, 2438, 1, 0, 0, 0, 2438, 2439, 6, 331, 25, 0, 2439, 683, 1, 0, 0, 0, 2440, 2441, 3, 306, 143, 0, 2441, 2442, 1, 0, 0, 0, 2442, 2443, 6, 332, 26, 0, 2443, 685, 1, 0, 0, 0, 2444, 2445, 3, 566, 273, 0, 2445, 2446, 1, 0, 0, 0, 2446, 2447, 6, 333, 34, 0, 2447, 687, 1, 0, 0, 0, 2448, 2449, 3, 20, 0, 0, 2449, 2450, 1, 0, 0, 0, 2450, 2451, 6, 334, 0, 0, 2451, 689, 1, 0, 0, 0, 2452, 2453, 3, 22, 1, 0, 2453, 2454, 1, 0, 0, 0, 2454, 2455, 6, 335, 0, 0, 2455, 691, 1, 0, 0, 0, 2456, 2457, 3, 24, 2, 0, 2457, 2458, 1, 0, 0, 0, 2458, 2459, 6, 336, 0, 0, 2459, 693, 1, 0, 0, 0, 2460, 2461, 3, 190, 85, 0, 2461, 2462, 1, 0, 0, 0, 2462, 2463, 6, 337, 18, 0, 2463, 2464, 6, 337, 19, 0, 2464, 695, 1, 0, 0, 0, 2465, 2466, 7, 10, 0, 0, 2466, 2467, 7, 5, 0, 0, 2467, 2468, 7, 21, 0, 0, 2468, 2469, 7, 9, 0, 0, 2469, 697, 1, 0, 0, 0, 2470, 2471, 3, 20, 0, 0, 2471, 2472, 1, 0, 0, 0, 2472, 2473, 6, 339, 0, 0, 2473, 699, 1, 0, 0, 0, 2474, 2475, 3, 22, 1, 0, 2475, 2476, 1, 0, 0, 0, 2476, 2477, 6, 340, 0, 0, 2477, 701, 1, 0, 0, 0, 2478, 2479, 3, 24, 2, 0, 2479, 2480, 1, 0, 0, 0, 2480, 2481, 6, 341, 0, 0, 2481, 703, 1, 0, 0, 0, 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 710, 714, 717, 726, 728, 739, 1056, 1141, 1145, 1150, 1282, 1287, 1296, 1303, 1308, 1310, 1321, 1329, 1332, 1334, 1339, 1344, 1350, 1357, 1362, 1368, 1371, 1379, 1383, 1524, 1529, 1536, 1538, 1543, 1548, 1555, 1557, 1583, 1588, 1593, 1595, 1601, 1677, 1682, 2155, 2159, 2164, 2169, 2174, 2176, 2180, 2182, 2271, 2275, 2278, 2284, 2286, 60, 0, 1, 0, 5, 1, 0, 5, 2, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 11, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 5, 17, 0, 5, 18, 0, 5, 19, 0, 7, 53, 0, 4, 0, 0, 7, 102, 0, 7, 76, 0, 7, 154, 0, 7, 66, 0, 7, 64, 0, 7, 99, 0, 7, 100, 0, 7, 104, 0, 7, 103, 0, 5, 3, 0, 7, 81, 0, 7, 43, 0, 7, 54, 0, 7, 59, 0, 7, 144, 0, 7, 78, 0, 7, 97, 0, 7, 96, 0, 7, 98, 0, 7, 101, 0, 5, 0, 0, 7, 17, 0, 7, 62, 0, 7, 61, 0, 7, 109, 0, 7, 60, 0, 5, 12, 0, 7, 89, 0, 7, 90, 0, 7, 56, 0, 7, 55, 0, 1, 287, 0, 1, 288, 1, 1, 289, 2, 7, 80, 0, 7, 67, 0, 7, 74, 0, 7, 63, 0, 7, 94, 0, 7, 95, 0] \ No newline at end of file +[4, 0, 165, 2496, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 711, 8, 0, 10, 0, 12, 0, 714, 9, 0, 1, 0, 3, 0, 717, 8, 0, 1, 0, 3, 0, 720, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 729, 8, 1, 10, 1, 12, 1, 732, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 740, 8, 2, 11, 2, 12, 2, 741, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 4, 39, 1069, 8, 39, 11, 39, 12, 39, 1070, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 4, 58, 1154, 8, 58, 11, 58, 12, 58, 1155, 1, 58, 1, 58, 3, 58, 1160, 8, 58, 1, 58, 4, 58, 1163, 8, 58, 11, 58, 12, 58, 1164, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 3, 91, 1297, 8, 91, 1, 91, 4, 91, 1300, 8, 91, 11, 91, 12, 91, 1301, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 3, 94, 1311, 8, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 3, 96, 1318, 8, 96, 1, 97, 1, 97, 1, 97, 5, 97, 1323, 8, 97, 10, 97, 12, 97, 1326, 9, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 1334, 8, 97, 10, 97, 12, 97, 1337, 9, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 1344, 8, 97, 1, 97, 3, 97, 1347, 8, 97, 3, 97, 1349, 8, 97, 1, 98, 4, 98, 1352, 8, 98, 11, 98, 12, 98, 1353, 1, 99, 4, 99, 1357, 8, 99, 11, 99, 12, 99, 1358, 1, 99, 1, 99, 5, 99, 1363, 8, 99, 10, 99, 12, 99, 1366, 9, 99, 1, 99, 1, 99, 4, 99, 1370, 8, 99, 11, 99, 12, 99, 1371, 1, 99, 4, 99, 1375, 8, 99, 11, 99, 12, 99, 1376, 1, 99, 1, 99, 5, 99, 1381, 8, 99, 10, 99, 12, 99, 1384, 9, 99, 3, 99, 1386, 8, 99, 1, 99, 1, 99, 1, 99, 1, 99, 4, 99, 1392, 8, 99, 11, 99, 12, 99, 1393, 1, 99, 1, 99, 3, 99, 1398, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 3, 141, 1539, 8, 141, 1, 141, 5, 141, 1542, 8, 141, 10, 141, 12, 141, 1545, 9, 141, 1, 141, 1, 141, 4, 141, 1549, 8, 141, 11, 141, 12, 141, 1550, 3, 141, 1553, 8, 141, 1, 142, 1, 142, 1, 142, 3, 142, 1558, 8, 142, 1, 142, 5, 142, 1561, 8, 142, 10, 142, 12, 142, 1564, 9, 142, 1, 142, 1, 142, 4, 142, 1568, 8, 142, 11, 142, 12, 142, 1569, 3, 142, 1572, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 5, 147, 1596, 8, 147, 10, 147, 12, 147, 1599, 9, 147, 1, 147, 1, 147, 3, 147, 1603, 8, 147, 1, 147, 4, 147, 1606, 8, 147, 11, 147, 12, 147, 1607, 3, 147, 1610, 8, 147, 1, 148, 1, 148, 4, 148, 1614, 8, 148, 11, 148, 12, 148, 1615, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 3, 164, 1692, 8, 164, 1, 165, 4, 165, 1695, 8, 165, 11, 165, 12, 165, 1696, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 3, 272, 2170, 8, 272, 1, 273, 1, 273, 3, 273, 2174, 8, 273, 1, 273, 5, 273, 2177, 8, 273, 10, 273, 12, 273, 2180, 9, 273, 1, 273, 1, 273, 3, 273, 2184, 8, 273, 1, 273, 4, 273, 2187, 8, 273, 11, 273, 12, 273, 2188, 3, 273, 2191, 8, 273, 1, 274, 1, 274, 4, 274, 2195, 8, 274, 11, 274, 12, 274, 2196, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 5, 294, 2284, 8, 294, 10, 294, 12, 294, 2287, 9, 294, 1, 294, 3, 294, 2290, 8, 294, 1, 294, 3, 294, 2293, 8, 294, 1, 295, 1, 295, 1, 295, 1, 295, 5, 295, 2299, 8, 295, 10, 295, 12, 295, 2302, 9, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 2, 730, 1335, 0, 343, 20, 1, 22, 2, 24, 3, 26, 4, 28, 5, 30, 6, 32, 7, 34, 8, 36, 9, 38, 10, 40, 11, 42, 12, 44, 13, 46, 14, 48, 15, 50, 16, 52, 17, 54, 18, 56, 19, 58, 20, 60, 21, 62, 22, 64, 23, 66, 24, 68, 25, 70, 26, 72, 27, 74, 28, 76, 29, 78, 30, 80, 31, 82, 32, 84, 33, 86, 34, 88, 35, 90, 36, 92, 37, 94, 38, 96, 39, 98, 40, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 0, 112, 0, 114, 0, 116, 0, 118, 0, 120, 41, 122, 42, 124, 43, 126, 0, 128, 0, 130, 0, 132, 0, 134, 0, 136, 44, 138, 0, 140, 0, 142, 45, 144, 46, 146, 47, 148, 0, 150, 0, 152, 0, 154, 0, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 0, 176, 48, 178, 49, 180, 50, 182, 0, 184, 0, 186, 51, 188, 52, 190, 53, 192, 54, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 0, 208, 0, 210, 0, 212, 0, 214, 55, 216, 56, 218, 57, 220, 58, 222, 59, 224, 60, 226, 61, 228, 62, 230, 63, 232, 64, 234, 65, 236, 66, 238, 67, 240, 68, 242, 69, 244, 70, 246, 71, 248, 72, 250, 73, 252, 74, 254, 75, 256, 76, 258, 77, 260, 78, 262, 79, 264, 80, 266, 81, 268, 82, 270, 83, 272, 84, 274, 85, 276, 86, 278, 87, 280, 88, 282, 89, 284, 90, 286, 91, 288, 92, 290, 93, 292, 94, 294, 95, 296, 96, 298, 97, 300, 0, 302, 98, 304, 99, 306, 100, 308, 101, 310, 102, 312, 103, 314, 104, 316, 0, 318, 105, 320, 106, 322, 107, 324, 108, 326, 0, 328, 0, 330, 0, 332, 0, 334, 0, 336, 109, 338, 0, 340, 0, 342, 0, 344, 0, 346, 0, 348, 0, 350, 110, 352, 0, 354, 0, 356, 111, 358, 112, 360, 113, 362, 0, 364, 0, 366, 0, 368, 114, 370, 115, 372, 116, 374, 0, 376, 0, 378, 117, 380, 118, 382, 119, 384, 0, 386, 0, 388, 0, 390, 0, 392, 0, 394, 0, 396, 0, 398, 0, 400, 0, 402, 0, 404, 120, 406, 121, 408, 122, 410, 123, 412, 124, 414, 125, 416, 126, 418, 0, 420, 127, 422, 0, 424, 0, 426, 128, 428, 0, 430, 0, 432, 0, 434, 129, 436, 130, 438, 131, 440, 0, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 132, 458, 133, 460, 134, 462, 0, 464, 0, 466, 0, 468, 0, 470, 0, 472, 135, 474, 136, 476, 137, 478, 138, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 0, 510, 139, 512, 140, 514, 141, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 142, 540, 143, 542, 144, 544, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 145, 570, 146, 572, 147, 574, 148, 576, 0, 578, 0, 580, 0, 582, 0, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 0, 602, 149, 604, 150, 606, 151, 608, 152, 610, 153, 612, 154, 614, 0, 616, 0, 618, 0, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 155, 638, 0, 640, 156, 642, 157, 644, 158, 646, 0, 648, 0, 650, 0, 652, 0, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 0, 690, 159, 692, 160, 694, 161, 696, 0, 698, 162, 700, 163, 702, 164, 704, 165, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 39, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 67, 67, 99, 99, 2, 0, 72, 72, 104, 104, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 71, 71, 103, 103, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 79, 79, 111, 111, 2, 0, 73, 73, 105, 105, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 88, 88, 120, 120, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 2, 0, 70, 70, 102, 102, 2, 0, 81, 81, 113, 113, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 12, 0, 9, 10, 13, 13, 32, 32, 34, 35, 40, 41, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 12, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 74, 74, 106, 106, 2, 0, 39, 39, 92, 92, 7, 0, 10, 10, 13, 13, 32, 32, 34, 35, 39, 41, 96, 96, 124, 124, 2523, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 3, 148, 1, 0, 0, 0, 3, 150, 1, 0, 0, 0, 3, 152, 1, 0, 0, 0, 3, 154, 1, 0, 0, 0, 3, 156, 1, 0, 0, 0, 3, 158, 1, 0, 0, 0, 3, 160, 1, 0, 0, 0, 3, 162, 1, 0, 0, 0, 3, 164, 1, 0, 0, 0, 3, 166, 1, 0, 0, 0, 3, 168, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 3, 172, 1, 0, 0, 0, 3, 174, 1, 0, 0, 0, 3, 176, 1, 0, 0, 0, 3, 178, 1, 0, 0, 0, 3, 180, 1, 0, 0, 0, 4, 182, 1, 0, 0, 0, 4, 184, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 4, 188, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 5, 192, 1, 0, 0, 0, 5, 214, 1, 0, 0, 0, 5, 216, 1, 0, 0, 0, 5, 218, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 5, 258, 1, 0, 0, 0, 5, 260, 1, 0, 0, 0, 5, 262, 1, 0, 0, 0, 5, 264, 1, 0, 0, 0, 5, 266, 1, 0, 0, 0, 5, 268, 1, 0, 0, 0, 5, 270, 1, 0, 0, 0, 5, 272, 1, 0, 0, 0, 5, 274, 1, 0, 0, 0, 5, 276, 1, 0, 0, 0, 5, 278, 1, 0, 0, 0, 5, 280, 1, 0, 0, 0, 5, 282, 1, 0, 0, 0, 5, 284, 1, 0, 0, 0, 5, 286, 1, 0, 0, 0, 5, 288, 1, 0, 0, 0, 5, 290, 1, 0, 0, 0, 5, 292, 1, 0, 0, 0, 5, 294, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 5, 298, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 5, 302, 1, 0, 0, 0, 5, 304, 1, 0, 0, 0, 5, 306, 1, 0, 0, 0, 5, 308, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 5, 314, 1, 0, 0, 0, 5, 318, 1, 0, 0, 0, 5, 320, 1, 0, 0, 0, 5, 322, 1, 0, 0, 0, 5, 324, 1, 0, 0, 0, 6, 326, 1, 0, 0, 0, 6, 328, 1, 0, 0, 0, 6, 330, 1, 0, 0, 0, 6, 332, 1, 0, 0, 0, 6, 334, 1, 0, 0, 0, 6, 336, 1, 0, 0, 0, 6, 338, 1, 0, 0, 0, 6, 340, 1, 0, 0, 0, 6, 342, 1, 0, 0, 0, 6, 344, 1, 0, 0, 0, 6, 346, 1, 0, 0, 0, 6, 350, 1, 0, 0, 0, 6, 352, 1, 0, 0, 0, 6, 354, 1, 0, 0, 0, 6, 356, 1, 0, 0, 0, 6, 358, 1, 0, 0, 0, 6, 360, 1, 0, 0, 0, 7, 362, 1, 0, 0, 0, 7, 364, 1, 0, 0, 0, 7, 366, 1, 0, 0, 0, 7, 368, 1, 0, 0, 0, 7, 370, 1, 0, 0, 0, 7, 372, 1, 0, 0, 0, 8, 374, 1, 0, 0, 0, 8, 376, 1, 0, 0, 0, 8, 378, 1, 0, 0, 0, 8, 380, 1, 0, 0, 0, 8, 382, 1, 0, 0, 0, 8, 384, 1, 0, 0, 0, 8, 386, 1, 0, 0, 0, 8, 388, 1, 0, 0, 0, 8, 390, 1, 0, 0, 0, 8, 392, 1, 0, 0, 0, 8, 394, 1, 0, 0, 0, 8, 396, 1, 0, 0, 0, 8, 398, 1, 0, 0, 0, 8, 400, 1, 0, 0, 0, 8, 402, 1, 0, 0, 0, 8, 404, 1, 0, 0, 0, 8, 406, 1, 0, 0, 0, 8, 408, 1, 0, 0, 0, 9, 410, 1, 0, 0, 0, 9, 412, 1, 0, 0, 0, 9, 414, 1, 0, 0, 0, 9, 416, 1, 0, 0, 0, 10, 418, 1, 0, 0, 0, 10, 420, 1, 0, 0, 0, 10, 422, 1, 0, 0, 0, 10, 424, 1, 0, 0, 0, 10, 426, 1, 0, 0, 0, 10, 428, 1, 0, 0, 0, 10, 430, 1, 0, 0, 0, 10, 432, 1, 0, 0, 0, 10, 434, 1, 0, 0, 0, 10, 436, 1, 0, 0, 0, 10, 438, 1, 0, 0, 0, 11, 440, 1, 0, 0, 0, 11, 442, 1, 0, 0, 0, 11, 444, 1, 0, 0, 0, 11, 446, 1, 0, 0, 0, 11, 448, 1, 0, 0, 0, 11, 450, 1, 0, 0, 0, 11, 452, 1, 0, 0, 0, 11, 454, 1, 0, 0, 0, 11, 456, 1, 0, 0, 0, 11, 458, 1, 0, 0, 0, 11, 460, 1, 0, 0, 0, 12, 462, 1, 0, 0, 0, 12, 464, 1, 0, 0, 0, 12, 466, 1, 0, 0, 0, 12, 468, 1, 0, 0, 0, 12, 470, 1, 0, 0, 0, 12, 472, 1, 0, 0, 0, 12, 474, 1, 0, 0, 0, 12, 476, 1, 0, 0, 0, 13, 478, 1, 0, 0, 0, 13, 480, 1, 0, 0, 0, 13, 482, 1, 0, 0, 0, 13, 484, 1, 0, 0, 0, 13, 486, 1, 0, 0, 0, 13, 488, 1, 0, 0, 0, 13, 490, 1, 0, 0, 0, 13, 492, 1, 0, 0, 0, 13, 494, 1, 0, 0, 0, 13, 496, 1, 0, 0, 0, 13, 498, 1, 0, 0, 0, 13, 500, 1, 0, 0, 0, 13, 502, 1, 0, 0, 0, 13, 504, 1, 0, 0, 0, 13, 506, 1, 0, 0, 0, 13, 508, 1, 0, 0, 0, 13, 510, 1, 0, 0, 0, 13, 512, 1, 0, 0, 0, 13, 514, 1, 0, 0, 0, 14, 516, 1, 0, 0, 0, 14, 518, 1, 0, 0, 0, 14, 520, 1, 0, 0, 0, 14, 522, 1, 0, 0, 0, 14, 524, 1, 0, 0, 0, 14, 526, 1, 0, 0, 0, 14, 528, 1, 0, 0, 0, 14, 530, 1, 0, 0, 0, 14, 532, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 14, 536, 1, 0, 0, 0, 14, 538, 1, 0, 0, 0, 14, 540, 1, 0, 0, 0, 14, 542, 1, 0, 0, 0, 15, 544, 1, 0, 0, 0, 15, 546, 1, 0, 0, 0, 15, 548, 1, 0, 0, 0, 15, 550, 1, 0, 0, 0, 15, 552, 1, 0, 0, 0, 15, 554, 1, 0, 0, 0, 15, 556, 1, 0, 0, 0, 15, 558, 1, 0, 0, 0, 15, 560, 1, 0, 0, 0, 15, 562, 1, 0, 0, 0, 15, 568, 1, 0, 0, 0, 15, 570, 1, 0, 0, 0, 15, 572, 1, 0, 0, 0, 15, 574, 1, 0, 0, 0, 16, 576, 1, 0, 0, 0, 16, 578, 1, 0, 0, 0, 16, 580, 1, 0, 0, 0, 16, 582, 1, 0, 0, 0, 16, 584, 1, 0, 0, 0, 16, 586, 1, 0, 0, 0, 16, 588, 1, 0, 0, 0, 16, 590, 1, 0, 0, 0, 16, 592, 1, 0, 0, 0, 16, 594, 1, 0, 0, 0, 16, 596, 1, 0, 0, 0, 16, 598, 1, 0, 0, 0, 16, 600, 1, 0, 0, 0, 16, 602, 1, 0, 0, 0, 16, 604, 1, 0, 0, 0, 16, 606, 1, 0, 0, 0, 16, 608, 1, 0, 0, 0, 16, 610, 1, 0, 0, 0, 16, 612, 1, 0, 0, 0, 17, 614, 1, 0, 0, 0, 17, 616, 1, 0, 0, 0, 17, 618, 1, 0, 0, 0, 17, 620, 1, 0, 0, 0, 17, 622, 1, 0, 0, 0, 17, 624, 1, 0, 0, 0, 17, 626, 1, 0, 0, 0, 17, 628, 1, 0, 0, 0, 17, 630, 1, 0, 0, 0, 17, 632, 1, 0, 0, 0, 17, 634, 1, 0, 0, 0, 17, 636, 1, 0, 0, 0, 17, 638, 1, 0, 0, 0, 17, 640, 1, 0, 0, 0, 17, 642, 1, 0, 0, 0, 17, 644, 1, 0, 0, 0, 18, 646, 1, 0, 0, 0, 18, 648, 1, 0, 0, 0, 18, 650, 1, 0, 0, 0, 18, 652, 1, 0, 0, 0, 18, 654, 1, 0, 0, 0, 18, 656, 1, 0, 0, 0, 18, 658, 1, 0, 0, 0, 18, 660, 1, 0, 0, 0, 18, 662, 1, 0, 0, 0, 18, 664, 1, 0, 0, 0, 18, 666, 1, 0, 0, 0, 18, 668, 1, 0, 0, 0, 18, 670, 1, 0, 0, 0, 18, 672, 1, 0, 0, 0, 18, 674, 1, 0, 0, 0, 18, 676, 1, 0, 0, 0, 18, 678, 1, 0, 0, 0, 18, 680, 1, 0, 0, 0, 18, 682, 1, 0, 0, 0, 18, 684, 1, 0, 0, 0, 18, 686, 1, 0, 0, 0, 18, 688, 1, 0, 0, 0, 18, 690, 1, 0, 0, 0, 18, 692, 1, 0, 0, 0, 18, 694, 1, 0, 0, 0, 19, 696, 1, 0, 0, 0, 19, 698, 1, 0, 0, 0, 19, 700, 1, 0, 0, 0, 19, 702, 1, 0, 0, 0, 19, 704, 1, 0, 0, 0, 20, 706, 1, 0, 0, 0, 22, 723, 1, 0, 0, 0, 24, 739, 1, 0, 0, 0, 26, 745, 1, 0, 0, 0, 28, 760, 1, 0, 0, 0, 30, 769, 1, 0, 0, 0, 32, 780, 1, 0, 0, 0, 34, 793, 1, 0, 0, 0, 36, 803, 1, 0, 0, 0, 38, 810, 1, 0, 0, 0, 40, 817, 1, 0, 0, 0, 42, 825, 1, 0, 0, 0, 44, 834, 1, 0, 0, 0, 46, 840, 1, 0, 0, 0, 48, 849, 1, 0, 0, 0, 50, 856, 1, 0, 0, 0, 52, 864, 1, 0, 0, 0, 54, 872, 1, 0, 0, 0, 56, 884, 1, 0, 0, 0, 58, 891, 1, 0, 0, 0, 60, 896, 1, 0, 0, 0, 62, 908, 1, 0, 0, 0, 64, 915, 1, 0, 0, 0, 66, 922, 1, 0, 0, 0, 68, 931, 1, 0, 0, 0, 70, 945, 1, 0, 0, 0, 72, 954, 1, 0, 0, 0, 74, 962, 1, 0, 0, 0, 76, 970, 1, 0, 0, 0, 78, 979, 1, 0, 0, 0, 80, 991, 1, 0, 0, 0, 82, 998, 1, 0, 0, 0, 84, 1010, 1, 0, 0, 0, 86, 1017, 1, 0, 0, 0, 88, 1024, 1, 0, 0, 0, 90, 1036, 1, 0, 0, 0, 92, 1045, 1, 0, 0, 0, 94, 1054, 1, 0, 0, 0, 96, 1060, 1, 0, 0, 0, 98, 1068, 1, 0, 0, 0, 100, 1074, 1, 0, 0, 0, 102, 1079, 1, 0, 0, 0, 104, 1085, 1, 0, 0, 0, 106, 1089, 1, 0, 0, 0, 108, 1093, 1, 0, 0, 0, 110, 1097, 1, 0, 0, 0, 112, 1101, 1, 0, 0, 0, 114, 1105, 1, 0, 0, 0, 116, 1109, 1, 0, 0, 0, 118, 1113, 1, 0, 0, 0, 120, 1117, 1, 0, 0, 0, 122, 1121, 1, 0, 0, 0, 124, 1125, 1, 0, 0, 0, 126, 1129, 1, 0, 0, 0, 128, 1134, 1, 0, 0, 0, 130, 1140, 1, 0, 0, 0, 132, 1145, 1, 0, 0, 0, 134, 1150, 1, 0, 0, 0, 136, 1159, 1, 0, 0, 0, 138, 1166, 1, 0, 0, 0, 140, 1170, 1, 0, 0, 0, 142, 1174, 1, 0, 0, 0, 144, 1178, 1, 0, 0, 0, 146, 1182, 1, 0, 0, 0, 148, 1186, 1, 0, 0, 0, 150, 1192, 1, 0, 0, 0, 152, 1199, 1, 0, 0, 0, 154, 1203, 1, 0, 0, 0, 156, 1207, 1, 0, 0, 0, 158, 1211, 1, 0, 0, 0, 160, 1215, 1, 0, 0, 0, 162, 1219, 1, 0, 0, 0, 164, 1223, 1, 0, 0, 0, 166, 1227, 1, 0, 0, 0, 168, 1231, 1, 0, 0, 0, 170, 1235, 1, 0, 0, 0, 172, 1239, 1, 0, 0, 0, 174, 1243, 1, 0, 0, 0, 176, 1247, 1, 0, 0, 0, 178, 1251, 1, 0, 0, 0, 180, 1255, 1, 0, 0, 0, 182, 1259, 1, 0, 0, 0, 184, 1264, 1, 0, 0, 0, 186, 1269, 1, 0, 0, 0, 188, 1273, 1, 0, 0, 0, 190, 1277, 1, 0, 0, 0, 192, 1281, 1, 0, 0, 0, 194, 1285, 1, 0, 0, 0, 196, 1287, 1, 0, 0, 0, 198, 1289, 1, 0, 0, 0, 200, 1292, 1, 0, 0, 0, 202, 1294, 1, 0, 0, 0, 204, 1303, 1, 0, 0, 0, 206, 1305, 1, 0, 0, 0, 208, 1310, 1, 0, 0, 0, 210, 1312, 1, 0, 0, 0, 212, 1317, 1, 0, 0, 0, 214, 1348, 1, 0, 0, 0, 216, 1351, 1, 0, 0, 0, 218, 1397, 1, 0, 0, 0, 220, 1399, 1, 0, 0, 0, 222, 1403, 1, 0, 0, 0, 224, 1407, 1, 0, 0, 0, 226, 1409, 1, 0, 0, 0, 228, 1412, 1, 0, 0, 0, 230, 1415, 1, 0, 0, 0, 232, 1417, 1, 0, 0, 0, 234, 1419, 1, 0, 0, 0, 236, 1421, 1, 0, 0, 0, 238, 1426, 1, 0, 0, 0, 240, 1428, 1, 0, 0, 0, 242, 1434, 1, 0, 0, 0, 244, 1440, 1, 0, 0, 0, 246, 1443, 1, 0, 0, 0, 248, 1446, 1, 0, 0, 0, 250, 1451, 1, 0, 0, 0, 252, 1456, 1, 0, 0, 0, 254, 1460, 1, 0, 0, 0, 256, 1465, 1, 0, 0, 0, 258, 1471, 1, 0, 0, 0, 260, 1474, 1, 0, 0, 0, 262, 1477, 1, 0, 0, 0, 264, 1479, 1, 0, 0, 0, 266, 1485, 1, 0, 0, 0, 268, 1490, 1, 0, 0, 0, 270, 1495, 1, 0, 0, 0, 272, 1498, 1, 0, 0, 0, 274, 1501, 1, 0, 0, 0, 276, 1504, 1, 0, 0, 0, 278, 1506, 1, 0, 0, 0, 280, 1509, 1, 0, 0, 0, 282, 1511, 1, 0, 0, 0, 284, 1514, 1, 0, 0, 0, 286, 1516, 1, 0, 0, 0, 288, 1518, 1, 0, 0, 0, 290, 1520, 1, 0, 0, 0, 292, 1522, 1, 0, 0, 0, 294, 1524, 1, 0, 0, 0, 296, 1526, 1, 0, 0, 0, 298, 1528, 1, 0, 0, 0, 300, 1531, 1, 0, 0, 0, 302, 1552, 1, 0, 0, 0, 304, 1571, 1, 0, 0, 0, 306, 1573, 1, 0, 0, 0, 308, 1578, 1, 0, 0, 0, 310, 1583, 1, 0, 0, 0, 312, 1588, 1, 0, 0, 0, 314, 1609, 1, 0, 0, 0, 316, 1611, 1, 0, 0, 0, 318, 1619, 1, 0, 0, 0, 320, 1621, 1, 0, 0, 0, 322, 1625, 1, 0, 0, 0, 324, 1629, 1, 0, 0, 0, 326, 1633, 1, 0, 0, 0, 328, 1638, 1, 0, 0, 0, 330, 1642, 1, 0, 0, 0, 332, 1646, 1, 0, 0, 0, 334, 1650, 1, 0, 0, 0, 336, 1654, 1, 0, 0, 0, 338, 1663, 1, 0, 0, 0, 340, 1669, 1, 0, 0, 0, 342, 1673, 1, 0, 0, 0, 344, 1677, 1, 0, 0, 0, 346, 1683, 1, 0, 0, 0, 348, 1691, 1, 0, 0, 0, 350, 1694, 1, 0, 0, 0, 352, 1698, 1, 0, 0, 0, 354, 1702, 1, 0, 0, 0, 356, 1706, 1, 0, 0, 0, 358, 1710, 1, 0, 0, 0, 360, 1714, 1, 0, 0, 0, 362, 1718, 1, 0, 0, 0, 364, 1723, 1, 0, 0, 0, 366, 1729, 1, 0, 0, 0, 368, 1734, 1, 0, 0, 0, 370, 1738, 1, 0, 0, 0, 372, 1742, 1, 0, 0, 0, 374, 1746, 1, 0, 0, 0, 376, 1751, 1, 0, 0, 0, 378, 1757, 1, 0, 0, 0, 380, 1763, 1, 0, 0, 0, 382, 1769, 1, 0, 0, 0, 384, 1773, 1, 0, 0, 0, 386, 1779, 1, 0, 0, 0, 388, 1783, 1, 0, 0, 0, 390, 1787, 1, 0, 0, 0, 392, 1791, 1, 0, 0, 0, 394, 1795, 1, 0, 0, 0, 396, 1799, 1, 0, 0, 0, 398, 1803, 1, 0, 0, 0, 400, 1807, 1, 0, 0, 0, 402, 1811, 1, 0, 0, 0, 404, 1815, 1, 0, 0, 0, 406, 1819, 1, 0, 0, 0, 408, 1823, 1, 0, 0, 0, 410, 1827, 1, 0, 0, 0, 412, 1836, 1, 0, 0, 0, 414, 1840, 1, 0, 0, 0, 416, 1844, 1, 0, 0, 0, 418, 1848, 1, 0, 0, 0, 420, 1853, 1, 0, 0, 0, 422, 1858, 1, 0, 0, 0, 424, 1862, 1, 0, 0, 0, 426, 1868, 1, 0, 0, 0, 428, 1877, 1, 0, 0, 0, 430, 1881, 1, 0, 0, 0, 432, 1885, 1, 0, 0, 0, 434, 1889, 1, 0, 0, 0, 436, 1893, 1, 0, 0, 0, 438, 1897, 1, 0, 0, 0, 440, 1901, 1, 0, 0, 0, 442, 1906, 1, 0, 0, 0, 444, 1912, 1, 0, 0, 0, 446, 1916, 1, 0, 0, 0, 448, 1920, 1, 0, 0, 0, 450, 1924, 1, 0, 0, 0, 452, 1929, 1, 0, 0, 0, 454, 1933, 1, 0, 0, 0, 456, 1937, 1, 0, 0, 0, 458, 1941, 1, 0, 0, 0, 460, 1945, 1, 0, 0, 0, 462, 1949, 1, 0, 0, 0, 464, 1955, 1, 0, 0, 0, 466, 1962, 1, 0, 0, 0, 468, 1966, 1, 0, 0, 0, 470, 1970, 1, 0, 0, 0, 472, 1974, 1, 0, 0, 0, 474, 1978, 1, 0, 0, 0, 476, 1982, 1, 0, 0, 0, 478, 1986, 1, 0, 0, 0, 480, 1991, 1, 0, 0, 0, 482, 1995, 1, 0, 0, 0, 484, 1999, 1, 0, 0, 0, 486, 2003, 1, 0, 0, 0, 488, 2007, 1, 0, 0, 0, 490, 2011, 1, 0, 0, 0, 492, 2015, 1, 0, 0, 0, 494, 2019, 1, 0, 0, 0, 496, 2023, 1, 0, 0, 0, 498, 2027, 1, 0, 0, 0, 500, 2031, 1, 0, 0, 0, 502, 2035, 1, 0, 0, 0, 504, 2039, 1, 0, 0, 0, 506, 2043, 1, 0, 0, 0, 508, 2047, 1, 0, 0, 0, 510, 2051, 1, 0, 0, 0, 512, 2055, 1, 0, 0, 0, 514, 2059, 1, 0, 0, 0, 516, 2063, 1, 0, 0, 0, 518, 2068, 1, 0, 0, 0, 520, 2074, 1, 0, 0, 0, 522, 2078, 1, 0, 0, 0, 524, 2082, 1, 0, 0, 0, 526, 2086, 1, 0, 0, 0, 528, 2090, 1, 0, 0, 0, 530, 2094, 1, 0, 0, 0, 532, 2098, 1, 0, 0, 0, 534, 2102, 1, 0, 0, 0, 536, 2106, 1, 0, 0, 0, 538, 2110, 1, 0, 0, 0, 540, 2114, 1, 0, 0, 0, 542, 2118, 1, 0, 0, 0, 544, 2122, 1, 0, 0, 0, 546, 2127, 1, 0, 0, 0, 548, 2133, 1, 0, 0, 0, 550, 2137, 1, 0, 0, 0, 552, 2141, 1, 0, 0, 0, 554, 2145, 1, 0, 0, 0, 556, 2149, 1, 0, 0, 0, 558, 2153, 1, 0, 0, 0, 560, 2157, 1, 0, 0, 0, 562, 2161, 1, 0, 0, 0, 564, 2169, 1, 0, 0, 0, 566, 2190, 1, 0, 0, 0, 568, 2194, 1, 0, 0, 0, 570, 2198, 1, 0, 0, 0, 572, 2202, 1, 0, 0, 0, 574, 2206, 1, 0, 0, 0, 576, 2210, 1, 0, 0, 0, 578, 2214, 1, 0, 0, 0, 580, 2218, 1, 0, 0, 0, 582, 2222, 1, 0, 0, 0, 584, 2226, 1, 0, 0, 0, 586, 2230, 1, 0, 0, 0, 588, 2234, 1, 0, 0, 0, 590, 2238, 1, 0, 0, 0, 592, 2242, 1, 0, 0, 0, 594, 2246, 1, 0, 0, 0, 596, 2251, 1, 0, 0, 0, 598, 2256, 1, 0, 0, 0, 600, 2262, 1, 0, 0, 0, 602, 2269, 1, 0, 0, 0, 604, 2273, 1, 0, 0, 0, 606, 2277, 1, 0, 0, 0, 608, 2281, 1, 0, 0, 0, 610, 2294, 1, 0, 0, 0, 612, 2305, 1, 0, 0, 0, 614, 2307, 1, 0, 0, 0, 616, 2312, 1, 0, 0, 0, 618, 2318, 1, 0, 0, 0, 620, 2322, 1, 0, 0, 0, 622, 2326, 1, 0, 0, 0, 624, 2330, 1, 0, 0, 0, 626, 2334, 1, 0, 0, 0, 628, 2338, 1, 0, 0, 0, 630, 2342, 1, 0, 0, 0, 632, 2346, 1, 0, 0, 0, 634, 2350, 1, 0, 0, 0, 636, 2354, 1, 0, 0, 0, 638, 2357, 1, 0, 0, 0, 640, 2361, 1, 0, 0, 0, 642, 2365, 1, 0, 0, 0, 644, 2369, 1, 0, 0, 0, 646, 2373, 1, 0, 0, 0, 648, 2377, 1, 0, 0, 0, 650, 2381, 1, 0, 0, 0, 652, 2385, 1, 0, 0, 0, 654, 2390, 1, 0, 0, 0, 656, 2394, 1, 0, 0, 0, 658, 2398, 1, 0, 0, 0, 660, 2402, 1, 0, 0, 0, 662, 2406, 1, 0, 0, 0, 664, 2410, 1, 0, 0, 0, 666, 2414, 1, 0, 0, 0, 668, 2418, 1, 0, 0, 0, 670, 2422, 1, 0, 0, 0, 672, 2426, 1, 0, 0, 0, 674, 2430, 1, 0, 0, 0, 676, 2434, 1, 0, 0, 0, 678, 2438, 1, 0, 0, 0, 680, 2442, 1, 0, 0, 0, 682, 2446, 1, 0, 0, 0, 684, 2450, 1, 0, 0, 0, 686, 2454, 1, 0, 0, 0, 688, 2458, 1, 0, 0, 0, 690, 2462, 1, 0, 0, 0, 692, 2466, 1, 0, 0, 0, 694, 2470, 1, 0, 0, 0, 696, 2474, 1, 0, 0, 0, 698, 2479, 1, 0, 0, 0, 700, 2484, 1, 0, 0, 0, 702, 2488, 1, 0, 0, 0, 704, 2492, 1, 0, 0, 0, 706, 707, 5, 47, 0, 0, 707, 708, 5, 47, 0, 0, 708, 712, 1, 0, 0, 0, 709, 711, 8, 0, 0, 0, 710, 709, 1, 0, 0, 0, 711, 714, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 715, 717, 5, 13, 0, 0, 716, 715, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 719, 1, 0, 0, 0, 718, 720, 5, 10, 0, 0, 719, 718, 1, 0, 0, 0, 719, 720, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 722, 6, 0, 0, 0, 722, 21, 1, 0, 0, 0, 723, 724, 5, 47, 0, 0, 724, 725, 5, 42, 0, 0, 725, 730, 1, 0, 0, 0, 726, 729, 3, 22, 1, 0, 727, 729, 9, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 727, 1, 0, 0, 0, 729, 732, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 731, 733, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 733, 734, 5, 42, 0, 0, 734, 735, 5, 47, 0, 0, 735, 736, 1, 0, 0, 0, 736, 737, 6, 1, 0, 0, 737, 23, 1, 0, 0, 0, 738, 740, 7, 1, 0, 0, 739, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 744, 6, 2, 0, 0, 744, 25, 1, 0, 0, 0, 745, 746, 7, 2, 0, 0, 746, 747, 7, 3, 0, 0, 747, 748, 7, 4, 0, 0, 748, 749, 7, 5, 0, 0, 749, 750, 7, 6, 0, 0, 750, 751, 7, 7, 0, 0, 751, 752, 5, 95, 0, 0, 752, 753, 7, 8, 0, 0, 753, 754, 7, 9, 0, 0, 754, 755, 7, 10, 0, 0, 755, 756, 7, 5, 0, 0, 756, 757, 7, 11, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 6, 3, 1, 0, 759, 27, 1, 0, 0, 0, 760, 761, 7, 7, 0, 0, 761, 762, 7, 5, 0, 0, 762, 763, 7, 12, 0, 0, 763, 764, 7, 10, 0, 0, 764, 765, 7, 2, 0, 0, 765, 766, 7, 3, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 6, 4, 2, 0, 768, 29, 1, 0, 0, 0, 769, 770, 4, 5, 0, 0, 770, 771, 7, 7, 0, 0, 771, 772, 7, 13, 0, 0, 772, 773, 7, 8, 0, 0, 773, 774, 7, 14, 0, 0, 774, 775, 7, 4, 0, 0, 775, 776, 7, 10, 0, 0, 776, 777, 7, 5, 0, 0, 777, 778, 1, 0, 0, 0, 778, 779, 6, 5, 3, 0, 779, 31, 1, 0, 0, 0, 780, 781, 7, 2, 0, 0, 781, 782, 7, 9, 0, 0, 782, 783, 7, 15, 0, 0, 783, 784, 7, 8, 0, 0, 784, 785, 7, 14, 0, 0, 785, 786, 7, 7, 0, 0, 786, 787, 7, 11, 0, 0, 787, 788, 7, 10, 0, 0, 788, 789, 7, 9, 0, 0, 789, 790, 7, 5, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 6, 6, 4, 0, 792, 33, 1, 0, 0, 0, 793, 794, 7, 16, 0, 0, 794, 795, 7, 10, 0, 0, 795, 796, 7, 17, 0, 0, 796, 797, 7, 17, 0, 0, 797, 798, 7, 7, 0, 0, 798, 799, 7, 2, 0, 0, 799, 800, 7, 11, 0, 0, 800, 801, 1, 0, 0, 0, 801, 802, 6, 7, 4, 0, 802, 35, 1, 0, 0, 0, 803, 804, 7, 7, 0, 0, 804, 805, 7, 18, 0, 0, 805, 806, 7, 4, 0, 0, 806, 807, 7, 14, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 6, 8, 4, 0, 809, 37, 1, 0, 0, 0, 810, 811, 7, 6, 0, 0, 811, 812, 7, 12, 0, 0, 812, 813, 7, 9, 0, 0, 813, 814, 7, 19, 0, 0, 814, 815, 1, 0, 0, 0, 815, 816, 6, 9, 4, 0, 816, 39, 1, 0, 0, 0, 817, 818, 7, 14, 0, 0, 818, 819, 7, 10, 0, 0, 819, 820, 7, 15, 0, 0, 820, 821, 7, 10, 0, 0, 821, 822, 7, 11, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 6, 10, 4, 0, 824, 41, 1, 0, 0, 0, 825, 826, 7, 12, 0, 0, 826, 827, 7, 7, 0, 0, 827, 828, 7, 12, 0, 0, 828, 829, 7, 4, 0, 0, 829, 830, 7, 5, 0, 0, 830, 831, 7, 19, 0, 0, 831, 832, 1, 0, 0, 0, 832, 833, 6, 11, 4, 0, 833, 43, 1, 0, 0, 0, 834, 835, 7, 12, 0, 0, 835, 836, 7, 9, 0, 0, 836, 837, 7, 20, 0, 0, 837, 838, 1, 0, 0, 0, 838, 839, 6, 12, 4, 0, 839, 45, 1, 0, 0, 0, 840, 841, 7, 17, 0, 0, 841, 842, 7, 4, 0, 0, 842, 843, 7, 15, 0, 0, 843, 844, 7, 8, 0, 0, 844, 845, 7, 14, 0, 0, 845, 846, 7, 7, 0, 0, 846, 847, 1, 0, 0, 0, 847, 848, 6, 13, 4, 0, 848, 47, 1, 0, 0, 0, 849, 850, 7, 17, 0, 0, 850, 851, 7, 9, 0, 0, 851, 852, 7, 12, 0, 0, 852, 853, 7, 11, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 6, 14, 4, 0, 855, 49, 1, 0, 0, 0, 856, 857, 7, 17, 0, 0, 857, 858, 7, 11, 0, 0, 858, 859, 7, 4, 0, 0, 859, 860, 7, 11, 0, 0, 860, 861, 7, 17, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 6, 15, 4, 0, 863, 51, 1, 0, 0, 0, 864, 865, 7, 20, 0, 0, 865, 866, 7, 3, 0, 0, 866, 867, 7, 7, 0, 0, 867, 868, 7, 12, 0, 0, 868, 869, 7, 7, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 6, 16, 4, 0, 871, 53, 1, 0, 0, 0, 872, 873, 7, 21, 0, 0, 873, 874, 7, 12, 0, 0, 874, 875, 7, 10, 0, 0, 875, 876, 5, 95, 0, 0, 876, 877, 7, 8, 0, 0, 877, 878, 7, 4, 0, 0, 878, 879, 7, 12, 0, 0, 879, 880, 7, 11, 0, 0, 880, 881, 7, 17, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 6, 17, 4, 0, 883, 55, 1, 0, 0, 0, 884, 885, 7, 22, 0, 0, 885, 886, 7, 12, 0, 0, 886, 887, 7, 9, 0, 0, 887, 888, 7, 15, 0, 0, 888, 889, 1, 0, 0, 0, 889, 890, 6, 18, 5, 0, 890, 57, 1, 0, 0, 0, 891, 892, 7, 11, 0, 0, 892, 893, 7, 17, 0, 0, 893, 894, 1, 0, 0, 0, 894, 895, 6, 19, 5, 0, 895, 59, 1, 0, 0, 0, 896, 897, 4, 20, 1, 0, 897, 898, 7, 7, 0, 0, 898, 899, 7, 13, 0, 0, 899, 900, 7, 11, 0, 0, 900, 901, 7, 7, 0, 0, 901, 902, 7, 12, 0, 0, 902, 903, 7, 5, 0, 0, 903, 904, 7, 4, 0, 0, 904, 905, 7, 14, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 6, 20, 5, 0, 907, 61, 1, 0, 0, 0, 908, 909, 7, 22, 0, 0, 909, 910, 7, 9, 0, 0, 910, 911, 7, 12, 0, 0, 911, 912, 7, 19, 0, 0, 912, 913, 1, 0, 0, 0, 913, 914, 6, 21, 6, 0, 914, 63, 1, 0, 0, 0, 915, 916, 7, 22, 0, 0, 916, 917, 7, 21, 0, 0, 917, 918, 7, 17, 0, 0, 918, 919, 7, 7, 0, 0, 919, 920, 1, 0, 0, 0, 920, 921, 6, 22, 7, 0, 921, 65, 1, 0, 0, 0, 922, 923, 7, 10, 0, 0, 923, 924, 7, 5, 0, 0, 924, 925, 7, 14, 0, 0, 925, 926, 7, 10, 0, 0, 926, 927, 7, 5, 0, 0, 927, 928, 7, 7, 0, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 23, 8, 0, 930, 67, 1, 0, 0, 0, 931, 932, 7, 10, 0, 0, 932, 933, 7, 5, 0, 0, 933, 934, 7, 14, 0, 0, 934, 935, 7, 10, 0, 0, 935, 936, 7, 5, 0, 0, 936, 937, 7, 7, 0, 0, 937, 938, 7, 17, 0, 0, 938, 939, 7, 11, 0, 0, 939, 940, 7, 4, 0, 0, 940, 941, 7, 11, 0, 0, 941, 942, 7, 17, 0, 0, 942, 943, 1, 0, 0, 0, 943, 944, 6, 24, 4, 0, 944, 69, 1, 0, 0, 0, 945, 946, 7, 14, 0, 0, 946, 947, 7, 9, 0, 0, 947, 948, 7, 9, 0, 0, 948, 949, 7, 19, 0, 0, 949, 950, 7, 21, 0, 0, 950, 951, 7, 8, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 25, 9, 0, 953, 71, 1, 0, 0, 0, 954, 955, 4, 26, 2, 0, 955, 956, 7, 22, 0, 0, 956, 957, 7, 21, 0, 0, 957, 958, 7, 14, 0, 0, 958, 959, 7, 14, 0, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 26, 9, 0, 961, 73, 1, 0, 0, 0, 962, 963, 4, 27, 3, 0, 963, 964, 7, 14, 0, 0, 964, 965, 7, 7, 0, 0, 965, 966, 7, 22, 0, 0, 966, 967, 7, 11, 0, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 27, 9, 0, 969, 75, 1, 0, 0, 0, 970, 971, 4, 28, 4, 0, 971, 972, 7, 12, 0, 0, 972, 973, 7, 10, 0, 0, 973, 974, 7, 6, 0, 0, 974, 975, 7, 3, 0, 0, 975, 976, 7, 11, 0, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 28, 9, 0, 978, 77, 1, 0, 0, 0, 979, 980, 4, 29, 5, 0, 980, 981, 7, 14, 0, 0, 981, 982, 7, 9, 0, 0, 982, 983, 7, 9, 0, 0, 983, 984, 7, 19, 0, 0, 984, 985, 7, 21, 0, 0, 985, 986, 7, 8, 0, 0, 986, 987, 5, 95, 0, 0, 987, 988, 5, 128020, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 29, 10, 0, 990, 79, 1, 0, 0, 0, 991, 992, 4, 30, 6, 0, 992, 993, 7, 15, 0, 0, 993, 994, 7, 15, 0, 0, 994, 995, 7, 12, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 30, 11, 0, 997, 81, 1, 0, 0, 0, 998, 999, 7, 15, 0, 0, 999, 1000, 7, 18, 0, 0, 1000, 1001, 5, 95, 0, 0, 1001, 1002, 7, 7, 0, 0, 1002, 1003, 7, 13, 0, 0, 1003, 1004, 7, 8, 0, 0, 1004, 1005, 7, 4, 0, 0, 1005, 1006, 7, 5, 0, 0, 1006, 1007, 7, 16, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 31, 12, 0, 1009, 83, 1, 0, 0, 0, 1010, 1011, 7, 16, 0, 0, 1011, 1012, 7, 12, 0, 0, 1012, 1013, 7, 9, 0, 0, 1013, 1014, 7, 8, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 6, 32, 13, 0, 1016, 85, 1, 0, 0, 0, 1017, 1018, 7, 19, 0, 0, 1018, 1019, 7, 7, 0, 0, 1019, 1020, 7, 7, 0, 0, 1020, 1021, 7, 8, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 6, 33, 13, 0, 1023, 87, 1, 0, 0, 0, 1024, 1025, 4, 34, 7, 0, 1025, 1026, 7, 10, 0, 0, 1026, 1027, 7, 5, 0, 0, 1027, 1028, 7, 17, 0, 0, 1028, 1029, 7, 10, 0, 0, 1029, 1030, 7, 17, 0, 0, 1030, 1031, 7, 11, 0, 0, 1031, 1032, 5, 95, 0, 0, 1032, 1033, 5, 128020, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 6, 34, 13, 0, 1035, 89, 1, 0, 0, 0, 1036, 1037, 7, 8, 0, 0, 1037, 1038, 7, 12, 0, 0, 1038, 1039, 7, 9, 0, 0, 1039, 1040, 7, 15, 0, 0, 1040, 1041, 7, 23, 0, 0, 1041, 1042, 7, 14, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 6, 35, 14, 0, 1044, 91, 1, 0, 0, 0, 1045, 1046, 7, 12, 0, 0, 1046, 1047, 7, 7, 0, 0, 1047, 1048, 7, 5, 0, 0, 1048, 1049, 7, 4, 0, 0, 1049, 1050, 7, 15, 0, 0, 1050, 1051, 7, 7, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 6, 36, 15, 0, 1053, 93, 1, 0, 0, 0, 1054, 1055, 7, 17, 0, 0, 1055, 1056, 7, 7, 0, 0, 1056, 1057, 7, 11, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 37, 16, 0, 1059, 95, 1, 0, 0, 0, 1060, 1061, 7, 17, 0, 0, 1061, 1062, 7, 3, 0, 0, 1062, 1063, 7, 9, 0, 0, 1063, 1064, 7, 20, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 6, 38, 17, 0, 1066, 97, 1, 0, 0, 0, 1067, 1069, 8, 24, 0, 0, 1068, 1067, 1, 0, 0, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 6, 39, 4, 0, 1073, 99, 1, 0, 0, 0, 1074, 1075, 3, 192, 86, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1077, 6, 40, 18, 0, 1077, 1078, 6, 40, 19, 0, 1078, 101, 1, 0, 0, 0, 1079, 1080, 3, 312, 146, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 41, 20, 0, 1082, 1083, 6, 41, 19, 0, 1083, 1084, 6, 41, 19, 0, 1084, 103, 1, 0, 0, 0, 1085, 1086, 3, 258, 119, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1088, 6, 42, 21, 0, 1088, 105, 1, 0, 0, 0, 1089, 1090, 3, 636, 308, 0, 1090, 1091, 1, 0, 0, 0, 1091, 1092, 6, 43, 22, 0, 1092, 107, 1, 0, 0, 0, 1093, 1094, 3, 238, 109, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 44, 23, 0, 1096, 109, 1, 0, 0, 0, 1097, 1098, 3, 234, 107, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 45, 24, 0, 1100, 111, 1, 0, 0, 0, 1101, 1102, 3, 306, 143, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 46, 25, 0, 1104, 113, 1, 0, 0, 0, 1105, 1106, 3, 308, 144, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 6, 47, 26, 0, 1108, 115, 1, 0, 0, 0, 1109, 1110, 3, 318, 149, 0, 1110, 1111, 1, 0, 0, 0, 1111, 1112, 6, 48, 27, 0, 1112, 117, 1, 0, 0, 0, 1113, 1114, 3, 314, 147, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 49, 28, 0, 1116, 119, 1, 0, 0, 0, 1117, 1118, 3, 20, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1120, 6, 50, 0, 0, 1120, 121, 1, 0, 0, 0, 1121, 1122, 3, 22, 1, 0, 1122, 1123, 1, 0, 0, 0, 1123, 1124, 6, 51, 0, 0, 1124, 123, 1, 0, 0, 0, 1125, 1126, 3, 24, 2, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1128, 6, 52, 0, 0, 1128, 125, 1, 0, 0, 0, 1129, 1130, 3, 192, 86, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 6, 53, 18, 0, 1132, 1133, 6, 53, 19, 0, 1133, 127, 1, 0, 0, 0, 1134, 1135, 3, 312, 146, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 6, 54, 20, 0, 1137, 1138, 6, 54, 19, 0, 1138, 1139, 6, 54, 19, 0, 1139, 129, 1, 0, 0, 0, 1140, 1141, 3, 258, 119, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1143, 6, 55, 21, 0, 1143, 1144, 6, 55, 29, 0, 1144, 131, 1, 0, 0, 0, 1145, 1146, 3, 268, 124, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 6, 56, 30, 0, 1148, 1149, 6, 56, 29, 0, 1149, 133, 1, 0, 0, 0, 1150, 1151, 8, 25, 0, 0, 1151, 135, 1, 0, 0, 0, 1152, 1154, 3, 134, 57, 0, 1153, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 3, 230, 105, 0, 1158, 1160, 1, 0, 0, 0, 1159, 1153, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1162, 1, 0, 0, 0, 1161, 1163, 3, 134, 57, 0, 1162, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1162, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 137, 1, 0, 0, 0, 1166, 1167, 3, 136, 58, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 59, 31, 0, 1169, 139, 1, 0, 0, 0, 1170, 1171, 3, 214, 97, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 60, 32, 0, 1173, 141, 1, 0, 0, 0, 1174, 1175, 3, 20, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 61, 0, 0, 1177, 143, 1, 0, 0, 0, 1178, 1179, 3, 22, 1, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 62, 0, 0, 1181, 145, 1, 0, 0, 0, 1182, 1183, 3, 24, 2, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 6, 63, 0, 0, 1185, 147, 1, 0, 0, 0, 1186, 1187, 3, 192, 86, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 6, 64, 18, 0, 1189, 1190, 6, 64, 19, 0, 1190, 1191, 6, 64, 19, 0, 1191, 149, 1, 0, 0, 0, 1192, 1193, 3, 312, 146, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 65, 20, 0, 1195, 1196, 6, 65, 19, 0, 1196, 1197, 6, 65, 19, 0, 1197, 1198, 6, 65, 19, 0, 1198, 151, 1, 0, 0, 0, 1199, 1200, 3, 306, 143, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 6, 66, 25, 0, 1202, 153, 1, 0, 0, 0, 1203, 1204, 3, 308, 144, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1206, 6, 67, 26, 0, 1206, 155, 1, 0, 0, 0, 1207, 1208, 3, 224, 102, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 6, 68, 33, 0, 1210, 157, 1, 0, 0, 0, 1211, 1212, 3, 234, 107, 0, 1212, 1213, 1, 0, 0, 0, 1213, 1214, 6, 69, 24, 0, 1214, 159, 1, 0, 0, 0, 1215, 1216, 3, 238, 109, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 6, 70, 23, 0, 1218, 161, 1, 0, 0, 0, 1219, 1220, 3, 268, 124, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1222, 6, 71, 30, 0, 1222, 163, 1, 0, 0, 0, 1223, 1224, 3, 568, 274, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1226, 6, 72, 34, 0, 1226, 165, 1, 0, 0, 0, 1227, 1228, 3, 318, 149, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1230, 6, 73, 27, 0, 1230, 167, 1, 0, 0, 0, 1231, 1232, 3, 262, 121, 0, 1232, 1233, 1, 0, 0, 0, 1233, 1234, 6, 74, 35, 0, 1234, 169, 1, 0, 0, 0, 1235, 1236, 3, 302, 141, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1238, 6, 75, 36, 0, 1238, 171, 1, 0, 0, 0, 1239, 1240, 3, 298, 139, 0, 1240, 1241, 1, 0, 0, 0, 1241, 1242, 6, 76, 37, 0, 1242, 173, 1, 0, 0, 0, 1243, 1244, 3, 304, 142, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1246, 6, 77, 38, 0, 1246, 175, 1, 0, 0, 0, 1247, 1248, 3, 20, 0, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 6, 78, 0, 0, 1250, 177, 1, 0, 0, 0, 1251, 1252, 3, 22, 1, 0, 1252, 1253, 1, 0, 0, 0, 1253, 1254, 6, 79, 0, 0, 1254, 179, 1, 0, 0, 0, 1255, 1256, 3, 24, 2, 0, 1256, 1257, 1, 0, 0, 0, 1257, 1258, 6, 80, 0, 0, 1258, 181, 1, 0, 0, 0, 1259, 1260, 3, 310, 145, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 6, 81, 39, 0, 1262, 1263, 6, 81, 40, 0, 1263, 183, 1, 0, 0, 0, 1264, 1265, 3, 192, 86, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 6, 82, 18, 0, 1267, 1268, 6, 82, 19, 0, 1268, 185, 1, 0, 0, 0, 1269, 1270, 3, 24, 2, 0, 1270, 1271, 1, 0, 0, 0, 1271, 1272, 6, 83, 0, 0, 1272, 187, 1, 0, 0, 0, 1273, 1274, 3, 20, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 84, 0, 0, 1276, 189, 1, 0, 0, 0, 1277, 1278, 3, 22, 1, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 85, 0, 0, 1280, 191, 1, 0, 0, 0, 1281, 1282, 5, 124, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 86, 19, 0, 1284, 193, 1, 0, 0, 0, 1285, 1286, 7, 26, 0, 0, 1286, 195, 1, 0, 0, 0, 1287, 1288, 7, 27, 0, 0, 1288, 197, 1, 0, 0, 0, 1289, 1290, 5, 92, 0, 0, 1290, 1291, 7, 28, 0, 0, 1291, 199, 1, 0, 0, 0, 1292, 1293, 8, 29, 0, 0, 1293, 201, 1, 0, 0, 0, 1294, 1296, 7, 7, 0, 0, 1295, 1297, 7, 30, 0, 0, 1296, 1295, 1, 0, 0, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1299, 1, 0, 0, 0, 1298, 1300, 3, 194, 87, 0, 1299, 1298, 1, 0, 0, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1299, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 203, 1, 0, 0, 0, 1303, 1304, 5, 64, 0, 0, 1304, 205, 1, 0, 0, 0, 1305, 1306, 5, 96, 0, 0, 1306, 207, 1, 0, 0, 0, 1307, 1311, 8, 31, 0, 0, 1308, 1309, 5, 96, 0, 0, 1309, 1311, 5, 96, 0, 0, 1310, 1307, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1311, 209, 1, 0, 0, 0, 1312, 1313, 5, 95, 0, 0, 1313, 211, 1, 0, 0, 0, 1314, 1318, 3, 196, 88, 0, 1315, 1318, 3, 194, 87, 0, 1316, 1318, 3, 210, 95, 0, 1317, 1314, 1, 0, 0, 0, 1317, 1315, 1, 0, 0, 0, 1317, 1316, 1, 0, 0, 0, 1318, 213, 1, 0, 0, 0, 1319, 1324, 5, 34, 0, 0, 1320, 1323, 3, 198, 89, 0, 1321, 1323, 3, 200, 90, 0, 1322, 1320, 1, 0, 0, 0, 1322, 1321, 1, 0, 0, 0, 1323, 1326, 1, 0, 0, 0, 1324, 1322, 1, 0, 0, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1327, 1, 0, 0, 0, 1326, 1324, 1, 0, 0, 0, 1327, 1349, 5, 34, 0, 0, 1328, 1329, 5, 34, 0, 0, 1329, 1330, 5, 34, 0, 0, 1330, 1331, 5, 34, 0, 0, 1331, 1335, 1, 0, 0, 0, 1332, 1334, 8, 0, 0, 0, 1333, 1332, 1, 0, 0, 0, 1334, 1337, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1336, 1338, 1, 0, 0, 0, 1337, 1335, 1, 0, 0, 0, 1338, 1339, 5, 34, 0, 0, 1339, 1340, 5, 34, 0, 0, 1340, 1341, 5, 34, 0, 0, 1341, 1343, 1, 0, 0, 0, 1342, 1344, 5, 34, 0, 0, 1343, 1342, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1346, 1, 0, 0, 0, 1345, 1347, 5, 34, 0, 0, 1346, 1345, 1, 0, 0, 0, 1346, 1347, 1, 0, 0, 0, 1347, 1349, 1, 0, 0, 0, 1348, 1319, 1, 0, 0, 0, 1348, 1328, 1, 0, 0, 0, 1349, 215, 1, 0, 0, 0, 1350, 1352, 3, 194, 87, 0, 1351, 1350, 1, 0, 0, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1351, 1, 0, 0, 0, 1353, 1354, 1, 0, 0, 0, 1354, 217, 1, 0, 0, 0, 1355, 1357, 3, 194, 87, 0, 1356, 1355, 1, 0, 0, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1356, 1, 0, 0, 0, 1358, 1359, 1, 0, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1364, 3, 238, 109, 0, 1361, 1363, 3, 194, 87, 0, 1362, 1361, 1, 0, 0, 0, 1363, 1366, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1398, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1367, 1369, 3, 238, 109, 0, 1368, 1370, 3, 194, 87, 0, 1369, 1368, 1, 0, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1398, 1, 0, 0, 0, 1373, 1375, 3, 194, 87, 0, 1374, 1373, 1, 0, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1385, 1, 0, 0, 0, 1378, 1382, 3, 238, 109, 0, 1379, 1381, 3, 194, 87, 0, 1380, 1379, 1, 0, 0, 0, 1381, 1384, 1, 0, 0, 0, 1382, 1380, 1, 0, 0, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1386, 1, 0, 0, 0, 1384, 1382, 1, 0, 0, 0, 1385, 1378, 1, 0, 0, 0, 1385, 1386, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 3, 202, 91, 0, 1388, 1398, 1, 0, 0, 0, 1389, 1391, 3, 238, 109, 0, 1390, 1392, 3, 194, 87, 0, 1391, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 3, 202, 91, 0, 1396, 1398, 1, 0, 0, 0, 1397, 1356, 1, 0, 0, 0, 1397, 1367, 1, 0, 0, 0, 1397, 1374, 1, 0, 0, 0, 1397, 1389, 1, 0, 0, 0, 1398, 219, 1, 0, 0, 0, 1399, 1400, 7, 4, 0, 0, 1400, 1401, 7, 5, 0, 0, 1401, 1402, 7, 16, 0, 0, 1402, 221, 1, 0, 0, 0, 1403, 1404, 7, 4, 0, 0, 1404, 1405, 7, 17, 0, 0, 1405, 1406, 7, 2, 0, 0, 1406, 223, 1, 0, 0, 0, 1407, 1408, 5, 61, 0, 0, 1408, 225, 1, 0, 0, 0, 1409, 1410, 7, 32, 0, 0, 1410, 1411, 7, 33, 0, 0, 1411, 227, 1, 0, 0, 0, 1412, 1413, 5, 58, 0, 0, 1413, 1414, 5, 58, 0, 0, 1414, 229, 1, 0, 0, 0, 1415, 1416, 5, 58, 0, 0, 1416, 231, 1, 0, 0, 0, 1417, 1418, 5, 59, 0, 0, 1418, 233, 1, 0, 0, 0, 1419, 1420, 5, 44, 0, 0, 1420, 235, 1, 0, 0, 0, 1421, 1422, 7, 16, 0, 0, 1422, 1423, 7, 7, 0, 0, 1423, 1424, 7, 17, 0, 0, 1424, 1425, 7, 2, 0, 0, 1425, 237, 1, 0, 0, 0, 1426, 1427, 5, 46, 0, 0, 1427, 239, 1, 0, 0, 0, 1428, 1429, 7, 22, 0, 0, 1429, 1430, 7, 4, 0, 0, 1430, 1431, 7, 14, 0, 0, 1431, 1432, 7, 17, 0, 0, 1432, 1433, 7, 7, 0, 0, 1433, 241, 1, 0, 0, 0, 1434, 1435, 7, 22, 0, 0, 1435, 1436, 7, 10, 0, 0, 1436, 1437, 7, 12, 0, 0, 1437, 1438, 7, 17, 0, 0, 1438, 1439, 7, 11, 0, 0, 1439, 243, 1, 0, 0, 0, 1440, 1441, 7, 10, 0, 0, 1441, 1442, 7, 5, 0, 0, 1442, 245, 1, 0, 0, 0, 1443, 1444, 7, 10, 0, 0, 1444, 1445, 7, 17, 0, 0, 1445, 247, 1, 0, 0, 0, 1446, 1447, 7, 14, 0, 0, 1447, 1448, 7, 4, 0, 0, 1448, 1449, 7, 17, 0, 0, 1449, 1450, 7, 11, 0, 0, 1450, 249, 1, 0, 0, 0, 1451, 1452, 7, 14, 0, 0, 1452, 1453, 7, 10, 0, 0, 1453, 1454, 7, 19, 0, 0, 1454, 1455, 7, 7, 0, 0, 1455, 251, 1, 0, 0, 0, 1456, 1457, 7, 5, 0, 0, 1457, 1458, 7, 9, 0, 0, 1458, 1459, 7, 11, 0, 0, 1459, 253, 1, 0, 0, 0, 1460, 1461, 7, 5, 0, 0, 1461, 1462, 7, 21, 0, 0, 1462, 1463, 7, 14, 0, 0, 1463, 1464, 7, 14, 0, 0, 1464, 255, 1, 0, 0, 0, 1465, 1466, 7, 5, 0, 0, 1466, 1467, 7, 21, 0, 0, 1467, 1468, 7, 14, 0, 0, 1468, 1469, 7, 14, 0, 0, 1469, 1470, 7, 17, 0, 0, 1470, 257, 1, 0, 0, 0, 1471, 1472, 7, 9, 0, 0, 1472, 1473, 7, 5, 0, 0, 1473, 259, 1, 0, 0, 0, 1474, 1475, 7, 9, 0, 0, 1475, 1476, 7, 12, 0, 0, 1476, 261, 1, 0, 0, 0, 1477, 1478, 5, 63, 0, 0, 1478, 263, 1, 0, 0, 0, 1479, 1480, 7, 12, 0, 0, 1480, 1481, 7, 14, 0, 0, 1481, 1482, 7, 10, 0, 0, 1482, 1483, 7, 19, 0, 0, 1483, 1484, 7, 7, 0, 0, 1484, 265, 1, 0, 0, 0, 1485, 1486, 7, 11, 0, 0, 1486, 1487, 7, 12, 0, 0, 1487, 1488, 7, 21, 0, 0, 1488, 1489, 7, 7, 0, 0, 1489, 267, 1, 0, 0, 0, 1490, 1491, 7, 20, 0, 0, 1491, 1492, 7, 10, 0, 0, 1492, 1493, 7, 11, 0, 0, 1493, 1494, 7, 3, 0, 0, 1494, 269, 1, 0, 0, 0, 1495, 1496, 5, 61, 0, 0, 1496, 1497, 5, 61, 0, 0, 1497, 271, 1, 0, 0, 0, 1498, 1499, 5, 61, 0, 0, 1499, 1500, 5, 126, 0, 0, 1500, 273, 1, 0, 0, 0, 1501, 1502, 5, 33, 0, 0, 1502, 1503, 5, 61, 0, 0, 1503, 275, 1, 0, 0, 0, 1504, 1505, 5, 60, 0, 0, 1505, 277, 1, 0, 0, 0, 1506, 1507, 5, 60, 0, 0, 1507, 1508, 5, 61, 0, 0, 1508, 279, 1, 0, 0, 0, 1509, 1510, 5, 62, 0, 0, 1510, 281, 1, 0, 0, 0, 1511, 1512, 5, 62, 0, 0, 1512, 1513, 5, 61, 0, 0, 1513, 283, 1, 0, 0, 0, 1514, 1515, 5, 43, 0, 0, 1515, 285, 1, 0, 0, 0, 1516, 1517, 5, 45, 0, 0, 1517, 287, 1, 0, 0, 0, 1518, 1519, 5, 42, 0, 0, 1519, 289, 1, 0, 0, 0, 1520, 1521, 5, 47, 0, 0, 1521, 291, 1, 0, 0, 0, 1522, 1523, 5, 37, 0, 0, 1523, 293, 1, 0, 0, 0, 1524, 1525, 5, 123, 0, 0, 1525, 295, 1, 0, 0, 0, 1526, 1527, 5, 125, 0, 0, 1527, 297, 1, 0, 0, 0, 1528, 1529, 5, 63, 0, 0, 1529, 1530, 5, 63, 0, 0, 1530, 299, 1, 0, 0, 0, 1531, 1532, 3, 52, 16, 0, 1532, 1533, 1, 0, 0, 0, 1533, 1534, 6, 140, 41, 0, 1534, 301, 1, 0, 0, 0, 1535, 1538, 3, 262, 121, 0, 1536, 1539, 3, 196, 88, 0, 1537, 1539, 3, 210, 95, 0, 1538, 1536, 1, 0, 0, 0, 1538, 1537, 1, 0, 0, 0, 1539, 1543, 1, 0, 0, 0, 1540, 1542, 3, 212, 96, 0, 1541, 1540, 1, 0, 0, 0, 1542, 1545, 1, 0, 0, 0, 1543, 1541, 1, 0, 0, 0, 1543, 1544, 1, 0, 0, 0, 1544, 1553, 1, 0, 0, 0, 1545, 1543, 1, 0, 0, 0, 1546, 1548, 3, 262, 121, 0, 1547, 1549, 3, 194, 87, 0, 1548, 1547, 1, 0, 0, 0, 1549, 1550, 1, 0, 0, 0, 1550, 1548, 1, 0, 0, 0, 1550, 1551, 1, 0, 0, 0, 1551, 1553, 1, 0, 0, 0, 1552, 1535, 1, 0, 0, 0, 1552, 1546, 1, 0, 0, 0, 1553, 303, 1, 0, 0, 0, 1554, 1557, 3, 298, 139, 0, 1555, 1558, 3, 196, 88, 0, 1556, 1558, 3, 210, 95, 0, 1557, 1555, 1, 0, 0, 0, 1557, 1556, 1, 0, 0, 0, 1558, 1562, 1, 0, 0, 0, 1559, 1561, 3, 212, 96, 0, 1560, 1559, 1, 0, 0, 0, 1561, 1564, 1, 0, 0, 0, 1562, 1560, 1, 0, 0, 0, 1562, 1563, 1, 0, 0, 0, 1563, 1572, 1, 0, 0, 0, 1564, 1562, 1, 0, 0, 0, 1565, 1567, 3, 298, 139, 0, 1566, 1568, 3, 194, 87, 0, 1567, 1566, 1, 0, 0, 0, 1568, 1569, 1, 0, 0, 0, 1569, 1567, 1, 0, 0, 0, 1569, 1570, 1, 0, 0, 0, 1570, 1572, 1, 0, 0, 0, 1571, 1554, 1, 0, 0, 0, 1571, 1565, 1, 0, 0, 0, 1572, 305, 1, 0, 0, 0, 1573, 1574, 5, 91, 0, 0, 1574, 1575, 1, 0, 0, 0, 1575, 1576, 6, 143, 4, 0, 1576, 1577, 6, 143, 4, 0, 1577, 307, 1, 0, 0, 0, 1578, 1579, 5, 93, 0, 0, 1579, 1580, 1, 0, 0, 0, 1580, 1581, 6, 144, 19, 0, 1581, 1582, 6, 144, 19, 0, 1582, 309, 1, 0, 0, 0, 1583, 1584, 5, 40, 0, 0, 1584, 1585, 1, 0, 0, 0, 1585, 1586, 6, 145, 4, 0, 1586, 1587, 6, 145, 4, 0, 1587, 311, 1, 0, 0, 0, 1588, 1589, 5, 41, 0, 0, 1589, 1590, 1, 0, 0, 0, 1590, 1591, 6, 146, 19, 0, 1591, 1592, 6, 146, 19, 0, 1592, 313, 1, 0, 0, 0, 1593, 1597, 3, 196, 88, 0, 1594, 1596, 3, 212, 96, 0, 1595, 1594, 1, 0, 0, 0, 1596, 1599, 1, 0, 0, 0, 1597, 1595, 1, 0, 0, 0, 1597, 1598, 1, 0, 0, 0, 1598, 1610, 1, 0, 0, 0, 1599, 1597, 1, 0, 0, 0, 1600, 1603, 3, 210, 95, 0, 1601, 1603, 3, 204, 92, 0, 1602, 1600, 1, 0, 0, 0, 1602, 1601, 1, 0, 0, 0, 1603, 1605, 1, 0, 0, 0, 1604, 1606, 3, 212, 96, 0, 1605, 1604, 1, 0, 0, 0, 1606, 1607, 1, 0, 0, 0, 1607, 1605, 1, 0, 0, 0, 1607, 1608, 1, 0, 0, 0, 1608, 1610, 1, 0, 0, 0, 1609, 1593, 1, 0, 0, 0, 1609, 1602, 1, 0, 0, 0, 1610, 315, 1, 0, 0, 0, 1611, 1613, 3, 206, 93, 0, 1612, 1614, 3, 208, 94, 0, 1613, 1612, 1, 0, 0, 0, 1614, 1615, 1, 0, 0, 0, 1615, 1613, 1, 0, 0, 0, 1615, 1616, 1, 0, 0, 0, 1616, 1617, 1, 0, 0, 0, 1617, 1618, 3, 206, 93, 0, 1618, 317, 1, 0, 0, 0, 1619, 1620, 3, 316, 148, 0, 1620, 319, 1, 0, 0, 0, 1621, 1622, 3, 20, 0, 0, 1622, 1623, 1, 0, 0, 0, 1623, 1624, 6, 150, 0, 0, 1624, 321, 1, 0, 0, 0, 1625, 1626, 3, 22, 1, 0, 1626, 1627, 1, 0, 0, 0, 1627, 1628, 6, 151, 0, 0, 1628, 323, 1, 0, 0, 0, 1629, 1630, 3, 24, 2, 0, 1630, 1631, 1, 0, 0, 0, 1631, 1632, 6, 152, 0, 0, 1632, 325, 1, 0, 0, 0, 1633, 1634, 3, 192, 86, 0, 1634, 1635, 1, 0, 0, 0, 1635, 1636, 6, 153, 18, 0, 1636, 1637, 6, 153, 19, 0, 1637, 327, 1, 0, 0, 0, 1638, 1639, 3, 230, 105, 0, 1639, 1640, 1, 0, 0, 0, 1640, 1641, 6, 154, 42, 0, 1641, 329, 1, 0, 0, 0, 1642, 1643, 3, 228, 104, 0, 1643, 1644, 1, 0, 0, 0, 1644, 1645, 6, 155, 43, 0, 1645, 331, 1, 0, 0, 0, 1646, 1647, 3, 234, 107, 0, 1647, 1648, 1, 0, 0, 0, 1648, 1649, 6, 156, 24, 0, 1649, 333, 1, 0, 0, 0, 1650, 1651, 3, 224, 102, 0, 1651, 1652, 1, 0, 0, 0, 1652, 1653, 6, 157, 33, 0, 1653, 335, 1, 0, 0, 0, 1654, 1655, 7, 15, 0, 0, 1655, 1656, 7, 7, 0, 0, 1656, 1657, 7, 11, 0, 0, 1657, 1658, 7, 4, 0, 0, 1658, 1659, 7, 16, 0, 0, 1659, 1660, 7, 4, 0, 0, 1660, 1661, 7, 11, 0, 0, 1661, 1662, 7, 4, 0, 0, 1662, 337, 1, 0, 0, 0, 1663, 1664, 3, 268, 124, 0, 1664, 1665, 1, 0, 0, 0, 1665, 1666, 6, 159, 30, 0, 1666, 1667, 6, 159, 19, 0, 1667, 1668, 6, 159, 4, 0, 1668, 339, 1, 0, 0, 0, 1669, 1670, 3, 262, 121, 0, 1670, 1671, 1, 0, 0, 0, 1671, 1672, 6, 160, 35, 0, 1672, 341, 1, 0, 0, 0, 1673, 1674, 3, 302, 141, 0, 1674, 1675, 1, 0, 0, 0, 1675, 1676, 6, 161, 36, 0, 1676, 343, 1, 0, 0, 0, 1677, 1678, 3, 312, 146, 0, 1678, 1679, 1, 0, 0, 0, 1679, 1680, 6, 162, 20, 0, 1680, 1681, 6, 162, 19, 0, 1681, 1682, 6, 162, 19, 0, 1682, 345, 1, 0, 0, 0, 1683, 1684, 3, 310, 145, 0, 1684, 1685, 1, 0, 0, 0, 1685, 1686, 6, 163, 39, 0, 1686, 1687, 6, 163, 40, 0, 1687, 347, 1, 0, 0, 0, 1688, 1692, 8, 34, 0, 0, 1689, 1690, 5, 47, 0, 0, 1690, 1692, 8, 35, 0, 0, 1691, 1688, 1, 0, 0, 0, 1691, 1689, 1, 0, 0, 0, 1692, 349, 1, 0, 0, 0, 1693, 1695, 3, 348, 164, 0, 1694, 1693, 1, 0, 0, 0, 1695, 1696, 1, 0, 0, 0, 1696, 1694, 1, 0, 0, 0, 1696, 1697, 1, 0, 0, 0, 1697, 351, 1, 0, 0, 0, 1698, 1699, 3, 350, 165, 0, 1699, 1700, 1, 0, 0, 0, 1700, 1701, 6, 166, 44, 0, 1701, 353, 1, 0, 0, 0, 1702, 1703, 3, 214, 97, 0, 1703, 1704, 1, 0, 0, 0, 1704, 1705, 6, 167, 32, 0, 1705, 355, 1, 0, 0, 0, 1706, 1707, 3, 20, 0, 0, 1707, 1708, 1, 0, 0, 0, 1708, 1709, 6, 168, 0, 0, 1709, 357, 1, 0, 0, 0, 1710, 1711, 3, 22, 1, 0, 1711, 1712, 1, 0, 0, 0, 1712, 1713, 6, 169, 0, 0, 1713, 359, 1, 0, 0, 0, 1714, 1715, 3, 24, 2, 0, 1715, 1716, 1, 0, 0, 0, 1716, 1717, 6, 170, 0, 0, 1717, 361, 1, 0, 0, 0, 1718, 1719, 3, 310, 145, 0, 1719, 1720, 1, 0, 0, 0, 1720, 1721, 6, 171, 39, 0, 1721, 1722, 6, 171, 40, 0, 1722, 363, 1, 0, 0, 0, 1723, 1724, 3, 312, 146, 0, 1724, 1725, 1, 0, 0, 0, 1725, 1726, 6, 172, 20, 0, 1726, 1727, 6, 172, 19, 0, 1727, 1728, 6, 172, 19, 0, 1728, 365, 1, 0, 0, 0, 1729, 1730, 3, 192, 86, 0, 1730, 1731, 1, 0, 0, 0, 1731, 1732, 6, 173, 18, 0, 1732, 1733, 6, 173, 19, 0, 1733, 367, 1, 0, 0, 0, 1734, 1735, 3, 24, 2, 0, 1735, 1736, 1, 0, 0, 0, 1736, 1737, 6, 174, 0, 0, 1737, 369, 1, 0, 0, 0, 1738, 1739, 3, 20, 0, 0, 1739, 1740, 1, 0, 0, 0, 1740, 1741, 6, 175, 0, 0, 1741, 371, 1, 0, 0, 0, 1742, 1743, 3, 22, 1, 0, 1743, 1744, 1, 0, 0, 0, 1744, 1745, 6, 176, 0, 0, 1745, 373, 1, 0, 0, 0, 1746, 1747, 3, 192, 86, 0, 1747, 1748, 1, 0, 0, 0, 1748, 1749, 6, 177, 18, 0, 1749, 1750, 6, 177, 19, 0, 1750, 375, 1, 0, 0, 0, 1751, 1752, 3, 312, 146, 0, 1752, 1753, 1, 0, 0, 0, 1753, 1754, 6, 178, 20, 0, 1754, 1755, 6, 178, 19, 0, 1755, 1756, 6, 178, 19, 0, 1756, 377, 1, 0, 0, 0, 1757, 1758, 7, 6, 0, 0, 1758, 1759, 7, 12, 0, 0, 1759, 1760, 7, 9, 0, 0, 1760, 1761, 7, 21, 0, 0, 1761, 1762, 7, 8, 0, 0, 1762, 379, 1, 0, 0, 0, 1763, 1764, 7, 17, 0, 0, 1764, 1765, 7, 2, 0, 0, 1765, 1766, 7, 9, 0, 0, 1766, 1767, 7, 12, 0, 0, 1767, 1768, 7, 7, 0, 0, 1768, 381, 1, 0, 0, 0, 1769, 1770, 7, 19, 0, 0, 1770, 1771, 7, 7, 0, 0, 1771, 1772, 7, 33, 0, 0, 1772, 383, 1, 0, 0, 0, 1773, 1774, 3, 268, 124, 0, 1774, 1775, 1, 0, 0, 0, 1775, 1776, 6, 182, 30, 0, 1776, 1777, 6, 182, 19, 0, 1777, 1778, 6, 182, 4, 0, 1778, 385, 1, 0, 0, 0, 1779, 1780, 3, 234, 107, 0, 1780, 1781, 1, 0, 0, 0, 1781, 1782, 6, 183, 24, 0, 1782, 387, 1, 0, 0, 0, 1783, 1784, 3, 238, 109, 0, 1784, 1785, 1, 0, 0, 0, 1785, 1786, 6, 184, 23, 0, 1786, 389, 1, 0, 0, 0, 1787, 1788, 3, 262, 121, 0, 1788, 1789, 1, 0, 0, 0, 1789, 1790, 6, 185, 35, 0, 1790, 391, 1, 0, 0, 0, 1791, 1792, 3, 302, 141, 0, 1792, 1793, 1, 0, 0, 0, 1793, 1794, 6, 186, 36, 0, 1794, 393, 1, 0, 0, 0, 1795, 1796, 3, 298, 139, 0, 1796, 1797, 1, 0, 0, 0, 1797, 1798, 6, 187, 37, 0, 1798, 395, 1, 0, 0, 0, 1799, 1800, 3, 304, 142, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1802, 6, 188, 38, 0, 1802, 397, 1, 0, 0, 0, 1803, 1804, 3, 226, 103, 0, 1804, 1805, 1, 0, 0, 0, 1805, 1806, 6, 189, 45, 0, 1806, 399, 1, 0, 0, 0, 1807, 1808, 3, 318, 149, 0, 1808, 1809, 1, 0, 0, 0, 1809, 1810, 6, 190, 27, 0, 1810, 401, 1, 0, 0, 0, 1811, 1812, 3, 314, 147, 0, 1812, 1813, 1, 0, 0, 0, 1813, 1814, 6, 191, 28, 0, 1814, 403, 1, 0, 0, 0, 1815, 1816, 3, 20, 0, 0, 1816, 1817, 1, 0, 0, 0, 1817, 1818, 6, 192, 0, 0, 1818, 405, 1, 0, 0, 0, 1819, 1820, 3, 22, 1, 0, 1820, 1821, 1, 0, 0, 0, 1821, 1822, 6, 193, 0, 0, 1822, 407, 1, 0, 0, 0, 1823, 1824, 3, 24, 2, 0, 1824, 1825, 1, 0, 0, 0, 1825, 1826, 6, 194, 0, 0, 1826, 409, 1, 0, 0, 0, 1827, 1828, 7, 17, 0, 0, 1828, 1829, 7, 11, 0, 0, 1829, 1830, 7, 4, 0, 0, 1830, 1831, 7, 11, 0, 0, 1831, 1832, 7, 17, 0, 0, 1832, 1833, 1, 0, 0, 0, 1833, 1834, 6, 195, 19, 0, 1834, 1835, 6, 195, 4, 0, 1835, 411, 1, 0, 0, 0, 1836, 1837, 3, 20, 0, 0, 1837, 1838, 1, 0, 0, 0, 1838, 1839, 6, 196, 0, 0, 1839, 413, 1, 0, 0, 0, 1840, 1841, 3, 22, 1, 0, 1841, 1842, 1, 0, 0, 0, 1842, 1843, 6, 197, 0, 0, 1843, 415, 1, 0, 0, 0, 1844, 1845, 3, 24, 2, 0, 1845, 1846, 1, 0, 0, 0, 1846, 1847, 6, 198, 0, 0, 1847, 417, 1, 0, 0, 0, 1848, 1849, 3, 192, 86, 0, 1849, 1850, 1, 0, 0, 0, 1850, 1851, 6, 199, 18, 0, 1851, 1852, 6, 199, 19, 0, 1852, 419, 1, 0, 0, 0, 1853, 1854, 7, 36, 0, 0, 1854, 1855, 7, 9, 0, 0, 1855, 1856, 7, 10, 0, 0, 1856, 1857, 7, 5, 0, 0, 1857, 421, 1, 0, 0, 0, 1858, 1859, 3, 636, 308, 0, 1859, 1860, 1, 0, 0, 0, 1860, 1861, 6, 201, 22, 0, 1861, 423, 1, 0, 0, 0, 1862, 1863, 3, 258, 119, 0, 1863, 1864, 1, 0, 0, 0, 1864, 1865, 6, 202, 21, 0, 1865, 1866, 6, 202, 19, 0, 1866, 1867, 6, 202, 4, 0, 1867, 425, 1, 0, 0, 0, 1868, 1869, 7, 21, 0, 0, 1869, 1870, 7, 17, 0, 0, 1870, 1871, 7, 10, 0, 0, 1871, 1872, 7, 5, 0, 0, 1872, 1873, 7, 6, 0, 0, 1873, 1874, 1, 0, 0, 0, 1874, 1875, 6, 203, 19, 0, 1875, 1876, 6, 203, 4, 0, 1876, 427, 1, 0, 0, 0, 1877, 1878, 3, 350, 165, 0, 1878, 1879, 1, 0, 0, 0, 1879, 1880, 6, 204, 44, 0, 1880, 429, 1, 0, 0, 0, 1881, 1882, 3, 214, 97, 0, 1882, 1883, 1, 0, 0, 0, 1883, 1884, 6, 205, 32, 0, 1884, 431, 1, 0, 0, 0, 1885, 1886, 3, 230, 105, 0, 1886, 1887, 1, 0, 0, 0, 1887, 1888, 6, 206, 42, 0, 1888, 433, 1, 0, 0, 0, 1889, 1890, 3, 20, 0, 0, 1890, 1891, 1, 0, 0, 0, 1891, 1892, 6, 207, 0, 0, 1892, 435, 1, 0, 0, 0, 1893, 1894, 3, 22, 1, 0, 1894, 1895, 1, 0, 0, 0, 1895, 1896, 6, 208, 0, 0, 1896, 437, 1, 0, 0, 0, 1897, 1898, 3, 24, 2, 0, 1898, 1899, 1, 0, 0, 0, 1899, 1900, 6, 209, 0, 0, 1900, 439, 1, 0, 0, 0, 1901, 1902, 3, 192, 86, 0, 1902, 1903, 1, 0, 0, 0, 1903, 1904, 6, 210, 18, 0, 1904, 1905, 6, 210, 19, 0, 1905, 441, 1, 0, 0, 0, 1906, 1907, 3, 312, 146, 0, 1907, 1908, 1, 0, 0, 0, 1908, 1909, 6, 211, 20, 0, 1909, 1910, 6, 211, 19, 0, 1910, 1911, 6, 211, 19, 0, 1911, 443, 1, 0, 0, 0, 1912, 1913, 3, 230, 105, 0, 1913, 1914, 1, 0, 0, 0, 1914, 1915, 6, 212, 42, 0, 1915, 445, 1, 0, 0, 0, 1916, 1917, 3, 234, 107, 0, 1917, 1918, 1, 0, 0, 0, 1918, 1919, 6, 213, 24, 0, 1919, 447, 1, 0, 0, 0, 1920, 1921, 3, 238, 109, 0, 1921, 1922, 1, 0, 0, 0, 1922, 1923, 6, 214, 23, 0, 1923, 449, 1, 0, 0, 0, 1924, 1925, 3, 258, 119, 0, 1925, 1926, 1, 0, 0, 0, 1926, 1927, 6, 215, 21, 0, 1927, 1928, 6, 215, 46, 0, 1928, 451, 1, 0, 0, 0, 1929, 1930, 3, 350, 165, 0, 1930, 1931, 1, 0, 0, 0, 1931, 1932, 6, 216, 44, 0, 1932, 453, 1, 0, 0, 0, 1933, 1934, 3, 214, 97, 0, 1934, 1935, 1, 0, 0, 0, 1935, 1936, 6, 217, 32, 0, 1936, 455, 1, 0, 0, 0, 1937, 1938, 3, 20, 0, 0, 1938, 1939, 1, 0, 0, 0, 1939, 1940, 6, 218, 0, 0, 1940, 457, 1, 0, 0, 0, 1941, 1942, 3, 22, 1, 0, 1942, 1943, 1, 0, 0, 0, 1943, 1944, 6, 219, 0, 0, 1944, 459, 1, 0, 0, 0, 1945, 1946, 3, 24, 2, 0, 1946, 1947, 1, 0, 0, 0, 1947, 1948, 6, 220, 0, 0, 1948, 461, 1, 0, 0, 0, 1949, 1950, 3, 192, 86, 0, 1950, 1951, 1, 0, 0, 0, 1951, 1952, 6, 221, 18, 0, 1952, 1953, 6, 221, 19, 0, 1953, 1954, 6, 221, 19, 0, 1954, 463, 1, 0, 0, 0, 1955, 1956, 3, 312, 146, 0, 1956, 1957, 1, 0, 0, 0, 1957, 1958, 6, 222, 20, 0, 1958, 1959, 6, 222, 19, 0, 1959, 1960, 6, 222, 19, 0, 1960, 1961, 6, 222, 19, 0, 1961, 465, 1, 0, 0, 0, 1962, 1963, 3, 234, 107, 0, 1963, 1964, 1, 0, 0, 0, 1964, 1965, 6, 223, 24, 0, 1965, 467, 1, 0, 0, 0, 1966, 1967, 3, 238, 109, 0, 1967, 1968, 1, 0, 0, 0, 1968, 1969, 6, 224, 23, 0, 1969, 469, 1, 0, 0, 0, 1970, 1971, 3, 568, 274, 0, 1971, 1972, 1, 0, 0, 0, 1972, 1973, 6, 225, 34, 0, 1973, 471, 1, 0, 0, 0, 1974, 1975, 3, 20, 0, 0, 1975, 1976, 1, 0, 0, 0, 1976, 1977, 6, 226, 0, 0, 1977, 473, 1, 0, 0, 0, 1978, 1979, 3, 22, 1, 0, 1979, 1980, 1, 0, 0, 0, 1980, 1981, 6, 227, 0, 0, 1981, 475, 1, 0, 0, 0, 1982, 1983, 3, 24, 2, 0, 1983, 1984, 1, 0, 0, 0, 1984, 1985, 6, 228, 0, 0, 1985, 477, 1, 0, 0, 0, 1986, 1987, 3, 40, 10, 0, 1987, 1988, 1, 0, 0, 0, 1988, 1989, 6, 229, 19, 0, 1989, 1990, 6, 229, 4, 0, 1990, 479, 1, 0, 0, 0, 1991, 1992, 3, 258, 119, 0, 1992, 1993, 1, 0, 0, 0, 1993, 1994, 6, 230, 21, 0, 1994, 481, 1, 0, 0, 0, 1995, 1996, 3, 314, 147, 0, 1996, 1997, 1, 0, 0, 0, 1997, 1998, 6, 231, 28, 0, 1998, 483, 1, 0, 0, 0, 1999, 2000, 3, 306, 143, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 6, 232, 25, 0, 2002, 485, 1, 0, 0, 0, 2003, 2004, 3, 308, 144, 0, 2004, 2005, 1, 0, 0, 0, 2005, 2006, 6, 233, 26, 0, 2006, 487, 1, 0, 0, 0, 2007, 2008, 3, 234, 107, 0, 2008, 2009, 1, 0, 0, 0, 2009, 2010, 6, 234, 24, 0, 2010, 489, 1, 0, 0, 0, 2011, 2012, 3, 284, 132, 0, 2012, 2013, 1, 0, 0, 0, 2013, 2014, 6, 235, 47, 0, 2014, 491, 1, 0, 0, 0, 2015, 2016, 3, 286, 133, 0, 2016, 2017, 1, 0, 0, 0, 2017, 2018, 6, 236, 48, 0, 2018, 493, 1, 0, 0, 0, 2019, 2020, 3, 218, 99, 0, 2020, 2021, 1, 0, 0, 0, 2021, 2022, 6, 237, 49, 0, 2022, 495, 1, 0, 0, 0, 2023, 2024, 3, 216, 98, 0, 2024, 2025, 1, 0, 0, 0, 2025, 2026, 6, 238, 50, 0, 2026, 497, 1, 0, 0, 0, 2027, 2028, 3, 262, 121, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 6, 239, 35, 0, 2030, 499, 1, 0, 0, 0, 2031, 2032, 3, 302, 141, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2034, 6, 240, 36, 0, 2034, 501, 1, 0, 0, 0, 2035, 2036, 3, 310, 145, 0, 2036, 2037, 1, 0, 0, 0, 2037, 2038, 6, 241, 39, 0, 2038, 503, 1, 0, 0, 0, 2039, 2040, 3, 312, 146, 0, 2040, 2041, 1, 0, 0, 0, 2041, 2042, 6, 242, 20, 0, 2042, 505, 1, 0, 0, 0, 2043, 2044, 3, 214, 97, 0, 2044, 2045, 1, 0, 0, 0, 2045, 2046, 6, 243, 32, 0, 2046, 507, 1, 0, 0, 0, 2047, 2048, 3, 228, 104, 0, 2048, 2049, 1, 0, 0, 0, 2049, 2050, 6, 244, 43, 0, 2050, 509, 1, 0, 0, 0, 2051, 2052, 3, 20, 0, 0, 2052, 2053, 1, 0, 0, 0, 2053, 2054, 6, 245, 0, 0, 2054, 511, 1, 0, 0, 0, 2055, 2056, 3, 22, 1, 0, 2056, 2057, 1, 0, 0, 0, 2057, 2058, 6, 246, 0, 0, 2058, 513, 1, 0, 0, 0, 2059, 2060, 3, 24, 2, 0, 2060, 2061, 1, 0, 0, 0, 2061, 2062, 6, 247, 0, 0, 2062, 515, 1, 0, 0, 0, 2063, 2064, 3, 192, 86, 0, 2064, 2065, 1, 0, 0, 0, 2065, 2066, 6, 248, 18, 0, 2066, 2067, 6, 248, 19, 0, 2067, 517, 1, 0, 0, 0, 2068, 2069, 3, 312, 146, 0, 2069, 2070, 1, 0, 0, 0, 2070, 2071, 6, 249, 20, 0, 2071, 2072, 6, 249, 19, 0, 2072, 2073, 6, 249, 19, 0, 2073, 519, 1, 0, 0, 0, 2074, 2075, 3, 306, 143, 0, 2075, 2076, 1, 0, 0, 0, 2076, 2077, 6, 250, 25, 0, 2077, 521, 1, 0, 0, 0, 2078, 2079, 3, 308, 144, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2081, 6, 251, 26, 0, 2081, 523, 1, 0, 0, 0, 2082, 2083, 3, 238, 109, 0, 2083, 2084, 1, 0, 0, 0, 2084, 2085, 6, 252, 23, 0, 2085, 525, 1, 0, 0, 0, 2086, 2087, 3, 262, 121, 0, 2087, 2088, 1, 0, 0, 0, 2088, 2089, 6, 253, 35, 0, 2089, 527, 1, 0, 0, 0, 2090, 2091, 3, 302, 141, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2093, 6, 254, 36, 0, 2093, 529, 1, 0, 0, 0, 2094, 2095, 3, 298, 139, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2097, 6, 255, 37, 0, 2097, 531, 1, 0, 0, 0, 2098, 2099, 3, 304, 142, 0, 2099, 2100, 1, 0, 0, 0, 2100, 2101, 6, 256, 38, 0, 2101, 533, 1, 0, 0, 0, 2102, 2103, 3, 318, 149, 0, 2103, 2104, 1, 0, 0, 0, 2104, 2105, 6, 257, 27, 0, 2105, 535, 1, 0, 0, 0, 2106, 2107, 3, 314, 147, 0, 2107, 2108, 1, 0, 0, 0, 2108, 2109, 6, 258, 28, 0, 2109, 537, 1, 0, 0, 0, 2110, 2111, 3, 20, 0, 0, 2111, 2112, 1, 0, 0, 0, 2112, 2113, 6, 259, 0, 0, 2113, 539, 1, 0, 0, 0, 2114, 2115, 3, 22, 1, 0, 2115, 2116, 1, 0, 0, 0, 2116, 2117, 6, 260, 0, 0, 2117, 541, 1, 0, 0, 0, 2118, 2119, 3, 24, 2, 0, 2119, 2120, 1, 0, 0, 0, 2120, 2121, 6, 261, 0, 0, 2121, 543, 1, 0, 0, 0, 2122, 2123, 3, 192, 86, 0, 2123, 2124, 1, 0, 0, 0, 2124, 2125, 6, 262, 18, 0, 2125, 2126, 6, 262, 19, 0, 2126, 545, 1, 0, 0, 0, 2127, 2128, 3, 312, 146, 0, 2128, 2129, 1, 0, 0, 0, 2129, 2130, 6, 263, 20, 0, 2130, 2131, 6, 263, 19, 0, 2131, 2132, 6, 263, 19, 0, 2132, 547, 1, 0, 0, 0, 2133, 2134, 3, 238, 109, 0, 2134, 2135, 1, 0, 0, 0, 2135, 2136, 6, 264, 23, 0, 2136, 549, 1, 0, 0, 0, 2137, 2138, 3, 306, 143, 0, 2138, 2139, 1, 0, 0, 0, 2139, 2140, 6, 265, 25, 0, 2140, 551, 1, 0, 0, 0, 2141, 2142, 3, 308, 144, 0, 2142, 2143, 1, 0, 0, 0, 2143, 2144, 6, 266, 26, 0, 2144, 553, 1, 0, 0, 0, 2145, 2146, 3, 234, 107, 0, 2146, 2147, 1, 0, 0, 0, 2147, 2148, 6, 267, 24, 0, 2148, 555, 1, 0, 0, 0, 2149, 2150, 3, 262, 121, 0, 2150, 2151, 1, 0, 0, 0, 2151, 2152, 6, 268, 35, 0, 2152, 557, 1, 0, 0, 0, 2153, 2154, 3, 302, 141, 0, 2154, 2155, 1, 0, 0, 0, 2155, 2156, 6, 269, 36, 0, 2156, 559, 1, 0, 0, 0, 2157, 2158, 3, 298, 139, 0, 2158, 2159, 1, 0, 0, 0, 2159, 2160, 6, 270, 37, 0, 2160, 561, 1, 0, 0, 0, 2161, 2162, 3, 304, 142, 0, 2162, 2163, 1, 0, 0, 0, 2163, 2164, 6, 271, 38, 0, 2164, 563, 1, 0, 0, 0, 2165, 2170, 3, 196, 88, 0, 2166, 2170, 3, 194, 87, 0, 2167, 2170, 3, 210, 95, 0, 2168, 2170, 3, 288, 134, 0, 2169, 2165, 1, 0, 0, 0, 2169, 2166, 1, 0, 0, 0, 2169, 2167, 1, 0, 0, 0, 2169, 2168, 1, 0, 0, 0, 2170, 565, 1, 0, 0, 0, 2171, 2174, 3, 196, 88, 0, 2172, 2174, 3, 288, 134, 0, 2173, 2171, 1, 0, 0, 0, 2173, 2172, 1, 0, 0, 0, 2174, 2178, 1, 0, 0, 0, 2175, 2177, 3, 564, 272, 0, 2176, 2175, 1, 0, 0, 0, 2177, 2180, 1, 0, 0, 0, 2178, 2176, 1, 0, 0, 0, 2178, 2179, 1, 0, 0, 0, 2179, 2191, 1, 0, 0, 0, 2180, 2178, 1, 0, 0, 0, 2181, 2184, 3, 210, 95, 0, 2182, 2184, 3, 204, 92, 0, 2183, 2181, 1, 0, 0, 0, 2183, 2182, 1, 0, 0, 0, 2184, 2186, 1, 0, 0, 0, 2185, 2187, 3, 564, 272, 0, 2186, 2185, 1, 0, 0, 0, 2187, 2188, 1, 0, 0, 0, 2188, 2186, 1, 0, 0, 0, 2188, 2189, 1, 0, 0, 0, 2189, 2191, 1, 0, 0, 0, 2190, 2173, 1, 0, 0, 0, 2190, 2183, 1, 0, 0, 0, 2191, 567, 1, 0, 0, 0, 2192, 2195, 3, 566, 273, 0, 2193, 2195, 3, 316, 148, 0, 2194, 2192, 1, 0, 0, 0, 2194, 2193, 1, 0, 0, 0, 2195, 2196, 1, 0, 0, 0, 2196, 2194, 1, 0, 0, 0, 2196, 2197, 1, 0, 0, 0, 2197, 569, 1, 0, 0, 0, 2198, 2199, 3, 20, 0, 0, 2199, 2200, 1, 0, 0, 0, 2200, 2201, 6, 275, 0, 0, 2201, 571, 1, 0, 0, 0, 2202, 2203, 3, 22, 1, 0, 2203, 2204, 1, 0, 0, 0, 2204, 2205, 6, 276, 0, 0, 2205, 573, 1, 0, 0, 0, 2206, 2207, 3, 24, 2, 0, 2207, 2208, 1, 0, 0, 0, 2208, 2209, 6, 277, 0, 0, 2209, 575, 1, 0, 0, 0, 2210, 2211, 3, 314, 147, 0, 2211, 2212, 1, 0, 0, 0, 2212, 2213, 6, 278, 28, 0, 2213, 577, 1, 0, 0, 0, 2214, 2215, 3, 318, 149, 0, 2215, 2216, 1, 0, 0, 0, 2216, 2217, 6, 279, 27, 0, 2217, 579, 1, 0, 0, 0, 2218, 2219, 3, 224, 102, 0, 2219, 2220, 1, 0, 0, 0, 2220, 2221, 6, 280, 33, 0, 2221, 581, 1, 0, 0, 0, 2222, 2223, 3, 302, 141, 0, 2223, 2224, 1, 0, 0, 0, 2224, 2225, 6, 281, 36, 0, 2225, 583, 1, 0, 0, 0, 2226, 2227, 3, 350, 165, 0, 2227, 2228, 1, 0, 0, 0, 2228, 2229, 6, 282, 44, 0, 2229, 585, 1, 0, 0, 0, 2230, 2231, 3, 214, 97, 0, 2231, 2232, 1, 0, 0, 0, 2232, 2233, 6, 283, 32, 0, 2233, 587, 1, 0, 0, 0, 2234, 2235, 3, 230, 105, 0, 2235, 2236, 1, 0, 0, 0, 2236, 2237, 6, 284, 42, 0, 2237, 589, 1, 0, 0, 0, 2238, 2239, 3, 228, 104, 0, 2239, 2240, 1, 0, 0, 0, 2240, 2241, 6, 285, 43, 0, 2241, 591, 1, 0, 0, 0, 2242, 2243, 3, 234, 107, 0, 2243, 2244, 1, 0, 0, 0, 2244, 2245, 6, 286, 24, 0, 2245, 593, 1, 0, 0, 0, 2246, 2247, 3, 192, 86, 0, 2247, 2248, 1, 0, 0, 0, 2248, 2249, 6, 287, 18, 0, 2249, 2250, 6, 287, 19, 0, 2250, 595, 1, 0, 0, 0, 2251, 2252, 3, 310, 145, 0, 2252, 2253, 6, 288, 51, 0, 2253, 2254, 1, 0, 0, 0, 2254, 2255, 6, 288, 39, 0, 2255, 597, 1, 0, 0, 0, 2256, 2257, 5, 41, 0, 0, 2257, 2258, 4, 289, 8, 0, 2258, 2259, 6, 289, 52, 0, 2259, 2260, 1, 0, 0, 0, 2260, 2261, 6, 289, 20, 0, 2261, 599, 1, 0, 0, 0, 2262, 2263, 5, 41, 0, 0, 2263, 2264, 4, 290, 9, 0, 2264, 2265, 6, 290, 53, 0, 2265, 2266, 1, 0, 0, 0, 2266, 2267, 6, 290, 20, 0, 2267, 2268, 6, 290, 19, 0, 2268, 601, 1, 0, 0, 0, 2269, 2270, 3, 20, 0, 0, 2270, 2271, 1, 0, 0, 0, 2271, 2272, 6, 291, 0, 0, 2272, 603, 1, 0, 0, 0, 2273, 2274, 3, 22, 1, 0, 2274, 2275, 1, 0, 0, 0, 2275, 2276, 6, 292, 0, 0, 2276, 605, 1, 0, 0, 0, 2277, 2278, 3, 24, 2, 0, 2278, 2279, 1, 0, 0, 0, 2279, 2280, 6, 293, 0, 0, 2280, 607, 1, 0, 0, 0, 2281, 2285, 5, 35, 0, 0, 2282, 2284, 8, 0, 0, 0, 2283, 2282, 1, 0, 0, 0, 2284, 2287, 1, 0, 0, 0, 2285, 2283, 1, 0, 0, 0, 2285, 2286, 1, 0, 0, 0, 2286, 2289, 1, 0, 0, 0, 2287, 2285, 1, 0, 0, 0, 2288, 2290, 5, 13, 0, 0, 2289, 2288, 1, 0, 0, 0, 2289, 2290, 1, 0, 0, 0, 2290, 2292, 1, 0, 0, 0, 2291, 2293, 5, 10, 0, 0, 2292, 2291, 1, 0, 0, 0, 2292, 2293, 1, 0, 0, 0, 2293, 609, 1, 0, 0, 0, 2294, 2300, 5, 39, 0, 0, 2295, 2296, 5, 92, 0, 0, 2296, 2299, 9, 0, 0, 0, 2297, 2299, 8, 37, 0, 0, 2298, 2295, 1, 0, 0, 0, 2298, 2297, 1, 0, 0, 0, 2299, 2302, 1, 0, 0, 0, 2300, 2298, 1, 0, 0, 0, 2300, 2301, 1, 0, 0, 0, 2301, 2303, 1, 0, 0, 0, 2302, 2300, 1, 0, 0, 0, 2303, 2304, 5, 39, 0, 0, 2304, 611, 1, 0, 0, 0, 2305, 2306, 8, 38, 0, 0, 2306, 613, 1, 0, 0, 0, 2307, 2308, 3, 192, 86, 0, 2308, 2309, 1, 0, 0, 0, 2309, 2310, 6, 297, 18, 0, 2310, 2311, 6, 297, 19, 0, 2311, 615, 1, 0, 0, 0, 2312, 2313, 3, 312, 146, 0, 2313, 2314, 1, 0, 0, 0, 2314, 2315, 6, 298, 20, 0, 2315, 2316, 6, 298, 19, 0, 2316, 2317, 6, 298, 19, 0, 2317, 617, 1, 0, 0, 0, 2318, 2319, 3, 306, 143, 0, 2319, 2320, 1, 0, 0, 0, 2320, 2321, 6, 299, 25, 0, 2321, 619, 1, 0, 0, 0, 2322, 2323, 3, 308, 144, 0, 2323, 2324, 1, 0, 0, 0, 2324, 2325, 6, 300, 26, 0, 2325, 621, 1, 0, 0, 0, 2326, 2327, 3, 224, 102, 0, 2327, 2328, 1, 0, 0, 0, 2328, 2329, 6, 301, 33, 0, 2329, 623, 1, 0, 0, 0, 2330, 2331, 3, 234, 107, 0, 2331, 2332, 1, 0, 0, 0, 2332, 2333, 6, 302, 24, 0, 2333, 625, 1, 0, 0, 0, 2334, 2335, 3, 238, 109, 0, 2335, 2336, 1, 0, 0, 0, 2336, 2337, 6, 303, 23, 0, 2337, 627, 1, 0, 0, 0, 2338, 2339, 3, 262, 121, 0, 2339, 2340, 1, 0, 0, 0, 2340, 2341, 6, 304, 35, 0, 2341, 629, 1, 0, 0, 0, 2342, 2343, 3, 302, 141, 0, 2343, 2344, 1, 0, 0, 0, 2344, 2345, 6, 305, 36, 0, 2345, 631, 1, 0, 0, 0, 2346, 2347, 3, 298, 139, 0, 2347, 2348, 1, 0, 0, 0, 2348, 2349, 6, 306, 37, 0, 2349, 633, 1, 0, 0, 0, 2350, 2351, 3, 304, 142, 0, 2351, 2352, 1, 0, 0, 0, 2352, 2353, 6, 307, 38, 0, 2353, 635, 1, 0, 0, 0, 2354, 2355, 7, 4, 0, 0, 2355, 2356, 7, 17, 0, 0, 2356, 637, 1, 0, 0, 0, 2357, 2358, 3, 568, 274, 0, 2358, 2359, 1, 0, 0, 0, 2359, 2360, 6, 309, 34, 0, 2360, 639, 1, 0, 0, 0, 2361, 2362, 3, 20, 0, 0, 2362, 2363, 1, 0, 0, 0, 2363, 2364, 6, 310, 0, 0, 2364, 641, 1, 0, 0, 0, 2365, 2366, 3, 22, 1, 0, 2366, 2367, 1, 0, 0, 0, 2367, 2368, 6, 311, 0, 0, 2368, 643, 1, 0, 0, 0, 2369, 2370, 3, 24, 2, 0, 2370, 2371, 1, 0, 0, 0, 2371, 2372, 6, 312, 0, 0, 2372, 645, 1, 0, 0, 0, 2373, 2374, 3, 266, 123, 0, 2374, 2375, 1, 0, 0, 0, 2375, 2376, 6, 313, 54, 0, 2376, 647, 1, 0, 0, 0, 2377, 2378, 3, 240, 110, 0, 2378, 2379, 1, 0, 0, 0, 2379, 2380, 6, 314, 55, 0, 2380, 649, 1, 0, 0, 0, 2381, 2382, 3, 254, 117, 0, 2382, 2383, 1, 0, 0, 0, 2383, 2384, 6, 315, 56, 0, 2384, 651, 1, 0, 0, 0, 2385, 2386, 3, 232, 106, 0, 2386, 2387, 1, 0, 0, 0, 2387, 2388, 6, 316, 57, 0, 2388, 2389, 6, 316, 19, 0, 2389, 653, 1, 0, 0, 0, 2390, 2391, 3, 224, 102, 0, 2391, 2392, 1, 0, 0, 0, 2392, 2393, 6, 317, 33, 0, 2393, 655, 1, 0, 0, 0, 2394, 2395, 3, 214, 97, 0, 2395, 2396, 1, 0, 0, 0, 2396, 2397, 6, 318, 32, 0, 2397, 657, 1, 0, 0, 0, 2398, 2399, 3, 314, 147, 0, 2399, 2400, 1, 0, 0, 0, 2400, 2401, 6, 319, 28, 0, 2401, 659, 1, 0, 0, 0, 2402, 2403, 3, 318, 149, 0, 2403, 2404, 1, 0, 0, 0, 2404, 2405, 6, 320, 27, 0, 2405, 661, 1, 0, 0, 0, 2406, 2407, 3, 218, 99, 0, 2407, 2408, 1, 0, 0, 0, 2408, 2409, 6, 321, 49, 0, 2409, 663, 1, 0, 0, 0, 2410, 2411, 3, 216, 98, 0, 2411, 2412, 1, 0, 0, 0, 2412, 2413, 6, 322, 50, 0, 2413, 665, 1, 0, 0, 0, 2414, 2415, 3, 230, 105, 0, 2415, 2416, 1, 0, 0, 0, 2416, 2417, 6, 323, 42, 0, 2417, 667, 1, 0, 0, 0, 2418, 2419, 3, 234, 107, 0, 2419, 2420, 1, 0, 0, 0, 2420, 2421, 6, 324, 24, 0, 2421, 669, 1, 0, 0, 0, 2422, 2423, 3, 238, 109, 0, 2423, 2424, 1, 0, 0, 0, 2424, 2425, 6, 325, 23, 0, 2425, 671, 1, 0, 0, 0, 2426, 2427, 3, 262, 121, 0, 2427, 2428, 1, 0, 0, 0, 2428, 2429, 6, 326, 35, 0, 2429, 673, 1, 0, 0, 0, 2430, 2431, 3, 302, 141, 0, 2431, 2432, 1, 0, 0, 0, 2432, 2433, 6, 327, 36, 0, 2433, 675, 1, 0, 0, 0, 2434, 2435, 3, 294, 137, 0, 2435, 2436, 1, 0, 0, 0, 2436, 2437, 6, 328, 58, 0, 2437, 677, 1, 0, 0, 0, 2438, 2439, 3, 296, 138, 0, 2439, 2440, 1, 0, 0, 0, 2440, 2441, 6, 329, 59, 0, 2441, 679, 1, 0, 0, 0, 2442, 2443, 3, 298, 139, 0, 2443, 2444, 1, 0, 0, 0, 2444, 2445, 6, 330, 37, 0, 2445, 681, 1, 0, 0, 0, 2446, 2447, 3, 304, 142, 0, 2447, 2448, 1, 0, 0, 0, 2448, 2449, 6, 331, 38, 0, 2449, 683, 1, 0, 0, 0, 2450, 2451, 3, 306, 143, 0, 2451, 2452, 1, 0, 0, 0, 2452, 2453, 6, 332, 25, 0, 2453, 685, 1, 0, 0, 0, 2454, 2455, 3, 308, 144, 0, 2455, 2456, 1, 0, 0, 0, 2456, 2457, 6, 333, 26, 0, 2457, 687, 1, 0, 0, 0, 2458, 2459, 3, 568, 274, 0, 2459, 2460, 1, 0, 0, 0, 2460, 2461, 6, 334, 34, 0, 2461, 689, 1, 0, 0, 0, 2462, 2463, 3, 20, 0, 0, 2463, 2464, 1, 0, 0, 0, 2464, 2465, 6, 335, 0, 0, 2465, 691, 1, 0, 0, 0, 2466, 2467, 3, 22, 1, 0, 2467, 2468, 1, 0, 0, 0, 2468, 2469, 6, 336, 0, 0, 2469, 693, 1, 0, 0, 0, 2470, 2471, 3, 24, 2, 0, 2471, 2472, 1, 0, 0, 0, 2472, 2473, 6, 337, 0, 0, 2473, 695, 1, 0, 0, 0, 2474, 2475, 3, 192, 86, 0, 2475, 2476, 1, 0, 0, 0, 2476, 2477, 6, 338, 18, 0, 2477, 2478, 6, 338, 19, 0, 2478, 697, 1, 0, 0, 0, 2479, 2480, 7, 10, 0, 0, 2480, 2481, 7, 5, 0, 0, 2481, 2482, 7, 22, 0, 0, 2482, 2483, 7, 9, 0, 0, 2483, 699, 1, 0, 0, 0, 2484, 2485, 3, 20, 0, 0, 2485, 2486, 1, 0, 0, 0, 2486, 2487, 6, 340, 0, 0, 2487, 701, 1, 0, 0, 0, 2488, 2489, 3, 22, 1, 0, 2489, 2490, 1, 0, 0, 0, 2490, 2491, 6, 341, 0, 0, 2491, 703, 1, 0, 0, 0, 2492, 2493, 3, 24, 2, 0, 2493, 2494, 1, 0, 0, 0, 2494, 2495, 6, 342, 0, 0, 2495, 705, 1, 0, 0, 0, 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 712, 716, 719, 728, 730, 741, 1070, 1155, 1159, 1164, 1296, 1301, 1310, 1317, 1322, 1324, 1335, 1343, 1346, 1348, 1353, 1358, 1364, 1371, 1376, 1382, 1385, 1393, 1397, 1538, 1543, 1550, 1552, 1557, 1562, 1569, 1571, 1597, 1602, 1607, 1609, 1615, 1691, 1696, 2169, 2173, 2178, 2183, 2188, 2190, 2194, 2196, 2285, 2289, 2292, 2298, 2300, 60, 0, 1, 0, 5, 1, 0, 5, 2, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 11, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 5, 17, 0, 5, 18, 0, 5, 19, 0, 7, 54, 0, 4, 0, 0, 7, 103, 0, 7, 77, 0, 7, 155, 0, 7, 67, 0, 7, 65, 0, 7, 100, 0, 7, 101, 0, 7, 105, 0, 7, 104, 0, 5, 3, 0, 7, 82, 0, 7, 44, 0, 7, 55, 0, 7, 60, 0, 7, 145, 0, 7, 79, 0, 7, 98, 0, 7, 97, 0, 7, 99, 0, 7, 102, 0, 5, 0, 0, 7, 17, 0, 7, 63, 0, 7, 62, 0, 7, 110, 0, 7, 61, 0, 5, 12, 0, 7, 90, 0, 7, 91, 0, 7, 57, 0, 7, 56, 0, 1, 288, 0, 1, 289, 1, 1, 290, 2, 7, 81, 0, 7, 68, 0, 7, 75, 0, 7, 64, 0, 7, 95, 0, 7, 96, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index b02ba4dbcac47..9e3066b5ab337 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -27,38 +27,39 @@ public class EsqlBaseLexer extends LexerConfig { public static final int LINE_COMMENT=1, MULTILINE_COMMENT=2, WS=3, CHANGE_POINT=4, ENRICH=5, DEV_EXPLAIN=6, COMPLETION=7, DISSECT=8, EVAL=9, GROK=10, LIMIT=11, RERANK=12, ROW=13, - SAMPLE=14, SORT=15, STATS=16, WHERE=17, FROM=18, TS=19, EXTERNAL=20, FORK=21, - FUSE=22, INLINE=23, INLINESTATS=24, JOIN_LOOKUP=25, DEV_JOIN_FULL=26, - DEV_JOIN_LEFT=27, DEV_JOIN_RIGHT=28, DEV_LOOKUP=29, DEV_MMR=30, MV_EXPAND=31, - DROP=32, KEEP=33, DEV_INSIST=34, PROMQL=35, RENAME=36, SET=37, SHOW=38, - UNKNOWN_CMD=39, CHANGE_POINT_LINE_COMMENT=40, CHANGE_POINT_MULTILINE_COMMENT=41, - CHANGE_POINT_WS=42, ENRICH_POLICY_NAME=43, ENRICH_LINE_COMMENT=44, ENRICH_MULTILINE_COMMENT=45, - ENRICH_WS=46, ENRICH_FIELD_LINE_COMMENT=47, ENRICH_FIELD_MULTILINE_COMMENT=48, - ENRICH_FIELD_WS=49, EXPLAIN_WS=50, EXPLAIN_LINE_COMMENT=51, EXPLAIN_MULTILINE_COMMENT=52, - PIPE=53, QUOTED_STRING=54, INTEGER_LITERAL=55, DECIMAL_LITERAL=56, AND=57, - ASC=58, ASSIGN=59, BY=60, CAST_OP=61, COLON=62, SEMICOLON=63, COMMA=64, - DESC=65, DOT=66, FALSE=67, FIRST=68, IN=69, IS=70, LAST=71, LIKE=72, NOT=73, - NULL=74, NULLS=75, ON=76, OR=77, PARAM=78, RLIKE=79, TRUE=80, WITH=81, - EQ=82, CIEQ=83, NEQ=84, LT=85, LTE=86, GT=87, GTE=88, PLUS=89, MINUS=90, - ASTERISK=91, SLASH=92, PERCENT=93, LEFT_BRACES=94, RIGHT_BRACES=95, DOUBLE_PARAMS=96, - NAMED_OR_POSITIONAL_PARAM=97, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=98, OPENING_BRACKET=99, - CLOSING_BRACKET=100, LP=101, RP=102, UNQUOTED_IDENTIFIER=103, QUOTED_IDENTIFIER=104, - EXPR_LINE_COMMENT=105, EXPR_MULTILINE_COMMENT=106, EXPR_WS=107, METADATA=108, - UNQUOTED_SOURCE=109, FROM_LINE_COMMENT=110, FROM_MULTILINE_COMMENT=111, - FROM_WS=112, FORK_WS=113, FORK_LINE_COMMENT=114, FORK_MULTILINE_COMMENT=115, - GROUP=116, SCORE=117, KEY=118, FUSE_LINE_COMMENT=119, FUSE_MULTILINE_COMMENT=120, - FUSE_WS=121, INLINE_STATS=122, INLINE_LINE_COMMENT=123, INLINE_MULTILINE_COMMENT=124, - INLINE_WS=125, JOIN=126, USING=127, JOIN_LINE_COMMENT=128, JOIN_MULTILINE_COMMENT=129, - JOIN_WS=130, LOOKUP_LINE_COMMENT=131, LOOKUP_MULTILINE_COMMENT=132, LOOKUP_WS=133, - LOOKUP_FIELD_LINE_COMMENT=134, LOOKUP_FIELD_MULTILINE_COMMENT=135, LOOKUP_FIELD_WS=136, - MMR_LIMIT=137, MMR_LINE_COMMENT=138, MMR_MULTILINE_COMMENT=139, MMR_WS=140, - MVEXPAND_LINE_COMMENT=141, MVEXPAND_MULTILINE_COMMENT=142, MVEXPAND_WS=143, - ID_PATTERN=144, PROJECT_LINE_COMMENT=145, PROJECT_MULTILINE_COMMENT=146, - PROJECT_WS=147, PROMQL_PARAMS_LINE_COMMENT=148, PROMQL_PARAMS_MULTILINE_COMMENT=149, - PROMQL_PARAMS_WS=150, PROMQL_QUERY_COMMENT=151, PROMQL_SINGLE_QUOTED_STRING=152, - PROMQL_OTHER_QUERY_CONTENT=153, AS=154, RENAME_LINE_COMMENT=155, RENAME_MULTILINE_COMMENT=156, - RENAME_WS=157, SET_LINE_COMMENT=158, SET_MULTILINE_COMMENT=159, SET_WS=160, - INFO=161, SHOW_LINE_COMMENT=162, SHOW_MULTILINE_COMMENT=163, SHOW_WS=164; + SAMPLE=14, SORT=15, STATS=16, WHERE=17, URI_PARTS=18, FROM=19, TS=20, + EXTERNAL=21, FORK=22, FUSE=23, INLINE=24, INLINESTATS=25, JOIN_LOOKUP=26, + DEV_JOIN_FULL=27, DEV_JOIN_LEFT=28, DEV_JOIN_RIGHT=29, DEV_LOOKUP=30, + DEV_MMR=31, MV_EXPAND=32, DROP=33, KEEP=34, DEV_INSIST=35, PROMQL=36, + RENAME=37, SET=38, SHOW=39, UNKNOWN_CMD=40, CHANGE_POINT_LINE_COMMENT=41, + CHANGE_POINT_MULTILINE_COMMENT=42, CHANGE_POINT_WS=43, ENRICH_POLICY_NAME=44, + ENRICH_LINE_COMMENT=45, ENRICH_MULTILINE_COMMENT=46, ENRICH_WS=47, ENRICH_FIELD_LINE_COMMENT=48, + ENRICH_FIELD_MULTILINE_COMMENT=49, ENRICH_FIELD_WS=50, EXPLAIN_WS=51, + EXPLAIN_LINE_COMMENT=52, EXPLAIN_MULTILINE_COMMENT=53, PIPE=54, QUOTED_STRING=55, + INTEGER_LITERAL=56, DECIMAL_LITERAL=57, AND=58, ASC=59, ASSIGN=60, BY=61, + CAST_OP=62, COLON=63, SEMICOLON=64, COMMA=65, DESC=66, DOT=67, FALSE=68, + FIRST=69, IN=70, IS=71, LAST=72, LIKE=73, NOT=74, NULL=75, NULLS=76, ON=77, + OR=78, PARAM=79, RLIKE=80, TRUE=81, WITH=82, EQ=83, CIEQ=84, NEQ=85, LT=86, + LTE=87, GT=88, GTE=89, PLUS=90, MINUS=91, ASTERISK=92, SLASH=93, PERCENT=94, + LEFT_BRACES=95, RIGHT_BRACES=96, DOUBLE_PARAMS=97, NAMED_OR_POSITIONAL_PARAM=98, + NAMED_OR_POSITIONAL_DOUBLE_PARAMS=99, OPENING_BRACKET=100, CLOSING_BRACKET=101, + LP=102, RP=103, UNQUOTED_IDENTIFIER=104, QUOTED_IDENTIFIER=105, EXPR_LINE_COMMENT=106, + EXPR_MULTILINE_COMMENT=107, EXPR_WS=108, METADATA=109, UNQUOTED_SOURCE=110, + FROM_LINE_COMMENT=111, FROM_MULTILINE_COMMENT=112, FROM_WS=113, FORK_WS=114, + FORK_LINE_COMMENT=115, FORK_MULTILINE_COMMENT=116, GROUP=117, SCORE=118, + KEY=119, FUSE_LINE_COMMENT=120, FUSE_MULTILINE_COMMENT=121, FUSE_WS=122, + INLINE_STATS=123, INLINE_LINE_COMMENT=124, INLINE_MULTILINE_COMMENT=125, + INLINE_WS=126, JOIN=127, USING=128, JOIN_LINE_COMMENT=129, JOIN_MULTILINE_COMMENT=130, + JOIN_WS=131, LOOKUP_LINE_COMMENT=132, LOOKUP_MULTILINE_COMMENT=133, LOOKUP_WS=134, + LOOKUP_FIELD_LINE_COMMENT=135, LOOKUP_FIELD_MULTILINE_COMMENT=136, LOOKUP_FIELD_WS=137, + MMR_LIMIT=138, MMR_LINE_COMMENT=139, MMR_MULTILINE_COMMENT=140, MMR_WS=141, + MVEXPAND_LINE_COMMENT=142, MVEXPAND_MULTILINE_COMMENT=143, MVEXPAND_WS=144, + ID_PATTERN=145, PROJECT_LINE_COMMENT=146, PROJECT_MULTILINE_COMMENT=147, + PROJECT_WS=148, PROMQL_PARAMS_LINE_COMMENT=149, PROMQL_PARAMS_MULTILINE_COMMENT=150, + PROMQL_PARAMS_WS=151, PROMQL_QUERY_COMMENT=152, PROMQL_SINGLE_QUOTED_STRING=153, + PROMQL_OTHER_QUERY_CONTENT=154, AS=155, RENAME_LINE_COMMENT=156, RENAME_MULTILINE_COMMENT=157, + RENAME_WS=158, SET_LINE_COMMENT=159, SET_MULTILINE_COMMENT=160, SET_WS=161, + INFO=162, SHOW_LINE_COMMENT=163, SHOW_MULTILINE_COMMENT=164, SHOW_WS=165; public static final int CHANGE_POINT_MODE=1, ENRICH_MODE=2, ENRICH_FIELD_MODE=3, EXPLAIN_MODE=4, EXPRESSION_MODE=5, FROM_MODE=6, FORK_MODE=7, FUSE_MODE=8, INLINE_MODE=9, @@ -80,8 +81,8 @@ private static String[] makeRuleNames() { return new String[] { "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", - "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "FROM", "TS", "EXTERNAL", - "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", + "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "URI_PARTS", "FROM", "TS", + "EXTERNAL", "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "DEV_MMR", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_PIPE", "CHANGE_POINT_RP", "CHANGE_POINT_ON", "CHANGE_POINT_AS", @@ -166,21 +167,22 @@ private static String[] makeLiteralNames() { return new String[] { null, null, null, null, "'change_point'", "'enrich'", null, "'completion'", "'dissect'", "'eval'", "'grok'", "'limit'", "'rerank'", "'row'", "'sample'", - "'sort'", null, "'where'", "'from'", "'ts'", null, "'fork'", "'fuse'", - "'inline'", "'inlinestats'", "'lookup'", null, null, null, null, null, - "'mv_expand'", "'drop'", "'keep'", null, "'promql'", "'rename'", "'set'", - "'show'", null, null, null, null, null, null, null, null, null, null, - null, null, null, null, "'|'", null, null, null, "'and'", "'asc'", "'='", - "'by'", "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", "'first'", - "'in'", "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", "'on'", - "'or'", "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", "'!='", - "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", - "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, null, - null, null, "'metadata'", null, null, null, null, null, null, null, "'group'", - "'score'", "'key'", null, null, null, null, null, null, null, "'join'", - "'USING'", null, null, null, null, null, null, null, null, null, null, + "'sort'", null, "'where'", "'uri_parts'", "'from'", "'ts'", null, "'fork'", + "'fuse'", "'inline'", "'inlinestats'", "'lookup'", null, null, null, + null, null, "'mv_expand'", "'drop'", "'keep'", null, "'promql'", "'rename'", + "'set'", "'show'", null, null, null, null, null, null, null, null, null, + null, null, null, null, null, "'|'", null, null, null, "'and'", "'asc'", + "'='", "'by'", "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", + "'first'", "'in'", "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", + "'on'", "'or'", "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", + "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", + "'{'", "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, + null, null, null, "'metadata'", null, null, null, null, null, null, null, + "'group'", "'score'", "'key'", null, null, null, null, null, null, null, + "'join'", "'USING'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, "'as'", null, null, null, null, null, null, "'info'" + null, null, null, null, null, null, "'as'", null, null, null, null, null, + null, "'info'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -188,8 +190,8 @@ private static String[] makeSymbolicNames() { return new String[] { null, "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", - "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "FROM", "TS", "EXTERNAL", - "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", + "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "URI_PARTS", "FROM", "TS", + "EXTERNAL", "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "DEV_MMR", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", @@ -283,13 +285,13 @@ public EsqlBaseLexer(CharStream input) { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 287: + case 288: PROMQL_LP_action((RuleContext)_localctx, actionIndex); break; - case 288: + case 289: PROMQL_NESTED_RP_action((RuleContext)_localctx, actionIndex); break; - case 289: + case 290: PROMQL_QUERY_RP_action((RuleContext)_localctx, actionIndex); break; } @@ -320,23 +322,23 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { case 5: return DEV_EXPLAIN_sempred((RuleContext)_localctx, predIndex); - case 19: + case 20: return EXTERNAL_sempred((RuleContext)_localctx, predIndex); - case 25: - return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex); case 26: - return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex); case 27: - return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex); case 28: - return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex); case 29: + return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex); + case 30: return DEV_MMR_sempred((RuleContext)_localctx, predIndex); - case 33: + case 34: return DEV_INSIST_sempred((RuleContext)_localctx, predIndex); - case 288: - return PROMQL_NESTED_RP_sempred((RuleContext)_localctx, predIndex); case 289: + return PROMQL_NESTED_RP_sempred((RuleContext)_localctx, predIndex); + case 290: return PROMQL_QUERY_RP_sempred((RuleContext)_localctx, predIndex); } return true; @@ -413,7 +415,7 @@ private boolean PROMQL_QUERY_RP_sempred(RuleContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0000\u00a4\u09b2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u00a5\u09c0\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\u0006\uffff"+ @@ -519,1554 +521,1563 @@ private boolean PROMQL_QUERY_RP_sempred(RuleContext _localctx, int predIndex) { "\u014c\u0002\u014d\u0007\u014d\u0002\u014e\u0007\u014e\u0002\u014f\u0007"+ "\u014f\u0002\u0150\u0007\u0150\u0002\u0151\u0007\u0151\u0002\u0152\u0007"+ "\u0152\u0002\u0153\u0007\u0153\u0002\u0154\u0007\u0154\u0002\u0155\u0007"+ - "\u0155\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0005\u0000\u02c5"+ - "\b\u0000\n\u0000\f\u0000\u02c8\t\u0000\u0001\u0000\u0003\u0000\u02cb\b"+ - "\u0000\u0001\u0000\u0003\u0000\u02ce\b\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0001\u02d7"+ - "\b\u0001\n\u0001\f\u0001\u02da\t\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0002\u0004\u0002\u02e2\b\u0002\u000b\u0002"+ - "\f\u0002\u02e3\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\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\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\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\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\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\n\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\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\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\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\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001"+ - "$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0004"+ - "&\u041f\b&\u000b&\f&\u0420\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001"+ - ")\u0001)\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+ - ",\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001"+ - ".\u0001.\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+ - "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+ - "3\u00013\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u0001"+ - "5\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u0001"+ - "7\u00017\u00017\u00018\u00018\u00019\u00049\u0474\b9\u000b9\f9\u0475\u0001"+ - "9\u00019\u00039\u047a\b9\u00019\u00049\u047d\b9\u000b9\f9\u047e\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\u0001"+ - "B\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001E\u0001"+ - "E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001"+ - "G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001"+ - "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ - "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ - "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+ - "V\u0001W\u0001W\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Z\u0001Z\u0003"+ - "Z\u0503\bZ\u0001Z\u0004Z\u0506\bZ\u000bZ\fZ\u0507\u0001[\u0001[\u0001"+ - "\\\u0001\\\u0001]\u0001]\u0001]\u0003]\u0511\b]\u0001^\u0001^\u0001_\u0001"+ - "_\u0001_\u0003_\u0518\b_\u0001`\u0001`\u0001`\u0005`\u051d\b`\n`\f`\u0520"+ - "\t`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0005`\u0528\b`\n`\f`\u052b"+ - "\t`\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u0532\b`\u0001`\u0003`\u0535"+ - "\b`\u0003`\u0537\b`\u0001a\u0004a\u053a\ba\u000ba\fa\u053b\u0001b\u0004"+ - "b\u053f\bb\u000bb\fb\u0540\u0001b\u0001b\u0005b\u0545\bb\nb\fb\u0548\t"+ - "b\u0001b\u0001b\u0004b\u054c\bb\u000bb\fb\u054d\u0001b\u0004b\u0551\b"+ - "b\u000bb\fb\u0552\u0001b\u0001b\u0005b\u0557\bb\nb\fb\u055a\tb\u0003b"+ - "\u055c\bb\u0001b\u0001b\u0001b\u0001b\u0004b\u0562\bb\u000bb\fb\u0563"+ - "\u0001b\u0001b\u0003b\u0568\bb\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+ - "d\u0001d\u0001d\u0001e\u0001e\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+ - "g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001k\u0001"+ - "k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ - "n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001p\u0001"+ - "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001"+ - "r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001"+ - "t\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ - "y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001"+ - "{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001"+ - "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001"+ - "\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ - "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001"+ - "\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u05f5\b\u008c\u0001"+ - "\u008c\u0005\u008c\u05f8\b\u008c\n\u008c\f\u008c\u05fb\t\u008c\u0001\u008c"+ - "\u0001\u008c\u0004\u008c\u05ff\b\u008c\u000b\u008c\f\u008c\u0600\u0003"+ - "\u008c\u0603\b\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d\u0608"+ - "\b\u008d\u0001\u008d\u0005\u008d\u060b\b\u008d\n\u008d\f\u008d\u060e\t"+ - "\u008d\u0001\u008d\u0001\u008d\u0004\u008d\u0612\b\u008d\u000b\u008d\f"+ - "\u008d\u0613\u0003\u008d\u0616\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008e\u0001\u008f\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\u0005\u0092\u062e\b\u0092\n\u0092\f\u0092\u0631\t\u0092\u0001"+ - "\u0092\u0001\u0092\u0003\u0092\u0635\b\u0092\u0001\u0092\u0004\u0092\u0638"+ - "\b\u0092\u000b\u0092\f\u0092\u0639\u0003\u0092\u063c\b\u0092\u0001\u0093"+ - "\u0001\u0093\u0004\u0093\u0640\b\u0093\u000b\u0093\f\u0093\u0641\u0001"+ - "\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001"+ - "\u0095\u0001\u0095\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\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\u009c\u0001\u009c\u0001\u009c\u0001"+ - "\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001"+ + "\u0155\u0002\u0156\u0007\u0156\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0005\u0000\u02c7\b\u0000\n\u0000\f\u0000\u02ca\t\u0000\u0001\u0000"+ + "\u0003\u0000\u02cd\b\u0000\u0001\u0000\u0003\u0000\u02d0\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0005\u0001\u02d9\b\u0001\n\u0001\f\u0001\u02dc\t\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0004\u0002"+ + "\u02e4\b\u0002\u000b\u0002\f\u0002\u02e5\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\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"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\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"+ + "\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\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\n\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\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\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\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\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+ + "\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "\'\u0004\'\u042d\b\'\u000b\'\f\'\u042e\u0001\'\u0001\'\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ + ",\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001"+ + "/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ + "1\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00014\u0001"+ + "4\u00014\u00014\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+ + "6\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u0001"+ + "8\u00018\u00018\u00018\u00019\u00019\u0001:\u0004:\u0482\b:\u000b:\f:"+ + "\u0483\u0001:\u0001:\u0003:\u0488\b:\u0001:\u0004:\u048b\b:\u000b:\f:"+ + "\u048c\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001="+ + "\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ + "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001C\u0001"+ + "C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "E\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ + "J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001M\u0001"+ + "M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ + "O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001T\u0001"+ + "T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001"+ + "[\u0001[\u0003[\u0511\b[\u0001[\u0004[\u0514\b[\u000b[\f[\u0515\u0001"+ + "\\\u0001\\\u0001]\u0001]\u0001^\u0001^\u0001^\u0003^\u051f\b^\u0001_\u0001"+ + "_\u0001`\u0001`\u0001`\u0003`\u0526\b`\u0001a\u0001a\u0001a\u0005a\u052b"+ + "\ba\na\fa\u052e\ta\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0005a\u0536"+ + "\ba\na\fa\u0539\ta\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u0540\ba"+ + "\u0001a\u0003a\u0543\ba\u0003a\u0545\ba\u0001b\u0004b\u0548\bb\u000bb"+ + "\fb\u0549\u0001c\u0004c\u054d\bc\u000bc\fc\u054e\u0001c\u0001c\u0005c"+ + "\u0553\bc\nc\fc\u0556\tc\u0001c\u0001c\u0004c\u055a\bc\u000bc\fc\u055b"+ + "\u0001c\u0004c\u055f\bc\u000bc\fc\u0560\u0001c\u0001c\u0005c\u0565\bc"+ + "\nc\fc\u0568\tc\u0003c\u056a\bc\u0001c\u0001c\u0001c\u0001c\u0004c\u0570"+ + "\bc\u000bc\fc\u0571\u0001c\u0001c\u0003c\u0576\bc\u0001d\u0001d\u0001"+ + "d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001g\u0001g\u0001"+ + "g\u0001h\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001"+ + "l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001n\u0001"+ + "n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001"+ + "p\u0001p\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001r\u0001"+ + "s\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001u\u0001"+ + "u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0001"+ + "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001z\u0001z\u0001"+ + "z\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\u0080\u0001\u0080\u0001\u0081\u0001"+ + "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086\u0001"+ + "\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001"+ + "\u0089\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ + "\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001"+ + "\u008d\u0003\u008d\u0603\b\u008d\u0001\u008d\u0005\u008d\u0606\b\u008d"+ + "\n\u008d\f\u008d\u0609\t\u008d\u0001\u008d\u0001\u008d\u0004\u008d\u060d"+ + "\b\u008d\u000b\u008d\f\u008d\u060e\u0003\u008d\u0611\b\u008d\u0001\u008e"+ + "\u0001\u008e\u0001\u008e\u0003\u008e\u0616\b\u008e\u0001\u008e\u0005\u008e"+ + "\u0619\b\u008e\n\u008e\f\u008e\u061c\t\u008e\u0001\u008e\u0001\u008e\u0004"+ + "\u008e\u0620\b\u008e\u000b\u008e\f\u008e\u0621\u0003\u008e\u0624\b\u008e"+ + "\u0001\u008f\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\u0092\u0001\u0093\u0001\u0093\u0005\u0093\u063c\b\u0093"+ + "\n\u0093\f\u0093\u063f\t\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u0643"+ + "\b\u0093\u0001\u0093\u0004\u0093\u0646\b\u0093\u000b\u0093\f\u0093\u0647"+ + "\u0003\u0093\u064a\b\u0093\u0001\u0094\u0001\u0094\u0004\u0094\u064e\b"+ + "\u0094\u000b\u0094\f\u0094\u064f\u0001\u0094\u0001\u0094\u0001\u0095\u0001"+ + "\u0095\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\u0099\u0001"+ + "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\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\u00a2\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0003\u00a3\u068e\b\u00a3\u0001\u00a4\u0004\u00a4\u0691"+ - "\b\u00a4\u000b\u00a4\f\u00a4\u0692\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\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\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ - "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ - "\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3"+ - "\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ - "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba"+ - "\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb"+ - "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ - "\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be"+ - "\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0"+ - "\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1"+ - "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2"+ + "\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\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\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u069c"+ + "\b\u00a4\u0001\u00a5\u0004\u00a5\u069f\b\u00a5\u000b\u00a5\f\u00a5\u06a0"+ + "\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\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"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af"+ + "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3"+ + "\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4"+ + "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ + "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd"+ + "\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf"+ + "\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0"+ + "\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2"+ "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3"+ - "\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5"+ - "\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6"+ - "\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7"+ - "\u0001\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9"+ - "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca"+ - "\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ + "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3"+ + "\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5"+ + "\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6"+ + "\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c8"+ + "\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9"+ + "\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca"+ "\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb"+ - "\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd"+ - "\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce"+ - "\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0"+ - "\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1"+ - "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ - "\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4"+ - "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5"+ - "\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ - "\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8"+ - "\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9"+ - "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001\u00db"+ - "\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ - "\u0001\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd"+ - "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0001\u00de\u0001\u00de"+ - "\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00e0"+ - "\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1\u0001\u00e1\u0001\u00e1"+ - "\u0001\u00e1\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3"+ - "\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4"+ - "\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5"+ - "\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e7\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8"+ - "\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea"+ - "\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb"+ - "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed"+ - "\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee"+ - "\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0"+ - "\u0001\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1"+ - "\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3"+ - "\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4"+ - "\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6"+ - "\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7"+ - "\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8"+ - "\u0001\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa"+ - "\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb"+ - "\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd"+ - "\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe"+ - "\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u0100"+ - "\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0101\u0001\u0101\u0001\u0101"+ - "\u0001\u0101\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0103"+ - "\u0001\u0103\u0001\u0103\u0001\u0103\u0001\u0104\u0001\u0104\u0001\u0104"+ - "\u0001\u0104\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105"+ - "\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106"+ - "\u0001\u0107\u0001\u0107\u0001\u0107\u0001\u0107\u0001\u0108\u0001\u0108"+ - "\u0001\u0108\u0001\u0108\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109"+ - "\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010b\u0001\u010b"+ - "\u0001\u010b\u0001\u010b\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c"+ - "\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010e\u0001\u010e"+ - "\u0001\u010e\u0001\u010e\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f"+ - "\u0003\u010f\u086c\b\u010f\u0001\u0110\u0001\u0110\u0003\u0110\u0870\b"+ - "\u0110\u0001\u0110\u0005\u0110\u0873\b\u0110\n\u0110\f\u0110\u0876\t\u0110"+ - "\u0001\u0110\u0001\u0110\u0003\u0110\u087a\b\u0110\u0001\u0110\u0004\u0110"+ - "\u087d\b\u0110\u000b\u0110\f\u0110\u087e\u0003\u0110\u0881\b\u0110\u0001"+ - "\u0111\u0001\u0111\u0004\u0111\u0885\b\u0111\u000b\u0111\f\u0111\u0886"+ - "\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0113\u0001\u0113"+ - "\u0001\u0113\u0001\u0113\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ - "\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0116\u0001\u0116"+ - "\u0001\u0116\u0001\u0116\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117"+ - "\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0119\u0001\u0119"+ - "\u0001\u0119\u0001\u0119\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011a"+ - "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011c\u0001\u011c"+ - "\u0001\u011c\u0001\u011c\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011d"+ - "\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011f"+ - "\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u0120\u0001\u0120"+ - "\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0121\u0001\u0121"+ - "\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0122"+ - "\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0123\u0001\u0123\u0001\u0123"+ - "\u0001\u0123\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0125"+ - "\u0001\u0125\u0005\u0125\u08de\b\u0125\n\u0125\f\u0125\u08e1\t\u0125\u0001"+ - "\u0125\u0003\u0125\u08e4\b\u0125\u0001\u0125\u0003\u0125\u08e7\b\u0125"+ - "\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126\u0005\u0126\u08ed\b\u0126"+ - "\n\u0126\f\u0126\u08f0\t\u0126\u0001\u0126\u0001\u0126\u0001\u0127\u0001"+ - "\u0127\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0128\u0001"+ - "\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001\u0129\u0001"+ - "\u012a\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012b\u0001\u012b\u0001"+ - "\u012b\u0001\u012b\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001"+ - "\u012d\u0001\u012d\u0001\u012d\u0001\u012d\u0001\u012e\u0001\u012e\u0001"+ - "\u012e\u0001\u012e\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001"+ - "\u0130\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0131\u0001\u0131\u0001"+ - "\u0131\u0001\u0131\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001"+ - "\u0133\u0001\u0133\u0001\u0133\u0001\u0134\u0001\u0134\u0001\u0134\u0001"+ - "\u0134\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0136\u0001"+ - "\u0136\u0001\u0136\u0001\u0136\u0001\u0137\u0001\u0137\u0001\u0137\u0001"+ - "\u0137\u0001\u0138\u0001\u0138\u0001\u0138\u0001\u0138\u0001\u0139\u0001"+ - "\u0139\u0001\u0139\u0001\u0139\u0001\u013a\u0001\u013a\u0001\u013a\u0001"+ - "\u013a\u0001\u013b\u0001\u013b\u0001\u013b\u0001\u013b\u0001\u013b\u0001"+ - "\u013c\u0001\u013c\u0001\u013c\u0001\u013c\u0001\u013d\u0001\u013d\u0001"+ - "\u013d\u0001\u013d\u0001\u013e\u0001\u013e\u0001\u013e\u0001\u013e\u0001"+ - "\u013f\u0001\u013f\u0001\u013f\u0001\u013f\u0001\u0140\u0001\u0140\u0001"+ - "\u0140\u0001\u0140\u0001\u0141\u0001\u0141\u0001\u0141\u0001\u0141\u0001"+ - "\u0142\u0001\u0142\u0001\u0142\u0001\u0142\u0001\u0143\u0001\u0143\u0001"+ - "\u0143\u0001\u0143\u0001\u0144\u0001\u0144\u0001\u0144\u0001\u0144\u0001"+ - "\u0145\u0001\u0145\u0001\u0145\u0001\u0145\u0001\u0146\u0001\u0146\u0001"+ - "\u0146\u0001\u0146\u0001\u0147\u0001\u0147\u0001\u0147\u0001\u0147\u0001"+ - "\u0148\u0001\u0148\u0001\u0148\u0001\u0148\u0001\u0149\u0001\u0149\u0001"+ - "\u0149\u0001\u0149\u0001\u014a\u0001\u014a\u0001\u014a\u0001\u014a\u0001"+ - "\u014b\u0001\u014b\u0001\u014b\u0001\u014b\u0001\u014c\u0001\u014c\u0001"+ - "\u014c\u0001\u014c\u0001\u014d\u0001\u014d\u0001\u014d\u0001\u014d\u0001"+ - "\u014e\u0001\u014e\u0001\u014e\u0001\u014e\u0001\u014f\u0001\u014f\u0001"+ - "\u014f\u0001\u014f\u0001\u0150\u0001\u0150\u0001\u0150\u0001\u0150\u0001"+ - "\u0151\u0001\u0151\u0001\u0151\u0001\u0151\u0001\u0151\u0001\u0152\u0001"+ - "\u0152\u0001\u0152\u0001\u0152\u0001\u0152\u0001\u0153\u0001\u0153\u0001"+ - "\u0153\u0001\u0153\u0001\u0154\u0001\u0154\u0001\u0154\u0001\u0154\u0001"+ - "\u0155\u0001\u0155\u0001\u0155\u0001\u0155\u0002\u02d8\u0529\u0000\u0156"+ - "\u0014\u0001\u0016\u0002\u0018\u0003\u001a\u0004\u001c\u0005\u001e\u0006"+ - " \u0007\"\b$\t&\n(\u000b*\f,\r.\u000e0\u000f2\u00104\u00116\u00128\u0013"+ - ":\u0014<\u0015>\u0016@\u0017B\u0018D\u0019F\u001aH\u001bJ\u001cL\u001d"+ - "N\u001eP\u001fR T!V\"X#Z$\\%^&`\'b\u0000d\u0000f\u0000h\u0000j\u0000l"+ - "\u0000n\u0000p\u0000r\u0000t\u0000v(x)z*|\u0000~\u0000\u0080\u0000\u0082"+ - "\u0000\u0084\u0000\u0086+\u0088\u0000\u008a\u0000\u008c,\u008e-\u0090"+ - ".\u0092\u0000\u0094\u0000\u0096\u0000\u0098\u0000\u009a\u0000\u009c\u0000"+ - "\u009e\u0000\u00a0\u0000\u00a2\u0000\u00a4\u0000\u00a6\u0000\u00a8\u0000"+ - "\u00aa\u0000\u00ac\u0000\u00ae/\u00b00\u00b21\u00b4\u0000\u00b6\u0000"+ - "\u00b82\u00ba3\u00bc4\u00be5\u00c0\u0000\u00c2\u0000\u00c4\u0000\u00c6"+ - "\u0000\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0\u0000\u00d2"+ - "\u0000\u00d46\u00d67\u00d88\u00da9\u00dc:\u00de;\u00e0<\u00e2=\u00e4>"+ - "\u00e6?\u00e8@\u00eaA\u00ecB\u00eeC\u00f0D\u00f2E\u00f4F\u00f6G\u00f8"+ - "H\u00faI\u00fcJ\u00feK\u0100L\u0102M\u0104N\u0106O\u0108P\u010aQ\u010c"+ - "R\u010eS\u0110T\u0112U\u0114V\u0116W\u0118X\u011aY\u011cZ\u011e[\u0120"+ - "\\\u0122]\u0124^\u0126_\u0128`\u012a\u0000\u012ca\u012eb\u0130c\u0132"+ - "d\u0134e\u0136f\u0138g\u013a\u0000\u013ch\u013ei\u0140j\u0142k\u0144\u0000"+ - "\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014el\u0150\u0000\u0152"+ - "\u0000\u0154\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015cm\u015e\u0000"+ - "\u0160\u0000\u0162n\u0164o\u0166p\u0168\u0000\u016a\u0000\u016c\u0000"+ - "\u016eq\u0170r\u0172s\u0174\u0000\u0176\u0000\u0178t\u017au\u017cv\u017e"+ - "\u0000\u0180\u0000\u0182\u0000\u0184\u0000\u0186\u0000\u0188\u0000\u018a"+ - "\u0000\u018c\u0000\u018e\u0000\u0190\u0000\u0192w\u0194x\u0196y\u0198"+ - "z\u019a{\u019c|\u019e}\u01a0\u0000\u01a2~\u01a4\u0000\u01a6\u0000\u01a8"+ - "\u007f\u01aa\u0000\u01ac\u0000\u01ae\u0000\u01b0\u0080\u01b2\u0081\u01b4"+ - "\u0082\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u0000\u01be\u0000\u01c0"+ - "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u0083\u01c8\u0084\u01ca\u0085\u01cc"+ - "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0086\u01d8"+ - "\u0087\u01da\u0088\u01dc\u0089\u01de\u0000\u01e0\u0000\u01e2\u0000\u01e4"+ - "\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0000\u01ec\u0000\u01ee\u0000\u01f0"+ - "\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8\u0000\u01fa\u0000\u01fc"+ - "\u008a\u01fe\u008b\u0200\u008c\u0202\u0000\u0204\u0000\u0206\u0000\u0208"+ - "\u0000\u020a\u0000\u020c\u0000\u020e\u0000\u0210\u0000\u0212\u0000\u0214"+ - "\u0000\u0216\u0000\u0218\u008d\u021a\u008e\u021c\u008f\u021e\u0000\u0220"+ - "\u0000\u0222\u0000\u0224\u0000\u0226\u0000\u0228\u0000\u022a\u0000\u022c"+ - "\u0000\u022e\u0000\u0230\u0000\u0232\u0000\u0234\u0000\u0236\u0090\u0238"+ - "\u0091\u023a\u0092\u023c\u0093\u023e\u0000\u0240\u0000\u0242\u0000\u0244"+ - "\u0000\u0246\u0000\u0248\u0000\u024a\u0000\u024c\u0000\u024e\u0000\u0250"+ - "\u0000\u0252\u0000\u0254\u0000\u0256\u0000\u0258\u0094\u025a\u0095\u025c"+ - "\u0096\u025e\u0097\u0260\u0098\u0262\u0099\u0264\u0000\u0266\u0000\u0268"+ - "\u0000\u026a\u0000\u026c\u0000\u026e\u0000\u0270\u0000\u0272\u0000\u0274"+ - "\u0000\u0276\u0000\u0278\u0000\u027a\u009a\u027c\u0000\u027e\u009b\u0280"+ - "\u009c\u0282\u009d\u0284\u0000\u0286\u0000\u0288\u0000\u028a\u0000\u028c"+ - "\u0000\u028e\u0000\u0290\u0000\u0292\u0000\u0294\u0000\u0296\u0000\u0298"+ - "\u0000\u029a\u0000\u029c\u0000\u029e\u0000\u02a0\u0000\u02a2\u0000\u02a4"+ - "\u0000\u02a6\u0000\u02a8\u0000\u02aa\u0000\u02ac\u0000\u02ae\u0000\u02b0"+ - "\u009e\u02b2\u009f\u02b4\u00a0\u02b6\u0000\u02b8\u00a1\u02ba\u00a2\u02bc"+ - "\u00a3\u02be\u00a4\u0014\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007"+ - "\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\'\u0002\u0000\n\n"+ - "\r\r\u0003\u0000\t\n\r\r \u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000"+ - "AAaa\u0002\u0000NNnn\u0002\u0000GGgg\u0002\u0000EEee\u0002\u0000PPpp\u0002"+ - "\u0000OOoo\u0002\u0000IIii\u0002\u0000TTtt\u0002\u0000RRrr\u0002\u0000"+ - "XXxx\u0002\u0000LLll\u0002\u0000MMmm\u0002\u0000DDdd\u0002\u0000SSss\u0002"+ - "\u0000VVvv\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000FFff\u0002\u0000"+ - "UUuu\u0002\u0000QQqq\u0006\u0000\t\n\r\r //[[]]\f\u0000\t\n\r\r \"#"+ - "(),,//::<<>?\\\\||\u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\"+ - "nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002"+ - "\u0000BBbb\u0002\u0000YYyy\f\u0000\t\n\r\r \"\"(),,//::==[[]]||\u0002"+ - "\u0000**//\u0002\u0000JJjj\u0002\u0000\'\'\\\\\u0007\u0000\n\n\r\r \""+ - "#\')``||\u09cd\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\u0000"+ - "6\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001"+ - "\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000"+ - "\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000"+ - "D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001"+ - "\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000"+ - "\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000"+ - "R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001"+ - "\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000"+ - "\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000"+ - "\u0000`\u0001\u0000\u0000\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d"+ - "\u0001\u0000\u0000\u0000\u0001f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000"+ - "\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000"+ - "\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001\u0000\u0000\u0000\u0001r"+ - "\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000\u0000\u0001v\u0001\u0000"+ - "\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\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\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\u0003\u0092"+ - "\u0001\u0000\u0000\u0000\u0003\u0094\u0001\u0000\u0000\u0000\u0003\u0096"+ - "\u0001\u0000\u0000\u0000\u0003\u0098\u0001\u0000\u0000\u0000\u0003\u009a"+ - "\u0001\u0000\u0000\u0000\u0003\u009c\u0001\u0000\u0000\u0000\u0003\u009e"+ - "\u0001\u0000\u0000\u0000\u0003\u00a0\u0001\u0000\u0000\u0000\u0003\u00a2"+ - "\u0001\u0000\u0000\u0000\u0003\u00a4\u0001\u0000\u0000\u0000\u0003\u00a6"+ - "\u0001\u0000\u0000\u0000\u0003\u00a8\u0001\u0000\u0000\u0000\u0003\u00aa"+ - "\u0001\u0000\u0000\u0000\u0003\u00ac\u0001\u0000\u0000\u0000\u0003\u00ae"+ - "\u0001\u0000\u0000\u0000\u0003\u00b0\u0001\u0000\u0000\u0000\u0003\u00b2"+ - "\u0001\u0000\u0000\u0000\u0004\u00b4\u0001\u0000\u0000\u0000\u0004\u00b6"+ - "\u0001\u0000\u0000\u0000\u0004\u00b8\u0001\u0000\u0000\u0000\u0004\u00ba"+ - "\u0001\u0000\u0000\u0000\u0004\u00bc\u0001\u0000\u0000\u0000\u0005\u00be"+ - "\u0001\u0000\u0000\u0000\u0005\u00d4\u0001\u0000\u0000\u0000\u0005\u00d6"+ - "\u0001\u0000\u0000\u0000\u0005\u00d8\u0001\u0000\u0000\u0000\u0005\u00da"+ - "\u0001\u0000\u0000\u0000\u0005\u00dc\u0001\u0000\u0000\u0000\u0005\u00de"+ - "\u0001\u0000\u0000\u0000\u0005\u00e0\u0001\u0000\u0000\u0000\u0005\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\u0005\u00f6"+ - "\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005\u00fa"+ - "\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005\u00fe"+ - "\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000\u0005\u0102"+ - "\u0001\u0000\u0000\u0000\u0005\u0104\u0001\u0000\u0000\u0000\u0005\u0106"+ - "\u0001\u0000\u0000\u0000\u0005\u0108\u0001\u0000\u0000\u0000\u0005\u010a"+ - "\u0001\u0000\u0000\u0000\u0005\u010c\u0001\u0000\u0000\u0000\u0005\u010e"+ - "\u0001\u0000\u0000\u0000\u0005\u0110\u0001\u0000\u0000\u0000\u0005\u0112"+ - "\u0001\u0000\u0000\u0000\u0005\u0114\u0001\u0000\u0000\u0000\u0005\u0116"+ - "\u0001\u0000\u0000\u0000\u0005\u0118\u0001\u0000\u0000\u0000\u0005\u011a"+ - "\u0001\u0000\u0000\u0000\u0005\u011c\u0001\u0000\u0000\u0000\u0005\u011e"+ - "\u0001\u0000\u0000\u0000\u0005\u0120\u0001\u0000\u0000\u0000\u0005\u0122"+ - "\u0001\u0000\u0000\u0000\u0005\u0124\u0001\u0000\u0000\u0000\u0005\u0126"+ - "\u0001\u0000\u0000\u0000\u0005\u0128\u0001\u0000\u0000\u0000\u0005\u012a"+ - "\u0001\u0000\u0000\u0000\u0005\u012c\u0001\u0000\u0000\u0000\u0005\u012e"+ - "\u0001\u0000\u0000\u0000\u0005\u0130\u0001\u0000\u0000\u0000\u0005\u0132"+ - "\u0001\u0000\u0000\u0000\u0005\u0134\u0001\u0000\u0000\u0000\u0005\u0136"+ - "\u0001\u0000\u0000\u0000\u0005\u0138\u0001\u0000\u0000\u0000\u0005\u013c"+ - "\u0001\u0000\u0000\u0000\u0005\u013e\u0001\u0000\u0000\u0000\u0005\u0140"+ - "\u0001\u0000\u0000\u0000\u0005\u0142\u0001\u0000\u0000\u0000\u0006\u0144"+ - "\u0001\u0000\u0000\u0000\u0006\u0146\u0001\u0000\u0000\u0000\u0006\u0148"+ - "\u0001\u0000\u0000\u0000\u0006\u014a\u0001\u0000\u0000\u0000\u0006\u014c"+ - "\u0001\u0000\u0000\u0000\u0006\u014e\u0001\u0000\u0000\u0000\u0006\u0150"+ - "\u0001\u0000\u0000\u0000\u0006\u0152\u0001\u0000\u0000\u0000\u0006\u0154"+ - "\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006\u0158"+ - "\u0001\u0000\u0000\u0000\u0006\u015c\u0001\u0000\u0000\u0000\u0006\u015e"+ - "\u0001\u0000\u0000\u0000\u0006\u0160\u0001\u0000\u0000\u0000\u0006\u0162"+ - "\u0001\u0000\u0000\u0000\u0006\u0164\u0001\u0000\u0000\u0000\u0006\u0166"+ - "\u0001\u0000\u0000\u0000\u0007\u0168\u0001\u0000\u0000\u0000\u0007\u016a"+ - "\u0001\u0000\u0000\u0000\u0007\u016c\u0001\u0000\u0000\u0000\u0007\u016e"+ - "\u0001\u0000\u0000\u0000\u0007\u0170\u0001\u0000\u0000\u0000\u0007\u0172"+ - "\u0001\u0000\u0000\u0000\b\u0174\u0001\u0000\u0000\u0000\b\u0176\u0001"+ - "\u0000\u0000\u0000\b\u0178\u0001\u0000\u0000\u0000\b\u017a\u0001\u0000"+ - "\u0000\u0000\b\u017c\u0001\u0000\u0000\u0000\b\u017e\u0001\u0000\u0000"+ - "\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182\u0001\u0000\u0000\u0000"+ - "\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001\u0000\u0000\u0000\b\u0188"+ - "\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000\u0000\u0000\b\u018c\u0001"+ - "\u0000\u0000\u0000\b\u018e\u0001\u0000\u0000\u0000\b\u0190\u0001\u0000"+ - "\u0000\u0000\b\u0192\u0001\u0000\u0000\u0000\b\u0194\u0001\u0000\u0000"+ - "\u0000\b\u0196\u0001\u0000\u0000\u0000\t\u0198\u0001\u0000\u0000\u0000"+ - "\t\u019a\u0001\u0000\u0000\u0000\t\u019c\u0001\u0000\u0000\u0000\t\u019e"+ - "\u0001\u0000\u0000\u0000\n\u01a0\u0001\u0000\u0000\u0000\n\u01a2\u0001"+ - "\u0000\u0000\u0000\n\u01a4\u0001\u0000\u0000\u0000\n\u01a6\u0001\u0000"+ - "\u0000\u0000\n\u01a8\u0001\u0000\u0000\u0000\n\u01aa\u0001\u0000\u0000"+ - "\u0000\n\u01ac\u0001\u0000\u0000\u0000\n\u01ae\u0001\u0000\u0000\u0000"+ - "\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4"+ - "\u0001\u0000\u0000\u0000\u000b\u01b6\u0001\u0000\u0000\u0000\u000b\u01b8"+ - "\u0001\u0000\u0000\u0000\u000b\u01ba\u0001\u0000\u0000\u0000\u000b\u01bc"+ - "\u0001\u0000\u0000\u0000\u000b\u01be\u0001\u0000\u0000\u0000\u000b\u01c0"+ - "\u0001\u0000\u0000\u0000\u000b\u01c2\u0001\u0000\u0000\u0000\u000b\u01c4"+ - "\u0001\u0000\u0000\u0000\u000b\u01c6\u0001\u0000\u0000\u0000\u000b\u01c8"+ - "\u0001\u0000\u0000\u0000\u000b\u01ca\u0001\u0000\u0000\u0000\f\u01cc\u0001"+ - "\u0000\u0000\u0000\f\u01ce\u0001\u0000\u0000\u0000\f\u01d0\u0001\u0000"+ - "\u0000\u0000\f\u01d2\u0001\u0000\u0000\u0000\f\u01d4\u0001\u0000\u0000"+ - "\u0000\f\u01d6\u0001\u0000\u0000\u0000\f\u01d8\u0001\u0000\u0000\u0000"+ - "\f\u01da\u0001\u0000\u0000\u0000\r\u01dc\u0001\u0000\u0000\u0000\r\u01de"+ - "\u0001\u0000\u0000\u0000\r\u01e0\u0001\u0000\u0000\u0000\r\u01e2\u0001"+ - "\u0000\u0000\u0000\r\u01e4\u0001\u0000\u0000\u0000\r\u01e6\u0001\u0000"+ - "\u0000\u0000\r\u01e8\u0001\u0000\u0000\u0000\r\u01ea\u0001\u0000\u0000"+ - "\u0000\r\u01ec\u0001\u0000\u0000\u0000\r\u01ee\u0001\u0000\u0000\u0000"+ - "\r\u01f0\u0001\u0000\u0000\u0000\r\u01f2\u0001\u0000\u0000\u0000\r\u01f4"+ - "\u0001\u0000\u0000\u0000\r\u01f6\u0001\u0000\u0000\u0000\r\u01f8\u0001"+ - "\u0000\u0000\u0000\r\u01fa\u0001\u0000\u0000\u0000\r\u01fc\u0001\u0000"+ - "\u0000\u0000\r\u01fe\u0001\u0000\u0000\u0000\r\u0200\u0001\u0000\u0000"+ - "\u0000\u000e\u0202\u0001\u0000\u0000\u0000\u000e\u0204\u0001\u0000\u0000"+ - "\u0000\u000e\u0206\u0001\u0000\u0000\u0000\u000e\u0208\u0001\u0000\u0000"+ - "\u0000\u000e\u020a\u0001\u0000\u0000\u0000\u000e\u020c\u0001\u0000\u0000"+ - "\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u000e\u0210\u0001\u0000\u0000"+ - "\u0000\u000e\u0212\u0001\u0000\u0000\u0000\u000e\u0214\u0001\u0000\u0000"+ - "\u0000\u000e\u0216\u0001\u0000\u0000\u0000\u000e\u0218\u0001\u0000\u0000"+ - "\u0000\u000e\u021a\u0001\u0000\u0000\u0000\u000e\u021c\u0001\u0000\u0000"+ - "\u0000\u000f\u021e\u0001\u0000\u0000\u0000\u000f\u0220\u0001\u0000\u0000"+ - "\u0000\u000f\u0222\u0001\u0000\u0000\u0000\u000f\u0224\u0001\u0000\u0000"+ - "\u0000\u000f\u0226\u0001\u0000\u0000\u0000\u000f\u0228\u0001\u0000\u0000"+ - "\u0000\u000f\u022a\u0001\u0000\u0000\u0000\u000f\u022c\u0001\u0000\u0000"+ - "\u0000\u000f\u022e\u0001\u0000\u0000\u0000\u000f\u0230\u0001\u0000\u0000"+ - "\u0000\u000f\u0236\u0001\u0000\u0000\u0000\u000f\u0238\u0001\u0000\u0000"+ - "\u0000\u000f\u023a\u0001\u0000\u0000\u0000\u000f\u023c\u0001\u0000\u0000"+ - "\u0000\u0010\u023e\u0001\u0000\u0000\u0000\u0010\u0240\u0001\u0000\u0000"+ - "\u0000\u0010\u0242\u0001\u0000\u0000\u0000\u0010\u0244\u0001\u0000\u0000"+ - "\u0000\u0010\u0246\u0001\u0000\u0000\u0000\u0010\u0248\u0001\u0000\u0000"+ - "\u0000\u0010\u024a\u0001\u0000\u0000\u0000\u0010\u024c\u0001\u0000\u0000"+ - "\u0000\u0010\u024e\u0001\u0000\u0000\u0000\u0010\u0250\u0001\u0000\u0000"+ - "\u0000\u0010\u0252\u0001\u0000\u0000\u0000\u0010\u0254\u0001\u0000\u0000"+ - "\u0000\u0010\u0256\u0001\u0000\u0000\u0000\u0010\u0258\u0001\u0000\u0000"+ - "\u0000\u0010\u025a\u0001\u0000\u0000\u0000\u0010\u025c\u0001\u0000\u0000"+ - "\u0000\u0010\u025e\u0001\u0000\u0000\u0000\u0010\u0260\u0001\u0000\u0000"+ - "\u0000\u0010\u0262\u0001\u0000\u0000\u0000\u0011\u0264\u0001\u0000\u0000"+ - "\u0000\u0011\u0266\u0001\u0000\u0000\u0000\u0011\u0268\u0001\u0000\u0000"+ - "\u0000\u0011\u026a\u0001\u0000\u0000\u0000\u0011\u026c\u0001\u0000\u0000"+ - "\u0000\u0011\u026e\u0001\u0000\u0000\u0000\u0011\u0270\u0001\u0000\u0000"+ - "\u0000\u0011\u0272\u0001\u0000\u0000\u0000\u0011\u0274\u0001\u0000\u0000"+ - "\u0000\u0011\u0276\u0001\u0000\u0000\u0000\u0011\u0278\u0001\u0000\u0000"+ - "\u0000\u0011\u027a\u0001\u0000\u0000\u0000\u0011\u027c\u0001\u0000\u0000"+ - "\u0000\u0011\u027e\u0001\u0000\u0000\u0000\u0011\u0280\u0001\u0000\u0000"+ - "\u0000\u0011\u0282\u0001\u0000\u0000\u0000\u0012\u0284\u0001\u0000\u0000"+ - "\u0000\u0012\u0286\u0001\u0000\u0000\u0000\u0012\u0288\u0001\u0000\u0000"+ - "\u0000\u0012\u028a\u0001\u0000\u0000\u0000\u0012\u028c\u0001\u0000\u0000"+ - "\u0000\u0012\u028e\u0001\u0000\u0000\u0000\u0012\u0290\u0001\u0000\u0000"+ - "\u0000\u0012\u0292\u0001\u0000\u0000\u0000\u0012\u0294\u0001\u0000\u0000"+ - "\u0000\u0012\u0296\u0001\u0000\u0000\u0000\u0012\u0298\u0001\u0000\u0000"+ - "\u0000\u0012\u029a\u0001\u0000\u0000\u0000\u0012\u029c\u0001\u0000\u0000"+ - "\u0000\u0012\u029e\u0001\u0000\u0000\u0000\u0012\u02a0\u0001\u0000\u0000"+ - "\u0000\u0012\u02a2\u0001\u0000\u0000\u0000\u0012\u02a4\u0001\u0000\u0000"+ - "\u0000\u0012\u02a6\u0001\u0000\u0000\u0000\u0012\u02a8\u0001\u0000\u0000"+ - "\u0000\u0012\u02aa\u0001\u0000\u0000\u0000\u0012\u02ac\u0001\u0000\u0000"+ - "\u0000\u0012\u02ae\u0001\u0000\u0000\u0000\u0012\u02b0\u0001\u0000\u0000"+ - "\u0000\u0012\u02b2\u0001\u0000\u0000\u0000\u0012\u02b4\u0001\u0000\u0000"+ - "\u0000\u0013\u02b6\u0001\u0000\u0000\u0000\u0013\u02b8\u0001\u0000\u0000"+ - "\u0000\u0013\u02ba\u0001\u0000\u0000\u0000\u0013\u02bc\u0001\u0000\u0000"+ - "\u0000\u0013\u02be\u0001\u0000\u0000\u0000\u0014\u02c0\u0001\u0000\u0000"+ - "\u0000\u0016\u02d1\u0001\u0000\u0000\u0000\u0018\u02e1\u0001\u0000\u0000"+ - "\u0000\u001a\u02e7\u0001\u0000\u0000\u0000\u001c\u02f6\u0001\u0000\u0000"+ - "\u0000\u001e\u02ff\u0001\u0000\u0000\u0000 \u030a\u0001\u0000\u0000\u0000"+ - "\"\u0317\u0001\u0000\u0000\u0000$\u0321\u0001\u0000\u0000\u0000&\u0328"+ - "\u0001\u0000\u0000\u0000(\u032f\u0001\u0000\u0000\u0000*\u0337\u0001\u0000"+ - "\u0000\u0000,\u0340\u0001\u0000\u0000\u0000.\u0346\u0001\u0000\u0000\u0000"+ - "0\u034f\u0001\u0000\u0000\u00002\u0356\u0001\u0000\u0000\u00004\u035e"+ - "\u0001\u0000\u0000\u00006\u0366\u0001\u0000\u0000\u00008\u036d\u0001\u0000"+ - "\u0000\u0000:\u0372\u0001\u0000\u0000\u0000<\u037e\u0001\u0000\u0000\u0000"+ - ">\u0385\u0001\u0000\u0000\u0000@\u038c\u0001\u0000\u0000\u0000B\u0395"+ - "\u0001\u0000\u0000\u0000D\u03a3\u0001\u0000\u0000\u0000F\u03ac\u0001\u0000"+ - "\u0000\u0000H\u03b4\u0001\u0000\u0000\u0000J\u03bc\u0001\u0000\u0000\u0000"+ - "L\u03c5\u0001\u0000\u0000\u0000N\u03d1\u0001\u0000\u0000\u0000P\u03d8"+ - "\u0001\u0000\u0000\u0000R\u03e4\u0001\u0000\u0000\u0000T\u03eb\u0001\u0000"+ - "\u0000\u0000V\u03f2\u0001\u0000\u0000\u0000X\u03fe\u0001\u0000\u0000\u0000"+ - "Z\u0407\u0001\u0000\u0000\u0000\\\u0410\u0001\u0000\u0000\u0000^\u0416"+ - "\u0001\u0000\u0000\u0000`\u041e\u0001\u0000\u0000\u0000b\u0424\u0001\u0000"+ - "\u0000\u0000d\u0429\u0001\u0000\u0000\u0000f\u042f\u0001\u0000\u0000\u0000"+ - "h\u0433\u0001\u0000\u0000\u0000j\u0437\u0001\u0000\u0000\u0000l\u043b"+ - "\u0001\u0000\u0000\u0000n\u043f\u0001\u0000\u0000\u0000p\u0443\u0001\u0000"+ - "\u0000\u0000r\u0447\u0001\u0000\u0000\u0000t\u044b\u0001\u0000\u0000\u0000"+ - "v\u044f\u0001\u0000\u0000\u0000x\u0453\u0001\u0000\u0000\u0000z\u0457"+ - "\u0001\u0000\u0000\u0000|\u045b\u0001\u0000\u0000\u0000~\u0460\u0001\u0000"+ - "\u0000\u0000\u0080\u0466\u0001\u0000\u0000\u0000\u0082\u046b\u0001\u0000"+ - "\u0000\u0000\u0084\u0470\u0001\u0000\u0000\u0000\u0086\u0479\u0001\u0000"+ - "\u0000\u0000\u0088\u0480\u0001\u0000\u0000\u0000\u008a\u0484\u0001\u0000"+ - "\u0000\u0000\u008c\u0488\u0001\u0000\u0000\u0000\u008e\u048c\u0001\u0000"+ - "\u0000\u0000\u0090\u0490\u0001\u0000\u0000\u0000\u0092\u0494\u0001\u0000"+ - "\u0000\u0000\u0094\u049a\u0001\u0000\u0000\u0000\u0096\u04a1\u0001\u0000"+ - "\u0000\u0000\u0098\u04a5\u0001\u0000\u0000\u0000\u009a\u04a9\u0001\u0000"+ - "\u0000\u0000\u009c\u04ad\u0001\u0000\u0000\u0000\u009e\u04b1\u0001\u0000"+ - "\u0000\u0000\u00a0\u04b5\u0001\u0000\u0000\u0000\u00a2\u04b9\u0001\u0000"+ - "\u0000\u0000\u00a4\u04bd\u0001\u0000\u0000\u0000\u00a6\u04c1\u0001\u0000"+ - "\u0000\u0000\u00a8\u04c5\u0001\u0000\u0000\u0000\u00aa\u04c9\u0001\u0000"+ - "\u0000\u0000\u00ac\u04cd\u0001\u0000\u0000\u0000\u00ae\u04d1\u0001\u0000"+ - "\u0000\u0000\u00b0\u04d5\u0001\u0000\u0000\u0000\u00b2\u04d9\u0001\u0000"+ - "\u0000\u0000\u00b4\u04dd\u0001\u0000\u0000\u0000\u00b6\u04e2\u0001\u0000"+ - "\u0000\u0000\u00b8\u04e7\u0001\u0000\u0000\u0000\u00ba\u04eb\u0001\u0000"+ - "\u0000\u0000\u00bc\u04ef\u0001\u0000\u0000\u0000\u00be\u04f3\u0001\u0000"+ - "\u0000\u0000\u00c0\u04f7\u0001\u0000\u0000\u0000\u00c2\u04f9\u0001\u0000"+ - "\u0000\u0000\u00c4\u04fb\u0001\u0000\u0000\u0000\u00c6\u04fe\u0001\u0000"+ - "\u0000\u0000\u00c8\u0500\u0001\u0000\u0000\u0000\u00ca\u0509\u0001\u0000"+ - "\u0000\u0000\u00cc\u050b\u0001\u0000\u0000\u0000\u00ce\u0510\u0001\u0000"+ - "\u0000\u0000\u00d0\u0512\u0001\u0000\u0000\u0000\u00d2\u0517\u0001\u0000"+ - "\u0000\u0000\u00d4\u0536\u0001\u0000\u0000\u0000\u00d6\u0539\u0001\u0000"+ - "\u0000\u0000\u00d8\u0567\u0001\u0000\u0000\u0000\u00da\u0569\u0001\u0000"+ - "\u0000\u0000\u00dc\u056d\u0001\u0000\u0000\u0000\u00de\u0571\u0001\u0000"+ - "\u0000\u0000\u00e0\u0573\u0001\u0000\u0000\u0000\u00e2\u0576\u0001\u0000"+ - "\u0000\u0000\u00e4\u0579\u0001\u0000\u0000\u0000\u00e6\u057b\u0001\u0000"+ - "\u0000\u0000\u00e8\u057d\u0001\u0000\u0000\u0000\u00ea\u057f\u0001\u0000"+ - "\u0000\u0000\u00ec\u0584\u0001\u0000\u0000\u0000\u00ee\u0586\u0001\u0000"+ - "\u0000\u0000\u00f0\u058c\u0001\u0000\u0000\u0000\u00f2\u0592\u0001\u0000"+ - "\u0000\u0000\u00f4\u0595\u0001\u0000\u0000\u0000\u00f6\u0598\u0001\u0000"+ - "\u0000\u0000\u00f8\u059d\u0001\u0000\u0000\u0000\u00fa\u05a2\u0001\u0000"+ - "\u0000\u0000\u00fc\u05a6\u0001\u0000\u0000\u0000\u00fe\u05ab\u0001\u0000"+ - "\u0000\u0000\u0100\u05b1\u0001\u0000\u0000\u0000\u0102\u05b4\u0001\u0000"+ - "\u0000\u0000\u0104\u05b7\u0001\u0000\u0000\u0000\u0106\u05b9\u0001\u0000"+ - "\u0000\u0000\u0108\u05bf\u0001\u0000\u0000\u0000\u010a\u05c4\u0001\u0000"+ - "\u0000\u0000\u010c\u05c9\u0001\u0000\u0000\u0000\u010e\u05cc\u0001\u0000"+ - "\u0000\u0000\u0110\u05cf\u0001\u0000\u0000\u0000\u0112\u05d2\u0001\u0000"+ - "\u0000\u0000\u0114\u05d4\u0001\u0000\u0000\u0000\u0116\u05d7\u0001\u0000"+ - "\u0000\u0000\u0118\u05d9\u0001\u0000\u0000\u0000\u011a\u05dc\u0001\u0000"+ - "\u0000\u0000\u011c\u05de\u0001\u0000\u0000\u0000\u011e\u05e0\u0001\u0000"+ - "\u0000\u0000\u0120\u05e2\u0001\u0000\u0000\u0000\u0122\u05e4\u0001\u0000"+ - "\u0000\u0000\u0124\u05e6\u0001\u0000\u0000\u0000\u0126\u05e8\u0001\u0000"+ - "\u0000\u0000\u0128\u05ea\u0001\u0000\u0000\u0000\u012a\u05ed\u0001\u0000"+ - "\u0000\u0000\u012c\u0602\u0001\u0000\u0000\u0000\u012e\u0615\u0001\u0000"+ - "\u0000\u0000\u0130\u0617\u0001\u0000\u0000\u0000\u0132\u061c\u0001\u0000"+ - "\u0000\u0000\u0134\u0621\u0001\u0000\u0000\u0000\u0136\u0626\u0001\u0000"+ - "\u0000\u0000\u0138\u063b\u0001\u0000\u0000\u0000\u013a\u063d\u0001\u0000"+ - "\u0000\u0000\u013c\u0645\u0001\u0000\u0000\u0000\u013e\u0647\u0001\u0000"+ - "\u0000\u0000\u0140\u064b\u0001\u0000\u0000\u0000\u0142\u064f\u0001\u0000"+ - "\u0000\u0000\u0144\u0653\u0001\u0000\u0000\u0000\u0146\u0658\u0001\u0000"+ - "\u0000\u0000\u0148\u065c\u0001\u0000\u0000\u0000\u014a\u0660\u0001\u0000"+ - "\u0000\u0000\u014c\u0664\u0001\u0000\u0000\u0000\u014e\u0668\u0001\u0000"+ - "\u0000\u0000\u0150\u0671\u0001\u0000\u0000\u0000\u0152\u0677\u0001\u0000"+ - "\u0000\u0000\u0154\u067b\u0001\u0000\u0000\u0000\u0156\u067f\u0001\u0000"+ - "\u0000\u0000\u0158\u0685\u0001\u0000\u0000\u0000\u015a\u068d\u0001\u0000"+ - "\u0000\u0000\u015c\u0690\u0001\u0000\u0000\u0000\u015e\u0694\u0001\u0000"+ - "\u0000\u0000\u0160\u0698\u0001\u0000\u0000\u0000\u0162\u069c\u0001\u0000"+ - "\u0000\u0000\u0164\u06a0\u0001\u0000\u0000\u0000\u0166\u06a4\u0001\u0000"+ - "\u0000\u0000\u0168\u06a8\u0001\u0000\u0000\u0000\u016a\u06ad\u0001\u0000"+ - "\u0000\u0000\u016c\u06b3\u0001\u0000\u0000\u0000\u016e\u06b8\u0001\u0000"+ - "\u0000\u0000\u0170\u06bc\u0001\u0000\u0000\u0000\u0172\u06c0\u0001\u0000"+ - "\u0000\u0000\u0174\u06c4\u0001\u0000\u0000\u0000\u0176\u06c9\u0001\u0000"+ - "\u0000\u0000\u0178\u06cf\u0001\u0000\u0000\u0000\u017a\u06d5\u0001\u0000"+ - "\u0000\u0000\u017c\u06db\u0001\u0000\u0000\u0000\u017e\u06df\u0001\u0000"+ - "\u0000\u0000\u0180\u06e5\u0001\u0000\u0000\u0000\u0182\u06e9\u0001\u0000"+ - "\u0000\u0000\u0184\u06ed\u0001\u0000\u0000\u0000\u0186\u06f1\u0001\u0000"+ - "\u0000\u0000\u0188\u06f5\u0001\u0000\u0000\u0000\u018a\u06f9\u0001\u0000"+ - "\u0000\u0000\u018c\u06fd\u0001\u0000\u0000\u0000\u018e\u0701\u0001\u0000"+ - "\u0000\u0000\u0190\u0705\u0001\u0000\u0000\u0000\u0192\u0709\u0001\u0000"+ - "\u0000\u0000\u0194\u070d\u0001\u0000\u0000\u0000\u0196\u0711\u0001\u0000"+ - "\u0000\u0000\u0198\u0715\u0001\u0000\u0000\u0000\u019a\u071e\u0001\u0000"+ - "\u0000\u0000\u019c\u0722\u0001\u0000\u0000\u0000\u019e\u0726\u0001\u0000"+ - "\u0000\u0000\u01a0\u072a\u0001\u0000\u0000\u0000\u01a2\u072f\u0001\u0000"+ - "\u0000\u0000\u01a4\u0734\u0001\u0000\u0000\u0000\u01a6\u0738\u0001\u0000"+ - "\u0000\u0000\u01a8\u073e\u0001\u0000\u0000\u0000\u01aa\u0747\u0001\u0000"+ - "\u0000\u0000\u01ac\u074b\u0001\u0000\u0000\u0000\u01ae\u074f\u0001\u0000"+ - "\u0000\u0000\u01b0\u0753\u0001\u0000\u0000\u0000\u01b2\u0757\u0001\u0000"+ - "\u0000\u0000\u01b4\u075b\u0001\u0000\u0000\u0000\u01b6\u075f\u0001\u0000"+ - "\u0000\u0000\u01b8\u0764\u0001\u0000\u0000\u0000\u01ba\u076a\u0001\u0000"+ - "\u0000\u0000\u01bc\u076e\u0001\u0000\u0000\u0000\u01be\u0772\u0001\u0000"+ - "\u0000\u0000\u01c0\u0776\u0001\u0000\u0000\u0000\u01c2\u077b\u0001\u0000"+ - "\u0000\u0000\u01c4\u077f\u0001\u0000\u0000\u0000\u01c6\u0783\u0001\u0000"+ - "\u0000\u0000\u01c8\u0787\u0001\u0000\u0000\u0000\u01ca\u078b\u0001\u0000"+ - "\u0000\u0000\u01cc\u078f\u0001\u0000\u0000\u0000\u01ce\u0795\u0001\u0000"+ - "\u0000\u0000\u01d0\u079c\u0001\u0000\u0000\u0000\u01d2\u07a0\u0001\u0000"+ - "\u0000\u0000\u01d4\u07a4\u0001\u0000\u0000\u0000\u01d6\u07a8\u0001\u0000"+ - "\u0000\u0000\u01d8\u07ac\u0001\u0000\u0000\u0000\u01da\u07b0\u0001\u0000"+ - "\u0000\u0000\u01dc\u07b4\u0001\u0000\u0000\u0000\u01de\u07b9\u0001\u0000"+ - "\u0000\u0000\u01e0\u07bd\u0001\u0000\u0000\u0000\u01e2\u07c1\u0001\u0000"+ - "\u0000\u0000\u01e4\u07c5\u0001\u0000\u0000\u0000\u01e6\u07c9\u0001\u0000"+ - "\u0000\u0000\u01e8\u07cd\u0001\u0000\u0000\u0000\u01ea\u07d1\u0001\u0000"+ - "\u0000\u0000\u01ec\u07d5\u0001\u0000\u0000\u0000\u01ee\u07d9\u0001\u0000"+ - "\u0000\u0000\u01f0\u07dd\u0001\u0000\u0000\u0000\u01f2\u07e1\u0001\u0000"+ - "\u0000\u0000\u01f4\u07e5\u0001\u0000\u0000\u0000\u01f6\u07e9\u0001\u0000"+ - "\u0000\u0000\u01f8\u07ed\u0001\u0000\u0000\u0000\u01fa\u07f1\u0001\u0000"+ - "\u0000\u0000\u01fc\u07f5\u0001\u0000\u0000\u0000\u01fe\u07f9\u0001\u0000"+ - "\u0000\u0000\u0200\u07fd\u0001\u0000\u0000\u0000\u0202\u0801\u0001\u0000"+ - "\u0000\u0000\u0204\u0806\u0001\u0000\u0000\u0000\u0206\u080c\u0001\u0000"+ - "\u0000\u0000\u0208\u0810\u0001\u0000\u0000\u0000\u020a\u0814\u0001\u0000"+ - "\u0000\u0000\u020c\u0818\u0001\u0000\u0000\u0000\u020e\u081c\u0001\u0000"+ - "\u0000\u0000\u0210\u0820\u0001\u0000\u0000\u0000\u0212\u0824\u0001\u0000"+ - "\u0000\u0000\u0214\u0828\u0001\u0000\u0000\u0000\u0216\u082c\u0001\u0000"+ - "\u0000\u0000\u0218\u0830\u0001\u0000\u0000\u0000\u021a\u0834\u0001\u0000"+ - "\u0000\u0000\u021c\u0838\u0001\u0000\u0000\u0000\u021e\u083c\u0001\u0000"+ - "\u0000\u0000\u0220\u0841\u0001\u0000\u0000\u0000\u0222\u0847\u0001\u0000"+ - "\u0000\u0000\u0224\u084b\u0001\u0000\u0000\u0000\u0226\u084f\u0001\u0000"+ - "\u0000\u0000\u0228\u0853\u0001\u0000\u0000\u0000\u022a\u0857\u0001\u0000"+ - "\u0000\u0000\u022c\u085b\u0001\u0000\u0000\u0000\u022e\u085f\u0001\u0000"+ - "\u0000\u0000\u0230\u0863\u0001\u0000\u0000\u0000\u0232\u086b\u0001\u0000"+ - "\u0000\u0000\u0234\u0880\u0001\u0000\u0000\u0000\u0236\u0884\u0001\u0000"+ - "\u0000\u0000\u0238\u0888\u0001\u0000\u0000\u0000\u023a\u088c\u0001\u0000"+ - "\u0000\u0000\u023c\u0890\u0001\u0000\u0000\u0000\u023e\u0894\u0001\u0000"+ - "\u0000\u0000\u0240\u0898\u0001\u0000\u0000\u0000\u0242\u089c\u0001\u0000"+ - "\u0000\u0000\u0244\u08a0\u0001\u0000\u0000\u0000\u0246\u08a4\u0001\u0000"+ - "\u0000\u0000\u0248\u08a8\u0001\u0000\u0000\u0000\u024a\u08ac\u0001\u0000"+ - "\u0000\u0000\u024c\u08b0\u0001\u0000\u0000\u0000\u024e\u08b4\u0001\u0000"+ - "\u0000\u0000\u0250\u08b8\u0001\u0000\u0000\u0000\u0252\u08bd\u0001\u0000"+ - "\u0000\u0000\u0254\u08c2\u0001\u0000\u0000\u0000\u0256\u08c8\u0001\u0000"+ - "\u0000\u0000\u0258\u08cf\u0001\u0000\u0000\u0000\u025a\u08d3\u0001\u0000"+ - "\u0000\u0000\u025c\u08d7\u0001\u0000\u0000\u0000\u025e\u08db\u0001\u0000"+ - "\u0000\u0000\u0260\u08e8\u0001\u0000\u0000\u0000\u0262\u08f3\u0001\u0000"+ - "\u0000\u0000\u0264\u08f5\u0001\u0000\u0000\u0000\u0266\u08fa\u0001\u0000"+ - "\u0000\u0000\u0268\u0900\u0001\u0000\u0000\u0000\u026a\u0904\u0001\u0000"+ - "\u0000\u0000\u026c\u0908\u0001\u0000\u0000\u0000\u026e\u090c\u0001\u0000"+ - "\u0000\u0000\u0270\u0910\u0001\u0000\u0000\u0000\u0272\u0914\u0001\u0000"+ - "\u0000\u0000\u0274\u0918\u0001\u0000\u0000\u0000\u0276\u091c\u0001\u0000"+ - "\u0000\u0000\u0278\u0920\u0001\u0000\u0000\u0000\u027a\u0924\u0001\u0000"+ - "\u0000\u0000\u027c\u0927\u0001\u0000\u0000\u0000\u027e\u092b\u0001\u0000"+ - "\u0000\u0000\u0280\u092f\u0001\u0000\u0000\u0000\u0282\u0933\u0001\u0000"+ - "\u0000\u0000\u0284\u0937\u0001\u0000\u0000\u0000\u0286\u093b\u0001\u0000"+ - "\u0000\u0000\u0288\u093f\u0001\u0000\u0000\u0000\u028a\u0943\u0001\u0000"+ - "\u0000\u0000\u028c\u0948\u0001\u0000\u0000\u0000\u028e\u094c\u0001\u0000"+ - "\u0000\u0000\u0290\u0950\u0001\u0000\u0000\u0000\u0292\u0954\u0001\u0000"+ - "\u0000\u0000\u0294\u0958\u0001\u0000\u0000\u0000\u0296\u095c\u0001\u0000"+ - "\u0000\u0000\u0298\u0960\u0001\u0000\u0000\u0000\u029a\u0964\u0001\u0000"+ - "\u0000\u0000\u029c\u0968\u0001\u0000\u0000\u0000\u029e\u096c\u0001\u0000"+ - "\u0000\u0000\u02a0\u0970\u0001\u0000\u0000\u0000\u02a2\u0974\u0001\u0000"+ - "\u0000\u0000\u02a4\u0978\u0001\u0000\u0000\u0000\u02a6\u097c\u0001\u0000"+ - "\u0000\u0000\u02a8\u0980\u0001\u0000\u0000\u0000\u02aa\u0984\u0001\u0000"+ - "\u0000\u0000\u02ac\u0988\u0001\u0000\u0000\u0000\u02ae\u098c\u0001\u0000"+ - "\u0000\u0000\u02b0\u0990\u0001\u0000\u0000\u0000\u02b2\u0994\u0001\u0000"+ - "\u0000\u0000\u02b4\u0998\u0001\u0000\u0000\u0000\u02b6\u099c\u0001\u0000"+ - "\u0000\u0000\u02b8\u09a1\u0001\u0000\u0000\u0000\u02ba\u09a6\u0001\u0000"+ - "\u0000\u0000\u02bc\u09aa\u0001\u0000\u0000\u0000\u02be\u09ae\u0001\u0000"+ - "\u0000\u0000\u02c0\u02c1\u0005/\u0000\u0000\u02c1\u02c2\u0005/\u0000\u0000"+ - "\u02c2\u02c6\u0001\u0000\u0000\u0000\u02c3\u02c5\b\u0000\u0000\u0000\u02c4"+ - "\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c8\u0001\u0000\u0000\u0000\u02c6"+ - "\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7"+ - "\u02ca\u0001\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c9"+ - "\u02cb\u0005\r\u0000\u0000\u02ca\u02c9\u0001\u0000\u0000\u0000\u02ca\u02cb"+ - "\u0001\u0000\u0000\u0000\u02cb\u02cd\u0001\u0000\u0000\u0000\u02cc\u02ce"+ - "\u0005\n\u0000\u0000\u02cd\u02cc\u0001\u0000\u0000\u0000\u02cd\u02ce\u0001"+ - "\u0000\u0000\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02d0\u0006"+ - "\u0000\u0000\u0000\u02d0\u0015\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005"+ - "/\u0000\u0000\u02d2\u02d3\u0005*\u0000\u0000\u02d3\u02d8\u0001\u0000\u0000"+ - "\u0000\u02d4\u02d7\u0003\u0016\u0001\u0000\u02d5\u02d7\t\u0000\u0000\u0000"+ - "\u02d6\u02d4\u0001\u0000\u0000\u0000\u02d6\u02d5\u0001\u0000\u0000\u0000"+ - "\u02d7\u02da\u0001\u0000\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000"+ - "\u02d8\u02d6\u0001\u0000\u0000\u0000\u02d9\u02db\u0001\u0000\u0000\u0000"+ - "\u02da\u02d8\u0001\u0000\u0000\u0000\u02db\u02dc\u0005*\u0000\u0000\u02dc"+ - "\u02dd\u0005/\u0000\u0000\u02dd\u02de\u0001\u0000\u0000\u0000\u02de\u02df"+ - "\u0006\u0001\u0000\u0000\u02df\u0017\u0001\u0000\u0000\u0000\u02e0\u02e2"+ - "\u0007\u0001\u0000\u0000\u02e1\u02e0\u0001\u0000\u0000\u0000\u02e2\u02e3"+ - "\u0001\u0000\u0000\u0000\u02e3\u02e1\u0001\u0000\u0000\u0000\u02e3\u02e4"+ - "\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000\u0000\u02e5\u02e6"+ - "\u0006\u0002\u0000\u0000\u02e6\u0019\u0001\u0000\u0000\u0000\u02e7\u02e8"+ - "\u0007\u0002\u0000\u0000\u02e8\u02e9\u0007\u0003\u0000\u0000\u02e9\u02ea"+ - "\u0007\u0004\u0000\u0000\u02ea\u02eb\u0007\u0005\u0000\u0000\u02eb\u02ec"+ - "\u0007\u0006\u0000\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee"+ - "\u0005_\u0000\u0000\u02ee\u02ef\u0007\b\u0000\u0000\u02ef\u02f0\u0007"+ - "\t\u0000\u0000\u02f0\u02f1\u0007\n\u0000\u0000\u02f1\u02f2\u0007\u0005"+ - "\u0000\u0000\u02f2\u02f3\u0007\u000b\u0000\u0000\u02f3\u02f4\u0001\u0000"+ - "\u0000\u0000\u02f4\u02f5\u0006\u0003\u0001\u0000\u02f5\u001b\u0001\u0000"+ - "\u0000\u0000\u02f6\u02f7\u0007\u0007\u0000\u0000\u02f7\u02f8\u0007\u0005"+ - "\u0000\u0000\u02f8\u02f9\u0007\f\u0000\u0000\u02f9\u02fa\u0007\n\u0000"+ - "\u0000\u02fa\u02fb\u0007\u0002\u0000\u0000\u02fb\u02fc\u0007\u0003\u0000"+ - "\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd\u02fe\u0006\u0004\u0002"+ - "\u0000\u02fe\u001d\u0001\u0000\u0000\u0000\u02ff\u0300\u0004\u0005\u0000"+ - "\u0000\u0300\u0301\u0007\u0007\u0000\u0000\u0301\u0302\u0007\r\u0000\u0000"+ - "\u0302\u0303\u0007\b\u0000\u0000\u0303\u0304\u0007\u000e\u0000\u0000\u0304"+ - "\u0305\u0007\u0004\u0000\u0000\u0305\u0306\u0007\n\u0000\u0000\u0306\u0307"+ - "\u0007\u0005\u0000\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308\u0309"+ - "\u0006\u0005\u0003\u0000\u0309\u001f\u0001\u0000\u0000\u0000\u030a\u030b"+ - "\u0007\u0002\u0000\u0000\u030b\u030c\u0007\t\u0000\u0000\u030c\u030d\u0007"+ - "\u000f\u0000\u0000\u030d\u030e\u0007\b\u0000\u0000\u030e\u030f\u0007\u000e"+ - "\u0000\u0000\u030f\u0310\u0007\u0007\u0000\u0000\u0310\u0311\u0007\u000b"+ - "\u0000\u0000\u0311\u0312\u0007\n\u0000\u0000\u0312\u0313\u0007\t\u0000"+ - "\u0000\u0313\u0314\u0007\u0005\u0000\u0000\u0314\u0315\u0001\u0000\u0000"+ - "\u0000\u0315\u0316\u0006\u0006\u0004\u0000\u0316!\u0001\u0000\u0000\u0000"+ - "\u0317\u0318\u0007\u0010\u0000\u0000\u0318\u0319\u0007\n\u0000\u0000\u0319"+ - "\u031a\u0007\u0011\u0000\u0000\u031a\u031b\u0007\u0011\u0000\u0000\u031b"+ - "\u031c\u0007\u0007\u0000\u0000\u031c\u031d\u0007\u0002\u0000\u0000\u031d"+ - "\u031e\u0007\u000b\u0000\u0000\u031e\u031f\u0001\u0000\u0000\u0000\u031f"+ - "\u0320\u0006\u0007\u0004\u0000\u0320#\u0001\u0000\u0000\u0000\u0321\u0322"+ - "\u0007\u0007\u0000\u0000\u0322\u0323\u0007\u0012\u0000\u0000\u0323\u0324"+ - "\u0007\u0004\u0000\u0000\u0324\u0325\u0007\u000e\u0000\u0000\u0325\u0326"+ - "\u0001\u0000\u0000\u0000\u0326\u0327\u0006\b\u0004\u0000\u0327%\u0001"+ - "\u0000\u0000\u0000\u0328\u0329\u0007\u0006\u0000\u0000\u0329\u032a\u0007"+ - "\f\u0000\u0000\u032a\u032b\u0007\t\u0000\u0000\u032b\u032c\u0007\u0013"+ - "\u0000\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032d\u032e\u0006\t\u0004"+ - "\u0000\u032e\'\u0001\u0000\u0000\u0000\u032f\u0330\u0007\u000e\u0000\u0000"+ - "\u0330\u0331\u0007\n\u0000\u0000\u0331\u0332\u0007\u000f\u0000\u0000\u0332"+ - "\u0333\u0007\n\u0000\u0000\u0333\u0334\u0007\u000b\u0000\u0000\u0334\u0335"+ - "\u0001\u0000\u0000\u0000\u0335\u0336\u0006\n\u0004\u0000\u0336)\u0001"+ - "\u0000\u0000\u0000\u0337\u0338\u0007\f\u0000\u0000\u0338\u0339\u0007\u0007"+ - "\u0000\u0000\u0339\u033a\u0007\f\u0000\u0000\u033a\u033b\u0007\u0004\u0000"+ - "\u0000\u033b\u033c\u0007\u0005\u0000\u0000\u033c\u033d\u0007\u0013\u0000"+ - "\u0000\u033d\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006\u000b\u0004"+ - "\u0000\u033f+\u0001\u0000\u0000\u0000\u0340\u0341\u0007\f\u0000\u0000"+ - "\u0341\u0342\u0007\t\u0000\u0000\u0342\u0343\u0007\u0014\u0000\u0000\u0343"+ - "\u0344\u0001\u0000\u0000\u0000\u0344\u0345\u0006\f\u0004\u0000\u0345-"+ - "\u0001\u0000\u0000\u0000\u0346\u0347\u0007\u0011\u0000\u0000\u0347\u0348"+ - "\u0007\u0004\u0000\u0000\u0348\u0349\u0007\u000f\u0000\u0000\u0349\u034a"+ - "\u0007\b\u0000\u0000\u034a\u034b\u0007\u000e\u0000\u0000\u034b\u034c\u0007"+ - "\u0007\u0000\u0000\u034c\u034d\u0001\u0000\u0000\u0000\u034d\u034e\u0006"+ - "\r\u0004\u0000\u034e/\u0001\u0000\u0000\u0000\u034f\u0350\u0007\u0011"+ - "\u0000\u0000\u0350\u0351\u0007\t\u0000\u0000\u0351\u0352\u0007\f\u0000"+ - "\u0000\u0352\u0353\u0007\u000b\u0000\u0000\u0353\u0354\u0001\u0000\u0000"+ - "\u0000\u0354\u0355\u0006\u000e\u0004\u0000\u03551\u0001\u0000\u0000\u0000"+ - "\u0356\u0357\u0007\u0011\u0000\u0000\u0357\u0358\u0007\u000b\u0000\u0000"+ - "\u0358\u0359\u0007\u0004\u0000\u0000\u0359\u035a\u0007\u000b\u0000\u0000"+ - "\u035a\u035b\u0007\u0011\u0000\u0000\u035b\u035c\u0001\u0000\u0000\u0000"+ - "\u035c\u035d\u0006\u000f\u0004\u0000\u035d3\u0001\u0000\u0000\u0000\u035e"+ - "\u035f\u0007\u0014\u0000\u0000\u035f\u0360\u0007\u0003\u0000\u0000\u0360"+ - "\u0361\u0007\u0007\u0000\u0000\u0361\u0362\u0007\f\u0000\u0000\u0362\u0363"+ - "\u0007\u0007\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364\u0365"+ - "\u0006\u0010\u0004\u0000\u03655\u0001\u0000\u0000\u0000\u0366\u0367\u0007"+ - "\u0015\u0000\u0000\u0367\u0368\u0007\f\u0000\u0000\u0368\u0369\u0007\t"+ - "\u0000\u0000\u0369\u036a\u0007\u000f\u0000\u0000\u036a\u036b\u0001\u0000"+ - "\u0000\u0000\u036b\u036c\u0006\u0011\u0005\u0000\u036c7\u0001\u0000\u0000"+ - "\u0000\u036d\u036e\u0007\u000b\u0000\u0000\u036e\u036f\u0007\u0011\u0000"+ - "\u0000\u036f\u0370\u0001\u0000\u0000\u0000\u0370\u0371\u0006\u0012\u0005"+ - "\u0000\u03719\u0001\u0000\u0000\u0000\u0372\u0373\u0004\u0013\u0001\u0000"+ - "\u0373\u0374\u0007\u0007\u0000\u0000\u0374\u0375\u0007\r\u0000\u0000\u0375"+ - "\u0376\u0007\u000b\u0000\u0000\u0376\u0377\u0007\u0007\u0000\u0000\u0377"+ - "\u0378\u0007\f\u0000\u0000\u0378\u0379\u0007\u0005\u0000\u0000\u0379\u037a"+ - "\u0007\u0004\u0000\u0000\u037a\u037b\u0007\u000e\u0000\u0000\u037b\u037c"+ - "\u0001\u0000\u0000\u0000\u037c\u037d\u0006\u0013\u0005\u0000\u037d;\u0001"+ - "\u0000\u0000\u0000\u037e\u037f\u0007\u0015\u0000\u0000\u037f\u0380\u0007"+ - "\t\u0000\u0000\u0380\u0381\u0007\f\u0000\u0000\u0381\u0382\u0007\u0013"+ - "\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383\u0384\u0006\u0014"+ - "\u0006\u0000\u0384=\u0001\u0000\u0000\u0000\u0385\u0386\u0007\u0015\u0000"+ - "\u0000\u0386\u0387\u0007\u0016\u0000\u0000\u0387\u0388\u0007\u0011\u0000"+ - "\u0000\u0388\u0389\u0007\u0007\u0000\u0000\u0389\u038a\u0001\u0000\u0000"+ - "\u0000\u038a\u038b\u0006\u0015\u0007\u0000\u038b?\u0001\u0000\u0000\u0000"+ - "\u038c\u038d\u0007\n\u0000\u0000\u038d\u038e\u0007\u0005\u0000\u0000\u038e"+ - "\u038f\u0007\u000e\u0000\u0000\u038f\u0390\u0007\n\u0000\u0000\u0390\u0391"+ - "\u0007\u0005\u0000\u0000\u0391\u0392\u0007\u0007\u0000\u0000\u0392\u0393"+ - "\u0001\u0000\u0000\u0000\u0393\u0394\u0006\u0016\b\u0000\u0394A\u0001"+ - "\u0000\u0000\u0000\u0395\u0396\u0007\n\u0000\u0000\u0396\u0397\u0007\u0005"+ - "\u0000\u0000\u0397\u0398\u0007\u000e\u0000\u0000\u0398\u0399\u0007\n\u0000"+ - "\u0000\u0399\u039a\u0007\u0005\u0000\u0000\u039a\u039b\u0007\u0007\u0000"+ - "\u0000\u039b\u039c\u0007\u0011\u0000\u0000\u039c\u039d\u0007\u000b\u0000"+ - "\u0000\u039d\u039e\u0007\u0004\u0000\u0000\u039e\u039f\u0007\u000b\u0000"+ - "\u0000\u039f\u03a0\u0007\u0011\u0000\u0000\u03a0\u03a1\u0001\u0000\u0000"+ - "\u0000\u03a1\u03a2\u0006\u0017\u0004\u0000\u03a2C\u0001\u0000\u0000\u0000"+ - "\u03a3\u03a4\u0007\u000e\u0000\u0000\u03a4\u03a5\u0007\t\u0000\u0000\u03a5"+ - "\u03a6\u0007\t\u0000\u0000\u03a6\u03a7\u0007\u0013\u0000\u0000\u03a7\u03a8"+ - "\u0007\u0016\u0000\u0000\u03a8\u03a9\u0007\b\u0000\u0000\u03a9\u03aa\u0001"+ - "\u0000\u0000\u0000\u03aa\u03ab\u0006\u0018\t\u0000\u03abE\u0001\u0000"+ - "\u0000\u0000\u03ac\u03ad\u0004\u0019\u0002\u0000\u03ad\u03ae\u0007\u0015"+ - "\u0000\u0000\u03ae\u03af\u0007\u0016\u0000\u0000\u03af\u03b0\u0007\u000e"+ - "\u0000\u0000\u03b0\u03b1\u0007\u000e\u0000\u0000\u03b1\u03b2\u0001\u0000"+ - "\u0000\u0000\u03b2\u03b3\u0006\u0019\t\u0000\u03b3G\u0001\u0000\u0000"+ - "\u0000\u03b4\u03b5\u0004\u001a\u0003\u0000\u03b5\u03b6\u0007\u000e\u0000"+ - "\u0000\u03b6\u03b7\u0007\u0007\u0000\u0000\u03b7\u03b8\u0007\u0015\u0000"+ - "\u0000\u03b8\u03b9\u0007\u000b\u0000\u0000\u03b9\u03ba\u0001\u0000\u0000"+ - "\u0000\u03ba\u03bb\u0006\u001a\t\u0000\u03bbI\u0001\u0000\u0000\u0000"+ - "\u03bc\u03bd\u0004\u001b\u0004\u0000\u03bd\u03be\u0007\f\u0000\u0000\u03be"+ - "\u03bf\u0007\n\u0000\u0000\u03bf\u03c0\u0007\u0006\u0000\u0000\u03c0\u03c1"+ - "\u0007\u0003\u0000\u0000\u03c1\u03c2\u0007\u000b\u0000\u0000\u03c2\u03c3"+ - "\u0001\u0000\u0000\u0000\u03c3\u03c4\u0006\u001b\t\u0000\u03c4K\u0001"+ - "\u0000\u0000\u0000\u03c5\u03c6\u0004\u001c\u0005\u0000\u03c6\u03c7\u0007"+ - "\u000e\u0000\u0000\u03c7\u03c8\u0007\t\u0000\u0000\u03c8\u03c9\u0007\t"+ - "\u0000\u0000\u03c9\u03ca\u0007\u0013\u0000\u0000\u03ca\u03cb\u0007\u0016"+ - "\u0000\u0000\u03cb\u03cc\u0007\b\u0000\u0000\u03cc\u03cd\u0005_\u0000"+ - "\u0000\u03cd\u03ce\u0005\u8001\uf414\u0000\u0000\u03ce\u03cf\u0001\u0000"+ - "\u0000\u0000\u03cf\u03d0\u0006\u001c\n\u0000\u03d0M\u0001\u0000\u0000"+ - "\u0000\u03d1\u03d2\u0004\u001d\u0006\u0000\u03d2\u03d3\u0007\u000f\u0000"+ - "\u0000\u03d3\u03d4\u0007\u000f\u0000\u0000\u03d4\u03d5\u0007\f\u0000\u0000"+ - "\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0006\u001d\u000b\u0000"+ - "\u03d7O\u0001\u0000\u0000\u0000\u03d8\u03d9\u0007\u000f\u0000\u0000\u03d9"+ - "\u03da\u0007\u0012\u0000\u0000\u03da\u03db\u0005_\u0000\u0000\u03db\u03dc"+ - "\u0007\u0007\u0000\u0000\u03dc\u03dd\u0007\r\u0000\u0000\u03dd\u03de\u0007"+ - "\b\u0000\u0000\u03de\u03df\u0007\u0004\u0000\u0000\u03df\u03e0\u0007\u0005"+ - "\u0000\u0000\u03e0\u03e1\u0007\u0010\u0000\u0000\u03e1\u03e2\u0001\u0000"+ - "\u0000\u0000\u03e2\u03e3\u0006\u001e\f\u0000\u03e3Q\u0001\u0000\u0000"+ - "\u0000\u03e4\u03e5\u0007\u0010\u0000\u0000\u03e5\u03e6\u0007\f\u0000\u0000"+ - "\u03e6\u03e7\u0007\t\u0000\u0000\u03e7\u03e8\u0007\b\u0000\u0000\u03e8"+ - "\u03e9\u0001\u0000\u0000\u0000\u03e9\u03ea\u0006\u001f\r\u0000\u03eaS"+ - "\u0001\u0000\u0000\u0000\u03eb\u03ec\u0007\u0013\u0000\u0000\u03ec\u03ed"+ - "\u0007\u0007\u0000\u0000\u03ed\u03ee\u0007\u0007\u0000\u0000\u03ee\u03ef"+ - "\u0007\b\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0\u03f1\u0006"+ - " \r\u0000\u03f1U\u0001\u0000\u0000\u0000\u03f2\u03f3\u0004!\u0007\u0000"+ - "\u03f3\u03f4\u0007\n\u0000\u0000\u03f4\u03f5\u0007\u0005\u0000\u0000\u03f5"+ - "\u03f6\u0007\u0011\u0000\u0000\u03f6\u03f7\u0007\n\u0000\u0000\u03f7\u03f8"+ - "\u0007\u0011\u0000\u0000\u03f8\u03f9\u0007\u000b\u0000\u0000\u03f9\u03fa"+ - "\u0005_\u0000\u0000\u03fa\u03fb\u0005\u8001\uf414\u0000\u0000\u03fb\u03fc"+ - "\u0001\u0000\u0000\u0000\u03fc\u03fd\u0006!\r\u0000\u03fdW\u0001\u0000"+ - "\u0000\u0000\u03fe\u03ff\u0007\b\u0000\u0000\u03ff\u0400\u0007\f\u0000"+ - "\u0000\u0400\u0401\u0007\t\u0000\u0000\u0401\u0402\u0007\u000f\u0000\u0000"+ - "\u0402\u0403\u0007\u0017\u0000\u0000\u0403\u0404\u0007\u000e\u0000\u0000"+ - "\u0404\u0405\u0001\u0000\u0000\u0000\u0405\u0406\u0006\"\u000e\u0000\u0406"+ - "Y\u0001\u0000\u0000\u0000\u0407\u0408\u0007\f\u0000\u0000\u0408\u0409"+ - "\u0007\u0007\u0000\u0000\u0409\u040a\u0007\u0005\u0000\u0000\u040a\u040b"+ - "\u0007\u0004\u0000\u0000\u040b\u040c\u0007\u000f\u0000\u0000\u040c\u040d"+ - "\u0007\u0007\u0000\u0000\u040d\u040e\u0001\u0000\u0000\u0000\u040e\u040f"+ - "\u0006#\u000f\u0000\u040f[\u0001\u0000\u0000\u0000\u0410\u0411\u0007\u0011"+ - "\u0000\u0000\u0411\u0412\u0007\u0007\u0000\u0000\u0412\u0413\u0007\u000b"+ - "\u0000\u0000\u0413\u0414\u0001\u0000\u0000\u0000\u0414\u0415\u0006$\u0010"+ - "\u0000\u0415]\u0001\u0000\u0000\u0000\u0416\u0417\u0007\u0011\u0000\u0000"+ - "\u0417\u0418\u0007\u0003\u0000\u0000\u0418\u0419\u0007\t\u0000\u0000\u0419"+ - "\u041a\u0007\u0014\u0000\u0000\u041a\u041b\u0001\u0000\u0000\u0000\u041b"+ - "\u041c\u0006%\u0011\u0000\u041c_\u0001\u0000\u0000\u0000\u041d\u041f\b"+ - "\u0018\u0000\u0000\u041e\u041d\u0001\u0000\u0000\u0000\u041f\u0420\u0001"+ - "\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u0421\u0001"+ - "\u0000\u0000\u0000\u0421\u0422\u0001\u0000\u0000\u0000\u0422\u0423\u0006"+ - "&\u0004\u0000\u0423a\u0001\u0000\u0000\u0000\u0424\u0425\u0003\u00beU"+ - "\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0427\u0006\'\u0012\u0000"+ - "\u0427\u0428\u0006\'\u0013\u0000\u0428c\u0001\u0000\u0000\u0000\u0429"+ - "\u042a\u0003\u0136\u0091\u0000\u042a\u042b\u0001\u0000\u0000\u0000\u042b"+ - "\u042c\u0006(\u0014\u0000\u042c\u042d\u0006(\u0013\u0000\u042d\u042e\u0006"+ - "(\u0013\u0000\u042ee\u0001\u0000\u0000\u0000\u042f\u0430\u0003\u0100v"+ - "\u0000\u0430\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0006)\u0015\u0000"+ - "\u0432g\u0001\u0000\u0000\u0000\u0433\u0434\u0003\u027a\u0133\u0000\u0434"+ - "\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0006*\u0016\u0000\u0436i\u0001"+ - "\u0000\u0000\u0000\u0437\u0438\u0003\u00ecl\u0000\u0438\u0439\u0001\u0000"+ - "\u0000\u0000\u0439\u043a\u0006+\u0017\u0000\u043ak\u0001\u0000\u0000\u0000"+ - "\u043b\u043c\u0003\u00e8j\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d"+ - "\u043e\u0006,\u0018\u0000\u043em\u0001\u0000\u0000\u0000\u043f\u0440\u0003"+ - "\u0130\u008e\u0000\u0440\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0006"+ - "-\u0019\u0000\u0442o\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u0132\u008f"+ - "\u0000\u0444\u0445\u0001\u0000\u0000\u0000\u0445\u0446\u0006.\u001a\u0000"+ - "\u0446q\u0001\u0000\u0000\u0000\u0447\u0448\u0003\u013c\u0094\u0000\u0448"+ - "\u0449\u0001\u0000\u0000\u0000\u0449\u044a\u0006/\u001b\u0000\u044as\u0001"+ - "\u0000\u0000\u0000\u044b\u044c\u0003\u0138\u0092\u0000\u044c\u044d\u0001"+ - "\u0000\u0000\u0000\u044d\u044e\u00060\u001c\u0000\u044eu\u0001\u0000\u0000"+ - "\u0000\u044f\u0450\u0003\u0014\u0000\u0000\u0450\u0451\u0001\u0000\u0000"+ - "\u0000\u0451\u0452\u00061\u0000\u0000\u0452w\u0001\u0000\u0000\u0000\u0453"+ - "\u0454\u0003\u0016\u0001\u0000\u0454\u0455\u0001\u0000\u0000\u0000\u0455"+ - "\u0456\u00062\u0000\u0000\u0456y\u0001\u0000\u0000\u0000\u0457\u0458\u0003"+ - "\u0018\u0002\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006"+ - "3\u0000\u0000\u045a{\u0001\u0000\u0000\u0000\u045b\u045c\u0003\u00beU"+ - "\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u00064\u0012\u0000"+ - "\u045e\u045f\u00064\u0013\u0000\u045f}\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0003\u0136\u0091\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463"+ - "\u00065\u0014\u0000\u0463\u0464\u00065\u0013\u0000\u0464\u0465\u00065"+ - "\u0013\u0000\u0465\u007f\u0001\u0000\u0000\u0000\u0466\u0467\u0003\u0100"+ - "v\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0469\u00066\u0015\u0000"+ - "\u0469\u046a\u00066\u001d\u0000\u046a\u0081\u0001\u0000\u0000\u0000\u046b"+ - "\u046c\u0003\u010a{\u0000\u046c\u046d\u0001\u0000\u0000\u0000\u046d\u046e"+ - "\u00067\u001e\u0000\u046e\u046f\u00067\u001d\u0000\u046f\u0083\u0001\u0000"+ - "\u0000\u0000\u0470\u0471\b\u0019\u0000\u0000\u0471\u0085\u0001\u0000\u0000"+ - "\u0000\u0472\u0474\u0003\u00848\u0000\u0473\u0472\u0001\u0000\u0000\u0000"+ - "\u0474\u0475\u0001\u0000\u0000\u0000\u0475\u0473\u0001\u0000\u0000\u0000"+ - "\u0475\u0476\u0001\u0000\u0000\u0000\u0476\u0477\u0001\u0000\u0000\u0000"+ - "\u0477\u0478\u0003\u00e4h\u0000\u0478\u047a\u0001\u0000\u0000\u0000\u0479"+ - "\u0473\u0001\u0000\u0000\u0000\u0479\u047a\u0001\u0000\u0000\u0000\u047a"+ - "\u047c\u0001\u0000\u0000\u0000\u047b\u047d\u0003\u00848\u0000\u047c\u047b"+ - "\u0001\u0000\u0000\u0000\u047d\u047e\u0001\u0000\u0000\u0000\u047e\u047c"+ - "\u0001\u0000\u0000\u0000\u047e\u047f\u0001\u0000\u0000\u0000\u047f\u0087"+ - "\u0001\u0000\u0000\u0000\u0480\u0481\u0003\u00869\u0000\u0481\u0482\u0001"+ - "\u0000\u0000\u0000\u0482\u0483\u0006:\u001f\u0000\u0483\u0089\u0001\u0000"+ - "\u0000\u0000\u0484\u0485\u0003\u00d4`\u0000\u0485\u0486\u0001\u0000\u0000"+ - "\u0000\u0486\u0487\u0006; \u0000\u0487\u008b\u0001\u0000\u0000\u0000\u0488"+ - "\u0489\u0003\u0014\u0000\u0000\u0489\u048a\u0001\u0000\u0000\u0000\u048a"+ - "\u048b\u0006<\u0000\u0000\u048b\u008d\u0001\u0000\u0000\u0000\u048c\u048d"+ - "\u0003\u0016\u0001\u0000\u048d\u048e\u0001\u0000\u0000\u0000\u048e\u048f"+ - "\u0006=\u0000\u0000\u048f\u008f\u0001\u0000\u0000\u0000\u0490\u0491\u0003"+ - "\u0018\u0002\u0000\u0491\u0492\u0001\u0000\u0000\u0000\u0492\u0493\u0006"+ - ">\u0000\u0000\u0493\u0091\u0001\u0000\u0000\u0000\u0494\u0495\u0003\u00be"+ - "U\u0000\u0495\u0496\u0001\u0000\u0000\u0000\u0496\u0497\u0006?\u0012\u0000"+ - "\u0497\u0498\u0006?\u0013\u0000\u0498\u0499\u0006?\u0013\u0000\u0499\u0093"+ - "\u0001\u0000\u0000\u0000\u049a\u049b\u0003\u0136\u0091\u0000\u049b\u049c"+ - "\u0001\u0000\u0000\u0000\u049c\u049d\u0006@\u0014\u0000\u049d\u049e\u0006"+ - "@\u0013\u0000\u049e\u049f\u0006@\u0013\u0000\u049f\u04a0\u0006@\u0013"+ - "\u0000\u04a0\u0095\u0001\u0000\u0000\u0000\u04a1\u04a2\u0003\u0130\u008e"+ - "\u0000\u04a2\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0006A\u0019\u0000"+ - "\u04a4\u0097\u0001\u0000\u0000\u0000\u04a5\u04a6\u0003\u0132\u008f\u0000"+ - "\u04a6\u04a7\u0001\u0000\u0000\u0000\u04a7\u04a8\u0006B\u001a\u0000\u04a8"+ - "\u0099\u0001\u0000\u0000\u0000\u04a9\u04aa\u0003\u00dee\u0000\u04aa\u04ab"+ - "\u0001\u0000\u0000\u0000\u04ab\u04ac\u0006C!\u0000\u04ac\u009b\u0001\u0000"+ - "\u0000\u0000\u04ad\u04ae\u0003\u00e8j\u0000\u04ae\u04af\u0001\u0000\u0000"+ - "\u0000\u04af\u04b0\u0006D\u0018\u0000\u04b0\u009d\u0001\u0000\u0000\u0000"+ - "\u04b1\u04b2\u0003\u00ecl\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3"+ - "\u04b4\u0006E\u0017\u0000\u04b4\u009f\u0001\u0000\u0000\u0000\u04b5\u04b6"+ - "\u0003\u010a{\u0000\u04b6\u04b7\u0001\u0000\u0000\u0000\u04b7\u04b8\u0006"+ - "F\u001e\u0000\u04b8\u00a1\u0001\u0000\u0000\u0000\u04b9\u04ba\u0003\u0236"+ - "\u0111\u0000\u04ba\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bc\u0006G\""+ - "\u0000\u04bc\u00a3\u0001\u0000\u0000\u0000\u04bd\u04be\u0003\u013c\u0094"+ - "\u0000\u04be\u04bf\u0001\u0000\u0000\u0000\u04bf\u04c0\u0006H\u001b\u0000"+ - "\u04c0\u00a5\u0001\u0000\u0000\u0000\u04c1\u04c2\u0003\u0104x\u0000\u04c2"+ - "\u04c3\u0001\u0000\u0000\u0000\u04c3\u04c4\u0006I#\u0000\u04c4\u00a7\u0001"+ - "\u0000\u0000\u0000\u04c5\u04c6\u0003\u012c\u008c\u0000\u04c6\u04c7\u0001"+ - "\u0000\u0000\u0000\u04c7\u04c8\u0006J$\u0000\u04c8\u00a9\u0001\u0000\u0000"+ - "\u0000\u04c9\u04ca\u0003\u0128\u008a\u0000\u04ca\u04cb\u0001\u0000\u0000"+ - "\u0000\u04cb\u04cc\u0006K%\u0000\u04cc\u00ab\u0001\u0000\u0000\u0000\u04cd"+ - "\u04ce\u0003\u012e\u008d\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000\u04cf"+ - "\u04d0\u0006L&\u0000\u04d0\u00ad\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003"+ - "\u0014\u0000\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4\u0006"+ - "M\u0000\u0000\u04d4\u00af\u0001\u0000\u0000\u0000\u04d5\u04d6\u0003\u0016"+ - "\u0001\u0000\u04d6\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d8\u0006N\u0000"+ - "\u0000\u04d8\u00b1\u0001\u0000\u0000\u0000\u04d9\u04da\u0003\u0018\u0002"+ - "\u0000\u04da\u04db\u0001\u0000\u0000\u0000\u04db\u04dc\u0006O\u0000\u0000"+ - "\u04dc\u00b3\u0001\u0000\u0000\u0000\u04dd\u04de\u0003\u0134\u0090\u0000"+ - "\u04de\u04df\u0001\u0000\u0000\u0000\u04df\u04e0\u0006P\'\u0000\u04e0"+ - "\u04e1\u0006P(\u0000\u04e1\u00b5\u0001\u0000\u0000\u0000\u04e2\u04e3\u0003"+ - "\u00beU\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u04e5\u0006Q\u0012"+ - "\u0000\u04e5\u04e6\u0006Q\u0013\u0000\u04e6\u00b7\u0001\u0000\u0000\u0000"+ - "\u04e7\u04e8\u0003\u0018\u0002\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000"+ - "\u04e9\u04ea\u0006R\u0000\u0000\u04ea\u00b9\u0001\u0000\u0000\u0000\u04eb"+ - "\u04ec\u0003\u0014\u0000\u0000\u04ec\u04ed\u0001\u0000\u0000\u0000\u04ed"+ - "\u04ee\u0006S\u0000\u0000\u04ee\u00bb\u0001\u0000\u0000\u0000\u04ef\u04f0"+ - "\u0003\u0016\u0001\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000\u04f1\u04f2"+ - "\u0006T\u0000\u0000\u04f2\u00bd\u0001\u0000\u0000\u0000\u04f3\u04f4\u0005"+ - "|\u0000\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f6\u0006U\u0013"+ - "\u0000\u04f6\u00bf\u0001\u0000\u0000\u0000\u04f7\u04f8\u0007\u001a\u0000"+ - "\u0000\u04f8\u00c1\u0001\u0000\u0000\u0000\u04f9\u04fa\u0007\u001b\u0000"+ - "\u0000\u04fa\u00c3\u0001\u0000\u0000\u0000\u04fb\u04fc\u0005\\\u0000\u0000"+ - "\u04fc\u04fd\u0007\u001c\u0000\u0000\u04fd\u00c5\u0001\u0000\u0000\u0000"+ - "\u04fe\u04ff\b\u001d\u0000\u0000\u04ff\u00c7\u0001\u0000\u0000\u0000\u0500"+ - "\u0502\u0007\u0007\u0000\u0000\u0501\u0503\u0007\u001e\u0000\u0000\u0502"+ - "\u0501\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503"+ - "\u0505\u0001\u0000\u0000\u0000\u0504\u0506\u0003\u00c0V\u0000\u0505\u0504"+ - "\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0505"+ - "\u0001\u0000\u0000\u0000\u0507\u0508\u0001\u0000\u0000\u0000\u0508\u00c9"+ - "\u0001\u0000\u0000\u0000\u0509\u050a\u0005@\u0000\u0000\u050a\u00cb\u0001"+ - "\u0000\u0000\u0000\u050b\u050c\u0005`\u0000\u0000\u050c\u00cd\u0001\u0000"+ - "\u0000\u0000\u050d\u0511\b\u001f\u0000\u0000\u050e\u050f\u0005`\u0000"+ - "\u0000\u050f\u0511\u0005`\u0000\u0000\u0510\u050d\u0001\u0000\u0000\u0000"+ - "\u0510\u050e\u0001\u0000\u0000\u0000\u0511\u00cf\u0001\u0000\u0000\u0000"+ - "\u0512\u0513\u0005_\u0000\u0000\u0513\u00d1\u0001\u0000\u0000\u0000\u0514"+ - "\u0518\u0003\u00c2W\u0000\u0515\u0518\u0003\u00c0V\u0000\u0516\u0518\u0003"+ - "\u00d0^\u0000\u0517\u0514\u0001\u0000\u0000\u0000\u0517\u0515\u0001\u0000"+ - "\u0000\u0000\u0517\u0516\u0001\u0000\u0000\u0000\u0518\u00d3\u0001\u0000"+ - "\u0000\u0000\u0519\u051e\u0005\"\u0000\u0000\u051a\u051d\u0003\u00c4X"+ - "\u0000\u051b\u051d\u0003\u00c6Y\u0000\u051c\u051a\u0001\u0000\u0000\u0000"+ - "\u051c\u051b\u0001\u0000\u0000\u0000\u051d\u0520\u0001\u0000\u0000\u0000"+ - "\u051e\u051c\u0001\u0000\u0000\u0000\u051e\u051f\u0001\u0000\u0000\u0000"+ - "\u051f\u0521\u0001\u0000\u0000\u0000\u0520\u051e\u0001\u0000\u0000\u0000"+ - "\u0521\u0537\u0005\"\u0000\u0000\u0522\u0523\u0005\"\u0000\u0000\u0523"+ - "\u0524\u0005\"\u0000\u0000\u0524\u0525\u0005\"\u0000\u0000\u0525\u0529"+ - "\u0001\u0000\u0000\u0000\u0526\u0528\b\u0000\u0000\u0000\u0527\u0526\u0001"+ - "\u0000\u0000\u0000\u0528\u052b\u0001\u0000\u0000\u0000\u0529\u052a\u0001"+ - "\u0000\u0000\u0000\u0529\u0527\u0001\u0000\u0000\u0000\u052a\u052c\u0001"+ - "\u0000\u0000\u0000\u052b\u0529\u0001\u0000\u0000\u0000\u052c\u052d\u0005"+ - "\"\u0000\u0000\u052d\u052e\u0005\"\u0000\u0000\u052e\u052f\u0005\"\u0000"+ - "\u0000\u052f\u0531\u0001\u0000\u0000\u0000\u0530\u0532\u0005\"\u0000\u0000"+ - "\u0531\u0530\u0001\u0000\u0000\u0000\u0531\u0532\u0001\u0000\u0000\u0000"+ - "\u0532\u0534\u0001\u0000\u0000\u0000\u0533\u0535\u0005\"\u0000\u0000\u0534"+ - "\u0533\u0001\u0000\u0000\u0000\u0534\u0535\u0001\u0000\u0000\u0000\u0535"+ - "\u0537\u0001\u0000\u0000\u0000\u0536\u0519\u0001\u0000\u0000\u0000\u0536"+ - "\u0522\u0001\u0000\u0000\u0000\u0537\u00d5\u0001\u0000\u0000\u0000\u0538"+ - "\u053a\u0003\u00c0V\u0000\u0539\u0538\u0001\u0000\u0000\u0000\u053a\u053b"+ - "\u0001\u0000\u0000\u0000\u053b\u0539\u0001\u0000\u0000\u0000\u053b\u053c"+ - "\u0001\u0000\u0000\u0000\u053c\u00d7\u0001\u0000\u0000\u0000\u053d\u053f"+ - "\u0003\u00c0V\u0000\u053e\u053d\u0001\u0000\u0000\u0000\u053f\u0540\u0001"+ - "\u0000\u0000\u0000\u0540\u053e\u0001\u0000\u0000\u0000\u0540\u0541\u0001"+ - "\u0000\u0000\u0000\u0541\u0542\u0001\u0000\u0000\u0000\u0542\u0546\u0003"+ - "\u00ecl\u0000\u0543\u0545\u0003\u00c0V\u0000\u0544\u0543\u0001\u0000\u0000"+ - "\u0000\u0545\u0548\u0001\u0000\u0000\u0000\u0546\u0544\u0001\u0000\u0000"+ - "\u0000\u0546\u0547\u0001\u0000\u0000\u0000\u0547\u0568\u0001\u0000\u0000"+ - "\u0000\u0548\u0546\u0001\u0000\u0000\u0000\u0549\u054b\u0003\u00ecl\u0000"+ - "\u054a\u054c\u0003\u00c0V\u0000\u054b\u054a\u0001\u0000\u0000\u0000\u054c"+ - "\u054d\u0001\u0000\u0000\u0000\u054d\u054b\u0001\u0000\u0000\u0000\u054d"+ - "\u054e\u0001\u0000\u0000\u0000\u054e\u0568\u0001\u0000\u0000\u0000\u054f"+ - "\u0551\u0003\u00c0V\u0000\u0550\u054f\u0001\u0000\u0000\u0000\u0551\u0552"+ - "\u0001\u0000\u0000\u0000\u0552\u0550\u0001\u0000\u0000\u0000\u0552\u0553"+ - "\u0001\u0000\u0000\u0000\u0553\u055b\u0001\u0000\u0000\u0000\u0554\u0558"+ - "\u0003\u00ecl\u0000\u0555\u0557\u0003\u00c0V\u0000\u0556\u0555\u0001\u0000"+ - "\u0000\u0000\u0557\u055a\u0001\u0000\u0000\u0000\u0558\u0556\u0001\u0000"+ - "\u0000\u0000\u0558\u0559\u0001\u0000\u0000\u0000\u0559\u055c\u0001\u0000"+ - "\u0000\u0000\u055a\u0558\u0001\u0000\u0000\u0000\u055b\u0554\u0001\u0000"+ - "\u0000\u0000\u055b\u055c\u0001\u0000\u0000\u0000\u055c\u055d\u0001\u0000"+ - "\u0000\u0000\u055d\u055e\u0003\u00c8Z\u0000\u055e\u0568\u0001\u0000\u0000"+ - "\u0000\u055f\u0561\u0003\u00ecl\u0000\u0560\u0562\u0003\u00c0V\u0000\u0561"+ - "\u0560\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563"+ - "\u0561\u0001\u0000\u0000\u0000\u0563\u0564\u0001\u0000\u0000\u0000\u0564"+ - "\u0565\u0001\u0000\u0000\u0000\u0565\u0566\u0003\u00c8Z\u0000\u0566\u0568"+ - "\u0001\u0000\u0000\u0000\u0567\u053e\u0001\u0000\u0000\u0000\u0567\u0549"+ - "\u0001\u0000\u0000\u0000\u0567\u0550\u0001\u0000\u0000\u0000\u0567\u055f"+ - "\u0001\u0000\u0000\u0000\u0568\u00d9\u0001\u0000\u0000\u0000\u0569\u056a"+ - "\u0007\u0004\u0000\u0000\u056a\u056b\u0007\u0005\u0000\u0000\u056b\u056c"+ - "\u0007\u0010\u0000\u0000\u056c\u00db\u0001\u0000\u0000\u0000\u056d\u056e"+ - "\u0007\u0004\u0000\u0000\u056e\u056f\u0007\u0011\u0000\u0000\u056f\u0570"+ - "\u0007\u0002\u0000\u0000\u0570\u00dd\u0001\u0000\u0000\u0000\u0571\u0572"+ - "\u0005=\u0000\u0000\u0572\u00df\u0001\u0000\u0000\u0000\u0573\u0574\u0007"+ - " \u0000\u0000\u0574\u0575\u0007!\u0000\u0000\u0575\u00e1\u0001\u0000\u0000"+ - "\u0000\u0576\u0577\u0005:\u0000\u0000\u0577\u0578\u0005:\u0000\u0000\u0578"+ - "\u00e3\u0001\u0000\u0000\u0000\u0579\u057a\u0005:\u0000\u0000\u057a\u00e5"+ - "\u0001\u0000\u0000\u0000\u057b\u057c\u0005;\u0000\u0000\u057c\u00e7\u0001"+ - "\u0000\u0000\u0000\u057d\u057e\u0005,\u0000\u0000\u057e\u00e9\u0001\u0000"+ - "\u0000\u0000\u057f\u0580\u0007\u0010\u0000\u0000\u0580\u0581\u0007\u0007"+ - "\u0000\u0000\u0581\u0582\u0007\u0011\u0000\u0000\u0582\u0583\u0007\u0002"+ - "\u0000\u0000\u0583\u00eb\u0001\u0000\u0000\u0000\u0584\u0585\u0005.\u0000"+ - "\u0000\u0585\u00ed\u0001\u0000\u0000\u0000\u0586\u0587\u0007\u0015\u0000"+ - "\u0000\u0587\u0588\u0007\u0004\u0000\u0000\u0588\u0589\u0007\u000e\u0000"+ - "\u0000\u0589\u058a\u0007\u0011\u0000\u0000\u058a\u058b\u0007\u0007\u0000"+ - "\u0000\u058b\u00ef\u0001\u0000\u0000\u0000\u058c\u058d\u0007\u0015\u0000"+ - "\u0000\u058d\u058e\u0007\n\u0000\u0000\u058e\u058f\u0007\f\u0000\u0000"+ - "\u058f\u0590\u0007\u0011\u0000\u0000\u0590\u0591\u0007\u000b\u0000\u0000"+ - "\u0591\u00f1\u0001\u0000\u0000\u0000\u0592\u0593\u0007\n\u0000\u0000\u0593"+ - "\u0594\u0007\u0005\u0000\u0000\u0594\u00f3\u0001\u0000\u0000\u0000\u0595"+ - "\u0596\u0007\n\u0000\u0000\u0596\u0597\u0007\u0011\u0000\u0000\u0597\u00f5"+ - "\u0001\u0000\u0000\u0000\u0598\u0599\u0007\u000e\u0000\u0000\u0599\u059a"+ - "\u0007\u0004\u0000\u0000\u059a\u059b\u0007\u0011\u0000\u0000\u059b\u059c"+ - "\u0007\u000b\u0000\u0000\u059c\u00f7\u0001\u0000\u0000\u0000\u059d\u059e"+ - "\u0007\u000e\u0000\u0000\u059e\u059f\u0007\n\u0000\u0000\u059f\u05a0\u0007"+ - "\u0013\u0000\u0000\u05a0\u05a1\u0007\u0007\u0000\u0000\u05a1\u00f9\u0001"+ - "\u0000\u0000\u0000\u05a2\u05a3\u0007\u0005\u0000\u0000\u05a3\u05a4\u0007"+ - "\t\u0000\u0000\u05a4\u05a5\u0007\u000b\u0000\u0000\u05a5\u00fb\u0001\u0000"+ - "\u0000\u0000\u05a6\u05a7\u0007\u0005\u0000\u0000\u05a7\u05a8\u0007\u0016"+ - "\u0000\u0000\u05a8\u05a9\u0007\u000e\u0000\u0000\u05a9\u05aa\u0007\u000e"+ - "\u0000\u0000\u05aa\u00fd\u0001\u0000\u0000\u0000\u05ab\u05ac\u0007\u0005"+ - "\u0000\u0000\u05ac\u05ad\u0007\u0016\u0000\u0000\u05ad\u05ae\u0007\u000e"+ - "\u0000\u0000\u05ae\u05af\u0007\u000e\u0000\u0000\u05af\u05b0\u0007\u0011"+ - "\u0000\u0000\u05b0\u00ff\u0001\u0000\u0000\u0000\u05b1\u05b2\u0007\t\u0000"+ - "\u0000\u05b2\u05b3\u0007\u0005\u0000\u0000\u05b3\u0101\u0001\u0000\u0000"+ - "\u0000\u05b4\u05b5\u0007\t\u0000\u0000\u05b5\u05b6\u0007\f\u0000\u0000"+ - "\u05b6\u0103\u0001\u0000\u0000\u0000\u05b7\u05b8\u0005?\u0000\u0000\u05b8"+ - "\u0105\u0001\u0000\u0000\u0000\u05b9\u05ba\u0007\f\u0000\u0000\u05ba\u05bb"+ - "\u0007\u000e\u0000\u0000\u05bb\u05bc\u0007\n\u0000\u0000\u05bc\u05bd\u0007"+ - "\u0013\u0000\u0000\u05bd\u05be\u0007\u0007\u0000\u0000\u05be\u0107\u0001"+ - "\u0000\u0000\u0000\u05bf\u05c0\u0007\u000b\u0000\u0000\u05c0\u05c1\u0007"+ - "\f\u0000\u0000\u05c1\u05c2\u0007\u0016\u0000\u0000\u05c2\u05c3\u0007\u0007"+ - "\u0000\u0000\u05c3\u0109\u0001\u0000\u0000\u0000\u05c4\u05c5\u0007\u0014"+ - "\u0000\u0000\u05c5\u05c6\u0007\n\u0000\u0000\u05c6\u05c7\u0007\u000b\u0000"+ - "\u0000\u05c7\u05c8\u0007\u0003\u0000\u0000\u05c8\u010b\u0001\u0000\u0000"+ - "\u0000\u05c9\u05ca\u0005=\u0000\u0000\u05ca\u05cb\u0005=\u0000\u0000\u05cb"+ - "\u010d\u0001\u0000\u0000\u0000\u05cc\u05cd\u0005=\u0000\u0000\u05cd\u05ce"+ - "\u0005~\u0000\u0000\u05ce\u010f\u0001\u0000\u0000\u0000\u05cf\u05d0\u0005"+ - "!\u0000\u0000\u05d0\u05d1\u0005=\u0000\u0000\u05d1\u0111\u0001\u0000\u0000"+ - "\u0000\u05d2\u05d3\u0005<\u0000\u0000\u05d3\u0113\u0001\u0000\u0000\u0000"+ - "\u05d4\u05d5\u0005<\u0000\u0000\u05d5\u05d6\u0005=\u0000\u0000\u05d6\u0115"+ - "\u0001\u0000\u0000\u0000\u05d7\u05d8\u0005>\u0000\u0000\u05d8\u0117\u0001"+ - "\u0000\u0000\u0000\u05d9\u05da\u0005>\u0000\u0000\u05da\u05db\u0005=\u0000"+ - "\u0000\u05db\u0119\u0001\u0000\u0000\u0000\u05dc\u05dd\u0005+\u0000\u0000"+ - "\u05dd\u011b\u0001\u0000\u0000\u0000\u05de\u05df\u0005-\u0000\u0000\u05df"+ - "\u011d\u0001\u0000\u0000\u0000\u05e0\u05e1\u0005*\u0000\u0000\u05e1\u011f"+ - "\u0001\u0000\u0000\u0000\u05e2\u05e3\u0005/\u0000\u0000\u05e3\u0121\u0001"+ - "\u0000\u0000\u0000\u05e4\u05e5\u0005%\u0000\u0000\u05e5\u0123\u0001\u0000"+ - "\u0000\u0000\u05e6\u05e7\u0005{\u0000\u0000\u05e7\u0125\u0001\u0000\u0000"+ - "\u0000\u05e8\u05e9\u0005}\u0000\u0000\u05e9\u0127\u0001\u0000\u0000\u0000"+ - "\u05ea\u05eb\u0005?\u0000\u0000\u05eb\u05ec\u0005?\u0000\u0000\u05ec\u0129"+ - "\u0001\u0000\u0000\u0000\u05ed\u05ee\u00034\u0010\u0000\u05ee\u05ef\u0001"+ - "\u0000\u0000\u0000\u05ef\u05f0\u0006\u008b)\u0000\u05f0\u012b\u0001\u0000"+ - "\u0000\u0000\u05f1\u05f4\u0003\u0104x\u0000\u05f2\u05f5\u0003\u00c2W\u0000"+ - "\u05f3\u05f5\u0003\u00d0^\u0000\u05f4\u05f2\u0001\u0000\u0000\u0000\u05f4"+ - "\u05f3\u0001\u0000\u0000\u0000\u05f5\u05f9\u0001\u0000\u0000\u0000\u05f6"+ - "\u05f8\u0003\u00d2_\u0000\u05f7\u05f6\u0001\u0000\u0000\u0000\u05f8\u05fb"+ - "\u0001\u0000\u0000\u0000\u05f9\u05f7\u0001\u0000\u0000\u0000\u05f9\u05fa"+ - "\u0001\u0000\u0000\u0000\u05fa\u0603\u0001\u0000\u0000\u0000\u05fb\u05f9"+ - "\u0001\u0000\u0000\u0000\u05fc\u05fe\u0003\u0104x\u0000\u05fd\u05ff\u0003"+ - "\u00c0V\u0000\u05fe\u05fd\u0001\u0000\u0000\u0000\u05ff\u0600\u0001\u0000"+ - "\u0000\u0000\u0600\u05fe\u0001\u0000\u0000\u0000\u0600\u0601\u0001\u0000"+ - "\u0000\u0000\u0601\u0603\u0001\u0000\u0000\u0000\u0602\u05f1\u0001\u0000"+ - "\u0000\u0000\u0602\u05fc\u0001\u0000\u0000\u0000\u0603\u012d\u0001\u0000"+ - "\u0000\u0000\u0604\u0607\u0003\u0128\u008a\u0000\u0605\u0608\u0003\u00c2"+ - "W\u0000\u0606\u0608\u0003\u00d0^\u0000\u0607\u0605\u0001\u0000\u0000\u0000"+ - "\u0607\u0606\u0001\u0000\u0000\u0000\u0608\u060c\u0001\u0000\u0000\u0000"+ - "\u0609\u060b\u0003\u00d2_\u0000\u060a\u0609\u0001\u0000\u0000\u0000\u060b"+ - "\u060e\u0001\u0000\u0000\u0000\u060c\u060a\u0001\u0000\u0000\u0000\u060c"+ - "\u060d\u0001\u0000\u0000\u0000\u060d\u0616\u0001\u0000\u0000\u0000\u060e"+ - "\u060c\u0001\u0000\u0000\u0000\u060f\u0611\u0003\u0128\u008a\u0000\u0610"+ - "\u0612\u0003\u00c0V\u0000\u0611\u0610\u0001\u0000\u0000\u0000\u0612\u0613"+ - "\u0001\u0000\u0000\u0000\u0613\u0611\u0001\u0000\u0000\u0000\u0613\u0614"+ - "\u0001\u0000\u0000\u0000\u0614\u0616\u0001\u0000\u0000\u0000\u0615\u0604"+ - "\u0001\u0000\u0000\u0000\u0615\u060f\u0001\u0000\u0000\u0000\u0616\u012f"+ - "\u0001\u0000\u0000\u0000\u0617\u0618\u0005[\u0000\u0000\u0618\u0619\u0001"+ - "\u0000\u0000\u0000\u0619\u061a\u0006\u008e\u0004\u0000\u061a\u061b\u0006"+ - "\u008e\u0004\u0000\u061b\u0131\u0001\u0000\u0000\u0000\u061c\u061d\u0005"+ - "]\u0000\u0000\u061d\u061e\u0001\u0000\u0000\u0000\u061e\u061f\u0006\u008f"+ - "\u0013\u0000\u061f\u0620\u0006\u008f\u0013\u0000\u0620\u0133\u0001\u0000"+ - "\u0000\u0000\u0621\u0622\u0005(\u0000\u0000\u0622\u0623\u0001\u0000\u0000"+ - "\u0000\u0623\u0624\u0006\u0090\u0004\u0000\u0624\u0625\u0006\u0090\u0004"+ - "\u0000\u0625\u0135\u0001\u0000\u0000\u0000\u0626\u0627\u0005)\u0000\u0000"+ - "\u0627\u0628\u0001\u0000\u0000\u0000\u0628\u0629\u0006\u0091\u0013\u0000"+ - "\u0629\u062a\u0006\u0091\u0013\u0000\u062a\u0137\u0001\u0000\u0000\u0000"+ - "\u062b\u062f\u0003\u00c2W\u0000\u062c\u062e\u0003\u00d2_\u0000\u062d\u062c"+ - "\u0001\u0000\u0000\u0000\u062e\u0631\u0001\u0000\u0000\u0000\u062f\u062d"+ - "\u0001\u0000\u0000\u0000\u062f\u0630\u0001\u0000\u0000\u0000\u0630\u063c"+ - "\u0001\u0000\u0000\u0000\u0631\u062f\u0001\u0000\u0000\u0000\u0632\u0635"+ - "\u0003\u00d0^\u0000\u0633\u0635\u0003\u00ca[\u0000\u0634\u0632\u0001\u0000"+ - "\u0000\u0000\u0634\u0633\u0001\u0000\u0000\u0000\u0635\u0637\u0001\u0000"+ - "\u0000\u0000\u0636\u0638\u0003\u00d2_\u0000\u0637\u0636\u0001\u0000\u0000"+ - "\u0000\u0638\u0639\u0001\u0000\u0000\u0000\u0639\u0637\u0001\u0000\u0000"+ - "\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063c\u0001\u0000\u0000"+ - "\u0000\u063b\u062b\u0001\u0000\u0000\u0000\u063b\u0634\u0001\u0000\u0000"+ - "\u0000\u063c\u0139\u0001\u0000\u0000\u0000\u063d\u063f\u0003\u00cc\\\u0000"+ - "\u063e\u0640\u0003\u00ce]\u0000\u063f\u063e\u0001\u0000\u0000\u0000\u0640"+ - "\u0641\u0001\u0000\u0000\u0000\u0641\u063f\u0001\u0000\u0000\u0000\u0641"+ - "\u0642\u0001\u0000\u0000\u0000\u0642\u0643\u0001\u0000\u0000\u0000\u0643"+ - "\u0644\u0003\u00cc\\\u0000\u0644\u013b\u0001\u0000\u0000\u0000\u0645\u0646"+ - "\u0003\u013a\u0093\u0000\u0646\u013d\u0001\u0000\u0000\u0000\u0647\u0648"+ - "\u0003\u0014\u0000\u0000\u0648\u0649\u0001\u0000\u0000\u0000\u0649\u064a"+ - "\u0006\u0095\u0000\u0000\u064a\u013f\u0001\u0000\u0000\u0000\u064b\u064c"+ - "\u0003\u0016\u0001\u0000\u064c\u064d\u0001\u0000\u0000\u0000\u064d\u064e"+ - "\u0006\u0096\u0000\u0000\u064e\u0141\u0001\u0000\u0000\u0000\u064f\u0650"+ - "\u0003\u0018\u0002\u0000\u0650\u0651\u0001\u0000\u0000\u0000\u0651\u0652"+ - "\u0006\u0097\u0000\u0000\u0652\u0143\u0001\u0000\u0000\u0000\u0653\u0654"+ - "\u0003\u00beU\u0000\u0654\u0655\u0001\u0000\u0000\u0000\u0655\u0656\u0006"+ - "\u0098\u0012\u0000\u0656\u0657\u0006\u0098\u0013\u0000\u0657\u0145\u0001"+ - "\u0000\u0000\u0000\u0658\u0659\u0003\u00e4h\u0000\u0659\u065a\u0001\u0000"+ - "\u0000\u0000\u065a\u065b\u0006\u0099*\u0000\u065b\u0147\u0001\u0000\u0000"+ - "\u0000\u065c\u065d\u0003\u00e2g\u0000\u065d\u065e\u0001\u0000\u0000\u0000"+ - "\u065e\u065f\u0006\u009a+\u0000\u065f\u0149\u0001\u0000\u0000\u0000\u0660"+ - "\u0661\u0003\u00e8j\u0000\u0661\u0662\u0001\u0000\u0000\u0000\u0662\u0663"+ - "\u0006\u009b\u0018\u0000\u0663\u014b\u0001\u0000\u0000\u0000\u0664\u0665"+ - "\u0003\u00dee\u0000\u0665\u0666\u0001\u0000\u0000\u0000\u0666\u0667\u0006"+ - "\u009c!\u0000\u0667\u014d\u0001\u0000\u0000\u0000\u0668\u0669\u0007\u000f"+ - "\u0000\u0000\u0669\u066a\u0007\u0007\u0000\u0000\u066a\u066b\u0007\u000b"+ - "\u0000\u0000\u066b\u066c\u0007\u0004\u0000\u0000\u066c\u066d\u0007\u0010"+ - "\u0000\u0000\u066d\u066e\u0007\u0004\u0000\u0000\u066e\u066f\u0007\u000b"+ - "\u0000\u0000\u066f\u0670\u0007\u0004\u0000\u0000\u0670\u014f\u0001\u0000"+ - "\u0000\u0000\u0671\u0672\u0003\u010a{\u0000\u0672\u0673\u0001\u0000\u0000"+ - "\u0000\u0673\u0674\u0006\u009e\u001e\u0000\u0674\u0675\u0006\u009e\u0013"+ - "\u0000\u0675\u0676\u0006\u009e\u0004\u0000\u0676\u0151\u0001\u0000\u0000"+ - "\u0000\u0677\u0678\u0003\u0104x\u0000\u0678\u0679\u0001\u0000\u0000\u0000"+ - "\u0679\u067a\u0006\u009f#\u0000\u067a\u0153\u0001\u0000\u0000\u0000\u067b"+ - "\u067c\u0003\u012c\u008c\u0000\u067c\u067d\u0001\u0000\u0000\u0000\u067d"+ - "\u067e\u0006\u00a0$\u0000\u067e\u0155\u0001\u0000\u0000\u0000\u067f\u0680"+ - "\u0003\u0136\u0091\u0000\u0680\u0681\u0001\u0000\u0000\u0000\u0681\u0682"+ - "\u0006\u00a1\u0014\u0000\u0682\u0683\u0006\u00a1\u0013\u0000\u0683\u0684"+ - "\u0006\u00a1\u0013\u0000\u0684\u0157\u0001\u0000\u0000\u0000\u0685\u0686"+ - "\u0003\u0134\u0090\u0000\u0686\u0687\u0001\u0000\u0000\u0000\u0687\u0688"+ - "\u0006\u00a2\'\u0000\u0688\u0689\u0006\u00a2(\u0000\u0689\u0159\u0001"+ - "\u0000\u0000\u0000\u068a\u068e\b\"\u0000\u0000\u068b\u068c\u0005/\u0000"+ - "\u0000\u068c\u068e\b#\u0000\u0000\u068d\u068a\u0001\u0000\u0000\u0000"+ - "\u068d\u068b\u0001\u0000\u0000\u0000\u068e\u015b\u0001\u0000\u0000\u0000"+ - "\u068f\u0691\u0003\u015a\u00a3\u0000\u0690\u068f\u0001\u0000\u0000\u0000"+ - "\u0691\u0692\u0001\u0000\u0000\u0000\u0692\u0690\u0001\u0000\u0000\u0000"+ - "\u0692\u0693\u0001\u0000\u0000\u0000\u0693\u015d\u0001\u0000\u0000\u0000"+ - "\u0694\u0695\u0003\u015c\u00a4\u0000\u0695\u0696\u0001\u0000\u0000\u0000"+ - "\u0696\u0697\u0006\u00a5,\u0000\u0697\u015f\u0001\u0000\u0000\u0000\u0698"+ - "\u0699\u0003\u00d4`\u0000\u0699\u069a\u0001\u0000\u0000\u0000\u069a\u069b"+ - "\u0006\u00a6 \u0000\u069b\u0161\u0001\u0000\u0000\u0000\u069c\u069d\u0003"+ - "\u0014\u0000\u0000\u069d\u069e\u0001\u0000\u0000\u0000\u069e\u069f\u0006"+ - "\u00a7\u0000\u0000\u069f\u0163\u0001\u0000\u0000\u0000\u06a0\u06a1\u0003"+ - "\u0016\u0001\u0000\u06a1\u06a2\u0001\u0000\u0000\u0000\u06a2\u06a3\u0006"+ - "\u00a8\u0000\u0000\u06a3\u0165\u0001\u0000\u0000\u0000\u06a4\u06a5\u0003"+ - "\u0018\u0002\u0000\u06a5\u06a6\u0001\u0000\u0000\u0000\u06a6\u06a7\u0006"+ - "\u00a9\u0000\u0000\u06a7\u0167\u0001\u0000\u0000\u0000\u06a8\u06a9\u0003"+ - "\u0134\u0090\u0000\u06a9\u06aa\u0001\u0000\u0000\u0000\u06aa\u06ab\u0006"+ - "\u00aa\'\u0000\u06ab\u06ac\u0006\u00aa(\u0000\u06ac\u0169\u0001\u0000"+ - "\u0000\u0000\u06ad\u06ae\u0003\u0136\u0091\u0000\u06ae\u06af\u0001\u0000"+ - "\u0000\u0000\u06af\u06b0\u0006\u00ab\u0014\u0000\u06b0\u06b1\u0006\u00ab"+ - "\u0013\u0000\u06b1\u06b2\u0006\u00ab\u0013\u0000\u06b2\u016b\u0001\u0000"+ - "\u0000\u0000\u06b3\u06b4\u0003\u00beU\u0000\u06b4\u06b5\u0001\u0000\u0000"+ - "\u0000\u06b5\u06b6\u0006\u00ac\u0012\u0000\u06b6\u06b7\u0006\u00ac\u0013"+ - "\u0000\u06b7\u016d\u0001\u0000\u0000\u0000\u06b8\u06b9\u0003\u0018\u0002"+ - "\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000\u06ba\u06bb\u0006\u00ad\u0000"+ - "\u0000\u06bb\u016f\u0001\u0000\u0000\u0000\u06bc\u06bd\u0003\u0014\u0000"+ - "\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06bf\u0006\u00ae\u0000"+ - "\u0000\u06bf\u0171\u0001\u0000\u0000\u0000\u06c0\u06c1\u0003\u0016\u0001"+ - "\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0006\u00af\u0000"+ - "\u0000\u06c3\u0173\u0001\u0000\u0000\u0000\u06c4\u06c5\u0003\u00beU\u0000"+ - "\u06c5\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c7\u0006\u00b0\u0012\u0000"+ - "\u06c7\u06c8\u0006\u00b0\u0013\u0000\u06c8\u0175\u0001\u0000\u0000\u0000"+ - "\u06c9\u06ca\u0003\u0136\u0091\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000"+ - "\u06cb\u06cc\u0006\u00b1\u0014\u0000\u06cc\u06cd\u0006\u00b1\u0013\u0000"+ - "\u06cd\u06ce\u0006\u00b1\u0013\u0000\u06ce\u0177\u0001\u0000\u0000\u0000"+ - "\u06cf\u06d0\u0007\u0006\u0000\u0000\u06d0\u06d1\u0007\f\u0000\u0000\u06d1"+ - "\u06d2\u0007\t\u0000\u0000\u06d2\u06d3\u0007\u0016\u0000\u0000\u06d3\u06d4"+ - "\u0007\b\u0000\u0000\u06d4\u0179\u0001\u0000\u0000\u0000\u06d5\u06d6\u0007"+ - "\u0011\u0000\u0000\u06d6\u06d7\u0007\u0002\u0000\u0000\u06d7\u06d8\u0007"+ - "\t\u0000\u0000\u06d8\u06d9\u0007\f\u0000\u0000\u06d9\u06da\u0007\u0007"+ - "\u0000\u0000\u06da\u017b\u0001\u0000\u0000\u0000\u06db\u06dc\u0007\u0013"+ - "\u0000\u0000\u06dc\u06dd\u0007\u0007\u0000\u0000\u06dd\u06de\u0007!\u0000"+ - "\u0000\u06de\u017d\u0001\u0000\u0000\u0000\u06df\u06e0\u0003\u010a{\u0000"+ - "\u06e0\u06e1\u0001\u0000\u0000\u0000\u06e1\u06e2\u0006\u00b5\u001e\u0000"+ - "\u06e2\u06e3\u0006\u00b5\u0013\u0000\u06e3\u06e4\u0006\u00b5\u0004\u0000"+ - "\u06e4\u017f\u0001\u0000\u0000\u0000\u06e5\u06e6\u0003\u00e8j\u0000\u06e6"+ - "\u06e7\u0001\u0000\u0000\u0000\u06e7\u06e8\u0006\u00b6\u0018\u0000\u06e8"+ - "\u0181\u0001\u0000\u0000\u0000\u06e9\u06ea\u0003\u00ecl\u0000\u06ea\u06eb"+ - "\u0001\u0000\u0000\u0000\u06eb\u06ec\u0006\u00b7\u0017\u0000\u06ec\u0183"+ - "\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003\u0104x\u0000\u06ee\u06ef\u0001"+ - "\u0000\u0000\u0000\u06ef\u06f0\u0006\u00b8#\u0000\u06f0\u0185\u0001\u0000"+ - "\u0000\u0000\u06f1\u06f2\u0003\u012c\u008c\u0000\u06f2\u06f3\u0001\u0000"+ - "\u0000\u0000\u06f3\u06f4\u0006\u00b9$\u0000\u06f4\u0187\u0001\u0000\u0000"+ - "\u0000\u06f5\u06f6\u0003\u0128\u008a\u0000\u06f6\u06f7\u0001\u0000\u0000"+ - "\u0000\u06f7\u06f8\u0006\u00ba%\u0000\u06f8\u0189\u0001\u0000\u0000\u0000"+ - "\u06f9\u06fa\u0003\u012e\u008d\u0000\u06fa\u06fb\u0001\u0000\u0000\u0000"+ - "\u06fb\u06fc\u0006\u00bb&\u0000\u06fc\u018b\u0001\u0000\u0000\u0000\u06fd"+ - "\u06fe\u0003\u00e0f\u0000\u06fe\u06ff\u0001\u0000\u0000\u0000\u06ff\u0700"+ - "\u0006\u00bc-\u0000\u0700\u018d\u0001\u0000\u0000\u0000\u0701\u0702\u0003"+ - "\u013c\u0094\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0704\u0006"+ - "\u00bd\u001b\u0000\u0704\u018f\u0001\u0000\u0000\u0000\u0705\u0706\u0003"+ - "\u0138\u0092\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707\u0708\u0006"+ - "\u00be\u001c\u0000\u0708\u0191\u0001\u0000\u0000\u0000\u0709\u070a\u0003"+ - "\u0014\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b\u070c\u0006"+ - "\u00bf\u0000\u0000\u070c\u0193\u0001\u0000\u0000\u0000\u070d\u070e\u0003"+ - "\u0016\u0001\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f\u0710\u0006"+ - "\u00c0\u0000\u0000\u0710\u0195\u0001\u0000\u0000\u0000\u0711\u0712\u0003"+ - "\u0018\u0002\u0000\u0712\u0713\u0001\u0000\u0000\u0000\u0713\u0714\u0006"+ - "\u00c1\u0000\u0000\u0714\u0197\u0001\u0000\u0000\u0000\u0715\u0716\u0007"+ - "\u0011\u0000\u0000\u0716\u0717\u0007\u000b\u0000\u0000\u0717\u0718\u0007"+ - "\u0004\u0000\u0000\u0718\u0719\u0007\u000b\u0000\u0000\u0719\u071a\u0007"+ - "\u0011\u0000\u0000\u071a\u071b\u0001\u0000\u0000\u0000\u071b\u071c\u0006"+ - "\u00c2\u0013\u0000\u071c\u071d\u0006\u00c2\u0004\u0000\u071d\u0199\u0001"+ - "\u0000\u0000\u0000\u071e\u071f\u0003\u0014\u0000\u0000\u071f\u0720\u0001"+ - "\u0000\u0000\u0000\u0720\u0721\u0006\u00c3\u0000\u0000\u0721\u019b\u0001"+ - "\u0000\u0000\u0000\u0722\u0723\u0003\u0016\u0001\u0000\u0723\u0724\u0001"+ - "\u0000\u0000\u0000\u0724\u0725\u0006\u00c4\u0000\u0000\u0725\u019d\u0001"+ - "\u0000\u0000\u0000\u0726\u0727\u0003\u0018\u0002\u0000\u0727\u0728\u0001"+ - "\u0000\u0000\u0000\u0728\u0729\u0006\u00c5\u0000\u0000\u0729\u019f\u0001"+ - "\u0000\u0000\u0000\u072a\u072b\u0003\u00beU\u0000\u072b\u072c\u0001\u0000"+ - "\u0000\u0000\u072c\u072d\u0006\u00c6\u0012\u0000\u072d\u072e\u0006\u00c6"+ - "\u0013\u0000\u072e\u01a1\u0001\u0000\u0000\u0000\u072f\u0730\u0007$\u0000"+ - "\u0000\u0730\u0731\u0007\t\u0000\u0000\u0731\u0732\u0007\n\u0000\u0000"+ - "\u0732\u0733\u0007\u0005\u0000\u0000\u0733\u01a3\u0001\u0000\u0000\u0000"+ - "\u0734\u0735\u0003\u027a\u0133\u0000\u0735\u0736\u0001\u0000\u0000\u0000"+ - "\u0736\u0737\u0006\u00c8\u0016\u0000\u0737\u01a5\u0001\u0000\u0000\u0000"+ - "\u0738\u0739\u0003\u0100v\u0000\u0739\u073a\u0001\u0000\u0000\u0000\u073a"+ - "\u073b\u0006\u00c9\u0015\u0000\u073b\u073c\u0006\u00c9\u0013\u0000\u073c"+ - "\u073d\u0006\u00c9\u0004\u0000\u073d\u01a7\u0001\u0000\u0000\u0000\u073e"+ - "\u073f\u0007\u0016\u0000\u0000\u073f\u0740\u0007\u0011\u0000\u0000\u0740"+ - "\u0741\u0007\n\u0000\u0000\u0741\u0742\u0007\u0005\u0000\u0000\u0742\u0743"+ - "\u0007\u0006\u0000\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0745"+ - "\u0006\u00ca\u0013\u0000\u0745\u0746\u0006\u00ca\u0004\u0000\u0746\u01a9"+ - "\u0001\u0000\u0000\u0000\u0747\u0748\u0003\u015c\u00a4\u0000\u0748\u0749"+ - "\u0001\u0000\u0000\u0000\u0749\u074a\u0006\u00cb,\u0000\u074a\u01ab\u0001"+ - "\u0000\u0000\u0000\u074b\u074c\u0003\u00d4`\u0000\u074c\u074d\u0001\u0000"+ - "\u0000\u0000\u074d\u074e\u0006\u00cc \u0000\u074e\u01ad\u0001\u0000\u0000"+ - "\u0000\u074f\u0750\u0003\u00e4h\u0000\u0750\u0751\u0001\u0000\u0000\u0000"+ - "\u0751\u0752\u0006\u00cd*\u0000\u0752\u01af\u0001\u0000\u0000\u0000\u0753"+ - "\u0754\u0003\u0014\u0000\u0000\u0754\u0755\u0001\u0000\u0000\u0000\u0755"+ - "\u0756\u0006\u00ce\u0000\u0000\u0756\u01b1\u0001\u0000\u0000\u0000\u0757"+ - "\u0758\u0003\u0016\u0001\u0000\u0758\u0759\u0001\u0000\u0000\u0000\u0759"+ - "\u075a\u0006\u00cf\u0000\u0000\u075a\u01b3\u0001\u0000\u0000\u0000\u075b"+ - "\u075c\u0003\u0018\u0002\u0000\u075c\u075d\u0001\u0000\u0000\u0000\u075d"+ - "\u075e\u0006\u00d0\u0000\u0000\u075e\u01b5\u0001\u0000\u0000\u0000\u075f"+ - "\u0760\u0003\u00beU\u0000\u0760\u0761\u0001\u0000\u0000\u0000\u0761\u0762"+ - "\u0006\u00d1\u0012\u0000\u0762\u0763\u0006\u00d1\u0013\u0000\u0763\u01b7"+ - "\u0001\u0000\u0000\u0000\u0764\u0765\u0003\u0136\u0091\u0000\u0765\u0766"+ - "\u0001\u0000\u0000\u0000\u0766\u0767\u0006\u00d2\u0014\u0000\u0767\u0768"+ - "\u0006\u00d2\u0013\u0000\u0768\u0769\u0006\u00d2\u0013\u0000\u0769\u01b9"+ - "\u0001\u0000\u0000\u0000\u076a\u076b\u0003\u00e4h\u0000\u076b\u076c\u0001"+ - "\u0000\u0000\u0000\u076c\u076d\u0006\u00d3*\u0000\u076d\u01bb\u0001\u0000"+ - "\u0000\u0000\u076e\u076f\u0003\u00e8j\u0000\u076f\u0770\u0001\u0000\u0000"+ - "\u0000\u0770\u0771\u0006\u00d4\u0018\u0000\u0771\u01bd\u0001\u0000\u0000"+ - "\u0000\u0772\u0773\u0003\u00ecl\u0000\u0773\u0774\u0001\u0000\u0000\u0000"+ - "\u0774\u0775\u0006\u00d5\u0017\u0000\u0775\u01bf\u0001\u0000\u0000\u0000"+ - "\u0776\u0777\u0003\u0100v\u0000\u0777\u0778\u0001\u0000\u0000\u0000\u0778"+ - "\u0779\u0006\u00d6\u0015\u0000\u0779\u077a\u0006\u00d6.\u0000\u077a\u01c1"+ - "\u0001\u0000\u0000\u0000\u077b\u077c\u0003\u015c\u00a4\u0000\u077c\u077d"+ - "\u0001\u0000\u0000\u0000\u077d\u077e\u0006\u00d7,\u0000\u077e\u01c3\u0001"+ - "\u0000\u0000\u0000\u077f\u0780\u0003\u00d4`\u0000\u0780\u0781\u0001\u0000"+ - "\u0000\u0000\u0781\u0782\u0006\u00d8 \u0000\u0782\u01c5\u0001\u0000\u0000"+ - "\u0000\u0783\u0784\u0003\u0014\u0000\u0000\u0784\u0785\u0001\u0000\u0000"+ - "\u0000\u0785\u0786\u0006\u00d9\u0000\u0000\u0786\u01c7\u0001\u0000\u0000"+ - "\u0000\u0787\u0788\u0003\u0016\u0001\u0000\u0788\u0789\u0001\u0000\u0000"+ - "\u0000\u0789\u078a\u0006\u00da\u0000\u0000\u078a\u01c9\u0001\u0000\u0000"+ - "\u0000\u078b\u078c\u0003\u0018\u0002\u0000\u078c\u078d\u0001\u0000\u0000"+ - "\u0000\u078d\u078e\u0006\u00db\u0000\u0000\u078e\u01cb\u0001\u0000\u0000"+ - "\u0000\u078f\u0790\u0003\u00beU\u0000\u0790\u0791\u0001\u0000\u0000\u0000"+ - "\u0791\u0792\u0006\u00dc\u0012\u0000\u0792\u0793\u0006\u00dc\u0013\u0000"+ - "\u0793\u0794\u0006\u00dc\u0013\u0000\u0794\u01cd\u0001\u0000\u0000\u0000"+ - "\u0795\u0796\u0003\u0136\u0091\u0000\u0796\u0797\u0001\u0000\u0000\u0000"+ - "\u0797\u0798\u0006\u00dd\u0014\u0000\u0798\u0799\u0006\u00dd\u0013\u0000"+ - "\u0799\u079a\u0006\u00dd\u0013\u0000\u079a\u079b\u0006\u00dd\u0013\u0000"+ - "\u079b\u01cf\u0001\u0000\u0000\u0000\u079c\u079d\u0003\u00e8j\u0000\u079d"+ - "\u079e\u0001\u0000\u0000\u0000\u079e\u079f\u0006\u00de\u0018\u0000\u079f"+ - "\u01d1\u0001\u0000\u0000\u0000\u07a0\u07a1\u0003\u00ecl\u0000\u07a1\u07a2"+ - "\u0001\u0000\u0000\u0000\u07a2\u07a3\u0006\u00df\u0017\u0000\u07a3\u01d3"+ - "\u0001\u0000\u0000\u0000\u07a4\u07a5\u0003\u0236\u0111\u0000\u07a5\u07a6"+ - "\u0001\u0000\u0000\u0000\u07a6\u07a7\u0006\u00e0\"\u0000\u07a7\u01d5\u0001"+ - "\u0000\u0000\u0000\u07a8\u07a9\u0003\u0014\u0000\u0000\u07a9\u07aa\u0001"+ - "\u0000\u0000\u0000\u07aa\u07ab\u0006\u00e1\u0000\u0000\u07ab\u01d7\u0001"+ - "\u0000\u0000\u0000\u07ac\u07ad\u0003\u0016\u0001\u0000\u07ad\u07ae\u0001"+ - "\u0000\u0000\u0000\u07ae\u07af\u0006\u00e2\u0000\u0000\u07af\u01d9\u0001"+ - "\u0000\u0000\u0000\u07b0\u07b1\u0003\u0018\u0002\u0000\u07b1\u07b2\u0001"+ - "\u0000\u0000\u0000\u07b2\u07b3\u0006\u00e3\u0000\u0000\u07b3\u01db\u0001"+ - "\u0000\u0000\u0000\u07b4\u07b5\u0003(\n\u0000\u07b5\u07b6\u0001\u0000"+ - "\u0000\u0000\u07b6\u07b7\u0006\u00e4\u0013\u0000\u07b7\u07b8\u0006\u00e4"+ - "\u0004\u0000\u07b8\u01dd\u0001\u0000\u0000\u0000\u07b9\u07ba\u0003\u0100"+ - "v\u0000\u07ba\u07bb\u0001\u0000\u0000\u0000\u07bb\u07bc\u0006\u00e5\u0015"+ - "\u0000\u07bc\u01df\u0001\u0000\u0000\u0000\u07bd\u07be\u0003\u0138\u0092"+ - "\u0000\u07be\u07bf\u0001\u0000\u0000\u0000\u07bf\u07c0\u0006\u00e6\u001c"+ - "\u0000\u07c0\u01e1\u0001\u0000\u0000\u0000\u07c1\u07c2\u0003\u0130\u008e"+ - "\u0000\u07c2\u07c3\u0001\u0000\u0000\u0000\u07c3\u07c4\u0006\u00e7\u0019"+ - "\u0000\u07c4\u01e3\u0001\u0000\u0000\u0000\u07c5\u07c6\u0003\u0132\u008f"+ - "\u0000\u07c6\u07c7\u0001\u0000\u0000\u0000\u07c7\u07c8\u0006\u00e8\u001a"+ - "\u0000\u07c8\u01e5\u0001\u0000\u0000\u0000\u07c9\u07ca\u0003\u00e8j\u0000"+ - "\u07ca\u07cb\u0001\u0000\u0000\u0000\u07cb\u07cc\u0006\u00e9\u0018\u0000"+ - "\u07cc\u01e7\u0001\u0000\u0000\u0000\u07cd\u07ce\u0003\u011a\u0083\u0000"+ - "\u07ce\u07cf\u0001\u0000\u0000\u0000\u07cf\u07d0\u0006\u00ea/\u0000\u07d0"+ - "\u01e9\u0001\u0000\u0000\u0000\u07d1\u07d2\u0003\u011c\u0084\u0000\u07d2"+ - "\u07d3\u0001\u0000\u0000\u0000\u07d3\u07d4\u0006\u00eb0\u0000\u07d4\u01eb"+ - "\u0001\u0000\u0000\u0000\u07d5\u07d6\u0003\u00d8b\u0000\u07d6\u07d7\u0001"+ - "\u0000\u0000\u0000\u07d7\u07d8\u0006\u00ec1\u0000\u07d8\u01ed\u0001\u0000"+ - "\u0000\u0000\u07d9\u07da\u0003\u00d6a\u0000\u07da\u07db\u0001\u0000\u0000"+ - "\u0000\u07db\u07dc\u0006\u00ed2\u0000\u07dc\u01ef\u0001\u0000\u0000\u0000"+ - "\u07dd\u07de\u0003\u0104x\u0000\u07de\u07df\u0001\u0000\u0000\u0000\u07df"+ - "\u07e0\u0006\u00ee#\u0000\u07e0\u01f1\u0001\u0000\u0000\u0000\u07e1\u07e2"+ - "\u0003\u012c\u008c\u0000\u07e2\u07e3\u0001\u0000\u0000\u0000\u07e3\u07e4"+ - "\u0006\u00ef$\u0000\u07e4\u01f3\u0001\u0000\u0000\u0000\u07e5\u07e6\u0003"+ - "\u0134\u0090\u0000\u07e6\u07e7\u0001\u0000\u0000\u0000\u07e7\u07e8\u0006"+ - "\u00f0\'\u0000\u07e8\u01f5\u0001\u0000\u0000\u0000\u07e9\u07ea\u0003\u0136"+ - "\u0091\u0000\u07ea\u07eb\u0001\u0000\u0000\u0000\u07eb\u07ec\u0006\u00f1"+ - "\u0014\u0000\u07ec\u01f7\u0001\u0000\u0000\u0000\u07ed\u07ee\u0003\u00d4"+ - "`\u0000\u07ee\u07ef\u0001\u0000\u0000\u0000\u07ef\u07f0\u0006\u00f2 \u0000"+ - "\u07f0\u01f9\u0001\u0000\u0000\u0000\u07f1\u07f2\u0003\u00e2g\u0000\u07f2"+ - "\u07f3\u0001\u0000\u0000\u0000\u07f3\u07f4\u0006\u00f3+\u0000\u07f4\u01fb"+ - "\u0001\u0000\u0000\u0000\u07f5\u07f6\u0003\u0014\u0000\u0000\u07f6\u07f7"+ - "\u0001\u0000\u0000\u0000\u07f7\u07f8\u0006\u00f4\u0000\u0000\u07f8\u01fd"+ - "\u0001\u0000\u0000\u0000\u07f9\u07fa\u0003\u0016\u0001\u0000\u07fa\u07fb"+ - "\u0001\u0000\u0000\u0000\u07fb\u07fc\u0006\u00f5\u0000\u0000\u07fc\u01ff"+ - "\u0001\u0000\u0000\u0000\u07fd\u07fe\u0003\u0018\u0002\u0000\u07fe\u07ff"+ - "\u0001\u0000\u0000\u0000\u07ff\u0800\u0006\u00f6\u0000\u0000\u0800\u0201"+ - "\u0001\u0000\u0000\u0000\u0801\u0802\u0003\u00beU\u0000\u0802\u0803\u0001"+ - "\u0000\u0000\u0000\u0803\u0804\u0006\u00f7\u0012\u0000\u0804\u0805\u0006"+ - "\u00f7\u0013\u0000\u0805\u0203\u0001\u0000\u0000\u0000\u0806\u0807\u0003"+ - "\u0136\u0091\u0000\u0807\u0808\u0001\u0000\u0000\u0000\u0808\u0809\u0006"+ - "\u00f8\u0014\u0000\u0809\u080a\u0006\u00f8\u0013\u0000\u080a\u080b\u0006"+ - "\u00f8\u0013\u0000\u080b\u0205\u0001\u0000\u0000\u0000\u080c\u080d\u0003"+ - "\u0130\u008e\u0000\u080d\u080e\u0001\u0000\u0000\u0000\u080e\u080f\u0006"+ - "\u00f9\u0019\u0000\u080f\u0207\u0001\u0000\u0000\u0000\u0810\u0811\u0003"+ - "\u0132\u008f\u0000\u0811\u0812\u0001\u0000\u0000\u0000\u0812\u0813\u0006"+ - "\u00fa\u001a\u0000\u0813\u0209\u0001\u0000\u0000\u0000\u0814\u0815\u0003"+ - "\u00ecl\u0000\u0815\u0816\u0001\u0000\u0000\u0000\u0816\u0817\u0006\u00fb"+ - "\u0017\u0000\u0817\u020b\u0001\u0000\u0000\u0000\u0818\u0819\u0003\u0104"+ - "x\u0000\u0819\u081a\u0001\u0000\u0000\u0000\u081a\u081b\u0006\u00fc#\u0000"+ - "\u081b\u020d\u0001\u0000\u0000\u0000\u081c\u081d\u0003\u012c\u008c\u0000"+ - "\u081d\u081e\u0001\u0000\u0000\u0000\u081e\u081f\u0006\u00fd$\u0000\u081f"+ - "\u020f\u0001\u0000\u0000\u0000\u0820\u0821\u0003\u0128\u008a\u0000\u0821"+ - "\u0822\u0001\u0000\u0000\u0000\u0822\u0823\u0006\u00fe%\u0000\u0823\u0211"+ - "\u0001\u0000\u0000\u0000\u0824\u0825\u0003\u012e\u008d\u0000\u0825\u0826"+ - "\u0001\u0000\u0000\u0000\u0826\u0827\u0006\u00ff&\u0000\u0827\u0213\u0001"+ - "\u0000\u0000\u0000\u0828\u0829\u0003\u013c\u0094\u0000\u0829\u082a\u0001"+ - "\u0000\u0000\u0000\u082a\u082b\u0006\u0100\u001b\u0000\u082b\u0215\u0001"+ - "\u0000\u0000\u0000\u082c\u082d\u0003\u0138\u0092\u0000\u082d\u082e\u0001"+ - "\u0000\u0000\u0000\u082e\u082f\u0006\u0101\u001c\u0000\u082f\u0217\u0001"+ - "\u0000\u0000\u0000\u0830\u0831\u0003\u0014\u0000\u0000\u0831\u0832\u0001"+ - "\u0000\u0000\u0000\u0832\u0833\u0006\u0102\u0000\u0000\u0833\u0219\u0001"+ - "\u0000\u0000\u0000\u0834\u0835\u0003\u0016\u0001\u0000\u0835\u0836\u0001"+ - "\u0000\u0000\u0000\u0836\u0837\u0006\u0103\u0000\u0000\u0837\u021b\u0001"+ - "\u0000\u0000\u0000\u0838\u0839\u0003\u0018\u0002\u0000\u0839\u083a\u0001"+ - "\u0000\u0000\u0000\u083a\u083b\u0006\u0104\u0000\u0000\u083b\u021d\u0001"+ - "\u0000\u0000\u0000\u083c\u083d\u0003\u00beU\u0000\u083d\u083e\u0001\u0000"+ - "\u0000\u0000\u083e\u083f\u0006\u0105\u0012\u0000\u083f\u0840\u0006\u0105"+ - "\u0013\u0000\u0840\u021f\u0001\u0000\u0000\u0000\u0841\u0842\u0003\u0136"+ - "\u0091\u0000\u0842\u0843\u0001\u0000\u0000\u0000\u0843\u0844\u0006\u0106"+ - "\u0014\u0000\u0844\u0845\u0006\u0106\u0013\u0000\u0845\u0846\u0006\u0106"+ - "\u0013\u0000\u0846\u0221\u0001\u0000\u0000\u0000\u0847\u0848\u0003\u00ec"+ - "l\u0000\u0848\u0849\u0001\u0000\u0000\u0000\u0849\u084a\u0006\u0107\u0017"+ - "\u0000\u084a\u0223\u0001\u0000\u0000\u0000\u084b\u084c\u0003\u0130\u008e"+ - "\u0000\u084c\u084d\u0001\u0000\u0000\u0000\u084d\u084e\u0006\u0108\u0019"+ - "\u0000\u084e\u0225\u0001\u0000\u0000\u0000\u084f\u0850\u0003\u0132\u008f"+ - "\u0000\u0850\u0851\u0001\u0000\u0000\u0000\u0851\u0852\u0006\u0109\u001a"+ - "\u0000\u0852\u0227\u0001\u0000\u0000\u0000\u0853\u0854\u0003\u00e8j\u0000"+ - "\u0854\u0855\u0001\u0000\u0000\u0000\u0855\u0856\u0006\u010a\u0018\u0000"+ - "\u0856\u0229\u0001\u0000\u0000\u0000\u0857\u0858\u0003\u0104x\u0000\u0858"+ - "\u0859\u0001\u0000\u0000\u0000\u0859\u085a\u0006\u010b#\u0000\u085a\u022b"+ - "\u0001\u0000\u0000\u0000\u085b\u085c\u0003\u012c\u008c\u0000\u085c\u085d"+ - "\u0001\u0000\u0000\u0000\u085d\u085e\u0006\u010c$\u0000\u085e\u022d\u0001"+ - "\u0000\u0000\u0000\u085f\u0860\u0003\u0128\u008a\u0000\u0860\u0861\u0001"+ - "\u0000\u0000\u0000\u0861\u0862\u0006\u010d%\u0000\u0862\u022f\u0001\u0000"+ - "\u0000\u0000\u0863\u0864\u0003\u012e\u008d\u0000\u0864\u0865\u0001\u0000"+ - "\u0000\u0000\u0865\u0866\u0006\u010e&\u0000\u0866\u0231\u0001\u0000\u0000"+ - "\u0000\u0867\u086c\u0003\u00c2W\u0000\u0868\u086c\u0003\u00c0V\u0000\u0869"+ - "\u086c\u0003\u00d0^\u0000\u086a\u086c\u0003\u011e\u0085\u0000\u086b\u0867"+ - "\u0001\u0000\u0000\u0000\u086b\u0868\u0001\u0000\u0000\u0000\u086b\u0869"+ - "\u0001\u0000\u0000\u0000\u086b\u086a\u0001\u0000\u0000\u0000\u086c\u0233"+ - "\u0001\u0000\u0000\u0000\u086d\u0870\u0003\u00c2W\u0000\u086e\u0870\u0003"+ - "\u011e\u0085\u0000\u086f\u086d\u0001\u0000\u0000\u0000\u086f\u086e\u0001"+ - "\u0000\u0000\u0000\u0870\u0874\u0001\u0000\u0000\u0000\u0871\u0873\u0003"+ - "\u0232\u010f\u0000\u0872\u0871\u0001\u0000\u0000\u0000\u0873\u0876\u0001"+ - "\u0000\u0000\u0000\u0874\u0872\u0001\u0000\u0000\u0000\u0874\u0875\u0001"+ - "\u0000\u0000\u0000\u0875\u0881\u0001\u0000\u0000\u0000\u0876\u0874\u0001"+ - "\u0000\u0000\u0000\u0877\u087a\u0003\u00d0^\u0000\u0878\u087a\u0003\u00ca"+ - "[\u0000\u0879\u0877\u0001\u0000\u0000\u0000\u0879\u0878\u0001\u0000\u0000"+ - "\u0000\u087a\u087c\u0001\u0000\u0000\u0000\u087b\u087d\u0003\u0232\u010f"+ - "\u0000\u087c\u087b\u0001\u0000\u0000\u0000\u087d\u087e\u0001\u0000\u0000"+ - "\u0000\u087e\u087c\u0001\u0000\u0000\u0000\u087e\u087f\u0001\u0000\u0000"+ - "\u0000\u087f\u0881\u0001\u0000\u0000\u0000\u0880\u086f\u0001\u0000\u0000"+ - "\u0000\u0880\u0879\u0001\u0000\u0000\u0000\u0881\u0235\u0001\u0000\u0000"+ - "\u0000\u0882\u0885\u0003\u0234\u0110\u0000\u0883\u0885\u0003\u013a\u0093"+ - "\u0000\u0884\u0882\u0001\u0000\u0000\u0000\u0884\u0883\u0001\u0000\u0000"+ - "\u0000\u0885\u0886\u0001\u0000\u0000\u0000\u0886\u0884\u0001\u0000\u0000"+ - "\u0000\u0886\u0887\u0001\u0000\u0000\u0000\u0887\u0237\u0001\u0000\u0000"+ - "\u0000\u0888\u0889\u0003\u0014\u0000\u0000\u0889\u088a\u0001\u0000\u0000"+ - "\u0000\u088a\u088b\u0006\u0112\u0000\u0000\u088b\u0239\u0001\u0000\u0000"+ - "\u0000\u088c\u088d\u0003\u0016\u0001\u0000\u088d\u088e\u0001\u0000\u0000"+ - "\u0000\u088e\u088f\u0006\u0113\u0000\u0000\u088f\u023b\u0001\u0000\u0000"+ - "\u0000\u0890\u0891\u0003\u0018\u0002\u0000\u0891\u0892\u0001\u0000\u0000"+ - "\u0000\u0892\u0893\u0006\u0114\u0000\u0000\u0893\u023d\u0001\u0000\u0000"+ - "\u0000\u0894\u0895\u0003\u0138\u0092\u0000\u0895\u0896\u0001\u0000\u0000"+ - "\u0000\u0896\u0897\u0006\u0115\u001c\u0000\u0897\u023f\u0001\u0000\u0000"+ - "\u0000\u0898\u0899\u0003\u013c\u0094\u0000\u0899\u089a\u0001\u0000\u0000"+ - "\u0000\u089a\u089b\u0006\u0116\u001b\u0000\u089b\u0241\u0001\u0000\u0000"+ - "\u0000\u089c\u089d\u0003\u00dee\u0000\u089d\u089e\u0001\u0000\u0000\u0000"+ - "\u089e\u089f\u0006\u0117!\u0000\u089f\u0243\u0001\u0000\u0000\u0000\u08a0"+ - "\u08a1\u0003\u012c\u008c\u0000\u08a1\u08a2\u0001\u0000\u0000\u0000\u08a2"+ - "\u08a3\u0006\u0118$\u0000\u08a3\u0245\u0001\u0000\u0000\u0000\u08a4\u08a5"+ - "\u0003\u015c\u00a4\u0000\u08a5\u08a6\u0001\u0000\u0000\u0000\u08a6\u08a7"+ - "\u0006\u0119,\u0000\u08a7\u0247\u0001\u0000\u0000\u0000\u08a8\u08a9\u0003"+ - "\u00d4`\u0000\u08a9\u08aa\u0001\u0000\u0000\u0000\u08aa\u08ab\u0006\u011a"+ - " \u0000\u08ab\u0249\u0001\u0000\u0000\u0000\u08ac\u08ad\u0003\u00e4h\u0000"+ - "\u08ad\u08ae\u0001\u0000\u0000\u0000\u08ae\u08af\u0006\u011b*\u0000\u08af"+ - "\u024b\u0001\u0000\u0000\u0000\u08b0\u08b1\u0003\u00e2g\u0000\u08b1\u08b2"+ - "\u0001\u0000\u0000\u0000\u08b2\u08b3\u0006\u011c+\u0000\u08b3\u024d\u0001"+ - "\u0000\u0000\u0000\u08b4\u08b5\u0003\u00e8j\u0000\u08b5\u08b6\u0001\u0000"+ - "\u0000\u0000\u08b6\u08b7\u0006\u011d\u0018\u0000\u08b7\u024f\u0001\u0000"+ - "\u0000\u0000\u08b8\u08b9\u0003\u00beU\u0000\u08b9\u08ba\u0001\u0000\u0000"+ - "\u0000\u08ba\u08bb\u0006\u011e\u0012\u0000\u08bb\u08bc\u0006\u011e\u0013"+ - "\u0000\u08bc\u0251\u0001\u0000\u0000\u0000\u08bd\u08be\u0003\u0134\u0090"+ - "\u0000\u08be\u08bf\u0006\u011f3\u0000\u08bf\u08c0\u0001\u0000\u0000\u0000"+ - "\u08c0\u08c1\u0006\u011f\'\u0000\u08c1\u0253\u0001\u0000\u0000\u0000\u08c2"+ - "\u08c3\u0005)\u0000\u0000\u08c3\u08c4\u0004\u0120\b\u0000\u08c4\u08c5"+ - "\u0006\u01204\u0000\u08c5\u08c6\u0001\u0000\u0000\u0000\u08c6\u08c7\u0006"+ - "\u0120\u0014\u0000\u08c7\u0255\u0001\u0000\u0000\u0000\u08c8\u08c9\u0005"+ - ")\u0000\u0000\u08c9\u08ca\u0004\u0121\t\u0000\u08ca\u08cb\u0006\u0121"+ - "5\u0000\u08cb\u08cc\u0001\u0000\u0000\u0000\u08cc\u08cd\u0006\u0121\u0014"+ - "\u0000\u08cd\u08ce\u0006\u0121\u0013\u0000\u08ce\u0257\u0001\u0000\u0000"+ - "\u0000\u08cf\u08d0\u0003\u0014\u0000\u0000\u08d0\u08d1\u0001\u0000\u0000"+ - "\u0000\u08d1\u08d2\u0006\u0122\u0000\u0000\u08d2\u0259\u0001\u0000\u0000"+ - "\u0000\u08d3\u08d4\u0003\u0016\u0001\u0000\u08d4\u08d5\u0001\u0000\u0000"+ - "\u0000\u08d5\u08d6\u0006\u0123\u0000\u0000\u08d6\u025b\u0001\u0000\u0000"+ - "\u0000\u08d7\u08d8\u0003\u0018\u0002\u0000\u08d8\u08d9\u0001\u0000\u0000"+ - "\u0000\u08d9\u08da\u0006\u0124\u0000\u0000\u08da\u025d\u0001\u0000\u0000"+ - "\u0000\u08db\u08df\u0005#\u0000\u0000\u08dc\u08de\b\u0000\u0000\u0000"+ - "\u08dd\u08dc\u0001\u0000\u0000\u0000\u08de\u08e1\u0001\u0000\u0000\u0000"+ - "\u08df\u08dd\u0001\u0000\u0000\u0000\u08df\u08e0\u0001\u0000\u0000\u0000"+ - "\u08e0\u08e3\u0001\u0000\u0000\u0000\u08e1\u08df\u0001\u0000\u0000\u0000"+ - "\u08e2\u08e4\u0005\r\u0000\u0000\u08e3\u08e2\u0001\u0000\u0000\u0000\u08e3"+ - "\u08e4\u0001\u0000\u0000\u0000\u08e4\u08e6\u0001\u0000\u0000\u0000\u08e5"+ - "\u08e7\u0005\n\u0000\u0000\u08e6\u08e5\u0001\u0000\u0000\u0000\u08e6\u08e7"+ - "\u0001\u0000\u0000\u0000\u08e7\u025f\u0001\u0000\u0000\u0000\u08e8\u08ee"+ - "\u0005\'\u0000\u0000\u08e9\u08ea\u0005\\\u0000\u0000\u08ea\u08ed\t\u0000"+ - "\u0000\u0000\u08eb\u08ed\b%\u0000\u0000\u08ec\u08e9\u0001\u0000\u0000"+ - "\u0000\u08ec\u08eb\u0001\u0000\u0000\u0000\u08ed\u08f0\u0001\u0000\u0000"+ - "\u0000\u08ee\u08ec\u0001\u0000\u0000\u0000\u08ee\u08ef\u0001\u0000\u0000"+ - "\u0000\u08ef\u08f1\u0001\u0000\u0000\u0000\u08f0\u08ee\u0001\u0000\u0000"+ - "\u0000\u08f1\u08f2\u0005\'\u0000\u0000\u08f2\u0261\u0001\u0000\u0000\u0000"+ - "\u08f3\u08f4\b&\u0000\u0000\u08f4\u0263\u0001\u0000\u0000\u0000\u08f5"+ - "\u08f6\u0003\u00beU\u0000\u08f6\u08f7\u0001\u0000\u0000\u0000\u08f7\u08f8"+ - "\u0006\u0128\u0012\u0000\u08f8\u08f9\u0006\u0128\u0013\u0000\u08f9\u0265"+ - "\u0001\u0000\u0000\u0000\u08fa\u08fb\u0003\u0136\u0091\u0000\u08fb\u08fc"+ - "\u0001\u0000\u0000\u0000\u08fc\u08fd\u0006\u0129\u0014\u0000\u08fd\u08fe"+ - "\u0006\u0129\u0013\u0000\u08fe\u08ff\u0006\u0129\u0013\u0000\u08ff\u0267"+ - "\u0001\u0000\u0000\u0000\u0900\u0901\u0003\u0130\u008e\u0000\u0901\u0902"+ - "\u0001\u0000\u0000\u0000\u0902\u0903\u0006\u012a\u0019\u0000\u0903\u0269"+ - "\u0001\u0000\u0000\u0000\u0904\u0905\u0003\u0132\u008f\u0000\u0905\u0906"+ - "\u0001\u0000\u0000\u0000\u0906\u0907\u0006\u012b\u001a\u0000\u0907\u026b"+ - "\u0001\u0000\u0000\u0000\u0908\u0909\u0003\u00dee\u0000\u0909\u090a\u0001"+ - "\u0000\u0000\u0000\u090a\u090b\u0006\u012c!\u0000\u090b\u026d\u0001\u0000"+ - "\u0000\u0000\u090c\u090d\u0003\u00e8j\u0000\u090d\u090e\u0001\u0000\u0000"+ - "\u0000\u090e\u090f\u0006\u012d\u0018\u0000\u090f\u026f\u0001\u0000\u0000"+ - "\u0000\u0910\u0911\u0003\u00ecl\u0000\u0911\u0912\u0001\u0000\u0000\u0000"+ - "\u0912\u0913\u0006\u012e\u0017\u0000\u0913\u0271\u0001\u0000\u0000\u0000"+ - "\u0914\u0915\u0003\u0104x\u0000\u0915\u0916\u0001\u0000\u0000\u0000\u0916"+ - "\u0917\u0006\u012f#\u0000\u0917\u0273\u0001\u0000\u0000\u0000\u0918\u0919"+ - "\u0003\u012c\u008c\u0000\u0919\u091a\u0001\u0000\u0000\u0000\u091a\u091b"+ - "\u0006\u0130$\u0000\u091b\u0275\u0001\u0000\u0000\u0000\u091c\u091d\u0003"+ - "\u0128\u008a\u0000\u091d\u091e\u0001\u0000\u0000\u0000\u091e\u091f\u0006"+ - "\u0131%\u0000\u091f\u0277\u0001\u0000\u0000\u0000\u0920\u0921\u0003\u012e"+ - "\u008d\u0000\u0921\u0922\u0001\u0000\u0000\u0000\u0922\u0923\u0006\u0132"+ - "&\u0000\u0923\u0279\u0001\u0000\u0000\u0000\u0924\u0925\u0007\u0004\u0000"+ - "\u0000\u0925\u0926\u0007\u0011\u0000\u0000\u0926\u027b\u0001\u0000\u0000"+ - "\u0000\u0927\u0928\u0003\u0236\u0111\u0000\u0928\u0929\u0001\u0000\u0000"+ - "\u0000\u0929\u092a\u0006\u0134\"\u0000\u092a\u027d\u0001\u0000\u0000\u0000"+ - "\u092b\u092c\u0003\u0014\u0000\u0000\u092c\u092d\u0001\u0000\u0000\u0000"+ - "\u092d\u092e\u0006\u0135\u0000\u0000\u092e\u027f\u0001\u0000\u0000\u0000"+ - "\u092f\u0930\u0003\u0016\u0001\u0000\u0930\u0931\u0001\u0000\u0000\u0000"+ - "\u0931\u0932\u0006\u0136\u0000\u0000\u0932\u0281\u0001\u0000\u0000\u0000"+ - "\u0933\u0934\u0003\u0018\u0002\u0000\u0934\u0935\u0001\u0000\u0000\u0000"+ - "\u0935\u0936\u0006\u0137\u0000\u0000\u0936\u0283\u0001\u0000\u0000\u0000"+ - "\u0937\u0938\u0003\u0108z\u0000\u0938\u0939\u0001\u0000\u0000\u0000\u0939"+ - "\u093a\u0006\u01386\u0000\u093a\u0285\u0001\u0000\u0000\u0000\u093b\u093c"+ - "\u0003\u00eem\u0000\u093c\u093d\u0001\u0000\u0000\u0000\u093d\u093e\u0006"+ - "\u01397\u0000\u093e\u0287\u0001\u0000\u0000\u0000\u093f\u0940\u0003\u00fc"+ - "t\u0000\u0940\u0941\u0001\u0000\u0000\u0000\u0941\u0942\u0006\u013a8\u0000"+ - "\u0942\u0289\u0001\u0000\u0000\u0000\u0943\u0944\u0003\u00e6i\u0000\u0944"+ - "\u0945\u0001\u0000\u0000\u0000\u0945\u0946\u0006\u013b9\u0000\u0946\u0947"+ - "\u0006\u013b\u0013\u0000\u0947\u028b\u0001\u0000\u0000\u0000\u0948\u0949"+ - "\u0003\u00dee\u0000\u0949\u094a\u0001\u0000\u0000\u0000\u094a\u094b\u0006"+ - "\u013c!\u0000\u094b\u028d\u0001\u0000\u0000\u0000\u094c\u094d\u0003\u00d4"+ - "`\u0000\u094d\u094e\u0001\u0000\u0000\u0000\u094e\u094f\u0006\u013d \u0000"+ - "\u094f\u028f\u0001\u0000\u0000\u0000\u0950\u0951\u0003\u0138\u0092\u0000"+ - "\u0951\u0952\u0001\u0000\u0000\u0000\u0952\u0953\u0006\u013e\u001c\u0000"+ - "\u0953\u0291\u0001\u0000\u0000\u0000\u0954\u0955\u0003\u013c\u0094\u0000"+ - "\u0955\u0956\u0001\u0000\u0000\u0000\u0956\u0957\u0006\u013f\u001b\u0000"+ - "\u0957\u0293\u0001\u0000\u0000\u0000\u0958\u0959\u0003\u00d8b\u0000\u0959"+ - "\u095a\u0001\u0000\u0000\u0000\u095a\u095b\u0006\u01401\u0000\u095b\u0295"+ - "\u0001\u0000\u0000\u0000\u095c\u095d\u0003\u00d6a\u0000\u095d\u095e\u0001"+ - "\u0000\u0000\u0000\u095e\u095f\u0006\u01412\u0000\u095f\u0297\u0001\u0000"+ - "\u0000\u0000\u0960\u0961\u0003\u00e4h\u0000\u0961\u0962\u0001\u0000\u0000"+ - "\u0000\u0962\u0963\u0006\u0142*\u0000\u0963\u0299\u0001\u0000\u0000\u0000"+ - "\u0964\u0965\u0003\u00e8j\u0000\u0965\u0966\u0001\u0000\u0000\u0000\u0966"+ - "\u0967\u0006\u0143\u0018\u0000\u0967\u029b\u0001\u0000\u0000\u0000\u0968"+ - "\u0969\u0003\u00ecl\u0000\u0969\u096a\u0001\u0000\u0000\u0000\u096a\u096b"+ - "\u0006\u0144\u0017\u0000\u096b\u029d\u0001\u0000\u0000\u0000\u096c\u096d"+ - "\u0003\u0104x\u0000\u096d\u096e\u0001\u0000\u0000\u0000\u096e\u096f\u0006"+ - "\u0145#\u0000\u096f\u029f\u0001\u0000\u0000\u0000\u0970\u0971\u0003\u012c"+ - "\u008c\u0000\u0971\u0972\u0001\u0000\u0000\u0000\u0972\u0973\u0006\u0146"+ - "$\u0000\u0973\u02a1\u0001\u0000\u0000\u0000\u0974\u0975\u0003\u0124\u0088"+ - "\u0000\u0975\u0976\u0001\u0000\u0000\u0000\u0976\u0977\u0006\u0147:\u0000"+ - "\u0977\u02a3\u0001\u0000\u0000\u0000\u0978\u0979\u0003\u0126\u0089\u0000"+ - "\u0979\u097a\u0001\u0000\u0000\u0000\u097a\u097b\u0006\u0148;\u0000\u097b"+ - "\u02a5\u0001\u0000\u0000\u0000\u097c\u097d\u0003\u0128\u008a\u0000\u097d"+ - "\u097e\u0001\u0000\u0000\u0000\u097e\u097f\u0006\u0149%\u0000\u097f\u02a7"+ - "\u0001\u0000\u0000\u0000\u0980\u0981\u0003\u012e\u008d\u0000\u0981\u0982"+ - "\u0001\u0000\u0000\u0000\u0982\u0983\u0006\u014a&\u0000\u0983\u02a9\u0001"+ - "\u0000\u0000\u0000\u0984\u0985\u0003\u0130\u008e\u0000\u0985\u0986\u0001"+ - "\u0000\u0000\u0000\u0986\u0987\u0006\u014b\u0019\u0000\u0987\u02ab\u0001"+ - "\u0000\u0000\u0000\u0988\u0989\u0003\u0132\u008f\u0000\u0989\u098a\u0001"+ - "\u0000\u0000\u0000\u098a\u098b\u0006\u014c\u001a\u0000\u098b\u02ad\u0001"+ - "\u0000\u0000\u0000\u098c\u098d\u0003\u0236\u0111\u0000\u098d\u098e\u0001"+ - "\u0000\u0000\u0000\u098e\u098f\u0006\u014d\"\u0000\u098f\u02af\u0001\u0000"+ - "\u0000\u0000\u0990\u0991\u0003\u0014\u0000\u0000\u0991\u0992\u0001\u0000"+ - "\u0000\u0000\u0992\u0993\u0006\u014e\u0000\u0000\u0993\u02b1\u0001\u0000"+ - "\u0000\u0000\u0994\u0995\u0003\u0016\u0001\u0000\u0995\u0996\u0001\u0000"+ - "\u0000\u0000\u0996\u0997\u0006\u014f\u0000\u0000\u0997\u02b3\u0001\u0000"+ - "\u0000\u0000\u0998\u0999\u0003\u0018\u0002\u0000\u0999\u099a\u0001\u0000"+ - "\u0000\u0000\u099a\u099b\u0006\u0150\u0000\u0000\u099b\u02b5\u0001\u0000"+ - "\u0000\u0000\u099c\u099d\u0003\u00beU\u0000\u099d\u099e\u0001\u0000\u0000"+ - "\u0000\u099e\u099f\u0006\u0151\u0012\u0000\u099f\u09a0\u0006\u0151\u0013"+ - "\u0000\u09a0\u02b7\u0001\u0000\u0000\u0000\u09a1\u09a2\u0007\n\u0000\u0000"+ - "\u09a2\u09a3\u0007\u0005\u0000\u0000\u09a3\u09a4\u0007\u0015\u0000\u0000"+ - "\u09a4\u09a5\u0007\t\u0000\u0000\u09a5\u02b9\u0001\u0000\u0000\u0000\u09a6"+ - "\u09a7\u0003\u0014\u0000\u0000\u09a7\u09a8\u0001\u0000\u0000\u0000\u09a8"+ - "\u09a9\u0006\u0153\u0000\u0000\u09a9\u02bb\u0001\u0000\u0000\u0000\u09aa"+ - "\u09ab\u0003\u0016\u0001\u0000\u09ab\u09ac\u0001\u0000\u0000\u0000\u09ac"+ - "\u09ad\u0006\u0154\u0000\u0000\u09ad\u02bd\u0001\u0000\u0000\u0000\u09ae"+ - "\u09af\u0003\u0018\u0002\u0000\u09af\u09b0\u0001\u0000\u0000\u0000\u09b0"+ - "\u09b1\u0006\u0155\u0000\u0000\u09b1\u02bf\u0001\u0000\u0000\u0000M\u0000"+ + "\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cc"+ + "\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00cd"+ + "\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00cf"+ + "\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0"+ + "\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d2"+ + "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001\u00d4"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5"+ + "\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d7\u0001\u00d7"+ + "\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da"+ + "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ + "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de"+ + "\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de"+ + "\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0"+ + "\u0001\u00e0\u0001\u00e0\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1"+ + "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ + "\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e9"+ + "\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea"+ + "\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec"+ + "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed"+ + "\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef"+ + "\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0"+ + "\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2"+ + "\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3"+ + "\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f5"+ + "\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001\u00f6"+ + "\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8"+ + "\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001\u00f9"+ + "\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa"+ + "\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb"+ + "\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd"+ + "\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe"+ + "\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u0100\u0001\u0100"+ + "\u0001\u0100\u0001\u0100\u0001\u0101\u0001\u0101\u0001\u0101\u0001\u0101"+ + "\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0103\u0001\u0103"+ + "\u0001\u0103\u0001\u0103\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0104"+ + "\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0106\u0001\u0106"+ + "\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0107\u0001\u0107\u0001\u0107"+ + "\u0001\u0107\u0001\u0107\u0001\u0107\u0001\u0108\u0001\u0108\u0001\u0108"+ + "\u0001\u0108\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u010a"+ + "\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010b\u0001\u010b\u0001\u010b"+ + "\u0001\u010b\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010d"+ + "\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010e\u0001\u010e\u0001\u010e"+ + "\u0001\u010e\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u0110"+ + "\u0001\u0110\u0001\u0110\u0001\u0110\u0003\u0110\u087a\b\u0110\u0001\u0111"+ + "\u0001\u0111\u0003\u0111\u087e\b\u0111\u0001\u0111\u0005\u0111\u0881\b"+ + "\u0111\n\u0111\f\u0111\u0884\t\u0111\u0001\u0111\u0001\u0111\u0003\u0111"+ + "\u0888\b\u0111\u0001\u0111\u0004\u0111\u088b\b\u0111\u000b\u0111\f\u0111"+ + "\u088c\u0003\u0111\u088f\b\u0111\u0001\u0112\u0001\u0112\u0004\u0112\u0893"+ + "\b\u0112\u000b\u0112\f\u0112\u0894\u0001\u0113\u0001\u0113\u0001\u0113"+ + "\u0001\u0113\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0115"+ + "\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0116\u0001\u0116\u0001\u0116"+ + "\u0001\u0116\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0118"+ + "\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0119\u0001\u0119\u0001\u0119"+ + "\u0001\u0119\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011b"+ + "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011c\u0001\u011c\u0001\u011c"+ + "\u0001\u011c\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011e"+ + "\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011f\u0001\u011f\u0001\u011f"+ + "\u0001\u011f\u0001\u011f\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120"+ + "\u0001\u0120\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121"+ + "\u0001\u0121\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0122"+ + "\u0001\u0122\u0001\u0122\u0001\u0123\u0001\u0123\u0001\u0123\u0001\u0123"+ + "\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0125\u0001\u0125"+ + "\u0001\u0125\u0001\u0125\u0001\u0126\u0001\u0126\u0005\u0126\u08ec\b\u0126"+ + "\n\u0126\f\u0126\u08ef\t\u0126\u0001\u0126\u0003\u0126\u08f2\b\u0126\u0001"+ + "\u0126\u0003\u0126\u08f5\b\u0126\u0001\u0127\u0001\u0127\u0001\u0127\u0001"+ + "\u0127\u0005\u0127\u08fb\b\u0127\n\u0127\f\u0127\u08fe\t\u0127\u0001\u0127"+ + "\u0001\u0127\u0001\u0128\u0001\u0128\u0001\u0129\u0001\u0129\u0001\u0129"+ + "\u0001\u0129\u0001\u0129\u0001\u012a\u0001\u012a\u0001\u012a\u0001\u012a"+ + "\u0001\u012a\u0001\u012a\u0001\u012b\u0001\u012b\u0001\u012b\u0001\u012b"+ + "\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012c\u0001\u012d\u0001\u012d"+ + "\u0001\u012d\u0001\u012d\u0001\u012e\u0001\u012e\u0001\u012e\u0001\u012e"+ + "\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u0130\u0001\u0130"+ + "\u0001\u0130\u0001\u0130\u0001\u0131\u0001\u0131\u0001\u0131\u0001\u0131"+ + "\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0133\u0001\u0133"+ + "\u0001\u0133\u0001\u0133\u0001\u0134\u0001\u0134\u0001\u0134\u0001\u0135"+ + "\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0136\u0001\u0136\u0001\u0136"+ + "\u0001\u0136\u0001\u0137\u0001\u0137\u0001\u0137\u0001\u0137\u0001\u0138"+ + "\u0001\u0138\u0001\u0138\u0001\u0138\u0001\u0139\u0001\u0139\u0001\u0139"+ + "\u0001\u0139\u0001\u013a\u0001\u013a\u0001\u013a\u0001\u013a\u0001\u013b"+ + "\u0001\u013b\u0001\u013b\u0001\u013b\u0001\u013c\u0001\u013c\u0001\u013c"+ + "\u0001\u013c\u0001\u013c\u0001\u013d\u0001\u013d\u0001\u013d\u0001\u013d"+ + "\u0001\u013e\u0001\u013e\u0001\u013e\u0001\u013e\u0001\u013f\u0001\u013f"+ + "\u0001\u013f\u0001\u013f\u0001\u0140\u0001\u0140\u0001\u0140\u0001\u0140"+ + "\u0001\u0141\u0001\u0141\u0001\u0141\u0001\u0141\u0001\u0142\u0001\u0142"+ + "\u0001\u0142\u0001\u0142\u0001\u0143\u0001\u0143\u0001\u0143\u0001\u0143"+ + "\u0001\u0144\u0001\u0144\u0001\u0144\u0001\u0144\u0001\u0145\u0001\u0145"+ + "\u0001\u0145\u0001\u0145\u0001\u0146\u0001\u0146\u0001\u0146\u0001\u0146"+ + "\u0001\u0147\u0001\u0147\u0001\u0147\u0001\u0147\u0001\u0148\u0001\u0148"+ + "\u0001\u0148\u0001\u0148\u0001\u0149\u0001\u0149\u0001\u0149\u0001\u0149"+ + "\u0001\u014a\u0001\u014a\u0001\u014a\u0001\u014a\u0001\u014b\u0001\u014b"+ + "\u0001\u014b\u0001\u014b\u0001\u014c\u0001\u014c\u0001\u014c\u0001\u014c"+ + "\u0001\u014d\u0001\u014d\u0001\u014d\u0001\u014d\u0001\u014e\u0001\u014e"+ + "\u0001\u014e\u0001\u014e\u0001\u014f\u0001\u014f\u0001\u014f\u0001\u014f"+ + "\u0001\u0150\u0001\u0150\u0001\u0150\u0001\u0150\u0001\u0151\u0001\u0151"+ + "\u0001\u0151\u0001\u0151\u0001\u0152\u0001\u0152\u0001\u0152\u0001\u0152"+ + "\u0001\u0152\u0001\u0153\u0001\u0153\u0001\u0153\u0001\u0153\u0001\u0153"+ + "\u0001\u0154\u0001\u0154\u0001\u0154\u0001\u0154\u0001\u0155\u0001\u0155"+ + "\u0001\u0155\u0001\u0155\u0001\u0156\u0001\u0156\u0001\u0156\u0001\u0156"+ + "\u0002\u02da\u0537\u0000\u0157\u0014\u0001\u0016\u0002\u0018\u0003\u001a"+ + "\u0004\u001c\u0005\u001e\u0006 \u0007\"\b$\t&\n(\u000b*\f,\r.\u000e0\u000f"+ + "2\u00104\u00116\u00128\u0013:\u0014<\u0015>\u0016@\u0017B\u0018D\u0019"+ + "F\u001aH\u001bJ\u001cL\u001dN\u001eP\u001fR T!V\"X#Z$\\%^&`\'b(d\u0000"+ + "f\u0000h\u0000j\u0000l\u0000n\u0000p\u0000r\u0000t\u0000v\u0000x)z*|+"+ + "~\u0000\u0080\u0000\u0082\u0000\u0084\u0000\u0086\u0000\u0088,\u008a\u0000"+ + "\u008c\u0000\u008e-\u0090.\u0092/\u0094\u0000\u0096\u0000\u0098\u0000"+ + "\u009a\u0000\u009c\u0000\u009e\u0000\u00a0\u0000\u00a2\u0000\u00a4\u0000"+ + "\u00a6\u0000\u00a8\u0000\u00aa\u0000\u00ac\u0000\u00ae\u0000\u00b00\u00b2"+ + "1\u00b42\u00b6\u0000\u00b8\u0000\u00ba3\u00bc4\u00be5\u00c06\u00c2\u0000"+ + "\u00c4\u0000\u00c6\u0000\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000"+ + "\u00d0\u0000\u00d2\u0000\u00d4\u0000\u00d67\u00d88\u00da9\u00dc:\u00de"+ + ";\u00e0<\u00e2=\u00e4>\u00e6?\u00e8@\u00eaA\u00ecB\u00eeC\u00f0D\u00f2"+ + "E\u00f4F\u00f6G\u00f8H\u00faI\u00fcJ\u00feK\u0100L\u0102M\u0104N\u0106"+ + "O\u0108P\u010aQ\u010cR\u010eS\u0110T\u0112U\u0114V\u0116W\u0118X\u011a"+ + "Y\u011cZ\u011e[\u0120\\\u0122]\u0124^\u0126_\u0128`\u012aa\u012c\u0000"+ + "\u012eb\u0130c\u0132d\u0134e\u0136f\u0138g\u013ah\u013c\u0000\u013ei\u0140"+ + "j\u0142k\u0144l\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014e"+ + "\u0000\u0150m\u0152\u0000\u0154\u0000\u0156\u0000\u0158\u0000\u015a\u0000"+ + "\u015c\u0000\u015en\u0160\u0000\u0162\u0000\u0164o\u0166p\u0168q\u016a"+ + "\u0000\u016c\u0000\u016e\u0000\u0170r\u0172s\u0174t\u0176\u0000\u0178"+ + "\u0000\u017au\u017cv\u017ew\u0180\u0000\u0182\u0000\u0184\u0000\u0186"+ + "\u0000\u0188\u0000\u018a\u0000\u018c\u0000\u018e\u0000\u0190\u0000\u0192"+ + "\u0000\u0194x\u0196y\u0198z\u019a{\u019c|\u019e}\u01a0~\u01a2\u0000\u01a4"+ + "\u007f\u01a6\u0000\u01a8\u0000\u01aa\u0080\u01ac\u0000\u01ae\u0000\u01b0"+ + "\u0000\u01b2\u0081\u01b4\u0082\u01b6\u0083\u01b8\u0000\u01ba\u0000\u01bc"+ + "\u0000\u01be\u0000\u01c0\u0000\u01c2\u0000\u01c4\u0000\u01c6\u0000\u01c8"+ + "\u0084\u01ca\u0085\u01cc\u0086\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4"+ + "\u0000\u01d6\u0000\u01d8\u0087\u01da\u0088\u01dc\u0089\u01de\u008a\u01e0"+ + "\u0000\u01e2\u0000\u01e4\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0000\u01ec"+ + "\u0000\u01ee\u0000\u01f0\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000\u01f8"+ + "\u0000\u01fa\u0000\u01fc\u0000\u01fe\u008b\u0200\u008c\u0202\u008d\u0204"+ + "\u0000\u0206\u0000\u0208\u0000\u020a\u0000\u020c\u0000\u020e\u0000\u0210"+ + "\u0000\u0212\u0000\u0214\u0000\u0216\u0000\u0218\u0000\u021a\u008e\u021c"+ + "\u008f\u021e\u0090\u0220\u0000\u0222\u0000\u0224\u0000\u0226\u0000\u0228"+ + "\u0000\u022a\u0000\u022c\u0000\u022e\u0000\u0230\u0000\u0232\u0000\u0234"+ + "\u0000\u0236\u0000\u0238\u0091\u023a\u0092\u023c\u0093\u023e\u0094\u0240"+ + "\u0000\u0242\u0000\u0244\u0000\u0246\u0000\u0248\u0000\u024a\u0000\u024c"+ + "\u0000\u024e\u0000\u0250\u0000\u0252\u0000\u0254\u0000\u0256\u0000\u0258"+ + "\u0000\u025a\u0095\u025c\u0096\u025e\u0097\u0260\u0098\u0262\u0099\u0264"+ + "\u009a\u0266\u0000\u0268\u0000\u026a\u0000\u026c\u0000\u026e\u0000\u0270"+ + "\u0000\u0272\u0000\u0274\u0000\u0276\u0000\u0278\u0000\u027a\u0000\u027c"+ + "\u009b\u027e\u0000\u0280\u009c\u0282\u009d\u0284\u009e\u0286\u0000\u0288"+ + "\u0000\u028a\u0000\u028c\u0000\u028e\u0000\u0290\u0000\u0292\u0000\u0294"+ + "\u0000\u0296\u0000\u0298\u0000\u029a\u0000\u029c\u0000\u029e\u0000\u02a0"+ + "\u0000\u02a2\u0000\u02a4\u0000\u02a6\u0000\u02a8\u0000\u02aa\u0000\u02ac"+ + "\u0000\u02ae\u0000\u02b0\u0000\u02b2\u009f\u02b4\u00a0\u02b6\u00a1\u02b8"+ + "\u0000\u02ba\u00a2\u02bc\u00a3\u02be\u00a4\u02c0\u00a5\u0014\u0000\u0001"+ + "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010"+ + "\u0011\u0012\u0013\'\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0002\u0000"+ + "CCcc\u0002\u0000HHhh\u0002\u0000AAaa\u0002\u0000NNnn\u0002\u0000GGgg\u0002"+ + "\u0000EEee\u0002\u0000PPpp\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000"+ + "TTtt\u0002\u0000RRrr\u0002\u0000XXxx\u0002\u0000LLll\u0002\u0000MMmm\u0002"+ + "\u0000DDdd\u0002\u0000SSss\u0002\u0000VVvv\u0002\u0000KKkk\u0002\u0000"+ + "WWww\u0002\u0000UUuu\u0002\u0000FFff\u0002\u0000QQqq\u0006\u0000\t\n\r"+ + "\r //[[]]\f\u0000\t\n\r\r \"#(),,//::<<>?\\\\||\u0001\u000009\u0002"+ + "\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002"+ + "\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\f\u0000\t\n\r"+ + "\r \"\"(),,//::==[[]]||\u0002\u0000**//\u0002\u0000JJjj\u0002\u0000\'"+ + "\'\\\\\u0007\u0000\n\n\r\r \"#\')``||\u09db\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\u0000"+ + "4\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\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"+ + "B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001"+ + "\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000"+ + "\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000"+ + "P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001"+ + "\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000"+ + "\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000"+ + "\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b"+ + "\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001f\u0001\u0000"+ + "\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000\u0000\u0000"+ + "\u0001l\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0001p"+ + "\u0001\u0000\u0000\u0000\u0001r\u0001\u0000\u0000\u0000\u0001t\u0001\u0000"+ + "\u0000\u0000\u0001v\u0001\u0000\u0000\u0000\u0001x\u0001\u0000\u0000\u0000"+ + "\u0001z\u0001\u0000\u0000\u0000\u0001|\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\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\u0003\u0094"+ + "\u0001\u0000\u0000\u0000\u0003\u0096\u0001\u0000\u0000\u0000\u0003\u0098"+ + "\u0001\u0000\u0000\u0000\u0003\u009a\u0001\u0000\u0000\u0000\u0003\u009c"+ + "\u0001\u0000\u0000\u0000\u0003\u009e\u0001\u0000\u0000\u0000\u0003\u00a0"+ + "\u0001\u0000\u0000\u0000\u0003\u00a2\u0001\u0000\u0000\u0000\u0003\u00a4"+ + "\u0001\u0000\u0000\u0000\u0003\u00a6\u0001\u0000\u0000\u0000\u0003\u00a8"+ + "\u0001\u0000\u0000\u0000\u0003\u00aa\u0001\u0000\u0000\u0000\u0003\u00ac"+ + "\u0001\u0000\u0000\u0000\u0003\u00ae\u0001\u0000\u0000\u0000\u0003\u00b0"+ + "\u0001\u0000\u0000\u0000\u0003\u00b2\u0001\u0000\u0000\u0000\u0003\u00b4"+ + "\u0001\u0000\u0000\u0000\u0004\u00b6\u0001\u0000\u0000\u0000\u0004\u00b8"+ + "\u0001\u0000\u0000\u0000\u0004\u00ba\u0001\u0000\u0000\u0000\u0004\u00bc"+ + "\u0001\u0000\u0000\u0000\u0004\u00be\u0001\u0000\u0000\u0000\u0005\u00c0"+ + "\u0001\u0000\u0000\u0000\u0005\u00d6\u0001\u0000\u0000\u0000\u0005\u00d8"+ + "\u0001\u0000\u0000\u0000\u0005\u00da\u0001\u0000\u0000\u0000\u0005\u00dc"+ + "\u0001\u0000\u0000\u0000\u0005\u00de\u0001\u0000\u0000\u0000\u0005\u00e0"+ + "\u0001\u0000\u0000\u0000\u0005\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\u0005\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8"+ + "\u0001\u0000\u0000\u0000\u0005\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc"+ + "\u0001\u0000\u0000\u0000\u0005\u00fe\u0001\u0000\u0000\u0000\u0005\u0100"+ + "\u0001\u0000\u0000\u0000\u0005\u0102\u0001\u0000\u0000\u0000\u0005\u0104"+ + "\u0001\u0000\u0000\u0000\u0005\u0106\u0001\u0000\u0000\u0000\u0005\u0108"+ + "\u0001\u0000\u0000\u0000\u0005\u010a\u0001\u0000\u0000\u0000\u0005\u010c"+ + "\u0001\u0000\u0000\u0000\u0005\u010e\u0001\u0000\u0000\u0000\u0005\u0110"+ + "\u0001\u0000\u0000\u0000\u0005\u0112\u0001\u0000\u0000\u0000\u0005\u0114"+ + "\u0001\u0000\u0000\u0000\u0005\u0116\u0001\u0000\u0000\u0000\u0005\u0118"+ + "\u0001\u0000\u0000\u0000\u0005\u011a\u0001\u0000\u0000\u0000\u0005\u011c"+ + "\u0001\u0000\u0000\u0000\u0005\u011e\u0001\u0000\u0000\u0000\u0005\u0120"+ + "\u0001\u0000\u0000\u0000\u0005\u0122\u0001\u0000\u0000\u0000\u0005\u0124"+ + "\u0001\u0000\u0000\u0000\u0005\u0126\u0001\u0000\u0000\u0000\u0005\u0128"+ + "\u0001\u0000\u0000\u0000\u0005\u012a\u0001\u0000\u0000\u0000\u0005\u012c"+ + "\u0001\u0000\u0000\u0000\u0005\u012e\u0001\u0000\u0000\u0000\u0005\u0130"+ + "\u0001\u0000\u0000\u0000\u0005\u0132\u0001\u0000\u0000\u0000\u0005\u0134"+ + "\u0001\u0000\u0000\u0000\u0005\u0136\u0001\u0000\u0000\u0000\u0005\u0138"+ + "\u0001\u0000\u0000\u0000\u0005\u013a\u0001\u0000\u0000\u0000\u0005\u013e"+ + "\u0001\u0000\u0000\u0000\u0005\u0140\u0001\u0000\u0000\u0000\u0005\u0142"+ + "\u0001\u0000\u0000\u0000\u0005\u0144\u0001\u0000\u0000\u0000\u0006\u0146"+ + "\u0001\u0000\u0000\u0000\u0006\u0148\u0001\u0000\u0000\u0000\u0006\u014a"+ + "\u0001\u0000\u0000\u0000\u0006\u014c\u0001\u0000\u0000\u0000\u0006\u014e"+ + "\u0001\u0000\u0000\u0000\u0006\u0150\u0001\u0000\u0000\u0000\u0006\u0152"+ + "\u0001\u0000\u0000\u0000\u0006\u0154\u0001\u0000\u0000\u0000\u0006\u0156"+ + "\u0001\u0000\u0000\u0000\u0006\u0158\u0001\u0000\u0000\u0000\u0006\u015a"+ + "\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006\u0160"+ + "\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000\u0006\u0164"+ + "\u0001\u0000\u0000\u0000\u0006\u0166\u0001\u0000\u0000\u0000\u0006\u0168"+ + "\u0001\u0000\u0000\u0000\u0007\u016a\u0001\u0000\u0000\u0000\u0007\u016c"+ + "\u0001\u0000\u0000\u0000\u0007\u016e\u0001\u0000\u0000\u0000\u0007\u0170"+ + "\u0001\u0000\u0000\u0000\u0007\u0172\u0001\u0000\u0000\u0000\u0007\u0174"+ + "\u0001\u0000\u0000\u0000\b\u0176\u0001\u0000\u0000\u0000\b\u0178\u0001"+ + "\u0000\u0000\u0000\b\u017a\u0001\u0000\u0000\u0000\b\u017c\u0001\u0000"+ + "\u0000\u0000\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000"+ + "\u0000\b\u0182\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000"+ + "\b\u0186\u0001\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a"+ + "\u0001\u0000\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\b\u018e\u0001"+ + "\u0000\u0000\u0000\b\u0190\u0001\u0000\u0000\u0000\b\u0192\u0001\u0000"+ + "\u0000\u0000\b\u0194\u0001\u0000\u0000\u0000\b\u0196\u0001\u0000\u0000"+ + "\u0000\b\u0198\u0001\u0000\u0000\u0000\t\u019a\u0001\u0000\u0000\u0000"+ + "\t\u019c\u0001\u0000\u0000\u0000\t\u019e\u0001\u0000\u0000\u0000\t\u01a0"+ + "\u0001\u0000\u0000\u0000\n\u01a2\u0001\u0000\u0000\u0000\n\u01a4\u0001"+ + "\u0000\u0000\u0000\n\u01a6\u0001\u0000\u0000\u0000\n\u01a8\u0001\u0000"+ + "\u0000\u0000\n\u01aa\u0001\u0000\u0000\u0000\n\u01ac\u0001\u0000\u0000"+ + "\u0000\n\u01ae\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000"+ + "\n\u01b2\u0001\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6"+ + "\u0001\u0000\u0000\u0000\u000b\u01b8\u0001\u0000\u0000\u0000\u000b\u01ba"+ + "\u0001\u0000\u0000\u0000\u000b\u01bc\u0001\u0000\u0000\u0000\u000b\u01be"+ + "\u0001\u0000\u0000\u0000\u000b\u01c0\u0001\u0000\u0000\u0000\u000b\u01c2"+ + "\u0001\u0000\u0000\u0000\u000b\u01c4\u0001\u0000\u0000\u0000\u000b\u01c6"+ + "\u0001\u0000\u0000\u0000\u000b\u01c8\u0001\u0000\u0000\u0000\u000b\u01ca"+ + "\u0001\u0000\u0000\u0000\u000b\u01cc\u0001\u0000\u0000\u0000\f\u01ce\u0001"+ + "\u0000\u0000\u0000\f\u01d0\u0001\u0000\u0000\u0000\f\u01d2\u0001\u0000"+ + "\u0000\u0000\f\u01d4\u0001\u0000\u0000\u0000\f\u01d6\u0001\u0000\u0000"+ + "\u0000\f\u01d8\u0001\u0000\u0000\u0000\f\u01da\u0001\u0000\u0000\u0000"+ + "\f\u01dc\u0001\u0000\u0000\u0000\r\u01de\u0001\u0000\u0000\u0000\r\u01e0"+ + "\u0001\u0000\u0000\u0000\r\u01e2\u0001\u0000\u0000\u0000\r\u01e4\u0001"+ + "\u0000\u0000\u0000\r\u01e6\u0001\u0000\u0000\u0000\r\u01e8\u0001\u0000"+ + "\u0000\u0000\r\u01ea\u0001\u0000\u0000\u0000\r\u01ec\u0001\u0000\u0000"+ + "\u0000\r\u01ee\u0001\u0000\u0000\u0000\r\u01f0\u0001\u0000\u0000\u0000"+ + "\r\u01f2\u0001\u0000\u0000\u0000\r\u01f4\u0001\u0000\u0000\u0000\r\u01f6"+ + "\u0001\u0000\u0000\u0000\r\u01f8\u0001\u0000\u0000\u0000\r\u01fa\u0001"+ + "\u0000\u0000\u0000\r\u01fc\u0001\u0000\u0000\u0000\r\u01fe\u0001\u0000"+ + "\u0000\u0000\r\u0200\u0001\u0000\u0000\u0000\r\u0202\u0001\u0000\u0000"+ + "\u0000\u000e\u0204\u0001\u0000\u0000\u0000\u000e\u0206\u0001\u0000\u0000"+ + "\u0000\u000e\u0208\u0001\u0000\u0000\u0000\u000e\u020a\u0001\u0000\u0000"+ + "\u0000\u000e\u020c\u0001\u0000\u0000\u0000\u000e\u020e\u0001\u0000\u0000"+ + "\u0000\u000e\u0210\u0001\u0000\u0000\u0000\u000e\u0212\u0001\u0000\u0000"+ + "\u0000\u000e\u0214\u0001\u0000\u0000\u0000\u000e\u0216\u0001\u0000\u0000"+ + "\u0000\u000e\u0218\u0001\u0000\u0000\u0000\u000e\u021a\u0001\u0000\u0000"+ + "\u0000\u000e\u021c\u0001\u0000\u0000\u0000\u000e\u021e\u0001\u0000\u0000"+ + "\u0000\u000f\u0220\u0001\u0000\u0000\u0000\u000f\u0222\u0001\u0000\u0000"+ + "\u0000\u000f\u0224\u0001\u0000\u0000\u0000\u000f\u0226\u0001\u0000\u0000"+ + "\u0000\u000f\u0228\u0001\u0000\u0000\u0000\u000f\u022a\u0001\u0000\u0000"+ + "\u0000\u000f\u022c\u0001\u0000\u0000\u0000\u000f\u022e\u0001\u0000\u0000"+ + "\u0000\u000f\u0230\u0001\u0000\u0000\u0000\u000f\u0232\u0001\u0000\u0000"+ + "\u0000\u000f\u0238\u0001\u0000\u0000\u0000\u000f\u023a\u0001\u0000\u0000"+ + "\u0000\u000f\u023c\u0001\u0000\u0000\u0000\u000f\u023e\u0001\u0000\u0000"+ + "\u0000\u0010\u0240\u0001\u0000\u0000\u0000\u0010\u0242\u0001\u0000\u0000"+ + "\u0000\u0010\u0244\u0001\u0000\u0000\u0000\u0010\u0246\u0001\u0000\u0000"+ + "\u0000\u0010\u0248\u0001\u0000\u0000\u0000\u0010\u024a\u0001\u0000\u0000"+ + "\u0000\u0010\u024c\u0001\u0000\u0000\u0000\u0010\u024e\u0001\u0000\u0000"+ + "\u0000\u0010\u0250\u0001\u0000\u0000\u0000\u0010\u0252\u0001\u0000\u0000"+ + "\u0000\u0010\u0254\u0001\u0000\u0000\u0000\u0010\u0256\u0001\u0000\u0000"+ + "\u0000\u0010\u0258\u0001\u0000\u0000\u0000\u0010\u025a\u0001\u0000\u0000"+ + "\u0000\u0010\u025c\u0001\u0000\u0000\u0000\u0010\u025e\u0001\u0000\u0000"+ + "\u0000\u0010\u0260\u0001\u0000\u0000\u0000\u0010\u0262\u0001\u0000\u0000"+ + "\u0000\u0010\u0264\u0001\u0000\u0000\u0000\u0011\u0266\u0001\u0000\u0000"+ + "\u0000\u0011\u0268\u0001\u0000\u0000\u0000\u0011\u026a\u0001\u0000\u0000"+ + "\u0000\u0011\u026c\u0001\u0000\u0000\u0000\u0011\u026e\u0001\u0000\u0000"+ + "\u0000\u0011\u0270\u0001\u0000\u0000\u0000\u0011\u0272\u0001\u0000\u0000"+ + "\u0000\u0011\u0274\u0001\u0000\u0000\u0000\u0011\u0276\u0001\u0000\u0000"+ + "\u0000\u0011\u0278\u0001\u0000\u0000\u0000\u0011\u027a\u0001\u0000\u0000"+ + "\u0000\u0011\u027c\u0001\u0000\u0000\u0000\u0011\u027e\u0001\u0000\u0000"+ + "\u0000\u0011\u0280\u0001\u0000\u0000\u0000\u0011\u0282\u0001\u0000\u0000"+ + "\u0000\u0011\u0284\u0001\u0000\u0000\u0000\u0012\u0286\u0001\u0000\u0000"+ + "\u0000\u0012\u0288\u0001\u0000\u0000\u0000\u0012\u028a\u0001\u0000\u0000"+ + "\u0000\u0012\u028c\u0001\u0000\u0000\u0000\u0012\u028e\u0001\u0000\u0000"+ + "\u0000\u0012\u0290\u0001\u0000\u0000\u0000\u0012\u0292\u0001\u0000\u0000"+ + "\u0000\u0012\u0294\u0001\u0000\u0000\u0000\u0012\u0296\u0001\u0000\u0000"+ + "\u0000\u0012\u0298\u0001\u0000\u0000\u0000\u0012\u029a\u0001\u0000\u0000"+ + "\u0000\u0012\u029c\u0001\u0000\u0000\u0000\u0012\u029e\u0001\u0000\u0000"+ + "\u0000\u0012\u02a0\u0001\u0000\u0000\u0000\u0012\u02a2\u0001\u0000\u0000"+ + "\u0000\u0012\u02a4\u0001\u0000\u0000\u0000\u0012\u02a6\u0001\u0000\u0000"+ + "\u0000\u0012\u02a8\u0001\u0000\u0000\u0000\u0012\u02aa\u0001\u0000\u0000"+ + "\u0000\u0012\u02ac\u0001\u0000\u0000\u0000\u0012\u02ae\u0001\u0000\u0000"+ + "\u0000\u0012\u02b0\u0001\u0000\u0000\u0000\u0012\u02b2\u0001\u0000\u0000"+ + "\u0000\u0012\u02b4\u0001\u0000\u0000\u0000\u0012\u02b6\u0001\u0000\u0000"+ + "\u0000\u0013\u02b8\u0001\u0000\u0000\u0000\u0013\u02ba\u0001\u0000\u0000"+ + "\u0000\u0013\u02bc\u0001\u0000\u0000\u0000\u0013\u02be\u0001\u0000\u0000"+ + "\u0000\u0013\u02c0\u0001\u0000\u0000\u0000\u0014\u02c2\u0001\u0000\u0000"+ + "\u0000\u0016\u02d3\u0001\u0000\u0000\u0000\u0018\u02e3\u0001\u0000\u0000"+ + "\u0000\u001a\u02e9\u0001\u0000\u0000\u0000\u001c\u02f8\u0001\u0000\u0000"+ + "\u0000\u001e\u0301\u0001\u0000\u0000\u0000 \u030c\u0001\u0000\u0000\u0000"+ + "\"\u0319\u0001\u0000\u0000\u0000$\u0323\u0001\u0000\u0000\u0000&\u032a"+ + "\u0001\u0000\u0000\u0000(\u0331\u0001\u0000\u0000\u0000*\u0339\u0001\u0000"+ + "\u0000\u0000,\u0342\u0001\u0000\u0000\u0000.\u0348\u0001\u0000\u0000\u0000"+ + "0\u0351\u0001\u0000\u0000\u00002\u0358\u0001\u0000\u0000\u00004\u0360"+ + "\u0001\u0000\u0000\u00006\u0368\u0001\u0000\u0000\u00008\u0374\u0001\u0000"+ + "\u0000\u0000:\u037b\u0001\u0000\u0000\u0000<\u0380\u0001\u0000\u0000\u0000"+ + ">\u038c\u0001\u0000\u0000\u0000@\u0393\u0001\u0000\u0000\u0000B\u039a"+ + "\u0001\u0000\u0000\u0000D\u03a3\u0001\u0000\u0000\u0000F\u03b1\u0001\u0000"+ + "\u0000\u0000H\u03ba\u0001\u0000\u0000\u0000J\u03c2\u0001\u0000\u0000\u0000"+ + "L\u03ca\u0001\u0000\u0000\u0000N\u03d3\u0001\u0000\u0000\u0000P\u03df"+ + "\u0001\u0000\u0000\u0000R\u03e6\u0001\u0000\u0000\u0000T\u03f2\u0001\u0000"+ + "\u0000\u0000V\u03f9\u0001\u0000\u0000\u0000X\u0400\u0001\u0000\u0000\u0000"+ + "Z\u040c\u0001\u0000\u0000\u0000\\\u0415\u0001\u0000\u0000\u0000^\u041e"+ + "\u0001\u0000\u0000\u0000`\u0424\u0001\u0000\u0000\u0000b\u042c\u0001\u0000"+ + "\u0000\u0000d\u0432\u0001\u0000\u0000\u0000f\u0437\u0001\u0000\u0000\u0000"+ + "h\u043d\u0001\u0000\u0000\u0000j\u0441\u0001\u0000\u0000\u0000l\u0445"+ + "\u0001\u0000\u0000\u0000n\u0449\u0001\u0000\u0000\u0000p\u044d\u0001\u0000"+ + "\u0000\u0000r\u0451\u0001\u0000\u0000\u0000t\u0455\u0001\u0000\u0000\u0000"+ + "v\u0459\u0001\u0000\u0000\u0000x\u045d\u0001\u0000\u0000\u0000z\u0461"+ + "\u0001\u0000\u0000\u0000|\u0465\u0001\u0000\u0000\u0000~\u0469\u0001\u0000"+ + "\u0000\u0000\u0080\u046e\u0001\u0000\u0000\u0000\u0082\u0474\u0001\u0000"+ + "\u0000\u0000\u0084\u0479\u0001\u0000\u0000\u0000\u0086\u047e\u0001\u0000"+ + "\u0000\u0000\u0088\u0487\u0001\u0000\u0000\u0000\u008a\u048e\u0001\u0000"+ + "\u0000\u0000\u008c\u0492\u0001\u0000\u0000\u0000\u008e\u0496\u0001\u0000"+ + "\u0000\u0000\u0090\u049a\u0001\u0000\u0000\u0000\u0092\u049e\u0001\u0000"+ + "\u0000\u0000\u0094\u04a2\u0001\u0000\u0000\u0000\u0096\u04a8\u0001\u0000"+ + "\u0000\u0000\u0098\u04af\u0001\u0000\u0000\u0000\u009a\u04b3\u0001\u0000"+ + "\u0000\u0000\u009c\u04b7\u0001\u0000\u0000\u0000\u009e\u04bb\u0001\u0000"+ + "\u0000\u0000\u00a0\u04bf\u0001\u0000\u0000\u0000\u00a2\u04c3\u0001\u0000"+ + "\u0000\u0000\u00a4\u04c7\u0001\u0000\u0000\u0000\u00a6\u04cb\u0001\u0000"+ + "\u0000\u0000\u00a8\u04cf\u0001\u0000\u0000\u0000\u00aa\u04d3\u0001\u0000"+ + "\u0000\u0000\u00ac\u04d7\u0001\u0000\u0000\u0000\u00ae\u04db\u0001\u0000"+ + "\u0000\u0000\u00b0\u04df\u0001\u0000\u0000\u0000\u00b2\u04e3\u0001\u0000"+ + "\u0000\u0000\u00b4\u04e7\u0001\u0000\u0000\u0000\u00b6\u04eb\u0001\u0000"+ + "\u0000\u0000\u00b8\u04f0\u0001\u0000\u0000\u0000\u00ba\u04f5\u0001\u0000"+ + "\u0000\u0000\u00bc\u04f9\u0001\u0000\u0000\u0000\u00be\u04fd\u0001\u0000"+ + "\u0000\u0000\u00c0\u0501\u0001\u0000\u0000\u0000\u00c2\u0505\u0001\u0000"+ + "\u0000\u0000\u00c4\u0507\u0001\u0000\u0000\u0000\u00c6\u0509\u0001\u0000"+ + "\u0000\u0000\u00c8\u050c\u0001\u0000\u0000\u0000\u00ca\u050e\u0001\u0000"+ + "\u0000\u0000\u00cc\u0517\u0001\u0000\u0000\u0000\u00ce\u0519\u0001\u0000"+ + "\u0000\u0000\u00d0\u051e\u0001\u0000\u0000\u0000\u00d2\u0520\u0001\u0000"+ + "\u0000\u0000\u00d4\u0525\u0001\u0000\u0000\u0000\u00d6\u0544\u0001\u0000"+ + "\u0000\u0000\u00d8\u0547\u0001\u0000\u0000\u0000\u00da\u0575\u0001\u0000"+ + "\u0000\u0000\u00dc\u0577\u0001\u0000\u0000\u0000\u00de\u057b\u0001\u0000"+ + "\u0000\u0000\u00e0\u057f\u0001\u0000\u0000\u0000\u00e2\u0581\u0001\u0000"+ + "\u0000\u0000\u00e4\u0584\u0001\u0000\u0000\u0000\u00e6\u0587\u0001\u0000"+ + "\u0000\u0000\u00e8\u0589\u0001\u0000\u0000\u0000\u00ea\u058b\u0001\u0000"+ + "\u0000\u0000\u00ec\u058d\u0001\u0000\u0000\u0000\u00ee\u0592\u0001\u0000"+ + "\u0000\u0000\u00f0\u0594\u0001\u0000\u0000\u0000\u00f2\u059a\u0001\u0000"+ + "\u0000\u0000\u00f4\u05a0\u0001\u0000\u0000\u0000\u00f6\u05a3\u0001\u0000"+ + "\u0000\u0000\u00f8\u05a6\u0001\u0000\u0000\u0000\u00fa\u05ab\u0001\u0000"+ + "\u0000\u0000\u00fc\u05b0\u0001\u0000\u0000\u0000\u00fe\u05b4\u0001\u0000"+ + "\u0000\u0000\u0100\u05b9\u0001\u0000\u0000\u0000\u0102\u05bf\u0001\u0000"+ + "\u0000\u0000\u0104\u05c2\u0001\u0000\u0000\u0000\u0106\u05c5\u0001\u0000"+ + "\u0000\u0000\u0108\u05c7\u0001\u0000\u0000\u0000\u010a\u05cd\u0001\u0000"+ + "\u0000\u0000\u010c\u05d2\u0001\u0000\u0000\u0000\u010e\u05d7\u0001\u0000"+ + "\u0000\u0000\u0110\u05da\u0001\u0000\u0000\u0000\u0112\u05dd\u0001\u0000"+ + "\u0000\u0000\u0114\u05e0\u0001\u0000\u0000\u0000\u0116\u05e2\u0001\u0000"+ + "\u0000\u0000\u0118\u05e5\u0001\u0000\u0000\u0000\u011a\u05e7\u0001\u0000"+ + "\u0000\u0000\u011c\u05ea\u0001\u0000\u0000\u0000\u011e\u05ec\u0001\u0000"+ + "\u0000\u0000\u0120\u05ee\u0001\u0000\u0000\u0000\u0122\u05f0\u0001\u0000"+ + "\u0000\u0000\u0124\u05f2\u0001\u0000\u0000\u0000\u0126\u05f4\u0001\u0000"+ + "\u0000\u0000\u0128\u05f6\u0001\u0000\u0000\u0000\u012a\u05f8\u0001\u0000"+ + "\u0000\u0000\u012c\u05fb\u0001\u0000\u0000\u0000\u012e\u0610\u0001\u0000"+ + "\u0000\u0000\u0130\u0623\u0001\u0000\u0000\u0000\u0132\u0625\u0001\u0000"+ + "\u0000\u0000\u0134\u062a\u0001\u0000\u0000\u0000\u0136\u062f\u0001\u0000"+ + "\u0000\u0000\u0138\u0634\u0001\u0000\u0000\u0000\u013a\u0649\u0001\u0000"+ + "\u0000\u0000\u013c\u064b\u0001\u0000\u0000\u0000\u013e\u0653\u0001\u0000"+ + "\u0000\u0000\u0140\u0655\u0001\u0000\u0000\u0000\u0142\u0659\u0001\u0000"+ + "\u0000\u0000\u0144\u065d\u0001\u0000\u0000\u0000\u0146\u0661\u0001\u0000"+ + "\u0000\u0000\u0148\u0666\u0001\u0000\u0000\u0000\u014a\u066a\u0001\u0000"+ + "\u0000\u0000\u014c\u066e\u0001\u0000\u0000\u0000\u014e\u0672\u0001\u0000"+ + "\u0000\u0000\u0150\u0676\u0001\u0000\u0000\u0000\u0152\u067f\u0001\u0000"+ + "\u0000\u0000\u0154\u0685\u0001\u0000\u0000\u0000\u0156\u0689\u0001\u0000"+ + "\u0000\u0000\u0158\u068d\u0001\u0000\u0000\u0000\u015a\u0693\u0001\u0000"+ + "\u0000\u0000\u015c\u069b\u0001\u0000\u0000\u0000\u015e\u069e\u0001\u0000"+ + "\u0000\u0000\u0160\u06a2\u0001\u0000\u0000\u0000\u0162\u06a6\u0001\u0000"+ + "\u0000\u0000\u0164\u06aa\u0001\u0000\u0000\u0000\u0166\u06ae\u0001\u0000"+ + "\u0000\u0000\u0168\u06b2\u0001\u0000\u0000\u0000\u016a\u06b6\u0001\u0000"+ + "\u0000\u0000\u016c\u06bb\u0001\u0000\u0000\u0000\u016e\u06c1\u0001\u0000"+ + "\u0000\u0000\u0170\u06c6\u0001\u0000\u0000\u0000\u0172\u06ca\u0001\u0000"+ + "\u0000\u0000\u0174\u06ce\u0001\u0000\u0000\u0000\u0176\u06d2\u0001\u0000"+ + "\u0000\u0000\u0178\u06d7\u0001\u0000\u0000\u0000\u017a\u06dd\u0001\u0000"+ + "\u0000\u0000\u017c\u06e3\u0001\u0000\u0000\u0000\u017e\u06e9\u0001\u0000"+ + "\u0000\u0000\u0180\u06ed\u0001\u0000\u0000\u0000\u0182\u06f3\u0001\u0000"+ + "\u0000\u0000\u0184\u06f7\u0001\u0000\u0000\u0000\u0186\u06fb\u0001\u0000"+ + "\u0000\u0000\u0188\u06ff\u0001\u0000\u0000\u0000\u018a\u0703\u0001\u0000"+ + "\u0000\u0000\u018c\u0707\u0001\u0000\u0000\u0000\u018e\u070b\u0001\u0000"+ + "\u0000\u0000\u0190\u070f\u0001\u0000\u0000\u0000\u0192\u0713\u0001\u0000"+ + "\u0000\u0000\u0194\u0717\u0001\u0000\u0000\u0000\u0196\u071b\u0001\u0000"+ + "\u0000\u0000\u0198\u071f\u0001\u0000\u0000\u0000\u019a\u0723\u0001\u0000"+ + "\u0000\u0000\u019c\u072c\u0001\u0000\u0000\u0000\u019e\u0730\u0001\u0000"+ + "\u0000\u0000\u01a0\u0734\u0001\u0000\u0000\u0000\u01a2\u0738\u0001\u0000"+ + "\u0000\u0000\u01a4\u073d\u0001\u0000\u0000\u0000\u01a6\u0742\u0001\u0000"+ + "\u0000\u0000\u01a8\u0746\u0001\u0000\u0000\u0000\u01aa\u074c\u0001\u0000"+ + "\u0000\u0000\u01ac\u0755\u0001\u0000\u0000\u0000\u01ae\u0759\u0001\u0000"+ + "\u0000\u0000\u01b0\u075d\u0001\u0000\u0000\u0000\u01b2\u0761\u0001\u0000"+ + "\u0000\u0000\u01b4\u0765\u0001\u0000\u0000\u0000\u01b6\u0769\u0001\u0000"+ + "\u0000\u0000\u01b8\u076d\u0001\u0000\u0000\u0000\u01ba\u0772\u0001\u0000"+ + "\u0000\u0000\u01bc\u0778\u0001\u0000\u0000\u0000\u01be\u077c\u0001\u0000"+ + "\u0000\u0000\u01c0\u0780\u0001\u0000\u0000\u0000\u01c2\u0784\u0001\u0000"+ + "\u0000\u0000\u01c4\u0789\u0001\u0000\u0000\u0000\u01c6\u078d\u0001\u0000"+ + "\u0000\u0000\u01c8\u0791\u0001\u0000\u0000\u0000\u01ca\u0795\u0001\u0000"+ + "\u0000\u0000\u01cc\u0799\u0001\u0000\u0000\u0000\u01ce\u079d\u0001\u0000"+ + "\u0000\u0000\u01d0\u07a3\u0001\u0000\u0000\u0000\u01d2\u07aa\u0001\u0000"+ + "\u0000\u0000\u01d4\u07ae\u0001\u0000\u0000\u0000\u01d6\u07b2\u0001\u0000"+ + "\u0000\u0000\u01d8\u07b6\u0001\u0000\u0000\u0000\u01da\u07ba\u0001\u0000"+ + "\u0000\u0000\u01dc\u07be\u0001\u0000\u0000\u0000\u01de\u07c2\u0001\u0000"+ + "\u0000\u0000\u01e0\u07c7\u0001\u0000\u0000\u0000\u01e2\u07cb\u0001\u0000"+ + "\u0000\u0000\u01e4\u07cf\u0001\u0000\u0000\u0000\u01e6\u07d3\u0001\u0000"+ + "\u0000\u0000\u01e8\u07d7\u0001\u0000\u0000\u0000\u01ea\u07db\u0001\u0000"+ + "\u0000\u0000\u01ec\u07df\u0001\u0000\u0000\u0000\u01ee\u07e3\u0001\u0000"+ + "\u0000\u0000\u01f0\u07e7\u0001\u0000\u0000\u0000\u01f2\u07eb\u0001\u0000"+ + "\u0000\u0000\u01f4\u07ef\u0001\u0000\u0000\u0000\u01f6\u07f3\u0001\u0000"+ + "\u0000\u0000\u01f8\u07f7\u0001\u0000\u0000\u0000\u01fa\u07fb\u0001\u0000"+ + "\u0000\u0000\u01fc\u07ff\u0001\u0000\u0000\u0000\u01fe\u0803\u0001\u0000"+ + "\u0000\u0000\u0200\u0807\u0001\u0000\u0000\u0000\u0202\u080b\u0001\u0000"+ + "\u0000\u0000\u0204\u080f\u0001\u0000\u0000\u0000\u0206\u0814\u0001\u0000"+ + "\u0000\u0000\u0208\u081a\u0001\u0000\u0000\u0000\u020a\u081e\u0001\u0000"+ + "\u0000\u0000\u020c\u0822\u0001\u0000\u0000\u0000\u020e\u0826\u0001\u0000"+ + "\u0000\u0000\u0210\u082a\u0001\u0000\u0000\u0000\u0212\u082e\u0001\u0000"+ + "\u0000\u0000\u0214\u0832\u0001\u0000\u0000\u0000\u0216\u0836\u0001\u0000"+ + "\u0000\u0000\u0218\u083a\u0001\u0000\u0000\u0000\u021a\u083e\u0001\u0000"+ + "\u0000\u0000\u021c\u0842\u0001\u0000\u0000\u0000\u021e\u0846\u0001\u0000"+ + "\u0000\u0000\u0220\u084a\u0001\u0000\u0000\u0000\u0222\u084f\u0001\u0000"+ + "\u0000\u0000\u0224\u0855\u0001\u0000\u0000\u0000\u0226\u0859\u0001\u0000"+ + "\u0000\u0000\u0228\u085d\u0001\u0000\u0000\u0000\u022a\u0861\u0001\u0000"+ + "\u0000\u0000\u022c\u0865\u0001\u0000\u0000\u0000\u022e\u0869\u0001\u0000"+ + "\u0000\u0000\u0230\u086d\u0001\u0000\u0000\u0000\u0232\u0871\u0001\u0000"+ + "\u0000\u0000\u0234\u0879\u0001\u0000\u0000\u0000\u0236\u088e\u0001\u0000"+ + "\u0000\u0000\u0238\u0892\u0001\u0000\u0000\u0000\u023a\u0896\u0001\u0000"+ + "\u0000\u0000\u023c\u089a\u0001\u0000\u0000\u0000\u023e\u089e\u0001\u0000"+ + "\u0000\u0000\u0240\u08a2\u0001\u0000\u0000\u0000\u0242\u08a6\u0001\u0000"+ + "\u0000\u0000\u0244\u08aa\u0001\u0000\u0000\u0000\u0246\u08ae\u0001\u0000"+ + "\u0000\u0000\u0248\u08b2\u0001\u0000\u0000\u0000\u024a\u08b6\u0001\u0000"+ + "\u0000\u0000\u024c\u08ba\u0001\u0000\u0000\u0000\u024e\u08be\u0001\u0000"+ + "\u0000\u0000\u0250\u08c2\u0001\u0000\u0000\u0000\u0252\u08c6\u0001\u0000"+ + "\u0000\u0000\u0254\u08cb\u0001\u0000\u0000\u0000\u0256\u08d0\u0001\u0000"+ + "\u0000\u0000\u0258\u08d6\u0001\u0000\u0000\u0000\u025a\u08dd\u0001\u0000"+ + "\u0000\u0000\u025c\u08e1\u0001\u0000\u0000\u0000\u025e\u08e5\u0001\u0000"+ + "\u0000\u0000\u0260\u08e9\u0001\u0000\u0000\u0000\u0262\u08f6\u0001\u0000"+ + "\u0000\u0000\u0264\u0901\u0001\u0000\u0000\u0000\u0266\u0903\u0001\u0000"+ + "\u0000\u0000\u0268\u0908\u0001\u0000\u0000\u0000\u026a\u090e\u0001\u0000"+ + "\u0000\u0000\u026c\u0912\u0001\u0000\u0000\u0000\u026e\u0916\u0001\u0000"+ + "\u0000\u0000\u0270\u091a\u0001\u0000\u0000\u0000\u0272\u091e\u0001\u0000"+ + "\u0000\u0000\u0274\u0922\u0001\u0000\u0000\u0000\u0276\u0926\u0001\u0000"+ + "\u0000\u0000\u0278\u092a\u0001\u0000\u0000\u0000\u027a\u092e\u0001\u0000"+ + "\u0000\u0000\u027c\u0932\u0001\u0000\u0000\u0000\u027e\u0935\u0001\u0000"+ + "\u0000\u0000\u0280\u0939\u0001\u0000\u0000\u0000\u0282\u093d\u0001\u0000"+ + "\u0000\u0000\u0284\u0941\u0001\u0000\u0000\u0000\u0286\u0945\u0001\u0000"+ + "\u0000\u0000\u0288\u0949\u0001\u0000\u0000\u0000\u028a\u094d\u0001\u0000"+ + "\u0000\u0000\u028c\u0951\u0001\u0000\u0000\u0000\u028e\u0956\u0001\u0000"+ + "\u0000\u0000\u0290\u095a\u0001\u0000\u0000\u0000\u0292\u095e\u0001\u0000"+ + "\u0000\u0000\u0294\u0962\u0001\u0000\u0000\u0000\u0296\u0966\u0001\u0000"+ + "\u0000\u0000\u0298\u096a\u0001\u0000\u0000\u0000\u029a\u096e\u0001\u0000"+ + "\u0000\u0000\u029c\u0972\u0001\u0000\u0000\u0000\u029e\u0976\u0001\u0000"+ + "\u0000\u0000\u02a0\u097a\u0001\u0000\u0000\u0000\u02a2\u097e\u0001\u0000"+ + "\u0000\u0000\u02a4\u0982\u0001\u0000\u0000\u0000\u02a6\u0986\u0001\u0000"+ + "\u0000\u0000\u02a8\u098a\u0001\u0000\u0000\u0000\u02aa\u098e\u0001\u0000"+ + "\u0000\u0000\u02ac\u0992\u0001\u0000\u0000\u0000\u02ae\u0996\u0001\u0000"+ + "\u0000\u0000\u02b0\u099a\u0001\u0000\u0000\u0000\u02b2\u099e\u0001\u0000"+ + "\u0000\u0000\u02b4\u09a2\u0001\u0000\u0000\u0000\u02b6\u09a6\u0001\u0000"+ + "\u0000\u0000\u02b8\u09aa\u0001\u0000\u0000\u0000\u02ba\u09af\u0001\u0000"+ + "\u0000\u0000\u02bc\u09b4\u0001\u0000\u0000\u0000\u02be\u09b8\u0001\u0000"+ + "\u0000\u0000\u02c0\u09bc\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005/\u0000"+ + "\u0000\u02c3\u02c4\u0005/\u0000\u0000\u02c4\u02c8\u0001\u0000\u0000\u0000"+ + "\u02c5\u02c7\b\u0000\u0000\u0000\u02c6\u02c5\u0001\u0000\u0000\u0000\u02c7"+ + "\u02ca\u0001\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8"+ + "\u02c9\u0001\u0000\u0000\u0000\u02c9\u02cc\u0001\u0000\u0000\u0000\u02ca"+ + "\u02c8\u0001\u0000\u0000\u0000\u02cb\u02cd\u0005\r\u0000\u0000\u02cc\u02cb"+ + "\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02cf"+ + "\u0001\u0000\u0000\u0000\u02ce\u02d0\u0005\n\u0000\u0000\u02cf\u02ce\u0001"+ + "\u0000\u0000\u0000\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0\u02d1\u0001"+ + "\u0000\u0000\u0000\u02d1\u02d2\u0006\u0000\u0000\u0000\u02d2\u0015\u0001"+ + "\u0000\u0000\u0000\u02d3\u02d4\u0005/\u0000\u0000\u02d4\u02d5\u0005*\u0000"+ + "\u0000\u02d5\u02da\u0001\u0000\u0000\u0000\u02d6\u02d9\u0003\u0016\u0001"+ + "\u0000\u02d7\u02d9\t\u0000\u0000\u0000\u02d8\u02d6\u0001\u0000\u0000\u0000"+ + "\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d9\u02dc\u0001\u0000\u0000\u0000"+ + "\u02da\u02db\u0001\u0000\u0000\u0000\u02da\u02d8\u0001\u0000\u0000\u0000"+ + "\u02db\u02dd\u0001\u0000\u0000\u0000\u02dc\u02da\u0001\u0000\u0000\u0000"+ + "\u02dd\u02de\u0005*\u0000\u0000\u02de\u02df\u0005/\u0000\u0000\u02df\u02e0"+ + "\u0001\u0000\u0000\u0000\u02e0\u02e1\u0006\u0001\u0000\u0000\u02e1\u0017"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e4\u0007\u0001\u0000\u0000\u02e3\u02e2"+ + "\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000\u0000\u02e5\u02e3"+ + "\u0001\u0000\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7"+ + "\u0001\u0000\u0000\u0000\u02e7\u02e8\u0006\u0002\u0000\u0000\u02e8\u0019"+ + "\u0001\u0000\u0000\u0000\u02e9\u02ea\u0007\u0002\u0000\u0000\u02ea\u02eb"+ + "\u0007\u0003\u0000\u0000\u02eb\u02ec\u0007\u0004\u0000\u0000\u02ec\u02ed"+ + "\u0007\u0005\u0000\u0000\u02ed\u02ee\u0007\u0006\u0000\u0000\u02ee\u02ef"+ + "\u0007\u0007\u0000\u0000\u02ef\u02f0\u0005_\u0000\u0000\u02f0\u02f1\u0007"+ + "\b\u0000\u0000\u02f1\u02f2\u0007\t\u0000\u0000\u02f2\u02f3\u0007\n\u0000"+ + "\u0000\u02f3\u02f4\u0007\u0005\u0000\u0000\u02f4\u02f5\u0007\u000b\u0000"+ + "\u0000\u02f5\u02f6\u0001\u0000\u0000\u0000\u02f6\u02f7\u0006\u0003\u0001"+ + "\u0000\u02f7\u001b\u0001\u0000\u0000\u0000\u02f8\u02f9\u0007\u0007\u0000"+ + "\u0000\u02f9\u02fa\u0007\u0005\u0000\u0000\u02fa\u02fb\u0007\f\u0000\u0000"+ + "\u02fb\u02fc\u0007\n\u0000\u0000\u02fc\u02fd\u0007\u0002\u0000\u0000\u02fd"+ + "\u02fe\u0007\u0003\u0000\u0000\u02fe\u02ff\u0001\u0000\u0000\u0000\u02ff"+ + "\u0300\u0006\u0004\u0002\u0000\u0300\u001d\u0001\u0000\u0000\u0000\u0301"+ + "\u0302\u0004\u0005\u0000\u0000\u0302\u0303\u0007\u0007\u0000\u0000\u0303"+ + "\u0304\u0007\r\u0000\u0000\u0304\u0305\u0007\b\u0000\u0000\u0305\u0306"+ + "\u0007\u000e\u0000\u0000\u0306\u0307\u0007\u0004\u0000\u0000\u0307\u0308"+ + "\u0007\n\u0000\u0000\u0308\u0309\u0007\u0005\u0000\u0000\u0309\u030a\u0001"+ + "\u0000\u0000\u0000\u030a\u030b\u0006\u0005\u0003\u0000\u030b\u001f\u0001"+ + "\u0000\u0000\u0000\u030c\u030d\u0007\u0002\u0000\u0000\u030d\u030e\u0007"+ + "\t\u0000\u0000\u030e\u030f\u0007\u000f\u0000\u0000\u030f\u0310\u0007\b"+ + "\u0000\u0000\u0310\u0311\u0007\u000e\u0000\u0000\u0311\u0312\u0007\u0007"+ + "\u0000\u0000\u0312\u0313\u0007\u000b\u0000\u0000\u0313\u0314\u0007\n\u0000"+ + "\u0000\u0314\u0315\u0007\t\u0000\u0000\u0315\u0316\u0007\u0005\u0000\u0000"+ + "\u0316\u0317\u0001\u0000\u0000\u0000\u0317\u0318\u0006\u0006\u0004\u0000"+ + "\u0318!\u0001\u0000\u0000\u0000\u0319\u031a\u0007\u0010\u0000\u0000\u031a"+ + "\u031b\u0007\n\u0000\u0000\u031b\u031c\u0007\u0011\u0000\u0000\u031c\u031d"+ + "\u0007\u0011\u0000\u0000\u031d\u031e\u0007\u0007\u0000\u0000\u031e\u031f"+ + "\u0007\u0002\u0000\u0000\u031f\u0320\u0007\u000b\u0000\u0000\u0320\u0321"+ + "\u0001\u0000\u0000\u0000\u0321\u0322\u0006\u0007\u0004\u0000\u0322#\u0001"+ + "\u0000\u0000\u0000\u0323\u0324\u0007\u0007\u0000\u0000\u0324\u0325\u0007"+ + "\u0012\u0000\u0000\u0325\u0326\u0007\u0004\u0000\u0000\u0326\u0327\u0007"+ + "\u000e\u0000\u0000\u0327\u0328\u0001\u0000\u0000\u0000\u0328\u0329\u0006"+ + "\b\u0004\u0000\u0329%\u0001\u0000\u0000\u0000\u032a\u032b\u0007\u0006"+ + "\u0000\u0000\u032b\u032c\u0007\f\u0000\u0000\u032c\u032d\u0007\t\u0000"+ + "\u0000\u032d\u032e\u0007\u0013\u0000\u0000\u032e\u032f\u0001\u0000\u0000"+ + "\u0000\u032f\u0330\u0006\t\u0004\u0000\u0330\'\u0001\u0000\u0000\u0000"+ + "\u0331\u0332\u0007\u000e\u0000\u0000\u0332\u0333\u0007\n\u0000\u0000\u0333"+ + "\u0334\u0007\u000f\u0000\u0000\u0334\u0335\u0007\n\u0000\u0000\u0335\u0336"+ + "\u0007\u000b\u0000\u0000\u0336\u0337\u0001\u0000\u0000\u0000\u0337\u0338"+ + "\u0006\n\u0004\u0000\u0338)\u0001\u0000\u0000\u0000\u0339\u033a\u0007"+ + "\f\u0000\u0000\u033a\u033b\u0007\u0007\u0000\u0000\u033b\u033c\u0007\f"+ + "\u0000\u0000\u033c\u033d\u0007\u0004\u0000\u0000\u033d\u033e\u0007\u0005"+ + "\u0000\u0000\u033e\u033f\u0007\u0013\u0000\u0000\u033f\u0340\u0001\u0000"+ + "\u0000\u0000\u0340\u0341\u0006\u000b\u0004\u0000\u0341+\u0001\u0000\u0000"+ + "\u0000\u0342\u0343\u0007\f\u0000\u0000\u0343\u0344\u0007\t\u0000\u0000"+ + "\u0344\u0345\u0007\u0014\u0000\u0000\u0345\u0346\u0001\u0000\u0000\u0000"+ + "\u0346\u0347\u0006\f\u0004\u0000\u0347-\u0001\u0000\u0000\u0000\u0348"+ + "\u0349\u0007\u0011\u0000\u0000\u0349\u034a\u0007\u0004\u0000\u0000\u034a"+ + "\u034b\u0007\u000f\u0000\u0000\u034b\u034c\u0007\b\u0000\u0000\u034c\u034d"+ + "\u0007\u000e\u0000\u0000\u034d\u034e\u0007\u0007\u0000\u0000\u034e\u034f"+ + "\u0001\u0000\u0000\u0000\u034f\u0350\u0006\r\u0004\u0000\u0350/\u0001"+ + "\u0000\u0000\u0000\u0351\u0352\u0007\u0011\u0000\u0000\u0352\u0353\u0007"+ + "\t\u0000\u0000\u0353\u0354\u0007\f\u0000\u0000\u0354\u0355\u0007\u000b"+ + "\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0357\u0006\u000e"+ + "\u0004\u0000\u03571\u0001\u0000\u0000\u0000\u0358\u0359\u0007\u0011\u0000"+ + "\u0000\u0359\u035a\u0007\u000b\u0000\u0000\u035a\u035b\u0007\u0004\u0000"+ + "\u0000\u035b\u035c\u0007\u000b\u0000\u0000\u035c\u035d\u0007\u0011\u0000"+ + "\u0000\u035d\u035e\u0001\u0000\u0000\u0000\u035e\u035f\u0006\u000f\u0004"+ + "\u0000\u035f3\u0001\u0000\u0000\u0000\u0360\u0361\u0007\u0014\u0000\u0000"+ + "\u0361\u0362\u0007\u0003\u0000\u0000\u0362\u0363\u0007\u0007\u0000\u0000"+ + "\u0363\u0364\u0007\f\u0000\u0000\u0364\u0365\u0007\u0007\u0000\u0000\u0365"+ + "\u0366\u0001\u0000\u0000\u0000\u0366\u0367\u0006\u0010\u0004\u0000\u0367"+ + "5\u0001\u0000\u0000\u0000\u0368\u0369\u0007\u0015\u0000\u0000\u0369\u036a"+ + "\u0007\f\u0000\u0000\u036a\u036b\u0007\n\u0000\u0000\u036b\u036c\u0005"+ + "_\u0000\u0000\u036c\u036d\u0007\b\u0000\u0000\u036d\u036e\u0007\u0004"+ + "\u0000\u0000\u036e\u036f\u0007\f\u0000\u0000\u036f\u0370\u0007\u000b\u0000"+ + "\u0000\u0370\u0371\u0007\u0011\u0000\u0000\u0371\u0372\u0001\u0000\u0000"+ + "\u0000\u0372\u0373\u0006\u0011\u0004\u0000\u03737\u0001\u0000\u0000\u0000"+ + "\u0374\u0375\u0007\u0016\u0000\u0000\u0375\u0376\u0007\f\u0000\u0000\u0376"+ + "\u0377\u0007\t\u0000\u0000\u0377\u0378\u0007\u000f\u0000\u0000\u0378\u0379"+ + "\u0001\u0000\u0000\u0000\u0379\u037a\u0006\u0012\u0005\u0000\u037a9\u0001"+ + "\u0000\u0000\u0000\u037b\u037c\u0007\u000b\u0000\u0000\u037c\u037d\u0007"+ + "\u0011\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u037f\u0006"+ + "\u0013\u0005\u0000\u037f;\u0001\u0000\u0000\u0000\u0380\u0381\u0004\u0014"+ + "\u0001\u0000\u0381\u0382\u0007\u0007\u0000\u0000\u0382\u0383\u0007\r\u0000"+ + "\u0000\u0383\u0384\u0007\u000b\u0000\u0000\u0384\u0385\u0007\u0007\u0000"+ + "\u0000\u0385\u0386\u0007\f\u0000\u0000\u0386\u0387\u0007\u0005\u0000\u0000"+ + "\u0387\u0388\u0007\u0004\u0000\u0000\u0388\u0389\u0007\u000e\u0000\u0000"+ + "\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038b\u0006\u0014\u0005\u0000"+ + "\u038b=\u0001\u0000\u0000\u0000\u038c\u038d\u0007\u0016\u0000\u0000\u038d"+ + "\u038e\u0007\t\u0000\u0000\u038e\u038f\u0007\f\u0000\u0000\u038f\u0390"+ + "\u0007\u0013\u0000\u0000\u0390\u0391\u0001\u0000\u0000\u0000\u0391\u0392"+ + "\u0006\u0015\u0006\u0000\u0392?\u0001\u0000\u0000\u0000\u0393\u0394\u0007"+ + "\u0016\u0000\u0000\u0394\u0395\u0007\u0015\u0000\u0000\u0395\u0396\u0007"+ + "\u0011\u0000\u0000\u0396\u0397\u0007\u0007\u0000\u0000\u0397\u0398\u0001"+ + "\u0000\u0000\u0000\u0398\u0399\u0006\u0016\u0007\u0000\u0399A\u0001\u0000"+ + "\u0000\u0000\u039a\u039b\u0007\n\u0000\u0000\u039b\u039c\u0007\u0005\u0000"+ + "\u0000\u039c\u039d\u0007\u000e\u0000\u0000\u039d\u039e\u0007\n\u0000\u0000"+ + "\u039e\u039f\u0007\u0005\u0000\u0000\u039f\u03a0\u0007\u0007\u0000\u0000"+ + "\u03a0\u03a1\u0001\u0000\u0000\u0000\u03a1\u03a2\u0006\u0017\b\u0000\u03a2"+ + "C\u0001\u0000\u0000\u0000\u03a3\u03a4\u0007\n\u0000\u0000\u03a4\u03a5"+ + "\u0007\u0005\u0000\u0000\u03a5\u03a6\u0007\u000e\u0000\u0000\u03a6\u03a7"+ + "\u0007\n\u0000\u0000\u03a7\u03a8\u0007\u0005\u0000\u0000\u03a8\u03a9\u0007"+ + "\u0007\u0000\u0000\u03a9\u03aa\u0007\u0011\u0000\u0000\u03aa\u03ab\u0007"+ + "\u000b\u0000\u0000\u03ab\u03ac\u0007\u0004\u0000\u0000\u03ac\u03ad\u0007"+ + "\u000b\u0000\u0000\u03ad\u03ae\u0007\u0011\u0000\u0000\u03ae\u03af\u0001"+ + "\u0000\u0000\u0000\u03af\u03b0\u0006\u0018\u0004\u0000\u03b0E\u0001\u0000"+ + "\u0000\u0000\u03b1\u03b2\u0007\u000e\u0000\u0000\u03b2\u03b3\u0007\t\u0000"+ + "\u0000\u03b3\u03b4\u0007\t\u0000\u0000\u03b4\u03b5\u0007\u0013\u0000\u0000"+ + "\u03b5\u03b6\u0007\u0015\u0000\u0000\u03b6\u03b7\u0007\b\u0000\u0000\u03b7"+ + "\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006\u0019\t\u0000\u03b9G"+ + "\u0001\u0000\u0000\u0000\u03ba\u03bb\u0004\u001a\u0002\u0000\u03bb\u03bc"+ + "\u0007\u0016\u0000\u0000\u03bc\u03bd\u0007\u0015\u0000\u0000\u03bd\u03be"+ + "\u0007\u000e\u0000\u0000\u03be\u03bf\u0007\u000e\u0000\u0000\u03bf\u03c0"+ + "\u0001\u0000\u0000\u0000\u03c0\u03c1\u0006\u001a\t\u0000\u03c1I\u0001"+ + "\u0000\u0000\u0000\u03c2\u03c3\u0004\u001b\u0003\u0000\u03c3\u03c4\u0007"+ + "\u000e\u0000\u0000\u03c4\u03c5\u0007\u0007\u0000\u0000\u03c5\u03c6\u0007"+ + "\u0016\u0000\u0000\u03c6\u03c7\u0007\u000b\u0000\u0000\u03c7\u03c8\u0001"+ + "\u0000\u0000\u0000\u03c8\u03c9\u0006\u001b\t\u0000\u03c9K\u0001\u0000"+ + "\u0000\u0000\u03ca\u03cb\u0004\u001c\u0004\u0000\u03cb\u03cc\u0007\f\u0000"+ + "\u0000\u03cc\u03cd\u0007\n\u0000\u0000\u03cd\u03ce\u0007\u0006\u0000\u0000"+ + "\u03ce\u03cf\u0007\u0003\u0000\u0000\u03cf\u03d0\u0007\u000b\u0000\u0000"+ + "\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d2\u0006\u001c\t\u0000\u03d2"+ + "M\u0001\u0000\u0000\u0000\u03d3\u03d4\u0004\u001d\u0005\u0000\u03d4\u03d5"+ + "\u0007\u000e\u0000\u0000\u03d5\u03d6\u0007\t\u0000\u0000\u03d6\u03d7\u0007"+ + "\t\u0000\u0000\u03d7\u03d8\u0007\u0013\u0000\u0000\u03d8\u03d9\u0007\u0015"+ + "\u0000\u0000\u03d9\u03da\u0007\b\u0000\u0000\u03da\u03db\u0005_\u0000"+ + "\u0000\u03db\u03dc\u0005\u8001\uf414\u0000\u0000\u03dc\u03dd\u0001\u0000"+ + "\u0000\u0000\u03dd\u03de\u0006\u001d\n\u0000\u03deO\u0001\u0000\u0000"+ + "\u0000\u03df\u03e0\u0004\u001e\u0006\u0000\u03e0\u03e1\u0007\u000f\u0000"+ + "\u0000\u03e1\u03e2\u0007\u000f\u0000\u0000\u03e2\u03e3\u0007\f\u0000\u0000"+ + "\u03e3\u03e4\u0001\u0000\u0000\u0000\u03e4\u03e5\u0006\u001e\u000b\u0000"+ + "\u03e5Q\u0001\u0000\u0000\u0000\u03e6\u03e7\u0007\u000f\u0000\u0000\u03e7"+ + "\u03e8\u0007\u0012\u0000\u0000\u03e8\u03e9\u0005_\u0000\u0000\u03e9\u03ea"+ + "\u0007\u0007\u0000\u0000\u03ea\u03eb\u0007\r\u0000\u0000\u03eb\u03ec\u0007"+ + "\b\u0000\u0000\u03ec\u03ed\u0007\u0004\u0000\u0000\u03ed\u03ee\u0007\u0005"+ + "\u0000\u0000\u03ee\u03ef\u0007\u0010\u0000\u0000\u03ef\u03f0\u0001\u0000"+ + "\u0000\u0000\u03f0\u03f1\u0006\u001f\f\u0000\u03f1S\u0001\u0000\u0000"+ + "\u0000\u03f2\u03f3\u0007\u0010\u0000\u0000\u03f3\u03f4\u0007\f\u0000\u0000"+ + "\u03f4\u03f5\u0007\t\u0000\u0000\u03f5\u03f6\u0007\b\u0000\u0000\u03f6"+ + "\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006 \r\u0000\u03f8U\u0001"+ + "\u0000\u0000\u0000\u03f9\u03fa\u0007\u0013\u0000\u0000\u03fa\u03fb\u0007"+ + "\u0007\u0000\u0000\u03fb\u03fc\u0007\u0007\u0000\u0000\u03fc\u03fd\u0007"+ + "\b\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe\u03ff\u0006!"+ + "\r\u0000\u03ffW\u0001\u0000\u0000\u0000\u0400\u0401\u0004\"\u0007\u0000"+ + "\u0401\u0402\u0007\n\u0000\u0000\u0402\u0403\u0007\u0005\u0000\u0000\u0403"+ + "\u0404\u0007\u0011\u0000\u0000\u0404\u0405\u0007\n\u0000\u0000\u0405\u0406"+ + "\u0007\u0011\u0000\u0000\u0406\u0407\u0007\u000b\u0000\u0000\u0407\u0408"+ + "\u0005_\u0000\u0000\u0408\u0409\u0005\u8001\uf414\u0000\u0000\u0409\u040a"+ + "\u0001\u0000\u0000\u0000\u040a\u040b\u0006\"\r\u0000\u040bY\u0001\u0000"+ + "\u0000\u0000\u040c\u040d\u0007\b\u0000\u0000\u040d\u040e\u0007\f\u0000"+ + "\u0000\u040e\u040f\u0007\t\u0000\u0000\u040f\u0410\u0007\u000f\u0000\u0000"+ + "\u0410\u0411\u0007\u0017\u0000\u0000\u0411\u0412\u0007\u000e\u0000\u0000"+ + "\u0412\u0413\u0001\u0000\u0000\u0000\u0413\u0414\u0006#\u000e\u0000\u0414"+ + "[\u0001\u0000\u0000\u0000\u0415\u0416\u0007\f\u0000\u0000\u0416\u0417"+ + "\u0007\u0007\u0000\u0000\u0417\u0418\u0007\u0005\u0000\u0000\u0418\u0419"+ + "\u0007\u0004\u0000\u0000\u0419\u041a\u0007\u000f\u0000\u0000\u041a\u041b"+ + "\u0007\u0007\u0000\u0000\u041b\u041c\u0001\u0000\u0000\u0000\u041c\u041d"+ + "\u0006$\u000f\u0000\u041d]\u0001\u0000\u0000\u0000\u041e\u041f\u0007\u0011"+ + "\u0000\u0000\u041f\u0420\u0007\u0007\u0000\u0000\u0420\u0421\u0007\u000b"+ + "\u0000\u0000\u0421\u0422\u0001\u0000\u0000\u0000\u0422\u0423\u0006%\u0010"+ + "\u0000\u0423_\u0001\u0000\u0000\u0000\u0424\u0425\u0007\u0011\u0000\u0000"+ + "\u0425\u0426\u0007\u0003\u0000\u0000\u0426\u0427\u0007\t\u0000\u0000\u0427"+ + "\u0428\u0007\u0014\u0000\u0000\u0428\u0429\u0001\u0000\u0000\u0000\u0429"+ + "\u042a\u0006&\u0011\u0000\u042aa\u0001\u0000\u0000\u0000\u042b\u042d\b"+ + "\u0018\u0000\u0000\u042c\u042b\u0001\u0000\u0000\u0000\u042d\u042e\u0001"+ + "\u0000\u0000\u0000\u042e\u042c\u0001\u0000\u0000\u0000\u042e\u042f\u0001"+ + "\u0000\u0000\u0000\u042f\u0430\u0001\u0000\u0000\u0000\u0430\u0431\u0006"+ + "\'\u0004\u0000\u0431c\u0001\u0000\u0000\u0000\u0432\u0433\u0003\u00c0"+ + "V\u0000\u0433\u0434\u0001\u0000\u0000\u0000\u0434\u0435\u0006(\u0012\u0000"+ + "\u0435\u0436\u0006(\u0013\u0000\u0436e\u0001\u0000\u0000\u0000\u0437\u0438"+ + "\u0003\u0138\u0092\u0000\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a"+ + "\u0006)\u0014\u0000\u043a\u043b\u0006)\u0013\u0000\u043b\u043c\u0006)"+ + "\u0013\u0000\u043cg\u0001\u0000\u0000\u0000\u043d\u043e\u0003\u0102w\u0000"+ + "\u043e\u043f\u0001\u0000\u0000\u0000\u043f\u0440\u0006*\u0015\u0000\u0440"+ + "i\u0001\u0000\u0000\u0000\u0441\u0442\u0003\u027c\u0134\u0000\u0442\u0443"+ + "\u0001\u0000\u0000\u0000\u0443\u0444\u0006+\u0016\u0000\u0444k\u0001\u0000"+ + "\u0000\u0000\u0445\u0446\u0003\u00eem\u0000\u0446\u0447\u0001\u0000\u0000"+ + "\u0000\u0447\u0448\u0006,\u0017\u0000\u0448m\u0001\u0000\u0000\u0000\u0449"+ + "\u044a\u0003\u00eak\u0000\u044a\u044b\u0001\u0000\u0000\u0000\u044b\u044c"+ + "\u0006-\u0018\u0000\u044co\u0001\u0000\u0000\u0000\u044d\u044e\u0003\u0132"+ + "\u008f\u0000\u044e\u044f\u0001\u0000\u0000\u0000\u044f\u0450\u0006.\u0019"+ + "\u0000\u0450q\u0001\u0000\u0000\u0000\u0451\u0452\u0003\u0134\u0090\u0000"+ + "\u0452\u0453\u0001\u0000\u0000\u0000\u0453\u0454\u0006/\u001a\u0000\u0454"+ + "s\u0001\u0000\u0000\u0000\u0455\u0456\u0003\u013e\u0095\u0000\u0456\u0457"+ + "\u0001\u0000\u0000\u0000\u0457\u0458\u00060\u001b\u0000\u0458u\u0001\u0000"+ + "\u0000\u0000\u0459\u045a\u0003\u013a\u0093\u0000\u045a\u045b\u0001\u0000"+ + "\u0000\u0000\u045b\u045c\u00061\u001c\u0000\u045cw\u0001\u0000\u0000\u0000"+ + "\u045d\u045e\u0003\u0014\u0000\u0000\u045e\u045f\u0001\u0000\u0000\u0000"+ + "\u045f\u0460\u00062\u0000\u0000\u0460y\u0001\u0000\u0000\u0000\u0461\u0462"+ + "\u0003\u0016\u0001\u0000\u0462\u0463\u0001\u0000\u0000\u0000\u0463\u0464"+ + "\u00063\u0000\u0000\u0464{\u0001\u0000\u0000\u0000\u0465\u0466\u0003\u0018"+ + "\u0002\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u0468\u00064\u0000"+ + "\u0000\u0468}\u0001\u0000\u0000\u0000\u0469\u046a\u0003\u00c0V\u0000\u046a"+ + "\u046b\u0001\u0000\u0000\u0000\u046b\u046c\u00065\u0012\u0000\u046c\u046d"+ + "\u00065\u0013\u0000\u046d\u007f\u0001\u0000\u0000\u0000\u046e\u046f\u0003"+ + "\u0138\u0092\u0000\u046f\u0470\u0001\u0000\u0000\u0000\u0470\u0471\u0006"+ + "6\u0014\u0000\u0471\u0472\u00066\u0013\u0000\u0472\u0473\u00066\u0013"+ + "\u0000\u0473\u0081\u0001\u0000\u0000\u0000\u0474\u0475\u0003\u0102w\u0000"+ + "\u0475\u0476\u0001\u0000\u0000\u0000\u0476\u0477\u00067\u0015\u0000\u0477"+ + "\u0478\u00067\u001d\u0000\u0478\u0083\u0001\u0000\u0000\u0000\u0479\u047a"+ + "\u0003\u010c|\u0000\u047a\u047b\u0001\u0000\u0000\u0000\u047b\u047c\u0006"+ + "8\u001e\u0000\u047c\u047d\u00068\u001d\u0000\u047d\u0085\u0001\u0000\u0000"+ + "\u0000\u047e\u047f\b\u0019\u0000\u0000\u047f\u0087\u0001\u0000\u0000\u0000"+ + "\u0480\u0482\u0003\u00869\u0000\u0481\u0480\u0001\u0000\u0000\u0000\u0482"+ + "\u0483\u0001\u0000\u0000\u0000\u0483\u0481\u0001\u0000\u0000\u0000\u0483"+ + "\u0484\u0001\u0000\u0000\u0000\u0484\u0485\u0001\u0000\u0000\u0000\u0485"+ + "\u0486\u0003\u00e6i\u0000\u0486\u0488\u0001\u0000\u0000\u0000\u0487\u0481"+ + "\u0001\u0000\u0000\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u048a"+ + "\u0001\u0000\u0000\u0000\u0489\u048b\u0003\u00869\u0000\u048a\u0489\u0001"+ + "\u0000\u0000\u0000\u048b\u048c\u0001\u0000\u0000\u0000\u048c\u048a\u0001"+ + "\u0000\u0000\u0000\u048c\u048d\u0001\u0000\u0000\u0000\u048d\u0089\u0001"+ + "\u0000\u0000\u0000\u048e\u048f\u0003\u0088:\u0000\u048f\u0490\u0001\u0000"+ + "\u0000\u0000\u0490\u0491\u0006;\u001f\u0000\u0491\u008b\u0001\u0000\u0000"+ + "\u0000\u0492\u0493\u0003\u00d6a\u0000\u0493\u0494\u0001\u0000\u0000\u0000"+ + "\u0494\u0495\u0006< \u0000\u0495\u008d\u0001\u0000\u0000\u0000\u0496\u0497"+ + "\u0003\u0014\u0000\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498\u0499"+ + "\u0006=\u0000\u0000\u0499\u008f\u0001\u0000\u0000\u0000\u049a\u049b\u0003"+ + "\u0016\u0001\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u0006"+ + ">\u0000\u0000\u049d\u0091\u0001\u0000\u0000\u0000\u049e\u049f\u0003\u0018"+ + "\u0002\u0000\u049f\u04a0\u0001\u0000\u0000\u0000\u04a0\u04a1\u0006?\u0000"+ + "\u0000\u04a1\u0093\u0001\u0000\u0000\u0000\u04a2\u04a3\u0003\u00c0V\u0000"+ + "\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4\u04a5\u0006@\u0012\u0000\u04a5"+ + "\u04a6\u0006@\u0013\u0000\u04a6\u04a7\u0006@\u0013\u0000\u04a7\u0095\u0001"+ + "\u0000\u0000\u0000\u04a8\u04a9\u0003\u0138\u0092\u0000\u04a9\u04aa\u0001"+ + "\u0000\u0000\u0000\u04aa\u04ab\u0006A\u0014\u0000\u04ab\u04ac\u0006A\u0013"+ + "\u0000\u04ac\u04ad\u0006A\u0013\u0000\u04ad\u04ae\u0006A\u0013\u0000\u04ae"+ + "\u0097\u0001\u0000\u0000\u0000\u04af\u04b0\u0003\u0132\u008f\u0000\u04b0"+ + "\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0006B\u0019\u0000\u04b2\u0099"+ + "\u0001\u0000\u0000\u0000\u04b3\u04b4\u0003\u0134\u0090\u0000\u04b4\u04b5"+ + "\u0001\u0000\u0000\u0000\u04b5\u04b6\u0006C\u001a\u0000\u04b6\u009b\u0001"+ + "\u0000\u0000\u0000\u04b7\u04b8\u0003\u00e0f\u0000\u04b8\u04b9\u0001\u0000"+ + "\u0000\u0000\u04b9\u04ba\u0006D!\u0000\u04ba\u009d\u0001\u0000\u0000\u0000"+ + "\u04bb\u04bc\u0003\u00eak\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd"+ + "\u04be\u0006E\u0018\u0000\u04be\u009f\u0001\u0000\u0000\u0000\u04bf\u04c0"+ + "\u0003\u00eem\u0000\u04c0\u04c1\u0001\u0000\u0000\u0000\u04c1\u04c2\u0006"+ + "F\u0017\u0000\u04c2\u00a1\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003\u010c"+ + "|\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0006G\u001e\u0000"+ + "\u04c6\u00a3\u0001\u0000\u0000\u0000\u04c7\u04c8\u0003\u0238\u0112\u0000"+ + "\u04c8\u04c9\u0001\u0000\u0000\u0000\u04c9\u04ca\u0006H\"\u0000\u04ca"+ + "\u00a5\u0001\u0000\u0000\u0000\u04cb\u04cc\u0003\u013e\u0095\u0000\u04cc"+ + "\u04cd\u0001\u0000\u0000\u0000\u04cd\u04ce\u0006I\u001b\u0000\u04ce\u00a7"+ + "\u0001\u0000\u0000\u0000\u04cf\u04d0\u0003\u0106y\u0000\u04d0\u04d1\u0001"+ + "\u0000\u0000\u0000\u04d1\u04d2\u0006J#\u0000\u04d2\u00a9\u0001\u0000\u0000"+ + "\u0000\u04d3\u04d4\u0003\u012e\u008d\u0000\u04d4\u04d5\u0001\u0000\u0000"+ + "\u0000\u04d5\u04d6\u0006K$\u0000\u04d6\u00ab\u0001\u0000\u0000\u0000\u04d7"+ + "\u04d8\u0003\u012a\u008b\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000\u04d9"+ + "\u04da\u0006L%\u0000\u04da\u00ad\u0001\u0000\u0000\u0000\u04db\u04dc\u0003"+ + "\u0130\u008e\u0000\u04dc\u04dd\u0001\u0000\u0000\u0000\u04dd\u04de\u0006"+ + "M&\u0000\u04de\u00af\u0001\u0000\u0000\u0000\u04df\u04e0\u0003\u0014\u0000"+ + "\u0000\u04e0\u04e1\u0001\u0000\u0000\u0000\u04e1\u04e2\u0006N\u0000\u0000"+ + "\u04e2\u00b1\u0001\u0000\u0000\u0000\u04e3\u04e4\u0003\u0016\u0001\u0000"+ + "\u04e4\u04e5\u0001\u0000\u0000\u0000\u04e5\u04e6\u0006O\u0000\u0000\u04e6"+ + "\u00b3\u0001\u0000\u0000\u0000\u04e7\u04e8\u0003\u0018\u0002\u0000\u04e8"+ + "\u04e9\u0001\u0000\u0000\u0000\u04e9\u04ea\u0006P\u0000\u0000\u04ea\u00b5"+ + "\u0001\u0000\u0000\u0000\u04eb\u04ec\u0003\u0136\u0091\u0000\u04ec\u04ed"+ + "\u0001\u0000\u0000\u0000\u04ed\u04ee\u0006Q\'\u0000\u04ee\u04ef\u0006"+ + "Q(\u0000\u04ef\u00b7\u0001\u0000\u0000\u0000\u04f0\u04f1\u0003\u00c0V"+ + "\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u04f3\u0006R\u0012\u0000"+ + "\u04f3\u04f4\u0006R\u0013\u0000\u04f4\u00b9\u0001\u0000\u0000\u0000\u04f5"+ + "\u04f6\u0003\u0018\u0002\u0000\u04f6\u04f7\u0001\u0000\u0000\u0000\u04f7"+ + "\u04f8\u0006S\u0000\u0000\u04f8\u00bb\u0001\u0000\u0000\u0000\u04f9\u04fa"+ + "\u0003\u0014\u0000\u0000\u04fa\u04fb\u0001\u0000\u0000\u0000\u04fb\u04fc"+ + "\u0006T\u0000\u0000\u04fc\u00bd\u0001\u0000\u0000\u0000\u04fd\u04fe\u0003"+ + "\u0016\u0001\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500\u0006"+ + "U\u0000\u0000\u0500\u00bf\u0001\u0000\u0000\u0000\u0501\u0502\u0005|\u0000"+ + "\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u0504\u0006V\u0013\u0000"+ + "\u0504\u00c1\u0001\u0000\u0000\u0000\u0505\u0506\u0007\u001a\u0000\u0000"+ + "\u0506\u00c3\u0001\u0000\u0000\u0000\u0507\u0508\u0007\u001b\u0000\u0000"+ + "\u0508\u00c5\u0001\u0000\u0000\u0000\u0509\u050a\u0005\\\u0000\u0000\u050a"+ + "\u050b\u0007\u001c\u0000\u0000\u050b\u00c7\u0001\u0000\u0000\u0000\u050c"+ + "\u050d\b\u001d\u0000\u0000\u050d\u00c9\u0001\u0000\u0000\u0000\u050e\u0510"+ + "\u0007\u0007\u0000\u0000\u050f\u0511\u0007\u001e\u0000\u0000\u0510\u050f"+ + "\u0001\u0000\u0000\u0000\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u0513"+ + "\u0001\u0000\u0000\u0000\u0512\u0514\u0003\u00c2W\u0000\u0513\u0512\u0001"+ + "\u0000\u0000\u0000\u0514\u0515\u0001\u0000\u0000\u0000\u0515\u0513\u0001"+ + "\u0000\u0000\u0000\u0515\u0516\u0001\u0000\u0000\u0000\u0516\u00cb\u0001"+ + "\u0000\u0000\u0000\u0517\u0518\u0005@\u0000\u0000\u0518\u00cd\u0001\u0000"+ + "\u0000\u0000\u0519\u051a\u0005`\u0000\u0000\u051a\u00cf\u0001\u0000\u0000"+ + "\u0000\u051b\u051f\b\u001f\u0000\u0000\u051c\u051d\u0005`\u0000\u0000"+ + "\u051d\u051f\u0005`\u0000\u0000\u051e\u051b\u0001\u0000\u0000\u0000\u051e"+ + "\u051c\u0001\u0000\u0000\u0000\u051f\u00d1\u0001\u0000\u0000\u0000\u0520"+ + "\u0521\u0005_\u0000\u0000\u0521\u00d3\u0001\u0000\u0000\u0000\u0522\u0526"+ + "\u0003\u00c4X\u0000\u0523\u0526\u0003\u00c2W\u0000\u0524\u0526\u0003\u00d2"+ + "_\u0000\u0525\u0522\u0001\u0000\u0000\u0000\u0525\u0523\u0001\u0000\u0000"+ + "\u0000\u0525\u0524\u0001\u0000\u0000\u0000\u0526\u00d5\u0001\u0000\u0000"+ + "\u0000\u0527\u052c\u0005\"\u0000\u0000\u0528\u052b\u0003\u00c6Y\u0000"+ + "\u0529\u052b\u0003\u00c8Z\u0000\u052a\u0528\u0001\u0000\u0000\u0000\u052a"+ + "\u0529\u0001\u0000\u0000\u0000\u052b\u052e\u0001\u0000\u0000\u0000\u052c"+ + "\u052a\u0001\u0000\u0000\u0000\u052c\u052d\u0001\u0000\u0000\u0000\u052d"+ + "\u052f\u0001\u0000\u0000\u0000\u052e\u052c\u0001\u0000\u0000\u0000\u052f"+ + "\u0545\u0005\"\u0000\u0000\u0530\u0531\u0005\"\u0000\u0000\u0531\u0532"+ + "\u0005\"\u0000\u0000\u0532\u0533\u0005\"\u0000\u0000\u0533\u0537\u0001"+ + "\u0000\u0000\u0000\u0534\u0536\b\u0000\u0000\u0000\u0535\u0534\u0001\u0000"+ + "\u0000\u0000\u0536\u0539\u0001\u0000\u0000\u0000\u0537\u0538\u0001\u0000"+ + "\u0000\u0000\u0537\u0535\u0001\u0000\u0000\u0000\u0538\u053a\u0001\u0000"+ + "\u0000\u0000\u0539\u0537\u0001\u0000\u0000\u0000\u053a\u053b\u0005\"\u0000"+ + "\u0000\u053b\u053c\u0005\"\u0000\u0000\u053c\u053d\u0005\"\u0000\u0000"+ + "\u053d\u053f\u0001\u0000\u0000\u0000\u053e\u0540\u0005\"\u0000\u0000\u053f"+ + "\u053e\u0001\u0000\u0000\u0000\u053f\u0540\u0001\u0000\u0000\u0000\u0540"+ + "\u0542\u0001\u0000\u0000\u0000\u0541\u0543\u0005\"\u0000\u0000\u0542\u0541"+ + "\u0001\u0000\u0000\u0000\u0542\u0543\u0001\u0000\u0000\u0000\u0543\u0545"+ + "\u0001\u0000\u0000\u0000\u0544\u0527\u0001\u0000\u0000\u0000\u0544\u0530"+ + "\u0001\u0000\u0000\u0000\u0545\u00d7\u0001\u0000\u0000\u0000\u0546\u0548"+ + "\u0003\u00c2W\u0000\u0547\u0546\u0001\u0000\u0000\u0000\u0548\u0549\u0001"+ + "\u0000\u0000\u0000\u0549\u0547\u0001\u0000\u0000\u0000\u0549\u054a\u0001"+ + "\u0000\u0000\u0000\u054a\u00d9\u0001\u0000\u0000\u0000\u054b\u054d\u0003"+ + "\u00c2W\u0000\u054c\u054b\u0001\u0000\u0000\u0000\u054d\u054e\u0001\u0000"+ + "\u0000\u0000\u054e\u054c\u0001\u0000\u0000\u0000\u054e\u054f\u0001\u0000"+ + "\u0000\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0554\u0003\u00ee"+ + "m\u0000\u0551\u0553\u0003\u00c2W\u0000\u0552\u0551\u0001\u0000\u0000\u0000"+ + "\u0553\u0556\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000"+ + "\u0554\u0555\u0001\u0000\u0000\u0000\u0555\u0576\u0001\u0000\u0000\u0000"+ + "\u0556\u0554\u0001\u0000\u0000\u0000\u0557\u0559\u0003\u00eem\u0000\u0558"+ + "\u055a\u0003\u00c2W\u0000\u0559\u0558\u0001\u0000\u0000\u0000\u055a\u055b"+ + "\u0001\u0000\u0000\u0000\u055b\u0559\u0001\u0000\u0000\u0000\u055b\u055c"+ + "\u0001\u0000\u0000\u0000\u055c\u0576\u0001\u0000\u0000\u0000\u055d\u055f"+ + "\u0003\u00c2W\u0000\u055e\u055d\u0001\u0000\u0000\u0000\u055f\u0560\u0001"+ + "\u0000\u0000\u0000\u0560\u055e\u0001\u0000\u0000\u0000\u0560\u0561\u0001"+ + "\u0000\u0000\u0000\u0561\u0569\u0001\u0000\u0000\u0000\u0562\u0566\u0003"+ + "\u00eem\u0000\u0563\u0565\u0003\u00c2W\u0000\u0564\u0563\u0001\u0000\u0000"+ + "\u0000\u0565\u0568\u0001\u0000\u0000\u0000\u0566\u0564\u0001\u0000\u0000"+ + "\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u056a\u0001\u0000\u0000"+ + "\u0000\u0568\u0566\u0001\u0000\u0000\u0000\u0569\u0562\u0001\u0000\u0000"+ + "\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000"+ + "\u0000\u056b\u056c\u0003\u00ca[\u0000\u056c\u0576\u0001\u0000\u0000\u0000"+ + "\u056d\u056f\u0003\u00eem\u0000\u056e\u0570\u0003\u00c2W\u0000\u056f\u056e"+ + "\u0001\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u056f"+ + "\u0001\u0000\u0000\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572\u0573"+ + "\u0001\u0000\u0000\u0000\u0573\u0574\u0003\u00ca[\u0000\u0574\u0576\u0001"+ + "\u0000\u0000\u0000\u0575\u054c\u0001\u0000\u0000\u0000\u0575\u0557\u0001"+ + "\u0000\u0000\u0000\u0575\u055e\u0001\u0000\u0000\u0000\u0575\u056d\u0001"+ + "\u0000\u0000\u0000\u0576\u00db\u0001\u0000\u0000\u0000\u0577\u0578\u0007"+ + "\u0004\u0000\u0000\u0578\u0579\u0007\u0005\u0000\u0000\u0579\u057a\u0007"+ + "\u0010\u0000\u0000\u057a\u00dd\u0001\u0000\u0000\u0000\u057b\u057c\u0007"+ + "\u0004\u0000\u0000\u057c\u057d\u0007\u0011\u0000\u0000\u057d\u057e\u0007"+ + "\u0002\u0000\u0000\u057e\u00df\u0001\u0000\u0000\u0000\u057f\u0580\u0005"+ + "=\u0000\u0000\u0580\u00e1\u0001\u0000\u0000\u0000\u0581\u0582\u0007 \u0000"+ + "\u0000\u0582\u0583\u0007!\u0000\u0000\u0583\u00e3\u0001\u0000\u0000\u0000"+ + "\u0584\u0585\u0005:\u0000\u0000\u0585\u0586\u0005:\u0000\u0000\u0586\u00e5"+ + "\u0001\u0000\u0000\u0000\u0587\u0588\u0005:\u0000\u0000\u0588\u00e7\u0001"+ + "\u0000\u0000\u0000\u0589\u058a\u0005;\u0000\u0000\u058a\u00e9\u0001\u0000"+ + "\u0000\u0000\u058b\u058c\u0005,\u0000\u0000\u058c\u00eb\u0001\u0000\u0000"+ + "\u0000\u058d\u058e\u0007\u0010\u0000\u0000\u058e\u058f\u0007\u0007\u0000"+ + "\u0000\u058f\u0590\u0007\u0011\u0000\u0000\u0590\u0591\u0007\u0002\u0000"+ + "\u0000\u0591\u00ed\u0001\u0000\u0000\u0000\u0592\u0593\u0005.\u0000\u0000"+ + "\u0593\u00ef\u0001\u0000\u0000\u0000\u0594\u0595\u0007\u0016\u0000\u0000"+ + "\u0595\u0596\u0007\u0004\u0000\u0000\u0596\u0597\u0007\u000e\u0000\u0000"+ + "\u0597\u0598\u0007\u0011\u0000\u0000\u0598\u0599\u0007\u0007\u0000\u0000"+ + "\u0599\u00f1\u0001\u0000\u0000\u0000\u059a\u059b\u0007\u0016\u0000\u0000"+ + "\u059b\u059c\u0007\n\u0000\u0000\u059c\u059d\u0007\f\u0000\u0000\u059d"+ + "\u059e\u0007\u0011\u0000\u0000\u059e\u059f\u0007\u000b\u0000\u0000\u059f"+ + "\u00f3\u0001\u0000\u0000\u0000\u05a0\u05a1\u0007\n\u0000\u0000\u05a1\u05a2"+ + "\u0007\u0005\u0000\u0000\u05a2\u00f5\u0001\u0000\u0000\u0000\u05a3\u05a4"+ + "\u0007\n\u0000\u0000\u05a4\u05a5\u0007\u0011\u0000\u0000\u05a5\u00f7\u0001"+ + "\u0000\u0000\u0000\u05a6\u05a7\u0007\u000e\u0000\u0000\u05a7\u05a8\u0007"+ + "\u0004\u0000\u0000\u05a8\u05a9\u0007\u0011\u0000\u0000\u05a9\u05aa\u0007"+ + "\u000b\u0000\u0000\u05aa\u00f9\u0001\u0000\u0000\u0000\u05ab\u05ac\u0007"+ + "\u000e\u0000\u0000\u05ac\u05ad\u0007\n\u0000\u0000\u05ad\u05ae\u0007\u0013"+ + "\u0000\u0000\u05ae\u05af\u0007\u0007\u0000\u0000\u05af\u00fb\u0001\u0000"+ + "\u0000\u0000\u05b0\u05b1\u0007\u0005\u0000\u0000\u05b1\u05b2\u0007\t\u0000"+ + "\u0000\u05b2\u05b3\u0007\u000b\u0000\u0000\u05b3\u00fd\u0001\u0000\u0000"+ + "\u0000\u05b4\u05b5\u0007\u0005\u0000\u0000\u05b5\u05b6\u0007\u0015\u0000"+ + "\u0000\u05b6\u05b7\u0007\u000e\u0000\u0000\u05b7\u05b8\u0007\u000e\u0000"+ + "\u0000\u05b8\u00ff\u0001\u0000\u0000\u0000\u05b9\u05ba\u0007\u0005\u0000"+ + "\u0000\u05ba\u05bb\u0007\u0015\u0000\u0000\u05bb\u05bc\u0007\u000e\u0000"+ + "\u0000\u05bc\u05bd\u0007\u000e\u0000\u0000\u05bd\u05be\u0007\u0011\u0000"+ + "\u0000\u05be\u0101\u0001\u0000\u0000\u0000\u05bf\u05c0\u0007\t\u0000\u0000"+ + "\u05c0\u05c1\u0007\u0005\u0000\u0000\u05c1\u0103\u0001\u0000\u0000\u0000"+ + "\u05c2\u05c3\u0007\t\u0000\u0000\u05c3\u05c4\u0007\f\u0000\u0000\u05c4"+ + "\u0105\u0001\u0000\u0000\u0000\u05c5\u05c6\u0005?\u0000\u0000\u05c6\u0107"+ + "\u0001\u0000\u0000\u0000\u05c7\u05c8\u0007\f\u0000\u0000\u05c8\u05c9\u0007"+ + "\u000e\u0000\u0000\u05c9\u05ca\u0007\n\u0000\u0000\u05ca\u05cb\u0007\u0013"+ + "\u0000\u0000\u05cb\u05cc\u0007\u0007\u0000\u0000\u05cc\u0109\u0001\u0000"+ + "\u0000\u0000\u05cd\u05ce\u0007\u000b\u0000\u0000\u05ce\u05cf\u0007\f\u0000"+ + "\u0000\u05cf\u05d0\u0007\u0015\u0000\u0000\u05d0\u05d1\u0007\u0007\u0000"+ + "\u0000\u05d1\u010b\u0001\u0000\u0000\u0000\u05d2\u05d3\u0007\u0014\u0000"+ + "\u0000\u05d3\u05d4\u0007\n\u0000\u0000\u05d4\u05d5\u0007\u000b\u0000\u0000"+ + "\u05d5\u05d6\u0007\u0003\u0000\u0000\u05d6\u010d\u0001\u0000\u0000\u0000"+ + "\u05d7\u05d8\u0005=\u0000\u0000\u05d8\u05d9\u0005=\u0000\u0000\u05d9\u010f"+ + "\u0001\u0000\u0000\u0000\u05da\u05db\u0005=\u0000\u0000\u05db\u05dc\u0005"+ + "~\u0000\u0000\u05dc\u0111\u0001\u0000\u0000\u0000\u05dd\u05de\u0005!\u0000"+ + "\u0000\u05de\u05df\u0005=\u0000\u0000\u05df\u0113\u0001\u0000\u0000\u0000"+ + "\u05e0\u05e1\u0005<\u0000\u0000\u05e1\u0115\u0001\u0000\u0000\u0000\u05e2"+ + "\u05e3\u0005<\u0000\u0000\u05e3\u05e4\u0005=\u0000\u0000\u05e4\u0117\u0001"+ + "\u0000\u0000\u0000\u05e5\u05e6\u0005>\u0000\u0000\u05e6\u0119\u0001\u0000"+ + "\u0000\u0000\u05e7\u05e8\u0005>\u0000\u0000\u05e8\u05e9\u0005=\u0000\u0000"+ + "\u05e9\u011b\u0001\u0000\u0000\u0000\u05ea\u05eb\u0005+\u0000\u0000\u05eb"+ + "\u011d\u0001\u0000\u0000\u0000\u05ec\u05ed\u0005-\u0000\u0000\u05ed\u011f"+ + "\u0001\u0000\u0000\u0000\u05ee\u05ef\u0005*\u0000\u0000\u05ef\u0121\u0001"+ + "\u0000\u0000\u0000\u05f0\u05f1\u0005/\u0000\u0000\u05f1\u0123\u0001\u0000"+ + "\u0000\u0000\u05f2\u05f3\u0005%\u0000\u0000\u05f3\u0125\u0001\u0000\u0000"+ + "\u0000\u05f4\u05f5\u0005{\u0000\u0000\u05f5\u0127\u0001\u0000\u0000\u0000"+ + "\u05f6\u05f7\u0005}\u0000\u0000\u05f7\u0129\u0001\u0000\u0000\u0000\u05f8"+ + "\u05f9\u0005?\u0000\u0000\u05f9\u05fa\u0005?\u0000\u0000\u05fa\u012b\u0001"+ + "\u0000\u0000\u0000\u05fb\u05fc\u00034\u0010\u0000\u05fc\u05fd\u0001\u0000"+ + "\u0000\u0000\u05fd\u05fe\u0006\u008c)\u0000\u05fe\u012d\u0001\u0000\u0000"+ + "\u0000\u05ff\u0602\u0003\u0106y\u0000\u0600\u0603\u0003\u00c4X\u0000\u0601"+ + "\u0603\u0003\u00d2_\u0000\u0602\u0600\u0001\u0000\u0000\u0000\u0602\u0601"+ + "\u0001\u0000\u0000\u0000\u0603\u0607\u0001\u0000\u0000\u0000\u0604\u0606"+ + "\u0003\u00d4`\u0000\u0605\u0604\u0001\u0000\u0000\u0000\u0606\u0609\u0001"+ + "\u0000\u0000\u0000\u0607\u0605\u0001\u0000\u0000\u0000\u0607\u0608\u0001"+ + "\u0000\u0000\u0000\u0608\u0611\u0001\u0000\u0000\u0000\u0609\u0607\u0001"+ + "\u0000\u0000\u0000\u060a\u060c\u0003\u0106y\u0000\u060b\u060d\u0003\u00c2"+ + "W\u0000\u060c\u060b\u0001\u0000\u0000\u0000\u060d\u060e\u0001\u0000\u0000"+ + "\u0000\u060e\u060c\u0001\u0000\u0000\u0000\u060e\u060f\u0001\u0000\u0000"+ + "\u0000\u060f\u0611\u0001\u0000\u0000\u0000\u0610\u05ff\u0001\u0000\u0000"+ + "\u0000\u0610\u060a\u0001\u0000\u0000\u0000\u0611\u012f\u0001\u0000\u0000"+ + "\u0000\u0612\u0615\u0003\u012a\u008b\u0000\u0613\u0616\u0003\u00c4X\u0000"+ + "\u0614\u0616\u0003\u00d2_\u0000\u0615\u0613\u0001\u0000\u0000\u0000\u0615"+ + "\u0614\u0001\u0000\u0000\u0000\u0616\u061a\u0001\u0000\u0000\u0000\u0617"+ + "\u0619\u0003\u00d4`\u0000\u0618\u0617\u0001\u0000\u0000\u0000\u0619\u061c"+ + "\u0001\u0000\u0000\u0000\u061a\u0618\u0001\u0000\u0000\u0000\u061a\u061b"+ + "\u0001\u0000\u0000\u0000\u061b\u0624\u0001\u0000\u0000\u0000\u061c\u061a"+ + "\u0001\u0000\u0000\u0000\u061d\u061f\u0003\u012a\u008b\u0000\u061e\u0620"+ + "\u0003\u00c2W\u0000\u061f\u061e\u0001\u0000\u0000\u0000\u0620\u0621\u0001"+ + "\u0000\u0000\u0000\u0621\u061f\u0001\u0000\u0000\u0000\u0621\u0622\u0001"+ + "\u0000\u0000\u0000\u0622\u0624\u0001\u0000\u0000\u0000\u0623\u0612\u0001"+ + "\u0000\u0000\u0000\u0623\u061d\u0001\u0000\u0000\u0000\u0624\u0131\u0001"+ + "\u0000\u0000\u0000\u0625\u0626\u0005[\u0000\u0000\u0626\u0627\u0001\u0000"+ + "\u0000\u0000\u0627\u0628\u0006\u008f\u0004\u0000\u0628\u0629\u0006\u008f"+ + "\u0004\u0000\u0629\u0133\u0001\u0000\u0000\u0000\u062a\u062b\u0005]\u0000"+ + "\u0000\u062b\u062c\u0001\u0000\u0000\u0000\u062c\u062d\u0006\u0090\u0013"+ + "\u0000\u062d\u062e\u0006\u0090\u0013\u0000\u062e\u0135\u0001\u0000\u0000"+ + "\u0000\u062f\u0630\u0005(\u0000\u0000\u0630\u0631\u0001\u0000\u0000\u0000"+ + "\u0631\u0632\u0006\u0091\u0004\u0000\u0632\u0633\u0006\u0091\u0004\u0000"+ + "\u0633\u0137\u0001\u0000\u0000\u0000\u0634\u0635\u0005)\u0000\u0000\u0635"+ + "\u0636\u0001\u0000\u0000\u0000\u0636\u0637\u0006\u0092\u0013\u0000\u0637"+ + "\u0638\u0006\u0092\u0013\u0000\u0638\u0139\u0001\u0000\u0000\u0000\u0639"+ + "\u063d\u0003\u00c4X\u0000\u063a\u063c\u0003\u00d4`\u0000\u063b\u063a\u0001"+ + "\u0000\u0000\u0000\u063c\u063f\u0001\u0000\u0000\u0000\u063d\u063b\u0001"+ + "\u0000\u0000\u0000\u063d\u063e\u0001\u0000\u0000\u0000\u063e\u064a\u0001"+ + "\u0000\u0000\u0000\u063f\u063d\u0001\u0000\u0000\u0000\u0640\u0643\u0003"+ + "\u00d2_\u0000\u0641\u0643\u0003\u00cc\\\u0000\u0642\u0640\u0001\u0000"+ + "\u0000\u0000\u0642\u0641\u0001\u0000\u0000\u0000\u0643\u0645\u0001\u0000"+ + "\u0000\u0000\u0644\u0646\u0003\u00d4`\u0000\u0645\u0644\u0001\u0000\u0000"+ + "\u0000\u0646\u0647\u0001\u0000\u0000\u0000\u0647\u0645\u0001\u0000\u0000"+ + "\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648\u064a\u0001\u0000\u0000"+ + "\u0000\u0649\u0639\u0001\u0000\u0000\u0000\u0649\u0642\u0001\u0000\u0000"+ + "\u0000\u064a\u013b\u0001\u0000\u0000\u0000\u064b\u064d\u0003\u00ce]\u0000"+ + "\u064c\u064e\u0003\u00d0^\u0000\u064d\u064c\u0001\u0000\u0000\u0000\u064e"+ + "\u064f\u0001\u0000\u0000\u0000\u064f\u064d\u0001\u0000\u0000\u0000\u064f"+ + "\u0650\u0001\u0000\u0000\u0000\u0650\u0651\u0001\u0000\u0000\u0000\u0651"+ + "\u0652\u0003\u00ce]\u0000\u0652\u013d\u0001\u0000\u0000\u0000\u0653\u0654"+ + "\u0003\u013c\u0094\u0000\u0654\u013f\u0001\u0000\u0000\u0000\u0655\u0656"+ + "\u0003\u0014\u0000\u0000\u0656\u0657\u0001\u0000\u0000\u0000\u0657\u0658"+ + "\u0006\u0096\u0000\u0000\u0658\u0141\u0001\u0000\u0000\u0000\u0659\u065a"+ + "\u0003\u0016\u0001\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b\u065c"+ + "\u0006\u0097\u0000\u0000\u065c\u0143\u0001\u0000\u0000\u0000\u065d\u065e"+ + "\u0003\u0018\u0002\u0000\u065e\u065f\u0001\u0000\u0000\u0000\u065f\u0660"+ + "\u0006\u0098\u0000\u0000\u0660\u0145\u0001\u0000\u0000\u0000\u0661\u0662"+ + "\u0003\u00c0V\u0000\u0662\u0663\u0001\u0000\u0000\u0000\u0663\u0664\u0006"+ + "\u0099\u0012\u0000\u0664\u0665\u0006\u0099\u0013\u0000\u0665\u0147\u0001"+ + "\u0000\u0000\u0000\u0666\u0667\u0003\u00e6i\u0000\u0667\u0668\u0001\u0000"+ + "\u0000\u0000\u0668\u0669\u0006\u009a*\u0000\u0669\u0149\u0001\u0000\u0000"+ + "\u0000\u066a\u066b\u0003\u00e4h\u0000\u066b\u066c\u0001\u0000\u0000\u0000"+ + "\u066c\u066d\u0006\u009b+\u0000\u066d\u014b\u0001\u0000\u0000\u0000\u066e"+ + "\u066f\u0003\u00eak\u0000\u066f\u0670\u0001\u0000\u0000\u0000\u0670\u0671"+ + "\u0006\u009c\u0018\u0000\u0671\u014d\u0001\u0000\u0000\u0000\u0672\u0673"+ + "\u0003\u00e0f\u0000\u0673\u0674\u0001\u0000\u0000\u0000\u0674\u0675\u0006"+ + "\u009d!\u0000\u0675\u014f\u0001\u0000\u0000\u0000\u0676\u0677\u0007\u000f"+ + "\u0000\u0000\u0677\u0678\u0007\u0007\u0000\u0000\u0678\u0679\u0007\u000b"+ + "\u0000\u0000\u0679\u067a\u0007\u0004\u0000\u0000\u067a\u067b\u0007\u0010"+ + "\u0000\u0000\u067b\u067c\u0007\u0004\u0000\u0000\u067c\u067d\u0007\u000b"+ + "\u0000\u0000\u067d\u067e\u0007\u0004\u0000\u0000\u067e\u0151\u0001\u0000"+ + "\u0000\u0000\u067f\u0680\u0003\u010c|\u0000\u0680\u0681\u0001\u0000\u0000"+ + "\u0000\u0681\u0682\u0006\u009f\u001e\u0000\u0682\u0683\u0006\u009f\u0013"+ + "\u0000\u0683\u0684\u0006\u009f\u0004\u0000\u0684\u0153\u0001\u0000\u0000"+ + "\u0000\u0685\u0686\u0003\u0106y\u0000\u0686\u0687\u0001\u0000\u0000\u0000"+ + "\u0687\u0688\u0006\u00a0#\u0000\u0688\u0155\u0001\u0000\u0000\u0000\u0689"+ + "\u068a\u0003\u012e\u008d\u0000\u068a\u068b\u0001\u0000\u0000\u0000\u068b"+ + "\u068c\u0006\u00a1$\u0000\u068c\u0157\u0001\u0000\u0000\u0000\u068d\u068e"+ + "\u0003\u0138\u0092\u0000\u068e\u068f\u0001\u0000\u0000\u0000\u068f\u0690"+ + "\u0006\u00a2\u0014\u0000\u0690\u0691\u0006\u00a2\u0013\u0000\u0691\u0692"+ + "\u0006\u00a2\u0013\u0000\u0692\u0159\u0001\u0000\u0000\u0000\u0693\u0694"+ + "\u0003\u0136\u0091\u0000\u0694\u0695\u0001\u0000\u0000\u0000\u0695\u0696"+ + "\u0006\u00a3\'\u0000\u0696\u0697\u0006\u00a3(\u0000\u0697\u015b\u0001"+ + "\u0000\u0000\u0000\u0698\u069c\b\"\u0000\u0000\u0699\u069a\u0005/\u0000"+ + "\u0000\u069a\u069c\b#\u0000\u0000\u069b\u0698\u0001\u0000\u0000\u0000"+ + "\u069b\u0699\u0001\u0000\u0000\u0000\u069c\u015d\u0001\u0000\u0000\u0000"+ + "\u069d\u069f\u0003\u015c\u00a4\u0000\u069e\u069d\u0001\u0000\u0000\u0000"+ + "\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u069e\u0001\u0000\u0000\u0000"+ + "\u06a0\u06a1\u0001\u0000\u0000\u0000\u06a1\u015f\u0001\u0000\u0000\u0000"+ + "\u06a2\u06a3\u0003\u015e\u00a5\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000"+ + "\u06a4\u06a5\u0006\u00a6,\u0000\u06a5\u0161\u0001\u0000\u0000\u0000\u06a6"+ + "\u06a7\u0003\u00d6a\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06a9"+ + "\u0006\u00a7 \u0000\u06a9\u0163\u0001\u0000\u0000\u0000\u06aa\u06ab\u0003"+ + "\u0014\u0000\u0000\u06ab\u06ac\u0001\u0000\u0000\u0000\u06ac\u06ad\u0006"+ + "\u00a8\u0000\u0000\u06ad\u0165\u0001\u0000\u0000\u0000\u06ae\u06af\u0003"+ + "\u0016\u0001\u0000\u06af\u06b0\u0001\u0000\u0000\u0000\u06b0\u06b1\u0006"+ + "\u00a9\u0000\u0000\u06b1\u0167\u0001\u0000\u0000\u0000\u06b2\u06b3\u0003"+ + "\u0018\u0002\u0000\u06b3\u06b4\u0001\u0000\u0000\u0000\u06b4\u06b5\u0006"+ + "\u00aa\u0000\u0000\u06b5\u0169\u0001\u0000\u0000\u0000\u06b6\u06b7\u0003"+ + "\u0136\u0091\u0000\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06b9\u0006"+ + "\u00ab\'\u0000\u06b9\u06ba\u0006\u00ab(\u0000\u06ba\u016b\u0001\u0000"+ + "\u0000\u0000\u06bb\u06bc\u0003\u0138\u0092\u0000\u06bc\u06bd\u0001\u0000"+ + "\u0000\u0000\u06bd\u06be\u0006\u00ac\u0014\u0000\u06be\u06bf\u0006\u00ac"+ + "\u0013\u0000\u06bf\u06c0\u0006\u00ac\u0013\u0000\u06c0\u016d\u0001\u0000"+ + "\u0000\u0000\u06c1\u06c2\u0003\u00c0V\u0000\u06c2\u06c3\u0001\u0000\u0000"+ + "\u0000\u06c3\u06c4\u0006\u00ad\u0012\u0000\u06c4\u06c5\u0006\u00ad\u0013"+ + "\u0000\u06c5\u016f\u0001\u0000\u0000\u0000\u06c6\u06c7\u0003\u0018\u0002"+ + "\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000\u06c8\u06c9\u0006\u00ae\u0000"+ + "\u0000\u06c9\u0171\u0001\u0000\u0000\u0000\u06ca\u06cb\u0003\u0014\u0000"+ + "\u0000\u06cb\u06cc\u0001\u0000\u0000\u0000\u06cc\u06cd\u0006\u00af\u0000"+ + "\u0000\u06cd\u0173\u0001\u0000\u0000\u0000\u06ce\u06cf\u0003\u0016\u0001"+ + "\u0000\u06cf\u06d0\u0001\u0000\u0000\u0000\u06d0\u06d1\u0006\u00b0\u0000"+ + "\u0000\u06d1\u0175\u0001\u0000\u0000\u0000\u06d2\u06d3\u0003\u00c0V\u0000"+ + "\u06d3\u06d4\u0001\u0000\u0000\u0000\u06d4\u06d5\u0006\u00b1\u0012\u0000"+ + "\u06d5\u06d6\u0006\u00b1\u0013\u0000\u06d6\u0177\u0001\u0000\u0000\u0000"+ + "\u06d7\u06d8\u0003\u0138\u0092\u0000\u06d8\u06d9\u0001\u0000\u0000\u0000"+ + "\u06d9\u06da\u0006\u00b2\u0014\u0000\u06da\u06db\u0006\u00b2\u0013\u0000"+ + "\u06db\u06dc\u0006\u00b2\u0013\u0000\u06dc\u0179\u0001\u0000\u0000\u0000"+ + "\u06dd\u06de\u0007\u0006\u0000\u0000\u06de\u06df\u0007\f\u0000\u0000\u06df"+ + "\u06e0\u0007\t\u0000\u0000\u06e0\u06e1\u0007\u0015\u0000\u0000\u06e1\u06e2"+ + "\u0007\b\u0000\u0000\u06e2\u017b\u0001\u0000\u0000\u0000\u06e3\u06e4\u0007"+ + "\u0011\u0000\u0000\u06e4\u06e5\u0007\u0002\u0000\u0000\u06e5\u06e6\u0007"+ + "\t\u0000\u0000\u06e6\u06e7\u0007\f\u0000\u0000\u06e7\u06e8\u0007\u0007"+ + "\u0000\u0000\u06e8\u017d\u0001\u0000\u0000\u0000\u06e9\u06ea\u0007\u0013"+ + "\u0000\u0000\u06ea\u06eb\u0007\u0007\u0000\u0000\u06eb\u06ec\u0007!\u0000"+ + "\u0000\u06ec\u017f\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003\u010c|\u0000"+ + "\u06ee\u06ef\u0001\u0000\u0000\u0000\u06ef\u06f0\u0006\u00b6\u001e\u0000"+ + "\u06f0\u06f1\u0006\u00b6\u0013\u0000\u06f1\u06f2\u0006\u00b6\u0004\u0000"+ + "\u06f2\u0181\u0001\u0000\u0000\u0000\u06f3\u06f4\u0003\u00eak\u0000\u06f4"+ + "\u06f5\u0001\u0000\u0000\u0000\u06f5\u06f6\u0006\u00b7\u0018\u0000\u06f6"+ + "\u0183\u0001\u0000\u0000\u0000\u06f7\u06f8\u0003\u00eem\u0000\u06f8\u06f9"+ + "\u0001\u0000\u0000\u0000\u06f9\u06fa\u0006\u00b8\u0017\u0000\u06fa\u0185"+ + "\u0001\u0000\u0000\u0000\u06fb\u06fc\u0003\u0106y\u0000\u06fc\u06fd\u0001"+ + "\u0000\u0000\u0000\u06fd\u06fe\u0006\u00b9#\u0000\u06fe\u0187\u0001\u0000"+ + "\u0000\u0000\u06ff\u0700\u0003\u012e\u008d\u0000\u0700\u0701\u0001\u0000"+ + "\u0000\u0000\u0701\u0702\u0006\u00ba$\u0000\u0702\u0189\u0001\u0000\u0000"+ + "\u0000\u0703\u0704\u0003\u012a\u008b\u0000\u0704\u0705\u0001\u0000\u0000"+ + "\u0000\u0705\u0706\u0006\u00bb%\u0000\u0706\u018b\u0001\u0000\u0000\u0000"+ + "\u0707\u0708\u0003\u0130\u008e\u0000\u0708\u0709\u0001\u0000\u0000\u0000"+ + "\u0709\u070a\u0006\u00bc&\u0000\u070a\u018d\u0001\u0000\u0000\u0000\u070b"+ + "\u070c\u0003\u00e2g\u0000\u070c\u070d\u0001\u0000\u0000\u0000\u070d\u070e"+ + "\u0006\u00bd-\u0000\u070e\u018f\u0001\u0000\u0000\u0000\u070f\u0710\u0003"+ + "\u013e\u0095\u0000\u0710\u0711\u0001\u0000\u0000\u0000\u0711\u0712\u0006"+ + "\u00be\u001b\u0000\u0712\u0191\u0001\u0000\u0000\u0000\u0713\u0714\u0003"+ + "\u013a\u0093\u0000\u0714\u0715\u0001\u0000\u0000\u0000\u0715\u0716\u0006"+ + "\u00bf\u001c\u0000\u0716\u0193\u0001\u0000\u0000\u0000\u0717\u0718\u0003"+ + "\u0014\u0000\u0000\u0718\u0719\u0001\u0000\u0000\u0000\u0719\u071a\u0006"+ + "\u00c0\u0000\u0000\u071a\u0195\u0001\u0000\u0000\u0000\u071b\u071c\u0003"+ + "\u0016\u0001\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d\u071e\u0006"+ + "\u00c1\u0000\u0000\u071e\u0197\u0001\u0000\u0000\u0000\u071f\u0720\u0003"+ + "\u0018\u0002\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721\u0722\u0006"+ + "\u00c2\u0000\u0000\u0722\u0199\u0001\u0000\u0000\u0000\u0723\u0724\u0007"+ + "\u0011\u0000\u0000\u0724\u0725\u0007\u000b\u0000\u0000\u0725\u0726\u0007"+ + "\u0004\u0000\u0000\u0726\u0727\u0007\u000b\u0000\u0000\u0727\u0728\u0007"+ + "\u0011\u0000\u0000\u0728\u0729\u0001\u0000\u0000\u0000\u0729\u072a\u0006"+ + "\u00c3\u0013\u0000\u072a\u072b\u0006\u00c3\u0004\u0000\u072b\u019b\u0001"+ + "\u0000\u0000\u0000\u072c\u072d\u0003\u0014\u0000\u0000\u072d\u072e\u0001"+ + "\u0000\u0000\u0000\u072e\u072f\u0006\u00c4\u0000\u0000\u072f\u019d\u0001"+ + "\u0000\u0000\u0000\u0730\u0731\u0003\u0016\u0001\u0000\u0731\u0732\u0001"+ + "\u0000\u0000\u0000\u0732\u0733\u0006\u00c5\u0000\u0000\u0733\u019f\u0001"+ + "\u0000\u0000\u0000\u0734\u0735\u0003\u0018\u0002\u0000\u0735\u0736\u0001"+ + "\u0000\u0000\u0000\u0736\u0737\u0006\u00c6\u0000\u0000\u0737\u01a1\u0001"+ + "\u0000\u0000\u0000\u0738\u0739\u0003\u00c0V\u0000\u0739\u073a\u0001\u0000"+ + "\u0000\u0000\u073a\u073b\u0006\u00c7\u0012\u0000\u073b\u073c\u0006\u00c7"+ + "\u0013\u0000\u073c\u01a3\u0001\u0000\u0000\u0000\u073d\u073e\u0007$\u0000"+ + "\u0000\u073e\u073f\u0007\t\u0000\u0000\u073f\u0740\u0007\n\u0000\u0000"+ + "\u0740\u0741\u0007\u0005\u0000\u0000\u0741\u01a5\u0001\u0000\u0000\u0000"+ + "\u0742\u0743\u0003\u027c\u0134\u0000\u0743\u0744\u0001\u0000\u0000\u0000"+ + "\u0744\u0745\u0006\u00c9\u0016\u0000\u0745\u01a7\u0001\u0000\u0000\u0000"+ + "\u0746\u0747\u0003\u0102w\u0000\u0747\u0748\u0001\u0000\u0000\u0000\u0748"+ + "\u0749\u0006\u00ca\u0015\u0000\u0749\u074a\u0006\u00ca\u0013\u0000\u074a"+ + "\u074b\u0006\u00ca\u0004\u0000\u074b\u01a9\u0001\u0000\u0000\u0000\u074c"+ + "\u074d\u0007\u0015\u0000\u0000\u074d\u074e\u0007\u0011\u0000\u0000\u074e"+ + "\u074f\u0007\n\u0000\u0000\u074f\u0750\u0007\u0005\u0000\u0000\u0750\u0751"+ + "\u0007\u0006\u0000\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753"+ + "\u0006\u00cb\u0013\u0000\u0753\u0754\u0006\u00cb\u0004\u0000\u0754\u01ab"+ + "\u0001\u0000\u0000\u0000\u0755\u0756\u0003\u015e\u00a5\u0000\u0756\u0757"+ + "\u0001\u0000\u0000\u0000\u0757\u0758\u0006\u00cc,\u0000\u0758\u01ad\u0001"+ + "\u0000\u0000\u0000\u0759\u075a\u0003\u00d6a\u0000\u075a\u075b\u0001\u0000"+ + "\u0000\u0000\u075b\u075c\u0006\u00cd \u0000\u075c\u01af\u0001\u0000\u0000"+ + "\u0000\u075d\u075e\u0003\u00e6i\u0000\u075e\u075f\u0001\u0000\u0000\u0000"+ + "\u075f\u0760\u0006\u00ce*\u0000\u0760\u01b1\u0001\u0000\u0000\u0000\u0761"+ + "\u0762\u0003\u0014\u0000\u0000\u0762\u0763\u0001\u0000\u0000\u0000\u0763"+ + "\u0764\u0006\u00cf\u0000\u0000\u0764\u01b3\u0001\u0000\u0000\u0000\u0765"+ + "\u0766\u0003\u0016\u0001\u0000\u0766\u0767\u0001\u0000\u0000\u0000\u0767"+ + "\u0768\u0006\u00d0\u0000\u0000\u0768\u01b5\u0001\u0000\u0000\u0000\u0769"+ + "\u076a\u0003\u0018\u0002\u0000\u076a\u076b\u0001\u0000\u0000\u0000\u076b"+ + "\u076c\u0006\u00d1\u0000\u0000\u076c\u01b7\u0001\u0000\u0000\u0000\u076d"+ + "\u076e\u0003\u00c0V\u0000\u076e\u076f\u0001\u0000\u0000\u0000\u076f\u0770"+ + "\u0006\u00d2\u0012\u0000\u0770\u0771\u0006\u00d2\u0013\u0000\u0771\u01b9"+ + "\u0001\u0000\u0000\u0000\u0772\u0773\u0003\u0138\u0092\u0000\u0773\u0774"+ + "\u0001\u0000\u0000\u0000\u0774\u0775\u0006\u00d3\u0014\u0000\u0775\u0776"+ + "\u0006\u00d3\u0013\u0000\u0776\u0777\u0006\u00d3\u0013\u0000\u0777\u01bb"+ + "\u0001\u0000\u0000\u0000\u0778\u0779\u0003\u00e6i\u0000\u0779\u077a\u0001"+ + "\u0000\u0000\u0000\u077a\u077b\u0006\u00d4*\u0000\u077b\u01bd\u0001\u0000"+ + "\u0000\u0000\u077c\u077d\u0003\u00eak\u0000\u077d\u077e\u0001\u0000\u0000"+ + "\u0000\u077e\u077f\u0006\u00d5\u0018\u0000\u077f\u01bf\u0001\u0000\u0000"+ + "\u0000\u0780\u0781\u0003\u00eem\u0000\u0781\u0782\u0001\u0000\u0000\u0000"+ + "\u0782\u0783\u0006\u00d6\u0017\u0000\u0783\u01c1\u0001\u0000\u0000\u0000"+ + "\u0784\u0785\u0003\u0102w\u0000\u0785\u0786\u0001\u0000\u0000\u0000\u0786"+ + "\u0787\u0006\u00d7\u0015\u0000\u0787\u0788\u0006\u00d7.\u0000\u0788\u01c3"+ + "\u0001\u0000\u0000\u0000\u0789\u078a\u0003\u015e\u00a5\u0000\u078a\u078b"+ + "\u0001\u0000\u0000\u0000\u078b\u078c\u0006\u00d8,\u0000\u078c\u01c5\u0001"+ + "\u0000\u0000\u0000\u078d\u078e\u0003\u00d6a\u0000\u078e\u078f\u0001\u0000"+ + "\u0000\u0000\u078f\u0790\u0006\u00d9 \u0000\u0790\u01c7\u0001\u0000\u0000"+ + "\u0000\u0791\u0792\u0003\u0014\u0000\u0000\u0792\u0793\u0001\u0000\u0000"+ + "\u0000\u0793\u0794\u0006\u00da\u0000\u0000\u0794\u01c9\u0001\u0000\u0000"+ + "\u0000\u0795\u0796\u0003\u0016\u0001\u0000\u0796\u0797\u0001\u0000\u0000"+ + "\u0000\u0797\u0798\u0006\u00db\u0000\u0000\u0798\u01cb\u0001\u0000\u0000"+ + "\u0000\u0799\u079a\u0003\u0018\u0002\u0000\u079a\u079b\u0001\u0000\u0000"+ + "\u0000\u079b\u079c\u0006\u00dc\u0000\u0000\u079c\u01cd\u0001\u0000\u0000"+ + "\u0000\u079d\u079e\u0003\u00c0V\u0000\u079e\u079f\u0001\u0000\u0000\u0000"+ + "\u079f\u07a0\u0006\u00dd\u0012\u0000\u07a0\u07a1\u0006\u00dd\u0013\u0000"+ + "\u07a1\u07a2\u0006\u00dd\u0013\u0000\u07a2\u01cf\u0001\u0000\u0000\u0000"+ + "\u07a3\u07a4\u0003\u0138\u0092\u0000\u07a4\u07a5\u0001\u0000\u0000\u0000"+ + "\u07a5\u07a6\u0006\u00de\u0014\u0000\u07a6\u07a7\u0006\u00de\u0013\u0000"+ + "\u07a7\u07a8\u0006\u00de\u0013\u0000\u07a8\u07a9\u0006\u00de\u0013\u0000"+ + "\u07a9\u01d1\u0001\u0000\u0000\u0000\u07aa\u07ab\u0003\u00eak\u0000\u07ab"+ + "\u07ac\u0001\u0000\u0000\u0000\u07ac\u07ad\u0006\u00df\u0018\u0000\u07ad"+ + "\u01d3\u0001\u0000\u0000\u0000\u07ae\u07af\u0003\u00eem\u0000\u07af\u07b0"+ + "\u0001\u0000\u0000\u0000\u07b0\u07b1\u0006\u00e0\u0017\u0000\u07b1\u01d5"+ + "\u0001\u0000\u0000\u0000\u07b2\u07b3\u0003\u0238\u0112\u0000\u07b3\u07b4"+ + "\u0001\u0000\u0000\u0000\u07b4\u07b5\u0006\u00e1\"\u0000\u07b5\u01d7\u0001"+ + "\u0000\u0000\u0000\u07b6\u07b7\u0003\u0014\u0000\u0000\u07b7\u07b8\u0001"+ + "\u0000\u0000\u0000\u07b8\u07b9\u0006\u00e2\u0000\u0000\u07b9\u01d9\u0001"+ + "\u0000\u0000\u0000\u07ba\u07bb\u0003\u0016\u0001\u0000\u07bb\u07bc\u0001"+ + "\u0000\u0000\u0000\u07bc\u07bd\u0006\u00e3\u0000\u0000\u07bd\u01db\u0001"+ + "\u0000\u0000\u0000\u07be\u07bf\u0003\u0018\u0002\u0000\u07bf\u07c0\u0001"+ + "\u0000\u0000\u0000\u07c0\u07c1\u0006\u00e4\u0000\u0000\u07c1\u01dd\u0001"+ + "\u0000\u0000\u0000\u07c2\u07c3\u0003(\n\u0000\u07c3\u07c4\u0001\u0000"+ + "\u0000\u0000\u07c4\u07c5\u0006\u00e5\u0013\u0000\u07c5\u07c6\u0006\u00e5"+ + "\u0004\u0000\u07c6\u01df\u0001\u0000\u0000\u0000\u07c7\u07c8\u0003\u0102"+ + "w\u0000\u07c8\u07c9\u0001\u0000\u0000\u0000\u07c9\u07ca\u0006\u00e6\u0015"+ + "\u0000\u07ca\u01e1\u0001\u0000\u0000\u0000\u07cb\u07cc\u0003\u013a\u0093"+ + "\u0000\u07cc\u07cd\u0001\u0000\u0000\u0000\u07cd\u07ce\u0006\u00e7\u001c"+ + "\u0000\u07ce\u01e3\u0001\u0000\u0000\u0000\u07cf\u07d0\u0003\u0132\u008f"+ + "\u0000\u07d0\u07d1\u0001\u0000\u0000\u0000\u07d1\u07d2\u0006\u00e8\u0019"+ + "\u0000\u07d2\u01e5\u0001\u0000\u0000\u0000\u07d3\u07d4\u0003\u0134\u0090"+ + "\u0000\u07d4\u07d5\u0001\u0000\u0000\u0000\u07d5\u07d6\u0006\u00e9\u001a"+ + "\u0000\u07d6\u01e7\u0001\u0000\u0000\u0000\u07d7\u07d8\u0003\u00eak\u0000"+ + "\u07d8\u07d9\u0001\u0000\u0000\u0000\u07d9\u07da\u0006\u00ea\u0018\u0000"+ + "\u07da\u01e9\u0001\u0000\u0000\u0000\u07db\u07dc\u0003\u011c\u0084\u0000"+ + "\u07dc\u07dd\u0001\u0000\u0000\u0000\u07dd\u07de\u0006\u00eb/\u0000\u07de"+ + "\u01eb\u0001\u0000\u0000\u0000\u07df\u07e0\u0003\u011e\u0085\u0000\u07e0"+ + "\u07e1\u0001\u0000\u0000\u0000\u07e1\u07e2\u0006\u00ec0\u0000\u07e2\u01ed"+ + "\u0001\u0000\u0000\u0000\u07e3\u07e4\u0003\u00dac\u0000\u07e4\u07e5\u0001"+ + "\u0000\u0000\u0000\u07e5\u07e6\u0006\u00ed1\u0000\u07e6\u01ef\u0001\u0000"+ + "\u0000\u0000\u07e7\u07e8\u0003\u00d8b\u0000\u07e8\u07e9\u0001\u0000\u0000"+ + "\u0000\u07e9\u07ea\u0006\u00ee2\u0000\u07ea\u01f1\u0001\u0000\u0000\u0000"+ + "\u07eb\u07ec\u0003\u0106y\u0000\u07ec\u07ed\u0001\u0000\u0000\u0000\u07ed"+ + "\u07ee\u0006\u00ef#\u0000\u07ee\u01f3\u0001\u0000\u0000\u0000\u07ef\u07f0"+ + "\u0003\u012e\u008d\u0000\u07f0\u07f1\u0001\u0000\u0000\u0000\u07f1\u07f2"+ + "\u0006\u00f0$\u0000\u07f2\u01f5\u0001\u0000\u0000\u0000\u07f3\u07f4\u0003"+ + "\u0136\u0091\u0000\u07f4\u07f5\u0001\u0000\u0000\u0000\u07f5\u07f6\u0006"+ + "\u00f1\'\u0000\u07f6\u01f7\u0001\u0000\u0000\u0000\u07f7\u07f8\u0003\u0138"+ + "\u0092\u0000\u07f8\u07f9\u0001\u0000\u0000\u0000\u07f9\u07fa\u0006\u00f2"+ + "\u0014\u0000\u07fa\u01f9\u0001\u0000\u0000\u0000\u07fb\u07fc\u0003\u00d6"+ + "a\u0000\u07fc\u07fd\u0001\u0000\u0000\u0000\u07fd\u07fe\u0006\u00f3 \u0000"+ + "\u07fe\u01fb\u0001\u0000\u0000\u0000\u07ff\u0800\u0003\u00e4h\u0000\u0800"+ + "\u0801\u0001\u0000\u0000\u0000\u0801\u0802\u0006\u00f4+\u0000\u0802\u01fd"+ + "\u0001\u0000\u0000\u0000\u0803\u0804\u0003\u0014\u0000\u0000\u0804\u0805"+ + "\u0001\u0000\u0000\u0000\u0805\u0806\u0006\u00f5\u0000\u0000\u0806\u01ff"+ + "\u0001\u0000\u0000\u0000\u0807\u0808\u0003\u0016\u0001\u0000\u0808\u0809"+ + "\u0001\u0000\u0000\u0000\u0809\u080a\u0006\u00f6\u0000\u0000\u080a\u0201"+ + "\u0001\u0000\u0000\u0000\u080b\u080c\u0003\u0018\u0002\u0000\u080c\u080d"+ + "\u0001\u0000\u0000\u0000\u080d\u080e\u0006\u00f7\u0000\u0000\u080e\u0203"+ + "\u0001\u0000\u0000\u0000\u080f\u0810\u0003\u00c0V\u0000\u0810\u0811\u0001"+ + "\u0000\u0000\u0000\u0811\u0812\u0006\u00f8\u0012\u0000\u0812\u0813\u0006"+ + "\u00f8\u0013\u0000\u0813\u0205\u0001\u0000\u0000\u0000\u0814\u0815\u0003"+ + "\u0138\u0092\u0000\u0815\u0816\u0001\u0000\u0000\u0000\u0816\u0817\u0006"+ + "\u00f9\u0014\u0000\u0817\u0818\u0006\u00f9\u0013\u0000\u0818\u0819\u0006"+ + "\u00f9\u0013\u0000\u0819\u0207\u0001\u0000\u0000\u0000\u081a\u081b\u0003"+ + "\u0132\u008f\u0000\u081b\u081c\u0001\u0000\u0000\u0000\u081c\u081d\u0006"+ + "\u00fa\u0019\u0000\u081d\u0209\u0001\u0000\u0000\u0000\u081e\u081f\u0003"+ + "\u0134\u0090\u0000\u081f\u0820\u0001\u0000\u0000\u0000\u0820\u0821\u0006"+ + "\u00fb\u001a\u0000\u0821\u020b\u0001\u0000\u0000\u0000\u0822\u0823\u0003"+ + "\u00eem\u0000\u0823\u0824\u0001\u0000\u0000\u0000\u0824\u0825\u0006\u00fc"+ + "\u0017\u0000\u0825\u020d\u0001\u0000\u0000\u0000\u0826\u0827\u0003\u0106"+ + "y\u0000\u0827\u0828\u0001\u0000\u0000\u0000\u0828\u0829\u0006\u00fd#\u0000"+ + "\u0829\u020f\u0001\u0000\u0000\u0000\u082a\u082b\u0003\u012e\u008d\u0000"+ + "\u082b\u082c\u0001\u0000\u0000\u0000\u082c\u082d\u0006\u00fe$\u0000\u082d"+ + "\u0211\u0001\u0000\u0000\u0000\u082e\u082f\u0003\u012a\u008b\u0000\u082f"+ + "\u0830\u0001\u0000\u0000\u0000\u0830\u0831\u0006\u00ff%\u0000\u0831\u0213"+ + "\u0001\u0000\u0000\u0000\u0832\u0833\u0003\u0130\u008e\u0000\u0833\u0834"+ + "\u0001\u0000\u0000\u0000\u0834\u0835\u0006\u0100&\u0000\u0835\u0215\u0001"+ + "\u0000\u0000\u0000\u0836\u0837\u0003\u013e\u0095\u0000\u0837\u0838\u0001"+ + "\u0000\u0000\u0000\u0838\u0839\u0006\u0101\u001b\u0000\u0839\u0217\u0001"+ + "\u0000\u0000\u0000\u083a\u083b\u0003\u013a\u0093\u0000\u083b\u083c\u0001"+ + "\u0000\u0000\u0000\u083c\u083d\u0006\u0102\u001c\u0000\u083d\u0219\u0001"+ + "\u0000\u0000\u0000\u083e\u083f\u0003\u0014\u0000\u0000\u083f\u0840\u0001"+ + "\u0000\u0000\u0000\u0840\u0841\u0006\u0103\u0000\u0000\u0841\u021b\u0001"+ + "\u0000\u0000\u0000\u0842\u0843\u0003\u0016\u0001\u0000\u0843\u0844\u0001"+ + "\u0000\u0000\u0000\u0844\u0845\u0006\u0104\u0000\u0000\u0845\u021d\u0001"+ + "\u0000\u0000\u0000\u0846\u0847\u0003\u0018\u0002\u0000\u0847\u0848\u0001"+ + "\u0000\u0000\u0000\u0848\u0849\u0006\u0105\u0000\u0000\u0849\u021f\u0001"+ + "\u0000\u0000\u0000\u084a\u084b\u0003\u00c0V\u0000\u084b\u084c\u0001\u0000"+ + "\u0000\u0000\u084c\u084d\u0006\u0106\u0012\u0000\u084d\u084e\u0006\u0106"+ + "\u0013\u0000\u084e\u0221\u0001\u0000\u0000\u0000\u084f\u0850\u0003\u0138"+ + "\u0092\u0000\u0850\u0851\u0001\u0000\u0000\u0000\u0851\u0852\u0006\u0107"+ + "\u0014\u0000\u0852\u0853\u0006\u0107\u0013\u0000\u0853\u0854\u0006\u0107"+ + "\u0013\u0000\u0854\u0223\u0001\u0000\u0000\u0000\u0855\u0856\u0003\u00ee"+ + "m\u0000\u0856\u0857\u0001\u0000\u0000\u0000\u0857\u0858\u0006\u0108\u0017"+ + "\u0000\u0858\u0225\u0001\u0000\u0000\u0000\u0859\u085a\u0003\u0132\u008f"+ + "\u0000\u085a\u085b\u0001\u0000\u0000\u0000\u085b\u085c\u0006\u0109\u0019"+ + "\u0000\u085c\u0227\u0001\u0000\u0000\u0000\u085d\u085e\u0003\u0134\u0090"+ + "\u0000\u085e\u085f\u0001\u0000\u0000\u0000\u085f\u0860\u0006\u010a\u001a"+ + "\u0000\u0860\u0229\u0001\u0000\u0000\u0000\u0861\u0862\u0003\u00eak\u0000"+ + "\u0862\u0863\u0001\u0000\u0000\u0000\u0863\u0864\u0006\u010b\u0018\u0000"+ + "\u0864\u022b\u0001\u0000\u0000\u0000\u0865\u0866\u0003\u0106y\u0000\u0866"+ + "\u0867\u0001\u0000\u0000\u0000\u0867\u0868\u0006\u010c#\u0000\u0868\u022d"+ + "\u0001\u0000\u0000\u0000\u0869\u086a\u0003\u012e\u008d\u0000\u086a\u086b"+ + "\u0001\u0000\u0000\u0000\u086b\u086c\u0006\u010d$\u0000\u086c\u022f\u0001"+ + "\u0000\u0000\u0000\u086d\u086e\u0003\u012a\u008b\u0000\u086e\u086f\u0001"+ + "\u0000\u0000\u0000\u086f\u0870\u0006\u010e%\u0000\u0870\u0231\u0001\u0000"+ + "\u0000\u0000\u0871\u0872\u0003\u0130\u008e\u0000\u0872\u0873\u0001\u0000"+ + "\u0000\u0000\u0873\u0874\u0006\u010f&\u0000\u0874\u0233\u0001\u0000\u0000"+ + "\u0000\u0875\u087a\u0003\u00c4X\u0000\u0876\u087a\u0003\u00c2W\u0000\u0877"+ + "\u087a\u0003\u00d2_\u0000\u0878\u087a\u0003\u0120\u0086\u0000\u0879\u0875"+ + "\u0001\u0000\u0000\u0000\u0879\u0876\u0001\u0000\u0000\u0000\u0879\u0877"+ + "\u0001\u0000\u0000\u0000\u0879\u0878\u0001\u0000\u0000\u0000\u087a\u0235"+ + "\u0001\u0000\u0000\u0000\u087b\u087e\u0003\u00c4X\u0000\u087c\u087e\u0003"+ + "\u0120\u0086\u0000\u087d\u087b\u0001\u0000\u0000\u0000\u087d\u087c\u0001"+ + "\u0000\u0000\u0000\u087e\u0882\u0001\u0000\u0000\u0000\u087f\u0881\u0003"+ + "\u0234\u0110\u0000\u0880\u087f\u0001\u0000\u0000\u0000\u0881\u0884\u0001"+ + "\u0000\u0000\u0000\u0882\u0880\u0001\u0000\u0000\u0000\u0882\u0883\u0001"+ + "\u0000\u0000\u0000\u0883\u088f\u0001\u0000\u0000\u0000\u0884\u0882\u0001"+ + "\u0000\u0000\u0000\u0885\u0888\u0003\u00d2_\u0000\u0886\u0888\u0003\u00cc"+ + "\\\u0000\u0887\u0885\u0001\u0000\u0000\u0000\u0887\u0886\u0001\u0000\u0000"+ + "\u0000\u0888\u088a\u0001\u0000\u0000\u0000\u0889\u088b\u0003\u0234\u0110"+ + "\u0000\u088a\u0889\u0001\u0000\u0000\u0000\u088b\u088c\u0001\u0000\u0000"+ + "\u0000\u088c\u088a\u0001\u0000\u0000\u0000\u088c\u088d\u0001\u0000\u0000"+ + "\u0000\u088d\u088f\u0001\u0000\u0000\u0000\u088e\u087d\u0001\u0000\u0000"+ + "\u0000\u088e\u0887\u0001\u0000\u0000\u0000\u088f\u0237\u0001\u0000\u0000"+ + "\u0000\u0890\u0893\u0003\u0236\u0111\u0000\u0891\u0893\u0003\u013c\u0094"+ + "\u0000\u0892\u0890\u0001\u0000\u0000\u0000\u0892\u0891\u0001\u0000\u0000"+ + "\u0000\u0893\u0894\u0001\u0000\u0000\u0000\u0894\u0892\u0001\u0000\u0000"+ + "\u0000\u0894\u0895\u0001\u0000\u0000\u0000\u0895\u0239\u0001\u0000\u0000"+ + "\u0000\u0896\u0897\u0003\u0014\u0000\u0000\u0897\u0898\u0001\u0000\u0000"+ + "\u0000\u0898\u0899\u0006\u0113\u0000\u0000\u0899\u023b\u0001\u0000\u0000"+ + "\u0000\u089a\u089b\u0003\u0016\u0001\u0000\u089b\u089c\u0001\u0000\u0000"+ + "\u0000\u089c\u089d\u0006\u0114\u0000\u0000\u089d\u023d\u0001\u0000\u0000"+ + "\u0000\u089e\u089f\u0003\u0018\u0002\u0000\u089f\u08a0\u0001\u0000\u0000"+ + "\u0000\u08a0\u08a1\u0006\u0115\u0000\u0000\u08a1\u023f\u0001\u0000\u0000"+ + "\u0000\u08a2\u08a3\u0003\u013a\u0093\u0000\u08a3\u08a4\u0001\u0000\u0000"+ + "\u0000\u08a4\u08a5\u0006\u0116\u001c\u0000\u08a5\u0241\u0001\u0000\u0000"+ + "\u0000\u08a6\u08a7\u0003\u013e\u0095\u0000\u08a7\u08a8\u0001\u0000\u0000"+ + "\u0000\u08a8\u08a9\u0006\u0117\u001b\u0000\u08a9\u0243\u0001\u0000\u0000"+ + "\u0000\u08aa\u08ab\u0003\u00e0f\u0000\u08ab\u08ac\u0001\u0000\u0000\u0000"+ + "\u08ac\u08ad\u0006\u0118!\u0000\u08ad\u0245\u0001\u0000\u0000\u0000\u08ae"+ + "\u08af\u0003\u012e\u008d\u0000\u08af\u08b0\u0001\u0000\u0000\u0000\u08b0"+ + "\u08b1\u0006\u0119$\u0000\u08b1\u0247\u0001\u0000\u0000\u0000\u08b2\u08b3"+ + "\u0003\u015e\u00a5\u0000\u08b3\u08b4\u0001\u0000\u0000\u0000\u08b4\u08b5"+ + "\u0006\u011a,\u0000\u08b5\u0249\u0001\u0000\u0000\u0000\u08b6\u08b7\u0003"+ + "\u00d6a\u0000\u08b7\u08b8\u0001\u0000\u0000\u0000\u08b8\u08b9\u0006\u011b"+ + " \u0000\u08b9\u024b\u0001\u0000\u0000\u0000\u08ba\u08bb\u0003\u00e6i\u0000"+ + "\u08bb\u08bc\u0001\u0000\u0000\u0000\u08bc\u08bd\u0006\u011c*\u0000\u08bd"+ + "\u024d\u0001\u0000\u0000\u0000\u08be\u08bf\u0003\u00e4h\u0000\u08bf\u08c0"+ + "\u0001\u0000\u0000\u0000\u08c0\u08c1\u0006\u011d+\u0000\u08c1\u024f\u0001"+ + "\u0000\u0000\u0000\u08c2\u08c3\u0003\u00eak\u0000\u08c3\u08c4\u0001\u0000"+ + "\u0000\u0000\u08c4\u08c5\u0006\u011e\u0018\u0000\u08c5\u0251\u0001\u0000"+ + "\u0000\u0000\u08c6\u08c7\u0003\u00c0V\u0000\u08c7\u08c8\u0001\u0000\u0000"+ + "\u0000\u08c8\u08c9\u0006\u011f\u0012\u0000\u08c9\u08ca\u0006\u011f\u0013"+ + "\u0000\u08ca\u0253\u0001\u0000\u0000\u0000\u08cb\u08cc\u0003\u0136\u0091"+ + "\u0000\u08cc\u08cd\u0006\u01203\u0000\u08cd\u08ce\u0001\u0000\u0000\u0000"+ + "\u08ce\u08cf\u0006\u0120\'\u0000\u08cf\u0255\u0001\u0000\u0000\u0000\u08d0"+ + "\u08d1\u0005)\u0000\u0000\u08d1\u08d2\u0004\u0121\b\u0000\u08d2\u08d3"+ + "\u0006\u01214\u0000\u08d3\u08d4\u0001\u0000\u0000\u0000\u08d4\u08d5\u0006"+ + "\u0121\u0014\u0000\u08d5\u0257\u0001\u0000\u0000\u0000\u08d6\u08d7\u0005"+ + ")\u0000\u0000\u08d7\u08d8\u0004\u0122\t\u0000\u08d8\u08d9\u0006\u0122"+ + "5\u0000\u08d9\u08da\u0001\u0000\u0000\u0000\u08da\u08db\u0006\u0122\u0014"+ + "\u0000\u08db\u08dc\u0006\u0122\u0013\u0000\u08dc\u0259\u0001\u0000\u0000"+ + "\u0000\u08dd\u08de\u0003\u0014\u0000\u0000\u08de\u08df\u0001\u0000\u0000"+ + "\u0000\u08df\u08e0\u0006\u0123\u0000\u0000\u08e0\u025b\u0001\u0000\u0000"+ + "\u0000\u08e1\u08e2\u0003\u0016\u0001\u0000\u08e2\u08e3\u0001\u0000\u0000"+ + "\u0000\u08e3\u08e4\u0006\u0124\u0000\u0000\u08e4\u025d\u0001\u0000\u0000"+ + "\u0000\u08e5\u08e6\u0003\u0018\u0002\u0000\u08e6\u08e7\u0001\u0000\u0000"+ + "\u0000\u08e7\u08e8\u0006\u0125\u0000\u0000\u08e8\u025f\u0001\u0000\u0000"+ + "\u0000\u08e9\u08ed\u0005#\u0000\u0000\u08ea\u08ec\b\u0000\u0000\u0000"+ + "\u08eb\u08ea\u0001\u0000\u0000\u0000\u08ec\u08ef\u0001\u0000\u0000\u0000"+ + "\u08ed\u08eb\u0001\u0000\u0000\u0000\u08ed\u08ee\u0001\u0000\u0000\u0000"+ + "\u08ee\u08f1\u0001\u0000\u0000\u0000\u08ef\u08ed\u0001\u0000\u0000\u0000"+ + "\u08f0\u08f2\u0005\r\u0000\u0000\u08f1\u08f0\u0001\u0000\u0000\u0000\u08f1"+ + "\u08f2\u0001\u0000\u0000\u0000\u08f2\u08f4\u0001\u0000\u0000\u0000\u08f3"+ + "\u08f5\u0005\n\u0000\u0000\u08f4\u08f3\u0001\u0000\u0000\u0000\u08f4\u08f5"+ + "\u0001\u0000\u0000\u0000\u08f5\u0261\u0001\u0000\u0000\u0000\u08f6\u08fc"+ + "\u0005\'\u0000\u0000\u08f7\u08f8\u0005\\\u0000\u0000\u08f8\u08fb\t\u0000"+ + "\u0000\u0000\u08f9\u08fb\b%\u0000\u0000\u08fa\u08f7\u0001\u0000\u0000"+ + "\u0000\u08fa\u08f9\u0001\u0000\u0000\u0000\u08fb\u08fe\u0001\u0000\u0000"+ + "\u0000\u08fc\u08fa\u0001\u0000\u0000\u0000\u08fc\u08fd\u0001\u0000\u0000"+ + "\u0000\u08fd\u08ff\u0001\u0000\u0000\u0000\u08fe\u08fc\u0001\u0000\u0000"+ + "\u0000\u08ff\u0900\u0005\'\u0000\u0000\u0900\u0263\u0001\u0000\u0000\u0000"+ + "\u0901\u0902\b&\u0000\u0000\u0902\u0265\u0001\u0000\u0000\u0000\u0903"+ + "\u0904\u0003\u00c0V\u0000\u0904\u0905\u0001\u0000\u0000\u0000\u0905\u0906"+ + "\u0006\u0129\u0012\u0000\u0906\u0907\u0006\u0129\u0013\u0000\u0907\u0267"+ + "\u0001\u0000\u0000\u0000\u0908\u0909\u0003\u0138\u0092\u0000\u0909\u090a"+ + "\u0001\u0000\u0000\u0000\u090a\u090b\u0006\u012a\u0014\u0000\u090b\u090c"+ + "\u0006\u012a\u0013\u0000\u090c\u090d\u0006\u012a\u0013\u0000\u090d\u0269"+ + "\u0001\u0000\u0000\u0000\u090e\u090f\u0003\u0132\u008f\u0000\u090f\u0910"+ + "\u0001\u0000\u0000\u0000\u0910\u0911\u0006\u012b\u0019\u0000\u0911\u026b"+ + "\u0001\u0000\u0000\u0000\u0912\u0913\u0003\u0134\u0090\u0000\u0913\u0914"+ + "\u0001\u0000\u0000\u0000\u0914\u0915\u0006\u012c\u001a\u0000\u0915\u026d"+ + "\u0001\u0000\u0000\u0000\u0916\u0917\u0003\u00e0f\u0000\u0917\u0918\u0001"+ + "\u0000\u0000\u0000\u0918\u0919\u0006\u012d!\u0000\u0919\u026f\u0001\u0000"+ + "\u0000\u0000\u091a\u091b\u0003\u00eak\u0000\u091b\u091c\u0001\u0000\u0000"+ + "\u0000\u091c\u091d\u0006\u012e\u0018\u0000\u091d\u0271\u0001\u0000\u0000"+ + "\u0000\u091e\u091f\u0003\u00eem\u0000\u091f\u0920\u0001\u0000\u0000\u0000"+ + "\u0920\u0921\u0006\u012f\u0017\u0000\u0921\u0273\u0001\u0000\u0000\u0000"+ + "\u0922\u0923\u0003\u0106y\u0000\u0923\u0924\u0001\u0000\u0000\u0000\u0924"+ + "\u0925\u0006\u0130#\u0000\u0925\u0275\u0001\u0000\u0000\u0000\u0926\u0927"+ + "\u0003\u012e\u008d\u0000\u0927\u0928\u0001\u0000\u0000\u0000\u0928\u0929"+ + "\u0006\u0131$\u0000\u0929\u0277\u0001\u0000\u0000\u0000\u092a\u092b\u0003"+ + "\u012a\u008b\u0000\u092b\u092c\u0001\u0000\u0000\u0000\u092c\u092d\u0006"+ + "\u0132%\u0000\u092d\u0279\u0001\u0000\u0000\u0000\u092e\u092f\u0003\u0130"+ + "\u008e\u0000\u092f\u0930\u0001\u0000\u0000\u0000\u0930\u0931\u0006\u0133"+ + "&\u0000\u0931\u027b\u0001\u0000\u0000\u0000\u0932\u0933\u0007\u0004\u0000"+ + "\u0000\u0933\u0934\u0007\u0011\u0000\u0000\u0934\u027d\u0001\u0000\u0000"+ + "\u0000\u0935\u0936\u0003\u0238\u0112\u0000\u0936\u0937\u0001\u0000\u0000"+ + "\u0000\u0937\u0938\u0006\u0135\"\u0000\u0938\u027f\u0001\u0000\u0000\u0000"+ + "\u0939\u093a\u0003\u0014\u0000\u0000\u093a\u093b\u0001\u0000\u0000\u0000"+ + "\u093b\u093c\u0006\u0136\u0000\u0000\u093c\u0281\u0001\u0000\u0000\u0000"+ + "\u093d\u093e\u0003\u0016\u0001\u0000\u093e\u093f\u0001\u0000\u0000\u0000"+ + "\u093f\u0940\u0006\u0137\u0000\u0000\u0940\u0283\u0001\u0000\u0000\u0000"+ + "\u0941\u0942\u0003\u0018\u0002\u0000\u0942\u0943\u0001\u0000\u0000\u0000"+ + "\u0943\u0944\u0006\u0138\u0000\u0000\u0944\u0285\u0001\u0000\u0000\u0000"+ + "\u0945\u0946\u0003\u010a{\u0000\u0946\u0947\u0001\u0000\u0000\u0000\u0947"+ + "\u0948\u0006\u01396\u0000\u0948\u0287\u0001\u0000\u0000\u0000\u0949\u094a"+ + "\u0003\u00f0n\u0000\u094a\u094b\u0001\u0000\u0000\u0000\u094b\u094c\u0006"+ + "\u013a7\u0000\u094c\u0289\u0001\u0000\u0000\u0000\u094d\u094e\u0003\u00fe"+ + "u\u0000\u094e\u094f\u0001\u0000\u0000\u0000\u094f\u0950\u0006\u013b8\u0000"+ + "\u0950\u028b\u0001\u0000\u0000\u0000\u0951\u0952\u0003\u00e8j\u0000\u0952"+ + "\u0953\u0001\u0000\u0000\u0000\u0953\u0954\u0006\u013c9\u0000\u0954\u0955"+ + "\u0006\u013c\u0013\u0000\u0955\u028d\u0001\u0000\u0000\u0000\u0956\u0957"+ + "\u0003\u00e0f\u0000\u0957\u0958\u0001\u0000\u0000\u0000\u0958\u0959\u0006"+ + "\u013d!\u0000\u0959\u028f\u0001\u0000\u0000\u0000\u095a\u095b\u0003\u00d6"+ + "a\u0000\u095b\u095c\u0001\u0000\u0000\u0000\u095c\u095d\u0006\u013e \u0000"+ + "\u095d\u0291\u0001\u0000\u0000\u0000\u095e\u095f\u0003\u013a\u0093\u0000"+ + "\u095f\u0960\u0001\u0000\u0000\u0000\u0960\u0961\u0006\u013f\u001c\u0000"+ + "\u0961\u0293\u0001\u0000\u0000\u0000\u0962\u0963\u0003\u013e\u0095\u0000"+ + "\u0963\u0964\u0001\u0000\u0000\u0000\u0964\u0965\u0006\u0140\u001b\u0000"+ + "\u0965\u0295\u0001\u0000\u0000\u0000\u0966\u0967\u0003\u00dac\u0000\u0967"+ + "\u0968\u0001\u0000\u0000\u0000\u0968\u0969\u0006\u01411\u0000\u0969\u0297"+ + "\u0001\u0000\u0000\u0000\u096a\u096b\u0003\u00d8b\u0000\u096b\u096c\u0001"+ + "\u0000\u0000\u0000\u096c\u096d\u0006\u01422\u0000\u096d\u0299\u0001\u0000"+ + "\u0000\u0000\u096e\u096f\u0003\u00e6i\u0000\u096f\u0970\u0001\u0000\u0000"+ + "\u0000\u0970\u0971\u0006\u0143*\u0000\u0971\u029b\u0001\u0000\u0000\u0000"+ + "\u0972\u0973\u0003\u00eak\u0000\u0973\u0974\u0001\u0000\u0000\u0000\u0974"+ + "\u0975\u0006\u0144\u0018\u0000\u0975\u029d\u0001\u0000\u0000\u0000\u0976"+ + "\u0977\u0003\u00eem\u0000\u0977\u0978\u0001\u0000\u0000\u0000\u0978\u0979"+ + "\u0006\u0145\u0017\u0000\u0979\u029f\u0001\u0000\u0000\u0000\u097a\u097b"+ + "\u0003\u0106y\u0000\u097b\u097c\u0001\u0000\u0000\u0000\u097c\u097d\u0006"+ + "\u0146#\u0000\u097d\u02a1\u0001\u0000\u0000\u0000\u097e\u097f\u0003\u012e"+ + "\u008d\u0000\u097f\u0980\u0001\u0000\u0000\u0000\u0980\u0981\u0006\u0147"+ + "$\u0000\u0981\u02a3\u0001\u0000\u0000\u0000\u0982\u0983\u0003\u0126\u0089"+ + "\u0000\u0983\u0984\u0001\u0000\u0000\u0000\u0984\u0985\u0006\u0148:\u0000"+ + "\u0985\u02a5\u0001\u0000\u0000\u0000\u0986\u0987\u0003\u0128\u008a\u0000"+ + "\u0987\u0988\u0001\u0000\u0000\u0000\u0988\u0989\u0006\u0149;\u0000\u0989"+ + "\u02a7\u0001\u0000\u0000\u0000\u098a\u098b\u0003\u012a\u008b\u0000\u098b"+ + "\u098c\u0001\u0000\u0000\u0000\u098c\u098d\u0006\u014a%\u0000\u098d\u02a9"+ + "\u0001\u0000\u0000\u0000\u098e\u098f\u0003\u0130\u008e\u0000\u098f\u0990"+ + "\u0001\u0000\u0000\u0000\u0990\u0991\u0006\u014b&\u0000\u0991\u02ab\u0001"+ + "\u0000\u0000\u0000\u0992\u0993\u0003\u0132\u008f\u0000\u0993\u0994\u0001"+ + "\u0000\u0000\u0000\u0994\u0995\u0006\u014c\u0019\u0000\u0995\u02ad\u0001"+ + "\u0000\u0000\u0000\u0996\u0997\u0003\u0134\u0090\u0000\u0997\u0998\u0001"+ + "\u0000\u0000\u0000\u0998\u0999\u0006\u014d\u001a\u0000\u0999\u02af\u0001"+ + "\u0000\u0000\u0000\u099a\u099b\u0003\u0238\u0112\u0000\u099b\u099c\u0001"+ + "\u0000\u0000\u0000\u099c\u099d\u0006\u014e\"\u0000\u099d\u02b1\u0001\u0000"+ + "\u0000\u0000\u099e\u099f\u0003\u0014\u0000\u0000\u099f\u09a0\u0001\u0000"+ + "\u0000\u0000\u09a0\u09a1\u0006\u014f\u0000\u0000\u09a1\u02b3\u0001\u0000"+ + "\u0000\u0000\u09a2\u09a3\u0003\u0016\u0001\u0000\u09a3\u09a4\u0001\u0000"+ + "\u0000\u0000\u09a4\u09a5\u0006\u0150\u0000\u0000\u09a5\u02b5\u0001\u0000"+ + "\u0000\u0000\u09a6\u09a7\u0003\u0018\u0002\u0000\u09a7\u09a8\u0001\u0000"+ + "\u0000\u0000\u09a8\u09a9\u0006\u0151\u0000\u0000\u09a9\u02b7\u0001\u0000"+ + "\u0000\u0000\u09aa\u09ab\u0003\u00c0V\u0000\u09ab\u09ac\u0001\u0000\u0000"+ + "\u0000\u09ac\u09ad\u0006\u0152\u0012\u0000\u09ad\u09ae\u0006\u0152\u0013"+ + "\u0000\u09ae\u02b9\u0001\u0000\u0000\u0000\u09af\u09b0\u0007\n\u0000\u0000"+ + "\u09b0\u09b1\u0007\u0005\u0000\u0000\u09b1\u09b2\u0007\u0016\u0000\u0000"+ + "\u09b2\u09b3\u0007\t\u0000\u0000\u09b3\u02bb\u0001\u0000\u0000\u0000\u09b4"+ + "\u09b5\u0003\u0014\u0000\u0000\u09b5\u09b6\u0001\u0000\u0000\u0000\u09b6"+ + "\u09b7\u0006\u0154\u0000\u0000\u09b7\u02bd\u0001\u0000\u0000\u0000\u09b8"+ + "\u09b9\u0003\u0016\u0001\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba"+ + "\u09bb\u0006\u0155\u0000\u0000\u09bb\u02bf\u0001\u0000\u0000\u0000\u09bc"+ + "\u09bd\u0003\u0018\u0002\u0000\u09bd\u09be\u0001\u0000\u0000\u0000\u09be"+ + "\u09bf\u0006\u0156\u0000\u0000\u09bf\u02c1\u0001\u0000\u0000\u0000M\u0000"+ "\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f"+ - "\u0010\u0011\u0012\u0013\u02c6\u02ca\u02cd\u02d6\u02d8\u02e3\u0420\u0475"+ - "\u0479\u047e\u0502\u0507\u0510\u0517\u051c\u051e\u0529\u0531\u0534\u0536"+ - "\u053b\u0540\u0546\u054d\u0552\u0558\u055b\u0563\u0567\u05f4\u05f9\u0600"+ - "\u0602\u0607\u060c\u0613\u0615\u062f\u0634\u0639\u063b\u0641\u068d\u0692"+ - "\u086b\u086f\u0874\u0879\u087e\u0880\u0884\u0886\u08df\u08e3\u08e6\u08ec"+ - "\u08ee<\u0000\u0001\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0005\u0004"+ + "\u0010\u0011\u0012\u0013\u02c8\u02cc\u02cf\u02d8\u02da\u02e5\u042e\u0483"+ + "\u0487\u048c\u0510\u0515\u051e\u0525\u052a\u052c\u0537\u053f\u0542\u0544"+ + "\u0549\u054e\u0554\u055b\u0560\u0566\u0569\u0571\u0575\u0602\u0607\u060e"+ + "\u0610\u0615\u061a\u0621\u0623\u063d\u0642\u0647\u0649\u064f\u069b\u06a0"+ + "\u0879\u087d\u0882\u0887\u088c\u088e\u0892\u0894\u08ed\u08f1\u08f4\u08fa"+ + "\u08fc<\u0000\u0001\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0005\u0004"+ "\u0000\u0005\u0005\u0000\u0005\u0006\u0000\u0005\u0007\u0000\u0005\b\u0000"+ "\u0005\t\u0000\u0005\n\u0000\u0005\u000b\u0000\u0005\r\u0000\u0005\u000e"+ "\u0000\u0005\u000f\u0000\u0005\u0010\u0000\u0005\u0011\u0000\u0005\u0012"+ - "\u0000\u0005\u0013\u0000\u00075\u0000\u0004\u0000\u0000\u0007f\u0000\u0007"+ - "L\u0000\u0007\u009a\u0000\u0007B\u0000\u0007@\u0000\u0007c\u0000\u0007"+ - "d\u0000\u0007h\u0000\u0007g\u0000\u0005\u0003\u0000\u0007Q\u0000\u0007"+ - "+\u0000\u00076\u0000\u0007;\u0000\u0007\u0090\u0000\u0007N\u0000\u0007"+ - "a\u0000\u0007`\u0000\u0007b\u0000\u0007e\u0000\u0005\u0000\u0000\u0007"+ - "\u0011\u0000\u0007>\u0000\u0007=\u0000\u0007m\u0000\u0007<\u0000\u0005"+ - "\f\u0000\u0007Y\u0000\u0007Z\u0000\u00078\u0000\u00077\u0000\u0001\u011f"+ - "\u0000\u0001\u0120\u0001\u0001\u0121\u0002\u0007P\u0000\u0007C\u0000\u0007"+ - "J\u0000\u0007?\u0000\u0007^\u0000\u0007_\u0000"; + "\u0000\u0005\u0013\u0000\u00076\u0000\u0004\u0000\u0000\u0007g\u0000\u0007"+ + "M\u0000\u0007\u009b\u0000\u0007C\u0000\u0007A\u0000\u0007d\u0000\u0007"+ + "e\u0000\u0007i\u0000\u0007h\u0000\u0005\u0003\u0000\u0007R\u0000\u0007"+ + ",\u0000\u00077\u0000\u0007<\u0000\u0007\u0091\u0000\u0007O\u0000\u0007"+ + "b\u0000\u0007a\u0000\u0007c\u0000\u0007f\u0000\u0005\u0000\u0000\u0007"+ + "\u0011\u0000\u0007?\u0000\u0007>\u0000\u0007n\u0000\u0007=\u0000\u0005"+ + "\f\u0000\u0007Z\u0000\u0007[\u0000\u00079\u0000\u00078\u0000\u0001\u0120"+ + "\u0000\u0001\u0121\u0001\u0001\u0122\u0002\u0007Q\u0000\u0007D\u0000\u0007"+ + "K\u0000\u0007@\u0000\u0007_\u0000\u0007`\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index e98c334bca639..bbe769e40a85a 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -17,6 +17,7 @@ null 'sort' null 'where' +'uri_parts' 'from' 'ts' null @@ -184,6 +185,7 @@ SAMPLE SORT STATS WHERE +URI_PARTS FROM TS EXTERNAL @@ -404,6 +406,7 @@ fuseConfiguration fuseKeyByFields lookupCommand insistCommand +uriPartsCommand setCommand setField mmrCommand @@ -444,4 +447,4 @@ promqlIndexString atn: -[4, 1, 164, 1087, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 1, 0, 5, 0, 218, 8, 0, 10, 0, 12, 0, 221, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 235, 8, 2, 10, 2, 12, 2, 238, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 249, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 277, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 5, 8, 290, 8, 8, 10, 8, 12, 8, 293, 9, 8, 1, 9, 1, 9, 1, 9, 3, 9, 298, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 315, 8, 13, 10, 13, 12, 13, 318, 9, 13, 1, 13, 3, 13, 321, 8, 13, 1, 14, 1, 14, 1, 14, 3, 14, 326, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 332, 8, 15, 10, 15, 12, 15, 335, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 3, 16, 342, 8, 16, 1, 16, 1, 16, 1, 16, 3, 16, 347, 8, 16, 1, 16, 3, 16, 350, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 364, 8, 21, 10, 21, 12, 21, 367, 9, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 374, 8, 23, 1, 23, 1, 23, 3, 23, 378, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 383, 8, 24, 10, 24, 12, 24, 386, 9, 24, 1, 25, 1, 25, 1, 25, 3, 25, 391, 8, 25, 1, 26, 1, 26, 1, 26, 3, 26, 396, 8, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 405, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 410, 8, 27, 10, 27, 12, 27, 413, 9, 27, 1, 28, 1, 28, 1, 28, 3, 28, 418, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 427, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 432, 8, 29, 10, 29, 12, 29, 435, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 440, 8, 30, 10, 30, 12, 30, 443, 9, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 450, 8, 32, 1, 33, 1, 33, 3, 33, 454, 8, 33, 1, 34, 1, 34, 3, 34, 458, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 463, 8, 35, 1, 36, 1, 36, 3, 36, 467, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 476, 8, 38, 10, 38, 12, 38, 479, 9, 38, 1, 39, 1, 39, 3, 39, 483, 8, 39, 1, 39, 1, 39, 3, 39, 487, 8, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 499, 8, 42, 10, 42, 12, 42, 502, 9, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 512, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 518, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 523, 8, 45, 10, 45, 12, 45, 526, 9, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 534, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 541, 8, 48, 10, 48, 12, 48, 544, 9, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 563, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 569, 8, 53, 10, 53, 12, 53, 572, 9, 53, 3, 53, 574, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 3, 55, 581, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 592, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 599, 8, 57, 1, 58, 1, 58, 1, 58, 1, 59, 4, 59, 605, 8, 59, 11, 59, 12, 59, 606, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 619, 8, 61, 10, 61, 12, 61, 622, 9, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 630, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 641, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 651, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 657, 8, 65, 3, 65, 659, 8, 65, 1, 66, 1, 66, 3, 66, 663, 8, 66, 1, 66, 5, 66, 666, 8, 66, 10, 66, 12, 66, 669, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 682, 8, 67, 1, 68, 1, 68, 1, 68, 5, 68, 687, 8, 68, 10, 68, 12, 68, 690, 9, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 708, 8, 72, 1, 73, 1, 73, 3, 73, 712, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 3, 74, 722, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 731, 8, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 5, 75, 738, 8, 75, 10, 75, 12, 75, 741, 9, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 748, 8, 75, 1, 75, 1, 75, 1, 75, 3, 75, 753, 8, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 5, 75, 761, 8, 75, 10, 75, 12, 75, 764, 9, 75, 1, 76, 1, 76, 3, 76, 768, 8, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 775, 8, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 782, 8, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 789, 8, 76, 10, 76, 12, 76, 792, 9, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 798, 8, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 805, 8, 76, 10, 76, 12, 76, 808, 9, 76, 1, 76, 1, 76, 3, 76, 812, 8, 76, 1, 77, 1, 77, 1, 77, 3, 77, 817, 8, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 827, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 833, 8, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 5, 79, 841, 8, 79, 10, 79, 12, 79, 844, 9, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 854, 8, 80, 1, 80, 1, 80, 1, 80, 5, 80, 859, 8, 80, 10, 80, 12, 80, 862, 9, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 5, 81, 870, 8, 81, 10, 81, 12, 81, 873, 9, 81, 1, 81, 1, 81, 3, 81, 877, 8, 81, 3, 81, 879, 8, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 3, 82, 886, 8, 82, 1, 83, 1, 83, 1, 83, 1, 83, 5, 83, 892, 8, 83, 10, 83, 12, 83, 895, 9, 83, 3, 83, 897, 8, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 3, 85, 907, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 5, 86, 922, 8, 86, 10, 86, 12, 86, 925, 9, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 5, 86, 933, 8, 86, 10, 86, 12, 86, 936, 9, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 5, 86, 944, 8, 86, 10, 86, 12, 86, 947, 9, 86, 1, 86, 1, 86, 3, 86, 951, 8, 86, 1, 87, 1, 87, 1, 88, 1, 88, 3, 88, 957, 8, 88, 1, 89, 3, 89, 960, 8, 89, 1, 89, 1, 89, 1, 90, 3, 90, 965, 8, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 3, 94, 981, 8, 94, 1, 94, 1, 94, 1, 94, 3, 94, 986, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 5, 95, 992, 8, 95, 10, 95, 12, 95, 995, 9, 95, 1, 96, 1, 96, 5, 96, 999, 8, 96, 10, 96, 12, 96, 1002, 9, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1007, 8, 96, 1, 96, 1, 96, 4, 96, 1011, 8, 96, 11, 96, 12, 96, 1012, 1, 96, 1, 96, 1, 96, 1, 96, 5, 96, 1019, 8, 96, 10, 96, 12, 96, 1022, 9, 96, 1, 96, 4, 96, 1025, 8, 96, 11, 96, 12, 96, 1026, 3, 96, 1029, 8, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 5, 100, 1042, 8, 100, 10, 100, 12, 100, 1045, 9, 100, 1, 100, 1, 100, 3, 100, 1049, 8, 100, 1, 101, 1, 101, 1, 102, 4, 102, 1054, 8, 102, 11, 102, 12, 102, 1055, 1, 102, 1, 102, 5, 102, 1060, 8, 102, 10, 102, 12, 102, 1063, 9, 102, 1, 102, 3, 102, 1066, 8, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1077, 8, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 0, 5, 4, 122, 150, 158, 160, 108, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 0, 14, 2, 0, 54, 54, 109, 109, 1, 0, 103, 104, 2, 0, 58, 58, 65, 65, 2, 0, 68, 68, 71, 71, 2, 0, 43, 43, 54, 54, 1, 0, 89, 90, 1, 0, 91, 93, 2, 0, 67, 67, 80, 80, 2, 0, 82, 82, 84, 88, 2, 0, 25, 25, 27, 28, 3, 0, 54, 54, 97, 97, 103, 104, 8, 0, 54, 54, 59, 59, 61, 62, 64, 64, 97, 97, 103, 104, 109, 109, 151, 153, 2, 0, 103, 103, 109, 109, 3, 0, 54, 54, 103, 103, 109, 109, 1136, 0, 219, 1, 0, 0, 0, 2, 225, 1, 0, 0, 0, 4, 228, 1, 0, 0, 0, 6, 248, 1, 0, 0, 0, 8, 276, 1, 0, 0, 0, 10, 278, 1, 0, 0, 0, 12, 281, 1, 0, 0, 0, 14, 283, 1, 0, 0, 0, 16, 286, 1, 0, 0, 0, 18, 297, 1, 0, 0, 0, 20, 301, 1, 0, 0, 0, 22, 304, 1, 0, 0, 0, 24, 307, 1, 0, 0, 0, 26, 311, 1, 0, 0, 0, 28, 325, 1, 0, 0, 0, 30, 327, 1, 0, 0, 0, 32, 349, 1, 0, 0, 0, 34, 351, 1, 0, 0, 0, 36, 353, 1, 0, 0, 0, 38, 355, 1, 0, 0, 0, 40, 357, 1, 0, 0, 0, 42, 359, 1, 0, 0, 0, 44, 368, 1, 0, 0, 0, 46, 371, 1, 0, 0, 0, 48, 379, 1, 0, 0, 0, 50, 387, 1, 0, 0, 0, 52, 404, 1, 0, 0, 0, 54, 406, 1, 0, 0, 0, 56, 426, 1, 0, 0, 0, 58, 428, 1, 0, 0, 0, 60, 436, 1, 0, 0, 0, 62, 444, 1, 0, 0, 0, 64, 449, 1, 0, 0, 0, 66, 453, 1, 0, 0, 0, 68, 457, 1, 0, 0, 0, 70, 462, 1, 0, 0, 0, 72, 466, 1, 0, 0, 0, 74, 468, 1, 0, 0, 0, 76, 471, 1, 0, 0, 0, 78, 480, 1, 0, 0, 0, 80, 488, 1, 0, 0, 0, 82, 491, 1, 0, 0, 0, 84, 494, 1, 0, 0, 0, 86, 511, 1, 0, 0, 0, 88, 513, 1, 0, 0, 0, 90, 519, 1, 0, 0, 0, 92, 527, 1, 0, 0, 0, 94, 533, 1, 0, 0, 0, 96, 535, 1, 0, 0, 0, 98, 545, 1, 0, 0, 0, 100, 548, 1, 0, 0, 0, 102, 551, 1, 0, 0, 0, 104, 555, 1, 0, 0, 0, 106, 558, 1, 0, 0, 0, 108, 575, 1, 0, 0, 0, 110, 580, 1, 0, 0, 0, 112, 584, 1, 0, 0, 0, 114, 587, 1, 0, 0, 0, 116, 600, 1, 0, 0, 0, 118, 604, 1, 0, 0, 0, 120, 608, 1, 0, 0, 0, 122, 612, 1, 0, 0, 0, 124, 623, 1, 0, 0, 0, 126, 625, 1, 0, 0, 0, 128, 636, 1, 0, 0, 0, 130, 658, 1, 0, 0, 0, 132, 660, 1, 0, 0, 0, 134, 681, 1, 0, 0, 0, 136, 683, 1, 0, 0, 0, 138, 691, 1, 0, 0, 0, 140, 696, 1, 0, 0, 0, 142, 699, 1, 0, 0, 0, 144, 703, 1, 0, 0, 0, 146, 709, 1, 0, 0, 0, 148, 721, 1, 0, 0, 0, 150, 752, 1, 0, 0, 0, 152, 811, 1, 0, 0, 0, 154, 813, 1, 0, 0, 0, 156, 826, 1, 0, 0, 0, 158, 832, 1, 0, 0, 0, 160, 853, 1, 0, 0, 0, 162, 863, 1, 0, 0, 0, 164, 885, 1, 0, 0, 0, 166, 887, 1, 0, 0, 0, 168, 900, 1, 0, 0, 0, 170, 906, 1, 0, 0, 0, 172, 950, 1, 0, 0, 0, 174, 952, 1, 0, 0, 0, 176, 956, 1, 0, 0, 0, 178, 959, 1, 0, 0, 0, 180, 964, 1, 0, 0, 0, 182, 968, 1, 0, 0, 0, 184, 970, 1, 0, 0, 0, 186, 972, 1, 0, 0, 0, 188, 985, 1, 0, 0, 0, 190, 987, 1, 0, 0, 0, 192, 1028, 1, 0, 0, 0, 194, 1030, 1, 0, 0, 0, 196, 1032, 1, 0, 0, 0, 198, 1036, 1, 0, 0, 0, 200, 1048, 1, 0, 0, 0, 202, 1050, 1, 0, 0, 0, 204, 1065, 1, 0, 0, 0, 206, 1076, 1, 0, 0, 0, 208, 1078, 1, 0, 0, 0, 210, 1080, 1, 0, 0, 0, 212, 1082, 1, 0, 0, 0, 214, 1084, 1, 0, 0, 0, 216, 218, 3, 142, 71, 0, 217, 216, 1, 0, 0, 0, 218, 221, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 220, 1, 0, 0, 0, 220, 222, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 222, 223, 3, 2, 1, 0, 223, 224, 5, 0, 0, 1, 224, 1, 1, 0, 0, 0, 225, 226, 3, 4, 2, 0, 226, 227, 5, 0, 0, 1, 227, 3, 1, 0, 0, 0, 228, 229, 6, 2, -1, 0, 229, 230, 3, 6, 3, 0, 230, 236, 1, 0, 0, 0, 231, 232, 10, 1, 0, 0, 232, 233, 5, 53, 0, 0, 233, 235, 3, 8, 4, 0, 234, 231, 1, 0, 0, 0, 235, 238, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 5, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 249, 3, 20, 10, 0, 240, 249, 3, 14, 7, 0, 241, 249, 3, 104, 52, 0, 242, 249, 3, 22, 11, 0, 243, 249, 3, 192, 96, 0, 244, 245, 4, 3, 1, 0, 245, 249, 3, 100, 50, 0, 246, 247, 4, 3, 2, 0, 247, 249, 3, 24, 12, 0, 248, 239, 1, 0, 0, 0, 248, 240, 1, 0, 0, 0, 248, 241, 1, 0, 0, 0, 248, 242, 1, 0, 0, 0, 248, 243, 1, 0, 0, 0, 248, 244, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 249, 7, 1, 0, 0, 0, 250, 277, 3, 44, 22, 0, 251, 277, 3, 10, 5, 0, 252, 277, 3, 80, 40, 0, 253, 277, 3, 74, 37, 0, 254, 277, 3, 46, 23, 0, 255, 277, 3, 76, 38, 0, 256, 277, 3, 82, 41, 0, 257, 277, 3, 84, 42, 0, 258, 277, 3, 88, 44, 0, 259, 277, 3, 96, 48, 0, 260, 277, 3, 106, 53, 0, 261, 277, 3, 98, 49, 0, 262, 277, 3, 186, 93, 0, 263, 277, 3, 114, 57, 0, 264, 277, 3, 128, 64, 0, 265, 277, 3, 112, 56, 0, 266, 277, 3, 116, 58, 0, 267, 277, 3, 126, 63, 0, 268, 277, 3, 130, 65, 0, 269, 277, 3, 132, 66, 0, 270, 271, 4, 4, 3, 0, 271, 277, 3, 138, 69, 0, 272, 273, 4, 4, 4, 0, 273, 277, 3, 140, 70, 0, 274, 275, 4, 4, 5, 0, 275, 277, 3, 146, 73, 0, 276, 250, 1, 0, 0, 0, 276, 251, 1, 0, 0, 0, 276, 252, 1, 0, 0, 0, 276, 253, 1, 0, 0, 0, 276, 254, 1, 0, 0, 0, 276, 255, 1, 0, 0, 0, 276, 256, 1, 0, 0, 0, 276, 257, 1, 0, 0, 0, 276, 258, 1, 0, 0, 0, 276, 259, 1, 0, 0, 0, 276, 260, 1, 0, 0, 0, 276, 261, 1, 0, 0, 0, 276, 262, 1, 0, 0, 0, 276, 263, 1, 0, 0, 0, 276, 264, 1, 0, 0, 0, 276, 265, 1, 0, 0, 0, 276, 266, 1, 0, 0, 0, 276, 267, 1, 0, 0, 0, 276, 268, 1, 0, 0, 0, 276, 269, 1, 0, 0, 0, 276, 270, 1, 0, 0, 0, 276, 272, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 9, 1, 0, 0, 0, 278, 279, 5, 17, 0, 0, 279, 280, 3, 150, 75, 0, 280, 11, 1, 0, 0, 0, 281, 282, 3, 62, 31, 0, 282, 13, 1, 0, 0, 0, 283, 284, 5, 13, 0, 0, 284, 285, 3, 16, 8, 0, 285, 15, 1, 0, 0, 0, 286, 291, 3, 18, 9, 0, 287, 288, 5, 64, 0, 0, 288, 290, 3, 18, 9, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 17, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 3, 52, 26, 0, 295, 296, 5, 59, 0, 0, 296, 298, 1, 0, 0, 0, 297, 294, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 300, 3, 150, 75, 0, 300, 19, 1, 0, 0, 0, 301, 302, 5, 18, 0, 0, 302, 303, 3, 26, 13, 0, 303, 21, 1, 0, 0, 0, 304, 305, 5, 19, 0, 0, 305, 306, 3, 26, 13, 0, 306, 23, 1, 0, 0, 0, 307, 308, 5, 20, 0, 0, 308, 309, 3, 72, 36, 0, 309, 310, 3, 94, 47, 0, 310, 25, 1, 0, 0, 0, 311, 316, 3, 28, 14, 0, 312, 313, 5, 64, 0, 0, 313, 315, 3, 28, 14, 0, 314, 312, 1, 0, 0, 0, 315, 318, 1, 0, 0, 0, 316, 314, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 320, 1, 0, 0, 0, 318, 316, 1, 0, 0, 0, 319, 321, 3, 42, 21, 0, 320, 319, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 27, 1, 0, 0, 0, 322, 326, 3, 32, 16, 0, 323, 324, 4, 14, 6, 0, 324, 326, 3, 30, 15, 0, 325, 322, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 29, 1, 0, 0, 0, 327, 328, 5, 101, 0, 0, 328, 333, 3, 20, 10, 0, 329, 330, 5, 53, 0, 0, 330, 332, 3, 8, 4, 0, 331, 329, 1, 0, 0, 0, 332, 335, 1, 0, 0, 0, 333, 331, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 336, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 336, 337, 5, 102, 0, 0, 337, 31, 1, 0, 0, 0, 338, 339, 3, 34, 17, 0, 339, 340, 5, 62, 0, 0, 340, 342, 1, 0, 0, 0, 341, 338, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 346, 3, 38, 19, 0, 344, 345, 5, 61, 0, 0, 345, 347, 3, 36, 18, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 350, 1, 0, 0, 0, 348, 350, 3, 40, 20, 0, 349, 341, 1, 0, 0, 0, 349, 348, 1, 0, 0, 0, 350, 33, 1, 0, 0, 0, 351, 352, 5, 109, 0, 0, 352, 35, 1, 0, 0, 0, 353, 354, 5, 109, 0, 0, 354, 37, 1, 0, 0, 0, 355, 356, 5, 109, 0, 0, 356, 39, 1, 0, 0, 0, 357, 358, 7, 0, 0, 0, 358, 41, 1, 0, 0, 0, 359, 360, 5, 108, 0, 0, 360, 365, 5, 109, 0, 0, 361, 362, 5, 64, 0, 0, 362, 364, 5, 109, 0, 0, 363, 361, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 43, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 368, 369, 5, 9, 0, 0, 369, 370, 3, 16, 8, 0, 370, 45, 1, 0, 0, 0, 371, 373, 5, 16, 0, 0, 372, 374, 3, 48, 24, 0, 373, 372, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 377, 1, 0, 0, 0, 375, 376, 5, 60, 0, 0, 376, 378, 3, 16, 8, 0, 377, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 47, 1, 0, 0, 0, 379, 384, 3, 50, 25, 0, 380, 381, 5, 64, 0, 0, 381, 383, 3, 50, 25, 0, 382, 380, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 49, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 390, 3, 18, 9, 0, 388, 389, 5, 17, 0, 0, 389, 391, 3, 150, 75, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 51, 1, 0, 0, 0, 392, 393, 4, 26, 7, 0, 393, 395, 5, 99, 0, 0, 394, 396, 5, 103, 0, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 5, 100, 0, 0, 398, 399, 5, 66, 0, 0, 399, 400, 5, 99, 0, 0, 400, 401, 3, 54, 27, 0, 401, 402, 5, 100, 0, 0, 402, 405, 1, 0, 0, 0, 403, 405, 3, 54, 27, 0, 404, 392, 1, 0, 0, 0, 404, 403, 1, 0, 0, 0, 405, 53, 1, 0, 0, 0, 406, 411, 3, 70, 35, 0, 407, 408, 5, 66, 0, 0, 408, 410, 3, 70, 35, 0, 409, 407, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 55, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 414, 415, 4, 28, 8, 0, 415, 417, 5, 99, 0, 0, 416, 418, 5, 144, 0, 0, 417, 416, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 5, 100, 0, 0, 420, 421, 5, 66, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 3, 58, 29, 0, 423, 424, 5, 100, 0, 0, 424, 427, 1, 0, 0, 0, 425, 427, 3, 58, 29, 0, 426, 414, 1, 0, 0, 0, 426, 425, 1, 0, 0, 0, 427, 57, 1, 0, 0, 0, 428, 433, 3, 64, 32, 0, 429, 430, 5, 66, 0, 0, 430, 432, 3, 64, 32, 0, 431, 429, 1, 0, 0, 0, 432, 435, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 59, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 436, 441, 3, 56, 28, 0, 437, 438, 5, 64, 0, 0, 438, 440, 3, 56, 28, 0, 439, 437, 1, 0, 0, 0, 440, 443, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 61, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 444, 445, 7, 1, 0, 0, 445, 63, 1, 0, 0, 0, 446, 450, 5, 144, 0, 0, 447, 450, 3, 66, 33, 0, 448, 450, 3, 68, 34, 0, 449, 446, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 449, 448, 1, 0, 0, 0, 450, 65, 1, 0, 0, 0, 451, 454, 5, 78, 0, 0, 452, 454, 5, 97, 0, 0, 453, 451, 1, 0, 0, 0, 453, 452, 1, 0, 0, 0, 454, 67, 1, 0, 0, 0, 455, 458, 5, 96, 0, 0, 456, 458, 5, 98, 0, 0, 457, 455, 1, 0, 0, 0, 457, 456, 1, 0, 0, 0, 458, 69, 1, 0, 0, 0, 459, 463, 3, 62, 31, 0, 460, 463, 3, 66, 33, 0, 461, 463, 3, 68, 34, 0, 462, 459, 1, 0, 0, 0, 462, 460, 1, 0, 0, 0, 462, 461, 1, 0, 0, 0, 463, 71, 1, 0, 0, 0, 464, 467, 3, 182, 91, 0, 465, 467, 3, 66, 33, 0, 466, 464, 1, 0, 0, 0, 466, 465, 1, 0, 0, 0, 467, 73, 1, 0, 0, 0, 468, 469, 5, 11, 0, 0, 469, 470, 3, 172, 86, 0, 470, 75, 1, 0, 0, 0, 471, 472, 5, 15, 0, 0, 472, 477, 3, 78, 39, 0, 473, 474, 5, 64, 0, 0, 474, 476, 3, 78, 39, 0, 475, 473, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 77, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 482, 3, 150, 75, 0, 481, 483, 7, 2, 0, 0, 482, 481, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 485, 5, 75, 0, 0, 485, 487, 7, 3, 0, 0, 486, 484, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 79, 1, 0, 0, 0, 488, 489, 5, 33, 0, 0, 489, 490, 3, 60, 30, 0, 490, 81, 1, 0, 0, 0, 491, 492, 5, 32, 0, 0, 492, 493, 3, 60, 30, 0, 493, 83, 1, 0, 0, 0, 494, 495, 5, 36, 0, 0, 495, 500, 3, 86, 43, 0, 496, 497, 5, 64, 0, 0, 497, 499, 3, 86, 43, 0, 498, 496, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 85, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 503, 504, 3, 56, 28, 0, 504, 505, 5, 154, 0, 0, 505, 506, 3, 56, 28, 0, 506, 512, 1, 0, 0, 0, 507, 508, 3, 56, 28, 0, 508, 509, 5, 59, 0, 0, 509, 510, 3, 56, 28, 0, 510, 512, 1, 0, 0, 0, 511, 503, 1, 0, 0, 0, 511, 507, 1, 0, 0, 0, 512, 87, 1, 0, 0, 0, 513, 514, 5, 8, 0, 0, 514, 515, 3, 160, 80, 0, 515, 517, 3, 182, 91, 0, 516, 518, 3, 90, 45, 0, 517, 516, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 89, 1, 0, 0, 0, 519, 524, 3, 92, 46, 0, 520, 521, 5, 64, 0, 0, 521, 523, 3, 92, 46, 0, 522, 520, 1, 0, 0, 0, 523, 526, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 91, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 527, 528, 3, 62, 31, 0, 528, 529, 5, 59, 0, 0, 529, 530, 3, 172, 86, 0, 530, 93, 1, 0, 0, 0, 531, 532, 5, 81, 0, 0, 532, 534, 3, 166, 83, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 95, 1, 0, 0, 0, 535, 536, 5, 10, 0, 0, 536, 537, 3, 160, 80, 0, 537, 542, 3, 182, 91, 0, 538, 539, 5, 64, 0, 0, 539, 541, 3, 182, 91, 0, 540, 538, 1, 0, 0, 0, 541, 544, 1, 0, 0, 0, 542, 540, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 97, 1, 0, 0, 0, 544, 542, 1, 0, 0, 0, 545, 546, 5, 31, 0, 0, 546, 547, 3, 52, 26, 0, 547, 99, 1, 0, 0, 0, 548, 549, 5, 6, 0, 0, 549, 550, 3, 102, 51, 0, 550, 101, 1, 0, 0, 0, 551, 552, 5, 101, 0, 0, 552, 553, 3, 4, 2, 0, 553, 554, 5, 102, 0, 0, 554, 103, 1, 0, 0, 0, 555, 556, 5, 38, 0, 0, 556, 557, 5, 161, 0, 0, 557, 105, 1, 0, 0, 0, 558, 559, 5, 5, 0, 0, 559, 562, 3, 108, 54, 0, 560, 561, 5, 76, 0, 0, 561, 563, 3, 56, 28, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 573, 1, 0, 0, 0, 564, 565, 5, 81, 0, 0, 565, 570, 3, 110, 55, 0, 566, 567, 5, 64, 0, 0, 567, 569, 3, 110, 55, 0, 568, 566, 1, 0, 0, 0, 569, 572, 1, 0, 0, 0, 570, 568, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 574, 1, 0, 0, 0, 572, 570, 1, 0, 0, 0, 573, 564, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 107, 1, 0, 0, 0, 575, 576, 7, 4, 0, 0, 576, 109, 1, 0, 0, 0, 577, 578, 3, 56, 28, 0, 578, 579, 5, 59, 0, 0, 579, 581, 1, 0, 0, 0, 580, 577, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 3, 56, 28, 0, 583, 111, 1, 0, 0, 0, 584, 585, 5, 14, 0, 0, 585, 586, 3, 172, 86, 0, 586, 113, 1, 0, 0, 0, 587, 588, 5, 4, 0, 0, 588, 591, 3, 52, 26, 0, 589, 590, 5, 76, 0, 0, 590, 592, 3, 52, 26, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 598, 1, 0, 0, 0, 593, 594, 5, 154, 0, 0, 594, 595, 3, 52, 26, 0, 595, 596, 5, 64, 0, 0, 596, 597, 3, 52, 26, 0, 597, 599, 1, 0, 0, 0, 598, 593, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 115, 1, 0, 0, 0, 600, 601, 5, 21, 0, 0, 601, 602, 3, 118, 59, 0, 602, 117, 1, 0, 0, 0, 603, 605, 3, 120, 60, 0, 604, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 119, 1, 0, 0, 0, 608, 609, 5, 101, 0, 0, 609, 610, 3, 122, 61, 0, 610, 611, 5, 102, 0, 0, 611, 121, 1, 0, 0, 0, 612, 613, 6, 61, -1, 0, 613, 614, 3, 124, 62, 0, 614, 620, 1, 0, 0, 0, 615, 616, 10, 1, 0, 0, 616, 617, 5, 53, 0, 0, 617, 619, 3, 124, 62, 0, 618, 615, 1, 0, 0, 0, 619, 622, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, 123, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 623, 624, 3, 8, 4, 0, 624, 125, 1, 0, 0, 0, 625, 629, 5, 12, 0, 0, 626, 627, 3, 52, 26, 0, 627, 628, 5, 59, 0, 0, 628, 630, 1, 0, 0, 0, 629, 626, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 3, 172, 86, 0, 632, 633, 5, 76, 0, 0, 633, 634, 3, 16, 8, 0, 634, 635, 3, 94, 47, 0, 635, 127, 1, 0, 0, 0, 636, 640, 5, 7, 0, 0, 637, 638, 3, 52, 26, 0, 638, 639, 5, 59, 0, 0, 639, 641, 1, 0, 0, 0, 640, 637, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 643, 3, 160, 80, 0, 643, 644, 3, 94, 47, 0, 644, 129, 1, 0, 0, 0, 645, 646, 5, 23, 0, 0, 646, 647, 5, 122, 0, 0, 647, 650, 3, 48, 24, 0, 648, 649, 5, 60, 0, 0, 649, 651, 3, 16, 8, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 659, 1, 0, 0, 0, 652, 653, 5, 24, 0, 0, 653, 656, 3, 48, 24, 0, 654, 655, 5, 60, 0, 0, 655, 657, 3, 16, 8, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 645, 1, 0, 0, 0, 658, 652, 1, 0, 0, 0, 659, 131, 1, 0, 0, 0, 660, 662, 5, 22, 0, 0, 661, 663, 3, 62, 31, 0, 662, 661, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 667, 1, 0, 0, 0, 664, 666, 3, 134, 67, 0, 665, 664, 1, 0, 0, 0, 666, 669, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 133, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 671, 5, 117, 0, 0, 671, 672, 5, 60, 0, 0, 672, 682, 3, 52, 26, 0, 673, 674, 5, 118, 0, 0, 674, 675, 5, 60, 0, 0, 675, 682, 3, 136, 68, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 60, 0, 0, 678, 682, 3, 52, 26, 0, 679, 680, 5, 81, 0, 0, 680, 682, 3, 166, 83, 0, 681, 670, 1, 0, 0, 0, 681, 673, 1, 0, 0, 0, 681, 676, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 682, 135, 1, 0, 0, 0, 683, 688, 3, 52, 26, 0, 684, 685, 5, 64, 0, 0, 685, 687, 3, 52, 26, 0, 686, 684, 1, 0, 0, 0, 687, 690, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 137, 1, 0, 0, 0, 690, 688, 1, 0, 0, 0, 691, 692, 5, 29, 0, 0, 692, 693, 3, 32, 16, 0, 693, 694, 5, 76, 0, 0, 694, 695, 3, 60, 30, 0, 695, 139, 1, 0, 0, 0, 696, 697, 5, 34, 0, 0, 697, 698, 3, 60, 30, 0, 698, 141, 1, 0, 0, 0, 699, 700, 5, 37, 0, 0, 700, 701, 3, 144, 72, 0, 701, 702, 5, 63, 0, 0, 702, 143, 1, 0, 0, 0, 703, 704, 3, 62, 31, 0, 704, 707, 5, 59, 0, 0, 705, 708, 3, 172, 86, 0, 706, 708, 3, 166, 83, 0, 707, 705, 1, 0, 0, 0, 707, 706, 1, 0, 0, 0, 708, 145, 1, 0, 0, 0, 709, 711, 5, 30, 0, 0, 710, 712, 3, 148, 74, 0, 711, 710, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 714, 5, 76, 0, 0, 714, 715, 3, 52, 26, 0, 715, 716, 5, 137, 0, 0, 716, 717, 3, 180, 90, 0, 717, 718, 3, 94, 47, 0, 718, 147, 1, 0, 0, 0, 719, 722, 3, 66, 33, 0, 720, 722, 3, 160, 80, 0, 721, 719, 1, 0, 0, 0, 721, 720, 1, 0, 0, 0, 722, 149, 1, 0, 0, 0, 723, 724, 6, 75, -1, 0, 724, 725, 5, 73, 0, 0, 725, 753, 3, 150, 75, 8, 726, 753, 3, 156, 78, 0, 727, 753, 3, 152, 76, 0, 728, 730, 3, 156, 78, 0, 729, 731, 5, 73, 0, 0, 730, 729, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 733, 5, 69, 0, 0, 733, 734, 5, 101, 0, 0, 734, 739, 3, 156, 78, 0, 735, 736, 5, 64, 0, 0, 736, 738, 3, 156, 78, 0, 737, 735, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 742, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 743, 5, 102, 0, 0, 743, 753, 1, 0, 0, 0, 744, 745, 3, 156, 78, 0, 745, 747, 5, 70, 0, 0, 746, 748, 5, 73, 0, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 74, 0, 0, 750, 753, 1, 0, 0, 0, 751, 753, 3, 154, 77, 0, 752, 723, 1, 0, 0, 0, 752, 726, 1, 0, 0, 0, 752, 727, 1, 0, 0, 0, 752, 728, 1, 0, 0, 0, 752, 744, 1, 0, 0, 0, 752, 751, 1, 0, 0, 0, 753, 762, 1, 0, 0, 0, 754, 755, 10, 5, 0, 0, 755, 756, 5, 57, 0, 0, 756, 761, 3, 150, 75, 6, 757, 758, 10, 4, 0, 0, 758, 759, 5, 77, 0, 0, 759, 761, 3, 150, 75, 5, 760, 754, 1, 0, 0, 0, 760, 757, 1, 0, 0, 0, 761, 764, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 151, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 767, 3, 156, 78, 0, 766, 768, 5, 73, 0, 0, 767, 766, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 1, 0, 0, 0, 769, 770, 5, 72, 0, 0, 770, 771, 3, 72, 36, 0, 771, 812, 1, 0, 0, 0, 772, 774, 3, 156, 78, 0, 773, 775, 5, 73, 0, 0, 774, 773, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 5, 79, 0, 0, 777, 778, 3, 72, 36, 0, 778, 812, 1, 0, 0, 0, 779, 781, 3, 156, 78, 0, 780, 782, 5, 73, 0, 0, 781, 780, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 784, 5, 72, 0, 0, 784, 785, 5, 101, 0, 0, 785, 790, 3, 72, 36, 0, 786, 787, 5, 64, 0, 0, 787, 789, 3, 72, 36, 0, 788, 786, 1, 0, 0, 0, 789, 792, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 793, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 793, 794, 5, 102, 0, 0, 794, 812, 1, 0, 0, 0, 795, 797, 3, 156, 78, 0, 796, 798, 5, 73, 0, 0, 797, 796, 1, 0, 0, 0, 797, 798, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 5, 79, 0, 0, 800, 801, 5, 101, 0, 0, 801, 806, 3, 72, 36, 0, 802, 803, 5, 64, 0, 0, 803, 805, 3, 72, 36, 0, 804, 802, 1, 0, 0, 0, 805, 808, 1, 0, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 809, 1, 0, 0, 0, 808, 806, 1, 0, 0, 0, 809, 810, 5, 102, 0, 0, 810, 812, 1, 0, 0, 0, 811, 765, 1, 0, 0, 0, 811, 772, 1, 0, 0, 0, 811, 779, 1, 0, 0, 0, 811, 795, 1, 0, 0, 0, 812, 153, 1, 0, 0, 0, 813, 816, 3, 52, 26, 0, 814, 815, 5, 61, 0, 0, 815, 817, 3, 12, 6, 0, 816, 814, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 5, 62, 0, 0, 819, 820, 3, 172, 86, 0, 820, 155, 1, 0, 0, 0, 821, 827, 3, 158, 79, 0, 822, 823, 3, 158, 79, 0, 823, 824, 3, 184, 92, 0, 824, 825, 3, 158, 79, 0, 825, 827, 1, 0, 0, 0, 826, 821, 1, 0, 0, 0, 826, 822, 1, 0, 0, 0, 827, 157, 1, 0, 0, 0, 828, 829, 6, 79, -1, 0, 829, 833, 3, 160, 80, 0, 830, 831, 7, 5, 0, 0, 831, 833, 3, 158, 79, 3, 832, 828, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 842, 1, 0, 0, 0, 834, 835, 10, 2, 0, 0, 835, 836, 7, 6, 0, 0, 836, 841, 3, 158, 79, 3, 837, 838, 10, 1, 0, 0, 838, 839, 7, 5, 0, 0, 839, 841, 3, 158, 79, 2, 840, 834, 1, 0, 0, 0, 840, 837, 1, 0, 0, 0, 841, 844, 1, 0, 0, 0, 842, 840, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 159, 1, 0, 0, 0, 844, 842, 1, 0, 0, 0, 845, 846, 6, 80, -1, 0, 846, 854, 3, 172, 86, 0, 847, 854, 3, 52, 26, 0, 848, 854, 3, 162, 81, 0, 849, 850, 5, 101, 0, 0, 850, 851, 3, 150, 75, 0, 851, 852, 5, 102, 0, 0, 852, 854, 1, 0, 0, 0, 853, 845, 1, 0, 0, 0, 853, 847, 1, 0, 0, 0, 853, 848, 1, 0, 0, 0, 853, 849, 1, 0, 0, 0, 854, 860, 1, 0, 0, 0, 855, 856, 10, 1, 0, 0, 856, 857, 5, 61, 0, 0, 857, 859, 3, 12, 6, 0, 858, 855, 1, 0, 0, 0, 859, 862, 1, 0, 0, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 161, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 863, 864, 3, 164, 82, 0, 864, 878, 5, 101, 0, 0, 865, 879, 5, 91, 0, 0, 866, 871, 3, 150, 75, 0, 867, 868, 5, 64, 0, 0, 868, 870, 3, 150, 75, 0, 869, 867, 1, 0, 0, 0, 870, 873, 1, 0, 0, 0, 871, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 876, 1, 0, 0, 0, 873, 871, 1, 0, 0, 0, 874, 875, 5, 64, 0, 0, 875, 877, 3, 166, 83, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 879, 1, 0, 0, 0, 878, 865, 1, 0, 0, 0, 878, 866, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 881, 5, 102, 0, 0, 881, 163, 1, 0, 0, 0, 882, 886, 3, 70, 35, 0, 883, 886, 5, 68, 0, 0, 884, 886, 5, 71, 0, 0, 885, 882, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 885, 884, 1, 0, 0, 0, 886, 165, 1, 0, 0, 0, 887, 896, 5, 94, 0, 0, 888, 893, 3, 168, 84, 0, 889, 890, 5, 64, 0, 0, 890, 892, 3, 168, 84, 0, 891, 889, 1, 0, 0, 0, 892, 895, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 897, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 896, 888, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 5, 95, 0, 0, 899, 167, 1, 0, 0, 0, 900, 901, 3, 182, 91, 0, 901, 902, 5, 62, 0, 0, 902, 903, 3, 170, 85, 0, 903, 169, 1, 0, 0, 0, 904, 907, 3, 172, 86, 0, 905, 907, 3, 166, 83, 0, 906, 904, 1, 0, 0, 0, 906, 905, 1, 0, 0, 0, 907, 171, 1, 0, 0, 0, 908, 951, 5, 74, 0, 0, 909, 910, 3, 180, 90, 0, 910, 911, 5, 103, 0, 0, 911, 951, 1, 0, 0, 0, 912, 951, 3, 178, 89, 0, 913, 951, 3, 180, 90, 0, 914, 951, 3, 174, 87, 0, 915, 951, 3, 66, 33, 0, 916, 951, 3, 182, 91, 0, 917, 918, 5, 99, 0, 0, 918, 923, 3, 176, 88, 0, 919, 920, 5, 64, 0, 0, 920, 922, 3, 176, 88, 0, 921, 919, 1, 0, 0, 0, 922, 925, 1, 0, 0, 0, 923, 921, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 926, 1, 0, 0, 0, 925, 923, 1, 0, 0, 0, 926, 927, 5, 100, 0, 0, 927, 951, 1, 0, 0, 0, 928, 929, 5, 99, 0, 0, 929, 934, 3, 174, 87, 0, 930, 931, 5, 64, 0, 0, 931, 933, 3, 174, 87, 0, 932, 930, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 937, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 938, 5, 100, 0, 0, 938, 951, 1, 0, 0, 0, 939, 940, 5, 99, 0, 0, 940, 945, 3, 182, 91, 0, 941, 942, 5, 64, 0, 0, 942, 944, 3, 182, 91, 0, 943, 941, 1, 0, 0, 0, 944, 947, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 948, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 948, 949, 5, 100, 0, 0, 949, 951, 1, 0, 0, 0, 950, 908, 1, 0, 0, 0, 950, 909, 1, 0, 0, 0, 950, 912, 1, 0, 0, 0, 950, 913, 1, 0, 0, 0, 950, 914, 1, 0, 0, 0, 950, 915, 1, 0, 0, 0, 950, 916, 1, 0, 0, 0, 950, 917, 1, 0, 0, 0, 950, 928, 1, 0, 0, 0, 950, 939, 1, 0, 0, 0, 951, 173, 1, 0, 0, 0, 952, 953, 7, 7, 0, 0, 953, 175, 1, 0, 0, 0, 954, 957, 3, 178, 89, 0, 955, 957, 3, 180, 90, 0, 956, 954, 1, 0, 0, 0, 956, 955, 1, 0, 0, 0, 957, 177, 1, 0, 0, 0, 958, 960, 7, 5, 0, 0, 959, 958, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 962, 5, 56, 0, 0, 962, 179, 1, 0, 0, 0, 963, 965, 7, 5, 0, 0, 964, 963, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 5, 55, 0, 0, 967, 181, 1, 0, 0, 0, 968, 969, 5, 54, 0, 0, 969, 183, 1, 0, 0, 0, 970, 971, 7, 8, 0, 0, 971, 185, 1, 0, 0, 0, 972, 973, 7, 9, 0, 0, 973, 974, 5, 126, 0, 0, 974, 975, 3, 188, 94, 0, 975, 976, 3, 190, 95, 0, 976, 187, 1, 0, 0, 0, 977, 978, 4, 94, 15, 0, 978, 980, 3, 32, 16, 0, 979, 981, 5, 154, 0, 0, 980, 979, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 983, 5, 109, 0, 0, 983, 986, 1, 0, 0, 0, 984, 986, 3, 32, 16, 0, 985, 977, 1, 0, 0, 0, 985, 984, 1, 0, 0, 0, 986, 189, 1, 0, 0, 0, 987, 988, 5, 76, 0, 0, 988, 993, 3, 150, 75, 0, 989, 990, 5, 64, 0, 0, 990, 992, 3, 150, 75, 0, 991, 989, 1, 0, 0, 0, 992, 995, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 191, 1, 0, 0, 0, 995, 993, 1, 0, 0, 0, 996, 1000, 5, 35, 0, 0, 997, 999, 3, 196, 98, 0, 998, 997, 1, 0, 0, 0, 999, 1002, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1006, 1, 0, 0, 0, 1002, 1000, 1, 0, 0, 0, 1003, 1004, 3, 194, 97, 0, 1004, 1005, 5, 59, 0, 0, 1005, 1007, 1, 0, 0, 0, 1006, 1003, 1, 0, 0, 0, 1006, 1007, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1010, 5, 101, 0, 0, 1009, 1011, 3, 204, 102, 0, 1010, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 5, 102, 0, 0, 1015, 1029, 1, 0, 0, 0, 1016, 1020, 5, 35, 0, 0, 1017, 1019, 3, 196, 98, 0, 1018, 1017, 1, 0, 0, 0, 1019, 1022, 1, 0, 0, 0, 1020, 1018, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1024, 1, 0, 0, 0, 1022, 1020, 1, 0, 0, 0, 1023, 1025, 3, 204, 102, 0, 1024, 1023, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1024, 1, 0, 0, 0, 1026, 1027, 1, 0, 0, 0, 1027, 1029, 1, 0, 0, 0, 1028, 996, 1, 0, 0, 0, 1028, 1016, 1, 0, 0, 0, 1029, 193, 1, 0, 0, 0, 1030, 1031, 7, 1, 0, 0, 1031, 195, 1, 0, 0, 0, 1032, 1033, 3, 198, 99, 0, 1033, 1034, 5, 59, 0, 0, 1034, 1035, 3, 200, 100, 0, 1035, 197, 1, 0, 0, 0, 1036, 1037, 7, 10, 0, 0, 1037, 199, 1, 0, 0, 0, 1038, 1043, 3, 206, 103, 0, 1039, 1040, 5, 64, 0, 0, 1040, 1042, 3, 206, 103, 0, 1041, 1039, 1, 0, 0, 0, 1042, 1045, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1049, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1046, 1049, 5, 104, 0, 0, 1047, 1049, 5, 97, 0, 0, 1048, 1038, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1048, 1047, 1, 0, 0, 0, 1049, 201, 1, 0, 0, 0, 1050, 1051, 7, 11, 0, 0, 1051, 203, 1, 0, 0, 0, 1052, 1054, 3, 202, 101, 0, 1053, 1052, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1066, 1, 0, 0, 0, 1057, 1061, 5, 101, 0, 0, 1058, 1060, 3, 204, 102, 0, 1059, 1058, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1066, 5, 102, 0, 0, 1065, 1053, 1, 0, 0, 0, 1065, 1057, 1, 0, 0, 0, 1066, 205, 1, 0, 0, 0, 1067, 1068, 3, 208, 104, 0, 1068, 1069, 5, 62, 0, 0, 1069, 1070, 3, 212, 106, 0, 1070, 1077, 1, 0, 0, 0, 1071, 1072, 3, 212, 106, 0, 1072, 1073, 5, 61, 0, 0, 1073, 1074, 3, 210, 105, 0, 1074, 1077, 1, 0, 0, 0, 1075, 1077, 3, 214, 107, 0, 1076, 1067, 1, 0, 0, 0, 1076, 1071, 1, 0, 0, 0, 1076, 1075, 1, 0, 0, 0, 1077, 207, 1, 0, 0, 0, 1078, 1079, 7, 12, 0, 0, 1079, 209, 1, 0, 0, 0, 1080, 1081, 7, 12, 0, 0, 1081, 211, 1, 0, 0, 0, 1082, 1083, 7, 12, 0, 0, 1083, 213, 1, 0, 0, 0, 1084, 1085, 7, 13, 0, 0, 1085, 215, 1, 0, 0, 0, 108, 219, 236, 248, 276, 291, 297, 316, 320, 325, 333, 341, 346, 349, 365, 373, 377, 384, 390, 395, 404, 411, 417, 426, 433, 441, 449, 453, 457, 462, 466, 477, 482, 486, 500, 511, 517, 524, 533, 542, 562, 570, 573, 580, 591, 598, 606, 620, 629, 640, 650, 656, 658, 662, 667, 681, 688, 707, 711, 721, 730, 739, 747, 752, 760, 762, 767, 774, 781, 790, 797, 806, 811, 816, 826, 832, 840, 842, 853, 860, 871, 876, 878, 885, 893, 896, 906, 923, 934, 945, 950, 956, 959, 964, 980, 985, 993, 1000, 1006, 1012, 1020, 1026, 1028, 1043, 1048, 1055, 1061, 1065, 1076] \ No newline at end of file +[4, 1, 165, 1095, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 1, 0, 5, 0, 220, 8, 0, 10, 0, 12, 0, 223, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 237, 8, 2, 10, 2, 12, 2, 240, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 251, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 280, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 5, 8, 293, 8, 8, 10, 8, 12, 8, 296, 9, 8, 1, 9, 1, 9, 1, 9, 3, 9, 301, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 318, 8, 13, 10, 13, 12, 13, 321, 9, 13, 1, 13, 3, 13, 324, 8, 13, 1, 14, 1, 14, 1, 14, 3, 14, 329, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 335, 8, 15, 10, 15, 12, 15, 338, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 3, 16, 350, 8, 16, 1, 16, 3, 16, 353, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 367, 8, 21, 10, 21, 12, 21, 370, 9, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 23, 1, 23, 3, 23, 381, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 386, 8, 24, 10, 24, 12, 24, 389, 9, 24, 1, 25, 1, 25, 1, 25, 3, 25, 394, 8, 25, 1, 26, 1, 26, 1, 26, 3, 26, 399, 8, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 408, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 413, 8, 27, 10, 27, 12, 27, 416, 9, 27, 1, 28, 1, 28, 1, 28, 3, 28, 421, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 430, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 435, 8, 29, 10, 29, 12, 29, 438, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 443, 8, 30, 10, 30, 12, 30, 446, 9, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 453, 8, 32, 1, 33, 1, 33, 3, 33, 457, 8, 33, 1, 34, 1, 34, 3, 34, 461, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 466, 8, 35, 1, 36, 1, 36, 3, 36, 470, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 479, 8, 38, 10, 38, 12, 38, 482, 9, 38, 1, 39, 1, 39, 3, 39, 486, 8, 39, 1, 39, 1, 39, 3, 39, 490, 8, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 502, 8, 42, 10, 42, 12, 42, 505, 9, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 515, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 521, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 526, 8, 45, 10, 45, 12, 45, 529, 9, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 537, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 544, 8, 48, 10, 48, 12, 48, 547, 9, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 566, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 572, 8, 53, 10, 53, 12, 53, 575, 9, 53, 3, 53, 577, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 3, 55, 584, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 595, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 602, 8, 57, 1, 58, 1, 58, 1, 58, 1, 59, 4, 59, 608, 8, 59, 11, 59, 12, 59, 609, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 622, 8, 61, 10, 61, 12, 61, 625, 9, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 633, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 644, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 654, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 660, 8, 65, 3, 65, 662, 8, 65, 1, 66, 1, 66, 3, 66, 666, 8, 66, 1, 66, 5, 66, 669, 8, 66, 10, 66, 12, 66, 672, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 685, 8, 67, 1, 68, 1, 68, 1, 68, 5, 68, 690, 8, 68, 10, 68, 12, 68, 693, 9, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 716, 8, 73, 1, 74, 1, 74, 3, 74, 720, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 3, 75, 730, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 739, 8, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 746, 8, 76, 10, 76, 12, 76, 749, 9, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 756, 8, 76, 1, 76, 1, 76, 1, 76, 3, 76, 761, 8, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 769, 8, 76, 10, 76, 12, 76, 772, 9, 76, 1, 77, 1, 77, 3, 77, 776, 8, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 783, 8, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 790, 8, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 5, 77, 797, 8, 77, 10, 77, 12, 77, 800, 9, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 806, 8, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 5, 77, 813, 8, 77, 10, 77, 12, 77, 816, 9, 77, 1, 77, 1, 77, 3, 77, 820, 8, 77, 1, 78, 1, 78, 1, 78, 3, 78, 825, 8, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 835, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 841, 8, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 849, 8, 80, 10, 80, 12, 80, 852, 9, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 862, 8, 81, 1, 81, 1, 81, 1, 81, 5, 81, 867, 8, 81, 10, 81, 12, 81, 870, 9, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 878, 8, 82, 10, 82, 12, 82, 881, 9, 82, 1, 82, 1, 82, 3, 82, 885, 8, 82, 3, 82, 887, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 3, 83, 894, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 5, 84, 900, 8, 84, 10, 84, 12, 84, 903, 9, 84, 3, 84, 905, 8, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 3, 86, 915, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 930, 8, 87, 10, 87, 12, 87, 933, 9, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 941, 8, 87, 10, 87, 12, 87, 944, 9, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 952, 8, 87, 10, 87, 12, 87, 955, 9, 87, 1, 87, 1, 87, 3, 87, 959, 8, 87, 1, 88, 1, 88, 1, 89, 1, 89, 3, 89, 965, 8, 89, 1, 90, 3, 90, 968, 8, 90, 1, 90, 1, 90, 1, 91, 3, 91, 973, 8, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 989, 8, 95, 1, 95, 1, 95, 1, 95, 3, 95, 994, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 5, 96, 1000, 8, 96, 10, 96, 12, 96, 1003, 9, 96, 1, 97, 1, 97, 5, 97, 1007, 8, 97, 10, 97, 12, 97, 1010, 9, 97, 1, 97, 1, 97, 1, 97, 3, 97, 1015, 8, 97, 1, 97, 1, 97, 4, 97, 1019, 8, 97, 11, 97, 12, 97, 1020, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 1027, 8, 97, 10, 97, 12, 97, 1030, 9, 97, 1, 97, 4, 97, 1033, 8, 97, 11, 97, 12, 97, 1034, 3, 97, 1037, 8, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 5, 101, 1050, 8, 101, 10, 101, 12, 101, 1053, 9, 101, 1, 101, 1, 101, 3, 101, 1057, 8, 101, 1, 102, 1, 102, 1, 103, 4, 103, 1062, 8, 103, 11, 103, 12, 103, 1063, 1, 103, 1, 103, 5, 103, 1068, 8, 103, 10, 103, 12, 103, 1071, 9, 103, 1, 103, 3, 103, 1074, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1085, 8, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 0, 5, 4, 122, 152, 160, 162, 109, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 0, 14, 2, 0, 55, 55, 110, 110, 1, 0, 104, 105, 2, 0, 59, 59, 66, 66, 2, 0, 69, 69, 72, 72, 2, 0, 44, 44, 55, 55, 1, 0, 90, 91, 1, 0, 92, 94, 2, 0, 68, 68, 81, 81, 2, 0, 83, 83, 85, 89, 2, 0, 26, 26, 28, 29, 3, 0, 55, 55, 98, 98, 104, 105, 8, 0, 55, 55, 60, 60, 62, 63, 65, 65, 98, 98, 104, 105, 110, 110, 152, 154, 2, 0, 104, 104, 110, 110, 3, 0, 55, 55, 104, 104, 110, 110, 1144, 0, 221, 1, 0, 0, 0, 2, 227, 1, 0, 0, 0, 4, 230, 1, 0, 0, 0, 6, 250, 1, 0, 0, 0, 8, 279, 1, 0, 0, 0, 10, 281, 1, 0, 0, 0, 12, 284, 1, 0, 0, 0, 14, 286, 1, 0, 0, 0, 16, 289, 1, 0, 0, 0, 18, 300, 1, 0, 0, 0, 20, 304, 1, 0, 0, 0, 22, 307, 1, 0, 0, 0, 24, 310, 1, 0, 0, 0, 26, 314, 1, 0, 0, 0, 28, 328, 1, 0, 0, 0, 30, 330, 1, 0, 0, 0, 32, 352, 1, 0, 0, 0, 34, 354, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 358, 1, 0, 0, 0, 40, 360, 1, 0, 0, 0, 42, 362, 1, 0, 0, 0, 44, 371, 1, 0, 0, 0, 46, 374, 1, 0, 0, 0, 48, 382, 1, 0, 0, 0, 50, 390, 1, 0, 0, 0, 52, 407, 1, 0, 0, 0, 54, 409, 1, 0, 0, 0, 56, 429, 1, 0, 0, 0, 58, 431, 1, 0, 0, 0, 60, 439, 1, 0, 0, 0, 62, 447, 1, 0, 0, 0, 64, 452, 1, 0, 0, 0, 66, 456, 1, 0, 0, 0, 68, 460, 1, 0, 0, 0, 70, 465, 1, 0, 0, 0, 72, 469, 1, 0, 0, 0, 74, 471, 1, 0, 0, 0, 76, 474, 1, 0, 0, 0, 78, 483, 1, 0, 0, 0, 80, 491, 1, 0, 0, 0, 82, 494, 1, 0, 0, 0, 84, 497, 1, 0, 0, 0, 86, 514, 1, 0, 0, 0, 88, 516, 1, 0, 0, 0, 90, 522, 1, 0, 0, 0, 92, 530, 1, 0, 0, 0, 94, 536, 1, 0, 0, 0, 96, 538, 1, 0, 0, 0, 98, 548, 1, 0, 0, 0, 100, 551, 1, 0, 0, 0, 102, 554, 1, 0, 0, 0, 104, 558, 1, 0, 0, 0, 106, 561, 1, 0, 0, 0, 108, 578, 1, 0, 0, 0, 110, 583, 1, 0, 0, 0, 112, 587, 1, 0, 0, 0, 114, 590, 1, 0, 0, 0, 116, 603, 1, 0, 0, 0, 118, 607, 1, 0, 0, 0, 120, 611, 1, 0, 0, 0, 122, 615, 1, 0, 0, 0, 124, 626, 1, 0, 0, 0, 126, 628, 1, 0, 0, 0, 128, 639, 1, 0, 0, 0, 130, 661, 1, 0, 0, 0, 132, 663, 1, 0, 0, 0, 134, 684, 1, 0, 0, 0, 136, 686, 1, 0, 0, 0, 138, 694, 1, 0, 0, 0, 140, 699, 1, 0, 0, 0, 142, 702, 1, 0, 0, 0, 144, 707, 1, 0, 0, 0, 146, 711, 1, 0, 0, 0, 148, 717, 1, 0, 0, 0, 150, 729, 1, 0, 0, 0, 152, 760, 1, 0, 0, 0, 154, 819, 1, 0, 0, 0, 156, 821, 1, 0, 0, 0, 158, 834, 1, 0, 0, 0, 160, 840, 1, 0, 0, 0, 162, 861, 1, 0, 0, 0, 164, 871, 1, 0, 0, 0, 166, 893, 1, 0, 0, 0, 168, 895, 1, 0, 0, 0, 170, 908, 1, 0, 0, 0, 172, 914, 1, 0, 0, 0, 174, 958, 1, 0, 0, 0, 176, 960, 1, 0, 0, 0, 178, 964, 1, 0, 0, 0, 180, 967, 1, 0, 0, 0, 182, 972, 1, 0, 0, 0, 184, 976, 1, 0, 0, 0, 186, 978, 1, 0, 0, 0, 188, 980, 1, 0, 0, 0, 190, 993, 1, 0, 0, 0, 192, 995, 1, 0, 0, 0, 194, 1036, 1, 0, 0, 0, 196, 1038, 1, 0, 0, 0, 198, 1040, 1, 0, 0, 0, 200, 1044, 1, 0, 0, 0, 202, 1056, 1, 0, 0, 0, 204, 1058, 1, 0, 0, 0, 206, 1073, 1, 0, 0, 0, 208, 1084, 1, 0, 0, 0, 210, 1086, 1, 0, 0, 0, 212, 1088, 1, 0, 0, 0, 214, 1090, 1, 0, 0, 0, 216, 1092, 1, 0, 0, 0, 218, 220, 3, 144, 72, 0, 219, 218, 1, 0, 0, 0, 220, 223, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 224, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 224, 225, 3, 2, 1, 0, 225, 226, 5, 0, 0, 1, 226, 1, 1, 0, 0, 0, 227, 228, 3, 4, 2, 0, 228, 229, 5, 0, 0, 1, 229, 3, 1, 0, 0, 0, 230, 231, 6, 2, -1, 0, 231, 232, 3, 6, 3, 0, 232, 238, 1, 0, 0, 0, 233, 234, 10, 1, 0, 0, 234, 235, 5, 54, 0, 0, 235, 237, 3, 8, 4, 0, 236, 233, 1, 0, 0, 0, 237, 240, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 5, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 241, 251, 3, 20, 10, 0, 242, 251, 3, 14, 7, 0, 243, 251, 3, 104, 52, 0, 244, 251, 3, 22, 11, 0, 245, 251, 3, 194, 97, 0, 246, 247, 4, 3, 1, 0, 247, 251, 3, 100, 50, 0, 248, 249, 4, 3, 2, 0, 249, 251, 3, 24, 12, 0, 250, 241, 1, 0, 0, 0, 250, 242, 1, 0, 0, 0, 250, 243, 1, 0, 0, 0, 250, 244, 1, 0, 0, 0, 250, 245, 1, 0, 0, 0, 250, 246, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 7, 1, 0, 0, 0, 252, 280, 3, 44, 22, 0, 253, 280, 3, 10, 5, 0, 254, 280, 3, 80, 40, 0, 255, 280, 3, 74, 37, 0, 256, 280, 3, 46, 23, 0, 257, 280, 3, 76, 38, 0, 258, 280, 3, 82, 41, 0, 259, 280, 3, 84, 42, 0, 260, 280, 3, 88, 44, 0, 261, 280, 3, 96, 48, 0, 262, 280, 3, 106, 53, 0, 263, 280, 3, 98, 49, 0, 264, 280, 3, 188, 94, 0, 265, 280, 3, 114, 57, 0, 266, 280, 3, 128, 64, 0, 267, 280, 3, 112, 56, 0, 268, 280, 3, 116, 58, 0, 269, 280, 3, 126, 63, 0, 270, 280, 3, 130, 65, 0, 271, 280, 3, 132, 66, 0, 272, 280, 3, 142, 71, 0, 273, 274, 4, 4, 3, 0, 274, 280, 3, 138, 69, 0, 275, 276, 4, 4, 4, 0, 276, 280, 3, 140, 70, 0, 277, 278, 4, 4, 5, 0, 278, 280, 3, 148, 74, 0, 279, 252, 1, 0, 0, 0, 279, 253, 1, 0, 0, 0, 279, 254, 1, 0, 0, 0, 279, 255, 1, 0, 0, 0, 279, 256, 1, 0, 0, 0, 279, 257, 1, 0, 0, 0, 279, 258, 1, 0, 0, 0, 279, 259, 1, 0, 0, 0, 279, 260, 1, 0, 0, 0, 279, 261, 1, 0, 0, 0, 279, 262, 1, 0, 0, 0, 279, 263, 1, 0, 0, 0, 279, 264, 1, 0, 0, 0, 279, 265, 1, 0, 0, 0, 279, 266, 1, 0, 0, 0, 279, 267, 1, 0, 0, 0, 279, 268, 1, 0, 0, 0, 279, 269, 1, 0, 0, 0, 279, 270, 1, 0, 0, 0, 279, 271, 1, 0, 0, 0, 279, 272, 1, 0, 0, 0, 279, 273, 1, 0, 0, 0, 279, 275, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 9, 1, 0, 0, 0, 281, 282, 5, 17, 0, 0, 282, 283, 3, 152, 76, 0, 283, 11, 1, 0, 0, 0, 284, 285, 3, 62, 31, 0, 285, 13, 1, 0, 0, 0, 286, 287, 5, 13, 0, 0, 287, 288, 3, 16, 8, 0, 288, 15, 1, 0, 0, 0, 289, 294, 3, 18, 9, 0, 290, 291, 5, 65, 0, 0, 291, 293, 3, 18, 9, 0, 292, 290, 1, 0, 0, 0, 293, 296, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 17, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 297, 298, 3, 52, 26, 0, 298, 299, 5, 60, 0, 0, 299, 301, 1, 0, 0, 0, 300, 297, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 303, 3, 152, 76, 0, 303, 19, 1, 0, 0, 0, 304, 305, 5, 19, 0, 0, 305, 306, 3, 26, 13, 0, 306, 21, 1, 0, 0, 0, 307, 308, 5, 20, 0, 0, 308, 309, 3, 26, 13, 0, 309, 23, 1, 0, 0, 0, 310, 311, 5, 21, 0, 0, 311, 312, 3, 72, 36, 0, 312, 313, 3, 94, 47, 0, 313, 25, 1, 0, 0, 0, 314, 319, 3, 28, 14, 0, 315, 316, 5, 65, 0, 0, 316, 318, 3, 28, 14, 0, 317, 315, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 324, 3, 42, 21, 0, 323, 322, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 27, 1, 0, 0, 0, 325, 329, 3, 32, 16, 0, 326, 327, 4, 14, 6, 0, 327, 329, 3, 30, 15, 0, 328, 325, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 329, 29, 1, 0, 0, 0, 330, 331, 5, 102, 0, 0, 331, 336, 3, 20, 10, 0, 332, 333, 5, 54, 0, 0, 333, 335, 3, 8, 4, 0, 334, 332, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 103, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 3, 34, 17, 0, 342, 343, 5, 63, 0, 0, 343, 345, 1, 0, 0, 0, 344, 341, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 349, 3, 38, 19, 0, 347, 348, 5, 62, 0, 0, 348, 350, 3, 36, 18, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 353, 3, 40, 20, 0, 352, 344, 1, 0, 0, 0, 352, 351, 1, 0, 0, 0, 353, 33, 1, 0, 0, 0, 354, 355, 5, 110, 0, 0, 355, 35, 1, 0, 0, 0, 356, 357, 5, 110, 0, 0, 357, 37, 1, 0, 0, 0, 358, 359, 5, 110, 0, 0, 359, 39, 1, 0, 0, 0, 360, 361, 7, 0, 0, 0, 361, 41, 1, 0, 0, 0, 362, 363, 5, 109, 0, 0, 363, 368, 5, 110, 0, 0, 364, 365, 5, 65, 0, 0, 365, 367, 5, 110, 0, 0, 366, 364, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 43, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 372, 5, 9, 0, 0, 372, 373, 3, 16, 8, 0, 373, 45, 1, 0, 0, 0, 374, 376, 5, 16, 0, 0, 375, 377, 3, 48, 24, 0, 376, 375, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 379, 5, 61, 0, 0, 379, 381, 3, 16, 8, 0, 380, 378, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 47, 1, 0, 0, 0, 382, 387, 3, 50, 25, 0, 383, 384, 5, 65, 0, 0, 384, 386, 3, 50, 25, 0, 385, 383, 1, 0, 0, 0, 386, 389, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 49, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 390, 393, 3, 18, 9, 0, 391, 392, 5, 17, 0, 0, 392, 394, 3, 152, 76, 0, 393, 391, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 51, 1, 0, 0, 0, 395, 396, 4, 26, 7, 0, 396, 398, 5, 100, 0, 0, 397, 399, 5, 104, 0, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 101, 0, 0, 401, 402, 5, 67, 0, 0, 402, 403, 5, 100, 0, 0, 403, 404, 3, 54, 27, 0, 404, 405, 5, 101, 0, 0, 405, 408, 1, 0, 0, 0, 406, 408, 3, 54, 27, 0, 407, 395, 1, 0, 0, 0, 407, 406, 1, 0, 0, 0, 408, 53, 1, 0, 0, 0, 409, 414, 3, 70, 35, 0, 410, 411, 5, 67, 0, 0, 411, 413, 3, 70, 35, 0, 412, 410, 1, 0, 0, 0, 413, 416, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 55, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 417, 418, 4, 28, 8, 0, 418, 420, 5, 100, 0, 0, 419, 421, 5, 145, 0, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 5, 101, 0, 0, 423, 424, 5, 67, 0, 0, 424, 425, 5, 100, 0, 0, 425, 426, 3, 58, 29, 0, 426, 427, 5, 101, 0, 0, 427, 430, 1, 0, 0, 0, 428, 430, 3, 58, 29, 0, 429, 417, 1, 0, 0, 0, 429, 428, 1, 0, 0, 0, 430, 57, 1, 0, 0, 0, 431, 436, 3, 64, 32, 0, 432, 433, 5, 67, 0, 0, 433, 435, 3, 64, 32, 0, 434, 432, 1, 0, 0, 0, 435, 438, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 59, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 439, 444, 3, 56, 28, 0, 440, 441, 5, 65, 0, 0, 441, 443, 3, 56, 28, 0, 442, 440, 1, 0, 0, 0, 443, 446, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 61, 1, 0, 0, 0, 446, 444, 1, 0, 0, 0, 447, 448, 7, 1, 0, 0, 448, 63, 1, 0, 0, 0, 449, 453, 5, 145, 0, 0, 450, 453, 3, 66, 33, 0, 451, 453, 3, 68, 34, 0, 452, 449, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 451, 1, 0, 0, 0, 453, 65, 1, 0, 0, 0, 454, 457, 5, 79, 0, 0, 455, 457, 5, 98, 0, 0, 456, 454, 1, 0, 0, 0, 456, 455, 1, 0, 0, 0, 457, 67, 1, 0, 0, 0, 458, 461, 5, 97, 0, 0, 459, 461, 5, 99, 0, 0, 460, 458, 1, 0, 0, 0, 460, 459, 1, 0, 0, 0, 461, 69, 1, 0, 0, 0, 462, 466, 3, 62, 31, 0, 463, 466, 3, 66, 33, 0, 464, 466, 3, 68, 34, 0, 465, 462, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 464, 1, 0, 0, 0, 466, 71, 1, 0, 0, 0, 467, 470, 3, 184, 92, 0, 468, 470, 3, 66, 33, 0, 469, 467, 1, 0, 0, 0, 469, 468, 1, 0, 0, 0, 470, 73, 1, 0, 0, 0, 471, 472, 5, 11, 0, 0, 472, 473, 3, 174, 87, 0, 473, 75, 1, 0, 0, 0, 474, 475, 5, 15, 0, 0, 475, 480, 3, 78, 39, 0, 476, 477, 5, 65, 0, 0, 477, 479, 3, 78, 39, 0, 478, 476, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 77, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 485, 3, 152, 76, 0, 484, 486, 7, 2, 0, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 489, 1, 0, 0, 0, 487, 488, 5, 76, 0, 0, 488, 490, 7, 3, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 79, 1, 0, 0, 0, 491, 492, 5, 34, 0, 0, 492, 493, 3, 60, 30, 0, 493, 81, 1, 0, 0, 0, 494, 495, 5, 33, 0, 0, 495, 496, 3, 60, 30, 0, 496, 83, 1, 0, 0, 0, 497, 498, 5, 37, 0, 0, 498, 503, 3, 86, 43, 0, 499, 500, 5, 65, 0, 0, 500, 502, 3, 86, 43, 0, 501, 499, 1, 0, 0, 0, 502, 505, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 85, 1, 0, 0, 0, 505, 503, 1, 0, 0, 0, 506, 507, 3, 56, 28, 0, 507, 508, 5, 155, 0, 0, 508, 509, 3, 56, 28, 0, 509, 515, 1, 0, 0, 0, 510, 511, 3, 56, 28, 0, 511, 512, 5, 60, 0, 0, 512, 513, 3, 56, 28, 0, 513, 515, 1, 0, 0, 0, 514, 506, 1, 0, 0, 0, 514, 510, 1, 0, 0, 0, 515, 87, 1, 0, 0, 0, 516, 517, 5, 8, 0, 0, 517, 518, 3, 162, 81, 0, 518, 520, 3, 184, 92, 0, 519, 521, 3, 90, 45, 0, 520, 519, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 89, 1, 0, 0, 0, 522, 527, 3, 92, 46, 0, 523, 524, 5, 65, 0, 0, 524, 526, 3, 92, 46, 0, 525, 523, 1, 0, 0, 0, 526, 529, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 91, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 531, 3, 62, 31, 0, 531, 532, 5, 60, 0, 0, 532, 533, 3, 174, 87, 0, 533, 93, 1, 0, 0, 0, 534, 535, 5, 82, 0, 0, 535, 537, 3, 168, 84, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 95, 1, 0, 0, 0, 538, 539, 5, 10, 0, 0, 539, 540, 3, 162, 81, 0, 540, 545, 3, 184, 92, 0, 541, 542, 5, 65, 0, 0, 542, 544, 3, 184, 92, 0, 543, 541, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 97, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 549, 5, 32, 0, 0, 549, 550, 3, 52, 26, 0, 550, 99, 1, 0, 0, 0, 551, 552, 5, 6, 0, 0, 552, 553, 3, 102, 51, 0, 553, 101, 1, 0, 0, 0, 554, 555, 5, 102, 0, 0, 555, 556, 3, 4, 2, 0, 556, 557, 5, 103, 0, 0, 557, 103, 1, 0, 0, 0, 558, 559, 5, 39, 0, 0, 559, 560, 5, 162, 0, 0, 560, 105, 1, 0, 0, 0, 561, 562, 5, 5, 0, 0, 562, 565, 3, 108, 54, 0, 563, 564, 5, 77, 0, 0, 564, 566, 3, 56, 28, 0, 565, 563, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 576, 1, 0, 0, 0, 567, 568, 5, 82, 0, 0, 568, 573, 3, 110, 55, 0, 569, 570, 5, 65, 0, 0, 570, 572, 3, 110, 55, 0, 571, 569, 1, 0, 0, 0, 572, 575, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 577, 1, 0, 0, 0, 575, 573, 1, 0, 0, 0, 576, 567, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 107, 1, 0, 0, 0, 578, 579, 7, 4, 0, 0, 579, 109, 1, 0, 0, 0, 580, 581, 3, 56, 28, 0, 581, 582, 5, 60, 0, 0, 582, 584, 1, 0, 0, 0, 583, 580, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 3, 56, 28, 0, 586, 111, 1, 0, 0, 0, 587, 588, 5, 14, 0, 0, 588, 589, 3, 174, 87, 0, 589, 113, 1, 0, 0, 0, 590, 591, 5, 4, 0, 0, 591, 594, 3, 52, 26, 0, 592, 593, 5, 77, 0, 0, 593, 595, 3, 52, 26, 0, 594, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 601, 1, 0, 0, 0, 596, 597, 5, 155, 0, 0, 597, 598, 3, 52, 26, 0, 598, 599, 5, 65, 0, 0, 599, 600, 3, 52, 26, 0, 600, 602, 1, 0, 0, 0, 601, 596, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 115, 1, 0, 0, 0, 603, 604, 5, 22, 0, 0, 604, 605, 3, 118, 59, 0, 605, 117, 1, 0, 0, 0, 606, 608, 3, 120, 60, 0, 607, 606, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 119, 1, 0, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 3, 122, 61, 0, 613, 614, 5, 103, 0, 0, 614, 121, 1, 0, 0, 0, 615, 616, 6, 61, -1, 0, 616, 617, 3, 124, 62, 0, 617, 623, 1, 0, 0, 0, 618, 619, 10, 1, 0, 0, 619, 620, 5, 54, 0, 0, 620, 622, 3, 124, 62, 0, 621, 618, 1, 0, 0, 0, 622, 625, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 123, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 626, 627, 3, 8, 4, 0, 627, 125, 1, 0, 0, 0, 628, 632, 5, 12, 0, 0, 629, 630, 3, 52, 26, 0, 630, 631, 5, 60, 0, 0, 631, 633, 1, 0, 0, 0, 632, 629, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 635, 3, 174, 87, 0, 635, 636, 5, 77, 0, 0, 636, 637, 3, 16, 8, 0, 637, 638, 3, 94, 47, 0, 638, 127, 1, 0, 0, 0, 639, 643, 5, 7, 0, 0, 640, 641, 3, 52, 26, 0, 641, 642, 5, 60, 0, 0, 642, 644, 1, 0, 0, 0, 643, 640, 1, 0, 0, 0, 643, 644, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 646, 3, 162, 81, 0, 646, 647, 3, 94, 47, 0, 647, 129, 1, 0, 0, 0, 648, 649, 5, 24, 0, 0, 649, 650, 5, 123, 0, 0, 650, 653, 3, 48, 24, 0, 651, 652, 5, 61, 0, 0, 652, 654, 3, 16, 8, 0, 653, 651, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 662, 1, 0, 0, 0, 655, 656, 5, 25, 0, 0, 656, 659, 3, 48, 24, 0, 657, 658, 5, 61, 0, 0, 658, 660, 3, 16, 8, 0, 659, 657, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 662, 1, 0, 0, 0, 661, 648, 1, 0, 0, 0, 661, 655, 1, 0, 0, 0, 662, 131, 1, 0, 0, 0, 663, 665, 5, 23, 0, 0, 664, 666, 3, 62, 31, 0, 665, 664, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 670, 1, 0, 0, 0, 667, 669, 3, 134, 67, 0, 668, 667, 1, 0, 0, 0, 669, 672, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 133, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 673, 674, 5, 118, 0, 0, 674, 675, 5, 61, 0, 0, 675, 685, 3, 52, 26, 0, 676, 677, 5, 119, 0, 0, 677, 678, 5, 61, 0, 0, 678, 685, 3, 136, 68, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 61, 0, 0, 681, 685, 3, 52, 26, 0, 682, 683, 5, 82, 0, 0, 683, 685, 3, 168, 84, 0, 684, 673, 1, 0, 0, 0, 684, 676, 1, 0, 0, 0, 684, 679, 1, 0, 0, 0, 684, 682, 1, 0, 0, 0, 685, 135, 1, 0, 0, 0, 686, 691, 3, 52, 26, 0, 687, 688, 5, 65, 0, 0, 688, 690, 3, 52, 26, 0, 689, 687, 1, 0, 0, 0, 690, 693, 1, 0, 0, 0, 691, 689, 1, 0, 0, 0, 691, 692, 1, 0, 0, 0, 692, 137, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 694, 695, 5, 30, 0, 0, 695, 696, 3, 32, 16, 0, 696, 697, 5, 77, 0, 0, 697, 698, 3, 60, 30, 0, 698, 139, 1, 0, 0, 0, 699, 700, 5, 35, 0, 0, 700, 701, 3, 60, 30, 0, 701, 141, 1, 0, 0, 0, 702, 703, 5, 18, 0, 0, 703, 704, 3, 52, 26, 0, 704, 705, 5, 60, 0, 0, 705, 706, 3, 162, 81, 0, 706, 143, 1, 0, 0, 0, 707, 708, 5, 38, 0, 0, 708, 709, 3, 146, 73, 0, 709, 710, 5, 64, 0, 0, 710, 145, 1, 0, 0, 0, 711, 712, 3, 62, 31, 0, 712, 715, 5, 60, 0, 0, 713, 716, 3, 174, 87, 0, 714, 716, 3, 168, 84, 0, 715, 713, 1, 0, 0, 0, 715, 714, 1, 0, 0, 0, 716, 147, 1, 0, 0, 0, 717, 719, 5, 31, 0, 0, 718, 720, 3, 150, 75, 0, 719, 718, 1, 0, 0, 0, 719, 720, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 722, 5, 77, 0, 0, 722, 723, 3, 52, 26, 0, 723, 724, 5, 138, 0, 0, 724, 725, 3, 182, 91, 0, 725, 726, 3, 94, 47, 0, 726, 149, 1, 0, 0, 0, 727, 730, 3, 66, 33, 0, 728, 730, 3, 162, 81, 0, 729, 727, 1, 0, 0, 0, 729, 728, 1, 0, 0, 0, 730, 151, 1, 0, 0, 0, 731, 732, 6, 76, -1, 0, 732, 733, 5, 74, 0, 0, 733, 761, 3, 152, 76, 8, 734, 761, 3, 158, 79, 0, 735, 761, 3, 154, 77, 0, 736, 738, 3, 158, 79, 0, 737, 739, 5, 74, 0, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 70, 0, 0, 741, 742, 5, 102, 0, 0, 742, 747, 3, 158, 79, 0, 743, 744, 5, 65, 0, 0, 744, 746, 3, 158, 79, 0, 745, 743, 1, 0, 0, 0, 746, 749, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 750, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 750, 751, 5, 103, 0, 0, 751, 761, 1, 0, 0, 0, 752, 753, 3, 158, 79, 0, 753, 755, 5, 71, 0, 0, 754, 756, 5, 74, 0, 0, 755, 754, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 5, 75, 0, 0, 758, 761, 1, 0, 0, 0, 759, 761, 3, 156, 78, 0, 760, 731, 1, 0, 0, 0, 760, 734, 1, 0, 0, 0, 760, 735, 1, 0, 0, 0, 760, 736, 1, 0, 0, 0, 760, 752, 1, 0, 0, 0, 760, 759, 1, 0, 0, 0, 761, 770, 1, 0, 0, 0, 762, 763, 10, 5, 0, 0, 763, 764, 5, 58, 0, 0, 764, 769, 3, 152, 76, 6, 765, 766, 10, 4, 0, 0, 766, 767, 5, 78, 0, 0, 767, 769, 3, 152, 76, 5, 768, 762, 1, 0, 0, 0, 768, 765, 1, 0, 0, 0, 769, 772, 1, 0, 0, 0, 770, 768, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 153, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 773, 775, 3, 158, 79, 0, 774, 776, 5, 74, 0, 0, 775, 774, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 778, 5, 73, 0, 0, 778, 779, 3, 72, 36, 0, 779, 820, 1, 0, 0, 0, 780, 782, 3, 158, 79, 0, 781, 783, 5, 74, 0, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 784, 1, 0, 0, 0, 784, 785, 5, 80, 0, 0, 785, 786, 3, 72, 36, 0, 786, 820, 1, 0, 0, 0, 787, 789, 3, 158, 79, 0, 788, 790, 5, 74, 0, 0, 789, 788, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 73, 0, 0, 792, 793, 5, 102, 0, 0, 793, 798, 3, 72, 36, 0, 794, 795, 5, 65, 0, 0, 795, 797, 3, 72, 36, 0, 796, 794, 1, 0, 0, 0, 797, 800, 1, 0, 0, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 801, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 801, 802, 5, 103, 0, 0, 802, 820, 1, 0, 0, 0, 803, 805, 3, 158, 79, 0, 804, 806, 5, 74, 0, 0, 805, 804, 1, 0, 0, 0, 805, 806, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 5, 80, 0, 0, 808, 809, 5, 102, 0, 0, 809, 814, 3, 72, 36, 0, 810, 811, 5, 65, 0, 0, 811, 813, 3, 72, 36, 0, 812, 810, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 817, 1, 0, 0, 0, 816, 814, 1, 0, 0, 0, 817, 818, 5, 103, 0, 0, 818, 820, 1, 0, 0, 0, 819, 773, 1, 0, 0, 0, 819, 780, 1, 0, 0, 0, 819, 787, 1, 0, 0, 0, 819, 803, 1, 0, 0, 0, 820, 155, 1, 0, 0, 0, 821, 824, 3, 52, 26, 0, 822, 823, 5, 62, 0, 0, 823, 825, 3, 12, 6, 0, 824, 822, 1, 0, 0, 0, 824, 825, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 827, 5, 63, 0, 0, 827, 828, 3, 174, 87, 0, 828, 157, 1, 0, 0, 0, 829, 835, 3, 160, 80, 0, 830, 831, 3, 160, 80, 0, 831, 832, 3, 186, 93, 0, 832, 833, 3, 160, 80, 0, 833, 835, 1, 0, 0, 0, 834, 829, 1, 0, 0, 0, 834, 830, 1, 0, 0, 0, 835, 159, 1, 0, 0, 0, 836, 837, 6, 80, -1, 0, 837, 841, 3, 162, 81, 0, 838, 839, 7, 5, 0, 0, 839, 841, 3, 160, 80, 3, 840, 836, 1, 0, 0, 0, 840, 838, 1, 0, 0, 0, 841, 850, 1, 0, 0, 0, 842, 843, 10, 2, 0, 0, 843, 844, 7, 6, 0, 0, 844, 849, 3, 160, 80, 3, 845, 846, 10, 1, 0, 0, 846, 847, 7, 5, 0, 0, 847, 849, 3, 160, 80, 2, 848, 842, 1, 0, 0, 0, 848, 845, 1, 0, 0, 0, 849, 852, 1, 0, 0, 0, 850, 848, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 851, 161, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 853, 854, 6, 81, -1, 0, 854, 862, 3, 174, 87, 0, 855, 862, 3, 52, 26, 0, 856, 862, 3, 164, 82, 0, 857, 858, 5, 102, 0, 0, 858, 859, 3, 152, 76, 0, 859, 860, 5, 103, 0, 0, 860, 862, 1, 0, 0, 0, 861, 853, 1, 0, 0, 0, 861, 855, 1, 0, 0, 0, 861, 856, 1, 0, 0, 0, 861, 857, 1, 0, 0, 0, 862, 868, 1, 0, 0, 0, 863, 864, 10, 1, 0, 0, 864, 865, 5, 62, 0, 0, 865, 867, 3, 12, 6, 0, 866, 863, 1, 0, 0, 0, 867, 870, 1, 0, 0, 0, 868, 866, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 163, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 871, 872, 3, 166, 83, 0, 872, 886, 5, 102, 0, 0, 873, 887, 5, 92, 0, 0, 874, 879, 3, 152, 76, 0, 875, 876, 5, 65, 0, 0, 876, 878, 3, 152, 76, 0, 877, 875, 1, 0, 0, 0, 878, 881, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 884, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 883, 5, 65, 0, 0, 883, 885, 3, 168, 84, 0, 884, 882, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 887, 1, 0, 0, 0, 886, 873, 1, 0, 0, 0, 886, 874, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 5, 103, 0, 0, 889, 165, 1, 0, 0, 0, 890, 894, 3, 70, 35, 0, 891, 894, 5, 69, 0, 0, 892, 894, 5, 72, 0, 0, 893, 890, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 893, 892, 1, 0, 0, 0, 894, 167, 1, 0, 0, 0, 895, 904, 5, 95, 0, 0, 896, 901, 3, 170, 85, 0, 897, 898, 5, 65, 0, 0, 898, 900, 3, 170, 85, 0, 899, 897, 1, 0, 0, 0, 900, 903, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 905, 1, 0, 0, 0, 903, 901, 1, 0, 0, 0, 904, 896, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 5, 96, 0, 0, 907, 169, 1, 0, 0, 0, 908, 909, 3, 184, 92, 0, 909, 910, 5, 63, 0, 0, 910, 911, 3, 172, 86, 0, 911, 171, 1, 0, 0, 0, 912, 915, 3, 174, 87, 0, 913, 915, 3, 168, 84, 0, 914, 912, 1, 0, 0, 0, 914, 913, 1, 0, 0, 0, 915, 173, 1, 0, 0, 0, 916, 959, 5, 75, 0, 0, 917, 918, 3, 182, 91, 0, 918, 919, 5, 104, 0, 0, 919, 959, 1, 0, 0, 0, 920, 959, 3, 180, 90, 0, 921, 959, 3, 182, 91, 0, 922, 959, 3, 176, 88, 0, 923, 959, 3, 66, 33, 0, 924, 959, 3, 184, 92, 0, 925, 926, 5, 100, 0, 0, 926, 931, 3, 178, 89, 0, 927, 928, 5, 65, 0, 0, 928, 930, 3, 178, 89, 0, 929, 927, 1, 0, 0, 0, 930, 933, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 934, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 934, 935, 5, 101, 0, 0, 935, 959, 1, 0, 0, 0, 936, 937, 5, 100, 0, 0, 937, 942, 3, 176, 88, 0, 938, 939, 5, 65, 0, 0, 939, 941, 3, 176, 88, 0, 940, 938, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 101, 0, 0, 946, 959, 1, 0, 0, 0, 947, 948, 5, 100, 0, 0, 948, 953, 3, 184, 92, 0, 949, 950, 5, 65, 0, 0, 950, 952, 3, 184, 92, 0, 951, 949, 1, 0, 0, 0, 952, 955, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 956, 1, 0, 0, 0, 955, 953, 1, 0, 0, 0, 956, 957, 5, 101, 0, 0, 957, 959, 1, 0, 0, 0, 958, 916, 1, 0, 0, 0, 958, 917, 1, 0, 0, 0, 958, 920, 1, 0, 0, 0, 958, 921, 1, 0, 0, 0, 958, 922, 1, 0, 0, 0, 958, 923, 1, 0, 0, 0, 958, 924, 1, 0, 0, 0, 958, 925, 1, 0, 0, 0, 958, 936, 1, 0, 0, 0, 958, 947, 1, 0, 0, 0, 959, 175, 1, 0, 0, 0, 960, 961, 7, 7, 0, 0, 961, 177, 1, 0, 0, 0, 962, 965, 3, 180, 90, 0, 963, 965, 3, 182, 91, 0, 964, 962, 1, 0, 0, 0, 964, 963, 1, 0, 0, 0, 965, 179, 1, 0, 0, 0, 966, 968, 7, 5, 0, 0, 967, 966, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 970, 5, 57, 0, 0, 970, 181, 1, 0, 0, 0, 971, 973, 7, 5, 0, 0, 972, 971, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 56, 0, 0, 975, 183, 1, 0, 0, 0, 976, 977, 5, 55, 0, 0, 977, 185, 1, 0, 0, 0, 978, 979, 7, 8, 0, 0, 979, 187, 1, 0, 0, 0, 980, 981, 7, 9, 0, 0, 981, 982, 5, 127, 0, 0, 982, 983, 3, 190, 95, 0, 983, 984, 3, 192, 96, 0, 984, 189, 1, 0, 0, 0, 985, 986, 4, 95, 15, 0, 986, 988, 3, 32, 16, 0, 987, 989, 5, 155, 0, 0, 988, 987, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 991, 5, 110, 0, 0, 991, 994, 1, 0, 0, 0, 992, 994, 3, 32, 16, 0, 993, 985, 1, 0, 0, 0, 993, 992, 1, 0, 0, 0, 994, 191, 1, 0, 0, 0, 995, 996, 5, 77, 0, 0, 996, 1001, 3, 152, 76, 0, 997, 998, 5, 65, 0, 0, 998, 1000, 3, 152, 76, 0, 999, 997, 1, 0, 0, 0, 1000, 1003, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 193, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 1008, 5, 36, 0, 0, 1005, 1007, 3, 198, 99, 0, 1006, 1005, 1, 0, 0, 0, 1007, 1010, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1014, 1, 0, 0, 0, 1010, 1008, 1, 0, 0, 0, 1011, 1012, 3, 196, 98, 0, 1012, 1013, 5, 60, 0, 0, 1013, 1015, 1, 0, 0, 0, 1014, 1011, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1018, 5, 102, 0, 0, 1017, 1019, 3, 206, 103, 0, 1018, 1017, 1, 0, 0, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1018, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 5, 103, 0, 0, 1023, 1037, 1, 0, 0, 0, 1024, 1028, 5, 36, 0, 0, 1025, 1027, 3, 198, 99, 0, 1026, 1025, 1, 0, 0, 0, 1027, 1030, 1, 0, 0, 0, 1028, 1026, 1, 0, 0, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1032, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1031, 1033, 3, 206, 103, 0, 1032, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1037, 1, 0, 0, 0, 1036, 1004, 1, 0, 0, 0, 1036, 1024, 1, 0, 0, 0, 1037, 195, 1, 0, 0, 0, 1038, 1039, 7, 1, 0, 0, 1039, 197, 1, 0, 0, 0, 1040, 1041, 3, 200, 100, 0, 1041, 1042, 5, 60, 0, 0, 1042, 1043, 3, 202, 101, 0, 1043, 199, 1, 0, 0, 0, 1044, 1045, 7, 10, 0, 0, 1045, 201, 1, 0, 0, 0, 1046, 1051, 3, 208, 104, 0, 1047, 1048, 5, 65, 0, 0, 1048, 1050, 3, 208, 104, 0, 1049, 1047, 1, 0, 0, 0, 1050, 1053, 1, 0, 0, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1057, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1054, 1057, 5, 105, 0, 0, 1055, 1057, 5, 98, 0, 0, 1056, 1046, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1055, 1, 0, 0, 0, 1057, 203, 1, 0, 0, 0, 1058, 1059, 7, 11, 0, 0, 1059, 205, 1, 0, 0, 0, 1060, 1062, 3, 204, 102, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1074, 1, 0, 0, 0, 1065, 1069, 5, 102, 0, 0, 1066, 1068, 3, 206, 103, 0, 1067, 1066, 1, 0, 0, 0, 1068, 1071, 1, 0, 0, 0, 1069, 1067, 1, 0, 0, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1072, 1, 0, 0, 0, 1071, 1069, 1, 0, 0, 0, 1072, 1074, 5, 103, 0, 0, 1073, 1061, 1, 0, 0, 0, 1073, 1065, 1, 0, 0, 0, 1074, 207, 1, 0, 0, 0, 1075, 1076, 3, 210, 105, 0, 1076, 1077, 5, 63, 0, 0, 1077, 1078, 3, 214, 107, 0, 1078, 1085, 1, 0, 0, 0, 1079, 1080, 3, 214, 107, 0, 1080, 1081, 5, 62, 0, 0, 1081, 1082, 3, 212, 106, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1085, 3, 216, 108, 0, 1084, 1075, 1, 0, 0, 0, 1084, 1079, 1, 0, 0, 0, 1084, 1083, 1, 0, 0, 0, 1085, 209, 1, 0, 0, 0, 1086, 1087, 7, 12, 0, 0, 1087, 211, 1, 0, 0, 0, 1088, 1089, 7, 12, 0, 0, 1089, 213, 1, 0, 0, 0, 1090, 1091, 7, 12, 0, 0, 1091, 215, 1, 0, 0, 0, 1092, 1093, 7, 13, 0, 0, 1093, 217, 1, 0, 0, 0, 108, 221, 238, 250, 279, 294, 300, 319, 323, 328, 336, 344, 349, 352, 368, 376, 380, 387, 393, 398, 407, 414, 420, 429, 436, 444, 452, 456, 460, 465, 469, 480, 485, 489, 503, 514, 520, 527, 536, 545, 565, 573, 576, 583, 594, 601, 609, 623, 632, 643, 653, 659, 661, 665, 670, 684, 691, 715, 719, 729, 738, 747, 755, 760, 768, 770, 775, 782, 789, 798, 805, 814, 819, 824, 834, 840, 848, 850, 861, 868, 879, 884, 886, 893, 901, 904, 914, 931, 942, 953, 958, 964, 967, 972, 988, 993, 1001, 1008, 1014, 1020, 1028, 1034, 1036, 1051, 1056, 1063, 1069, 1073, 1084] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index f6d3b3fff04da..b9a19cb057d2d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -27,38 +27,39 @@ public class EsqlBaseParser extends ParserConfig { public static final int LINE_COMMENT=1, MULTILINE_COMMENT=2, WS=3, CHANGE_POINT=4, ENRICH=5, DEV_EXPLAIN=6, COMPLETION=7, DISSECT=8, EVAL=9, GROK=10, LIMIT=11, RERANK=12, ROW=13, - SAMPLE=14, SORT=15, STATS=16, WHERE=17, FROM=18, TS=19, EXTERNAL=20, FORK=21, - FUSE=22, INLINE=23, INLINESTATS=24, JOIN_LOOKUP=25, DEV_JOIN_FULL=26, - DEV_JOIN_LEFT=27, DEV_JOIN_RIGHT=28, DEV_LOOKUP=29, DEV_MMR=30, MV_EXPAND=31, - DROP=32, KEEP=33, DEV_INSIST=34, PROMQL=35, RENAME=36, SET=37, SHOW=38, - UNKNOWN_CMD=39, CHANGE_POINT_LINE_COMMENT=40, CHANGE_POINT_MULTILINE_COMMENT=41, - CHANGE_POINT_WS=42, ENRICH_POLICY_NAME=43, ENRICH_LINE_COMMENT=44, ENRICH_MULTILINE_COMMENT=45, - ENRICH_WS=46, ENRICH_FIELD_LINE_COMMENT=47, ENRICH_FIELD_MULTILINE_COMMENT=48, - ENRICH_FIELD_WS=49, EXPLAIN_WS=50, EXPLAIN_LINE_COMMENT=51, EXPLAIN_MULTILINE_COMMENT=52, - PIPE=53, QUOTED_STRING=54, INTEGER_LITERAL=55, DECIMAL_LITERAL=56, AND=57, - ASC=58, ASSIGN=59, BY=60, CAST_OP=61, COLON=62, SEMICOLON=63, COMMA=64, - DESC=65, DOT=66, FALSE=67, FIRST=68, IN=69, IS=70, LAST=71, LIKE=72, NOT=73, - NULL=74, NULLS=75, ON=76, OR=77, PARAM=78, RLIKE=79, TRUE=80, WITH=81, - EQ=82, CIEQ=83, NEQ=84, LT=85, LTE=86, GT=87, GTE=88, PLUS=89, MINUS=90, - ASTERISK=91, SLASH=92, PERCENT=93, LEFT_BRACES=94, RIGHT_BRACES=95, DOUBLE_PARAMS=96, - NAMED_OR_POSITIONAL_PARAM=97, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=98, OPENING_BRACKET=99, - CLOSING_BRACKET=100, LP=101, RP=102, UNQUOTED_IDENTIFIER=103, QUOTED_IDENTIFIER=104, - EXPR_LINE_COMMENT=105, EXPR_MULTILINE_COMMENT=106, EXPR_WS=107, METADATA=108, - UNQUOTED_SOURCE=109, FROM_LINE_COMMENT=110, FROM_MULTILINE_COMMENT=111, - FROM_WS=112, FORK_WS=113, FORK_LINE_COMMENT=114, FORK_MULTILINE_COMMENT=115, - GROUP=116, SCORE=117, KEY=118, FUSE_LINE_COMMENT=119, FUSE_MULTILINE_COMMENT=120, - FUSE_WS=121, INLINE_STATS=122, INLINE_LINE_COMMENT=123, INLINE_MULTILINE_COMMENT=124, - INLINE_WS=125, JOIN=126, USING=127, JOIN_LINE_COMMENT=128, JOIN_MULTILINE_COMMENT=129, - JOIN_WS=130, LOOKUP_LINE_COMMENT=131, LOOKUP_MULTILINE_COMMENT=132, LOOKUP_WS=133, - LOOKUP_FIELD_LINE_COMMENT=134, LOOKUP_FIELD_MULTILINE_COMMENT=135, LOOKUP_FIELD_WS=136, - MMR_LIMIT=137, MMR_LINE_COMMENT=138, MMR_MULTILINE_COMMENT=139, MMR_WS=140, - MVEXPAND_LINE_COMMENT=141, MVEXPAND_MULTILINE_COMMENT=142, MVEXPAND_WS=143, - ID_PATTERN=144, PROJECT_LINE_COMMENT=145, PROJECT_MULTILINE_COMMENT=146, - PROJECT_WS=147, PROMQL_PARAMS_LINE_COMMENT=148, PROMQL_PARAMS_MULTILINE_COMMENT=149, - PROMQL_PARAMS_WS=150, PROMQL_QUERY_COMMENT=151, PROMQL_SINGLE_QUOTED_STRING=152, - PROMQL_OTHER_QUERY_CONTENT=153, AS=154, RENAME_LINE_COMMENT=155, RENAME_MULTILINE_COMMENT=156, - RENAME_WS=157, SET_LINE_COMMENT=158, SET_MULTILINE_COMMENT=159, SET_WS=160, - INFO=161, SHOW_LINE_COMMENT=162, SHOW_MULTILINE_COMMENT=163, SHOW_WS=164; + SAMPLE=14, SORT=15, STATS=16, WHERE=17, URI_PARTS=18, FROM=19, TS=20, + EXTERNAL=21, FORK=22, FUSE=23, INLINE=24, INLINESTATS=25, JOIN_LOOKUP=26, + DEV_JOIN_FULL=27, DEV_JOIN_LEFT=28, DEV_JOIN_RIGHT=29, DEV_LOOKUP=30, + DEV_MMR=31, MV_EXPAND=32, DROP=33, KEEP=34, DEV_INSIST=35, PROMQL=36, + RENAME=37, SET=38, SHOW=39, UNKNOWN_CMD=40, CHANGE_POINT_LINE_COMMENT=41, + CHANGE_POINT_MULTILINE_COMMENT=42, CHANGE_POINT_WS=43, ENRICH_POLICY_NAME=44, + ENRICH_LINE_COMMENT=45, ENRICH_MULTILINE_COMMENT=46, ENRICH_WS=47, ENRICH_FIELD_LINE_COMMENT=48, + ENRICH_FIELD_MULTILINE_COMMENT=49, ENRICH_FIELD_WS=50, EXPLAIN_WS=51, + EXPLAIN_LINE_COMMENT=52, EXPLAIN_MULTILINE_COMMENT=53, PIPE=54, QUOTED_STRING=55, + INTEGER_LITERAL=56, DECIMAL_LITERAL=57, AND=58, ASC=59, ASSIGN=60, BY=61, + CAST_OP=62, COLON=63, SEMICOLON=64, COMMA=65, DESC=66, DOT=67, FALSE=68, + FIRST=69, IN=70, IS=71, LAST=72, LIKE=73, NOT=74, NULL=75, NULLS=76, ON=77, + OR=78, PARAM=79, RLIKE=80, TRUE=81, WITH=82, EQ=83, CIEQ=84, NEQ=85, LT=86, + LTE=87, GT=88, GTE=89, PLUS=90, MINUS=91, ASTERISK=92, SLASH=93, PERCENT=94, + LEFT_BRACES=95, RIGHT_BRACES=96, DOUBLE_PARAMS=97, NAMED_OR_POSITIONAL_PARAM=98, + NAMED_OR_POSITIONAL_DOUBLE_PARAMS=99, OPENING_BRACKET=100, CLOSING_BRACKET=101, + LP=102, RP=103, UNQUOTED_IDENTIFIER=104, QUOTED_IDENTIFIER=105, EXPR_LINE_COMMENT=106, + EXPR_MULTILINE_COMMENT=107, EXPR_WS=108, METADATA=109, UNQUOTED_SOURCE=110, + FROM_LINE_COMMENT=111, FROM_MULTILINE_COMMENT=112, FROM_WS=113, FORK_WS=114, + FORK_LINE_COMMENT=115, FORK_MULTILINE_COMMENT=116, GROUP=117, SCORE=118, + KEY=119, FUSE_LINE_COMMENT=120, FUSE_MULTILINE_COMMENT=121, FUSE_WS=122, + INLINE_STATS=123, INLINE_LINE_COMMENT=124, INLINE_MULTILINE_COMMENT=125, + INLINE_WS=126, JOIN=127, USING=128, JOIN_LINE_COMMENT=129, JOIN_MULTILINE_COMMENT=130, + JOIN_WS=131, LOOKUP_LINE_COMMENT=132, LOOKUP_MULTILINE_COMMENT=133, LOOKUP_WS=134, + LOOKUP_FIELD_LINE_COMMENT=135, LOOKUP_FIELD_MULTILINE_COMMENT=136, LOOKUP_FIELD_WS=137, + MMR_LIMIT=138, MMR_LINE_COMMENT=139, MMR_MULTILINE_COMMENT=140, MMR_WS=141, + MVEXPAND_LINE_COMMENT=142, MVEXPAND_MULTILINE_COMMENT=143, MVEXPAND_WS=144, + ID_PATTERN=145, PROJECT_LINE_COMMENT=146, PROJECT_MULTILINE_COMMENT=147, + PROJECT_WS=148, PROMQL_PARAMS_LINE_COMMENT=149, PROMQL_PARAMS_MULTILINE_COMMENT=150, + PROMQL_PARAMS_WS=151, PROMQL_QUERY_COMMENT=152, PROMQL_SINGLE_QUOTED_STRING=153, + PROMQL_OTHER_QUERY_CONTENT=154, AS=155, RENAME_LINE_COMMENT=156, RENAME_MULTILINE_COMMENT=157, + RENAME_WS=158, SET_LINE_COMMENT=159, SET_MULTILINE_COMMENT=160, SET_WS=161, + INFO=162, SHOW_LINE_COMMENT=163, SHOW_MULTILINE_COMMENT=164, SHOW_WS=165; public static final int RULE_statements = 0, RULE_singleStatement = 1, RULE_query = 2, RULE_sourceCommand = 3, RULE_processingCommand = 4, RULE_whereCommand = 5, RULE_dataType = 6, @@ -82,19 +83,19 @@ public class EsqlBaseParser extends ParserConfig { RULE_forkSubQueryCommand = 61, RULE_forkSubQueryProcessingCommand = 62, RULE_rerankCommand = 63, RULE_completionCommand = 64, RULE_inlineStatsCommand = 65, RULE_fuseCommand = 66, RULE_fuseConfiguration = 67, RULE_fuseKeyByFields = 68, - RULE_lookupCommand = 69, RULE_insistCommand = 70, RULE_setCommand = 71, - RULE_setField = 72, RULE_mmrCommand = 73, RULE_mmrQueryVectorParams = 74, - RULE_booleanExpression = 75, RULE_regexBooleanExpression = 76, RULE_matchBooleanExpression = 77, - RULE_valueExpression = 78, RULE_operatorExpression = 79, RULE_primaryExpression = 80, - RULE_functionExpression = 81, RULE_functionName = 82, RULE_mapExpression = 83, - RULE_entryExpression = 84, RULE_mapValue = 85, RULE_constant = 86, RULE_booleanValue = 87, - RULE_numericValue = 88, RULE_decimalValue = 89, RULE_integerValue = 90, - RULE_string = 91, RULE_comparisonOperator = 92, RULE_joinCommand = 93, - RULE_joinTarget = 94, RULE_joinCondition = 95, RULE_promqlCommand = 96, - RULE_valueName = 97, RULE_promqlParam = 98, RULE_promqlParamName = 99, - RULE_promqlParamValue = 100, RULE_promqlQueryContent = 101, RULE_promqlQueryPart = 102, - RULE_promqlIndexPattern = 103, RULE_promqlClusterString = 104, RULE_promqlSelectorString = 105, - RULE_promqlUnquotedIndexString = 106, RULE_promqlIndexString = 107; + RULE_lookupCommand = 69, RULE_insistCommand = 70, RULE_uriPartsCommand = 71, + RULE_setCommand = 72, RULE_setField = 73, RULE_mmrCommand = 74, RULE_mmrQueryVectorParams = 75, + RULE_booleanExpression = 76, RULE_regexBooleanExpression = 77, RULE_matchBooleanExpression = 78, + RULE_valueExpression = 79, RULE_operatorExpression = 80, RULE_primaryExpression = 81, + RULE_functionExpression = 82, RULE_functionName = 83, RULE_mapExpression = 84, + RULE_entryExpression = 85, RULE_mapValue = 86, RULE_constant = 87, RULE_booleanValue = 88, + RULE_numericValue = 89, RULE_decimalValue = 90, RULE_integerValue = 91, + RULE_string = 92, RULE_comparisonOperator = 93, RULE_joinCommand = 94, + RULE_joinTarget = 95, RULE_joinCondition = 96, RULE_promqlCommand = 97, + RULE_valueName = 98, RULE_promqlParam = 99, RULE_promqlParamName = 100, + RULE_promqlParamValue = 101, RULE_promqlQueryContent = 102, RULE_promqlQueryPart = 103, + RULE_promqlIndexPattern = 104, RULE_promqlClusterString = 105, RULE_promqlSelectorString = 106, + RULE_promqlUnquotedIndexString = 107, RULE_promqlIndexString = 108; private static String[] makeRuleNames() { return new String[] { "statements", "singleStatement", "query", "sourceCommand", "processingCommand", @@ -114,13 +115,13 @@ private static String[] makeRuleNames() { "forkSubQuery", "forkSubQueryCommand", "forkSubQueryProcessingCommand", "rerankCommand", "completionCommand", "inlineStatsCommand", "fuseCommand", "fuseConfiguration", "fuseKeyByFields", "lookupCommand", "insistCommand", - "setCommand", "setField", "mmrCommand", "mmrQueryVectorParams", "booleanExpression", - "regexBooleanExpression", "matchBooleanExpression", "valueExpression", - "operatorExpression", "primaryExpression", "functionExpression", "functionName", - "mapExpression", "entryExpression", "mapValue", "constant", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "joinCommand", "joinTarget", "joinCondition", "promqlCommand", "valueName", - "promqlParam", "promqlParamName", "promqlParamValue", "promqlQueryContent", + "uriPartsCommand", "setCommand", "setField", "mmrCommand", "mmrQueryVectorParams", + "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", + "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", + "functionName", "mapExpression", "entryExpression", "mapValue", "constant", + "booleanValue", "numericValue", "decimalValue", "integerValue", "string", + "comparisonOperator", "joinCommand", "joinTarget", "joinCondition", "promqlCommand", + "valueName", "promqlParam", "promqlParamName", "promqlParamValue", "promqlQueryContent", "promqlQueryPart", "promqlIndexPattern", "promqlClusterString", "promqlSelectorString", "promqlUnquotedIndexString", "promqlIndexString" }; @@ -131,21 +132,22 @@ private static String[] makeLiteralNames() { return new String[] { null, null, null, null, "'change_point'", "'enrich'", null, "'completion'", "'dissect'", "'eval'", "'grok'", "'limit'", "'rerank'", "'row'", "'sample'", - "'sort'", null, "'where'", "'from'", "'ts'", null, "'fork'", "'fuse'", - "'inline'", "'inlinestats'", "'lookup'", null, null, null, null, null, - "'mv_expand'", "'drop'", "'keep'", null, "'promql'", "'rename'", "'set'", - "'show'", null, null, null, null, null, null, null, null, null, null, - null, null, null, null, "'|'", null, null, null, "'and'", "'asc'", "'='", - "'by'", "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", "'first'", - "'in'", "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", "'on'", - "'or'", "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", "'!='", - "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", - "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, null, - null, null, "'metadata'", null, null, null, null, null, null, null, "'group'", - "'score'", "'key'", null, null, null, null, null, null, null, "'join'", - "'USING'", null, null, null, null, null, null, null, null, null, null, + "'sort'", null, "'where'", "'uri_parts'", "'from'", "'ts'", null, "'fork'", + "'fuse'", "'inline'", "'inlinestats'", "'lookup'", null, null, null, + null, null, "'mv_expand'", "'drop'", "'keep'", null, "'promql'", "'rename'", + "'set'", "'show'", null, null, null, null, null, null, null, null, null, + null, null, null, null, null, "'|'", null, null, null, "'and'", "'asc'", + "'='", "'by'", "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", + "'first'", "'in'", "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", + "'on'", "'or'", "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", + "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", + "'{'", "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, + null, null, null, "'metadata'", null, null, null, null, null, null, null, + "'group'", "'score'", "'key'", null, null, null, null, null, null, null, + "'join'", "'USING'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, "'as'", null, null, null, null, null, null, "'info'" + null, null, null, null, null, null, "'as'", null, null, null, null, null, + null, "'info'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -153,8 +155,8 @@ private static String[] makeSymbolicNames() { return new String[] { null, "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", - "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "FROM", "TS", "EXTERNAL", - "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", + "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "URI_PARTS", "FROM", "TS", + "EXTERNAL", "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "DEV_MMR", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", @@ -277,25 +279,25 @@ public final StatementsContext statements() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(219); + setState(221); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(216); + setState(218); setCommand(); } } } - setState(221); + setState(223); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); } - setState(222); + setState(224); singleStatement(); - setState(223); + setState(225); match(EOF); } } @@ -342,9 +344,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(225); + setState(227); query(0); - setState(226); + setState(228); match(EOF); } } @@ -440,11 +442,11 @@ private QueryContext query(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(229); + setState(231); sourceCommand(); } _ctx.stop = _input.LT(-1); - setState(236); + setState(238); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,1,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -455,16 +457,16 @@ private QueryContext query(int _p) throws RecognitionException { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_query); - setState(231); + setState(233); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(232); + setState(234); match(PIPE); - setState(233); + setState(235); processingCommand(); } } } - setState(238); + setState(240); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,1,_ctx); } @@ -528,59 +530,59 @@ public final SourceCommandContext sourceCommand() throws RecognitionException { SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); enterRule(_localctx, 6, RULE_sourceCommand); try { - setState(248); + setState(250); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(239); + setState(241); fromCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(240); + setState(242); rowCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(241); + setState(243); showCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(242); + setState(244); timeSeriesCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(243); + setState(245); promqlCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(244); + setState(246); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(245); + setState(247); explainCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(246); + setState(248); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(247); + setState(249); externalCommand(); } break; @@ -659,6 +661,9 @@ public InlineStatsCommandContext inlineStatsCommand() { public FuseCommandContext fuseCommand() { return getRuleContext(FuseCommandContext.class,0); } + public UriPartsCommandContext uriPartsCommand() { + return getRuleContext(UriPartsCommandContext.class,0); + } public LookupCommandContext lookupCommand() { return getRuleContext(LookupCommandContext.class,0); } @@ -692,173 +697,180 @@ public final ProcessingCommandContext processingCommand() throws RecognitionExce ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); enterRule(_localctx, 8, RULE_processingCommand); try { - setState(276); + setState(279); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(250); + setState(252); evalCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(251); + setState(253); whereCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(252); + setState(254); keepCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(253); + setState(255); limitCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(254); + setState(256); statsCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(255); + setState(257); sortCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(256); + setState(258); dropCommand(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(257); + setState(259); renameCommand(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(258); + setState(260); dissectCommand(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(259); + setState(261); grokCommand(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(260); + setState(262); enrichCommand(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(261); + setState(263); mvExpandCommand(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(262); + setState(264); joinCommand(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(263); + setState(265); changePointCommand(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(264); + setState(266); completionCommand(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(265); + setState(267); sampleCommand(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(266); + setState(268); forkCommand(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(267); + setState(269); rerankCommand(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(268); + setState(270); inlineStatsCommand(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(269); + setState(271); fuseCommand(); } break; case 21: enterOuterAlt(_localctx, 21); { - setState(270); - if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(271); - lookupCommand(); + setState(272); + uriPartsCommand(); } break; case 22: enterOuterAlt(_localctx, 22); { - setState(272); - if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); setState(273); - insistCommand(); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(274); + lookupCommand(); } break; case 23: enterOuterAlt(_localctx, 23); { - setState(274); - if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); setState(275); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(276); + insistCommand(); + } + break; + case 24: + enterOuterAlt(_localctx, 24); + { + setState(277); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(278); mmrCommand(); } break; @@ -907,9 +919,9 @@ public final WhereCommandContext whereCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(278); + setState(281); match(WHERE); - setState(279); + setState(282); booleanExpression(0); } } @@ -967,7 +979,7 @@ public final DataTypeContext dataType() throws RecognitionException { _localctx = new ToDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(281); + setState(284); identifier(); } } @@ -1014,9 +1026,9 @@ public final RowCommandContext rowCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(283); + setState(286); match(ROW); - setState(284); + setState(287); fields(); } } @@ -1070,23 +1082,23 @@ public final FieldsContext fields() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(286); + setState(289); field(); - setState(291); + setState(294); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(287); + setState(290); match(COMMA); - setState(288); + setState(291); field(); } } } - setState(293); + setState(296); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); } @@ -1138,19 +1150,19 @@ public final FieldContext field() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(297); + setState(300); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { case 1: { - setState(294); + setState(297); qualifiedName(); - setState(295); + setState(298); match(ASSIGN); } break; } - setState(299); + setState(302); booleanExpression(0); } } @@ -1197,9 +1209,9 @@ public final FromCommandContext fromCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(301); + setState(304); match(FROM); - setState(302); + setState(305); indexPatternAndMetadataFields(); } } @@ -1246,9 +1258,9 @@ public final TimeSeriesCommandContext timeSeriesCommand() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(304); + setState(307); match(TS); - setState(305); + setState(308); indexPatternAndMetadataFields(); } } @@ -1298,11 +1310,11 @@ public final ExternalCommandContext externalCommand() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(307); + setState(310); match(EXTERNAL); - setState(308); + setState(311); stringOrParameter(); - setState(309); + setState(312); commandNamedParameters(); } } @@ -1359,32 +1371,32 @@ public final IndexPatternAndMetadataFieldsContext indexPatternAndMetadataFields( int _alt; enterOuterAlt(_localctx, 1); { - setState(311); + setState(314); indexPatternOrSubquery(); - setState(316); + setState(319); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,6,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(312); + setState(315); match(COMMA); - setState(313); + setState(316); indexPatternOrSubquery(); } } } - setState(318); + setState(321); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,6,_ctx); } - setState(320); + setState(323); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: { - setState(319); + setState(322); metadata(); } break; @@ -1434,22 +1446,22 @@ public final IndexPatternOrSubqueryContext indexPatternOrSubquery() throws Recog IndexPatternOrSubqueryContext _localctx = new IndexPatternOrSubqueryContext(_ctx, getState()); enterRule(_localctx, 28, RULE_indexPatternOrSubquery); try { - setState(325); + setState(328); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(322); + setState(325); indexPattern(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(323); + setState(326); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(324); + setState(327); subquery(); } break; @@ -1510,27 +1522,27 @@ public final SubqueryContext subquery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(327); + setState(330); match(LP); - setState(328); + setState(331); fromCommand(); - setState(333); + setState(336); _errHandler.sync(this); _la = _input.LA(1); while (_la==PIPE) { { { - setState(329); + setState(332); match(PIPE); - setState(330); + setState(333); processingCommand(); } } - setState(335); + setState(338); _errHandler.sync(this); _la = _input.LA(1); } - setState(336); + setState(339); match(RP); } } @@ -1585,34 +1597,34 @@ public final IndexPatternContext indexPattern() throws RecognitionException { IndexPatternContext _localctx = new IndexPatternContext(_ctx, getState()); enterRule(_localctx, 32, RULE_indexPattern); try { - setState(349); + setState(352); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(341); + setState(344); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(338); + setState(341); clusterString(); - setState(339); + setState(342); match(COLON); } break; } - setState(343); - unquotedIndexString(); setState(346); + unquotedIndexString(); + setState(349); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: { - setState(344); + setState(347); match(CAST_OP); - setState(345); + setState(348); selectorString(); } break; @@ -1622,7 +1634,7 @@ public final IndexPatternContext indexPattern() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(348); + setState(351); indexString(); } break; @@ -1668,7 +1680,7 @@ public final ClusterStringContext clusterString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(351); + setState(354); match(UNQUOTED_SOURCE); } } @@ -1712,7 +1724,7 @@ public final SelectorStringContext selectorString() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(353); + setState(356); match(UNQUOTED_SOURCE); } } @@ -1756,7 +1768,7 @@ public final UnquotedIndexStringContext unquotedIndexString() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(355); + setState(358); match(UNQUOTED_SOURCE); } } @@ -1802,7 +1814,7 @@ public final IndexStringContext indexString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(357); + setState(360); _la = _input.LA(1); if ( !(_la==QUOTED_STRING || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -1863,25 +1875,25 @@ public final MetadataContext metadata() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(359); + setState(362); match(METADATA); - setState(360); + setState(363); match(UNQUOTED_SOURCE); - setState(365); + setState(368); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,13,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(361); + setState(364); match(COMMA); - setState(362); + setState(365); match(UNQUOTED_SOURCE); } } } - setState(367); + setState(370); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,13,_ctx); } @@ -1930,9 +1942,9 @@ public final EvalCommandContext evalCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(368); + setState(371); match(EVAL); - setState(369); + setState(372); fields(); } } @@ -1985,26 +1997,26 @@ public final StatsCommandContext statsCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(374); match(STATS); - setState(373); + setState(376); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(372); + setState(375); ((StatsCommandContext)_localctx).stats = aggFields(); } break; } - setState(377); + setState(380); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(375); + setState(378); match(BY); - setState(376); + setState(379); ((StatsCommandContext)_localctx).grouping = fields(); } break; @@ -2061,23 +2073,23 @@ public final AggFieldsContext aggFields() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(379); + setState(382); aggField(); - setState(384); + setState(387); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,16,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(380); + setState(383); match(COMMA); - setState(381); + setState(384); aggField(); } } } - setState(386); + setState(389); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,16,_ctx); } @@ -2129,16 +2141,16 @@ public final AggFieldContext aggField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(387); - field(); setState(390); + field(); + setState(393); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: { - setState(388); + setState(391); match(WHERE); - setState(389); + setState(392); booleanExpression(0); } break; @@ -2198,42 +2210,42 @@ public final QualifiedNameContext qualifiedName() throws RecognitionException { enterRule(_localctx, 52, RULE_qualifiedName); int _la; try { - setState(404); + setState(407); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(392); + setState(395); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(393); + setState(396); match(OPENING_BRACKET); - setState(395); + setState(398); _errHandler.sync(this); _la = _input.LA(1); if (_la==UNQUOTED_IDENTIFIER) { { - setState(394); + setState(397); ((QualifiedNameContext)_localctx).qualifier = match(UNQUOTED_IDENTIFIER); } } - setState(397); + setState(400); match(CLOSING_BRACKET); - setState(398); + setState(401); match(DOT); - setState(399); + setState(402); match(OPENING_BRACKET); - setState(400); + setState(403); ((QualifiedNameContext)_localctx).name = fieldName(); - setState(401); + setState(404); match(CLOSING_BRACKET); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(403); + setState(406); ((QualifiedNameContext)_localctx).name = fieldName(); } break; @@ -2289,23 +2301,23 @@ public final FieldNameContext fieldName() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(406); + setState(409); identifierOrParameter(); - setState(411); + setState(414); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,20,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(407); + setState(410); match(DOT); - setState(408); + setState(411); identifierOrParameter(); } } } - setState(413); + setState(416); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,20,_ctx); } @@ -2364,42 +2376,42 @@ public final QualifiedNamePatternContext qualifiedNamePattern() throws Recogniti enterRule(_localctx, 56, RULE_qualifiedNamePattern); int _la; try { - setState(426); + setState(429); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(414); + setState(417); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(415); + setState(418); match(OPENING_BRACKET); - setState(417); + setState(420); _errHandler.sync(this); _la = _input.LA(1); if (_la==ID_PATTERN) { { - setState(416); + setState(419); ((QualifiedNamePatternContext)_localctx).qualifier = match(ID_PATTERN); } } - setState(419); + setState(422); match(CLOSING_BRACKET); - setState(420); + setState(423); match(DOT); - setState(421); + setState(424); match(OPENING_BRACKET); - setState(422); + setState(425); ((QualifiedNamePatternContext)_localctx).name = fieldNamePattern(); - setState(423); + setState(426); match(CLOSING_BRACKET); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(425); + setState(428); ((QualifiedNamePatternContext)_localctx).name = fieldNamePattern(); } break; @@ -2456,23 +2468,23 @@ public final FieldNamePatternContext fieldNamePattern() throws RecognitionExcept enterOuterAlt(_localctx, 1); { { - setState(428); + setState(431); identifierPattern(); - setState(433); + setState(436); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(429); + setState(432); match(DOT); - setState(430); + setState(433); identifierPattern(); } } } - setState(435); + setState(438); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } @@ -2529,23 +2541,23 @@ public final QualifiedNamePatternsContext qualifiedNamePatterns() throws Recogni int _alt; enterOuterAlt(_localctx, 1); { - setState(436); + setState(439); qualifiedNamePattern(); - setState(441); + setState(444); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,24,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(437); + setState(440); match(COMMA); - setState(438); + setState(441); qualifiedNamePattern(); } } } - setState(443); + setState(446); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,24,_ctx); } @@ -2593,7 +2605,7 @@ public final IdentifierContext identifier() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(444); + setState(447); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -2649,13 +2661,13 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); enterRule(_localctx, 64, RULE_identifierPattern); try { - setState(449); + setState(452); _errHandler.sync(this); switch (_input.LA(1)) { case ID_PATTERN: enterOuterAlt(_localctx, 1); { - setState(446); + setState(449); match(ID_PATTERN); } break; @@ -2663,7 +2675,7 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 2); { - setState(447); + setState(450); parameter(); } break; @@ -2671,7 +2683,7 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce case NAMED_OR_POSITIONAL_DOUBLE_PARAMS: enterOuterAlt(_localctx, 3); { - setState(448); + setState(451); doubleParameter(); } break; @@ -2747,14 +2759,14 @@ public final ParameterContext parameter() throws RecognitionException { ParameterContext _localctx = new ParameterContext(_ctx, getState()); enterRule(_localctx, 66, RULE_parameter); try { - setState(453); + setState(456); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: _localctx = new InputParamContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(451); + setState(454); match(PARAM); } break; @@ -2762,7 +2774,7 @@ public final ParameterContext parameter() throws RecognitionException { _localctx = new InputNamedOrPositionalParamContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(452); + setState(455); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -2838,14 +2850,14 @@ public final DoubleParameterContext doubleParameter() throws RecognitionExceptio DoubleParameterContext _localctx = new DoubleParameterContext(_ctx, getState()); enterRule(_localctx, 68, RULE_doubleParameter); try { - setState(457); + setState(460); _errHandler.sync(this); switch (_input.LA(1)) { case DOUBLE_PARAMS: _localctx = new InputDoubleParamsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(455); + setState(458); match(DOUBLE_PARAMS); } break; @@ -2853,7 +2865,7 @@ public final DoubleParameterContext doubleParameter() throws RecognitionExceptio _localctx = new InputNamedOrPositionalDoubleParamsContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(456); + setState(459); match(NAMED_OR_POSITIONAL_DOUBLE_PARAMS); } break; @@ -2907,14 +2919,14 @@ public final IdentifierOrParameterContext identifierOrParameter() throws Recogni IdentifierOrParameterContext _localctx = new IdentifierOrParameterContext(_ctx, getState()); enterRule(_localctx, 70, RULE_identifierOrParameter); try { - setState(462); + setState(465); _errHandler.sync(this); switch (_input.LA(1)) { case UNQUOTED_IDENTIFIER: case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(459); + setState(462); identifier(); } break; @@ -2922,7 +2934,7 @@ public final IdentifierOrParameterContext identifierOrParameter() throws Recogni case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 2); { - setState(460); + setState(463); parameter(); } break; @@ -2930,7 +2942,7 @@ public final IdentifierOrParameterContext identifierOrParameter() throws Recogni case NAMED_OR_POSITIONAL_DOUBLE_PARAMS: enterOuterAlt(_localctx, 3); { - setState(461); + setState(464); doubleParameter(); } break; @@ -2981,13 +2993,13 @@ public final StringOrParameterContext stringOrParameter() throws RecognitionExce StringOrParameterContext _localctx = new StringOrParameterContext(_ctx, getState()); enterRule(_localctx, 72, RULE_stringOrParameter); try { - setState(466); + setState(469); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: enterOuterAlt(_localctx, 1); { - setState(464); + setState(467); string(); } break; @@ -2995,7 +3007,7 @@ public final StringOrParameterContext stringOrParameter() throws RecognitionExce case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 2); { - setState(465); + setState(468); parameter(); } break; @@ -3046,9 +3058,9 @@ public final LimitCommandContext limitCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(468); + setState(471); match(LIMIT); - setState(469); + setState(472); constant(); } } @@ -3103,25 +3115,25 @@ public final SortCommandContext sortCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(471); + setState(474); match(SORT); - setState(472); + setState(475); orderExpression(); - setState(477); + setState(480); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,30,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(473); + setState(476); match(COMMA); - setState(474); + setState(477); orderExpression(); } } } - setState(479); + setState(482); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,30,_ctx); } @@ -3177,14 +3189,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(480); + setState(483); booleanExpression(0); - setState(482); + setState(485); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(481); + setState(484); ((OrderExpressionContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -3198,14 +3210,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio } break; } - setState(486); + setState(489); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(484); + setState(487); match(NULLS); - setState(485); + setState(488); ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); _la = _input.LA(1); if ( !(_la==FIRST || _la==LAST) ) { @@ -3264,9 +3276,9 @@ public final KeepCommandContext keepCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(488); + setState(491); match(KEEP); - setState(489); + setState(492); qualifiedNamePatterns(); } } @@ -3313,9 +3325,9 @@ public final DropCommandContext dropCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(491); + setState(494); match(DROP); - setState(492); + setState(495); qualifiedNamePatterns(); } } @@ -3370,25 +3382,25 @@ public final RenameCommandContext renameCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(494); + setState(497); match(RENAME); - setState(495); + setState(498); renameClause(); - setState(500); + setState(503); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(496); + setState(499); match(COMMA); - setState(497); + setState(500); renameClause(); } } } - setState(502); + setState(505); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } @@ -3441,28 +3453,28 @@ public final RenameClauseContext renameClause() throws RecognitionException { RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); enterRule(_localctx, 86, RULE_renameClause); try { - setState(511); + setState(514); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(503); + setState(506); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); - setState(504); + setState(507); match(AS); - setState(505); + setState(508); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(507); + setState(510); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(508); + setState(511); match(ASSIGN); - setState(509); + setState(512); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); } break; @@ -3517,18 +3529,18 @@ public final DissectCommandContext dissectCommand() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(513); + setState(516); match(DISSECT); - setState(514); + setState(517); primaryExpression(0); - setState(515); + setState(518); string(); - setState(517); + setState(520); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(516); + setState(519); dissectCommandOptions(); } break; @@ -3585,23 +3597,23 @@ public final DissectCommandOptionsContext dissectCommandOptions() throws Recogni int _alt; enterOuterAlt(_localctx, 1); { - setState(519); + setState(522); dissectCommandOption(); - setState(524); + setState(527); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,36,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(520); + setState(523); match(COMMA); - setState(521); + setState(524); dissectCommandOption(); } } } - setState(526); + setState(529); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,36,_ctx); } @@ -3653,11 +3665,11 @@ public final DissectCommandOptionContext dissectCommandOption() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(530); identifier(); - setState(528); + setState(531); match(ASSIGN); - setState(529); + setState(532); constant(); } } @@ -3704,14 +3716,14 @@ public final CommandNamedParametersContext commandNamedParameters() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(533); + setState(536); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(531); + setState(534); match(WITH); - setState(532); + setState(535); mapExpression(); } break; @@ -3772,27 +3784,27 @@ public final GrokCommandContext grokCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(535); + setState(538); match(GROK); - setState(536); + setState(539); primaryExpression(0); - setState(537); + setState(540); string(); - setState(542); + setState(545); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(538); + setState(541); match(COMMA); - setState(539); + setState(542); string(); } } } - setState(544); + setState(547); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } @@ -3841,9 +3853,9 @@ public final MvExpandCommandContext mvExpandCommand() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(545); + setState(548); match(MV_EXPAND); - setState(546); + setState(549); qualifiedName(); } } @@ -3890,9 +3902,9 @@ public final ExplainCommandContext explainCommand() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(548); + setState(551); match(DEV_EXPLAIN); - setState(549); + setState(552); subqueryExpression(); } } @@ -3940,11 +3952,11 @@ public final SubqueryExpressionContext subqueryExpression() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(551); + setState(554); match(LP); - setState(552); + setState(555); query(0); - setState(553); + setState(556); match(RP); } } @@ -4001,9 +4013,9 @@ public final ShowCommandContext showCommand() throws RecognitionException { _localctx = new ShowInfoContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(555); + setState(558); match(SHOW); - setState(556); + setState(559); match(INFO); } } @@ -4068,46 +4080,46 @@ public final EnrichCommandContext enrichCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(558); + setState(561); match(ENRICH); - setState(559); - ((EnrichCommandContext)_localctx).policyName = enrichPolicyName(); setState(562); + ((EnrichCommandContext)_localctx).policyName = enrichPolicyName(); + setState(565); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(560); + setState(563); match(ON); - setState(561); + setState(564); ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); } break; } - setState(573); + setState(576); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { - setState(564); + setState(567); match(WITH); - setState(565); + setState(568); enrichWithClause(); - setState(570); + setState(573); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,40,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(566); + setState(569); match(COMMA); - setState(567); + setState(570); enrichWithClause(); } } } - setState(572); + setState(575); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,40,_ctx); } @@ -4158,7 +4170,7 @@ public final EnrichPolicyNameContext enrichPolicyName() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(575); + setState(578); _la = _input.LA(1); if ( !(_la==ENRICH_POLICY_NAME || _la==QUOTED_STRING) ) { _errHandler.recoverInline(this); @@ -4218,19 +4230,19 @@ public final EnrichWithClauseContext enrichWithClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(580); + setState(583); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(577); + setState(580); ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(578); + setState(581); match(ASSIGN); } break; } - setState(582); + setState(585); ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); } } @@ -4278,9 +4290,9 @@ public final SampleCommandContext sampleCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(584); + setState(587); match(SAMPLE); - setState(585); + setState(588); ((SampleCommandContext)_localctx).probability = constant(); } } @@ -4337,34 +4349,34 @@ public final ChangePointCommandContext changePointCommand() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(587); + setState(590); match(CHANGE_POINT); - setState(588); - ((ChangePointCommandContext)_localctx).value = qualifiedName(); setState(591); + ((ChangePointCommandContext)_localctx).value = qualifiedName(); + setState(594); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(589); + setState(592); match(ON); - setState(590); + setState(593); ((ChangePointCommandContext)_localctx).key = qualifiedName(); } break; } - setState(598); + setState(601); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { case 1: { - setState(593); + setState(596); match(AS); - setState(594); + setState(597); ((ChangePointCommandContext)_localctx).targetType = qualifiedName(); - setState(595); + setState(598); match(COMMA); - setState(596); + setState(599); ((ChangePointCommandContext)_localctx).targetPvalue = qualifiedName(); } break; @@ -4414,9 +4426,9 @@ public final ForkCommandContext forkCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(600); + setState(603); match(FORK); - setState(601); + setState(604); forkSubQueries(); } } @@ -4466,7 +4478,7 @@ public final ForkSubQueriesContext forkSubQueries() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(604); + setState(607); _errHandler.sync(this); _alt = 1; do { @@ -4474,7 +4486,7 @@ public final ForkSubQueriesContext forkSubQueries() throws RecognitionException case 1: { { - setState(603); + setState(606); forkSubQuery(); } } @@ -4482,7 +4494,7 @@ public final ForkSubQueriesContext forkSubQueries() throws RecognitionException default: throw new NoViableAltException(this); } - setState(606); + setState(609); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,45,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -4532,11 +4544,11 @@ public final ForkSubQueryContext forkSubQuery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(608); + setState(611); match(LP); - setState(609); + setState(612); forkSubQueryCommand(0); - setState(610); + setState(613); match(RP); } } @@ -4632,11 +4644,11 @@ private ForkSubQueryCommandContext forkSubQueryCommand(int _p) throws Recognitio _ctx = _localctx; _prevctx = _localctx; - setState(613); + setState(616); forkSubQueryProcessingCommand(); } _ctx.stop = _input.LT(-1); - setState(620); + setState(623); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -4647,16 +4659,16 @@ private ForkSubQueryCommandContext forkSubQueryCommand(int _p) throws Recognitio { _localctx = new CompositeForkSubQueryContext(new ForkSubQueryCommandContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_forkSubQueryCommand); - setState(615); + setState(618); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(616); + setState(619); match(PIPE); - setState(617); + setState(620); forkSubQueryProcessingCommand(); } } } - setState(622); + setState(625); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } @@ -4704,7 +4716,7 @@ public final ForkSubQueryProcessingCommandContext forkSubQueryProcessingCommand( try { enterOuterAlt(_localctx, 1); { - setState(623); + setState(626); processingCommand(); } } @@ -4765,27 +4777,27 @@ public final RerankCommandContext rerankCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(625); + setState(628); match(RERANK); - setState(629); + setState(632); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(626); + setState(629); ((RerankCommandContext)_localctx).targetField = qualifiedName(); - setState(627); + setState(630); match(ASSIGN); } break; } - setState(631); + setState(634); ((RerankCommandContext)_localctx).queryText = constant(); - setState(632); + setState(635); match(ON); - setState(633); + setState(636); ((RerankCommandContext)_localctx).rerankFields = fields(); - setState(634); + setState(637); commandNamedParameters(); } } @@ -4841,23 +4853,23 @@ public final CompletionCommandContext completionCommand() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(636); + setState(639); match(COMPLETION); - setState(640); + setState(643); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(637); + setState(640); ((CompletionCommandContext)_localctx).targetField = qualifiedName(); - setState(638); + setState(641); match(ASSIGN); } break; } - setState(642); + setState(645); ((CompletionCommandContext)_localctx).prompt = primaryExpression(0); - setState(643); + setState(646); commandNamedParameters(); } } @@ -4910,26 +4922,26 @@ public final InlineStatsCommandContext inlineStatsCommand() throws RecognitionEx InlineStatsCommandContext _localctx = new InlineStatsCommandContext(_ctx, getState()); enterRule(_localctx, 130, RULE_inlineStatsCommand); try { - setState(658); + setState(661); _errHandler.sync(this); switch (_input.LA(1)) { case INLINE: enterOuterAlt(_localctx, 1); { - setState(645); + setState(648); match(INLINE); - setState(646); + setState(649); match(INLINE_STATS); - setState(647); - ((InlineStatsCommandContext)_localctx).stats = aggFields(); setState(650); + ((InlineStatsCommandContext)_localctx).stats = aggFields(); + setState(653); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(648); + setState(651); match(BY); - setState(649); + setState(652); ((InlineStatsCommandContext)_localctx).grouping = fields(); } break; @@ -4939,18 +4951,18 @@ public final InlineStatsCommandContext inlineStatsCommand() throws RecognitionEx case INLINESTATS: enterOuterAlt(_localctx, 2); { - setState(652); + setState(655); match(INLINESTATS); - setState(653); - ((InlineStatsCommandContext)_localctx).stats = aggFields(); setState(656); + ((InlineStatsCommandContext)_localctx).stats = aggFields(); + setState(659); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(654); + setState(657); match(BY); - setState(655); + setState(658); ((InlineStatsCommandContext)_localctx).grouping = fields(); } break; @@ -5012,31 +5024,31 @@ public final FuseCommandContext fuseCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(660); + setState(663); match(FUSE); - setState(662); + setState(665); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(661); + setState(664); ((FuseCommandContext)_localctx).fuseType = identifier(); } break; } - setState(667); + setState(670); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,53,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(664); + setState(667); fuseConfiguration(); } } } - setState(669); + setState(672); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,53,_ctx); } @@ -5097,48 +5109,48 @@ public final FuseConfigurationContext fuseConfiguration() throws RecognitionExce FuseConfigurationContext _localctx = new FuseConfigurationContext(_ctx, getState()); enterRule(_localctx, 134, RULE_fuseConfiguration); try { - setState(681); + setState(684); _errHandler.sync(this); switch (_input.LA(1)) { case SCORE: enterOuterAlt(_localctx, 1); { - setState(670); + setState(673); match(SCORE); - setState(671); + setState(674); match(BY); - setState(672); + setState(675); ((FuseConfigurationContext)_localctx).score = qualifiedName(); } break; case KEY: enterOuterAlt(_localctx, 2); { - setState(673); + setState(676); match(KEY); - setState(674); + setState(677); match(BY); - setState(675); + setState(678); ((FuseConfigurationContext)_localctx).key = fuseKeyByFields(); } break; case GROUP: enterOuterAlt(_localctx, 3); { - setState(676); + setState(679); match(GROUP); - setState(677); + setState(680); match(BY); - setState(678); + setState(681); ((FuseConfigurationContext)_localctx).group = qualifiedName(); } break; case WITH: enterOuterAlt(_localctx, 4); { - setState(679); + setState(682); match(WITH); - setState(680); + setState(683); ((FuseConfigurationContext)_localctx).options = mapExpression(); } break; @@ -5196,23 +5208,23 @@ public final FuseKeyByFieldsContext fuseKeyByFields() throws RecognitionExceptio int _alt; enterOuterAlt(_localctx, 1); { - setState(683); + setState(686); qualifiedName(); - setState(688); + setState(691); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,55,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(684); + setState(687); match(COMMA); - setState(685); + setState(688); qualifiedName(); } } } - setState(690); + setState(693); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,55,_ctx); } @@ -5267,13 +5279,13 @@ public final LookupCommandContext lookupCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(691); + setState(694); match(DEV_LOOKUP); - setState(692); + setState(695); ((LookupCommandContext)_localctx).tableName = indexPattern(); - setState(693); + setState(696); match(ON); - setState(694); + setState(697); ((LookupCommandContext)_localctx).matchFields = qualifiedNamePatterns(); } } @@ -5320,9 +5332,9 @@ public final InsistCommandContext insistCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(696); + setState(699); match(DEV_INSIST); - setState(697); + setState(700); qualifiedNamePatterns(); } } @@ -5337,6 +5349,63 @@ public final InsistCommandContext insistCommand() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class UriPartsCommandContext extends ParserRuleContext { + public TerminalNode URI_PARTS() { return getToken(EsqlBaseParser.URI_PARTS, 0); } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TerminalNode ASSIGN() { return getToken(EsqlBaseParser.ASSIGN, 0); } + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + @SuppressWarnings("this-escape") + public UriPartsCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_uriPartsCommand; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterUriPartsCommand(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitUriPartsCommand(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitUriPartsCommand(this); + else return visitor.visitChildren(this); + } + } + + public final UriPartsCommandContext uriPartsCommand() throws RecognitionException { + UriPartsCommandContext _localctx = new UriPartsCommandContext(_ctx, getState()); + enterRule(_localctx, 142, RULE_uriPartsCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(702); + match(URI_PARTS); + setState(703); + qualifiedName(); + setState(704); + match(ASSIGN); + setState(705); + primaryExpression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class SetCommandContext extends ParserRuleContext { public TerminalNode SET() { return getToken(EsqlBaseParser.SET, 0); } @@ -5366,15 +5435,15 @@ public T accept(ParseTreeVisitor visitor) { public final SetCommandContext setCommand() throws RecognitionException { SetCommandContext _localctx = new SetCommandContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_setCommand); + enterRule(_localctx, 144, RULE_setCommand); try { enterOuterAlt(_localctx, 1); { - setState(699); + setState(707); match(SET); - setState(700); + setState(708); setField(); - setState(701); + setState(709); match(SEMICOLON); } } @@ -5423,15 +5492,15 @@ public T accept(ParseTreeVisitor visitor) { public final SetFieldContext setField() throws RecognitionException { SetFieldContext _localctx = new SetFieldContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_setField); + enterRule(_localctx, 146, RULE_setField); try { enterOuterAlt(_localctx, 1); { - setState(703); + setState(711); identifier(); - setState(704); + setState(712); match(ASSIGN); - setState(707); + setState(715); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -5446,13 +5515,13 @@ public final SetFieldContext setField() throws RecognitionException { case NAMED_OR_POSITIONAL_PARAM: case OPENING_BRACKET: { - setState(705); + setState(713); constant(); } break; case LEFT_BRACES: { - setState(706); + setState(714); mapExpression(); } break; @@ -5514,31 +5583,31 @@ public T accept(ParseTreeVisitor visitor) { public final MmrCommandContext mmrCommand() throws RecognitionException { MmrCommandContext _localctx = new MmrCommandContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_mmrCommand); + enterRule(_localctx, 148, RULE_mmrCommand); try { enterOuterAlt(_localctx, 1); { - setState(709); + setState(717); match(DEV_MMR); - setState(711); + setState(719); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(710); + setState(718); ((MmrCommandContext)_localctx).queryVector = mmrQueryVectorParams(); } break; } - setState(713); + setState(721); match(ON); - setState(714); + setState(722); ((MmrCommandContext)_localctx).diversifyField = qualifiedName(); - setState(715); + setState(723); match(MMR_LIMIT); - setState(716); + setState(724); ((MmrCommandContext)_localctx).limitValue = integerValue(); - setState(717); + setState(725); commandNamedParameters(); } } @@ -5612,16 +5681,16 @@ public T accept(ParseTreeVisitor visitor) { public final MmrQueryVectorParamsContext mmrQueryVectorParams() throws RecognitionException { MmrQueryVectorParamsContext _localctx = new MmrQueryVectorParamsContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_mmrQueryVectorParams); + enterRule(_localctx, 150, RULE_mmrQueryVectorParams); try { - setState(721); + setState(729); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: _localctx = new MmrQueryVectorParameterContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(719); + setState(727); parameter(); } break; @@ -5629,7 +5698,7 @@ public final MmrQueryVectorParamsContext mmrQueryVectorParams() throws Recogniti _localctx = new MmrQueryVectorExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(720); + setState(728); primaryExpression(0); } break; @@ -5840,14 +5909,14 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _parentState = getState(); BooleanExpressionContext _localctx = new BooleanExpressionContext(_ctx, _parentState); BooleanExpressionContext _prevctx = _localctx; - int _startState = 150; - enterRecursionRule(_localctx, 150, RULE_booleanExpression, _p); + int _startState = 152; + enterRecursionRule(_localctx, 152, RULE_booleanExpression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(752); + setState(760); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { case 1: @@ -5856,9 +5925,9 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(724); + setState(732); match(NOT); - setState(725); + setState(733); booleanExpression(8); } break; @@ -5867,7 +5936,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(726); + setState(734); valueExpression(); } break; @@ -5876,7 +5945,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new RegexExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(727); + setState(735); regexBooleanExpression(); } break; @@ -5885,41 +5954,41 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalInContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(728); + setState(736); valueExpression(); - setState(730); + setState(738); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(729); + setState(737); match(NOT); } } - setState(732); + setState(740); match(IN); - setState(733); + setState(741); match(LP); - setState(734); + setState(742); valueExpression(); - setState(739); + setState(747); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(735); + setState(743); match(COMMA); - setState(736); + setState(744); valueExpression(); } } - setState(741); + setState(749); _errHandler.sync(this); _la = _input.LA(1); } - setState(742); + setState(750); match(RP); } break; @@ -5928,21 +5997,21 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new IsNullContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(744); + setState(752); valueExpression(); - setState(745); + setState(753); match(IS); - setState(747); + setState(755); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(746); + setState(754); match(NOT); } } - setState(749); + setState(757); match(NULL); } break; @@ -5951,13 +6020,13 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(751); + setState(759); matchBooleanExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(762); + setState(770); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,64,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -5965,7 +6034,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(760); + setState(768); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: @@ -5973,11 +6042,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(754); + setState(762); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(755); + setState(763); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(756); + setState(764); ((LogicalBinaryContext)_localctx).right = booleanExpression(6); } break; @@ -5986,18 +6055,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(757); + setState(765); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(758); + setState(766); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(759); + setState(767); ((LogicalBinaryContext)_localctx).right = booleanExpression(5); } break; } } } - setState(764); + setState(772); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,64,_ctx); } @@ -6153,31 +6222,31 @@ public T accept(ParseTreeVisitor visitor) { public final RegexBooleanExpressionContext regexBooleanExpression() throws RecognitionException { RegexBooleanExpressionContext _localctx = new RegexBooleanExpressionContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_regexBooleanExpression); + enterRule(_localctx, 154, RULE_regexBooleanExpression); int _la; try { - setState(811); + setState(819); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: _localctx = new LikeExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(765); + setState(773); valueExpression(); - setState(767); + setState(775); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(766); + setState(774); match(NOT); } } - setState(769); + setState(777); match(LIKE); - setState(770); + setState(778); stringOrParameter(); } break; @@ -6185,21 +6254,21 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new RlikeExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(772); + setState(780); valueExpression(); - setState(774); + setState(782); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(773); + setState(781); match(NOT); } } - setState(776); + setState(784); match(RLIKE); - setState(777); + setState(785); stringOrParameter(); } break; @@ -6207,41 +6276,41 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new LikeListExpressionContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(779); + setState(787); valueExpression(); - setState(781); + setState(789); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(780); + setState(788); match(NOT); } } - setState(783); + setState(791); match(LIKE); - setState(784); + setState(792); match(LP); - setState(785); + setState(793); stringOrParameter(); - setState(790); + setState(798); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(786); + setState(794); match(COMMA); - setState(787); + setState(795); stringOrParameter(); } } - setState(792); + setState(800); _errHandler.sync(this); _la = _input.LA(1); } - setState(793); + setState(801); match(RP); } break; @@ -6249,41 +6318,41 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new RlikeListExpressionContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(795); + setState(803); valueExpression(); - setState(797); + setState(805); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(796); + setState(804); match(NOT); } } - setState(799); + setState(807); match(RLIKE); - setState(800); + setState(808); match(LP); - setState(801); + setState(809); stringOrParameter(); - setState(806); + setState(814); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(802); + setState(810); match(COMMA); - setState(803); + setState(811); stringOrParameter(); } } - setState(808); + setState(816); _errHandler.sync(this); _la = _input.LA(1); } - setState(809); + setState(817); match(RP); } break; @@ -6338,28 +6407,28 @@ public T accept(ParseTreeVisitor visitor) { public final MatchBooleanExpressionContext matchBooleanExpression() throws RecognitionException { MatchBooleanExpressionContext _localctx = new MatchBooleanExpressionContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_matchBooleanExpression); + enterRule(_localctx, 156, RULE_matchBooleanExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(813); + setState(821); ((MatchBooleanExpressionContext)_localctx).fieldExp = qualifiedName(); - setState(816); + setState(824); _errHandler.sync(this); _la = _input.LA(1); if (_la==CAST_OP) { { - setState(814); + setState(822); match(CAST_OP); - setState(815); + setState(823); ((MatchBooleanExpressionContext)_localctx).fieldType = dataType(); } } - setState(818); + setState(826); match(COLON); - setState(819); + setState(827); ((MatchBooleanExpressionContext)_localctx).matchQuery = constant(); } } @@ -6441,16 +6510,16 @@ public T accept(ParseTreeVisitor visitor) { public final ValueExpressionContext valueExpression() throws RecognitionException { ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_valueExpression); + enterRule(_localctx, 158, RULE_valueExpression); try { - setState(826); + setState(834); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(821); + setState(829); operatorExpression(0); } break; @@ -6458,11 +6527,11 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _localctx = new ComparisonContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(822); + setState(830); ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(823); + setState(831); comparisonOperator(); - setState(824); + setState(832); ((ComparisonContext)_localctx).right = operatorExpression(0); } break; @@ -6580,14 +6649,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE int _parentState = getState(); OperatorExpressionContext _localctx = new OperatorExpressionContext(_ctx, _parentState); OperatorExpressionContext _prevctx = _localctx; - int _startState = 158; - enterRecursionRule(_localctx, 158, RULE_operatorExpression, _p); + int _startState = 160; + enterRecursionRule(_localctx, 160, RULE_operatorExpression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(832); + setState(840); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: @@ -6596,7 +6665,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _ctx = _localctx; _prevctx = _localctx; - setState(829); + setState(837); primaryExpression(0); } break; @@ -6605,7 +6674,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(830); + setState(838); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -6616,13 +6685,13 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(831); + setState(839); operatorExpression(3); } break; } _ctx.stop = _input.LT(-1); - setState(842); + setState(850); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,76,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6630,7 +6699,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(840); + setState(848); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: @@ -6638,12 +6707,12 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(834); + setState(842); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(835); + setState(843); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 91)) & ~0x3f) == 0 && ((1L << (_la - 91)) & 7L) != 0)) ) { + if ( !(((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & 7L) != 0)) ) { ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -6651,7 +6720,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(836); + setState(844); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; @@ -6660,9 +6729,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(837); + setState(845); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(838); + setState(846); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -6673,14 +6742,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(839); + setState(847); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } } } - setState(844); + setState(852); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,76,_ctx); } @@ -6832,13 +6901,13 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc int _parentState = getState(); PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, _parentState); PrimaryExpressionContext _prevctx = _localctx; - int _startState = 160; - enterRecursionRule(_localctx, 160, RULE_primaryExpression, _p); + int _startState = 162; + enterRecursionRule(_localctx, 162, RULE_primaryExpression, _p); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(853); + setState(861); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: @@ -6847,7 +6916,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(846); + setState(854); constant(); } break; @@ -6856,7 +6925,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new DereferenceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(847); + setState(855); qualifiedName(); } break; @@ -6865,7 +6934,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new FunctionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(848); + setState(856); functionExpression(); } break; @@ -6874,17 +6943,17 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new ParenthesizedExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(849); + setState(857); match(LP); - setState(850); + setState(858); booleanExpression(0); - setState(851); + setState(859); match(RP); } break; } _ctx.stop = _input.LT(-1); - setState(860); + setState(868); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,78,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6895,16 +6964,16 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc { _localctx = new InlineCastContext(new PrimaryExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); - setState(855); + setState(863); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(856); + setState(864); match(CAST_OP); - setState(857); + setState(865); dataType(); } } } - setState(862); + setState(870); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,78,_ctx); } @@ -6964,56 +7033,56 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionExpressionContext functionExpression() throws RecognitionException { FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_functionExpression); + enterRule(_localctx, 164, RULE_functionExpression); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(863); + setState(871); functionName(); - setState(864); + setState(872); match(LP); - setState(878); + setState(886); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(865); + setState(873); match(ASTERISK); } break; case 2: { { - setState(866); + setState(874); booleanExpression(0); - setState(871); + setState(879); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(867); + setState(875); match(COMMA); - setState(868); + setState(876); booleanExpression(0); } } } - setState(873); + setState(881); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); } - setState(876); + setState(884); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(874); + setState(882); match(COMMA); - setState(875); + setState(883); mapExpression(); } } @@ -7022,7 +7091,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } break; } - setState(880); + setState(888); match(RP); } } @@ -7066,9 +7135,9 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionNameContext functionName() throws RecognitionException { FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_functionName); + enterRule(_localctx, 166, RULE_functionName); try { - setState(885); + setState(893); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: @@ -7079,21 +7148,21 @@ public final FunctionNameContext functionName() throws RecognitionException { case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(882); + setState(890); identifierOrParameter(); } break; case FIRST: enterOuterAlt(_localctx, 2); { - setState(883); + setState(891); match(FIRST); } break; case LAST: enterOuterAlt(_localctx, 3); { - setState(884); + setState(892); match(LAST); } break; @@ -7148,40 +7217,40 @@ public T accept(ParseTreeVisitor visitor) { public final MapExpressionContext mapExpression() throws RecognitionException { MapExpressionContext _localctx = new MapExpressionContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_mapExpression); + enterRule(_localctx, 168, RULE_mapExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(887); + setState(895); match(LEFT_BRACES); - setState(896); + setState(904); _errHandler.sync(this); _la = _input.LA(1); if (_la==QUOTED_STRING) { { - setState(888); + setState(896); entryExpression(); - setState(893); + setState(901); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(889); + setState(897); match(COMMA); - setState(890); + setState(898); entryExpression(); } } - setState(895); + setState(903); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(898); + setState(906); match(RIGHT_BRACES); } } @@ -7229,15 +7298,15 @@ public T accept(ParseTreeVisitor visitor) { public final EntryExpressionContext entryExpression() throws RecognitionException { EntryExpressionContext _localctx = new EntryExpressionContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_entryExpression); + enterRule(_localctx, 170, RULE_entryExpression); try { enterOuterAlt(_localctx, 1); { - setState(900); + setState(908); ((EntryExpressionContext)_localctx).key = string(); - setState(901); + setState(909); match(COLON); - setState(902); + setState(910); ((EntryExpressionContext)_localctx).value = mapValue(); } } @@ -7282,9 +7351,9 @@ public T accept(ParseTreeVisitor visitor) { public final MapValueContext mapValue() throws RecognitionException { MapValueContext _localctx = new MapValueContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_mapValue); + enterRule(_localctx, 172, RULE_mapValue); try { - setState(906); + setState(914); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -7300,14 +7369,14 @@ public final MapValueContext mapValue() throws RecognitionException { case OPENING_BRACKET: enterOuterAlt(_localctx, 1); { - setState(904); + setState(912); constant(); } break; case LEFT_BRACES: enterOuterAlt(_localctx, 2); { - setState(905); + setState(913); mapExpression(); } break; @@ -7579,17 +7648,17 @@ public T accept(ParseTreeVisitor visitor) { public final ConstantContext constant() throws RecognitionException { ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_constant); + enterRule(_localctx, 174, RULE_constant); int _la; try { - setState(950); + setState(958); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(908); + setState(916); match(NULL); } break; @@ -7597,9 +7666,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(909); + setState(917); integerValue(); - setState(910); + setState(918); match(UNQUOTED_IDENTIFIER); } break; @@ -7607,7 +7676,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(912); + setState(920); decimalValue(); } break; @@ -7615,7 +7684,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(913); + setState(921); integerValue(); } break; @@ -7623,7 +7692,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(914); + setState(922); booleanValue(); } break; @@ -7631,7 +7700,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new InputParameterContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(915); + setState(923); parameter(); } break; @@ -7639,7 +7708,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(916); + setState(924); string(); } break; @@ -7647,27 +7716,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(917); + setState(925); match(OPENING_BRACKET); - setState(918); + setState(926); numericValue(); - setState(923); + setState(931); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(919); + setState(927); match(COMMA); - setState(920); + setState(928); numericValue(); } } - setState(925); + setState(933); _errHandler.sync(this); _la = _input.LA(1); } - setState(926); + setState(934); match(CLOSING_BRACKET); } break; @@ -7675,27 +7744,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(928); + setState(936); match(OPENING_BRACKET); - setState(929); + setState(937); booleanValue(); - setState(934); + setState(942); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(930); + setState(938); match(COMMA); - setState(931); + setState(939); booleanValue(); } } - setState(936); + setState(944); _errHandler.sync(this); _la = _input.LA(1); } - setState(937); + setState(945); match(CLOSING_BRACKET); } break; @@ -7703,27 +7772,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(939); + setState(947); match(OPENING_BRACKET); - setState(940); + setState(948); string(); - setState(945); + setState(953); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(941); + setState(949); match(COMMA); - setState(942); + setState(950); string(); } } - setState(947); + setState(955); _errHandler.sync(this); _la = _input.LA(1); } - setState(948); + setState(956); match(CLOSING_BRACKET); } break; @@ -7766,12 +7835,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_booleanValue); + enterRule(_localctx, 176, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(952); + setState(960); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -7824,22 +7893,22 @@ public T accept(ParseTreeVisitor visitor) { public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_numericValue); + enterRule(_localctx, 178, RULE_numericValue); try { - setState(956); + setState(964); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(954); + setState(962); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(955); + setState(963); integerValue(); } break; @@ -7883,17 +7952,17 @@ public T accept(ParseTreeVisitor visitor) { public final DecimalValueContext decimalValue() throws RecognitionException { DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_decimalValue); + enterRule(_localctx, 180, RULE_decimalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(959); + setState(967); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(958); + setState(966); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -7906,7 +7975,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(961); + setState(969); match(DECIMAL_LITERAL); } } @@ -7948,17 +8017,17 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerValueContext integerValue() throws RecognitionException { IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_integerValue); + enterRule(_localctx, 182, RULE_integerValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(964); + setState(972); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(963); + setState(971); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -7971,7 +8040,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(966); + setState(974); match(INTEGER_LITERAL); } } @@ -8011,11 +8080,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_string); + enterRule(_localctx, 184, RULE_string); try { enterOuterAlt(_localctx, 1); { - setState(968); + setState(976); match(QUOTED_STRING); } } @@ -8060,14 +8129,14 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_comparisonOperator); + enterRule(_localctx, 186, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(970); + setState(978); _la = _input.LA(1); - if ( !(((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 125L) != 0)) ) { + if ( !(((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & 125L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -8123,15 +8192,15 @@ public T accept(ParseTreeVisitor visitor) { public final JoinCommandContext joinCommand() throws RecognitionException { JoinCommandContext _localctx = new JoinCommandContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_joinCommand); + enterRule(_localctx, 188, RULE_joinCommand); int _la; try { enterOuterAlt(_localctx, 1); { - setState(972); + setState(980); ((JoinCommandContext)_localctx).type = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 436207616L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 872415232L) != 0)) ) { ((JoinCommandContext)_localctx).type = (Token)_errHandler.recoverInline(this); } else { @@ -8139,11 +8208,11 @@ public final JoinCommandContext joinCommand() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(973); + setState(981); match(JOIN); - setState(974); + setState(982); joinTarget(); - setState(975); + setState(983); joinCondition(); } } @@ -8189,37 +8258,37 @@ public T accept(ParseTreeVisitor visitor) { public final JoinTargetContext joinTarget() throws RecognitionException { JoinTargetContext _localctx = new JoinTargetContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_joinTarget); + enterRule(_localctx, 190, RULE_joinTarget); int _la; try { - setState(985); + setState(993); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(977); + setState(985); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(978); + setState(986); ((JoinTargetContext)_localctx).index = indexPattern(); - setState(980); + setState(988); _errHandler.sync(this); _la = _input.LA(1); if (_la==AS) { { - setState(979); + setState(987); match(AS); } } - setState(982); + setState(990); ((JoinTargetContext)_localctx).qualifier = match(UNQUOTED_SOURCE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(984); + setState(992); ((JoinTargetContext)_localctx).index = indexPattern(); } break; @@ -8271,30 +8340,30 @@ public T accept(ParseTreeVisitor visitor) { public final JoinConditionContext joinCondition() throws RecognitionException { JoinConditionContext _localctx = new JoinConditionContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_joinCondition); + enterRule(_localctx, 192, RULE_joinCondition); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(987); + setState(995); match(ON); - setState(988); + setState(996); booleanExpression(0); - setState(993); + setState(1001); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,95,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(989); + setState(997); match(COMMA); - setState(990); + setState(998); booleanExpression(0); } } } - setState(995); + setState(1003); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,95,_ctx); } @@ -8354,88 +8423,88 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlCommandContext promqlCommand() throws RecognitionException { PromqlCommandContext _localctx = new PromqlCommandContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_promqlCommand); + enterRule(_localctx, 194, RULE_promqlCommand); int _la; try { int _alt; - setState(1028); + setState(1036); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(996); + setState(1004); match(PROMQL); - setState(1000); + setState(1008); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,96,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(997); + setState(1005); promqlParam(); } } } - setState(1002); + setState(1010); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,96,_ctx); } - setState(1006); + setState(1014); _errHandler.sync(this); _la = _input.LA(1); if (_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) { { - setState(1003); + setState(1011); valueName(); - setState(1004); + setState(1012); match(ASSIGN); } } - setState(1008); + setState(1016); match(LP); - setState(1010); + setState(1018); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(1009); + setState(1017); promqlQueryPart(); } } - setState(1012); + setState(1020); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & 37867180460606881L) != 0) || ((((_la - 151)) & ~0x3f) == 0 && ((1L << (_la - 151)) & 7L) != 0) ); - setState(1014); + } while ( ((((_la - 55)) & ~0x3f) == 0 && ((1L << (_la - 55)) & 37867180460606881L) != 0) || ((((_la - 152)) & ~0x3f) == 0 && ((1L << (_la - 152)) & 7L) != 0) ); + setState(1022); match(RP); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1016); + setState(1024); match(PROMQL); - setState(1020); + setState(1028); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,99,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1017); + setState(1025); promqlParam(); } } } - setState(1022); + setState(1030); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,99,_ctx); } - setState(1024); + setState(1032); _errHandler.sync(this); _alt = 1; do { @@ -8443,7 +8512,7 @@ public final PromqlCommandContext promqlCommand() throws RecognitionException { case 1: { { - setState(1023); + setState(1031); promqlQueryPart(); } } @@ -8451,7 +8520,7 @@ public final PromqlCommandContext promqlCommand() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1026); + setState(1034); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -8496,12 +8565,12 @@ public T accept(ParseTreeVisitor visitor) { public final ValueNameContext valueName() throws RecognitionException { ValueNameContext _localctx = new ValueNameContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_valueName); + enterRule(_localctx, 196, RULE_valueName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1030); + setState(1038); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -8557,15 +8626,15 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlParamContext promqlParam() throws RecognitionException { PromqlParamContext _localctx = new PromqlParamContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_promqlParam); + enterRule(_localctx, 198, RULE_promqlParam); try { enterOuterAlt(_localctx, 1); { - setState(1032); + setState(1040); ((PromqlParamContext)_localctx).name = promqlParamName(); - setState(1033); + setState(1041); match(ASSIGN); - setState(1034); + setState(1042); ((PromqlParamContext)_localctx).value = promqlParamValue(); } } @@ -8608,14 +8677,14 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlParamNameContext promqlParamName() throws RecognitionException { PromqlParamNameContext _localctx = new PromqlParamNameContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_promqlParamName); + enterRule(_localctx, 200, RULE_promqlParamName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1036); + setState(1044); _la = _input.LA(1); - if ( !(((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & 1697645953286145L) != 0)) ) { + if ( !(((((_la - 55)) & ~0x3f) == 0 && ((1L << (_la - 55)) & 1697645953286145L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -8672,10 +8741,10 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlParamValueContext promqlParamValue() throws RecognitionException { PromqlParamValueContext _localctx = new PromqlParamValueContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_promqlParamValue); + enterRule(_localctx, 202, RULE_promqlParamValue); try { int _alt; - setState(1048); + setState(1056); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -8683,23 +8752,23 @@ public final PromqlParamValueContext promqlParamValue() throws RecognitionExcept case UNQUOTED_SOURCE: enterOuterAlt(_localctx, 1); { - setState(1038); + setState(1046); promqlIndexPattern(); - setState(1043); + setState(1051); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,102,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1039); + setState(1047); match(COMMA); - setState(1040); + setState(1048); promqlIndexPattern(); } } } - setState(1045); + setState(1053); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,102,_ctx); } @@ -8708,14 +8777,14 @@ public final PromqlParamValueContext promqlParamValue() throws RecognitionExcept case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 2); { - setState(1046); + setState(1054); match(QUOTED_IDENTIFIER); } break; case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 3); { - setState(1047); + setState(1055); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -8770,14 +8839,14 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlQueryContentContext promqlQueryContent() throws RecognitionException { PromqlQueryContentContext _localctx = new PromqlQueryContentContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_promqlQueryContent); + enterRule(_localctx, 204, RULE_promqlQueryContent); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1050); + setState(1058); _la = _input.LA(1); - if ( !(((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & 37726442972251553L) != 0) || ((((_la - 151)) & ~0x3f) == 0 && ((1L << (_la - 151)) & 7L) != 0)) ) { + if ( !(((((_la - 55)) & ~0x3f) == 0 && ((1L << (_la - 55)) & 37726442972251553L) != 0) || ((((_la - 152)) & ~0x3f) == 0 && ((1L << (_la - 152)) & 7L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -8836,11 +8905,11 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlQueryPartContext promqlQueryPart() throws RecognitionException { PromqlQueryPartContext _localctx = new PromqlQueryPartContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_promqlQueryPart); + enterRule(_localctx, 206, RULE_promqlQueryPart); int _la; try { int _alt; - setState(1065); + setState(1073); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -8857,7 +8926,7 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio case PROMQL_OTHER_QUERY_CONTENT: enterOuterAlt(_localctx, 1); { - setState(1053); + setState(1061); _errHandler.sync(this); _alt = 1; do { @@ -8865,7 +8934,7 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio case 1: { { - setState(1052); + setState(1060); promqlQueryContent(); } } @@ -8873,7 +8942,7 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio default: throw new NoViableAltException(this); } - setState(1055); + setState(1063); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,104,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -8882,23 +8951,23 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio case LP: enterOuterAlt(_localctx, 2); { - setState(1057); + setState(1065); match(LP); - setState(1061); + setState(1069); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & 37867180460606881L) != 0) || ((((_la - 151)) & ~0x3f) == 0 && ((1L << (_la - 151)) & 7L) != 0)) { + while (((((_la - 55)) & ~0x3f) == 0 && ((1L << (_la - 55)) & 37867180460606881L) != 0) || ((((_la - 152)) & ~0x3f) == 0 && ((1L << (_la - 152)) & 7L) != 0)) { { { - setState(1058); + setState(1066); promqlQueryPart(); } } - setState(1063); + setState(1071); _errHandler.sync(this); _la = _input.LA(1); } - setState(1064); + setState(1072); match(RP); } break; @@ -8955,37 +9024,37 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlIndexPatternContext promqlIndexPattern() throws RecognitionException { PromqlIndexPatternContext _localctx = new PromqlIndexPatternContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_promqlIndexPattern); + enterRule(_localctx, 208, RULE_promqlIndexPattern); try { - setState(1076); + setState(1084); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1067); + setState(1075); promqlClusterString(); - setState(1068); + setState(1076); match(COLON); - setState(1069); + setState(1077); promqlUnquotedIndexString(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1071); + setState(1079); promqlUnquotedIndexString(); - setState(1072); + setState(1080); match(CAST_OP); - setState(1073); + setState(1081); promqlSelectorString(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1075); + setState(1083); promqlIndexString(); } break; @@ -9028,12 +9097,12 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlClusterStringContext promqlClusterString() throws RecognitionException { PromqlClusterStringContext _localctx = new PromqlClusterStringContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_promqlClusterString); + enterRule(_localctx, 210, RULE_promqlClusterString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1078); + setState(1086); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -9082,12 +9151,12 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlSelectorStringContext promqlSelectorString() throws RecognitionException { PromqlSelectorStringContext _localctx = new PromqlSelectorStringContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_promqlSelectorString); + enterRule(_localctx, 212, RULE_promqlSelectorString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1080); + setState(1088); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -9136,12 +9205,12 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlUnquotedIndexStringContext promqlUnquotedIndexString() throws RecognitionException { PromqlUnquotedIndexStringContext _localctx = new PromqlUnquotedIndexStringContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_promqlUnquotedIndexString); + enterRule(_localctx, 214, RULE_promqlUnquotedIndexString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1082); + setState(1090); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -9191,14 +9260,14 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlIndexStringContext promqlIndexString() throws RecognitionException { PromqlIndexStringContext _localctx = new PromqlIndexStringContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_promqlIndexString); + enterRule(_localctx, 216, RULE_promqlIndexString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1084); + setState(1092); _la = _input.LA(1); - if ( !(((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & 36591746972385281L) != 0)) ) { + if ( !(((((_la - 55)) & ~0x3f) == 0 && ((1L << (_la - 55)) & 36591746972385281L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9235,13 +9304,13 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return qualifiedNamePattern_sempred((QualifiedNamePatternContext)_localctx, predIndex); case 61: return forkSubQueryCommand_sempred((ForkSubQueryCommandContext)_localctx, predIndex); - case 75: + case 76: return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); - case 79: - return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); case 80: + return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); + case 81: return primaryExpression_sempred((PrimaryExpressionContext)_localctx, predIndex); - case 94: + case 95: return joinTarget_sempred((JoinTargetContext)_localctx, predIndex); } return true; @@ -9335,7 +9404,7 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a4\u043f\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a5\u0447\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -9360,655 +9429,659 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { "Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007"+ "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+ "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+ - "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0001\u0000\u0005\u0000\u00da"+ - "\b\u0000\n\u0000\f\u0000\u00dd\t\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u00eb\b\u0002\n\u0002"+ - "\f\u0002\u00ee\t\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003"+ - "\u00f9\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0001\u0000"+ + "\u0005\u0000\u00dc\b\u0000\n\u0000\f\u0000\u00df\t\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u00ed"+ + "\b\u0002\n\u0002\f\u0002\u00f0\t\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0003\u0003\u00fb\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0115\b\u0004\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0005\b\u0122\b\b\n\b\f\b\u0125\t"+ - "\b\u0001\t\u0001\t\u0001\t\u0003\t\u012a\b\t\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f"+ - "\u0001\f\u0001\r\u0001\r\u0001\r\u0005\r\u013b\b\r\n\r\f\r\u013e\t\r\u0001"+ - "\r\u0003\r\u0141\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e\u0146"+ - "\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u014c"+ - "\b\u000f\n\u000f\f\u000f\u014f\t\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0003\u0010\u0156\b\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0003\u0010\u015b\b\u0010\u0001\u0010\u0003\u0010\u015e\b"+ - "\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ - "\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0005\u0015\u016c\b\u0015\n\u0015\f\u0015\u016f\t\u0015\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0003\u0017\u0176\b\u0017"+ - "\u0001\u0017\u0001\u0017\u0003\u0017\u017a\b\u0017\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0005\u0018\u017f\b\u0018\n\u0018\f\u0018\u0182\t\u0018\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u0187\b\u0019\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0003\u001a\u018c\b\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u0195"+ - "\b\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u019a\b\u001b"+ - "\n\u001b\f\u001b\u019d\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0003"+ - "\u001c\u01a2\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u01ab\b\u001c\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0005\u001d\u01b0\b\u001d\n\u001d\f\u001d\u01b3\t\u001d"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0005\u001e\u01b8\b\u001e\n\u001e"+ - "\f\u001e\u01bb\t\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0003"+ - " \u01c2\b \u0001!\u0001!\u0003!\u01c6\b!\u0001\"\u0001\"\u0003\"\u01ca"+ - "\b\"\u0001#\u0001#\u0001#\u0003#\u01cf\b#\u0001$\u0001$\u0003$\u01d3\b"+ - "$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u01dc\b&\n&"+ - "\f&\u01df\t&\u0001\'\u0001\'\u0003\'\u01e3\b\'\u0001\'\u0001\'\u0003\'"+ - "\u01e7\b\'\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ - "*\u0001*\u0005*\u01f3\b*\n*\f*\u01f6\t*\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0003+\u0200\b+\u0001,\u0001,\u0001,\u0001,\u0003"+ - ",\u0206\b,\u0001-\u0001-\u0001-\u0005-\u020b\b-\n-\f-\u020e\t-\u0001."+ - "\u0001.\u0001.\u0001.\u0001/\u0001/\u0003/\u0216\b/\u00010\u00010\u0001"+ - "0\u00010\u00010\u00050\u021d\b0\n0\f0\u0220\t0\u00011\u00011\u00011\u0001"+ - "2\u00012\u00012\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u0001"+ - "5\u00015\u00015\u00015\u00035\u0233\b5\u00015\u00015\u00015\u00015\u0005"+ - "5\u0239\b5\n5\f5\u023c\t5\u00035\u023e\b5\u00016\u00016\u00017\u00017"+ - "\u00017\u00037\u0245\b7\u00017\u00017\u00018\u00018\u00018\u00019\u0001"+ - "9\u00019\u00019\u00039\u0250\b9\u00019\u00019\u00019\u00019\u00019\u0003"+ - "9\u0257\b9\u0001:\u0001:\u0001:\u0001;\u0004;\u025d\b;\u000b;\f;\u025e"+ - "\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0005=\u026b\b=\n=\f=\u026e\t=\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ - "?\u0003?\u0276\b?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001"+ - "@\u0001@\u0003@\u0281\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0003A\u028b\bA\u0001A\u0001A\u0001A\u0001A\u0003A\u0291\bA\u0003"+ - "A\u0293\bA\u0001B\u0001B\u0003B\u0297\bB\u0001B\u0005B\u029a\bB\nB\fB"+ - "\u029d\tB\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0003C\u02aa\bC\u0001D\u0001D\u0001D\u0005D\u02af\bD\n"+ - "D\fD\u02b2\tD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F"+ - "\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0003H\u02c4"+ - "\bH\u0001I\u0001I\u0003I\u02c8\bI\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ - "I\u0001J\u0001J\u0003J\u02d2\bJ\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001K\u0003K\u02db\bK\u0001K\u0001K\u0001K\u0001K\u0001K\u0005K\u02e2"+ - "\bK\nK\fK\u02e5\tK\u0001K\u0001K\u0001K\u0001K\u0001K\u0003K\u02ec\bK"+ - "\u0001K\u0001K\u0001K\u0003K\u02f1\bK\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001K\u0005K\u02f9\bK\nK\fK\u02fc\tK\u0001L\u0001L\u0003L\u0300\bL"+ - "\u0001L\u0001L\u0001L\u0001L\u0001L\u0003L\u0307\bL\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0003L\u030e\bL\u0001L\u0001L\u0001L\u0001L\u0001L\u0005"+ - "L\u0315\bL\nL\fL\u0318\tL\u0001L\u0001L\u0001L\u0001L\u0003L\u031e\bL"+ - "\u0001L\u0001L\u0001L\u0001L\u0001L\u0005L\u0325\bL\nL\fL\u0328\tL\u0001"+ - "L\u0001L\u0003L\u032c\bL\u0001M\u0001M\u0001M\u0003M\u0331\bM\u0001M\u0001"+ - "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0003N\u033b\bN\u0001O\u0001"+ - "O\u0001O\u0001O\u0003O\u0341\bO\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ - "O\u0005O\u0349\bO\nO\fO\u034c\tO\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ - "P\u0001P\u0001P\u0003P\u0356\bP\u0001P\u0001P\u0001P\u0005P\u035b\bP\n"+ - "P\fP\u035e\tP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0005Q\u0366\b"+ - "Q\nQ\fQ\u0369\tQ\u0001Q\u0001Q\u0003Q\u036d\bQ\u0003Q\u036f\bQ\u0001Q"+ - "\u0001Q\u0001R\u0001R\u0001R\u0003R\u0376\bR\u0001S\u0001S\u0001S\u0001"+ - "S\u0005S\u037c\bS\nS\fS\u037f\tS\u0003S\u0381\bS\u0001S\u0001S\u0001T"+ - "\u0001T\u0001T\u0001T\u0001U\u0001U\u0003U\u038b\bU\u0001V\u0001V\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0005V\u039a\bV\nV\fV\u039d\tV\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0005V\u03a5\bV\nV\fV\u03a8\tV\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0005V\u03b0\bV\nV\fV\u03b3\tV\u0001V\u0001V\u0003V\u03b7\bV\u0001W"+ - "\u0001W\u0001X\u0001X\u0003X\u03bd\bX\u0001Y\u0003Y\u03c0\bY\u0001Y\u0001"+ - "Y\u0001Z\u0003Z\u03c5\bZ\u0001Z\u0001Z\u0001[\u0001[\u0001\\\u0001\\\u0001"+ - "]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0003^\u03d5\b^\u0001"+ - "^\u0001^\u0001^\u0003^\u03da\b^\u0001_\u0001_\u0001_\u0001_\u0005_\u03e0"+ - "\b_\n_\f_\u03e3\t_\u0001`\u0001`\u0005`\u03e7\b`\n`\f`\u03ea\t`\u0001"+ - "`\u0001`\u0001`\u0003`\u03ef\b`\u0001`\u0001`\u0004`\u03f3\b`\u000b`\f"+ - "`\u03f4\u0001`\u0001`\u0001`\u0001`\u0005`\u03fb\b`\n`\f`\u03fe\t`\u0001"+ - "`\u0004`\u0401\b`\u000b`\f`\u0402\u0003`\u0405\b`\u0001a\u0001a\u0001"+ - "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001d\u0005d\u0412"+ - "\bd\nd\fd\u0415\td\u0001d\u0001d\u0003d\u0419\bd\u0001e\u0001e\u0001f"+ - "\u0004f\u041e\bf\u000bf\ff\u041f\u0001f\u0001f\u0005f\u0424\bf\nf\ff\u0427"+ - "\tf\u0001f\u0003f\u042a\bf\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001g\u0001g\u0003g\u0435\bg\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ - "j\u0001k\u0001k\u0001k\u0000\u0005\u0004z\u0096\u009e\u00a0l\u0000\u0002"+ - "\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e"+ - " \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ - "\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e"+ - "\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6"+ - "\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce"+ - "\u00d0\u00d2\u00d4\u00d6\u0000\u000e\u0002\u000066mm\u0001\u0000gh\u0002"+ - "\u0000::AA\u0002\u0000DDGG\u0002\u0000++66\u0001\u0000YZ\u0001\u0000["+ - "]\u0002\u0000CCPP\u0002\u0000RRTX\u0002\u0000\u0019\u0019\u001b\u001c"+ - "\u0003\u000066aagh\b\u000066;;=>@@aaghmm\u0097\u0099\u0002\u0000ggmm\u0003"+ - "\u000066ggmm\u0470\u0000\u00db\u0001\u0000\u0000\u0000\u0002\u00e1\u0001"+ - "\u0000\u0000\u0000\u0004\u00e4\u0001\u0000\u0000\u0000\u0006\u00f8\u0001"+ - "\u0000\u0000\u0000\b\u0114\u0001\u0000\u0000\u0000\n\u0116\u0001\u0000"+ - "\u0000\u0000\f\u0119\u0001\u0000\u0000\u0000\u000e\u011b\u0001\u0000\u0000"+ - "\u0000\u0010\u011e\u0001\u0000\u0000\u0000\u0012\u0129\u0001\u0000\u0000"+ - "\u0000\u0014\u012d\u0001\u0000\u0000\u0000\u0016\u0130\u0001\u0000\u0000"+ - "\u0000\u0018\u0133\u0001\u0000\u0000\u0000\u001a\u0137\u0001\u0000\u0000"+ - "\u0000\u001c\u0145\u0001\u0000\u0000\u0000\u001e\u0147\u0001\u0000\u0000"+ - "\u0000 \u015d\u0001\u0000\u0000\u0000\"\u015f\u0001\u0000\u0000\u0000"+ - "$\u0161\u0001\u0000\u0000\u0000&\u0163\u0001\u0000\u0000\u0000(\u0165"+ - "\u0001\u0000\u0000\u0000*\u0167\u0001\u0000\u0000\u0000,\u0170\u0001\u0000"+ - "\u0000\u0000.\u0173\u0001\u0000\u0000\u00000\u017b\u0001\u0000\u0000\u0000"+ - "2\u0183\u0001\u0000\u0000\u00004\u0194\u0001\u0000\u0000\u00006\u0196"+ - "\u0001\u0000\u0000\u00008\u01aa\u0001\u0000\u0000\u0000:\u01ac\u0001\u0000"+ - "\u0000\u0000<\u01b4\u0001\u0000\u0000\u0000>\u01bc\u0001\u0000\u0000\u0000"+ - "@\u01c1\u0001\u0000\u0000\u0000B\u01c5\u0001\u0000\u0000\u0000D\u01c9"+ - "\u0001\u0000\u0000\u0000F\u01ce\u0001\u0000\u0000\u0000H\u01d2\u0001\u0000"+ - "\u0000\u0000J\u01d4\u0001\u0000\u0000\u0000L\u01d7\u0001\u0000\u0000\u0000"+ - "N\u01e0\u0001\u0000\u0000\u0000P\u01e8\u0001\u0000\u0000\u0000R\u01eb"+ - "\u0001\u0000\u0000\u0000T\u01ee\u0001\u0000\u0000\u0000V\u01ff\u0001\u0000"+ - "\u0000\u0000X\u0201\u0001\u0000\u0000\u0000Z\u0207\u0001\u0000\u0000\u0000"+ - "\\\u020f\u0001\u0000\u0000\u0000^\u0215\u0001\u0000\u0000\u0000`\u0217"+ - "\u0001\u0000\u0000\u0000b\u0221\u0001\u0000\u0000\u0000d\u0224\u0001\u0000"+ - "\u0000\u0000f\u0227\u0001\u0000\u0000\u0000h\u022b\u0001\u0000\u0000\u0000"+ - "j\u022e\u0001\u0000\u0000\u0000l\u023f\u0001\u0000\u0000\u0000n\u0244"+ - "\u0001\u0000\u0000\u0000p\u0248\u0001\u0000\u0000\u0000r\u024b\u0001\u0000"+ - "\u0000\u0000t\u0258\u0001\u0000\u0000\u0000v\u025c\u0001\u0000\u0000\u0000"+ - "x\u0260\u0001\u0000\u0000\u0000z\u0264\u0001\u0000\u0000\u0000|\u026f"+ - "\u0001\u0000\u0000\u0000~\u0271\u0001\u0000\u0000\u0000\u0080\u027c\u0001"+ - "\u0000\u0000\u0000\u0082\u0292\u0001\u0000\u0000\u0000\u0084\u0294\u0001"+ - "\u0000\u0000\u0000\u0086\u02a9\u0001\u0000\u0000\u0000\u0088\u02ab\u0001"+ - "\u0000\u0000\u0000\u008a\u02b3\u0001\u0000\u0000\u0000\u008c\u02b8\u0001"+ - "\u0000\u0000\u0000\u008e\u02bb\u0001\u0000\u0000\u0000\u0090\u02bf\u0001"+ - "\u0000\u0000\u0000\u0092\u02c5\u0001\u0000\u0000\u0000\u0094\u02d1\u0001"+ - "\u0000\u0000\u0000\u0096\u02f0\u0001\u0000\u0000\u0000\u0098\u032b\u0001"+ - "\u0000\u0000\u0000\u009a\u032d\u0001\u0000\u0000\u0000\u009c\u033a\u0001"+ - "\u0000\u0000\u0000\u009e\u0340\u0001\u0000\u0000\u0000\u00a0\u0355\u0001"+ - "\u0000\u0000\u0000\u00a2\u035f\u0001\u0000\u0000\u0000\u00a4\u0375\u0001"+ - "\u0000\u0000\u0000\u00a6\u0377\u0001\u0000\u0000\u0000\u00a8\u0384\u0001"+ - "\u0000\u0000\u0000\u00aa\u038a\u0001\u0000\u0000\u0000\u00ac\u03b6\u0001"+ - "\u0000\u0000\u0000\u00ae\u03b8\u0001\u0000\u0000\u0000\u00b0\u03bc\u0001"+ - "\u0000\u0000\u0000\u00b2\u03bf\u0001\u0000\u0000\u0000\u00b4\u03c4\u0001"+ - "\u0000\u0000\u0000\u00b6\u03c8\u0001\u0000\u0000\u0000\u00b8\u03ca\u0001"+ - "\u0000\u0000\u0000\u00ba\u03cc\u0001\u0000\u0000\u0000\u00bc\u03d9\u0001"+ - "\u0000\u0000\u0000\u00be\u03db\u0001\u0000\u0000\u0000\u00c0\u0404\u0001"+ - "\u0000\u0000\u0000\u00c2\u0406\u0001\u0000\u0000\u0000\u00c4\u0408\u0001"+ - "\u0000\u0000\u0000\u00c6\u040c\u0001\u0000\u0000\u0000\u00c8\u0418\u0001"+ - "\u0000\u0000\u0000\u00ca\u041a\u0001\u0000\u0000\u0000\u00cc\u0429\u0001"+ - "\u0000\u0000\u0000\u00ce\u0434\u0001\u0000\u0000\u0000\u00d0\u0436\u0001"+ - "\u0000\u0000\u0000\u00d2\u0438\u0001\u0000\u0000\u0000\u00d4\u043a\u0001"+ - "\u0000\u0000\u0000\u00d6\u043c\u0001\u0000\u0000\u0000\u00d8\u00da\u0003"+ - "\u008eG\u0000\u00d9\u00d8\u0001\u0000\u0000\u0000\u00da\u00dd\u0001\u0000"+ - "\u0000\u0000\u00db\u00d9\u0001\u0000\u0000\u0000\u00db\u00dc\u0001\u0000"+ - "\u0000\u0000\u00dc\u00de\u0001\u0000\u0000\u0000\u00dd\u00db\u0001\u0000"+ - "\u0000\u0000\u00de\u00df\u0003\u0002\u0001\u0000\u00df\u00e0\u0005\u0000"+ - "\u0000\u0001\u00e0\u0001\u0001\u0000\u0000\u0000\u00e1\u00e2\u0003\u0004"+ - "\u0002\u0000\u00e2\u00e3\u0005\u0000\u0000\u0001\u00e3\u0003\u0001\u0000"+ - "\u0000\u0000\u00e4\u00e5\u0006\u0002\uffff\uffff\u0000\u00e5\u00e6\u0003"+ - "\u0006\u0003\u0000\u00e6\u00ec\u0001\u0000\u0000\u0000\u00e7\u00e8\n\u0001"+ - "\u0000\u0000\u00e8\u00e9\u00055\u0000\u0000\u00e9\u00eb\u0003\b\u0004"+ - "\u0000\u00ea\u00e7\u0001\u0000\u0000\u0000\u00eb\u00ee\u0001\u0000\u0000"+ - "\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ec\u00ed\u0001\u0000\u0000"+ - "\u0000\u00ed\u0005\u0001\u0000\u0000\u0000\u00ee\u00ec\u0001\u0000\u0000"+ - "\u0000\u00ef\u00f9\u0003\u0014\n\u0000\u00f0\u00f9\u0003\u000e\u0007\u0000"+ - "\u00f1\u00f9\u0003h4\u0000\u00f2\u00f9\u0003\u0016\u000b\u0000\u00f3\u00f9"+ - "\u0003\u00c0`\u0000\u00f4\u00f5\u0004\u0003\u0001\u0000\u00f5\u00f9\u0003"+ - "d2\u0000\u00f6\u00f7\u0004\u0003\u0002\u0000\u00f7\u00f9\u0003\u0018\f"+ - "\u0000\u00f8\u00ef\u0001\u0000\u0000\u0000\u00f8\u00f0\u0001\u0000\u0000"+ - "\u0000\u00f8\u00f1\u0001\u0000\u0000\u0000\u00f8\u00f2\u0001\u0000\u0000"+ - "\u0000\u00f8\u00f3\u0001\u0000\u0000\u0000\u00f8\u00f4\u0001\u0000\u0000"+ - "\u0000\u00f8\u00f6\u0001\u0000\u0000\u0000\u00f9\u0007\u0001\u0000\u0000"+ - "\u0000\u00fa\u0115\u0003,\u0016\u0000\u00fb\u0115\u0003\n\u0005\u0000"+ - "\u00fc\u0115\u0003P(\u0000\u00fd\u0115\u0003J%\u0000\u00fe\u0115\u0003"+ - ".\u0017\u0000\u00ff\u0115\u0003L&\u0000\u0100\u0115\u0003R)\u0000\u0101"+ - "\u0115\u0003T*\u0000\u0102\u0115\u0003X,\u0000\u0103\u0115\u0003`0\u0000"+ - "\u0104\u0115\u0003j5\u0000\u0105\u0115\u0003b1\u0000\u0106\u0115\u0003"+ - "\u00ba]\u0000\u0107\u0115\u0003r9\u0000\u0108\u0115\u0003\u0080@\u0000"+ - "\u0109\u0115\u0003p8\u0000\u010a\u0115\u0003t:\u0000\u010b\u0115\u0003"+ - "~?\u0000\u010c\u0115\u0003\u0082A\u0000\u010d\u0115\u0003\u0084B\u0000"+ - "\u010e\u010f\u0004\u0004\u0003\u0000\u010f\u0115\u0003\u008aE\u0000\u0110"+ - "\u0111\u0004\u0004\u0004\u0000\u0111\u0115\u0003\u008cF\u0000\u0112\u0113"+ - "\u0004\u0004\u0005\u0000\u0113\u0115\u0003\u0092I\u0000\u0114\u00fa\u0001"+ - "\u0000\u0000\u0000\u0114\u00fb\u0001\u0000\u0000\u0000\u0114\u00fc\u0001"+ - "\u0000\u0000\u0000\u0114\u00fd\u0001\u0000\u0000\u0000\u0114\u00fe\u0001"+ - "\u0000\u0000\u0000\u0114\u00ff\u0001\u0000\u0000\u0000\u0114\u0100\u0001"+ - "\u0000\u0000\u0000\u0114\u0101\u0001\u0000\u0000\u0000\u0114\u0102\u0001"+ - "\u0000\u0000\u0000\u0114\u0103\u0001\u0000\u0000\u0000\u0114\u0104\u0001"+ - "\u0000\u0000\u0000\u0114\u0105\u0001\u0000\u0000\u0000\u0114\u0106\u0001"+ - "\u0000\u0000\u0000\u0114\u0107\u0001\u0000\u0000\u0000\u0114\u0108\u0001"+ - "\u0000\u0000\u0000\u0114\u0109\u0001\u0000\u0000\u0000\u0114\u010a\u0001"+ - "\u0000\u0000\u0000\u0114\u010b\u0001\u0000\u0000\u0000\u0114\u010c\u0001"+ - "\u0000\u0000\u0000\u0114\u010d\u0001\u0000\u0000\u0000\u0114\u010e\u0001"+ - "\u0000\u0000\u0000\u0114\u0110\u0001\u0000\u0000\u0000\u0114\u0112\u0001"+ - "\u0000\u0000\u0000\u0115\t\u0001\u0000\u0000\u0000\u0116\u0117\u0005\u0011"+ - "\u0000\u0000\u0117\u0118\u0003\u0096K\u0000\u0118\u000b\u0001\u0000\u0000"+ - "\u0000\u0119\u011a\u0003>\u001f\u0000\u011a\r\u0001\u0000\u0000\u0000"+ - "\u011b\u011c\u0005\r\u0000\u0000\u011c\u011d\u0003\u0010\b\u0000\u011d"+ - "\u000f\u0001\u0000\u0000\u0000\u011e\u0123\u0003\u0012\t\u0000\u011f\u0120"+ - "\u0005@\u0000\u0000\u0120\u0122\u0003\u0012\t\u0000\u0121\u011f\u0001"+ - "\u0000\u0000\u0000\u0122\u0125\u0001\u0000\u0000\u0000\u0123\u0121\u0001"+ - "\u0000\u0000\u0000\u0123\u0124\u0001\u0000\u0000\u0000\u0124\u0011\u0001"+ - "\u0000\u0000\u0000\u0125\u0123\u0001\u0000\u0000\u0000\u0126\u0127\u0003"+ - "4\u001a\u0000\u0127\u0128\u0005;\u0000\u0000\u0128\u012a\u0001\u0000\u0000"+ - "\u0000\u0129\u0126\u0001\u0000\u0000\u0000\u0129\u012a\u0001\u0000\u0000"+ - "\u0000\u012a\u012b\u0001\u0000\u0000\u0000\u012b\u012c\u0003\u0096K\u0000"+ - "\u012c\u0013\u0001\u0000\u0000\u0000\u012d\u012e\u0005\u0012\u0000\u0000"+ - "\u012e\u012f\u0003\u001a\r\u0000\u012f\u0015\u0001\u0000\u0000\u0000\u0130"+ - "\u0131\u0005\u0013\u0000\u0000\u0131\u0132\u0003\u001a\r\u0000\u0132\u0017"+ - "\u0001\u0000\u0000\u0000\u0133\u0134\u0005\u0014\u0000\u0000\u0134\u0135"+ - "\u0003H$\u0000\u0135\u0136\u0003^/\u0000\u0136\u0019\u0001\u0000\u0000"+ - "\u0000\u0137\u013c\u0003\u001c\u000e\u0000\u0138\u0139\u0005@\u0000\u0000"+ - "\u0139\u013b\u0003\u001c\u000e\u0000\u013a\u0138\u0001\u0000\u0000\u0000"+ - "\u013b\u013e\u0001\u0000\u0000\u0000\u013c\u013a\u0001\u0000\u0000\u0000"+ - "\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u0140\u0001\u0000\u0000\u0000"+ - "\u013e\u013c\u0001\u0000\u0000\u0000\u013f\u0141\u0003*\u0015\u0000\u0140"+ - "\u013f\u0001\u0000\u0000\u0000\u0140\u0141\u0001\u0000\u0000\u0000\u0141"+ - "\u001b\u0001\u0000\u0000\u0000\u0142\u0146\u0003 \u0010\u0000\u0143\u0144"+ - "\u0004\u000e\u0006\u0000\u0144\u0146\u0003\u001e\u000f\u0000\u0145\u0142"+ - "\u0001\u0000\u0000\u0000\u0145\u0143\u0001\u0000\u0000\u0000\u0146\u001d"+ - "\u0001\u0000\u0000\u0000\u0147\u0148\u0005e\u0000\u0000\u0148\u014d\u0003"+ - "\u0014\n\u0000\u0149\u014a\u00055\u0000\u0000\u014a\u014c\u0003\b\u0004"+ - "\u0000\u014b\u0149\u0001\u0000\u0000\u0000\u014c\u014f\u0001\u0000\u0000"+ - "\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014d\u014e\u0001\u0000\u0000"+ - "\u0000\u014e\u0150\u0001\u0000\u0000\u0000\u014f\u014d\u0001\u0000\u0000"+ - "\u0000\u0150\u0151\u0005f\u0000\u0000\u0151\u001f\u0001\u0000\u0000\u0000"+ - "\u0152\u0153\u0003\"\u0011\u0000\u0153\u0154\u0005>\u0000\u0000\u0154"+ - "\u0156\u0001\u0000\u0000\u0000\u0155\u0152\u0001\u0000\u0000\u0000\u0155"+ - "\u0156\u0001\u0000\u0000\u0000\u0156\u0157\u0001\u0000\u0000\u0000\u0157"+ - "\u015a\u0003&\u0013\u0000\u0158\u0159\u0005=\u0000\u0000\u0159\u015b\u0003"+ - "$\u0012\u0000\u015a\u0158\u0001\u0000\u0000\u0000\u015a\u015b\u0001\u0000"+ - "\u0000\u0000\u015b\u015e\u0001\u0000\u0000\u0000\u015c\u015e\u0003(\u0014"+ - "\u0000\u015d\u0155\u0001\u0000\u0000\u0000\u015d\u015c\u0001\u0000\u0000"+ - "\u0000\u015e!\u0001\u0000\u0000\u0000\u015f\u0160\u0005m\u0000\u0000\u0160"+ - "#\u0001\u0000\u0000\u0000\u0161\u0162\u0005m\u0000\u0000\u0162%\u0001"+ - "\u0000\u0000\u0000\u0163\u0164\u0005m\u0000\u0000\u0164\'\u0001\u0000"+ - "\u0000\u0000\u0165\u0166\u0007\u0000\u0000\u0000\u0166)\u0001\u0000\u0000"+ - "\u0000\u0167\u0168\u0005l\u0000\u0000\u0168\u016d\u0005m\u0000\u0000\u0169"+ - "\u016a\u0005@\u0000\u0000\u016a\u016c\u0005m\u0000\u0000\u016b\u0169\u0001"+ - "\u0000\u0000\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016b\u0001"+ - "\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e+\u0001\u0000"+ - "\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0171\u0005\t\u0000"+ - "\u0000\u0171\u0172\u0003\u0010\b\u0000\u0172-\u0001\u0000\u0000\u0000"+ - "\u0173\u0175\u0005\u0010\u0000\u0000\u0174\u0176\u00030\u0018\u0000\u0175"+ - "\u0174\u0001\u0000\u0000\u0000\u0175\u0176\u0001\u0000\u0000\u0000\u0176"+ - "\u0179\u0001\u0000\u0000\u0000\u0177\u0178\u0005<\u0000\u0000\u0178\u017a"+ - "\u0003\u0010\b\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u0179\u017a\u0001"+ - "\u0000\u0000\u0000\u017a/\u0001\u0000\u0000\u0000\u017b\u0180\u00032\u0019"+ - "\u0000\u017c\u017d\u0005@\u0000\u0000\u017d\u017f\u00032\u0019\u0000\u017e"+ - "\u017c\u0001\u0000\u0000\u0000\u017f\u0182\u0001\u0000\u0000\u0000\u0180"+ - "\u017e\u0001\u0000\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000\u0181"+ - "1\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0186"+ - "\u0003\u0012\t\u0000\u0184\u0185\u0005\u0011\u0000\u0000\u0185\u0187\u0003"+ - "\u0096K\u0000\u0186\u0184\u0001\u0000\u0000\u0000\u0186\u0187\u0001\u0000"+ - "\u0000\u0000\u01873\u0001\u0000\u0000\u0000\u0188\u0189\u0004\u001a\u0007"+ - "\u0000\u0189\u018b\u0005c\u0000\u0000\u018a\u018c\u0005g\u0000\u0000\u018b"+ - "\u018a\u0001\u0000\u0000\u0000\u018b\u018c\u0001\u0000\u0000\u0000\u018c"+ - "\u018d\u0001\u0000\u0000\u0000\u018d\u018e\u0005d\u0000\u0000\u018e\u018f"+ - "\u0005B\u0000\u0000\u018f\u0190\u0005c\u0000\u0000\u0190\u0191\u00036"+ - "\u001b\u0000\u0191\u0192\u0005d\u0000\u0000\u0192\u0195\u0001\u0000\u0000"+ - "\u0000\u0193\u0195\u00036\u001b\u0000\u0194\u0188\u0001\u0000\u0000\u0000"+ - "\u0194\u0193\u0001\u0000\u0000\u0000\u01955\u0001\u0000\u0000\u0000\u0196"+ - "\u019b\u0003F#\u0000\u0197\u0198\u0005B\u0000\u0000\u0198\u019a\u0003"+ - "F#\u0000\u0199\u0197\u0001\u0000\u0000\u0000\u019a\u019d\u0001\u0000\u0000"+ - "\u0000\u019b\u0199\u0001\u0000\u0000\u0000\u019b\u019c\u0001\u0000\u0000"+ - "\u0000\u019c7\u0001\u0000\u0000\u0000\u019d\u019b\u0001\u0000\u0000\u0000"+ - "\u019e\u019f\u0004\u001c\b\u0000\u019f\u01a1\u0005c\u0000\u0000\u01a0"+ - "\u01a2\u0005\u0090\u0000\u0000\u01a1\u01a0\u0001\u0000\u0000\u0000\u01a1"+ - "\u01a2\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000\u0000\u0000\u01a3"+ - "\u01a4\u0005d\u0000\u0000\u01a4\u01a5\u0005B\u0000\u0000\u01a5\u01a6\u0005"+ - "c\u0000\u0000\u01a6\u01a7\u0003:\u001d\u0000\u01a7\u01a8\u0005d\u0000"+ - "\u0000\u01a8\u01ab\u0001\u0000\u0000\u0000\u01a9\u01ab\u0003:\u001d\u0000"+ - "\u01aa\u019e\u0001\u0000\u0000\u0000\u01aa\u01a9\u0001\u0000\u0000\u0000"+ - "\u01ab9\u0001\u0000\u0000\u0000\u01ac\u01b1\u0003@ \u0000\u01ad\u01ae"+ - "\u0005B\u0000\u0000\u01ae\u01b0\u0003@ \u0000\u01af\u01ad\u0001\u0000"+ - "\u0000\u0000\u01b0\u01b3\u0001\u0000\u0000\u0000\u01b1\u01af\u0001\u0000"+ - "\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2;\u0001\u0000\u0000"+ - "\u0000\u01b3\u01b1\u0001\u0000\u0000\u0000\u01b4\u01b9\u00038\u001c\u0000"+ - "\u01b5\u01b6\u0005@\u0000\u0000\u01b6\u01b8\u00038\u001c\u0000\u01b7\u01b5"+ - "\u0001\u0000\u0000\u0000\u01b8\u01bb\u0001\u0000\u0000\u0000\u01b9\u01b7"+ - "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba=\u0001"+ - "\u0000\u0000\u0000\u01bb\u01b9\u0001\u0000\u0000\u0000\u01bc\u01bd\u0007"+ - "\u0001\u0000\u0000\u01bd?\u0001\u0000\u0000\u0000\u01be\u01c2\u0005\u0090"+ - "\u0000\u0000\u01bf\u01c2\u0003B!\u0000\u01c0\u01c2\u0003D\"\u0000\u01c1"+ - "\u01be\u0001\u0000\u0000\u0000\u01c1\u01bf\u0001\u0000\u0000\u0000\u01c1"+ - "\u01c0\u0001\u0000\u0000\u0000\u01c2A\u0001\u0000\u0000\u0000\u01c3\u01c6"+ - "\u0005N\u0000\u0000\u01c4\u01c6\u0005a\u0000\u0000\u01c5\u01c3\u0001\u0000"+ - "\u0000\u0000\u01c5\u01c4\u0001\u0000\u0000\u0000\u01c6C\u0001\u0000\u0000"+ - "\u0000\u01c7\u01ca\u0005`\u0000\u0000\u01c8\u01ca\u0005b\u0000\u0000\u01c9"+ - "\u01c7\u0001\u0000\u0000\u0000\u01c9\u01c8\u0001\u0000\u0000\u0000\u01ca"+ - "E\u0001\u0000\u0000\u0000\u01cb\u01cf\u0003>\u001f\u0000\u01cc\u01cf\u0003"+ - "B!\u0000\u01cd\u01cf\u0003D\"\u0000\u01ce\u01cb\u0001\u0000\u0000\u0000"+ - "\u01ce\u01cc\u0001\u0000\u0000\u0000\u01ce\u01cd\u0001\u0000\u0000\u0000"+ - "\u01cfG\u0001\u0000\u0000\u0000\u01d0\u01d3\u0003\u00b6[\u0000\u01d1\u01d3"+ - "\u0003B!\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d1\u0001\u0000"+ - "\u0000\u0000\u01d3I\u0001\u0000\u0000\u0000\u01d4\u01d5\u0005\u000b\u0000"+ - "\u0000\u01d5\u01d6\u0003\u00acV\u0000\u01d6K\u0001\u0000\u0000\u0000\u01d7"+ - "\u01d8\u0005\u000f\u0000\u0000\u01d8\u01dd\u0003N\'\u0000\u01d9\u01da"+ - "\u0005@\u0000\u0000\u01da\u01dc\u0003N\'\u0000\u01db\u01d9\u0001\u0000"+ - "\u0000\u0000\u01dc\u01df\u0001\u0000\u0000\u0000\u01dd\u01db\u0001\u0000"+ - "\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01deM\u0001\u0000\u0000"+ - "\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01e0\u01e2\u0003\u0096K\u0000"+ - "\u01e1\u01e3\u0007\u0002\u0000\u0000\u01e2\u01e1\u0001\u0000\u0000\u0000"+ - "\u01e2\u01e3\u0001\u0000\u0000\u0000\u01e3\u01e6\u0001\u0000\u0000\u0000"+ - "\u01e4\u01e5\u0005K\u0000\u0000\u01e5\u01e7\u0007\u0003\u0000\u0000\u01e6"+ - "\u01e4\u0001\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7"+ - "O\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005!\u0000\u0000\u01e9\u01ea\u0003"+ - "<\u001e\u0000\u01eaQ\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005 \u0000"+ - "\u0000\u01ec\u01ed\u0003<\u001e\u0000\u01edS\u0001\u0000\u0000\u0000\u01ee"+ - "\u01ef\u0005$\u0000\u0000\u01ef\u01f4\u0003V+\u0000\u01f0\u01f1\u0005"+ - "@\u0000\u0000\u01f1\u01f3\u0003V+\u0000\u01f2\u01f0\u0001\u0000\u0000"+ - "\u0000\u01f3\u01f6\u0001\u0000\u0000\u0000\u01f4\u01f2\u0001\u0000\u0000"+ - "\u0000\u01f4\u01f5\u0001\u0000\u0000\u0000\u01f5U\u0001\u0000\u0000\u0000"+ - "\u01f6\u01f4\u0001\u0000\u0000\u0000\u01f7\u01f8\u00038\u001c\u0000\u01f8"+ - "\u01f9\u0005\u009a\u0000\u0000\u01f9\u01fa\u00038\u001c\u0000\u01fa\u0200"+ - "\u0001\u0000\u0000\u0000\u01fb\u01fc\u00038\u001c\u0000\u01fc\u01fd\u0005"+ - ";\u0000\u0000\u01fd\u01fe\u00038\u001c\u0000\u01fe\u0200\u0001\u0000\u0000"+ - "\u0000\u01ff\u01f7\u0001\u0000\u0000\u0000\u01ff\u01fb\u0001\u0000\u0000"+ - "\u0000\u0200W\u0001\u0000\u0000\u0000\u0201\u0202\u0005\b\u0000\u0000"+ - "\u0202\u0203\u0003\u00a0P\u0000\u0203\u0205\u0003\u00b6[\u0000\u0204\u0206"+ - "\u0003Z-\u0000\u0205\u0204\u0001\u0000\u0000\u0000\u0205\u0206\u0001\u0000"+ - "\u0000\u0000\u0206Y\u0001\u0000\u0000\u0000\u0207\u020c\u0003\\.\u0000"+ - "\u0208\u0209\u0005@\u0000\u0000\u0209\u020b\u0003\\.\u0000\u020a\u0208"+ - "\u0001\u0000\u0000\u0000\u020b\u020e\u0001\u0000\u0000\u0000\u020c\u020a"+ - "\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000\u0000\u0000\u020d[\u0001"+ - "\u0000\u0000\u0000\u020e\u020c\u0001\u0000\u0000\u0000\u020f\u0210\u0003"+ - ">\u001f\u0000\u0210\u0211\u0005;\u0000\u0000\u0211\u0212\u0003\u00acV"+ - "\u0000\u0212]\u0001\u0000\u0000\u0000\u0213\u0214\u0005Q\u0000\u0000\u0214"+ - "\u0216\u0003\u00a6S\u0000\u0215\u0213\u0001\u0000\u0000\u0000\u0215\u0216"+ - "\u0001\u0000\u0000\u0000\u0216_\u0001\u0000\u0000\u0000\u0217\u0218\u0005"+ - "\n\u0000\u0000\u0218\u0219\u0003\u00a0P\u0000\u0219\u021e\u0003\u00b6"+ - "[\u0000\u021a\u021b\u0005@\u0000\u0000\u021b\u021d\u0003\u00b6[\u0000"+ - "\u021c\u021a\u0001\u0000\u0000\u0000\u021d\u0220\u0001\u0000\u0000\u0000"+ - "\u021e\u021c\u0001\u0000\u0000\u0000\u021e\u021f\u0001\u0000\u0000\u0000"+ - "\u021fa\u0001\u0000\u0000\u0000\u0220\u021e\u0001\u0000\u0000\u0000\u0221"+ - "\u0222\u0005\u001f\u0000\u0000\u0222\u0223\u00034\u001a\u0000\u0223c\u0001"+ - "\u0000\u0000\u0000\u0224\u0225\u0005\u0006\u0000\u0000\u0225\u0226\u0003"+ - "f3\u0000\u0226e\u0001\u0000\u0000\u0000\u0227\u0228\u0005e\u0000\u0000"+ - "\u0228\u0229\u0003\u0004\u0002\u0000\u0229\u022a\u0005f\u0000\u0000\u022a"+ - "g\u0001\u0000\u0000\u0000\u022b\u022c\u0005&\u0000\u0000\u022c\u022d\u0005"+ - "\u00a1\u0000\u0000\u022di\u0001\u0000\u0000\u0000\u022e\u022f\u0005\u0005"+ - "\u0000\u0000\u022f\u0232\u0003l6\u0000\u0230\u0231\u0005L\u0000\u0000"+ - "\u0231\u0233\u00038\u001c\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232"+ - "\u0233\u0001\u0000\u0000\u0000\u0233\u023d\u0001\u0000\u0000\u0000\u0234"+ - "\u0235\u0005Q\u0000\u0000\u0235\u023a\u0003n7\u0000\u0236\u0237\u0005"+ - "@\u0000\u0000\u0237\u0239\u0003n7\u0000\u0238\u0236\u0001\u0000\u0000"+ - "\u0000\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000"+ - "\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b\u023e\u0001\u0000\u0000"+ - "\u0000\u023c\u023a\u0001\u0000\u0000\u0000\u023d\u0234\u0001\u0000\u0000"+ - "\u0000\u023d\u023e\u0001\u0000\u0000\u0000\u023ek\u0001\u0000\u0000\u0000"+ - "\u023f\u0240\u0007\u0004\u0000\u0000\u0240m\u0001\u0000\u0000\u0000\u0241"+ - "\u0242\u00038\u001c\u0000\u0242\u0243\u0005;\u0000\u0000\u0243\u0245\u0001"+ - "\u0000\u0000\u0000\u0244\u0241\u0001\u0000\u0000\u0000\u0244\u0245\u0001"+ - "\u0000\u0000\u0000\u0245\u0246\u0001\u0000\u0000\u0000\u0246\u0247\u0003"+ - "8\u001c\u0000\u0247o\u0001\u0000\u0000\u0000\u0248\u0249\u0005\u000e\u0000"+ - "\u0000\u0249\u024a\u0003\u00acV\u0000\u024aq\u0001\u0000\u0000\u0000\u024b"+ - "\u024c\u0005\u0004\u0000\u0000\u024c\u024f\u00034\u001a\u0000\u024d\u024e"+ - "\u0005L\u0000\u0000\u024e\u0250\u00034\u001a\u0000\u024f\u024d\u0001\u0000"+ - "\u0000\u0000\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u0256\u0001\u0000"+ - "\u0000\u0000\u0251\u0252\u0005\u009a\u0000\u0000\u0252\u0253\u00034\u001a"+ - "\u0000\u0253\u0254\u0005@\u0000\u0000\u0254\u0255\u00034\u001a\u0000\u0255"+ - "\u0257\u0001\u0000\u0000\u0000\u0256\u0251\u0001\u0000\u0000\u0000\u0256"+ - "\u0257\u0001\u0000\u0000\u0000\u0257s\u0001\u0000\u0000\u0000\u0258\u0259"+ - "\u0005\u0015\u0000\u0000\u0259\u025a\u0003v;\u0000\u025au\u0001\u0000"+ - "\u0000\u0000\u025b\u025d\u0003x<\u0000\u025c\u025b\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025c\u0001\u0000\u0000\u0000"+ - "\u025e\u025f\u0001\u0000\u0000\u0000\u025fw\u0001\u0000\u0000\u0000\u0260"+ - "\u0261\u0005e\u0000\u0000\u0261\u0262\u0003z=\u0000\u0262\u0263\u0005"+ - "f\u0000\u0000\u0263y\u0001\u0000\u0000\u0000\u0264\u0265\u0006=\uffff"+ - "\uffff\u0000\u0265\u0266\u0003|>\u0000\u0266\u026c\u0001\u0000\u0000\u0000"+ - "\u0267\u0268\n\u0001\u0000\u0000\u0268\u0269\u00055\u0000\u0000\u0269"+ - "\u026b\u0003|>\u0000\u026a\u0267\u0001\u0000\u0000\u0000\u026b\u026e\u0001"+ - "\u0000\u0000\u0000\u026c\u026a\u0001\u0000\u0000\u0000\u026c\u026d\u0001"+ - "\u0000\u0000\u0000\u026d{\u0001\u0000\u0000\u0000\u026e\u026c\u0001\u0000"+ - "\u0000\u0000\u026f\u0270\u0003\b\u0004\u0000\u0270}\u0001\u0000\u0000"+ - "\u0000\u0271\u0275\u0005\f\u0000\u0000\u0272\u0273\u00034\u001a\u0000"+ - "\u0273\u0274\u0005;\u0000\u0000\u0274\u0276\u0001\u0000\u0000\u0000\u0275"+ - "\u0272\u0001\u0000\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000\u0276"+ - "\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0003\u00acV\u0000\u0278\u0279"+ - "\u0005L\u0000\u0000\u0279\u027a\u0003\u0010\b\u0000\u027a\u027b\u0003"+ - "^/\u0000\u027b\u007f\u0001\u0000\u0000\u0000\u027c\u0280\u0005\u0007\u0000"+ - "\u0000\u027d\u027e\u00034\u001a\u0000\u027e\u027f\u0005;\u0000\u0000\u027f"+ - "\u0281\u0001\u0000\u0000\u0000\u0280\u027d\u0001\u0000\u0000\u0000\u0280"+ - "\u0281\u0001\u0000\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282"+ - "\u0283\u0003\u00a0P\u0000\u0283\u0284\u0003^/\u0000\u0284\u0081\u0001"+ - "\u0000\u0000\u0000\u0285\u0286\u0005\u0017\u0000\u0000\u0286\u0287\u0005"+ - "z\u0000\u0000\u0287\u028a\u00030\u0018\u0000\u0288\u0289\u0005<\u0000"+ - "\u0000\u0289\u028b\u0003\u0010\b\u0000\u028a\u0288\u0001\u0000\u0000\u0000"+ - "\u028a\u028b\u0001\u0000\u0000\u0000\u028b\u0293\u0001\u0000\u0000\u0000"+ - "\u028c\u028d\u0005\u0018\u0000\u0000\u028d\u0290\u00030\u0018\u0000\u028e"+ - "\u028f\u0005<\u0000\u0000\u028f\u0291\u0003\u0010\b\u0000\u0290\u028e"+ - "\u0001\u0000\u0000\u0000\u0290\u0291\u0001\u0000\u0000\u0000\u0291\u0293"+ - "\u0001\u0000\u0000\u0000\u0292\u0285\u0001\u0000\u0000\u0000\u0292\u028c"+ - "\u0001\u0000\u0000\u0000\u0293\u0083\u0001\u0000\u0000\u0000\u0294\u0296"+ - "\u0005\u0016\u0000\u0000\u0295\u0297\u0003>\u001f\u0000\u0296\u0295\u0001"+ - "\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000\u0000\u0297\u029b\u0001"+ - "\u0000\u0000\u0000\u0298\u029a\u0003\u0086C\u0000\u0299\u0298\u0001\u0000"+ - "\u0000\u0000\u029a\u029d\u0001\u0000\u0000\u0000\u029b\u0299\u0001\u0000"+ - "\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u0085\u0001\u0000"+ - "\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029e\u029f\u0005u\u0000"+ - "\u0000\u029f\u02a0\u0005<\u0000\u0000\u02a0\u02aa\u00034\u001a\u0000\u02a1"+ - "\u02a2\u0005v\u0000\u0000\u02a2\u02a3\u0005<\u0000\u0000\u02a3\u02aa\u0003"+ - "\u0088D\u0000\u02a4\u02a5\u0005t\u0000\u0000\u02a5\u02a6\u0005<\u0000"+ - "\u0000\u02a6\u02aa\u00034\u001a\u0000\u02a7\u02a8\u0005Q\u0000\u0000\u02a8"+ - "\u02aa\u0003\u00a6S\u0000\u02a9\u029e\u0001\u0000\u0000\u0000\u02a9\u02a1"+ - "\u0001\u0000\u0000\u0000\u02a9\u02a4\u0001\u0000\u0000\u0000\u02a9\u02a7"+ - "\u0001\u0000\u0000\u0000\u02aa\u0087\u0001\u0000\u0000\u0000\u02ab\u02b0"+ - "\u00034\u001a\u0000\u02ac\u02ad\u0005@\u0000\u0000\u02ad\u02af\u00034"+ - "\u001a\u0000\u02ae\u02ac\u0001\u0000\u0000\u0000\u02af\u02b2\u0001\u0000"+ - "\u0000\u0000\u02b0\u02ae\u0001\u0000\u0000\u0000\u02b0\u02b1\u0001\u0000"+ - "\u0000\u0000\u02b1\u0089\u0001\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000"+ - "\u0000\u0000\u02b3\u02b4\u0005\u001d\u0000\u0000\u02b4\u02b5\u0003 \u0010"+ - "\u0000\u02b5\u02b6\u0005L\u0000\u0000\u02b6\u02b7\u0003<\u001e\u0000\u02b7"+ - "\u008b\u0001\u0000\u0000\u0000\u02b8\u02b9\u0005\"\u0000\u0000\u02b9\u02ba"+ - "\u0003<\u001e\u0000\u02ba\u008d\u0001\u0000\u0000\u0000\u02bb\u02bc\u0005"+ - "%\u0000\u0000\u02bc\u02bd\u0003\u0090H\u0000\u02bd\u02be\u0005?\u0000"+ - "\u0000\u02be\u008f\u0001\u0000\u0000\u0000\u02bf\u02c0\u0003>\u001f\u0000"+ - "\u02c0\u02c3\u0005;\u0000\u0000\u02c1\u02c4\u0003\u00acV\u0000\u02c2\u02c4"+ - "\u0003\u00a6S\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3\u02c2\u0001"+ - "\u0000\u0000\u0000\u02c4\u0091\u0001\u0000\u0000\u0000\u02c5\u02c7\u0005"+ - "\u001e\u0000\u0000\u02c6\u02c8\u0003\u0094J\u0000\u02c7\u02c6\u0001\u0000"+ - "\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000"+ - "\u0000\u0000\u02c9\u02ca\u0005L\u0000\u0000\u02ca\u02cb\u00034\u001a\u0000"+ - "\u02cb\u02cc\u0005\u0089\u0000\u0000\u02cc\u02cd\u0003\u00b4Z\u0000\u02cd"+ - "\u02ce\u0003^/\u0000\u02ce\u0093\u0001\u0000\u0000\u0000\u02cf\u02d2\u0003"+ - "B!\u0000\u02d0\u02d2\u0003\u00a0P\u0000\u02d1\u02cf\u0001\u0000\u0000"+ - "\u0000\u02d1\u02d0\u0001\u0000\u0000\u0000\u02d2\u0095\u0001\u0000\u0000"+ - "\u0000\u02d3\u02d4\u0006K\uffff\uffff\u0000\u02d4\u02d5\u0005I\u0000\u0000"+ - "\u02d5\u02f1\u0003\u0096K\b\u02d6\u02f1\u0003\u009cN\u0000\u02d7\u02f1"+ - "\u0003\u0098L\u0000\u02d8\u02da\u0003\u009cN\u0000\u02d9\u02db\u0005I"+ - "\u0000\u0000\u02da\u02d9\u0001\u0000\u0000\u0000\u02da\u02db\u0001\u0000"+ - "\u0000\u0000\u02db\u02dc\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005E\u0000"+ - "\u0000\u02dd\u02de\u0005e\u0000\u0000\u02de\u02e3\u0003\u009cN\u0000\u02df"+ - "\u02e0\u0005@\u0000\u0000\u02e0\u02e2\u0003\u009cN\u0000\u02e1\u02df\u0001"+ - "\u0000\u0000\u0000\u02e2\u02e5\u0001\u0000\u0000\u0000\u02e3\u02e1\u0001"+ - "\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e6\u0001"+ - "\u0000\u0000\u0000\u02e5\u02e3\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005"+ - "f\u0000\u0000\u02e7\u02f1\u0001\u0000\u0000\u0000\u02e8\u02e9\u0003\u009c"+ - "N\u0000\u02e9\u02eb\u0005F\u0000\u0000\u02ea\u02ec\u0005I\u0000\u0000"+ - "\u02eb\u02ea\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001\u0000\u0000\u0000"+ - "\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee\u0005J\u0000\u0000\u02ee"+ - "\u02f1\u0001\u0000\u0000\u0000\u02ef\u02f1\u0003\u009aM\u0000\u02f0\u02d3"+ - "\u0001\u0000\u0000\u0000\u02f0\u02d6\u0001\u0000\u0000\u0000\u02f0\u02d7"+ - "\u0001\u0000\u0000\u0000\u02f0\u02d8\u0001\u0000\u0000\u0000\u02f0\u02e8"+ - "\u0001\u0000\u0000\u0000\u02f0\u02ef\u0001\u0000\u0000\u0000\u02f1\u02fa"+ - "\u0001\u0000\u0000\u0000\u02f2\u02f3\n\u0005\u0000\u0000\u02f3\u02f4\u0005"+ - "9\u0000\u0000\u02f4\u02f9\u0003\u0096K\u0006\u02f5\u02f6\n\u0004\u0000"+ - "\u0000\u02f6\u02f7\u0005M\u0000\u0000\u02f7\u02f9\u0003\u0096K\u0005\u02f8"+ - "\u02f2\u0001\u0000\u0000\u0000\u02f8\u02f5\u0001\u0000\u0000\u0000\u02f9"+ - "\u02fc\u0001\u0000\u0000\u0000\u02fa\u02f8\u0001\u0000\u0000\u0000\u02fa"+ - "\u02fb\u0001\u0000\u0000\u0000\u02fb\u0097\u0001\u0000\u0000\u0000\u02fc"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02ff\u0003\u009cN\u0000\u02fe\u0300"+ - "\u0005I\u0000\u0000\u02ff\u02fe\u0001\u0000\u0000\u0000\u02ff\u0300\u0001"+ - "\u0000\u0000\u0000\u0300\u0301\u0001\u0000\u0000\u0000\u0301\u0302\u0005"+ - "H\u0000\u0000\u0302\u0303\u0003H$\u0000\u0303\u032c\u0001\u0000\u0000"+ - "\u0000\u0304\u0306\u0003\u009cN\u0000\u0305\u0307\u0005I\u0000\u0000\u0306"+ - "\u0305\u0001\u0000\u0000\u0000\u0306\u0307\u0001\u0000\u0000\u0000\u0307"+ - "\u0308\u0001\u0000\u0000\u0000\u0308\u0309\u0005O\u0000\u0000\u0309\u030a"+ - "\u0003H$\u0000\u030a\u032c\u0001\u0000\u0000\u0000\u030b\u030d\u0003\u009c"+ - "N\u0000\u030c\u030e\u0005I\u0000\u0000\u030d\u030c\u0001\u0000\u0000\u0000"+ - "\u030d\u030e\u0001\u0000\u0000\u0000\u030e\u030f\u0001\u0000\u0000\u0000"+ - "\u030f\u0310\u0005H\u0000\u0000\u0310\u0311\u0005e\u0000\u0000\u0311\u0316"+ - "\u0003H$\u0000\u0312\u0313\u0005@\u0000\u0000\u0313\u0315\u0003H$\u0000"+ - "\u0314\u0312\u0001\u0000\u0000\u0000\u0315\u0318\u0001\u0000\u0000\u0000"+ - "\u0316\u0314\u0001\u0000\u0000\u0000\u0316\u0317\u0001\u0000\u0000\u0000"+ - "\u0317\u0319\u0001\u0000\u0000\u0000\u0318\u0316\u0001\u0000\u0000\u0000"+ - "\u0319\u031a\u0005f\u0000\u0000\u031a\u032c\u0001\u0000\u0000\u0000\u031b"+ - "\u031d\u0003\u009cN\u0000\u031c\u031e\u0005I\u0000\u0000\u031d\u031c\u0001"+ - "\u0000\u0000\u0000\u031d\u031e\u0001\u0000\u0000\u0000\u031e\u031f\u0001"+ - "\u0000\u0000\u0000\u031f\u0320\u0005O\u0000\u0000\u0320\u0321\u0005e\u0000"+ - "\u0000\u0321\u0326\u0003H$\u0000\u0322\u0323\u0005@\u0000\u0000\u0323"+ - "\u0325\u0003H$\u0000\u0324\u0322\u0001\u0000\u0000\u0000\u0325\u0328\u0001"+ - "\u0000\u0000\u0000\u0326\u0324\u0001\u0000\u0000\u0000\u0326\u0327\u0001"+ - "\u0000\u0000\u0000\u0327\u0329\u0001\u0000\u0000\u0000\u0328\u0326\u0001"+ - "\u0000\u0000\u0000\u0329\u032a\u0005f\u0000\u0000\u032a\u032c\u0001\u0000"+ - "\u0000\u0000\u032b\u02fd\u0001\u0000\u0000\u0000\u032b\u0304\u0001\u0000"+ - "\u0000\u0000\u032b\u030b\u0001\u0000\u0000\u0000\u032b\u031b\u0001\u0000"+ - "\u0000\u0000\u032c\u0099\u0001\u0000\u0000\u0000\u032d\u0330\u00034\u001a"+ - "\u0000\u032e\u032f\u0005=\u0000\u0000\u032f\u0331\u0003\f\u0006\u0000"+ - "\u0330\u032e\u0001\u0000\u0000\u0000\u0330\u0331\u0001\u0000\u0000\u0000"+ - "\u0331\u0332\u0001\u0000\u0000\u0000\u0332\u0333\u0005>\u0000\u0000\u0333"+ - "\u0334\u0003\u00acV\u0000\u0334\u009b\u0001\u0000\u0000\u0000\u0335\u033b"+ - "\u0003\u009eO\u0000\u0336\u0337\u0003\u009eO\u0000\u0337\u0338\u0003\u00b8"+ - "\\\u0000\u0338\u0339\u0003\u009eO\u0000\u0339\u033b\u0001\u0000\u0000"+ - "\u0000\u033a\u0335\u0001\u0000\u0000\u0000\u033a\u0336\u0001\u0000\u0000"+ - "\u0000\u033b\u009d\u0001\u0000\u0000\u0000\u033c\u033d\u0006O\uffff\uffff"+ - "\u0000\u033d\u0341\u0003\u00a0P\u0000\u033e\u033f\u0007\u0005\u0000\u0000"+ - "\u033f\u0341\u0003\u009eO\u0003\u0340\u033c\u0001\u0000\u0000\u0000\u0340"+ - "\u033e\u0001\u0000\u0000\u0000\u0341\u034a\u0001\u0000\u0000\u0000\u0342"+ - "\u0343\n\u0002\u0000\u0000\u0343\u0344\u0007\u0006\u0000\u0000\u0344\u0349"+ - "\u0003\u009eO\u0003\u0345\u0346\n\u0001\u0000\u0000\u0346\u0347\u0007"+ - "\u0005\u0000\u0000\u0347\u0349\u0003\u009eO\u0002\u0348\u0342\u0001\u0000"+ - "\u0000\u0000\u0348\u0345\u0001\u0000\u0000\u0000\u0349\u034c\u0001\u0000"+ - "\u0000\u0000\u034a\u0348\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000"+ - "\u0000\u0000\u034b\u009f\u0001\u0000\u0000\u0000\u034c\u034a\u0001\u0000"+ - "\u0000\u0000\u034d\u034e\u0006P\uffff\uffff\u0000\u034e\u0356\u0003\u00ac"+ - "V\u0000\u034f\u0356\u00034\u001a\u0000\u0350\u0356\u0003\u00a2Q\u0000"+ - "\u0351\u0352\u0005e\u0000\u0000\u0352\u0353\u0003\u0096K\u0000\u0353\u0354"+ - "\u0005f\u0000\u0000\u0354\u0356\u0001\u0000\u0000\u0000\u0355\u034d\u0001"+ - "\u0000\u0000\u0000\u0355\u034f\u0001\u0000\u0000\u0000\u0355\u0350\u0001"+ - "\u0000\u0000\u0000\u0355\u0351\u0001\u0000\u0000\u0000\u0356\u035c\u0001"+ - "\u0000\u0000\u0000\u0357\u0358\n\u0001\u0000\u0000\u0358\u0359\u0005="+ - "\u0000\u0000\u0359\u035b\u0003\f\u0006\u0000\u035a\u0357\u0001\u0000\u0000"+ - "\u0000\u035b\u035e\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+ - "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u00a1\u0001\u0000\u0000"+ - "\u0000\u035e\u035c\u0001\u0000\u0000\u0000\u035f\u0360\u0003\u00a4R\u0000"+ - "\u0360\u036e\u0005e\u0000\u0000\u0361\u036f\u0005[\u0000\u0000\u0362\u0367"+ - "\u0003\u0096K\u0000\u0363\u0364\u0005@\u0000\u0000\u0364\u0366\u0003\u0096"+ - "K\u0000\u0365\u0363\u0001\u0000\u0000\u0000\u0366\u0369\u0001\u0000\u0000"+ - "\u0000\u0367\u0365\u0001\u0000\u0000\u0000\u0367\u0368\u0001\u0000\u0000"+ - "\u0000\u0368\u036c\u0001\u0000\u0000\u0000\u0369\u0367\u0001\u0000\u0000"+ - "\u0000\u036a\u036b\u0005@\u0000\u0000\u036b\u036d\u0003\u00a6S\u0000\u036c"+ - "\u036a\u0001\u0000\u0000\u0000\u036c\u036d\u0001\u0000\u0000\u0000\u036d"+ - "\u036f\u0001\u0000\u0000\u0000\u036e\u0361\u0001\u0000\u0000\u0000\u036e"+ - "\u0362\u0001\u0000\u0000\u0000\u036e\u036f\u0001\u0000\u0000\u0000\u036f"+ - "\u0370\u0001\u0000\u0000\u0000\u0370\u0371\u0005f\u0000\u0000\u0371\u00a3"+ - "\u0001\u0000\u0000\u0000\u0372\u0376\u0003F#\u0000\u0373\u0376\u0005D"+ - "\u0000\u0000\u0374\u0376\u0005G\u0000\u0000\u0375\u0372\u0001\u0000\u0000"+ - "\u0000\u0375\u0373\u0001\u0000\u0000\u0000\u0375\u0374\u0001\u0000\u0000"+ - "\u0000\u0376\u00a5\u0001\u0000\u0000\u0000\u0377\u0380\u0005^\u0000\u0000"+ - "\u0378\u037d\u0003\u00a8T\u0000\u0379\u037a\u0005@\u0000\u0000\u037a\u037c"+ - "\u0003\u00a8T\u0000\u037b\u0379\u0001\u0000\u0000\u0000\u037c\u037f\u0001"+ - "\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000\u0000\u037d\u037e\u0001"+ - "\u0000\u0000\u0000\u037e\u0381\u0001\u0000\u0000\u0000\u037f\u037d\u0001"+ - "\u0000\u0000\u0000\u0380\u0378\u0001\u0000\u0000\u0000\u0380\u0381\u0001"+ - "\u0000\u0000\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383\u0005"+ - "_\u0000\u0000\u0383\u00a7\u0001\u0000\u0000\u0000\u0384\u0385\u0003\u00b6"+ - "[\u0000\u0385\u0386\u0005>\u0000\u0000\u0386\u0387\u0003\u00aaU\u0000"+ - "\u0387\u00a9\u0001\u0000\u0000\u0000\u0388\u038b\u0003\u00acV\u0000\u0389"+ - "\u038b\u0003\u00a6S\u0000\u038a\u0388\u0001\u0000\u0000\u0000\u038a\u0389"+ - "\u0001\u0000\u0000\u0000\u038b\u00ab\u0001\u0000\u0000\u0000\u038c\u03b7"+ - "\u0005J\u0000\u0000\u038d\u038e\u0003\u00b4Z\u0000\u038e\u038f\u0005g"+ - "\u0000\u0000\u038f\u03b7\u0001\u0000\u0000\u0000\u0390\u03b7\u0003\u00b2"+ - "Y\u0000\u0391\u03b7\u0003\u00b4Z\u0000\u0392\u03b7\u0003\u00aeW\u0000"+ - "\u0393\u03b7\u0003B!\u0000\u0394\u03b7\u0003\u00b6[\u0000\u0395\u0396"+ - "\u0005c\u0000\u0000\u0396\u039b\u0003\u00b0X\u0000\u0397\u0398\u0005@"+ - "\u0000\u0000\u0398\u039a\u0003\u00b0X\u0000\u0399\u0397\u0001\u0000\u0000"+ - "\u0000\u039a\u039d\u0001\u0000\u0000\u0000\u039b\u0399\u0001\u0000\u0000"+ - "\u0000\u039b\u039c\u0001\u0000\u0000\u0000\u039c\u039e\u0001\u0000\u0000"+ - "\u0000\u039d\u039b\u0001\u0000\u0000\u0000\u039e\u039f\u0005d\u0000\u0000"+ - "\u039f\u03b7\u0001\u0000\u0000\u0000\u03a0\u03a1\u0005c\u0000\u0000\u03a1"+ - "\u03a6\u0003\u00aeW\u0000\u03a2\u03a3\u0005@\u0000\u0000\u03a3\u03a5\u0003"+ - "\u00aeW\u0000\u03a4\u03a2\u0001\u0000\u0000\u0000\u03a5\u03a8\u0001\u0000"+ - "\u0000\u0000\u03a6\u03a4\u0001\u0000\u0000\u0000\u03a6\u03a7\u0001\u0000"+ - "\u0000\u0000\u03a7\u03a9\u0001\u0000\u0000\u0000\u03a8\u03a6\u0001\u0000"+ - "\u0000\u0000\u03a9\u03aa\u0005d\u0000\u0000\u03aa\u03b7\u0001\u0000\u0000"+ - "\u0000\u03ab\u03ac\u0005c\u0000\u0000\u03ac\u03b1\u0003\u00b6[\u0000\u03ad"+ - "\u03ae\u0005@\u0000\u0000\u03ae\u03b0\u0003\u00b6[\u0000\u03af\u03ad\u0001"+ - "\u0000\u0000\u0000\u03b0\u03b3\u0001\u0000\u0000\u0000\u03b1\u03af\u0001"+ - "\u0000\u0000\u0000\u03b1\u03b2\u0001\u0000\u0000\u0000\u03b2\u03b4\u0001"+ - "\u0000\u0000\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000\u03b4\u03b5\u0005"+ - "d\u0000\u0000\u03b5\u03b7\u0001\u0000\u0000\u0000\u03b6\u038c\u0001\u0000"+ - "\u0000\u0000\u03b6\u038d\u0001\u0000\u0000\u0000\u03b6\u0390\u0001\u0000"+ - "\u0000\u0000\u03b6\u0391\u0001\u0000\u0000\u0000\u03b6\u0392\u0001\u0000"+ - "\u0000\u0000\u03b6\u0393\u0001\u0000\u0000\u0000\u03b6\u0394\u0001\u0000"+ - "\u0000\u0000\u03b6\u0395\u0001\u0000\u0000\u0000\u03b6\u03a0\u0001\u0000"+ - "\u0000\u0000\u03b6\u03ab\u0001\u0000\u0000\u0000\u03b7\u00ad\u0001\u0000"+ - "\u0000\u0000\u03b8\u03b9\u0007\u0007\u0000\u0000\u03b9\u00af\u0001\u0000"+ - "\u0000\u0000\u03ba\u03bd\u0003\u00b2Y\u0000\u03bb\u03bd\u0003\u00b4Z\u0000"+ - "\u03bc\u03ba\u0001\u0000\u0000\u0000\u03bc\u03bb\u0001\u0000\u0000\u0000"+ - "\u03bd\u00b1\u0001\u0000\u0000\u0000\u03be\u03c0\u0007\u0005\u0000\u0000"+ - "\u03bf\u03be\u0001\u0000\u0000\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000"+ - "\u03c0\u03c1\u0001\u0000\u0000\u0000\u03c1\u03c2\u00058\u0000\u0000\u03c2"+ - "\u00b3\u0001\u0000\u0000\u0000\u03c3\u03c5\u0007\u0005\u0000\u0000\u03c4"+ - "\u03c3\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ - "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u00057\u0000\u0000\u03c7\u00b5"+ - "\u0001\u0000\u0000\u0000\u03c8\u03c9\u00056\u0000\u0000\u03c9\u00b7\u0001"+ - "\u0000\u0000\u0000\u03ca\u03cb\u0007\b\u0000\u0000\u03cb\u00b9\u0001\u0000"+ - "\u0000\u0000\u03cc\u03cd\u0007\t\u0000\u0000\u03cd\u03ce\u0005~\u0000"+ - "\u0000\u03ce\u03cf\u0003\u00bc^\u0000\u03cf\u03d0\u0003\u00be_\u0000\u03d0"+ - "\u00bb\u0001\u0000\u0000\u0000\u03d1\u03d2\u0004^\u000f\u0000\u03d2\u03d4"+ - "\u0003 \u0010\u0000\u03d3\u03d5\u0005\u009a\u0000\u0000\u03d4\u03d3\u0001"+ - "\u0000\u0000\u0000\u03d4\u03d5\u0001\u0000\u0000\u0000\u03d5\u03d6\u0001"+ - "\u0000\u0000\u0000\u03d6\u03d7\u0005m\u0000\u0000\u03d7\u03da\u0001\u0000"+ - "\u0000\u0000\u03d8\u03da\u0003 \u0010\u0000\u03d9\u03d1\u0001\u0000\u0000"+ - "\u0000\u03d9\u03d8\u0001\u0000\u0000\u0000\u03da\u00bd\u0001\u0000\u0000"+ - "\u0000\u03db\u03dc\u0005L\u0000\u0000\u03dc\u03e1\u0003\u0096K\u0000\u03dd"+ - "\u03de\u0005@\u0000\u0000\u03de\u03e0\u0003\u0096K\u0000\u03df\u03dd\u0001"+ - "\u0000\u0000\u0000\u03e0\u03e3\u0001\u0000\u0000\u0000\u03e1\u03df\u0001"+ - "\u0000\u0000\u0000\u03e1\u03e2\u0001\u0000\u0000\u0000\u03e2\u00bf\u0001"+ - "\u0000\u0000\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e4\u03e8\u0005"+ - "#\u0000\u0000\u03e5\u03e7\u0003\u00c4b\u0000\u03e6\u03e5\u0001\u0000\u0000"+ - "\u0000\u03e7\u03ea\u0001\u0000\u0000\u0000\u03e8\u03e6\u0001\u0000\u0000"+ - "\u0000\u03e8\u03e9\u0001\u0000\u0000\u0000\u03e9\u03ee\u0001\u0000\u0000"+ - "\u0000\u03ea\u03e8\u0001\u0000\u0000\u0000\u03eb\u03ec\u0003\u00c2a\u0000"+ - "\u03ec\u03ed\u0005;\u0000\u0000\u03ed\u03ef\u0001\u0000\u0000\u0000\u03ee"+ - "\u03eb\u0001\u0000\u0000\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000\u03ef"+ - "\u03f0\u0001\u0000\u0000\u0000\u03f0\u03f2\u0005e\u0000\u0000\u03f1\u03f3"+ - "\u0003\u00ccf\u0000\u03f2\u03f1\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001"+ - "\u0000\u0000\u0000\u03f4\u03f2\u0001\u0000\u0000\u0000\u03f4\u03f5\u0001"+ - "\u0000\u0000\u0000\u03f5\u03f6\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005"+ - "f\u0000\u0000\u03f7\u0405\u0001\u0000\u0000\u0000\u03f8\u03fc\u0005#\u0000"+ - "\u0000\u03f9\u03fb\u0003\u00c4b\u0000\u03fa\u03f9\u0001\u0000\u0000\u0000"+ - "\u03fb\u03fe\u0001\u0000\u0000\u0000\u03fc\u03fa\u0001\u0000\u0000\u0000"+ - "\u03fc\u03fd\u0001\u0000\u0000\u0000\u03fd\u0400\u0001\u0000\u0000\u0000"+ - "\u03fe\u03fc\u0001\u0000\u0000\u0000\u03ff\u0401\u0003\u00ccf\u0000\u0400"+ - "\u03ff\u0001\u0000\u0000\u0000\u0401\u0402\u0001\u0000\u0000\u0000\u0402"+ - "\u0400\u0001\u0000\u0000\u0000\u0402\u0403\u0001\u0000\u0000\u0000\u0403"+ - "\u0405\u0001\u0000\u0000\u0000\u0404\u03e4\u0001\u0000\u0000\u0000\u0404"+ - "\u03f8\u0001\u0000\u0000\u0000\u0405\u00c1\u0001\u0000\u0000\u0000\u0406"+ - "\u0407\u0007\u0001\u0000\u0000\u0407\u00c3\u0001\u0000\u0000\u0000\u0408"+ - "\u0409\u0003\u00c6c\u0000\u0409\u040a\u0005;\u0000\u0000\u040a\u040b\u0003"+ - "\u00c8d\u0000\u040b\u00c5\u0001\u0000\u0000\u0000\u040c\u040d\u0007\n"+ - "\u0000\u0000\u040d\u00c7\u0001\u0000\u0000\u0000\u040e\u0413\u0003\u00ce"+ - "g\u0000\u040f\u0410\u0005@\u0000\u0000\u0410\u0412\u0003\u00ceg\u0000"+ - "\u0411\u040f\u0001\u0000\u0000\u0000\u0412\u0415\u0001\u0000\u0000\u0000"+ - "\u0413\u0411\u0001\u0000\u0000\u0000\u0413\u0414\u0001\u0000\u0000\u0000"+ - "\u0414\u0419\u0001\u0000\u0000\u0000\u0415\u0413\u0001\u0000\u0000\u0000"+ - "\u0416\u0419\u0005h\u0000\u0000\u0417\u0419\u0005a\u0000\u0000\u0418\u040e"+ - "\u0001\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0418\u0417"+ - "\u0001\u0000\u0000\u0000\u0419\u00c9\u0001\u0000\u0000\u0000\u041a\u041b"+ - "\u0007\u000b\u0000\u0000\u041b\u00cb\u0001\u0000\u0000\u0000\u041c\u041e"+ - "\u0003\u00cae\u0000\u041d\u041c\u0001\u0000\u0000\u0000\u041e\u041f\u0001"+ - "\u0000\u0000\u0000\u041f\u041d\u0001\u0000\u0000\u0000\u041f\u0420\u0001"+ - "\u0000\u0000\u0000\u0420\u042a\u0001\u0000\u0000\u0000\u0421\u0425\u0005"+ - "e\u0000\u0000\u0422\u0424\u0003\u00ccf\u0000\u0423\u0422\u0001\u0000\u0000"+ - "\u0000\u0424\u0427\u0001\u0000\u0000\u0000\u0425\u0423\u0001\u0000\u0000"+ - "\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0428\u0001\u0000\u0000"+ - "\u0000\u0427\u0425\u0001\u0000\u0000\u0000\u0428\u042a\u0005f\u0000\u0000"+ - "\u0429\u041d\u0001\u0000\u0000\u0000\u0429\u0421\u0001\u0000\u0000\u0000"+ - "\u042a\u00cd\u0001\u0000\u0000\u0000\u042b\u042c\u0003\u00d0h\u0000\u042c"+ - "\u042d\u0005>\u0000\u0000\u042d\u042e\u0003\u00d4j\u0000\u042e\u0435\u0001"+ - "\u0000\u0000\u0000\u042f\u0430\u0003\u00d4j\u0000\u0430\u0431\u0005=\u0000"+ - "\u0000\u0431\u0432\u0003\u00d2i\u0000\u0432\u0435\u0001\u0000\u0000\u0000"+ - "\u0433\u0435\u0003\u00d6k\u0000\u0434\u042b\u0001\u0000\u0000\u0000\u0434"+ - "\u042f\u0001\u0000\u0000\u0000\u0434\u0433\u0001\u0000\u0000\u0000\u0435"+ - "\u00cf\u0001\u0000\u0000\u0000\u0436\u0437\u0007\f\u0000\u0000\u0437\u00d1"+ - "\u0001\u0000\u0000\u0000\u0438\u0439\u0007\f\u0000\u0000\u0439\u00d3\u0001"+ - "\u0000\u0000\u0000\u043a\u043b\u0007\f\u0000\u0000\u043b\u00d5\u0001\u0000"+ - "\u0000\u0000\u043c\u043d\u0007\r\u0000\u0000\u043d\u00d7\u0001\u0000\u0000"+ - "\u0000l\u00db\u00ec\u00f8\u0114\u0123\u0129\u013c\u0140\u0145\u014d\u0155"+ - "\u015a\u015d\u016d\u0175\u0179\u0180\u0186\u018b\u0194\u019b\u01a1\u01aa"+ - "\u01b1\u01b9\u01c1\u01c5\u01c9\u01ce\u01d2\u01dd\u01e2\u01e6\u01f4\u01ff"+ - "\u0205\u020c\u0215\u021e\u0232\u023a\u023d\u0244\u024f\u0256\u025e\u026c"+ - "\u0275\u0280\u028a\u0290\u0292\u0296\u029b\u02a9\u02b0\u02c3\u02c7\u02d1"+ - "\u02da\u02e3\u02eb\u02f0\u02f8\u02fa\u02ff\u0306\u030d\u0316\u031d\u0326"+ - "\u032b\u0330\u033a\u0340\u0348\u034a\u0355\u035c\u0367\u036c\u036e\u0375"+ - "\u037d\u0380\u038a\u039b\u03a6\u03b1\u03b6\u03bc\u03bf\u03c4\u03d4\u03d9"+ - "\u03e1\u03e8\u03ee\u03f4\u03fc\u0402\u0404\u0413\u0418\u041f\u0425\u0429"+ - "\u0434"; + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004"+ + "\u0118\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0005\b\u0125"+ + "\b\b\n\b\f\b\u0128\t\b\u0001\t\u0001\t\u0001\t\u0003\t\u012d\b\t\u0001"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0005\r\u013e"+ + "\b\r\n\r\f\r\u0141\t\r\u0001\r\u0003\r\u0144\b\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0003\u000e\u0149\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0005\u000f\u014f\b\u000f\n\u000f\f\u000f\u0152\t\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0159"+ + "\b\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u015e\b\u0010"+ + "\u0001\u0010\u0003\u0010\u0161\b\u0010\u0001\u0011\u0001\u0011\u0001\u0012"+ + "\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u016f\b\u0015\n\u0015"+ + "\f\u0015\u0172\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+ + "\u0001\u0017\u0003\u0017\u0179\b\u0017\u0001\u0017\u0001\u0017\u0003\u0017"+ + "\u017d\b\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u0182\b"+ + "\u0018\n\u0018\f\u0018\u0185\t\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0003\u0019\u018a\b\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0003\u001a"+ + "\u018f\b\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0003\u001a\u0198\b\u001a\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0005\u001b\u019d\b\u001b\n\u001b\f\u001b\u01a0\t\u001b\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u01a5\b\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003"+ + "\u001c\u01ae\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d\u01b3"+ + "\b\u001d\n\u001d\f\u001d\u01b6\t\u001d\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0005\u001e\u01bb\b\u001e\n\u001e\f\u001e\u01be\t\u001e\u0001\u001f\u0001"+ + "\u001f\u0001 \u0001 \u0001 \u0003 \u01c5\b \u0001!\u0001!\u0003!\u01c9"+ + "\b!\u0001\"\u0001\"\u0003\"\u01cd\b\"\u0001#\u0001#\u0001#\u0003#\u01d2"+ + "\b#\u0001$\u0001$\u0003$\u01d6\b$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ + "&\u0001&\u0005&\u01df\b&\n&\f&\u01e2\t&\u0001\'\u0001\'\u0003\'\u01e6"+ + "\b\'\u0001\'\u0001\'\u0003\'\u01ea\b\'\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001*\u0001*\u0001*\u0001*\u0005*\u01f6\b*\n*\f*\u01f9\t*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0203\b+\u0001"+ + ",\u0001,\u0001,\u0001,\u0003,\u0209\b,\u0001-\u0001-\u0001-\u0005-\u020e"+ + "\b-\n-\f-\u0211\t-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0003/\u0219"+ + "\b/\u00010\u00010\u00010\u00010\u00010\u00050\u0220\b0\n0\f0\u0223\t0"+ + "\u00011\u00011\u00011\u00012\u00012\u00012\u00013\u00013\u00013\u0001"+ + "3\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u00035\u0236\b5\u0001"+ + "5\u00015\u00015\u00015\u00055\u023c\b5\n5\f5\u023f\t5\u00035\u0241\b5"+ + "\u00016\u00016\u00017\u00017\u00017\u00037\u0248\b7\u00017\u00017\u0001"+ + "8\u00018\u00018\u00019\u00019\u00019\u00019\u00039\u0253\b9\u00019\u0001"+ + "9\u00019\u00019\u00019\u00039\u025a\b9\u0001:\u0001:\u0001:\u0001;\u0004"+ + ";\u0260\b;\u000b;\f;\u0261\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0005=\u026e\b=\n=\f=\u0271\t=\u0001>\u0001>\u0001"+ + "?\u0001?\u0001?\u0001?\u0003?\u0279\b?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001@\u0001@\u0001@\u0001@\u0003@\u0284\b@\u0001@\u0001@\u0001@\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0003A\u028e\bA\u0001A\u0001A\u0001A\u0001"+ + "A\u0003A\u0294\bA\u0003A\u0296\bA\u0001B\u0001B\u0003B\u029a\bB\u0001"+ + "B\u0005B\u029d\bB\nB\fB\u02a0\tB\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u02ad\bC\u0001D\u0001D\u0001"+ + "D\u0005D\u02b2\bD\nD\fD\u02b5\tD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0003I\u02cc\bI\u0001J\u0001J\u0003"+ + "J\u02d0\bJ\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0003"+ + "K\u02da\bK\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0003L\u02e3"+ + "\bL\u0001L\u0001L\u0001L\u0001L\u0001L\u0005L\u02ea\bL\nL\fL\u02ed\tL"+ + "\u0001L\u0001L\u0001L\u0001L\u0001L\u0003L\u02f4\bL\u0001L\u0001L\u0001"+ + "L\u0003L\u02f9\bL\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0005L\u0301"+ + "\bL\nL\fL\u0304\tL\u0001M\u0001M\u0003M\u0308\bM\u0001M\u0001M\u0001M"+ + "\u0001M\u0001M\u0003M\u030f\bM\u0001M\u0001M\u0001M\u0001M\u0001M\u0003"+ + "M\u0316\bM\u0001M\u0001M\u0001M\u0001M\u0001M\u0005M\u031d\bM\nM\fM\u0320"+ + "\tM\u0001M\u0001M\u0001M\u0001M\u0003M\u0326\bM\u0001M\u0001M\u0001M\u0001"+ + "M\u0001M\u0005M\u032d\bM\nM\fM\u0330\tM\u0001M\u0001M\u0003M\u0334\bM"+ + "\u0001N\u0001N\u0001N\u0003N\u0339\bN\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0003O\u0343\bO\u0001P\u0001P\u0001P\u0001P\u0003"+ + "P\u0349\bP\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0005P\u0351\bP\n"+ + "P\fP\u0354\tP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q"+ + "\u0003Q\u035e\bQ\u0001Q\u0001Q\u0001Q\u0005Q\u0363\bQ\nQ\fQ\u0366\tQ\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0005R\u036e\bR\nR\fR\u0371\tR\u0001"+ + "R\u0001R\u0003R\u0375\bR\u0003R\u0377\bR\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0003S\u037e\bS\u0001T\u0001T\u0001T\u0001T\u0005T\u0384\bT\nT\fT\u0387"+ + "\tT\u0003T\u0389\bT\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+ + "V\u0003V\u0393\bV\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0005W\u03a2\bW\nW\fW\u03a5\tW\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0005W\u03ad\bW\nW\fW\u03b0\tW\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0005W\u03b8\bW\nW\fW\u03bb\tW\u0001"+ + "W\u0001W\u0003W\u03bf\bW\u0001X\u0001X\u0001Y\u0001Y\u0003Y\u03c5\bY\u0001"+ + "Z\u0003Z\u03c8\bZ\u0001Z\u0001Z\u0001[\u0003[\u03cd\b[\u0001[\u0001[\u0001"+ + "\\\u0001\\\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001"+ + "_\u0001_\u0003_\u03dd\b_\u0001_\u0001_\u0001_\u0003_\u03e2\b_\u0001`\u0001"+ + "`\u0001`\u0001`\u0005`\u03e8\b`\n`\f`\u03eb\t`\u0001a\u0001a\u0005a\u03ef"+ + "\ba\na\fa\u03f2\ta\u0001a\u0001a\u0001a\u0003a\u03f7\ba\u0001a\u0001a"+ + "\u0004a\u03fb\ba\u000ba\fa\u03fc\u0001a\u0001a\u0001a\u0001a\u0005a\u0403"+ + "\ba\na\fa\u0406\ta\u0001a\u0004a\u0409\ba\u000ba\fa\u040a\u0003a\u040d"+ + "\ba\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001e\u0001"+ + "e\u0001e\u0005e\u041a\be\ne\fe\u041d\te\u0001e\u0001e\u0003e\u0421\be"+ + "\u0001f\u0001f\u0001g\u0004g\u0426\bg\u000bg\fg\u0427\u0001g\u0001g\u0005"+ + "g\u042c\bg\ng\fg\u042f\tg\u0001g\u0003g\u0432\bg\u0001h\u0001h\u0001h"+ + "\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u043d\bh\u0001i\u0001"+ + "i\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001l\u0000\u0005\u0004z"+ + "\u0098\u00a0\u00a2m\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ + "\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfh"+ + "jlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092"+ + "\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa"+ + "\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2"+ + "\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u0000"+ + "\u000e\u0002\u000077nn\u0001\u0000hi\u0002\u0000;;BB\u0002\u0000EEHH\u0002"+ + "\u0000,,77\u0001\u0000Z[\u0001\u0000\\^\u0002\u0000DDQQ\u0002\u0000SS"+ + "UY\u0002\u0000\u001a\u001a\u001c\u001d\u0003\u000077bbhi\b\u000077<<>"+ + "?AAbbhinn\u0098\u009a\u0002\u0000hhnn\u0003\u000077hhnn\u0478\u0000\u00dd"+ + "\u0001\u0000\u0000\u0000\u0002\u00e3\u0001\u0000\u0000\u0000\u0004\u00e6"+ + "\u0001\u0000\u0000\u0000\u0006\u00fa\u0001\u0000\u0000\u0000\b\u0117\u0001"+ + "\u0000\u0000\u0000\n\u0119\u0001\u0000\u0000\u0000\f\u011c\u0001\u0000"+ + "\u0000\u0000\u000e\u011e\u0001\u0000\u0000\u0000\u0010\u0121\u0001\u0000"+ + "\u0000\u0000\u0012\u012c\u0001\u0000\u0000\u0000\u0014\u0130\u0001\u0000"+ + "\u0000\u0000\u0016\u0133\u0001\u0000\u0000\u0000\u0018\u0136\u0001\u0000"+ + "\u0000\u0000\u001a\u013a\u0001\u0000\u0000\u0000\u001c\u0148\u0001\u0000"+ + "\u0000\u0000\u001e\u014a\u0001\u0000\u0000\u0000 \u0160\u0001\u0000\u0000"+ + "\u0000\"\u0162\u0001\u0000\u0000\u0000$\u0164\u0001\u0000\u0000\u0000"+ + "&\u0166\u0001\u0000\u0000\u0000(\u0168\u0001\u0000\u0000\u0000*\u016a"+ + "\u0001\u0000\u0000\u0000,\u0173\u0001\u0000\u0000\u0000.\u0176\u0001\u0000"+ + "\u0000\u00000\u017e\u0001\u0000\u0000\u00002\u0186\u0001\u0000\u0000\u0000"+ + "4\u0197\u0001\u0000\u0000\u00006\u0199\u0001\u0000\u0000\u00008\u01ad"+ + "\u0001\u0000\u0000\u0000:\u01af\u0001\u0000\u0000\u0000<\u01b7\u0001\u0000"+ + "\u0000\u0000>\u01bf\u0001\u0000\u0000\u0000@\u01c4\u0001\u0000\u0000\u0000"+ + "B\u01c8\u0001\u0000\u0000\u0000D\u01cc\u0001\u0000\u0000\u0000F\u01d1"+ + "\u0001\u0000\u0000\u0000H\u01d5\u0001\u0000\u0000\u0000J\u01d7\u0001\u0000"+ + "\u0000\u0000L\u01da\u0001\u0000\u0000\u0000N\u01e3\u0001\u0000\u0000\u0000"+ + "P\u01eb\u0001\u0000\u0000\u0000R\u01ee\u0001\u0000\u0000\u0000T\u01f1"+ + "\u0001\u0000\u0000\u0000V\u0202\u0001\u0000\u0000\u0000X\u0204\u0001\u0000"+ + "\u0000\u0000Z\u020a\u0001\u0000\u0000\u0000\\\u0212\u0001\u0000\u0000"+ + "\u0000^\u0218\u0001\u0000\u0000\u0000`\u021a\u0001\u0000\u0000\u0000b"+ + "\u0224\u0001\u0000\u0000\u0000d\u0227\u0001\u0000\u0000\u0000f\u022a\u0001"+ + "\u0000\u0000\u0000h\u022e\u0001\u0000\u0000\u0000j\u0231\u0001\u0000\u0000"+ + "\u0000l\u0242\u0001\u0000\u0000\u0000n\u0247\u0001\u0000\u0000\u0000p"+ + "\u024b\u0001\u0000\u0000\u0000r\u024e\u0001\u0000\u0000\u0000t\u025b\u0001"+ + "\u0000\u0000\u0000v\u025f\u0001\u0000\u0000\u0000x\u0263\u0001\u0000\u0000"+ + "\u0000z\u0267\u0001\u0000\u0000\u0000|\u0272\u0001\u0000\u0000\u0000~"+ + "\u0274\u0001\u0000\u0000\u0000\u0080\u027f\u0001\u0000\u0000\u0000\u0082"+ + "\u0295\u0001\u0000\u0000\u0000\u0084\u0297\u0001\u0000\u0000\u0000\u0086"+ + "\u02ac\u0001\u0000\u0000\u0000\u0088\u02ae\u0001\u0000\u0000\u0000\u008a"+ + "\u02b6\u0001\u0000\u0000\u0000\u008c\u02bb\u0001\u0000\u0000\u0000\u008e"+ + "\u02be\u0001\u0000\u0000\u0000\u0090\u02c3\u0001\u0000\u0000\u0000\u0092"+ + "\u02c7\u0001\u0000\u0000\u0000\u0094\u02cd\u0001\u0000\u0000\u0000\u0096"+ + "\u02d9\u0001\u0000\u0000\u0000\u0098\u02f8\u0001\u0000\u0000\u0000\u009a"+ + "\u0333\u0001\u0000\u0000\u0000\u009c\u0335\u0001\u0000\u0000\u0000\u009e"+ + "\u0342\u0001\u0000\u0000\u0000\u00a0\u0348\u0001\u0000\u0000\u0000\u00a2"+ + "\u035d\u0001\u0000\u0000\u0000\u00a4\u0367\u0001\u0000\u0000\u0000\u00a6"+ + "\u037d\u0001\u0000\u0000\u0000\u00a8\u037f\u0001\u0000\u0000\u0000\u00aa"+ + "\u038c\u0001\u0000\u0000\u0000\u00ac\u0392\u0001\u0000\u0000\u0000\u00ae"+ + "\u03be\u0001\u0000\u0000\u0000\u00b0\u03c0\u0001\u0000\u0000\u0000\u00b2"+ + "\u03c4\u0001\u0000\u0000\u0000\u00b4\u03c7\u0001\u0000\u0000\u0000\u00b6"+ + "\u03cc\u0001\u0000\u0000\u0000\u00b8\u03d0\u0001\u0000\u0000\u0000\u00ba"+ + "\u03d2\u0001\u0000\u0000\u0000\u00bc\u03d4\u0001\u0000\u0000\u0000\u00be"+ + "\u03e1\u0001\u0000\u0000\u0000\u00c0\u03e3\u0001\u0000\u0000\u0000\u00c2"+ + "\u040c\u0001\u0000\u0000\u0000\u00c4\u040e\u0001\u0000\u0000\u0000\u00c6"+ + "\u0410\u0001\u0000\u0000\u0000\u00c8\u0414\u0001\u0000\u0000\u0000\u00ca"+ + "\u0420\u0001\u0000\u0000\u0000\u00cc\u0422\u0001\u0000\u0000\u0000\u00ce"+ + "\u0431\u0001\u0000\u0000\u0000\u00d0\u043c\u0001\u0000\u0000\u0000\u00d2"+ + "\u043e\u0001\u0000\u0000\u0000\u00d4\u0440\u0001\u0000\u0000\u0000\u00d6"+ + "\u0442\u0001\u0000\u0000\u0000\u00d8\u0444\u0001\u0000\u0000\u0000\u00da"+ + "\u00dc\u0003\u0090H\u0000\u00db\u00da\u0001\u0000\u0000\u0000\u00dc\u00df"+ + "\u0001\u0000\u0000\u0000\u00dd\u00db\u0001\u0000\u0000\u0000\u00dd\u00de"+ + "\u0001\u0000\u0000\u0000\u00de\u00e0\u0001\u0000\u0000\u0000\u00df\u00dd"+ + "\u0001\u0000\u0000\u0000\u00e0\u00e1\u0003\u0002\u0001\u0000\u00e1\u00e2"+ + "\u0005\u0000\u0000\u0001\u00e2\u0001\u0001\u0000\u0000\u0000\u00e3\u00e4"+ + "\u0003\u0004\u0002\u0000\u00e4\u00e5\u0005\u0000\u0000\u0001\u00e5\u0003"+ + "\u0001\u0000\u0000\u0000\u00e6\u00e7\u0006\u0002\uffff\uffff\u0000\u00e7"+ + "\u00e8\u0003\u0006\u0003\u0000\u00e8\u00ee\u0001\u0000\u0000\u0000\u00e9"+ + "\u00ea\n\u0001\u0000\u0000\u00ea\u00eb\u00056\u0000\u0000\u00eb\u00ed"+ + "\u0003\b\u0004\u0000\u00ec\u00e9\u0001\u0000\u0000\u0000\u00ed\u00f0\u0001"+ + "\u0000\u0000\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ee\u00ef\u0001"+ + "\u0000\u0000\u0000\u00ef\u0005\u0001\u0000\u0000\u0000\u00f0\u00ee\u0001"+ + "\u0000\u0000\u0000\u00f1\u00fb\u0003\u0014\n\u0000\u00f2\u00fb\u0003\u000e"+ + "\u0007\u0000\u00f3\u00fb\u0003h4\u0000\u00f4\u00fb\u0003\u0016\u000b\u0000"+ + "\u00f5\u00fb\u0003\u00c2a\u0000\u00f6\u00f7\u0004\u0003\u0001\u0000\u00f7"+ + "\u00fb\u0003d2\u0000\u00f8\u00f9\u0004\u0003\u0002\u0000\u00f9\u00fb\u0003"+ + "\u0018\f\u0000\u00fa\u00f1\u0001\u0000\u0000\u0000\u00fa\u00f2\u0001\u0000"+ + "\u0000\u0000\u00fa\u00f3\u0001\u0000\u0000\u0000\u00fa\u00f4\u0001\u0000"+ + "\u0000\u0000\u00fa\u00f5\u0001\u0000\u0000\u0000\u00fa\u00f6\u0001\u0000"+ + "\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fb\u0007\u0001\u0000"+ + "\u0000\u0000\u00fc\u0118\u0003,\u0016\u0000\u00fd\u0118\u0003\n\u0005"+ + "\u0000\u00fe\u0118\u0003P(\u0000\u00ff\u0118\u0003J%\u0000\u0100\u0118"+ + "\u0003.\u0017\u0000\u0101\u0118\u0003L&\u0000\u0102\u0118\u0003R)\u0000"+ + "\u0103\u0118\u0003T*\u0000\u0104\u0118\u0003X,\u0000\u0105\u0118\u0003"+ + "`0\u0000\u0106\u0118\u0003j5\u0000\u0107\u0118\u0003b1\u0000\u0108\u0118"+ + "\u0003\u00bc^\u0000\u0109\u0118\u0003r9\u0000\u010a\u0118\u0003\u0080"+ + "@\u0000\u010b\u0118\u0003p8\u0000\u010c\u0118\u0003t:\u0000\u010d\u0118"+ + "\u0003~?\u0000\u010e\u0118\u0003\u0082A\u0000\u010f\u0118\u0003\u0084"+ + "B\u0000\u0110\u0118\u0003\u008eG\u0000\u0111\u0112\u0004\u0004\u0003\u0000"+ + "\u0112\u0118\u0003\u008aE\u0000\u0113\u0114\u0004\u0004\u0004\u0000\u0114"+ + "\u0118\u0003\u008cF\u0000\u0115\u0116\u0004\u0004\u0005\u0000\u0116\u0118"+ + "\u0003\u0094J\u0000\u0117\u00fc\u0001\u0000\u0000\u0000\u0117\u00fd\u0001"+ + "\u0000\u0000\u0000\u0117\u00fe\u0001\u0000\u0000\u0000\u0117\u00ff\u0001"+ + "\u0000\u0000\u0000\u0117\u0100\u0001\u0000\u0000\u0000\u0117\u0101\u0001"+ + "\u0000\u0000\u0000\u0117\u0102\u0001\u0000\u0000\u0000\u0117\u0103\u0001"+ + "\u0000\u0000\u0000\u0117\u0104\u0001\u0000\u0000\u0000\u0117\u0105\u0001"+ + "\u0000\u0000\u0000\u0117\u0106\u0001\u0000\u0000\u0000\u0117\u0107\u0001"+ + "\u0000\u0000\u0000\u0117\u0108\u0001\u0000\u0000\u0000\u0117\u0109\u0001"+ + "\u0000\u0000\u0000\u0117\u010a\u0001\u0000\u0000\u0000\u0117\u010b\u0001"+ + "\u0000\u0000\u0000\u0117\u010c\u0001\u0000\u0000\u0000\u0117\u010d\u0001"+ + "\u0000\u0000\u0000\u0117\u010e\u0001\u0000\u0000\u0000\u0117\u010f\u0001"+ + "\u0000\u0000\u0000\u0117\u0110\u0001\u0000\u0000\u0000\u0117\u0111\u0001"+ + "\u0000\u0000\u0000\u0117\u0113\u0001\u0000\u0000\u0000\u0117\u0115\u0001"+ + "\u0000\u0000\u0000\u0118\t\u0001\u0000\u0000\u0000\u0119\u011a\u0005\u0011"+ + "\u0000\u0000\u011a\u011b\u0003\u0098L\u0000\u011b\u000b\u0001\u0000\u0000"+ + "\u0000\u011c\u011d\u0003>\u001f\u0000\u011d\r\u0001\u0000\u0000\u0000"+ + "\u011e\u011f\u0005\r\u0000\u0000\u011f\u0120\u0003\u0010\b\u0000\u0120"+ + "\u000f\u0001\u0000\u0000\u0000\u0121\u0126\u0003\u0012\t\u0000\u0122\u0123"+ + "\u0005A\u0000\u0000\u0123\u0125\u0003\u0012\t\u0000\u0124\u0122\u0001"+ + "\u0000\u0000\u0000\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001"+ + "\u0000\u0000\u0000\u0126\u0127\u0001\u0000\u0000\u0000\u0127\u0011\u0001"+ + "\u0000\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0129\u012a\u0003"+ + "4\u001a\u0000\u012a\u012b\u0005<\u0000\u0000\u012b\u012d\u0001\u0000\u0000"+ + "\u0000\u012c\u0129\u0001\u0000\u0000\u0000\u012c\u012d\u0001\u0000\u0000"+ + "\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u012f\u0003\u0098L\u0000"+ + "\u012f\u0013\u0001\u0000\u0000\u0000\u0130\u0131\u0005\u0013\u0000\u0000"+ + "\u0131\u0132\u0003\u001a\r\u0000\u0132\u0015\u0001\u0000\u0000\u0000\u0133"+ + "\u0134\u0005\u0014\u0000\u0000\u0134\u0135\u0003\u001a\r\u0000\u0135\u0017"+ + "\u0001\u0000\u0000\u0000\u0136\u0137\u0005\u0015\u0000\u0000\u0137\u0138"+ + "\u0003H$\u0000\u0138\u0139\u0003^/\u0000\u0139\u0019\u0001\u0000\u0000"+ + "\u0000\u013a\u013f\u0003\u001c\u000e\u0000\u013b\u013c\u0005A\u0000\u0000"+ + "\u013c\u013e\u0003\u001c\u000e\u0000\u013d\u013b\u0001\u0000\u0000\u0000"+ + "\u013e\u0141\u0001\u0000\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000"+ + "\u013f\u0140\u0001\u0000\u0000\u0000\u0140\u0143\u0001\u0000\u0000\u0000"+ + "\u0141\u013f\u0001\u0000\u0000\u0000\u0142\u0144\u0003*\u0015\u0000\u0143"+ + "\u0142\u0001\u0000\u0000\u0000\u0143\u0144\u0001\u0000\u0000\u0000\u0144"+ + "\u001b\u0001\u0000\u0000\u0000\u0145\u0149\u0003 \u0010\u0000\u0146\u0147"+ + "\u0004\u000e\u0006\u0000\u0147\u0149\u0003\u001e\u000f\u0000\u0148\u0145"+ + "\u0001\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0149\u001d"+ + "\u0001\u0000\u0000\u0000\u014a\u014b\u0005f\u0000\u0000\u014b\u0150\u0003"+ + "\u0014\n\u0000\u014c\u014d\u00056\u0000\u0000\u014d\u014f\u0003\b\u0004"+ + "\u0000\u014e\u014c\u0001\u0000\u0000\u0000\u014f\u0152\u0001\u0000\u0000"+ + "\u0000\u0150\u014e\u0001\u0000\u0000\u0000\u0150\u0151\u0001\u0000\u0000"+ + "\u0000\u0151\u0153\u0001\u0000\u0000\u0000\u0152\u0150\u0001\u0000\u0000"+ + "\u0000\u0153\u0154\u0005g\u0000\u0000\u0154\u001f\u0001\u0000\u0000\u0000"+ + "\u0155\u0156\u0003\"\u0011\u0000\u0156\u0157\u0005?\u0000\u0000\u0157"+ + "\u0159\u0001\u0000\u0000\u0000\u0158\u0155\u0001\u0000\u0000\u0000\u0158"+ + "\u0159\u0001\u0000\u0000\u0000\u0159\u015a\u0001\u0000\u0000\u0000\u015a"+ + "\u015d\u0003&\u0013\u0000\u015b\u015c\u0005>\u0000\u0000\u015c\u015e\u0003"+ + "$\u0012\u0000\u015d\u015b\u0001\u0000\u0000\u0000\u015d\u015e\u0001\u0000"+ + "\u0000\u0000\u015e\u0161\u0001\u0000\u0000\u0000\u015f\u0161\u0003(\u0014"+ + "\u0000\u0160\u0158\u0001\u0000\u0000\u0000\u0160\u015f\u0001\u0000\u0000"+ + "\u0000\u0161!\u0001\u0000\u0000\u0000\u0162\u0163\u0005n\u0000\u0000\u0163"+ + "#\u0001\u0000\u0000\u0000\u0164\u0165\u0005n\u0000\u0000\u0165%\u0001"+ + "\u0000\u0000\u0000\u0166\u0167\u0005n\u0000\u0000\u0167\'\u0001\u0000"+ + "\u0000\u0000\u0168\u0169\u0007\u0000\u0000\u0000\u0169)\u0001\u0000\u0000"+ + "\u0000\u016a\u016b\u0005m\u0000\u0000\u016b\u0170\u0005n\u0000\u0000\u016c"+ + "\u016d\u0005A\u0000\u0000\u016d\u016f\u0005n\u0000\u0000\u016e\u016c\u0001"+ + "\u0000\u0000\u0000\u016f\u0172\u0001\u0000\u0000\u0000\u0170\u016e\u0001"+ + "\u0000\u0000\u0000\u0170\u0171\u0001\u0000\u0000\u0000\u0171+\u0001\u0000"+ + "\u0000\u0000\u0172\u0170\u0001\u0000\u0000\u0000\u0173\u0174\u0005\t\u0000"+ + "\u0000\u0174\u0175\u0003\u0010\b\u0000\u0175-\u0001\u0000\u0000\u0000"+ + "\u0176\u0178\u0005\u0010\u0000\u0000\u0177\u0179\u00030\u0018\u0000\u0178"+ + "\u0177\u0001\u0000\u0000\u0000\u0178\u0179\u0001\u0000\u0000\u0000\u0179"+ + "\u017c\u0001\u0000\u0000\u0000\u017a\u017b\u0005=\u0000\u0000\u017b\u017d"+ + "\u0003\u0010\b\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017d\u0001"+ + "\u0000\u0000\u0000\u017d/\u0001\u0000\u0000\u0000\u017e\u0183\u00032\u0019"+ + "\u0000\u017f\u0180\u0005A\u0000\u0000\u0180\u0182\u00032\u0019\u0000\u0181"+ + "\u017f\u0001\u0000\u0000\u0000\u0182\u0185\u0001\u0000\u0000\u0000\u0183"+ + "\u0181\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000\u0184"+ + "1\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0186\u0189"+ + "\u0003\u0012\t\u0000\u0187\u0188\u0005\u0011\u0000\u0000\u0188\u018a\u0003"+ + "\u0098L\u0000\u0189\u0187\u0001\u0000\u0000\u0000\u0189\u018a\u0001\u0000"+ + "\u0000\u0000\u018a3\u0001\u0000\u0000\u0000\u018b\u018c\u0004\u001a\u0007"+ + "\u0000\u018c\u018e\u0005d\u0000\u0000\u018d\u018f\u0005h\u0000\u0000\u018e"+ + "\u018d\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f"+ + "\u0190\u0001\u0000\u0000\u0000\u0190\u0191\u0005e\u0000\u0000\u0191\u0192"+ + "\u0005C\u0000\u0000\u0192\u0193\u0005d\u0000\u0000\u0193\u0194\u00036"+ + "\u001b\u0000\u0194\u0195\u0005e\u0000\u0000\u0195\u0198\u0001\u0000\u0000"+ + "\u0000\u0196\u0198\u00036\u001b\u0000\u0197\u018b\u0001\u0000\u0000\u0000"+ + "\u0197\u0196\u0001\u0000\u0000\u0000\u01985\u0001\u0000\u0000\u0000\u0199"+ + "\u019e\u0003F#\u0000\u019a\u019b\u0005C\u0000\u0000\u019b\u019d\u0003"+ + "F#\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019d\u01a0\u0001\u0000\u0000"+ + "\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019e\u019f\u0001\u0000\u0000"+ + "\u0000\u019f7\u0001\u0000\u0000\u0000\u01a0\u019e\u0001\u0000\u0000\u0000"+ + "\u01a1\u01a2\u0004\u001c\b\u0000\u01a2\u01a4\u0005d\u0000\u0000\u01a3"+ + "\u01a5\u0005\u0091\u0000\u0000\u01a4\u01a3\u0001\u0000\u0000\u0000\u01a4"+ + "\u01a5\u0001\u0000\u0000\u0000\u01a5\u01a6\u0001\u0000\u0000\u0000\u01a6"+ + "\u01a7\u0005e\u0000\u0000\u01a7\u01a8\u0005C\u0000\u0000\u01a8\u01a9\u0005"+ + "d\u0000\u0000\u01a9\u01aa\u0003:\u001d\u0000\u01aa\u01ab\u0005e\u0000"+ + "\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01ae\u0003:\u001d\u0000"+ + "\u01ad\u01a1\u0001\u0000\u0000\u0000\u01ad\u01ac\u0001\u0000\u0000\u0000"+ + "\u01ae9\u0001\u0000\u0000\u0000\u01af\u01b4\u0003@ \u0000\u01b0\u01b1"+ + "\u0005C\u0000\u0000\u01b1\u01b3\u0003@ \u0000\u01b2\u01b0\u0001\u0000"+ + "\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000"+ + "\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5;\u0001\u0000\u0000"+ + "\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7\u01bc\u00038\u001c\u0000"+ + "\u01b8\u01b9\u0005A\u0000\u0000\u01b9\u01bb\u00038\u001c\u0000\u01ba\u01b8"+ + "\u0001\u0000\u0000\u0000\u01bb\u01be\u0001\u0000\u0000\u0000\u01bc\u01ba"+ + "\u0001\u0000\u0000\u0000\u01bc\u01bd\u0001\u0000\u0000\u0000\u01bd=\u0001"+ + "\u0000\u0000\u0000\u01be\u01bc\u0001\u0000\u0000\u0000\u01bf\u01c0\u0007"+ + "\u0001\u0000\u0000\u01c0?\u0001\u0000\u0000\u0000\u01c1\u01c5\u0005\u0091"+ + "\u0000\u0000\u01c2\u01c5\u0003B!\u0000\u01c3\u01c5\u0003D\"\u0000\u01c4"+ + "\u01c1\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4"+ + "\u01c3\u0001\u0000\u0000\u0000\u01c5A\u0001\u0000\u0000\u0000\u01c6\u01c9"+ + "\u0005O\u0000\u0000\u01c7\u01c9\u0005b\u0000\u0000\u01c8\u01c6\u0001\u0000"+ + "\u0000\u0000\u01c8\u01c7\u0001\u0000\u0000\u0000\u01c9C\u0001\u0000\u0000"+ + "\u0000\u01ca\u01cd\u0005a\u0000\u0000\u01cb\u01cd\u0005c\u0000\u0000\u01cc"+ + "\u01ca\u0001\u0000\u0000\u0000\u01cc\u01cb\u0001\u0000\u0000\u0000\u01cd"+ + "E\u0001\u0000\u0000\u0000\u01ce\u01d2\u0003>\u001f\u0000\u01cf\u01d2\u0003"+ + "B!\u0000\u01d0\u01d2\u0003D\"\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000"+ + "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d0\u0001\u0000\u0000\u0000"+ + "\u01d2G\u0001\u0000\u0000\u0000\u01d3\u01d6\u0003\u00b8\\\u0000\u01d4"+ + "\u01d6\u0003B!\u0000\u01d5\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d4\u0001"+ + "\u0000\u0000\u0000\u01d6I\u0001\u0000\u0000\u0000\u01d7\u01d8\u0005\u000b"+ + "\u0000\u0000\u01d8\u01d9\u0003\u00aeW\u0000\u01d9K\u0001\u0000\u0000\u0000"+ + "\u01da\u01db\u0005\u000f\u0000\u0000\u01db\u01e0\u0003N\'\u0000\u01dc"+ + "\u01dd\u0005A\u0000\u0000\u01dd\u01df\u0003N\'\u0000\u01de\u01dc\u0001"+ + "\u0000\u0000\u0000\u01df\u01e2\u0001\u0000\u0000\u0000\u01e0\u01de\u0001"+ + "\u0000\u0000\u0000\u01e0\u01e1\u0001\u0000\u0000\u0000\u01e1M\u0001\u0000"+ + "\u0000\u0000\u01e2\u01e0\u0001\u0000\u0000\u0000\u01e3\u01e5\u0003\u0098"+ + "L\u0000\u01e4\u01e6\u0007\u0002\u0000\u0000\u01e5\u01e4\u0001\u0000\u0000"+ + "\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000\u01e6\u01e9\u0001\u0000\u0000"+ + "\u0000\u01e7\u01e8\u0005L\u0000\u0000\u01e8\u01ea\u0007\u0003\u0000\u0000"+ + "\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000"+ + "\u01eaO\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\"\u0000\u0000\u01ec"+ + "\u01ed\u0003<\u001e\u0000\u01edQ\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005"+ + "!\u0000\u0000\u01ef\u01f0\u0003<\u001e\u0000\u01f0S\u0001\u0000\u0000"+ + "\u0000\u01f1\u01f2\u0005%\u0000\u0000\u01f2\u01f7\u0003V+\u0000\u01f3"+ + "\u01f4\u0005A\u0000\u0000\u01f4\u01f6\u0003V+\u0000\u01f5\u01f3\u0001"+ + "\u0000\u0000\u0000\u01f6\u01f9\u0001\u0000\u0000\u0000\u01f7\u01f5\u0001"+ + "\u0000\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8U\u0001\u0000"+ + "\u0000\u0000\u01f9\u01f7\u0001\u0000\u0000\u0000\u01fa\u01fb\u00038\u001c"+ + "\u0000\u01fb\u01fc\u0005\u009b\u0000\u0000\u01fc\u01fd\u00038\u001c\u0000"+ + "\u01fd\u0203\u0001\u0000\u0000\u0000\u01fe\u01ff\u00038\u001c\u0000\u01ff"+ + "\u0200\u0005<\u0000\u0000\u0200\u0201\u00038\u001c\u0000\u0201\u0203\u0001"+ + "\u0000\u0000\u0000\u0202\u01fa\u0001\u0000\u0000\u0000\u0202\u01fe\u0001"+ + "\u0000\u0000\u0000\u0203W\u0001\u0000\u0000\u0000\u0204\u0205\u0005\b"+ + "\u0000\u0000\u0205\u0206\u0003\u00a2Q\u0000\u0206\u0208\u0003\u00b8\\"+ + "\u0000\u0207\u0209\u0003Z-\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208"+ + "\u0209\u0001\u0000\u0000\u0000\u0209Y\u0001\u0000\u0000\u0000\u020a\u020f"+ + "\u0003\\.\u0000\u020b\u020c\u0005A\u0000\u0000\u020c\u020e\u0003\\.\u0000"+ + "\u020d\u020b\u0001\u0000\u0000\u0000\u020e\u0211\u0001\u0000\u0000\u0000"+ + "\u020f\u020d\u0001\u0000\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000"+ + "\u0210[\u0001\u0000\u0000\u0000\u0211\u020f\u0001\u0000\u0000\u0000\u0212"+ + "\u0213\u0003>\u001f\u0000\u0213\u0214\u0005<\u0000\u0000\u0214\u0215\u0003"+ + "\u00aeW\u0000\u0215]\u0001\u0000\u0000\u0000\u0216\u0217\u0005R\u0000"+ + "\u0000\u0217\u0219\u0003\u00a8T\u0000\u0218\u0216\u0001\u0000\u0000\u0000"+ + "\u0218\u0219\u0001\u0000\u0000\u0000\u0219_\u0001\u0000\u0000\u0000\u021a"+ + "\u021b\u0005\n\u0000\u0000\u021b\u021c\u0003\u00a2Q\u0000\u021c\u0221"+ + "\u0003\u00b8\\\u0000\u021d\u021e\u0005A\u0000\u0000\u021e\u0220\u0003"+ + "\u00b8\\\u0000\u021f\u021d\u0001\u0000\u0000\u0000\u0220\u0223\u0001\u0000"+ + "\u0000\u0000\u0221\u021f\u0001\u0000\u0000\u0000\u0221\u0222\u0001\u0000"+ + "\u0000\u0000\u0222a\u0001\u0000\u0000\u0000\u0223\u0221\u0001\u0000\u0000"+ + "\u0000\u0224\u0225\u0005 \u0000\u0000\u0225\u0226\u00034\u001a\u0000\u0226"+ + "c\u0001\u0000\u0000\u0000\u0227\u0228\u0005\u0006\u0000\u0000\u0228\u0229"+ + "\u0003f3\u0000\u0229e\u0001\u0000\u0000\u0000\u022a\u022b\u0005f\u0000"+ + "\u0000\u022b\u022c\u0003\u0004\u0002\u0000\u022c\u022d\u0005g\u0000\u0000"+ + "\u022dg\u0001\u0000\u0000\u0000\u022e\u022f\u0005\'\u0000\u0000\u022f"+ + "\u0230\u0005\u00a2\u0000\u0000\u0230i\u0001\u0000\u0000\u0000\u0231\u0232"+ + "\u0005\u0005\u0000\u0000\u0232\u0235\u0003l6\u0000\u0233\u0234\u0005M"+ + "\u0000\u0000\u0234\u0236\u00038\u001c\u0000\u0235\u0233\u0001\u0000\u0000"+ + "\u0000\u0235\u0236\u0001\u0000\u0000\u0000\u0236\u0240\u0001\u0000\u0000"+ + "\u0000\u0237\u0238\u0005R\u0000\u0000\u0238\u023d\u0003n7\u0000\u0239"+ + "\u023a\u0005A\u0000\u0000\u023a\u023c\u0003n7\u0000\u023b\u0239\u0001"+ + "\u0000\u0000\u0000\u023c\u023f\u0001\u0000\u0000\u0000\u023d\u023b\u0001"+ + "\u0000\u0000\u0000\u023d\u023e\u0001\u0000\u0000\u0000\u023e\u0241\u0001"+ + "\u0000\u0000\u0000\u023f\u023d\u0001\u0000\u0000\u0000\u0240\u0237\u0001"+ + "\u0000\u0000\u0000\u0240\u0241\u0001\u0000\u0000\u0000\u0241k\u0001\u0000"+ + "\u0000\u0000\u0242\u0243\u0007\u0004\u0000\u0000\u0243m\u0001\u0000\u0000"+ + "\u0000\u0244\u0245\u00038\u001c\u0000\u0245\u0246\u0005<\u0000\u0000\u0246"+ + "\u0248\u0001\u0000\u0000\u0000\u0247\u0244\u0001\u0000\u0000\u0000\u0247"+ + "\u0248\u0001\u0000\u0000\u0000\u0248\u0249\u0001\u0000\u0000\u0000\u0249"+ + "\u024a\u00038\u001c\u0000\u024ao\u0001\u0000\u0000\u0000\u024b\u024c\u0005"+ + "\u000e\u0000\u0000\u024c\u024d\u0003\u00aeW\u0000\u024dq\u0001\u0000\u0000"+ + "\u0000\u024e\u024f\u0005\u0004\u0000\u0000\u024f\u0252\u00034\u001a\u0000"+ + "\u0250\u0251\u0005M\u0000\u0000\u0251\u0253\u00034\u001a\u0000\u0252\u0250"+ + "\u0001\u0000\u0000\u0000\u0252\u0253\u0001\u0000\u0000\u0000\u0253\u0259"+ + "\u0001\u0000\u0000\u0000\u0254\u0255\u0005\u009b\u0000\u0000\u0255\u0256"+ + "\u00034\u001a\u0000\u0256\u0257\u0005A\u0000\u0000\u0257\u0258\u00034"+ + "\u001a\u0000\u0258\u025a\u0001\u0000\u0000\u0000\u0259\u0254\u0001\u0000"+ + "\u0000\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025as\u0001\u0000\u0000"+ + "\u0000\u025b\u025c\u0005\u0016\u0000\u0000\u025c\u025d\u0003v;\u0000\u025d"+ + "u\u0001\u0000\u0000\u0000\u025e\u0260\u0003x<\u0000\u025f\u025e\u0001"+ + "\u0000\u0000\u0000\u0260\u0261\u0001\u0000\u0000\u0000\u0261\u025f\u0001"+ + "\u0000\u0000\u0000\u0261\u0262\u0001\u0000\u0000\u0000\u0262w\u0001\u0000"+ + "\u0000\u0000\u0263\u0264\u0005f\u0000\u0000\u0264\u0265\u0003z=\u0000"+ + "\u0265\u0266\u0005g\u0000\u0000\u0266y\u0001\u0000\u0000\u0000\u0267\u0268"+ + "\u0006=\uffff\uffff\u0000\u0268\u0269\u0003|>\u0000\u0269\u026f\u0001"+ + "\u0000\u0000\u0000\u026a\u026b\n\u0001\u0000\u0000\u026b\u026c\u00056"+ + "\u0000\u0000\u026c\u026e\u0003|>\u0000\u026d\u026a\u0001\u0000\u0000\u0000"+ + "\u026e\u0271\u0001\u0000\u0000\u0000\u026f\u026d\u0001\u0000\u0000\u0000"+ + "\u026f\u0270\u0001\u0000\u0000\u0000\u0270{\u0001\u0000\u0000\u0000\u0271"+ + "\u026f\u0001\u0000\u0000\u0000\u0272\u0273\u0003\b\u0004\u0000\u0273}"+ + "\u0001\u0000\u0000\u0000\u0274\u0278\u0005\f\u0000\u0000\u0275\u0276\u0003"+ + "4\u001a\u0000\u0276\u0277\u0005<\u0000\u0000\u0277\u0279\u0001\u0000\u0000"+ + "\u0000\u0278\u0275\u0001\u0000\u0000\u0000\u0278\u0279\u0001\u0000\u0000"+ + "\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a\u027b\u0003\u00aeW\u0000"+ + "\u027b\u027c\u0005M\u0000\u0000\u027c\u027d\u0003\u0010\b\u0000\u027d"+ + "\u027e\u0003^/\u0000\u027e\u007f\u0001\u0000\u0000\u0000\u027f\u0283\u0005"+ + "\u0007\u0000\u0000\u0280\u0281\u00034\u001a\u0000\u0281\u0282\u0005<\u0000"+ + "\u0000\u0282\u0284\u0001\u0000\u0000\u0000\u0283\u0280\u0001\u0000\u0000"+ + "\u0000\u0283\u0284\u0001\u0000\u0000\u0000\u0284\u0285\u0001\u0000\u0000"+ + "\u0000\u0285\u0286\u0003\u00a2Q\u0000\u0286\u0287\u0003^/\u0000\u0287"+ + "\u0081\u0001\u0000\u0000\u0000\u0288\u0289\u0005\u0018\u0000\u0000\u0289"+ + "\u028a\u0005{\u0000\u0000\u028a\u028d\u00030\u0018\u0000\u028b\u028c\u0005"+ + "=\u0000\u0000\u028c\u028e\u0003\u0010\b\u0000\u028d\u028b\u0001\u0000"+ + "\u0000\u0000\u028d\u028e\u0001\u0000\u0000\u0000\u028e\u0296\u0001\u0000"+ + "\u0000\u0000\u028f\u0290\u0005\u0019\u0000\u0000\u0290\u0293\u00030\u0018"+ + "\u0000\u0291\u0292\u0005=\u0000\u0000\u0292\u0294\u0003\u0010\b\u0000"+ + "\u0293\u0291\u0001\u0000\u0000\u0000\u0293\u0294\u0001\u0000\u0000\u0000"+ + "\u0294\u0296\u0001\u0000\u0000\u0000\u0295\u0288\u0001\u0000\u0000\u0000"+ + "\u0295\u028f\u0001\u0000\u0000\u0000\u0296\u0083\u0001\u0000\u0000\u0000"+ + "\u0297\u0299\u0005\u0017\u0000\u0000\u0298\u029a\u0003>\u001f\u0000\u0299"+ + "\u0298\u0001\u0000\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a"+ + "\u029e\u0001\u0000\u0000\u0000\u029b\u029d\u0003\u0086C\u0000\u029c\u029b"+ + "\u0001\u0000\u0000\u0000\u029d\u02a0\u0001\u0000\u0000\u0000\u029e\u029c"+ + "\u0001\u0000\u0000\u0000\u029e\u029f\u0001\u0000\u0000\u0000\u029f\u0085"+ + "\u0001\u0000\u0000\u0000\u02a0\u029e\u0001\u0000\u0000\u0000\u02a1\u02a2"+ + "\u0005v\u0000\u0000\u02a2\u02a3\u0005=\u0000\u0000\u02a3\u02ad\u00034"+ + "\u001a\u0000\u02a4\u02a5\u0005w\u0000\u0000\u02a5\u02a6\u0005=\u0000\u0000"+ + "\u02a6\u02ad\u0003\u0088D\u0000\u02a7\u02a8\u0005u\u0000\u0000\u02a8\u02a9"+ + "\u0005=\u0000\u0000\u02a9\u02ad\u00034\u001a\u0000\u02aa\u02ab\u0005R"+ + "\u0000\u0000\u02ab\u02ad\u0003\u00a8T\u0000\u02ac\u02a1\u0001\u0000\u0000"+ + "\u0000\u02ac\u02a4\u0001\u0000\u0000\u0000\u02ac\u02a7\u0001\u0000\u0000"+ + "\u0000\u02ac\u02aa\u0001\u0000\u0000\u0000\u02ad\u0087\u0001\u0000\u0000"+ + "\u0000\u02ae\u02b3\u00034\u001a\u0000\u02af\u02b0\u0005A\u0000\u0000\u02b0"+ + "\u02b2\u00034\u001a\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b5"+ + "\u0001\u0000\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b3\u02b4"+ + "\u0001\u0000\u0000\u0000\u02b4\u0089\u0001\u0000\u0000\u0000\u02b5\u02b3"+ + "\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005\u001e\u0000\u0000\u02b7\u02b8"+ + "\u0003 \u0010\u0000\u02b8\u02b9\u0005M\u0000\u0000\u02b9\u02ba\u0003<"+ + "\u001e\u0000\u02ba\u008b\u0001\u0000\u0000\u0000\u02bb\u02bc\u0005#\u0000"+ + "\u0000\u02bc\u02bd\u0003<\u001e\u0000\u02bd\u008d\u0001\u0000\u0000\u0000"+ + "\u02be\u02bf\u0005\u0012\u0000\u0000\u02bf\u02c0\u00034\u001a\u0000\u02c0"+ + "\u02c1\u0005<\u0000\u0000\u02c1\u02c2\u0003\u00a2Q\u0000\u02c2\u008f\u0001"+ + "\u0000\u0000\u0000\u02c3\u02c4\u0005&\u0000\u0000\u02c4\u02c5\u0003\u0092"+ + "I\u0000\u02c5\u02c6\u0005@\u0000\u0000\u02c6\u0091\u0001\u0000\u0000\u0000"+ + "\u02c7\u02c8\u0003>\u001f\u0000\u02c8\u02cb\u0005<\u0000\u0000\u02c9\u02cc"+ + "\u0003\u00aeW\u0000\u02ca\u02cc\u0003\u00a8T\u0000\u02cb\u02c9\u0001\u0000"+ + "\u0000\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000\u02cc\u0093\u0001\u0000"+ + "\u0000\u0000\u02cd\u02cf\u0005\u001f\u0000\u0000\u02ce\u02d0\u0003\u0096"+ + "K\u0000\u02cf\u02ce\u0001\u0000\u0000\u0000\u02cf\u02d0\u0001\u0000\u0000"+ + "\u0000\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005M\u0000\u0000"+ + "\u02d2\u02d3\u00034\u001a\u0000\u02d3\u02d4\u0005\u008a\u0000\u0000\u02d4"+ + "\u02d5\u0003\u00b6[\u0000\u02d5\u02d6\u0003^/\u0000\u02d6\u0095\u0001"+ + "\u0000\u0000\u0000\u02d7\u02da\u0003B!\u0000\u02d8\u02da\u0003\u00a2Q"+ + "\u0000\u02d9\u02d7\u0001\u0000\u0000\u0000\u02d9\u02d8\u0001\u0000\u0000"+ + "\u0000\u02da\u0097\u0001\u0000\u0000\u0000\u02db\u02dc\u0006L\uffff\uffff"+ + "\u0000\u02dc\u02dd\u0005J\u0000\u0000\u02dd\u02f9\u0003\u0098L\b\u02de"+ + "\u02f9\u0003\u009eO\u0000\u02df\u02f9\u0003\u009aM\u0000\u02e0\u02e2\u0003"+ + "\u009eO\u0000\u02e1\u02e3\u0005J\u0000\u0000\u02e2\u02e1\u0001\u0000\u0000"+ + "\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000\u0000"+ + "\u0000\u02e4\u02e5\u0005F\u0000\u0000\u02e5\u02e6\u0005f\u0000\u0000\u02e6"+ + "\u02eb\u0003\u009eO\u0000\u02e7\u02e8\u0005A\u0000\u0000\u02e8\u02ea\u0003"+ + "\u009eO\u0000\u02e9\u02e7\u0001\u0000\u0000\u0000\u02ea\u02ed\u0001\u0000"+ + "\u0000\u0000\u02eb\u02e9\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001\u0000"+ + "\u0000\u0000\u02ec\u02ee\u0001\u0000\u0000\u0000\u02ed\u02eb\u0001\u0000"+ + "\u0000\u0000\u02ee\u02ef\u0005g\u0000\u0000\u02ef\u02f9\u0001\u0000\u0000"+ + "\u0000\u02f0\u02f1\u0003\u009eO\u0000\u02f1\u02f3\u0005G\u0000\u0000\u02f2"+ + "\u02f4\u0005J\u0000\u0000\u02f3\u02f2\u0001\u0000\u0000\u0000\u02f3\u02f4"+ + "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f6"+ + "\u0005K\u0000\u0000\u02f6\u02f9\u0001\u0000\u0000\u0000\u02f7\u02f9\u0003"+ + "\u009cN\u0000\u02f8\u02db\u0001\u0000\u0000\u0000\u02f8\u02de\u0001\u0000"+ + "\u0000\u0000\u02f8\u02df\u0001\u0000\u0000\u0000\u02f8\u02e0\u0001\u0000"+ + "\u0000\u0000\u02f8\u02f0\u0001\u0000\u0000\u0000\u02f8\u02f7\u0001\u0000"+ + "\u0000\u0000\u02f9\u0302\u0001\u0000\u0000\u0000\u02fa\u02fb\n\u0005\u0000"+ + "\u0000\u02fb\u02fc\u0005:\u0000\u0000\u02fc\u0301\u0003\u0098L\u0006\u02fd"+ + "\u02fe\n\u0004\u0000\u0000\u02fe\u02ff\u0005N\u0000\u0000\u02ff\u0301"+ + "\u0003\u0098L\u0005\u0300\u02fa\u0001\u0000\u0000\u0000\u0300\u02fd\u0001"+ + "\u0000\u0000\u0000\u0301\u0304\u0001\u0000\u0000\u0000\u0302\u0300\u0001"+ + "\u0000\u0000\u0000\u0302\u0303\u0001\u0000\u0000\u0000\u0303\u0099\u0001"+ + "\u0000\u0000\u0000\u0304\u0302\u0001\u0000\u0000\u0000\u0305\u0307\u0003"+ + "\u009eO\u0000\u0306\u0308\u0005J\u0000\u0000\u0307\u0306\u0001\u0000\u0000"+ + "\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308\u0309\u0001\u0000\u0000"+ + "\u0000\u0309\u030a\u0005I\u0000\u0000\u030a\u030b\u0003H$\u0000\u030b"+ + "\u0334\u0001\u0000\u0000\u0000\u030c\u030e\u0003\u009eO\u0000\u030d\u030f"+ + "\u0005J\u0000\u0000\u030e\u030d\u0001\u0000\u0000\u0000\u030e\u030f\u0001"+ + "\u0000\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000\u0310\u0311\u0005"+ + "P\u0000\u0000\u0311\u0312\u0003H$\u0000\u0312\u0334\u0001\u0000\u0000"+ + "\u0000\u0313\u0315\u0003\u009eO\u0000\u0314\u0316\u0005J\u0000\u0000\u0315"+ + "\u0314\u0001\u0000\u0000\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316"+ + "\u0317\u0001\u0000\u0000\u0000\u0317\u0318\u0005I\u0000\u0000\u0318\u0319"+ + "\u0005f\u0000\u0000\u0319\u031e\u0003H$\u0000\u031a\u031b\u0005A\u0000"+ + "\u0000\u031b\u031d\u0003H$\u0000\u031c\u031a\u0001\u0000\u0000\u0000\u031d"+ + "\u0320\u0001\u0000\u0000\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031e"+ + "\u031f\u0001\u0000\u0000\u0000\u031f\u0321\u0001\u0000\u0000\u0000\u0320"+ + "\u031e\u0001\u0000\u0000\u0000\u0321\u0322\u0005g\u0000\u0000\u0322\u0334"+ + "\u0001\u0000\u0000\u0000\u0323\u0325\u0003\u009eO\u0000\u0324\u0326\u0005"+ + "J\u0000\u0000\u0325\u0324\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000"+ + "\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u0328\u0005P\u0000"+ + "\u0000\u0328\u0329\u0005f\u0000\u0000\u0329\u032e\u0003H$\u0000\u032a"+ + "\u032b\u0005A\u0000\u0000\u032b\u032d\u0003H$\u0000\u032c\u032a\u0001"+ + "\u0000\u0000\u0000\u032d\u0330\u0001\u0000\u0000\u0000\u032e\u032c\u0001"+ + "\u0000\u0000\u0000\u032e\u032f\u0001\u0000\u0000\u0000\u032f\u0331\u0001"+ + "\u0000\u0000\u0000\u0330\u032e\u0001\u0000\u0000\u0000\u0331\u0332\u0005"+ + "g\u0000\u0000\u0332\u0334\u0001\u0000\u0000\u0000\u0333\u0305\u0001\u0000"+ + "\u0000\u0000\u0333\u030c\u0001\u0000\u0000\u0000\u0333\u0313\u0001\u0000"+ + "\u0000\u0000\u0333\u0323\u0001\u0000\u0000\u0000\u0334\u009b\u0001\u0000"+ + "\u0000\u0000\u0335\u0338\u00034\u001a\u0000\u0336\u0337\u0005>\u0000\u0000"+ + "\u0337\u0339\u0003\f\u0006\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338"+ + "\u0339\u0001\u0000\u0000\u0000\u0339\u033a\u0001\u0000\u0000\u0000\u033a"+ + "\u033b\u0005?\u0000\u0000\u033b\u033c\u0003\u00aeW\u0000\u033c\u009d\u0001"+ + "\u0000\u0000\u0000\u033d\u0343\u0003\u00a0P\u0000\u033e\u033f\u0003\u00a0"+ + "P\u0000\u033f\u0340\u0003\u00ba]\u0000\u0340\u0341\u0003\u00a0P\u0000"+ + "\u0341\u0343\u0001\u0000\u0000\u0000\u0342\u033d\u0001\u0000\u0000\u0000"+ + "\u0342\u033e\u0001\u0000\u0000\u0000\u0343\u009f\u0001\u0000\u0000\u0000"+ + "\u0344\u0345\u0006P\uffff\uffff\u0000\u0345\u0349\u0003\u00a2Q\u0000\u0346"+ + "\u0347\u0007\u0005\u0000\u0000\u0347\u0349\u0003\u00a0P\u0003\u0348\u0344"+ + "\u0001\u0000\u0000\u0000\u0348\u0346\u0001\u0000\u0000\u0000\u0349\u0352"+ + "\u0001\u0000\u0000\u0000\u034a\u034b\n\u0002\u0000\u0000\u034b\u034c\u0007"+ + "\u0006\u0000\u0000\u034c\u0351\u0003\u00a0P\u0003\u034d\u034e\n\u0001"+ + "\u0000\u0000\u034e\u034f\u0007\u0005\u0000\u0000\u034f\u0351\u0003\u00a0"+ + "P\u0002\u0350\u034a\u0001\u0000\u0000\u0000\u0350\u034d\u0001\u0000\u0000"+ + "\u0000\u0351\u0354\u0001\u0000\u0000\u0000\u0352\u0350\u0001\u0000\u0000"+ + "\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u00a1\u0001\u0000\u0000"+ + "\u0000\u0354\u0352\u0001\u0000\u0000\u0000\u0355\u0356\u0006Q\uffff\uffff"+ + "\u0000\u0356\u035e\u0003\u00aeW\u0000\u0357\u035e\u00034\u001a\u0000\u0358"+ + "\u035e\u0003\u00a4R\u0000\u0359\u035a\u0005f\u0000\u0000\u035a\u035b\u0003"+ + "\u0098L\u0000\u035b\u035c\u0005g\u0000\u0000\u035c\u035e\u0001\u0000\u0000"+ + "\u0000\u035d\u0355\u0001\u0000\u0000\u0000\u035d\u0357\u0001\u0000\u0000"+ + "\u0000\u035d\u0358\u0001\u0000\u0000\u0000\u035d\u0359\u0001\u0000\u0000"+ + "\u0000\u035e\u0364\u0001\u0000\u0000\u0000\u035f\u0360\n\u0001\u0000\u0000"+ + "\u0360\u0361\u0005>\u0000\u0000\u0361\u0363\u0003\f\u0006\u0000\u0362"+ + "\u035f\u0001\u0000\u0000\u0000\u0363\u0366\u0001\u0000\u0000\u0000\u0364"+ + "\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365"+ + "\u00a3\u0001\u0000\u0000\u0000\u0366\u0364\u0001\u0000\u0000\u0000\u0367"+ + "\u0368\u0003\u00a6S\u0000\u0368\u0376\u0005f\u0000\u0000\u0369\u0377\u0005"+ + "\\\u0000\u0000\u036a\u036f\u0003\u0098L\u0000\u036b\u036c\u0005A\u0000"+ + "\u0000\u036c\u036e\u0003\u0098L\u0000\u036d\u036b\u0001\u0000\u0000\u0000"+ + "\u036e\u0371\u0001\u0000\u0000\u0000\u036f\u036d\u0001\u0000\u0000\u0000"+ + "\u036f\u0370\u0001\u0000\u0000\u0000\u0370\u0374\u0001\u0000\u0000\u0000"+ + "\u0371\u036f\u0001\u0000\u0000\u0000\u0372\u0373\u0005A\u0000\u0000\u0373"+ + "\u0375\u0003\u00a8T\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0374\u0375"+ + "\u0001\u0000\u0000\u0000\u0375\u0377\u0001\u0000\u0000\u0000\u0376\u0369"+ + "\u0001\u0000\u0000\u0000\u0376\u036a\u0001\u0000\u0000\u0000\u0376\u0377"+ + "\u0001\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378\u0379"+ + "\u0005g\u0000\u0000\u0379\u00a5\u0001\u0000\u0000\u0000\u037a\u037e\u0003"+ + "F#\u0000\u037b\u037e\u0005E\u0000\u0000\u037c\u037e\u0005H\u0000\u0000"+ + "\u037d\u037a\u0001\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000\u0000"+ + "\u037d\u037c\u0001\u0000\u0000\u0000\u037e\u00a7\u0001\u0000\u0000\u0000"+ + "\u037f\u0388\u0005_\u0000\u0000\u0380\u0385\u0003\u00aaU\u0000\u0381\u0382"+ + "\u0005A\u0000\u0000\u0382\u0384\u0003\u00aaU\u0000\u0383\u0381\u0001\u0000"+ + "\u0000\u0000\u0384\u0387\u0001\u0000\u0000\u0000\u0385\u0383\u0001\u0000"+ + "\u0000\u0000\u0385\u0386\u0001\u0000\u0000\u0000\u0386\u0389\u0001\u0000"+ + "\u0000\u0000\u0387\u0385\u0001\u0000\u0000\u0000\u0388\u0380\u0001\u0000"+ + "\u0000\u0000\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a\u0001\u0000"+ + "\u0000\u0000\u038a\u038b\u0005`\u0000\u0000\u038b\u00a9\u0001\u0000\u0000"+ + "\u0000\u038c\u038d\u0003\u00b8\\\u0000\u038d\u038e\u0005?\u0000\u0000"+ + "\u038e\u038f\u0003\u00acV\u0000\u038f\u00ab\u0001\u0000\u0000\u0000\u0390"+ + "\u0393\u0003\u00aeW\u0000\u0391\u0393\u0003\u00a8T\u0000\u0392\u0390\u0001"+ + "\u0000\u0000\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0393\u00ad\u0001"+ + "\u0000\u0000\u0000\u0394\u03bf\u0005K\u0000\u0000\u0395\u0396\u0003\u00b6"+ + "[\u0000\u0396\u0397\u0005h\u0000\u0000\u0397\u03bf\u0001\u0000\u0000\u0000"+ + "\u0398\u03bf\u0003\u00b4Z\u0000\u0399\u03bf\u0003\u00b6[\u0000\u039a\u03bf"+ + "\u0003\u00b0X\u0000\u039b\u03bf\u0003B!\u0000\u039c\u03bf\u0003\u00b8"+ + "\\\u0000\u039d\u039e\u0005d\u0000\u0000\u039e\u03a3\u0003\u00b2Y\u0000"+ + "\u039f\u03a0\u0005A\u0000\u0000\u03a0\u03a2\u0003\u00b2Y\u0000\u03a1\u039f"+ + "\u0001\u0000\u0000\u0000\u03a2\u03a5\u0001\u0000\u0000\u0000\u03a3\u03a1"+ + "\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000\u03a4\u03a6"+ + "\u0001\u0000\u0000\u0000\u03a5\u03a3\u0001\u0000\u0000\u0000\u03a6\u03a7"+ + "\u0005e\u0000\u0000\u03a7\u03bf\u0001\u0000\u0000\u0000\u03a8\u03a9\u0005"+ + "d\u0000\u0000\u03a9\u03ae\u0003\u00b0X\u0000\u03aa\u03ab\u0005A\u0000"+ + "\u0000\u03ab\u03ad\u0003\u00b0X\u0000\u03ac\u03aa\u0001\u0000\u0000\u0000"+ + "\u03ad\u03b0\u0001\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000"+ + "\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03b1\u0001\u0000\u0000\u0000"+ + "\u03b0\u03ae\u0001\u0000\u0000\u0000\u03b1\u03b2\u0005e\u0000\u0000\u03b2"+ + "\u03bf\u0001\u0000\u0000\u0000\u03b3\u03b4\u0005d\u0000\u0000\u03b4\u03b9"+ + "\u0003\u00b8\\\u0000\u03b5\u03b6\u0005A\u0000\u0000\u03b6\u03b8\u0003"+ + "\u00b8\\\u0000\u03b7\u03b5\u0001\u0000\u0000\u0000\u03b8\u03bb\u0001\u0000"+ + "\u0000\u0000\u03b9\u03b7\u0001\u0000\u0000\u0000\u03b9\u03ba\u0001\u0000"+ + "\u0000\u0000\u03ba\u03bc\u0001\u0000\u0000\u0000\u03bb\u03b9\u0001\u0000"+ + "\u0000\u0000\u03bc\u03bd\u0005e\u0000\u0000\u03bd\u03bf\u0001\u0000\u0000"+ + "\u0000\u03be\u0394\u0001\u0000\u0000\u0000\u03be\u0395\u0001\u0000\u0000"+ + "\u0000\u03be\u0398\u0001\u0000\u0000\u0000\u03be\u0399\u0001\u0000\u0000"+ + "\u0000\u03be\u039a\u0001\u0000\u0000\u0000\u03be\u039b\u0001\u0000\u0000"+ + "\u0000\u03be\u039c\u0001\u0000\u0000\u0000\u03be\u039d\u0001\u0000\u0000"+ + "\u0000\u03be\u03a8\u0001\u0000\u0000\u0000\u03be\u03b3\u0001\u0000\u0000"+ + "\u0000\u03bf\u00af\u0001\u0000\u0000\u0000\u03c0\u03c1\u0007\u0007\u0000"+ + "\u0000\u03c1\u00b1\u0001\u0000\u0000\u0000\u03c2\u03c5\u0003\u00b4Z\u0000"+ + "\u03c3\u03c5\u0003\u00b6[\u0000\u03c4\u03c2\u0001\u0000\u0000\u0000\u03c4"+ + "\u03c3\u0001\u0000\u0000\u0000\u03c5\u00b3\u0001\u0000\u0000\u0000\u03c6"+ + "\u03c8\u0007\u0005\u0000\u0000\u03c7\u03c6\u0001\u0000\u0000\u0000\u03c7"+ + "\u03c8\u0001\u0000\u0000\u0000\u03c8\u03c9\u0001\u0000\u0000\u0000\u03c9"+ + "\u03ca\u00059\u0000\u0000\u03ca\u00b5\u0001\u0000\u0000\u0000\u03cb\u03cd"+ + "\u0007\u0005\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cc\u03cd"+ + "\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce\u03cf"+ + "\u00058\u0000\u0000\u03cf\u00b7\u0001\u0000\u0000\u0000\u03d0\u03d1\u0005"+ + "7\u0000\u0000\u03d1\u00b9\u0001\u0000\u0000\u0000\u03d2\u03d3\u0007\b"+ + "\u0000\u0000\u03d3\u00bb\u0001\u0000\u0000\u0000\u03d4\u03d5\u0007\t\u0000"+ + "\u0000\u03d5\u03d6\u0005\u007f\u0000\u0000\u03d6\u03d7\u0003\u00be_\u0000"+ + "\u03d7\u03d8\u0003\u00c0`\u0000\u03d8\u00bd\u0001\u0000\u0000\u0000\u03d9"+ + "\u03da\u0004_\u000f\u0000\u03da\u03dc\u0003 \u0010\u0000\u03db\u03dd\u0005"+ + "\u009b\u0000\u0000\u03dc\u03db\u0001\u0000\u0000\u0000\u03dc\u03dd\u0001"+ + "\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000\u0000\u03de\u03df\u0005"+ + "n\u0000\u0000\u03df\u03e2\u0001\u0000\u0000\u0000\u03e0\u03e2\u0003 \u0010"+ + "\u0000\u03e1\u03d9\u0001\u0000\u0000\u0000\u03e1\u03e0\u0001\u0000\u0000"+ + "\u0000\u03e2\u00bf\u0001\u0000\u0000\u0000\u03e3\u03e4\u0005M\u0000\u0000"+ + "\u03e4\u03e9\u0003\u0098L\u0000\u03e5\u03e6\u0005A\u0000\u0000\u03e6\u03e8"+ + "\u0003\u0098L\u0000\u03e7\u03e5\u0001\u0000\u0000\u0000\u03e8\u03eb\u0001"+ + "\u0000\u0000\u0000\u03e9\u03e7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0001"+ + "\u0000\u0000\u0000\u03ea\u00c1\u0001\u0000\u0000\u0000\u03eb\u03e9\u0001"+ + "\u0000\u0000\u0000\u03ec\u03f0\u0005$\u0000\u0000\u03ed\u03ef\u0003\u00c6"+ + "c\u0000\u03ee\u03ed\u0001\u0000\u0000\u0000\u03ef\u03f2\u0001\u0000\u0000"+ + "\u0000\u03f0\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000"+ + "\u0000\u03f1\u03f6\u0001\u0000\u0000\u0000\u03f2\u03f0\u0001\u0000\u0000"+ + "\u0000\u03f3\u03f4\u0003\u00c4b\u0000\u03f4\u03f5\u0005<\u0000\u0000\u03f5"+ + "\u03f7\u0001\u0000\u0000\u0000\u03f6\u03f3\u0001\u0000\u0000\u0000\u03f6"+ + "\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0001\u0000\u0000\u0000\u03f8"+ + "\u03fa\u0005f\u0000\u0000\u03f9\u03fb\u0003\u00ceg\u0000\u03fa\u03f9\u0001"+ + "\u0000\u0000\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000\u03fc\u03fa\u0001"+ + "\u0000\u0000\u0000\u03fc\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe\u0001"+ + "\u0000\u0000\u0000\u03fe\u03ff\u0005g\u0000\u0000\u03ff\u040d\u0001\u0000"+ + "\u0000\u0000\u0400\u0404\u0005$\u0000\u0000\u0401\u0403\u0003\u00c6c\u0000"+ + "\u0402\u0401\u0001\u0000\u0000\u0000\u0403\u0406\u0001\u0000\u0000\u0000"+ + "\u0404\u0402\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000\u0000"+ + "\u0405\u0408\u0001\u0000\u0000\u0000\u0406\u0404\u0001\u0000\u0000\u0000"+ + "\u0407\u0409\u0003\u00ceg\u0000\u0408\u0407\u0001\u0000\u0000\u0000\u0409"+ + "\u040a\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000\u0000\u0000\u040a"+ + "\u040b\u0001\u0000\u0000\u0000\u040b\u040d\u0001\u0000\u0000\u0000\u040c"+ + "\u03ec\u0001\u0000\u0000\u0000\u040c\u0400\u0001\u0000\u0000\u0000\u040d"+ + "\u00c3\u0001\u0000\u0000\u0000\u040e\u040f\u0007\u0001\u0000\u0000\u040f"+ + "\u00c5\u0001\u0000\u0000\u0000\u0410\u0411\u0003\u00c8d\u0000\u0411\u0412"+ + "\u0005<\u0000\u0000\u0412\u0413\u0003\u00cae\u0000\u0413\u00c7\u0001\u0000"+ + "\u0000\u0000\u0414\u0415\u0007\n\u0000\u0000\u0415\u00c9\u0001\u0000\u0000"+ + "\u0000\u0416\u041b\u0003\u00d0h\u0000\u0417\u0418\u0005A\u0000\u0000\u0418"+ + "\u041a\u0003\u00d0h\u0000\u0419\u0417\u0001\u0000\u0000\u0000\u041a\u041d"+ + "\u0001\u0000\u0000\u0000\u041b\u0419\u0001\u0000\u0000\u0000\u041b\u041c"+ + "\u0001\u0000\u0000\u0000\u041c\u0421\u0001\u0000\u0000\u0000\u041d\u041b"+ + "\u0001\u0000\u0000\u0000\u041e\u0421\u0005i\u0000\u0000\u041f\u0421\u0005"+ + "b\u0000\u0000\u0420\u0416\u0001\u0000\u0000\u0000\u0420\u041e\u0001\u0000"+ + "\u0000\u0000\u0420\u041f\u0001\u0000\u0000\u0000\u0421\u00cb\u0001\u0000"+ + "\u0000\u0000\u0422\u0423\u0007\u000b\u0000\u0000\u0423\u00cd\u0001\u0000"+ + "\u0000\u0000\u0424\u0426\u0003\u00ccf\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\u0432\u0001\u0000\u0000"+ + "\u0000\u0429\u042d\u0005f\u0000\u0000\u042a\u042c\u0003\u00ceg\u0000\u042b"+ + "\u042a\u0001\u0000\u0000\u0000\u042c\u042f\u0001\u0000\u0000\u0000\u042d"+ + "\u042b\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e"+ + "\u0430\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u0430"+ + "\u0432\u0005g\u0000\u0000\u0431\u0425\u0001\u0000\u0000\u0000\u0431\u0429"+ + "\u0001\u0000\u0000\u0000\u0432\u00cf\u0001\u0000\u0000\u0000\u0433\u0434"+ + "\u0003\u00d2i\u0000\u0434\u0435\u0005?\u0000\u0000\u0435\u0436\u0003\u00d6"+ + "k\u0000\u0436\u043d\u0001\u0000\u0000\u0000\u0437\u0438\u0003\u00d6k\u0000"+ + "\u0438\u0439\u0005>\u0000\u0000\u0439\u043a\u0003\u00d4j\u0000\u043a\u043d"+ + "\u0001\u0000\u0000\u0000\u043b\u043d\u0003\u00d8l\u0000\u043c\u0433\u0001"+ + "\u0000\u0000\u0000\u043c\u0437\u0001\u0000\u0000\u0000\u043c\u043b\u0001"+ + "\u0000\u0000\u0000\u043d\u00d1\u0001\u0000\u0000\u0000\u043e\u043f\u0007"+ + "\f\u0000\u0000\u043f\u00d3\u0001\u0000\u0000\u0000\u0440\u0441\u0007\f"+ + "\u0000\u0000\u0441\u00d5\u0001\u0000\u0000\u0000\u0442\u0443\u0007\f\u0000"+ + "\u0000\u0443\u00d7\u0001\u0000\u0000\u0000\u0444\u0445\u0007\r\u0000\u0000"+ + "\u0445\u00d9\u0001\u0000\u0000\u0000l\u00dd\u00ee\u00fa\u0117\u0126\u012c"+ + "\u013f\u0143\u0148\u0150\u0158\u015d\u0160\u0170\u0178\u017c\u0183\u0189"+ + "\u018e\u0197\u019e\u01a4\u01ad\u01b4\u01bc\u01c4\u01c8\u01cc\u01d1\u01d5"+ + "\u01e0\u01e5\u01e9\u01f7\u0202\u0208\u020f\u0218\u0221\u0235\u023d\u0240"+ + "\u0247\u0252\u0259\u0261\u026f\u0278\u0283\u028d\u0293\u0295\u0299\u029e"+ + "\u02ac\u02b3\u02cb\u02cf\u02d9\u02e2\u02eb\u02f3\u02f8\u0300\u0302\u0307"+ + "\u030e\u0315\u031e\u0325\u032e\u0333\u0338\u0342\u0348\u0350\u0352\u035d"+ + "\u0364\u036f\u0374\u0376\u037d\u0385\u0388\u0392\u03a3\u03ae\u03b9\u03be"+ + "\u03c4\u03c7\u03cc\u03dc\u03e1\u03e9\u03f0\u03f6\u03fc\u0404\u040a\u040c"+ + "\u041b\u0420\u0427\u042d\u0431\u043c"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java index 630baad635e5e..f117a3b9c131c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java @@ -920,6 +920,18 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener { *

The default implementation does nothing.

*/ @Override public void exitInsistCommand(EsqlBaseParser.InsistCommandContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java index 7f578aad2f67d..81cae29ff3f2d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java @@ -545,6 +545,13 @@ public class EsqlBaseParserBaseVisitor extends AbstractParseTreeVisitor im * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitInsistCommand(EsqlBaseParser.InsistCommandContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java index 85566ca732394..04f8688820121 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java @@ -785,6 +785,16 @@ public interface EsqlBaseParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitInsistCommand(EsqlBaseParser.InsistCommandContext ctx); + /** + * Enter a parse tree produced by {@link EsqlBaseParser#uriPartsCommand}. + * @param ctx the parse tree + */ + void enterUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx); + /** + * Exit a parse tree produced by {@link EsqlBaseParser#uriPartsCommand}. + * @param ctx the parse tree + */ + void exitUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx); /** * Enter a parse tree produced by {@link EsqlBaseParser#setCommand}. * @param ctx the parse tree diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java index 492b1d5f242b0..4d306a934f92f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java @@ -478,6 +478,12 @@ public interface EsqlBaseParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitInsistCommand(EsqlBaseParser.InsistCommandContext ctx); + /** + * Visit a parse tree produced by {@link EsqlBaseParser#uriPartsCommand}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx); /** * Visit a parse tree produced by {@link EsqlBaseParser#setCommand}. * @param ctx the parse tree diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java index 69a8fea28c8e0..51f449bf230d2 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java @@ -85,6 +85,7 @@ import org.elasticsearch.xpack.esql.plan.logical.UnionAll; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedExternalRelation; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.fuse.Fuse; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.InferencePlan; @@ -463,6 +464,23 @@ public PlanFactory visitInsistCommand(EsqlBaseParser.InsistCommandContext ctx) { ); } + @Override + public PlanFactory visitUriPartsCommand(EsqlBaseParser.UriPartsCommandContext ctx) { + Source source = source(ctx); + + Attribute outputPrefix = visitQualifiedName(ctx.qualifiedName()); + if (outputPrefix == null) { + throw new ParsingException(source, "URI_PARTS command requires an output field prefix"); + } + + Expression input = expression(ctx.primaryExpression()); + if (input == null) { + throw new ParsingException(source, "URI_PARTS command requires an input expression"); + } + + return child -> UriParts.createInitialInstance(source, child, input, outputPrefix); + } + @Override public PlanFactory visitStatsCommand(EsqlBaseParser.StatsCommandContext ctx) { final Stats stats = stats(source(ctx), ctx.grouping, ctx.stats); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java index 604ca88ecda32..a69bfa7c962a6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java @@ -26,6 +26,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Subquery; import org.elasticsearch.xpack.esql.plan.logical.TimeSeriesAggregate; import org.elasticsearch.xpack.esql.plan.logical.TopN; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.logical.join.InlineJoin; @@ -58,6 +59,7 @@ import org.elasticsearch.xpack.esql.plan.physical.SubqueryExec; import org.elasticsearch.xpack.esql.plan.physical.TimeSeriesAggregateExec; import org.elasticsearch.xpack.esql.plan.physical.TopNExec; +import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; import org.elasticsearch.xpack.esql.plan.physical.inference.CompletionExec; import org.elasticsearch.xpack.esql.plan.physical.inference.RerankExec; @@ -99,7 +101,8 @@ public static List logical() { Sample.ENTRY, Subquery.ENTRY, TimeSeriesAggregate.ENTRY, - TopN.ENTRY + TopN.ENTRY, + UriParts.ENTRY ); } @@ -130,7 +133,8 @@ public static List physical() { ShowExec.ENTRY, SubqueryExec.ENTRY, TimeSeriesAggregateExec.ENTRY, - TopNExec.ENTRY + TopNExec.ENTRY, + UriPartsExec.ENTRY ); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/CompoundOutputEval.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/CompoundOutputEval.java new file mode 100644 index 0000000000000..9149fdbfcb8a6 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/CompoundOutputEval.java @@ -0,0 +1,258 @@ +/* + * 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.esql.plan.logical; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.esql.capabilities.PostAnalysisVerificationAware; +import org.elasticsearch.xpack.esql.capabilities.TelemetryAware; +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.AttributeSet; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.NameId; +import org.elasticsearch.xpack.esql.core.expression.Nullability; +import org.elasticsearch.xpack.esql.core.expression.ReferenceAttribute; +import org.elasticsearch.xpack.esql.core.tree.NodeInfo; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput; +import org.elasticsearch.xpack.esql.plan.GeneratingPlan; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Objects; + +import static org.elasticsearch.xpack.esql.expression.NamedExpressions.mergeOutputAttributes; + +/** + * Base class for logical plan nodes that make a single evaluation on a single input expression and produce multiple output columns. + *

+ * NOTE: The construction of the initial instance of the {@link CompoundOutputEval} subclass computes the output attributes based on + * the specific evaluator's output columns and the provided prefix. Therefore, it should be used only when the node is first created. + * In order to ensure this, there is no constructor that makes this computation directly. Instead, the initial instance creation should be + * done through a static method like {@code createInitialInstance(...)} that makes use of the static {@link #computeOutputAttributes} + * method. + * Any subsequent instance construction, such as deserialization, regeneration with new names, or child replacement, should use the + * constructor that directly accepts the output fields. + */ +public abstract class CompoundOutputEval> extends UnaryPlan + implements + TelemetryAware, + GeneratingPlan>, + PostAnalysisVerificationAware, + Streaming { + + /** + * The input by which the evaluation is performed. + */ + protected final Expression input; + + /** + * A list of the output field names expected by the evaluation function that corresponds to the concrete subclass. + * The output field names are NOT equivalent to the names of the corresponding output attributes, which would have a common prefix + * added to them. + * See {@link #computeOutputAttributes} for the conversion from function output fields to output attributes. + * We must keep the original list by which the output fields are computed to propagate it so to ensure they are fully in sync, even if + * the eventual computation is executed on a data node different from the one where the plan is created. + */ + private final List outputFieldNames; + + /** + * The output columns of this command. Fully corresponding to the attributes in the {@link #outputFieldNames} list in order and count. + * Names are also corresponding, though not equivalent as they would have a common prefix added to them. + * See {@link #computeOutputAttributes} for the conversion from function output fields to output attributes. + */ + private final List outputFieldAttributes; + + /** + * This constructor directly accepts the output fields. It should be used for deserialization, regeneration with new names, + * child replacement, or other scenarios where the output fields are already known. + * + * @param source the source information + * @param child the child logical plan + * @param input the input expression + * @param outputFieldAttributes the output attributes + */ + protected CompoundOutputEval( + Source source, + LogicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + super(source, child); + if (outputFieldNames.size() != outputFieldAttributes.size()) { + throw new IllegalArgumentException("functionOutputFields and outputFields must have the same size"); + } + this.input = input; + this.outputFieldNames = outputFieldNames; + this.outputFieldAttributes = outputFieldAttributes; + } + + /** + * This constructor is used for the deserialization of a {@link CompoundOutputEval} instance from a {@link StreamInput}. + * Subclasses should call this constructor from their own deserialization constructor. + * + * @param in the input stream to read from + * @throws IOException if an I/O error occurs + */ + protected CompoundOutputEval(StreamInput in) throws IOException { + this( + Source.readFrom((PlanStreamInput) in), + in.readNamedWriteable(LogicalPlan.class), + in.readNamedWriteable(Expression.class), + in.readCollectionAsList(StreamInput::readString), + in.readNamedWriteableCollectionAsList(Attribute.class) + ); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + source().writeTo(out); + out.writeNamedWriteable(child()); + out.writeNamedWriteable(input); + out.writeStringCollection(outputFieldNames); + out.writeNamedWriteableCollection(outputFieldAttributes); + } + + /** + * Computes the output attributes based on the provided output columns and prefix. + * + * @param outputColumns the output columns by which the output attributes should be named and typed + * @param outputFieldPrefix the prefix to be used for the output field names + * @param source the source information for the attributes + * @return a list of computed output attributes + */ + protected static List computeOutputAttributes( + final LinkedHashMap> outputColumns, + final String outputFieldPrefix, + final Source source + ) { + return outputColumns.entrySet() + .stream() + .map( + entry -> (Attribute) new ReferenceAttribute( + source, + null, + outputFieldPrefix + "." + entry.getKey(), + DataType.fromJavaType(entry.getValue()), + Nullability.TRUE, + null, + false + ) + ) + .toList(); + } + + /** + * Creates a new instance of the specific {@link CompoundOutputEval} subclass with the provided parameters. + * Subclasses should call their corresponding constructor with the provided arguments and the concrete evaluator instance. + * + * @param source the source information + * @param child the child logical plan + * @param input the input expression + * @param outputFieldNames the output field names, used for the computation of the output attributes + * @param outputFieldAttributes the output attributes + * @return a new instance of the specific {@link CompoundOutputEval} subclass + */ + public abstract T createNewInstance( + Source source, + LogicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ); + + public Expression getInput() { + return input; + } + + public List outputFieldNames() { + return outputFieldNames; + } + + @Override + public List generatedAttributes() { + return outputFieldAttributes; + } + + /** + * By explicitly returning the references of the {@link #input} expression, we implicitly exclude the generated fields from the + * references that require resolution. + * @return only the input expression references + */ + @Override + protected AttributeSet computeReferences() { + return input.references(); + } + + @Override + public T withGeneratedNames(List newNames) { + checkNumberOfNewNames(newNames); + + List renamedFields = new ArrayList<>(newNames.size()); + for (int i = 0; i < newNames.size(); i++) { + Attribute oldAttribute = outputFieldAttributes.get(i); + String newName = newNames.get(i); + if (oldAttribute.name().equals(newName)) { + renamedFields.add(oldAttribute); + } else { + renamedFields.add(oldAttribute.withName(newName).withId(new NameId())); + } + } + + return createNewInstance(source(), child(), input, outputFieldNames, renamedFields); + } + + @Override + public List output() { + return mergeOutputAttributes(generatedAttributes(), child().output()); + } + + @Override + public T replaceChild(LogicalPlan newChild) { + return createNewInstance(source(), newChild, input, outputFieldNames, outputFieldAttributes); + } + + @Override + public boolean expressionsResolved() { + return input.resolved(); + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, this::createNewInstance, child(), input, outputFieldNames, outputFieldAttributes); + } + + protected abstract int innerHashCode(); + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), input, innerHashCode(), outputFieldNames, outputFieldAttributes, getClass()); + } + + protected abstract boolean innerEquals(CompoundOutputEval other); + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (super.equals(obj) == false) { + return false; + } + CompoundOutputEval other = (CompoundOutputEval) obj; + return Objects.equals(input, other.input) + && Objects.equals(outputFieldNames, other.outputFieldNames) + && Objects.equals(outputFieldAttributes, other.outputFieldAttributes) + && Objects.equals(this.getClass(), other.getClass()) + && innerEquals(other); + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/UriParts.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/UriParts.java new file mode 100644 index 0000000000000..9c02604ea3daf --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/UriParts.java @@ -0,0 +1,102 @@ +/* + * 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.esql.plan.logical; + +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.xpack.esql.common.Failures; +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.evaluator.command.UriPartsFunctionBridge; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; + +import static org.elasticsearch.xpack.esql.common.Failure.fail; + +/** + * The logical plan for the {@code URI_PARTS} command. + */ +public class UriParts extends CompoundOutputEval { + + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(LogicalPlan.class, "UriParts", UriParts::new); + + /** + * Use this static factory method for the initial creation of the logical plan, as it computes the output attributes. + * Subsequent instantiations (such as deserialization, child replacement, etc.) should use the constructors. + * @param source source of the command + * @param child child plan + * @param input input expression to base the computation on + * @param outputFieldPrefix the prefix to be used for the output field names + * @return the logical plan + */ + public static UriParts createInitialInstance(Source source, LogicalPlan child, Expression input, Attribute outputFieldPrefix) { + LinkedHashMap> functionOutputFields = UriPartsFunctionBridge.getAllOutputFields(); + List outputFileNames = functionOutputFields.keySet().stream().toList(); + List outputFieldAttributes = computeOutputAttributes(functionOutputFields, outputFieldPrefix.name(), source); + return new UriParts(source, child, input, outputFileNames, outputFieldAttributes); + } + + public UriParts( + Source source, + LogicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + super(source, child, input, outputFieldNames, outputFieldAttributes); + } + + public UriParts(StreamInput in) throws IOException { + super(in); + } + + @Override + public UriParts createNewInstance( + Source source, + LogicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + return new UriParts(source, child, input, outputFieldNames, outputFieldAttributes); + } + + @Override + protected int innerHashCode() { + return 0; + } + + @Override + protected boolean innerEquals(CompoundOutputEval other) { + return other instanceof UriParts; + } + + @Override + public String getWriteableName() { + return ENTRY.name; + } + + @Override + public String telemetryLabel() { + return "URI_PARTS"; + } + + @Override + public void postAnalysisVerification(Failures failures) { + if (input.resolved()) { + DataType type = input.dataType(); + if (DataType.isString(type) == false) { + failures.add(fail(input, "Input for URI_PARTS must be of type [string] but is [{}]", type.typeName())); + } + } + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java new file mode 100644 index 0000000000000..9eb18f2e3ea21 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java @@ -0,0 +1,163 @@ +/* + * 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.esql.plan.physical; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.AttributeSet; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.NodeInfo; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator; +import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; + +import static org.elasticsearch.xpack.esql.expression.NamedExpressions.mergeOutputAttributes; + +/** + * Abstract base class for physical plans that produce compound outputs from a single input. + */ +public abstract class CompoundOutputEvalExec extends UnaryExec + implements + EstimatesRowSize, + CompoundOutputEvaluator.OutputFieldsCollectorProvider { + + /** + * The input by which the evaluation is performed. + */ + protected final Expression input; + + /** + * A list of the output field names expected by the evaluation function that corresponds to the concrete subclass. + * From all fields that can actually be returned by the evalating function, this list defines the ones that should be used to + * popolate the {@link #outputFieldAttributes} list. The entries of this list are not guaranteed to be exactly equal to the + * output fields returned by the evaluating function. In case of a mismatch, the missing fields will be populated with null values. + * The {@link #outputFieldAttributes} entries ARE guaranteed to be equivalent to the keys of this list in order, type, and count. + * Names in the {@link #outputFieldAttributes} list are also corresponding the keys of this list, but they are prefixed with a common + * prefix. + */ + private final List outputFieldNames; + + /** + * The output columns of this command. Fully corresponding to the entries of {@link #outputFieldNames} in order, types, and count. + * Names are also corresponding, though not equivalent as they would have a common prefix added to them. + */ + private final List outputFieldAttributes; + + public CompoundOutputEvalExec( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + super(source, child); + this.input = input; + this.outputFieldNames = outputFieldNames; + this.outputFieldAttributes = outputFieldAttributes; + } + + public CompoundOutputEvalExec(StreamInput in) throws IOException { + this( + Source.readFrom((PlanStreamInput) in), + in.readNamedWriteable(PhysicalPlan.class), + in.readNamedWriteable(Expression.class), + in.readCollectionAsList(StreamInput::readString), + in.readNamedWriteableCollectionAsList(Attribute.class) + ); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + source().writeTo(out); + out.writeNamedWriteable(child()); + out.writeNamedWriteable(input); + out.writeStringCollection(outputFieldNames); + out.writeNamedWriteableCollection(outputFieldAttributes); + } + + /** + * Creates a new instance of the specific {@link CompoundOutputEvalExec} subclass with the provided parameters. + */ + public abstract CompoundOutputEvalExec createNewInstance( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFields + ); + + @Override + public List output() { + return mergeOutputAttributes(outputFieldAttributes, child().output()); + } + + @Override + protected AttributeSet computeReferences() { + return input.references(); + } + + public Expression input() { + return input; + } + + public List outputFieldNames() { + return outputFieldNames; + } + + public List outputFieldAttributes() { + return outputFieldAttributes; + } + + @Override + public PhysicalPlan estimateRowSize(State state) { + state.add(false, outputFieldAttributes); + return this; + } + + @Override + public UnaryExec replaceChild(PhysicalPlan newChild) { + return createNewInstance(source(), newChild, input, outputFieldNames, outputFieldAttributes); + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, this::createNewInstance, child(), input, outputFieldNames, outputFieldAttributes); + } + + protected abstract boolean innerEquals(CompoundOutputEvalExec other); + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (super.equals(o) == false) { + return false; + } + CompoundOutputEvalExec that = (CompoundOutputEvalExec) o; + return Objects.equals(input, that.input) + && Objects.equals(outputFieldNames, that.outputFieldNames) + && Objects.equals(outputFieldAttributes, that.outputFieldAttributes) + && innerEquals(that); + } + + protected abstract int innerHashCode(); + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), input, outputFieldNames, outputFieldAttributes, innerHashCode()); + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java new file mode 100644 index 0000000000000..bc472b83017cf --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java @@ -0,0 +1,81 @@ +/* + * 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.esql.plan.physical; + +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator; +import org.elasticsearch.xpack.esql.evaluator.command.UriPartsFunctionBridge; + +import java.io.IOException; +import java.util.List; + +/** + * Physical plan for the URI_PARTS command. + */ +public class UriPartsExec extends CompoundOutputEvalExec { + + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( + PhysicalPlan.class, + "UriPartsExec", + UriPartsExec::new + ); + + public UriPartsExec( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + super(source, child, input, outputFieldNames, outputFieldAttributes); + } + + public UriPartsExec(StreamInput in) throws IOException { + super(in); + } + + @Override + public String getWriteableName() { + return ENTRY.name; + } + + @Override + public CompoundOutputEvalExec createNewInstance( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + return new UriPartsExec(source, child, input, outputFieldNames, outputFieldAttributes); + } + + @Override + public CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector() { + return new UriPartsFunctionBridge.UriPartsCollectorImpl(outputFieldNames()); + } + + @Override + public String collectorSimpleName() { + return UriPartsFunctionBridge.UriPartsCollectorImpl.class.getSimpleName(); + } + + @Override + protected boolean innerEquals(CompoundOutputEvalExec other) { + return other instanceof UriPartsExec; + } + + @Override + protected int innerHashCode() { + return 0; + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java index 4a26104f57ef9..8751c4ea805c6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java @@ -98,6 +98,7 @@ import org.elasticsearch.xpack.esql.enrich.LookupFromIndexService; import org.elasticsearch.xpack.esql.enrich.MatchConfig; import org.elasticsearch.xpack.esql.evaluator.EvalMapper; +import org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator; import org.elasticsearch.xpack.esql.evaluator.command.GrokEvaluatorExtracter; import org.elasticsearch.xpack.esql.expression.Foldables; import org.elasticsearch.xpack.esql.expression.Order; @@ -108,6 +109,7 @@ import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan; import org.elasticsearch.xpack.esql.plan.physical.AggregateExec; import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec; +import org.elasticsearch.xpack.esql.plan.physical.CompoundOutputEvalExec; import org.elasticsearch.xpack.esql.plan.physical.DissectExec; import org.elasticsearch.xpack.esql.plan.physical.EnrichExec; import org.elasticsearch.xpack.esql.plan.physical.EsQueryExec; @@ -298,6 +300,8 @@ private PhysicalOperation plan(PhysicalPlan node, LocalExecutionPlannerContext c return planCompletion(completion, context); } else if (node instanceof SampleExec Sample) { return planSample(Sample, context); + } else if (node instanceof CompoundOutputEvalExec coe) { + return planCompoundOutputEval(coe, context); } // source nodes @@ -351,6 +355,29 @@ private PhysicalOperation planMMR(MMRExec mmr, LocalExecutionPlannerContext cont return source.with(new MMROperator.Factory(diversifyField, diversifyFieldChannel, limit, queryVector, lambdaValue), source.layout); } + private PhysicalOperation planCompoundOutputEval(final CompoundOutputEvalExec coe, LocalExecutionPlannerContext context) { + PhysicalOperation source = plan(coe.child(), context); + Layout.Builder layoutBuilder = source.layout.builder(); + layoutBuilder.append(coe.outputFieldAttributes()); + + ElementType[] types = new ElementType[coe.outputFieldAttributes().size()]; + for (int i = 0; i < coe.outputFieldAttributes().size(); i++) { + types[i] = PlannerUtils.toElementType(coe.outputFieldAttributes().get(i).dataType()); + } + + Layout layout = layoutBuilder.build(); + + source = source.with( + new ColumnExtractOperator.Factory( + types, + EvalMapper.toEvaluator(context.foldCtx(), coe.input(), layout), + new CompoundOutputEvaluator.Factory(coe.input().dataType(), coe.source(), coe) + ), + layout + ); + return source; + } + private PhysicalOperation planCompletion(CompletionExec completion, LocalExecutionPlannerContext context) { PhysicalOperation source = plan(completion.child(), context); String inferenceId = BytesRefs.toString(completion.inferenceId().fold(context.foldCtx())); @@ -604,8 +631,8 @@ private PhysicalOperation planGrok(GrokExec grok, LocalExecutionPlannerContext c Layout.Builder layoutBuilder = source.layout.builder(); List extractedFields = grok.extractedFields(); layoutBuilder.append(extractedFields); - Map fieldToPos = Maps.newHashMapWithExpectedSize(extractedFields.size()); - Map fieldToType = Maps.newHashMapWithExpectedSize(extractedFields.size()); + final Map fieldToPos = Maps.newHashMapWithExpectedSize(extractedFields.size()); + final Map fieldToType = Maps.newHashMapWithExpectedSize(extractedFields.size()); ElementType[] types = new ElementType[extractedFields.size()]; List extractedFieldsFromPattern = grok.pattern().extractedFields(); for (int i = 0; i < extractedFields.size(); i++) { @@ -624,7 +651,7 @@ private PhysicalOperation planGrok(GrokExec grok, LocalExecutionPlannerContext c new ColumnExtractOperator.Factory( types, EvalMapper.toEvaluator(context.foldCtx(), grok.inputExpression(), layout), - () -> new GrokEvaluatorExtracter(grok.pattern().grok(), grok.pattern().pattern(), fieldToPos, fieldToType) + new GrokEvaluatorExtracter.Factory(grok.pattern().grok(), grok.pattern().pattern(), fieldToPos, fieldToType) ), layout ); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java index 9fd2568389ea9..55d8fae95c228 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java @@ -28,6 +28,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Subquery; import org.elasticsearch.xpack.esql.plan.logical.TimeSeriesAggregate; import org.elasticsearch.xpack.esql.plan.logical.UnaryPlan; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.fuse.FuseScoreEval; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; @@ -49,6 +50,7 @@ import org.elasticsearch.xpack.esql.plan.physical.SampleExec; import org.elasticsearch.xpack.esql.plan.physical.ShowExec; import org.elasticsearch.xpack.esql.plan.physical.TimeSeriesAggregateExec; +import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; import org.elasticsearch.xpack.esql.plan.physical.inference.CompletionExec; import org.elasticsearch.xpack.esql.plan.physical.inference.RerankExec; import org.elasticsearch.xpack.esql.planner.AbstractPhysicalOperationProviders; @@ -169,6 +171,16 @@ static PhysicalPlan mapUnary(UnaryPlan p, PhysicalPlan child) { return child; } + if (p instanceof UriParts uriParts) { + return new UriPartsExec( + uriParts.source(), + child, + uriParts.getInput(), + uriParts.outputFieldNames(), + uriParts.generatedAttributes() + ); + } + return unsupported(p); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/FieldNameUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/FieldNameUtils.java index 18a1cbfce75d0..5996b2fb681a7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/FieldNameUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/FieldNameUtils.java @@ -25,6 +25,7 @@ import org.elasticsearch.xpack.esql.expression.function.grouping.TBucket; import org.elasticsearch.xpack.esql.expression.function.scalar.date.TRange; import org.elasticsearch.xpack.esql.plan.logical.Aggregate; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.Drop; import org.elasticsearch.xpack.esql.plan.logical.Enrich; import org.elasticsearch.xpack.esql.plan.logical.Eval; @@ -185,6 +186,9 @@ public static PreAnalysisResult resolveFieldNames(LogicalPlan parsed, boolean ha } else if (p instanceof RegexExtract re) { // for Grok and Dissect // keep the inputs needed by Grok/Dissect referencesBuilder.get().addAll(re.input().references()); + } else if (p instanceof CompoundOutputEval coe) { + // keep the input field needed by the CompoundOutputEval + referencesBuilder.get().addAll(coe.getInput().references()); } else if (p instanceof Enrich enrich) { AttributeSet enrichFieldRefs = Expressions.references(enrich.enrichFields()); AttributeSet.Builder enrichRefs = enrichFieldRefs.combine(enrich.matchField().references()).asBuilder(); @@ -332,6 +336,7 @@ private static boolean couldOverrideAliases(LogicalPlan p) { || p instanceof OrderBy || p instanceof Project || p instanceof RegexExtract + || p instanceof CompoundOutputEval || p instanceof Rename || p instanceof TopN || p instanceof UnresolvedRelation) == false; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java index 1c4a16a9a787e..bf1876993ecdc 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java @@ -36,6 +36,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Subquery; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedExternalRelation; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.fuse.Fuse; import org.elasticsearch.xpack.esql.plan.logical.fuse.FuseScoreEval; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; @@ -82,7 +83,8 @@ public enum FeatureMetric { SAMPLE(Sample.class::isInstance), SUBQUERY(Subquery.class::isInstance), MMR(MMR.class::isInstance), - PROMQL(PromqlCommand.class::isInstance); + PROMQL(PromqlCommand.class::isInstance), + URI_PARTS(UriParts.class::isInstance); /** * List here plans we want to exclude from telemetry diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java index 125d0c009a89e..8117a0b7daf3f 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java @@ -115,6 +115,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Subquery; import org.elasticsearch.xpack.esql.plan.logical.UnionAll; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.fuse.FuseScoreEval; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; @@ -139,6 +140,16 @@ import static org.elasticsearch.test.ListMatcher.matchesList; import static org.elasticsearch.test.MapMatcher.assertMap; +import static org.elasticsearch.web.UriParts.DOMAIN; +import static org.elasticsearch.web.UriParts.EXTENSION; +import static org.elasticsearch.web.UriParts.FRAGMENT; +import static org.elasticsearch.web.UriParts.PASSWORD; +import static org.elasticsearch.web.UriParts.PATH; +import static org.elasticsearch.web.UriParts.PORT; +import static org.elasticsearch.web.UriParts.QUERY; +import static org.elasticsearch.web.UriParts.SCHEME; +import static org.elasticsearch.web.UriParts.USERNAME; +import static org.elasticsearch.web.UriParts.USER_INFO; import static org.elasticsearch.xpack.esql.EsqlTestUtils.TEST_VERIFIER; import static org.elasticsearch.xpack.esql.EsqlTestUtils.as; import static org.elasticsearch.xpack.esql.EsqlTestUtils.configuration; @@ -1663,6 +1674,15 @@ public void testUnsupportedFieldsInGrok() { """, errorMsg); } + public void testUnsupportedFieldsInUriParts() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + var errorMsg = "Cannot use field [unsupported] with unsupported type [ip_range]"; + verifyUnsupported(""" + from test + | uri_parts p = unsupported + """, errorMsg); + } + public void testRegexOnInt() { for (String op : new String[] { "like", "rlike" }) { var e = expectThrows(VerificationException.class, () -> analyze(""" @@ -6185,6 +6205,42 @@ public void testMetadataLeadingAndTrailingWildcards() { verifyNameAndType(metadata.get(1).name(), metadata.get(1).dataType(), "_index_mode", DataType.KEYWORD); } + public void testUriParts() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + LogicalPlan plan = analyze("ROW uri=\"http://user:pass@host.com:8080/path/file.ext?query=1#frag\" | uri_parts p = uri"); + + Limit limit = as(plan, Limit.class); + UriParts parts = as(limit.child(), UriParts.class); + + final List attributes = parts.generatedAttributes(); + + // verify that the attributes list is unmodifiable + assertThrows(UnsupportedOperationException.class, () -> attributes.add(new UnresolvedAttribute(EMPTY, "test"))); + + // detect output schema changes by matching attributes explicitly to known fields + assertContainsAttribute(attributes, "p." + DOMAIN, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + FRAGMENT, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + PATH, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + EXTENSION, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + PORT, DataType.INTEGER); + assertContainsAttribute(attributes, "p." + QUERY, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + SCHEME, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + USER_INFO, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + USERNAME, DataType.KEYWORD); + assertContainsAttribute(attributes, "p." + PASSWORD, DataType.KEYWORD); + assertEquals(10, attributes.size()); + + // Test invalid input type + VerificationException e = expectThrows(VerificationException.class, () -> analyze("ROW uri=123 | uri_parts p = uri")); + assertThat(e.getMessage(), containsString("Input for URI_PARTS must be of type [string] but is [integer]")); + } + + private void assertContainsAttribute(List attributes, String expectedName, DataType expectedType) { + Attribute attr = attributes.stream().filter(a -> a.name().equals(expectedName)).findFirst().orElse(null); + assertNotNull("Expected attribute " + expectedName + " not found", attr); + assertEquals("Data type mismatch for attribute " + expectedName, expectedType, attr.dataType()); + } + private void verifyNameAndTypeAndMultiTypeEsField( String actualName, DataType actualType, diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationSupportTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationSupportTests.java index 2e1c867933e79..4c5d1fa49aade 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationSupportTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationSupportTests.java @@ -53,6 +53,7 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.Values; import org.elasticsearch.xpack.esql.expression.function.aggregate.VarianceOverTime; import org.elasticsearch.xpack.esql.plan.logical.BinaryPlan; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.Drop; import org.elasticsearch.xpack.esql.plan.logical.Explain; import org.elasticsearch.xpack.esql.plan.logical.ExternalRelation; @@ -157,6 +158,7 @@ public class ApproximationSupportTests extends ESTestCase { UnaryPlan.class, BinaryPlan.class, InferencePlan.class, + CompoundOutputEval.class, // These plans don't occur in a correct analyzed query. UnresolvedRelation.class, diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationTests.java index 697e93978cd41..67e5dff804876 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/approximation/ApproximationTests.java @@ -153,6 +153,7 @@ public void testVerify_validQuery() throws Exception { verify("FROM test | LIMIT 1000 | KEEP gender, emp_no | RENAME gender AS whatever | STATS MEDIAN(emp_no)"); verify("FROM test | EVAL blah=1 | GROK last_name \"%{IP:x}\" | SAMPLE 0.1 | STATS a=COUNT() | LIMIT 100 | SORT a"); verify("ROW i=[1,2,3] | EVAL x=TO_STRING(i) | DISSECT x \"%{x}\" | STATS i=10*POW(PERCENTILE(i, 0.5), 2) | LIMIT 10"); + verify("FROM test | URI_PARTS parts = last_name | STATS scheme_count = COUNT() BY parts.scheme | LIMIT 10"); } public void testVerify_validQuery_queryProperties() throws Exception { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/AbstractCompoundOutputEvaluatorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/AbstractCompoundOutputEvaluatorTests.java new file mode 100644 index 0000000000000..d43503bfc4429 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/AbstractCompoundOutputEvaluatorTests.java @@ -0,0 +1,248 @@ +/* + * 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.esql.evaluator.command; + +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.compute.data.Block; +import org.elasticsearch.compute.data.BlockFactory; +import org.elasticsearch.compute.data.BytesRefBlock; +import org.elasticsearch.compute.data.ElementType; +import org.elasticsearch.compute.data.IntBlock; +import org.elasticsearch.compute.data.Page; +import org.elasticsearch.compute.operator.ColumnExtractOperator; +import org.elasticsearch.compute.operator.EvalOperator; +import org.elasticsearch.compute.operator.Operator; +import org.elasticsearch.compute.operator.SourceOperator; +import org.elasticsearch.compute.operator.Warnings; +import org.elasticsearch.compute.test.OperatorTestCase; +import org.elasticsearch.compute.test.TestBlockFactory; +import org.elasticsearch.compute.test.operator.blocksource.SequenceBytesRefBlockSourceOperator; +import org.elasticsearch.core.Releasables; +import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.planner.PlannerUtils; +import org.hamcrest.Matcher; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + +import static org.hamcrest.Matchers.is; + +public abstract class AbstractCompoundOutputEvaluatorTests extends OperatorTestCase { + + private final BlockFactory blockFactory = TestBlockFactory.getNonBreakingInstance(); + + @Override + protected Matcher expectedDescriptionOfSimple() { + return is("ColumnExtractOperator[evaluator=CompoundOutputEvaluator[collector=" + getCollectorName() + "]]"); + } + + @Override + protected Matcher expectedToStringOfSimple() { + return is("ColumnExtractOperator[evaluator=CompoundOutputEvaluator[collector=" + getCollectorName() + "]]"); + } + + private String getCollectorName() { + return createOutputFieldsCollector(List.of()).toString(); + } + + protected abstract List getRequestedFieldsForSimple(); + + protected abstract List getSampleInputForSimple(); + + protected abstract List getExpectedOutputForSimple(); + + protected DataType getInputTypeForSimple() { + return DataType.TEXT; + } + + @Override + protected SourceOperator simpleInput(BlockFactory blockFactory, int size) { + List sampleInput = getSampleInputForSimple(); + return new SequenceBytesRefBlockSourceOperator( + blockFactory, + IntStream.range(0, size).mapToObj(i -> new BytesRef(sampleInput.get(i % sampleInput.size()))) + ); + } + + @Override + protected Operator.OperatorFactory simple(SimpleOptions options) { + final List requestedFields = getRequestedFieldsForSimple(); + Map> supportedFields = getSupportedOutputFieldMappings(); + + ElementType[] outputTypes = new ElementType[requestedFields.size()]; + for (int i = 0; i < requestedFields.size(); i++) { + Class javaType = supportedFields.get(requestedFields.get(i)); + DataType dataType = DataType.fromJavaType(javaType); + outputTypes[i] = PlannerUtils.toElementType(dataType); + } + + return new ColumnExtractOperator.Factory(outputTypes, dvrCtx -> new EvalOperator.ExpressionEvaluator() { + @Override + public Block eval(Page page) { + Block input = page.getBlock(0); + input.incRef(); + return input; + } + + @Override + public long baseRamBytesUsed() { + return 0; + } + + @Override + public void close() {} + }, new CompoundOutputEvaluator.Factory(getInputTypeForSimple(), null, new CompoundOutputEvaluator.OutputFieldsCollectorProvider() { + @Override + public CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector() { + return AbstractCompoundOutputEvaluatorTests.this.createOutputFieldsCollector(requestedFields); + } + + @Override + public String collectorSimpleName() { + return AbstractCompoundOutputEvaluatorTests.this.collectorSimpleName(); + } + })); + } + + @Override + protected void assertSimpleOutput(List input, List results) { + List expectedSampleColumns = getExpectedOutputForSimple(); + Map> supportedFields = getSupportedOutputFieldMappings(); + List requestedFields = getRequestedFieldsForSimple(); + + // 1. Get total number of rows from results + int totalRows = 0; + for (Page page : results) { + totalRows += page.getPositionCount(); + } + + // 2. Tile the expected output to match the total number of rows + List> expectedColumns = new ArrayList<>(); + if (totalRows > 0) { + for (Object[] sampleColumn : expectedSampleColumns) { + List fullColumn = new ArrayList<>(totalRows); + if (sampleColumn.length > 0) { + for (int i = 0; i < totalRows; i++) { + fullColumn.add(sampleColumn[i % sampleColumn.length]); + } + } else { + for (int i = 0; i < totalRows; i++) { + fullColumn.add(null); + } + } + expectedColumns.add(fullColumn); + } + } + + // 3. Materialize actual result columns + List> actualColumns = new ArrayList<>(); + for (int i = 0; i < requestedFields.size(); i++) { + actualColumns.add(new ArrayList<>(totalRows)); + } + + BytesRef scratch = new BytesRef(); + for (Page page : results) { + for (int colIdx = 0; colIdx < requestedFields.size(); colIdx++) { + Block block = page.getBlock(colIdx + 1); // +1 to skip input block + String fieldName = requestedFields.get(colIdx); + Class type = supportedFields.get(fieldName); + + for (int rowIdx = 0; rowIdx < page.getPositionCount(); rowIdx++) { + if (block.isNull(rowIdx)) { + actualColumns.get(colIdx).add(null); + } else if (type == Integer.class) { + actualColumns.get(colIdx).add(((IntBlock) block).getInt(rowIdx)); + } else { + actualColumns.get(colIdx).add(((BytesRefBlock) block).getBytesRef(rowIdx, scratch).utf8ToString()); + } + } + } + } + + // 4. Compare + assertEquals("Number of columns mismatch", expectedColumns.size(), actualColumns.size()); + for (int i = 0; i < expectedColumns.size(); i++) { + assertEquals("Column " + requestedFields.get(i) + " data mismatch", expectedColumns.get(i), actualColumns.get(i)); + } + } + + protected abstract CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector(List requestedFields); + + protected abstract String collectorSimpleName(); + + protected abstract Map> getSupportedOutputFieldMappings(); + + protected void evaluateAndCompare(List input, List requestedFields, List expectedRowComputationOutput) { + evaluateAndCompare(input, requestedFields, expectedRowComputationOutput, Warnings.NOOP_WARNINGS); + } + + protected void evaluateAndCompare( + List inputList, + List requestedFields, + List expectedRowComputationOutput, + Warnings warnings + ) { + CompoundOutputEvaluator.OutputFieldsCollector outputFieldsCollector = createOutputFieldsCollector(requestedFields); + CompoundOutputEvaluator evaluator = new CompoundOutputEvaluator(DataType.TEXT, warnings, outputFieldsCollector); + Block.Builder[] targetBlocks = new Block.Builder[requestedFields.size()]; + try (BytesRefBlock.Builder inputBuilder = blockFactory.newBytesRefBlockBuilder(inputList.size())) { + inputBuilder.beginPositionEntry(); + inputList.forEach(s -> inputBuilder.appendBytesRef(new BytesRef(s))); + inputBuilder.endPositionEntry(); + try (BytesRefBlock inputBlock = inputBuilder.build()) { + Map> supportedFields = getSupportedOutputFieldMappings(); + + int i = 0; + for (String fieldName : requestedFields) { + Class type = supportedFields.get(fieldName); + if (type == Integer.class) { + // noinspection resource - closed in the finally block + targetBlocks[i] = blockFactory.newIntBlockBuilder(1); + } else { + // either String or unknown fields + // noinspection resource - closed in the finally block + targetBlocks[i] = blockFactory.newBytesRefBlockBuilder(1); + } + i++; + } + evaluator.computeRow(inputBlock, 0, targetBlocks, new BytesRef()); + + for (int j = 0; j < expectedRowComputationOutput.size(); j++) { + Object[] expectedValues = expectedRowComputationOutput.get(j); + try (Block builtBlock = targetBlocks[j].build()) { + for (int k = 0; k < expectedValues.length; k++) { + Object value = expectedValues[k]; + switch (value) { + case null -> assertThat( + "Expected null for field [" + requestedFields.get(k) + "]", + builtBlock.isNull(k), + is(true) + ); + case String s -> { + BytesRefBlock fieldBlock = (BytesRefBlock) builtBlock; + assertThat(fieldBlock.isNull(k), is(false)); + assertThat(fieldBlock.getBytesRef(k, new BytesRef()).utf8ToString(), is(s)); + } + case Integer v -> { + IntBlock fieldBlock = (IntBlock) builtBlock; + assertThat(fieldBlock.isNull(k), is(false)); + assertThat(fieldBlock.getInt(k), is(v)); + } + default -> throw new IllegalArgumentException("Unsupported expected output type: " + value.getClass()); + } + } + } + } + } + } finally { + Releasables.closeExpectNoException(targetBlocks); + } + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/TestCompoundOutputEvaluatorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/TestCompoundOutputEvaluatorTests.java new file mode 100644 index 0000000000000..91c40ff706f1e --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/TestCompoundOutputEvaluatorTests.java @@ -0,0 +1,215 @@ +/* + * 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.esql.evaluator.command; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.SequencedCollection; +import java.util.function.BiConsumer; +import java.util.function.ObjIntConsumer; + +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.NOOP_INT_COLLECTOR; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.NOOP_STRING_COLLECTOR; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.intValueCollector; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.stringValueCollector; + +/** + * Testing different scenarios where the coordinating node predefines a list of requested output fields and the actual execution occurs on + * a data node with a different version, where the evaluating function produces outputs that may not fully match the predefined list. + */ +public class TestCompoundOutputEvaluatorTests extends AbstractCompoundOutputEvaluatorTests { + + private static Map testFunction(String input) { + Map result = new HashMap<>(); + String[] parts = input.split("-"); + for (String part : parts) { + String[] entry = part.trim().split(":"); + if (entry.length != 2) { + throw new IllegalArgumentException("Invalid input: " + input); + } + Object value; + try { + value = Integer.parseInt(entry[1]); + } catch (NumberFormatException e) { + value = entry[1]; + } + result.put(entry[0], value); + } + return result; + } + + @Override + protected CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector(List requestedFields) { + return new TestFieldsCollector(requestedFields); + } + + @Override + protected String collectorSimpleName() { + return TestFieldsCollector.class.getSimpleName(); + } + + @Override + protected Map> getSupportedOutputFieldMappings() { + Map> mappings = new HashMap<>(); + mappings.put("field_a", String.class); + mappings.put("field_b", Integer.class); + mappings.put("field_c", String.class); + return mappings; + } + + protected static class TestFieldsCollector extends CompoundOutputEvaluator.OutputFieldsCollector { + private BiConsumer fieldA = NOOP_STRING_COLLECTOR; + private ObjIntConsumer fieldB = NOOP_INT_COLLECTOR; + private BiConsumer fieldC = NOOP_STRING_COLLECTOR; + + TestFieldsCollector(SequencedCollection outputFields) { + super(outputFields.size()); + int index = 0; + for (String fieldName : outputFields) { + switch (fieldName) { + case "field_a" -> fieldA = stringValueCollector(index); + case "field_b" -> fieldB = intValueCollector(index, value -> value >= 0); + case "field_c" -> fieldC = stringValueCollector(index); + } + index++; + } + } + + public void fieldA(String value) { + fieldA.accept(rowOutput, value); + } + + public void fieldB(Integer value) { + fieldB.accept(rowOutput, value); + } + + public void fieldC(String value) { + fieldC.accept(rowOutput, value); + } + + @Override + protected void evaluate(String input) { + Map evaluationFunctionOutput = testFunction(input); + try { + fieldA((String) evaluationFunctionOutput.get("field_a")); + Object valueB = evaluationFunctionOutput.get("field_b"); + valueB = valueB == null ? -1 : ((Number) valueB).intValue(); + fieldB((Integer) valueB); + fieldC((String) evaluationFunctionOutput.get("field_c")); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid input: " + input, e); + } + } + } + + public void testMatchingOutput() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("field_a:valueA-field_b:2-field_c:valueC"); + List expected = toExpected(new Object[] { "valueA", 2, "valueC" }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testPartialFieldsRequested_1() { + List requestedFields = List.of("field_a", "field_b"); + List input = List.of("field_a:valueA-field_b:2-field_c:valueC"); + List expected = toExpected(new Object[] { "valueA", 2 }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testPartialFieldsRequested_2() { + List requestedFields = List.of("field_b"); + List input = List.of("field_a:valueA-field_b:2-field_c:valueC"); + List expected = toExpected(new Object[] { 2 }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testUnsupportedField() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("field_a:valueA-field_b:2-field_c:valueC-extra_field:extraValue"); + List expected = toExpected(new Object[] { "valueA", 2, "valueC" }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMissingField_1() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("field_b:2-field_c:valueC"); + List expected = toExpected(new Object[] { null, 2, "valueC" }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMissingField_2() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("foo:1-field_b:2-bar:3"); + List expected = toExpected(new Object[] { null, 2, null }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMissingField_3() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("foo:1-bar:2-field_b:3-baz:4-field_c:valueC"); + List expected = toExpected(new Object[] { null, 3, "valueC" }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testAllMissingFields() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("field_d:2-field_e:valueE"); + List expected = toExpected(new Object[] { null, null, null }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testWrongFieldType() { + List requestedFields = List.of("field_a", "field_b", "field_c"); + List input = List.of("field_a:1-field_c:valueC"); + List expected = toExpected(new Object[] { null, null, null }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testKnownAndUnknownFields() { + List requestedFields = List.of("field_a", "field_b", "unknown_field"); + List input = List.of("field_a:valueA-field_b:2-field_c:valueC"); + List expected = toExpected(new Object[] { "valueA", 2, null }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testOnlyUnknownFields() { + List requestedFields = List.of("unknown_field_a", "unknown_field_b"); + List input = List.of("field_a:valueA-field_b:2-field_c:valueC"); + List expected = toExpected(new Object[] { null, null }); + evaluateAndCompare(input, requestedFields, expected); + } + + private List toExpected(Object[] expected) { + List result = new ArrayList<>(expected.length); + for (Object o : expected) { + result.add(new Object[] { o }); + } + return result; + } + + /***************************************************************************************************** + * Implementing AbstractCompoundOutputEvaluatorTests methods for the OperatorTestCase framework + *****************************************************************************************************/ + + @Override + protected List getRequestedFieldsForSimple() { + return List.of("field_a", "field_b", "field_c"); + } + + @Override + protected List getSampleInputForSimple() { + return List.of("field_a:valueA-field_b:2-field_c:valueC", "field_c:valueC-field_b:3-field_d:valueD"); + } + + @Override + protected List getExpectedOutputForSimple() { + return List.of(new Object[] { "valueA", null }, new Object[] { 2, 3 }, new Object[] { "valueC", "valueC" }); + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/UriPartsFunctionBridgeTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/UriPartsFunctionBridgeTests.java new file mode 100644 index 0000000000000..2995a30448202 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/UriPartsFunctionBridgeTests.java @@ -0,0 +1,178 @@ +/* + * 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.esql.evaluator.command; + +import org.elasticsearch.compute.operator.DriverContext; +import org.elasticsearch.compute.operator.WarningSourceLocation; +import org.elasticsearch.compute.operator.Warnings; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.elasticsearch.web.UriParts.DOMAIN; +import static org.elasticsearch.web.UriParts.EXTENSION; +import static org.elasticsearch.web.UriParts.FRAGMENT; +import static org.elasticsearch.web.UriParts.PASSWORD; +import static org.elasticsearch.web.UriParts.PATH; +import static org.elasticsearch.web.UriParts.PORT; +import static org.elasticsearch.web.UriParts.QUERY; +import static org.elasticsearch.web.UriParts.SCHEME; +import static org.elasticsearch.web.UriParts.USERNAME; +import static org.elasticsearch.web.UriParts.USER_INFO; + +public class UriPartsFunctionBridgeTests extends AbstractCompoundOutputEvaluatorTests { + + private final Warnings WARNINGS = Warnings.createWarnings(DriverContext.WarningsMode.COLLECT, new WarningSourceLocation() { + @Override + public int lineNumber() { + return 1; + } + + @Override + public int columnNumber() { + return 2; + } + + @Override + public String viewName() { + return null; + } + + @Override + public String text() { + return "invalid_input"; + } + }); + + @Override + protected CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector(List requestedFields) { + return new UriPartsFunctionBridge.UriPartsCollectorImpl(requestedFields); + } + + @Override + protected String collectorSimpleName() { + return UriPartsFunctionBridge.UriPartsCollectorImpl.class.getSimpleName(); + } + + @Override + protected Map> getSupportedOutputFieldMappings() { + return UriPartsFunctionBridge.getAllOutputFields(); + } + + public void testFullOutput() { + List requestedFields = List.of(SCHEME, DOMAIN, PORT, PATH, EXTENSION, QUERY, FRAGMENT, USER_INFO, USERNAME, PASSWORD); + List input = List.of("http://user:pass@example.com:8080/path/to/file.html?query=val#fragment"); + List expected = List.of( + new Object[] { "http" }, + new Object[] { "example.com" }, + new Object[] { 8080 }, + new Object[] { "/path/to/file.html" }, + new Object[] { "html" }, + new Object[] { "query=val" }, + new Object[] { "fragment" }, + new Object[] { "user:pass" }, + new Object[] { "user" }, + new Object[] { "pass" } + ); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMultiValue() { + List requestedFields = List.of(SCHEME, DOMAIN, PORT, PATH, EXTENSION, QUERY, FRAGMENT, USER_INFO, USERNAME, PASSWORD); + List input = List.of( + "http://user:pass@example.com:8080/path/to/file.html?query=val#fragment", + "https://elastic.co/downloads", + "ftp://ftp.example.org/resource.txt" + ); + List expected = Collections.nCopies(requestedFields.size(), new Object[] { null }); + evaluateAndCompare(input, requestedFields, expected, WARNINGS); + assertCriticalWarnings( + "Line 1:2: evaluation of [invalid_input] failed, treating result as null. Only first 20 failures recorded.", + "Line 1:2: java.lang.IllegalArgumentException: This command doesn't support multi-value input" + ); + } + + public void testPartialFieldsRequested() { + List requestedFields = List.of(DOMAIN, PORT); + List input = List.of("http://user:pass@example.com:8080/path/to/file.html?query=val#fragment"); + List expected = List.of(new Object[] { "example.com" }, new Object[] { 8080 }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMissingPortAndUserInfo() { + List requestedFields = List.of(SCHEME, DOMAIN, PORT, USERNAME); + List input = List.of("https://elastic.co/downloads"); + List expected = List.of( + new Object[] { "https" }, + new Object[] { "elastic.co" }, + new Object[] { null }, + new Object[] { null } + ); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMissingExtension() { + List requestedFields = List.of(PATH, EXTENSION); + List input = List.of("https://elastic.co/downloads"); + List expected = List.of(new Object[] { "/downloads" }, new Object[] { null }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testAllMissingFields() { + List requestedFields = List.of(FRAGMENT, QUERY, USER_INFO); + List input = List.of("https://elastic.co/downloads"); + List expected = List.of(new Object[] { null }, new Object[] { null }, new Object[] { null }); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testInvalidInput() { + List requestedFields = List.of(DOMAIN, PORT); + List input = List.of("not a valid url"); + List expected = List.of(new Object[] { null }, new Object[] { null }); + evaluateAndCompare(input, requestedFields, expected, WARNINGS); + assertCriticalWarnings( + "Line 1:2: evaluation of [invalid_input] failed, treating result as null. Only first 20 failures recorded.", + "Line 1:2: java.lang.IllegalArgumentException: unable to parse URI [not a valid url]" + ); + } + + /***************************************************************************************************** + * Implementing AbstractCompoundOutputEvaluatorTests methods for the OperatorTestCase framework + *****************************************************************************************************/ + + @Override + protected List getRequestedFieldsForSimple() { + return List.of(SCHEME, DOMAIN, PORT, PATH, EXTENSION, QUERY, FRAGMENT, USER_INFO, USERNAME, PASSWORD); + } + + @Override + protected List getSampleInputForSimple() { + return List.of( + "http://user:pass@example.com:8080/path/to/file.html?query=val#fragment", + "https://elastic.co/downloads", + "ftp://ftp.example.org/resource.txt" + ); + } + + @Override + protected List getExpectedOutputForSimple() { + return List.of( + new Object[] { "http", "https", "ftp" }, + new Object[] { "example.com", "elastic.co", "ftp.example.org" }, + new Object[] { 8080, null, null }, + new Object[] { "/path/to/file.html", "/downloads", "/resource.txt" }, + new Object[] { "html", null, "txt" }, + new Object[] { "query=val", null, null }, + new Object[] { "fragment", null, null }, + new Object[] { "user:pass", null, null }, + new Object[] { "user", null, null }, + new Object[] { "pass", null, null } + ); + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index 37d081c43c974..7262f671b2574 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -28,6 +28,7 @@ import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.EsqlTestUtils.TestSearchStats; import org.elasticsearch.xpack.esql.VerificationException; +import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.analysis.Analyzer; import org.elasticsearch.xpack.esql.core.expression.Alias; import org.elasticsearch.xpack.esql.core.expression.Attribute; @@ -83,6 +84,7 @@ import org.elasticsearch.xpack.esql.plan.physical.ProjectExec; import org.elasticsearch.xpack.esql.plan.physical.TimeSeriesAggregateExec; import org.elasticsearch.xpack.esql.plan.physical.TopNExec; +import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; import org.elasticsearch.xpack.esql.planner.PlannerSettings; import org.elasticsearch.xpack.esql.plugin.EsqlFlags; import org.elasticsearch.xpack.esql.querydsl.query.SingleValueQuery; @@ -2170,6 +2172,25 @@ public void testConstantKeywordDissectFilter() { assertNull(query.query()); } + public void testConstantFieldUriPartsFilter() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + String query = """ + FROM test + | uri_parts u = `constant_keyword-foo` + | WHERE `constant_keyword-foo` == "foo" + """; + var analyzer = makeAnalyzer("mapping-all-types.json"); + var plan = plannerOptimizer.plan(query, CONSTANT_K_STATS, analyzer); + + var uriParts = as(plan, UriPartsExec.class); + var limit = as(uriParts.child(), LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var queryExec = as(field.child(), EsQueryExec.class); + assertNull(queryExec.query()); + } + public void testMatchFunctionWithStatsWherePushable() { String query = """ from test diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index 7bbbf6fcd4d4b..d12087ac90953 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -139,6 +139,7 @@ import org.elasticsearch.xpack.esql.plan.logical.TimeSeriesAggregate; import org.elasticsearch.xpack.esql.plan.logical.TopN; import org.elasticsearch.xpack.esql.plan.logical.UnaryPlan; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.logical.join.InlineJoin; @@ -159,6 +160,7 @@ import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.stream.Collectors; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -217,6 +219,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.everyItem; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; @@ -9963,4 +9966,54 @@ STATS max(max_over_time(network.bytes_in)) by p = pod, bucket(@timestamp, 1 minu // EsRelation[k8s][@timestamp{f}#424, client.ip{f}#428, cluster{f}#425, ..] as(eval3.child(), EsRelation.class); } + + public void testPushDownSampleAndLimitThroughUriParts() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + var query = "FROM test | URI_PARTS parts = \"http://example.com/foo/bar?baz=qux\" | SAMPLE .5"; + var optimized = optimizedPlan(query); + // UriParts should be above Sample and Limit + var uriParts = as(optimized, UriParts.class); + var limit = as(uriParts.child(), Limit.class); + var sample = as(limit.child(), Sample.class); + assertThat(sample.probability().fold(FoldContext.small()), equalTo(0.5)); + as(sample.child(), EsRelation.class); + } + + public void testPushDownUriPartsPastProject() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + String query = """ + from test + | rename first_name as x + | keep x + | uri_parts u = x + """; + LogicalPlan plan = optimizedPlan(query); + + // UriParts should be pushed below Project + var keep = as(plan, Project.class); + var uriParts = as(keep.child(), UriParts.class); + assertThat( + uriParts.output().stream().map(Attribute::name).collect(Collectors.toSet()), + hasItems("u.domain", "u.path", "u.port", "u.query", "u.scheme", "u.username", "u.password", "u.fragment") + ); + // Limit should be pushed below UriParts + var limit = as(uriParts.child(), Limit.class); + as(limit.child(), EsRelation.class); + } + + public void testCombineOrderByThroughUriParts() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + String query = """ + from test + | sort emp_no + | uri_parts u = first_name + | sort u.domain + """; + LogicalPlan plan = optimizedPlan(query); + + var topN = as(plan, TopN.class); + assertThat(orderNames(topN), contains("u.domain")); + var uriParts = as(topN.child(), UriParts.class); + as(uriParts.child(), EsRelation.class); + } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java index 118e26f06a51b..66b40ede34948 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java @@ -145,6 +145,7 @@ import org.elasticsearch.xpack.esql.plan.physical.ProjectExec; import org.elasticsearch.xpack.esql.plan.physical.TopNExec; import org.elasticsearch.xpack.esql.plan.physical.UnaryExec; +import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; import org.elasticsearch.xpack.esql.planner.EsPhysicalOperationProviders; import org.elasticsearch.xpack.esql.planner.LocalExecutionPlanner; import org.elasticsearch.xpack.esql.planner.PlannerSettings; @@ -7702,6 +7703,50 @@ public void testPushCompoundTopNDistanceWithCompoundFilterAndNestedCompoundEvalT assertShapeQueryRange(shapeQueryBuilders, 10000.0, 500000.0); } + /** + * LimitExec[1000[INTEGER],474] + * \_ExchangeExec[[_meta_field{f}#21, emp_no{f}#15, first_name{f}#16, gender{f}#17, hire_date{f}#22, job{f}#23, job.raw{f}#24, + * languages{f}#18, last_name{f}#19, long_noidx{f}#25, salary{f}#20, u.domain{r}#5, u.fragment{r}#6, u.path{r}#7, u.extension{r}#8, + * u.port{r}#9, u.query{r}#10, u.scheme{r}#11, u.username{r}#12, u.password{r}#13], false] + * \_ProjectExec[[_meta_field{f}#21, emp_no{f}#15, first_name{f}#16, gender{f}#17, hire_date{f}#22, job{f}#23, job.raw{f}#24, + * languages{f}#18, last_name{f}#19, long_noidx{f}#25, salary{f}#20, u.domain{r}#5, u.fragment{r}#6, u.path{r}#7, + * u.extension{r}#8, u.port{r}#9, u.query{r}#10, u.scheme{r}#11, u.username{r}#12, u.password{r}#13]] + * \_FieldExtractExec[_meta_field{f}#21, emp_no{f}#15, gender{f}#17, hire..]<[],[]> + * \_LimitExec[1000[INTEGER],474] + * \_FilterExec[u.domain{r}#5 == elastic.co[KEYWORD]] + * \_UriPartsExec[first_name{f}#16,[u.domain{r}#5, u.fragment{r}#6, u.path{r}#7, u.extension{r}#8, u.port{r}#9, u.query{r}#10, + * u.scheme{r}#11, u.username{r}#12, u.password{r}#13]] + * \_FieldExtractExec[first_name{f}#16]<[],[]> + * \_EsQueryExec[test], indexMode[standard], [_doc{f}#26], limit[], sort[] estimatedRowSize[2684] queryBuilderAndTags + * [[QueryBuilderAndTags[query=null, tags=[]]]] + */ + public void testFilterOnUriPartsIsNotPushedDown() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + + // Query with a filter on a field generated by URI_PARTS + var plan = optimizedPlan(physicalPlan(""" + FROM test + | uri_parts u = first_name + | WHERE u.domain == "elastic.co" + """)); + + var coordinatorLimit = as(plan, LimitExec.class); + var exchange = as(coordinatorLimit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var topFieldExtract = as(project.child(), FieldExtractExec.class); + var dataNodeLimit = as(topFieldExtract.child(), LimitExec.class); + // The filter should remain above UriPartsExec + var filter = as(dataNodeLimit.child(), FilterExec.class); + var eq = as(filter.condition(), Equals.class); + assertThat(as(eq.left(), ReferenceAttribute.class).name(), is("u.domain")); + var uriParts = as(filter.child(), UriPartsExec.class); + var fieldExtract = as(uriParts.child(), FieldExtractExec.class); + var queryExec = as(fieldExtract.child(), EsQueryExec.class); + assertThat(filter.condition(), instanceOf(Equals.class)); + // The filter is not pushed down into the EsQueryExec + assertNull("Filter was incorrectly pushed down into EsQueryExec", queryExec.query()); + } + private Set orderAsSet(List sorts) { return sorts.stream().map(o -> ((Attribute) o.child()).name() + "->" + o.direction()).collect(Collectors.toSet()); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java index 84f6970cae110..74db2952aa6d1 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java @@ -52,6 +52,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Limit; import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan; import org.elasticsearch.xpack.esql.plan.logical.Project; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.logical.join.InlineJoin; @@ -2379,4 +2380,42 @@ public void testPushDown_OneGroupingFilter_PastInlineJoinWithInnerFilter() { // important bit below: the filter that is executed in the right hand side is the same as the one in the left hand side assertEquals(left, firstSubPlanFilter); } + + public void testPushDownFilterPastUriParts() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + String query = """ + FROM test + | WHERE emp_no > 10000 + | uri_parts u = first_name + | WHERE u.domain == "elastic.co" AND salary > 5000 + """; + LogicalPlan plan = optimizedPlan(query); + + // 1. The top level plan should be a Limit (can't be pushed down past filters) + var limit = as(plan, Limit.class); + + // 2. Top filter should be the non-pushable filter that depends on the UriParts output + var topFilter = as(limit.child(), Filter.class); + assertThat(topFilter.condition(), instanceOf(Equals.class)); + var topEquals = as(topFilter.condition(), Equals.class); + assertThat(as(topEquals.left(), ReferenceAttribute.class).name(), is("u.domain")); + + // 3. Then the UriParts node + var uriParts = as(topFilter.child(), UriParts.class); + + // 4. Below UriParts should be the combined pushable filters + var bottomFilter = as(uriParts.child(), Filter.class); + assertThat(bottomFilter.condition(), instanceOf(And.class)); + var bottomAnd = as(bottomFilter.condition(), And.class); + + // Check that both the original filter and the pushed-down filters are present + var condition1 = as(bottomAnd.left(), GreaterThan.class); + assertThat(as(condition1.left(), FieldAttribute.class).name(), is("emp_no")); + + var condition2 = as(bottomAnd.right(), GreaterThan.class); + assertThat(as(condition2.left(), FieldAttribute.class).name(), is("salary")); + + // 5. Finally, the relation + as(bottomFilter.child(), EsRelation.class); + } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java index 28ac9ec68e0d6..fc13ab5e0af8a 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java @@ -36,6 +36,7 @@ import org.elasticsearch.xpack.esql.core.tree.Location; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.evaluator.command.UriPartsFunctionBridge; import org.elasticsearch.xpack.esql.expression.Order; import org.elasticsearch.xpack.esql.expression.UnresolvedNamePattern; import org.elasticsearch.xpack.esql.expression.function.DocsV3Support; @@ -81,6 +82,7 @@ import org.elasticsearch.xpack.esql.plan.logical.Row; import org.elasticsearch.xpack.esql.plan.logical.TimeSeriesAggregate; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; +import org.elasticsearch.xpack.esql.plan.logical.UriParts; import org.elasticsearch.xpack.esql.plan.logical.fuse.Fuse; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; @@ -100,6 +102,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; import static org.elasticsearch.xpack.esql.EsqlTestUtils.as; @@ -3588,7 +3591,8 @@ public void testFieldNamesAsCommands() throws Exception { "mv_expand", "rename", "sort", - "stats" }; + "stats", + "uri_parts" }; for (String keyword : keywords) { var plan = query("FROM test | STATS avg(" + keyword + ")"); var aggregate = as(plan, Aggregate.class); @@ -4568,4 +4572,21 @@ public void testInvalidSample() { ); } + public void testUriPartsCommand() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + LogicalPlan cmd = processingCommand("uri_parts p = a"); + UriParts parts = as(cmd, UriParts.class); + assertEqualsIgnoringIds(attribute("a"), parts.getInput()); + + // Dynamically get expected field names + List expectedFieldNames = UriPartsFunctionBridge.getAllOutputFields() + .keySet() + .stream() + .map(name -> "p." + name) + .collect(Collectors.toList()); + + List actualFieldNames = parts.generatedAttributes().stream().map(NamedExpression::name).collect(Collectors.toList()); + assertEquals(expectedFieldNames, actualFieldNames); + } + } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CompoundOutputEvalSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CompoundOutputEvalSerializationTests.java new file mode 100644 index 0000000000000..82368f0a01f07 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CompoundOutputEvalSerializationTests.java @@ -0,0 +1,60 @@ +/* + * 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.esql.plan.logical; + +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.expression.function.FieldAttributeTests; + +import java.io.IOException; +import java.util.List; + +public abstract class CompoundOutputEvalSerializationTests> extends AbstractLogicalPlanSerializationTests< + T> { + + @Override + protected T createTestInstance() { + Source source = randomSource(); + LogicalPlan child = randomChild(0); + Expression input = FieldAttributeTests.createFieldAttribute(0, false); + Attribute outputFieldPrefix = FieldAttributeTests.createFieldAttribute(0, false); + return createInitialInstance(source, child, input, outputFieldPrefix); + } + + @Override + protected T mutateInstance(T instance) throws IOException { + LogicalPlan child = instance.child(); + Expression input = instance.getInput(); + List outputFieldNames = instance.outputFieldNames(); + List outputFieldAttributes = instance.generatedAttributes(); + + switch (between(0, 3)) { + case 0: + child = randomValueOtherThan(child, () -> randomChild(0)); + break; + case 1: + input = randomValueOtherThan(input, () -> FieldAttributeTests.createFieldAttribute(0, false)); + break; + case 2: + final int nameSize = outputFieldNames.size(); + outputFieldNames = randomValueOtherThan( + outputFieldNames, + () -> randomList(nameSize, nameSize, () -> randomAlphaOfLengthBetween(1, 10)) + ); + break; + case 3: + final int attrSize = outputFieldAttributes.size(); + outputFieldAttributes = randomValueOtherThan(outputFieldAttributes, () -> randomFieldAttributes(attrSize, attrSize, false)); + break; + } + return instance.createNewInstance(instance.source(), child, input, outputFieldNames, outputFieldAttributes); + } + + protected abstract T createInitialInstance(Source source, LogicalPlan child, Expression input, Attribute outputFieldPrefix); +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/UriPartsSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/UriPartsSerializationTests.java new file mode 100644 index 0000000000000..5dbcc55608317 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/UriPartsSerializationTests.java @@ -0,0 +1,21 @@ +/* + * 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.esql.plan.logical; + +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; + +import java.util.Objects; + +public class UriPartsSerializationTests extends CompoundOutputEvalSerializationTests { + @Override + protected UriParts createInitialInstance(Source source, LogicalPlan child, Expression input, Attribute outputFieldPrefix) { + return UriParts.createInitialInstance(source, child, input, Objects.requireNonNull(outputFieldPrefix)); + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExecSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExecSerializationTests.java new file mode 100644 index 0000000000000..566e3f389c7a2 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExecSerializationTests.java @@ -0,0 +1,69 @@ +/* + * 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.esql.plan.physical; + +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.expression.function.FieldAttributeTests; + +import java.io.IOException; +import java.util.List; + +public abstract class CompoundOutputEvalExecSerializationTests extends AbstractPhysicalPlanSerializationTests { + + @Override + protected CompoundOutputEvalExec createTestInstance() { + Source source = randomSource(); + PhysicalPlan child = randomChild(0); + Expression input = FieldAttributeTests.createFieldAttribute(0, false); + + int fieldCount = randomIntBetween(1, 5); + List outputFieldNames = randomList(fieldCount, fieldCount, () -> randomAlphaOfLengthBetween(1, 10)); + List outputFieldAttributes = randomFieldAttributes(fieldCount, fieldCount, false); + + return createInstance(source, child, input, outputFieldNames, outputFieldAttributes); + } + + @Override + protected CompoundOutputEvalExec mutateInstance(CompoundOutputEvalExec instance) throws IOException { + PhysicalPlan child = instance.child(); + Expression input = instance.input(); + List outputFieldNames = instance.outputFieldNames(); + List outputFieldAttributes = instance.outputFieldAttributes(); + + switch (between(0, 3)) { + case 0: + child = randomValueOtherThan(child, () -> randomChild(0)); + break; + case 1: + input = randomValueOtherThan(input, () -> FieldAttributeTests.createFieldAttribute(0, false)); + break; + case 2: + final int nameSize = outputFieldNames.size(); + outputFieldNames = randomValueOtherThan( + outputFieldNames, + () -> randomList(nameSize, nameSize, () -> randomAlphaOfLengthBetween(1, 10)) + ); + break; + case 3: + final int attrSize = outputFieldAttributes.size(); + outputFieldAttributes = randomValueOtherThan(outputFieldAttributes, () -> randomFieldAttributes(attrSize, attrSize, false)); + break; + } + return instance.createNewInstance(instance.source(), child, input, outputFieldNames, outputFieldAttributes); + } + + protected abstract CompoundOutputEvalExec createInstance( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFields + ); +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExecSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExecSerializationTests.java new file mode 100644 index 0000000000000..163b3004d4220 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExecSerializationTests.java @@ -0,0 +1,28 @@ +/* + * 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.esql.plan.physical; + +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; + +import java.util.List; + +public class UriPartsExecSerializationTests extends CompoundOutputEvalExecSerializationTests { + + @Override + protected CompoundOutputEvalExec createInstance( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + return new UriPartsExec(source, child, input, outputFieldNames, outputFieldAttributes); + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/GrokEvaluatorExtracterTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/GrokEvaluatorExtracterTests.java index d217dafb7442a..efb3cdfa38a7c 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/GrokEvaluatorExtracterTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/GrokEvaluatorExtracterTests.java @@ -234,11 +234,15 @@ private Block.Builder[] buidDefaultTargetBlocks(int estimatedSize) { blockFactory.newBooleanBlockBuilder(estimatedSize) }; } - private GrokEvaluatorExtracter buildExtracter(String pattern, Map keyToBlock, Map types) { + private GrokEvaluatorExtracter buildExtracter( + String pattern, + final Map keyToBlock, + final Map types + ) { var builtinPatterns = GrokBuiltinPatterns.get(true); Grok grok = new Grok(builtinPatterns, pattern, logger::warn); - GrokEvaluatorExtracter extracter = new GrokEvaluatorExtracter(grok, pattern, keyToBlock, types); - return extracter; + GrokEvaluatorExtracter.Factory factory = new GrokEvaluatorExtracter.Factory(grok, pattern, keyToBlock, types); + return factory.create(null); } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java index 5cebb371b3470..6217e1f3e1bf1 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java @@ -3229,6 +3229,14 @@ public void testSubqueryInFromWithFork() { ); } + public void testUriPartsResolvesOnlyInput() { + assumeTrue("requires compound output capability", EsqlCapabilities.Cap.URI_PARTS_COMMAND.isEnabled()); + assertFieldNames(""" + from employees + | uri_parts u = first_name + | keep u.domain""", Set.of("_index", "first_name", "first_name.*")); + } + private void assertFieldNames(String query, Set expected) { assertFieldNames(query, false, expected, Set.of()); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java index 4f16ea52c69c3..77dc8cd6d8a11 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java @@ -46,6 +46,7 @@ import org.elasticsearch.xpack.esql.expression.function.scalar.string.Concat; import org.elasticsearch.xpack.esql.expression.predicate.fulltext.FullTextPredicate; import org.elasticsearch.xpack.esql.index.EsIndex; +import org.elasticsearch.xpack.esql.plan.logical.CompoundOutputEval; import org.elasticsearch.xpack.esql.plan.logical.Dissect; import org.elasticsearch.xpack.esql.plan.logical.EsRelation; import org.elasticsearch.xpack.esql.plan.logical.Fork; @@ -56,6 +57,7 @@ import org.elasticsearch.xpack.esql.plan.logical.join.JoinType; import org.elasticsearch.xpack.esql.plan.logical.join.JoinTypes; import org.elasticsearch.xpack.esql.plan.logical.local.ResolvingProject; +import org.elasticsearch.xpack.esql.plan.physical.CompoundOutputEvalExec; import org.elasticsearch.xpack.esql.plan.physical.EsQueryExec; import org.elasticsearch.xpack.esql.plan.physical.EsStatsQueryExec; import org.elasticsearch.xpack.esql.plan.physical.EsStatsQueryExec.Stat; @@ -577,6 +579,11 @@ private static Object makeMap(Class> toBuildClass, Parameteriz } private static int randomSizeForCollection(Class> toBuildClass) { + if (CompoundOutputEval.class.isAssignableFrom(toBuildClass) || CompoundOutputEvalExec.class.isAssignableFrom(toBuildClass)) { + // subclasses of CompoundOutputEval/Exec must have map and list that match in size + return 4; + } + int minCollectionLength = 0; int maxCollectionLength = 8; diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml index b10fca2f354bb..3a3f98898119c 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml @@ -64,7 +64,7 @@ setup: - do: { xpack.usage: { } } - match: { esql.available: true } - match: { esql.enabled: true } - - length: { esql.features: 32 } + - length: { esql.features: 33 } - set: { esql.features.dissect: dissect_counter } - set: { esql.features.drop: drop_counter } - set: { esql.features.eval: eval_counter } @@ -94,6 +94,7 @@ setup: - set: { esql.features.completion: completion_counter } - set: { esql.features.sample: sample_counter } - set: { esql.features.subquery: subquery_counter } + - set: { esql.features.uri_parts: uri_parts_counter } - set: { esql.features.mmr: mmr_counter } - length: { esql.queries: 3 } - set: { esql.queries.rest.total: rest_total_counter } @@ -125,6 +126,7 @@ setup: - match: { esql.features.dissect: $dissect_counter } - match: { esql.features.eval: $eval_counter } - match: { esql.features.grok: $grok_counter } + - match: { esql.features.uri_parts: $uri_parts_counter } - gt: { esql.features.limit: $limit_counter } - gt: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter } @@ -177,6 +179,7 @@ setup: - match: { esql.features.dissect: $dissect_counter } - match: { esql.features.eval: $eval_counter } - match: { esql.features.grok: $grok_counter } + - match: { esql.features.uri_parts: $uri_parts_counter } - match: { esql.features.limit: $limit_counter } - match: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter } @@ -222,7 +225,7 @@ setup: - do: { xpack.usage: { } } - match: { esql.available: true } - match: { esql.enabled: true } - - length: { esql.features: 31 } + - length: { esql.features: 32 } - set: { esql.features.dissect: dissect_counter } - set: { esql.features.drop: drop_counter } - set: { esql.features.eval: eval_counter } @@ -252,6 +255,7 @@ setup: - set: { esql.features.completion: completion_counter } - set: { esql.features.sample: sample_counter } - set: { esql.features.subquery: subquery_counter } + - set: { esql.features.uri_parts: uri_parts_counter } - length: { esql.queries: 3 } - set: { esql.queries.rest.total: rest_total_counter } - set: { esql.queries.rest.failed: rest_failed_counter } @@ -282,6 +286,7 @@ setup: - match: { esql.features.dissect: $dissect_counter } - match: { esql.features.eval: $eval_counter } - match: { esql.features.grok: $grok_counter } + - match: { esql.features.uri_parts: $uri_parts_counter } - gt: { esql.features.limit: $limit_counter } - gt: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter } @@ -334,6 +339,7 @@ setup: - match: { esql.features.dissect: $dissect_counter } - match: { esql.features.eval: $eval_counter } - match: { esql.features.grok: $grok_counter } + - match: { esql.features.uri_parts: $uri_parts_counter } - match: { esql.features.limit: $limit_counter } - match: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter }