diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 7f1bc9e58c..cda5ccce98 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -115,3 +115,26 @@ jobs: - name: MLTestsNativeDeactivated run: mvn -Dtest=MLTestsNativeDeactivated test + tests4: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Java 11 + uses: actions/setup-java@v3 + with: + java-version: 11 + distribution: adopt + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Install with Maven + run: mvn install -DskipTests -Dgpg.skip --quiet + - name: Compile with Maven + run: mvn clean compile assembly:single + - name: DeltaUpdateRuntimeTests + run: mvn -Dtest=DeltaUpdateRuntimeTests test diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb9f08fd3a..e1d54fa72e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -79,8 +79,13 @@ NativeFLWORRuntimeTestsParallelismDeactivated: script: - mvn -Dtest=NativeFLWORRuntimeTestsParallelismDeactivated test -StaticTypingTest: - stage: tests3 +updatedeltaruntime-test: + stage: test + script: + - mvn -Dtest=DeltaUpdateRuntimeTests test + +statictyping-test: + stage: test script: - mvn -Dtest=StaticTypeTests test diff --git a/pom.xml b/pom.xml index f03343c3f5..d468b6ca87 100644 --- a/pom.xml +++ b/pom.xml @@ -197,6 +197,16 @@ + + org.openjdk.jmh + jmh-core + 1.37 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.37 + org.apache.spark spark-core_2.12 @@ -257,36 +267,46 @@ commons-lang3 3.12.0 - + + commons-net + commons-net + 3.1 + + commons-io commons-io 2.11.0 - - org.apache.httpcomponents - httpclient - 4.5.13 - - - - org.jgrapht - jgrapht-core - 1.4.0 - - - joda-time - joda-time - 2.10.6 - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - 2.13.4 - + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + org.jgrapht + jgrapht-core + 1.4.0 + + + joda-time + joda-time + 2.10.6 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.13.4 + + + io.delta + delta-core_2.12 + 2.4.0 + diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index ae0feeb357..27ef9d70be 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -692,17 +692,113 @@ default boolean isNaN() { * @return an int representing nestedness of the item inside transform expressions. */ default int getMutabilityLevel() { - return 0; + return -1; } /** - * Sets the mutability level of the item. + * Sets the mutability level of the item to a supplied value. * - * @param mutabilityLevel the new mutability level. + * @param mutabilityLevel new mutability level. */ default void setMutabilityLevel(int mutabilityLevel) { } + /** + * Returns the top level ID of the item. + * + * @return int representing the rowID of the item within a DeltaFile. + */ + default long getTopLevelID() { + return -1; + } + + /** + * Sets the top level ID of the item to a supplied value. + * + * @param topLevelID new top level ID. + */ + default void setTopLevelID(long topLevelID) { + } + + /** + * Returns the path from the top level object of a DeltaFile for the item. + * + * @return String representing the path of the item from the top level within a DeltaFile. + */ + default String getPathIn() { + return "null"; + } + + /** + * Sets the path from the top level object of a DeltaFile for the item to a supplied value. + * + * @param pathIn new path from top level. + */ + default void setPathIn(String pathIn) { + } + + /** + * Returns the location of the DeltaFile for the item. + * + * @return String representing the location of the DeltaFile for the item. + */ + default String getTableLocation() { + return null; + } + + + /** + * Sets the location of the DeltaFile for the item to a supplied value. + * + * @param location new location of the DeltaFile for the item. + */ + default void setTableLocation(String location) { + } + + /** + * Returns the SparkSQL value of the item for use in a query. + * + * @return String representing the SparkSQL value of the item. + */ + default String getSparkSQLValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Returns the SparkSQL value of the item for use in a query. + * + * @return String representing the SparkSQL value of the item. + */ + default String getSparkSQLValue(ItemType itemType) { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Returns the SparkSQL type of the item for use in a query. + * + * @return String representing the SparkSQL type of the item. + */ + default String getSparkSQLType() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Tests for physical equality. The semantics are that of the eq operator. + * + * @param other another item. + * @return true it is equal to other, false otherwise. + */ + default boolean physicalEquals(Object other) { + if (!(other instanceof Item)) { + return false; + } + Item otherItem = (Item) other; + if (this.getTopLevelID() == -1 || otherItem.getTopLevelID() == -1) { + return System.identityHashCode(this) == System.identityHashCode(otherItem); + } + return this.getTopLevelID() == otherItem.getTopLevelID() && this.getPathIn().equals(otherItem.getPathIn()); + } + /** * Tests for logical equality. The semantics are that of the eq operator. * diff --git a/src/main/java/org/rumbledb/api/Rumble.java b/src/main/java/org/rumbledb/api/Rumble.java index f0dba0f280..b30c4c53c8 100644 --- a/src/main/java/org/rumbledb/api/Rumble.java +++ b/src/main/java/org/rumbledb/api/Rumble.java @@ -5,7 +5,6 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.expressions.module.MainModule; import org.rumbledb.runtime.RuntimeIterator; -import org.rumbledb.runtime.update.PendingUpdateList; import sparksoniq.spark.SparkSessionManager; import java.io.IOException; @@ -52,11 +51,6 @@ public SequenceOfItems runQuery(String query) { this.configuration ); - if (iterator.isUpdating()) { - PendingUpdateList pul = iterator.getPendingUpdateList(dynamicContext); - pul.applyUpdates(iterator.getMetadata()); - } - return new SequenceOfItems(iterator, dynamicContext, this.configuration); } @@ -78,12 +72,6 @@ public SequenceOfItems runQuery(URI location) throws IOException { this.configuration ); - if (iterator.isUpdating()) { - PendingUpdateList pul = iterator.getPendingUpdateList(dynamicContext); - pul.applyUpdates(iterator.getMetadata()); - } - - System.err.println("final iterator is: " + iterator.isUpdating()); return new SequenceOfItems(iterator, dynamicContext, this.configuration); } diff --git a/src/main/java/org/rumbledb/api/SequenceOfItems.java b/src/main/java/org/rumbledb/api/SequenceOfItems.java index c8cec7beca..7a32fde406 100644 --- a/src/main/java/org/rumbledb/api/SequenceOfItems.java +++ b/src/main/java/org/rumbledb/api/SequenceOfItems.java @@ -7,8 +7,10 @@ import org.apache.spark.sql.Row; import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; +import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.update.PendingUpdateList; import sparksoniq.spark.SparkSessionManager; /** @@ -51,7 +53,9 @@ public SequenceOfItems( * Opens the iterator. */ public void open() { - this.iterator.open(this.dynamicContext); + if (this.isMaterialisable()) { + this.iterator.open(this.dynamicContext); + } this.isOpen = true; } @@ -68,7 +72,9 @@ public boolean isOpen() { * Closes the iterator. */ public void close() { - this.iterator.close(); + if (this.isOpen) { + this.iterator.close(); + } this.isOpen = false; } @@ -78,6 +84,9 @@ public void close() { * @return true if there are more items, false otherwise. */ public boolean hasNext() { + if (!this.isMaterialisable()) { + return false; + } return this.iterator.hasNext(); } @@ -88,6 +97,9 @@ public boolean hasNext() { * @return the next item. */ public Item next() { + if (!this.isMaterialisable()) { + return ItemFactory.getInstance().createNullItem(); + } return this.iterator.next(); } @@ -109,6 +121,24 @@ public boolean availableAsDataFrame() { return this.iterator.isDataFrame(); } + /** + * Returns whether the iterator is updating + * + * @return true if updating; otherwise false. + */ + public boolean availableAsPUL() { + return this.iterator.isUpdating(); + } + + /** + * Return whether the iterator of the sequence should be evaluated to materialise the sequence of items. + * + * @return true if materialisable; otherwise false + */ + private boolean isMaterialisable() { + return !(this.availableAsPUL() && !this.iterator.isSequential()); + } + /** * Returns the sequence of items as an RDD of Items rather than iterating over them locally. * It is not possible to do so if the iterator is open. @@ -116,6 +146,9 @@ public boolean availableAsDataFrame() { * @return an RDD of Items. */ public JavaRDD getAsRDD() { + if (!this.isMaterialisable()) { + return SparkSessionManager.getInstance().getJavaSparkContext().emptyRDD(); + } if (this.isOpen) { throw new RuntimeException("Cannot obtain an RDD if the iterator is open."); } @@ -129,12 +162,23 @@ public JavaRDD getAsRDD() { * @return a data frame. */ public Dataset getAsDataFrame() { + if (!this.isMaterialisable()) { + return SparkSessionManager.getInstance().getOrCreateSession().emptyDataFrame(); + } if (this.isOpen) { throw new RuntimeException("Cannot obtain an RDD if the iterator is open."); } return this.iterator.getDataFrame(this.dynamicContext).getDataFrame(); } + /** + * Applies the PUL available when the iterator is updating. + */ + public void applyPUL() { + PendingUpdateList pul = this.iterator.getPendingUpdateList(this.dynamicContext); + pul.applyUpdates(this.iterator.getMetadata()); + } + /* * Populates a list of items with the output. * @@ -142,6 +186,9 @@ public Dataset getAsDataFrame() { */ public long populateList(List resultList) { resultList.clear(); + if (!this.isMaterialisable()) { + return -1; + } this.iterator.open(this.dynamicContext); Item result = null; if (this.iterator.hasNext()) { @@ -176,6 +223,9 @@ public long populateList(List resultList) { public long populateListWithWarningOnlyIfCapReached(List resultList) { if (this.availableAsRDD()) { + if (!this.isMaterialisable()) { + return -1; + } JavaRDD rdd = this.iterator.getRDD(this.dynamicContext); return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList); } else { @@ -183,5 +233,4 @@ public long populateListWithWarningOnlyIfCapReached(List resultList) { } } - } diff --git a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java index 9d6cbb99b9..25c350a557 100644 --- a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java +++ b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java @@ -118,7 +118,8 @@ public List runQuery() throws IOException { !(this.configuration.getOutputFormat().equals("json") || this.configuration.getOutputFormat().equals("tyson") || this.configuration.getOutputFormat().equals("xml-json-hybrid") - || this.configuration.getOutputFormat().equals("yaml")) + || this.configuration.getOutputFormat().equals("yaml") + || this.configuration.getOutputFormat().equals("delta")) && !sequence.availableAsDataFrame() ) { @@ -185,6 +186,10 @@ public List runQuery() throws IOException { } } + if (this.configuration.applyUpdates() && sequence.availableAsPUL() && outputPath != null) { + sequence.applyPUL(); + } + long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; if (logPath != null) { @@ -225,6 +230,9 @@ public long runInteractive(String query, List resultList) throws IOExcepti if (!sequence.availableAsRDD()) { return sequence.populateList(resultList); } + if (this.configuration.applyUpdates() && sequence.availableAsPUL()) { + sequence.applyPUL(); + } resultList.clear(); JavaRDD rdd = sequence.getAsRDD(); return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList); diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index 546af9628d..d308ed9104 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -448,7 +448,7 @@ public Node visitInlineFunctionExpr(InlineFunctionExpression expression, Node ar expression.getAnnotations(), expression.getName(), expression.getParams(), - expression.getReturnType(), + expression.getActualReturnType(), (StatementsAndOptionalExpr) visit(expression.getBody(), argument), expression.getMetadata() ); diff --git a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java index 7bcd53bdd1..7614931dc4 100644 --- a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java @@ -1,5 +1,9 @@ package org.rumbledb.compiler; +import org.rumbledb.context.BuiltinFunction; +import org.rumbledb.context.BuiltinFunctionCatalogue; +import org.rumbledb.context.FunctionIdentifier; +import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.InvalidUpdatingExpressionPositionException; import org.rumbledb.exceptions.SimpleExpressionMustBeVacuousException; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -7,6 +11,8 @@ import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.ExpressionClassification; import org.rumbledb.expressions.Node; +import org.rumbledb.exceptions.UnknownFunctionCallException; +import org.rumbledb.exceptions.UpdatingFunctionHasReturnTypeException; import org.rumbledb.expressions.control.ConditionalExpression; import org.rumbledb.expressions.control.SwitchExpression; import org.rumbledb.expressions.control.TypeSwitchExpression; @@ -27,6 +33,7 @@ import org.rumbledb.expressions.scripting.loops.ReturnStatementClause; import org.rumbledb.expressions.scripting.statement.StatementsAndExpr; import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr; +import org.rumbledb.expressions.typing.TreatExpression; import org.rumbledb.expressions.update.AppendExpression; import org.rumbledb.expressions.update.CopyDeclaration; import org.rumbledb.expressions.update.DeleteExpression; @@ -34,6 +41,7 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.types.FunctionSignature; import java.util.ArrayList; import java.util.List; @@ -51,14 +59,6 @@ protected ExpressionClassification defaultAction(Node node, ExpressionClassifica return expressionClassification; } - if (node instanceof StatementsAndExpr) { - ((StatementsAndExpr) node).setExpressionClassification(expressionClassification); - return expressionClassification; - } - if (node instanceof StatementsAndOptionalExpr) { - ((StatementsAndOptionalExpr) node).setExpressionClassification(expressionClassification); - return expressionClassification; - } if (node instanceof InlineFunctionExpression) { ((InlineFunctionExpression) node).setExpressionClassification(expressionClassification); return expressionClassification; @@ -88,6 +88,28 @@ public ExpressionClassification visitDescendants(Node node, ExpressionClassifica return result; } + @Override + public ExpressionClassification visitStatementsAndOptionalExpr( + StatementsAndOptionalExpr expression, + ExpressionClassification argument + ) { + this.visitDescendants(expression, argument); + Expression e = expression.getExpression(); + expression.setExpressionClassification(e.getExpressionClassification()); + return e.getExpressionClassification(); + } + + @Override + public ExpressionClassification visitStatementsAndExpr( + StatementsAndExpr expression, + ExpressionClassification argument + ) { + this.visitDescendants(expression, argument); + Expression e = expression.getExpression(); + expression.setExpressionClassification(e.getExpressionClassification()); + return e.getExpressionClassification(); + } + @Override public ExpressionClassification visitCommaExpression( CommaExpression expression, @@ -118,6 +140,21 @@ public ExpressionClassification visitCommaExpression( return expression.getExpressionClassification(); } + // Region Typing + + @Override + public ExpressionClassification visitTreatExpression( + TreatExpression expression, + ExpressionClassification argument + ) { + ExpressionClassification result = this.visit(expression.getMainExpression(), argument); + expression.setExpressionClassification(result); + return result; + } + + + // Endregion + // Region FLWOR @Override @@ -301,13 +338,88 @@ public ExpressionClassification visitTypeSwitchExpression( // Region Primary + private FunctionSignature getSignature(FunctionIdentifier identifier, StaticContext staticContext) { + BuiltinFunction function; + FunctionSignature signature; + function = BuiltinFunctionCatalogue.getBuiltinFunction(identifier); + if (function != null) { + signature = function.getSignature(); + } else { + signature = staticContext.getFunctionSignature(identifier); + } + return signature; + } + @Override public ExpressionClassification visitFunctionCall( FunctionCallExpression expression, ExpressionClassification argument ) { - // TODO: Make vacuous if call to fn:error? - return super.visitFunctionCall(expression, argument); + ExpressionClassification currArgResult; + for (Expression argExpr : expression.getArguments()) { + if (argExpr == null) { + continue; + } + currArgResult = this.visit(argExpr, argument); + if (currArgResult.isUpdating()) { + throw new InvalidUpdatingExpressionPositionException( + "Arguments to function calls cannot be updating", + argExpr.getMetadata() + ); + } + } + FunctionSignature funcSig; + try { + funcSig = getSignature(expression.getFunctionIdentifier(), expression.getStaticContext()); + } catch (UnknownFunctionCallException e) { + throw new UnknownFunctionCallException(expression.getFunctionIdentifier(), expression.getMetadata()); + } + ExpressionClassification result = funcSig.isUpdating() + ? ExpressionClassification.UPDATING + : ExpressionClassification.SIMPLE; + expression.setExpressionClassification(result); + // TODO: Make vacuous if call to fn:error? Not present! + return result; + } + + @Override + public ExpressionClassification visitInlineFunctionExpr( + InlineFunctionExpression expression, + ExpressionClassification argument + ) { + ExpressionClassification bodyResult = this.visit(expression.getBody(), argument); + + if (expression.isUpdating()) { + if (expression.getActualReturnType() != null) { + System.err.println(expression); + throw new UpdatingFunctionHasReturnTypeException( + "An updating function cannot have a return type. Return type " + + expression.getActualReturnType() + + " is specified.", + expression.getMetadata() + ); + } + if (!expression.isExternal() && !(bodyResult.isUpdating() || bodyResult.isVacuous())) { + throw new SimpleExpressionMustBeVacuousException( + "Top level expression of updating function must be updating or vacuous", + expression.getMetadata() + ); + } + // TODO CHECK IF EXTERNAL ERROR XUDY0019 + expression.setExpressionClassification(ExpressionClassification.UPDATING); + } else { + if (!expression.isExternal() && !bodyResult.isSimple()) { + throw new InvalidUpdatingExpressionPositionException( + "Body of simple inline function must be simple", + expression.getMetadata() + ); + } + // TODO CHECK IF EXTERNAL ERROR XUDY0018 + expression.setExpressionClassification(ExpressionClassification.SIMPLE); + } + + + return expression.getExpressionClassification(); } // Endregion diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index 9a8cb0d434..bb022d9548 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -402,7 +402,7 @@ public StaticContext visitInlineFunctionExpr(InlineFunctionExpression expression returnType = expression.getBody().getExpression().getStaticSequenceType(); } List params = new ArrayList<>(expression.getParams().values()); - FunctionSignature signature = new FunctionSignature(params, returnType); + FunctionSignature signature = new FunctionSignature(params, returnType, expression.isUpdating()); expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(signature))); return argument; } @@ -474,6 +474,29 @@ private boolean tryAnnotateSpecificFunctions(FunctionCallExpression expression, } } + // handle 'delta-file' function + if ( + functionName.equals(Name.createVariableInDefaultFunctionNamespace("delta-file")) + && args.size() > 0 + && args.get(0) instanceof StringLiteralExpression + ) { + String path = ((StringLiteralExpression) args.get(0)).getValue(); + URI uri = FileSystemUtil.resolveURI(staticContext.getStaticBaseURI(), path, expression.getMetadata()); + if (!FileSystemUtil.exists(uri, this.rumbleRuntimeConfiguration, expression.getMetadata())) { + throw new CannotRetrieveResourceException("File " + uri + " not found.", expression.getMetadata()); + } + StructType s = SparkSessionManager.getInstance() + .getOrCreateSession() + .read() + .format("delta") + .load(uri.toString()) + .schema(); + ItemType schemaItemType = ItemTypeFactory.createItemType(s); + // TODO : check if arity is correct + expression.setStaticSequenceType(new SequenceType(schemaItemType, SequenceType.Arity.ZeroOrMore)); + return true; + } + // handle 'round' function if (functionName.equals(Name.createVariableInDefaultFunctionNamespace("round"))) { // set output type to the same of the first argument (special handling of numeric) @@ -538,7 +561,11 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static } if (expression.isPartialApplication()) { - FunctionSignature partialSignature = new FunctionSignature(partialParams, signature.getReturnType()); + FunctionSignature partialSignature = new FunctionSignature( + partialParams, + signature.getReturnType(), + expression.isUpdating() + ); expression.setStaticSequenceType( new SequenceType(ItemTypeFactory.createFunctionItemType(partialSignature)) ); @@ -766,8 +793,7 @@ public StaticContext visitTransformExpression(TransformExpression expression, St } visit(expression.getModifyExpression(), argument); visit(expression.getReturnExpression(), argument); - - expression.setStaticSequenceType(SequenceType.EMPTY_SEQUENCE); + expression.setStaticSequenceType(expression.getReturnExpression().getStaticSequenceType()); return argument; } @@ -1781,7 +1807,8 @@ public StaticContext visitDynamicFunctionCallExpression( if (isPartialApplication) { FunctionSignature newSignature = new FunctionSignature( partialFormalParameterTypes, - signature.getReturnType() + signature.getReturnType(), + expression.isUpdating() ); expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(newSignature))); return argument; diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 9d5354e400..0102eb79b7 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -486,9 +486,6 @@ public RuntimeIterator visitTransformExpression(TransformExpression expression, for (CopyDeclaration copyDecl : expression.getCopyDeclarations()) { copyDeclMap.put(copyDecl.getVariableName(), this.visit(copyDecl.getSourceExpression(), argument)); } - for (Expression childExpr : expression.getCopySourceExpressions()) { - copyDeclIterators.add(this.visit(childExpr, argument)); - } RuntimeIterator modifyIterator = this.visit(expression.getModifyExpression(), argument); RuntimeIterator returnIterator = this.visit(expression.getReturnExpression(), argument); @@ -664,7 +661,8 @@ public RuntimeIterator visitInlineFunctionExpr(InlineFunctionExpression expressi paramNameToSequenceTypes, returnType, bodyIterator, - expression.getStaticContextForRuntime(this.config, this.visitorConfig) + expression.getStaticContextForRuntime(this.config, this.visitorConfig), + expression.isUpdating() ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -703,7 +701,8 @@ public RuntimeIterator visitFunctionCall(FunctionCallExpression expression, Runt runtimeIterator = new StaticUserDefinedFunctionCallIterator( identifier, arguments, - expression.getStaticContextForRuntime(this.config, this.visitorConfig) + expression.getStaticContextForRuntime(this.config, this.visitorConfig), + expression.isUpdating() ); } runtimeIterator.setStaticContext(expression.getStaticContext()); @@ -1005,6 +1004,7 @@ public RuntimeIterator visitTreatExpression(TreatExpression expression, RuntimeI RuntimeIterator runtimeIterator = new TreatIterator( childExpression, expression.getSequenceType(), + expression.isUpdating(), expression.errorCodeThatShouldBeThrown(), expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index b192378c3d..b4e19efc8b 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -188,7 +188,8 @@ public StaticContext visitFunctionDeclaration(FunctionDeclaration declaration, S expression.getFunctionIdentifier(), new FunctionSignature( new ArrayList<>(expression.getParams().values()), - expression.getReturnType() + expression.getReturnType(), + expression.isUpdating() ) ); return argument; diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index f758f29134..8f2c77ffa1 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -426,7 +426,7 @@ public Node visitProlog(JsoniqParser.PrologContext ctx) { return prolog; } - public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType) { + public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType, boolean isAnnotation) { String localName = null; String prefix = null; Name name = null; @@ -445,6 +445,8 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean name = Name.createVariableInDefaultFunctionNamespace(localName); } else if (isType) { name = Name.createVariableInDefaultTypeNamespace(localName); + } else if (isAnnotation) { + name = Name.createVariableInDefaultAnnotationsNamespace(localName); } else { name = Name.createVariableInNoNamespace(localName); } @@ -463,14 +465,14 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean @Override public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) { List annotations = processAnnotations(ctx.annotations()); - Name name = parseName(ctx.qname(), true, false); + Name name = parseName(ctx.qname(), true, false, false); LinkedHashMap fnParams = new LinkedHashMap<>(); SequenceType fnReturnType = null; Name paramName; SequenceType paramType; if (ctx.paramList() != null) { for (JsoniqParser.ParamContext param : ctx.paramList().param()) { - paramName = parseName(param.qname(), false, false); + paramName = parseName(param.qname(), false, false, false); paramType = ITEM_STAR; if (fnParams.containsKey(paramName)) { throw new DuplicateParamNameException( @@ -495,12 +497,15 @@ public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) { StatementsAndOptionalExpr funcBody = (StatementsAndOptionalExpr) this .visitStatementsAndOptionalExpr(ctx.fn_body); + boolean isExternal = ctx.is_external != null; + return new InlineFunctionExpression( annotations, name, fnParams, fnReturnType, funcBody, + isExternal, createMetadataFromContext(ctx) ); } @@ -531,7 +536,7 @@ public Node visitTypeDecl(JsoniqParser.TypeDeclContext ctx) { pe.initCause(e); throw pe; } - Name name = parseName(ctx.qname(), false, true); + Name name = parseName(ctx.qname(), false, true, false); String schemaLanguage = null; if (ctx.schema != null) { schemaLanguage = ctx.schema.getText(); @@ -1132,7 +1137,7 @@ public Node visitArrowExpr(JsoniqParser.ArrowExprContext ctx) { children.add(mainExpression); children.addAll(getArgumentsFromArgumentListContext(ctx.arguments.get(i))); if (functionCallContext.qname() != null) { - Name name = parseName(functionCallContext.qname(), true, false); + Name name = parseName(functionCallContext.qname(), true, false, false); mainExpression = processFunctionCall(name, children, createMetadataFromContext(functionCallContext)); continue; } else if (functionCallContext.varRef() != null) { @@ -1518,7 +1523,7 @@ public Node visitParenthesizedExpr(JsoniqParser.ParenthesizedExprContext ctx) { @Override public Node visitVarRef(JsoniqParser.VarRefContext ctx) { - Name name = parseName(ctx.qname(), false, false); + Name name = parseName(ctx.qname(), false, false, false); return new VariableReferenceExpression(name, createMetadataFromContext(ctx)); } @@ -1589,7 +1594,7 @@ public ItemType processItemType(JsoniqParser.ItemTypeContext itemTypeContext) { return BuiltinTypesCatalogue.anyFunctionItem; } } - Name name = parseName(itemTypeContext.qname(), false, true); + Name name = parseName(itemTypeContext.qname(), false, true, false); if (!BuiltinTypesCatalogue.typeExists(name)) { return new ItemTypeReference(name); } @@ -1622,7 +1627,7 @@ private Expression processFunctionCall(Name name, List children, Exc @Override public Node visitFunctionCall(JsoniqParser.FunctionCallContext ctx) { - Name name = parseName(ctx.fn_name, true, false); + Name name = parseName(ctx.fn_name, true, false, false); return processFunctionCall( name, getArgumentsFromArgumentListContext(ctx.argumentList()), @@ -1666,7 +1671,7 @@ public Node visitFunctionItemExpr(JsoniqParser.FunctionItemExprContext ctx) { @Override public Node visitNamedFunctionRef(JsoniqParser.NamedFunctionRefContext ctx) { - Name name = parseName(ctx.fn_name, true, false); + Name name = parseName(ctx.fn_name, true, false, false); int arity = 0; try { arity = Integer.parseInt(ctx.arity.getText()); @@ -1691,7 +1696,7 @@ public Node visitInlineFunctionExpr(JsoniqParser.InlineFunctionExprContext ctx) SequenceType paramType; if (ctx.paramList() != null) { for (JsoniqParser.ParamContext param : ctx.paramList().param()) { - paramName = parseName(param.qname(), false, false); + paramName = parseName(param.qname(), false, false, false); paramType = SequenceType.ITEM_STAR; if (fnParams.containsKey(paramName)) { throw new DuplicateParamNameException( @@ -1873,7 +1878,7 @@ public Node visitTryCatchExpr(JsoniqParser.TryCatchExprContext ctx) { for (JsoniqParser.CatchClauseContext catchCtx : ctx.catches) { Expression catchExpression = (Expression) this.visitExpr(catchCtx.catch_expression); for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) { - Name name = parseName(qnameCtx, false, false); + Name name = parseName(qnameCtx, false, false, false); if (!catchExpressions.containsKey(name.getLocalName())) { catchExpressions.put(name.getLocalName(), catchExpression); } @@ -2028,7 +2033,7 @@ public Node visitApplyStatement(JsoniqParser.ApplyStatementContext ctx) { @Override public Node visitAssignStatement(JsoniqParser.AssignStatementContext ctx) { - Name paramName = parseName(ctx.qname(), false, false); + Name paramName = parseName(ctx.qname(), false, false, false); Expression exprSingle = (Expression) this.visitExprSingle(ctx.exprSingle()); return new AssignStatement(exprSingle, paramName, createMetadataFromContext(ctx)); } @@ -2170,7 +2175,7 @@ public Node visitTryCatchStatement(JsoniqParser.TryCatchStatementContext ctx) { for (JsoniqParser.CatchCaseStatementContext catchCtx : ctx.catches) { BlockStatement catchBlockStatement = (BlockStatement) this.visitBlockStatement(catchCtx.catch_block); for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) { - Name name = parseName(qnameCtx, false, false); + Name name = parseName(qnameCtx, false, false, false); if (!catchBlockStatements.containsKey(name.getLocalName())) { catchBlockStatements.put(name.getLocalName(), catchBlockStatement); } @@ -2380,20 +2385,20 @@ public ExceptionMetadata generateMetadata(Token token) { private List processAnnotations(JsoniqParser.AnnotationsContext annotations) { List parsedAnnotations = new ArrayList<>(); - annotations.annotation().forEach(annotationContext -> { + for (JsoniqParser.AnnotationContext annotationContext : annotations.annotation()) { + // for backwards compatibility, the specification allows for updating without % sign + if (annotationContext.updating != null) { + Name name = Name.createVariableInDefaultAnnotationsNamespace("updating"); + parsedAnnotations.add(new Annotation(name, null)); + continue; + } JsoniqParser.QnameContext qnameContext = annotationContext.qname(); - Name name = parseName(qnameContext, false, false); + Name name = parseName(qnameContext, false, false, true); if (!annotationContext.Literal().isEmpty()) { throw new OurBadException("Literals are currently not supported in annotations!"); } parsedAnnotations.add(new Annotation(name, null)); - // List literals = new ArrayList<>(); - // ExceptionMetadata metadata = createMetadataFromContext(annotationContext); - // annotationContext.Literal().forEach(literal -> { - // literals.add(getLiteralExpressionFromToken(literal.getText(), metadata)); - // }); - // parsedAnnotations.add(new Annotation(name, literals)); - }); + } return parsedAnnotations; } diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index f63ed59f9f..7c78ec877b 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -154,16 +154,77 @@ public static MainModule parseJSONiqMainModule( if (main == null) { throw new ParsingException("A library module is not executable.", ExceptionMetadata.EMPTY_METADATA); } + if (configuration.isPrintIteratorTree()) { + System.err.println("***************"); + System.err.println("Parsing program"); + System.err.println("***************"); + } MainModule mainModule = (MainModule) visitor.visit(main); + if (configuration.isPrintIteratorTree()) { + System.err.println("***************"); + System.err.println("Pruning modules"); + System.err.println("***************"); + } pruneModules(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("**********************"); + System.err.println("Resolving dependencies"); + System.err.println("**********************"); + } resolveDependencies(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************************"); + System.err.println("Populating sequential classifications"); + System.err.println("*************************************"); + } populateSequentialClassifications(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("***************************************"); + System.err.println("Applying type independent optimizations"); + System.err.println("***************************************"); + } mainModule = applyTypeIndependentOptimizations(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************"); + System.err.println("Populating static context"); + System.err.println("*************************"); + } populateStaticContext(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************************"); + System.err.println("Populating expression classifications"); + System.err.println("*************************************"); + } + populateExpressionClassifications(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("**************"); + System.err.println("Infering types"); + System.err.println("**************"); + } inferTypes(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("************************"); + System.err.println("Applying type dependent optimizations"); + System.err.println("************************"); + } mainModule = applyTypeDependentOptimizations(mainModule); + if (configuration.isPrintIteratorTree()) { + System.err.println("***************************************"); + System.err.println("Populating execution modes"); + System.err.println("***************************************"); + } populateExecutionModes(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************************"); + System.err.println("Populating expression classifications"); + System.err.println("*************************************"); + } populateExpressionClassifications(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("********************************"); + System.err.println("Verify composability constraints"); + System.err.println("********************************"); + } verifyComposabilityConstraints(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index c82b2df27f..593a5fcbcc 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -73,6 +73,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean nativeExecution; private boolean functionInlining; private boolean thirdFeature; + private boolean applyUpdates; private Map shortcutMap; private Set yesNoShortcuts; @@ -422,6 +423,12 @@ public void init() { this.functionInlining = true; } + if (this.arguments.containsKey("apply-updates")) { + this.applyUpdates = this.arguments.get("apply-updates").equals("yes"); + } else { + this.applyUpdates = false; + } + if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { this.optimizeGeneralComparisonToValueComparison = this.arguments.get( "optimize-general-comparison-to-value-comparison" @@ -644,6 +651,14 @@ public void setFunctionInlining(boolean b) { this.functionInlining = b; } + public boolean applyUpdates() { + return this.applyUpdates; + } + + public void setApplyUpdates(boolean b) { + this.applyUpdates = b; + } + public boolean optimizeGeneralComparisonToValueComparison() { return this.optimizeGeneralComparisonToValueComparison; } diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 8ff2d1970d..64a93bdf22 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -46,6 +46,7 @@ import org.rumbledb.runtime.functions.durations.components.YearsFromDurationFunctionIterator; import org.rumbledb.runtime.functions.input.AvroFileFunctionIterator; import org.rumbledb.runtime.functions.input.CSVFileFunctionIterator; +import org.rumbledb.runtime.functions.input.DeltaFileFunctionIterator; import org.rumbledb.runtime.functions.input.JsonFileFunctionIterator; import org.rumbledb.runtime.functions.input.LibSVMFileFunctionIterator; import org.rumbledb.runtime.functions.input.ParallelizeFunctionIterator; @@ -518,6 +519,16 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME ); + /** + * function that parses a delta file + */ + static final BuiltinFunction delta_file = createBuiltinFunction( + new Name(Name.JN_NS, "jn", "delta-file"), + "string", + "item*", + DeltaFileFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME + ); /** * function that parses a csv file */ @@ -2698,6 +2709,7 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(parallelizeFunction2.getIdentifier(), parallelizeFunction2); builtinFunctions.put(parquet_file1.getIdentifier(), parquet_file1); builtinFunctions.put(parquet_file2.getIdentifier(), parquet_file2); + builtinFunctions.put(delta_file.getIdentifier(), delta_file); builtinFunctions.put(csv_file1.getIdentifier(), csv_file1); builtinFunctions.put(csv_file2.getIdentifier(), csv_file2); builtinFunctions.put(root_file1.getIdentifier(), root_file1); diff --git a/src/main/java/org/rumbledb/context/GlobalVariables.java b/src/main/java/org/rumbledb/context/GlobalVariables.java index 7c3f87936f..ce93dec247 100644 --- a/src/main/java/org/rumbledb/context/GlobalVariables.java +++ b/src/main/java/org/rumbledb/context/GlobalVariables.java @@ -11,6 +11,7 @@ import java.util.Set; public class GlobalVariables implements Serializable, KryoSerializable { + private static final long serialVersionUID = 1L; private Set globalVariables; public GlobalVariables() { diff --git a/src/main/java/org/rumbledb/context/Name.java b/src/main/java/org/rumbledb/context/Name.java index 45d377c517..687b3a6105 100644 --- a/src/main/java/org/rumbledb/context/Name.java +++ b/src/main/java/org/rumbledb/context/Name.java @@ -59,9 +59,9 @@ public class Name implements Comparable, Serializable, KryoSerializable { public static final String XS_NS = "http://www.w3.org/2001/XMLSchema"; public static final String JS_NS = "http://jsoniq.org/types"; public static final String LOCAL_NS = "http://www.w3.org/2005/xquery-local-functions"; - - public static final String AN_NS = "http://www.zorba-xquery.com/annotations"; + public static final String AN_NS = "http://www.w3.org/2012/xquery"; public static final String DEFAULT_COLLATION_NS = "http://www.w3.org/2005/xpath-functions/collation/codepoint"; + public static final Name CONTEXT_ITEM = createVariableInNoNamespace("$"); public static final Name CONTEXT_POSITION = createVariableInNoNamespace("$position"); public static final Name CONTEXT_COUNT = createVariableInNoNamespace("$count"); @@ -122,6 +122,18 @@ public static Name createVariableInDefaultFunctionNamespace(String localName) { return new Name(JSONIQ_DEFAULT_FUNCTION_NS, "", localName); } + /** + * Creates an expanded name that has the default annotations namespace. By default, in Rumble, unprefixed + * annotations live in this namespace. This namespace includes + * all builtin annotations. + * + * @param localName the name of the variable + * @return the expanded name + */ + public static Name createVariableInDefaultAnnotationsNamespace(String localName) { + return new Name(AN_NS, "", localName); + } + public static Name createVariableInDefaultXQueryTypeNamespace(String localName) { return new Name(FN_NS, "", localName); } diff --git a/src/main/java/org/rumbledb/context/StaticContext.java b/src/main/java/org/rumbledb/context/StaticContext.java index a322077bd0..979fd636e5 100644 --- a/src/main/java/org/rumbledb/context/StaticContext.java +++ b/src/main/java/org/rumbledb/context/StaticContext.java @@ -71,7 +71,7 @@ public class StaticContext implements Serializable, KryoSerializable { defaultBindings.put("xs", Name.XS_NS); defaultBindings.put("jn", Name.JN_NS); defaultBindings.put("js", Name.JS_NS); - defaultBindings.put("an", Name.AN_NS); + // defaultBindings.put("an", Name.AN_NS); } private RumbleRuntimeConfiguration configuration; @@ -454,7 +454,7 @@ public InScopeSchemaTypes getInScopeSchemaTypes() { } public int getCurrentMutabilityLevel() { - return currentMutabilityLevel; + return this.currentMutabilityLevel; } public void setCurrentMutabilityLevel(int currentMutabilityLevel) { diff --git a/src/main/java/org/rumbledb/context/VariableValues.java b/src/main/java/org/rumbledb/context/VariableValues.java index 61572b017f..e37bf4526c 100644 --- a/src/main/java/org/rumbledb/context/VariableValues.java +++ b/src/main/java/org/rumbledb/context/VariableValues.java @@ -366,6 +366,9 @@ public String toString() { sb.append(" " + name + " (" + this.localVariableValues.get(name).size() + " items)\n"); if (this.localVariableValues.get(name).size() == 1) { sb.append(" " + this.localVariableValues.get(name).get(0).serialize() + "\n"); + sb.append( + " Mutability level: " + this.localVariableValues.get(name).get(0).getMutabilityLevel() + "\n" + ); } } sb.append(" Counts:\n"); diff --git a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java index c2f8621601..261f2c261a 100644 --- a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java +++ b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java @@ -74,6 +74,7 @@ public enum ErrorCode { OurBadErrorCode("RBST0004"), ClusterConnectionErrorCode("RBDY0005"), DatesWithTimezonesNotSupported("RBDY0006"), + CannotModifyImmutableValue("RBDY0007"), UnexpectedStaticType("RBTY0001"), @@ -131,6 +132,8 @@ public enum ErrorCode { TransformModifiesNonCopiedValue("XUDY0014"), UpdateTargetIsEmptySeqErrorCode("XUDY0027"), + UpdatingFunctionHasReturnTypeErrorCode("XUST0028"), + DuplicateObjectInsertSourceErrorCode("JNUP0005"), DuplicateKeyOnUpdateApplyErrorCode("JNUP0006"), CannotCastUpdateSelectorErrorCode("JNUP0007"), diff --git a/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java new file mode 100644 index 0000000000..2441383014 --- /dev/null +++ b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.exceptions; + +import org.rumbledb.errorcodes.ErrorCode; + +public class ModifiesImmutableValueException extends RumbleException { + + private static final long serialVersionUID = 1L; + + public ModifiesImmutableValueException(String message, ExceptionMetadata metadata) { + super(message, ErrorCode.CannotModifyImmutableValue, metadata); + } +} diff --git a/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java new file mode 100644 index 0000000000..2b8ebf47aa --- /dev/null +++ b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.exceptions; + +import org.rumbledb.errorcodes.ErrorCode; + +public class UpdatingFunctionHasReturnTypeException extends RumbleException { + + private static final long serialVersionUID = 1L; + + public UpdatingFunctionHasReturnTypeException(String message, ExceptionMetadata metadata) { + super(message, ErrorCode.UpdatingFunctionHasReturnTypeErrorCode, metadata); + } +} diff --git a/src/main/java/org/rumbledb/expressions/Expression.java b/src/main/java/org/rumbledb/expressions/Expression.java index 5b1bf2f70e..2dc28b4a1e 100644 --- a/src/main/java/org/rumbledb/expressions/Expression.java +++ b/src/main/java/org/rumbledb/expressions/Expression.java @@ -126,7 +126,7 @@ public void setStaticSequenceType(SequenceType staticSequenceType) { * @return Expression Classification of the expression. */ public ExpressionClassification getExpressionClassification() { - return expressionClassification; + return this.expressionClassification; } /** diff --git a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java index f852a1f3de..842478436e 100644 --- a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java +++ b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java @@ -3,10 +3,11 @@ /** * An ExpressionClassification classifies an expression under 4 possible classifications. * - * A BASIC_UPDATING expression is classified as 1 of 6 expressions in the update package, that can alter the state of + * A BASIC_UPDATING expression is classified as 1 of 5 expressions in the update package, that can alter the state of * an existing node. * - * An UPDATING expression is classified as a BASIC_EXPRESSION or any expression (excluding a TransformExpression) that + * An UPDATING expression is classified as a BASIC_UPDATING expression or any expression (excluding a + * TransformExpression) that * directly contains an UPDATING expression and that can alter the state of an existing node. * * A SIMPLE expression is classified as an expression that is not an updating expression. diff --git a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java index 0740660311..95f05b5269 100644 --- a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java +++ b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java @@ -30,6 +30,7 @@ import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.scripting.annotations.Annotation; +import org.rumbledb.expressions.scripting.annotations.AnnotationConstants; import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr; import org.rumbledb.types.SequenceType; @@ -51,6 +52,7 @@ public class InlineFunctionExpression extends Expression { private final List annotations; private boolean hasSequentialPropertyAnnotation; private boolean hasExitStatement; + private final boolean isExternal; public InlineFunctionExpression( List annotations, @@ -58,6 +60,7 @@ public InlineFunctionExpression( Map params, SequenceType returnType, StatementsAndOptionalExpr body, + boolean isExternal, ExceptionMetadata metadata ) { super(metadata); @@ -67,6 +70,7 @@ public InlineFunctionExpression( this.body = body; this.annotations = annotations; this.functionIdentifier = new FunctionIdentifier(name, params.size()); + this.isExternal = isExternal; this.hasExitStatement = false; if (annotations != null) { this.setSequentialFromAnnotations(); @@ -97,6 +101,17 @@ private void setSequentialFromAnnotations() { this.setSequential(foundSeqAnnotation); } + public InlineFunctionExpression( + List annotations, + Name name, + Map params, + SequenceType returnType, + StatementsAndOptionalExpr body, + ExceptionMetadata metadata + ) { + this(annotations, name, params, returnType, body, false, metadata); + } + public Name getName() { return this.name; } @@ -126,6 +141,20 @@ public List getAnnotations() { return annotations; } + @Override + public boolean isUpdating() { + for (Annotation a : this.annotations) { + if (a.getAnnotationName().equals(AnnotationConstants.UPDATING)) { + return true; + } + } + return false; + } + + public boolean isExternal() { + return this.isExternal; + } + @Override public List getChildren() { return Arrays.asList(this.body); @@ -192,8 +221,9 @@ public void print(StringBuffer buffer, int indent) { @Override public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); + String updating = isUpdating() ? "%an:updating" : ""; if (this.name != null) { - sb.append("declare function " + this.name.toString() + "("); + sb.append("declare " + updating + " function " + this.name.toString() + "("); } else { sb.append("function ("); } diff --git a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java index f5ec43ca51..0717a299ed 100644 --- a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java +++ b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java @@ -5,6 +5,8 @@ public class AnnotationConstants { public static final Name SEQUENTIAL = new Name(Name.AN_NS, "an", "sequential"); public static final Name NON_SEQUENTIAL = new Name(Name.AN_NS, "an", "nonsequential"); + public static final Name UPDATING = new Name(Name.AN_NS, "an", "updating"); + public static final Name SIMPLE = new Name(Name.AN_NS, "an", "simple"); public static final Name ASSIGNABLE = new Name(Name.AN_NS, "an", "assignable"); diff --git a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java index ae7702206d..78fc42429b 100644 --- a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java @@ -31,11 +31,11 @@ public AppendExpression( } public Expression getArrayExpression() { - return arrayExpression; + return this.arrayExpression; } public Expression getToAppendExpression() { - return toAppendExpression; + return this.toAppendExpression; } @Override diff --git a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java index f443f4ec8d..fe514e3b44 100644 --- a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java @@ -21,11 +21,11 @@ public CopyDeclaration( } public Name getVariableName() { - return variableName; + return this.variableName; } public Expression getSourceExpression() { - return sourceExpression; + return this.sourceExpression; } public SequenceType getSourceSequenceType() { diff --git a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java index 57e5368496..1f1c5f78c9 100644 --- a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java @@ -36,11 +36,11 @@ public List getChildren() { } public Expression getMainExpression() { - return mainExpression; + return this.mainExpression; } public Expression getLocatorExpression() { - return locatorExpression; + return this.locatorExpression; } diff --git a/src/main/java/org/rumbledb/expressions/update/InsertExpression.java b/src/main/java/org/rumbledb/expressions/update/InsertExpression.java index b4edff096c..c569be308e 100644 --- a/src/main/java/org/rumbledb/expressions/update/InsertExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/InsertExpression.java @@ -28,29 +28,29 @@ public InsertExpression( } public boolean hasPositionExpression() { - return positionExpression != null; + return this.positionExpression != null; } public Expression getMainExpression() { - return mainExpression; + return this.mainExpression; } public Expression getToInsertExpression() { - return toInsertExpression; + return this.toInsertExpression; } public Expression getPositionExpression() { - if (positionExpression == null) { + if (this.positionExpression == null) { throw new OurBadException("No position expression present in Insert Expression"); } - return positionExpression; + return this.positionExpression; } @Override public List getChildren() { return this.positionExpression == null - ? Arrays.asList(mainExpression, toInsertExpression) - : Arrays.asList(mainExpression, toInsertExpression, positionExpression); + ? Arrays.asList(this.mainExpression, this.toInsertExpression) + : Arrays.asList(this.mainExpression, this.toInsertExpression, this.positionExpression); } @Override @@ -62,12 +62,12 @@ public T accept(AbstractNodeVisitor visitor, T argument) { public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); sb.append("insert json "); - toInsertExpression.serializeToJSONiq(sb, 0); + this.toInsertExpression.serializeToJSONiq(sb, 0); sb.append(" into "); - mainExpression.serializeToJSONiq(sb, 0); + this.mainExpression.serializeToJSONiq(sb, 0); if (this.hasPositionExpression()) { sb.append(" at position "); - positionExpression.serializeToJSONiq(sb, 0); + this.positionExpression.serializeToJSONiq(sb, 0); } sb.append("\n"); } diff --git a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java index e50fea257b..3d5205eb23 100644 --- a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java @@ -42,15 +42,15 @@ public List getChildren() { } public Expression getMainExpression() { - return mainExpression; + return this.mainExpression; } public Expression getLocatorExpression() { - return locatorExpression; + return this.locatorExpression; } public Expression getNameExpression() { - return nameExpression; + return this.nameExpression; } @Override diff --git a/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java b/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java index c914f249b4..7655174d68 100644 --- a/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java @@ -42,15 +42,15 @@ public List getChildren() { } public Expression getMainExpression() { - return mainExpression; + return this.mainExpression; } public Expression getLocatorExpression() { - return locatorExpression; + return this.locatorExpression; } public Expression getReplacerExpression() { - return replacerExpression; + return this.replacerExpression; } @Override diff --git a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java index f4773ab769..aa06596a25 100644 --- a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java @@ -32,7 +32,7 @@ public TransformExpression( } public List getCopyDeclarations() { - return copyDeclarations; + return this.copyDeclarations; } public List getCopySourceExpressions() { @@ -43,11 +43,11 @@ public List getCopySourceExpressions() { } public Expression getModifyExpression() { - return modifyExpression; + return this.modifyExpression; } public Expression getReturnExpression() { - return returnExpression; + return this.returnExpression; } @Override diff --git a/src/main/java/org/rumbledb/items/AnnotatedItem.java b/src/main/java/org/rumbledb/items/AnnotatedItem.java index 5d110a4014..16f790dd9e 100644 --- a/src/main/java/org/rumbledb/items/AnnotatedItem.java +++ b/src/main/java/org/rumbledb/items/AnnotatedItem.java @@ -371,4 +371,79 @@ public int castToIntValue() { public NativeClauseContext generateNativeQuery(NativeClauseContext context) { return this.itemToAnnotate.generateNativeQuery(context); } + + @Override + public String getSparkSQLValue() { + return this.itemToAnnotate.getSparkSQLValue(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return this.itemToAnnotate.getSparkSQLValue(itemType); + } + + @Override + public String getSparkSQLType() { + return this.itemToAnnotate.getSparkSQLType(); + } + + @Override + public void putItemAt(Item item, int i) { + this.itemToAnnotate.putItemAt(item, i); + } + + @Override + public void putItemsAt(List items, int i) { + this.itemToAnnotate.putItemsAt(items, i); + } + + @Override + public void removeItemAt(int i) { + this.itemToAnnotate.removeItemAt(i); + } + + @Override + public void removeItemByKey(String key) { + this.itemToAnnotate.removeItemByKey(key); + } + + @Override + public int getMutabilityLevel() { + return this.itemToAnnotate.getMutabilityLevel(); + } + + @Override + public void setMutabilityLevel(int mutabilityLevel) { + this.itemToAnnotate.setMutabilityLevel(mutabilityLevel); + } + + @Override + public long getTopLevelID() { + return this.itemToAnnotate.getTopLevelID(); + } + + @Override + public void setTopLevelID(long topLevelID) { + this.itemToAnnotate.setTopLevelID(topLevelID); + } + + @Override + public String getPathIn() { + return this.itemToAnnotate.getPathIn(); + } + + @Override + public void setPathIn(String pathIn) { + this.itemToAnnotate.setPathIn(pathIn); + } + + @Override + public String getTableLocation() { + return this.itemToAnnotate.getTableLocation(); + } + + @Override + public void setTableLocation(String location) { + this.itemToAnnotate.setTableLocation(location); + } } diff --git a/src/main/java/org/rumbledb/items/ArrayItem.java b/src/main/java/org/rumbledb/items/ArrayItem.java index ee8d7815c1..2ffab147b5 100644 --- a/src/main/java/org/rumbledb/items/ArrayItem.java +++ b/src/main/java/org/rumbledb/items/ArrayItem.java @@ -34,19 +34,27 @@ public class ArrayItem implements Item { private static final long serialVersionUID = 1L; private List arrayItems; - private int mutabilityLevel; + private long topLevelID; + private String pathIn; + private String location; public ArrayItem() { super(); this.arrayItems = new ArrayList<>(); - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public ArrayItem(List arrayItems) { super(); this.arrayItems = arrayItems; - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public boolean equals(Object otherItem) { @@ -115,12 +123,20 @@ public int getSize() { @Override public void write(Kryo kryo, Output output) { kryo.writeObject(output, this.arrayItems); + output.writeInt(this.mutabilityLevel); + output.writeLong(this.topLevelID); + kryo.writeObject(output, this.pathIn); + kryo.writeObject(output, this.location); } @SuppressWarnings("unchecked") @Override public void read(Kryo kryo, Input input) { this.arrayItems = kryo.readObject(input, ArrayList.class); + this.mutabilityLevel = input.readInt(); + this.topLevelID = input.readLong(); + this.pathIn = kryo.readObject(input, String.class); + this.location = kryo.readObject(input, String.class); } public int hashCode() { @@ -150,8 +166,92 @@ public int getMutabilityLevel() { @Override public void setMutabilityLevel(int mutabilityLevel) { this.mutabilityLevel = mutabilityLevel; - for (Item item : arrayItems) { + for (Item item : this.arrayItems) { item.setMutabilityLevel(mutabilityLevel); } } + + @Override + public long getTopLevelID() { + return this.topLevelID; + } + + @Override + public void setTopLevelID(long topLevelID) { + this.topLevelID = topLevelID; + for (Item item : this.arrayItems) { + item.setTopLevelID(topLevelID); + } + } + + @Override + public String getPathIn() { + return this.pathIn; + } + + @Override + public void setPathIn(String pathIn) { + this.pathIn = pathIn; + for (int i = 0; i < this.arrayItems.size(); i++) { + Item item = this.arrayItems.get(i); + item.setPathIn(pathIn + "[" + i + "]"); + } + } + + @Override + public String getTableLocation() { + return this.location; + } + + @Override + public void setTableLocation(String location) { + this.location = location; + for (Item item : this.arrayItems) { + item.setTableLocation(location); + } + } + + @Override + public String getSparkSQLValue() { + StringBuilder sb = new StringBuilder(); + sb.append("array("); + for (int i = 0; i < this.arrayItems.size(); i++) { + Item item = this.arrayItems.get(i); + sb.append(item.getSparkSQLValue()); + if (i + 1 < this.arrayItems.size()) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + StringBuilder sb = new StringBuilder(); + ItemType elementType = itemType.getArrayContentFacet(); + sb.append("array("); + for (int i = 0; i < this.arrayItems.size(); i++) { + Item item = this.arrayItems.get(i); + sb.append(item.getSparkSQLValue(elementType)); + if (i + 1 < this.arrayItems.size()) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLType() { + // TODO: Is it okay to assume first elem type is same as rest? + StringBuilder sb = new StringBuilder(); + sb.append("ARRAY<"); + if (this.getSize() <= 0) { + // TODO: Throw error? No empty arrays? + } + sb.append(this.getItemAt(0).getSparkSQLType()); + sb.append(">"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/items/BooleanItem.java b/src/main/java/org/rumbledb/items/BooleanItem.java index 9348e31013..fa3d108dc6 100644 --- a/src/main/java/org/rumbledb/items/BooleanItem.java +++ b/src/main/java/org/rumbledb/items/BooleanItem.java @@ -100,4 +100,21 @@ public ItemType getDynamicType() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "BOOLEAN"; + } + } diff --git a/src/main/java/org/rumbledb/items/DateItem.java b/src/main/java/org/rumbledb/items/DateItem.java index 6881e66052..edccd89479 100644 --- a/src/main/java/org/rumbledb/items/DateItem.java +++ b/src/main/java/org/rumbledb/items/DateItem.java @@ -116,4 +116,10 @@ public ItemType getDynamicType() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "DATE"; + } } diff --git a/src/main/java/org/rumbledb/items/DecimalItem.java b/src/main/java/org/rumbledb/items/DecimalItem.java index bc140b4110..8463fc29b6 100644 --- a/src/main/java/org/rumbledb/items/DecimalItem.java +++ b/src/main/java/org/rumbledb/items/DecimalItem.java @@ -144,4 +144,20 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return this.value.stripTrailingZeros().toPlainString(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return this.value.stripTrailingZeros().toPlainString(); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "DECIMAL"; + } } diff --git a/src/main/java/org/rumbledb/items/DoubleItem.java b/src/main/java/org/rumbledb/items/DoubleItem.java index a82018813c..dd59e2a1f4 100644 --- a/src/main/java/org/rumbledb/items/DoubleItem.java +++ b/src/main/java/org/rumbledb/items/DoubleItem.java @@ -186,4 +186,32 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + if (Double.isInfinite(this.value) && this.value > 0) { + return "INF"; + } + if (Double.isInfinite(this.value) && this.value < 0) { + return "-INF"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + if (Double.isInfinite(this.value) && this.value > 0) { + return "INF"; + } + if (Double.isInfinite(this.value) && this.value < 0) { + return "-INF"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "DOUBLE"; + } } diff --git a/src/main/java/org/rumbledb/items/FloatItem.java b/src/main/java/org/rumbledb/items/FloatItem.java index 62f6a2aaee..43b6da5f3d 100644 --- a/src/main/java/org/rumbledb/items/FloatItem.java +++ b/src/main/java/org/rumbledb/items/FloatItem.java @@ -190,4 +190,32 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) { } return new NativeClauseContext(context, "CAST (" + this.value + "D AS FLOAT)", SequenceType.FLOAT); } + + @Override + public String getSparkSQLValue() { + if (Float.isInfinite(this.value) && this.value > 0) { + return "Infinity"; + } + if (Float.isInfinite(this.value) && this.value < 0) { + return "-Infinity"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + if (Float.isInfinite(this.value) && this.value > 0) { + return "Infinity"; + } + if (Float.isInfinite(this.value) && this.value < 0) { + return "-Infinity"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "FLOAT"; + } } diff --git a/src/main/java/org/rumbledb/items/FunctionItem.java b/src/main/java/org/rumbledb/items/FunctionItem.java index f6cd08add5..c767572114 100644 --- a/src/main/java/org/rumbledb/items/FunctionItem.java +++ b/src/main/java/org/rumbledb/items/FunctionItem.java @@ -114,7 +114,8 @@ public FunctionItem( Map paramNameToSequenceTypes, SequenceType returnType, DynamicContext dynamicModuleContext, - RuntimeIterator bodyIterator + RuntimeIterator bodyIterator, + boolean isUpdating ) { List paramNames = new ArrayList<>(); List parameters = new ArrayList<>(); @@ -125,7 +126,7 @@ public FunctionItem( this.identifier = new FunctionIdentifier(name, paramNames.size()); this.parameterNames = paramNames; - this.signature = new FunctionSignature(parameters, returnType); + this.signature = new FunctionSignature(parameters, returnType, isUpdating); this.bodyIterator = bodyIterator; this.dynamicModuleContext = dynamicModuleContext; this.localVariablesInClosure = new HashMap<>(); diff --git a/src/main/java/org/rumbledb/items/IntItem.java b/src/main/java/org/rumbledb/items/IntItem.java index 1998a05216..3f496978dc 100644 --- a/src/main/java/org/rumbledb/items/IntItem.java +++ b/src/main/java/org/rumbledb/items/IntItem.java @@ -162,4 +162,20 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "INT"; + } } diff --git a/src/main/java/org/rumbledb/items/IntegerItem.java b/src/main/java/org/rumbledb/items/IntegerItem.java index 0ca1de1822..a38122a040 100644 --- a/src/main/java/org/rumbledb/items/IntegerItem.java +++ b/src/main/java/org/rumbledb/items/IntegerItem.java @@ -151,4 +151,20 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "INTEGER"; + } } diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java index c81854cd47..6ce96711b2 100644 --- a/src/main/java/org/rumbledb/items/ItemFactory.java +++ b/src/main/java/org/rumbledb/items/ItemFactory.java @@ -209,16 +209,39 @@ public Item createArrayItem() { return new ArrayItem(); } - public Item createArrayItem(List items) { - return new ArrayItem(items); - } - - public Item createObjectItem(List keys, List values, ExceptionMetadata itemMetadata) { - return new ObjectItem(keys, values, itemMetadata); + public Item createArrayItem(List items, boolean mutable) { + Item result = new ArrayItem(items); + if (mutable) { + result.setMutabilityLevel(0); + } else { + result.setMutabilityLevel(-1); + } + return result; + } + + public Item createObjectItem( + List keys, + List values, + ExceptionMetadata itemMetadata, + boolean mutable + ) { + Item result = new ObjectItem(keys, values, itemMetadata); + if (mutable) { + result.setMutabilityLevel(0); + } else { + result.setMutabilityLevel(-1); + } + return result; } - public Item createObjectItem(Map> keyValuePairs) { - return new ObjectItem(keyValuePairs); + public Item createObjectItem(Map> keyValuePairs, boolean mutable) { + Item result = new ObjectItem(keyValuePairs); + if (mutable) { + result.setMutabilityLevel(0); + } else { + result.setMutabilityLevel(-1); + } + return result; } } diff --git a/src/main/java/org/rumbledb/items/LazyObjectItem.java b/src/main/java/org/rumbledb/items/LazyObjectItem.java index 7b447fe94c..720f8af8b0 100644 --- a/src/main/java/org/rumbledb/items/LazyObjectItem.java +++ b/src/main/java/org/rumbledb/items/LazyObjectItem.java @@ -77,7 +77,7 @@ public Item getItem() { return ItemFactory.getInstance().createNullItem(); } } - return ItemFactory.getInstance().createArrayItem(items); + return ItemFactory.getInstance().createArrayItem(items, true); } } diff --git a/src/main/java/org/rumbledb/items/NullItem.java b/src/main/java/org/rumbledb/items/NullItem.java index 250f2e17a9..f80bce34d6 100644 --- a/src/main/java/org/rumbledb/items/NullItem.java +++ b/src/main/java/org/rumbledb/items/NullItem.java @@ -93,4 +93,14 @@ public boolean isAtomic() { public String getStringValue() { return "null"; } + + @Override + public String getSparkSQLValue() { + return "NULL"; + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return "NULL"; + } } diff --git a/src/main/java/org/rumbledb/items/ObjectItem.java b/src/main/java/org/rumbledb/items/ObjectItem.java index c6f535ac53..cb174fb9a4 100644 --- a/src/main/java/org/rumbledb/items/ObjectItem.java +++ b/src/main/java/org/rumbledb/items/ObjectItem.java @@ -27,6 +27,7 @@ import org.rumbledb.exceptions.DuplicateObjectKeyException; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; import java.util.*; @@ -37,14 +38,19 @@ public class ObjectItem implements Item { private static final long serialVersionUID = 1L; private List values; private List keys; - private int mutabilityLevel; + private long topLevelID; + private String pathIn; + private String location; public ObjectItem() { super(); this.keys = new ArrayList<>(); this.values = new ArrayList<>(); - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public ObjectItem(List keys, List values, ExceptionMetadata itemMetadata) { @@ -52,7 +58,10 @@ public ObjectItem(List keys, List values, ExceptionMetadata itemMe checkForDuplicateKeys(keys, itemMetadata); this.keys = keys; this.values = values; - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public boolean equals(Object otherItem) { @@ -103,7 +112,7 @@ public ObjectItem(Map> keyValuePairs) { List values = keyValuePairs.get(key); // for each key, convert the lists of values into arrayItems if (values.size() > 1) { - Item valuesArray = ItemFactory.getInstance().createArrayItem(values); + Item valuesArray = ItemFactory.getInstance().createArrayItem(values, false); valueList.add(valuesArray); } else if (values.size() == 1) { Item value = values.get(0); @@ -115,7 +124,10 @@ public ObjectItem(Map> keyValuePairs) { this.keys = keyList; this.values = valueList; - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } @Override @@ -173,6 +185,10 @@ public boolean isObject() { public void write(Kryo kryo, Output output) { kryo.writeObject(output, this.keys); kryo.writeObject(output, this.values); + output.writeInt(this.mutabilityLevel); + output.writeLong(this.topLevelID); + kryo.writeObject(output, this.pathIn); + kryo.writeObject(output, this.location); } @SuppressWarnings("unchecked") @@ -180,6 +196,10 @@ public void write(Kryo kryo, Output output) { public void read(Kryo kryo, Input input) { this.keys = kryo.readObject(input, ArrayList.class); this.values = kryo.readObject(input, ArrayList.class); + this.mutabilityLevel = input.readInt(); + this.topLevelID = input.readLong(); + this.pathIn = kryo.readObject(input, String.class); + this.location = kryo.readObject(input, String.class); } public int hashCode() { @@ -209,8 +229,119 @@ public int getMutabilityLevel() { @Override public void setMutabilityLevel(int mutabilityLevel) { this.mutabilityLevel = mutabilityLevel; - for (Item item : values) { + for (Item item : this.values) { item.setMutabilityLevel(mutabilityLevel); } } + + @Override + public long getTopLevelID() { + return this.topLevelID; + } + + @Override + public void setTopLevelID(long topLevelID) { + this.topLevelID = topLevelID; + for (Item item : this.values) { + item.setTopLevelID(topLevelID); + } + } + + @Override + public String getPathIn() { + return this.pathIn; + } + + @Override + public void setPathIn(String pathIn) { + this.pathIn = pathIn; + for (int i = 0; i < this.keys.size(); i++) { + String key = this.keys.get(i); + Item item = this.values.get(i); + item.setPathIn(pathIn + "." + key); + } + } + + @Override + public String getTableLocation() { + return this.location; + } + + @Override + public void setTableLocation(String location) { + this.location = location; + for (Item item : this.values) { + item.setTableLocation(location); + } + } + + @Override + public String getSparkSQLValue() { + StringBuilder sb = new StringBuilder(); + sb.append("named_struct("); + for (int i = 0; i < this.keys.size(); i++) { + sb.append("\""); + sb.append(this.keys.get(i)); + sb.append("\""); + sb.append(", "); + sb.append(this.values.get(i).getSparkSQLValue()); + if (i + 1 < this.keys.size()) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + StringBuilder sb = new StringBuilder(); + + Map content = itemType.getObjectContentFacet(); + String[] keys = content.keySet().toArray(new String[0]); + + sb.append("named_struct("); + + for (int i = 0; i < keys.length; i++) { + String key = keys[i]; + FieldDescriptor field = content.get(key); + int keyIndex = this.keys.indexOf(key); + + sb.append("\""); + sb.append(key); + sb.append("\""); + sb.append(", "); + + if (keyIndex == -1) { + if (!field.isRequired()) { + sb.append("NULL"); + } + } else { + sb.append(this.values.get(keyIndex).getSparkSQLValue(field.getType())); + } + + if (i + 1 < keys.length) { + sb.append(", "); + } + } + + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLType() { + StringBuilder sb = new StringBuilder(); + sb.append("STRUCT<"); + for (int i = 0; i < this.keys.size(); i++) { + sb.append(this.keys.get(i)); + sb.append(": "); + sb.append(this.values.get(i).getSparkSQLType()); + if (i + 1 < this.keys.size()) { + sb.append(", "); + } + } + sb.append(">"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/items/StringItem.java b/src/main/java/org/rumbledb/items/StringItem.java index 130a929bc0..fc19ea73c5 100644 --- a/src/main/java/org/rumbledb/items/StringItem.java +++ b/src/main/java/org/rumbledb/items/StringItem.java @@ -154,4 +154,19 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return "\"" + this.value + "\""; + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return "\"" + this.value + "\""; + } + + @Override + public String getSparkSQLType() { + return "STRING"; + } } diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java index 0229a79551..434e9a43b4 100644 --- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java +++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java @@ -116,7 +116,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada values.add(getItemFromObject(object, metadata)); } object.endArray(); - return ItemFactory.getInstance().createArrayItem(values); + return ItemFactory.getInstance().createArrayItem(values, false); } if (object.peek() == JsonToken.BEGIN_OBJECT) { List keys = new ArrayList<>(); @@ -128,7 +128,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada } object.endObject(); return ItemFactory.getInstance() - .createObjectItem(keys, values, metadata); + .createObjectItem(keys, values, metadata, false); } if (object.peek() == JsonToken.NULL) { object.nextNull(); @@ -203,7 +203,7 @@ public static Item getItemFromYAML( // System.err.println("Next token (reading array): " + nt.toString()); } // System.err.println("Finished reading array."); - return ItemFactory.getInstance().createArrayItem(values); + return ItemFactory.getInstance().createArrayItem(values, false); } if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.START_OBJECT)) { List keys = new ArrayList<>(); @@ -223,7 +223,7 @@ public static Item getItemFromYAML( } // System.err.println("Finished reading object."); return ItemFactory.getInstance() - .createObjectItem(keys, values, metadata); + .createObjectItem(keys, values, metadata, false); } if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.VALUE_NULL)) { return ItemFactory.getInstance().createNullItem(); @@ -261,6 +261,41 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType return convertValueToItem(row, 0, null, fields[0].dataType(), metadata, itemType); } + if ( + fields.length == 5 + && fieldnames[0].equals(SparkSessionManager.atomicJSONiqItemColumnName) + && fieldnames[4].equals("tableLocation") + ) { + ItemType resType = null; + if (itemType != null) { + resType = itemType.getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + } + Item res = convertValueToItem(row, 0, null, fields[0].dataType(), metadata, resType); + // TODO: refactor to not need to loop and check strings -- Indexes perhaps? + for (int i = 0; i < fields.length; ++i) { + String fieldName = fields[i].name(); + + if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) { + res.setMutabilityLevel(row.getInt(i)); + continue; + } + if (fieldName.equals(SparkSessionManager.rowIdColumnName)) { + res.setTopLevelID(row.getLong(i)); + continue; + } + if (fieldName.equals(SparkSessionManager.pathInColumnName)) { + res.setPathIn(row.getString(i)); + continue; + } + if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) { + res.setTableLocation(row.getString(i)); + } + } + return res; + } + Map content = null; if (itemType != null && !itemType.equals(BuiltinTypesCatalogue.item)) { @@ -272,11 +307,34 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType } } + int mutabilityLevel = -1; + long topLevelID = -1; + String pathIn = "null"; + String tableLocation = "null"; + for (int i = 0; i < fields.length; ++i) { StructField field = fields[i]; DataType fieldType = field.dataType(); String fieldName = field.name(); ItemType fieldItemType = null; + + if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) { + mutabilityLevel = row.getInt(i); + continue; + } + if (fieldName.equals(SparkSessionManager.rowIdColumnName)) { + topLevelID = row.getLong(i); + continue; + } + if (fieldName.equals(SparkSessionManager.pathInColumnName)) { + pathIn = row.getString(i); + continue; + } + if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) { + tableLocation = row.getString(i); + continue; + } + if (content != null) { FieldDescriptor descriptor = content.get(fieldName); if (descriptor != null) { @@ -304,7 +362,13 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType } } - return ItemFactory.getInstance().createObjectItem(keys, values, metadata); + Item res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false); + res.setMutabilityLevel(mutabilityLevel); + res.setTopLevelID(topLevelID); + res.setPathIn(pathIn); + res.setTableLocation(tableLocation); + + return res; } public static Item convertValueToItem( @@ -531,7 +595,7 @@ private static Item convertValueToItem( members.add(convertValueToItem(value, dataType, metadata, memberType)); } } - Item item = ItemFactory.getInstance().createArrayItem(members); + Item item = ItemFactory.getInstance().createArrayItem(members, false); if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) { return item; } else { @@ -551,7 +615,7 @@ private static Item convertValueToItem( for (double value : denseVector.values()) { members.add(ItemFactory.getInstance().createDoubleItem(value)); } - Item item = ItemFactory.getInstance().createArrayItem(members); + Item item = ItemFactory.getInstance().createArrayItem(members, false); if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) { return item; } else { @@ -568,7 +632,7 @@ private static Item convertValueToItem( objectKeyList.add(String.valueOf(vectorIndices[j])); objectValueList.add(ItemFactory.getInstance().createDoubleItem(vectorValues[j])); } - Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata); + Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata, false); if (itemType == null || itemType.equals(BuiltinTypesCatalogue.objectItem)) { return item; } else { diff --git a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java index 3eebf78e81..24ba7000fa 100644 --- a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java +++ b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java @@ -44,7 +44,6 @@ public RowToItemMapper(ExceptionMetadata metadata) { @Override public Item call(Row row) throws Exception { - Item result = ItemParser.getItemFromRow(row, this.metadata, this.itemType); - return result; + return ItemParser.getItemFromRow(row, this.metadata, this.itemType); } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 34dedea4e8..ea2026fca4 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -76,7 +76,7 @@ typeSwitchStatement : Ktypeswitch '(' cond=expr ')' cases+=caseStatement caseStatement : Kcase (var_ref=varRef Kas)? union+=sequenceType ('|' union+=sequenceType)* Kreturn ret=statement ; -annotation : '%' name=qname ('(' Literal (',' Literal)* ')')? ; +annotation : ('%' name=qname ('(' Literal (',' Literal)* ')')? | updating=Kupdating); annotations : annotation* ; @@ -133,7 +133,7 @@ contextItemDecl : Kdeclare Kcontext Kitem (Kas sequenceType)? ((':=' exp functionDecl : Kdeclare annotations 'function' fn_name=qname '(' paramList? ')' (Kas return_type=sequenceType)? - ('{' (fn_body=statementsAndOptionalExpr) '}' | 'external'); + ('{' (fn_body=statementsAndOptionalExpr) '}' | is_external='external'); typeDecl : Kdeclare Ktype type_name=qname 'as' (schema=schemaLanguage)? type_definition=exprSingle; @@ -430,7 +430,6 @@ keyWords : Kjsoniq | Kappend | Kcopy | Kmodify - | Kjson | Kinto | Kvalue | Kwith @@ -443,6 +442,8 @@ keyWords : Kjsoniq | Kexit | Kreturning | Kwhile + | Kjson + | Kupdating ; ///////////////////////// literals @@ -573,12 +574,14 @@ Kinto : 'into'; Kvalue : 'value'; -Kjson : 'json'; - Kwith : 'with'; Kposition : 'position'; +Kjson : 'json'; + +Kupdating : 'updating'; + ///////////////////////// Scripting keywords Kbreak : 'break' ; Kloop : 'loop' ; diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index 7f0f9de695..8686acf70e 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -123,9 +123,10 @@ null 'append' 'into' 'value' -'json' 'with' 'position' +'json' +'updating' 'break' 'loop' 'continue' @@ -270,9 +271,10 @@ Kmodify Kappend Kinto Kvalue -Kjson Kwith Kposition +Kjson +Kupdating Kbreak Kloop Kcontinue @@ -423,4 +425,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 146, 1346, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 265, 10, 3, 3, 3, 3, 3, 5, 3, 269, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 285, 10, 6, 3, 6, 3, 6, 7, 6, 289, 10, 6, 12, 6, 14, 6, 292, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 297, 10, 6, 12, 6, 14, 6, 300, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 305, 10, 8, 12, 8, 14, 8, 308, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 315, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 330, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 360, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 368, 10, 18, 12, 18, 14, 18, 371, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 390, 10, 20, 13, 20, 14, 20, 391, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 400, 10, 21, 13, 21, 14, 21, 401, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 410, 10, 22, 13, 22, 14, 22, 411, 3, 23, 3, 23, 3, 23, 5, 23, 417, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 422, 10, 23, 7, 23, 424, 10, 23, 12, 23, 14, 23, 427, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 436, 10, 24, 13, 24, 14, 24, 437, 3, 24, 3, 24, 5, 24, 442, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 451, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 456, 10, 25, 12, 25, 14, 25, 459, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 470, 10, 26, 12, 26, 14, 26, 473, 11, 26, 3, 26, 5, 26, 476, 10, 26, 3, 27, 7, 27, 479, 10, 27, 12, 27, 14, 27, 482, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 489, 10, 28, 12, 28, 14, 28, 492, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 499, 10, 29, 3, 29, 3, 29, 5, 29, 503, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 515, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 527, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 549, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 555, 10, 37, 12, 37, 14, 37, 558, 11, 37, 3, 38, 3, 38, 5, 38, 562, 10, 38, 3, 38, 5, 38, 565, 10, 38, 3, 38, 3, 38, 5, 38, 569, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 578, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 585, 10, 40, 12, 40, 14, 40, 588, 11, 40, 5, 40, 590, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 598, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 605, 10, 41, 5, 41, 607, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 614, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 621, 10, 42, 5, 42, 623, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 631, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 636, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 643, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 650, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 660, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 665, 10, 46, 12, 46, 14, 46, 668, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 674, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 679, 10, 48, 12, 48, 14, 48, 682, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 690, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 700, 10, 50, 3, 51, 3, 51, 5, 51, 704, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 712, 10, 51, 12, 51, 14, 51, 715, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 724, 10, 52, 12, 52, 14, 52, 727, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 732, 10, 53, 3, 53, 3, 53, 5, 53, 736, 10, 53, 3, 53, 3, 53, 5, 53, 740, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 749, 10, 54, 12, 54, 14, 54, 752, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 757, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 770, 10, 57, 12, 57, 14, 57, 773, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 778, 10, 58, 3, 58, 3, 58, 5, 58, 782, 10, 58, 3, 58, 3, 58, 5, 58, 786, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 793, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 798, 10, 59, 12, 59, 14, 59, 801, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 806, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 811, 10, 60, 5, 60, 813, 10, 60, 3, 60, 3, 60, 5, 60, 817, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 824, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 829, 10, 62, 12, 62, 14, 62, 832, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 840, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 850, 10, 64, 13, 64, 14, 64, 851, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 860, 10, 65, 13, 65, 14, 65, 861, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 872, 10, 66, 13, 66, 14, 66, 873, 3, 66, 3, 66, 5, 66, 878, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 887, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 892, 10, 67, 12, 67, 14, 67, 895, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 914, 10, 69, 13, 69, 14, 69, 915, 3, 70, 3, 70, 3, 70, 5, 70, 921, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 926, 10, 70, 7, 70, 928, 10, 70, 12, 70, 14, 70, 931, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 940, 10, 71, 12, 71, 14, 71, 943, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 948, 10, 72, 12, 72, 14, 72, 951, 11, 72, 3, 73, 5, 73, 954, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 961, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 966, 10, 75, 12, 75, 14, 75, 969, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 974, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 979, 10, 77, 12, 77, 14, 77, 982, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 987, 10, 78, 12, 78, 14, 78, 990, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 996, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1002, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1008, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1014, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1020, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1029, 10, 84, 12, 84, 14, 84, 1032, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1037, 10, 85, 3, 86, 7, 86, 1040, 10, 86, 12, 86, 14, 86, 1043, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1050, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1069, 10, 90, 12, 90, 14, 90, 1072, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1080, 10, 91, 12, 91, 14, 91, 1083, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1105, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1122, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1133, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1155, 10, 104, 7, 104, 1157, 10, 104, 12, 104, 14, 104, 1160, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1166, 10, 105, 3, 106, 3, 106, 5, 106, 1170, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1180, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1185, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1199, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1206, 10, 109, 12, 109, 14, 109, 1209, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1214, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1238, 10, 113, 12, 113, 14, 113, 1241, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1257, 10, 115, 13, 115, 14, 115, 1258, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1271, 10, 117, 5, 117, 1273, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 7, 118, 1279, 10, 118, 12, 118, 14, 118, 1282, 11, 118, 5, 118, 1284, 10, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1291, 10, 118, 3, 119, 3, 119, 3, 119, 5, 119, 1296, 10, 119, 3, 120, 3, 120, 5, 120, 1300, 10, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1312, 10, 122, 12, 122, 14, 122, 1315, 11, 122, 5, 122, 1317, 10, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 5, 123, 1325, 10, 123, 3, 124, 3, 124, 5, 124, 1329, 10, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1336, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 2, 2, 129, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 2, 10, 4, 2, 18, 18, 107, 107, 3, 2, 84, 85, 3, 2, 21, 30, 4, 2, 6, 6, 38, 48, 3, 2, 50, 51, 4, 2, 13, 13, 52, 54, 4, 2, 20, 20, 136, 136, 4, 2, 63, 134, 137, 137, 2, 1411, 2, 256, 3, 2, 2, 2, 4, 264, 3, 2, 2, 2, 6, 270, 3, 2, 2, 2, 8, 273, 3, 2, 2, 2, 10, 290, 3, 2, 2, 2, 12, 301, 3, 2, 2, 2, 14, 306, 3, 2, 2, 2, 16, 309, 3, 2, 2, 2, 18, 312, 3, 2, 2, 2, 20, 329, 3, 2, 2, 2, 22, 331, 3, 2, 2, 2, 24, 334, 3, 2, 2, 2, 26, 340, 3, 2, 2, 2, 28, 344, 3, 2, 2, 2, 30, 348, 3, 2, 2, 2, 32, 352, 3, 2, 2, 2, 34, 359, 3, 2, 2, 2, 36, 375, 3, 2, 2, 2, 38, 384, 3, 2, 2, 2, 40, 399, 3, 2, 2, 2, 42, 406, 3, 2, 2, 2, 44, 413, 3, 2, 2, 2, 46, 430, 3, 2, 2, 2, 48, 446, 3, 2, 2, 2, 50, 463, 3, 2, 2, 2, 52, 480, 3, 2, 2, 2, 54, 483, 3, 2, 2, 2, 56, 495, 3, 2, 2, 2, 58, 504, 3, 2, 2, 2, 60, 514, 3, 2, 2, 2, 62, 516, 3, 2, 2, 2, 64, 526, 3, 2, 2, 2, 66, 528, 3, 2, 2, 2, 68, 533, 3, 2, 2, 2, 70, 537, 3, 2, 2, 2, 72, 543, 3, 2, 2, 2, 74, 564, 3, 2, 2, 2, 76, 570, 3, 2, 2, 2, 78, 572, 3, 2, 2, 2, 80, 591, 3, 2, 2, 2, 82, 608, 3, 2, 2, 2, 84, 624, 3, 2, 2, 2, 86, 644, 3, 2, 2, 2, 88, 659, 3, 2, 2, 2, 90, 661, 3, 2, 2, 2, 92, 669, 3, 2, 2, 2, 94, 675, 3, 2, 2, 2, 96, 689, 3, 2, 2, 2, 98, 699, 3, 2, 2, 2, 100, 703, 3, 2, 2, 2, 102, 719, 3, 2, 2, 2, 104, 728, 3, 2, 2, 2, 106, 744, 3, 2, 2, 2, 108, 753, 3, 2, 2, 2, 110, 761, 3, 2, 2, 2, 112, 764, 3, 2, 2, 2, 114, 774, 3, 2, 2, 2, 116, 792, 3, 2, 2, 2, 118, 802, 3, 2, 2, 2, 120, 818, 3, 2, 2, 2, 122, 823, 3, 2, 2, 2, 124, 836, 3, 2, 2, 2, 126, 844, 3, 2, 2, 2, 128, 859, 3, 2, 2, 2, 130, 866, 3, 2, 2, 2, 132, 882, 3, 2, 2, 2, 134, 899, 3, 2, 2, 2, 136, 908, 3, 2, 2, 2, 138, 917, 3, 2, 2, 2, 140, 936, 3, 2, 2, 2, 142, 944, 3, 2, 2, 2, 144, 953, 3, 2, 2, 2, 146, 957, 3, 2, 2, 2, 148, 962, 3, 2, 2, 2, 150, 970, 3, 2, 2, 2, 152, 975, 3, 2, 2, 2, 154, 983, 3, 2, 2, 2, 156, 991, 3, 2, 2, 2, 158, 997, 3, 2, 2, 2, 160, 1003, 3, 2, 2, 2, 162, 1009, 3, 2, 2, 2, 164, 1015, 3, 2, 2, 2, 166, 1021, 3, 2, 2, 2, 168, 1036, 3, 2, 2, 2, 170, 1041, 3, 2, 2, 2, 172, 1049, 3, 2, 2, 2, 174, 1051, 3, 2, 2, 2, 176, 1058, 3, 2, 2, 2, 178, 1065, 3, 2, 2, 2, 180, 1073, 3, 2, 2, 2, 182, 1084, 3, 2, 2, 2, 184, 1090, 3, 2, 2, 2, 186, 1093, 3, 2, 2, 2, 188, 1097, 3, 2, 2, 2, 190, 1121, 3, 2, 2, 2, 192, 1123, 3, 2, 2, 2, 194, 1127, 3, 2, 2, 2, 196, 1130, 3, 2, 2, 2, 198, 1136, 3, 2, 2, 2, 200, 1138, 3, 2, 2, 2, 202, 1143, 3, 2, 2, 2, 204, 1148, 3, 2, 2, 2, 206, 1151, 3, 2, 2, 2, 208, 1165, 3, 2, 2, 2, 210, 1169, 3, 2, 2, 2, 212, 1171, 3, 2, 2, 2, 214, 1175, 3, 2, 2, 2, 216, 1213, 3, 2, 2, 2, 218, 1215, 3, 2, 2, 2, 220, 1219, 3, 2, 2, 2, 222, 1225, 3, 2, 2, 2, 224, 1233, 3, 2, 2, 2, 226, 1247, 3, 2, 2, 2, 228, 1253, 3, 2, 2, 2, 230, 1260, 3, 2, 2, 2, 232, 1272, 3, 2, 2, 2, 234, 1290, 3, 2, 2, 2, 236, 1295, 3, 2, 2, 2, 238, 1299, 3, 2, 2, 2, 240, 1301, 3, 2, 2, 2, 242, 1306, 3, 2, 2, 2, 244, 1322, 3, 2, 2, 2, 246, 1328, 3, 2, 2, 2, 248, 1333, 3, 2, 2, 2, 250, 1339, 3, 2, 2, 2, 252, 1341, 3, 2, 2, 2, 254, 1343, 3, 2, 2, 2, 256, 257, 5, 4, 3, 2, 257, 258, 7, 2, 2, 3, 258, 3, 3, 2, 2, 2, 259, 260, 7, 106, 2, 2, 260, 261, 7, 105, 2, 2, 261, 262, 5, 252, 127, 2, 262, 263, 7, 3, 2, 2, 263, 265, 3, 2, 2, 2, 264, 259, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 269, 5, 8, 5, 2, 267, 269, 5, 6, 4, 2, 268, 266, 3, 2, 2, 2, 268, 267, 3, 2, 2, 2, 269, 5, 3, 2, 2, 2, 270, 271, 5, 10, 6, 2, 271, 272, 5, 12, 7, 2, 272, 7, 3, 2, 2, 2, 273, 274, 7, 4, 2, 2, 274, 275, 7, 5, 2, 2, 275, 276, 7, 144, 2, 2, 276, 277, 7, 6, 2, 2, 277, 278, 5, 250, 126, 2, 278, 279, 7, 3, 2, 2, 279, 280, 5, 10, 6, 2, 280, 9, 3, 2, 2, 2, 281, 285, 5, 60, 31, 2, 282, 285, 5, 62, 32, 2, 283, 285, 5, 78, 40, 2, 284, 281, 3, 2, 2, 2, 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 287, 7, 3, 2, 2, 287, 289, 3, 2, 2, 2, 288, 284, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 288, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 298, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 293, 294, 5, 64, 33, 2, 294, 295, 7, 3, 2, 2, 295, 297, 3, 2, 2, 2, 296, 293, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 11, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 302, 5, 18, 10, 2, 302, 13, 3, 2, 2, 2, 303, 305, 5, 20, 11, 2, 304, 303, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 15, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 5, 14, 8, 2, 310, 311, 5, 94, 48, 2, 311, 17, 3, 2, 2, 2, 312, 314, 5, 14, 8, 2, 313, 315, 5, 94, 48, 2, 314, 313, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 19, 3, 2, 2, 2, 316, 330, 5, 22, 12, 2, 317, 330, 5, 24, 13, 2, 318, 330, 5, 26, 14, 2, 319, 330, 5, 28, 15, 2, 320, 330, 5, 30, 16, 2, 321, 330, 5, 32, 17, 2, 322, 330, 5, 34, 18, 2, 323, 330, 5, 36, 19, 2, 324, 330, 5, 38, 20, 2, 325, 330, 5, 42, 22, 2, 326, 330, 5, 46, 24, 2, 327, 330, 5, 54, 28, 2, 328, 330, 5, 58, 30, 2, 329, 316, 3, 2, 2, 2, 329, 317, 3, 2, 2, 2, 329, 318, 3, 2, 2, 2, 329, 319, 3, 2, 2, 2, 329, 320, 3, 2, 2, 2, 329, 321, 3, 2, 2, 2, 329, 322, 3, 2, 2, 2, 329, 323, 3, 2, 2, 2, 329, 324, 3, 2, 2, 2, 329, 325, 3, 2, 2, 2, 329, 326, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 328, 3, 2, 2, 2, 330, 21, 3, 2, 2, 2, 331, 332, 5, 98, 50, 2, 332, 333, 7, 3, 2, 2, 333, 23, 3, 2, 2, 2, 334, 335, 7, 7, 2, 2, 335, 336, 5, 74, 38, 2, 336, 337, 7, 8, 2, 2, 337, 338, 5, 96, 49, 2, 338, 339, 7, 3, 2, 2, 339, 25, 3, 2, 2, 2, 340, 341, 7, 9, 2, 2, 341, 342, 5, 14, 8, 2, 342, 343, 7, 10, 2, 2, 343, 27, 3, 2, 2, 2, 344, 345, 7, 129, 2, 2, 345, 346, 7, 130, 2, 2, 346, 347, 7, 3, 2, 2, 347, 29, 3, 2, 2, 2, 348, 349, 7, 131, 2, 2, 349, 350, 7, 130, 2, 2, 350, 351, 7, 3, 2, 2, 351, 31, 3, 2, 2, 2, 352, 353, 7, 132, 2, 2, 353, 354, 7, 133, 2, 2, 354, 355, 5, 96, 49, 2, 355, 356, 7, 3, 2, 2, 356, 33, 3, 2, 2, 2, 357, 360, 5, 102, 52, 2, 358, 360, 5, 106, 54, 2, 359, 357, 3, 2, 2, 2, 359, 358, 3, 2, 2, 2, 360, 369, 3, 2, 2, 2, 361, 368, 5, 102, 52, 2, 362, 368, 5, 106, 54, 2, 363, 368, 5, 110, 56, 2, 364, 368, 5, 112, 57, 2, 365, 368, 5, 116, 59, 2, 366, 368, 5, 120, 61, 2, 367, 361, 3, 2, 2, 2, 367, 362, 3, 2, 2, 2, 367, 363, 3, 2, 2, 2, 367, 364, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 366, 3, 2, 2, 2, 368, 371, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 372, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 372, 373, 7, 69, 2, 2, 373, 374, 5, 20, 11, 2, 374, 35, 3, 2, 2, 2, 375, 376, 7, 70, 2, 2, 376, 377, 7, 11, 2, 2, 377, 378, 5, 94, 48, 2, 378, 379, 7, 12, 2, 2, 379, 380, 7, 91, 2, 2, 380, 381, 5, 20, 11, 2, 381, 382, 7, 92, 2, 2, 382, 383, 5, 20, 11, 2, 383, 37, 3, 2, 2, 2, 384, 385, 7, 86, 2, 2, 385, 386, 7, 11, 2, 2, 386, 387, 5, 94, 48, 2, 387, 389, 7, 12, 2, 2, 388, 390, 5, 40, 21, 2, 389, 388, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 7, 90, 2, 2, 394, 395, 7, 69, 2, 2, 395, 396, 5, 20, 11, 2, 396, 39, 3, 2, 2, 2, 397, 398, 7, 87, 2, 2, 398, 400, 5, 96, 49, 2, 399, 397, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 7, 69, 2, 2, 404, 405, 5, 20, 11, 2, 405, 41, 3, 2, 2, 2, 406, 407, 7, 88, 2, 2, 407, 409, 5, 26, 14, 2, 408, 410, 5, 44, 23, 2, 409, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 409, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 43, 3, 2, 2, 2, 413, 416, 7, 89, 2, 2, 414, 417, 7, 13, 2, 2, 415, 417, 5, 74, 38, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 425, 3, 2, 2, 2, 418, 421, 7, 14, 2, 2, 419, 422, 7, 13, 2, 2, 420, 422, 5, 74, 38, 2, 421, 419, 3, 2, 2, 2, 421, 420, 3, 2, 2, 2, 422, 424, 3, 2, 2, 2, 423, 418, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 5, 26, 14, 2, 429, 45, 3, 2, 2, 2, 430, 431, 7, 93, 2, 2, 431, 432, 7, 11, 2, 2, 432, 433, 5, 94, 48, 2, 433, 435, 7, 12, 2, 2, 434, 436, 5, 48, 25, 2, 435, 434, 3, 2, 2, 2, 436, 437, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 441, 7, 90, 2, 2, 440, 442, 5, 194, 98, 2, 441, 440, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 7, 69, 2, 2, 444, 445, 5, 20, 11, 2, 445, 47, 3, 2, 2, 2, 446, 450, 7, 87, 2, 2, 447, 448, 5, 194, 98, 2, 448, 449, 7, 72, 2, 2, 449, 451, 3, 2, 2, 2, 450, 447, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 457, 5, 232, 117, 2, 453, 454, 7, 14, 2, 2, 454, 456, 5, 232, 117, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 460, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 461, 7, 69, 2, 2, 461, 462, 5, 20, 11, 2, 462, 49, 3, 2, 2, 2, 463, 464, 7, 15, 2, 2, 464, 475, 5, 74, 38, 2, 465, 466, 7, 11, 2, 2, 466, 471, 7, 138, 2, 2, 467, 468, 7, 16, 2, 2, 468, 470, 7, 138, 2, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 12, 2, 2, 475, 465, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 51, 3, 2, 2, 2, 477, 479, 5, 50, 26, 2, 478, 477, 3, 2, 2, 2, 479, 482, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 53, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 483, 484, 5, 52, 27, 2, 484, 485, 7, 116, 2, 2, 485, 490, 5, 56, 29, 2, 486, 487, 7, 16, 2, 2, 487, 489, 5, 56, 29, 2, 488, 486, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 493, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 493, 494, 7, 3, 2, 2, 494, 55, 3, 2, 2, 2, 495, 498, 5, 194, 98, 2, 496, 497, 7, 72, 2, 2, 497, 499, 5, 232, 117, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 501, 7, 8, 2, 2, 501, 503, 5, 96, 49, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 57, 3, 2, 2, 2, 504, 505, 7, 134, 2, 2, 505, 506, 7, 11, 2, 2, 506, 507, 5, 94, 48, 2, 507, 508, 7, 12, 2, 2, 508, 509, 5, 20, 11, 2, 509, 59, 3, 2, 2, 2, 510, 515, 5, 66, 34, 2, 511, 515, 5, 68, 35, 2, 512, 515, 5, 70, 36, 2, 513, 515, 5, 72, 37, 2, 514, 510, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 513, 3, 2, 2, 2, 515, 61, 3, 2, 2, 2, 516, 517, 7, 113, 2, 2, 517, 518, 7, 5, 2, 2, 518, 519, 7, 144, 2, 2, 519, 520, 7, 6, 2, 2, 520, 521, 5, 250, 126, 2, 521, 63, 3, 2, 2, 2, 522, 527, 5, 84, 43, 2, 523, 527, 5, 80, 41, 2, 524, 527, 5, 86, 44, 2, 525, 527, 5, 82, 42, 2, 526, 522, 3, 2, 2, 2, 526, 523, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 526, 525, 3, 2, 2, 2, 527, 65, 3, 2, 2, 2, 528, 529, 7, 113, 2, 2, 529, 530, 7, 90, 2, 2, 530, 531, 7, 83, 2, 2, 531, 532, 5, 250, 126, 2, 532, 67, 3, 2, 2, 2, 533, 534, 7, 113, 2, 2, 534, 535, 7, 17, 2, 2, 535, 536, 9, 2, 2, 2, 536, 69, 3, 2, 2, 2, 537, 538, 7, 113, 2, 2, 538, 539, 7, 90, 2, 2, 539, 540, 7, 68, 2, 2, 540, 541, 7, 75, 2, 2, 541, 542, 9, 3, 2, 2, 542, 71, 3, 2, 2, 2, 543, 548, 7, 113, 2, 2, 544, 545, 7, 19, 2, 2, 545, 549, 5, 74, 38, 2, 546, 547, 7, 90, 2, 2, 547, 549, 7, 19, 2, 2, 548, 544, 3, 2, 2, 2, 548, 546, 3, 2, 2, 2, 549, 556, 3, 2, 2, 2, 550, 551, 5, 76, 39, 2, 551, 552, 7, 6, 2, 2, 552, 553, 5, 252, 127, 2, 553, 555, 3, 2, 2, 2, 554, 550, 3, 2, 2, 2, 555, 558, 3, 2, 2, 2, 556, 554, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 73, 3, 2, 2, 2, 558, 556, 3, 2, 2, 2, 559, 562, 7, 144, 2, 2, 560, 562, 5, 254, 128, 2, 561, 559, 3, 2, 2, 2, 561, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 7, 20, 2, 2, 564, 561, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 569, 7, 144, 2, 2, 567, 569, 5, 254, 128, 2, 568, 566, 3, 2, 2, 2, 568, 567, 3, 2, 2, 2, 569, 75, 3, 2, 2, 2, 570, 571, 9, 4, 2, 2, 571, 77, 3, 2, 2, 2, 572, 573, 7, 31, 2, 2, 573, 577, 7, 4, 2, 2, 574, 575, 7, 5, 2, 2, 575, 576, 7, 144, 2, 2, 576, 578, 7, 6, 2, 2, 577, 574, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 589, 5, 250, 126, 2, 580, 581, 7, 73, 2, 2, 581, 586, 5, 250, 126, 2, 582, 583, 7, 16, 2, 2, 583, 585, 5, 250, 126, 2, 584, 582, 3, 2, 2, 2, 585, 588, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 590, 3, 2, 2, 2, 588, 586, 3, 2, 2, 2, 589, 580, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 79, 3, 2, 2, 2, 591, 592, 7, 113, 2, 2, 592, 593, 5, 52, 27, 2, 593, 594, 7, 116, 2, 2, 594, 597, 5, 194, 98, 2, 595, 596, 7, 72, 2, 2, 596, 598, 5, 232, 117, 2, 597, 595, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 606, 3, 2, 2, 2, 599, 600, 7, 8, 2, 2, 600, 607, 5, 96, 49, 2, 601, 604, 7, 32, 2, 2, 602, 603, 7, 8, 2, 2, 603, 605, 5, 96, 49, 2, 604, 602, 3, 2, 2, 2, 604, 605, 3, 2, 2, 2, 605, 607, 3, 2, 2, 2, 606, 599, 3, 2, 2, 2, 606, 601, 3, 2, 2, 2, 607, 81, 3, 2, 2, 2, 608, 609, 7, 113, 2, 2, 609, 610, 7, 114, 2, 2, 610, 613, 7, 115, 2, 2, 611, 612, 7, 72, 2, 2, 612, 614, 5, 232, 117, 2, 613, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 622, 3, 2, 2, 2, 615, 616, 7, 8, 2, 2, 616, 623, 5, 96, 49, 2, 617, 620, 7, 32, 2, 2, 618, 619, 7, 8, 2, 2, 619, 621, 5, 96, 49, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 623, 3, 2, 2, 2, 622, 615, 3, 2, 2, 2, 622, 617, 3, 2, 2, 2, 623, 83, 3, 2, 2, 2, 624, 625, 7, 113, 2, 2, 625, 626, 5, 52, 27, 2, 626, 627, 7, 33, 2, 2, 627, 628, 5, 74, 38, 2, 628, 630, 7, 11, 2, 2, 629, 631, 5, 90, 46, 2, 630, 629, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 635, 7, 12, 2, 2, 633, 634, 7, 72, 2, 2, 634, 636, 5, 232, 117, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 642, 3, 2, 2, 2, 637, 638, 7, 9, 2, 2, 638, 639, 5, 18, 10, 2, 639, 640, 7, 10, 2, 2, 640, 643, 3, 2, 2, 2, 641, 643, 7, 32, 2, 2, 642, 637, 3, 2, 2, 2, 642, 641, 3, 2, 2, 2, 643, 85, 3, 2, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 7, 110, 2, 2, 646, 647, 5, 74, 38, 2, 647, 649, 7, 72, 2, 2, 648, 650, 5, 88, 45, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 652, 5, 96, 49, 2, 652, 87, 3, 2, 2, 2, 653, 654, 7, 34, 2, 2, 654, 660, 7, 35, 2, 2, 655, 656, 7, 34, 2, 2, 656, 660, 7, 36, 2, 2, 657, 658, 7, 126, 2, 2, 658, 660, 7, 37, 2, 2, 659, 653, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 660, 89, 3, 2, 2, 2, 661, 666, 5, 92, 47, 2, 662, 663, 7, 16, 2, 2, 663, 665, 5, 92, 47, 2, 664, 662, 3, 2, 2, 2, 665, 668, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 91, 3, 2, 2, 2, 668, 666, 3, 2, 2, 2, 669, 670, 7, 7, 2, 2, 670, 673, 5, 74, 38, 2, 671, 672, 7, 72, 2, 2, 672, 674, 5, 232, 117, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 93, 3, 2, 2, 2, 675, 680, 5, 96, 49, 2, 676, 677, 7, 16, 2, 2, 677, 679, 5, 96, 49, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 95, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 690, 5, 98, 50, 2, 684, 690, 5, 100, 51, 2, 685, 690, 5, 126, 64, 2, 686, 690, 5, 130, 66, 2, 687, 690, 5, 134, 68, 2, 688, 690, 5, 136, 69, 2, 689, 683, 3, 2, 2, 2, 689, 684, 3, 2, 2, 2, 689, 685, 3, 2, 2, 2, 689, 686, 3, 2, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 97, 3, 2, 2, 2, 691, 700, 5, 122, 62, 2, 692, 700, 5, 140, 71, 2, 693, 700, 5, 216, 109, 2, 694, 700, 5, 218, 110, 2, 695, 700, 5, 220, 111, 2, 696, 700, 5, 222, 112, 2, 697, 700, 5, 224, 113, 2, 698, 700, 5, 226, 114, 2, 699, 691, 3, 2, 2, 2, 699, 692, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 694, 3, 2, 2, 2, 699, 695, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 697, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 99, 3, 2, 2, 2, 701, 704, 5, 102, 52, 2, 702, 704, 5, 106, 54, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 713, 3, 2, 2, 2, 705, 712, 5, 102, 52, 2, 706, 712, 5, 106, 54, 2, 707, 712, 5, 110, 56, 2, 708, 712, 5, 112, 57, 2, 709, 712, 5, 116, 59, 2, 710, 712, 5, 120, 61, 2, 711, 705, 3, 2, 2, 2, 711, 706, 3, 2, 2, 2, 711, 707, 3, 2, 2, 2, 711, 708, 3, 2, 2, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 715, 3, 2, 2, 2, 713, 711, 3, 2, 2, 2, 713, 714, 3, 2, 2, 2, 714, 716, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 716, 717, 7, 69, 2, 2, 717, 718, 5, 96, 49, 2, 718, 101, 3, 2, 2, 2, 719, 720, 7, 63, 2, 2, 720, 725, 5, 104, 53, 2, 721, 722, 7, 16, 2, 2, 722, 724, 5, 104, 53, 2, 723, 721, 3, 2, 2, 2, 724, 727, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 103, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 731, 5, 194, 98, 2, 729, 730, 7, 72, 2, 2, 730, 732, 5, 232, 117, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 735, 3, 2, 2, 2, 733, 734, 7, 74, 2, 2, 734, 736, 7, 75, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 3, 2, 2, 2, 737, 738, 7, 73, 2, 2, 738, 740, 5, 194, 98, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 71, 2, 2, 742, 743, 5, 96, 49, 2, 743, 105, 3, 2, 2, 2, 744, 745, 7, 64, 2, 2, 745, 750, 5, 108, 55, 2, 746, 747, 7, 16, 2, 2, 747, 749, 5, 108, 55, 2, 748, 746, 3, 2, 2, 2, 749, 752, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 750, 751, 3, 2, 2, 2, 751, 107, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 753, 756, 5, 194, 98, 2, 754, 755, 7, 72, 2, 2, 755, 757, 5, 232, 117, 2, 756, 754, 3, 2, 2, 2, 756, 757, 3, 2, 2, 2, 757, 758, 3, 2, 2, 2, 758, 759, 7, 8, 2, 2, 759, 760, 5, 96, 49, 2, 760, 109, 3, 2, 2, 2, 761, 762, 7, 65, 2, 2, 762, 763, 5, 96, 49, 2, 763, 111, 3, 2, 2, 2, 764, 765, 7, 66, 2, 2, 765, 766, 7, 67, 2, 2, 766, 771, 5, 114, 58, 2, 767, 768, 7, 16, 2, 2, 768, 770, 5, 114, 58, 2, 769, 767, 3, 2, 2, 2, 770, 773, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 772, 3, 2, 2, 2, 772, 113, 3, 2, 2, 2, 773, 771, 3, 2, 2, 2, 774, 781, 5, 194, 98, 2, 775, 776, 7, 72, 2, 2, 776, 778, 5, 232, 117, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 780, 7, 8, 2, 2, 780, 782, 5, 96, 49, 2, 781, 777, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 785, 3, 2, 2, 2, 783, 784, 7, 83, 2, 2, 784, 786, 5, 250, 126, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 115, 3, 2, 2, 2, 787, 788, 7, 68, 2, 2, 788, 793, 7, 67, 2, 2, 789, 790, 7, 77, 2, 2, 790, 791, 7, 68, 2, 2, 791, 793, 7, 67, 2, 2, 792, 787, 3, 2, 2, 2, 792, 789, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 799, 5, 118, 60, 2, 795, 796, 7, 16, 2, 2, 796, 798, 5, 118, 60, 2, 797, 795, 3, 2, 2, 2, 798, 801, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 117, 3, 2, 2, 2, 801, 799, 3, 2, 2, 2, 802, 805, 5, 96, 49, 2, 803, 806, 7, 78, 2, 2, 804, 806, 7, 79, 2, 2, 805, 803, 3, 2, 2, 2, 805, 804, 3, 2, 2, 2, 805, 806, 3, 2, 2, 2, 806, 812, 3, 2, 2, 2, 807, 810, 7, 75, 2, 2, 808, 811, 7, 84, 2, 2, 809, 811, 7, 85, 2, 2, 810, 808, 3, 2, 2, 2, 810, 809, 3, 2, 2, 2, 811, 813, 3, 2, 2, 2, 812, 807, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 816, 3, 2, 2, 2, 814, 815, 7, 83, 2, 2, 815, 817, 5, 250, 126, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 119, 3, 2, 2, 2, 818, 819, 7, 76, 2, 2, 819, 820, 5, 194, 98, 2, 820, 121, 3, 2, 2, 2, 821, 824, 7, 80, 2, 2, 822, 824, 7, 81, 2, 2, 823, 821, 3, 2, 2, 2, 823, 822, 3, 2, 2, 2, 824, 825, 3, 2, 2, 2, 825, 830, 5, 124, 63, 2, 826, 827, 7, 16, 2, 2, 827, 829, 5, 124, 63, 2, 828, 826, 3, 2, 2, 2, 829, 832, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 833, 3, 2, 2, 2, 832, 830, 3, 2, 2, 2, 833, 834, 7, 82, 2, 2, 834, 835, 5, 96, 49, 2, 835, 123, 3, 2, 2, 2, 836, 839, 5, 194, 98, 2, 837, 838, 7, 72, 2, 2, 838, 840, 5, 232, 117, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 843, 5, 96, 49, 2, 843, 125, 3, 2, 2, 2, 844, 845, 7, 86, 2, 2, 845, 846, 7, 11, 2, 2, 846, 847, 5, 94, 48, 2, 847, 849, 7, 12, 2, 2, 848, 850, 5, 128, 65, 2, 849, 848, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 849, 3, 2, 2, 2, 851, 852, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 854, 7, 90, 2, 2, 854, 855, 7, 69, 2, 2, 855, 856, 5, 96, 49, 2, 856, 127, 3, 2, 2, 2, 857, 858, 7, 87, 2, 2, 858, 860, 5, 96, 49, 2, 859, 857, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 3, 2, 2, 2, 863, 864, 7, 69, 2, 2, 864, 865, 5, 96, 49, 2, 865, 129, 3, 2, 2, 2, 866, 867, 7, 93, 2, 2, 867, 868, 7, 11, 2, 2, 868, 869, 5, 94, 48, 2, 869, 871, 7, 12, 2, 2, 870, 872, 5, 132, 67, 2, 871, 870, 3, 2, 2, 2, 872, 873, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 873, 874, 3, 2, 2, 2, 874, 875, 3, 2, 2, 2, 875, 877, 7, 90, 2, 2, 876, 878, 5, 194, 98, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 880, 7, 69, 2, 2, 880, 881, 5, 96, 49, 2, 881, 131, 3, 2, 2, 2, 882, 886, 7, 87, 2, 2, 883, 884, 5, 194, 98, 2, 884, 885, 7, 72, 2, 2, 885, 887, 3, 2, 2, 2, 886, 883, 3, 2, 2, 2, 886, 887, 3, 2, 2, 2, 887, 888, 3, 2, 2, 2, 888, 893, 5, 232, 117, 2, 889, 890, 7, 14, 2, 2, 890, 892, 5, 232, 117, 2, 891, 889, 3, 2, 2, 2, 892, 895, 3, 2, 2, 2, 893, 891, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 896, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 896, 897, 7, 69, 2, 2, 897, 898, 5, 96, 49, 2, 898, 133, 3, 2, 2, 2, 899, 900, 7, 70, 2, 2, 900, 901, 7, 11, 2, 2, 901, 902, 5, 94, 48, 2, 902, 903, 7, 12, 2, 2, 903, 904, 7, 91, 2, 2, 904, 905, 5, 96, 49, 2, 905, 906, 7, 92, 2, 2, 906, 907, 5, 96, 49, 2, 907, 135, 3, 2, 2, 2, 908, 909, 7, 88, 2, 2, 909, 910, 7, 9, 2, 2, 910, 911, 5, 94, 48, 2, 911, 913, 7, 10, 2, 2, 912, 914, 5, 138, 70, 2, 913, 912, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 913, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 137, 3, 2, 2, 2, 917, 920, 7, 89, 2, 2, 918, 921, 7, 13, 2, 2, 919, 921, 5, 74, 38, 2, 920, 918, 3, 2, 2, 2, 920, 919, 3, 2, 2, 2, 921, 929, 3, 2, 2, 2, 922, 925, 7, 14, 2, 2, 923, 926, 7, 13, 2, 2, 924, 926, 5, 74, 38, 2, 925, 923, 3, 2, 2, 2, 925, 924, 3, 2, 2, 2, 926, 928, 3, 2, 2, 2, 927, 922, 3, 2, 2, 2, 928, 931, 3, 2, 2, 2, 929, 927, 3, 2, 2, 2, 929, 930, 3, 2, 2, 2, 930, 932, 3, 2, 2, 2, 931, 929, 3, 2, 2, 2, 932, 933, 7, 9, 2, 2, 933, 934, 5, 94, 48, 2, 934, 935, 7, 10, 2, 2, 935, 139, 3, 2, 2, 2, 936, 941, 5, 142, 72, 2, 937, 938, 7, 94, 2, 2, 938, 940, 5, 142, 72, 2, 939, 937, 3, 2, 2, 2, 940, 943, 3, 2, 2, 2, 941, 939, 3, 2, 2, 2, 941, 942, 3, 2, 2, 2, 942, 141, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 944, 949, 5, 144, 73, 2, 945, 946, 7, 95, 2, 2, 946, 948, 5, 144, 73, 2, 947, 945, 3, 2, 2, 2, 948, 951, 3, 2, 2, 2, 949, 947, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 143, 3, 2, 2, 2, 951, 949, 3, 2, 2, 2, 952, 954, 7, 96, 2, 2, 953, 952, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 956, 5, 146, 74, 2, 956, 145, 3, 2, 2, 2, 957, 960, 5, 148, 75, 2, 958, 959, 9, 5, 2, 2, 959, 961, 5, 148, 75, 2, 960, 958, 3, 2, 2, 2, 960, 961, 3, 2, 2, 2, 961, 147, 3, 2, 2, 2, 962, 967, 5, 150, 76, 2, 963, 964, 7, 49, 2, 2, 964, 966, 5, 150, 76, 2, 965, 963, 3, 2, 2, 2, 966, 969, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 967, 968, 3, 2, 2, 2, 968, 149, 3, 2, 2, 2, 969, 967, 3, 2, 2, 2, 970, 973, 5, 152, 77, 2, 971, 972, 7, 97, 2, 2, 972, 974, 5, 152, 77, 2, 973, 971, 3, 2, 2, 2, 973, 974, 3, 2, 2, 2, 974, 151, 3, 2, 2, 2, 975, 980, 5, 154, 78, 2, 976, 977, 9, 6, 2, 2, 977, 979, 5, 154, 78, 2, 978, 976, 3, 2, 2, 2, 979, 982, 3, 2, 2, 2, 980, 978, 3, 2, 2, 2, 980, 981, 3, 2, 2, 2, 981, 153, 3, 2, 2, 2, 982, 980, 3, 2, 2, 2, 983, 988, 5, 156, 79, 2, 984, 985, 9, 7, 2, 2, 985, 987, 5, 156, 79, 2, 986, 984, 3, 2, 2, 2, 987, 990, 3, 2, 2, 2, 988, 986, 3, 2, 2, 2, 988, 989, 3, 2, 2, 2, 989, 155, 3, 2, 2, 2, 990, 988, 3, 2, 2, 2, 991, 995, 5, 158, 80, 2, 992, 993, 7, 98, 2, 2, 993, 994, 7, 99, 2, 2, 994, 996, 5, 232, 117, 2, 995, 992, 3, 2, 2, 2, 995, 996, 3, 2, 2, 2, 996, 157, 3, 2, 2, 2, 997, 1001, 5, 160, 81, 2, 998, 999, 7, 101, 2, 2, 999, 1000, 7, 100, 2, 2, 1000, 1002, 5, 232, 117, 2, 1001, 998, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 159, 3, 2, 2, 2, 1003, 1007, 5, 162, 82, 2, 1004, 1005, 7, 102, 2, 2, 1005, 1006, 7, 72, 2, 2, 1006, 1008, 5, 232, 117, 2, 1007, 1004, 3, 2, 2, 2, 1007, 1008, 3, 2, 2, 2, 1008, 161, 3, 2, 2, 2, 1009, 1013, 5, 164, 83, 2, 1010, 1011, 7, 104, 2, 2, 1011, 1012, 7, 72, 2, 2, 1012, 1014, 5, 244, 123, 2, 1013, 1010, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 163, 3, 2, 2, 2, 1015, 1019, 5, 166, 84, 2, 1016, 1017, 7, 103, 2, 2, 1017, 1018, 7, 72, 2, 2, 1018, 1020, 5, 244, 123, 2, 1019, 1016, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 165, 3, 2, 2, 2, 1021, 1030, 5, 170, 86, 2, 1022, 1023, 7, 6, 2, 2, 1023, 1024, 7, 47, 2, 2, 1024, 1025, 3, 2, 2, 2, 1025, 1026, 5, 168, 85, 2, 1026, 1027, 5, 206, 104, 2, 1027, 1029, 3, 2, 2, 2, 1028, 1022, 3, 2, 2, 2, 1029, 1032, 3, 2, 2, 2, 1030, 1028, 3, 2, 2, 2, 1030, 1031, 3, 2, 2, 2, 1031, 167, 3, 2, 2, 2, 1032, 1030, 3, 2, 2, 2, 1033, 1037, 5, 74, 38, 2, 1034, 1037, 5, 194, 98, 2, 1035, 1037, 5, 196, 99, 2, 1036, 1033, 3, 2, 2, 2, 1036, 1034, 3, 2, 2, 2, 1036, 1035, 3, 2, 2, 2, 1037, 169, 3, 2, 2, 2, 1038, 1040, 9, 6, 2, 2, 1039, 1038, 3, 2, 2, 2, 1040, 1043, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1041, 1042, 3, 2, 2, 2, 1042, 1044, 3, 2, 2, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1045, 5, 172, 87, 2, 1045, 171, 3, 2, 2, 2, 1046, 1050, 5, 178, 90, 2, 1047, 1050, 5, 174, 88, 2, 1048, 1050, 5, 176, 89, 2, 1049, 1046, 3, 2, 2, 2, 1049, 1047, 3, 2, 2, 2, 1049, 1048, 3, 2, 2, 2, 1050, 173, 3, 2, 2, 2, 1051, 1052, 7, 111, 2, 2, 1052, 1053, 7, 110, 2, 2, 1053, 1054, 5, 232, 117, 2, 1054, 1055, 7, 9, 2, 2, 1055, 1056, 5, 94, 48, 2, 1056, 1057, 7, 10, 2, 2, 1057, 175, 3, 2, 2, 2, 1058, 1059, 7, 112, 2, 2, 1059, 1060, 7, 110, 2, 2, 1060, 1061, 5, 232, 117, 2, 1061, 1062, 7, 9, 2, 2, 1062, 1063, 5, 94, 48, 2, 1063, 1064, 7, 10, 2, 2, 1064, 177, 3, 2, 2, 2, 1065, 1070, 5, 180, 91, 2, 1066, 1067, 7, 55, 2, 2, 1067, 1069, 5, 180, 91, 2, 1068, 1066, 3, 2, 2, 2, 1069, 1072, 3, 2, 2, 2, 1070, 1068, 3, 2, 2, 2, 1070, 1071, 3, 2, 2, 2, 1071, 179, 3, 2, 2, 2, 1072, 1070, 3, 2, 2, 2, 1073, 1081, 5, 190, 96, 2, 1074, 1080, 5, 182, 92, 2, 1075, 1080, 5, 186, 94, 2, 1076, 1080, 5, 188, 95, 2, 1077, 1080, 5, 184, 93, 2, 1078, 1080, 5, 206, 104, 2, 1079, 1074, 3, 2, 2, 2, 1079, 1075, 3, 2, 2, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1077, 3, 2, 2, 2, 1079, 1078, 3, 2, 2, 2, 1080, 1083, 3, 2, 2, 2, 1081, 1079, 3, 2, 2, 2, 1081, 1082, 3, 2, 2, 2, 1082, 181, 3, 2, 2, 2, 1083, 1081, 3, 2, 2, 2, 1084, 1085, 7, 56, 2, 2, 1085, 1086, 7, 56, 2, 2, 1086, 1087, 5, 94, 48, 2, 1087, 1088, 7, 57, 2, 2, 1088, 1089, 7, 57, 2, 2, 1089, 183, 3, 2, 2, 2, 1090, 1091, 7, 56, 2, 2, 1091, 1092, 7, 57, 2, 2, 1092, 185, 3, 2, 2, 2, 1093, 1094, 7, 56, 2, 2, 1094, 1095, 5, 94, 48, 2, 1095, 1096, 7, 57, 2, 2, 1096, 187, 3, 2, 2, 2, 1097, 1104, 7, 58, 2, 2, 1098, 1105, 5, 254, 128, 2, 1099, 1105, 5, 252, 127, 2, 1100, 1105, 7, 144, 2, 2, 1101, 1105, 5, 196, 99, 2, 1102, 1105, 5, 194, 98, 2, 1103, 1105, 5, 198, 100, 2, 1104, 1098, 3, 2, 2, 2, 1104, 1099, 3, 2, 2, 2, 1104, 1100, 3, 2, 2, 2, 1104, 1101, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1104, 1103, 3, 2, 2, 2, 1105, 189, 3, 2, 2, 2, 1106, 1122, 7, 137, 2, 2, 1107, 1122, 7, 108, 2, 2, 1108, 1122, 7, 109, 2, 2, 1109, 1122, 7, 138, 2, 2, 1110, 1122, 5, 252, 127, 2, 1111, 1122, 5, 194, 98, 2, 1112, 1122, 5, 196, 99, 2, 1113, 1122, 5, 198, 100, 2, 1114, 1122, 5, 234, 118, 2, 1115, 1122, 5, 204, 103, 2, 1116, 1122, 5, 200, 101, 2, 1117, 1122, 5, 202, 102, 2, 1118, 1122, 5, 248, 125, 2, 1119, 1122, 5, 210, 106, 2, 1120, 1122, 5, 192, 97, 2, 1121, 1106, 3, 2, 2, 2, 1121, 1107, 3, 2, 2, 2, 1121, 1108, 3, 2, 2, 2, 1121, 1109, 3, 2, 2, 2, 1121, 1110, 3, 2, 2, 2, 1121, 1111, 3, 2, 2, 2, 1121, 1112, 3, 2, 2, 2, 1121, 1113, 3, 2, 2, 2, 1121, 1114, 3, 2, 2, 2, 1121, 1115, 3, 2, 2, 2, 1121, 1116, 3, 2, 2, 2, 1121, 1117, 3, 2, 2, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 191, 3, 2, 2, 2, 1123, 1124, 7, 9, 2, 2, 1124, 1125, 5, 16, 9, 2, 1125, 1126, 7, 10, 2, 2, 1126, 193, 3, 2, 2, 2, 1127, 1128, 7, 7, 2, 2, 1128, 1129, 5, 74, 38, 2, 1129, 195, 3, 2, 2, 2, 1130, 1132, 7, 11, 2, 2, 1131, 1133, 5, 94, 48, 2, 1132, 1131, 3, 2, 2, 2, 1132, 1133, 3, 2, 2, 2, 1133, 1134, 3, 2, 2, 2, 1134, 1135, 7, 12, 2, 2, 1135, 197, 3, 2, 2, 2, 1136, 1137, 7, 59, 2, 2, 1137, 199, 3, 2, 2, 2, 1138, 1139, 7, 18, 2, 2, 1139, 1140, 7, 9, 2, 2, 1140, 1141, 5, 94, 48, 2, 1141, 1142, 7, 10, 2, 2, 1142, 201, 3, 2, 2, 2, 1143, 1144, 7, 107, 2, 2, 1144, 1145, 7, 9, 2, 2, 1145, 1146, 5, 94, 48, 2, 1146, 1147, 7, 10, 2, 2, 1147, 203, 3, 2, 2, 2, 1148, 1149, 5, 74, 38, 2, 1149, 1150, 5, 206, 104, 2, 1150, 205, 3, 2, 2, 2, 1151, 1158, 7, 11, 2, 2, 1152, 1154, 5, 208, 105, 2, 1153, 1155, 7, 16, 2, 2, 1154, 1153, 3, 2, 2, 2, 1154, 1155, 3, 2, 2, 2, 1155, 1157, 3, 2, 2, 2, 1156, 1152, 3, 2, 2, 2, 1157, 1160, 3, 2, 2, 2, 1158, 1156, 3, 2, 2, 2, 1158, 1159, 3, 2, 2, 2, 1159, 1161, 3, 2, 2, 2, 1160, 1158, 3, 2, 2, 2, 1161, 1162, 7, 12, 2, 2, 1162, 207, 3, 2, 2, 2, 1163, 1166, 5, 96, 49, 2, 1164, 1166, 7, 136, 2, 2, 1165, 1163, 3, 2, 2, 2, 1165, 1164, 3, 2, 2, 2, 1166, 209, 3, 2, 2, 2, 1167, 1170, 5, 212, 107, 2, 1168, 1170, 5, 214, 108, 2, 1169, 1167, 3, 2, 2, 2, 1169, 1168, 3, 2, 2, 2, 1170, 211, 3, 2, 2, 2, 1171, 1172, 5, 74, 38, 2, 1172, 1173, 7, 60, 2, 2, 1173, 1174, 7, 138, 2, 2, 1174, 213, 3, 2, 2, 2, 1175, 1176, 5, 52, 27, 2, 1176, 1177, 7, 33, 2, 2, 1177, 1179, 7, 11, 2, 2, 1178, 1180, 5, 90, 46, 2, 1179, 1178, 3, 2, 2, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 3, 2, 2, 2, 1181, 1184, 7, 12, 2, 2, 1182, 1183, 7, 72, 2, 2, 1183, 1185, 5, 232, 117, 2, 1184, 1182, 3, 2, 2, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 1187, 7, 9, 2, 2, 1187, 1188, 5, 18, 10, 2, 1188, 1189, 7, 10, 2, 2, 1189, 215, 3, 2, 2, 2, 1190, 1191, 7, 117, 2, 2, 1191, 1192, 7, 126, 2, 2, 1192, 1193, 5, 96, 49, 2, 1193, 1194, 7, 124, 2, 2, 1194, 1198, 5, 96, 49, 2, 1195, 1196, 7, 73, 2, 2, 1196, 1197, 7, 128, 2, 2, 1197, 1199, 5, 96, 49, 2, 1198, 1195, 3, 2, 2, 2, 1198, 1199, 3, 2, 2, 2, 1199, 1214, 3, 2, 2, 2, 1200, 1201, 7, 117, 2, 2, 1201, 1202, 7, 126, 2, 2, 1202, 1207, 5, 246, 124, 2, 1203, 1204, 7, 16, 2, 2, 1204, 1206, 5, 246, 124, 2, 1205, 1203, 3, 2, 2, 2, 1206, 1209, 3, 2, 2, 2, 1207, 1205, 3, 2, 2, 2, 1207, 1208, 3, 2, 2, 2, 1208, 1210, 3, 2, 2, 2, 1209, 1207, 3, 2, 2, 2, 1210, 1211, 7, 124, 2, 2, 1211, 1212, 5, 96, 49, 2, 1212, 1214, 3, 2, 2, 2, 1213, 1190, 3, 2, 2, 2, 1213, 1200, 3, 2, 2, 2, 1214, 217, 3, 2, 2, 2, 1215, 1216, 7, 118, 2, 2, 1216, 1217, 7, 126, 2, 2, 1217, 1218, 5, 228, 115, 2, 1218, 219, 3, 2, 2, 2, 1219, 1220, 7, 119, 2, 2, 1220, 1221, 7, 126, 2, 2, 1221, 1222, 5, 228, 115, 2, 1222, 1223, 7, 72, 2, 2, 1223, 1224, 5, 96, 49, 2, 1224, 221, 3, 2, 2, 2, 1225, 1226, 7, 120, 2, 2, 1226, 1227, 7, 125, 2, 2, 1227, 1228, 7, 99, 2, 2, 1228, 1229, 7, 126, 2, 2, 1229, 1230, 5, 228, 115, 2, 1230, 1231, 7, 127, 2, 2, 1231, 1232, 5, 96, 49, 2, 1232, 223, 3, 2, 2, 2, 1233, 1234, 7, 121, 2, 2, 1234, 1239, 5, 230, 116, 2, 1235, 1236, 7, 16, 2, 2, 1236, 1238, 5, 230, 116, 2, 1237, 1235, 3, 2, 2, 2, 1238, 1241, 3, 2, 2, 2, 1239, 1237, 3, 2, 2, 2, 1239, 1240, 3, 2, 2, 2, 1240, 1242, 3, 2, 2, 2, 1241, 1239, 3, 2, 2, 2, 1242, 1243, 7, 122, 2, 2, 1243, 1244, 5, 96, 49, 2, 1244, 1245, 7, 69, 2, 2, 1245, 1246, 5, 96, 49, 2, 1246, 225, 3, 2, 2, 2, 1247, 1248, 7, 123, 2, 2, 1248, 1249, 7, 126, 2, 2, 1249, 1250, 5, 96, 49, 2, 1250, 1251, 7, 124, 2, 2, 1251, 1252, 5, 96, 49, 2, 1252, 227, 3, 2, 2, 2, 1253, 1256, 5, 190, 96, 2, 1254, 1257, 5, 182, 92, 2, 1255, 1257, 5, 188, 95, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1255, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1256, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 229, 3, 2, 2, 2, 1260, 1261, 5, 194, 98, 2, 1261, 1262, 7, 8, 2, 2, 1262, 1263, 5, 96, 49, 2, 1263, 231, 3, 2, 2, 2, 1264, 1265, 7, 11, 2, 2, 1265, 1273, 7, 12, 2, 2, 1266, 1270, 5, 236, 119, 2, 1267, 1271, 7, 136, 2, 2, 1268, 1271, 7, 13, 2, 2, 1269, 1271, 7, 50, 2, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1268, 3, 2, 2, 2, 1270, 1269, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1273, 3, 2, 2, 2, 1272, 1264, 3, 2, 2, 2, 1272, 1266, 3, 2, 2, 2, 1273, 233, 3, 2, 2, 2, 1274, 1283, 7, 9, 2, 2, 1275, 1280, 5, 246, 124, 2, 1276, 1277, 7, 16, 2, 2, 1277, 1279, 5, 246, 124, 2, 1278, 1276, 3, 2, 2, 2, 1279, 1282, 3, 2, 2, 2, 1280, 1278, 3, 2, 2, 2, 1280, 1281, 3, 2, 2, 2, 1281, 1284, 3, 2, 2, 2, 1282, 1280, 3, 2, 2, 2, 1283, 1275, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1291, 7, 10, 2, 2, 1286, 1287, 7, 61, 2, 2, 1287, 1288, 5, 94, 48, 2, 1288, 1289, 7, 62, 2, 2, 1289, 1291, 3, 2, 2, 2, 1290, 1274, 3, 2, 2, 2, 1290, 1286, 3, 2, 2, 2, 1291, 235, 3, 2, 2, 2, 1292, 1296, 5, 74, 38, 2, 1293, 1296, 7, 137, 2, 2, 1294, 1296, 5, 238, 120, 2, 1295, 1292, 3, 2, 2, 2, 1295, 1293, 3, 2, 2, 2, 1295, 1294, 3, 2, 2, 2, 1296, 237, 3, 2, 2, 2, 1297, 1300, 5, 240, 121, 2, 1298, 1300, 5, 242, 122, 2, 1299, 1297, 3, 2, 2, 2, 1299, 1298, 3, 2, 2, 2, 1300, 239, 3, 2, 2, 2, 1301, 1302, 7, 33, 2, 2, 1302, 1303, 7, 11, 2, 2, 1303, 1304, 7, 13, 2, 2, 1304, 1305, 7, 12, 2, 2, 1305, 241, 3, 2, 2, 2, 1306, 1307, 7, 33, 2, 2, 1307, 1316, 7, 11, 2, 2, 1308, 1313, 5, 232, 117, 2, 1309, 1310, 7, 16, 2, 2, 1310, 1312, 5, 232, 117, 2, 1311, 1309, 3, 2, 2, 2, 1312, 1315, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1313, 1314, 3, 2, 2, 2, 1314, 1317, 3, 2, 2, 2, 1315, 1313, 3, 2, 2, 2, 1316, 1308, 3, 2, 2, 2, 1316, 1317, 3, 2, 2, 2, 1317, 1318, 3, 2, 2, 2, 1318, 1319, 7, 12, 2, 2, 1319, 1320, 7, 72, 2, 2, 1320, 1321, 5, 232, 117, 2, 1321, 243, 3, 2, 2, 2, 1322, 1324, 5, 236, 119, 2, 1323, 1325, 7, 136, 2, 2, 1324, 1323, 3, 2, 2, 2, 1324, 1325, 3, 2, 2, 2, 1325, 245, 3, 2, 2, 2, 1326, 1329, 5, 96, 49, 2, 1327, 1329, 7, 144, 2, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1331, 9, 8, 2, 2, 1331, 1332, 5, 96, 49, 2, 1332, 247, 3, 2, 2, 2, 1333, 1335, 7, 56, 2, 2, 1334, 1336, 5, 94, 48, 2, 1335, 1334, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 1337, 3, 2, 2, 2, 1337, 1338, 7, 57, 2, 2, 1338, 249, 3, 2, 2, 2, 1339, 1340, 5, 252, 127, 2, 1340, 251, 3, 2, 2, 2, 1341, 1342, 7, 135, 2, 2, 1342, 253, 3, 2, 2, 2, 1343, 1344, 9, 9, 2, 2, 1344, 255, 3, 2, 2, 2, 134, 264, 268, 284, 290, 298, 306, 314, 329, 359, 367, 369, 391, 401, 411, 416, 421, 425, 437, 441, 450, 457, 471, 475, 480, 490, 498, 502, 514, 526, 548, 556, 561, 564, 568, 577, 586, 589, 597, 604, 606, 613, 620, 622, 630, 635, 642, 649, 659, 666, 673, 680, 689, 699, 703, 711, 713, 725, 731, 735, 739, 750, 756, 771, 777, 781, 785, 792, 799, 805, 810, 812, 816, 823, 830, 839, 851, 861, 873, 877, 886, 893, 915, 920, 925, 929, 941, 949, 953, 960, 967, 973, 980, 988, 995, 1001, 1007, 1013, 1019, 1030, 1036, 1041, 1049, 1070, 1079, 1081, 1104, 1121, 1132, 1154, 1158, 1165, 1169, 1179, 1184, 1198, 1207, 1213, 1239, 1256, 1258, 1270, 1272, 1280, 1283, 1290, 1295, 1299, 1313, 1316, 1324, 1328, 1335] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 147, 1349, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 265, 10, 3, 3, 3, 3, 3, 5, 3, 269, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 285, 10, 6, 3, 6, 3, 6, 7, 6, 289, 10, 6, 12, 6, 14, 6, 292, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 297, 10, 6, 12, 6, 14, 6, 300, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 305, 10, 8, 12, 8, 14, 8, 308, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 315, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 330, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 360, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 368, 10, 18, 12, 18, 14, 18, 371, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 390, 10, 20, 13, 20, 14, 20, 391, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 400, 10, 21, 13, 21, 14, 21, 401, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 410, 10, 22, 13, 22, 14, 22, 411, 3, 23, 3, 23, 3, 23, 5, 23, 417, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 422, 10, 23, 7, 23, 424, 10, 23, 12, 23, 14, 23, 427, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 436, 10, 24, 13, 24, 14, 24, 437, 3, 24, 3, 24, 5, 24, 442, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 451, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 456, 10, 25, 12, 25, 14, 25, 459, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 470, 10, 26, 12, 26, 14, 26, 473, 11, 26, 3, 26, 5, 26, 476, 10, 26, 3, 26, 5, 26, 479, 10, 26, 3, 27, 7, 27, 482, 10, 27, 12, 27, 14, 27, 485, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 492, 10, 28, 12, 28, 14, 28, 495, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 502, 10, 29, 3, 29, 3, 29, 5, 29, 506, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 518, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 530, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 552, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 558, 10, 37, 12, 37, 14, 37, 561, 11, 37, 3, 38, 3, 38, 5, 38, 565, 10, 38, 3, 38, 5, 38, 568, 10, 38, 3, 38, 3, 38, 5, 38, 572, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 581, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 588, 10, 40, 12, 40, 14, 40, 591, 11, 40, 5, 40, 593, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 601, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 608, 10, 41, 5, 41, 610, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 617, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 624, 10, 42, 5, 42, 626, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 634, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 639, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 646, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 653, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 663, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 668, 10, 46, 12, 46, 14, 46, 671, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 677, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 682, 10, 48, 12, 48, 14, 48, 685, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 693, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 703, 10, 50, 3, 51, 3, 51, 5, 51, 707, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 715, 10, 51, 12, 51, 14, 51, 718, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 727, 10, 52, 12, 52, 14, 52, 730, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 735, 10, 53, 3, 53, 3, 53, 5, 53, 739, 10, 53, 3, 53, 3, 53, 5, 53, 743, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 752, 10, 54, 12, 54, 14, 54, 755, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 760, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 773, 10, 57, 12, 57, 14, 57, 776, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 781, 10, 58, 3, 58, 3, 58, 5, 58, 785, 10, 58, 3, 58, 3, 58, 5, 58, 789, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 796, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 801, 10, 59, 12, 59, 14, 59, 804, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 809, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 814, 10, 60, 5, 60, 816, 10, 60, 3, 60, 3, 60, 5, 60, 820, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 827, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 832, 10, 62, 12, 62, 14, 62, 835, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 843, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 853, 10, 64, 13, 64, 14, 64, 854, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 863, 10, 65, 13, 65, 14, 65, 864, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 875, 10, 66, 13, 66, 14, 66, 876, 3, 66, 3, 66, 5, 66, 881, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 890, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 895, 10, 67, 12, 67, 14, 67, 898, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 917, 10, 69, 13, 69, 14, 69, 918, 3, 70, 3, 70, 3, 70, 5, 70, 924, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 929, 10, 70, 7, 70, 931, 10, 70, 12, 70, 14, 70, 934, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 943, 10, 71, 12, 71, 14, 71, 946, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 951, 10, 72, 12, 72, 14, 72, 954, 11, 72, 3, 73, 5, 73, 957, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 964, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 969, 10, 75, 12, 75, 14, 75, 972, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 977, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 982, 10, 77, 12, 77, 14, 77, 985, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 990, 10, 78, 12, 78, 14, 78, 993, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 999, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1005, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1011, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1017, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1023, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1032, 10, 84, 12, 84, 14, 84, 1035, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1040, 10, 85, 3, 86, 7, 86, 1043, 10, 86, 12, 86, 14, 86, 1046, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1053, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1072, 10, 90, 12, 90, 14, 90, 1075, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1083, 10, 91, 12, 91, 14, 91, 1086, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1108, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1125, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1136, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1158, 10, 104, 7, 104, 1160, 10, 104, 12, 104, 14, 104, 1163, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1169, 10, 105, 3, 106, 3, 106, 5, 106, 1173, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1183, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1188, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1202, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1209, 10, 109, 12, 109, 14, 109, 1212, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1217, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1241, 10, 113, 12, 113, 14, 113, 1244, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1260, 10, 115, 13, 115, 14, 115, 1261, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1274, 10, 117, 5, 117, 1276, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 7, 118, 1282, 10, 118, 12, 118, 14, 118, 1285, 11, 118, 5, 118, 1287, 10, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1294, 10, 118, 3, 119, 3, 119, 3, 119, 5, 119, 1299, 10, 119, 3, 120, 3, 120, 5, 120, 1303, 10, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1315, 10, 122, 12, 122, 14, 122, 1318, 11, 122, 5, 122, 1320, 10, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 5, 123, 1328, 10, 123, 3, 124, 3, 124, 5, 124, 1332, 10, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1339, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 2, 2, 129, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 2, 10, 4, 2, 18, 18, 107, 107, 3, 2, 84, 85, 3, 2, 21, 30, 4, 2, 6, 6, 38, 48, 3, 2, 50, 51, 4, 2, 13, 13, 52, 54, 4, 2, 20, 20, 137, 137, 4, 2, 63, 135, 138, 138, 2, 1415, 2, 256, 3, 2, 2, 2, 4, 264, 3, 2, 2, 2, 6, 270, 3, 2, 2, 2, 8, 273, 3, 2, 2, 2, 10, 290, 3, 2, 2, 2, 12, 301, 3, 2, 2, 2, 14, 306, 3, 2, 2, 2, 16, 309, 3, 2, 2, 2, 18, 312, 3, 2, 2, 2, 20, 329, 3, 2, 2, 2, 22, 331, 3, 2, 2, 2, 24, 334, 3, 2, 2, 2, 26, 340, 3, 2, 2, 2, 28, 344, 3, 2, 2, 2, 30, 348, 3, 2, 2, 2, 32, 352, 3, 2, 2, 2, 34, 359, 3, 2, 2, 2, 36, 375, 3, 2, 2, 2, 38, 384, 3, 2, 2, 2, 40, 399, 3, 2, 2, 2, 42, 406, 3, 2, 2, 2, 44, 413, 3, 2, 2, 2, 46, 430, 3, 2, 2, 2, 48, 446, 3, 2, 2, 2, 50, 478, 3, 2, 2, 2, 52, 483, 3, 2, 2, 2, 54, 486, 3, 2, 2, 2, 56, 498, 3, 2, 2, 2, 58, 507, 3, 2, 2, 2, 60, 517, 3, 2, 2, 2, 62, 519, 3, 2, 2, 2, 64, 529, 3, 2, 2, 2, 66, 531, 3, 2, 2, 2, 68, 536, 3, 2, 2, 2, 70, 540, 3, 2, 2, 2, 72, 546, 3, 2, 2, 2, 74, 567, 3, 2, 2, 2, 76, 573, 3, 2, 2, 2, 78, 575, 3, 2, 2, 2, 80, 594, 3, 2, 2, 2, 82, 611, 3, 2, 2, 2, 84, 627, 3, 2, 2, 2, 86, 647, 3, 2, 2, 2, 88, 662, 3, 2, 2, 2, 90, 664, 3, 2, 2, 2, 92, 672, 3, 2, 2, 2, 94, 678, 3, 2, 2, 2, 96, 692, 3, 2, 2, 2, 98, 702, 3, 2, 2, 2, 100, 706, 3, 2, 2, 2, 102, 722, 3, 2, 2, 2, 104, 731, 3, 2, 2, 2, 106, 747, 3, 2, 2, 2, 108, 756, 3, 2, 2, 2, 110, 764, 3, 2, 2, 2, 112, 767, 3, 2, 2, 2, 114, 777, 3, 2, 2, 2, 116, 795, 3, 2, 2, 2, 118, 805, 3, 2, 2, 2, 120, 821, 3, 2, 2, 2, 122, 826, 3, 2, 2, 2, 124, 839, 3, 2, 2, 2, 126, 847, 3, 2, 2, 2, 128, 862, 3, 2, 2, 2, 130, 869, 3, 2, 2, 2, 132, 885, 3, 2, 2, 2, 134, 902, 3, 2, 2, 2, 136, 911, 3, 2, 2, 2, 138, 920, 3, 2, 2, 2, 140, 939, 3, 2, 2, 2, 142, 947, 3, 2, 2, 2, 144, 956, 3, 2, 2, 2, 146, 960, 3, 2, 2, 2, 148, 965, 3, 2, 2, 2, 150, 973, 3, 2, 2, 2, 152, 978, 3, 2, 2, 2, 154, 986, 3, 2, 2, 2, 156, 994, 3, 2, 2, 2, 158, 1000, 3, 2, 2, 2, 160, 1006, 3, 2, 2, 2, 162, 1012, 3, 2, 2, 2, 164, 1018, 3, 2, 2, 2, 166, 1024, 3, 2, 2, 2, 168, 1039, 3, 2, 2, 2, 170, 1044, 3, 2, 2, 2, 172, 1052, 3, 2, 2, 2, 174, 1054, 3, 2, 2, 2, 176, 1061, 3, 2, 2, 2, 178, 1068, 3, 2, 2, 2, 180, 1076, 3, 2, 2, 2, 182, 1087, 3, 2, 2, 2, 184, 1093, 3, 2, 2, 2, 186, 1096, 3, 2, 2, 2, 188, 1100, 3, 2, 2, 2, 190, 1124, 3, 2, 2, 2, 192, 1126, 3, 2, 2, 2, 194, 1130, 3, 2, 2, 2, 196, 1133, 3, 2, 2, 2, 198, 1139, 3, 2, 2, 2, 200, 1141, 3, 2, 2, 2, 202, 1146, 3, 2, 2, 2, 204, 1151, 3, 2, 2, 2, 206, 1154, 3, 2, 2, 2, 208, 1168, 3, 2, 2, 2, 210, 1172, 3, 2, 2, 2, 212, 1174, 3, 2, 2, 2, 214, 1178, 3, 2, 2, 2, 216, 1216, 3, 2, 2, 2, 218, 1218, 3, 2, 2, 2, 220, 1222, 3, 2, 2, 2, 222, 1228, 3, 2, 2, 2, 224, 1236, 3, 2, 2, 2, 226, 1250, 3, 2, 2, 2, 228, 1256, 3, 2, 2, 2, 230, 1263, 3, 2, 2, 2, 232, 1275, 3, 2, 2, 2, 234, 1293, 3, 2, 2, 2, 236, 1298, 3, 2, 2, 2, 238, 1302, 3, 2, 2, 2, 240, 1304, 3, 2, 2, 2, 242, 1309, 3, 2, 2, 2, 244, 1325, 3, 2, 2, 2, 246, 1331, 3, 2, 2, 2, 248, 1336, 3, 2, 2, 2, 250, 1342, 3, 2, 2, 2, 252, 1344, 3, 2, 2, 2, 254, 1346, 3, 2, 2, 2, 256, 257, 5, 4, 3, 2, 257, 258, 7, 2, 2, 3, 258, 3, 3, 2, 2, 2, 259, 260, 7, 106, 2, 2, 260, 261, 7, 105, 2, 2, 261, 262, 5, 252, 127, 2, 262, 263, 7, 3, 2, 2, 263, 265, 3, 2, 2, 2, 264, 259, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 269, 5, 8, 5, 2, 267, 269, 5, 6, 4, 2, 268, 266, 3, 2, 2, 2, 268, 267, 3, 2, 2, 2, 269, 5, 3, 2, 2, 2, 270, 271, 5, 10, 6, 2, 271, 272, 5, 12, 7, 2, 272, 7, 3, 2, 2, 2, 273, 274, 7, 4, 2, 2, 274, 275, 7, 5, 2, 2, 275, 276, 7, 145, 2, 2, 276, 277, 7, 6, 2, 2, 277, 278, 5, 250, 126, 2, 278, 279, 7, 3, 2, 2, 279, 280, 5, 10, 6, 2, 280, 9, 3, 2, 2, 2, 281, 285, 5, 60, 31, 2, 282, 285, 5, 62, 32, 2, 283, 285, 5, 78, 40, 2, 284, 281, 3, 2, 2, 2, 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 287, 7, 3, 2, 2, 287, 289, 3, 2, 2, 2, 288, 284, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 288, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 298, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 293, 294, 5, 64, 33, 2, 294, 295, 7, 3, 2, 2, 295, 297, 3, 2, 2, 2, 296, 293, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 11, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 302, 5, 18, 10, 2, 302, 13, 3, 2, 2, 2, 303, 305, 5, 20, 11, 2, 304, 303, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 15, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 5, 14, 8, 2, 310, 311, 5, 94, 48, 2, 311, 17, 3, 2, 2, 2, 312, 314, 5, 14, 8, 2, 313, 315, 5, 94, 48, 2, 314, 313, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 19, 3, 2, 2, 2, 316, 330, 5, 22, 12, 2, 317, 330, 5, 24, 13, 2, 318, 330, 5, 26, 14, 2, 319, 330, 5, 28, 15, 2, 320, 330, 5, 30, 16, 2, 321, 330, 5, 32, 17, 2, 322, 330, 5, 34, 18, 2, 323, 330, 5, 36, 19, 2, 324, 330, 5, 38, 20, 2, 325, 330, 5, 42, 22, 2, 326, 330, 5, 46, 24, 2, 327, 330, 5, 54, 28, 2, 328, 330, 5, 58, 30, 2, 329, 316, 3, 2, 2, 2, 329, 317, 3, 2, 2, 2, 329, 318, 3, 2, 2, 2, 329, 319, 3, 2, 2, 2, 329, 320, 3, 2, 2, 2, 329, 321, 3, 2, 2, 2, 329, 322, 3, 2, 2, 2, 329, 323, 3, 2, 2, 2, 329, 324, 3, 2, 2, 2, 329, 325, 3, 2, 2, 2, 329, 326, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 328, 3, 2, 2, 2, 330, 21, 3, 2, 2, 2, 331, 332, 5, 98, 50, 2, 332, 333, 7, 3, 2, 2, 333, 23, 3, 2, 2, 2, 334, 335, 7, 7, 2, 2, 335, 336, 5, 74, 38, 2, 336, 337, 7, 8, 2, 2, 337, 338, 5, 96, 49, 2, 338, 339, 7, 3, 2, 2, 339, 25, 3, 2, 2, 2, 340, 341, 7, 9, 2, 2, 341, 342, 5, 14, 8, 2, 342, 343, 7, 10, 2, 2, 343, 27, 3, 2, 2, 2, 344, 345, 7, 130, 2, 2, 345, 346, 7, 131, 2, 2, 346, 347, 7, 3, 2, 2, 347, 29, 3, 2, 2, 2, 348, 349, 7, 132, 2, 2, 349, 350, 7, 131, 2, 2, 350, 351, 7, 3, 2, 2, 351, 31, 3, 2, 2, 2, 352, 353, 7, 133, 2, 2, 353, 354, 7, 134, 2, 2, 354, 355, 5, 96, 49, 2, 355, 356, 7, 3, 2, 2, 356, 33, 3, 2, 2, 2, 357, 360, 5, 102, 52, 2, 358, 360, 5, 106, 54, 2, 359, 357, 3, 2, 2, 2, 359, 358, 3, 2, 2, 2, 360, 369, 3, 2, 2, 2, 361, 368, 5, 102, 52, 2, 362, 368, 5, 106, 54, 2, 363, 368, 5, 110, 56, 2, 364, 368, 5, 112, 57, 2, 365, 368, 5, 116, 59, 2, 366, 368, 5, 120, 61, 2, 367, 361, 3, 2, 2, 2, 367, 362, 3, 2, 2, 2, 367, 363, 3, 2, 2, 2, 367, 364, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 366, 3, 2, 2, 2, 368, 371, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 372, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 372, 373, 7, 69, 2, 2, 373, 374, 5, 20, 11, 2, 374, 35, 3, 2, 2, 2, 375, 376, 7, 70, 2, 2, 376, 377, 7, 11, 2, 2, 377, 378, 5, 94, 48, 2, 378, 379, 7, 12, 2, 2, 379, 380, 7, 91, 2, 2, 380, 381, 5, 20, 11, 2, 381, 382, 7, 92, 2, 2, 382, 383, 5, 20, 11, 2, 383, 37, 3, 2, 2, 2, 384, 385, 7, 86, 2, 2, 385, 386, 7, 11, 2, 2, 386, 387, 5, 94, 48, 2, 387, 389, 7, 12, 2, 2, 388, 390, 5, 40, 21, 2, 389, 388, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 7, 90, 2, 2, 394, 395, 7, 69, 2, 2, 395, 396, 5, 20, 11, 2, 396, 39, 3, 2, 2, 2, 397, 398, 7, 87, 2, 2, 398, 400, 5, 96, 49, 2, 399, 397, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 7, 69, 2, 2, 404, 405, 5, 20, 11, 2, 405, 41, 3, 2, 2, 2, 406, 407, 7, 88, 2, 2, 407, 409, 5, 26, 14, 2, 408, 410, 5, 44, 23, 2, 409, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 409, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 43, 3, 2, 2, 2, 413, 416, 7, 89, 2, 2, 414, 417, 7, 13, 2, 2, 415, 417, 5, 74, 38, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 425, 3, 2, 2, 2, 418, 421, 7, 14, 2, 2, 419, 422, 7, 13, 2, 2, 420, 422, 5, 74, 38, 2, 421, 419, 3, 2, 2, 2, 421, 420, 3, 2, 2, 2, 422, 424, 3, 2, 2, 2, 423, 418, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 5, 26, 14, 2, 429, 45, 3, 2, 2, 2, 430, 431, 7, 93, 2, 2, 431, 432, 7, 11, 2, 2, 432, 433, 5, 94, 48, 2, 433, 435, 7, 12, 2, 2, 434, 436, 5, 48, 25, 2, 435, 434, 3, 2, 2, 2, 436, 437, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 441, 7, 90, 2, 2, 440, 442, 5, 194, 98, 2, 441, 440, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 7, 69, 2, 2, 444, 445, 5, 20, 11, 2, 445, 47, 3, 2, 2, 2, 446, 450, 7, 87, 2, 2, 447, 448, 5, 194, 98, 2, 448, 449, 7, 72, 2, 2, 449, 451, 3, 2, 2, 2, 450, 447, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 457, 5, 232, 117, 2, 453, 454, 7, 14, 2, 2, 454, 456, 5, 232, 117, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 460, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 461, 7, 69, 2, 2, 461, 462, 5, 20, 11, 2, 462, 49, 3, 2, 2, 2, 463, 464, 7, 15, 2, 2, 464, 475, 5, 74, 38, 2, 465, 466, 7, 11, 2, 2, 466, 471, 7, 139, 2, 2, 467, 468, 7, 16, 2, 2, 468, 470, 7, 139, 2, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 12, 2, 2, 475, 465, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 479, 7, 129, 2, 2, 478, 463, 3, 2, 2, 2, 478, 477, 3, 2, 2, 2, 479, 51, 3, 2, 2, 2, 480, 482, 5, 50, 26, 2, 481, 480, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 53, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 487, 5, 52, 27, 2, 487, 488, 7, 116, 2, 2, 488, 493, 5, 56, 29, 2, 489, 490, 7, 16, 2, 2, 490, 492, 5, 56, 29, 2, 491, 489, 3, 2, 2, 2, 492, 495, 3, 2, 2, 2, 493, 491, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 497, 7, 3, 2, 2, 497, 55, 3, 2, 2, 2, 498, 501, 5, 194, 98, 2, 499, 500, 7, 72, 2, 2, 500, 502, 5, 232, 117, 2, 501, 499, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 504, 7, 8, 2, 2, 504, 506, 5, 96, 49, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 57, 3, 2, 2, 2, 507, 508, 7, 135, 2, 2, 508, 509, 7, 11, 2, 2, 509, 510, 5, 94, 48, 2, 510, 511, 7, 12, 2, 2, 511, 512, 5, 20, 11, 2, 512, 59, 3, 2, 2, 2, 513, 518, 5, 66, 34, 2, 514, 518, 5, 68, 35, 2, 515, 518, 5, 70, 36, 2, 516, 518, 5, 72, 37, 2, 517, 513, 3, 2, 2, 2, 517, 514, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 517, 516, 3, 2, 2, 2, 518, 61, 3, 2, 2, 2, 519, 520, 7, 113, 2, 2, 520, 521, 7, 5, 2, 2, 521, 522, 7, 145, 2, 2, 522, 523, 7, 6, 2, 2, 523, 524, 5, 250, 126, 2, 524, 63, 3, 2, 2, 2, 525, 530, 5, 84, 43, 2, 526, 530, 5, 80, 41, 2, 527, 530, 5, 86, 44, 2, 528, 530, 5, 82, 42, 2, 529, 525, 3, 2, 2, 2, 529, 526, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 528, 3, 2, 2, 2, 530, 65, 3, 2, 2, 2, 531, 532, 7, 113, 2, 2, 532, 533, 7, 90, 2, 2, 533, 534, 7, 83, 2, 2, 534, 535, 5, 250, 126, 2, 535, 67, 3, 2, 2, 2, 536, 537, 7, 113, 2, 2, 537, 538, 7, 17, 2, 2, 538, 539, 9, 2, 2, 2, 539, 69, 3, 2, 2, 2, 540, 541, 7, 113, 2, 2, 541, 542, 7, 90, 2, 2, 542, 543, 7, 68, 2, 2, 543, 544, 7, 75, 2, 2, 544, 545, 9, 3, 2, 2, 545, 71, 3, 2, 2, 2, 546, 551, 7, 113, 2, 2, 547, 548, 7, 19, 2, 2, 548, 552, 5, 74, 38, 2, 549, 550, 7, 90, 2, 2, 550, 552, 7, 19, 2, 2, 551, 547, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 559, 3, 2, 2, 2, 553, 554, 5, 76, 39, 2, 554, 555, 7, 6, 2, 2, 555, 556, 5, 252, 127, 2, 556, 558, 3, 2, 2, 2, 557, 553, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 73, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 565, 7, 145, 2, 2, 563, 565, 5, 254, 128, 2, 564, 562, 3, 2, 2, 2, 564, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 568, 7, 20, 2, 2, 567, 564, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 572, 7, 145, 2, 2, 570, 572, 5, 254, 128, 2, 571, 569, 3, 2, 2, 2, 571, 570, 3, 2, 2, 2, 572, 75, 3, 2, 2, 2, 573, 574, 9, 4, 2, 2, 574, 77, 3, 2, 2, 2, 575, 576, 7, 31, 2, 2, 576, 580, 7, 4, 2, 2, 577, 578, 7, 5, 2, 2, 578, 579, 7, 145, 2, 2, 579, 581, 7, 6, 2, 2, 580, 577, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 592, 5, 250, 126, 2, 583, 584, 7, 73, 2, 2, 584, 589, 5, 250, 126, 2, 585, 586, 7, 16, 2, 2, 586, 588, 5, 250, 126, 2, 587, 585, 3, 2, 2, 2, 588, 591, 3, 2, 2, 2, 589, 587, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 593, 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 592, 583, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 593, 79, 3, 2, 2, 2, 594, 595, 7, 113, 2, 2, 595, 596, 5, 52, 27, 2, 596, 597, 7, 116, 2, 2, 597, 600, 5, 194, 98, 2, 598, 599, 7, 72, 2, 2, 599, 601, 5, 232, 117, 2, 600, 598, 3, 2, 2, 2, 600, 601, 3, 2, 2, 2, 601, 609, 3, 2, 2, 2, 602, 603, 7, 8, 2, 2, 603, 610, 5, 96, 49, 2, 604, 607, 7, 32, 2, 2, 605, 606, 7, 8, 2, 2, 606, 608, 5, 96, 49, 2, 607, 605, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 610, 3, 2, 2, 2, 609, 602, 3, 2, 2, 2, 609, 604, 3, 2, 2, 2, 610, 81, 3, 2, 2, 2, 611, 612, 7, 113, 2, 2, 612, 613, 7, 114, 2, 2, 613, 616, 7, 115, 2, 2, 614, 615, 7, 72, 2, 2, 615, 617, 5, 232, 117, 2, 616, 614, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 625, 3, 2, 2, 2, 618, 619, 7, 8, 2, 2, 619, 626, 5, 96, 49, 2, 620, 623, 7, 32, 2, 2, 621, 622, 7, 8, 2, 2, 622, 624, 5, 96, 49, 2, 623, 621, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 626, 3, 2, 2, 2, 625, 618, 3, 2, 2, 2, 625, 620, 3, 2, 2, 2, 626, 83, 3, 2, 2, 2, 627, 628, 7, 113, 2, 2, 628, 629, 5, 52, 27, 2, 629, 630, 7, 33, 2, 2, 630, 631, 5, 74, 38, 2, 631, 633, 7, 11, 2, 2, 632, 634, 5, 90, 46, 2, 633, 632, 3, 2, 2, 2, 633, 634, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 638, 7, 12, 2, 2, 636, 637, 7, 72, 2, 2, 637, 639, 5, 232, 117, 2, 638, 636, 3, 2, 2, 2, 638, 639, 3, 2, 2, 2, 639, 645, 3, 2, 2, 2, 640, 641, 7, 9, 2, 2, 641, 642, 5, 18, 10, 2, 642, 643, 7, 10, 2, 2, 643, 646, 3, 2, 2, 2, 644, 646, 7, 32, 2, 2, 645, 640, 3, 2, 2, 2, 645, 644, 3, 2, 2, 2, 646, 85, 3, 2, 2, 2, 647, 648, 7, 113, 2, 2, 648, 649, 7, 110, 2, 2, 649, 650, 5, 74, 38, 2, 650, 652, 7, 72, 2, 2, 651, 653, 5, 88, 45, 2, 652, 651, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 655, 5, 96, 49, 2, 655, 87, 3, 2, 2, 2, 656, 657, 7, 34, 2, 2, 657, 663, 7, 35, 2, 2, 658, 659, 7, 34, 2, 2, 659, 663, 7, 36, 2, 2, 660, 661, 7, 128, 2, 2, 661, 663, 7, 37, 2, 2, 662, 656, 3, 2, 2, 2, 662, 658, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 89, 3, 2, 2, 2, 664, 669, 5, 92, 47, 2, 665, 666, 7, 16, 2, 2, 666, 668, 5, 92, 47, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 91, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 7, 2, 2, 673, 676, 5, 74, 38, 2, 674, 675, 7, 72, 2, 2, 675, 677, 5, 232, 117, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 93, 3, 2, 2, 2, 678, 683, 5, 96, 49, 2, 679, 680, 7, 16, 2, 2, 680, 682, 5, 96, 49, 2, 681, 679, 3, 2, 2, 2, 682, 685, 3, 2, 2, 2, 683, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 95, 3, 2, 2, 2, 685, 683, 3, 2, 2, 2, 686, 693, 5, 98, 50, 2, 687, 693, 5, 100, 51, 2, 688, 693, 5, 126, 64, 2, 689, 693, 5, 130, 66, 2, 690, 693, 5, 134, 68, 2, 691, 693, 5, 136, 69, 2, 692, 686, 3, 2, 2, 2, 692, 687, 3, 2, 2, 2, 692, 688, 3, 2, 2, 2, 692, 689, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 692, 691, 3, 2, 2, 2, 693, 97, 3, 2, 2, 2, 694, 703, 5, 122, 62, 2, 695, 703, 5, 140, 71, 2, 696, 703, 5, 216, 109, 2, 697, 703, 5, 218, 110, 2, 698, 703, 5, 220, 111, 2, 699, 703, 5, 222, 112, 2, 700, 703, 5, 224, 113, 2, 701, 703, 5, 226, 114, 2, 702, 694, 3, 2, 2, 2, 702, 695, 3, 2, 2, 2, 702, 696, 3, 2, 2, 2, 702, 697, 3, 2, 2, 2, 702, 698, 3, 2, 2, 2, 702, 699, 3, 2, 2, 2, 702, 700, 3, 2, 2, 2, 702, 701, 3, 2, 2, 2, 703, 99, 3, 2, 2, 2, 704, 707, 5, 102, 52, 2, 705, 707, 5, 106, 54, 2, 706, 704, 3, 2, 2, 2, 706, 705, 3, 2, 2, 2, 707, 716, 3, 2, 2, 2, 708, 715, 5, 102, 52, 2, 709, 715, 5, 106, 54, 2, 710, 715, 5, 110, 56, 2, 711, 715, 5, 112, 57, 2, 712, 715, 5, 116, 59, 2, 713, 715, 5, 120, 61, 2, 714, 708, 3, 2, 2, 2, 714, 709, 3, 2, 2, 2, 714, 710, 3, 2, 2, 2, 714, 711, 3, 2, 2, 2, 714, 712, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 718, 3, 2, 2, 2, 716, 714, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 719, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 719, 720, 7, 69, 2, 2, 720, 721, 5, 96, 49, 2, 721, 101, 3, 2, 2, 2, 722, 723, 7, 63, 2, 2, 723, 728, 5, 104, 53, 2, 724, 725, 7, 16, 2, 2, 725, 727, 5, 104, 53, 2, 726, 724, 3, 2, 2, 2, 727, 730, 3, 2, 2, 2, 728, 726, 3, 2, 2, 2, 728, 729, 3, 2, 2, 2, 729, 103, 3, 2, 2, 2, 730, 728, 3, 2, 2, 2, 731, 734, 5, 194, 98, 2, 732, 733, 7, 72, 2, 2, 733, 735, 5, 232, 117, 2, 734, 732, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 738, 3, 2, 2, 2, 736, 737, 7, 74, 2, 2, 737, 739, 7, 75, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 742, 3, 2, 2, 2, 740, 741, 7, 73, 2, 2, 741, 743, 5, 194, 98, 2, 742, 740, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 745, 7, 71, 2, 2, 745, 746, 5, 96, 49, 2, 746, 105, 3, 2, 2, 2, 747, 748, 7, 64, 2, 2, 748, 753, 5, 108, 55, 2, 749, 750, 7, 16, 2, 2, 750, 752, 5, 108, 55, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 107, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 759, 5, 194, 98, 2, 757, 758, 7, 72, 2, 2, 758, 760, 5, 232, 117, 2, 759, 757, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 7, 8, 2, 2, 762, 763, 5, 96, 49, 2, 763, 109, 3, 2, 2, 2, 764, 765, 7, 65, 2, 2, 765, 766, 5, 96, 49, 2, 766, 111, 3, 2, 2, 2, 767, 768, 7, 66, 2, 2, 768, 769, 7, 67, 2, 2, 769, 774, 5, 114, 58, 2, 770, 771, 7, 16, 2, 2, 771, 773, 5, 114, 58, 2, 772, 770, 3, 2, 2, 2, 773, 776, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 774, 775, 3, 2, 2, 2, 775, 113, 3, 2, 2, 2, 776, 774, 3, 2, 2, 2, 777, 784, 5, 194, 98, 2, 778, 779, 7, 72, 2, 2, 779, 781, 5, 232, 117, 2, 780, 778, 3, 2, 2, 2, 780, 781, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 783, 7, 8, 2, 2, 783, 785, 5, 96, 49, 2, 784, 780, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 788, 3, 2, 2, 2, 786, 787, 7, 83, 2, 2, 787, 789, 5, 250, 126, 2, 788, 786, 3, 2, 2, 2, 788, 789, 3, 2, 2, 2, 789, 115, 3, 2, 2, 2, 790, 791, 7, 68, 2, 2, 791, 796, 7, 67, 2, 2, 792, 793, 7, 77, 2, 2, 793, 794, 7, 68, 2, 2, 794, 796, 7, 67, 2, 2, 795, 790, 3, 2, 2, 2, 795, 792, 3, 2, 2, 2, 796, 797, 3, 2, 2, 2, 797, 802, 5, 118, 60, 2, 798, 799, 7, 16, 2, 2, 799, 801, 5, 118, 60, 2, 800, 798, 3, 2, 2, 2, 801, 804, 3, 2, 2, 2, 802, 800, 3, 2, 2, 2, 802, 803, 3, 2, 2, 2, 803, 117, 3, 2, 2, 2, 804, 802, 3, 2, 2, 2, 805, 808, 5, 96, 49, 2, 806, 809, 7, 78, 2, 2, 807, 809, 7, 79, 2, 2, 808, 806, 3, 2, 2, 2, 808, 807, 3, 2, 2, 2, 808, 809, 3, 2, 2, 2, 809, 815, 3, 2, 2, 2, 810, 813, 7, 75, 2, 2, 811, 814, 7, 84, 2, 2, 812, 814, 7, 85, 2, 2, 813, 811, 3, 2, 2, 2, 813, 812, 3, 2, 2, 2, 814, 816, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 816, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 818, 7, 83, 2, 2, 818, 820, 5, 250, 126, 2, 819, 817, 3, 2, 2, 2, 819, 820, 3, 2, 2, 2, 820, 119, 3, 2, 2, 2, 821, 822, 7, 76, 2, 2, 822, 823, 5, 194, 98, 2, 823, 121, 3, 2, 2, 2, 824, 827, 7, 80, 2, 2, 825, 827, 7, 81, 2, 2, 826, 824, 3, 2, 2, 2, 826, 825, 3, 2, 2, 2, 827, 828, 3, 2, 2, 2, 828, 833, 5, 124, 63, 2, 829, 830, 7, 16, 2, 2, 830, 832, 5, 124, 63, 2, 831, 829, 3, 2, 2, 2, 832, 835, 3, 2, 2, 2, 833, 831, 3, 2, 2, 2, 833, 834, 3, 2, 2, 2, 834, 836, 3, 2, 2, 2, 835, 833, 3, 2, 2, 2, 836, 837, 7, 82, 2, 2, 837, 838, 5, 96, 49, 2, 838, 123, 3, 2, 2, 2, 839, 842, 5, 194, 98, 2, 840, 841, 7, 72, 2, 2, 841, 843, 5, 232, 117, 2, 842, 840, 3, 2, 2, 2, 842, 843, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 7, 71, 2, 2, 845, 846, 5, 96, 49, 2, 846, 125, 3, 2, 2, 2, 847, 848, 7, 86, 2, 2, 848, 849, 7, 11, 2, 2, 849, 850, 5, 94, 48, 2, 850, 852, 7, 12, 2, 2, 851, 853, 5, 128, 65, 2, 852, 851, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 856, 3, 2, 2, 2, 856, 857, 7, 90, 2, 2, 857, 858, 7, 69, 2, 2, 858, 859, 5, 96, 49, 2, 859, 127, 3, 2, 2, 2, 860, 861, 7, 87, 2, 2, 861, 863, 5, 96, 49, 2, 862, 860, 3, 2, 2, 2, 863, 864, 3, 2, 2, 2, 864, 862, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 867, 7, 69, 2, 2, 867, 868, 5, 96, 49, 2, 868, 129, 3, 2, 2, 2, 869, 870, 7, 93, 2, 2, 870, 871, 7, 11, 2, 2, 871, 872, 5, 94, 48, 2, 872, 874, 7, 12, 2, 2, 873, 875, 5, 132, 67, 2, 874, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 874, 3, 2, 2, 2, 876, 877, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 880, 7, 90, 2, 2, 879, 881, 5, 194, 98, 2, 880, 879, 3, 2, 2, 2, 880, 881, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 7, 69, 2, 2, 883, 884, 5, 96, 49, 2, 884, 131, 3, 2, 2, 2, 885, 889, 7, 87, 2, 2, 886, 887, 5, 194, 98, 2, 887, 888, 7, 72, 2, 2, 888, 890, 3, 2, 2, 2, 889, 886, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 891, 3, 2, 2, 2, 891, 896, 5, 232, 117, 2, 892, 893, 7, 14, 2, 2, 893, 895, 5, 232, 117, 2, 894, 892, 3, 2, 2, 2, 895, 898, 3, 2, 2, 2, 896, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 899, 3, 2, 2, 2, 898, 896, 3, 2, 2, 2, 899, 900, 7, 69, 2, 2, 900, 901, 5, 96, 49, 2, 901, 133, 3, 2, 2, 2, 902, 903, 7, 70, 2, 2, 903, 904, 7, 11, 2, 2, 904, 905, 5, 94, 48, 2, 905, 906, 7, 12, 2, 2, 906, 907, 7, 91, 2, 2, 907, 908, 5, 96, 49, 2, 908, 909, 7, 92, 2, 2, 909, 910, 5, 96, 49, 2, 910, 135, 3, 2, 2, 2, 911, 912, 7, 88, 2, 2, 912, 913, 7, 9, 2, 2, 913, 914, 5, 94, 48, 2, 914, 916, 7, 10, 2, 2, 915, 917, 5, 138, 70, 2, 916, 915, 3, 2, 2, 2, 917, 918, 3, 2, 2, 2, 918, 916, 3, 2, 2, 2, 918, 919, 3, 2, 2, 2, 919, 137, 3, 2, 2, 2, 920, 923, 7, 89, 2, 2, 921, 924, 7, 13, 2, 2, 922, 924, 5, 74, 38, 2, 923, 921, 3, 2, 2, 2, 923, 922, 3, 2, 2, 2, 924, 932, 3, 2, 2, 2, 925, 928, 7, 14, 2, 2, 926, 929, 7, 13, 2, 2, 927, 929, 5, 74, 38, 2, 928, 926, 3, 2, 2, 2, 928, 927, 3, 2, 2, 2, 929, 931, 3, 2, 2, 2, 930, 925, 3, 2, 2, 2, 931, 934, 3, 2, 2, 2, 932, 930, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 935, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 935, 936, 7, 9, 2, 2, 936, 937, 5, 94, 48, 2, 937, 938, 7, 10, 2, 2, 938, 139, 3, 2, 2, 2, 939, 944, 5, 142, 72, 2, 940, 941, 7, 94, 2, 2, 941, 943, 5, 142, 72, 2, 942, 940, 3, 2, 2, 2, 943, 946, 3, 2, 2, 2, 944, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 141, 3, 2, 2, 2, 946, 944, 3, 2, 2, 2, 947, 952, 5, 144, 73, 2, 948, 949, 7, 95, 2, 2, 949, 951, 5, 144, 73, 2, 950, 948, 3, 2, 2, 2, 951, 954, 3, 2, 2, 2, 952, 950, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 143, 3, 2, 2, 2, 954, 952, 3, 2, 2, 2, 955, 957, 7, 96, 2, 2, 956, 955, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 3, 2, 2, 2, 958, 959, 5, 146, 74, 2, 959, 145, 3, 2, 2, 2, 960, 963, 5, 148, 75, 2, 961, 962, 9, 5, 2, 2, 962, 964, 5, 148, 75, 2, 963, 961, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 964, 147, 3, 2, 2, 2, 965, 970, 5, 150, 76, 2, 966, 967, 7, 49, 2, 2, 967, 969, 5, 150, 76, 2, 968, 966, 3, 2, 2, 2, 969, 972, 3, 2, 2, 2, 970, 968, 3, 2, 2, 2, 970, 971, 3, 2, 2, 2, 971, 149, 3, 2, 2, 2, 972, 970, 3, 2, 2, 2, 973, 976, 5, 152, 77, 2, 974, 975, 7, 97, 2, 2, 975, 977, 5, 152, 77, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 151, 3, 2, 2, 2, 978, 983, 5, 154, 78, 2, 979, 980, 9, 6, 2, 2, 980, 982, 5, 154, 78, 2, 981, 979, 3, 2, 2, 2, 982, 985, 3, 2, 2, 2, 983, 981, 3, 2, 2, 2, 983, 984, 3, 2, 2, 2, 984, 153, 3, 2, 2, 2, 985, 983, 3, 2, 2, 2, 986, 991, 5, 156, 79, 2, 987, 988, 9, 7, 2, 2, 988, 990, 5, 156, 79, 2, 989, 987, 3, 2, 2, 2, 990, 993, 3, 2, 2, 2, 991, 989, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 155, 3, 2, 2, 2, 993, 991, 3, 2, 2, 2, 994, 998, 5, 158, 80, 2, 995, 996, 7, 98, 2, 2, 996, 997, 7, 99, 2, 2, 997, 999, 5, 232, 117, 2, 998, 995, 3, 2, 2, 2, 998, 999, 3, 2, 2, 2, 999, 157, 3, 2, 2, 2, 1000, 1004, 5, 160, 81, 2, 1001, 1002, 7, 101, 2, 2, 1002, 1003, 7, 100, 2, 2, 1003, 1005, 5, 232, 117, 2, 1004, 1001, 3, 2, 2, 2, 1004, 1005, 3, 2, 2, 2, 1005, 159, 3, 2, 2, 2, 1006, 1010, 5, 162, 82, 2, 1007, 1008, 7, 102, 2, 2, 1008, 1009, 7, 72, 2, 2, 1009, 1011, 5, 232, 117, 2, 1010, 1007, 3, 2, 2, 2, 1010, 1011, 3, 2, 2, 2, 1011, 161, 3, 2, 2, 2, 1012, 1016, 5, 164, 83, 2, 1013, 1014, 7, 104, 2, 2, 1014, 1015, 7, 72, 2, 2, 1015, 1017, 5, 244, 123, 2, 1016, 1013, 3, 2, 2, 2, 1016, 1017, 3, 2, 2, 2, 1017, 163, 3, 2, 2, 2, 1018, 1022, 5, 166, 84, 2, 1019, 1020, 7, 103, 2, 2, 1020, 1021, 7, 72, 2, 2, 1021, 1023, 5, 244, 123, 2, 1022, 1019, 3, 2, 2, 2, 1022, 1023, 3, 2, 2, 2, 1023, 165, 3, 2, 2, 2, 1024, 1033, 5, 170, 86, 2, 1025, 1026, 7, 6, 2, 2, 1026, 1027, 7, 47, 2, 2, 1027, 1028, 3, 2, 2, 2, 1028, 1029, 5, 168, 85, 2, 1029, 1030, 5, 206, 104, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1025, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 167, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1040, 5, 74, 38, 2, 1037, 1040, 5, 194, 98, 2, 1038, 1040, 5, 196, 99, 2, 1039, 1036, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1038, 3, 2, 2, 2, 1040, 169, 3, 2, 2, 2, 1041, 1043, 9, 6, 2, 2, 1042, 1041, 3, 2, 2, 2, 1043, 1046, 3, 2, 2, 2, 1044, 1042, 3, 2, 2, 2, 1044, 1045, 3, 2, 2, 2, 1045, 1047, 3, 2, 2, 2, 1046, 1044, 3, 2, 2, 2, 1047, 1048, 5, 172, 87, 2, 1048, 171, 3, 2, 2, 2, 1049, 1053, 5, 178, 90, 2, 1050, 1053, 5, 174, 88, 2, 1051, 1053, 5, 176, 89, 2, 1052, 1049, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1051, 3, 2, 2, 2, 1053, 173, 3, 2, 2, 2, 1054, 1055, 7, 111, 2, 2, 1055, 1056, 7, 110, 2, 2, 1056, 1057, 5, 232, 117, 2, 1057, 1058, 7, 9, 2, 2, 1058, 1059, 5, 94, 48, 2, 1059, 1060, 7, 10, 2, 2, 1060, 175, 3, 2, 2, 2, 1061, 1062, 7, 112, 2, 2, 1062, 1063, 7, 110, 2, 2, 1063, 1064, 5, 232, 117, 2, 1064, 1065, 7, 9, 2, 2, 1065, 1066, 5, 94, 48, 2, 1066, 1067, 7, 10, 2, 2, 1067, 177, 3, 2, 2, 2, 1068, 1073, 5, 180, 91, 2, 1069, 1070, 7, 55, 2, 2, 1070, 1072, 5, 180, 91, 2, 1071, 1069, 3, 2, 2, 2, 1072, 1075, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 179, 3, 2, 2, 2, 1075, 1073, 3, 2, 2, 2, 1076, 1084, 5, 190, 96, 2, 1077, 1083, 5, 182, 92, 2, 1078, 1083, 5, 186, 94, 2, 1079, 1083, 5, 188, 95, 2, 1080, 1083, 5, 184, 93, 2, 1081, 1083, 5, 206, 104, 2, 1082, 1077, 3, 2, 2, 2, 1082, 1078, 3, 2, 2, 2, 1082, 1079, 3, 2, 2, 2, 1082, 1080, 3, 2, 2, 2, 1082, 1081, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 181, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1088, 7, 56, 2, 2, 1088, 1089, 7, 56, 2, 2, 1089, 1090, 5, 94, 48, 2, 1090, 1091, 7, 57, 2, 2, 1091, 1092, 7, 57, 2, 2, 1092, 183, 3, 2, 2, 2, 1093, 1094, 7, 56, 2, 2, 1094, 1095, 7, 57, 2, 2, 1095, 185, 3, 2, 2, 2, 1096, 1097, 7, 56, 2, 2, 1097, 1098, 5, 94, 48, 2, 1098, 1099, 7, 57, 2, 2, 1099, 187, 3, 2, 2, 2, 1100, 1107, 7, 58, 2, 2, 1101, 1108, 5, 254, 128, 2, 1102, 1108, 5, 252, 127, 2, 1103, 1108, 7, 145, 2, 2, 1104, 1108, 5, 196, 99, 2, 1105, 1108, 5, 194, 98, 2, 1106, 1108, 5, 198, 100, 2, 1107, 1101, 3, 2, 2, 2, 1107, 1102, 3, 2, 2, 2, 1107, 1103, 3, 2, 2, 2, 1107, 1104, 3, 2, 2, 2, 1107, 1105, 3, 2, 2, 2, 1107, 1106, 3, 2, 2, 2, 1108, 189, 3, 2, 2, 2, 1109, 1125, 7, 138, 2, 2, 1110, 1125, 7, 108, 2, 2, 1111, 1125, 7, 109, 2, 2, 1112, 1125, 7, 139, 2, 2, 1113, 1125, 5, 252, 127, 2, 1114, 1125, 5, 194, 98, 2, 1115, 1125, 5, 196, 99, 2, 1116, 1125, 5, 198, 100, 2, 1117, 1125, 5, 234, 118, 2, 1118, 1125, 5, 204, 103, 2, 1119, 1125, 5, 200, 101, 2, 1120, 1125, 5, 202, 102, 2, 1121, 1125, 5, 248, 125, 2, 1122, 1125, 5, 210, 106, 2, 1123, 1125, 5, 192, 97, 2, 1124, 1109, 3, 2, 2, 2, 1124, 1110, 3, 2, 2, 2, 1124, 1111, 3, 2, 2, 2, 1124, 1112, 3, 2, 2, 2, 1124, 1113, 3, 2, 2, 2, 1124, 1114, 3, 2, 2, 2, 1124, 1115, 3, 2, 2, 2, 1124, 1116, 3, 2, 2, 2, 1124, 1117, 3, 2, 2, 2, 1124, 1118, 3, 2, 2, 2, 1124, 1119, 3, 2, 2, 2, 1124, 1120, 3, 2, 2, 2, 1124, 1121, 3, 2, 2, 2, 1124, 1122, 3, 2, 2, 2, 1124, 1123, 3, 2, 2, 2, 1125, 191, 3, 2, 2, 2, 1126, 1127, 7, 9, 2, 2, 1127, 1128, 5, 16, 9, 2, 1128, 1129, 7, 10, 2, 2, 1129, 193, 3, 2, 2, 2, 1130, 1131, 7, 7, 2, 2, 1131, 1132, 5, 74, 38, 2, 1132, 195, 3, 2, 2, 2, 1133, 1135, 7, 11, 2, 2, 1134, 1136, 5, 94, 48, 2, 1135, 1134, 3, 2, 2, 2, 1135, 1136, 3, 2, 2, 2, 1136, 1137, 3, 2, 2, 2, 1137, 1138, 7, 12, 2, 2, 1138, 197, 3, 2, 2, 2, 1139, 1140, 7, 59, 2, 2, 1140, 199, 3, 2, 2, 2, 1141, 1142, 7, 18, 2, 2, 1142, 1143, 7, 9, 2, 2, 1143, 1144, 5, 94, 48, 2, 1144, 1145, 7, 10, 2, 2, 1145, 201, 3, 2, 2, 2, 1146, 1147, 7, 107, 2, 2, 1147, 1148, 7, 9, 2, 2, 1148, 1149, 5, 94, 48, 2, 1149, 1150, 7, 10, 2, 2, 1150, 203, 3, 2, 2, 2, 1151, 1152, 5, 74, 38, 2, 1152, 1153, 5, 206, 104, 2, 1153, 205, 3, 2, 2, 2, 1154, 1161, 7, 11, 2, 2, 1155, 1157, 5, 208, 105, 2, 1156, 1158, 7, 16, 2, 2, 1157, 1156, 3, 2, 2, 2, 1157, 1158, 3, 2, 2, 2, 1158, 1160, 3, 2, 2, 2, 1159, 1155, 3, 2, 2, 2, 1160, 1163, 3, 2, 2, 2, 1161, 1159, 3, 2, 2, 2, 1161, 1162, 3, 2, 2, 2, 1162, 1164, 3, 2, 2, 2, 1163, 1161, 3, 2, 2, 2, 1164, 1165, 7, 12, 2, 2, 1165, 207, 3, 2, 2, 2, 1166, 1169, 5, 96, 49, 2, 1167, 1169, 7, 137, 2, 2, 1168, 1166, 3, 2, 2, 2, 1168, 1167, 3, 2, 2, 2, 1169, 209, 3, 2, 2, 2, 1170, 1173, 5, 212, 107, 2, 1171, 1173, 5, 214, 108, 2, 1172, 1170, 3, 2, 2, 2, 1172, 1171, 3, 2, 2, 2, 1173, 211, 3, 2, 2, 2, 1174, 1175, 5, 74, 38, 2, 1175, 1176, 7, 60, 2, 2, 1176, 1177, 7, 139, 2, 2, 1177, 213, 3, 2, 2, 2, 1178, 1179, 5, 52, 27, 2, 1179, 1180, 7, 33, 2, 2, 1180, 1182, 7, 11, 2, 2, 1181, 1183, 5, 90, 46, 2, 1182, 1181, 3, 2, 2, 2, 1182, 1183, 3, 2, 2, 2, 1183, 1184, 3, 2, 2, 2, 1184, 1187, 7, 12, 2, 2, 1185, 1186, 7, 72, 2, 2, 1186, 1188, 5, 232, 117, 2, 1187, 1185, 3, 2, 2, 2, 1187, 1188, 3, 2, 2, 2, 1188, 1189, 3, 2, 2, 2, 1189, 1190, 7, 9, 2, 2, 1190, 1191, 5, 18, 10, 2, 1191, 1192, 7, 10, 2, 2, 1192, 215, 3, 2, 2, 2, 1193, 1194, 7, 117, 2, 2, 1194, 1195, 7, 128, 2, 2, 1195, 1196, 5, 96, 49, 2, 1196, 1197, 7, 124, 2, 2, 1197, 1201, 5, 96, 49, 2, 1198, 1199, 7, 73, 2, 2, 1199, 1200, 7, 127, 2, 2, 1200, 1202, 5, 96, 49, 2, 1201, 1198, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1217, 3, 2, 2, 2, 1203, 1204, 7, 117, 2, 2, 1204, 1205, 7, 128, 2, 2, 1205, 1210, 5, 246, 124, 2, 1206, 1207, 7, 16, 2, 2, 1207, 1209, 5, 246, 124, 2, 1208, 1206, 3, 2, 2, 2, 1209, 1212, 3, 2, 2, 2, 1210, 1208, 3, 2, 2, 2, 1210, 1211, 3, 2, 2, 2, 1211, 1213, 3, 2, 2, 2, 1212, 1210, 3, 2, 2, 2, 1213, 1214, 7, 124, 2, 2, 1214, 1215, 5, 96, 49, 2, 1215, 1217, 3, 2, 2, 2, 1216, 1193, 3, 2, 2, 2, 1216, 1203, 3, 2, 2, 2, 1217, 217, 3, 2, 2, 2, 1218, 1219, 7, 118, 2, 2, 1219, 1220, 7, 128, 2, 2, 1220, 1221, 5, 228, 115, 2, 1221, 219, 3, 2, 2, 2, 1222, 1223, 7, 119, 2, 2, 1223, 1224, 7, 128, 2, 2, 1224, 1225, 5, 228, 115, 2, 1225, 1226, 7, 72, 2, 2, 1226, 1227, 5, 96, 49, 2, 1227, 221, 3, 2, 2, 2, 1228, 1229, 7, 120, 2, 2, 1229, 1230, 7, 125, 2, 2, 1230, 1231, 7, 99, 2, 2, 1231, 1232, 7, 128, 2, 2, 1232, 1233, 5, 228, 115, 2, 1233, 1234, 7, 126, 2, 2, 1234, 1235, 5, 96, 49, 2, 1235, 223, 3, 2, 2, 2, 1236, 1237, 7, 121, 2, 2, 1237, 1242, 5, 230, 116, 2, 1238, 1239, 7, 16, 2, 2, 1239, 1241, 5, 230, 116, 2, 1240, 1238, 3, 2, 2, 2, 1241, 1244, 3, 2, 2, 2, 1242, 1240, 3, 2, 2, 2, 1242, 1243, 3, 2, 2, 2, 1243, 1245, 3, 2, 2, 2, 1244, 1242, 3, 2, 2, 2, 1245, 1246, 7, 122, 2, 2, 1246, 1247, 5, 96, 49, 2, 1247, 1248, 7, 69, 2, 2, 1248, 1249, 5, 96, 49, 2, 1249, 225, 3, 2, 2, 2, 1250, 1251, 7, 123, 2, 2, 1251, 1252, 7, 128, 2, 2, 1252, 1253, 5, 96, 49, 2, 1253, 1254, 7, 124, 2, 2, 1254, 1255, 5, 96, 49, 2, 1255, 227, 3, 2, 2, 2, 1256, 1259, 5, 190, 96, 2, 1257, 1260, 5, 182, 92, 2, 1258, 1260, 5, 188, 95, 2, 1259, 1257, 3, 2, 2, 2, 1259, 1258, 3, 2, 2, 2, 1260, 1261, 3, 2, 2, 2, 1261, 1259, 3, 2, 2, 2, 1261, 1262, 3, 2, 2, 2, 1262, 229, 3, 2, 2, 2, 1263, 1264, 5, 194, 98, 2, 1264, 1265, 7, 8, 2, 2, 1265, 1266, 5, 96, 49, 2, 1266, 231, 3, 2, 2, 2, 1267, 1268, 7, 11, 2, 2, 1268, 1276, 7, 12, 2, 2, 1269, 1273, 5, 236, 119, 2, 1270, 1274, 7, 137, 2, 2, 1271, 1274, 7, 13, 2, 2, 1272, 1274, 7, 50, 2, 2, 1273, 1270, 3, 2, 2, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1273, 1274, 3, 2, 2, 2, 1274, 1276, 3, 2, 2, 2, 1275, 1267, 3, 2, 2, 2, 1275, 1269, 3, 2, 2, 2, 1276, 233, 3, 2, 2, 2, 1277, 1286, 7, 9, 2, 2, 1278, 1283, 5, 246, 124, 2, 1279, 1280, 7, 16, 2, 2, 1280, 1282, 5, 246, 124, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1285, 3, 2, 2, 2, 1283, 1281, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1287, 3, 2, 2, 2, 1285, 1283, 3, 2, 2, 2, 1286, 1278, 3, 2, 2, 2, 1286, 1287, 3, 2, 2, 2, 1287, 1288, 3, 2, 2, 2, 1288, 1294, 7, 10, 2, 2, 1289, 1290, 7, 61, 2, 2, 1290, 1291, 5, 94, 48, 2, 1291, 1292, 7, 62, 2, 2, 1292, 1294, 3, 2, 2, 2, 1293, 1277, 3, 2, 2, 2, 1293, 1289, 3, 2, 2, 2, 1294, 235, 3, 2, 2, 2, 1295, 1299, 5, 74, 38, 2, 1296, 1299, 7, 138, 2, 2, 1297, 1299, 5, 238, 120, 2, 1298, 1295, 3, 2, 2, 2, 1298, 1296, 3, 2, 2, 2, 1298, 1297, 3, 2, 2, 2, 1299, 237, 3, 2, 2, 2, 1300, 1303, 5, 240, 121, 2, 1301, 1303, 5, 242, 122, 2, 1302, 1300, 3, 2, 2, 2, 1302, 1301, 3, 2, 2, 2, 1303, 239, 3, 2, 2, 2, 1304, 1305, 7, 33, 2, 2, 1305, 1306, 7, 11, 2, 2, 1306, 1307, 7, 13, 2, 2, 1307, 1308, 7, 12, 2, 2, 1308, 241, 3, 2, 2, 2, 1309, 1310, 7, 33, 2, 2, 1310, 1319, 7, 11, 2, 2, 1311, 1316, 5, 232, 117, 2, 1312, 1313, 7, 16, 2, 2, 1313, 1315, 5, 232, 117, 2, 1314, 1312, 3, 2, 2, 2, 1315, 1318, 3, 2, 2, 2, 1316, 1314, 3, 2, 2, 2, 1316, 1317, 3, 2, 2, 2, 1317, 1320, 3, 2, 2, 2, 1318, 1316, 3, 2, 2, 2, 1319, 1311, 3, 2, 2, 2, 1319, 1320, 3, 2, 2, 2, 1320, 1321, 3, 2, 2, 2, 1321, 1322, 7, 12, 2, 2, 1322, 1323, 7, 72, 2, 2, 1323, 1324, 5, 232, 117, 2, 1324, 243, 3, 2, 2, 2, 1325, 1327, 5, 236, 119, 2, 1326, 1328, 7, 137, 2, 2, 1327, 1326, 3, 2, 2, 2, 1327, 1328, 3, 2, 2, 2, 1328, 245, 3, 2, 2, 2, 1329, 1332, 5, 96, 49, 2, 1330, 1332, 7, 145, 2, 2, 1331, 1329, 3, 2, 2, 2, 1331, 1330, 3, 2, 2, 2, 1332, 1333, 3, 2, 2, 2, 1333, 1334, 9, 8, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 247, 3, 2, 2, 2, 1336, 1338, 7, 56, 2, 2, 1337, 1339, 5, 94, 48, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1340, 3, 2, 2, 2, 1340, 1341, 7, 57, 2, 2, 1341, 249, 3, 2, 2, 2, 1342, 1343, 5, 252, 127, 2, 1343, 251, 3, 2, 2, 2, 1344, 1345, 7, 136, 2, 2, 1345, 253, 3, 2, 2, 2, 1346, 1347, 9, 9, 2, 2, 1347, 255, 3, 2, 2, 2, 135, 264, 268, 284, 290, 298, 306, 314, 329, 359, 367, 369, 391, 401, 411, 416, 421, 425, 437, 441, 450, 457, 471, 475, 478, 483, 493, 501, 505, 517, 529, 551, 559, 564, 567, 571, 580, 589, 592, 600, 607, 609, 616, 623, 625, 633, 638, 645, 652, 662, 669, 676, 683, 692, 702, 706, 714, 716, 728, 734, 738, 742, 753, 759, 774, 780, 784, 788, 795, 802, 808, 813, 815, 819, 826, 833, 842, 854, 864, 876, 880, 889, 896, 918, 923, 928, 932, 944, 952, 956, 963, 970, 976, 983, 991, 998, 1004, 1010, 1016, 1022, 1033, 1039, 1044, 1052, 1073, 1082, 1084, 1107, 1124, 1135, 1157, 1161, 1168, 1172, 1182, 1187, 1201, 1210, 1216, 1242, 1259, 1261, 1273, 1275, 1283, 1286, 1293, 1298, 1302, 1316, 1319, 1327, 1331, 1338] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.tokens b/src/main/java/org/rumbledb/parser/Jsoniq.tokens index 74d3a280cf..90fc814284 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens +++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens @@ -121,27 +121,28 @@ Kmodify=120 Kappend=121 Kinto=122 Kvalue=123 -Kjson=124 -Kwith=125 -Kposition=126 -Kbreak=127 -Kloop=128 -Kcontinue=129 -Kexit=130 -Kreturning=131 -Kwhile=132 -STRING=133 -ArgumentPlaceholder=134 -NullLiteral=135 -Literal=136 -NumericLiteral=137 -IntegerLiteral=138 -DecimalLiteral=139 -DoubleLiteral=140 -WS=141 -NCName=142 -XQComment=143 -ContentChar=144 +Kwith=124 +Kposition=125 +Kjson=126 +Kupdating=127 +Kbreak=128 +Kloop=129 +Kcontinue=130 +Kexit=131 +Kreturning=132 +Kwhile=133 +STRING=134 +ArgumentPlaceholder=135 +NullLiteral=136 +Literal=137 +NumericLiteral=138 +IntegerLiteral=139 +DecimalLiteral=140 +DoubleLiteral=141 +WS=142 +NCName=143 +XQComment=144 +ContentChar=145 ';'=1 'module'=2 'namespace'=3 @@ -265,14 +266,15 @@ ContentChar=144 'append'=121 'into'=122 'value'=123 -'json'=124 -'with'=125 -'position'=126 -'break'=127 -'loop'=128 -'continue'=129 -'exit'=130 -'returning'=131 -'while'=132 -'?'=134 -'null'=135 +'with'=124 +'position'=125 +'json'=126 +'updating'=127 +'break'=128 +'loop'=129 +'continue'=130 +'exit'=131 +'returning'=132 +'while'=133 +'?'=135 +'null'=136 diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp index 0d02ed8f1b..c72c3c8cdf 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp @@ -123,9 +123,10 @@ null 'append' 'into' 'value' -'json' 'with' 'position' +'json' +'updating' 'break' 'loop' 'continue' @@ -270,9 +271,10 @@ Kmodify Kappend Kinto Kvalue -Kjson Kwith Kposition +Kjson +Kupdating Kbreak Kloop Kcontinue @@ -416,9 +418,10 @@ Kmodify Kappend Kinto Kvalue -Kjson Kwith Kposition +Kjson +Kupdating Kbreak Kloop Kcontinue @@ -452,4 +455,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 146, 1198, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 7, 134, 1084, 10, 134, 12, 134, 14, 134, 1087, 11, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 5, 135, 1094, 10, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 5, 141, 1116, 10, 141, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 7, 143, 1125, 10, 143, 12, 143, 14, 143, 1128, 11, 143, 5, 143, 1130, 10, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 7, 144, 1137, 10, 144, 12, 144, 14, 144, 1140, 11, 144, 5, 144, 1142, 10, 144, 5, 144, 1144, 10, 144, 3, 144, 3, 144, 5, 144, 1148, 10, 144, 3, 144, 3, 144, 3, 145, 6, 145, 1153, 10, 145, 13, 145, 14, 145, 1154, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 7, 147, 1163, 10, 147, 12, 147, 14, 147, 1166, 11, 147, 3, 148, 5, 148, 1169, 10, 148, 3, 149, 3, 149, 5, 149, 1173, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 7, 150, 1183, 10, 150, 12, 150, 14, 150, 1186, 11, 150, 3, 150, 6, 150, 1189, 10, 150, 13, 150, 14, 150, 1190, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 2, 2, 152, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 2, 271, 2, 273, 2, 275, 136, 277, 137, 279, 138, 281, 139, 283, 140, 285, 141, 287, 142, 289, 2, 291, 143, 293, 144, 295, 2, 297, 2, 299, 145, 301, 146, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1210, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 3, 303, 3, 2, 2, 2, 5, 305, 3, 2, 2, 2, 7, 312, 3, 2, 2, 2, 9, 322, 3, 2, 2, 2, 11, 324, 3, 2, 2, 2, 13, 326, 3, 2, 2, 2, 15, 329, 3, 2, 2, 2, 17, 331, 3, 2, 2, 2, 19, 333, 3, 2, 2, 2, 21, 335, 3, 2, 2, 2, 23, 337, 3, 2, 2, 2, 25, 339, 3, 2, 2, 2, 27, 341, 3, 2, 2, 2, 29, 343, 3, 2, 2, 2, 31, 345, 3, 2, 2, 2, 33, 354, 3, 2, 2, 2, 35, 362, 3, 2, 2, 2, 37, 377, 3, 2, 2, 2, 39, 379, 3, 2, 2, 2, 41, 397, 3, 2, 2, 2, 43, 416, 3, 2, 2, 2, 45, 425, 3, 2, 2, 2, 47, 436, 3, 2, 2, 2, 49, 440, 3, 2, 2, 2, 51, 448, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 469, 3, 2, 2, 2, 57, 475, 3, 2, 2, 2, 59, 493, 3, 2, 2, 2, 61, 500, 3, 2, 2, 2, 63, 509, 3, 2, 2, 2, 65, 518, 3, 2, 2, 2, 67, 525, 3, 2, 2, 2, 69, 533, 3, 2, 2, 2, 71, 541, 3, 2, 2, 2, 73, 548, 3, 2, 2, 2, 75, 551, 3, 2, 2, 2, 77, 554, 3, 2, 2, 2, 79, 557, 3, 2, 2, 2, 81, 560, 3, 2, 2, 2, 83, 563, 3, 2, 2, 2, 85, 566, 3, 2, 2, 2, 87, 569, 3, 2, 2, 2, 89, 571, 3, 2, 2, 2, 91, 574, 3, 2, 2, 2, 93, 576, 3, 2, 2, 2, 95, 579, 3, 2, 2, 2, 97, 582, 3, 2, 2, 2, 99, 584, 3, 2, 2, 2, 101, 586, 3, 2, 2, 2, 103, 590, 3, 2, 2, 2, 105, 595, 3, 2, 2, 2, 107, 599, 3, 2, 2, 2, 109, 601, 3, 2, 2, 2, 111, 603, 3, 2, 2, 2, 113, 605, 3, 2, 2, 2, 115, 607, 3, 2, 2, 2, 117, 610, 3, 2, 2, 2, 119, 612, 3, 2, 2, 2, 121, 615, 3, 2, 2, 2, 123, 618, 3, 2, 2, 2, 125, 622, 3, 2, 2, 2, 127, 626, 3, 2, 2, 2, 129, 632, 3, 2, 2, 2, 131, 638, 3, 2, 2, 2, 133, 641, 3, 2, 2, 2, 135, 647, 3, 2, 2, 2, 137, 654, 3, 2, 2, 2, 139, 657, 3, 2, 2, 2, 141, 660, 3, 2, 2, 2, 143, 663, 3, 2, 2, 2, 145, 666, 3, 2, 2, 2, 147, 675, 3, 2, 2, 2, 149, 681, 3, 2, 2, 2, 151, 687, 3, 2, 2, 2, 153, 694, 3, 2, 2, 2, 155, 704, 3, 2, 2, 2, 157, 715, 3, 2, 2, 2, 159, 720, 3, 2, 2, 2, 161, 726, 3, 2, 2, 2, 163, 736, 3, 2, 2, 2, 165, 746, 3, 2, 2, 2, 167, 755, 3, 2, 2, 2, 169, 761, 3, 2, 2, 2, 171, 768, 3, 2, 2, 2, 173, 773, 3, 2, 2, 2, 175, 777, 3, 2, 2, 2, 177, 783, 3, 2, 2, 2, 179, 791, 3, 2, 2, 2, 181, 796, 3, 2, 2, 2, 183, 801, 3, 2, 2, 2, 185, 812, 3, 2, 2, 2, 187, 815, 3, 2, 2, 2, 189, 819, 3, 2, 2, 2, 191, 823, 3, 2, 2, 2, 193, 826, 3, 2, 2, 2, 195, 835, 3, 2, 2, 2, 197, 838, 3, 2, 2, 2, 199, 849, 3, 2, 2, 2, 201, 852, 3, 2, 2, 2, 203, 858, 3, 2, 2, 2, 205, 863, 3, 2, 2, 2, 207, 872, 3, 2, 2, 2, 209, 880, 3, 2, 2, 2, 211, 887, 3, 2, 2, 2, 213, 897, 3, 2, 2, 2, 215, 902, 3, 2, 2, 2, 217, 908, 3, 2, 2, 2, 219, 913, 3, 2, 2, 2, 221, 922, 3, 2, 2, 2, 223, 931, 3, 2, 2, 2, 225, 939, 3, 2, 2, 2, 227, 947, 3, 2, 2, 2, 229, 952, 3, 2, 2, 2, 231, 961, 3, 2, 2, 2, 233, 968, 3, 2, 2, 2, 235, 975, 3, 2, 2, 2, 237, 982, 3, 2, 2, 2, 239, 990, 3, 2, 2, 2, 241, 995, 3, 2, 2, 2, 243, 1002, 3, 2, 2, 2, 245, 1009, 3, 2, 2, 2, 247, 1014, 3, 2, 2, 2, 249, 1020, 3, 2, 2, 2, 251, 1025, 3, 2, 2, 2, 253, 1030, 3, 2, 2, 2, 255, 1039, 3, 2, 2, 2, 257, 1045, 3, 2, 2, 2, 259, 1050, 3, 2, 2, 2, 261, 1059, 3, 2, 2, 2, 263, 1064, 3, 2, 2, 2, 265, 1074, 3, 2, 2, 2, 267, 1080, 3, 2, 2, 2, 269, 1090, 3, 2, 2, 2, 271, 1095, 3, 2, 2, 2, 273, 1101, 3, 2, 2, 2, 275, 1103, 3, 2, 2, 2, 277, 1105, 3, 2, 2, 2, 279, 1110, 3, 2, 2, 2, 281, 1115, 3, 2, 2, 2, 283, 1117, 3, 2, 2, 2, 285, 1129, 3, 2, 2, 2, 287, 1143, 3, 2, 2, 2, 289, 1152, 3, 2, 2, 2, 291, 1156, 3, 2, 2, 2, 293, 1160, 3, 2, 2, 2, 295, 1168, 3, 2, 2, 2, 297, 1172, 3, 2, 2, 2, 299, 1174, 3, 2, 2, 2, 301, 1196, 3, 2, 2, 2, 303, 304, 7, 61, 2, 2, 304, 4, 3, 2, 2, 2, 305, 306, 7, 111, 2, 2, 306, 307, 7, 113, 2, 2, 307, 308, 7, 102, 2, 2, 308, 309, 7, 119, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 103, 2, 2, 311, 6, 3, 2, 2, 2, 312, 313, 7, 112, 2, 2, 313, 314, 7, 99, 2, 2, 314, 315, 7, 111, 2, 2, 315, 316, 7, 103, 2, 2, 316, 317, 7, 117, 2, 2, 317, 318, 7, 114, 2, 2, 318, 319, 7, 99, 2, 2, 319, 320, 7, 101, 2, 2, 320, 321, 7, 103, 2, 2, 321, 8, 3, 2, 2, 2, 322, 323, 7, 63, 2, 2, 323, 10, 3, 2, 2, 2, 324, 325, 7, 38, 2, 2, 325, 12, 3, 2, 2, 2, 326, 327, 7, 60, 2, 2, 327, 328, 7, 63, 2, 2, 328, 14, 3, 2, 2, 2, 329, 330, 7, 125, 2, 2, 330, 16, 3, 2, 2, 2, 331, 332, 7, 127, 2, 2, 332, 18, 3, 2, 2, 2, 333, 334, 7, 42, 2, 2, 334, 20, 3, 2, 2, 2, 335, 336, 7, 43, 2, 2, 336, 22, 3, 2, 2, 2, 337, 338, 7, 44, 2, 2, 338, 24, 3, 2, 2, 2, 339, 340, 7, 126, 2, 2, 340, 26, 3, 2, 2, 2, 341, 342, 7, 39, 2, 2, 342, 28, 3, 2, 2, 2, 343, 344, 7, 46, 2, 2, 344, 30, 3, 2, 2, 2, 345, 346, 7, 113, 2, 2, 346, 347, 7, 116, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 103, 2, 2, 349, 350, 7, 116, 2, 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 105, 2, 2, 353, 32, 3, 2, 2, 2, 354, 355, 7, 113, 2, 2, 355, 356, 7, 116, 2, 2, 356, 357, 7, 102, 2, 2, 357, 358, 7, 103, 2, 2, 358, 359, 7, 116, 2, 2, 359, 360, 7, 103, 2, 2, 360, 361, 7, 102, 2, 2, 361, 34, 3, 2, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 103, 2, 2, 364, 365, 7, 101, 2, 2, 365, 366, 7, 107, 2, 2, 366, 367, 7, 111, 2, 2, 367, 368, 7, 99, 2, 2, 368, 369, 7, 110, 2, 2, 369, 370, 7, 47, 2, 2, 370, 371, 7, 104, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 116, 2, 2, 373, 374, 7, 111, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 118, 2, 2, 376, 36, 3, 2, 2, 2, 377, 378, 7, 60, 2, 2, 378, 38, 3, 2, 2, 2, 379, 380, 7, 102, 2, 2, 380, 381, 7, 103, 2, 2, 381, 382, 7, 101, 2, 2, 382, 383, 7, 107, 2, 2, 383, 384, 7, 111, 2, 2, 384, 385, 7, 99, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 47, 2, 2, 387, 388, 7, 117, 2, 2, 388, 389, 7, 103, 2, 2, 389, 390, 7, 114, 2, 2, 390, 391, 7, 99, 2, 2, 391, 392, 7, 116, 2, 2, 392, 393, 7, 99, 2, 2, 393, 394, 7, 118, 2, 2, 394, 395, 7, 113, 2, 2, 395, 396, 7, 116, 2, 2, 396, 40, 3, 2, 2, 2, 397, 398, 7, 105, 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 119, 2, 2, 401, 402, 7, 114, 2, 2, 402, 403, 7, 107, 2, 2, 403, 404, 7, 112, 2, 2, 404, 405, 7, 105, 2, 2, 405, 406, 7, 47, 2, 2, 406, 407, 7, 117, 2, 2, 407, 408, 7, 103, 2, 2, 408, 409, 7, 114, 2, 2, 409, 410, 7, 99, 2, 2, 410, 411, 7, 116, 2, 2, 411, 412, 7, 99, 2, 2, 412, 413, 7, 118, 2, 2, 413, 414, 7, 113, 2, 2, 414, 415, 7, 116, 2, 2, 415, 42, 3, 2, 2, 2, 416, 417, 7, 107, 2, 2, 417, 418, 7, 112, 2, 2, 418, 419, 7, 104, 2, 2, 419, 420, 7, 107, 2, 2, 420, 421, 7, 112, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 118, 2, 2, 423, 424, 7, 123, 2, 2, 424, 44, 3, 2, 2, 2, 425, 426, 7, 111, 2, 2, 426, 427, 7, 107, 2, 2, 427, 428, 7, 112, 2, 2, 428, 429, 7, 119, 2, 2, 429, 430, 7, 117, 2, 2, 430, 431, 7, 47, 2, 2, 431, 432, 7, 117, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 105, 2, 2, 434, 435, 7, 112, 2, 2, 435, 46, 3, 2, 2, 2, 436, 437, 7, 80, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 80, 2, 2, 439, 48, 3, 2, 2, 2, 440, 441, 7, 114, 2, 2, 441, 442, 7, 103, 2, 2, 442, 443, 7, 116, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 103, 2, 2, 445, 446, 7, 112, 2, 2, 446, 447, 7, 118, 2, 2, 447, 50, 3, 2, 2, 2, 448, 449, 7, 114, 2, 2, 449, 450, 7, 103, 2, 2, 450, 451, 7, 116, 2, 2, 451, 452, 7, 47, 2, 2, 452, 453, 7, 111, 2, 2, 453, 454, 7, 107, 2, 2, 454, 455, 7, 110, 2, 2, 455, 456, 7, 110, 2, 2, 456, 457, 7, 103, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 124, 2, 2, 459, 460, 7, 103, 2, 2, 460, 461, 7, 116, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 47, 2, 2, 463, 464, 7, 102, 2, 2, 464, 465, 7, 107, 2, 2, 465, 466, 7, 105, 2, 2, 466, 467, 7, 107, 2, 2, 467, 468, 7, 118, 2, 2, 468, 54, 3, 2, 2, 2, 469, 470, 7, 102, 2, 2, 470, 471, 7, 107, 2, 2, 471, 472, 7, 105, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 118, 2, 2, 474, 56, 3, 2, 2, 2, 475, 476, 7, 114, 2, 2, 476, 477, 7, 99, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 118, 2, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 116, 2, 2, 481, 482, 7, 112, 2, 2, 482, 483, 7, 47, 2, 2, 483, 484, 7, 117, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 114, 2, 2, 486, 487, 7, 99, 2, 2, 487, 488, 7, 116, 2, 2, 488, 489, 7, 99, 2, 2, 489, 490, 7, 118, 2, 2, 490, 491, 7, 113, 2, 2, 491, 492, 7, 116, 2, 2, 492, 58, 3, 2, 2, 2, 493, 494, 7, 107, 2, 2, 494, 495, 7, 111, 2, 2, 495, 496, 7, 114, 2, 2, 496, 497, 7, 113, 2, 2, 497, 498, 7, 116, 2, 2, 498, 499, 7, 118, 2, 2, 499, 60, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 122, 2, 2, 502, 503, 7, 118, 2, 2, 503, 504, 7, 103, 2, 2, 504, 505, 7, 116, 2, 2, 505, 506, 7, 112, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 110, 2, 2, 508, 62, 3, 2, 2, 2, 509, 510, 7, 104, 2, 2, 510, 511, 7, 119, 2, 2, 511, 512, 7, 112, 2, 2, 512, 513, 7, 101, 2, 2, 513, 514, 7, 118, 2, 2, 514, 515, 7, 107, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 112, 2, 2, 517, 64, 3, 2, 2, 2, 518, 519, 7, 108, 2, 2, 519, 520, 7, 117, 2, 2, 520, 521, 7, 113, 2, 2, 521, 522, 7, 119, 2, 2, 522, 523, 7, 112, 2, 2, 523, 524, 7, 102, 2, 2, 524, 66, 3, 2, 2, 2, 525, 526, 7, 101, 2, 2, 526, 527, 7, 113, 2, 2, 527, 528, 7, 111, 2, 2, 528, 529, 7, 114, 2, 2, 529, 530, 7, 99, 2, 2, 530, 531, 7, 101, 2, 2, 531, 532, 7, 118, 2, 2, 532, 68, 3, 2, 2, 2, 533, 534, 7, 120, 2, 2, 534, 535, 7, 103, 2, 2, 535, 536, 7, 116, 2, 2, 536, 537, 7, 100, 2, 2, 537, 538, 7, 113, 2, 2, 538, 539, 7, 117, 2, 2, 539, 540, 7, 103, 2, 2, 540, 70, 3, 2, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 101, 2, 2, 543, 544, 7, 106, 2, 2, 544, 545, 7, 103, 2, 2, 545, 546, 7, 111, 2, 2, 546, 547, 7, 99, 2, 2, 547, 72, 3, 2, 2, 2, 548, 549, 7, 103, 2, 2, 549, 550, 7, 115, 2, 2, 550, 74, 3, 2, 2, 2, 551, 552, 7, 112, 2, 2, 552, 553, 7, 103, 2, 2, 553, 76, 3, 2, 2, 2, 554, 555, 7, 110, 2, 2, 555, 556, 7, 118, 2, 2, 556, 78, 3, 2, 2, 2, 557, 558, 7, 110, 2, 2, 558, 559, 7, 103, 2, 2, 559, 80, 3, 2, 2, 2, 560, 561, 7, 105, 2, 2, 561, 562, 7, 118, 2, 2, 562, 82, 3, 2, 2, 2, 563, 564, 7, 105, 2, 2, 564, 565, 7, 103, 2, 2, 565, 84, 3, 2, 2, 2, 566, 567, 7, 35, 2, 2, 567, 568, 7, 63, 2, 2, 568, 86, 3, 2, 2, 2, 569, 570, 7, 62, 2, 2, 570, 88, 3, 2, 2, 2, 571, 572, 7, 62, 2, 2, 572, 573, 7, 63, 2, 2, 573, 90, 3, 2, 2, 2, 574, 575, 7, 64, 2, 2, 575, 92, 3, 2, 2, 2, 576, 577, 7, 64, 2, 2, 577, 578, 7, 63, 2, 2, 578, 94, 3, 2, 2, 2, 579, 580, 7, 126, 2, 2, 580, 581, 7, 126, 2, 2, 581, 96, 3, 2, 2, 2, 582, 583, 7, 45, 2, 2, 583, 98, 3, 2, 2, 2, 584, 585, 7, 47, 2, 2, 585, 100, 3, 2, 2, 2, 586, 587, 7, 102, 2, 2, 587, 588, 7, 107, 2, 2, 588, 589, 7, 120, 2, 2, 589, 102, 3, 2, 2, 2, 590, 591, 7, 107, 2, 2, 591, 592, 7, 102, 2, 2, 592, 593, 7, 107, 2, 2, 593, 594, 7, 120, 2, 2, 594, 104, 3, 2, 2, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 113, 2, 2, 597, 598, 7, 102, 2, 2, 598, 106, 3, 2, 2, 2, 599, 600, 7, 35, 2, 2, 600, 108, 3, 2, 2, 2, 601, 602, 7, 93, 2, 2, 602, 110, 3, 2, 2, 2, 603, 604, 7, 95, 2, 2, 604, 112, 3, 2, 2, 2, 605, 606, 7, 48, 2, 2, 606, 114, 3, 2, 2, 2, 607, 608, 7, 38, 2, 2, 608, 609, 7, 38, 2, 2, 609, 116, 3, 2, 2, 2, 610, 611, 7, 37, 2, 2, 611, 118, 3, 2, 2, 2, 612, 613, 7, 125, 2, 2, 613, 614, 7, 126, 2, 2, 614, 120, 3, 2, 2, 2, 615, 616, 7, 126, 2, 2, 616, 617, 7, 127, 2, 2, 617, 122, 3, 2, 2, 2, 618, 619, 7, 104, 2, 2, 619, 620, 7, 113, 2, 2, 620, 621, 7, 116, 2, 2, 621, 124, 3, 2, 2, 2, 622, 623, 7, 110, 2, 2, 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 126, 3, 2, 2, 2, 626, 627, 7, 121, 2, 2, 627, 628, 7, 106, 2, 2, 628, 629, 7, 103, 2, 2, 629, 630, 7, 116, 2, 2, 630, 631, 7, 103, 2, 2, 631, 128, 3, 2, 2, 2, 632, 633, 7, 105, 2, 2, 633, 634, 7, 116, 2, 2, 634, 635, 7, 113, 2, 2, 635, 636, 7, 119, 2, 2, 636, 637, 7, 114, 2, 2, 637, 130, 3, 2, 2, 2, 638, 639, 7, 100, 2, 2, 639, 640, 7, 123, 2, 2, 640, 132, 3, 2, 2, 2, 641, 642, 7, 113, 2, 2, 642, 643, 7, 116, 2, 2, 643, 644, 7, 102, 2, 2, 644, 645, 7, 103, 2, 2, 645, 646, 7, 116, 2, 2, 646, 134, 3, 2, 2, 2, 647, 648, 7, 116, 2, 2, 648, 649, 7, 103, 2, 2, 649, 650, 7, 118, 2, 2, 650, 651, 7, 119, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 112, 2, 2, 653, 136, 3, 2, 2, 2, 654, 655, 7, 107, 2, 2, 655, 656, 7, 104, 2, 2, 656, 138, 3, 2, 2, 2, 657, 658, 7, 107, 2, 2, 658, 659, 7, 112, 2, 2, 659, 140, 3, 2, 2, 2, 660, 661, 7, 99, 2, 2, 661, 662, 7, 117, 2, 2, 662, 142, 3, 2, 2, 2, 663, 664, 7, 99, 2, 2, 664, 665, 7, 118, 2, 2, 665, 144, 3, 2, 2, 2, 666, 667, 7, 99, 2, 2, 667, 668, 7, 110, 2, 2, 668, 669, 7, 110, 2, 2, 669, 670, 7, 113, 2, 2, 670, 671, 7, 121, 2, 2, 671, 672, 7, 107, 2, 2, 672, 673, 7, 112, 2, 2, 673, 674, 7, 105, 2, 2, 674, 146, 3, 2, 2, 2, 675, 676, 7, 103, 2, 2, 676, 677, 7, 111, 2, 2, 677, 678, 7, 114, 2, 2, 678, 679, 7, 118, 2, 2, 679, 680, 7, 123, 2, 2, 680, 148, 3, 2, 2, 2, 681, 682, 7, 101, 2, 2, 682, 683, 7, 113, 2, 2, 683, 684, 7, 119, 2, 2, 684, 685, 7, 112, 2, 2, 685, 686, 7, 118, 2, 2, 686, 150, 3, 2, 2, 2, 687, 688, 7, 117, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 99, 2, 2, 690, 691, 7, 100, 2, 2, 691, 692, 7, 110, 2, 2, 692, 693, 7, 103, 2, 2, 693, 152, 3, 2, 2, 2, 694, 695, 7, 99, 2, 2, 695, 696, 7, 117, 2, 2, 696, 697, 7, 101, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 112, 2, 2, 699, 700, 7, 102, 2, 2, 700, 701, 7, 107, 2, 2, 701, 702, 7, 112, 2, 2, 702, 703, 7, 105, 2, 2, 703, 154, 3, 2, 2, 2, 704, 705, 7, 102, 2, 2, 705, 706, 7, 103, 2, 2, 706, 707, 7, 117, 2, 2, 707, 708, 7, 101, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 112, 2, 2, 710, 711, 7, 102, 2, 2, 711, 712, 7, 107, 2, 2, 712, 713, 7, 112, 2, 2, 713, 714, 7, 105, 2, 2, 714, 156, 3, 2, 2, 2, 715, 716, 7, 117, 2, 2, 716, 717, 7, 113, 2, 2, 717, 718, 7, 111, 2, 2, 718, 719, 7, 103, 2, 2, 719, 158, 3, 2, 2, 2, 720, 721, 7, 103, 2, 2, 721, 722, 7, 120, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 116, 2, 2, 724, 725, 7, 123, 2, 2, 725, 160, 3, 2, 2, 2, 726, 727, 7, 117, 2, 2, 727, 728, 7, 99, 2, 2, 728, 729, 7, 118, 2, 2, 729, 730, 7, 107, 2, 2, 730, 731, 7, 117, 2, 2, 731, 732, 7, 104, 2, 2, 732, 733, 7, 107, 2, 2, 733, 734, 7, 103, 2, 2, 734, 735, 7, 117, 2, 2, 735, 162, 3, 2, 2, 2, 736, 737, 7, 101, 2, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 110, 2, 2, 739, 740, 7, 110, 2, 2, 740, 741, 7, 99, 2, 2, 741, 742, 7, 118, 2, 2, 742, 743, 7, 107, 2, 2, 743, 744, 7, 113, 2, 2, 744, 745, 7, 112, 2, 2, 745, 164, 3, 2, 2, 2, 746, 747, 7, 105, 2, 2, 747, 748, 7, 116, 2, 2, 748, 749, 7, 103, 2, 2, 749, 750, 7, 99, 2, 2, 750, 751, 7, 118, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 117, 2, 2, 753, 754, 7, 118, 2, 2, 754, 166, 3, 2, 2, 2, 755, 756, 7, 110, 2, 2, 756, 757, 7, 103, 2, 2, 757, 758, 7, 99, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 118, 2, 2, 760, 168, 3, 2, 2, 2, 761, 762, 7, 117, 2, 2, 762, 763, 7, 121, 2, 2, 763, 764, 7, 107, 2, 2, 764, 765, 7, 118, 2, 2, 765, 766, 7, 101, 2, 2, 766, 767, 7, 106, 2, 2, 767, 170, 3, 2, 2, 2, 768, 769, 7, 101, 2, 2, 769, 770, 7, 99, 2, 2, 770, 771, 7, 117, 2, 2, 771, 772, 7, 103, 2, 2, 772, 172, 3, 2, 2, 2, 773, 774, 7, 118, 2, 2, 774, 775, 7, 116, 2, 2, 775, 776, 7, 123, 2, 2, 776, 174, 3, 2, 2, 2, 777, 778, 7, 101, 2, 2, 778, 779, 7, 99, 2, 2, 779, 780, 7, 118, 2, 2, 780, 781, 7, 101, 2, 2, 781, 782, 7, 106, 2, 2, 782, 176, 3, 2, 2, 2, 783, 784, 7, 102, 2, 2, 784, 785, 7, 103, 2, 2, 785, 786, 7, 104, 2, 2, 786, 787, 7, 99, 2, 2, 787, 788, 7, 119, 2, 2, 788, 789, 7, 110, 2, 2, 789, 790, 7, 118, 2, 2, 790, 178, 3, 2, 2, 2, 791, 792, 7, 118, 2, 2, 792, 793, 7, 106, 2, 2, 793, 794, 7, 103, 2, 2, 794, 795, 7, 112, 2, 2, 795, 180, 3, 2, 2, 2, 796, 797, 7, 103, 2, 2, 797, 798, 7, 110, 2, 2, 798, 799, 7, 117, 2, 2, 799, 800, 7, 103, 2, 2, 800, 182, 3, 2, 2, 2, 801, 802, 7, 118, 2, 2, 802, 803, 7, 123, 2, 2, 803, 804, 7, 114, 2, 2, 804, 805, 7, 103, 2, 2, 805, 806, 7, 117, 2, 2, 806, 807, 7, 121, 2, 2, 807, 808, 7, 107, 2, 2, 808, 809, 7, 118, 2, 2, 809, 810, 7, 101, 2, 2, 810, 811, 7, 106, 2, 2, 811, 184, 3, 2, 2, 2, 812, 813, 7, 113, 2, 2, 813, 814, 7, 116, 2, 2, 814, 186, 3, 2, 2, 2, 815, 816, 7, 99, 2, 2, 816, 817, 7, 112, 2, 2, 817, 818, 7, 102, 2, 2, 818, 188, 3, 2, 2, 2, 819, 820, 7, 112, 2, 2, 820, 821, 7, 113, 2, 2, 821, 822, 7, 118, 2, 2, 822, 190, 3, 2, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 113, 2, 2, 825, 192, 3, 2, 2, 2, 826, 827, 7, 107, 2, 2, 827, 828, 7, 112, 2, 2, 828, 829, 7, 117, 2, 2, 829, 830, 7, 118, 2, 2, 830, 831, 7, 99, 2, 2, 831, 832, 7, 112, 2, 2, 832, 833, 7, 101, 2, 2, 833, 834, 7, 103, 2, 2, 834, 194, 3, 2, 2, 2, 835, 836, 7, 113, 2, 2, 836, 837, 7, 104, 2, 2, 837, 196, 3, 2, 2, 2, 838, 839, 7, 117, 2, 2, 839, 840, 7, 118, 2, 2, 840, 841, 7, 99, 2, 2, 841, 842, 7, 118, 2, 2, 842, 843, 7, 107, 2, 2, 843, 844, 7, 101, 2, 2, 844, 845, 7, 99, 2, 2, 845, 846, 7, 110, 2, 2, 846, 847, 7, 110, 2, 2, 847, 848, 7, 123, 2, 2, 848, 198, 3, 2, 2, 2, 849, 850, 7, 107, 2, 2, 850, 851, 7, 117, 2, 2, 851, 200, 3, 2, 2, 2, 852, 853, 7, 118, 2, 2, 853, 854, 7, 116, 2, 2, 854, 855, 7, 103, 2, 2, 855, 856, 7, 99, 2, 2, 856, 857, 7, 118, 2, 2, 857, 202, 3, 2, 2, 2, 858, 859, 7, 101, 2, 2, 859, 860, 7, 99, 2, 2, 860, 861, 7, 117, 2, 2, 861, 862, 7, 118, 2, 2, 862, 204, 3, 2, 2, 2, 863, 864, 7, 101, 2, 2, 864, 865, 7, 99, 2, 2, 865, 866, 7, 117, 2, 2, 866, 867, 7, 118, 2, 2, 867, 868, 7, 99, 2, 2, 868, 869, 7, 100, 2, 2, 869, 870, 7, 110, 2, 2, 870, 871, 7, 103, 2, 2, 871, 206, 3, 2, 2, 2, 872, 873, 7, 120, 2, 2, 873, 874, 7, 103, 2, 2, 874, 875, 7, 116, 2, 2, 875, 876, 7, 117, 2, 2, 876, 877, 7, 107, 2, 2, 877, 878, 7, 113, 2, 2, 878, 879, 7, 112, 2, 2, 879, 208, 3, 2, 2, 2, 880, 881, 7, 108, 2, 2, 881, 882, 7, 117, 2, 2, 882, 883, 7, 113, 2, 2, 883, 884, 7, 112, 2, 2, 884, 885, 7, 107, 2, 2, 885, 886, 7, 115, 2, 2, 886, 210, 3, 2, 2, 2, 887, 888, 7, 119, 2, 2, 888, 889, 7, 112, 2, 2, 889, 890, 7, 113, 2, 2, 890, 891, 7, 116, 2, 2, 891, 892, 7, 102, 2, 2, 892, 893, 7, 103, 2, 2, 893, 894, 7, 116, 2, 2, 894, 895, 7, 103, 2, 2, 895, 896, 7, 102, 2, 2, 896, 212, 3, 2, 2, 2, 897, 898, 7, 118, 2, 2, 898, 899, 7, 116, 2, 2, 899, 900, 7, 119, 2, 2, 900, 901, 7, 103, 2, 2, 901, 214, 3, 2, 2, 2, 902, 903, 7, 104, 2, 2, 903, 904, 7, 99, 2, 2, 904, 905, 7, 110, 2, 2, 905, 906, 7, 117, 2, 2, 906, 907, 7, 103, 2, 2, 907, 216, 3, 2, 2, 2, 908, 909, 7, 118, 2, 2, 909, 910, 7, 123, 2, 2, 910, 911, 7, 114, 2, 2, 911, 912, 7, 103, 2, 2, 912, 218, 3, 2, 2, 2, 913, 914, 7, 120, 2, 2, 914, 915, 7, 99, 2, 2, 915, 916, 7, 110, 2, 2, 916, 917, 7, 107, 2, 2, 917, 918, 7, 102, 2, 2, 918, 919, 7, 99, 2, 2, 919, 920, 7, 118, 2, 2, 920, 921, 7, 103, 2, 2, 921, 220, 3, 2, 2, 2, 922, 923, 7, 99, 2, 2, 923, 924, 7, 112, 2, 2, 924, 925, 7, 112, 2, 2, 925, 926, 7, 113, 2, 2, 926, 927, 7, 118, 2, 2, 927, 928, 7, 99, 2, 2, 928, 929, 7, 118, 2, 2, 929, 930, 7, 103, 2, 2, 930, 222, 3, 2, 2, 2, 931, 932, 7, 102, 2, 2, 932, 933, 7, 103, 2, 2, 933, 934, 7, 101, 2, 2, 934, 935, 7, 110, 2, 2, 935, 936, 7, 99, 2, 2, 936, 937, 7, 116, 2, 2, 937, 938, 7, 103, 2, 2, 938, 224, 3, 2, 2, 2, 939, 940, 7, 101, 2, 2, 940, 941, 7, 113, 2, 2, 941, 942, 7, 112, 2, 2, 942, 943, 7, 118, 2, 2, 943, 944, 7, 103, 2, 2, 944, 945, 7, 122, 2, 2, 945, 946, 7, 118, 2, 2, 946, 226, 3, 2, 2, 2, 947, 948, 7, 107, 2, 2, 948, 949, 7, 118, 2, 2, 949, 950, 7, 103, 2, 2, 950, 951, 7, 111, 2, 2, 951, 228, 3, 2, 2, 2, 952, 953, 7, 120, 2, 2, 953, 954, 7, 99, 2, 2, 954, 955, 7, 116, 2, 2, 955, 956, 7, 107, 2, 2, 956, 957, 7, 99, 2, 2, 957, 958, 7, 100, 2, 2, 958, 959, 7, 110, 2, 2, 959, 960, 7, 103, 2, 2, 960, 230, 3, 2, 2, 2, 961, 962, 7, 107, 2, 2, 962, 963, 7, 112, 2, 2, 963, 964, 7, 117, 2, 2, 964, 965, 7, 103, 2, 2, 965, 966, 7, 116, 2, 2, 966, 967, 7, 118, 2, 2, 967, 232, 3, 2, 2, 2, 968, 969, 7, 102, 2, 2, 969, 970, 7, 103, 2, 2, 970, 971, 7, 110, 2, 2, 971, 972, 7, 103, 2, 2, 972, 973, 7, 118, 2, 2, 973, 974, 7, 103, 2, 2, 974, 234, 3, 2, 2, 2, 975, 976, 7, 116, 2, 2, 976, 977, 7, 103, 2, 2, 977, 978, 7, 112, 2, 2, 978, 979, 7, 99, 2, 2, 979, 980, 7, 111, 2, 2, 980, 981, 7, 103, 2, 2, 981, 236, 3, 2, 2, 2, 982, 983, 7, 116, 2, 2, 983, 984, 7, 103, 2, 2, 984, 985, 7, 114, 2, 2, 985, 986, 7, 110, 2, 2, 986, 987, 7, 99, 2, 2, 987, 988, 7, 101, 2, 2, 988, 989, 7, 103, 2, 2, 989, 238, 3, 2, 2, 2, 990, 991, 7, 101, 2, 2, 991, 992, 7, 113, 2, 2, 992, 993, 7, 114, 2, 2, 993, 994, 7, 123, 2, 2, 994, 240, 3, 2, 2, 2, 995, 996, 7, 111, 2, 2, 996, 997, 7, 113, 2, 2, 997, 998, 7, 102, 2, 2, 998, 999, 7, 107, 2, 2, 999, 1000, 7, 104, 2, 2, 1000, 1001, 7, 123, 2, 2, 1001, 242, 3, 2, 2, 2, 1002, 1003, 7, 99, 2, 2, 1003, 1004, 7, 114, 2, 2, 1004, 1005, 7, 114, 2, 2, 1005, 1006, 7, 103, 2, 2, 1006, 1007, 7, 112, 2, 2, 1007, 1008, 7, 102, 2, 2, 1008, 244, 3, 2, 2, 2, 1009, 1010, 7, 107, 2, 2, 1010, 1011, 7, 112, 2, 2, 1011, 1012, 7, 118, 2, 2, 1012, 1013, 7, 113, 2, 2, 1013, 246, 3, 2, 2, 2, 1014, 1015, 7, 120, 2, 2, 1015, 1016, 7, 99, 2, 2, 1016, 1017, 7, 110, 2, 2, 1017, 1018, 7, 119, 2, 2, 1018, 1019, 7, 103, 2, 2, 1019, 248, 3, 2, 2, 2, 1020, 1021, 7, 108, 2, 2, 1021, 1022, 7, 117, 2, 2, 1022, 1023, 7, 113, 2, 2, 1023, 1024, 7, 112, 2, 2, 1024, 250, 3, 2, 2, 2, 1025, 1026, 7, 121, 2, 2, 1026, 1027, 7, 107, 2, 2, 1027, 1028, 7, 118, 2, 2, 1028, 1029, 7, 106, 2, 2, 1029, 252, 3, 2, 2, 2, 1030, 1031, 7, 114, 2, 2, 1031, 1032, 7, 113, 2, 2, 1032, 1033, 7, 117, 2, 2, 1033, 1034, 7, 107, 2, 2, 1034, 1035, 7, 118, 2, 2, 1035, 1036, 7, 107, 2, 2, 1036, 1037, 7, 113, 2, 2, 1037, 1038, 7, 112, 2, 2, 1038, 254, 3, 2, 2, 2, 1039, 1040, 7, 100, 2, 2, 1040, 1041, 7, 116, 2, 2, 1041, 1042, 7, 103, 2, 2, 1042, 1043, 7, 99, 2, 2, 1043, 1044, 7, 109, 2, 2, 1044, 256, 3, 2, 2, 2, 1045, 1046, 7, 110, 2, 2, 1046, 1047, 7, 113, 2, 2, 1047, 1048, 7, 113, 2, 2, 1048, 1049, 7, 114, 2, 2, 1049, 258, 3, 2, 2, 2, 1050, 1051, 7, 101, 2, 2, 1051, 1052, 7, 113, 2, 2, 1052, 1053, 7, 112, 2, 2, 1053, 1054, 7, 118, 2, 2, 1054, 1055, 7, 107, 2, 2, 1055, 1056, 7, 112, 2, 2, 1056, 1057, 7, 119, 2, 2, 1057, 1058, 7, 103, 2, 2, 1058, 260, 3, 2, 2, 2, 1059, 1060, 7, 103, 2, 2, 1060, 1061, 7, 122, 2, 2, 1061, 1062, 7, 107, 2, 2, 1062, 1063, 7, 118, 2, 2, 1063, 262, 3, 2, 2, 2, 1064, 1065, 7, 116, 2, 2, 1065, 1066, 7, 103, 2, 2, 1066, 1067, 7, 118, 2, 2, 1067, 1068, 7, 119, 2, 2, 1068, 1069, 7, 116, 2, 2, 1069, 1070, 7, 112, 2, 2, 1070, 1071, 7, 107, 2, 2, 1071, 1072, 7, 112, 2, 2, 1072, 1073, 7, 105, 2, 2, 1073, 264, 3, 2, 2, 2, 1074, 1075, 7, 121, 2, 2, 1075, 1076, 7, 106, 2, 2, 1076, 1077, 7, 107, 2, 2, 1077, 1078, 7, 110, 2, 2, 1078, 1079, 7, 103, 2, 2, 1079, 266, 3, 2, 2, 2, 1080, 1085, 7, 36, 2, 2, 1081, 1084, 5, 269, 135, 2, 1082, 1084, 10, 2, 2, 2, 1083, 1081, 3, 2, 2, 2, 1083, 1082, 3, 2, 2, 2, 1084, 1087, 3, 2, 2, 2, 1085, 1083, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 1088, 3, 2, 2, 2, 1087, 1085, 3, 2, 2, 2, 1088, 1089, 7, 36, 2, 2, 1089, 268, 3, 2, 2, 2, 1090, 1093, 7, 94, 2, 2, 1091, 1094, 9, 3, 2, 2, 1092, 1094, 5, 271, 136, 2, 1093, 1091, 3, 2, 2, 2, 1093, 1092, 3, 2, 2, 2, 1094, 270, 3, 2, 2, 2, 1095, 1096, 7, 119, 2, 2, 1096, 1097, 5, 273, 137, 2, 1097, 1098, 5, 273, 137, 2, 1098, 1099, 5, 273, 137, 2, 1099, 1100, 5, 273, 137, 2, 1100, 272, 3, 2, 2, 2, 1101, 1102, 9, 4, 2, 2, 1102, 274, 3, 2, 2, 2, 1103, 1104, 7, 65, 2, 2, 1104, 276, 3, 2, 2, 2, 1105, 1106, 7, 112, 2, 2, 1106, 1107, 7, 119, 2, 2, 1107, 1108, 7, 110, 2, 2, 1108, 1109, 7, 110, 2, 2, 1109, 278, 3, 2, 2, 2, 1110, 1111, 5, 281, 141, 2, 1111, 280, 3, 2, 2, 2, 1112, 1116, 5, 283, 142, 2, 1113, 1116, 5, 285, 143, 2, 1114, 1116, 5, 287, 144, 2, 1115, 1112, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1115, 1114, 3, 2, 2, 2, 1116, 282, 3, 2, 2, 2, 1117, 1118, 5, 289, 145, 2, 1118, 284, 3, 2, 2, 2, 1119, 1120, 7, 48, 2, 2, 1120, 1130, 5, 289, 145, 2, 1121, 1122, 5, 289, 145, 2, 1122, 1126, 7, 48, 2, 2, 1123, 1125, 9, 5, 2, 2, 1124, 1123, 3, 2, 2, 2, 1125, 1128, 3, 2, 2, 2, 1126, 1124, 3, 2, 2, 2, 1126, 1127, 3, 2, 2, 2, 1127, 1130, 3, 2, 2, 2, 1128, 1126, 3, 2, 2, 2, 1129, 1119, 3, 2, 2, 2, 1129, 1121, 3, 2, 2, 2, 1130, 286, 3, 2, 2, 2, 1131, 1132, 7, 48, 2, 2, 1132, 1144, 5, 289, 145, 2, 1133, 1141, 5, 289, 145, 2, 1134, 1138, 7, 48, 2, 2, 1135, 1137, 9, 5, 2, 2, 1136, 1135, 3, 2, 2, 2, 1137, 1140, 3, 2, 2, 2, 1138, 1136, 3, 2, 2, 2, 1138, 1139, 3, 2, 2, 2, 1139, 1142, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1134, 3, 2, 2, 2, 1141, 1142, 3, 2, 2, 2, 1142, 1144, 3, 2, 2, 2, 1143, 1131, 3, 2, 2, 2, 1143, 1133, 3, 2, 2, 2, 1144, 1145, 3, 2, 2, 2, 1145, 1147, 9, 6, 2, 2, 1146, 1148, 9, 7, 2, 2, 1147, 1146, 3, 2, 2, 2, 1147, 1148, 3, 2, 2, 2, 1148, 1149, 3, 2, 2, 2, 1149, 1150, 5, 289, 145, 2, 1150, 288, 3, 2, 2, 2, 1151, 1153, 9, 5, 2, 2, 1152, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 1152, 3, 2, 2, 2, 1154, 1155, 3, 2, 2, 2, 1155, 290, 3, 2, 2, 2, 1156, 1157, 9, 8, 2, 2, 1157, 1158, 3, 2, 2, 2, 1158, 1159, 8, 146, 2, 2, 1159, 292, 3, 2, 2, 2, 1160, 1164, 5, 295, 148, 2, 1161, 1163, 5, 297, 149, 2, 1162, 1161, 3, 2, 2, 2, 1163, 1166, 3, 2, 2, 2, 1164, 1162, 3, 2, 2, 2, 1164, 1165, 3, 2, 2, 2, 1165, 294, 3, 2, 2, 2, 1166, 1164, 3, 2, 2, 2, 1167, 1169, 9, 9, 2, 2, 1168, 1167, 3, 2, 2, 2, 1169, 296, 3, 2, 2, 2, 1170, 1173, 5, 295, 148, 2, 1171, 1173, 9, 10, 2, 2, 1172, 1170, 3, 2, 2, 2, 1172, 1171, 3, 2, 2, 2, 1173, 298, 3, 2, 2, 2, 1174, 1175, 7, 42, 2, 2, 1175, 1184, 7, 60, 2, 2, 1176, 1183, 5, 299, 150, 2, 1177, 1178, 7, 42, 2, 2, 1178, 1183, 10, 11, 2, 2, 1179, 1180, 7, 60, 2, 2, 1180, 1183, 10, 12, 2, 2, 1181, 1183, 10, 13, 2, 2, 1182, 1176, 3, 2, 2, 2, 1182, 1177, 3, 2, 2, 2, 1182, 1179, 3, 2, 2, 2, 1182, 1181, 3, 2, 2, 2, 1183, 1186, 3, 2, 2, 2, 1184, 1182, 3, 2, 2, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1188, 3, 2, 2, 2, 1186, 1184, 3, 2, 2, 2, 1187, 1189, 7, 60, 2, 2, 1188, 1187, 3, 2, 2, 2, 1189, 1190, 3, 2, 2, 2, 1190, 1188, 3, 2, 2, 2, 1190, 1191, 3, 2, 2, 2, 1191, 1192, 3, 2, 2, 2, 1192, 1193, 7, 43, 2, 2, 1193, 1194, 3, 2, 2, 2, 1194, 1195, 8, 150, 2, 2, 1195, 300, 3, 2, 2, 2, 1196, 1197, 10, 14, 2, 2, 1197, 302, 3, 2, 2, 2, 20, 2, 1083, 1085, 1093, 1115, 1126, 1129, 1138, 1141, 1143, 1147, 1154, 1164, 1168, 1172, 1182, 1184, 1190, 3, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 147, 1209, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 7, 135, 1095, 10, 135, 12, 135, 14, 135, 1098, 11, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 5, 136, 1105, 10, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 5, 142, 1127, 10, 142, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 7, 144, 1136, 10, 144, 12, 144, 14, 144, 1139, 11, 144, 5, 144, 1141, 10, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 7, 145, 1148, 10, 145, 12, 145, 14, 145, 1151, 11, 145, 5, 145, 1153, 10, 145, 5, 145, 1155, 10, 145, 3, 145, 3, 145, 5, 145, 1159, 10, 145, 3, 145, 3, 145, 3, 146, 6, 146, 1164, 10, 146, 13, 146, 14, 146, 1165, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 7, 148, 1174, 10, 148, 12, 148, 14, 148, 1177, 11, 148, 3, 149, 5, 149, 1180, 10, 149, 3, 150, 3, 150, 5, 150, 1184, 10, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 7, 151, 1194, 10, 151, 12, 151, 14, 151, 1197, 11, 151, 3, 151, 6, 151, 1200, 10, 151, 13, 151, 14, 151, 1201, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 2, 2, 153, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 2, 273, 2, 275, 2, 277, 137, 279, 138, 281, 139, 283, 140, 285, 141, 287, 142, 289, 143, 291, 2, 293, 144, 295, 145, 297, 2, 299, 2, 301, 146, 303, 147, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1221, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 3, 305, 3, 2, 2, 2, 5, 307, 3, 2, 2, 2, 7, 314, 3, 2, 2, 2, 9, 324, 3, 2, 2, 2, 11, 326, 3, 2, 2, 2, 13, 328, 3, 2, 2, 2, 15, 331, 3, 2, 2, 2, 17, 333, 3, 2, 2, 2, 19, 335, 3, 2, 2, 2, 21, 337, 3, 2, 2, 2, 23, 339, 3, 2, 2, 2, 25, 341, 3, 2, 2, 2, 27, 343, 3, 2, 2, 2, 29, 345, 3, 2, 2, 2, 31, 347, 3, 2, 2, 2, 33, 356, 3, 2, 2, 2, 35, 364, 3, 2, 2, 2, 37, 379, 3, 2, 2, 2, 39, 381, 3, 2, 2, 2, 41, 399, 3, 2, 2, 2, 43, 418, 3, 2, 2, 2, 45, 427, 3, 2, 2, 2, 47, 438, 3, 2, 2, 2, 49, 442, 3, 2, 2, 2, 51, 450, 3, 2, 2, 2, 53, 460, 3, 2, 2, 2, 55, 471, 3, 2, 2, 2, 57, 477, 3, 2, 2, 2, 59, 495, 3, 2, 2, 2, 61, 502, 3, 2, 2, 2, 63, 511, 3, 2, 2, 2, 65, 520, 3, 2, 2, 2, 67, 527, 3, 2, 2, 2, 69, 535, 3, 2, 2, 2, 71, 543, 3, 2, 2, 2, 73, 550, 3, 2, 2, 2, 75, 553, 3, 2, 2, 2, 77, 556, 3, 2, 2, 2, 79, 559, 3, 2, 2, 2, 81, 562, 3, 2, 2, 2, 83, 565, 3, 2, 2, 2, 85, 568, 3, 2, 2, 2, 87, 571, 3, 2, 2, 2, 89, 573, 3, 2, 2, 2, 91, 576, 3, 2, 2, 2, 93, 578, 3, 2, 2, 2, 95, 581, 3, 2, 2, 2, 97, 584, 3, 2, 2, 2, 99, 586, 3, 2, 2, 2, 101, 588, 3, 2, 2, 2, 103, 592, 3, 2, 2, 2, 105, 597, 3, 2, 2, 2, 107, 601, 3, 2, 2, 2, 109, 603, 3, 2, 2, 2, 111, 605, 3, 2, 2, 2, 113, 607, 3, 2, 2, 2, 115, 609, 3, 2, 2, 2, 117, 612, 3, 2, 2, 2, 119, 614, 3, 2, 2, 2, 121, 617, 3, 2, 2, 2, 123, 620, 3, 2, 2, 2, 125, 624, 3, 2, 2, 2, 127, 628, 3, 2, 2, 2, 129, 634, 3, 2, 2, 2, 131, 640, 3, 2, 2, 2, 133, 643, 3, 2, 2, 2, 135, 649, 3, 2, 2, 2, 137, 656, 3, 2, 2, 2, 139, 659, 3, 2, 2, 2, 141, 662, 3, 2, 2, 2, 143, 665, 3, 2, 2, 2, 145, 668, 3, 2, 2, 2, 147, 677, 3, 2, 2, 2, 149, 683, 3, 2, 2, 2, 151, 689, 3, 2, 2, 2, 153, 696, 3, 2, 2, 2, 155, 706, 3, 2, 2, 2, 157, 717, 3, 2, 2, 2, 159, 722, 3, 2, 2, 2, 161, 728, 3, 2, 2, 2, 163, 738, 3, 2, 2, 2, 165, 748, 3, 2, 2, 2, 167, 757, 3, 2, 2, 2, 169, 763, 3, 2, 2, 2, 171, 770, 3, 2, 2, 2, 173, 775, 3, 2, 2, 2, 175, 779, 3, 2, 2, 2, 177, 785, 3, 2, 2, 2, 179, 793, 3, 2, 2, 2, 181, 798, 3, 2, 2, 2, 183, 803, 3, 2, 2, 2, 185, 814, 3, 2, 2, 2, 187, 817, 3, 2, 2, 2, 189, 821, 3, 2, 2, 2, 191, 825, 3, 2, 2, 2, 193, 828, 3, 2, 2, 2, 195, 837, 3, 2, 2, 2, 197, 840, 3, 2, 2, 2, 199, 851, 3, 2, 2, 2, 201, 854, 3, 2, 2, 2, 203, 860, 3, 2, 2, 2, 205, 865, 3, 2, 2, 2, 207, 874, 3, 2, 2, 2, 209, 882, 3, 2, 2, 2, 211, 889, 3, 2, 2, 2, 213, 899, 3, 2, 2, 2, 215, 904, 3, 2, 2, 2, 217, 910, 3, 2, 2, 2, 219, 915, 3, 2, 2, 2, 221, 924, 3, 2, 2, 2, 223, 933, 3, 2, 2, 2, 225, 941, 3, 2, 2, 2, 227, 949, 3, 2, 2, 2, 229, 954, 3, 2, 2, 2, 231, 963, 3, 2, 2, 2, 233, 970, 3, 2, 2, 2, 235, 977, 3, 2, 2, 2, 237, 984, 3, 2, 2, 2, 239, 992, 3, 2, 2, 2, 241, 997, 3, 2, 2, 2, 243, 1004, 3, 2, 2, 2, 245, 1011, 3, 2, 2, 2, 247, 1016, 3, 2, 2, 2, 249, 1022, 3, 2, 2, 2, 251, 1027, 3, 2, 2, 2, 253, 1036, 3, 2, 2, 2, 255, 1041, 3, 2, 2, 2, 257, 1050, 3, 2, 2, 2, 259, 1056, 3, 2, 2, 2, 261, 1061, 3, 2, 2, 2, 263, 1070, 3, 2, 2, 2, 265, 1075, 3, 2, 2, 2, 267, 1085, 3, 2, 2, 2, 269, 1091, 3, 2, 2, 2, 271, 1101, 3, 2, 2, 2, 273, 1106, 3, 2, 2, 2, 275, 1112, 3, 2, 2, 2, 277, 1114, 3, 2, 2, 2, 279, 1116, 3, 2, 2, 2, 281, 1121, 3, 2, 2, 2, 283, 1126, 3, 2, 2, 2, 285, 1128, 3, 2, 2, 2, 287, 1140, 3, 2, 2, 2, 289, 1154, 3, 2, 2, 2, 291, 1163, 3, 2, 2, 2, 293, 1167, 3, 2, 2, 2, 295, 1171, 3, 2, 2, 2, 297, 1179, 3, 2, 2, 2, 299, 1183, 3, 2, 2, 2, 301, 1185, 3, 2, 2, 2, 303, 1207, 3, 2, 2, 2, 305, 306, 7, 61, 2, 2, 306, 4, 3, 2, 2, 2, 307, 308, 7, 111, 2, 2, 308, 309, 7, 113, 2, 2, 309, 310, 7, 102, 2, 2, 310, 311, 7, 119, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 103, 2, 2, 313, 6, 3, 2, 2, 2, 314, 315, 7, 112, 2, 2, 315, 316, 7, 99, 2, 2, 316, 317, 7, 111, 2, 2, 317, 318, 7, 103, 2, 2, 318, 319, 7, 117, 2, 2, 319, 320, 7, 114, 2, 2, 320, 321, 7, 99, 2, 2, 321, 322, 7, 101, 2, 2, 322, 323, 7, 103, 2, 2, 323, 8, 3, 2, 2, 2, 324, 325, 7, 63, 2, 2, 325, 10, 3, 2, 2, 2, 326, 327, 7, 38, 2, 2, 327, 12, 3, 2, 2, 2, 328, 329, 7, 60, 2, 2, 329, 330, 7, 63, 2, 2, 330, 14, 3, 2, 2, 2, 331, 332, 7, 125, 2, 2, 332, 16, 3, 2, 2, 2, 333, 334, 7, 127, 2, 2, 334, 18, 3, 2, 2, 2, 335, 336, 7, 42, 2, 2, 336, 20, 3, 2, 2, 2, 337, 338, 7, 43, 2, 2, 338, 22, 3, 2, 2, 2, 339, 340, 7, 44, 2, 2, 340, 24, 3, 2, 2, 2, 341, 342, 7, 126, 2, 2, 342, 26, 3, 2, 2, 2, 343, 344, 7, 39, 2, 2, 344, 28, 3, 2, 2, 2, 345, 346, 7, 46, 2, 2, 346, 30, 3, 2, 2, 2, 347, 348, 7, 113, 2, 2, 348, 349, 7, 116, 2, 2, 349, 350, 7, 102, 2, 2, 350, 351, 7, 103, 2, 2, 351, 352, 7, 116, 2, 2, 352, 353, 7, 107, 2, 2, 353, 354, 7, 112, 2, 2, 354, 355, 7, 105, 2, 2, 355, 32, 3, 2, 2, 2, 356, 357, 7, 113, 2, 2, 357, 358, 7, 116, 2, 2, 358, 359, 7, 102, 2, 2, 359, 360, 7, 103, 2, 2, 360, 361, 7, 116, 2, 2, 361, 362, 7, 103, 2, 2, 362, 363, 7, 102, 2, 2, 363, 34, 3, 2, 2, 2, 364, 365, 7, 102, 2, 2, 365, 366, 7, 103, 2, 2, 366, 367, 7, 101, 2, 2, 367, 368, 7, 107, 2, 2, 368, 369, 7, 111, 2, 2, 369, 370, 7, 99, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 47, 2, 2, 372, 373, 7, 104, 2, 2, 373, 374, 7, 113, 2, 2, 374, 375, 7, 116, 2, 2, 375, 376, 7, 111, 2, 2, 376, 377, 7, 99, 2, 2, 377, 378, 7, 118, 2, 2, 378, 36, 3, 2, 2, 2, 379, 380, 7, 60, 2, 2, 380, 38, 3, 2, 2, 2, 381, 382, 7, 102, 2, 2, 382, 383, 7, 103, 2, 2, 383, 384, 7, 101, 2, 2, 384, 385, 7, 107, 2, 2, 385, 386, 7, 111, 2, 2, 386, 387, 7, 99, 2, 2, 387, 388, 7, 110, 2, 2, 388, 389, 7, 47, 2, 2, 389, 390, 7, 117, 2, 2, 390, 391, 7, 103, 2, 2, 391, 392, 7, 114, 2, 2, 392, 393, 7, 99, 2, 2, 393, 394, 7, 116, 2, 2, 394, 395, 7, 99, 2, 2, 395, 396, 7, 118, 2, 2, 396, 397, 7, 113, 2, 2, 397, 398, 7, 116, 2, 2, 398, 40, 3, 2, 2, 2, 399, 400, 7, 105, 2, 2, 400, 401, 7, 116, 2, 2, 401, 402, 7, 113, 2, 2, 402, 403, 7, 119, 2, 2, 403, 404, 7, 114, 2, 2, 404, 405, 7, 107, 2, 2, 405, 406, 7, 112, 2, 2, 406, 407, 7, 105, 2, 2, 407, 408, 7, 47, 2, 2, 408, 409, 7, 117, 2, 2, 409, 410, 7, 103, 2, 2, 410, 411, 7, 114, 2, 2, 411, 412, 7, 99, 2, 2, 412, 413, 7, 116, 2, 2, 413, 414, 7, 99, 2, 2, 414, 415, 7, 118, 2, 2, 415, 416, 7, 113, 2, 2, 416, 417, 7, 116, 2, 2, 417, 42, 3, 2, 2, 2, 418, 419, 7, 107, 2, 2, 419, 420, 7, 112, 2, 2, 420, 421, 7, 104, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 112, 2, 2, 423, 424, 7, 107, 2, 2, 424, 425, 7, 118, 2, 2, 425, 426, 7, 123, 2, 2, 426, 44, 3, 2, 2, 2, 427, 428, 7, 111, 2, 2, 428, 429, 7, 107, 2, 2, 429, 430, 7, 112, 2, 2, 430, 431, 7, 119, 2, 2, 431, 432, 7, 117, 2, 2, 432, 433, 7, 47, 2, 2, 433, 434, 7, 117, 2, 2, 434, 435, 7, 107, 2, 2, 435, 436, 7, 105, 2, 2, 436, 437, 7, 112, 2, 2, 437, 46, 3, 2, 2, 2, 438, 439, 7, 80, 2, 2, 439, 440, 7, 99, 2, 2, 440, 441, 7, 80, 2, 2, 441, 48, 3, 2, 2, 2, 442, 443, 7, 114, 2, 2, 443, 444, 7, 103, 2, 2, 444, 445, 7, 116, 2, 2, 445, 446, 7, 101, 2, 2, 446, 447, 7, 103, 2, 2, 447, 448, 7, 112, 2, 2, 448, 449, 7, 118, 2, 2, 449, 50, 3, 2, 2, 2, 450, 451, 7, 114, 2, 2, 451, 452, 7, 103, 2, 2, 452, 453, 7, 116, 2, 2, 453, 454, 7, 47, 2, 2, 454, 455, 7, 111, 2, 2, 455, 456, 7, 107, 2, 2, 456, 457, 7, 110, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 103, 2, 2, 459, 52, 3, 2, 2, 2, 460, 461, 7, 124, 2, 2, 461, 462, 7, 103, 2, 2, 462, 463, 7, 116, 2, 2, 463, 464, 7, 113, 2, 2, 464, 465, 7, 47, 2, 2, 465, 466, 7, 102, 2, 2, 466, 467, 7, 107, 2, 2, 467, 468, 7, 105, 2, 2, 468, 469, 7, 107, 2, 2, 469, 470, 7, 118, 2, 2, 470, 54, 3, 2, 2, 2, 471, 472, 7, 102, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 105, 2, 2, 474, 475, 7, 107, 2, 2, 475, 476, 7, 118, 2, 2, 476, 56, 3, 2, 2, 2, 477, 478, 7, 114, 2, 2, 478, 479, 7, 99, 2, 2, 479, 480, 7, 118, 2, 2, 480, 481, 7, 118, 2, 2, 481, 482, 7, 103, 2, 2, 482, 483, 7, 116, 2, 2, 483, 484, 7, 112, 2, 2, 484, 485, 7, 47, 2, 2, 485, 486, 7, 117, 2, 2, 486, 487, 7, 103, 2, 2, 487, 488, 7, 114, 2, 2, 488, 489, 7, 99, 2, 2, 489, 490, 7, 116, 2, 2, 490, 491, 7, 99, 2, 2, 491, 492, 7, 118, 2, 2, 492, 493, 7, 113, 2, 2, 493, 494, 7, 116, 2, 2, 494, 58, 3, 2, 2, 2, 495, 496, 7, 107, 2, 2, 496, 497, 7, 111, 2, 2, 497, 498, 7, 114, 2, 2, 498, 499, 7, 113, 2, 2, 499, 500, 7, 116, 2, 2, 500, 501, 7, 118, 2, 2, 501, 60, 3, 2, 2, 2, 502, 503, 7, 103, 2, 2, 503, 504, 7, 122, 2, 2, 504, 505, 7, 118, 2, 2, 505, 506, 7, 103, 2, 2, 506, 507, 7, 116, 2, 2, 507, 508, 7, 112, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 110, 2, 2, 510, 62, 3, 2, 2, 2, 511, 512, 7, 104, 2, 2, 512, 513, 7, 119, 2, 2, 513, 514, 7, 112, 2, 2, 514, 515, 7, 101, 2, 2, 515, 516, 7, 118, 2, 2, 516, 517, 7, 107, 2, 2, 517, 518, 7, 113, 2, 2, 518, 519, 7, 112, 2, 2, 519, 64, 3, 2, 2, 2, 520, 521, 7, 108, 2, 2, 521, 522, 7, 117, 2, 2, 522, 523, 7, 113, 2, 2, 523, 524, 7, 119, 2, 2, 524, 525, 7, 112, 2, 2, 525, 526, 7, 102, 2, 2, 526, 66, 3, 2, 2, 2, 527, 528, 7, 101, 2, 2, 528, 529, 7, 113, 2, 2, 529, 530, 7, 111, 2, 2, 530, 531, 7, 114, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 101, 2, 2, 533, 534, 7, 118, 2, 2, 534, 68, 3, 2, 2, 2, 535, 536, 7, 120, 2, 2, 536, 537, 7, 103, 2, 2, 537, 538, 7, 116, 2, 2, 538, 539, 7, 100, 2, 2, 539, 540, 7, 113, 2, 2, 540, 541, 7, 117, 2, 2, 541, 542, 7, 103, 2, 2, 542, 70, 3, 2, 2, 2, 543, 544, 7, 117, 2, 2, 544, 545, 7, 101, 2, 2, 545, 546, 7, 106, 2, 2, 546, 547, 7, 103, 2, 2, 547, 548, 7, 111, 2, 2, 548, 549, 7, 99, 2, 2, 549, 72, 3, 2, 2, 2, 550, 551, 7, 103, 2, 2, 551, 552, 7, 115, 2, 2, 552, 74, 3, 2, 2, 2, 553, 554, 7, 112, 2, 2, 554, 555, 7, 103, 2, 2, 555, 76, 3, 2, 2, 2, 556, 557, 7, 110, 2, 2, 557, 558, 7, 118, 2, 2, 558, 78, 3, 2, 2, 2, 559, 560, 7, 110, 2, 2, 560, 561, 7, 103, 2, 2, 561, 80, 3, 2, 2, 2, 562, 563, 7, 105, 2, 2, 563, 564, 7, 118, 2, 2, 564, 82, 3, 2, 2, 2, 565, 566, 7, 105, 2, 2, 566, 567, 7, 103, 2, 2, 567, 84, 3, 2, 2, 2, 568, 569, 7, 35, 2, 2, 569, 570, 7, 63, 2, 2, 570, 86, 3, 2, 2, 2, 571, 572, 7, 62, 2, 2, 572, 88, 3, 2, 2, 2, 573, 574, 7, 62, 2, 2, 574, 575, 7, 63, 2, 2, 575, 90, 3, 2, 2, 2, 576, 577, 7, 64, 2, 2, 577, 92, 3, 2, 2, 2, 578, 579, 7, 64, 2, 2, 579, 580, 7, 63, 2, 2, 580, 94, 3, 2, 2, 2, 581, 582, 7, 126, 2, 2, 582, 583, 7, 126, 2, 2, 583, 96, 3, 2, 2, 2, 584, 585, 7, 45, 2, 2, 585, 98, 3, 2, 2, 2, 586, 587, 7, 47, 2, 2, 587, 100, 3, 2, 2, 2, 588, 589, 7, 102, 2, 2, 589, 590, 7, 107, 2, 2, 590, 591, 7, 120, 2, 2, 591, 102, 3, 2, 2, 2, 592, 593, 7, 107, 2, 2, 593, 594, 7, 102, 2, 2, 594, 595, 7, 107, 2, 2, 595, 596, 7, 120, 2, 2, 596, 104, 3, 2, 2, 2, 597, 598, 7, 111, 2, 2, 598, 599, 7, 113, 2, 2, 599, 600, 7, 102, 2, 2, 600, 106, 3, 2, 2, 2, 601, 602, 7, 35, 2, 2, 602, 108, 3, 2, 2, 2, 603, 604, 7, 93, 2, 2, 604, 110, 3, 2, 2, 2, 605, 606, 7, 95, 2, 2, 606, 112, 3, 2, 2, 2, 607, 608, 7, 48, 2, 2, 608, 114, 3, 2, 2, 2, 609, 610, 7, 38, 2, 2, 610, 611, 7, 38, 2, 2, 611, 116, 3, 2, 2, 2, 612, 613, 7, 37, 2, 2, 613, 118, 3, 2, 2, 2, 614, 615, 7, 125, 2, 2, 615, 616, 7, 126, 2, 2, 616, 120, 3, 2, 2, 2, 617, 618, 7, 126, 2, 2, 618, 619, 7, 127, 2, 2, 619, 122, 3, 2, 2, 2, 620, 621, 7, 104, 2, 2, 621, 622, 7, 113, 2, 2, 622, 623, 7, 116, 2, 2, 623, 124, 3, 2, 2, 2, 624, 625, 7, 110, 2, 2, 625, 626, 7, 103, 2, 2, 626, 627, 7, 118, 2, 2, 627, 126, 3, 2, 2, 2, 628, 629, 7, 121, 2, 2, 629, 630, 7, 106, 2, 2, 630, 631, 7, 103, 2, 2, 631, 632, 7, 116, 2, 2, 632, 633, 7, 103, 2, 2, 633, 128, 3, 2, 2, 2, 634, 635, 7, 105, 2, 2, 635, 636, 7, 116, 2, 2, 636, 637, 7, 113, 2, 2, 637, 638, 7, 119, 2, 2, 638, 639, 7, 114, 2, 2, 639, 130, 3, 2, 2, 2, 640, 641, 7, 100, 2, 2, 641, 642, 7, 123, 2, 2, 642, 132, 3, 2, 2, 2, 643, 644, 7, 113, 2, 2, 644, 645, 7, 116, 2, 2, 645, 646, 7, 102, 2, 2, 646, 647, 7, 103, 2, 2, 647, 648, 7, 116, 2, 2, 648, 134, 3, 2, 2, 2, 649, 650, 7, 116, 2, 2, 650, 651, 7, 103, 2, 2, 651, 652, 7, 118, 2, 2, 652, 653, 7, 119, 2, 2, 653, 654, 7, 116, 2, 2, 654, 655, 7, 112, 2, 2, 655, 136, 3, 2, 2, 2, 656, 657, 7, 107, 2, 2, 657, 658, 7, 104, 2, 2, 658, 138, 3, 2, 2, 2, 659, 660, 7, 107, 2, 2, 660, 661, 7, 112, 2, 2, 661, 140, 3, 2, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 117, 2, 2, 664, 142, 3, 2, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 118, 2, 2, 667, 144, 3, 2, 2, 2, 668, 669, 7, 99, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 113, 2, 2, 672, 673, 7, 121, 2, 2, 673, 674, 7, 107, 2, 2, 674, 675, 7, 112, 2, 2, 675, 676, 7, 105, 2, 2, 676, 146, 3, 2, 2, 2, 677, 678, 7, 103, 2, 2, 678, 679, 7, 111, 2, 2, 679, 680, 7, 114, 2, 2, 680, 681, 7, 118, 2, 2, 681, 682, 7, 123, 2, 2, 682, 148, 3, 2, 2, 2, 683, 684, 7, 101, 2, 2, 684, 685, 7, 113, 2, 2, 685, 686, 7, 119, 2, 2, 686, 687, 7, 112, 2, 2, 687, 688, 7, 118, 2, 2, 688, 150, 3, 2, 2, 2, 689, 690, 7, 117, 2, 2, 690, 691, 7, 118, 2, 2, 691, 692, 7, 99, 2, 2, 692, 693, 7, 100, 2, 2, 693, 694, 7, 110, 2, 2, 694, 695, 7, 103, 2, 2, 695, 152, 3, 2, 2, 2, 696, 697, 7, 99, 2, 2, 697, 698, 7, 117, 2, 2, 698, 699, 7, 101, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 112, 2, 2, 701, 702, 7, 102, 2, 2, 702, 703, 7, 107, 2, 2, 703, 704, 7, 112, 2, 2, 704, 705, 7, 105, 2, 2, 705, 154, 3, 2, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 117, 2, 2, 709, 710, 7, 101, 2, 2, 710, 711, 7, 103, 2, 2, 711, 712, 7, 112, 2, 2, 712, 713, 7, 102, 2, 2, 713, 714, 7, 107, 2, 2, 714, 715, 7, 112, 2, 2, 715, 716, 7, 105, 2, 2, 716, 156, 3, 2, 2, 2, 717, 718, 7, 117, 2, 2, 718, 719, 7, 113, 2, 2, 719, 720, 7, 111, 2, 2, 720, 721, 7, 103, 2, 2, 721, 158, 3, 2, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 120, 2, 2, 724, 725, 7, 103, 2, 2, 725, 726, 7, 116, 2, 2, 726, 727, 7, 123, 2, 2, 727, 160, 3, 2, 2, 2, 728, 729, 7, 117, 2, 2, 729, 730, 7, 99, 2, 2, 730, 731, 7, 118, 2, 2, 731, 732, 7, 107, 2, 2, 732, 733, 7, 117, 2, 2, 733, 734, 7, 104, 2, 2, 734, 735, 7, 107, 2, 2, 735, 736, 7, 103, 2, 2, 736, 737, 7, 117, 2, 2, 737, 162, 3, 2, 2, 2, 738, 739, 7, 101, 2, 2, 739, 740, 7, 113, 2, 2, 740, 741, 7, 110, 2, 2, 741, 742, 7, 110, 2, 2, 742, 743, 7, 99, 2, 2, 743, 744, 7, 118, 2, 2, 744, 745, 7, 107, 2, 2, 745, 746, 7, 113, 2, 2, 746, 747, 7, 112, 2, 2, 747, 164, 3, 2, 2, 2, 748, 749, 7, 105, 2, 2, 749, 750, 7, 116, 2, 2, 750, 751, 7, 103, 2, 2, 751, 752, 7, 99, 2, 2, 752, 753, 7, 118, 2, 2, 753, 754, 7, 103, 2, 2, 754, 755, 7, 117, 2, 2, 755, 756, 7, 118, 2, 2, 756, 166, 3, 2, 2, 2, 757, 758, 7, 110, 2, 2, 758, 759, 7, 103, 2, 2, 759, 760, 7, 99, 2, 2, 760, 761, 7, 117, 2, 2, 761, 762, 7, 118, 2, 2, 762, 168, 3, 2, 2, 2, 763, 764, 7, 117, 2, 2, 764, 765, 7, 121, 2, 2, 765, 766, 7, 107, 2, 2, 766, 767, 7, 118, 2, 2, 767, 768, 7, 101, 2, 2, 768, 769, 7, 106, 2, 2, 769, 170, 3, 2, 2, 2, 770, 771, 7, 101, 2, 2, 771, 772, 7, 99, 2, 2, 772, 773, 7, 117, 2, 2, 773, 774, 7, 103, 2, 2, 774, 172, 3, 2, 2, 2, 775, 776, 7, 118, 2, 2, 776, 777, 7, 116, 2, 2, 777, 778, 7, 123, 2, 2, 778, 174, 3, 2, 2, 2, 779, 780, 7, 101, 2, 2, 780, 781, 7, 99, 2, 2, 781, 782, 7, 118, 2, 2, 782, 783, 7, 101, 2, 2, 783, 784, 7, 106, 2, 2, 784, 176, 3, 2, 2, 2, 785, 786, 7, 102, 2, 2, 786, 787, 7, 103, 2, 2, 787, 788, 7, 104, 2, 2, 788, 789, 7, 99, 2, 2, 789, 790, 7, 119, 2, 2, 790, 791, 7, 110, 2, 2, 791, 792, 7, 118, 2, 2, 792, 178, 3, 2, 2, 2, 793, 794, 7, 118, 2, 2, 794, 795, 7, 106, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 112, 2, 2, 797, 180, 3, 2, 2, 2, 798, 799, 7, 103, 2, 2, 799, 800, 7, 110, 2, 2, 800, 801, 7, 117, 2, 2, 801, 802, 7, 103, 2, 2, 802, 182, 3, 2, 2, 2, 803, 804, 7, 118, 2, 2, 804, 805, 7, 123, 2, 2, 805, 806, 7, 114, 2, 2, 806, 807, 7, 103, 2, 2, 807, 808, 7, 117, 2, 2, 808, 809, 7, 121, 2, 2, 809, 810, 7, 107, 2, 2, 810, 811, 7, 118, 2, 2, 811, 812, 7, 101, 2, 2, 812, 813, 7, 106, 2, 2, 813, 184, 3, 2, 2, 2, 814, 815, 7, 113, 2, 2, 815, 816, 7, 116, 2, 2, 816, 186, 3, 2, 2, 2, 817, 818, 7, 99, 2, 2, 818, 819, 7, 112, 2, 2, 819, 820, 7, 102, 2, 2, 820, 188, 3, 2, 2, 2, 821, 822, 7, 112, 2, 2, 822, 823, 7, 113, 2, 2, 823, 824, 7, 118, 2, 2, 824, 190, 3, 2, 2, 2, 825, 826, 7, 118, 2, 2, 826, 827, 7, 113, 2, 2, 827, 192, 3, 2, 2, 2, 828, 829, 7, 107, 2, 2, 829, 830, 7, 112, 2, 2, 830, 831, 7, 117, 2, 2, 831, 832, 7, 118, 2, 2, 832, 833, 7, 99, 2, 2, 833, 834, 7, 112, 2, 2, 834, 835, 7, 101, 2, 2, 835, 836, 7, 103, 2, 2, 836, 194, 3, 2, 2, 2, 837, 838, 7, 113, 2, 2, 838, 839, 7, 104, 2, 2, 839, 196, 3, 2, 2, 2, 840, 841, 7, 117, 2, 2, 841, 842, 7, 118, 2, 2, 842, 843, 7, 99, 2, 2, 843, 844, 7, 118, 2, 2, 844, 845, 7, 107, 2, 2, 845, 846, 7, 101, 2, 2, 846, 847, 7, 99, 2, 2, 847, 848, 7, 110, 2, 2, 848, 849, 7, 110, 2, 2, 849, 850, 7, 123, 2, 2, 850, 198, 3, 2, 2, 2, 851, 852, 7, 107, 2, 2, 852, 853, 7, 117, 2, 2, 853, 200, 3, 2, 2, 2, 854, 855, 7, 118, 2, 2, 855, 856, 7, 116, 2, 2, 856, 857, 7, 103, 2, 2, 857, 858, 7, 99, 2, 2, 858, 859, 7, 118, 2, 2, 859, 202, 3, 2, 2, 2, 860, 861, 7, 101, 2, 2, 861, 862, 7, 99, 2, 2, 862, 863, 7, 117, 2, 2, 863, 864, 7, 118, 2, 2, 864, 204, 3, 2, 2, 2, 865, 866, 7, 101, 2, 2, 866, 867, 7, 99, 2, 2, 867, 868, 7, 117, 2, 2, 868, 869, 7, 118, 2, 2, 869, 870, 7, 99, 2, 2, 870, 871, 7, 100, 2, 2, 871, 872, 7, 110, 2, 2, 872, 873, 7, 103, 2, 2, 873, 206, 3, 2, 2, 2, 874, 875, 7, 120, 2, 2, 875, 876, 7, 103, 2, 2, 876, 877, 7, 116, 2, 2, 877, 878, 7, 117, 2, 2, 878, 879, 7, 107, 2, 2, 879, 880, 7, 113, 2, 2, 880, 881, 7, 112, 2, 2, 881, 208, 3, 2, 2, 2, 882, 883, 7, 108, 2, 2, 883, 884, 7, 117, 2, 2, 884, 885, 7, 113, 2, 2, 885, 886, 7, 112, 2, 2, 886, 887, 7, 107, 2, 2, 887, 888, 7, 115, 2, 2, 888, 210, 3, 2, 2, 2, 889, 890, 7, 119, 2, 2, 890, 891, 7, 112, 2, 2, 891, 892, 7, 113, 2, 2, 892, 893, 7, 116, 2, 2, 893, 894, 7, 102, 2, 2, 894, 895, 7, 103, 2, 2, 895, 896, 7, 116, 2, 2, 896, 897, 7, 103, 2, 2, 897, 898, 7, 102, 2, 2, 898, 212, 3, 2, 2, 2, 899, 900, 7, 118, 2, 2, 900, 901, 7, 116, 2, 2, 901, 902, 7, 119, 2, 2, 902, 903, 7, 103, 2, 2, 903, 214, 3, 2, 2, 2, 904, 905, 7, 104, 2, 2, 905, 906, 7, 99, 2, 2, 906, 907, 7, 110, 2, 2, 907, 908, 7, 117, 2, 2, 908, 909, 7, 103, 2, 2, 909, 216, 3, 2, 2, 2, 910, 911, 7, 118, 2, 2, 911, 912, 7, 123, 2, 2, 912, 913, 7, 114, 2, 2, 913, 914, 7, 103, 2, 2, 914, 218, 3, 2, 2, 2, 915, 916, 7, 120, 2, 2, 916, 917, 7, 99, 2, 2, 917, 918, 7, 110, 2, 2, 918, 919, 7, 107, 2, 2, 919, 920, 7, 102, 2, 2, 920, 921, 7, 99, 2, 2, 921, 922, 7, 118, 2, 2, 922, 923, 7, 103, 2, 2, 923, 220, 3, 2, 2, 2, 924, 925, 7, 99, 2, 2, 925, 926, 7, 112, 2, 2, 926, 927, 7, 112, 2, 2, 927, 928, 7, 113, 2, 2, 928, 929, 7, 118, 2, 2, 929, 930, 7, 99, 2, 2, 930, 931, 7, 118, 2, 2, 931, 932, 7, 103, 2, 2, 932, 222, 3, 2, 2, 2, 933, 934, 7, 102, 2, 2, 934, 935, 7, 103, 2, 2, 935, 936, 7, 101, 2, 2, 936, 937, 7, 110, 2, 2, 937, 938, 7, 99, 2, 2, 938, 939, 7, 116, 2, 2, 939, 940, 7, 103, 2, 2, 940, 224, 3, 2, 2, 2, 941, 942, 7, 101, 2, 2, 942, 943, 7, 113, 2, 2, 943, 944, 7, 112, 2, 2, 944, 945, 7, 118, 2, 2, 945, 946, 7, 103, 2, 2, 946, 947, 7, 122, 2, 2, 947, 948, 7, 118, 2, 2, 948, 226, 3, 2, 2, 2, 949, 950, 7, 107, 2, 2, 950, 951, 7, 118, 2, 2, 951, 952, 7, 103, 2, 2, 952, 953, 7, 111, 2, 2, 953, 228, 3, 2, 2, 2, 954, 955, 7, 120, 2, 2, 955, 956, 7, 99, 2, 2, 956, 957, 7, 116, 2, 2, 957, 958, 7, 107, 2, 2, 958, 959, 7, 99, 2, 2, 959, 960, 7, 100, 2, 2, 960, 961, 7, 110, 2, 2, 961, 962, 7, 103, 2, 2, 962, 230, 3, 2, 2, 2, 963, 964, 7, 107, 2, 2, 964, 965, 7, 112, 2, 2, 965, 966, 7, 117, 2, 2, 966, 967, 7, 103, 2, 2, 967, 968, 7, 116, 2, 2, 968, 969, 7, 118, 2, 2, 969, 232, 3, 2, 2, 2, 970, 971, 7, 102, 2, 2, 971, 972, 7, 103, 2, 2, 972, 973, 7, 110, 2, 2, 973, 974, 7, 103, 2, 2, 974, 975, 7, 118, 2, 2, 975, 976, 7, 103, 2, 2, 976, 234, 3, 2, 2, 2, 977, 978, 7, 116, 2, 2, 978, 979, 7, 103, 2, 2, 979, 980, 7, 112, 2, 2, 980, 981, 7, 99, 2, 2, 981, 982, 7, 111, 2, 2, 982, 983, 7, 103, 2, 2, 983, 236, 3, 2, 2, 2, 984, 985, 7, 116, 2, 2, 985, 986, 7, 103, 2, 2, 986, 987, 7, 114, 2, 2, 987, 988, 7, 110, 2, 2, 988, 989, 7, 99, 2, 2, 989, 990, 7, 101, 2, 2, 990, 991, 7, 103, 2, 2, 991, 238, 3, 2, 2, 2, 992, 993, 7, 101, 2, 2, 993, 994, 7, 113, 2, 2, 994, 995, 7, 114, 2, 2, 995, 996, 7, 123, 2, 2, 996, 240, 3, 2, 2, 2, 997, 998, 7, 111, 2, 2, 998, 999, 7, 113, 2, 2, 999, 1000, 7, 102, 2, 2, 1000, 1001, 7, 107, 2, 2, 1001, 1002, 7, 104, 2, 2, 1002, 1003, 7, 123, 2, 2, 1003, 242, 3, 2, 2, 2, 1004, 1005, 7, 99, 2, 2, 1005, 1006, 7, 114, 2, 2, 1006, 1007, 7, 114, 2, 2, 1007, 1008, 7, 103, 2, 2, 1008, 1009, 7, 112, 2, 2, 1009, 1010, 7, 102, 2, 2, 1010, 244, 3, 2, 2, 2, 1011, 1012, 7, 107, 2, 2, 1012, 1013, 7, 112, 2, 2, 1013, 1014, 7, 118, 2, 2, 1014, 1015, 7, 113, 2, 2, 1015, 246, 3, 2, 2, 2, 1016, 1017, 7, 120, 2, 2, 1017, 1018, 7, 99, 2, 2, 1018, 1019, 7, 110, 2, 2, 1019, 1020, 7, 119, 2, 2, 1020, 1021, 7, 103, 2, 2, 1021, 248, 3, 2, 2, 2, 1022, 1023, 7, 121, 2, 2, 1023, 1024, 7, 107, 2, 2, 1024, 1025, 7, 118, 2, 2, 1025, 1026, 7, 106, 2, 2, 1026, 250, 3, 2, 2, 2, 1027, 1028, 7, 114, 2, 2, 1028, 1029, 7, 113, 2, 2, 1029, 1030, 7, 117, 2, 2, 1030, 1031, 7, 107, 2, 2, 1031, 1032, 7, 118, 2, 2, 1032, 1033, 7, 107, 2, 2, 1033, 1034, 7, 113, 2, 2, 1034, 1035, 7, 112, 2, 2, 1035, 252, 3, 2, 2, 2, 1036, 1037, 7, 108, 2, 2, 1037, 1038, 7, 117, 2, 2, 1038, 1039, 7, 113, 2, 2, 1039, 1040, 7, 112, 2, 2, 1040, 254, 3, 2, 2, 2, 1041, 1042, 7, 119, 2, 2, 1042, 1043, 7, 114, 2, 2, 1043, 1044, 7, 102, 2, 2, 1044, 1045, 7, 99, 2, 2, 1045, 1046, 7, 118, 2, 2, 1046, 1047, 7, 107, 2, 2, 1047, 1048, 7, 112, 2, 2, 1048, 1049, 7, 105, 2, 2, 1049, 256, 3, 2, 2, 2, 1050, 1051, 7, 100, 2, 2, 1051, 1052, 7, 116, 2, 2, 1052, 1053, 7, 103, 2, 2, 1053, 1054, 7, 99, 2, 2, 1054, 1055, 7, 109, 2, 2, 1055, 258, 3, 2, 2, 2, 1056, 1057, 7, 110, 2, 2, 1057, 1058, 7, 113, 2, 2, 1058, 1059, 7, 113, 2, 2, 1059, 1060, 7, 114, 2, 2, 1060, 260, 3, 2, 2, 2, 1061, 1062, 7, 101, 2, 2, 1062, 1063, 7, 113, 2, 2, 1063, 1064, 7, 112, 2, 2, 1064, 1065, 7, 118, 2, 2, 1065, 1066, 7, 107, 2, 2, 1066, 1067, 7, 112, 2, 2, 1067, 1068, 7, 119, 2, 2, 1068, 1069, 7, 103, 2, 2, 1069, 262, 3, 2, 2, 2, 1070, 1071, 7, 103, 2, 2, 1071, 1072, 7, 122, 2, 2, 1072, 1073, 7, 107, 2, 2, 1073, 1074, 7, 118, 2, 2, 1074, 264, 3, 2, 2, 2, 1075, 1076, 7, 116, 2, 2, 1076, 1077, 7, 103, 2, 2, 1077, 1078, 7, 118, 2, 2, 1078, 1079, 7, 119, 2, 2, 1079, 1080, 7, 116, 2, 2, 1080, 1081, 7, 112, 2, 2, 1081, 1082, 7, 107, 2, 2, 1082, 1083, 7, 112, 2, 2, 1083, 1084, 7, 105, 2, 2, 1084, 266, 3, 2, 2, 2, 1085, 1086, 7, 121, 2, 2, 1086, 1087, 7, 106, 2, 2, 1087, 1088, 7, 107, 2, 2, 1088, 1089, 7, 110, 2, 2, 1089, 1090, 7, 103, 2, 2, 1090, 268, 3, 2, 2, 2, 1091, 1096, 7, 36, 2, 2, 1092, 1095, 5, 271, 136, 2, 1093, 1095, 10, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1094, 1093, 3, 2, 2, 2, 1095, 1098, 3, 2, 2, 2, 1096, 1094, 3, 2, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1099, 3, 2, 2, 2, 1098, 1096, 3, 2, 2, 2, 1099, 1100, 7, 36, 2, 2, 1100, 270, 3, 2, 2, 2, 1101, 1104, 7, 94, 2, 2, 1102, 1105, 9, 3, 2, 2, 1103, 1105, 5, 273, 137, 2, 1104, 1102, 3, 2, 2, 2, 1104, 1103, 3, 2, 2, 2, 1105, 272, 3, 2, 2, 2, 1106, 1107, 7, 119, 2, 2, 1107, 1108, 5, 275, 138, 2, 1108, 1109, 5, 275, 138, 2, 1109, 1110, 5, 275, 138, 2, 1110, 1111, 5, 275, 138, 2, 1111, 274, 3, 2, 2, 2, 1112, 1113, 9, 4, 2, 2, 1113, 276, 3, 2, 2, 2, 1114, 1115, 7, 65, 2, 2, 1115, 278, 3, 2, 2, 2, 1116, 1117, 7, 112, 2, 2, 1117, 1118, 7, 119, 2, 2, 1118, 1119, 7, 110, 2, 2, 1119, 1120, 7, 110, 2, 2, 1120, 280, 3, 2, 2, 2, 1121, 1122, 5, 283, 142, 2, 1122, 282, 3, 2, 2, 2, 1123, 1127, 5, 285, 143, 2, 1124, 1127, 5, 287, 144, 2, 1125, 1127, 5, 289, 145, 2, 1126, 1123, 3, 2, 2, 2, 1126, 1124, 3, 2, 2, 2, 1126, 1125, 3, 2, 2, 2, 1127, 284, 3, 2, 2, 2, 1128, 1129, 5, 291, 146, 2, 1129, 286, 3, 2, 2, 2, 1130, 1131, 7, 48, 2, 2, 1131, 1141, 5, 291, 146, 2, 1132, 1133, 5, 291, 146, 2, 1133, 1137, 7, 48, 2, 2, 1134, 1136, 9, 5, 2, 2, 1135, 1134, 3, 2, 2, 2, 1136, 1139, 3, 2, 2, 2, 1137, 1135, 3, 2, 2, 2, 1137, 1138, 3, 2, 2, 2, 1138, 1141, 3, 2, 2, 2, 1139, 1137, 3, 2, 2, 2, 1140, 1130, 3, 2, 2, 2, 1140, 1132, 3, 2, 2, 2, 1141, 288, 3, 2, 2, 2, 1142, 1143, 7, 48, 2, 2, 1143, 1155, 5, 291, 146, 2, 1144, 1152, 5, 291, 146, 2, 1145, 1149, 7, 48, 2, 2, 1146, 1148, 9, 5, 2, 2, 1147, 1146, 3, 2, 2, 2, 1148, 1151, 3, 2, 2, 2, 1149, 1147, 3, 2, 2, 2, 1149, 1150, 3, 2, 2, 2, 1150, 1153, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1152, 1145, 3, 2, 2, 2, 1152, 1153, 3, 2, 2, 2, 1153, 1155, 3, 2, 2, 2, 1154, 1142, 3, 2, 2, 2, 1154, 1144, 3, 2, 2, 2, 1155, 1156, 3, 2, 2, 2, 1156, 1158, 9, 6, 2, 2, 1157, 1159, 9, 7, 2, 2, 1158, 1157, 3, 2, 2, 2, 1158, 1159, 3, 2, 2, 2, 1159, 1160, 3, 2, 2, 2, 1160, 1161, 5, 291, 146, 2, 1161, 290, 3, 2, 2, 2, 1162, 1164, 9, 5, 2, 2, 1163, 1162, 3, 2, 2, 2, 1164, 1165, 3, 2, 2, 2, 1165, 1163, 3, 2, 2, 2, 1165, 1166, 3, 2, 2, 2, 1166, 292, 3, 2, 2, 2, 1167, 1168, 9, 8, 2, 2, 1168, 1169, 3, 2, 2, 2, 1169, 1170, 8, 147, 2, 2, 1170, 294, 3, 2, 2, 2, 1171, 1175, 5, 297, 149, 2, 1172, 1174, 5, 299, 150, 2, 1173, 1172, 3, 2, 2, 2, 1174, 1177, 3, 2, 2, 2, 1175, 1173, 3, 2, 2, 2, 1175, 1176, 3, 2, 2, 2, 1176, 296, 3, 2, 2, 2, 1177, 1175, 3, 2, 2, 2, 1178, 1180, 9, 9, 2, 2, 1179, 1178, 3, 2, 2, 2, 1180, 298, 3, 2, 2, 2, 1181, 1184, 5, 297, 149, 2, 1182, 1184, 9, 10, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 300, 3, 2, 2, 2, 1185, 1186, 7, 42, 2, 2, 1186, 1195, 7, 60, 2, 2, 1187, 1194, 5, 301, 151, 2, 1188, 1189, 7, 42, 2, 2, 1189, 1194, 10, 11, 2, 2, 1190, 1191, 7, 60, 2, 2, 1191, 1194, 10, 12, 2, 2, 1192, 1194, 10, 13, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 1197, 3, 2, 2, 2, 1195, 1193, 3, 2, 2, 2, 1195, 1196, 3, 2, 2, 2, 1196, 1199, 3, 2, 2, 2, 1197, 1195, 3, 2, 2, 2, 1198, 1200, 7, 60, 2, 2, 1199, 1198, 3, 2, 2, 2, 1200, 1201, 3, 2, 2, 2, 1201, 1199, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1203, 3, 2, 2, 2, 1203, 1204, 7, 43, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 8, 151, 2, 2, 1206, 302, 3, 2, 2, 2, 1207, 1208, 10, 14, 2, 2, 1208, 304, 3, 2, 2, 2, 20, 2, 1094, 1096, 1104, 1126, 1137, 1140, 1149, 1152, 1154, 1158, 1165, 1175, 1179, 1183, 1193, 1195, 1201, 3, 2, 3, 2] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java index 1b99efc9dc..6edd67492b 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java @@ -39,11 +39,11 @@ public class JsoniqLexer extends Lexer { Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108, Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114, Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120, - Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126, - Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132, - STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137, - IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142, - XQComment=143, ContentChar=144; + Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126, + Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132, + Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137, + NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141, + WS=142, NCName=143, XQComment=144, ContentChar=145; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -70,9 +70,9 @@ private static String[] makeRuleNames() { "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend", - "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", "Kbreak", "Kloop", - "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", "UNICODE", - "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", + "Kinto", "Kvalue", "Kwith", "Kposition", "Kjson", "Kupdating", "Kbreak", + "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", + "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS", "NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar" }; @@ -98,9 +98,9 @@ private static String[] makeLiteralNames() { "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'", - "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'", - "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'", - "'returning'", "'while'", null, "'?'", "'null'" + "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'", + "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'", + "'exit'", "'returning'", "'while'", null, "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -119,10 +119,10 @@ private static String[] makeSymbolicNames() { "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", - "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", - "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", - "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", - "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", + "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith", + "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit", + "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" }; } @@ -185,7 +185,7 @@ public JsoniqLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0092\u04ae\b\1\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0093\u04b9\b\1\4"+ "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ @@ -204,65 +204,66 @@ public JsoniqLexer(CharStream input) { "\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+ "\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+ "\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+ - "\4\u0097\t\u0097\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+ - "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\t\3\t\3\n"+ - "\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22"+ - "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ - "\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+ - "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+ - "\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+ - "\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33"+ - "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34"+ - "\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ - "\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!"+ - "\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3"+ - "$\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3"+ - "*\3*\3+\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3"+ - "\62\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+ - "\65\3\66\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3<\3<\3<\3=\3=\3=\3"+ - ">\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B\3"+ - "C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3"+ - "H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3"+ - "L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3"+ - "N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3"+ - "Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3T\3"+ - "T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3"+ - "X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3"+ - "\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3"+ - "_\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3"+ - "c\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3"+ - "g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3"+ - "j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3n\3"+ - "n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3"+ - "p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3s\3"+ - "s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3v\3v\3w\3"+ - "w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3y\3y\3z\3z\3z\3z\3"+ - "z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3~\3~\3~\3~\3"+ - "~\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080"+ - "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081"+ - "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+ - "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084"+ - "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085"+ - "\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\7\u0086\u043c\n\u0086"+ - "\f\u0086\16\u0086\u043f\13\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087"+ - "\5\u0087\u0446\n\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088"+ - "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u045c\n\u008d\3\u008e"+ - "\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\7\u008f\u0465\n\u008f"+ - "\f\u008f\16\u008f\u0468\13\u008f\5\u008f\u046a\n\u008f\3\u0090\3\u0090"+ - "\3\u0090\3\u0090\3\u0090\7\u0090\u0471\n\u0090\f\u0090\16\u0090\u0474"+ - "\13\u0090\5\u0090\u0476\n\u0090\5\u0090\u0478\n\u0090\3\u0090\3\u0090"+ - "\5\u0090\u047c\n\u0090\3\u0090\3\u0090\3\u0091\6\u0091\u0481\n\u0091\r"+ - "\u0091\16\u0091\u0482\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ - "\7\u0093\u048b\n\u0093\f\u0093\16\u0093\u048e\13\u0093\3\u0094\5\u0094"+ - "\u0491\n\u0094\3\u0095\3\u0095\5\u0095\u0495\n\u0095\3\u0096\3\u0096\3"+ - "\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\7\u0096\u049f\n\u0096\f"+ - "\u0096\16\u0096\u04a2\13\u0096\3\u0096\6\u0096\u04a5\n\u0096\r\u0096\16"+ - "\u0096\u04a6\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\2\2\u0098"+ + "\4\u0097\t\u0097\4\u0098\t\u0098\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"+ + "\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\b"+ + "\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\20"+ + "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\3\22\3\22\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25"+ + "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ + "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27"+ + "\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31"+ + "\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+ + "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34"+ + "\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ + "\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+ + "\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 "+ + "\3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3"+ + "#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3"+ + "(\3)\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3"+ + "\60\3\61\3\61\3\62\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3"+ + "\65\3\65\3\65\3\65\3\66\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3<\3"+ + "<\3<\3=\3=\3=\3>\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3"+ + "A\3A\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3"+ + "F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3"+ + "K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3"+ + "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3"+ + "Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3"+ + "S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+ + "W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3"+ + "[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^"+ + "\3^\3^\3_\3_\3_\3_\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c"+ + "\3c\3c\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f"+ + "\3g\3g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i"+ + "\3i\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m"+ + "\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3o\3p"+ + "\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v"+ + "\3v\3v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3y"+ + "\3y\3z\3z\3z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3|\3}\3}\3}\3}"+ + "\3}\3~\3~\3~\3~\3~\3~\3~\3~\3~\3\177\3\177\3\177\3\177\3\177\3\u0080\3"+ + "\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081"+ + "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082"+ + "\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+ + "\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\7\u0087\u0447"+ + "\n\u0087\f\u0087\16\u0087\u044a\13\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+ + "\3\u0088\5\u0088\u0451\n\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ + "\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c"+ + "\3\u008c\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\5\u008e\u0467\n\u008e"+ + "\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\7\u0090\u0470"+ + "\n\u0090\f\u0090\16\u0090\u0473\13\u0090\5\u0090\u0475\n\u0090\3\u0091"+ + "\3\u0091\3\u0091\3\u0091\3\u0091\7\u0091\u047c\n\u0091\f\u0091\16\u0091"+ + "\u047f\13\u0091\5\u0091\u0481\n\u0091\5\u0091\u0483\n\u0091\3\u0091\3"+ + "\u0091\5\u0091\u0487\n\u0091\3\u0091\3\u0091\3\u0092\6\u0092\u048c\n\u0092"+ + "\r\u0092\16\u0092\u048d\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094"+ + "\7\u0094\u0496\n\u0094\f\u0094\16\u0094\u0499\13\u0094\3\u0095\5\u0095"+ + "\u049c\n\u0095\3\u0096\3\u0096\5\u0096\u04a0\n\u0096\3\u0097\3\u0097\3"+ + "\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097\u04aa\n\u0097\f"+ + "\u0097\16\u0097\u04ad\13\u0097\3\u0097\6\u0097\u04b0\n\u0097\r\u0097\16"+ + "\u0097\u04b1\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\2\2\u0099"+ "\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+ "\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+ "= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+ @@ -274,25 +275,25 @@ public JsoniqLexer(CharStream input) { "p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+ "z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101"+ "\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b\u0087\u010d"+ - "\2\u010f\2\u0111\2\u0113\u0088\u0115\u0089\u0117\u008a\u0119\u008b\u011b"+ - "\u008c\u011d\u008d\u011f\u008e\u0121\2\u0123\u008f\u0125\u0090\u0127\2"+ - "\u0129\2\u012b\u0091\u012d\u0092\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhpptt"+ - "vv\5\2\62;CHch\3\2\62;\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|"+ - "\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f"+ - "\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62"+ - ";\u00b9\u00b9\u0302\u0371\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}"+ - "\177\177\2\u04ba\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+ - "\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+ - "\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+ - "!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+ - "\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+ - "\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+ - "\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+ - "\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+ - "\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k"+ - "\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2"+ - "\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2"+ - "\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+ + "\u0088\u010f\2\u0111\2\u0113\2\u0115\u0089\u0117\u008a\u0119\u008b\u011b"+ + "\u008c\u011d\u008d\u011f\u008e\u0121\u008f\u0123\2\u0125\u0090\u0127\u0091"+ + "\u0129\2\u012b\2\u012d\u0092\u012f\u0093\3\2\17\4\2$$^^\n\2$$\61\61^^"+ + "ddhhppttvv\5\2\62;CHch\3\2\62;\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2"+ + "C\\aac|\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e"+ + "\u200f\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2"+ + "//\62;\u00b9\u00b9\u0302\u0371\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$("+ + ")>>}}\177\177\2\u04c5\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2"+ + "\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25"+ + "\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2"+ + "\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2"+ + "\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3"+ + "\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2"+ + "\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2"+ + "Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3"+ + "\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2"+ + "\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2"+ + "w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2"+ + "\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+ "\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+ "\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+ "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2"+ @@ -307,298 +308,301 @@ public JsoniqLexer(CharStream input) { "\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+ "\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2"+ "\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109"+ - "\3\2\2\2\2\u010b\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2"+ - "\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0123"+ - "\3\2\2\2\2\u0125\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\3\u012f\3\2\2"+ - "\2\5\u0131\3\2\2\2\7\u0138\3\2\2\2\t\u0142\3\2\2\2\13\u0144\3\2\2\2\r"+ - "\u0146\3\2\2\2\17\u0149\3\2\2\2\21\u014b\3\2\2\2\23\u014d\3\2\2\2\25\u014f"+ - "\3\2\2\2\27\u0151\3\2\2\2\31\u0153\3\2\2\2\33\u0155\3\2\2\2\35\u0157\3"+ - "\2\2\2\37\u0159\3\2\2\2!\u0162\3\2\2\2#\u016a\3\2\2\2%\u0179\3\2\2\2\'"+ - "\u017b\3\2\2\2)\u018d\3\2\2\2+\u01a0\3\2\2\2-\u01a9\3\2\2\2/\u01b4\3\2"+ - "\2\2\61\u01b8\3\2\2\2\63\u01c0\3\2\2\2\65\u01ca\3\2\2\2\67\u01d5\3\2\2"+ - "\29\u01db\3\2\2\2;\u01ed\3\2\2\2=\u01f4\3\2\2\2?\u01fd\3\2\2\2A\u0206"+ - "\3\2\2\2C\u020d\3\2\2\2E\u0215\3\2\2\2G\u021d\3\2\2\2I\u0224\3\2\2\2K"+ - "\u0227\3\2\2\2M\u022a\3\2\2\2O\u022d\3\2\2\2Q\u0230\3\2\2\2S\u0233\3\2"+ - "\2\2U\u0236\3\2\2\2W\u0239\3\2\2\2Y\u023b\3\2\2\2[\u023e\3\2\2\2]\u0240"+ - "\3\2\2\2_\u0243\3\2\2\2a\u0246\3\2\2\2c\u0248\3\2\2\2e\u024a\3\2\2\2g"+ - "\u024e\3\2\2\2i\u0253\3\2\2\2k\u0257\3\2\2\2m\u0259\3\2\2\2o\u025b\3\2"+ - "\2\2q\u025d\3\2\2\2s\u025f\3\2\2\2u\u0262\3\2\2\2w\u0264\3\2\2\2y\u0267"+ - "\3\2\2\2{\u026a\3\2\2\2}\u026e\3\2\2\2\177\u0272\3\2\2\2\u0081\u0278\3"+ - "\2\2\2\u0083\u027e\3\2\2\2\u0085\u0281\3\2\2\2\u0087\u0287\3\2\2\2\u0089"+ - "\u028e\3\2\2\2\u008b\u0291\3\2\2\2\u008d\u0294\3\2\2\2\u008f\u0297\3\2"+ - "\2\2\u0091\u029a\3\2\2\2\u0093\u02a3\3\2\2\2\u0095\u02a9\3\2\2\2\u0097"+ - "\u02af\3\2\2\2\u0099\u02b6\3\2\2\2\u009b\u02c0\3\2\2\2\u009d\u02cb\3\2"+ - "\2\2\u009f\u02d0\3\2\2\2\u00a1\u02d6\3\2\2\2\u00a3\u02e0\3\2\2\2\u00a5"+ - "\u02ea\3\2\2\2\u00a7\u02f3\3\2\2\2\u00a9\u02f9\3\2\2\2\u00ab\u0300\3\2"+ - "\2\2\u00ad\u0305\3\2\2\2\u00af\u0309\3\2\2\2\u00b1\u030f\3\2\2\2\u00b3"+ - "\u0317\3\2\2\2\u00b5\u031c\3\2\2\2\u00b7\u0321\3\2\2\2\u00b9\u032c\3\2"+ - "\2\2\u00bb\u032f\3\2\2\2\u00bd\u0333\3\2\2\2\u00bf\u0337\3\2\2\2\u00c1"+ - "\u033a\3\2\2\2\u00c3\u0343\3\2\2\2\u00c5\u0346\3\2\2\2\u00c7\u0351\3\2"+ - "\2\2\u00c9\u0354\3\2\2\2\u00cb\u035a\3\2\2\2\u00cd\u035f\3\2\2\2\u00cf"+ - "\u0368\3\2\2\2\u00d1\u0370\3\2\2\2\u00d3\u0377\3\2\2\2\u00d5\u0381\3\2"+ - "\2\2\u00d7\u0386\3\2\2\2\u00d9\u038c\3\2\2\2\u00db\u0391\3\2\2\2\u00dd"+ - "\u039a\3\2\2\2\u00df\u03a3\3\2\2\2\u00e1\u03ab\3\2\2\2\u00e3\u03b3\3\2"+ - "\2\2\u00e5\u03b8\3\2\2\2\u00e7\u03c1\3\2\2\2\u00e9\u03c8\3\2\2\2\u00eb"+ - "\u03cf\3\2\2\2\u00ed\u03d6\3\2\2\2\u00ef\u03de\3\2\2\2\u00f1\u03e3\3\2"+ - "\2\2\u00f3\u03ea\3\2\2\2\u00f5\u03f1\3\2\2\2\u00f7\u03f6\3\2\2\2\u00f9"+ - "\u03fc\3\2\2\2\u00fb\u0401\3\2\2\2\u00fd\u0406\3\2\2\2\u00ff\u040f\3\2"+ - "\2\2\u0101\u0415\3\2\2\2\u0103\u041a\3\2\2\2\u0105\u0423\3\2\2\2\u0107"+ - "\u0428\3\2\2\2\u0109\u0432\3\2\2\2\u010b\u0438\3\2\2\2\u010d\u0442\3\2"+ - "\2\2\u010f\u0447\3\2\2\2\u0111\u044d\3\2\2\2\u0113\u044f\3\2\2\2\u0115"+ - "\u0451\3\2\2\2\u0117\u0456\3\2\2\2\u0119\u045b\3\2\2\2\u011b\u045d\3\2"+ - "\2\2\u011d\u0469\3\2\2\2\u011f\u0477\3\2\2\2\u0121\u0480\3\2\2\2\u0123"+ - "\u0484\3\2\2\2\u0125\u0488\3\2\2\2\u0127\u0490\3\2\2\2\u0129\u0494\3\2"+ - "\2\2\u012b\u0496\3\2\2\2\u012d\u04ac\3\2\2\2\u012f\u0130\7=\2\2\u0130"+ - "\4\3\2\2\2\u0131\u0132\7o\2\2\u0132\u0133\7q\2\2\u0133\u0134\7f\2\2\u0134"+ - "\u0135\7w\2\2\u0135\u0136\7n\2\2\u0136\u0137\7g\2\2\u0137\6\3\2\2\2\u0138"+ - "\u0139\7p\2\2\u0139\u013a\7c\2\2\u013a\u013b\7o\2\2\u013b\u013c\7g\2\2"+ - "\u013c\u013d\7u\2\2\u013d\u013e\7r\2\2\u013e\u013f\7c\2\2\u013f\u0140"+ - "\7e\2\2\u0140\u0141\7g\2\2\u0141\b\3\2\2\2\u0142\u0143\7?\2\2\u0143\n"+ - "\3\2\2\2\u0144\u0145\7&\2\2\u0145\f\3\2\2\2\u0146\u0147\7<\2\2\u0147\u0148"+ - "\7?\2\2\u0148\16\3\2\2\2\u0149\u014a\7}\2\2\u014a\20\3\2\2\2\u014b\u014c"+ - "\7\177\2\2\u014c\22\3\2\2\2\u014d\u014e\7*\2\2\u014e\24\3\2\2\2\u014f"+ - "\u0150\7+\2\2\u0150\26\3\2\2\2\u0151\u0152\7,\2\2\u0152\30\3\2\2\2\u0153"+ - "\u0154\7~\2\2\u0154\32\3\2\2\2\u0155\u0156\7\'\2\2\u0156\34\3\2\2\2\u0157"+ - "\u0158\7.\2\2\u0158\36\3\2\2\2\u0159\u015a\7q\2\2\u015a\u015b\7t\2\2\u015b"+ - "\u015c\7f\2\2\u015c\u015d\7g\2\2\u015d\u015e\7t\2\2\u015e\u015f\7k\2\2"+ - "\u015f\u0160\7p\2\2\u0160\u0161\7i\2\2\u0161 \3\2\2\2\u0162\u0163\7q\2"+ - "\2\u0163\u0164\7t\2\2\u0164\u0165\7f\2\2\u0165\u0166\7g\2\2\u0166\u0167"+ - "\7t\2\2\u0167\u0168\7g\2\2\u0168\u0169\7f\2\2\u0169\"\3\2\2\2\u016a\u016b"+ - "\7f\2\2\u016b\u016c\7g\2\2\u016c\u016d\7e\2\2\u016d\u016e\7k\2\2\u016e"+ - "\u016f\7o\2\2\u016f\u0170\7c\2\2\u0170\u0171\7n\2\2\u0171\u0172\7/\2\2"+ - "\u0172\u0173\7h\2\2\u0173\u0174\7q\2\2\u0174\u0175\7t\2\2\u0175\u0176"+ - "\7o\2\2\u0176\u0177\7c\2\2\u0177\u0178\7v\2\2\u0178$\3\2\2\2\u0179\u017a"+ - "\7<\2\2\u017a&\3\2\2\2\u017b\u017c\7f\2\2\u017c\u017d\7g\2\2\u017d\u017e"+ - "\7e\2\2\u017e\u017f\7k\2\2\u017f\u0180\7o\2\2\u0180\u0181\7c\2\2\u0181"+ - "\u0182\7n\2\2\u0182\u0183\7/\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+ - "\u0185\u0186\7r\2\2\u0186\u0187\7c\2\2\u0187\u0188\7t\2\2\u0188\u0189"+ - "\7c\2\2\u0189\u018a\7v\2\2\u018a\u018b\7q\2\2\u018b\u018c\7t\2\2\u018c"+ - "(\3\2\2\2\u018d\u018e\7i\2\2\u018e\u018f\7t\2\2\u018f\u0190\7q\2\2\u0190"+ - "\u0191\7w\2\2\u0191\u0192\7r\2\2\u0192\u0193\7k\2\2\u0193\u0194\7p\2\2"+ - "\u0194\u0195\7i\2\2\u0195\u0196\7/\2\2\u0196\u0197\7u\2\2\u0197\u0198"+ - "\7g\2\2\u0198\u0199\7r\2\2\u0199\u019a\7c\2\2\u019a\u019b\7t\2\2\u019b"+ - "\u019c\7c\2\2\u019c\u019d\7v\2\2\u019d\u019e\7q\2\2\u019e\u019f\7t\2\2"+ - "\u019f*\3\2\2\2\u01a0\u01a1\7k\2\2\u01a1\u01a2\7p\2\2\u01a2\u01a3\7h\2"+ - "\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7p\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7"+ - "\7v\2\2\u01a7\u01a8\7{\2\2\u01a8,\3\2\2\2\u01a9\u01aa\7o\2\2\u01aa\u01ab"+ - "\7k\2\2\u01ab\u01ac\7p\2\2\u01ac\u01ad\7w\2\2\u01ad\u01ae\7u\2\2\u01ae"+ - "\u01af\7/\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1\7k\2\2\u01b1\u01b2\7i\2\2"+ - "\u01b2\u01b3\7p\2\2\u01b3.\3\2\2\2\u01b4\u01b5\7P\2\2\u01b5\u01b6\7c\2"+ - "\2\u01b6\u01b7\7P\2\2\u01b7\60\3\2\2\2\u01b8\u01b9\7r\2\2\u01b9\u01ba"+ - "\7g\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7g\2\2\u01bd"+ - "\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\62\3\2\2\2\u01c0\u01c1\7r\2\2\u01c1"+ - "\u01c2\7g\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7/\2\2\u01c4\u01c5\7o\2\2"+ - "\u01c5\u01c6\7k\2\2\u01c6\u01c7\7n\2\2\u01c7\u01c8\7n\2\2\u01c8\u01c9"+ - "\7g\2\2\u01c9\64\3\2\2\2\u01ca\u01cb\7|\2\2\u01cb\u01cc\7g\2\2\u01cc\u01cd"+ - "\7t\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf\7/\2\2\u01cf\u01d0\7f\2\2\u01d0"+ - "\u01d1\7k\2\2\u01d1\u01d2\7i\2\2\u01d2\u01d3\7k\2\2\u01d3\u01d4\7v\2\2"+ - "\u01d4\66\3\2\2\2\u01d5\u01d6\7f\2\2\u01d6\u01d7\7k\2\2\u01d7\u01d8\7"+ - "i\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7v\2\2\u01da8\3\2\2\2\u01db\u01dc"+ - "\7r\2\2\u01dc\u01dd\7c\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7v\2\2\u01df"+ - "\u01e0\7g\2\2\u01e0\u01e1\7t\2\2\u01e1\u01e2\7p\2\2\u01e2\u01e3\7/\2\2"+ - "\u01e3\u01e4\7u\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7r\2\2\u01e6\u01e7"+ - "\7c\2\2\u01e7\u01e8\7t\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\7v\2\2\u01ea"+ - "\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec:\3\2\2\2\u01ed\u01ee\7k\2\2\u01ee"+ - "\u01ef\7o\2\2\u01ef\u01f0\7r\2\2\u01f0\u01f1\7q\2\2\u01f1\u01f2\7t\2\2"+ - "\u01f2\u01f3\7v\2\2\u01f3<\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5\u01f6\7z\2"+ - "\2\u01f6\u01f7\7v\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa"+ - "\7p\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc\7n\2\2\u01fc>\3\2\2\2\u01fd\u01fe"+ - "\7h\2\2\u01fe\u01ff\7w\2\2\u01ff\u0200\7p\2\2\u0200\u0201\7e\2\2\u0201"+ - "\u0202\7v\2\2\u0202\u0203\7k\2\2\u0203\u0204\7q\2\2\u0204\u0205\7p\2\2"+ - "\u0205@\3\2\2\2\u0206\u0207\7l\2\2\u0207\u0208\7u\2\2\u0208\u0209\7q\2"+ - "\2\u0209\u020a\7w\2\2\u020a\u020b\7p\2\2\u020b\u020c\7f\2\2\u020cB\3\2"+ - "\2\2\u020d\u020e\7e\2\2\u020e\u020f\7q\2\2\u020f\u0210\7o\2\2\u0210\u0211"+ - "\7r\2\2\u0211\u0212\7c\2\2\u0212\u0213\7e\2\2\u0213\u0214\7v\2\2\u0214"+ - "D\3\2\2\2\u0215\u0216\7x\2\2\u0216\u0217\7g\2\2\u0217\u0218\7t\2\2\u0218"+ - "\u0219\7d\2\2\u0219\u021a\7q\2\2\u021a\u021b\7u\2\2\u021b\u021c\7g\2\2"+ - "\u021cF\3\2\2\2\u021d\u021e\7u\2\2\u021e\u021f\7e\2\2\u021f\u0220\7j\2"+ - "\2\u0220\u0221\7g\2\2\u0221\u0222\7o\2\2\u0222\u0223\7c\2\2\u0223H\3\2"+ - "\2\2\u0224\u0225\7g\2\2\u0225\u0226\7s\2\2\u0226J\3\2\2\2\u0227\u0228"+ - "\7p\2\2\u0228\u0229\7g\2\2\u0229L\3\2\2\2\u022a\u022b\7n\2\2\u022b\u022c"+ - "\7v\2\2\u022cN\3\2\2\2\u022d\u022e\7n\2\2\u022e\u022f\7g\2\2\u022fP\3"+ - "\2\2\2\u0230\u0231\7i\2\2\u0231\u0232\7v\2\2\u0232R\3\2\2\2\u0233\u0234"+ - "\7i\2\2\u0234\u0235\7g\2\2\u0235T\3\2\2\2\u0236\u0237\7#\2\2\u0237\u0238"+ - "\7?\2\2\u0238V\3\2\2\2\u0239\u023a\7>\2\2\u023aX\3\2\2\2\u023b\u023c\7"+ - ">\2\2\u023c\u023d\7?\2\2\u023dZ\3\2\2\2\u023e\u023f\7@\2\2\u023f\\\3\2"+ - "\2\2\u0240\u0241\7@\2\2\u0241\u0242\7?\2\2\u0242^\3\2\2\2\u0243\u0244"+ - "\7~\2\2\u0244\u0245\7~\2\2\u0245`\3\2\2\2\u0246\u0247\7-\2\2\u0247b\3"+ - "\2\2\2\u0248\u0249\7/\2\2\u0249d\3\2\2\2\u024a\u024b\7f\2\2\u024b\u024c"+ - "\7k\2\2\u024c\u024d\7x\2\2\u024df\3\2\2\2\u024e\u024f\7k\2\2\u024f\u0250"+ - "\7f\2\2\u0250\u0251\7k\2\2\u0251\u0252\7x\2\2\u0252h\3\2\2\2\u0253\u0254"+ - "\7o\2\2\u0254\u0255\7q\2\2\u0255\u0256\7f\2\2\u0256j\3\2\2\2\u0257\u0258"+ - "\7#\2\2\u0258l\3\2\2\2\u0259\u025a\7]\2\2\u025an\3\2\2\2\u025b\u025c\7"+ - "_\2\2\u025cp\3\2\2\2\u025d\u025e\7\60\2\2\u025er\3\2\2\2\u025f\u0260\7"+ - "&\2\2\u0260\u0261\7&\2\2\u0261t\3\2\2\2\u0262\u0263\7%\2\2\u0263v\3\2"+ - "\2\2\u0264\u0265\7}\2\2\u0265\u0266\7~\2\2\u0266x\3\2\2\2\u0267\u0268"+ - "\7~\2\2\u0268\u0269\7\177\2\2\u0269z\3\2\2\2\u026a\u026b\7h\2\2\u026b"+ - "\u026c\7q\2\2\u026c\u026d\7t\2\2\u026d|\3\2\2\2\u026e\u026f\7n\2\2\u026f"+ - "\u0270\7g\2\2\u0270\u0271\7v\2\2\u0271~\3\2\2\2\u0272\u0273\7y\2\2\u0273"+ - "\u0274\7j\2\2\u0274\u0275\7g\2\2\u0275\u0276\7t\2\2\u0276\u0277\7g\2\2"+ - "\u0277\u0080\3\2\2\2\u0278\u0279\7i\2\2\u0279\u027a\7t\2\2\u027a\u027b"+ - "\7q\2\2\u027b\u027c\7w\2\2\u027c\u027d\7r\2\2\u027d\u0082\3\2\2\2\u027e"+ - "\u027f\7d\2\2\u027f\u0280\7{\2\2\u0280\u0084\3\2\2\2\u0281\u0282\7q\2"+ - "\2\u0282\u0283\7t\2\2\u0283\u0284\7f\2\2\u0284\u0285\7g\2\2\u0285\u0286"+ - "\7t\2\2\u0286\u0086\3\2\2\2\u0287\u0288\7t\2\2\u0288\u0289\7g\2\2\u0289"+ - "\u028a\7v\2\2\u028a\u028b\7w\2\2\u028b\u028c\7t\2\2\u028c\u028d\7p\2\2"+ - "\u028d\u0088\3\2\2\2\u028e\u028f\7k\2\2\u028f\u0290\7h\2\2\u0290\u008a"+ - "\3\2\2\2\u0291\u0292\7k\2\2\u0292\u0293\7p\2\2\u0293\u008c\3\2\2\2\u0294"+ - "\u0295\7c\2\2\u0295\u0296\7u\2\2\u0296\u008e\3\2\2\2\u0297\u0298\7c\2"+ - "\2\u0298\u0299\7v\2\2\u0299\u0090\3\2\2\2\u029a\u029b\7c\2\2\u029b\u029c"+ - "\7n\2\2\u029c\u029d\7n\2\2\u029d\u029e\7q\2\2\u029e\u029f\7y\2\2\u029f"+ - "\u02a0\7k\2\2\u02a0\u02a1\7p\2\2\u02a1\u02a2\7i\2\2\u02a2\u0092\3\2\2"+ - "\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\7o\2\2\u02a5\u02a6\7r\2\2\u02a6\u02a7"+ - "\7v\2\2\u02a7\u02a8\7{\2\2\u02a8\u0094\3\2\2\2\u02a9\u02aa\7e\2\2\u02aa"+ - "\u02ab\7q\2\2\u02ab\u02ac\7w\2\2\u02ac\u02ad\7p\2\2\u02ad\u02ae\7v\2\2"+ - "\u02ae\u0096\3\2\2\2\u02af\u02b0\7u\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2"+ - "\7c\2\2\u02b2\u02b3\7d\2\2\u02b3\u02b4\7n\2\2\u02b4\u02b5\7g\2\2\u02b5"+ - "\u0098\3\2\2\2\u02b6\u02b7\7c\2\2\u02b7\u02b8\7u\2\2\u02b8\u02b9\7e\2"+ - "\2\u02b9\u02ba\7g\2\2\u02ba\u02bb\7p\2\2\u02bb\u02bc\7f\2\2\u02bc\u02bd"+ - "\7k\2\2\u02bd\u02be\7p\2\2\u02be\u02bf\7i\2\2\u02bf\u009a\3\2\2\2\u02c0"+ - "\u02c1\7f\2\2\u02c1\u02c2\7g\2\2\u02c2\u02c3\7u\2\2\u02c3\u02c4\7e\2\2"+ - "\u02c4\u02c5\7g\2\2\u02c5\u02c6\7p\2\2\u02c6\u02c7\7f\2\2\u02c7\u02c8"+ - "\7k\2\2\u02c8\u02c9\7p\2\2\u02c9\u02ca\7i\2\2\u02ca\u009c\3\2\2\2\u02cb"+ - "\u02cc\7u\2\2\u02cc\u02cd\7q\2\2\u02cd\u02ce\7o\2\2\u02ce\u02cf\7g\2\2"+ - "\u02cf\u009e\3\2\2\2\u02d0\u02d1\7g\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3"+ - "\7g\2\2\u02d3\u02d4\7t\2\2\u02d4\u02d5\7{\2\2\u02d5\u00a0\3\2\2\2\u02d6"+ - "\u02d7\7u\2\2\u02d7\u02d8\7c\2\2\u02d8\u02d9\7v\2\2\u02d9\u02da\7k\2\2"+ - "\u02da\u02db\7u\2\2\u02db\u02dc\7h\2\2\u02dc\u02dd\7k\2\2\u02dd\u02de"+ - "\7g\2\2\u02de\u02df\7u\2\2\u02df\u00a2\3\2\2\2\u02e0\u02e1\7e\2\2\u02e1"+ - "\u02e2\7q\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7n\2\2\u02e4\u02e5\7c\2\2"+ - "\u02e5\u02e6\7v\2\2\u02e6\u02e7\7k\2\2\u02e7\u02e8\7q\2\2\u02e8\u02e9"+ - "\7p\2\2\u02e9\u00a4\3\2\2\2\u02ea\u02eb\7i\2\2\u02eb\u02ec\7t\2\2\u02ec"+ - "\u02ed\7g\2\2\u02ed\u02ee\7c\2\2\u02ee\u02ef\7v\2\2\u02ef\u02f0\7g\2\2"+ - "\u02f0\u02f1\7u\2\2\u02f1\u02f2\7v\2\2\u02f2\u00a6\3\2\2\2\u02f3\u02f4"+ - "\7n\2\2\u02f4\u02f5\7g\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7\7u\2\2\u02f7"+ - "\u02f8\7v\2\2\u02f8\u00a8\3\2\2\2\u02f9\u02fa\7u\2\2\u02fa\u02fb\7y\2"+ - "\2\u02fb\u02fc\7k\2\2\u02fc\u02fd\7v\2\2\u02fd\u02fe\7e\2\2\u02fe\u02ff"+ - "\7j\2\2\u02ff\u00aa\3\2\2\2\u0300\u0301\7e\2\2\u0301\u0302\7c\2\2\u0302"+ - "\u0303\7u\2\2\u0303\u0304\7g\2\2\u0304\u00ac\3\2\2\2\u0305\u0306\7v\2"+ - "\2\u0306\u0307\7t\2\2\u0307\u0308\7{\2\2\u0308\u00ae\3\2\2\2\u0309\u030a"+ - "\7e\2\2\u030a\u030b\7c\2\2\u030b\u030c\7v\2\2\u030c\u030d\7e\2\2\u030d"+ - "\u030e\7j\2\2\u030e\u00b0\3\2\2\2\u030f\u0310\7f\2\2\u0310\u0311\7g\2"+ - "\2\u0311\u0312\7h\2\2\u0312\u0313\7c\2\2\u0313\u0314\7w\2\2\u0314\u0315"+ - "\7n\2\2\u0315\u0316\7v\2\2\u0316\u00b2\3\2\2\2\u0317\u0318\7v\2\2\u0318"+ - "\u0319\7j\2\2\u0319\u031a\7g\2\2\u031a\u031b\7p\2\2\u031b\u00b4\3\2\2"+ - "\2\u031c\u031d\7g\2\2\u031d\u031e\7n\2\2\u031e\u031f\7u\2\2\u031f\u0320"+ - "\7g\2\2\u0320\u00b6\3\2\2\2\u0321\u0322\7v\2\2\u0322\u0323\7{\2\2\u0323"+ - "\u0324\7r\2\2\u0324\u0325\7g\2\2\u0325\u0326\7u\2\2\u0326\u0327\7y\2\2"+ - "\u0327\u0328\7k\2\2\u0328\u0329\7v\2\2\u0329\u032a\7e\2\2\u032a\u032b"+ - "\7j\2\2\u032b\u00b8\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7t\2\2\u032e"+ - "\u00ba\3\2\2\2\u032f\u0330\7c\2\2\u0330\u0331\7p\2\2\u0331\u0332\7f\2"+ - "\2\u0332\u00bc\3\2\2\2\u0333\u0334\7p\2\2\u0334\u0335\7q\2\2\u0335\u0336"+ - "\7v\2\2\u0336\u00be\3\2\2\2\u0337\u0338\7v\2\2\u0338\u0339\7q\2\2\u0339"+ - "\u00c0\3\2\2\2\u033a\u033b\7k\2\2\u033b\u033c\7p\2\2\u033c\u033d\7u\2"+ - "\2\u033d\u033e\7v\2\2\u033e\u033f\7c\2\2\u033f\u0340\7p\2\2\u0340\u0341"+ - "\7e\2\2\u0341\u0342\7g\2\2\u0342\u00c2\3\2\2\2\u0343\u0344\7q\2\2\u0344"+ - "\u0345\7h\2\2\u0345\u00c4\3\2\2\2\u0346\u0347\7u\2\2\u0347\u0348\7v\2"+ - "\2\u0348\u0349\7c\2\2\u0349\u034a\7v\2\2\u034a\u034b\7k\2\2\u034b\u034c"+ - "\7e\2\2\u034c\u034d\7c\2\2\u034d\u034e\7n\2\2\u034e\u034f\7n\2\2\u034f"+ - "\u0350\7{\2\2\u0350\u00c6\3\2\2\2\u0351\u0352\7k\2\2\u0352\u0353\7u\2"+ - "\2\u0353\u00c8\3\2\2\2\u0354\u0355\7v\2\2\u0355\u0356\7t\2\2\u0356\u0357"+ - "\7g\2\2\u0357\u0358\7c\2\2\u0358\u0359\7v\2\2\u0359\u00ca\3\2\2\2\u035a"+ - "\u035b\7e\2\2\u035b\u035c\7c\2\2\u035c\u035d\7u\2\2\u035d\u035e\7v\2\2"+ - "\u035e\u00cc\3\2\2\2\u035f\u0360\7e\2\2\u0360\u0361\7c\2\2\u0361\u0362"+ - "\7u\2\2\u0362\u0363\7v\2\2\u0363\u0364\7c\2\2\u0364\u0365\7d\2\2\u0365"+ - "\u0366\7n\2\2\u0366\u0367\7g\2\2\u0367\u00ce\3\2\2\2\u0368\u0369\7x\2"+ - "\2\u0369\u036a\7g\2\2\u036a\u036b\7t\2\2\u036b\u036c\7u\2\2\u036c\u036d"+ - "\7k\2\2\u036d\u036e\7q\2\2\u036e\u036f\7p\2\2\u036f\u00d0\3\2\2\2\u0370"+ - "\u0371\7l\2\2\u0371\u0372\7u\2\2\u0372\u0373\7q\2\2\u0373\u0374\7p\2\2"+ - "\u0374\u0375\7k\2\2\u0375\u0376\7s\2\2\u0376\u00d2\3\2\2\2\u0377\u0378"+ - "\7w\2\2\u0378\u0379\7p\2\2\u0379\u037a\7q\2\2\u037a\u037b\7t\2\2\u037b"+ - "\u037c\7f\2\2\u037c\u037d\7g\2\2\u037d\u037e\7t\2\2\u037e\u037f\7g\2\2"+ - "\u037f\u0380\7f\2\2\u0380\u00d4\3\2\2\2\u0381\u0382\7v\2\2\u0382\u0383"+ - "\7t\2\2\u0383\u0384\7w\2\2\u0384\u0385\7g\2\2\u0385\u00d6\3\2\2\2\u0386"+ - "\u0387\7h\2\2\u0387\u0388\7c\2\2\u0388\u0389\7n\2\2\u0389\u038a\7u\2\2"+ - "\u038a\u038b\7g\2\2\u038b\u00d8\3\2\2\2\u038c\u038d\7v\2\2\u038d\u038e"+ - "\7{\2\2\u038e\u038f\7r\2\2\u038f\u0390\7g\2\2\u0390\u00da\3\2\2\2\u0391"+ - "\u0392\7x\2\2\u0392\u0393\7c\2\2\u0393\u0394\7n\2\2\u0394\u0395\7k\2\2"+ - "\u0395\u0396\7f\2\2\u0396\u0397\7c\2\2\u0397\u0398\7v\2\2\u0398\u0399"+ - "\7g\2\2\u0399\u00dc\3\2\2\2\u039a\u039b\7c\2\2\u039b\u039c\7p\2\2\u039c"+ - "\u039d\7p\2\2\u039d\u039e\7q\2\2\u039e\u039f\7v\2\2\u039f\u03a0\7c\2\2"+ - "\u03a0\u03a1\7v\2\2\u03a1\u03a2\7g\2\2\u03a2\u00de\3\2\2\2\u03a3\u03a4"+ - "\7f\2\2\u03a4\u03a5\7g\2\2\u03a5\u03a6\7e\2\2\u03a6\u03a7\7n\2\2\u03a7"+ - "\u03a8\7c\2\2\u03a8\u03a9\7t\2\2\u03a9\u03aa\7g\2\2\u03aa\u00e0\3\2\2"+ - "\2\u03ab\u03ac\7e\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7p\2\2\u03ae\u03af"+ - "\7v\2\2\u03af\u03b0\7g\2\2\u03b0\u03b1\7z\2\2\u03b1\u03b2\7v\2\2\u03b2"+ - "\u00e2\3\2\2\2\u03b3\u03b4\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7g\2"+ - "\2\u03b6\u03b7\7o\2\2\u03b7\u00e4\3\2\2\2\u03b8\u03b9\7x\2\2\u03b9\u03ba"+ - "\7c\2\2\u03ba\u03bb\7t\2\2\u03bb\u03bc\7k\2\2\u03bc\u03bd\7c\2\2\u03bd"+ - "\u03be\7d\2\2\u03be\u03bf\7n\2\2\u03bf\u03c0\7g\2\2\u03c0\u00e6\3\2\2"+ - "\2\u03c1\u03c2\7k\2\2\u03c2\u03c3\7p\2\2\u03c3\u03c4\7u\2\2\u03c4\u03c5"+ - "\7g\2\2\u03c5\u03c6\7t\2\2\u03c6\u03c7\7v\2\2\u03c7\u00e8\3\2\2\2\u03c8"+ - "\u03c9\7f\2\2\u03c9\u03ca\7g\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cc\7g\2\2"+ - "\u03cc\u03cd\7v\2\2\u03cd\u03ce\7g\2\2\u03ce\u00ea\3\2\2\2\u03cf\u03d0"+ - "\7t\2\2\u03d0\u03d1\7g\2\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7c\2\2\u03d3"+ - "\u03d4\7o\2\2\u03d4\u03d5\7g\2\2\u03d5\u00ec\3\2\2\2\u03d6\u03d7\7t\2"+ - "\2\u03d7\u03d8\7g\2\2\u03d8\u03d9\7r\2\2\u03d9\u03da\7n\2\2\u03da\u03db"+ - "\7c\2\2\u03db\u03dc\7e\2\2\u03dc\u03dd\7g\2\2\u03dd\u00ee\3\2\2\2\u03de"+ - "\u03df\7e\2\2\u03df\u03e0\7q\2\2\u03e0\u03e1\7r\2\2\u03e1\u03e2\7{\2\2"+ - "\u03e2\u00f0\3\2\2\2\u03e3\u03e4\7o\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6"+ - "\7f\2\2\u03e6\u03e7\7k\2\2\u03e7\u03e8\7h\2\2\u03e8\u03e9\7{\2\2\u03e9"+ - "\u00f2\3\2\2\2\u03ea\u03eb\7c\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7r\2"+ - "\2\u03ed\u03ee\7g\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7f\2\2\u03f0\u00f4"+ - "\3\2\2\2\u03f1\u03f2\7k\2\2\u03f2\u03f3\7p\2\2\u03f3\u03f4\7v\2\2\u03f4"+ - "\u03f5\7q\2\2\u03f5\u00f6\3\2\2\2\u03f6\u03f7\7x\2\2\u03f7\u03f8\7c\2"+ - "\2\u03f8\u03f9\7n\2\2\u03f9\u03fa\7w\2\2\u03fa\u03fb\7g\2\2\u03fb\u00f8"+ - "\3\2\2\2\u03fc\u03fd\7l\2\2\u03fd\u03fe\7u\2\2\u03fe\u03ff\7q\2\2\u03ff"+ - "\u0400\7p\2\2\u0400\u00fa\3\2\2\2\u0401\u0402\7y\2\2\u0402\u0403\7k\2"+ - "\2\u0403\u0404\7v\2\2\u0404\u0405\7j\2\2\u0405\u00fc\3\2\2\2\u0406\u0407"+ - "\7r\2\2\u0407\u0408\7q\2\2\u0408\u0409\7u\2\2\u0409\u040a\7k\2\2\u040a"+ - "\u040b\7v\2\2\u040b\u040c\7k\2\2\u040c\u040d\7q\2\2\u040d\u040e\7p\2\2"+ - "\u040e\u00fe\3\2\2\2\u040f\u0410\7d\2\2\u0410\u0411\7t\2\2\u0411\u0412"+ - "\7g\2\2\u0412\u0413\7c\2\2\u0413\u0414\7m\2\2\u0414\u0100\3\2\2\2\u0415"+ - "\u0416\7n\2\2\u0416\u0417\7q\2\2\u0417\u0418\7q\2\2\u0418\u0419\7r\2\2"+ - "\u0419\u0102\3\2\2\2\u041a\u041b\7e\2\2\u041b\u041c\7q\2\2\u041c\u041d"+ - "\7p\2\2\u041d\u041e\7v\2\2\u041e\u041f\7k\2\2\u041f\u0420\7p\2\2\u0420"+ - "\u0421\7w\2\2\u0421\u0422\7g\2\2\u0422\u0104\3\2\2\2\u0423\u0424\7g\2"+ - "\2\u0424\u0425\7z\2\2\u0425\u0426\7k\2\2\u0426\u0427\7v\2\2\u0427\u0106"+ - "\3\2\2\2\u0428\u0429\7t\2\2\u0429\u042a\7g\2\2\u042a\u042b\7v\2\2\u042b"+ - "\u042c\7w\2\2\u042c\u042d\7t\2\2\u042d\u042e\7p\2\2\u042e\u042f\7k\2\2"+ - "\u042f\u0430\7p\2\2\u0430\u0431\7i\2\2\u0431\u0108\3\2\2\2\u0432\u0433"+ - "\7y\2\2\u0433\u0434\7j\2\2\u0434\u0435\7k\2\2\u0435\u0436\7n\2\2\u0436"+ - "\u0437\7g\2\2\u0437\u010a\3\2\2\2\u0438\u043d\7$\2\2\u0439\u043c\5\u010d"+ - "\u0087\2\u043a\u043c\n\2\2\2\u043b\u0439\3\2\2\2\u043b\u043a\3\2\2\2\u043c"+ - "\u043f\3\2\2\2\u043d\u043b\3\2\2\2\u043d\u043e\3\2\2\2\u043e\u0440\3\2"+ - "\2\2\u043f\u043d\3\2\2\2\u0440\u0441\7$\2\2\u0441\u010c\3\2\2\2\u0442"+ - "\u0445\7^\2\2\u0443\u0446\t\3\2\2\u0444\u0446\5\u010f\u0088\2\u0445\u0443"+ - "\3\2\2\2\u0445\u0444\3\2\2\2\u0446\u010e\3\2\2\2\u0447\u0448\7w\2\2\u0448"+ - "\u0449\5\u0111\u0089\2\u0449\u044a\5\u0111\u0089\2\u044a\u044b\5\u0111"+ - "\u0089\2\u044b\u044c\5\u0111\u0089\2\u044c\u0110\3\2\2\2\u044d\u044e\t"+ - "\4\2\2\u044e\u0112\3\2\2\2\u044f\u0450\7A\2\2\u0450\u0114\3\2\2\2\u0451"+ - "\u0452\7p\2\2\u0452\u0453\7w\2\2\u0453\u0454\7n\2\2\u0454\u0455\7n\2\2"+ - "\u0455\u0116\3\2\2\2\u0456\u0457\5\u0119\u008d\2\u0457\u0118\3\2\2\2\u0458"+ - "\u045c\5\u011b\u008e\2\u0459\u045c\5\u011d\u008f\2\u045a\u045c\5\u011f"+ - "\u0090\2\u045b\u0458\3\2\2\2\u045b\u0459\3\2\2\2\u045b\u045a\3\2\2\2\u045c"+ - "\u011a\3\2\2\2\u045d\u045e\5\u0121\u0091\2\u045e\u011c\3\2\2\2\u045f\u0460"+ - "\7\60\2\2\u0460\u046a\5\u0121\u0091\2\u0461\u0462\5\u0121\u0091\2\u0462"+ - "\u0466\7\60\2\2\u0463\u0465\t\5\2\2\u0464\u0463\3\2\2\2\u0465\u0468\3"+ - "\2\2\2\u0466\u0464\3\2\2\2\u0466\u0467\3\2\2\2\u0467\u046a\3\2\2\2\u0468"+ - "\u0466\3\2\2\2\u0469\u045f\3\2\2\2\u0469\u0461\3\2\2\2\u046a\u011e\3\2"+ - "\2\2\u046b\u046c\7\60\2\2\u046c\u0478\5\u0121\u0091\2\u046d\u0475\5\u0121"+ - "\u0091\2\u046e\u0472\7\60\2\2\u046f\u0471\t\5\2\2\u0470\u046f\3\2\2\2"+ - "\u0471\u0474\3\2\2\2\u0472\u0470\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0476"+ - "\3\2\2\2\u0474\u0472\3\2\2\2\u0475\u046e\3\2\2\2\u0475\u0476\3\2\2\2\u0476"+ - "\u0478\3\2\2\2\u0477\u046b\3\2\2\2\u0477\u046d\3\2\2\2\u0478\u0479\3\2"+ - "\2\2\u0479\u047b\t\6\2\2\u047a\u047c\t\7\2\2\u047b\u047a\3\2\2\2\u047b"+ - "\u047c\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u047e\5\u0121\u0091\2\u047e\u0120"+ - "\3\2\2\2\u047f\u0481\t\5\2\2\u0480\u047f\3\2\2\2\u0481\u0482\3\2\2\2\u0482"+ - "\u0480\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0122\3\2\2\2\u0484\u0485\t\b"+ - "\2\2\u0485\u0486\3\2\2\2\u0486\u0487\b\u0092\2\2\u0487\u0124\3\2\2\2\u0488"+ - "\u048c\5\u0127\u0094\2\u0489\u048b\5\u0129\u0095\2\u048a\u0489\3\2\2\2"+ - "\u048b\u048e\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d\u0126"+ - "\3\2\2\2\u048e\u048c\3\2\2\2\u048f\u0491\t\t\2\2\u0490\u048f\3\2\2\2\u0491"+ - "\u0128\3\2\2\2\u0492\u0495\5\u0127\u0094\2\u0493\u0495\t\n\2\2\u0494\u0492"+ - "\3\2\2\2\u0494\u0493\3\2\2\2\u0495\u012a\3\2\2\2\u0496\u0497\7*\2\2\u0497"+ - "\u04a0\7<\2\2\u0498\u049f\5\u012b\u0096\2\u0499\u049a\7*\2\2\u049a\u049f"+ - "\n\13\2\2\u049b\u049c\7<\2\2\u049c\u049f\n\f\2\2\u049d\u049f\n\r\2\2\u049e"+ - "\u0498\3\2\2\2\u049e\u0499\3\2\2\2\u049e\u049b\3\2\2\2\u049e\u049d\3\2"+ - "\2\2\u049f\u04a2\3\2\2\2\u04a0\u049e\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1"+ - "\u04a4\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a3\u04a5\7<\2\2\u04a4\u04a3\3\2"+ - "\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+ - "\u04a8\3\2\2\2\u04a8\u04a9\7+\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\b\u0096"+ - "\2\2\u04ab\u012c\3\2\2\2\u04ac\u04ad\n\16\2\2\u04ad\u012e\3\2\2\2\24\2"+ - "\u043b\u043d\u0445\u045b\u0466\u0469\u0472\u0475\u0477\u047b\u0482\u048c"+ - "\u0490\u0494\u049e\u04a0\u04a6\3\2\3\2"; + "\3\2\2\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2"+ + "\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0121"+ + "\3\2\2\2\2\u0125\3\2\2\2\2\u0127\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2"+ + "\2\3\u0131\3\2\2\2\5\u0133\3\2\2\2\7\u013a\3\2\2\2\t\u0144\3\2\2\2\13"+ + "\u0146\3\2\2\2\r\u0148\3\2\2\2\17\u014b\3\2\2\2\21\u014d\3\2\2\2\23\u014f"+ + "\3\2\2\2\25\u0151\3\2\2\2\27\u0153\3\2\2\2\31\u0155\3\2\2\2\33\u0157\3"+ + "\2\2\2\35\u0159\3\2\2\2\37\u015b\3\2\2\2!\u0164\3\2\2\2#\u016c\3\2\2\2"+ + "%\u017b\3\2\2\2\'\u017d\3\2\2\2)\u018f\3\2\2\2+\u01a2\3\2\2\2-\u01ab\3"+ + "\2\2\2/\u01b6\3\2\2\2\61\u01ba\3\2\2\2\63\u01c2\3\2\2\2\65\u01cc\3\2\2"+ + "\2\67\u01d7\3\2\2\29\u01dd\3\2\2\2;\u01ef\3\2\2\2=\u01f6\3\2\2\2?\u01ff"+ + "\3\2\2\2A\u0208\3\2\2\2C\u020f\3\2\2\2E\u0217\3\2\2\2G\u021f\3\2\2\2I"+ + "\u0226\3\2\2\2K\u0229\3\2\2\2M\u022c\3\2\2\2O\u022f\3\2\2\2Q\u0232\3\2"+ + "\2\2S\u0235\3\2\2\2U\u0238\3\2\2\2W\u023b\3\2\2\2Y\u023d\3\2\2\2[\u0240"+ + "\3\2\2\2]\u0242\3\2\2\2_\u0245\3\2\2\2a\u0248\3\2\2\2c\u024a\3\2\2\2e"+ + "\u024c\3\2\2\2g\u0250\3\2\2\2i\u0255\3\2\2\2k\u0259\3\2\2\2m\u025b\3\2"+ + "\2\2o\u025d\3\2\2\2q\u025f\3\2\2\2s\u0261\3\2\2\2u\u0264\3\2\2\2w\u0266"+ + "\3\2\2\2y\u0269\3\2\2\2{\u026c\3\2\2\2}\u0270\3\2\2\2\177\u0274\3\2\2"+ + "\2\u0081\u027a\3\2\2\2\u0083\u0280\3\2\2\2\u0085\u0283\3\2\2\2\u0087\u0289"+ + "\3\2\2\2\u0089\u0290\3\2\2\2\u008b\u0293\3\2\2\2\u008d\u0296\3\2\2\2\u008f"+ + "\u0299\3\2\2\2\u0091\u029c\3\2\2\2\u0093\u02a5\3\2\2\2\u0095\u02ab\3\2"+ + "\2\2\u0097\u02b1\3\2\2\2\u0099\u02b8\3\2\2\2\u009b\u02c2\3\2\2\2\u009d"+ + "\u02cd\3\2\2\2\u009f\u02d2\3\2\2\2\u00a1\u02d8\3\2\2\2\u00a3\u02e2\3\2"+ + "\2\2\u00a5\u02ec\3\2\2\2\u00a7\u02f5\3\2\2\2\u00a9\u02fb\3\2\2\2\u00ab"+ + "\u0302\3\2\2\2\u00ad\u0307\3\2\2\2\u00af\u030b\3\2\2\2\u00b1\u0311\3\2"+ + "\2\2\u00b3\u0319\3\2\2\2\u00b5\u031e\3\2\2\2\u00b7\u0323\3\2\2\2\u00b9"+ + "\u032e\3\2\2\2\u00bb\u0331\3\2\2\2\u00bd\u0335\3\2\2\2\u00bf\u0339\3\2"+ + "\2\2\u00c1\u033c\3\2\2\2\u00c3\u0345\3\2\2\2\u00c5\u0348\3\2\2\2\u00c7"+ + "\u0353\3\2\2\2\u00c9\u0356\3\2\2\2\u00cb\u035c\3\2\2\2\u00cd\u0361\3\2"+ + "\2\2\u00cf\u036a\3\2\2\2\u00d1\u0372\3\2\2\2\u00d3\u0379\3\2\2\2\u00d5"+ + "\u0383\3\2\2\2\u00d7\u0388\3\2\2\2\u00d9\u038e\3\2\2\2\u00db\u0393\3\2"+ + "\2\2\u00dd\u039c\3\2\2\2\u00df\u03a5\3\2\2\2\u00e1\u03ad\3\2\2\2\u00e3"+ + "\u03b5\3\2\2\2\u00e5\u03ba\3\2\2\2\u00e7\u03c3\3\2\2\2\u00e9\u03ca\3\2"+ + "\2\2\u00eb\u03d1\3\2\2\2\u00ed\u03d8\3\2\2\2\u00ef\u03e0\3\2\2\2\u00f1"+ + "\u03e5\3\2\2\2\u00f3\u03ec\3\2\2\2\u00f5\u03f3\3\2\2\2\u00f7\u03f8\3\2"+ + "\2\2\u00f9\u03fe\3\2\2\2\u00fb\u0403\3\2\2\2\u00fd\u040c\3\2\2\2\u00ff"+ + "\u0411\3\2\2\2\u0101\u041a\3\2\2\2\u0103\u0420\3\2\2\2\u0105\u0425\3\2"+ + "\2\2\u0107\u042e\3\2\2\2\u0109\u0433\3\2\2\2\u010b\u043d\3\2\2\2\u010d"+ + "\u0443\3\2\2\2\u010f\u044d\3\2\2\2\u0111\u0452\3\2\2\2\u0113\u0458\3\2"+ + "\2\2\u0115\u045a\3\2\2\2\u0117\u045c\3\2\2\2\u0119\u0461\3\2\2\2\u011b"+ + "\u0466\3\2\2\2\u011d\u0468\3\2\2\2\u011f\u0474\3\2\2\2\u0121\u0482\3\2"+ + "\2\2\u0123\u048b\3\2\2\2\u0125\u048f\3\2\2\2\u0127\u0493\3\2\2\2\u0129"+ + "\u049b\3\2\2\2\u012b\u049f\3\2\2\2\u012d\u04a1\3\2\2\2\u012f\u04b7\3\2"+ + "\2\2\u0131\u0132\7=\2\2\u0132\4\3\2\2\2\u0133\u0134\7o\2\2\u0134\u0135"+ + "\7q\2\2\u0135\u0136\7f\2\2\u0136\u0137\7w\2\2\u0137\u0138\7n\2\2\u0138"+ + "\u0139\7g\2\2\u0139\6\3\2\2\2\u013a\u013b\7p\2\2\u013b\u013c\7c\2\2\u013c"+ + "\u013d\7o\2\2\u013d\u013e\7g\2\2\u013e\u013f\7u\2\2\u013f\u0140\7r\2\2"+ + "\u0140\u0141\7c\2\2\u0141\u0142\7e\2\2\u0142\u0143\7g\2\2\u0143\b\3\2"+ + "\2\2\u0144\u0145\7?\2\2\u0145\n\3\2\2\2\u0146\u0147\7&\2\2\u0147\f\3\2"+ + "\2\2\u0148\u0149\7<\2\2\u0149\u014a\7?\2\2\u014a\16\3\2\2\2\u014b\u014c"+ + "\7}\2\2\u014c\20\3\2\2\2\u014d\u014e\7\177\2\2\u014e\22\3\2\2\2\u014f"+ + "\u0150\7*\2\2\u0150\24\3\2\2\2\u0151\u0152\7+\2\2\u0152\26\3\2\2\2\u0153"+ + "\u0154\7,\2\2\u0154\30\3\2\2\2\u0155\u0156\7~\2\2\u0156\32\3\2\2\2\u0157"+ + "\u0158\7\'\2\2\u0158\34\3\2\2\2\u0159\u015a\7.\2\2\u015a\36\3\2\2\2\u015b"+ + "\u015c\7q\2\2\u015c\u015d\7t\2\2\u015d\u015e\7f\2\2\u015e\u015f\7g\2\2"+ + "\u015f\u0160\7t\2\2\u0160\u0161\7k\2\2\u0161\u0162\7p\2\2\u0162\u0163"+ + "\7i\2\2\u0163 \3\2\2\2\u0164\u0165\7q\2\2\u0165\u0166\7t\2\2\u0166\u0167"+ + "\7f\2\2\u0167\u0168\7g\2\2\u0168\u0169\7t\2\2\u0169\u016a\7g\2\2\u016a"+ + "\u016b\7f\2\2\u016b\"\3\2\2\2\u016c\u016d\7f\2\2\u016d\u016e\7g\2\2\u016e"+ + "\u016f\7e\2\2\u016f\u0170\7k\2\2\u0170\u0171\7o\2\2\u0171\u0172\7c\2\2"+ + "\u0172\u0173\7n\2\2\u0173\u0174\7/\2\2\u0174\u0175\7h\2\2\u0175\u0176"+ + "\7q\2\2\u0176\u0177\7t\2\2\u0177\u0178\7o\2\2\u0178\u0179\7c\2\2\u0179"+ + "\u017a\7v\2\2\u017a$\3\2\2\2\u017b\u017c\7<\2\2\u017c&\3\2\2\2\u017d\u017e"+ + "\7f\2\2\u017e\u017f\7g\2\2\u017f\u0180\7e\2\2\u0180\u0181\7k\2\2\u0181"+ + "\u0182\7o\2\2\u0182\u0183\7c\2\2\u0183\u0184\7n\2\2\u0184\u0185\7/\2\2"+ + "\u0185\u0186\7u\2\2\u0186\u0187\7g\2\2\u0187\u0188\7r\2\2\u0188\u0189"+ + "\7c\2\2\u0189\u018a\7t\2\2\u018a\u018b\7c\2\2\u018b\u018c\7v\2\2\u018c"+ + "\u018d\7q\2\2\u018d\u018e\7t\2\2\u018e(\3\2\2\2\u018f\u0190\7i\2\2\u0190"+ + "\u0191\7t\2\2\u0191\u0192\7q\2\2\u0192\u0193\7w\2\2\u0193\u0194\7r\2\2"+ + "\u0194\u0195\7k\2\2\u0195\u0196\7p\2\2\u0196\u0197\7i\2\2\u0197\u0198"+ + "\7/\2\2\u0198\u0199\7u\2\2\u0199\u019a\7g\2\2\u019a\u019b\7r\2\2\u019b"+ + "\u019c\7c\2\2\u019c\u019d\7t\2\2\u019d\u019e\7c\2\2\u019e\u019f\7v\2\2"+ + "\u019f\u01a0\7q\2\2\u01a0\u01a1\7t\2\2\u01a1*\3\2\2\2\u01a2\u01a3\7k\2"+ + "\2\u01a3\u01a4\7p\2\2\u01a4\u01a5\7h\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7"+ + "\7p\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9\7v\2\2\u01a9\u01aa\7{\2\2\u01aa"+ + ",\3\2\2\2\u01ab\u01ac\7o\2\2\u01ac\u01ad\7k\2\2\u01ad\u01ae\7p\2\2\u01ae"+ + "\u01af\7w\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1\7/\2\2\u01b1\u01b2\7u\2\2"+ + "\u01b2\u01b3\7k\2\2\u01b3\u01b4\7i\2\2\u01b4\u01b5\7p\2\2\u01b5.\3\2\2"+ + "\2\u01b6\u01b7\7P\2\2\u01b7\u01b8\7c\2\2\u01b8\u01b9\7P\2\2\u01b9\60\3"+ + "\2\2\2\u01ba\u01bb\7r\2\2\u01bb\u01bc\7g\2\2\u01bc\u01bd\7t\2\2\u01bd"+ + "\u01be\7e\2\2\u01be\u01bf\7g\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2"+ + "\u01c1\62\3\2\2\2\u01c2\u01c3\7r\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7"+ + "t\2\2\u01c5\u01c6\7/\2\2\u01c6\u01c7\7o\2\2\u01c7\u01c8\7k\2\2\u01c8\u01c9"+ + "\7n\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7g\2\2\u01cb\64\3\2\2\2\u01cc\u01cd"+ + "\7|\2\2\u01cd\u01ce\7g\2\2\u01ce\u01cf\7t\2\2\u01cf\u01d0\7q\2\2\u01d0"+ + "\u01d1\7/\2\2\u01d1\u01d2\7f\2\2\u01d2\u01d3\7k\2\2\u01d3\u01d4\7i\2\2"+ + "\u01d4\u01d5\7k\2\2\u01d5\u01d6\7v\2\2\u01d6\66\3\2\2\2\u01d7\u01d8\7"+ + "f\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7i\2\2\u01da\u01db\7k\2\2\u01db\u01dc"+ + "\7v\2\2\u01dc8\3\2\2\2\u01dd\u01de\7r\2\2\u01de\u01df\7c\2\2\u01df\u01e0"+ + "\7v\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7t\2\2\u01e3"+ + "\u01e4\7p\2\2\u01e4\u01e5\7/\2\2\u01e5\u01e6\7u\2\2\u01e6\u01e7\7g\2\2"+ + "\u01e7\u01e8\7r\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\7t\2\2\u01ea\u01eb"+ + "\7c\2\2\u01eb\u01ec\7v\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee"+ + ":\3\2\2\2\u01ef\u01f0\7k\2\2\u01f0\u01f1\7o\2\2\u01f1\u01f2\7r\2\2\u01f2"+ + "\u01f3\7q\2\2\u01f3\u01f4\7t\2\2\u01f4\u01f5\7v\2\2\u01f5<\3\2\2\2\u01f6"+ + "\u01f7\7g\2\2\u01f7\u01f8\7z\2\2\u01f8\u01f9\7v\2\2\u01f9\u01fa\7g\2\2"+ + "\u01fa\u01fb\7t\2\2\u01fb\u01fc\7p\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe"+ + "\7n\2\2\u01fe>\3\2\2\2\u01ff\u0200\7h\2\2\u0200\u0201\7w\2\2\u0201\u0202"+ + "\7p\2\2\u0202\u0203\7e\2\2\u0203\u0204\7v\2\2\u0204\u0205\7k\2\2\u0205"+ + "\u0206\7q\2\2\u0206\u0207\7p\2\2\u0207@\3\2\2\2\u0208\u0209\7l\2\2\u0209"+ + "\u020a\7u\2\2\u020a\u020b\7q\2\2\u020b\u020c\7w\2\2\u020c\u020d\7p\2\2"+ + "\u020d\u020e\7f\2\2\u020eB\3\2\2\2\u020f\u0210\7e\2\2\u0210\u0211\7q\2"+ + "\2\u0211\u0212\7o\2\2\u0212\u0213\7r\2\2\u0213\u0214\7c\2\2\u0214\u0215"+ + "\7e\2\2\u0215\u0216\7v\2\2\u0216D\3\2\2\2\u0217\u0218\7x\2\2\u0218\u0219"+ + "\7g\2\2\u0219\u021a\7t\2\2\u021a\u021b\7d\2\2\u021b\u021c\7q\2\2\u021c"+ + "\u021d\7u\2\2\u021d\u021e\7g\2\2\u021eF\3\2\2\2\u021f\u0220\7u\2\2\u0220"+ + "\u0221\7e\2\2\u0221\u0222\7j\2\2\u0222\u0223\7g\2\2\u0223\u0224\7o\2\2"+ + "\u0224\u0225\7c\2\2\u0225H\3\2\2\2\u0226\u0227\7g\2\2\u0227\u0228\7s\2"+ + "\2\u0228J\3\2\2\2\u0229\u022a\7p\2\2\u022a\u022b\7g\2\2\u022bL\3\2\2\2"+ + "\u022c\u022d\7n\2\2\u022d\u022e\7v\2\2\u022eN\3\2\2\2\u022f\u0230\7n\2"+ + "\2\u0230\u0231\7g\2\2\u0231P\3\2\2\2\u0232\u0233\7i\2\2\u0233\u0234\7"+ + "v\2\2\u0234R\3\2\2\2\u0235\u0236\7i\2\2\u0236\u0237\7g\2\2\u0237T\3\2"+ + "\2\2\u0238\u0239\7#\2\2\u0239\u023a\7?\2\2\u023aV\3\2\2\2\u023b\u023c"+ + "\7>\2\2\u023cX\3\2\2\2\u023d\u023e\7>\2\2\u023e\u023f\7?\2\2\u023fZ\3"+ + "\2\2\2\u0240\u0241\7@\2\2\u0241\\\3\2\2\2\u0242\u0243\7@\2\2\u0243\u0244"+ + "\7?\2\2\u0244^\3\2\2\2\u0245\u0246\7~\2\2\u0246\u0247\7~\2\2\u0247`\3"+ + "\2\2\2\u0248\u0249\7-\2\2\u0249b\3\2\2\2\u024a\u024b\7/\2\2\u024bd\3\2"+ + "\2\2\u024c\u024d\7f\2\2\u024d\u024e\7k\2\2\u024e\u024f\7x\2\2\u024ff\3"+ + "\2\2\2\u0250\u0251\7k\2\2\u0251\u0252\7f\2\2\u0252\u0253\7k\2\2\u0253"+ + "\u0254\7x\2\2\u0254h\3\2\2\2\u0255\u0256\7o\2\2\u0256\u0257\7q\2\2\u0257"+ + "\u0258\7f\2\2\u0258j\3\2\2\2\u0259\u025a\7#\2\2\u025al\3\2\2\2\u025b\u025c"+ + "\7]\2\2\u025cn\3\2\2\2\u025d\u025e\7_\2\2\u025ep\3\2\2\2\u025f\u0260\7"+ + "\60\2\2\u0260r\3\2\2\2\u0261\u0262\7&\2\2\u0262\u0263\7&\2\2\u0263t\3"+ + "\2\2\2\u0264\u0265\7%\2\2\u0265v\3\2\2\2\u0266\u0267\7}\2\2\u0267\u0268"+ + "\7~\2\2\u0268x\3\2\2\2\u0269\u026a\7~\2\2\u026a\u026b\7\177\2\2\u026b"+ + "z\3\2\2\2\u026c\u026d\7h\2\2\u026d\u026e\7q\2\2\u026e\u026f\7t\2\2\u026f"+ + "|\3\2\2\2\u0270\u0271\7n\2\2\u0271\u0272\7g\2\2\u0272\u0273\7v\2\2\u0273"+ + "~\3\2\2\2\u0274\u0275\7y\2\2\u0275\u0276\7j\2\2\u0276\u0277\7g\2\2\u0277"+ + "\u0278\7t\2\2\u0278\u0279\7g\2\2\u0279\u0080\3\2\2\2\u027a\u027b\7i\2"+ + "\2\u027b\u027c\7t\2\2\u027c\u027d\7q\2\2\u027d\u027e\7w\2\2\u027e\u027f"+ + "\7r\2\2\u027f\u0082\3\2\2\2\u0280\u0281\7d\2\2\u0281\u0282\7{\2\2\u0282"+ + "\u0084\3\2\2\2\u0283\u0284\7q\2\2\u0284\u0285\7t\2\2\u0285\u0286\7f\2"+ + "\2\u0286\u0287\7g\2\2\u0287\u0288\7t\2\2\u0288\u0086\3\2\2\2\u0289\u028a"+ + "\7t\2\2\u028a\u028b\7g\2\2\u028b\u028c\7v\2\2\u028c\u028d\7w\2\2\u028d"+ + "\u028e\7t\2\2\u028e\u028f\7p\2\2\u028f\u0088\3\2\2\2\u0290\u0291\7k\2"+ + "\2\u0291\u0292\7h\2\2\u0292\u008a\3\2\2\2\u0293\u0294\7k\2\2\u0294\u0295"+ + "\7p\2\2\u0295\u008c\3\2\2\2\u0296\u0297\7c\2\2\u0297\u0298\7u\2\2\u0298"+ + "\u008e\3\2\2\2\u0299\u029a\7c\2\2\u029a\u029b\7v\2\2\u029b\u0090\3\2\2"+ + "\2\u029c\u029d\7c\2\2\u029d\u029e\7n\2\2\u029e\u029f\7n\2\2\u029f\u02a0"+ + "\7q\2\2\u02a0\u02a1\7y\2\2\u02a1\u02a2\7k\2\2\u02a2\u02a3\7p\2\2\u02a3"+ + "\u02a4\7i\2\2\u02a4\u0092\3\2\2\2\u02a5\u02a6\7g\2\2\u02a6\u02a7\7o\2"+ + "\2\u02a7\u02a8\7r\2\2\u02a8\u02a9\7v\2\2\u02a9\u02aa\7{\2\2\u02aa\u0094"+ + "\3\2\2\2\u02ab\u02ac\7e\2\2\u02ac\u02ad\7q\2\2\u02ad\u02ae\7w\2\2\u02ae"+ + "\u02af\7p\2\2\u02af\u02b0\7v\2\2\u02b0\u0096\3\2\2\2\u02b1\u02b2\7u\2"+ + "\2\u02b2\u02b3\7v\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7d\2\2\u02b5\u02b6"+ + "\7n\2\2\u02b6\u02b7\7g\2\2\u02b7\u0098\3\2\2\2\u02b8\u02b9\7c\2\2\u02b9"+ + "\u02ba\7u\2\2\u02ba\u02bb\7e\2\2\u02bb\u02bc\7g\2\2\u02bc\u02bd\7p\2\2"+ + "\u02bd\u02be\7f\2\2\u02be\u02bf\7k\2\2\u02bf\u02c0\7p\2\2\u02c0\u02c1"+ + "\7i\2\2\u02c1\u009a\3\2\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4\7g\2\2\u02c4"+ + "\u02c5\7u\2\2\u02c5\u02c6\7e\2\2\u02c6\u02c7\7g\2\2\u02c7\u02c8\7p\2\2"+ + "\u02c8\u02c9\7f\2\2\u02c9\u02ca\7k\2\2\u02ca\u02cb\7p\2\2\u02cb\u02cc"+ + "\7i\2\2\u02cc\u009c\3\2\2\2\u02cd\u02ce\7u\2\2\u02ce\u02cf\7q\2\2\u02cf"+ + "\u02d0\7o\2\2\u02d0\u02d1\7g\2\2\u02d1\u009e\3\2\2\2\u02d2\u02d3\7g\2"+ + "\2\u02d3\u02d4\7x\2\2\u02d4\u02d5\7g\2\2\u02d5\u02d6\7t\2\2\u02d6\u02d7"+ + "\7{\2\2\u02d7\u00a0\3\2\2\2\u02d8\u02d9\7u\2\2\u02d9\u02da\7c\2\2\u02da"+ + "\u02db\7v\2\2\u02db\u02dc\7k\2\2\u02dc\u02dd\7u\2\2\u02dd\u02de\7h\2\2"+ + "\u02de\u02df\7k\2\2\u02df\u02e0\7g\2\2\u02e0\u02e1\7u\2\2\u02e1\u00a2"+ + "\3\2\2\2\u02e2\u02e3\7e\2\2\u02e3\u02e4\7q\2\2\u02e4\u02e5\7n\2\2\u02e5"+ + "\u02e6\7n\2\2\u02e6\u02e7\7c\2\2\u02e7\u02e8\7v\2\2\u02e8\u02e9\7k\2\2"+ + "\u02e9\u02ea\7q\2\2\u02ea\u02eb\7p\2\2\u02eb\u00a4\3\2\2\2\u02ec\u02ed"+ + "\7i\2\2\u02ed\u02ee\7t\2\2\u02ee\u02ef\7g\2\2\u02ef\u02f0\7c\2\2\u02f0"+ + "\u02f1\7v\2\2\u02f1\u02f2\7g\2\2\u02f2\u02f3\7u\2\2\u02f3\u02f4\7v\2\2"+ + "\u02f4\u00a6\3\2\2\2\u02f5\u02f6\7n\2\2\u02f6\u02f7\7g\2\2\u02f7\u02f8"+ + "\7c\2\2\u02f8\u02f9\7u\2\2\u02f9\u02fa\7v\2\2\u02fa\u00a8\3\2\2\2\u02fb"+ + "\u02fc\7u\2\2\u02fc\u02fd\7y\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7v\2\2"+ + "\u02ff\u0300\7e\2\2\u0300\u0301\7j\2\2\u0301\u00aa\3\2\2\2\u0302\u0303"+ + "\7e\2\2\u0303\u0304\7c\2\2\u0304\u0305\7u\2\2\u0305\u0306\7g\2\2\u0306"+ + "\u00ac\3\2\2\2\u0307\u0308\7v\2\2\u0308\u0309\7t\2\2\u0309\u030a\7{\2"+ + "\2\u030a\u00ae\3\2\2\2\u030b\u030c\7e\2\2\u030c\u030d\7c\2\2\u030d\u030e"+ + "\7v\2\2\u030e\u030f\7e\2\2\u030f\u0310\7j\2\2\u0310\u00b0\3\2\2\2\u0311"+ + "\u0312\7f\2\2\u0312\u0313\7g\2\2\u0313\u0314\7h\2\2\u0314\u0315\7c\2\2"+ + "\u0315\u0316\7w\2\2\u0316\u0317\7n\2\2\u0317\u0318\7v\2\2\u0318\u00b2"+ + "\3\2\2\2\u0319\u031a\7v\2\2\u031a\u031b\7j\2\2\u031b\u031c\7g\2\2\u031c"+ + "\u031d\7p\2\2\u031d\u00b4\3\2\2\2\u031e\u031f\7g\2\2\u031f\u0320\7n\2"+ + "\2\u0320\u0321\7u\2\2\u0321\u0322\7g\2\2\u0322\u00b6\3\2\2\2\u0323\u0324"+ + "\7v\2\2\u0324\u0325\7{\2\2\u0325\u0326\7r\2\2\u0326\u0327\7g\2\2\u0327"+ + "\u0328\7u\2\2\u0328\u0329\7y\2\2\u0329\u032a\7k\2\2\u032a\u032b\7v\2\2"+ + "\u032b\u032c\7e\2\2\u032c\u032d\7j\2\2\u032d\u00b8\3\2\2\2\u032e\u032f"+ + "\7q\2\2\u032f\u0330\7t\2\2\u0330\u00ba\3\2\2\2\u0331\u0332\7c\2\2\u0332"+ + "\u0333\7p\2\2\u0333\u0334\7f\2\2\u0334\u00bc\3\2\2\2\u0335\u0336\7p\2"+ + "\2\u0336\u0337\7q\2\2\u0337\u0338\7v\2\2\u0338\u00be\3\2\2\2\u0339\u033a"+ + "\7v\2\2\u033a\u033b\7q\2\2\u033b\u00c0\3\2\2\2\u033c\u033d\7k\2\2\u033d"+ + "\u033e\7p\2\2\u033e\u033f\7u\2\2\u033f\u0340\7v\2\2\u0340\u0341\7c\2\2"+ + "\u0341\u0342\7p\2\2\u0342\u0343\7e\2\2\u0343\u0344\7g\2\2\u0344\u00c2"+ + "\3\2\2\2\u0345\u0346\7q\2\2\u0346\u0347\7h\2\2\u0347\u00c4\3\2\2\2\u0348"+ + "\u0349\7u\2\2\u0349\u034a\7v\2\2\u034a\u034b\7c\2\2\u034b\u034c\7v\2\2"+ + "\u034c\u034d\7k\2\2\u034d\u034e\7e\2\2\u034e\u034f\7c\2\2\u034f\u0350"+ + "\7n\2\2\u0350\u0351\7n\2\2\u0351\u0352\7{\2\2\u0352\u00c6\3\2\2\2\u0353"+ + "\u0354\7k\2\2\u0354\u0355\7u\2\2\u0355\u00c8\3\2\2\2\u0356\u0357\7v\2"+ + "\2\u0357\u0358\7t\2\2\u0358\u0359\7g\2\2\u0359\u035a\7c\2\2\u035a\u035b"+ + "\7v\2\2\u035b\u00ca\3\2\2\2\u035c\u035d\7e\2\2\u035d\u035e\7c\2\2\u035e"+ + "\u035f\7u\2\2\u035f\u0360\7v\2\2\u0360\u00cc\3\2\2\2\u0361\u0362\7e\2"+ + "\2\u0362\u0363\7c\2\2\u0363\u0364\7u\2\2\u0364\u0365\7v\2\2\u0365\u0366"+ + "\7c\2\2\u0366\u0367\7d\2\2\u0367\u0368\7n\2\2\u0368\u0369\7g\2\2\u0369"+ + "\u00ce\3\2\2\2\u036a\u036b\7x\2\2\u036b\u036c\7g\2\2\u036c\u036d\7t\2"+ + "\2\u036d\u036e\7u\2\2\u036e\u036f\7k\2\2\u036f\u0370\7q\2\2\u0370\u0371"+ + "\7p\2\2\u0371\u00d0\3\2\2\2\u0372\u0373\7l\2\2\u0373\u0374\7u\2\2\u0374"+ + "\u0375\7q\2\2\u0375\u0376\7p\2\2\u0376\u0377\7k\2\2\u0377\u0378\7s\2\2"+ + "\u0378\u00d2\3\2\2\2\u0379\u037a\7w\2\2\u037a\u037b\7p\2\2\u037b\u037c"+ + "\7q\2\2\u037c\u037d\7t\2\2\u037d\u037e\7f\2\2\u037e\u037f\7g\2\2\u037f"+ + "\u0380\7t\2\2\u0380\u0381\7g\2\2\u0381\u0382\7f\2\2\u0382\u00d4\3\2\2"+ + "\2\u0383\u0384\7v\2\2\u0384\u0385\7t\2\2\u0385\u0386\7w\2\2\u0386\u0387"+ + "\7g\2\2\u0387\u00d6\3\2\2\2\u0388\u0389\7h\2\2\u0389\u038a\7c\2\2\u038a"+ + "\u038b\7n\2\2\u038b\u038c\7u\2\2\u038c\u038d\7g\2\2\u038d\u00d8\3\2\2"+ + "\2\u038e\u038f\7v\2\2\u038f\u0390\7{\2\2\u0390\u0391\7r\2\2\u0391\u0392"+ + "\7g\2\2\u0392\u00da\3\2\2\2\u0393\u0394\7x\2\2\u0394\u0395\7c\2\2\u0395"+ + "\u0396\7n\2\2\u0396\u0397\7k\2\2\u0397\u0398\7f\2\2\u0398\u0399\7c\2\2"+ + "\u0399\u039a\7v\2\2\u039a\u039b\7g\2\2\u039b\u00dc\3\2\2\2\u039c\u039d"+ + "\7c\2\2\u039d\u039e\7p\2\2\u039e\u039f\7p\2\2\u039f\u03a0\7q\2\2\u03a0"+ + "\u03a1\7v\2\2\u03a1\u03a2\7c\2\2\u03a2\u03a3\7v\2\2\u03a3\u03a4\7g\2\2"+ + "\u03a4\u00de\3\2\2\2\u03a5\u03a6\7f\2\2\u03a6\u03a7\7g\2\2\u03a7\u03a8"+ + "\7e\2\2\u03a8\u03a9\7n\2\2\u03a9\u03aa\7c\2\2\u03aa\u03ab\7t\2\2\u03ab"+ + "\u03ac\7g\2\2\u03ac\u00e0\3\2\2\2\u03ad\u03ae\7e\2\2\u03ae\u03af\7q\2"+ + "\2\u03af\u03b0\7p\2\2\u03b0\u03b1\7v\2\2\u03b1\u03b2\7g\2\2\u03b2\u03b3"+ + "\7z\2\2\u03b3\u03b4\7v\2\2\u03b4\u00e2\3\2\2\2\u03b5\u03b6\7k\2\2\u03b6"+ + "\u03b7\7v\2\2\u03b7\u03b8\7g\2\2\u03b8\u03b9\7o\2\2\u03b9\u00e4\3\2\2"+ + "\2\u03ba\u03bb\7x\2\2\u03bb\u03bc\7c\2\2\u03bc\u03bd\7t\2\2\u03bd\u03be"+ + "\7k\2\2\u03be\u03bf\7c\2\2\u03bf\u03c0\7d\2\2\u03c0\u03c1\7n\2\2\u03c1"+ + "\u03c2\7g\2\2\u03c2\u00e6\3\2\2\2\u03c3\u03c4\7k\2\2\u03c4\u03c5\7p\2"+ + "\2\u03c5\u03c6\7u\2\2\u03c6\u03c7\7g\2\2\u03c7\u03c8\7t\2\2\u03c8\u03c9"+ + "\7v\2\2\u03c9\u00e8\3\2\2\2\u03ca\u03cb\7f\2\2\u03cb\u03cc\7g\2\2\u03cc"+ + "\u03cd\7n\2\2\u03cd\u03ce\7g\2\2\u03ce\u03cf\7v\2\2\u03cf\u03d0\7g\2\2"+ + "\u03d0\u00ea\3\2\2\2\u03d1\u03d2\7t\2\2\u03d2\u03d3\7g\2\2\u03d3\u03d4"+ + "\7p\2\2\u03d4\u03d5\7c\2\2\u03d5\u03d6\7o\2\2\u03d6\u03d7\7g\2\2\u03d7"+ + "\u00ec\3\2\2\2\u03d8\u03d9\7t\2\2\u03d9\u03da\7g\2\2\u03da\u03db\7r\2"+ + "\2\u03db\u03dc\7n\2\2\u03dc\u03dd\7c\2\2\u03dd\u03de\7e\2\2\u03de\u03df"+ + "\7g\2\2\u03df\u00ee\3\2\2\2\u03e0\u03e1\7e\2\2\u03e1\u03e2\7q\2\2\u03e2"+ + "\u03e3\7r\2\2\u03e3\u03e4\7{\2\2\u03e4\u00f0\3\2\2\2\u03e5\u03e6\7o\2"+ + "\2\u03e6\u03e7\7q\2\2\u03e7\u03e8\7f\2\2\u03e8\u03e9\7k\2\2\u03e9\u03ea"+ + "\7h\2\2\u03ea\u03eb\7{\2\2\u03eb\u00f2\3\2\2\2\u03ec\u03ed\7c\2\2\u03ed"+ + "\u03ee\7r\2\2\u03ee\u03ef\7r\2\2\u03ef\u03f0\7g\2\2\u03f0\u03f1\7p\2\2"+ + "\u03f1\u03f2\7f\2\2\u03f2\u00f4\3\2\2\2\u03f3\u03f4\7k\2\2\u03f4\u03f5"+ + "\7p\2\2\u03f5\u03f6\7v\2\2\u03f6\u03f7\7q\2\2\u03f7\u00f6\3\2\2\2\u03f8"+ + "\u03f9\7x\2\2\u03f9\u03fa\7c\2\2\u03fa\u03fb\7n\2\2\u03fb\u03fc\7w\2\2"+ + "\u03fc\u03fd\7g\2\2\u03fd\u00f8\3\2\2\2\u03fe\u03ff\7y\2\2\u03ff\u0400"+ + "\7k\2\2\u0400\u0401\7v\2\2\u0401\u0402\7j\2\2\u0402\u00fa\3\2\2\2\u0403"+ + "\u0404\7r\2\2\u0404\u0405\7q\2\2\u0405\u0406\7u\2\2\u0406\u0407\7k\2\2"+ + "\u0407\u0408\7v\2\2\u0408\u0409\7k\2\2\u0409\u040a\7q\2\2\u040a\u040b"+ + "\7p\2\2\u040b\u00fc\3\2\2\2\u040c\u040d\7l\2\2\u040d\u040e\7u\2\2\u040e"+ + "\u040f\7q\2\2\u040f\u0410\7p\2\2\u0410\u00fe\3\2\2\2\u0411\u0412\7w\2"+ + "\2\u0412\u0413\7r\2\2\u0413\u0414\7f\2\2\u0414\u0415\7c\2\2\u0415\u0416"+ + "\7v\2\2\u0416\u0417\7k\2\2\u0417\u0418\7p\2\2\u0418\u0419\7i\2\2\u0419"+ + "\u0100\3\2\2\2\u041a\u041b\7d\2\2\u041b\u041c\7t\2\2\u041c\u041d\7g\2"+ + "\2\u041d\u041e\7c\2\2\u041e\u041f\7m\2\2\u041f\u0102\3\2\2\2\u0420\u0421"+ + "\7n\2\2\u0421\u0422\7q\2\2\u0422\u0423\7q\2\2\u0423\u0424\7r\2\2\u0424"+ + "\u0104\3\2\2\2\u0425\u0426\7e\2\2\u0426\u0427\7q\2\2\u0427\u0428\7p\2"+ + "\2\u0428\u0429\7v\2\2\u0429\u042a\7k\2\2\u042a\u042b\7p\2\2\u042b\u042c"+ + "\7w\2\2\u042c\u042d\7g\2\2\u042d\u0106\3\2\2\2\u042e\u042f\7g\2\2\u042f"+ + "\u0430\7z\2\2\u0430\u0431\7k\2\2\u0431\u0432\7v\2\2\u0432\u0108\3\2\2"+ + "\2\u0433\u0434\7t\2\2\u0434\u0435\7g\2\2\u0435\u0436\7v\2\2\u0436\u0437"+ + "\7w\2\2\u0437\u0438\7t\2\2\u0438\u0439\7p\2\2\u0439\u043a\7k\2\2\u043a"+ + "\u043b\7p\2\2\u043b\u043c\7i\2\2\u043c\u010a\3\2\2\2\u043d\u043e\7y\2"+ + "\2\u043e\u043f\7j\2\2\u043f\u0440\7k\2\2\u0440\u0441\7n\2\2\u0441\u0442"+ + "\7g\2\2\u0442\u010c\3\2\2\2\u0443\u0448\7$\2\2\u0444\u0447\5\u010f\u0088"+ + "\2\u0445\u0447\n\2\2\2\u0446\u0444\3\2\2\2\u0446\u0445\3\2\2\2\u0447\u044a"+ + "\3\2\2\2\u0448\u0446\3\2\2\2\u0448\u0449\3\2\2\2\u0449\u044b\3\2\2\2\u044a"+ + "\u0448\3\2\2\2\u044b\u044c\7$\2\2\u044c\u010e\3\2\2\2\u044d\u0450\7^\2"+ + "\2\u044e\u0451\t\3\2\2\u044f\u0451\5\u0111\u0089\2\u0450\u044e\3\2\2\2"+ + "\u0450\u044f\3\2\2\2\u0451\u0110\3\2\2\2\u0452\u0453\7w\2\2\u0453\u0454"+ + "\5\u0113\u008a\2\u0454\u0455\5\u0113\u008a\2\u0455\u0456\5\u0113\u008a"+ + "\2\u0456\u0457\5\u0113\u008a\2\u0457\u0112\3\2\2\2\u0458\u0459\t\4\2\2"+ + "\u0459\u0114\3\2\2\2\u045a\u045b\7A\2\2\u045b\u0116\3\2\2\2\u045c\u045d"+ + "\7p\2\2\u045d\u045e\7w\2\2\u045e\u045f\7n\2\2\u045f\u0460\7n\2\2\u0460"+ + "\u0118\3\2\2\2\u0461\u0462\5\u011b\u008e\2\u0462\u011a\3\2\2\2\u0463\u0467"+ + "\5\u011d\u008f\2\u0464\u0467\5\u011f\u0090\2\u0465\u0467\5\u0121\u0091"+ + "\2\u0466\u0463\3\2\2\2\u0466\u0464\3\2\2\2\u0466\u0465\3\2\2\2\u0467\u011c"+ + "\3\2\2\2\u0468\u0469\5\u0123\u0092\2\u0469\u011e\3\2\2\2\u046a\u046b\7"+ + "\60\2\2\u046b\u0475\5\u0123\u0092\2\u046c\u046d\5\u0123\u0092\2\u046d"+ + "\u0471\7\60\2\2\u046e\u0470\t\5\2\2\u046f\u046e\3\2\2\2\u0470\u0473\3"+ + "\2\2\2\u0471\u046f\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0475\3\2\2\2\u0473"+ + "\u0471\3\2\2\2\u0474\u046a\3\2\2\2\u0474\u046c\3\2\2\2\u0475\u0120\3\2"+ + "\2\2\u0476\u0477\7\60\2\2\u0477\u0483\5\u0123\u0092\2\u0478\u0480\5\u0123"+ + "\u0092\2\u0479\u047d\7\60\2\2\u047a\u047c\t\5\2\2\u047b\u047a\3\2\2\2"+ + "\u047c\u047f\3\2\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481"+ + "\3\2\2\2\u047f\u047d\3\2\2\2\u0480\u0479\3\2\2\2\u0480\u0481\3\2\2\2\u0481"+ + "\u0483\3\2\2\2\u0482\u0476\3\2\2\2\u0482\u0478\3\2\2\2\u0483\u0484\3\2"+ + "\2\2\u0484\u0486\t\6\2\2\u0485\u0487\t\7\2\2\u0486\u0485\3\2\2\2\u0486"+ + "\u0487\3\2\2\2\u0487\u0488\3\2\2\2\u0488\u0489\5\u0123\u0092\2\u0489\u0122"+ + "\3\2\2\2\u048a\u048c\t\5\2\2\u048b\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+ + "\u048b\3\2\2\2\u048d\u048e\3\2\2\2\u048e\u0124\3\2\2\2\u048f\u0490\t\b"+ + "\2\2\u0490\u0491\3\2\2\2\u0491\u0492\b\u0093\2\2\u0492\u0126\3\2\2\2\u0493"+ + "\u0497\5\u0129\u0095\2\u0494\u0496\5\u012b\u0096\2\u0495\u0494\3\2\2\2"+ + "\u0496\u0499\3\2\2\2\u0497\u0495\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u0128"+ + "\3\2\2\2\u0499\u0497\3\2\2\2\u049a\u049c\t\t\2\2\u049b\u049a\3\2\2\2\u049c"+ + "\u012a\3\2\2\2\u049d\u04a0\5\u0129\u0095\2\u049e\u04a0\t\n\2\2\u049f\u049d"+ + "\3\2\2\2\u049f\u049e\3\2\2\2\u04a0\u012c\3\2\2\2\u04a1\u04a2\7*\2\2\u04a2"+ + "\u04ab\7<\2\2\u04a3\u04aa\5\u012d\u0097\2\u04a4\u04a5\7*\2\2\u04a5\u04aa"+ + "\n\13\2\2\u04a6\u04a7\7<\2\2\u04a7\u04aa\n\f\2\2\u04a8\u04aa\n\r\2\2\u04a9"+ + "\u04a3\3\2\2\2\u04a9\u04a4\3\2\2\2\u04a9\u04a6\3\2\2\2\u04a9\u04a8\3\2"+ + "\2\2\u04aa\u04ad\3\2\2\2\u04ab\u04a9\3\2\2\2\u04ab\u04ac\3\2\2\2\u04ac"+ + "\u04af\3\2\2\2\u04ad\u04ab\3\2\2\2\u04ae\u04b0\7<\2\2\u04af\u04ae\3\2"+ + "\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04af\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2"+ + "\u04b3\3\2\2\2\u04b3\u04b4\7+\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b6\b\u0097"+ + "\2\2\u04b6\u012e\3\2\2\2\u04b7\u04b8\n\16\2\2\u04b8\u0130\3\2\2\2\24\2"+ + "\u0446\u0448\u0450\u0466\u0471\u0474\u047d\u0480\u0482\u0486\u048d\u0497"+ + "\u049b\u049f\u04a9\u04ab\u04b1\3\2\3\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens index 74d3a280cf..90fc814284 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens @@ -121,27 +121,28 @@ Kmodify=120 Kappend=121 Kinto=122 Kvalue=123 -Kjson=124 -Kwith=125 -Kposition=126 -Kbreak=127 -Kloop=128 -Kcontinue=129 -Kexit=130 -Kreturning=131 -Kwhile=132 -STRING=133 -ArgumentPlaceholder=134 -NullLiteral=135 -Literal=136 -NumericLiteral=137 -IntegerLiteral=138 -DecimalLiteral=139 -DoubleLiteral=140 -WS=141 -NCName=142 -XQComment=143 -ContentChar=144 +Kwith=124 +Kposition=125 +Kjson=126 +Kupdating=127 +Kbreak=128 +Kloop=129 +Kcontinue=130 +Kexit=131 +Kreturning=132 +Kwhile=133 +STRING=134 +ArgumentPlaceholder=135 +NullLiteral=136 +Literal=137 +NumericLiteral=138 +IntegerLiteral=139 +DecimalLiteral=140 +DoubleLiteral=141 +WS=142 +NCName=143 +XQComment=144 +ContentChar=145 ';'=1 'module'=2 'namespace'=3 @@ -265,14 +266,15 @@ ContentChar=144 'append'=121 'into'=122 'value'=123 -'json'=124 -'with'=125 -'position'=126 -'break'=127 -'loop'=128 -'continue'=129 -'exit'=130 -'returning'=131 -'while'=132 -'?'=134 -'null'=135 +'with'=124 +'position'=125 +'json'=126 +'updating'=127 +'break'=128 +'loop'=129 +'continue'=130 +'exit'=131 +'returning'=132 +'while'=133 +'?'=135 +'null'=136 diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index f29c09bf46..311fb7e04e 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -48,11 +48,11 @@ public class JsoniqParser extends Parser { Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108, Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114, Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120, - Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126, - Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132, - STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137, - IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142, - XQComment=143, ContentChar=144; + Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126, + Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132, + Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137, + NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141, + WS=142, NCName=143, XQComment=144, ContentChar=145; public static final int RULE_moduleAndThisIsIt = 0, RULE_module = 1, RULE_mainModule = 2, RULE_libraryModule = 3, RULE_prolog = 4, RULE_program = 5, RULE_statements = 6, RULE_statementsAndExpr = 7, @@ -145,9 +145,9 @@ private static String[] makeLiteralNames() { "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'", - "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'", - "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'", - "'returning'", "'while'", null, "'?'", "'null'" + "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'", + "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'", + "'exit'", "'returning'", "'while'", null, "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -166,10 +166,10 @@ private static String[] makeSymbolicNames() { "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", - "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", - "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", - "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", - "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", + "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith", + "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit", + "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" }; } @@ -395,9 +395,10 @@ public final ModuleContext module() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -795,7 +796,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws setState(312); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { setState(311); expr(); @@ -1765,9 +1766,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -1866,9 +1868,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -2092,9 +2095,11 @@ public final CaseStatementContext caseStatement() throws RecognitionException { public static class AnnotationContext extends ParserRuleContext { public QnameContext name; + public Token updating; public QnameContext qname() { return getRuleContext(QnameContext.class,0); } + public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); } public List Literal() { return getTokens(JsoniqParser.Literal); } public TerminalNode Literal(int i) { return getToken(JsoniqParser.Literal, i); @@ -2117,40 +2122,56 @@ public final AnnotationContext annotation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(461); - match(T__12); - setState(462); - ((AnnotationContext)_localctx).name = qname(); - setState(473); + setState(476); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==T__8) { + switch (_input.LA(1)) { + case T__12: { - setState(463); - match(T__8); - setState(464); - match(Literal); - setState(469); + setState(461); + match(T__12); + setState(462); + ((AnnotationContext)_localctx).name = qname(); + setState(473); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + if (_la==T__8) { { - { - setState(465); - match(T__13); - setState(466); + setState(463); + match(T__8); + setState(464); match(Literal); - } - } - setState(471); + setState(469); _errHandler.sync(this); _la = _input.LA(1); + while (_la==T__13) { + { + { + setState(465); + match(T__13); + setState(466); + match(Literal); + } + } + setState(471); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(472); + match(T__9); + } } - setState(472); - match(T__9); + + } + break; + case Kupdating: + { + setState(475); + ((AnnotationContext)_localctx).updating = match(Kupdating); } + break; + default: + throw new NoViableAltException(this); } - } } catch (RecognitionException re) { @@ -2189,17 +2210,17 @@ public final AnnotationsContext annotations() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(478); + setState(481); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__12 || _la==Kupdating) { { { - setState(475); + setState(478); annotation(); } } - setState(480); + setState(483); _errHandler.sync(this); _la = _input.LA(1); } @@ -2245,29 +2266,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(481); + setState(484); annotations(); - setState(482); + setState(485); match(Kvariable); - setState(483); + setState(486); varDeclForStatement(); - setState(488); + setState(491); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(484); + setState(487); match(T__13); - setState(485); + setState(488); varDeclForStatement(); } } - setState(490); + setState(493); _errHandler.sync(this); _la = _input.LA(1); } - setState(491); + setState(494); match(T__0); } } @@ -2314,28 +2335,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(493); - ((VarDeclForStatementContext)_localctx).var_ref = varRef(); setState(496); + ((VarDeclForStatementContext)_localctx).var_ref = varRef(); + setState(499); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(494); + setState(497); match(Kas); - setState(495); + setState(498); sequenceType(); } } - setState(500); + setState(503); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5) { { - setState(498); + setState(501); match(T__5); - setState(499); + setState(502); ((VarDeclForStatementContext)_localctx).exprSingle = exprSingle(); ((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle); } @@ -2381,15 +2402,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(505); match(Kwhile); - setState(503); + setState(506); match(T__8); - setState(504); + setState(507); ((WhileStatementContext)_localctx).test_expr = expr(); - setState(505); + setState(508); match(T__9); - setState(506); + setState(509); ((WhileStatementContext)_localctx).stmt = statement(); } } @@ -2432,34 +2453,34 @@ public final SetterContext setter() throws RecognitionException { SetterContext _localctx = new SetterContext(_ctx, getState()); enterRule(_localctx, 58, RULE_setter); try { - setState(512); + setState(515); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(508); + setState(511); defaultCollationDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(509); + setState(512); orderingModeDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(510); + setState(513); emptyOrderDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(511); + setState(514); decimalFormatDecl(); } break; @@ -2499,15 +2520,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(514); + setState(517); match(Kdeclare); - setState(515); + setState(518); match(T__2); - setState(516); + setState(519); match(NCName); - setState(517); + setState(520); match(T__3); - setState(518); + setState(521); uriLiteral(); } } @@ -2550,34 +2571,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException { AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState()); enterRule(_localctx, 62, RULE_annotatedDecl); try { - setState(524); + setState(527); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(520); + setState(523); functionDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(521); + setState(524); varDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(522); + setState(525); typeDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(523); + setState(526); contextItemDecl(); } break; @@ -2618,13 +2639,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(526); + setState(529); match(Kdeclare); - setState(527); + setState(530); match(Kdefault); - setState(528); + setState(531); match(Kcollation); - setState(529); + setState(532); uriLiteral(); } } @@ -2660,11 +2681,11 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(531); + setState(534); match(Kdeclare); - setState(532); + setState(535); match(T__14); - setState(533); + setState(536); _la = _input.LA(1); if ( !(_la==T__15 || _la==Kunordered) ) { _errHandler.recoverInline(this); @@ -2713,16 +2734,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(535); + setState(538); match(Kdeclare); - setState(536); + setState(539); match(Kdefault); - setState(537); + setState(540); match(Korder); - setState(538); + setState(541); match(Kempty); { - setState(539); + setState(542); ((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kgreatest || _la==Kleast) ) { @@ -2783,17 +2804,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(541); + setState(544); match(Kdeclare); - setState(546); + setState(549); _errHandler.sync(this); switch (_input.LA(1)) { case T__16: { { - setState(542); + setState(545); match(T__16); - setState(543); + setState(546); qname(); } } @@ -2801,9 +2822,9 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce case Kdefault: { { - setState(544); + setState(547); match(Kdefault); - setState(545); + setState(548); match(T__16); } } @@ -2811,21 +2832,21 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce default: throw new NoViableAltException(this); } - setState(554); + setState(557); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27))) != 0)) { { { - setState(548); + setState(551); dfPropertyName(); - setState(549); + setState(552); match(T__3); - setState(550); + setState(553); stringLiteral(); } } - setState(556); + setState(559); _errHandler.sync(this); _la = _input.LA(1); } @@ -2874,17 +2895,17 @@ public final QnameContext qname() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(565); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: { - setState(559); + setState(562); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(557); + setState(560); ((QnameContext)_localctx).ns = match(NCName); } break; @@ -2951,9 +2972,10 @@ public final QnameContext qname() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -2962,24 +2984,24 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(558); + setState(561); ((QnameContext)_localctx).nskw = keyWords(); } break; default: throw new NoViableAltException(this); } - setState(561); + setState(564); match(T__17); } break; } - setState(566); + setState(569); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(564); + setState(567); ((QnameContext)_localctx).local_name = match(NCName); } break; @@ -3046,9 +3068,10 @@ public final QnameContext qname() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -3057,7 +3080,7 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(565); + setState(568); ((QnameContext)_localctx).local_namekw = keyWords(); } break; @@ -3096,7 +3119,7 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(568); + setState(571); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27))) != 0)) ) { _errHandler.recoverInline(this); @@ -3148,48 +3171,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(570); + setState(573); match(T__28); - setState(571); + setState(574); match(T__1); - setState(575); + setState(578); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__2) { { - setState(572); + setState(575); match(T__2); - setState(573); + setState(576); ((ModuleImportContext)_localctx).prefix = match(NCName); - setState(574); + setState(577); match(T__3); } } - setState(577); + setState(580); ((ModuleImportContext)_localctx).targetNamespace = uriLiteral(); - setState(587); + setState(590); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(578); + setState(581); match(Kat); - setState(579); + setState(582); uriLiteral(); - setState(584); + setState(587); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(580); + setState(583); match(T__13); - setState(581); + setState(584); uriLiteral(); } } - setState(586); + setState(589); _errHandler.sync(this); _la = _input.LA(1); } @@ -3244,35 +3267,35 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(592); match(Kdeclare); - setState(590); + setState(593); annotations(); - setState(591); + setState(594); match(Kvariable); - setState(592); - varRef(); setState(595); + varRef(); + setState(598); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(593); + setState(596); match(Kas); - setState(594); + setState(597); sequenceType(); } } - setState(604); + setState(607); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: { { - setState(597); + setState(600); match(T__5); - setState(598); + setState(601); exprSingle(); } } @@ -3280,16 +3303,16 @@ public final VarDeclContext varDecl() throws RecognitionException { case T__29: { { - setState(599); - ((VarDeclContext)_localctx).external = match(T__29); setState(602); + ((VarDeclContext)_localctx).external = match(T__29); + setState(605); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5) { { - setState(600); + setState(603); match(T__5); - setState(601); + setState(604); exprSingle(); } } @@ -3343,33 +3366,33 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(606); + setState(609); match(Kdeclare); - setState(607); + setState(610); match(Kcontext); - setState(608); - match(Kitem); setState(611); + match(Kitem); + setState(614); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(609); + setState(612); match(Kas); - setState(610); + setState(613); sequenceType(); } } - setState(620); + setState(623); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: { { - setState(613); + setState(616); match(T__5); - setState(614); + setState(617); exprSingle(); } } @@ -3377,16 +3400,16 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio case T__29: { { - setState(615); - ((ContextItemDeclContext)_localctx).external = match(T__29); setState(618); + ((ContextItemDeclContext)_localctx).external = match(T__29); + setState(621); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5) { { - setState(616); + setState(619); match(T__5); - setState(617); + setState(620); exprSingle(); } } @@ -3414,6 +3437,7 @@ public static class FunctionDeclContext extends ParserRuleContext { public QnameContext fn_name; public SequenceTypeContext return_type; public StatementsAndOptionalExprContext fn_body; + public Token is_external; public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } public AnnotationsContext annotations() { return getRuleContext(AnnotationsContext.class,0); @@ -3449,59 +3473,59 @@ public final FunctionDeclContext functionDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(622); + setState(625); match(Kdeclare); - setState(623); + setState(626); annotations(); - setState(624); + setState(627); match(T__30); - setState(625); + setState(628); ((FunctionDeclContext)_localctx).fn_name = qname(); - setState(626); + setState(629); match(T__8); - setState(628); + setState(631); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(627); + setState(630); paramList(); } } - setState(630); - match(T__9); setState(633); + match(T__9); + setState(636); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(631); + setState(634); match(Kas); - setState(632); + setState(635); ((FunctionDeclContext)_localctx).return_type = sequenceType(); } } - setState(640); + setState(643); _errHandler.sync(this); switch (_input.LA(1)) { case T__6: { - setState(635); + setState(638); match(T__6); { - setState(636); + setState(639); ((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(637); + setState(640); match(T__7); } break; case T__29: { - setState(639); - match(T__29); + setState(642); + ((FunctionDeclContext)_localctx).is_external = match(T__29); } break; default: @@ -3553,25 +3577,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(642); + setState(645); match(Kdeclare); - setState(643); + setState(646); match(Ktype); - setState(644); + setState(647); ((TypeDeclContext)_localctx).type_name = qname(); - setState(645); + setState(648); match(Kas); - setState(647); + setState(650); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(646); + setState(649); ((TypeDeclContext)_localctx).schema = schemaLanguage(); } break; } - setState(649); + setState(652); ((TypeDeclContext)_localctx).type_definition = exprSingle(); } } @@ -3603,33 +3627,33 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState()); enterRule(_localctx, 86, RULE_schemaLanguage); try { - setState(657); + setState(660); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(651); + setState(654); match(T__31); - setState(652); + setState(655); match(T__32); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(653); + setState(656); match(T__31); - setState(654); + setState(657); match(T__33); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(655); + setState(658); match(Kjson); - setState(656); + setState(659); match(T__34); } break; @@ -3671,21 +3695,21 @@ public final ParamListContext paramList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(659); + setState(662); param(); - setState(664); + setState(667); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(660); + setState(663); match(T__13); - setState(661); + setState(664); param(); } } - setState(666); + setState(669); _errHandler.sync(this); _la = _input.LA(1); } @@ -3728,18 +3752,18 @@ public final ParamContext param() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(667); + setState(670); match(T__4); - setState(668); - qname(); setState(671); + qname(); + setState(674); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(669); + setState(672); match(Kas); - setState(670); + setState(673); sequenceType(); } } @@ -3782,21 +3806,21 @@ public final ExprContext expr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(673); + setState(676); exprSingle(); - setState(678); + setState(681); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(674); + setState(677); match(T__13); - setState(675); + setState(678); exprSingle(); } } - setState(680); + setState(683); _errHandler.sync(this); _la = _input.LA(1); } @@ -3847,48 +3871,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException { ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState()); enterRule(_localctx, 94, RULE_exprSingle); try { - setState(687); + setState(690); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(681); + setState(684); exprSimple(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(682); + setState(685); flowrExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(683); + setState(686); switchExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(684); + setState(687); typeSwitchExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(685); + setState(688); ifExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(686); + setState(689); tryCatchExpr(); } break; @@ -3945,62 +3969,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException { ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState()); enterRule(_localctx, 96, RULE_exprSimple); try { - setState(697); + setState(700); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(689); + setState(692); quantifiedExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(690); + setState(693); orExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(691); + setState(694); insertExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(692); + setState(695); deleteExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(693); + setState(696); renameExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(694); + setState(697); replaceExpr(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(695); + setState(698); transformExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(696); + setState(699); appendExpr(); } break; @@ -4079,66 +4103,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(701); + setState(704); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(699); + setState(702); ((FlowrExprContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(700); + setState(703); ((FlowrExprContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(711); + setState(714); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Korder - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)))) != 0)) { { - setState(709); + setState(712); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(703); + setState(706); forClause(); } break; case Klet: { - setState(704); + setState(707); letClause(); } break; case Kwhere: { - setState(705); + setState(708); whereClause(); } break; case Kgroup: { - setState(706); + setState(709); groupByClause(); } break; case Korder: case Kstable: { - setState(707); + setState(710); orderByClause(); } break; case Kcount: { - setState(708); + setState(711); countClause(); } break; @@ -4146,13 +4170,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { throw new NoViableAltException(this); } } - setState(713); + setState(716); _errHandler.sync(this); _la = _input.LA(1); } - setState(714); + setState(717); match(Kreturn); - setState(715); + setState(718); ((FlowrExprContext)_localctx).return_expr = exprSingle(); } } @@ -4195,25 +4219,25 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(717); + setState(720); match(Kfor); - setState(718); + setState(721); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); - setState(723); + setState(726); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(719); + setState(722); match(T__13); - setState(720); + setState(723); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); } } - setState(725); + setState(728); _errHandler.sync(this); _la = _input.LA(1); } @@ -4271,47 +4295,47 @@ public final ForVarContext forVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(726); - ((ForVarContext)_localctx).var_ref = varRef(); setState(729); + ((ForVarContext)_localctx).var_ref = varRef(); + setState(732); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(727); + setState(730); match(Kas); - setState(728); + setState(731); ((ForVarContext)_localctx).seq = sequenceType(); } } - setState(733); + setState(736); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kallowing) { { - setState(731); + setState(734); ((ForVarContext)_localctx).flag = match(Kallowing); - setState(732); + setState(735); match(Kempty); } } - setState(737); + setState(740); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(735); + setState(738); match(Kat); - setState(736); + setState(739); ((ForVarContext)_localctx).at = varRef(); } } - setState(739); + setState(742); match(Kin); - setState(740); + setState(743); ((ForVarContext)_localctx).ex = exprSingle(); } } @@ -4354,25 +4378,25 @@ public final LetClauseContext letClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(742); + setState(745); match(Klet); - setState(743); + setState(746); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); - setState(748); + setState(751); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(744); + setState(747); match(T__13); - setState(745); + setState(748); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); } } - setState(750); + setState(753); _errHandler.sync(this); _la = _input.LA(1); } @@ -4421,23 +4445,23 @@ public final LetVarContext letVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(751); - ((LetVarContext)_localctx).var_ref = varRef(); setState(754); + ((LetVarContext)_localctx).var_ref = varRef(); + setState(757); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(752); + setState(755); match(Kas); - setState(753); + setState(756); ((LetVarContext)_localctx).seq = sequenceType(); } } - setState(756); + setState(759); match(T__5); - setState(757); + setState(760); ((LetVarContext)_localctx).ex = exprSingle(); } } @@ -4474,9 +4498,9 @@ public final WhereClauseContext whereClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(759); + setState(762); match(Kwhere); - setState(760); + setState(763); exprSingle(); } } @@ -4520,27 +4544,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(762); + setState(765); match(Kgroup); - setState(763); + setState(766); match(Kby); - setState(764); + setState(767); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); - setState(769); + setState(772); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(765); + setState(768); match(T__13); - setState(766); + setState(769); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); } } - setState(771); + setState(774); _errHandler.sync(this); _la = _input.LA(1); } @@ -4595,40 +4619,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(772); + setState(775); ((GroupByVarContext)_localctx).var_ref = varRef(); - setState(779); + setState(782); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5 || _la==Kas) { { - setState(775); + setState(778); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(773); + setState(776); match(Kas); - setState(774); + setState(777); ((GroupByVarContext)_localctx).seq = sequenceType(); } } - setState(777); + setState(780); ((GroupByVarContext)_localctx).decl = match(T__5); - setState(778); + setState(781); ((GroupByVarContext)_localctx).ex = exprSingle(); } } - setState(783); + setState(786); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(781); + setState(784); match(Kcollation); - setState(782); + setState(785); ((GroupByVarContext)_localctx).uri = uriLiteral(); } } @@ -4675,15 +4699,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(790); + setState(793); _errHandler.sync(this); switch (_input.LA(1)) { case Korder: { { - setState(785); + setState(788); match(Korder); - setState(786); + setState(789); match(Kby); } } @@ -4691,11 +4715,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { case Kstable: { { - setState(787); + setState(790); ((OrderByClauseContext)_localctx).stb = match(Kstable); - setState(788); + setState(791); match(Korder); - setState(789); + setState(792); match(Kby); } } @@ -4703,21 +4727,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(792); + setState(795); orderByExpr(); - setState(797); + setState(800); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(793); + setState(796); match(T__13); - setState(794); + setState(797); orderByExpr(); } } - setState(799); + setState(802); _errHandler.sync(this); _la = _input.LA(1); } @@ -4770,20 +4794,20 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(800); - ((OrderByExprContext)_localctx).ex = exprSingle(); setState(803); + ((OrderByExprContext)_localctx).ex = exprSingle(); + setState(806); _errHandler.sync(this); switch (_input.LA(1)) { case Kascending: { - setState(801); + setState(804); match(Kascending); } break; case Kdescending: { - setState(802); + setState(805); ((OrderByExprContext)_localctx).desc = match(Kdescending); } break; @@ -4802,25 +4826,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { default: break; } - setState(810); + setState(813); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kempty) { { - setState(805); - match(Kempty); setState(808); + match(Kempty); + setState(811); _errHandler.sync(this); switch (_input.LA(1)) { case Kgreatest: { - setState(806); + setState(809); ((OrderByExprContext)_localctx).gr = match(Kgreatest); } break; case Kleast: { - setState(807); + setState(810); ((OrderByExprContext)_localctx).ls = match(Kleast); } break; @@ -4830,14 +4854,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { } } - setState(814); + setState(817); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(812); + setState(815); match(Kcollation); - setState(813); + setState(816); ((OrderByExprContext)_localctx).uril = uriLiteral(); } } @@ -4877,9 +4901,9 @@ public final CountClauseContext countClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(816); + setState(819); match(Kcount); - setState(817); + setState(820); varRef(); } } @@ -4929,47 +4953,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(821); + setState(824); _errHandler.sync(this); switch (_input.LA(1)) { case Ksome: { - setState(819); + setState(822); ((QuantifiedExprContext)_localctx).so = match(Ksome); } break; case Kevery: { - setState(820); + setState(823); ((QuantifiedExprContext)_localctx).ev = match(Kevery); } break; default: throw new NoViableAltException(this); } - setState(823); + setState(826); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); - setState(828); + setState(831); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(824); + setState(827); match(T__13); - setState(825); + setState(828); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); } } - setState(830); + setState(833); _errHandler.sync(this); _la = _input.LA(1); } - setState(831); + setState(834); match(Ksatisfies); - setState(832); + setState(835); exprSingle(); } } @@ -5014,23 +5038,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(834); - varRef(); setState(837); + varRef(); + setState(840); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(835); + setState(838); match(Kas); - setState(836); + setState(839); sequenceType(); } } - setState(839); + setState(842); match(Kin); - setState(840); + setState(843); exprSingle(); } } @@ -5083,34 +5107,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(842); + setState(845); match(Kswitch); - setState(843); + setState(846); match(T__8); - setState(844); + setState(847); ((SwitchExprContext)_localctx).cond = expr(); - setState(845); + setState(848); match(T__9); - setState(847); + setState(850); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(846); + setState(849); ((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause(); ((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause); } } - setState(849); + setState(852); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(851); + setState(854); match(Kdefault); - setState(852); + setState(855); match(Kreturn); - setState(853); + setState(856); ((SwitchExprContext)_localctx).def = exprSingle(); } } @@ -5158,26 +5182,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(857); + setState(860); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(855); + setState(858); match(Kcase); - setState(856); + setState(859); ((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle); } } - setState(859); + setState(862); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(861); + setState(864); match(Kreturn); - setState(862); + setState(865); ((SwitchCaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5234,44 +5258,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(864); + setState(867); match(Ktypeswitch); - setState(865); + setState(868); match(T__8); - setState(866); + setState(869); ((TypeSwitchExprContext)_localctx).cond = expr(); - setState(867); + setState(870); match(T__9); - setState(869); + setState(872); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(868); + setState(871); ((TypeSwitchExprContext)_localctx).caseClause = caseClause(); ((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause); } } - setState(871); + setState(874); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(873); + setState(876); match(Kdefault); - setState(875); + setState(878); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(874); + setState(877); ((TypeSwitchExprContext)_localctx).var_ref = varRef(); } } - setState(877); + setState(880); match(Kreturn); - setState(878); + setState(881); ((TypeSwitchExprContext)_localctx).def = exprSingle(); } } @@ -5324,43 +5348,43 @@ public final CaseClauseContext caseClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(880); + setState(883); match(Kcase); - setState(884); + setState(887); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(881); + setState(884); ((CaseClauseContext)_localctx).var_ref = varRef(); - setState(882); + setState(885); match(Kas); } } - setState(886); + setState(889); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); - setState(891); + setState(894); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11) { { { - setState(887); + setState(890); match(T__11); - setState(888); + setState(891); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); } } - setState(893); + setState(896); _errHandler.sync(this); _la = _input.LA(1); } - setState(894); + setState(897); match(Kreturn); - setState(895); + setState(898); ((CaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5408,21 +5432,21 @@ public final IfExprContext ifExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(897); + setState(900); match(Kif); - setState(898); + setState(901); match(T__8); - setState(899); + setState(902); ((IfExprContext)_localctx).test_condition = expr(); - setState(900); + setState(903); match(T__9); - setState(901); + setState(904); match(Kthen); - setState(902); + setState(905); ((IfExprContext)_localctx).branch = exprSingle(); - setState(903); + setState(906); match(Kelse); - setState(904); + setState(907); ((IfExprContext)_localctx).else_branch = exprSingle(); } } @@ -5469,15 +5493,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(906); + setState(909); match(Ktry); - setState(907); + setState(910); match(T__6); - setState(908); + setState(911); ((TryCatchExprContext)_localctx).try_expression = expr(); - setState(909); + setState(912); match(T__7); - setState(911); + setState(914); _errHandler.sync(this); _alt = 1; do { @@ -5485,7 +5509,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { case 1: { { - setState(910); + setState(913); ((TryCatchExprContext)_localctx).catchClause = catchClause(); ((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause); } @@ -5494,9 +5518,9 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(913); + setState(916); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -5545,14 +5569,14 @@ public final CatchClauseContext catchClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(915); - match(Kcatch); setState(918); + match(Kcatch); + setState(921); _errHandler.sync(this); switch (_input.LA(1)) { case T__10: { - setState(916); + setState(919); ((CatchClauseContext)_localctx).s11 = match(T__10); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11); } @@ -5620,9 +5644,10 @@ public final CatchClauseContext catchClause() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -5632,7 +5657,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(917); + setState(920); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5640,20 +5665,20 @@ public final CatchClauseContext catchClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(927); + setState(930); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11) { { { - setState(920); - match(T__11); setState(923); + match(T__11); + setState(926); _errHandler.sync(this); switch (_input.LA(1)) { case T__10: { - setState(921); + setState(924); ((CatchClauseContext)_localctx).s11 = match(T__10); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11); } @@ -5721,9 +5746,10 @@ public final CatchClauseContext catchClause() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -5733,7 +5759,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(922); + setState(925); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5743,15 +5769,15 @@ public final CatchClauseContext catchClause() throws RecognitionException { } } } - setState(929); + setState(932); _errHandler.sync(this); _la = _input.LA(1); } - setState(930); + setState(933); match(T__6); - setState(931); + setState(934); ((CatchClauseContext)_localctx).catch_expression = expr(); - setState(932); + setState(935); match(T__7); } } @@ -5798,26 +5824,26 @@ public final OrExprContext orExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(934); + setState(937); ((OrExprContext)_localctx).main_expr = andExpr(); - setState(939); + setState(942); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,85,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(935); + setState(938); match(Kor); - setState(936); + setState(939); ((OrExprContext)_localctx).andExpr = andExpr(); ((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr); } } } - setState(941); + setState(944); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,85,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); } } } @@ -5864,26 +5890,26 @@ public final AndExprContext andExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(942); + setState(945); ((AndExprContext)_localctx).main_expr = notExpr(); - setState(947); + setState(950); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,86,_ctx); + _alt = getInterpreter().adaptivePredict(_input,87,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(943); + setState(946); match(Kand); - setState(944); + setState(947); ((AndExprContext)_localctx).notExpr = notExpr(); ((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr); } } } - setState(949); + setState(952); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,86,_ctx); + _alt = getInterpreter().adaptivePredict(_input,87,_ctx); } } } @@ -5923,18 +5949,18 @@ public final NotExprContext notExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(951); + setState(954); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: { - setState(950); + setState(953); ((NotExprContext)_localctx).Knot = match(Knot); ((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot); } break; } - setState(953); + setState(956); ((NotExprContext)_localctx).main_expr = comparisonExpr(); } } @@ -5964,7 +5990,7 @@ public static class ComparisonExprContext extends ParserRuleContext { public Token s44; public Token s45; public Token s46; - public Token _tset1828; + public Token _tset1837; public StringConcatExprContext stringConcatExpr; public List rhs = new ArrayList(); public List stringConcatExpr() { @@ -5991,26 +6017,26 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(955); - ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); setState(958); + ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); + setState(961); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) { { - setState(956); - ((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1); + setState(959); + ((ComparisonExprContext)_localctx)._tset1837 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) { - ((ComparisonExprContext)_localctx)._tset1828 = (Token)_errHandler.recoverInline(this); + ((ComparisonExprContext)_localctx)._tset1837 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828); - setState(957); + ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1837); + setState(960); ((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr(); ((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr); } @@ -6057,22 +6083,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(960); + setState(963); ((StringConcatExprContext)_localctx).main_expr = rangeExpr(); - setState(965); + setState(968); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__46) { { { - setState(961); + setState(964); match(T__46); - setState(962); + setState(965); ((StringConcatExprContext)_localctx).rangeExpr = rangeExpr(); ((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr); } } - setState(967); + setState(970); _errHandler.sync(this); _la = _input.LA(1); } @@ -6117,16 +6143,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(968); - ((RangeExprContext)_localctx).main_expr = additiveExpr(); setState(971); + ((RangeExprContext)_localctx).main_expr = additiveExpr(); + setState(974); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: { - setState(969); + setState(972); match(Kto); - setState(970); + setState(973); ((RangeExprContext)_localctx).additiveExpr = additiveExpr(); ((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr); } @@ -6150,7 +6176,7 @@ public static class AdditiveExprContext extends ParserRuleContext { public Token s48; public List op = new ArrayList(); public Token s49; - public Token _tset1937; + public Token _tset1946; public MultiplicativeExprContext multiplicativeExpr; public List rhs = new ArrayList(); public List multiplicativeExpr() { @@ -6178,36 +6204,36 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(973); + setState(976); ((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr(); - setState(978); + setState(981); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(974); - ((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1); + setState(977); + ((AdditiveExprContext)_localctx)._tset1946 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__47 || _la==T__48) ) { - ((AdditiveExprContext)_localctx)._tset1937 = (Token)_errHandler.recoverInline(this); + ((AdditiveExprContext)_localctx)._tset1946 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937); - setState(975); + ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1946); + setState(978); ((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr(); ((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr); } } } - setState(980); + setState(983); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); } } } @@ -6229,7 +6255,7 @@ public static class MultiplicativeExprContext extends ParserRuleContext { public Token s50; public Token s51; public Token s52; - public Token _tset1965; + public Token _tset1974; public InstanceOfExprContext instanceOfExpr; public List rhs = new ArrayList(); public List instanceOfExpr() { @@ -6256,32 +6282,32 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(981); + setState(984); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); - setState(986); + setState(989); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) { { { - setState(982); - ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); + setState(985); + ((MultiplicativeExprContext)_localctx)._tset1974 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) ) { - ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); + ((MultiplicativeExprContext)_localctx)._tset1974 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(983); + ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1974); + setState(986); ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); } } - setState(988); + setState(991); _errHandler.sync(this); _la = _input.LA(1); } @@ -6326,18 +6352,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(989); + setState(992); ((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr(); - setState(993); + setState(996); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: { - setState(990); + setState(993); match(Kinstance); - setState(991); + setState(994); match(Kof); - setState(992); + setState(995); ((InstanceOfExprContext)_localctx).seq = sequenceType(); } break; @@ -6383,18 +6409,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(998); ((IsStaticallyExprContext)_localctx).main_expr = treatExpr(); - setState(999); + setState(1002); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: { - setState(996); + setState(999); match(Kis); - setState(997); + setState(1000); match(Kstatically); - setState(998); + setState(1001); ((IsStaticallyExprContext)_localctx).seq = sequenceType(); } break; @@ -6440,18 +6466,18 @@ public final TreatExprContext treatExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(1004); ((TreatExprContext)_localctx).main_expr = castableExpr(); - setState(1005); + setState(1008); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1002); + setState(1005); match(Ktreat); - setState(1003); + setState(1006); match(Kas); - setState(1004); + setState(1007); ((TreatExprContext)_localctx).seq = sequenceType(); } break; @@ -6497,18 +6523,18 @@ public final CastableExprContext castableExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1007); + setState(1010); ((CastableExprContext)_localctx).main_expr = castExpr(); - setState(1011); + setState(1014); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: { - setState(1008); + setState(1011); match(Kcastable); - setState(1009); + setState(1012); match(Kas); - setState(1010); + setState(1013); ((CastableExprContext)_localctx).single = singleType(); } break; @@ -6554,18 +6580,18 @@ public final CastExprContext castExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1013); + setState(1016); ((CastExprContext)_localctx).main_expr = arrowExpr(); - setState(1017); + setState(1020); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: { - setState(1014); + setState(1017); match(Kcast); - setState(1015); + setState(1018); match(Kas); - setState(1016); + setState(1019); ((CastExprContext)_localctx).single = singleType(); } break; @@ -6622,33 +6648,33 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1019); + setState(1022); ((ArrowExprContext)_localctx).main_expr = unaryExpr(); - setState(1028); + setState(1031); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,98,_ctx); + _alt = getInterpreter().adaptivePredict(_input,99,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { { - setState(1020); + setState(1023); match(T__3); - setState(1021); + setState(1024); match(T__44); } - setState(1023); + setState(1026); ((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier(); ((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier); - setState(1024); + setState(1027); ((ArrowExprContext)_localctx).argumentList = argumentList(); ((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList); } } } - setState(1030); + setState(1033); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,98,_ctx); + _alt = getInterpreter().adaptivePredict(_input,99,_ctx); } } } @@ -6688,7 +6714,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState()); enterRule(_localctx, 166, RULE_arrowFunctionSpecifier); try { - setState(1034); + setState(1037); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -6754,9 +6780,10 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -6767,21 +6794,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case NCName: enterOuterAlt(_localctx, 1); { - setState(1031); + setState(1034); qname(); } break; case T__4: enterOuterAlt(_localctx, 2); { - setState(1032); + setState(1035); varRef(); } break; case T__8: enterOuterAlt(_localctx, 3); { - setState(1033); + setState(1036); parenthesizedExpr(); } break; @@ -6804,7 +6831,7 @@ public static class UnaryExprContext extends ParserRuleContext { public Token s49; public List op = new ArrayList(); public Token s48; - public Token _tset2144; + public Token _tset2153; public ValueExprContext main_expr; public ValueExprContext valueExpr() { return getRuleContext(ValueExprContext.class,0); @@ -6827,31 +6854,31 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1039); + setState(1042); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__47 || _la==T__48) { { { - setState(1036); - ((UnaryExprContext)_localctx)._tset2144 = _input.LT(1); + setState(1039); + ((UnaryExprContext)_localctx)._tset2153 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__47 || _la==T__48) ) { - ((UnaryExprContext)_localctx)._tset2144 = (Token)_errHandler.recoverInline(this); + ((UnaryExprContext)_localctx)._tset2153 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144); + ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2153); } } - setState(1041); + setState(1044); _errHandler.sync(this); _la = _input.LA(1); } - setState(1042); + setState(1045); ((UnaryExprContext)_localctx).main_expr = valueExpr(); } } @@ -6894,27 +6921,27 @@ public final ValueExprContext valueExpr() throws RecognitionException { ValueExprContext _localctx = new ValueExprContext(_ctx, getState()); enterRule(_localctx, 170, RULE_valueExpr); try { - setState(1047); + setState(1050); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1044); + setState(1047); ((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1045); + setState(1048); ((ValueExprContext)_localctx).validate_expr = validateExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1046); + setState(1049); ((ValueExprContext)_localctx).annotate_expr = annotateExpr(); } break; @@ -6957,17 +6984,17 @@ public final ValidateExprContext validateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1049); + setState(1052); match(Kvalidate); - setState(1050); + setState(1053); match(Ktype); - setState(1051); + setState(1054); sequenceType(); - setState(1052); + setState(1055); match(T__6); - setState(1053); + setState(1056); expr(); - setState(1054); + setState(1057); match(T__7); } } @@ -7008,17 +7035,17 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1056); + setState(1059); match(Kannotate); - setState(1057); + setState(1060); match(Ktype); - setState(1058); + setState(1061); sequenceType(); - setState(1059); + setState(1062); match(T__6); - setState(1060); + setState(1063); expr(); - setState(1061); + setState(1064); match(T__7); } } @@ -7061,22 +7088,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1063); + setState(1066); ((SimpleMapExprContext)_localctx).main_expr = postFixExpr(); - setState(1068); + setState(1071); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__52) { { { - setState(1064); + setState(1067); match(T__52); - setState(1065); + setState(1068); ((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr(); ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr); } } - setState(1070); + setState(1073); _errHandler.sync(this); _la = _input.LA(1); } @@ -7146,53 +7173,53 @@ public final PostFixExprContext postFixExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1071); + setState(1074); ((PostFixExprContext)_localctx).main_expr = primaryExpr(); - setState(1079); + setState(1082); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,105,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(1077); + setState(1080); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) { case 1: { - setState(1072); + setState(1075); arrayLookup(); } break; case 2: { - setState(1073); + setState(1076); predicate(); } break; case 3: { - setState(1074); + setState(1077); objectLookup(); } break; case 4: { - setState(1075); + setState(1078); arrayUnboxing(); } break; case 5: { - setState(1076); + setState(1079); argumentList(); } break; } } } - setState(1081); + setState(1084); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,105,_ctx); } } } @@ -7228,15 +7255,15 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1082); + setState(1085); match(T__53); - setState(1083); + setState(1086); match(T__53); - setState(1084); + setState(1087); expr(); - setState(1085); + setState(1088); match(T__54); - setState(1086); + setState(1089); match(T__54); } } @@ -7269,9 +7296,9 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1088); + setState(1091); match(T__53); - setState(1089); + setState(1092); match(T__54); } } @@ -7307,11 +7334,11 @@ public final PredicateContext predicate() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1091); + setState(1094); match(T__53); - setState(1092); + setState(1095); expr(); - setState(1093); + setState(1096); match(T__54); } } @@ -7366,9 +7393,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1095); + setState(1098); match(T__55); - setState(1102); + setState(1105); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -7434,9 +7461,10 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -7445,37 +7473,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(1096); + setState(1099); ((ObjectLookupContext)_localctx).kw = keyWords(); } break; case STRING: { - setState(1097); + setState(1100); ((ObjectLookupContext)_localctx).lt = stringLiteral(); } break; case NCName: { - setState(1098); + setState(1101); ((ObjectLookupContext)_localctx).nc = match(NCName); } break; case T__8: { - setState(1099); + setState(1102); ((ObjectLookupContext)_localctx).pe = parenthesizedExpr(); } break; case T__4: { - setState(1100); + setState(1103); ((ObjectLookupContext)_localctx).vr = varRef(); } break; case T__56: { - setState(1101); + setState(1104); ((ObjectLookupContext)_localctx).ci = contextItemExpr(); } break; @@ -7548,111 +7576,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException { PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState()); enterRule(_localctx, 188, RULE_primaryExpr); try { - setState(1119); + setState(1122); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1104); + setState(1107); match(NullLiteral); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1105); + setState(1108); match(Ktrue); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1106); + setState(1109); match(Kfalse); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1107); + setState(1110); match(Literal); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1108); + setState(1111); stringLiteral(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1109); + setState(1112); varRef(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1110); + setState(1113); parenthesizedExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1111); + setState(1114); contextItemExpr(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1112); + setState(1115); objectConstructor(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1113); + setState(1116); functionCall(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1114); + setState(1117); orderedExpr(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1115); + setState(1118); unorderedExpr(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1116); + setState(1119); arrayConstructor(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1117); + setState(1120); functionItemExpr(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1118); + setState(1121); blockExpr(); } break; @@ -7690,11 +7718,11 @@ public final BlockExprContext blockExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1121); + setState(1124); match(T__6); - setState(1122); + setState(1125); statementsAndExpr(); - setState(1123); + setState(1126); match(T__7); } } @@ -7731,9 +7759,9 @@ public final VarRefContext varRef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1125); + setState(1128); match(T__4); - setState(1126); + setState(1129); ((VarRefContext)_localctx).var_name = qname(); } } @@ -7770,19 +7798,19 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1128); + setState(1131); match(T__8); - setState(1130); + setState(1133); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1129); + setState(1132); expr(); } } - setState(1132); + setState(1135); match(T__9); } } @@ -7815,7 +7843,7 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1134); + setState(1137); match(T__56); } } @@ -7851,13 +7879,13 @@ public final OrderedExprContext orderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1136); + setState(1139); match(T__15); - setState(1137); + setState(1140); match(T__6); - setState(1138); + setState(1141); expr(); - setState(1139); + setState(1142); match(T__7); } } @@ -7894,13 +7922,13 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1141); + setState(1144); match(Kunordered); - setState(1142); + setState(1145); match(T__6); - setState(1143); + setState(1146); expr(); - setState(1144); + setState(1147); match(T__7); } } @@ -7940,9 +7968,9 @@ public final FunctionCallContext functionCall() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1146); + setState(1149); ((FunctionCallContext)_localctx).fn_name = qname(); - setState(1147); + setState(1150); argumentList(); } } @@ -7984,34 +8012,34 @@ public final ArgumentListContext argumentList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1149); + setState(1152); match(T__8); - setState(1156); + setState(1159); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { { - setState(1150); + setState(1153); ((ArgumentListContext)_localctx).argument = argument(); ((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument); - setState(1152); + setState(1155); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__13) { { - setState(1151); + setState(1154); match(T__13); } } } } - setState(1158); + setState(1161); _errHandler.sync(this); _la = _input.LA(1); } - setState(1159); + setState(1162); match(T__9); } } @@ -8046,7 +8074,7 @@ public final ArgumentContext argument() throws RecognitionException { ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); enterRule(_localctx, 206, RULE_argument); try { - setState(1163); + setState(1166); _errHandler.sync(this); switch (_input.LA(1)) { case T__4: @@ -8123,9 +8151,10 @@ public final ArgumentContext argument() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -8138,14 +8167,14 @@ public final ArgumentContext argument() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(1161); + setState(1164); exprSingle(); } break; case ArgumentPlaceholder: enterOuterAlt(_localctx, 2); { - setState(1162); + setState(1165); match(ArgumentPlaceholder); } break; @@ -8186,99 +8215,23 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState()); enterRule(_localctx, 208, RULE_functionItemExpr); try { - setState(1167); + setState(1170); _errHandler.sync(this); - switch (_input.LA(1)) { - case Kfor: - case Klet: - case Kwhere: - case Kgroup: - case Kby: - case Korder: - case Kreturn: - case Kif: - case Kin: - case Kas: - case Kat: - case Kallowing: - case Kempty: - case Kcount: - case Kstable: - case Kascending: - case Kdescending: - case Ksome: - case Kevery: - case Ksatisfies: - case Kcollation: - case Kgreatest: - case Kleast: - case Kswitch: - case Kcase: - case Ktry: - case Kcatch: - case Kdefault: - case Kthen: - case Kelse: - case Ktypeswitch: - case Kor: - case Kand: - case Knot: - case Kto: - case Kinstance: - case Kof: - case Kstatically: - case Kis: - case Ktreat: - case Kcast: - case Kcastable: - case Kversion: - case Kjsoniq: - case Kunordered: - case Ktrue: - case Kfalse: - case Ktype: - case Kvalidate: - case Kannotate: - case Kdeclare: - case Kcontext: - case Kitem: - case Kvariable: - case Kinsert: - case Kdelete: - case Krename: - case Kreplace: - case Kcopy: - case Kmodify: - case Kappend: - case Kinto: - case Kvalue: - case Kjson: - case Kwith: - case Kposition: - case Kbreak: - case Kloop: - case Kcontinue: - case Kexit: - case Kreturning: - case Kwhile: - case NullLiteral: - case NCName: + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + case 1: enterOuterAlt(_localctx, 1); { - setState(1165); + setState(1168); namedFunctionRef(); } break; - case T__12: - case T__30: + case 2: enterOuterAlt(_localctx, 2); { - setState(1166); + setState(1169); inlineFunctionExpr(); } break; - default: - throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -8316,11 +8269,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1169); + setState(1172); ((NamedFunctionRefContext)_localctx).fn_name = qname(); - setState(1170); + setState(1173); match(T__57); - setState(1171); + setState(1174); ((NamedFunctionRefContext)_localctx).arity = match(Literal); } } @@ -8369,44 +8322,44 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1173); + setState(1176); annotations(); - setState(1174); + setState(1177); match(T__30); - setState(1175); + setState(1178); match(T__8); - setState(1177); + setState(1180); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(1176); + setState(1179); paramList(); } } - setState(1179); - match(T__9); setState(1182); + match(T__9); + setState(1185); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(1180); + setState(1183); match(Kas); - setState(1181); + setState(1184); ((InlineFunctionExprContext)_localctx).return_type = sequenceType(); } } { - setState(1184); + setState(1187); match(T__6); { - setState(1185); + setState(1188); ((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(1186); + setState(1189); match(T__7); } } @@ -8459,32 +8412,32 @@ public final InsertExprContext insertExpr() throws RecognitionException { enterRule(_localctx, 214, RULE_insertExpr); int _la; try { - setState(1211); + setState(1214); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1188); + setState(1191); match(Kinsert); - setState(1189); + setState(1192); match(Kjson); - setState(1190); + setState(1193); ((InsertExprContext)_localctx).to_insert_expr = exprSingle(); - setState(1191); + setState(1194); match(Kinto); - setState(1192); + setState(1195); ((InsertExprContext)_localctx).main_expr = exprSingle(); - setState(1196); + setState(1199); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { case 1: { - setState(1193); + setState(1196); match(Kat); - setState(1194); + setState(1197); match(Kposition); - setState(1195); + setState(1198); ((InsertExprContext)_localctx).pos_expr = exprSingle(); } break; @@ -8494,31 +8447,31 @@ public final InsertExprContext insertExpr() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(1198); + setState(1201); match(Kinsert); - setState(1199); + setState(1202); match(Kjson); - setState(1200); + setState(1203); pairConstructor(); - setState(1205); + setState(1208); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1201); + setState(1204); match(T__13); - setState(1202); + setState(1205); pairConstructor(); } } - setState(1207); + setState(1210); _errHandler.sync(this); _la = _input.LA(1); } - setState(1208); + setState(1211); match(Kinto); - setState(1209); + setState(1212); ((InsertExprContext)_localctx).main_expr = exprSingle(); } break; @@ -8558,11 +8511,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1213); + setState(1216); match(Kdelete); - setState(1214); + setState(1217); match(Kjson); - setState(1215); + setState(1218); updateLocator(); } } @@ -8605,15 +8558,15 @@ public final RenameExprContext renameExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1217); + setState(1220); match(Krename); - setState(1218); + setState(1221); match(Kjson); - setState(1219); + setState(1222); updateLocator(); - setState(1220); + setState(1223); match(Kas); - setState(1221); + setState(1224); ((RenameExprContext)_localctx).name_expr = exprSingle(); } } @@ -8658,19 +8611,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1223); + setState(1226); match(Kreplace); - setState(1224); + setState(1227); match(Kvalue); - setState(1225); + setState(1228); match(Kof); - setState(1226); + setState(1229); match(Kjson); - setState(1227); + setState(1230); updateLocator(); - setState(1228); + setState(1231); match(Kwith); - setState(1229); + setState(1232); ((ReplaceExprContext)_localctx).replacer_expr = exprSingle(); } } @@ -8721,33 +8674,33 @@ public final TransformExprContext transformExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1231); + setState(1234); match(Kcopy); - setState(1232); + setState(1235); copyDecl(); - setState(1237); + setState(1240); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1233); + setState(1236); match(T__13); - setState(1234); + setState(1237); copyDecl(); } } - setState(1239); + setState(1242); _errHandler.sync(this); _la = _input.LA(1); } - setState(1240); + setState(1243); match(Kmodify); - setState(1241); + setState(1244); ((TransformExprContext)_localctx).mod_expr = exprSingle(); - setState(1242); + setState(1245); match(Kreturn); - setState(1243); + setState(1246); ((TransformExprContext)_localctx).ret_expr = exprSingle(); } } @@ -8791,15 +8744,15 @@ public final AppendExprContext appendExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1245); + setState(1248); match(Kappend); - setState(1246); + setState(1249); match(Kjson); - setState(1247); + setState(1250); ((AppendExprContext)_localctx).to_append_expr = exprSingle(); - setState(1248); + setState(1251); match(Kinto); - setState(1249); + setState(1252); ((AppendExprContext)_localctx).array_expr = exprSingle(); } } @@ -8849,27 +8802,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1251); + setState(1254); ((UpdateLocatorContext)_localctx).main_expr = primaryExpr(); - setState(1254); + setState(1257); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - setState(1254); + setState(1257); _errHandler.sync(this); switch (_input.LA(1)) { case T__53: { - setState(1252); + setState(1255); arrayLookup(); } break; case T__55: { - setState(1253); + setState(1256); objectLookup(); } break; @@ -8881,9 +8834,9 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1256); + setState(1259); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,119,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -8924,11 +8877,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1258); + setState(1261); ((CopyDeclContext)_localctx).var_ref = varRef(); - setState(1259); + setState(1262); match(T__5); - setState(1260); + setState(1263); ((CopyDeclContext)_localctx).src_expr = exprSingle(); } } @@ -8945,7 +8898,7 @@ public final CopyDeclContext copyDecl() throws RecognitionException { public static class SequenceTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s134; + public Token s135; public List question = new ArrayList(); public Token s11; public List star = new ArrayList(); @@ -8970,15 +8923,15 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); enterRule(_localctx, 230, RULE_sequenceType); try { - setState(1270); + setState(1273); _errHandler.sync(this); switch (_input.LA(1)) { case T__8: enterOuterAlt(_localctx, 1); { - setState(1262); + setState(1265); match(T__8); - setState(1263); + setState(1266); match(T__9); } break; @@ -9046,9 +8999,10 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -9059,28 +9013,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 2); { - setState(1264); + setState(1267); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1268); + setState(1271); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1265); - ((SequenceTypeContext)_localctx).s134 = match(ArgumentPlaceholder); - ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s134); + setState(1268); + ((SequenceTypeContext)_localctx).s135 = match(ArgumentPlaceholder); + ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s135); } break; case 2: { - setState(1266); + setState(1269); ((SequenceTypeContext)_localctx).s11 = match(T__10); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s11); } break; case 3: { - setState(1267); + setState(1270); ((SequenceTypeContext)_localctx).s48 = match(T__47); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48); } @@ -9131,53 +9085,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce enterRule(_localctx, 232, RULE_objectConstructor); int _la; try { - setState(1288); + setState(1291); _errHandler.sync(this); switch (_input.LA(1)) { case T__6: enterOuterAlt(_localctx, 1); { - setState(1272); + setState(1275); match(T__6); - setState(1281); + setState(1284); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1273); + setState(1276); pairConstructor(); - setState(1278); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1274); + setState(1277); match(T__13); - setState(1275); + setState(1278); pairConstructor(); } } - setState(1280); + setState(1283); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1283); + setState(1286); match(T__7); } break; case T__58: enterOuterAlt(_localctx, 2); { - setState(1284); + setState(1287); ((ObjectConstructorContext)_localctx).s59 = match(T__58); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59); - setState(1285); + setState(1288); expr(); - setState(1286); + setState(1289); match(T__59); } break; @@ -9219,27 +9173,27 @@ public final ItemTypeContext itemType() throws RecognitionException { ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); enterRule(_localctx, 234, RULE_itemType); try { - setState(1293); + setState(1296); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1290); + setState(1293); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1291); + setState(1294); match(NullLiteral); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1292); + setState(1295); functionTest(); } break; @@ -9280,18 +9234,18 @@ public final FunctionTestContext functionTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1297); + setState(1300); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1295); + setState(1298); anyFunctionTest(); } break; case 2: { - setState(1296); + setState(1299); typedFunctionTest(); } break; @@ -9327,13 +9281,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1299); + setState(1302); match(T__30); - setState(1300); + setState(1303); match(T__8); - setState(1301); + setState(1304); match(T__10); - setState(1302); + setState(1305); match(T__9); } } @@ -9377,43 +9331,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1304); + setState(1307); match(T__30); - setState(1305); + setState(1308); match(T__8); - setState(1314); + setState(1317); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__30) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__30) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1306); + setState(1309); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1311); + setState(1314); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1307); + setState(1310); match(T__13); - setState(1308); + setState(1311); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1313); + setState(1316); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1316); + setState(1319); match(T__9); - setState(1317); + setState(1320); match(Kas); - setState(1318); + setState(1321); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -9430,7 +9384,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce public static class SingleTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s134; + public Token s135; public List question = new ArrayList(); public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); @@ -9453,16 +9407,16 @@ public final SingleTypeContext singleType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1320); + setState(1323); ((SingleTypeContext)_localctx).item = itemType(); - setState(1322); + setState(1325); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1321); - ((SingleTypeContext)_localctx).s134 = match(ArgumentPlaceholder); - ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s134); + setState(1324); + ((SingleTypeContext)_localctx).s135 = match(ArgumentPlaceholder); + ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s135); } break; } @@ -9509,23 +9463,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1326); + setState(1329); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1324); + setState(1327); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1325); + setState(1328); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1328); + setState(1331); _la = _input.LA(1); if ( !(_la==T__17 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -9535,7 +9489,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1329); + setState(1332); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -9572,19 +9526,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1334); match(T__53); - setState(1333); + setState(1336); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1332); + setState(1335); expr(); } } - setState(1335); + setState(1338); match(T__54); } } @@ -9620,7 +9574,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1337); + setState(1340); stringLiteral(); } } @@ -9654,7 +9608,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1339); + setState(1342); match(STRING); } } @@ -9730,7 +9684,6 @@ public static class KeyWordsContext extends ParserRuleContext { public TerminalNode Kappend() { return getToken(JsoniqParser.Kappend, 0); } public TerminalNode Kcopy() { return getToken(JsoniqParser.Kcopy, 0); } public TerminalNode Kmodify() { return getToken(JsoniqParser.Kmodify, 0); } - public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } public TerminalNode Kinto() { return getToken(JsoniqParser.Kinto, 0); } public TerminalNode Kvalue() { return getToken(JsoniqParser.Kvalue, 0); } public TerminalNode Kwith() { return getToken(JsoniqParser.Kwith, 0); } @@ -9743,6 +9696,8 @@ public static class KeyWordsContext extends ParserRuleContext { public TerminalNode Kexit() { return getToken(JsoniqParser.Kexit, 0); } public TerminalNode Kreturning() { return getToken(JsoniqParser.Kreturning, 0); } public TerminalNode Kwhile() { return getToken(JsoniqParser.Kwhile, 0); } + public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } + public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); } public KeyWordsContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -9761,9 +9716,9 @@ public final KeyWordsContext keyWords() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1341); + setState(1344); _la = _input.LA(1); - if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Kby - 61)) | (1L << (Korder - 61)) | (1L << (Kreturn - 61)) | (1L << (Kif - 61)) | (1L << (Kin - 61)) | (1L << (Kas - 61)) | (1L << (Kat - 61)) | (1L << (Kallowing - 61)) | (1L << (Kempty - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)) | (1L << (Kascending - 61)) | (1L << (Kdescending - 61)) | (1L << (Ksome - 61)) | (1L << (Kevery - 61)) | (1L << (Ksatisfies - 61)) | (1L << (Kcollation - 61)) | (1L << (Kgreatest - 61)) | (1L << (Kleast - 61)) | (1L << (Kswitch - 61)) | (1L << (Kcase - 61)) | (1L << (Ktry - 61)) | (1L << (Kcatch - 61)) | (1L << (Kdefault - 61)) | (1L << (Kthen - 61)) | (1L << (Kelse - 61)) | (1L << (Ktypeswitch - 61)) | (1L << (Kor - 61)) | (1L << (Kand - 61)) | (1L << (Knot - 61)) | (1L << (Kto - 61)) | (1L << (Kinstance - 61)) | (1L << (Kof - 61)) | (1L << (Kstatically - 61)) | (1L << (Kis - 61)) | (1L << (Ktreat - 61)) | (1L << (Kcast - 61)) | (1L << (Kcastable - 61)) | (1L << (Kversion - 61)) | (1L << (Kjsoniq - 61)) | (1L << (Kunordered - 61)) | (1L << (Ktrue - 61)) | (1L << (Kfalse - 61)) | (1L << (Ktype - 61)) | (1L << (Kvalidate - 61)) | (1L << (Kannotate - 61)) | (1L << (Kdeclare - 61)) | (1L << (Kcontext - 61)) | (1L << (Kitem - 61)) | (1L << (Kvariable - 61)) | (1L << (Kinsert - 61)) | (1L << (Kdelete - 61)) | (1L << (Krename - 61)) | (1L << (Kreplace - 61)) | (1L << (Kcopy - 61)) | (1L << (Kmodify - 61)) | (1L << (Kappend - 61)) | (1L << (Kinto - 61)) | (1L << (Kvalue - 61)) | (1L << (Kjson - 61)))) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (Kwith - 125)) | (1L << (Kposition - 125)) | (1L << (Kbreak - 125)) | (1L << (Kloop - 125)) | (1L << (Kcontinue - 125)) | (1L << (Kexit - 125)) | (1L << (Kreturning - 125)) | (1L << (Kwhile - 125)) | (1L << (NullLiteral - 125)))) != 0)) ) { + if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Kby - 61)) | (1L << (Korder - 61)) | (1L << (Kreturn - 61)) | (1L << (Kif - 61)) | (1L << (Kin - 61)) | (1L << (Kas - 61)) | (1L << (Kat - 61)) | (1L << (Kallowing - 61)) | (1L << (Kempty - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)) | (1L << (Kascending - 61)) | (1L << (Kdescending - 61)) | (1L << (Ksome - 61)) | (1L << (Kevery - 61)) | (1L << (Ksatisfies - 61)) | (1L << (Kcollation - 61)) | (1L << (Kgreatest - 61)) | (1L << (Kleast - 61)) | (1L << (Kswitch - 61)) | (1L << (Kcase - 61)) | (1L << (Ktry - 61)) | (1L << (Kcatch - 61)) | (1L << (Kdefault - 61)) | (1L << (Kthen - 61)) | (1L << (Kelse - 61)) | (1L << (Ktypeswitch - 61)) | (1L << (Kor - 61)) | (1L << (Kand - 61)) | (1L << (Knot - 61)) | (1L << (Kto - 61)) | (1L << (Kinstance - 61)) | (1L << (Kof - 61)) | (1L << (Kstatically - 61)) | (1L << (Kis - 61)) | (1L << (Ktreat - 61)) | (1L << (Kcast - 61)) | (1L << (Kcastable - 61)) | (1L << (Kversion - 61)) | (1L << (Kjsoniq - 61)) | (1L << (Kunordered - 61)) | (1L << (Ktrue - 61)) | (1L << (Kfalse - 61)) | (1L << (Ktype - 61)) | (1L << (Kvalidate - 61)) | (1L << (Kannotate - 61)) | (1L << (Kdeclare - 61)) | (1L << (Kcontext - 61)) | (1L << (Kitem - 61)) | (1L << (Kvariable - 61)) | (1L << (Kinsert - 61)) | (1L << (Kdelete - 61)) | (1L << (Krename - 61)) | (1L << (Kreplace - 61)) | (1L << (Kcopy - 61)) | (1L << (Kmodify - 61)) | (1L << (Kappend - 61)) | (1L << (Kinto - 61)) | (1L << (Kvalue - 61)) | (1L << (Kwith - 61)))) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (Kposition - 125)) | (1L << (Kjson - 125)) | (1L << (Kupdating - 125)) | (1L << (Kbreak - 125)) | (1L << (Kloop - 125)) | (1L << (Kcontinue - 125)) | (1L << (Kexit - 125)) | (1L << (Kreturning - 125)) | (1L << (Kwhile - 125)) | (1L << (NullLiteral - 125)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9785,7 +9740,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0092\u0542\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0093\u0545\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -9816,477 +9771,479 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\3\30\6\30\u01b4\n\30\r\30\16\30\u01b5\3\30\3\30\5\30\u01ba\n\30\3\30"+ "\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u01c3\n\31\3\31\3\31\3\31\7\31\u01c8"+ "\n\31\f\31\16\31\u01cb\13\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3"+ - "\32\7\32\u01d6\n\32\f\32\16\32\u01d9\13\32\3\32\5\32\u01dc\n\32\3\33\7"+ - "\33\u01df\n\33\f\33\16\33\u01e2\13\33\3\34\3\34\3\34\3\34\3\34\7\34\u01e9"+ - "\n\34\f\34\16\34\u01ec\13\34\3\34\3\34\3\35\3\35\3\35\5\35\u01f3\n\35"+ - "\3\35\3\35\5\35\u01f7\n\35\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+ - "\3\37\5\37\u0203\n\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\5!\u020f\n!\3\"\3"+ - "\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\5%\u0225\n"+ - "%\3%\3%\3%\3%\7%\u022b\n%\f%\16%\u022e\13%\3&\3&\5&\u0232\n&\3&\5&\u0235"+ - "\n&\3&\3&\5&\u0239\n&\3\'\3\'\3(\3(\3(\3(\3(\5(\u0242\n(\3(\3(\3(\3(\3"+ - "(\7(\u0249\n(\f(\16(\u024c\13(\5(\u024e\n(\3)\3)\3)\3)\3)\3)\5)\u0256"+ - "\n)\3)\3)\3)\3)\3)\5)\u025d\n)\5)\u025f\n)\3*\3*\3*\3*\3*\5*\u0266\n*"+ - "\3*\3*\3*\3*\3*\5*\u026d\n*\5*\u026f\n*\3+\3+\3+\3+\3+\3+\5+\u0277\n+"+ - "\3+\3+\3+\5+\u027c\n+\3+\3+\3+\3+\3+\5+\u0283\n+\3,\3,\3,\3,\3,\5,\u028a"+ - "\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u0294\n-\3.\3.\3.\7.\u0299\n.\f.\16.\u029c"+ - "\13.\3/\3/\3/\3/\5/\u02a2\n/\3\60\3\60\3\60\7\60\u02a7\n\60\f\60\16\60"+ - "\u02aa\13\60\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02b2\n\61\3\62\3\62\3"+ - "\62\3\62\3\62\3\62\3\62\3\62\5\62\u02bc\n\62\3\63\3\63\5\63\u02c0\n\63"+ - "\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u02c8\n\63\f\63\16\63\u02cb\13\63"+ - "\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u02d4\n\64\f\64\16\64\u02d7\13"+ - "\64\3\65\3\65\3\65\5\65\u02dc\n\65\3\65\3\65\5\65\u02e0\n\65\3\65\3\65"+ - "\5\65\u02e4\n\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\7\66\u02ed\n\66\f"+ - "\66\16\66\u02f0\13\66\3\67\3\67\3\67\5\67\u02f5\n\67\3\67\3\67\3\67\3"+ - "8\38\38\39\39\39\39\39\79\u0302\n9\f9\169\u0305\139\3:\3:\3:\5:\u030a"+ - "\n:\3:\3:\5:\u030e\n:\3:\3:\5:\u0312\n:\3;\3;\3;\3;\3;\5;\u0319\n;\3;"+ - "\3;\3;\7;\u031e\n;\f;\16;\u0321\13;\3<\3<\3<\5<\u0326\n<\3<\3<\3<\5<\u032b"+ - "\n<\5<\u032d\n<\3<\3<\5<\u0331\n<\3=\3=\3=\3>\3>\5>\u0338\n>\3>\3>\3>"+ - "\7>\u033d\n>\f>\16>\u0340\13>\3>\3>\3>\3?\3?\3?\5?\u0348\n?\3?\3?\3?\3"+ - "@\3@\3@\3@\3@\6@\u0352\n@\r@\16@\u0353\3@\3@\3@\3@\3A\3A\6A\u035c\nA\r"+ - "A\16A\u035d\3A\3A\3A\3B\3B\3B\3B\3B\6B\u0368\nB\rB\16B\u0369\3B\3B\5B"+ - "\u036e\nB\3B\3B\3B\3C\3C\3C\3C\5C\u0377\nC\3C\3C\3C\7C\u037c\nC\fC\16"+ - "C\u037f\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u0392"+ - "\nE\rE\16E\u0393\3F\3F\3F\5F\u0399\nF\3F\3F\3F\5F\u039e\nF\7F\u03a0\n"+ - "F\fF\16F\u03a3\13F\3F\3F\3F\3F\3G\3G\3G\7G\u03ac\nG\fG\16G\u03af\13G\3"+ - "H\3H\3H\7H\u03b4\nH\fH\16H\u03b7\13H\3I\5I\u03ba\nI\3I\3I\3J\3J\3J\5J"+ - "\u03c1\nJ\3K\3K\3K\7K\u03c6\nK\fK\16K\u03c9\13K\3L\3L\3L\5L\u03ce\nL\3"+ - "M\3M\3M\7M\u03d3\nM\fM\16M\u03d6\13M\3N\3N\3N\7N\u03db\nN\fN\16N\u03de"+ - "\13N\3O\3O\3O\3O\5O\u03e4\nO\3P\3P\3P\3P\5P\u03ea\nP\3Q\3Q\3Q\3Q\5Q\u03f0"+ - "\nQ\3R\3R\3R\3R\5R\u03f6\nR\3S\3S\3S\3S\5S\u03fc\nS\3T\3T\3T\3T\3T\3T"+ - "\3T\7T\u0405\nT\fT\16T\u0408\13T\3U\3U\3U\5U\u040d\nU\3V\7V\u0410\nV\f"+ - "V\16V\u0413\13V\3V\3V\3W\3W\3W\5W\u041a\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y"+ - "\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u042d\nZ\fZ\16Z\u0430\13Z\3[\3[\3[\3[\3[\3"+ - "[\7[\u0438\n[\f[\16[\u043b\13[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^"+ - "\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0451\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`"+ - "\3`\3`\3`\3`\3`\5`\u0462\n`\3a\3a\3a\3a\3b\3b\3b\3c\3c\5c\u046d\nc\3c"+ - "\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3h\3h\3h\5h\u0483\nh"+ - "\7h\u0485\nh\fh\16h\u0488\13h\3h\3h\3i\3i\5i\u048e\ni\3j\3j\5j\u0492\n"+ - "j\3k\3k\3k\3k\3l\3l\3l\3l\5l\u049c\nl\3l\3l\3l\5l\u04a1\nl\3l\3l\3l\3"+ - "l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04af\nm\3m\3m\3m\3m\3m\7m\u04b6\nm\fm\16"+ - "m\u04b9\13m\3m\3m\3m\5m\u04be\nm\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3"+ - "p\3p\3p\3p\3p\3p\3q\3q\3q\3q\7q\u04d6\nq\fq\16q\u04d9\13q\3q\3q\3q\3q"+ - "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u04e9\ns\rs\16s\u04ea\3t\3t\3t\3t\3"+ - "u\3u\3u\3u\3u\3u\5u\u04f7\nu\5u\u04f9\nu\3v\3v\3v\3v\7v\u04ff\nv\fv\16"+ - "v\u0502\13v\5v\u0504\nv\3v\3v\3v\3v\3v\5v\u050b\nv\3w\3w\3w\5w\u0510\n"+ - "w\3x\3x\5x\u0514\nx\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\7z\u0520\nz\fz\16z\u0523"+ - "\13z\5z\u0525\nz\3z\3z\3z\3z\3{\3{\5{\u052d\n{\3|\3|\5|\u0531\n|\3|\3"+ - "|\3|\3}\3}\5}\u0538\n}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080"+ - "\2\2\u0081\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+ - "8:<>@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\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+ - "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\2\n\4\2\22"+ - "\22kk\3\2TU\3\2\25\36\4\2\6\6&\60\3\2\62\63\4\2\r\r\64\66\4\2\24\24\u0088"+ - "\u0088\4\2?\u0086\u0089\u0089\2\u0583\2\u0100\3\2\2\2\4\u0108\3\2\2\2"+ - "\6\u010e\3\2\2\2\b\u0111\3\2\2\2\n\u0122\3\2\2\2\f\u012d\3\2\2\2\16\u0132"+ - "\3\2\2\2\20\u0135\3\2\2\2\22\u0138\3\2\2\2\24\u0149\3\2\2\2\26\u014b\3"+ - "\2\2\2\30\u014e\3\2\2\2\32\u0154\3\2\2\2\34\u0158\3\2\2\2\36\u015c\3\2"+ - "\2\2 \u0160\3\2\2\2\"\u0167\3\2\2\2$\u0177\3\2\2\2&\u0180\3\2\2\2(\u018f"+ - "\3\2\2\2*\u0196\3\2\2\2,\u019d\3\2\2\2.\u01ae\3\2\2\2\60\u01be\3\2\2\2"+ - "\62\u01cf\3\2\2\2\64\u01e0\3\2\2\2\66\u01e3\3\2\2\28\u01ef\3\2\2\2:\u01f8"+ - "\3\2\2\2<\u0202\3\2\2\2>\u0204\3\2\2\2@\u020e\3\2\2\2B\u0210\3\2\2\2D"+ - "\u0215\3\2\2\2F\u0219\3\2\2\2H\u021f\3\2\2\2J\u0234\3\2\2\2L\u023a\3\2"+ - "\2\2N\u023c\3\2\2\2P\u024f\3\2\2\2R\u0260\3\2\2\2T\u0270\3\2\2\2V\u0284"+ - "\3\2\2\2X\u0293\3\2\2\2Z\u0295\3\2\2\2\\\u029d\3\2\2\2^\u02a3\3\2\2\2"+ - "`\u02b1\3\2\2\2b\u02bb\3\2\2\2d\u02bf\3\2\2\2f\u02cf\3\2\2\2h\u02d8\3"+ - "\2\2\2j\u02e8\3\2\2\2l\u02f1\3\2\2\2n\u02f9\3\2\2\2p\u02fc\3\2\2\2r\u0306"+ - "\3\2\2\2t\u0318\3\2\2\2v\u0322\3\2\2\2x\u0332\3\2\2\2z\u0337\3\2\2\2|"+ - "\u0344\3\2\2\2~\u034c\3\2\2\2\u0080\u035b\3\2\2\2\u0082\u0362\3\2\2\2"+ - "\u0084\u0372\3\2\2\2\u0086\u0383\3\2\2\2\u0088\u038c\3\2\2\2\u008a\u0395"+ - "\3\2\2\2\u008c\u03a8\3\2\2\2\u008e\u03b0\3\2\2\2\u0090\u03b9\3\2\2\2\u0092"+ - "\u03bd\3\2\2\2\u0094\u03c2\3\2\2\2\u0096\u03ca\3\2\2\2\u0098\u03cf\3\2"+ - "\2\2\u009a\u03d7\3\2\2\2\u009c\u03df\3\2\2\2\u009e\u03e5\3\2\2\2\u00a0"+ - "\u03eb\3\2\2\2\u00a2\u03f1\3\2\2\2\u00a4\u03f7\3\2\2\2\u00a6\u03fd\3\2"+ - "\2\2\u00a8\u040c\3\2\2\2\u00aa\u0411\3\2\2\2\u00ac\u0419\3\2\2\2\u00ae"+ - "\u041b\3\2\2\2\u00b0\u0422\3\2\2\2\u00b2\u0429\3\2\2\2\u00b4\u0431\3\2"+ - "\2\2\u00b6\u043c\3\2\2\2\u00b8\u0442\3\2\2\2\u00ba\u0445\3\2\2\2\u00bc"+ - "\u0449\3\2\2\2\u00be\u0461\3\2\2\2\u00c0\u0463\3\2\2\2\u00c2\u0467\3\2"+ - "\2\2\u00c4\u046a\3\2\2\2\u00c6\u0470\3\2\2\2\u00c8\u0472\3\2\2\2\u00ca"+ - "\u0477\3\2\2\2\u00cc\u047c\3\2\2\2\u00ce\u047f\3\2\2\2\u00d0\u048d\3\2"+ - "\2\2\u00d2\u0491\3\2\2\2\u00d4\u0493\3\2\2\2\u00d6\u0497\3\2\2\2\u00d8"+ - "\u04bd\3\2\2\2\u00da\u04bf\3\2\2\2\u00dc\u04c3\3\2\2\2\u00de\u04c9\3\2"+ - "\2\2\u00e0\u04d1\3\2\2\2\u00e2\u04df\3\2\2\2\u00e4\u04e5\3\2\2\2\u00e6"+ - "\u04ec\3\2\2\2\u00e8\u04f8\3\2\2\2\u00ea\u050a\3\2\2\2\u00ec\u050f\3\2"+ - "\2\2\u00ee\u0513\3\2\2\2\u00f0\u0515\3\2\2\2\u00f2\u051a\3\2\2\2\u00f4"+ - "\u052a\3\2\2\2\u00f6\u0530\3\2\2\2\u00f8\u0535\3\2\2\2\u00fa\u053b\3\2"+ - "\2\2\u00fc\u053d\3\2\2\2\u00fe\u053f\3\2\2\2\u0100\u0101\5\4\3\2\u0101"+ - "\u0102\7\2\2\3\u0102\3\3\2\2\2\u0103\u0104\7j\2\2\u0104\u0105\7i\2\2\u0105"+ - "\u0106\5\u00fc\177\2\u0106\u0107\7\3\2\2\u0107\u0109\3\2\2\2\u0108\u0103"+ - "\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2\u010a\u010d\5\b\5\2\u010b"+ - "\u010d\5\6\4\2\u010c\u010a\3\2\2\2\u010c\u010b\3\2\2\2\u010d\5\3\2\2\2"+ - "\u010e\u010f\5\n\6\2\u010f\u0110\5\f\7\2\u0110\7\3\2\2\2\u0111\u0112\7"+ - "\4\2\2\u0112\u0113\7\5\2\2\u0113\u0114\7\u0090\2\2\u0114\u0115\7\6\2\2"+ - "\u0115\u0116\5\u00fa~\2\u0116\u0117\7\3\2\2\u0117\u0118\5\n\6\2\u0118"+ - "\t\3\2\2\2\u0119\u011d\5<\37\2\u011a\u011d\5> \2\u011b\u011d\5N(\2\u011c"+ - "\u0119\3\2\2\2\u011c\u011a\3\2\2\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2"+ - "\2\2\u011e\u011f\7\3\2\2\u011f\u0121\3\2\2\2\u0120\u011c\3\2\2\2\u0121"+ - "\u0124\3\2\2\2\u0122\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123\u012a\3\2"+ - "\2\2\u0124\u0122\3\2\2\2\u0125\u0126\5@!\2\u0126\u0127\7\3\2\2\u0127\u0129"+ - "\3\2\2\2\u0128\u0125\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012a"+ - "\u012b\3\2\2\2\u012b\13\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u012e\5\22\n"+ - "\2\u012e\r\3\2\2\2\u012f\u0131\5\24\13\2\u0130\u012f\3\2\2\2\u0131\u0134"+ - "\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\17\3\2\2\2\u0134"+ - "\u0132\3\2\2\2\u0135\u0136\5\16\b\2\u0136\u0137\5^\60\2\u0137\21\3\2\2"+ - "\2\u0138\u013a\5\16\b\2\u0139\u013b\5^\60\2\u013a\u0139\3\2\2\2\u013a"+ - "\u013b\3\2\2\2\u013b\23\3\2\2\2\u013c\u014a\5\26\f\2\u013d\u014a\5\30"+ - "\r\2\u013e\u014a\5\32\16\2\u013f\u014a\5\34\17\2\u0140\u014a\5\36\20\2"+ - "\u0141\u014a\5 \21\2\u0142\u014a\5\"\22\2\u0143\u014a\5$\23\2\u0144\u014a"+ - "\5&\24\2\u0145\u014a\5*\26\2\u0146\u014a\5.\30\2\u0147\u014a\5\66\34\2"+ - "\u0148\u014a\5:\36\2\u0149\u013c\3\2\2\2\u0149\u013d\3\2\2\2\u0149\u013e"+ - "\3\2\2\2\u0149\u013f\3\2\2\2\u0149\u0140\3\2\2\2\u0149\u0141\3\2\2\2\u0149"+ - "\u0142\3\2\2\2\u0149\u0143\3\2\2\2\u0149\u0144\3\2\2\2\u0149\u0145\3\2"+ - "\2\2\u0149\u0146\3\2\2\2\u0149\u0147\3\2\2\2\u0149\u0148\3\2\2\2\u014a"+ - "\25\3\2\2\2\u014b\u014c\5b\62\2\u014c\u014d\7\3\2\2\u014d\27\3\2\2\2\u014e"+ - "\u014f\7\7\2\2\u014f\u0150\5J&\2\u0150\u0151\7\b\2\2\u0151\u0152\5`\61"+ - "\2\u0152\u0153\7\3\2\2\u0153\31\3\2\2\2\u0154\u0155\7\t\2\2\u0155\u0156"+ - "\5\16\b\2\u0156\u0157\7\n\2\2\u0157\33\3\2\2\2\u0158\u0159\7\u0081\2\2"+ - "\u0159\u015a\7\u0082\2\2\u015a\u015b\7\3\2\2\u015b\35\3\2\2\2\u015c\u015d"+ - "\7\u0083\2\2\u015d\u015e\7\u0082\2\2\u015e\u015f\7\3\2\2\u015f\37\3\2"+ - "\2\2\u0160\u0161\7\u0084\2\2\u0161\u0162\7\u0085\2\2\u0162\u0163\5`\61"+ - "\2\u0163\u0164\7\3\2\2\u0164!\3\2\2\2\u0165\u0168\5f\64\2\u0166\u0168"+ - "\5j\66\2\u0167\u0165\3\2\2\2\u0167\u0166\3\2\2\2\u0168\u0171\3\2\2\2\u0169"+ - "\u0170\5f\64\2\u016a\u0170\5j\66\2\u016b\u0170\5n8\2\u016c\u0170\5p9\2"+ - "\u016d\u0170\5t;\2\u016e\u0170\5x=\2\u016f\u0169\3\2\2\2\u016f\u016a\3"+ - "\2\2\2\u016f\u016b\3\2\2\2\u016f\u016c\3\2\2\2\u016f\u016d\3\2\2\2\u016f"+ - "\u016e\3\2\2\2\u0170\u0173\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2"+ - "\2\2\u0172\u0174\3\2\2\2\u0173\u0171\3\2\2\2\u0174\u0175\7E\2\2\u0175"+ - "\u0176\5\24\13\2\u0176#\3\2\2\2\u0177\u0178\7F\2\2\u0178\u0179\7\13\2"+ - "\2\u0179\u017a\5^\60\2\u017a\u017b\7\f\2\2\u017b\u017c\7[\2\2\u017c\u017d"+ - "\5\24\13\2\u017d\u017e\7\\\2\2\u017e\u017f\5\24\13\2\u017f%\3\2\2\2\u0180"+ - "\u0181\7V\2\2\u0181\u0182\7\13\2\2\u0182\u0183\5^\60\2\u0183\u0185\7\f"+ - "\2\2\u0184\u0186\5(\25\2\u0185\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187"+ - "\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u0189\3\2\2\2\u0189\u018a\7Z"+ - "\2\2\u018a\u018b\7E\2\2\u018b\u018c\5\24\13\2\u018c\'\3\2\2\2\u018d\u018e"+ - "\7W\2\2\u018e\u0190\5`\61\2\u018f\u018d\3\2\2\2\u0190\u0191\3\2\2\2\u0191"+ - "\u018f\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0194\7E"+ - "\2\2\u0194\u0195\5\24\13\2\u0195)\3\2\2\2\u0196\u0197\7X\2\2\u0197\u0199"+ - "\5\32\16\2\u0198\u019a\5,\27\2\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2"+ - "\u019b\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c+\3\2\2\2\u019d\u01a0\7"+ - "Y\2\2\u019e\u01a1\7\r\2\2\u019f\u01a1\5J&\2\u01a0\u019e\3\2\2\2\u01a0"+ - "\u019f\3\2\2\2\u01a1\u01a9\3\2\2\2\u01a2\u01a5\7\16\2\2\u01a3\u01a6\7"+ - "\r\2\2\u01a4\u01a6\5J&\2\u01a5\u01a3\3\2\2\2\u01a5\u01a4\3\2\2\2\u01a6"+ - "\u01a8\3\2\2\2\u01a7\u01a2\3\2\2\2\u01a8\u01ab\3\2\2\2\u01a9\u01a7\3\2"+ - "\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ac\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ac"+ - "\u01ad\5\32\16\2\u01ad-\3\2\2\2\u01ae\u01af\7]\2\2\u01af\u01b0\7\13\2"+ - "\2\u01b0\u01b1\5^\60\2\u01b1\u01b3\7\f\2\2\u01b2\u01b4\5\60\31\2\u01b3"+ - "\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2"+ - "\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b9\7Z\2\2\u01b8\u01ba\5\u00c2b\2\u01b9"+ - "\u01b8\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bc\7E"+ - "\2\2\u01bc\u01bd\5\24\13\2\u01bd/\3\2\2\2\u01be\u01c2\7W\2\2\u01bf\u01c0"+ - "\5\u00c2b\2\u01c0\u01c1\7H\2\2\u01c1\u01c3\3\2\2\2\u01c2\u01bf\3\2\2\2"+ - "\u01c2\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c9\5\u00e8u\2\u01c5"+ - "\u01c6\7\16\2\2\u01c6\u01c8\5\u00e8u\2\u01c7\u01c5\3\2\2\2\u01c8\u01cb"+ - "\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cc\3\2\2\2\u01cb"+ - "\u01c9\3\2\2\2\u01cc\u01cd\7E\2\2\u01cd\u01ce\5\24\13\2\u01ce\61\3\2\2"+ - "\2\u01cf\u01d0\7\17\2\2\u01d0\u01db\5J&\2\u01d1\u01d2\7\13\2\2\u01d2\u01d7"+ - "\7\u008a\2\2\u01d3\u01d4\7\20\2\2\u01d4\u01d6\7\u008a\2\2\u01d5\u01d3"+ - "\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d8\3\2\2\2\u01d8"+ - "\u01da\3\2\2\2\u01d9\u01d7\3\2\2\2\u01da\u01dc\7\f\2\2\u01db\u01d1\3\2"+ - "\2\2\u01db\u01dc\3\2\2\2\u01dc\63\3\2\2\2\u01dd\u01df\5\62\32\2\u01de"+ - "\u01dd\3\2\2\2\u01df\u01e2\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2"+ - "\2\2\u01e1\65\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e4\5\64\33\2\u01e4"+ - "\u01e5\7t\2\2\u01e5\u01ea\58\35\2\u01e6\u01e7\7\20\2\2\u01e7\u01e9\58"+ - "\35\2\u01e8\u01e6\3\2\2\2\u01e9\u01ec\3\2\2\2\u01ea\u01e8\3\2\2\2\u01ea"+ - "\u01eb\3\2\2\2\u01eb\u01ed\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed\u01ee\7\3"+ - "\2\2\u01ee\67\3\2\2\2\u01ef\u01f2\5\u00c2b\2\u01f0\u01f1\7H\2\2\u01f1"+ - "\u01f3\5\u00e8u\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f6"+ - "\3\2\2\2\u01f4\u01f5\7\b\2\2\u01f5\u01f7\5`\61\2\u01f6\u01f4\3\2\2\2\u01f6"+ - "\u01f7\3\2\2\2\u01f79\3\2\2\2\u01f8\u01f9\7\u0086\2\2\u01f9\u01fa\7\13"+ - "\2\2\u01fa\u01fb\5^\60\2\u01fb\u01fc\7\f\2\2\u01fc\u01fd\5\24\13\2\u01fd"+ - ";\3\2\2\2\u01fe\u0203\5B\"\2\u01ff\u0203\5D#\2\u0200\u0203\5F$\2\u0201"+ - "\u0203\5H%\2\u0202\u01fe\3\2\2\2\u0202\u01ff\3\2\2\2\u0202\u0200\3\2\2"+ - "\2\u0202\u0201\3\2\2\2\u0203=\3\2\2\2\u0204\u0205\7q\2\2\u0205\u0206\7"+ - "\5\2\2\u0206\u0207\7\u0090\2\2\u0207\u0208\7\6\2\2\u0208\u0209\5\u00fa"+ - "~\2\u0209?\3\2\2\2\u020a\u020f\5T+\2\u020b\u020f\5P)\2\u020c\u020f\5V"+ - ",\2\u020d\u020f\5R*\2\u020e\u020a\3\2\2\2\u020e\u020b\3\2\2\2\u020e\u020c"+ - "\3\2\2\2\u020e\u020d\3\2\2\2\u020fA\3\2\2\2\u0210\u0211\7q\2\2\u0211\u0212"+ - "\7Z\2\2\u0212\u0213\7S\2\2\u0213\u0214\5\u00fa~\2\u0214C\3\2\2\2\u0215"+ - "\u0216\7q\2\2\u0216\u0217\7\21\2\2\u0217\u0218\t\2\2\2\u0218E\3\2\2\2"+ - "\u0219\u021a\7q\2\2\u021a\u021b\7Z\2\2\u021b\u021c\7D\2\2\u021c\u021d"+ - "\7K\2\2\u021d\u021e\t\3\2\2\u021eG\3\2\2\2\u021f\u0224\7q\2\2\u0220\u0221"+ - "\7\23\2\2\u0221\u0225\5J&\2\u0222\u0223\7Z\2\2\u0223\u0225\7\23\2\2\u0224"+ - "\u0220\3\2\2\2\u0224\u0222\3\2\2\2\u0225\u022c\3\2\2\2\u0226\u0227\5L"+ - "\'\2\u0227\u0228\7\6\2\2\u0228\u0229\5\u00fc\177\2\u0229\u022b\3\2\2\2"+ - "\u022a\u0226\3\2\2\2\u022b\u022e\3\2\2\2\u022c\u022a\3\2\2\2\u022c\u022d"+ - "\3\2\2\2\u022dI\3\2\2\2\u022e\u022c\3\2\2\2\u022f\u0232\7\u0090\2\2\u0230"+ - "\u0232\5\u00fe\u0080\2\u0231\u022f\3\2\2\2\u0231\u0230\3\2\2\2\u0232\u0233"+ - "\3\2\2\2\u0233\u0235\7\24\2\2\u0234\u0231\3\2\2\2\u0234\u0235\3\2\2\2"+ - "\u0235\u0238\3\2\2\2\u0236\u0239\7\u0090\2\2\u0237\u0239\5\u00fe\u0080"+ - "\2\u0238\u0236\3\2\2\2\u0238\u0237\3\2\2\2\u0239K\3\2\2\2\u023a\u023b"+ - "\t\4\2\2\u023bM\3\2\2\2\u023c\u023d\7\37\2\2\u023d\u0241\7\4\2\2\u023e"+ - "\u023f\7\5\2\2\u023f\u0240\7\u0090\2\2\u0240\u0242\7\6\2\2\u0241\u023e"+ - "\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u024d\5\u00fa~"+ - "\2\u0244\u0245\7I\2\2\u0245\u024a\5\u00fa~\2\u0246\u0247\7\20\2\2\u0247"+ - "\u0249\5\u00fa~\2\u0248\u0246\3\2\2\2\u0249\u024c\3\2\2\2\u024a\u0248"+ - "\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024e\3\2\2\2\u024c\u024a\3\2\2\2\u024d"+ - "\u0244\3\2\2\2\u024d\u024e\3\2\2\2\u024eO\3\2\2\2\u024f\u0250\7q\2\2\u0250"+ - "\u0251\5\64\33\2\u0251\u0252\7t\2\2\u0252\u0255\5\u00c2b\2\u0253\u0254"+ - "\7H\2\2\u0254\u0256\5\u00e8u\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2\2\2"+ - "\u0256\u025e\3\2\2\2\u0257\u0258\7\b\2\2\u0258\u025f\5`\61\2\u0259\u025c"+ - "\7 \2\2\u025a\u025b\7\b\2\2\u025b\u025d\5`\61\2\u025c\u025a\3\2\2\2\u025c"+ - "\u025d\3\2\2\2\u025d\u025f\3\2\2\2\u025e\u0257\3\2\2\2\u025e\u0259\3\2"+ - "\2\2\u025fQ\3\2\2\2\u0260\u0261\7q\2\2\u0261\u0262\7r\2\2\u0262\u0265"+ - "\7s\2\2\u0263\u0264\7H\2\2\u0264\u0266\5\u00e8u\2\u0265\u0263\3\2\2\2"+ - "\u0265\u0266\3\2\2\2\u0266\u026e\3\2\2\2\u0267\u0268\7\b\2\2\u0268\u026f"+ - "\5`\61\2\u0269\u026c\7 \2\2\u026a\u026b\7\b\2\2\u026b\u026d\5`\61\2\u026c"+ - "\u026a\3\2\2\2\u026c\u026d\3\2\2\2\u026d\u026f\3\2\2\2\u026e\u0267\3\2"+ - "\2\2\u026e\u0269\3\2\2\2\u026fS\3\2\2\2\u0270\u0271\7q\2\2\u0271\u0272"+ - "\5\64\33\2\u0272\u0273\7!\2\2\u0273\u0274\5J&\2\u0274\u0276\7\13\2\2\u0275"+ - "\u0277\5Z.\2\u0276\u0275\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0278\3\2\2"+ - "\2\u0278\u027b\7\f\2\2\u0279\u027a\7H\2\2\u027a\u027c\5\u00e8u\2\u027b"+ - "\u0279\3\2\2\2\u027b\u027c\3\2\2\2\u027c\u0282\3\2\2\2\u027d\u027e\7\t"+ - "\2\2\u027e\u027f\5\22\n\2\u027f\u0280\7\n\2\2\u0280\u0283\3\2\2\2\u0281"+ - "\u0283\7 \2\2\u0282\u027d\3\2\2\2\u0282\u0281\3\2\2\2\u0283U\3\2\2\2\u0284"+ - "\u0285\7q\2\2\u0285\u0286\7n\2\2\u0286\u0287\5J&\2\u0287\u0289\7H\2\2"+ - "\u0288\u028a\5X-\2\u0289\u0288\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u028b"+ - "\3\2\2\2\u028b\u028c\5`\61\2\u028cW\3\2\2\2\u028d\u028e\7\"\2\2\u028e"+ - "\u0294\7#\2\2\u028f\u0290\7\"\2\2\u0290\u0294\7$\2\2\u0291\u0292\7~\2"+ - "\2\u0292\u0294\7%\2\2\u0293\u028d\3\2\2\2\u0293\u028f\3\2\2\2\u0293\u0291"+ - "\3\2\2\2\u0294Y\3\2\2\2\u0295\u029a\5\\/\2\u0296\u0297\7\20\2\2\u0297"+ - "\u0299\5\\/\2\u0298\u0296\3\2\2\2\u0299\u029c\3\2\2\2\u029a\u0298\3\2"+ - "\2\2\u029a\u029b\3\2\2\2\u029b[\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e"+ - "\7\7\2\2\u029e\u02a1\5J&\2\u029f\u02a0\7H\2\2\u02a0\u02a2\5\u00e8u\2\u02a1"+ - "\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2]\3\2\2\2\u02a3\u02a8\5`\61\2"+ - "\u02a4\u02a5\7\20\2\2\u02a5\u02a7\5`\61\2\u02a6\u02a4\3\2\2\2\u02a7\u02aa"+ - "\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a9_\3\2\2\2\u02aa"+ - "\u02a8\3\2\2\2\u02ab\u02b2\5b\62\2\u02ac\u02b2\5d\63\2\u02ad\u02b2\5~"+ - "@\2\u02ae\u02b2\5\u0082B\2\u02af\u02b2\5\u0086D\2\u02b0\u02b2\5\u0088"+ - "E\2\u02b1\u02ab\3\2\2\2\u02b1\u02ac\3\2\2\2\u02b1\u02ad\3\2\2\2\u02b1"+ - "\u02ae\3\2\2\2\u02b1\u02af\3\2\2\2\u02b1\u02b0\3\2\2\2\u02b2a\3\2\2\2"+ - "\u02b3\u02bc\5z>\2\u02b4\u02bc\5\u008cG\2\u02b5\u02bc\5\u00d8m\2\u02b6"+ - "\u02bc\5\u00dan\2\u02b7\u02bc\5\u00dco\2\u02b8\u02bc\5\u00dep\2\u02b9"+ - "\u02bc\5\u00e0q\2\u02ba\u02bc\5\u00e2r\2\u02bb\u02b3\3\2\2\2\u02bb\u02b4"+ - "\3\2\2\2\u02bb\u02b5\3\2\2\2\u02bb\u02b6\3\2\2\2\u02bb\u02b7\3\2\2\2\u02bb"+ - "\u02b8\3\2\2\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bcc\3\2\2\2"+ - "\u02bd\u02c0\5f\64\2\u02be\u02c0\5j\66\2\u02bf\u02bd\3\2\2\2\u02bf\u02be"+ - "\3\2\2\2\u02c0\u02c9\3\2\2\2\u02c1\u02c8\5f\64\2\u02c2\u02c8\5j\66\2\u02c3"+ - "\u02c8\5n8\2\u02c4\u02c8\5p9\2\u02c5\u02c8\5t;\2\u02c6\u02c8\5x=\2\u02c7"+ - "\u02c1\3\2\2\2\u02c7\u02c2\3\2\2\2\u02c7\u02c3\3\2\2\2\u02c7\u02c4\3\2"+ - "\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9"+ - "\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2"+ - "\2\2\u02cc\u02cd\7E\2\2\u02cd\u02ce\5`\61\2\u02cee\3\2\2\2\u02cf\u02d0"+ - "\7?\2\2\u02d0\u02d5\5h\65\2\u02d1\u02d2\7\20\2\2\u02d2\u02d4\5h\65\2\u02d3"+ - "\u02d1\3\2\2\2\u02d4\u02d7\3\2\2\2\u02d5\u02d3\3\2\2\2\u02d5\u02d6\3\2"+ - "\2\2\u02d6g\3\2\2\2\u02d7\u02d5\3\2\2\2\u02d8\u02db\5\u00c2b\2\u02d9\u02da"+ - "\7H\2\2\u02da\u02dc\5\u00e8u\2\u02db\u02d9\3\2\2\2\u02db\u02dc\3\2\2\2"+ - "\u02dc\u02df\3\2\2\2\u02dd\u02de\7J\2\2\u02de\u02e0\7K\2\2\u02df\u02dd"+ - "\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e3\3\2\2\2\u02e1\u02e2\7I\2\2\u02e2"+ - "\u02e4\5\u00c2b\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e5"+ - "\3\2\2\2\u02e5\u02e6\7G\2\2\u02e6\u02e7\5`\61\2\u02e7i\3\2\2\2\u02e8\u02e9"+ - "\7@\2\2\u02e9\u02ee\5l\67\2\u02ea\u02eb\7\20\2\2\u02eb\u02ed\5l\67\2\u02ec"+ - "\u02ea\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ee\u02ef\3\2"+ - "\2\2\u02efk\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f1\u02f4\5\u00c2b\2\u02f2\u02f3"+ - "\7H\2\2\u02f3\u02f5\5\u00e8u\2\u02f4\u02f2\3\2\2\2\u02f4\u02f5\3\2\2\2"+ - "\u02f5\u02f6\3\2\2\2\u02f6\u02f7\7\b\2\2\u02f7\u02f8\5`\61\2\u02f8m\3"+ - "\2\2\2\u02f9\u02fa\7A\2\2\u02fa\u02fb\5`\61\2\u02fbo\3\2\2\2\u02fc\u02fd"+ - "\7B\2\2\u02fd\u02fe\7C\2\2\u02fe\u0303\5r:\2\u02ff\u0300\7\20\2\2\u0300"+ - "\u0302\5r:\2\u0301\u02ff\3\2\2\2\u0302\u0305\3\2\2\2\u0303\u0301\3\2\2"+ - "\2\u0303\u0304\3\2\2\2\u0304q\3\2\2\2\u0305\u0303\3\2\2\2\u0306\u030d"+ - "\5\u00c2b\2\u0307\u0308\7H\2\2\u0308\u030a\5\u00e8u\2\u0309\u0307\3\2"+ - "\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030c\7\b\2\2\u030c"+ - "\u030e\5`\61\2\u030d\u0309\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0311\3\2"+ - "\2\2\u030f\u0310\7S\2\2\u0310\u0312\5\u00fa~\2\u0311\u030f\3\2\2\2\u0311"+ - "\u0312\3\2\2\2\u0312s\3\2\2\2\u0313\u0314\7D\2\2\u0314\u0319\7C\2\2\u0315"+ - "\u0316\7M\2\2\u0316\u0317\7D\2\2\u0317\u0319\7C\2\2\u0318\u0313\3\2\2"+ - "\2\u0318\u0315\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031f\5v<\2\u031b\u031c"+ - "\7\20\2\2\u031c\u031e\5v<\2\u031d\u031b\3\2\2\2\u031e\u0321\3\2\2\2\u031f"+ - "\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320u\3\2\2\2\u0321\u031f\3\2\2\2"+ - "\u0322\u0325\5`\61\2\u0323\u0326\7N\2\2\u0324\u0326\7O\2\2\u0325\u0323"+ - "\3\2\2\2\u0325\u0324\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u032c\3\2\2\2\u0327"+ - "\u032a\7K\2\2\u0328\u032b\7T\2\2\u0329\u032b\7U\2\2\u032a\u0328\3\2\2"+ - "\2\u032a\u0329\3\2\2\2\u032b\u032d\3\2\2\2\u032c\u0327\3\2\2\2\u032c\u032d"+ - "\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032f\7S\2\2\u032f\u0331\5\u00fa~\2"+ - "\u0330\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331w\3\2\2\2\u0332\u0333\7"+ - "L\2\2\u0333\u0334\5\u00c2b\2\u0334y\3\2\2\2\u0335\u0338\7P\2\2\u0336\u0338"+ - "\7Q\2\2\u0337\u0335\3\2\2\2\u0337\u0336\3\2\2\2\u0338\u0339\3\2\2\2\u0339"+ - "\u033e\5|?\2\u033a\u033b\7\20\2\2\u033b\u033d\5|?\2\u033c\u033a\3\2\2"+ - "\2\u033d\u0340\3\2\2\2\u033e\u033c\3\2\2\2\u033e\u033f\3\2\2\2\u033f\u0341"+ - "\3\2\2\2\u0340\u033e\3\2\2\2\u0341\u0342\7R\2\2\u0342\u0343\5`\61\2\u0343"+ - "{\3\2\2\2\u0344\u0347\5\u00c2b\2\u0345\u0346\7H\2\2\u0346\u0348\5\u00e8"+ - "u\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u0349\3\2\2\2\u0349"+ - "\u034a\7G\2\2\u034a\u034b\5`\61\2\u034b}\3\2\2\2\u034c\u034d\7V\2\2\u034d"+ - "\u034e\7\13\2\2\u034e\u034f\5^\60\2\u034f\u0351\7\f\2\2\u0350\u0352\5"+ - "\u0080A\2\u0351\u0350\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0351\3\2\2\2"+ - "\u0353\u0354\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u0356\7Z\2\2\u0356\u0357"+ - "\7E\2\2\u0357\u0358\5`\61\2\u0358\177\3\2\2\2\u0359\u035a\7W\2\2\u035a"+ - "\u035c\5`\61\2\u035b\u0359\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035b\3\2"+ - "\2\2\u035d\u035e\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0360\7E\2\2\u0360"+ - "\u0361\5`\61\2\u0361\u0081\3\2\2\2\u0362\u0363\7]\2\2\u0363\u0364\7\13"+ - "\2\2\u0364\u0365\5^\60\2\u0365\u0367\7\f\2\2\u0366\u0368\5\u0084C\2\u0367"+ - "\u0366\3\2\2\2\u0368\u0369\3\2\2\2\u0369\u0367\3\2\2\2\u0369\u036a\3\2"+ - "\2\2\u036a\u036b\3\2\2\2\u036b\u036d\7Z\2\2\u036c\u036e\5\u00c2b\2\u036d"+ - "\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\7E"+ - "\2\2\u0370\u0371\5`\61\2\u0371\u0083\3\2\2\2\u0372\u0376\7W\2\2\u0373"+ - "\u0374\5\u00c2b\2\u0374\u0375\7H\2\2\u0375\u0377\3\2\2\2\u0376\u0373\3"+ - "\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u037d\5\u00e8u\2"+ - "\u0379\u037a\7\16\2\2\u037a\u037c\5\u00e8u\2\u037b\u0379\3\2\2\2\u037c"+ - "\u037f\3\2\2\2\u037d\u037b\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u0380\3\2"+ - "\2\2\u037f\u037d\3\2\2\2\u0380\u0381\7E\2\2\u0381\u0382\5`\61\2\u0382"+ - "\u0085\3\2\2\2\u0383\u0384\7F\2\2\u0384\u0385\7\13\2\2\u0385\u0386\5^"+ - "\60\2\u0386\u0387\7\f\2\2\u0387\u0388\7[\2\2\u0388\u0389\5`\61\2\u0389"+ - "\u038a\7\\\2\2\u038a\u038b\5`\61\2\u038b\u0087\3\2\2\2\u038c\u038d\7X"+ - "\2\2\u038d\u038e\7\t\2\2\u038e\u038f\5^\60\2\u038f\u0391\7\n\2\2\u0390"+ - "\u0392\5\u008aF\2\u0391\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u0391"+ - "\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0089\3\2\2\2\u0395\u0398\7Y\2\2\u0396"+ - "\u0399\7\r\2\2\u0397\u0399\5J&\2\u0398\u0396\3\2\2\2\u0398\u0397\3\2\2"+ - "\2\u0399\u03a1\3\2\2\2\u039a\u039d\7\16\2\2\u039b\u039e\7\r\2\2\u039c"+ - "\u039e\5J&\2\u039d\u039b\3\2\2\2\u039d\u039c\3\2\2\2\u039e\u03a0\3\2\2"+ - "\2\u039f\u039a\3\2\2\2\u03a0\u03a3\3\2\2\2\u03a1\u039f\3\2\2\2\u03a1\u03a2"+ - "\3\2\2\2\u03a2\u03a4\3\2\2\2\u03a3\u03a1\3\2\2\2\u03a4\u03a5\7\t\2\2\u03a5"+ - "\u03a6\5^\60\2\u03a6\u03a7\7\n\2\2\u03a7\u008b\3\2\2\2\u03a8\u03ad\5\u008e"+ - "H\2\u03a9\u03aa\7^\2\2\u03aa\u03ac\5\u008eH\2\u03ab\u03a9\3\2\2\2\u03ac"+ - "\u03af\3\2\2\2\u03ad\u03ab\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae\u008d\3\2"+ - "\2\2\u03af\u03ad\3\2\2\2\u03b0\u03b5\5\u0090I\2\u03b1\u03b2\7_\2\2\u03b2"+ - "\u03b4\5\u0090I\2\u03b3\u03b1\3\2\2\2\u03b4\u03b7\3\2\2\2\u03b5\u03b3"+ - "\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6\u008f\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8"+ - "\u03ba\7`\2\2\u03b9\u03b8\3\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2"+ - "\2\2\u03bb\u03bc\5\u0092J\2\u03bc\u0091\3\2\2\2\u03bd\u03c0\5\u0094K\2"+ - "\u03be\u03bf\t\5\2\2\u03bf\u03c1\5\u0094K\2\u03c0\u03be\3\2\2\2\u03c0"+ - "\u03c1\3\2\2\2\u03c1\u0093\3\2\2\2\u03c2\u03c7\5\u0096L\2\u03c3\u03c4"+ - "\7\61\2\2\u03c4\u03c6\5\u0096L\2\u03c5\u03c3\3\2\2\2\u03c6\u03c9\3\2\2"+ - "\2\u03c7\u03c5\3\2\2\2\u03c7\u03c8\3\2\2\2\u03c8\u0095\3\2\2\2\u03c9\u03c7"+ - "\3\2\2\2\u03ca\u03cd\5\u0098M\2\u03cb\u03cc\7a\2\2\u03cc\u03ce\5\u0098"+ - "M\2\u03cd\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u0097\3\2\2\2\u03cf"+ - "\u03d4\5\u009aN\2\u03d0\u03d1\t\6\2\2\u03d1\u03d3\5\u009aN\2\u03d2\u03d0"+ - "\3\2\2\2\u03d3\u03d6\3\2\2\2\u03d4\u03d2\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5"+ - "\u0099\3\2\2\2\u03d6\u03d4\3\2\2\2\u03d7\u03dc\5\u009cO\2\u03d8\u03d9"+ - "\t\7\2\2\u03d9\u03db\5\u009cO\2\u03da\u03d8\3\2\2\2\u03db\u03de\3\2\2"+ - "\2\u03dc\u03da\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd\u009b\3\2\2\2\u03de\u03dc"+ - "\3\2\2\2\u03df\u03e3\5\u009eP\2\u03e0\u03e1\7b\2\2\u03e1\u03e2\7c\2\2"+ - "\u03e2\u03e4\5\u00e8u\2\u03e3\u03e0\3\2\2\2\u03e3\u03e4\3\2\2\2\u03e4"+ - "\u009d\3\2\2\2\u03e5\u03e9\5\u00a0Q\2\u03e6\u03e7\7e\2\2\u03e7\u03e8\7"+ - "d\2\2\u03e8\u03ea\5\u00e8u\2\u03e9\u03e6\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea"+ - "\u009f\3\2\2\2\u03eb\u03ef\5\u00a2R\2\u03ec\u03ed\7f\2\2\u03ed\u03ee\7"+ - "H\2\2\u03ee\u03f0\5\u00e8u\2\u03ef\u03ec\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0"+ - "\u00a1\3\2\2\2\u03f1\u03f5\5\u00a4S\2\u03f2\u03f3\7h\2\2\u03f3\u03f4\7"+ - "H\2\2\u03f4\u03f6\5\u00f4{\2\u03f5\u03f2\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6"+ - "\u00a3\3\2\2\2\u03f7\u03fb\5\u00a6T\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7"+ - "H\2\2\u03fa\u03fc\5\u00f4{\2\u03fb\u03f8\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc"+ - "\u00a5\3\2\2\2\u03fd\u0406\5\u00aaV\2\u03fe\u03ff\7\6\2\2\u03ff\u0400"+ - "\7/\2\2\u0400\u0401\3\2\2\2\u0401\u0402\5\u00a8U\2\u0402\u0403\5\u00ce"+ - "h\2\u0403\u0405\3\2\2\2\u0404\u03fe\3\2\2\2\u0405\u0408\3\2\2\2\u0406"+ - "\u0404\3\2\2\2\u0406\u0407\3\2\2\2\u0407\u00a7\3\2\2\2\u0408\u0406\3\2"+ - "\2\2\u0409\u040d\5J&\2\u040a\u040d\5\u00c2b\2\u040b\u040d\5\u00c4c\2\u040c"+ - "\u0409\3\2\2\2\u040c\u040a\3\2\2\2\u040c\u040b\3\2\2\2\u040d\u00a9\3\2"+ - "\2\2\u040e\u0410\t\6\2\2\u040f\u040e\3\2\2\2\u0410\u0413\3\2\2\2\u0411"+ - "\u040f\3\2\2\2\u0411\u0412\3\2\2\2\u0412\u0414\3\2\2\2\u0413\u0411\3\2"+ - "\2\2\u0414\u0415\5\u00acW\2\u0415\u00ab\3\2\2\2\u0416\u041a\5\u00b2Z\2"+ - "\u0417\u041a\5\u00aeX\2\u0418\u041a\5\u00b0Y\2\u0419\u0416\3\2\2\2\u0419"+ - "\u0417\3\2\2\2\u0419\u0418\3\2\2\2\u041a\u00ad\3\2\2\2\u041b\u041c\7o"+ - "\2\2\u041c\u041d\7n\2\2\u041d\u041e\5\u00e8u\2\u041e\u041f\7\t\2\2\u041f"+ - "\u0420\5^\60\2\u0420\u0421\7\n\2\2\u0421\u00af\3\2\2\2\u0422\u0423\7p"+ - "\2\2\u0423\u0424\7n\2\2\u0424\u0425\5\u00e8u\2\u0425\u0426\7\t\2\2\u0426"+ - "\u0427\5^\60\2\u0427\u0428\7\n\2\2\u0428\u00b1\3\2\2\2\u0429\u042e\5\u00b4"+ - "[\2\u042a\u042b\7\67\2\2\u042b\u042d\5\u00b4[\2\u042c\u042a\3\2\2\2\u042d"+ - "\u0430\3\2\2\2\u042e\u042c\3\2\2\2\u042e\u042f\3\2\2\2\u042f\u00b3\3\2"+ - "\2\2\u0430\u042e\3\2\2\2\u0431\u0439\5\u00be`\2\u0432\u0438\5\u00b6\\"+ - "\2\u0433\u0438\5\u00ba^\2\u0434\u0438\5\u00bc_\2\u0435\u0438\5\u00b8]"+ - "\2\u0436\u0438\5\u00ceh\2\u0437\u0432\3\2\2\2\u0437\u0433\3\2\2\2\u0437"+ - "\u0434\3\2\2\2\u0437\u0435\3\2\2\2\u0437\u0436\3\2\2\2\u0438\u043b\3\2"+ - "\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u00b5\3\2\2\2\u043b"+ - "\u0439\3\2\2\2\u043c\u043d\78\2\2\u043d\u043e\78\2\2\u043e\u043f\5^\60"+ - "\2\u043f\u0440\79\2\2\u0440\u0441\79\2\2\u0441\u00b7\3\2\2\2\u0442\u0443"+ - "\78\2\2\u0443\u0444\79\2\2\u0444\u00b9\3\2\2\2\u0445\u0446\78\2\2\u0446"+ - "\u0447\5^\60\2\u0447\u0448\79\2\2\u0448\u00bb\3\2\2\2\u0449\u0450\7:\2"+ - "\2\u044a\u0451\5\u00fe\u0080\2\u044b\u0451\5\u00fc\177\2\u044c\u0451\7"+ - "\u0090\2\2\u044d\u0451\5\u00c4c\2\u044e\u0451\5\u00c2b\2\u044f\u0451\5"+ - "\u00c6d\2\u0450\u044a\3\2\2\2\u0450\u044b\3\2\2\2\u0450\u044c\3\2\2\2"+ - "\u0450\u044d\3\2\2\2\u0450\u044e\3\2\2\2\u0450\u044f\3\2\2\2\u0451\u00bd"+ - "\3\2\2\2\u0452\u0462\7\u0089\2\2\u0453\u0462\7l\2\2\u0454\u0462\7m\2\2"+ - "\u0455\u0462\7\u008a\2\2\u0456\u0462\5\u00fc\177\2\u0457\u0462\5\u00c2"+ - "b\2\u0458\u0462\5\u00c4c\2\u0459\u0462\5\u00c6d\2\u045a\u0462\5\u00ea"+ - "v\2\u045b\u0462\5\u00ccg\2\u045c\u0462\5\u00c8e\2\u045d\u0462\5\u00ca"+ - "f\2\u045e\u0462\5\u00f8}\2\u045f\u0462\5\u00d2j\2\u0460\u0462\5\u00c0"+ - "a\2\u0461\u0452\3\2\2\2\u0461\u0453\3\2\2\2\u0461\u0454\3\2\2\2\u0461"+ - "\u0455\3\2\2\2\u0461\u0456\3\2\2\2\u0461\u0457\3\2\2\2\u0461\u0458\3\2"+ - "\2\2\u0461\u0459\3\2\2\2\u0461\u045a\3\2\2\2\u0461\u045b\3\2\2\2\u0461"+ - "\u045c\3\2\2\2\u0461\u045d\3\2\2\2\u0461\u045e\3\2\2\2\u0461\u045f\3\2"+ - "\2\2\u0461\u0460\3\2\2\2\u0462\u00bf\3\2\2\2\u0463\u0464\7\t\2\2\u0464"+ - "\u0465\5\20\t\2\u0465\u0466\7\n\2\2\u0466\u00c1\3\2\2\2\u0467\u0468\7"+ - "\7\2\2\u0468\u0469\5J&\2\u0469\u00c3\3\2\2\2\u046a\u046c\7\13\2\2\u046b"+ - "\u046d\5^\60\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e\3\2"+ - "\2\2\u046e\u046f\7\f\2\2\u046f\u00c5\3\2\2\2\u0470\u0471\7;\2\2\u0471"+ - "\u00c7\3\2\2\2\u0472\u0473\7\22\2\2\u0473\u0474\7\t\2\2\u0474\u0475\5"+ - "^\60\2\u0475\u0476\7\n\2\2\u0476\u00c9\3\2\2\2\u0477\u0478\7k\2\2\u0478"+ - "\u0479\7\t\2\2\u0479\u047a\5^\60\2\u047a\u047b\7\n\2\2\u047b\u00cb\3\2"+ - "\2\2\u047c\u047d\5J&\2\u047d\u047e\5\u00ceh\2\u047e\u00cd\3\2\2\2\u047f"+ - "\u0486\7\13\2\2\u0480\u0482\5\u00d0i\2\u0481\u0483\7\20\2\2\u0482\u0481"+ - "\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0485\3\2\2\2\u0484\u0480\3\2\2\2\u0485"+ - "\u0488\3\2\2\2\u0486\u0484\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0489\3\2"+ - "\2\2\u0488\u0486\3\2\2\2\u0489\u048a\7\f\2\2\u048a\u00cf\3\2\2\2\u048b"+ - "\u048e\5`\61\2\u048c\u048e\7\u0088\2\2\u048d\u048b\3\2\2\2\u048d\u048c"+ - "\3\2\2\2\u048e\u00d1\3\2\2\2\u048f\u0492\5\u00d4k\2\u0490\u0492\5\u00d6"+ - "l\2\u0491\u048f\3\2\2\2\u0491\u0490\3\2\2\2\u0492\u00d3\3\2\2\2\u0493"+ - "\u0494\5J&\2\u0494\u0495\7<\2\2\u0495\u0496\7\u008a\2\2\u0496\u00d5\3"+ - "\2\2\2\u0497\u0498\5\64\33\2\u0498\u0499\7!\2\2\u0499\u049b\7\13\2\2\u049a"+ - "\u049c\5Z.\2\u049b\u049a\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049d\3\2\2"+ - "\2\u049d\u04a0\7\f\2\2\u049e\u049f\7H\2\2\u049f\u04a1\5\u00e8u\2\u04a0"+ - "\u049e\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7\t"+ - "\2\2\u04a3\u04a4\5\22\n\2\u04a4\u04a5\7\n\2\2\u04a5\u00d7\3\2\2\2\u04a6"+ - "\u04a7\7u\2\2\u04a7\u04a8\7~\2\2\u04a8\u04a9\5`\61\2\u04a9\u04aa\7|\2"+ - "\2\u04aa\u04ae\5`\61\2\u04ab\u04ac\7I\2\2\u04ac\u04ad\7\u0080\2\2\u04ad"+ - "\u04af\5`\61\2\u04ae\u04ab\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04be\3\2"+ - "\2\2\u04b0\u04b1\7u\2\2\u04b1\u04b2\7~\2\2\u04b2\u04b7\5\u00f6|\2\u04b3"+ - "\u04b4\7\20\2\2\u04b4\u04b6\5\u00f6|\2\u04b5\u04b3\3\2\2\2\u04b6\u04b9"+ - "\3\2\2\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04ba\3\2\2\2\u04b9"+ - "\u04b7\3\2\2\2\u04ba\u04bb\7|\2\2\u04bb\u04bc\5`\61\2\u04bc\u04be\3\2"+ - "\2\2\u04bd\u04a6\3\2\2\2\u04bd\u04b0\3\2\2\2\u04be\u00d9\3\2\2\2\u04bf"+ - "\u04c0\7v\2\2\u04c0\u04c1\7~\2\2\u04c1\u04c2\5\u00e4s\2\u04c2\u00db\3"+ - "\2\2\2\u04c3\u04c4\7w\2\2\u04c4\u04c5\7~\2\2\u04c5\u04c6\5\u00e4s\2\u04c6"+ - "\u04c7\7H\2\2\u04c7\u04c8\5`\61\2\u04c8\u00dd\3\2\2\2\u04c9\u04ca\7x\2"+ - "\2\u04ca\u04cb\7}\2\2\u04cb\u04cc\7c\2\2\u04cc\u04cd\7~\2\2\u04cd\u04ce"+ - "\5\u00e4s\2\u04ce\u04cf\7\177\2\2\u04cf\u04d0\5`\61\2\u04d0\u00df\3\2"+ - "\2\2\u04d1\u04d2\7y\2\2\u04d2\u04d7\5\u00e6t\2\u04d3\u04d4\7\20\2\2\u04d4"+ - "\u04d6\5\u00e6t\2\u04d5\u04d3\3\2\2\2\u04d6\u04d9\3\2\2\2\u04d7\u04d5"+ - "\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04da\3\2\2\2\u04d9\u04d7\3\2\2\2\u04da"+ - "\u04db\7z\2\2\u04db\u04dc\5`\61\2\u04dc\u04dd\7E\2\2\u04dd\u04de\5`\61"+ - "\2\u04de\u00e1\3\2\2\2\u04df\u04e0\7{\2\2\u04e0\u04e1\7~\2\2\u04e1\u04e2"+ - "\5`\61\2\u04e2\u04e3\7|\2\2\u04e3\u04e4\5`\61\2\u04e4\u00e3\3\2\2\2\u04e5"+ - "\u04e8\5\u00be`\2\u04e6\u04e9\5\u00b6\\\2\u04e7\u04e9\5\u00bc_\2\u04e8"+ - "\u04e6\3\2\2\2\u04e8\u04e7\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04e8\3\2"+ - "\2\2\u04ea\u04eb\3\2\2\2\u04eb\u00e5\3\2\2\2\u04ec\u04ed\5\u00c2b\2\u04ed"+ - "\u04ee\7\b\2\2\u04ee\u04ef\5`\61\2\u04ef\u00e7\3\2\2\2\u04f0\u04f1\7\13"+ - "\2\2\u04f1\u04f9\7\f\2\2\u04f2\u04f6\5\u00ecw\2\u04f3\u04f7\7\u0088\2"+ - "\2\u04f4\u04f7\7\r\2\2\u04f5\u04f7\7\62\2\2\u04f6\u04f3\3\2\2\2\u04f6"+ - "\u04f4\3\2\2\2\u04f6\u04f5\3\2\2\2\u04f6\u04f7\3\2\2\2\u04f7\u04f9\3\2"+ - "\2\2\u04f8\u04f0\3\2\2\2\u04f8\u04f2\3\2\2\2\u04f9\u00e9\3\2\2\2\u04fa"+ - "\u0503\7\t\2\2\u04fb\u0500\5\u00f6|\2\u04fc\u04fd\7\20\2\2\u04fd\u04ff"+ - "\5\u00f6|\2\u04fe\u04fc\3\2\2\2\u04ff\u0502\3\2\2\2\u0500\u04fe\3\2\2"+ - "\2\u0500\u0501\3\2\2\2\u0501\u0504\3\2\2\2\u0502\u0500\3\2\2\2\u0503\u04fb"+ - "\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u050b\7\n\2\2\u0506"+ - "\u0507\7=\2\2\u0507\u0508\5^\60\2\u0508\u0509\7>\2\2\u0509\u050b\3\2\2"+ - "\2\u050a\u04fa\3\2\2\2\u050a\u0506\3\2\2\2\u050b\u00eb\3\2\2\2\u050c\u0510"+ - "\5J&\2\u050d\u0510\7\u0089\2\2\u050e\u0510\5\u00eex\2\u050f\u050c\3\2"+ - "\2\2\u050f\u050d\3\2\2\2\u050f\u050e\3\2\2\2\u0510\u00ed\3\2\2\2\u0511"+ - "\u0514\5\u00f0y\2\u0512\u0514\5\u00f2z\2\u0513\u0511\3\2\2\2\u0513\u0512"+ - "\3\2\2\2\u0514\u00ef\3\2\2\2\u0515\u0516\7!\2\2\u0516\u0517\7\13\2\2\u0517"+ - "\u0518\7\r\2\2\u0518\u0519\7\f\2\2\u0519\u00f1\3\2\2\2\u051a\u051b\7!"+ - "\2\2\u051b\u0524\7\13\2\2\u051c\u0521\5\u00e8u\2\u051d\u051e\7\20\2\2"+ - "\u051e\u0520\5\u00e8u\2\u051f\u051d\3\2\2\2\u0520\u0523\3\2\2\2\u0521"+ - "\u051f\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0525\3\2\2\2\u0523\u0521\3\2"+ - "\2\2\u0524\u051c\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526"+ - "\u0527\7\f\2\2\u0527\u0528\7H\2\2\u0528\u0529\5\u00e8u\2\u0529\u00f3\3"+ - "\2\2\2\u052a\u052c\5\u00ecw\2\u052b\u052d\7\u0088\2\2\u052c\u052b\3\2"+ - "\2\2\u052c\u052d\3\2\2\2\u052d\u00f5\3\2\2\2\u052e\u0531\5`\61\2\u052f"+ - "\u0531\7\u0090\2\2\u0530\u052e\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0532"+ - "\3\2\2\2\u0532\u0533\t\b\2\2\u0533\u0534\5`\61\2\u0534\u00f7\3\2\2\2\u0535"+ - "\u0537\78\2\2\u0536\u0538\5^\60\2\u0537\u0536\3\2\2\2\u0537\u0538\3\2"+ - "\2\2\u0538\u0539\3\2\2\2\u0539\u053a\79\2\2\u053a\u00f9\3\2\2\2\u053b"+ - "\u053c\5\u00fc\177\2\u053c\u00fb\3\2\2\2\u053d\u053e\7\u0087\2\2\u053e"+ - "\u00fd\3\2\2\2\u053f\u0540\t\t\2\2\u0540\u00ff\3\2\2\2\u0086\u0108\u010c"+ - "\u011c\u0122\u012a\u0132\u013a\u0149\u0167\u016f\u0171\u0187\u0191\u019b"+ - "\u01a0\u01a5\u01a9\u01b5\u01b9\u01c2\u01c9\u01d7\u01db\u01e0\u01ea\u01f2"+ - "\u01f6\u0202\u020e\u0224\u022c\u0231\u0234\u0238\u0241\u024a\u024d\u0255"+ - "\u025c\u025e\u0265\u026c\u026e\u0276\u027b\u0282\u0289\u0293\u029a\u02a1"+ - "\u02a8\u02b1\u02bb\u02bf\u02c7\u02c9\u02d5\u02db\u02df\u02e3\u02ee\u02f4"+ - "\u0303\u0309\u030d\u0311\u0318\u031f\u0325\u032a\u032c\u0330\u0337\u033e"+ - "\u0347\u0353\u035d\u0369\u036d\u0376\u037d\u0393\u0398\u039d\u03a1\u03ad"+ - "\u03b5\u03b9\u03c0\u03c7\u03cd\u03d4\u03dc\u03e3\u03e9\u03ef\u03f5\u03fb"+ - "\u0406\u040c\u0411\u0419\u042e\u0437\u0439\u0450\u0461\u046c\u0482\u0486"+ - "\u048d\u0491\u049b\u04a0\u04ae\u04b7\u04bd\u04d7\u04e8\u04ea\u04f6\u04f8"+ - "\u0500\u0503\u050a\u050f\u0513\u0521\u0524\u052c\u0530\u0537"; + "\32\7\32\u01d6\n\32\f\32\16\32\u01d9\13\32\3\32\5\32\u01dc\n\32\3\32\5"+ + "\32\u01df\n\32\3\33\7\33\u01e2\n\33\f\33\16\33\u01e5\13\33\3\34\3\34\3"+ + "\34\3\34\3\34\7\34\u01ec\n\34\f\34\16\34\u01ef\13\34\3\34\3\34\3\35\3"+ + "\35\3\35\5\35\u01f6\n\35\3\35\3\35\5\35\u01fa\n\35\3\36\3\36\3\36\3\36"+ + "\3\36\3\36\3\37\3\37\3\37\3\37\5\37\u0206\n\37\3 \3 \3 \3 \3 \3 \3!\3"+ + "!\3!\3!\5!\u0212\n!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$"+ + "\3%\3%\3%\3%\3%\5%\u0228\n%\3%\3%\3%\3%\7%\u022e\n%\f%\16%\u0231\13%\3"+ + "&\3&\5&\u0235\n&\3&\5&\u0238\n&\3&\3&\5&\u023c\n&\3\'\3\'\3(\3(\3(\3("+ + "\3(\5(\u0245\n(\3(\3(\3(\3(\3(\7(\u024c\n(\f(\16(\u024f\13(\5(\u0251\n"+ + "(\3)\3)\3)\3)\3)\3)\5)\u0259\n)\3)\3)\3)\3)\3)\5)\u0260\n)\5)\u0262\n"+ + ")\3*\3*\3*\3*\3*\5*\u0269\n*\3*\3*\3*\3*\3*\5*\u0270\n*\5*\u0272\n*\3"+ + "+\3+\3+\3+\3+\3+\5+\u027a\n+\3+\3+\3+\5+\u027f\n+\3+\3+\3+\3+\3+\5+\u0286"+ + "\n+\3,\3,\3,\3,\3,\5,\u028d\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u0297\n-\3."+ + "\3.\3.\7.\u029c\n.\f.\16.\u029f\13.\3/\3/\3/\3/\5/\u02a5\n/\3\60\3\60"+ + "\3\60\7\60\u02aa\n\60\f\60\16\60\u02ad\13\60\3\61\3\61\3\61\3\61\3\61"+ + "\3\61\5\61\u02b5\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u02bf"+ + "\n\62\3\63\3\63\5\63\u02c3\n\63\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u02cb"+ + "\n\63\f\63\16\63\u02ce\13\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u02d7"+ + "\n\64\f\64\16\64\u02da\13\64\3\65\3\65\3\65\5\65\u02df\n\65\3\65\3\65"+ + "\5\65\u02e3\n\65\3\65\3\65\5\65\u02e7\n\65\3\65\3\65\3\65\3\66\3\66\3"+ + "\66\3\66\7\66\u02f0\n\66\f\66\16\66\u02f3\13\66\3\67\3\67\3\67\5\67\u02f8"+ + "\n\67\3\67\3\67\3\67\38\38\38\39\39\39\39\39\79\u0305\n9\f9\169\u0308"+ + "\139\3:\3:\3:\5:\u030d\n:\3:\3:\5:\u0311\n:\3:\3:\5:\u0315\n:\3;\3;\3"+ + ";\3;\3;\5;\u031c\n;\3;\3;\3;\7;\u0321\n;\f;\16;\u0324\13;\3<\3<\3<\5<"+ + "\u0329\n<\3<\3<\3<\5<\u032e\n<\5<\u0330\n<\3<\3<\5<\u0334\n<\3=\3=\3="+ + "\3>\3>\5>\u033b\n>\3>\3>\3>\7>\u0340\n>\f>\16>\u0343\13>\3>\3>\3>\3?\3"+ + "?\3?\5?\u034b\n?\3?\3?\3?\3@\3@\3@\3@\3@\6@\u0355\n@\r@\16@\u0356\3@\3"+ + "@\3@\3@\3A\3A\6A\u035f\nA\rA\16A\u0360\3A\3A\3A\3B\3B\3B\3B\3B\6B\u036b"+ + "\nB\rB\16B\u036c\3B\3B\5B\u0371\nB\3B\3B\3B\3C\3C\3C\3C\5C\u037a\nC\3"+ + "C\3C\3C\7C\u037f\nC\fC\16C\u0382\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D"+ + "\3D\3E\3E\3E\3E\3E\6E\u0395\nE\rE\16E\u0396\3F\3F\3F\5F\u039c\nF\3F\3"+ + "F\3F\5F\u03a1\nF\7F\u03a3\nF\fF\16F\u03a6\13F\3F\3F\3F\3F\3G\3G\3G\7G"+ + "\u03af\nG\fG\16G\u03b2\13G\3H\3H\3H\7H\u03b7\nH\fH\16H\u03ba\13H\3I\5"+ + "I\u03bd\nI\3I\3I\3J\3J\3J\5J\u03c4\nJ\3K\3K\3K\7K\u03c9\nK\fK\16K\u03cc"+ + "\13K\3L\3L\3L\5L\u03d1\nL\3M\3M\3M\7M\u03d6\nM\fM\16M\u03d9\13M\3N\3N"+ + "\3N\7N\u03de\nN\fN\16N\u03e1\13N\3O\3O\3O\3O\5O\u03e7\nO\3P\3P\3P\3P\5"+ + "P\u03ed\nP\3Q\3Q\3Q\3Q\5Q\u03f3\nQ\3R\3R\3R\3R\5R\u03f9\nR\3S\3S\3S\3"+ + "S\5S\u03ff\nS\3T\3T\3T\3T\3T\3T\3T\7T\u0408\nT\fT\16T\u040b\13T\3U\3U"+ + "\3U\5U\u0410\nU\3V\7V\u0413\nV\fV\16V\u0416\13V\3V\3V\3W\3W\3W\5W\u041d"+ + "\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u0430\nZ\fZ"+ + "\16Z\u0433\13Z\3[\3[\3[\3[\3[\3[\7[\u043b\n[\f[\16[\u043e\13[\3\\\3\\"+ + "\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0454\n"+ + "_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\5`\u0465\n`\3a\3a\3a\3"+ + "a\3b\3b\3b\3c\3c\5c\u0470\nc\3c\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3"+ + "f\3g\3g\3g\3h\3h\3h\5h\u0486\nh\7h\u0488\nh\fh\16h\u048b\13h\3h\3h\3i"+ + "\3i\5i\u0491\ni\3j\3j\5j\u0495\nj\3k\3k\3k\3k\3l\3l\3l\3l\5l\u049f\nl"+ + "\3l\3l\3l\5l\u04a4\nl\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04b2\nm"+ + "\3m\3m\3m\3m\3m\7m\u04b9\nm\fm\16m\u04bc\13m\3m\3m\3m\5m\u04c1\nm\3n\3"+ + "n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\7q\u04d9"+ + "\nq\fq\16q\u04dc\13q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u04ec"+ + "\ns\rs\16s\u04ed\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\5u\u04fa\nu\5u\u04fc\n"+ + "u\3v\3v\3v\3v\7v\u0502\nv\fv\16v\u0505\13v\5v\u0507\nv\3v\3v\3v\3v\3v"+ + "\5v\u050e\nv\3w\3w\3w\5w\u0513\nw\3x\3x\5x\u0517\nx\3y\3y\3y\3y\3y\3z"+ + "\3z\3z\3z\3z\7z\u0523\nz\fz\16z\u0526\13z\5z\u0528\nz\3z\3z\3z\3z\3{\3"+ + "{\5{\u0530\n{\3|\3|\5|\u0534\n|\3|\3|\3|\3}\3}\5}\u053b\n}\3}\3}\3~\3"+ + "~\3\177\3\177\3\u0080\3\u0080\3\u0080\2\2\u0081\2\4\6\b\n\f\16\20\22\24"+ + "\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtv"+ + "xz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ + "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ + "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ + "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ + "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ + "\u00f6\u00f8\u00fa\u00fc\u00fe\2\n\4\2\22\22kk\3\2TU\3\2\25\36\4\2\6\6"+ + "&\60\3\2\62\63\4\2\r\r\64\66\4\2\24\24\u0089\u0089\4\2?\u0087\u008a\u008a"+ + "\2\u0587\2\u0100\3\2\2\2\4\u0108\3\2\2\2\6\u010e\3\2\2\2\b\u0111\3\2\2"+ + "\2\n\u0122\3\2\2\2\f\u012d\3\2\2\2\16\u0132\3\2\2\2\20\u0135\3\2\2\2\22"+ + "\u0138\3\2\2\2\24\u0149\3\2\2\2\26\u014b\3\2\2\2\30\u014e\3\2\2\2\32\u0154"+ + "\3\2\2\2\34\u0158\3\2\2\2\36\u015c\3\2\2\2 \u0160\3\2\2\2\"\u0167\3\2"+ + "\2\2$\u0177\3\2\2\2&\u0180\3\2\2\2(\u018f\3\2\2\2*\u0196\3\2\2\2,\u019d"+ + "\3\2\2\2.\u01ae\3\2\2\2\60\u01be\3\2\2\2\62\u01de\3\2\2\2\64\u01e3\3\2"+ + "\2\2\66\u01e6\3\2\2\28\u01f2\3\2\2\2:\u01fb\3\2\2\2<\u0205\3\2\2\2>\u0207"+ + "\3\2\2\2@\u0211\3\2\2\2B\u0213\3\2\2\2D\u0218\3\2\2\2F\u021c\3\2\2\2H"+ + "\u0222\3\2\2\2J\u0237\3\2\2\2L\u023d\3\2\2\2N\u023f\3\2\2\2P\u0252\3\2"+ + "\2\2R\u0263\3\2\2\2T\u0273\3\2\2\2V\u0287\3\2\2\2X\u0296\3\2\2\2Z\u0298"+ + "\3\2\2\2\\\u02a0\3\2\2\2^\u02a6\3\2\2\2`\u02b4\3\2\2\2b\u02be\3\2\2\2"+ + "d\u02c2\3\2\2\2f\u02d2\3\2\2\2h\u02db\3\2\2\2j\u02eb\3\2\2\2l\u02f4\3"+ + "\2\2\2n\u02fc\3\2\2\2p\u02ff\3\2\2\2r\u0309\3\2\2\2t\u031b\3\2\2\2v\u0325"+ + "\3\2\2\2x\u0335\3\2\2\2z\u033a\3\2\2\2|\u0347\3\2\2\2~\u034f\3\2\2\2\u0080"+ + "\u035e\3\2\2\2\u0082\u0365\3\2\2\2\u0084\u0375\3\2\2\2\u0086\u0386\3\2"+ + "\2\2\u0088\u038f\3\2\2\2\u008a\u0398\3\2\2\2\u008c\u03ab\3\2\2\2\u008e"+ + "\u03b3\3\2\2\2\u0090\u03bc\3\2\2\2\u0092\u03c0\3\2\2\2\u0094\u03c5\3\2"+ + "\2\2\u0096\u03cd\3\2\2\2\u0098\u03d2\3\2\2\2\u009a\u03da\3\2\2\2\u009c"+ + "\u03e2\3\2\2\2\u009e\u03e8\3\2\2\2\u00a0\u03ee\3\2\2\2\u00a2\u03f4\3\2"+ + "\2\2\u00a4\u03fa\3\2\2\2\u00a6\u0400\3\2\2\2\u00a8\u040f\3\2\2\2\u00aa"+ + "\u0414\3\2\2\2\u00ac\u041c\3\2\2\2\u00ae\u041e\3\2\2\2\u00b0\u0425\3\2"+ + "\2\2\u00b2\u042c\3\2\2\2\u00b4\u0434\3\2\2\2\u00b6\u043f\3\2\2\2\u00b8"+ + "\u0445\3\2\2\2\u00ba\u0448\3\2\2\2\u00bc\u044c\3\2\2\2\u00be\u0464\3\2"+ + "\2\2\u00c0\u0466\3\2\2\2\u00c2\u046a\3\2\2\2\u00c4\u046d\3\2\2\2\u00c6"+ + "\u0473\3\2\2\2\u00c8\u0475\3\2\2\2\u00ca\u047a\3\2\2\2\u00cc\u047f\3\2"+ + "\2\2\u00ce\u0482\3\2\2\2\u00d0\u0490\3\2\2\2\u00d2\u0494\3\2\2\2\u00d4"+ + "\u0496\3\2\2\2\u00d6\u049a\3\2\2\2\u00d8\u04c0\3\2\2\2\u00da\u04c2\3\2"+ + "\2\2\u00dc\u04c6\3\2\2\2\u00de\u04cc\3\2\2\2\u00e0\u04d4\3\2\2\2\u00e2"+ + "\u04e2\3\2\2\2\u00e4\u04e8\3\2\2\2\u00e6\u04ef\3\2\2\2\u00e8\u04fb\3\2"+ + "\2\2\u00ea\u050d\3\2\2\2\u00ec\u0512\3\2\2\2\u00ee\u0516\3\2\2\2\u00f0"+ + "\u0518\3\2\2\2\u00f2\u051d\3\2\2\2\u00f4\u052d\3\2\2\2\u00f6\u0533\3\2"+ + "\2\2\u00f8\u0538\3\2\2\2\u00fa\u053e\3\2\2\2\u00fc\u0540\3\2\2\2\u00fe"+ + "\u0542\3\2\2\2\u0100\u0101\5\4\3\2\u0101\u0102\7\2\2\3\u0102\3\3\2\2\2"+ + "\u0103\u0104\7j\2\2\u0104\u0105\7i\2\2\u0105\u0106\5\u00fc\177\2\u0106"+ + "\u0107\7\3\2\2\u0107\u0109\3\2\2\2\u0108\u0103\3\2\2\2\u0108\u0109\3\2"+ + "\2\2\u0109\u010c\3\2\2\2\u010a\u010d\5\b\5\2\u010b\u010d\5\6\4\2\u010c"+ + "\u010a\3\2\2\2\u010c\u010b\3\2\2\2\u010d\5\3\2\2\2\u010e\u010f\5\n\6\2"+ + "\u010f\u0110\5\f\7\2\u0110\7\3\2\2\2\u0111\u0112\7\4\2\2\u0112\u0113\7"+ + "\5\2\2\u0113\u0114\7\u0091\2\2\u0114\u0115\7\6\2\2\u0115\u0116\5\u00fa"+ + "~\2\u0116\u0117\7\3\2\2\u0117\u0118\5\n\6\2\u0118\t\3\2\2\2\u0119\u011d"+ + "\5<\37\2\u011a\u011d\5> \2\u011b\u011d\5N(\2\u011c\u0119\3\2\2\2\u011c"+ + "\u011a\3\2\2\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011f\7\3"+ + "\2\2\u011f\u0121\3\2\2\2\u0120\u011c\3\2\2\2\u0121\u0124\3\2\2\2\u0122"+ + "\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123\u012a\3\2\2\2\u0124\u0122\3\2"+ + "\2\2\u0125\u0126\5@!\2\u0126\u0127\7\3\2\2\u0127\u0129\3\2\2\2\u0128\u0125"+ + "\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012a\u012b\3\2\2\2\u012b"+ + "\13\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u012e\5\22\n\2\u012e\r\3\2\2\2\u012f"+ + "\u0131\5\24\13\2\u0130\u012f\3\2\2\2\u0131\u0134\3\2\2\2\u0132\u0130\3"+ + "\2\2\2\u0132\u0133\3\2\2\2\u0133\17\3\2\2\2\u0134\u0132\3\2\2\2\u0135"+ + "\u0136\5\16\b\2\u0136\u0137\5^\60\2\u0137\21\3\2\2\2\u0138\u013a\5\16"+ + "\b\2\u0139\u013b\5^\60\2\u013a\u0139\3\2\2\2\u013a\u013b\3\2\2\2\u013b"+ + "\23\3\2\2\2\u013c\u014a\5\26\f\2\u013d\u014a\5\30\r\2\u013e\u014a\5\32"+ + "\16\2\u013f\u014a\5\34\17\2\u0140\u014a\5\36\20\2\u0141\u014a\5 \21\2"+ + "\u0142\u014a\5\"\22\2\u0143\u014a\5$\23\2\u0144\u014a\5&\24\2\u0145\u014a"+ + "\5*\26\2\u0146\u014a\5.\30\2\u0147\u014a\5\66\34\2\u0148\u014a\5:\36\2"+ + "\u0149\u013c\3\2\2\2\u0149\u013d\3\2\2\2\u0149\u013e\3\2\2\2\u0149\u013f"+ + "\3\2\2\2\u0149\u0140\3\2\2\2\u0149\u0141\3\2\2\2\u0149\u0142\3\2\2\2\u0149"+ + "\u0143\3\2\2\2\u0149\u0144\3\2\2\2\u0149\u0145\3\2\2\2\u0149\u0146\3\2"+ + "\2\2\u0149\u0147\3\2\2\2\u0149\u0148\3\2\2\2\u014a\25\3\2\2\2\u014b\u014c"+ + "\5b\62\2\u014c\u014d\7\3\2\2\u014d\27\3\2\2\2\u014e\u014f\7\7\2\2\u014f"+ + "\u0150\5J&\2\u0150\u0151\7\b\2\2\u0151\u0152\5`\61\2\u0152\u0153\7\3\2"+ + "\2\u0153\31\3\2\2\2\u0154\u0155\7\t\2\2\u0155\u0156\5\16\b\2\u0156\u0157"+ + "\7\n\2\2\u0157\33\3\2\2\2\u0158\u0159\7\u0082\2\2\u0159\u015a\7\u0083"+ + "\2\2\u015a\u015b\7\3\2\2\u015b\35\3\2\2\2\u015c\u015d\7\u0084\2\2\u015d"+ + "\u015e\7\u0083\2\2\u015e\u015f\7\3\2\2\u015f\37\3\2\2\2\u0160\u0161\7"+ + "\u0085\2\2\u0161\u0162\7\u0086\2\2\u0162\u0163\5`\61\2\u0163\u0164\7\3"+ + "\2\2\u0164!\3\2\2\2\u0165\u0168\5f\64\2\u0166\u0168\5j\66\2\u0167\u0165"+ + "\3\2\2\2\u0167\u0166\3\2\2\2\u0168\u0171\3\2\2\2\u0169\u0170\5f\64\2\u016a"+ + "\u0170\5j\66\2\u016b\u0170\5n8\2\u016c\u0170\5p9\2\u016d\u0170\5t;\2\u016e"+ + "\u0170\5x=\2\u016f\u0169\3\2\2\2\u016f\u016a\3\2\2\2\u016f\u016b\3\2\2"+ + "\2\u016f\u016c\3\2\2\2\u016f\u016d\3\2\2\2\u016f\u016e\3\2\2\2\u0170\u0173"+ + "\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2\2\2\u0172\u0174\3\2\2\2\u0173"+ + "\u0171\3\2\2\2\u0174\u0175\7E\2\2\u0175\u0176\5\24\13\2\u0176#\3\2\2\2"+ + "\u0177\u0178\7F\2\2\u0178\u0179\7\13\2\2\u0179\u017a\5^\60\2\u017a\u017b"+ + "\7\f\2\2\u017b\u017c\7[\2\2\u017c\u017d\5\24\13\2\u017d\u017e\7\\\2\2"+ + "\u017e\u017f\5\24\13\2\u017f%\3\2\2\2\u0180\u0181\7V\2\2\u0181\u0182\7"+ + "\13\2\2\u0182\u0183\5^\60\2\u0183\u0185\7\f\2\2\u0184\u0186\5(\25\2\u0185"+ + "\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187\u0185\3\2\2\2\u0187\u0188\3\2"+ + "\2\2\u0188\u0189\3\2\2\2\u0189\u018a\7Z\2\2\u018a\u018b\7E\2\2\u018b\u018c"+ + "\5\24\13\2\u018c\'\3\2\2\2\u018d\u018e\7W\2\2\u018e\u0190\5`\61\2\u018f"+ + "\u018d\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u018f\3\2\2\2\u0191\u0192\3\2"+ + "\2\2\u0192\u0193\3\2\2\2\u0193\u0194\7E\2\2\u0194\u0195\5\24\13\2\u0195"+ + ")\3\2\2\2\u0196\u0197\7X\2\2\u0197\u0199\5\32\16\2\u0198\u019a\5,\27\2"+ + "\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u0199\3\2\2\2\u019b\u019c"+ + "\3\2\2\2\u019c+\3\2\2\2\u019d\u01a0\7Y\2\2\u019e\u01a1\7\r\2\2\u019f\u01a1"+ + "\5J&\2\u01a0\u019e\3\2\2\2\u01a0\u019f\3\2\2\2\u01a1\u01a9\3\2\2\2\u01a2"+ + "\u01a5\7\16\2\2\u01a3\u01a6\7\r\2\2\u01a4\u01a6\5J&\2\u01a5\u01a3\3\2"+ + "\2\2\u01a5\u01a4\3\2\2\2\u01a6\u01a8\3\2\2\2\u01a7\u01a2\3\2\2\2\u01a8"+ + "\u01ab\3\2\2\2\u01a9\u01a7\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ac\3\2"+ + "\2\2\u01ab\u01a9\3\2\2\2\u01ac\u01ad\5\32\16\2\u01ad-\3\2\2\2\u01ae\u01af"+ + "\7]\2\2\u01af\u01b0\7\13\2\2\u01b0\u01b1\5^\60\2\u01b1\u01b3\7\f\2\2\u01b2"+ + "\u01b4\5\60\31\2\u01b3\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b3\3"+ + "\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b9\7Z\2\2\u01b8"+ + "\u01ba\5\u00c2b\2\u01b9\u01b8\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bb"+ + "\3\2\2\2\u01bb\u01bc\7E\2\2\u01bc\u01bd\5\24\13\2\u01bd/\3\2\2\2\u01be"+ + "\u01c2\7W\2\2\u01bf\u01c0\5\u00c2b\2\u01c0\u01c1\7H\2\2\u01c1\u01c3\3"+ + "\2\2\2\u01c2\u01bf\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4"+ + "\u01c9\5\u00e8u\2\u01c5\u01c6\7\16\2\2\u01c6\u01c8\5\u00e8u\2\u01c7\u01c5"+ + "\3\2\2\2\u01c8\u01cb\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca"+ + "\u01cc\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\u01cd\7E\2\2\u01cd\u01ce\5\24"+ + "\13\2\u01ce\61\3\2\2\2\u01cf\u01d0\7\17\2\2\u01d0\u01db\5J&\2\u01d1\u01d2"+ + "\7\13\2\2\u01d2\u01d7\7\u008b\2\2\u01d3\u01d4\7\20\2\2\u01d4\u01d6\7\u008b"+ + "\2\2\u01d5\u01d3\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7"+ + "\u01d8\3\2\2\2\u01d8\u01da\3\2\2\2\u01d9\u01d7\3\2\2\2\u01da\u01dc\7\f"+ + "\2\2\u01db\u01d1\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01df\3\2\2\2\u01dd"+ + "\u01df\7\u0081\2\2\u01de\u01cf\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\63\3"+ + "\2\2\2\u01e0\u01e2\5\62\32\2\u01e1\u01e0\3\2\2\2\u01e2\u01e5\3\2\2\2\u01e3"+ + "\u01e1\3\2\2\2\u01e3\u01e4\3\2\2\2\u01e4\65\3\2\2\2\u01e5\u01e3\3\2\2"+ + "\2\u01e6\u01e7\5\64\33\2\u01e7\u01e8\7t\2\2\u01e8\u01ed\58\35\2\u01e9"+ + "\u01ea\7\20\2\2\u01ea\u01ec\58\35\2\u01eb\u01e9\3\2\2\2\u01ec\u01ef\3"+ + "\2\2\2\u01ed\u01eb\3\2\2\2\u01ed\u01ee\3\2\2\2\u01ee\u01f0\3\2\2\2\u01ef"+ + "\u01ed\3\2\2\2\u01f0\u01f1\7\3\2\2\u01f1\67\3\2\2\2\u01f2\u01f5\5\u00c2"+ + "b\2\u01f3\u01f4\7H\2\2\u01f4\u01f6\5\u00e8u\2\u01f5\u01f3\3\2\2\2\u01f5"+ + "\u01f6\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7\u01f8\7\b\2\2\u01f8\u01fa\5`"+ + "\61\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa9\3\2\2\2\u01fb\u01fc"+ + "\7\u0087\2\2\u01fc\u01fd\7\13\2\2\u01fd\u01fe\5^\60\2\u01fe\u01ff\7\f"+ + "\2\2\u01ff\u0200\5\24\13\2\u0200;\3\2\2\2\u0201\u0206\5B\"\2\u0202\u0206"+ + "\5D#\2\u0203\u0206\5F$\2\u0204\u0206\5H%\2\u0205\u0201\3\2\2\2\u0205\u0202"+ + "\3\2\2\2\u0205\u0203\3\2\2\2\u0205\u0204\3\2\2\2\u0206=\3\2\2\2\u0207"+ + "\u0208\7q\2\2\u0208\u0209\7\5\2\2\u0209\u020a\7\u0091\2\2\u020a\u020b"+ + "\7\6\2\2\u020b\u020c\5\u00fa~\2\u020c?\3\2\2\2\u020d\u0212\5T+\2\u020e"+ + "\u0212\5P)\2\u020f\u0212\5V,\2\u0210\u0212\5R*\2\u0211\u020d\3\2\2\2\u0211"+ + "\u020e\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0210\3\2\2\2\u0212A\3\2\2\2"+ + "\u0213\u0214\7q\2\2\u0214\u0215\7Z\2\2\u0215\u0216\7S\2\2\u0216\u0217"+ + "\5\u00fa~\2\u0217C\3\2\2\2\u0218\u0219\7q\2\2\u0219\u021a\7\21\2\2\u021a"+ + "\u021b\t\2\2\2\u021bE\3\2\2\2\u021c\u021d\7q\2\2\u021d\u021e\7Z\2\2\u021e"+ + "\u021f\7D\2\2\u021f\u0220\7K\2\2\u0220\u0221\t\3\2\2\u0221G\3\2\2\2\u0222"+ + "\u0227\7q\2\2\u0223\u0224\7\23\2\2\u0224\u0228\5J&\2\u0225\u0226\7Z\2"+ + "\2\u0226\u0228\7\23\2\2\u0227\u0223\3\2\2\2\u0227\u0225\3\2\2\2\u0228"+ + "\u022f\3\2\2\2\u0229\u022a\5L\'\2\u022a\u022b\7\6\2\2\u022b\u022c\5\u00fc"+ + "\177\2\u022c\u022e\3\2\2\2\u022d\u0229\3\2\2\2\u022e\u0231\3\2\2\2\u022f"+ + "\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230I\3\2\2\2\u0231\u022f\3\2\2\2"+ + "\u0232\u0235\7\u0091\2\2\u0233\u0235\5\u00fe\u0080\2\u0234\u0232\3\2\2"+ + "\2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0238\7\24\2\2\u0237"+ + "\u0234\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u023b\3\2\2\2\u0239\u023c\7\u0091"+ + "\2\2\u023a\u023c\5\u00fe\u0080\2\u023b\u0239\3\2\2\2\u023b\u023a\3\2\2"+ + "\2\u023cK\3\2\2\2\u023d\u023e\t\4\2\2\u023eM\3\2\2\2\u023f\u0240\7\37"+ + "\2\2\u0240\u0244\7\4\2\2\u0241\u0242\7\5\2\2\u0242\u0243\7\u0091\2\2\u0243"+ + "\u0245\7\6\2\2\u0244\u0241\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0246\3\2"+ + "\2\2\u0246\u0250\5\u00fa~\2\u0247\u0248\7I\2\2\u0248\u024d\5\u00fa~\2"+ + "\u0249\u024a\7\20\2\2\u024a\u024c\5\u00fa~\2\u024b\u0249\3\2\2\2\u024c"+ + "\u024f\3\2\2\2\u024d\u024b\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u0251\3\2"+ + "\2\2\u024f\u024d\3\2\2\2\u0250\u0247\3\2\2\2\u0250\u0251\3\2\2\2\u0251"+ + "O\3\2\2\2\u0252\u0253\7q\2\2\u0253\u0254\5\64\33\2\u0254\u0255\7t\2\2"+ + "\u0255\u0258\5\u00c2b\2\u0256\u0257\7H\2\2\u0257\u0259\5\u00e8u\2\u0258"+ + "\u0256\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u0261\3\2\2\2\u025a\u025b\7\b"+ + "\2\2\u025b\u0262\5`\61\2\u025c\u025f\7 \2\2\u025d\u025e\7\b\2\2\u025e"+ + "\u0260\5`\61\2\u025f\u025d\3\2\2\2\u025f\u0260\3\2\2\2\u0260\u0262\3\2"+ + "\2\2\u0261\u025a\3\2\2\2\u0261\u025c\3\2\2\2\u0262Q\3\2\2\2\u0263\u0264"+ + "\7q\2\2\u0264\u0265\7r\2\2\u0265\u0268\7s\2\2\u0266\u0267\7H\2\2\u0267"+ + "\u0269\5\u00e8u\2\u0268\u0266\3\2\2\2\u0268\u0269\3\2\2\2\u0269\u0271"+ + "\3\2\2\2\u026a\u026b\7\b\2\2\u026b\u0272\5`\61\2\u026c\u026f\7 \2\2\u026d"+ + "\u026e\7\b\2\2\u026e\u0270\5`\61\2\u026f\u026d\3\2\2\2\u026f\u0270\3\2"+ + "\2\2\u0270\u0272\3\2\2\2\u0271\u026a\3\2\2\2\u0271\u026c\3\2\2\2\u0272"+ + "S\3\2\2\2\u0273\u0274\7q\2\2\u0274\u0275\5\64\33\2\u0275\u0276\7!\2\2"+ + "\u0276\u0277\5J&\2\u0277\u0279\7\13\2\2\u0278\u027a\5Z.\2\u0279\u0278"+ + "\3\2\2\2\u0279\u027a\3\2\2\2\u027a\u027b\3\2\2\2\u027b\u027e\7\f\2\2\u027c"+ + "\u027d\7H\2\2\u027d\u027f\5\u00e8u\2\u027e\u027c\3\2\2\2\u027e\u027f\3"+ + "\2\2\2\u027f\u0285\3\2\2\2\u0280\u0281\7\t\2\2\u0281\u0282\5\22\n\2\u0282"+ + "\u0283\7\n\2\2\u0283\u0286\3\2\2\2\u0284\u0286\7 \2\2\u0285\u0280\3\2"+ + "\2\2\u0285\u0284\3\2\2\2\u0286U\3\2\2\2\u0287\u0288\7q\2\2\u0288\u0289"+ + "\7n\2\2\u0289\u028a\5J&\2\u028a\u028c\7H\2\2\u028b\u028d\5X-\2\u028c\u028b"+ + "\3\2\2\2\u028c\u028d\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u028f\5`\61\2\u028f"+ + "W\3\2\2\2\u0290\u0291\7\"\2\2\u0291\u0297\7#\2\2\u0292\u0293\7\"\2\2\u0293"+ + "\u0297\7$\2\2\u0294\u0295\7\u0080\2\2\u0295\u0297\7%\2\2\u0296\u0290\3"+ + "\2\2\2\u0296\u0292\3\2\2\2\u0296\u0294\3\2\2\2\u0297Y\3\2\2\2\u0298\u029d"+ + "\5\\/\2\u0299\u029a\7\20\2\2\u029a\u029c\5\\/\2\u029b\u0299\3\2\2\2\u029c"+ + "\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029e[\3\2\2\2"+ + "\u029f\u029d\3\2\2\2\u02a0\u02a1\7\7\2\2\u02a1\u02a4\5J&\2\u02a2\u02a3"+ + "\7H\2\2\u02a3\u02a5\5\u00e8u\2\u02a4\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2"+ + "\u02a5]\3\2\2\2\u02a6\u02ab\5`\61\2\u02a7\u02a8\7\20\2\2\u02a8\u02aa\5"+ + "`\61\2\u02a9\u02a7\3\2\2\2\u02aa\u02ad\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ab"+ + "\u02ac\3\2\2\2\u02ac_\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ae\u02b5\5b\62\2"+ + "\u02af\u02b5\5d\63\2\u02b0\u02b5\5~@\2\u02b1\u02b5\5\u0082B\2\u02b2\u02b5"+ + "\5\u0086D\2\u02b3\u02b5\5\u0088E\2\u02b4\u02ae\3\2\2\2\u02b4\u02af\3\2"+ + "\2\2\u02b4\u02b0\3\2\2\2\u02b4\u02b1\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4"+ + "\u02b3\3\2\2\2\u02b5a\3\2\2\2\u02b6\u02bf\5z>\2\u02b7\u02bf\5\u008cG\2"+ + "\u02b8\u02bf\5\u00d8m\2\u02b9\u02bf\5\u00dan\2\u02ba\u02bf\5\u00dco\2"+ + "\u02bb\u02bf\5\u00dep\2\u02bc\u02bf\5\u00e0q\2\u02bd\u02bf\5\u00e2r\2"+ + "\u02be\u02b6\3\2\2\2\u02be\u02b7\3\2\2\2\u02be\u02b8\3\2\2\2\u02be\u02b9"+ + "\3\2\2\2\u02be\u02ba\3\2\2\2\u02be\u02bb\3\2\2\2\u02be\u02bc\3\2\2\2\u02be"+ + "\u02bd\3\2\2\2\u02bfc\3\2\2\2\u02c0\u02c3\5f\64\2\u02c1\u02c3\5j\66\2"+ + "\u02c2\u02c0\3\2\2\2\u02c2\u02c1\3\2\2\2\u02c3\u02cc\3\2\2\2\u02c4\u02cb"+ + "\5f\64\2\u02c5\u02cb\5j\66\2\u02c6\u02cb\5n8\2\u02c7\u02cb\5p9\2\u02c8"+ + "\u02cb\5t;\2\u02c9\u02cb\5x=\2\u02ca\u02c4\3\2\2\2\u02ca\u02c5\3\2\2\2"+ + "\u02ca\u02c6\3\2\2\2\u02ca\u02c7\3\2\2\2\u02ca\u02c8\3\2\2\2\u02ca\u02c9"+ + "\3\2\2\2\u02cb\u02ce\3\2\2\2\u02cc\u02ca\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd"+ + "\u02cf\3\2\2\2\u02ce\u02cc\3\2\2\2\u02cf\u02d0\7E\2\2\u02d0\u02d1\5`\61"+ + "\2\u02d1e\3\2\2\2\u02d2\u02d3\7?\2\2\u02d3\u02d8\5h\65\2\u02d4\u02d5\7"+ + "\20\2\2\u02d5\u02d7\5h\65\2\u02d6\u02d4\3\2\2\2\u02d7\u02da\3\2\2\2\u02d8"+ + "\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9g\3\2\2\2\u02da\u02d8\3\2\2\2"+ + "\u02db\u02de\5\u00c2b\2\u02dc\u02dd\7H\2\2\u02dd\u02df\5\u00e8u\2\u02de"+ + "\u02dc\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e2\3\2\2\2\u02e0\u02e1\7J"+ + "\2\2\u02e1\u02e3\7K\2\2\u02e2\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3"+ + "\u02e6\3\2\2\2\u02e4\u02e5\7I\2\2\u02e5\u02e7\5\u00c2b\2\u02e6\u02e4\3"+ + "\2\2\2\u02e6\u02e7\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e8\u02e9\7G\2\2\u02e9"+ + "\u02ea\5`\61\2\u02eai\3\2\2\2\u02eb\u02ec\7@\2\2\u02ec\u02f1\5l\67\2\u02ed"+ + "\u02ee\7\20\2\2\u02ee\u02f0\5l\67\2\u02ef\u02ed\3\2\2\2\u02f0\u02f3\3"+ + "\2\2\2\u02f1\u02ef\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2k\3\2\2\2\u02f3\u02f1"+ + "\3\2\2\2\u02f4\u02f7\5\u00c2b\2\u02f5\u02f6\7H\2\2\u02f6\u02f8\5\u00e8"+ + "u\2\u02f7\u02f5\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8\u02f9\3\2\2\2\u02f9"+ + "\u02fa\7\b\2\2\u02fa\u02fb\5`\61\2\u02fbm\3\2\2\2\u02fc\u02fd\7A\2\2\u02fd"+ + "\u02fe\5`\61\2\u02feo\3\2\2\2\u02ff\u0300\7B\2\2\u0300\u0301\7C\2\2\u0301"+ + "\u0306\5r:\2\u0302\u0303\7\20\2\2\u0303\u0305\5r:\2\u0304\u0302\3\2\2"+ + "\2\u0305\u0308\3\2\2\2\u0306\u0304\3\2\2\2\u0306\u0307\3\2\2\2\u0307q"+ + "\3\2\2\2\u0308\u0306\3\2\2\2\u0309\u0310\5\u00c2b\2\u030a\u030b\7H\2\2"+ + "\u030b\u030d\5\u00e8u\2\u030c\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d"+ + "\u030e\3\2\2\2\u030e\u030f\7\b\2\2\u030f\u0311\5`\61\2\u0310\u030c\3\2"+ + "\2\2\u0310\u0311\3\2\2\2\u0311\u0314\3\2\2\2\u0312\u0313\7S\2\2\u0313"+ + "\u0315\5\u00fa~\2\u0314\u0312\3\2\2\2\u0314\u0315\3\2\2\2\u0315s\3\2\2"+ + "\2\u0316\u0317\7D\2\2\u0317\u031c\7C\2\2\u0318\u0319\7M\2\2\u0319\u031a"+ + "\7D\2\2\u031a\u031c\7C\2\2\u031b\u0316\3\2\2\2\u031b\u0318\3\2\2\2\u031c"+ + "\u031d\3\2\2\2\u031d\u0322\5v<\2\u031e\u031f\7\20\2\2\u031f\u0321\5v<"+ + "\2\u0320\u031e\3\2\2\2\u0321\u0324\3\2\2\2\u0322\u0320\3\2\2\2\u0322\u0323"+ + "\3\2\2\2\u0323u\3\2\2\2\u0324\u0322\3\2\2\2\u0325\u0328\5`\61\2\u0326"+ + "\u0329\7N\2\2\u0327\u0329\7O\2\2\u0328\u0326\3\2\2\2\u0328\u0327\3\2\2"+ + "\2\u0328\u0329\3\2\2\2\u0329\u032f\3\2\2\2\u032a\u032d\7K\2\2\u032b\u032e"+ + "\7T\2\2\u032c\u032e\7U\2\2\u032d\u032b\3\2\2\2\u032d\u032c\3\2\2\2\u032e"+ + "\u0330\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0333\3\2"+ + "\2\2\u0331\u0332\7S\2\2\u0332\u0334\5\u00fa~\2\u0333\u0331\3\2\2\2\u0333"+ + "\u0334\3\2\2\2\u0334w\3\2\2\2\u0335\u0336\7L\2\2\u0336\u0337\5\u00c2b"+ + "\2\u0337y\3\2\2\2\u0338\u033b\7P\2\2\u0339\u033b\7Q\2\2\u033a\u0338\3"+ + "\2\2\2\u033a\u0339\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u0341\5|?\2\u033d"+ + "\u033e\7\20\2\2\u033e\u0340\5|?\2\u033f\u033d\3\2\2\2\u0340\u0343\3\2"+ + "\2\2\u0341\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0344\3\2\2\2\u0343"+ + "\u0341\3\2\2\2\u0344\u0345\7R\2\2\u0345\u0346\5`\61\2\u0346{\3\2\2\2\u0347"+ + "\u034a\5\u00c2b\2\u0348\u0349\7H\2\2\u0349\u034b\5\u00e8u\2\u034a\u0348"+ + "\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u034d\7G\2\2\u034d"+ + "\u034e\5`\61\2\u034e}\3\2\2\2\u034f\u0350\7V\2\2\u0350\u0351\7\13\2\2"+ + "\u0351\u0352\5^\60\2\u0352\u0354\7\f\2\2\u0353\u0355\5\u0080A\2\u0354"+ + "\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356\u0354\3\2\2\2\u0356\u0357\3\2"+ + "\2\2\u0357\u0358\3\2\2\2\u0358\u0359\7Z\2\2\u0359\u035a\7E\2\2\u035a\u035b"+ + "\5`\61\2\u035b\177\3\2\2\2\u035c\u035d\7W\2\2\u035d\u035f\5`\61\2\u035e"+ + "\u035c\3\2\2\2\u035f\u0360\3\2\2\2\u0360\u035e\3\2\2\2\u0360\u0361\3\2"+ + "\2\2\u0361\u0362\3\2\2\2\u0362\u0363\7E\2\2\u0363\u0364\5`\61\2\u0364"+ + "\u0081\3\2\2\2\u0365\u0366\7]\2\2\u0366\u0367\7\13\2\2\u0367\u0368\5^"+ + "\60\2\u0368\u036a\7\f\2\2\u0369\u036b\5\u0084C\2\u036a\u0369\3\2\2\2\u036b"+ + "\u036c\3\2\2\2\u036c\u036a\3\2\2\2\u036c\u036d\3\2\2\2\u036d\u036e\3\2"+ + "\2\2\u036e\u0370\7Z\2\2\u036f\u0371\5\u00c2b\2\u0370\u036f\3\2\2\2\u0370"+ + "\u0371\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\7E\2\2\u0373\u0374\5`\61"+ + "\2\u0374\u0083\3\2\2\2\u0375\u0379\7W\2\2\u0376\u0377\5\u00c2b\2\u0377"+ + "\u0378\7H\2\2\u0378\u037a\3\2\2\2\u0379\u0376\3\2\2\2\u0379\u037a\3\2"+ + "\2\2\u037a\u037b\3\2\2\2\u037b\u0380\5\u00e8u\2\u037c\u037d\7\16\2\2\u037d"+ + "\u037f\5\u00e8u\2\u037e\u037c\3\2\2\2\u037f\u0382\3\2\2\2\u0380\u037e"+ + "\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0383\3\2\2\2\u0382\u0380\3\2\2\2\u0383"+ + "\u0384\7E\2\2\u0384\u0385\5`\61\2\u0385\u0085\3\2\2\2\u0386\u0387\7F\2"+ + "\2\u0387\u0388\7\13\2\2\u0388\u0389\5^\60\2\u0389\u038a\7\f\2\2\u038a"+ + "\u038b\7[\2\2\u038b\u038c\5`\61\2\u038c\u038d\7\\\2\2\u038d\u038e\5`\61"+ + "\2\u038e\u0087\3\2\2\2\u038f\u0390\7X\2\2\u0390\u0391\7\t\2\2\u0391\u0392"+ + "\5^\60\2\u0392\u0394\7\n\2\2\u0393\u0395\5\u008aF\2\u0394\u0393\3\2\2"+ + "\2\u0395\u0396\3\2\2\2\u0396\u0394\3\2\2\2\u0396\u0397\3\2\2\2\u0397\u0089"+ + "\3\2\2\2\u0398\u039b\7Y\2\2\u0399\u039c\7\r\2\2\u039a\u039c\5J&\2\u039b"+ + "\u0399\3\2\2\2\u039b\u039a\3\2\2\2\u039c\u03a4\3\2\2\2\u039d\u03a0\7\16"+ + "\2\2\u039e\u03a1\7\r\2\2\u039f\u03a1\5J&\2\u03a0\u039e\3\2\2\2\u03a0\u039f"+ + "\3\2\2\2\u03a1\u03a3\3\2\2\2\u03a2\u039d\3\2\2\2\u03a3\u03a6\3\2\2\2\u03a4"+ + "\u03a2\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5\u03a7\3\2\2\2\u03a6\u03a4\3\2"+ + "\2\2\u03a7\u03a8\7\t\2\2\u03a8\u03a9\5^\60\2\u03a9\u03aa\7\n\2\2\u03aa"+ + "\u008b\3\2\2\2\u03ab\u03b0\5\u008eH\2\u03ac\u03ad\7^\2\2\u03ad\u03af\5"+ + "\u008eH\2\u03ae\u03ac\3\2\2\2\u03af\u03b2\3\2\2\2\u03b0\u03ae\3\2\2\2"+ + "\u03b0\u03b1\3\2\2\2\u03b1\u008d\3\2\2\2\u03b2\u03b0\3\2\2\2\u03b3\u03b8"+ + "\5\u0090I\2\u03b4\u03b5\7_\2\2\u03b5\u03b7\5\u0090I\2\u03b6\u03b4\3\2"+ + "\2\2\u03b7\u03ba\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b8\u03b9\3\2\2\2\u03b9"+ + "\u008f\3\2\2\2\u03ba\u03b8\3\2\2\2\u03bb\u03bd\7`\2\2\u03bc\u03bb\3\2"+ + "\2\2\u03bc\u03bd\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u03bf\5\u0092J\2\u03bf"+ + "\u0091\3\2\2\2\u03c0\u03c3\5\u0094K\2\u03c1\u03c2\t\5\2\2\u03c2\u03c4"+ + "\5\u0094K\2\u03c3\u03c1\3\2\2\2\u03c3\u03c4\3\2\2\2\u03c4\u0093\3\2\2"+ + "\2\u03c5\u03ca\5\u0096L\2\u03c6\u03c7\7\61\2\2\u03c7\u03c9\5\u0096L\2"+ + "\u03c8\u03c6\3\2\2\2\u03c9\u03cc\3\2\2\2\u03ca\u03c8\3\2\2\2\u03ca\u03cb"+ + "\3\2\2\2\u03cb\u0095\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u03d0\5\u0098M"+ + "\2\u03ce\u03cf\7a\2\2\u03cf\u03d1\5\u0098M\2\u03d0\u03ce\3\2\2\2\u03d0"+ + "\u03d1\3\2\2\2\u03d1\u0097\3\2\2\2\u03d2\u03d7\5\u009aN\2\u03d3\u03d4"+ + "\t\6\2\2\u03d4\u03d6\5\u009aN\2\u03d5\u03d3\3\2\2\2\u03d6\u03d9\3\2\2"+ + "\2\u03d7\u03d5\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u0099\3\2\2\2\u03d9\u03d7"+ + "\3\2\2\2\u03da\u03df\5\u009cO\2\u03db\u03dc\t\7\2\2\u03dc\u03de\5\u009c"+ + "O\2\u03dd\u03db\3\2\2\2\u03de\u03e1\3\2\2\2\u03df\u03dd\3\2\2\2\u03df"+ + "\u03e0\3\2\2\2\u03e0\u009b\3\2\2\2\u03e1\u03df\3\2\2\2\u03e2\u03e6\5\u009e"+ + "P\2\u03e3\u03e4\7b\2\2\u03e4\u03e5\7c\2\2\u03e5\u03e7\5\u00e8u\2\u03e6"+ + "\u03e3\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u009d\3\2\2\2\u03e8\u03ec\5\u00a0"+ + "Q\2\u03e9\u03ea\7e\2\2\u03ea\u03eb\7d\2\2\u03eb\u03ed\5\u00e8u\2\u03ec"+ + "\u03e9\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009f\3\2\2\2\u03ee\u03f2\5\u00a2"+ + "R\2\u03ef\u03f0\7f\2\2\u03f0\u03f1\7H\2\2\u03f1\u03f3\5\u00e8u\2\u03f2"+ + "\u03ef\3\2\2\2\u03f2\u03f3\3\2\2\2\u03f3\u00a1\3\2\2\2\u03f4\u03f8\5\u00a4"+ + "S\2\u03f5\u03f6\7h\2\2\u03f6\u03f7\7H\2\2\u03f7\u03f9\5\u00f4{\2\u03f8"+ + "\u03f5\3\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u00a3\3\2\2\2\u03fa\u03fe\5\u00a6"+ + "T\2\u03fb\u03fc\7g\2\2\u03fc\u03fd\7H\2\2\u03fd\u03ff\5\u00f4{\2\u03fe"+ + "\u03fb\3\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u00a5\3\2\2\2\u0400\u0409\5\u00aa"+ + "V\2\u0401\u0402\7\6\2\2\u0402\u0403\7/\2\2\u0403\u0404\3\2\2\2\u0404\u0405"+ + "\5\u00a8U\2\u0405\u0406\5\u00ceh\2\u0406\u0408\3\2\2\2\u0407\u0401\3\2"+ + "\2\2\u0408\u040b\3\2\2\2\u0409\u0407\3\2\2\2\u0409\u040a\3\2\2\2\u040a"+ + "\u00a7\3\2\2\2\u040b\u0409\3\2\2\2\u040c\u0410\5J&\2\u040d\u0410\5\u00c2"+ + "b\2\u040e\u0410\5\u00c4c\2\u040f\u040c\3\2\2\2\u040f\u040d\3\2\2\2\u040f"+ + "\u040e\3\2\2\2\u0410\u00a9\3\2\2\2\u0411\u0413\t\6\2\2\u0412\u0411\3\2"+ + "\2\2\u0413\u0416\3\2\2\2\u0414\u0412\3\2\2\2\u0414\u0415\3\2\2\2\u0415"+ + "\u0417\3\2\2\2\u0416\u0414\3\2\2\2\u0417\u0418\5\u00acW\2\u0418\u00ab"+ + "\3\2\2\2\u0419\u041d\5\u00b2Z\2\u041a\u041d\5\u00aeX\2\u041b\u041d\5\u00b0"+ + "Y\2\u041c\u0419\3\2\2\2\u041c\u041a\3\2\2\2\u041c\u041b\3\2\2\2\u041d"+ + "\u00ad\3\2\2\2\u041e\u041f\7o\2\2\u041f\u0420\7n\2\2\u0420\u0421\5\u00e8"+ + "u\2\u0421\u0422\7\t\2\2\u0422\u0423\5^\60\2\u0423\u0424\7\n\2\2\u0424"+ + "\u00af\3\2\2\2\u0425\u0426\7p\2\2\u0426\u0427\7n\2\2\u0427\u0428\5\u00e8"+ + "u\2\u0428\u0429\7\t\2\2\u0429\u042a\5^\60\2\u042a\u042b\7\n\2\2\u042b"+ + "\u00b1\3\2\2\2\u042c\u0431\5\u00b4[\2\u042d\u042e\7\67\2\2\u042e\u0430"+ + "\5\u00b4[\2\u042f\u042d\3\2\2\2\u0430\u0433\3\2\2\2\u0431\u042f\3\2\2"+ + "\2\u0431\u0432\3\2\2\2\u0432\u00b3\3\2\2\2\u0433\u0431\3\2\2\2\u0434\u043c"+ + "\5\u00be`\2\u0435\u043b\5\u00b6\\\2\u0436\u043b\5\u00ba^\2\u0437\u043b"+ + "\5\u00bc_\2\u0438\u043b\5\u00b8]\2\u0439\u043b\5\u00ceh\2\u043a\u0435"+ + "\3\2\2\2\u043a\u0436\3\2\2\2\u043a\u0437\3\2\2\2\u043a\u0438\3\2\2\2\u043a"+ + "\u0439\3\2\2\2\u043b\u043e\3\2\2\2\u043c\u043a\3\2\2\2\u043c\u043d\3\2"+ + "\2\2\u043d\u00b5\3\2\2\2\u043e\u043c\3\2\2\2\u043f\u0440\78\2\2\u0440"+ + "\u0441\78\2\2\u0441\u0442\5^\60\2\u0442\u0443\79\2\2\u0443\u0444\79\2"+ + "\2\u0444\u00b7\3\2\2\2\u0445\u0446\78\2\2\u0446\u0447\79\2\2\u0447\u00b9"+ + "\3\2\2\2\u0448\u0449\78\2\2\u0449\u044a\5^\60\2\u044a\u044b\79\2\2\u044b"+ + "\u00bb\3\2\2\2\u044c\u0453\7:\2\2\u044d\u0454\5\u00fe\u0080\2\u044e\u0454"+ + "\5\u00fc\177\2\u044f\u0454\7\u0091\2\2\u0450\u0454\5\u00c4c\2\u0451\u0454"+ + "\5\u00c2b\2\u0452\u0454\5\u00c6d\2\u0453\u044d\3\2\2\2\u0453\u044e\3\2"+ + "\2\2\u0453\u044f\3\2\2\2\u0453\u0450\3\2\2\2\u0453\u0451\3\2\2\2\u0453"+ + "\u0452\3\2\2\2\u0454\u00bd\3\2\2\2\u0455\u0465\7\u008a\2\2\u0456\u0465"+ + "\7l\2\2\u0457\u0465\7m\2\2\u0458\u0465\7\u008b\2\2\u0459\u0465\5\u00fc"+ + "\177\2\u045a\u0465\5\u00c2b\2\u045b\u0465\5\u00c4c\2\u045c\u0465\5\u00c6"+ + "d\2\u045d\u0465\5\u00eav\2\u045e\u0465\5\u00ccg\2\u045f\u0465\5\u00c8"+ + "e\2\u0460\u0465\5\u00caf\2\u0461\u0465\5\u00f8}\2\u0462\u0465\5\u00d2"+ + "j\2\u0463\u0465\5\u00c0a\2\u0464\u0455\3\2\2\2\u0464\u0456\3\2\2\2\u0464"+ + "\u0457\3\2\2\2\u0464\u0458\3\2\2\2\u0464\u0459\3\2\2\2\u0464\u045a\3\2"+ + "\2\2\u0464\u045b\3\2\2\2\u0464\u045c\3\2\2\2\u0464\u045d\3\2\2\2\u0464"+ + "\u045e\3\2\2\2\u0464\u045f\3\2\2\2\u0464\u0460\3\2\2\2\u0464\u0461\3\2"+ + "\2\2\u0464\u0462\3\2\2\2\u0464\u0463\3\2\2\2\u0465\u00bf\3\2\2\2\u0466"+ + "\u0467\7\t\2\2\u0467\u0468\5\20\t\2\u0468\u0469\7\n\2\2\u0469\u00c1\3"+ + "\2\2\2\u046a\u046b\7\7\2\2\u046b\u046c\5J&\2\u046c\u00c3\3\2\2\2\u046d"+ + "\u046f\7\13\2\2\u046e\u0470\5^\60\2\u046f\u046e\3\2\2\2\u046f\u0470\3"+ + "\2\2\2\u0470\u0471\3\2\2\2\u0471\u0472\7\f\2\2\u0472\u00c5\3\2\2\2\u0473"+ + "\u0474\7;\2\2\u0474\u00c7\3\2\2\2\u0475\u0476\7\22\2\2\u0476\u0477\7\t"+ + "\2\2\u0477\u0478\5^\60\2\u0478\u0479\7\n\2\2\u0479\u00c9\3\2\2\2\u047a"+ + "\u047b\7k\2\2\u047b\u047c\7\t\2\2\u047c\u047d\5^\60\2\u047d\u047e\7\n"+ + "\2\2\u047e\u00cb\3\2\2\2\u047f\u0480\5J&\2\u0480\u0481\5\u00ceh\2\u0481"+ + "\u00cd\3\2\2\2\u0482\u0489\7\13\2\2\u0483\u0485\5\u00d0i\2\u0484\u0486"+ + "\7\20\2\2\u0485\u0484\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0488\3\2\2\2"+ + "\u0487\u0483\3\2\2\2\u0488\u048b\3\2\2\2\u0489\u0487\3\2\2\2\u0489\u048a"+ + "\3\2\2\2\u048a\u048c\3\2\2\2\u048b\u0489\3\2\2\2\u048c\u048d\7\f\2\2\u048d"+ + "\u00cf\3\2\2\2\u048e\u0491\5`\61\2\u048f\u0491\7\u0089\2\2\u0490\u048e"+ + "\3\2\2\2\u0490\u048f\3\2\2\2\u0491\u00d1\3\2\2\2\u0492\u0495\5\u00d4k"+ + "\2\u0493\u0495\5\u00d6l\2\u0494\u0492\3\2\2\2\u0494\u0493\3\2\2\2\u0495"+ + "\u00d3\3\2\2\2\u0496\u0497\5J&\2\u0497\u0498\7<\2\2\u0498\u0499\7\u008b"+ + "\2\2\u0499\u00d5\3\2\2\2\u049a\u049b\5\64\33\2\u049b\u049c\7!\2\2\u049c"+ + "\u049e\7\13\2\2\u049d\u049f\5Z.\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2"+ + "\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a3\7\f\2\2\u04a1\u04a2\7H\2\2\u04a2"+ + "\u04a4\5\u00e8u\2\u04a3\u04a1\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a5"+ + "\3\2\2\2\u04a5\u04a6\7\t\2\2\u04a6\u04a7\5\22\n\2\u04a7\u04a8\7\n\2\2"+ + "\u04a8\u00d7\3\2\2\2\u04a9\u04aa\7u\2\2\u04aa\u04ab\7\u0080\2\2\u04ab"+ + "\u04ac\5`\61\2\u04ac\u04ad\7|\2\2\u04ad\u04b1\5`\61\2\u04ae\u04af\7I\2"+ + "\2\u04af\u04b0\7\177\2\2\u04b0\u04b2\5`\61\2\u04b1\u04ae\3\2\2\2\u04b1"+ + "\u04b2\3\2\2\2\u04b2\u04c1\3\2\2\2\u04b3\u04b4\7u\2\2\u04b4\u04b5\7\u0080"+ + "\2\2\u04b5\u04ba\5\u00f6|\2\u04b6\u04b7\7\20\2\2\u04b7\u04b9\5\u00f6|"+ + "\2\u04b8\u04b6\3\2\2\2\u04b9\u04bc\3\2\2\2\u04ba\u04b8\3\2\2\2\u04ba\u04bb"+ + "\3\2\2\2\u04bb\u04bd\3\2\2\2\u04bc\u04ba\3\2\2\2\u04bd\u04be\7|\2\2\u04be"+ + "\u04bf\5`\61\2\u04bf\u04c1\3\2\2\2\u04c0\u04a9\3\2\2\2\u04c0\u04b3\3\2"+ + "\2\2\u04c1\u00d9\3\2\2\2\u04c2\u04c3\7v\2\2\u04c3\u04c4\7\u0080\2\2\u04c4"+ + "\u04c5\5\u00e4s\2\u04c5\u00db\3\2\2\2\u04c6\u04c7\7w\2\2\u04c7\u04c8\7"+ + "\u0080\2\2\u04c8\u04c9\5\u00e4s\2\u04c9\u04ca\7H\2\2\u04ca\u04cb\5`\61"+ + "\2\u04cb\u00dd\3\2\2\2\u04cc\u04cd\7x\2\2\u04cd\u04ce\7}\2\2\u04ce\u04cf"+ + "\7c\2\2\u04cf\u04d0\7\u0080\2\2\u04d0\u04d1\5\u00e4s\2\u04d1\u04d2\7~"+ + "\2\2\u04d2\u04d3\5`\61\2\u04d3\u00df\3\2\2\2\u04d4\u04d5\7y\2\2\u04d5"+ + "\u04da\5\u00e6t\2\u04d6\u04d7\7\20\2\2\u04d7\u04d9\5\u00e6t\2\u04d8\u04d6"+ + "\3\2\2\2\u04d9\u04dc\3\2\2\2\u04da\u04d8\3\2\2\2\u04da\u04db\3\2\2\2\u04db"+ + "\u04dd\3\2\2\2\u04dc\u04da\3\2\2\2\u04dd\u04de\7z\2\2\u04de\u04df\5`\61"+ + "\2\u04df\u04e0\7E\2\2\u04e0\u04e1\5`\61\2\u04e1\u00e1\3\2\2\2\u04e2\u04e3"+ + "\7{\2\2\u04e3\u04e4\7\u0080\2\2\u04e4\u04e5\5`\61\2\u04e5\u04e6\7|\2\2"+ + "\u04e6\u04e7\5`\61\2\u04e7\u00e3\3\2\2\2\u04e8\u04eb\5\u00be`\2\u04e9"+ + "\u04ec\5\u00b6\\\2\u04ea\u04ec\5\u00bc_\2\u04eb\u04e9\3\2\2\2\u04eb\u04ea"+ + "\3\2\2\2\u04ec\u04ed\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ed\u04ee\3\2\2\2\u04ee"+ + "\u00e5\3\2\2\2\u04ef\u04f0\5\u00c2b\2\u04f0\u04f1\7\b\2\2\u04f1\u04f2"+ + "\5`\61\2\u04f2\u00e7\3\2\2\2\u04f3\u04f4\7\13\2\2\u04f4\u04fc\7\f\2\2"+ + "\u04f5\u04f9\5\u00ecw\2\u04f6\u04fa\7\u0089\2\2\u04f7\u04fa\7\r\2\2\u04f8"+ + "\u04fa\7\62\2\2\u04f9\u04f6\3\2\2\2\u04f9\u04f7\3\2\2\2\u04f9\u04f8\3"+ + "\2\2\2\u04f9\u04fa\3\2\2\2\u04fa\u04fc\3\2\2\2\u04fb\u04f3\3\2\2\2\u04fb"+ + "\u04f5\3\2\2\2\u04fc\u00e9\3\2\2\2\u04fd\u0506\7\t\2\2\u04fe\u0503\5\u00f6"+ + "|\2\u04ff\u0500\7\20\2\2\u0500\u0502\5\u00f6|\2\u0501\u04ff\3\2\2\2\u0502"+ + "\u0505\3\2\2\2\u0503\u0501\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0507\3\2"+ + "\2\2\u0505\u0503\3\2\2\2\u0506\u04fe\3\2\2\2\u0506\u0507\3\2\2\2\u0507"+ + "\u0508\3\2\2\2\u0508\u050e\7\n\2\2\u0509\u050a\7=\2\2\u050a\u050b\5^\60"+ + "\2\u050b\u050c\7>\2\2\u050c\u050e\3\2\2\2\u050d\u04fd\3\2\2\2\u050d\u0509"+ + "\3\2\2\2\u050e\u00eb\3\2\2\2\u050f\u0513\5J&\2\u0510\u0513\7\u008a\2\2"+ + "\u0511\u0513\5\u00eex\2\u0512\u050f\3\2\2\2\u0512\u0510\3\2\2\2\u0512"+ + "\u0511\3\2\2\2\u0513\u00ed\3\2\2\2\u0514\u0517\5\u00f0y\2\u0515\u0517"+ + "\5\u00f2z\2\u0516\u0514\3\2\2\2\u0516\u0515\3\2\2\2\u0517\u00ef\3\2\2"+ + "\2\u0518\u0519\7!\2\2\u0519\u051a\7\13\2\2\u051a\u051b\7\r\2\2\u051b\u051c"+ + "\7\f\2\2\u051c\u00f1\3\2\2\2\u051d\u051e\7!\2\2\u051e\u0527\7\13\2\2\u051f"+ + "\u0524\5\u00e8u\2\u0520\u0521\7\20\2\2\u0521\u0523\5\u00e8u\2\u0522\u0520"+ + "\3\2\2\2\u0523\u0526\3\2\2\2\u0524\u0522\3\2\2\2\u0524\u0525\3\2\2\2\u0525"+ + "\u0528\3\2\2\2\u0526\u0524\3\2\2\2\u0527\u051f\3\2\2\2\u0527\u0528\3\2"+ + "\2\2\u0528\u0529\3\2\2\2\u0529\u052a\7\f\2\2\u052a\u052b\7H\2\2\u052b"+ + "\u052c\5\u00e8u\2\u052c\u00f3\3\2\2\2\u052d\u052f\5\u00ecw\2\u052e\u0530"+ + "\7\u0089\2\2\u052f\u052e\3\2\2\2\u052f\u0530\3\2\2\2\u0530\u00f5\3\2\2"+ + "\2\u0531\u0534\5`\61\2\u0532\u0534\7\u0091\2\2\u0533\u0531\3\2\2\2\u0533"+ + "\u0532\3\2\2\2\u0534\u0535\3\2\2\2\u0535\u0536\t\b\2\2\u0536\u0537\5`"+ + "\61\2\u0537\u00f7\3\2\2\2\u0538\u053a\78\2\2\u0539\u053b\5^\60\2\u053a"+ + "\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u053c\3\2\2\2\u053c\u053d\79"+ + "\2\2\u053d\u00f9\3\2\2\2\u053e\u053f\5\u00fc\177\2\u053f\u00fb\3\2\2\2"+ + "\u0540\u0541\7\u0088\2\2\u0541\u00fd\3\2\2\2\u0542\u0543\t\t\2\2\u0543"+ + "\u00ff\3\2\2\2\u0087\u0108\u010c\u011c\u0122\u012a\u0132\u013a\u0149\u0167"+ + "\u016f\u0171\u0187\u0191\u019b\u01a0\u01a5\u01a9\u01b5\u01b9\u01c2\u01c9"+ + "\u01d7\u01db\u01de\u01e3\u01ed\u01f5\u01f9\u0205\u0211\u0227\u022f\u0234"+ + "\u0237\u023b\u0244\u024d\u0250\u0258\u025f\u0261\u0268\u026f\u0271\u0279"+ + "\u027e\u0285\u028c\u0296\u029d\u02a4\u02ab\u02b4\u02be\u02c2\u02ca\u02cc"+ + "\u02d8\u02de\u02e2\u02e6\u02f1\u02f7\u0306\u030c\u0310\u0314\u031b\u0322"+ + "\u0328\u032d\u032f\u0333\u033a\u0341\u034a\u0356\u0360\u036c\u0370\u0379"+ + "\u0380\u0396\u039b\u03a0\u03a4\u03b0\u03b8\u03bc\u03c3\u03ca\u03d0\u03d7"+ + "\u03df\u03e6\u03ec\u03f2\u03f8\u03fe\u0409\u040f\u0414\u041c\u0431\u043a"+ + "\u043c\u0453\u0464\u046f\u0485\u0489\u0490\u0494\u049e\u04a3\u04b1\u04ba"+ + "\u04c0\u04da\u04eb\u04ed\u04f9\u04fb\u0503\u0506\u050d\u0512\u0516\u0524"+ + "\u0527\u052f\u0533\u053a"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/XQueryLexer.interp b/src/main/java/org/rumbledb/parser/XQueryLexer.interp new file mode 100644 index 0000000000..f2c9eb2158 --- /dev/null +++ b/src/main/java/org/rumbledb/parser/XQueryLexer.interp @@ -0,0 +1,1035 @@ +token literal names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +EscapeQuot +EscapeApos +DOUBLE_LBRACE +DOUBLE_RBRACE +IntegerLiteral +DecimalLiteral +DoubleLiteral +DFPropertyName +PredefinedEntityRef +CharRef +Quot +Apos +COMMENT +XMLDECL +PI +CDATA +PRAGMA +WS +EQUAL +NOT_EQUAL +LPAREN +RPAREN +LBRACKET +RBRACKET +LBRACE +RBRACE +STAR +PLUS +MINUS +COMMA +DOT +DDOT +COLON +COLON_EQ +SEMICOLON +SLASH +DSLASH +BACKSLASH +VBAR +LANGLE +RANGLE +QUESTION +AT +DOLLAR +MOD +BANG +HASH +CARAT +ARROW +GRAVE +CONCATENATION +TILDE +KW_ALLOWING +KW_ANCESTOR +KW_ANCESTOR_OR_SELF +KW_AND +KW_ARRAY +KW_AS +KW_ASCENDING +KW_AT +KW_ATTRIBUTE +KW_BASE_URI +KW_BOUNDARY_SPACE +KW_BINARY +KW_BY +KW_CASE +KW_CAST +KW_CASTABLE +KW_CATCH +KW_CHILD +KW_COLLATION +KW_COMMENT +KW_CONSTRUCTION +KW_CONTEXT +KW_COPY_NS +KW_COUNT +KW_DECLARE +KW_DEFAULT +KW_DESCENDANT +KW_DESCENDANT_OR_SELF +KW_DESCENDING +KW_DECIMAL_FORMAT +KW_DIV +KW_DOCUMENT +KW_DOCUMENT_NODE +KW_ELEMENT +KW_ELSE +KW_EMPTY +KW_EMPTY_SEQUENCE +KW_ENCODING +KW_END +KW_EQ +KW_EVERY +KW_EXCEPT +KW_EXTERNAL +KW_FOLLOWING +KW_FOLLOWING_SIBLING +KW_FOR +KW_FUNCTION +KW_GE +KW_GREATEST +KW_GROUP +KW_GT +KW_IDIV +KW_IF +KW_IMPORT +KW_IN +KW_INHERIT +KW_INSTANCE +KW_INTERSECT +KW_IS +KW_ITEM +KW_LAX +KW_LE +KW_LEAST +KW_LET +KW_LT +KW_MAP +KW_MOD +KW_MODULE +KW_NAMESPACE +KW_NE +KW_NEXT +KW_NAMESPACE_NODE +KW_NO_INHERIT +KW_NO_PRESERVE +KW_NODE +KW_OF +KW_ONLY +KW_OPTION +KW_OR +KW_ORDER +KW_ORDERED +KW_ORDERING +KW_PARENT +KW_PRECEDING +KW_PRECEDING_SIBLING +KW_PRESERVE +KW_PREVIOUS +KW_PI +KW_RETURN +KW_SATISFIES +KW_SCHEMA +KW_SCHEMA_ATTR +KW_SCHEMA_ELEM +KW_SELF +KW_SLIDING +KW_SOME +KW_STABLE +KW_START +KW_STRICT +KW_STRIP +KW_SWITCH +KW_TEXT +KW_THEN +KW_TO +KW_TREAT +KW_TRY +KW_TUMBLING +KW_TYPE +KW_TYPESWITCH +KW_UNION +KW_UNORDERED +KW_UPDATE +KW_VALIDATE +KW_VARIABLE +KW_VERSION +KW_WHEN +KW_WHERE +KW_WINDOW +KW_XQUERY +KW_ARRAY_NODE +KW_BOOLEAN_NODE +KW_NULL_NODE +KW_NUMBER_NODE +KW_OBJECT_NODE +KW_REPLACE +KW_WITH +KW_VALUE +KW_INSERT +KW_INTO +KW_DELETE +KW_RENAME +URIQualifiedName +FullQName +NCNameWithLocalWildcard +NCNameWithPrefixWildcard +NCName +XQDOC_COMMENT_START +XQDOC_COMMENT_END +XQDocComment +XQComment +CHAR +ENTER_STRING +EXIT_INTERPOLATION +ContentChar +BASIC_CHAR +ENTER_INTERPOLATION +EXIT_STRING +EscapeQuot_QuotString +DOUBLE_LBRACE_QuotString +DOUBLE_RBRACE_QuotString +EscapeApos_AposString + +rule names: +IntegerLiteral +DecimalLiteral +DoubleLiteral +DFPropertyName +Digits +PredefinedEntityRef +CharRef +Quot +Apos +COMMENT +XMLDECL +PI +CDATA +PRAGMA +WS +EQUAL +NOT_EQUAL +LPAREN +RPAREN +LBRACKET +RBRACKET +LBRACE +RBRACE +STAR +PLUS +MINUS +COMMA +DOT +DDOT +COLON +COLON_EQ +SEMICOLON +SLASH +DSLASH +BACKSLASH +VBAR +LANGLE +RANGLE +QUESTION +AT +DOLLAR +MOD +BANG +HASH +CARAT +ARROW +GRAVE +CONCATENATION +TILDE +KW_ALLOWING +KW_ANCESTOR +KW_ANCESTOR_OR_SELF +KW_AND +KW_ARRAY +KW_AS +KW_ASCENDING +KW_AT +KW_ATTRIBUTE +KW_BASE_URI +KW_BOUNDARY_SPACE +KW_BINARY +KW_BY +KW_CASE +KW_CAST +KW_CASTABLE +KW_CATCH +KW_CHILD +KW_COLLATION +KW_COMMENT +KW_CONSTRUCTION +KW_CONTEXT +KW_COPY_NS +KW_COUNT +KW_DECLARE +KW_DEFAULT +KW_DESCENDANT +KW_DESCENDANT_OR_SELF +KW_DESCENDING +KW_DECIMAL_FORMAT +KW_DIV +KW_DOCUMENT +KW_DOCUMENT_NODE +KW_ELEMENT +KW_ELSE +KW_EMPTY +KW_EMPTY_SEQUENCE +KW_ENCODING +KW_END +KW_EQ +KW_EVERY +KW_EXCEPT +KW_EXTERNAL +KW_FOLLOWING +KW_FOLLOWING_SIBLING +KW_FOR +KW_FUNCTION +KW_GE +KW_GREATEST +KW_GROUP +KW_GT +KW_IDIV +KW_IF +KW_IMPORT +KW_IN +KW_INHERIT +KW_INSTANCE +KW_INTERSECT +KW_IS +KW_ITEM +KW_LAX +KW_LE +KW_LEAST +KW_LET +KW_LT +KW_MAP +KW_MOD +KW_MODULE +KW_NAMESPACE +KW_NE +KW_NEXT +KW_NAMESPACE_NODE +KW_NO_INHERIT +KW_NO_PRESERVE +KW_NODE +KW_OF +KW_ONLY +KW_OPTION +KW_OR +KW_ORDER +KW_ORDERED +KW_ORDERING +KW_PARENT +KW_PRECEDING +KW_PRECEDING_SIBLING +KW_PRESERVE +KW_PREVIOUS +KW_PI +KW_RETURN +KW_SATISFIES +KW_SCHEMA +KW_SCHEMA_ATTR +KW_SCHEMA_ELEM +KW_SELF +KW_SLIDING +KW_SOME +KW_STABLE +KW_START +KW_STRICT +KW_STRIP +KW_SWITCH +KW_TEXT +KW_THEN +KW_TO +KW_TREAT +KW_TRY +KW_TUMBLING +KW_TYPE +KW_TYPESWITCH +KW_UNION +KW_UNORDERED +KW_UPDATE +KW_VALIDATE +KW_VARIABLE +KW_VERSION +KW_WHEN +KW_WHERE +KW_WINDOW +KW_XQUERY +KW_ARRAY_NODE +KW_BOOLEAN_NODE +KW_NULL_NODE +KW_NUMBER_NODE +KW_OBJECT_NODE +KW_REPLACE +KW_WITH +KW_VALUE +KW_INSERT +KW_INTO +KW_DELETE +KW_RENAME +URIQualifiedName +FullQName +NCNameWithLocalWildcard +NCNameWithPrefixWildcard +NCName +NameStartChar +NameChar +XQDOC_COMMENT_START +XQDOC_COMMENT_END +XQDocComment +XQComment +CHAR +ENTER_STRING +EXIT_INTERPOLATION +ContentChar +BASIC_CHAR +GRAVE_STRING +RBRACKET_STRING +LBRACE_STRING +ENTER_INTERPOLATION +EXIT_STRING +EscapeQuot_QuotString +Quot_QuotString +DOUBLE_LBRACE_QuotString +DOUBLE_RBRACE_QuotString +LBRACE_QuotString +RBRACE_QuotString +PredefinedEntityRef_QuotString +CharRef_QuotString +ContentChar_QuotString +EscapeApos_AposString +Apos_AposString +DOUBLE_LBRACE_AposString +DOUBLE_RBRACE_AposString +LBRACE_AposString +RBRACE_AposString +PredefinedEntityRef_AposString +CharRef_AposString +ContentChar_AposString +INT_QUOT_IntegerLiteral +INT_QUOT_DecimalLiteral +INT_QUOT_DoubleLiteral +INT_QUOT_DFPropertyName +INT_QUOT_PredefinedEntityRef +INT_QUOT_CharRef +INT_QUOT_EscapeQuot +INT_QUOT_Apos +INT_QUOT_Quot +INT_QUOT_COMMENT +INT_QUOT_XMLDECL +INT_QUOT_PI +INT_QUOT_CDATA +INT_QUOT_PRAGMA +INT_QUOT_WS +INT_QUOT_EQUAL +INT_QUOT_NOT_EQUAL +INT_QUOT_LPAREN +INT_QUOT_RPAREN +INT_QUOT_LBRACKET +INT_QUOT_RBRACKET +INT_QUOT_LBRACE +INT_QUOT_RBRACE_EXIT +INT_QUOT_RBRACE +INT_QUOT_STAR +INT_QUOT_PLUS +INT_QUOT_MINUS +INT_QUOT_COMMA +INT_QUOT_DOT +INT_QUOT_DDOT +INT_QUOT_COLON +INT_QUOT_COLON_EQ +INT_QUOT_SEMICOLON +INT_QUOT_SLASH +INT_QUOT_DSLASH +INT_QUOT_BACKSLASH +INT_QUOT_VBAR +INT_QUOT_LANGLE +INT_QUOT_RANGLE +INT_QUOT_QUESTION +INT_QUOT_AT +INT_QUOT_DOLLAR +INT_QUOT_MOD +INT_QUOT_BANG +INT_QUOT_HASH +INT_QUOT_CARAT +INT_QUOT_ARROW +INT_QUOT_GRAVE +INT_QUOT_CONCATENATION +INT_QUOT_TILDE +INT_QUOT_KW_ALLOWING +INT_QUOT_KW_ANCESTOR +INT_QUOT_KW_ANCESTOR_OR_SELF +INT_QUOT_KW_AND +INT_QUOT_KW_ARRAY +INT_QUOT_KW_AS +INT_QUOT_KW_ASCENDING +INT_QUOT_KW_AT +INT_QUOT_KW_ATTRIBUTE +INT_QUOT_KW_BASE_URI +INT_QUOT_KW_BOUNDARY_SPACE +INT_QUOT_KW_BINARY +INT_QUOT_KW_BY +INT_QUOT_KW_CASE +INT_QUOT_KW_CAST +INT_QUOT_KW_CASTABLE +INT_QUOT_KW_CATCH +INT_QUOT_KW_CHILD +INT_QUOT_KW_COLLATION +INT_QUOT_KW_COMMENT +INT_QUOT_KW_CONSTRUCTION +INT_QUOT_KW_CONTEXT +INT_QUOT_KW_COPY_NS +INT_QUOT_KW_COUNT +INT_QUOT_KW_DECLARE +INT_QUOT_KW_DEFAULT +INT_QUOT_KW_DESCENDANT +INT_QUOT_KW_DESCENDANT_OR_SELF +INT_QUOT_KW_DESCENDING +INT_QUOT_KW_DECIMAL_FORMAT +INT_QUOT_KW_DIV +INT_QUOT_KW_DOCUMENT +INT_QUOT_KW_DOCUMENT_NODE +INT_QUOT_KW_ELEMENT +INT_QUOT_KW_ELSE +INT_QUOT_KW_EMPTY +INT_QUOT_KW_EMPTY_SEQUENCE +INT_QUOT_KW_ENCODING +INT_QUOT_KW_END +INT_QUOT_KW_EQ +INT_QUOT_KW_EVERY +INT_QUOT_KW_EXCEPT +INT_QUOT_KW_EXTERNAL +INT_QUOT_KW_FOLLOWING +INT_QUOT_KW_FOLLOWING_SIBLING +INT_QUOT_KW_FOR +INT_QUOT_KW_FUNCTION +INT_QUOT_KW_GE +INT_QUOT_KW_GREATEST +INT_QUOT_KW_GROUP +INT_QUOT_KW_GT +INT_QUOT_KW_IDIV +INT_QUOT_KW_IF +INT_QUOT_KW_IMPORT +INT_QUOT_KW_IN +INT_QUOT_KW_INHERIT +INT_QUOT_KW_INSTANCE +INT_QUOT_KW_INTERSECT +INT_QUOT_KW_IS +INT_QUOT_KW_ITEM +INT_QUOT_KW_LAX +INT_QUOT_KW_LE +INT_QUOT_KW_LEAST +INT_QUOT_KW_LET +INT_QUOT_KW_LT +INT_QUOT_KW_MAP +INT_QUOT_KW_MOD +INT_QUOT_KW_MODULE +INT_QUOT_KW_NAMESPACE +INT_QUOT_KW_NE +INT_QUOT_KW_NEXT +INT_QUOT_KW_NAMESPACE_NODE +INT_QUOT_KW_NO_INHERIT +INT_QUOT_KW_NO_PRESERVE +INT_QUOT_KW_NODE +INT_QUOT_KW_OF +INT_QUOT_KW_ONLY +INT_QUOT_KW_OPTION +INT_QUOT_KW_OR +INT_QUOT_KW_ORDER +INT_QUOT_KW_ORDERED +INT_QUOT_KW_ORDERING +INT_QUOT_KW_PARENT +INT_QUOT_KW_PRECEDING +INT_QUOT_KW_PRECEDING_SIBLING +INT_QUOT_KW_PRESERVE +INT_QUOT_KW_PREVIOUS +INT_QUOT_KW_PI +INT_QUOT_KW_RETURN +INT_QUOT_KW_SATISFIES +INT_QUOT_KW_SCHEMA +INT_QUOT_KW_SCHEMA_ATTR +INT_QUOT_KW_SCHEMA_ELEM +INT_QUOT_KW_SELF +INT_QUOT_KW_SLIDING +INT_QUOT_KW_SOME +INT_QUOT_KW_STABLE +INT_QUOT_KW_START +INT_QUOT_KW_STRICT +INT_QUOT_KW_STRIP +INT_QUOT_KW_SWITCH +INT_QUOT_KW_TEXT +INT_QUOT_KW_THEN +INT_QUOT_KW_TO +INT_QUOT_KW_TREAT +INT_QUOT_KW_TRY +INT_QUOT_KW_TUMBLING +INT_QUOT_KW_TYPE +INT_QUOT_KW_TYPESWITCH +INT_QUOT_KW_UNION +INT_QUOT_KW_UNORDERED +INT_QUOT_KW_UPDATE +INT_QUOT_KW_VALIDATE +INT_QUOT_KW_VARIABLE +INT_QUOT_KW_VERSION +INT_QUOT_KW_WHEN +INT_QUOT_KW_WHERE +INT_QUOT_KW_WINDOW +INT_QUOT_KW_XQUERY +INT_QUOT_KW_ARRAY_NODE +INT_QUOT_KW_BOOLEAN_NODE +INT_QUOT_KW_NULL_NODE +INT_QUOT_KW_NUMBER_NODE +INT_QUOT_KW_OBJECT_NODE +INT_QUOT_KW_REPLACE +INT_QUOT_KW_WITH +INT_QUOT_KW_VALUE +INT_QUOT_KW_INSERT +INT_QUOT_KW_INTO +INT_QUOT_KW_DELETE +INT_QUOT_KW_RENAME +INT_QUOT_URIQualifiedName +INT_QUOT_FullQName +INT_QUOT_NCNameWithLocalWildcard +INT_QUOT_NCNameWithPrefixWildcard +INT_QUOT_NCName +INT_QUOT_XQDOC_COMMENT_START +INT_QUOT_XQDOC_COMMENT_END +INT_QUOT_XQDocComment +INT_QUOT_XQComment +INT_QUOT_CHAR +INT_QUOT_ENTER_STRING +INT_QUOT_EXIT_INTERPOLATION +INT_ContentChar +INT_APOS_IntegerLiteral +INT_APOS_DecimalLiteral +INT_APOS_DoubleLiteral +INT_APOS_DFPropertyName +INT_APOS_PredefinedEntityRef +INT_APOS_CharRef +INT_APOS_EscapeApos +INT_APOS_Quot +INT_APOS_Apos +INT_APOS_COMMENT +INT_APOS_XMLDECL +INT_APOS_PI +INT_APOS_CDATA +INT_APOS_PRAGMA +INT_APOS_WS +INT_APOS_EQUAL +INT_APOS_NOT_EQUAL +INT_APOS_LPAREN +INT_APOS_RPAREN +INT_APOS_LBRACKET +INT_APOS_RBRACKET +INT_APOS_LBRACE +INT_APOS_RBRACE_EXIT +INT_APOS_RBRACE +INT_APOS_STAR +INT_APOS_PLUS +INT_APOS_MINUS +INT_APOS_COMMA +INT_APOS_DOT +INT_APOS_DDOT +INT_APOS_COLON +INT_APOS_COLON_EQ +INT_APOS_SEMICOLON +INT_APOS_SLASH +INT_APOS_DSLASH +INT_APOS_BACKSLASH +INT_APOS_VBAR +INT_APOS_LANGLE +INT_APOS_RANGLE +INT_APOS_QUESTION +INT_APOS_AT +INT_APOS_DOLLAR +INT_APOS_MOD +INT_APOS_BANG +INT_APOS_HASH +INT_APOS_CARAT +INT_APOS_ARROW +INT_APOS_GRAVE +INT_APOS_CONCATENATION +INT_APOS_TILDE +INT_APOS_KW_ALLOWING +INT_APOS_KW_ANCESTOR +INT_APOS_KW_ANCESTOR_OR_SELF +INT_APOS_KW_AND +INT_APOS_KW_ARRAY +INT_APOS_KW_AS +INT_APOS_KW_ASCENDING +INT_APOS_KW_AT +INT_APOS_KW_ATTRIBUTE +INT_APOS_KW_BASE_URI +INT_APOS_KW_BOUNDARY_SPACE +INT_APOS_KW_BINARY +INT_APOS_KW_BY +INT_APOS_KW_CASE +INT_APOS_KW_CAST +INT_APOS_KW_CASTABLE +INT_APOS_KW_CATCH +INT_APOS_KW_CHILD +INT_APOS_KW_COLLATION +INT_APOS_KW_COMMENT +INT_APOS_KW_CONSTRUCTION +INT_APOS_KW_CONTEXT +INT_APOS_KW_COPY_NS +INT_APOS_KW_COUNT +INT_APOS_KW_DECLARE +INT_APOS_KW_DEFAULT +INT_APOS_KW_DESCENDANT +INT_APOS_KW_DESCENDANT_OR_SELF +INT_APOS_KW_DESCENDING +INT_APOS_KW_DECIMAL_FORMAT +INT_APOS_KW_DIV +INT_APOS_KW_DOCUMENT +INT_APOS_KW_DOCUMENT_NODE +INT_APOS_KW_ELEMENT +INT_APOS_KW_ELSE +INT_APOS_KW_EMPTY +INT_APOS_KW_EMPTY_SEQUENCE +INT_APOS_KW_ENCODING +INT_APOS_KW_END +INT_APOS_KW_EQ +INT_APOS_KW_EVERY +INT_APOS_KW_EXCEPT +INT_APOS_KW_EXTERNAL +INT_APOS_KW_FOLLOWING +INT_APOS_KW_FOLLOWING_SIBLING +INT_APOS_KW_FOR +INT_APOS_KW_FUNCTION +INT_APOS_KW_GE +INT_APOS_KW_GREATEST +INT_APOS_KW_GROUP +INT_APOS_KW_GT +INT_APOS_KW_IDIV +INT_APOS_KW_IF +INT_APOS_KW_IMPORT +INT_APOS_KW_IN +INT_APOS_KW_INHERIT +INT_APOS_KW_INSTANCE +INT_APOS_KW_INTERSECT +INT_APOS_KW_IS +INT_APOS_KW_ITEM +INT_APOS_KW_LAX +INT_APOS_KW_LE +INT_APOS_KW_LEAST +INT_APOS_KW_LET +INT_APOS_KW_LT +INT_APOS_KW_MAP +INT_APOS_KW_MOD +INT_APOS_KW_MODULE +INT_APOS_KW_NAMESPACE +INT_APOS_KW_NE +INT_APOS_KW_NEXT +INT_APOS_KW_NAMESPACE_NODE +INT_APOS_KW_NO_INHERIT +INT_APOS_KW_NO_PRESERVE +INT_APOS_KW_NODE +INT_APOS_KW_OF +INT_APOS_KW_ONLY +INT_APOS_KW_OPTION +INT_APOS_KW_OR +INT_APOS_KW_ORDER +INT_APOS_KW_ORDERED +INT_APOS_KW_ORDERING +INT_APOS_KW_PARENT +INT_APOS_KW_PRECEDING +INT_APOS_KW_PRECEDING_SIBLING +INT_APOS_KW_PRESERVE +INT_APOS_KW_PREVIOUS +INT_APOS_KW_PI +INT_APOS_KW_RETURN +INT_APOS_KW_SATISFIES +INT_APOS_KW_SCHEMA +INT_APOS_KW_SCHEMA_ATTR +INT_APOS_KW_SCHEMA_ELEM +INT_APOS_KW_SELF +INT_APOS_KW_SLIDING +INT_APOS_KW_SOME +INT_APOS_KW_STABLE +INT_APOS_KW_START +INT_APOS_KW_STRICT +INT_APOS_KW_STRIP +INT_APOS_KW_SWITCH +INT_APOS_KW_TEXT +INT_APOS_KW_THEN +INT_APOS_KW_TO +INT_APOS_KW_TREAT +INT_APOS_KW_TRY +INT_APOS_KW_TUMBLING +INT_APOS_KW_TYPE +INT_APOS_KW_TYPESWITCH +INT_APOS_KW_UNION +INT_APOS_KW_UNORDERED +INT_APOS_KW_UPDATE +INT_APOS_KW_VALIDATE +INT_APOS_KW_VARIABLE +INT_APOS_KW_VERSION +INT_APOS_KW_WHEN +INT_APOS_KW_WHERE +INT_APOS_KW_WINDOW +INT_APOS_KW_XQUERY +INT_APOS_KW_ARRAY_NODE +INT_APOS_KW_BOOLEAN_NODE +INT_APOS_KW_NULL_NODE +INT_APOS_KW_NUMBER_NODE +INT_APOS_KW_OBJECT_NODE +INT_APOS_KW_REPLACE +INT_APOS_KW_WITH +INT_APOS_KW_VALUE +INT_APOS_KW_INSERT +INT_APOS_KW_INTO +INT_APOS_KW_DELETE +INT_APOS_KW_RENAME +INT_APOS_URIQualifiedName +INT_APOS_FullQName +INT_APOS_NCNameWithLocalWildcard +INT_APOS_NCNameWithPrefixWildcard +INT_APOS_NCName +INT_APOS_XQDOC_COMMENT_START +INT_APOS_XQDOC_COMMENT_END +INT_APOS_XQDocComment +INT_APOS_XQComment +INT_APOS_CHAR +INT_APOS_ENTER_STRING +INT_APOS_EXIT_INTERPOLATION +INT_APOS_ContentChar + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE +STRING_MODE +QUOT_LITERAL_STRING +APOS_LITERAL_STRING +STRING_INTERPOLATION_MODE_QUOT +STRING_INTERPOLATION_MODE_APOS + +atn: +[4, 0, 203, 6735, 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, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 2, 347, 7, 347, 2, 348, 7, 348, 2, 349, 7, 349, 2, 350, 7, 350, 2, 351, 7, 351, 2, 352, 7, 352, 2, 353, 7, 353, 2, 354, 7, 354, 2, 355, 7, 355, 2, 356, 7, 356, 2, 357, 7, 357, 2, 358, 7, 358, 2, 359, 7, 359, 2, 360, 7, 360, 2, 361, 7, 361, 2, 362, 7, 362, 2, 363, 7, 363, 2, 364, 7, 364, 2, 365, 7, 365, 2, 366, 7, 366, 2, 367, 7, 367, 2, 368, 7, 368, 2, 369, 7, 369, 2, 370, 7, 370, 2, 371, 7, 371, 2, 372, 7, 372, 2, 373, 7, 373, 2, 374, 7, 374, 2, 375, 7, 375, 2, 376, 7, 376, 2, 377, 7, 377, 2, 378, 7, 378, 2, 379, 7, 379, 2, 380, 7, 380, 2, 381, 7, 381, 2, 382, 7, 382, 2, 383, 7, 383, 2, 384, 7, 384, 2, 385, 7, 385, 2, 386, 7, 386, 2, 387, 7, 387, 2, 388, 7, 388, 2, 389, 7, 389, 2, 390, 7, 390, 2, 391, 7, 391, 2, 392, 7, 392, 2, 393, 7, 393, 2, 394, 7, 394, 2, 395, 7, 395, 2, 396, 7, 396, 2, 397, 7, 397, 2, 398, 7, 398, 2, 399, 7, 399, 2, 400, 7, 400, 2, 401, 7, 401, 2, 402, 7, 402, 2, 403, 7, 403, 2, 404, 7, 404, 2, 405, 7, 405, 2, 406, 7, 406, 2, 407, 7, 407, 2, 408, 7, 408, 2, 409, 7, 409, 2, 410, 7, 410, 2, 411, 7, 411, 2, 412, 7, 412, 2, 413, 7, 413, 2, 414, 7, 414, 2, 415, 7, 415, 2, 416, 7, 416, 2, 417, 7, 417, 2, 418, 7, 418, 2, 419, 7, 419, 2, 420, 7, 420, 2, 421, 7, 421, 2, 422, 7, 422, 2, 423, 7, 423, 2, 424, 7, 424, 2, 425, 7, 425, 2, 426, 7, 426, 2, 427, 7, 427, 2, 428, 7, 428, 2, 429, 7, 429, 2, 430, 7, 430, 2, 431, 7, 431, 2, 432, 7, 432, 2, 433, 7, 433, 2, 434, 7, 434, 2, 435, 7, 435, 2, 436, 7, 436, 2, 437, 7, 437, 2, 438, 7, 438, 2, 439, 7, 439, 2, 440, 7, 440, 2, 441, 7, 441, 2, 442, 7, 442, 2, 443, 7, 443, 2, 444, 7, 444, 2, 445, 7, 445, 2, 446, 7, 446, 2, 447, 7, 447, 2, 448, 7, 448, 2, 449, 7, 449, 2, 450, 7, 450, 2, 451, 7, 451, 2, 452, 7, 452, 2, 453, 7, 453, 2, 454, 7, 454, 2, 455, 7, 455, 2, 456, 7, 456, 2, 457, 7, 457, 2, 458, 7, 458, 2, 459, 7, 459, 2, 460, 7, 460, 2, 461, 7, 461, 2, 462, 7, 462, 2, 463, 7, 463, 2, 464, 7, 464, 2, 465, 7, 465, 2, 466, 7, 466, 2, 467, 7, 467, 2, 468, 7, 468, 2, 469, 7, 469, 2, 470, 7, 470, 2, 471, 7, 471, 2, 472, 7, 472, 2, 473, 7, 473, 2, 474, 7, 474, 2, 475, 7, 475, 2, 476, 7, 476, 2, 477, 7, 477, 2, 478, 7, 478, 2, 479, 7, 479, 2, 480, 7, 480, 2, 481, 7, 481, 2, 482, 7, 482, 2, 483, 7, 483, 2, 484, 7, 484, 2, 485, 7, 485, 2, 486, 7, 486, 2, 487, 7, 487, 2, 488, 7, 488, 2, 489, 7, 489, 2, 490, 7, 490, 2, 491, 7, 491, 2, 492, 7, 492, 2, 493, 7, 493, 2, 494, 7, 494, 2, 495, 7, 495, 2, 496, 7, 496, 2, 497, 7, 497, 2, 498, 7, 498, 2, 499, 7, 499, 2, 500, 7, 500, 2, 501, 7, 501, 2, 502, 7, 502, 2, 503, 7, 503, 2, 504, 7, 504, 2, 505, 7, 505, 2, 506, 7, 506, 2, 507, 7, 507, 2, 508, 7, 508, 2, 509, 7, 509, 2, 510, 7, 510, 2, 511, 7, 511, 2, 512, 7, 512, 2, 513, 7, 513, 2, 514, 7, 514, 2, 515, 7, 515, 2, 516, 7, 516, 2, 517, 7, 517, 2, 518, 7, 518, 2, 519, 7, 519, 2, 520, 7, 520, 2, 521, 7, 521, 2, 522, 7, 522, 2, 523, 7, 523, 2, 524, 7, 524, 2, 525, 7, 525, 2, 526, 7, 526, 2, 527, 7, 527, 2, 528, 7, 528, 2, 529, 7, 529, 2, 530, 7, 530, 2, 531, 7, 531, 2, 532, 7, 532, 2, 533, 7, 533, 2, 534, 7, 534, 2, 535, 7, 535, 2, 536, 7, 536, 2, 537, 7, 537, 2, 538, 7, 538, 2, 539, 7, 539, 2, 540, 7, 540, 2, 541, 7, 541, 2, 542, 7, 542, 2, 543, 7, 543, 2, 544, 7, 544, 2, 545, 7, 545, 2, 546, 7, 546, 2, 547, 7, 547, 2, 548, 7, 548, 2, 549, 7, 549, 2, 550, 7, 550, 2, 551, 7, 551, 2, 552, 7, 552, 2, 553, 7, 553, 2, 554, 7, 554, 2, 555, 7, 555, 2, 556, 7, 556, 2, 557, 7, 557, 2, 558, 7, 558, 2, 559, 7, 559, 2, 560, 7, 560, 2, 561, 7, 561, 2, 562, 7, 562, 2, 563, 7, 563, 2, 564, 7, 564, 2, 565, 7, 565, 2, 566, 7, 566, 2, 567, 7, 567, 2, 568, 7, 568, 2, 569, 7, 569, 2, 570, 7, 570, 2, 571, 7, 571, 2, 572, 7, 572, 2, 573, 7, 573, 2, 574, 7, 574, 2, 575, 7, 575, 2, 576, 7, 576, 2, 577, 7, 577, 2, 578, 7, 578, 2, 579, 7, 579, 2, 580, 7, 580, 2, 581, 7, 581, 2, 582, 7, 582, 2, 583, 7, 583, 2, 584, 7, 584, 2, 585, 7, 585, 2, 586, 7, 586, 2, 587, 7, 587, 2, 588, 7, 588, 2, 589, 7, 589, 2, 590, 7, 590, 2, 591, 7, 591, 2, 592, 7, 592, 2, 593, 7, 593, 2, 594, 7, 594, 2, 595, 7, 595, 2, 596, 7, 596, 2, 597, 7, 597, 2, 598, 7, 598, 2, 599, 7, 599, 2, 600, 7, 600, 2, 601, 7, 601, 2, 602, 7, 602, 2, 603, 7, 603, 2, 604, 7, 604, 2, 605, 7, 605, 2, 606, 7, 606, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1228, 8, 1, 10, 1, 12, 1, 1231, 9, 1, 3, 1, 1233, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 1240, 8, 2, 10, 2, 12, 2, 1243, 9, 2, 3, 2, 1245, 8, 2, 3, 2, 1247, 8, 2, 1, 2, 1, 2, 3, 2, 1251, 8, 2, 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, 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, 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, 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, 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, 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, 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, 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, 3, 1, 3, 3, 3, 1377, 8, 3, 1, 4, 4, 4, 1380, 8, 4, 11, 4, 12, 4, 1381, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 1400, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1408, 8, 6, 11, 6, 12, 6, 1409, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1418, 8, 6, 11, 6, 12, 6, 1419, 1, 6, 3, 6, 1423, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 1441, 8, 9, 10, 9, 12, 9, 1444, 9, 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, 5, 10, 1458, 8, 10, 10, 10, 12, 10, 1461, 9, 10, 3, 10, 1463, 8, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 1474, 8, 11, 10, 11, 12, 11, 1477, 9, 11, 3, 11, 1479, 8, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 1495, 8, 12, 10, 12, 12, 12, 1498, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1508, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1513, 8, 13, 1, 13, 1, 13, 1, 13, 5, 13, 1518, 8, 13, 10, 13, 12, 13, 1521, 9, 13, 3, 13, 1523, 8, 13, 1, 13, 1, 13, 1, 13, 1, 14, 4, 14, 1529, 8, 14, 11, 14, 12, 14, 1530, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 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, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 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, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 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, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 153, 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, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 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, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 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, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 2642, 8, 180, 10, 180, 12, 180, 2645, 9, 180, 1, 180, 1, 180, 1, 180, 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, 5, 184, 2664, 8, 184, 10, 184, 12, 184, 2667, 9, 184, 1, 185, 3, 185, 2670, 8, 185, 1, 186, 1, 186, 3, 186, 2674, 8, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 4, 188, 2681, 8, 188, 11, 188, 12, 188, 2682, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 5, 189, 2693, 8, 189, 10, 189, 12, 189, 2696, 9, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 5, 190, 2710, 8, 190, 10, 190, 12, 190, 2713, 9, 190, 1, 190, 5, 190, 2716, 8, 190, 10, 190, 12, 190, 2719, 9, 190, 1, 190, 4, 190, 2722, 8, 190, 11, 190, 12, 190, 2723, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 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, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 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, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 3, 207, 2815, 8, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2825, 8, 208, 11, 208, 12, 208, 2826, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2835, 8, 208, 11, 208, 12, 208, 2836, 1, 208, 3, 208, 2840, 8, 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, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 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, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 3, 216, 2893, 8, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2903, 8, 217, 11, 217, 12, 217, 2904, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2913, 8, 217, 11, 217, 12, 217, 2914, 1, 217, 3, 217, 2918, 8, 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, 5, 220, 2935, 8, 220, 10, 220, 12, 220, 2938, 9, 220, 3, 220, 2940, 8, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 5, 221, 2949, 8, 221, 10, 221, 12, 221, 2952, 9, 221, 3, 221, 2954, 8, 221, 3, 221, 2956, 8, 221, 1, 221, 1, 221, 3, 221, 2960, 8, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 3088, 8, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 3, 223, 3108, 8, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3118, 8, 224, 11, 224, 12, 224, 3119, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3128, 8, 224, 11, 224, 12, 224, 3129, 1, 224, 3, 224, 3133, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 5, 228, 3161, 8, 228, 10, 228, 12, 228, 3164, 9, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 5, 229, 3180, 8, 229, 10, 229, 12, 229, 3183, 9, 229, 3, 229, 3185, 8, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 5, 230, 3198, 8, 230, 10, 230, 12, 230, 3201, 9, 230, 3, 230, 3203, 8, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 5, 231, 3221, 8, 231, 10, 231, 12, 231, 3224, 9, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3236, 8, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3241, 8, 232, 1, 232, 1, 232, 1, 232, 5, 232, 3246, 8, 232, 10, 232, 12, 232, 3249, 9, 232, 3, 232, 3251, 8, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 4, 233, 3259, 8, 233, 11, 233, 12, 233, 3260, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 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, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 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, 250, 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, 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, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 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, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 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, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 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, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 347, 1, 347, 1, 347, 1, 347, 1, 347, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 5, 400, 4712, 8, 400, 10, 400, 12, 400, 4715, 9, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 404, 1, 404, 5, 404, 4742, 8, 404, 10, 404, 12, 404, 4745, 9, 404, 1, 404, 1, 404, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 406, 4, 406, 4756, 8, 406, 11, 406, 12, 406, 4757, 1, 406, 1, 406, 1, 406, 1, 406, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 5, 407, 4770, 8, 407, 10, 407, 12, 407, 4773, 9, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 5, 408, 4789, 8, 408, 10, 408, 12, 408, 4792, 9, 408, 1, 408, 5, 408, 4795, 8, 408, 10, 408, 12, 408, 4798, 9, 408, 1, 408, 4, 408, 4801, 8, 408, 11, 408, 12, 408, 4802, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 409, 1, 409, 1, 409, 1, 409, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 412, 1, 412, 1, 412, 1, 412, 1, 413, 1, 413, 1, 413, 1, 413, 1, 414, 1, 414, 1, 414, 1, 414, 1, 414, 5, 414, 4840, 8, 414, 10, 414, 12, 414, 4843, 9, 414, 3, 414, 4845, 8, 414, 1, 414, 1, 414, 1, 415, 1, 415, 1, 415, 1, 415, 1, 415, 5, 415, 4854, 8, 415, 10, 415, 12, 415, 4857, 9, 415, 3, 415, 4859, 8, 415, 3, 415, 4861, 8, 415, 1, 415, 1, 415, 3, 415, 4865, 8, 415, 1, 415, 1, 415, 1, 415, 1, 415, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 3, 416, 4993, 8, 416, 1, 416, 1, 416, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 3, 417, 5013, 8, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5023, 8, 418, 11, 418, 12, 418, 5024, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5033, 8, 418, 11, 418, 12, 418, 5034, 1, 418, 3, 418, 5038, 8, 418, 1, 418, 1, 418, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 420, 1, 420, 1, 420, 1, 420, 1, 420, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 5, 422, 5066, 8, 422, 10, 422, 12, 422, 5069, 9, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 5, 423, 5085, 8, 423, 10, 423, 12, 423, 5088, 9, 423, 3, 423, 5090, 8, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 5, 424, 5103, 8, 424, 10, 424, 12, 424, 5106, 9, 424, 3, 424, 5108, 8, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 5, 425, 5126, 8, 425, 10, 425, 12, 425, 5129, 9, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5141, 8, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5146, 8, 426, 1, 426, 1, 426, 1, 426, 5, 426, 5151, 8, 426, 10, 426, 12, 426, 5154, 9, 426, 3, 426, 5156, 8, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 427, 4, 427, 5164, 8, 427, 11, 427, 12, 427, 5165, 1, 427, 1, 427, 1, 427, 1, 428, 1, 428, 1, 428, 1, 428, 1, 429, 1, 429, 1, 429, 1, 429, 1, 429, 1, 430, 1, 430, 1, 430, 1, 430, 1, 431, 1, 431, 1, 431, 1, 431, 1, 432, 1, 432, 1, 432, 1, 432, 1, 433, 1, 433, 1, 433, 1, 433, 1, 434, 1, 434, 1, 434, 1, 434, 1, 434, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 437, 1, 437, 1, 437, 1, 437, 1, 438, 1, 438, 1, 438, 1, 438, 1, 439, 1, 439, 1, 439, 1, 439, 1, 440, 1, 440, 1, 440, 1, 440, 1, 441, 1, 441, 1, 441, 1, 441, 1, 442, 1, 442, 1, 442, 1, 442, 1, 442, 1, 443, 1, 443, 1, 443, 1, 443, 1, 444, 1, 444, 1, 444, 1, 444, 1, 444, 1, 445, 1, 445, 1, 445, 1, 445, 1, 446, 1, 446, 1, 446, 1, 446, 1, 447, 1, 447, 1, 447, 1, 447, 1, 447, 1, 448, 1, 448, 1, 448, 1, 448, 1, 449, 1, 449, 1, 449, 1, 449, 1, 450, 1, 450, 1, 450, 1, 450, 1, 451, 1, 451, 1, 451, 1, 451, 1, 452, 1, 452, 1, 452, 1, 452, 1, 453, 1, 453, 1, 453, 1, 453, 1, 454, 1, 454, 1, 454, 1, 454, 1, 455, 1, 455, 1, 455, 1, 455, 1, 456, 1, 456, 1, 456, 1, 456, 1, 457, 1, 457, 1, 457, 1, 457, 1, 458, 1, 458, 1, 458, 1, 458, 1, 459, 1, 459, 1, 459, 1, 459, 1, 459, 1, 460, 1, 460, 1, 460, 1, 460, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 1, 462, 1, 462, 1, 462, 1, 462, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 470, 1, 470, 1, 470, 1, 470, 1, 470, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 475, 1, 475, 1, 475, 1, 475, 1, 475, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 502, 1, 502, 1, 502, 1, 502, 1, 502, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 510, 1, 510, 1, 510, 1, 510, 1, 510, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 513, 1, 513, 1, 513, 1, 513, 1, 513, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 515, 1, 515, 1, 515, 1, 515, 1, 515, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 517, 1, 517, 1, 517, 1, 517, 1, 517, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 521, 1, 521, 1, 521, 1, 521, 1, 521, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 524, 1, 524, 1, 524, 1, 524, 1, 524, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 532, 1, 532, 1, 532, 1, 532, 1, 532, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 5, 594, 6617, 8, 594, 10, 594, 12, 594, 6620, 9, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 598, 1, 598, 5, 598, 6647, 8, 598, 10, 598, 12, 598, 6650, 9, 598, 1, 598, 1, 598, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 600, 4, 600, 6661, 8, 600, 11, 600, 12, 600, 6662, 1, 600, 1, 600, 1, 600, 1, 600, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 5, 601, 6675, 8, 601, 10, 601, 12, 601, 6678, 9, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 5, 602, 6694, 8, 602, 10, 602, 12, 602, 6697, 9, 602, 1, 602, 5, 602, 6700, 8, 602, 10, 602, 12, 602, 6703, 9, 602, 1, 602, 4, 602, 6706, 8, 602, 11, 602, 12, 602, 6707, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 603, 1, 603, 1, 603, 1, 603, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 606, 1, 606, 1, 606, 1, 606, 12, 1459, 1475, 1496, 1519, 3181, 3199, 3222, 3247, 5086, 5104, 5127, 5152, 0, 607, 6, 5, 8, 6, 10, 7, 12, 8, 14, 0, 16, 9, 18, 10, 20, 11, 22, 12, 24, 13, 26, 14, 28, 15, 30, 16, 32, 17, 34, 18, 36, 19, 38, 20, 40, 21, 42, 22, 44, 23, 46, 24, 48, 25, 50, 26, 52, 27, 54, 28, 56, 29, 58, 30, 60, 31, 62, 32, 64, 33, 66, 34, 68, 35, 70, 36, 72, 37, 74, 38, 76, 39, 78, 40, 80, 41, 82, 42, 84, 43, 86, 44, 88, 45, 90, 46, 92, 47, 94, 48, 96, 49, 98, 50, 100, 51, 102, 52, 104, 53, 106, 54, 108, 55, 110, 56, 112, 57, 114, 58, 116, 59, 118, 60, 120, 61, 122, 62, 124, 63, 126, 64, 128, 65, 130, 66, 132, 67, 134, 68, 136, 69, 138, 70, 140, 71, 142, 72, 144, 73, 146, 74, 148, 75, 150, 76, 152, 77, 154, 78, 156, 79, 158, 80, 160, 81, 162, 82, 164, 83, 166, 84, 168, 85, 170, 86, 172, 87, 174, 88, 176, 89, 178, 90, 180, 91, 182, 92, 184, 93, 186, 94, 188, 95, 190, 96, 192, 97, 194, 98, 196, 99, 198, 100, 200, 101, 202, 102, 204, 103, 206, 104, 208, 105, 210, 106, 212, 107, 214, 108, 216, 109, 218, 110, 220, 111, 222, 112, 224, 113, 226, 114, 228, 115, 230, 116, 232, 117, 234, 118, 236, 119, 238, 120, 240, 121, 242, 122, 244, 123, 246, 124, 248, 125, 250, 126, 252, 127, 254, 128, 256, 129, 258, 130, 260, 131, 262, 132, 264, 133, 266, 134, 268, 135, 270, 136, 272, 137, 274, 138, 276, 139, 278, 140, 280, 141, 282, 142, 284, 143, 286, 144, 288, 145, 290, 146, 292, 147, 294, 148, 296, 149, 298, 150, 300, 151, 302, 152, 304, 153, 306, 154, 308, 155, 310, 156, 312, 157, 314, 158, 316, 159, 318, 160, 320, 161, 322, 162, 324, 163, 326, 164, 328, 165, 330, 166, 332, 167, 334, 168, 336, 169, 338, 170, 340, 171, 342, 172, 344, 173, 346, 174, 348, 175, 350, 176, 352, 177, 354, 178, 356, 179, 358, 180, 360, 181, 362, 182, 364, 183, 366, 184, 368, 185, 370, 186, 372, 187, 374, 188, 376, 0, 378, 0, 380, 189, 382, 190, 384, 191, 386, 192, 388, 193, 390, 194, 392, 195, 394, 196, 396, 197, 398, 0, 400, 0, 402, 0, 404, 198, 406, 199, 408, 200, 410, 0, 412, 201, 414, 202, 416, 0, 418, 0, 420, 0, 422, 0, 424, 0, 426, 203, 428, 0, 430, 0, 432, 0, 434, 0, 436, 0, 438, 0, 440, 0, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 0, 464, 0, 466, 0, 468, 0, 470, 0, 472, 0, 474, 0, 476, 0, 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, 0, 510, 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 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, 0, 568, 0, 570, 0, 572, 0, 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, 0, 602, 0, 604, 0, 606, 0, 608, 0, 610, 0, 612, 0, 614, 0, 616, 0, 618, 0, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 0, 638, 0, 640, 0, 642, 0, 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, 0, 690, 0, 692, 0, 694, 0, 696, 0, 698, 0, 700, 0, 702, 0, 704, 0, 706, 0, 708, 0, 710, 0, 712, 0, 714, 0, 716, 0, 718, 0, 720, 0, 722, 0, 724, 0, 726, 0, 728, 0, 730, 0, 732, 0, 734, 0, 736, 0, 738, 0, 740, 0, 742, 0, 744, 0, 746, 0, 748, 0, 750, 0, 752, 0, 754, 0, 756, 0, 758, 0, 760, 0, 762, 0, 764, 0, 766, 0, 768, 0, 770, 0, 772, 0, 774, 0, 776, 0, 778, 0, 780, 0, 782, 0, 784, 0, 786, 0, 788, 0, 790, 0, 792, 0, 794, 0, 796, 0, 798, 0, 800, 0, 802, 0, 804, 0, 806, 0, 808, 0, 810, 0, 812, 0, 814, 0, 816, 0, 818, 0, 820, 0, 822, 0, 824, 0, 826, 0, 828, 0, 830, 0, 832, 0, 834, 0, 836, 0, 838, 0, 840, 0, 842, 0, 844, 0, 846, 0, 848, 0, 850, 0, 852, 0, 854, 0, 856, 0, 858, 0, 860, 0, 862, 0, 864, 0, 866, 0, 868, 0, 870, 0, 872, 0, 874, 0, 876, 0, 878, 0, 880, 0, 882, 0, 884, 0, 886, 0, 888, 0, 890, 0, 892, 0, 894, 0, 896, 0, 898, 0, 900, 0, 902, 0, 904, 0, 906, 0, 908, 0, 910, 0, 912, 0, 914, 0, 916, 0, 918, 0, 920, 0, 922, 0, 924, 0, 926, 0, 928, 0, 930, 0, 932, 0, 934, 0, 936, 0, 938, 0, 940, 0, 942, 0, 944, 0, 946, 0, 948, 0, 950, 0, 952, 0, 954, 0, 956, 0, 958, 0, 960, 0, 962, 0, 964, 0, 966, 0, 968, 0, 970, 0, 972, 0, 974, 0, 976, 0, 978, 0, 980, 0, 982, 0, 984, 0, 986, 0, 988, 0, 990, 0, 992, 0, 994, 0, 996, 0, 998, 0, 1000, 0, 1002, 0, 1004, 0, 1006, 0, 1008, 0, 1010, 0, 1012, 0, 1014, 0, 1016, 0, 1018, 0, 1020, 0, 1022, 0, 1024, 0, 1026, 0, 1028, 0, 1030, 0, 1032, 0, 1034, 0, 1036, 0, 1038, 0, 1040, 0, 1042, 0, 1044, 0, 1046, 0, 1048, 0, 1050, 0, 1052, 0, 1054, 0, 1056, 0, 1058, 0, 1060, 0, 1062, 0, 1064, 0, 1066, 0, 1068, 0, 1070, 0, 1072, 0, 1074, 0, 1076, 0, 1078, 0, 1080, 0, 1082, 0, 1084, 0, 1086, 0, 1088, 0, 1090, 0, 1092, 0, 1094, 0, 1096, 0, 1098, 0, 1100, 0, 1102, 0, 1104, 0, 1106, 0, 1108, 0, 1110, 0, 1112, 0, 1114, 0, 1116, 0, 1118, 0, 1120, 0, 1122, 0, 1124, 0, 1126, 0, 1128, 0, 1130, 0, 1132, 0, 1134, 0, 1136, 0, 1138, 0, 1140, 0, 1142, 0, 1144, 0, 1146, 0, 1148, 0, 1150, 0, 1152, 0, 1154, 0, 1156, 0, 1158, 0, 1160, 0, 1162, 0, 1164, 0, 1166, 0, 1168, 0, 1170, 0, 1172, 0, 1174, 0, 1176, 0, 1178, 0, 1180, 0, 1182, 0, 1184, 0, 1186, 0, 1188, 0, 1190, 0, 1192, 0, 1194, 0, 1196, 0, 1198, 0, 1200, 0, 1202, 0, 1204, 0, 1206, 0, 1208, 0, 1210, 0, 1212, 0, 1214, 0, 1216, 0, 1218, 0, 6, 0, 1, 2, 3, 4, 5, 21, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 45, 45, 2, 0, 88, 88, 120, 120, 2, 0, 77, 77, 109, 109, 2, 0, 76, 76, 108, 108, 3, 0, 9, 10, 13, 13, 32, 32, 3, 0, 38, 38, 123, 123, 125, 125, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 46, 48, 57, 161, 191, 768, 879, 8255, 8256, 1, 0, 41, 41, 1, 0, 126, 126, 1, 0, 58, 58, 2, 0, 40, 40, 58, 58, 5, 0, 9, 10, 13, 13, 32, 57, 59, 55295, 57344, 65533, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 8, 0, 9, 10, 13, 13, 32, 92, 94, 95, 97, 122, 124, 55295, 57344, 65533, 65536, 1114111, 4, 0, 34, 34, 38, 38, 123, 123, 125, 125, 3, 0, 38, 39, 123, 123, 125, 125, 6886, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 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, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 110, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 0, 134, 1, 0, 0, 0, 0, 136, 1, 0, 0, 0, 0, 138, 1, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, 142, 1, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 146, 1, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 150, 1, 0, 0, 0, 0, 152, 1, 0, 0, 0, 0, 154, 1, 0, 0, 0, 0, 156, 1, 0, 0, 0, 0, 158, 1, 0, 0, 0, 0, 160, 1, 0, 0, 0, 0, 162, 1, 0, 0, 0, 0, 164, 1, 0, 0, 0, 0, 166, 1, 0, 0, 0, 0, 168, 1, 0, 0, 0, 0, 170, 1, 0, 0, 0, 0, 172, 1, 0, 0, 0, 0, 174, 1, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 178, 1, 0, 0, 0, 0, 180, 1, 0, 0, 0, 0, 182, 1, 0, 0, 0, 0, 184, 1, 0, 0, 0, 0, 186, 1, 0, 0, 0, 0, 188, 1, 0, 0, 0, 0, 190, 1, 0, 0, 0, 0, 192, 1, 0, 0, 0, 0, 194, 1, 0, 0, 0, 0, 196, 1, 0, 0, 0, 0, 198, 1, 0, 0, 0, 0, 200, 1, 0, 0, 0, 0, 202, 1, 0, 0, 0, 0, 204, 1, 0, 0, 0, 0, 206, 1, 0, 0, 0, 0, 208, 1, 0, 0, 0, 0, 210, 1, 0, 0, 0, 0, 212, 1, 0, 0, 0, 0, 214, 1, 0, 0, 0, 0, 216, 1, 0, 0, 0, 0, 218, 1, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 222, 1, 0, 0, 0, 0, 224, 1, 0, 0, 0, 0, 226, 1, 0, 0, 0, 0, 228, 1, 0, 0, 0, 0, 230, 1, 0, 0, 0, 0, 232, 1, 0, 0, 0, 0, 234, 1, 0, 0, 0, 0, 236, 1, 0, 0, 0, 0, 238, 1, 0, 0, 0, 0, 240, 1, 0, 0, 0, 0, 242, 1, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 246, 1, 0, 0, 0, 0, 248, 1, 0, 0, 0, 0, 250, 1, 0, 0, 0, 0, 252, 1, 0, 0, 0, 0, 254, 1, 0, 0, 0, 0, 256, 1, 0, 0, 0, 0, 258, 1, 0, 0, 0, 0, 260, 1, 0, 0, 0, 0, 262, 1, 0, 0, 0, 0, 264, 1, 0, 0, 0, 0, 266, 1, 0, 0, 0, 0, 268, 1, 0, 0, 0, 0, 270, 1, 0, 0, 0, 0, 272, 1, 0, 0, 0, 0, 274, 1, 0, 0, 0, 0, 276, 1, 0, 0, 0, 0, 278, 1, 0, 0, 0, 0, 280, 1, 0, 0, 0, 0, 282, 1, 0, 0, 0, 0, 284, 1, 0, 0, 0, 0, 286, 1, 0, 0, 0, 0, 288, 1, 0, 0, 0, 0, 290, 1, 0, 0, 0, 0, 292, 1, 0, 0, 0, 0, 294, 1, 0, 0, 0, 0, 296, 1, 0, 0, 0, 0, 298, 1, 0, 0, 0, 0, 300, 1, 0, 0, 0, 0, 302, 1, 0, 0, 0, 0, 304, 1, 0, 0, 0, 0, 306, 1, 0, 0, 0, 0, 308, 1, 0, 0, 0, 0, 310, 1, 0, 0, 0, 0, 312, 1, 0, 0, 0, 0, 314, 1, 0, 0, 0, 0, 316, 1, 0, 0, 0, 0, 318, 1, 0, 0, 0, 0, 320, 1, 0, 0, 0, 0, 322, 1, 0, 0, 0, 0, 324, 1, 0, 0, 0, 0, 326, 1, 0, 0, 0, 0, 328, 1, 0, 0, 0, 0, 330, 1, 0, 0, 0, 0, 332, 1, 0, 0, 0, 0, 334, 1, 0, 0, 0, 0, 336, 1, 0, 0, 0, 0, 338, 1, 0, 0, 0, 0, 340, 1, 0, 0, 0, 0, 342, 1, 0, 0, 0, 0, 344, 1, 0, 0, 0, 0, 346, 1, 0, 0, 0, 0, 348, 1, 0, 0, 0, 0, 350, 1, 0, 0, 0, 0, 352, 1, 0, 0, 0, 0, 354, 1, 0, 0, 0, 0, 356, 1, 0, 0, 0, 0, 358, 1, 0, 0, 0, 0, 360, 1, 0, 0, 0, 0, 362, 1, 0, 0, 0, 0, 364, 1, 0, 0, 0, 0, 366, 1, 0, 0, 0, 0, 368, 1, 0, 0, 0, 0, 370, 1, 0, 0, 0, 0, 372, 1, 0, 0, 0, 0, 374, 1, 0, 0, 0, 0, 380, 1, 0, 0, 0, 0, 382, 1, 0, 0, 0, 0, 384, 1, 0, 0, 0, 0, 386, 1, 0, 0, 0, 0, 388, 1, 0, 0, 0, 0, 390, 1, 0, 0, 0, 0, 392, 1, 0, 0, 0, 0, 394, 1, 0, 0, 0, 1, 396, 1, 0, 0, 0, 1, 398, 1, 0, 0, 0, 1, 400, 1, 0, 0, 0, 1, 402, 1, 0, 0, 0, 1, 404, 1, 0, 0, 0, 1, 406, 1, 0, 0, 0, 2, 408, 1, 0, 0, 0, 2, 410, 1, 0, 0, 0, 2, 412, 1, 0, 0, 0, 2, 414, 1, 0, 0, 0, 2, 416, 1, 0, 0, 0, 2, 418, 1, 0, 0, 0, 2, 420, 1, 0, 0, 0, 2, 422, 1, 0, 0, 0, 2, 424, 1, 0, 0, 0, 3, 426, 1, 0, 0, 0, 3, 428, 1, 0, 0, 0, 3, 430, 1, 0, 0, 0, 3, 432, 1, 0, 0, 0, 3, 434, 1, 0, 0, 0, 3, 436, 1, 0, 0, 0, 3, 438, 1, 0, 0, 0, 3, 440, 1, 0, 0, 0, 3, 442, 1, 0, 0, 0, 4, 444, 1, 0, 0, 0, 4, 446, 1, 0, 0, 0, 4, 448, 1, 0, 0, 0, 4, 450, 1, 0, 0, 0, 4, 452, 1, 0, 0, 0, 4, 454, 1, 0, 0, 0, 4, 456, 1, 0, 0, 0, 4, 458, 1, 0, 0, 0, 4, 460, 1, 0, 0, 0, 4, 462, 1, 0, 0, 0, 4, 464, 1, 0, 0, 0, 4, 466, 1, 0, 0, 0, 4, 468, 1, 0, 0, 0, 4, 470, 1, 0, 0, 0, 4, 472, 1, 0, 0, 0, 4, 474, 1, 0, 0, 0, 4, 476, 1, 0, 0, 0, 4, 478, 1, 0, 0, 0, 4, 480, 1, 0, 0, 0, 4, 482, 1, 0, 0, 0, 4, 484, 1, 0, 0, 0, 4, 486, 1, 0, 0, 0, 4, 488, 1, 0, 0, 0, 4, 490, 1, 0, 0, 0, 4, 492, 1, 0, 0, 0, 4, 494, 1, 0, 0, 0, 4, 496, 1, 0, 0, 0, 4, 498, 1, 0, 0, 0, 4, 500, 1, 0, 0, 0, 4, 502, 1, 0, 0, 0, 4, 504, 1, 0, 0, 0, 4, 506, 1, 0, 0, 0, 4, 508, 1, 0, 0, 0, 4, 510, 1, 0, 0, 0, 4, 512, 1, 0, 0, 0, 4, 514, 1, 0, 0, 0, 4, 516, 1, 0, 0, 0, 4, 518, 1, 0, 0, 0, 4, 520, 1, 0, 0, 0, 4, 522, 1, 0, 0, 0, 4, 524, 1, 0, 0, 0, 4, 526, 1, 0, 0, 0, 4, 528, 1, 0, 0, 0, 4, 530, 1, 0, 0, 0, 4, 532, 1, 0, 0, 0, 4, 534, 1, 0, 0, 0, 4, 536, 1, 0, 0, 0, 4, 538, 1, 0, 0, 0, 4, 540, 1, 0, 0, 0, 4, 542, 1, 0, 0, 0, 4, 544, 1, 0, 0, 0, 4, 546, 1, 0, 0, 0, 4, 548, 1, 0, 0, 0, 4, 550, 1, 0, 0, 0, 4, 552, 1, 0, 0, 0, 4, 554, 1, 0, 0, 0, 4, 556, 1, 0, 0, 0, 4, 558, 1, 0, 0, 0, 4, 560, 1, 0, 0, 0, 4, 562, 1, 0, 0, 0, 4, 564, 1, 0, 0, 0, 4, 566, 1, 0, 0, 0, 4, 568, 1, 0, 0, 0, 4, 570, 1, 0, 0, 0, 4, 572, 1, 0, 0, 0, 4, 574, 1, 0, 0, 0, 4, 576, 1, 0, 0, 0, 4, 578, 1, 0, 0, 0, 4, 580, 1, 0, 0, 0, 4, 582, 1, 0, 0, 0, 4, 584, 1, 0, 0, 0, 4, 586, 1, 0, 0, 0, 4, 588, 1, 0, 0, 0, 4, 590, 1, 0, 0, 0, 4, 592, 1, 0, 0, 0, 4, 594, 1, 0, 0, 0, 4, 596, 1, 0, 0, 0, 4, 598, 1, 0, 0, 0, 4, 600, 1, 0, 0, 0, 4, 602, 1, 0, 0, 0, 4, 604, 1, 0, 0, 0, 4, 606, 1, 0, 0, 0, 4, 608, 1, 0, 0, 0, 4, 610, 1, 0, 0, 0, 4, 612, 1, 0, 0, 0, 4, 614, 1, 0, 0, 0, 4, 616, 1, 0, 0, 0, 4, 618, 1, 0, 0, 0, 4, 620, 1, 0, 0, 0, 4, 622, 1, 0, 0, 0, 4, 624, 1, 0, 0, 0, 4, 626, 1, 0, 0, 0, 4, 628, 1, 0, 0, 0, 4, 630, 1, 0, 0, 0, 4, 632, 1, 0, 0, 0, 4, 634, 1, 0, 0, 0, 4, 636, 1, 0, 0, 0, 4, 638, 1, 0, 0, 0, 4, 640, 1, 0, 0, 0, 4, 642, 1, 0, 0, 0, 4, 644, 1, 0, 0, 0, 4, 646, 1, 0, 0, 0, 4, 648, 1, 0, 0, 0, 4, 650, 1, 0, 0, 0, 4, 652, 1, 0, 0, 0, 4, 654, 1, 0, 0, 0, 4, 656, 1, 0, 0, 0, 4, 658, 1, 0, 0, 0, 4, 660, 1, 0, 0, 0, 4, 662, 1, 0, 0, 0, 4, 664, 1, 0, 0, 0, 4, 666, 1, 0, 0, 0, 4, 668, 1, 0, 0, 0, 4, 670, 1, 0, 0, 0, 4, 672, 1, 0, 0, 0, 4, 674, 1, 0, 0, 0, 4, 676, 1, 0, 0, 0, 4, 678, 1, 0, 0, 0, 4, 680, 1, 0, 0, 0, 4, 682, 1, 0, 0, 0, 4, 684, 1, 0, 0, 0, 4, 686, 1, 0, 0, 0, 4, 688, 1, 0, 0, 0, 4, 690, 1, 0, 0, 0, 4, 692, 1, 0, 0, 0, 4, 694, 1, 0, 0, 0, 4, 696, 1, 0, 0, 0, 4, 698, 1, 0, 0, 0, 4, 700, 1, 0, 0, 0, 4, 702, 1, 0, 0, 0, 4, 704, 1, 0, 0, 0, 4, 706, 1, 0, 0, 0, 4, 708, 1, 0, 0, 0, 4, 710, 1, 0, 0, 0, 4, 712, 1, 0, 0, 0, 4, 714, 1, 0, 0, 0, 4, 716, 1, 0, 0, 0, 4, 718, 1, 0, 0, 0, 4, 720, 1, 0, 0, 0, 4, 722, 1, 0, 0, 0, 4, 724, 1, 0, 0, 0, 4, 726, 1, 0, 0, 0, 4, 728, 1, 0, 0, 0, 4, 730, 1, 0, 0, 0, 4, 732, 1, 0, 0, 0, 4, 734, 1, 0, 0, 0, 4, 736, 1, 0, 0, 0, 4, 738, 1, 0, 0, 0, 4, 740, 1, 0, 0, 0, 4, 742, 1, 0, 0, 0, 4, 744, 1, 0, 0, 0, 4, 746, 1, 0, 0, 0, 4, 748, 1, 0, 0, 0, 4, 750, 1, 0, 0, 0, 4, 752, 1, 0, 0, 0, 4, 754, 1, 0, 0, 0, 4, 756, 1, 0, 0, 0, 4, 758, 1, 0, 0, 0, 4, 760, 1, 0, 0, 0, 4, 762, 1, 0, 0, 0, 4, 764, 1, 0, 0, 0, 4, 766, 1, 0, 0, 0, 4, 768, 1, 0, 0, 0, 4, 770, 1, 0, 0, 0, 4, 772, 1, 0, 0, 0, 4, 774, 1, 0, 0, 0, 4, 776, 1, 0, 0, 0, 4, 778, 1, 0, 0, 0, 4, 780, 1, 0, 0, 0, 4, 782, 1, 0, 0, 0, 4, 784, 1, 0, 0, 0, 4, 786, 1, 0, 0, 0, 4, 788, 1, 0, 0, 0, 4, 790, 1, 0, 0, 0, 4, 792, 1, 0, 0, 0, 4, 794, 1, 0, 0, 0, 4, 796, 1, 0, 0, 0, 4, 798, 1, 0, 0, 0, 4, 800, 1, 0, 0, 0, 4, 802, 1, 0, 0, 0, 4, 804, 1, 0, 0, 0, 4, 806, 1, 0, 0, 0, 4, 808, 1, 0, 0, 0, 4, 810, 1, 0, 0, 0, 4, 812, 1, 0, 0, 0, 4, 814, 1, 0, 0, 0, 4, 816, 1, 0, 0, 0, 4, 818, 1, 0, 0, 0, 4, 820, 1, 0, 0, 0, 4, 822, 1, 0, 0, 0, 4, 824, 1, 0, 0, 0, 4, 826, 1, 0, 0, 0, 4, 828, 1, 0, 0, 0, 4, 830, 1, 0, 0, 0, 5, 832, 1, 0, 0, 0, 5, 834, 1, 0, 0, 0, 5, 836, 1, 0, 0, 0, 5, 838, 1, 0, 0, 0, 5, 840, 1, 0, 0, 0, 5, 842, 1, 0, 0, 0, 5, 844, 1, 0, 0, 0, 5, 846, 1, 0, 0, 0, 5, 848, 1, 0, 0, 0, 5, 850, 1, 0, 0, 0, 5, 852, 1, 0, 0, 0, 5, 854, 1, 0, 0, 0, 5, 856, 1, 0, 0, 0, 5, 858, 1, 0, 0, 0, 5, 860, 1, 0, 0, 0, 5, 862, 1, 0, 0, 0, 5, 864, 1, 0, 0, 0, 5, 866, 1, 0, 0, 0, 5, 868, 1, 0, 0, 0, 5, 870, 1, 0, 0, 0, 5, 872, 1, 0, 0, 0, 5, 874, 1, 0, 0, 0, 5, 876, 1, 0, 0, 0, 5, 878, 1, 0, 0, 0, 5, 880, 1, 0, 0, 0, 5, 882, 1, 0, 0, 0, 5, 884, 1, 0, 0, 0, 5, 886, 1, 0, 0, 0, 5, 888, 1, 0, 0, 0, 5, 890, 1, 0, 0, 0, 5, 892, 1, 0, 0, 0, 5, 894, 1, 0, 0, 0, 5, 896, 1, 0, 0, 0, 5, 898, 1, 0, 0, 0, 5, 900, 1, 0, 0, 0, 5, 902, 1, 0, 0, 0, 5, 904, 1, 0, 0, 0, 5, 906, 1, 0, 0, 0, 5, 908, 1, 0, 0, 0, 5, 910, 1, 0, 0, 0, 5, 912, 1, 0, 0, 0, 5, 914, 1, 0, 0, 0, 5, 916, 1, 0, 0, 0, 5, 918, 1, 0, 0, 0, 5, 920, 1, 0, 0, 0, 5, 922, 1, 0, 0, 0, 5, 924, 1, 0, 0, 0, 5, 926, 1, 0, 0, 0, 5, 928, 1, 0, 0, 0, 5, 930, 1, 0, 0, 0, 5, 932, 1, 0, 0, 0, 5, 934, 1, 0, 0, 0, 5, 936, 1, 0, 0, 0, 5, 938, 1, 0, 0, 0, 5, 940, 1, 0, 0, 0, 5, 942, 1, 0, 0, 0, 5, 944, 1, 0, 0, 0, 5, 946, 1, 0, 0, 0, 5, 948, 1, 0, 0, 0, 5, 950, 1, 0, 0, 0, 5, 952, 1, 0, 0, 0, 5, 954, 1, 0, 0, 0, 5, 956, 1, 0, 0, 0, 5, 958, 1, 0, 0, 0, 5, 960, 1, 0, 0, 0, 5, 962, 1, 0, 0, 0, 5, 964, 1, 0, 0, 0, 5, 966, 1, 0, 0, 0, 5, 968, 1, 0, 0, 0, 5, 970, 1, 0, 0, 0, 5, 972, 1, 0, 0, 0, 5, 974, 1, 0, 0, 0, 5, 976, 1, 0, 0, 0, 5, 978, 1, 0, 0, 0, 5, 980, 1, 0, 0, 0, 5, 982, 1, 0, 0, 0, 5, 984, 1, 0, 0, 0, 5, 986, 1, 0, 0, 0, 5, 988, 1, 0, 0, 0, 5, 990, 1, 0, 0, 0, 5, 992, 1, 0, 0, 0, 5, 994, 1, 0, 0, 0, 5, 996, 1, 0, 0, 0, 5, 998, 1, 0, 0, 0, 5, 1000, 1, 0, 0, 0, 5, 1002, 1, 0, 0, 0, 5, 1004, 1, 0, 0, 0, 5, 1006, 1, 0, 0, 0, 5, 1008, 1, 0, 0, 0, 5, 1010, 1, 0, 0, 0, 5, 1012, 1, 0, 0, 0, 5, 1014, 1, 0, 0, 0, 5, 1016, 1, 0, 0, 0, 5, 1018, 1, 0, 0, 0, 5, 1020, 1, 0, 0, 0, 5, 1022, 1, 0, 0, 0, 5, 1024, 1, 0, 0, 0, 5, 1026, 1, 0, 0, 0, 5, 1028, 1, 0, 0, 0, 5, 1030, 1, 0, 0, 0, 5, 1032, 1, 0, 0, 0, 5, 1034, 1, 0, 0, 0, 5, 1036, 1, 0, 0, 0, 5, 1038, 1, 0, 0, 0, 5, 1040, 1, 0, 0, 0, 5, 1042, 1, 0, 0, 0, 5, 1044, 1, 0, 0, 0, 5, 1046, 1, 0, 0, 0, 5, 1048, 1, 0, 0, 0, 5, 1050, 1, 0, 0, 0, 5, 1052, 1, 0, 0, 0, 5, 1054, 1, 0, 0, 0, 5, 1056, 1, 0, 0, 0, 5, 1058, 1, 0, 0, 0, 5, 1060, 1, 0, 0, 0, 5, 1062, 1, 0, 0, 0, 5, 1064, 1, 0, 0, 0, 5, 1066, 1, 0, 0, 0, 5, 1068, 1, 0, 0, 0, 5, 1070, 1, 0, 0, 0, 5, 1072, 1, 0, 0, 0, 5, 1074, 1, 0, 0, 0, 5, 1076, 1, 0, 0, 0, 5, 1078, 1, 0, 0, 0, 5, 1080, 1, 0, 0, 0, 5, 1082, 1, 0, 0, 0, 5, 1084, 1, 0, 0, 0, 5, 1086, 1, 0, 0, 0, 5, 1088, 1, 0, 0, 0, 5, 1090, 1, 0, 0, 0, 5, 1092, 1, 0, 0, 0, 5, 1094, 1, 0, 0, 0, 5, 1096, 1, 0, 0, 0, 5, 1098, 1, 0, 0, 0, 5, 1100, 1, 0, 0, 0, 5, 1102, 1, 0, 0, 0, 5, 1104, 1, 0, 0, 0, 5, 1106, 1, 0, 0, 0, 5, 1108, 1, 0, 0, 0, 5, 1110, 1, 0, 0, 0, 5, 1112, 1, 0, 0, 0, 5, 1114, 1, 0, 0, 0, 5, 1116, 1, 0, 0, 0, 5, 1118, 1, 0, 0, 0, 5, 1120, 1, 0, 0, 0, 5, 1122, 1, 0, 0, 0, 5, 1124, 1, 0, 0, 0, 5, 1126, 1, 0, 0, 0, 5, 1128, 1, 0, 0, 0, 5, 1130, 1, 0, 0, 0, 5, 1132, 1, 0, 0, 0, 5, 1134, 1, 0, 0, 0, 5, 1136, 1, 0, 0, 0, 5, 1138, 1, 0, 0, 0, 5, 1140, 1, 0, 0, 0, 5, 1142, 1, 0, 0, 0, 5, 1144, 1, 0, 0, 0, 5, 1146, 1, 0, 0, 0, 5, 1148, 1, 0, 0, 0, 5, 1150, 1, 0, 0, 0, 5, 1152, 1, 0, 0, 0, 5, 1154, 1, 0, 0, 0, 5, 1156, 1, 0, 0, 0, 5, 1158, 1, 0, 0, 0, 5, 1160, 1, 0, 0, 0, 5, 1162, 1, 0, 0, 0, 5, 1164, 1, 0, 0, 0, 5, 1166, 1, 0, 0, 0, 5, 1168, 1, 0, 0, 0, 5, 1170, 1, 0, 0, 0, 5, 1172, 1, 0, 0, 0, 5, 1174, 1, 0, 0, 0, 5, 1176, 1, 0, 0, 0, 5, 1178, 1, 0, 0, 0, 5, 1180, 1, 0, 0, 0, 5, 1182, 1, 0, 0, 0, 5, 1184, 1, 0, 0, 0, 5, 1186, 1, 0, 0, 0, 5, 1188, 1, 0, 0, 0, 5, 1190, 1, 0, 0, 0, 5, 1192, 1, 0, 0, 0, 5, 1194, 1, 0, 0, 0, 5, 1196, 1, 0, 0, 0, 5, 1198, 1, 0, 0, 0, 5, 1200, 1, 0, 0, 0, 5, 1202, 1, 0, 0, 0, 5, 1204, 1, 0, 0, 0, 5, 1206, 1, 0, 0, 0, 5, 1208, 1, 0, 0, 0, 5, 1210, 1, 0, 0, 0, 5, 1212, 1, 0, 0, 0, 5, 1214, 1, 0, 0, 0, 5, 1216, 1, 0, 0, 0, 5, 1218, 1, 0, 0, 0, 6, 1220, 1, 0, 0, 0, 8, 1232, 1, 0, 0, 0, 10, 1246, 1, 0, 0, 0, 12, 1376, 1, 0, 0, 0, 14, 1379, 1, 0, 0, 0, 16, 1383, 1, 0, 0, 0, 18, 1422, 1, 0, 0, 0, 20, 1424, 1, 0, 0, 0, 22, 1428, 1, 0, 0, 0, 24, 1432, 1, 0, 0, 0, 26, 1449, 1, 0, 0, 0, 28, 1467, 1, 0, 0, 0, 30, 1483, 1, 0, 0, 0, 32, 1503, 1, 0, 0, 0, 34, 1528, 1, 0, 0, 0, 36, 1534, 1, 0, 0, 0, 38, 1536, 1, 0, 0, 0, 40, 1539, 1, 0, 0, 0, 42, 1541, 1, 0, 0, 0, 44, 1543, 1, 0, 0, 0, 46, 1545, 1, 0, 0, 0, 48, 1547, 1, 0, 0, 0, 50, 1549, 1, 0, 0, 0, 52, 1551, 1, 0, 0, 0, 54, 1553, 1, 0, 0, 0, 56, 1555, 1, 0, 0, 0, 58, 1557, 1, 0, 0, 0, 60, 1559, 1, 0, 0, 0, 62, 1561, 1, 0, 0, 0, 64, 1564, 1, 0, 0, 0, 66, 1566, 1, 0, 0, 0, 68, 1569, 1, 0, 0, 0, 70, 1571, 1, 0, 0, 0, 72, 1573, 1, 0, 0, 0, 74, 1576, 1, 0, 0, 0, 76, 1578, 1, 0, 0, 0, 78, 1580, 1, 0, 0, 0, 80, 1582, 1, 0, 0, 0, 82, 1584, 1, 0, 0, 0, 84, 1586, 1, 0, 0, 0, 86, 1588, 1, 0, 0, 0, 88, 1590, 1, 0, 0, 0, 90, 1592, 1, 0, 0, 0, 92, 1594, 1, 0, 0, 0, 94, 1596, 1, 0, 0, 0, 96, 1598, 1, 0, 0, 0, 98, 1601, 1, 0, 0, 0, 100, 1603, 1, 0, 0, 0, 102, 1606, 1, 0, 0, 0, 104, 1608, 1, 0, 0, 0, 106, 1617, 1, 0, 0, 0, 108, 1626, 1, 0, 0, 0, 110, 1643, 1, 0, 0, 0, 112, 1647, 1, 0, 0, 0, 114, 1653, 1, 0, 0, 0, 116, 1656, 1, 0, 0, 0, 118, 1666, 1, 0, 0, 0, 120, 1669, 1, 0, 0, 0, 122, 1679, 1, 0, 0, 0, 124, 1688, 1, 0, 0, 0, 126, 1703, 1, 0, 0, 0, 128, 1710, 1, 0, 0, 0, 130, 1713, 1, 0, 0, 0, 132, 1718, 1, 0, 0, 0, 134, 1723, 1, 0, 0, 0, 136, 1732, 1, 0, 0, 0, 138, 1738, 1, 0, 0, 0, 140, 1744, 1, 0, 0, 0, 142, 1754, 1, 0, 0, 0, 144, 1762, 1, 0, 0, 0, 146, 1775, 1, 0, 0, 0, 148, 1783, 1, 0, 0, 0, 150, 1799, 1, 0, 0, 0, 152, 1805, 1, 0, 0, 0, 154, 1813, 1, 0, 0, 0, 156, 1821, 1, 0, 0, 0, 158, 1832, 1, 0, 0, 0, 160, 1851, 1, 0, 0, 0, 162, 1862, 1, 0, 0, 0, 164, 1877, 1, 0, 0, 0, 166, 1881, 1, 0, 0, 0, 168, 1890, 1, 0, 0, 0, 170, 1904, 1, 0, 0, 0, 172, 1912, 1, 0, 0, 0, 174, 1917, 1, 0, 0, 0, 176, 1923, 1, 0, 0, 0, 178, 1938, 1, 0, 0, 0, 180, 1947, 1, 0, 0, 0, 182, 1951, 1, 0, 0, 0, 184, 1954, 1, 0, 0, 0, 186, 1960, 1, 0, 0, 0, 188, 1967, 1, 0, 0, 0, 190, 1976, 1, 0, 0, 0, 192, 1986, 1, 0, 0, 0, 194, 2004, 1, 0, 0, 0, 196, 2008, 1, 0, 0, 0, 198, 2017, 1, 0, 0, 0, 200, 2020, 1, 0, 0, 0, 202, 2029, 1, 0, 0, 0, 204, 2035, 1, 0, 0, 0, 206, 2038, 1, 0, 0, 0, 208, 2043, 1, 0, 0, 0, 210, 2046, 1, 0, 0, 0, 212, 2053, 1, 0, 0, 0, 214, 2056, 1, 0, 0, 0, 216, 2064, 1, 0, 0, 0, 218, 2073, 1, 0, 0, 0, 220, 2083, 1, 0, 0, 0, 222, 2086, 1, 0, 0, 0, 224, 2091, 1, 0, 0, 0, 226, 2095, 1, 0, 0, 0, 228, 2098, 1, 0, 0, 0, 230, 2104, 1, 0, 0, 0, 232, 2108, 1, 0, 0, 0, 234, 2111, 1, 0, 0, 0, 236, 2115, 1, 0, 0, 0, 238, 2119, 1, 0, 0, 0, 240, 2126, 1, 0, 0, 0, 242, 2136, 1, 0, 0, 0, 244, 2139, 1, 0, 0, 0, 246, 2144, 1, 0, 0, 0, 248, 2159, 1, 0, 0, 0, 250, 2170, 1, 0, 0, 0, 252, 2182, 1, 0, 0, 0, 254, 2187, 1, 0, 0, 0, 256, 2190, 1, 0, 0, 0, 258, 2195, 1, 0, 0, 0, 260, 2202, 1, 0, 0, 0, 262, 2205, 1, 0, 0, 0, 264, 2211, 1, 0, 0, 0, 266, 2219, 1, 0, 0, 0, 268, 2228, 1, 0, 0, 0, 270, 2235, 1, 0, 0, 0, 272, 2245, 1, 0, 0, 0, 274, 2263, 1, 0, 0, 0, 276, 2272, 1, 0, 0, 0, 278, 2281, 1, 0, 0, 0, 280, 2304, 1, 0, 0, 0, 282, 2311, 1, 0, 0, 0, 284, 2321, 1, 0, 0, 0, 286, 2328, 1, 0, 0, 0, 288, 2345, 1, 0, 0, 0, 290, 2360, 1, 0, 0, 0, 292, 2365, 1, 0, 0, 0, 294, 2373, 1, 0, 0, 0, 296, 2378, 1, 0, 0, 0, 298, 2385, 1, 0, 0, 0, 300, 2391, 1, 0, 0, 0, 302, 2398, 1, 0, 0, 0, 304, 2404, 1, 0, 0, 0, 306, 2411, 1, 0, 0, 0, 308, 2416, 1, 0, 0, 0, 310, 2421, 1, 0, 0, 0, 312, 2424, 1, 0, 0, 0, 314, 2430, 1, 0, 0, 0, 316, 2434, 1, 0, 0, 0, 318, 2443, 1, 0, 0, 0, 320, 2448, 1, 0, 0, 0, 322, 2459, 1, 0, 0, 0, 324, 2465, 1, 0, 0, 0, 326, 2475, 1, 0, 0, 0, 328, 2482, 1, 0, 0, 0, 330, 2491, 1, 0, 0, 0, 332, 2500, 1, 0, 0, 0, 334, 2508, 1, 0, 0, 0, 336, 2513, 1, 0, 0, 0, 338, 2519, 1, 0, 0, 0, 340, 2526, 1, 0, 0, 0, 342, 2533, 1, 0, 0, 0, 344, 2544, 1, 0, 0, 0, 346, 2557, 1, 0, 0, 0, 348, 2567, 1, 0, 0, 0, 350, 2579, 1, 0, 0, 0, 352, 2591, 1, 0, 0, 0, 354, 2599, 1, 0, 0, 0, 356, 2604, 1, 0, 0, 0, 358, 2610, 1, 0, 0, 0, 360, 2617, 1, 0, 0, 0, 362, 2622, 1, 0, 0, 0, 364, 2629, 1, 0, 0, 0, 366, 2636, 1, 0, 0, 0, 368, 2649, 1, 0, 0, 0, 370, 2653, 1, 0, 0, 0, 372, 2657, 1, 0, 0, 0, 374, 2661, 1, 0, 0, 0, 376, 2669, 1, 0, 0, 0, 378, 2673, 1, 0, 0, 0, 380, 2675, 1, 0, 0, 0, 382, 2680, 1, 0, 0, 0, 384, 2686, 1, 0, 0, 0, 386, 2700, 1, 0, 0, 0, 388, 2729, 1, 0, 0, 0, 390, 2731, 1, 0, 0, 0, 392, 2737, 1, 0, 0, 0, 394, 2742, 1, 0, 0, 0, 396, 2744, 1, 0, 0, 0, 398, 2746, 1, 0, 0, 0, 400, 2750, 1, 0, 0, 0, 402, 2754, 1, 0, 0, 0, 404, 2758, 1, 0, 0, 0, 406, 2763, 1, 0, 0, 0, 408, 2769, 1, 0, 0, 0, 410, 2774, 1, 0, 0, 0, 412, 2779, 1, 0, 0, 0, 414, 2784, 1, 0, 0, 0, 416, 2789, 1, 0, 0, 0, 418, 2794, 1, 0, 0, 0, 420, 2798, 1, 0, 0, 0, 422, 2839, 1, 0, 0, 0, 424, 2843, 1, 0, 0, 0, 426, 2847, 1, 0, 0, 0, 428, 2852, 1, 0, 0, 0, 430, 2857, 1, 0, 0, 0, 432, 2862, 1, 0, 0, 0, 434, 2867, 1, 0, 0, 0, 436, 2872, 1, 0, 0, 0, 438, 2876, 1, 0, 0, 0, 440, 2917, 1, 0, 0, 0, 442, 2921, 1, 0, 0, 0, 444, 2925, 1, 0, 0, 0, 446, 2939, 1, 0, 0, 0, 448, 2955, 1, 0, 0, 0, 450, 3087, 1, 0, 0, 0, 452, 3091, 1, 0, 0, 0, 454, 3132, 1, 0, 0, 0, 456, 3136, 1, 0, 0, 0, 458, 3141, 1, 0, 0, 0, 460, 3146, 1, 0, 0, 0, 462, 3152, 1, 0, 0, 0, 464, 3171, 1, 0, 0, 0, 466, 3191, 1, 0, 0, 0, 468, 3209, 1, 0, 0, 0, 470, 3231, 1, 0, 0, 0, 472, 3258, 1, 0, 0, 0, 474, 3265, 1, 0, 0, 0, 476, 3269, 1, 0, 0, 0, 478, 3274, 1, 0, 0, 0, 480, 3278, 1, 0, 0, 0, 482, 3282, 1, 0, 0, 0, 484, 3286, 1, 0, 0, 0, 486, 3290, 1, 0, 0, 0, 488, 3295, 1, 0, 0, 0, 490, 3301, 1, 0, 0, 0, 492, 3307, 1, 0, 0, 0, 494, 3311, 1, 0, 0, 0, 496, 3315, 1, 0, 0, 0, 498, 3319, 1, 0, 0, 0, 500, 3323, 1, 0, 0, 0, 502, 3327, 1, 0, 0, 0, 504, 3332, 1, 0, 0, 0, 506, 3336, 1, 0, 0, 0, 508, 3341, 1, 0, 0, 0, 510, 3345, 1, 0, 0, 0, 512, 3349, 1, 0, 0, 0, 514, 3354, 1, 0, 0, 0, 516, 3358, 1, 0, 0, 0, 518, 3362, 1, 0, 0, 0, 520, 3366, 1, 0, 0, 0, 522, 3370, 1, 0, 0, 0, 524, 3374, 1, 0, 0, 0, 526, 3378, 1, 0, 0, 0, 528, 3382, 1, 0, 0, 0, 530, 3386, 1, 0, 0, 0, 532, 3390, 1, 0, 0, 0, 534, 3394, 1, 0, 0, 0, 536, 3398, 1, 0, 0, 0, 538, 3403, 1, 0, 0, 0, 540, 3407, 1, 0, 0, 0, 542, 3412, 1, 0, 0, 0, 544, 3416, 1, 0, 0, 0, 546, 3427, 1, 0, 0, 0, 548, 3438, 1, 0, 0, 0, 550, 3457, 1, 0, 0, 0, 552, 3463, 1, 0, 0, 0, 554, 3471, 1, 0, 0, 0, 556, 3476, 1, 0, 0, 0, 558, 3488, 1, 0, 0, 0, 560, 3493, 1, 0, 0, 0, 562, 3505, 1, 0, 0, 0, 564, 3516, 1, 0, 0, 0, 566, 3533, 1, 0, 0, 0, 568, 3542, 1, 0, 0, 0, 570, 3547, 1, 0, 0, 0, 572, 3554, 1, 0, 0, 0, 574, 3561, 1, 0, 0, 0, 576, 3572, 1, 0, 0, 0, 578, 3580, 1, 0, 0, 0, 580, 3588, 1, 0, 0, 0, 582, 3600, 1, 0, 0, 0, 584, 3610, 1, 0, 0, 0, 586, 3625, 1, 0, 0, 0, 588, 3635, 1, 0, 0, 0, 590, 3653, 1, 0, 0, 0, 592, 3661, 1, 0, 0, 0, 594, 3671, 1, 0, 0, 0, 596, 3681, 1, 0, 0, 0, 598, 3694, 1, 0, 0, 0, 600, 3715, 1, 0, 0, 0, 602, 3728, 1, 0, 0, 0, 604, 3745, 1, 0, 0, 0, 606, 3751, 1, 0, 0, 0, 608, 3762, 1, 0, 0, 0, 610, 3778, 1, 0, 0, 0, 612, 3788, 1, 0, 0, 0, 614, 3795, 1, 0, 0, 0, 616, 3803, 1, 0, 0, 0, 618, 3820, 1, 0, 0, 0, 620, 3831, 1, 0, 0, 0, 622, 3837, 1, 0, 0, 0, 624, 3842, 1, 0, 0, 0, 626, 3850, 1, 0, 0, 0, 628, 3859, 1, 0, 0, 0, 630, 3870, 1, 0, 0, 0, 632, 3882, 1, 0, 0, 0, 634, 3902, 1, 0, 0, 0, 636, 3908, 1, 0, 0, 0, 638, 3919, 1, 0, 0, 0, 640, 3924, 1, 0, 0, 0, 642, 3935, 1, 0, 0, 0, 644, 3943, 1, 0, 0, 0, 646, 3948, 1, 0, 0, 0, 648, 3955, 1, 0, 0, 0, 650, 3960, 1, 0, 0, 0, 652, 3969, 1, 0, 0, 0, 654, 3974, 1, 0, 0, 0, 656, 3984, 1, 0, 0, 0, 658, 3995, 1, 0, 0, 0, 660, 4007, 1, 0, 0, 0, 662, 4012, 1, 0, 0, 0, 664, 4019, 1, 0, 0, 0, 666, 4025, 1, 0, 0, 0, 668, 4030, 1, 0, 0, 0, 670, 4038, 1, 0, 0, 0, 672, 4044, 1, 0, 0, 0, 674, 4049, 1, 0, 0, 0, 676, 4055, 1, 0, 0, 0, 678, 4061, 1, 0, 0, 0, 680, 4070, 1, 0, 0, 0, 682, 4082, 1, 0, 0, 0, 684, 4087, 1, 0, 0, 0, 686, 4094, 1, 0, 0, 0, 688, 4111, 1, 0, 0, 0, 690, 4124, 1, 0, 0, 0, 692, 4138, 1, 0, 0, 0, 694, 4145, 1, 0, 0, 0, 696, 4150, 1, 0, 0, 0, 698, 4157, 1, 0, 0, 0, 700, 4166, 1, 0, 0, 0, 702, 4171, 1, 0, 0, 0, 704, 4179, 1, 0, 0, 0, 706, 4189, 1, 0, 0, 0, 708, 4200, 1, 0, 0, 0, 710, 4209, 1, 0, 0, 0, 712, 4221, 1, 0, 0, 0, 714, 4241, 1, 0, 0, 0, 716, 4252, 1, 0, 0, 0, 718, 4263, 1, 0, 0, 0, 720, 4288, 1, 0, 0, 0, 722, 4297, 1, 0, 0, 0, 724, 4309, 1, 0, 0, 0, 726, 4318, 1, 0, 0, 0, 728, 4337, 1, 0, 0, 0, 730, 4354, 1, 0, 0, 0, 732, 4361, 1, 0, 0, 0, 734, 4371, 1, 0, 0, 0, 736, 4378, 1, 0, 0, 0, 738, 4387, 1, 0, 0, 0, 740, 4395, 1, 0, 0, 0, 742, 4404, 1, 0, 0, 0, 744, 4412, 1, 0, 0, 0, 746, 4421, 1, 0, 0, 0, 748, 4428, 1, 0, 0, 0, 750, 4435, 1, 0, 0, 0, 752, 4440, 1, 0, 0, 0, 754, 4448, 1, 0, 0, 0, 756, 4454, 1, 0, 0, 0, 758, 4465, 1, 0, 0, 0, 760, 4472, 1, 0, 0, 0, 762, 4485, 1, 0, 0, 0, 764, 4493, 1, 0, 0, 0, 766, 4505, 1, 0, 0, 0, 768, 4514, 1, 0, 0, 0, 770, 4525, 1, 0, 0, 0, 772, 4536, 1, 0, 0, 0, 774, 4546, 1, 0, 0, 0, 776, 4553, 1, 0, 0, 0, 778, 4561, 1, 0, 0, 0, 780, 4570, 1, 0, 0, 0, 782, 4579, 1, 0, 0, 0, 784, 4592, 1, 0, 0, 0, 786, 4607, 1, 0, 0, 0, 788, 4619, 1, 0, 0, 0, 790, 4633, 1, 0, 0, 0, 792, 4647, 1, 0, 0, 0, 794, 4657, 1, 0, 0, 0, 796, 4664, 1, 0, 0, 0, 798, 4672, 1, 0, 0, 0, 800, 4681, 1, 0, 0, 0, 802, 4688, 1, 0, 0, 0, 804, 4697, 1, 0, 0, 0, 806, 4706, 1, 0, 0, 0, 808, 4721, 1, 0, 0, 0, 810, 4727, 1, 0, 0, 0, 812, 4733, 1, 0, 0, 0, 814, 4739, 1, 0, 0, 0, 816, 4748, 1, 0, 0, 0, 818, 4755, 1, 0, 0, 0, 820, 4763, 1, 0, 0, 0, 822, 4779, 1, 0, 0, 0, 824, 4809, 1, 0, 0, 0, 826, 4813, 1, 0, 0, 0, 828, 4820, 1, 0, 0, 0, 830, 4826, 1, 0, 0, 0, 832, 4830, 1, 0, 0, 0, 834, 4844, 1, 0, 0, 0, 836, 4860, 1, 0, 0, 0, 838, 4992, 1, 0, 0, 0, 840, 4996, 1, 0, 0, 0, 842, 5037, 1, 0, 0, 0, 844, 5041, 1, 0, 0, 0, 846, 5046, 1, 0, 0, 0, 848, 5051, 1, 0, 0, 0, 850, 5057, 1, 0, 0, 0, 852, 5076, 1, 0, 0, 0, 854, 5096, 1, 0, 0, 0, 856, 5114, 1, 0, 0, 0, 858, 5136, 1, 0, 0, 0, 860, 5163, 1, 0, 0, 0, 862, 5170, 1, 0, 0, 0, 864, 5174, 1, 0, 0, 0, 866, 5179, 1, 0, 0, 0, 868, 5183, 1, 0, 0, 0, 870, 5187, 1, 0, 0, 0, 872, 5191, 1, 0, 0, 0, 874, 5195, 1, 0, 0, 0, 876, 5200, 1, 0, 0, 0, 878, 5206, 1, 0, 0, 0, 880, 5212, 1, 0, 0, 0, 882, 5216, 1, 0, 0, 0, 884, 5220, 1, 0, 0, 0, 886, 5224, 1, 0, 0, 0, 888, 5228, 1, 0, 0, 0, 890, 5232, 1, 0, 0, 0, 892, 5237, 1, 0, 0, 0, 894, 5241, 1, 0, 0, 0, 896, 5246, 1, 0, 0, 0, 898, 5250, 1, 0, 0, 0, 900, 5254, 1, 0, 0, 0, 902, 5259, 1, 0, 0, 0, 904, 5263, 1, 0, 0, 0, 906, 5267, 1, 0, 0, 0, 908, 5271, 1, 0, 0, 0, 910, 5275, 1, 0, 0, 0, 912, 5279, 1, 0, 0, 0, 914, 5283, 1, 0, 0, 0, 916, 5287, 1, 0, 0, 0, 918, 5291, 1, 0, 0, 0, 920, 5295, 1, 0, 0, 0, 922, 5299, 1, 0, 0, 0, 924, 5303, 1, 0, 0, 0, 926, 5308, 1, 0, 0, 0, 928, 5312, 1, 0, 0, 0, 930, 5317, 1, 0, 0, 0, 932, 5321, 1, 0, 0, 0, 934, 5332, 1, 0, 0, 0, 936, 5343, 1, 0, 0, 0, 938, 5362, 1, 0, 0, 0, 940, 5368, 1, 0, 0, 0, 942, 5376, 1, 0, 0, 0, 944, 5381, 1, 0, 0, 0, 946, 5393, 1, 0, 0, 0, 948, 5398, 1, 0, 0, 0, 950, 5410, 1, 0, 0, 0, 952, 5421, 1, 0, 0, 0, 954, 5438, 1, 0, 0, 0, 956, 5447, 1, 0, 0, 0, 958, 5452, 1, 0, 0, 0, 960, 5459, 1, 0, 0, 0, 962, 5466, 1, 0, 0, 0, 964, 5477, 1, 0, 0, 0, 966, 5485, 1, 0, 0, 0, 968, 5493, 1, 0, 0, 0, 970, 5505, 1, 0, 0, 0, 972, 5515, 1, 0, 0, 0, 974, 5530, 1, 0, 0, 0, 976, 5540, 1, 0, 0, 0, 978, 5558, 1, 0, 0, 0, 980, 5566, 1, 0, 0, 0, 982, 5576, 1, 0, 0, 0, 984, 5586, 1, 0, 0, 0, 986, 5599, 1, 0, 0, 0, 988, 5620, 1, 0, 0, 0, 990, 5633, 1, 0, 0, 0, 992, 5650, 1, 0, 0, 0, 994, 5656, 1, 0, 0, 0, 996, 5667, 1, 0, 0, 0, 998, 5683, 1, 0, 0, 0, 1000, 5693, 1, 0, 0, 0, 1002, 5700, 1, 0, 0, 0, 1004, 5708, 1, 0, 0, 0, 1006, 5725, 1, 0, 0, 0, 1008, 5736, 1, 0, 0, 0, 1010, 5742, 1, 0, 0, 0, 1012, 5747, 1, 0, 0, 0, 1014, 5755, 1, 0, 0, 0, 1016, 5764, 1, 0, 0, 0, 1018, 5775, 1, 0, 0, 0, 1020, 5787, 1, 0, 0, 0, 1022, 5807, 1, 0, 0, 0, 1024, 5813, 1, 0, 0, 0, 1026, 5824, 1, 0, 0, 0, 1028, 5829, 1, 0, 0, 0, 1030, 5840, 1, 0, 0, 0, 1032, 5848, 1, 0, 0, 0, 1034, 5853, 1, 0, 0, 0, 1036, 5860, 1, 0, 0, 0, 1038, 5865, 1, 0, 0, 0, 1040, 5874, 1, 0, 0, 0, 1042, 5879, 1, 0, 0, 0, 1044, 5889, 1, 0, 0, 0, 1046, 5900, 1, 0, 0, 0, 1048, 5912, 1, 0, 0, 0, 1050, 5917, 1, 0, 0, 0, 1052, 5924, 1, 0, 0, 0, 1054, 5930, 1, 0, 0, 0, 1056, 5935, 1, 0, 0, 0, 1058, 5943, 1, 0, 0, 0, 1060, 5949, 1, 0, 0, 0, 1062, 5954, 1, 0, 0, 0, 1064, 5960, 1, 0, 0, 0, 1066, 5966, 1, 0, 0, 0, 1068, 5975, 1, 0, 0, 0, 1070, 5987, 1, 0, 0, 0, 1072, 5992, 1, 0, 0, 0, 1074, 5999, 1, 0, 0, 0, 1076, 6016, 1, 0, 0, 0, 1078, 6029, 1, 0, 0, 0, 1080, 6043, 1, 0, 0, 0, 1082, 6050, 1, 0, 0, 0, 1084, 6055, 1, 0, 0, 0, 1086, 6062, 1, 0, 0, 0, 1088, 6071, 1, 0, 0, 0, 1090, 6076, 1, 0, 0, 0, 1092, 6084, 1, 0, 0, 0, 1094, 6094, 1, 0, 0, 0, 1096, 6105, 1, 0, 0, 0, 1098, 6114, 1, 0, 0, 0, 1100, 6126, 1, 0, 0, 0, 1102, 6146, 1, 0, 0, 0, 1104, 6157, 1, 0, 0, 0, 1106, 6168, 1, 0, 0, 0, 1108, 6193, 1, 0, 0, 0, 1110, 6202, 1, 0, 0, 0, 1112, 6214, 1, 0, 0, 0, 1114, 6223, 1, 0, 0, 0, 1116, 6242, 1, 0, 0, 0, 1118, 6259, 1, 0, 0, 0, 1120, 6266, 1, 0, 0, 0, 1122, 6276, 1, 0, 0, 0, 1124, 6283, 1, 0, 0, 0, 1126, 6292, 1, 0, 0, 0, 1128, 6300, 1, 0, 0, 0, 1130, 6309, 1, 0, 0, 0, 1132, 6317, 1, 0, 0, 0, 1134, 6326, 1, 0, 0, 0, 1136, 6333, 1, 0, 0, 0, 1138, 6340, 1, 0, 0, 0, 1140, 6345, 1, 0, 0, 0, 1142, 6353, 1, 0, 0, 0, 1144, 6359, 1, 0, 0, 0, 1146, 6370, 1, 0, 0, 0, 1148, 6377, 1, 0, 0, 0, 1150, 6390, 1, 0, 0, 0, 1152, 6398, 1, 0, 0, 0, 1154, 6410, 1, 0, 0, 0, 1156, 6419, 1, 0, 0, 0, 1158, 6430, 1, 0, 0, 0, 1160, 6441, 1, 0, 0, 0, 1162, 6451, 1, 0, 0, 0, 1164, 6458, 1, 0, 0, 0, 1166, 6466, 1, 0, 0, 0, 1168, 6475, 1, 0, 0, 0, 1170, 6484, 1, 0, 0, 0, 1172, 6497, 1, 0, 0, 0, 1174, 6512, 1, 0, 0, 0, 1176, 6524, 1, 0, 0, 0, 1178, 6538, 1, 0, 0, 0, 1180, 6552, 1, 0, 0, 0, 1182, 6562, 1, 0, 0, 0, 1184, 6569, 1, 0, 0, 0, 1186, 6577, 1, 0, 0, 0, 1188, 6586, 1, 0, 0, 0, 1190, 6593, 1, 0, 0, 0, 1192, 6602, 1, 0, 0, 0, 1194, 6611, 1, 0, 0, 0, 1196, 6626, 1, 0, 0, 0, 1198, 6632, 1, 0, 0, 0, 1200, 6638, 1, 0, 0, 0, 1202, 6644, 1, 0, 0, 0, 1204, 6653, 1, 0, 0, 0, 1206, 6660, 1, 0, 0, 0, 1208, 6668, 1, 0, 0, 0, 1210, 6684, 1, 0, 0, 0, 1212, 6714, 1, 0, 0, 0, 1214, 6718, 1, 0, 0, 0, 1216, 6725, 1, 0, 0, 0, 1218, 6731, 1, 0, 0, 0, 1220, 1221, 3, 14, 4, 0, 1221, 7, 1, 0, 0, 0, 1222, 1223, 5, 46, 0, 0, 1223, 1233, 3, 14, 4, 0, 1224, 1225, 3, 14, 4, 0, 1225, 1229, 5, 46, 0, 0, 1226, 1228, 7, 0, 0, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1233, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1222, 1, 0, 0, 0, 1232, 1224, 1, 0, 0, 0, 1233, 9, 1, 0, 0, 0, 1234, 1235, 5, 46, 0, 0, 1235, 1247, 3, 14, 4, 0, 1236, 1244, 3, 14, 4, 0, 1237, 1241, 5, 46, 0, 0, 1238, 1240, 7, 0, 0, 0, 1239, 1238, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1245, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1237, 1, 0, 0, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1247, 1, 0, 0, 0, 1246, 1234, 1, 0, 0, 0, 1246, 1236, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1250, 7, 1, 0, 0, 1249, 1251, 7, 2, 0, 0, 1250, 1249, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 1, 0, 0, 0, 1252, 1253, 3, 14, 4, 0, 1253, 11, 1, 0, 0, 0, 1254, 1255, 5, 100, 0, 0, 1255, 1256, 5, 101, 0, 0, 1256, 1257, 5, 99, 0, 0, 1257, 1258, 5, 105, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 97, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 45, 0, 0, 1262, 1263, 5, 115, 0, 0, 1263, 1264, 5, 101, 0, 0, 1264, 1265, 5, 112, 0, 0, 1265, 1266, 5, 97, 0, 0, 1266, 1267, 5, 114, 0, 0, 1267, 1268, 5, 97, 0, 0, 1268, 1269, 5, 116, 0, 0, 1269, 1270, 5, 111, 0, 0, 1270, 1377, 5, 114, 0, 0, 1271, 1272, 5, 103, 0, 0, 1272, 1273, 5, 114, 0, 0, 1273, 1274, 5, 111, 0, 0, 1274, 1275, 5, 117, 0, 0, 1275, 1276, 5, 112, 0, 0, 1276, 1277, 5, 105, 0, 0, 1277, 1278, 5, 110, 0, 0, 1278, 1279, 5, 103, 0, 0, 1279, 1280, 5, 45, 0, 0, 1280, 1281, 5, 115, 0, 0, 1281, 1282, 5, 101, 0, 0, 1282, 1283, 5, 112, 0, 0, 1283, 1284, 5, 97, 0, 0, 1284, 1285, 5, 114, 0, 0, 1285, 1286, 5, 97, 0, 0, 1286, 1287, 5, 116, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1377, 5, 114, 0, 0, 1289, 1290, 5, 105, 0, 0, 1290, 1291, 5, 110, 0, 0, 1291, 1292, 5, 102, 0, 0, 1292, 1293, 5, 105, 0, 0, 1293, 1294, 5, 110, 0, 0, 1294, 1295, 5, 105, 0, 0, 1295, 1296, 5, 116, 0, 0, 1296, 1377, 5, 121, 0, 0, 1297, 1298, 5, 109, 0, 0, 1298, 1299, 5, 105, 0, 0, 1299, 1300, 5, 110, 0, 0, 1300, 1301, 5, 117, 0, 0, 1301, 1302, 5, 115, 0, 0, 1302, 1303, 5, 45, 0, 0, 1303, 1304, 5, 115, 0, 0, 1304, 1305, 5, 105, 0, 0, 1305, 1306, 5, 103, 0, 0, 1306, 1377, 5, 110, 0, 0, 1307, 1308, 5, 78, 0, 0, 1308, 1309, 5, 97, 0, 0, 1309, 1377, 5, 78, 0, 0, 1310, 1311, 5, 112, 0, 0, 1311, 1312, 5, 101, 0, 0, 1312, 1313, 5, 114, 0, 0, 1313, 1314, 5, 99, 0, 0, 1314, 1315, 5, 101, 0, 0, 1315, 1316, 5, 110, 0, 0, 1316, 1377, 5, 116, 0, 0, 1317, 1318, 5, 112, 0, 0, 1318, 1319, 5, 101, 0, 0, 1319, 1320, 5, 114, 0, 0, 1320, 1321, 5, 45, 0, 0, 1321, 1322, 5, 109, 0, 0, 1322, 1323, 5, 105, 0, 0, 1323, 1324, 5, 108, 0, 0, 1324, 1325, 5, 108, 0, 0, 1325, 1377, 5, 101, 0, 0, 1326, 1327, 5, 122, 0, 0, 1327, 1328, 5, 101, 0, 0, 1328, 1329, 5, 114, 0, 0, 1329, 1330, 5, 111, 0, 0, 1330, 1331, 5, 45, 0, 0, 1331, 1332, 5, 100, 0, 0, 1332, 1333, 5, 105, 0, 0, 1333, 1334, 5, 103, 0, 0, 1334, 1335, 5, 105, 0, 0, 1335, 1377, 5, 116, 0, 0, 1336, 1337, 5, 100, 0, 0, 1337, 1338, 5, 105, 0, 0, 1338, 1339, 5, 103, 0, 0, 1339, 1340, 5, 105, 0, 0, 1340, 1377, 5, 116, 0, 0, 1341, 1342, 5, 112, 0, 0, 1342, 1343, 5, 97, 0, 0, 1343, 1344, 5, 116, 0, 0, 1344, 1345, 5, 116, 0, 0, 1345, 1346, 5, 101, 0, 0, 1346, 1347, 5, 114, 0, 0, 1347, 1348, 5, 110, 0, 0, 1348, 1349, 5, 45, 0, 0, 1349, 1350, 5, 115, 0, 0, 1350, 1351, 5, 101, 0, 0, 1351, 1352, 5, 112, 0, 0, 1352, 1353, 5, 97, 0, 0, 1353, 1354, 5, 114, 0, 0, 1354, 1355, 5, 97, 0, 0, 1355, 1356, 5, 116, 0, 0, 1356, 1357, 5, 111, 0, 0, 1357, 1377, 5, 114, 0, 0, 1358, 1359, 5, 101, 0, 0, 1359, 1360, 5, 120, 0, 0, 1360, 1361, 5, 112, 0, 0, 1361, 1362, 5, 111, 0, 0, 1362, 1363, 5, 110, 0, 0, 1363, 1364, 5, 101, 0, 0, 1364, 1365, 5, 110, 0, 0, 1365, 1366, 5, 116, 0, 0, 1366, 1367, 5, 45, 0, 0, 1367, 1368, 5, 115, 0, 0, 1368, 1369, 5, 101, 0, 0, 1369, 1370, 5, 112, 0, 0, 1370, 1371, 5, 97, 0, 0, 1371, 1372, 5, 114, 0, 0, 1372, 1373, 5, 97, 0, 0, 1373, 1374, 5, 116, 0, 0, 1374, 1375, 5, 111, 0, 0, 1375, 1377, 5, 114, 0, 0, 1376, 1254, 1, 0, 0, 0, 1376, 1271, 1, 0, 0, 0, 1376, 1289, 1, 0, 0, 0, 1376, 1297, 1, 0, 0, 0, 1376, 1307, 1, 0, 0, 0, 1376, 1310, 1, 0, 0, 0, 1376, 1317, 1, 0, 0, 0, 1376, 1326, 1, 0, 0, 0, 1376, 1336, 1, 0, 0, 0, 1376, 1341, 1, 0, 0, 0, 1376, 1358, 1, 0, 0, 0, 1377, 13, 1, 0, 0, 0, 1378, 1380, 7, 0, 0, 0, 1379, 1378, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 15, 1, 0, 0, 0, 1383, 1399, 5, 38, 0, 0, 1384, 1385, 5, 108, 0, 0, 1385, 1400, 5, 116, 0, 0, 1386, 1387, 5, 103, 0, 0, 1387, 1400, 5, 116, 0, 0, 1388, 1389, 5, 97, 0, 0, 1389, 1390, 5, 109, 0, 0, 1390, 1400, 5, 112, 0, 0, 1391, 1392, 5, 113, 0, 0, 1392, 1393, 5, 117, 0, 0, 1393, 1394, 5, 111, 0, 0, 1394, 1400, 5, 116, 0, 0, 1395, 1396, 5, 97, 0, 0, 1396, 1397, 5, 112, 0, 0, 1397, 1398, 5, 111, 0, 0, 1398, 1400, 5, 115, 0, 0, 1399, 1384, 1, 0, 0, 0, 1399, 1386, 1, 0, 0, 0, 1399, 1388, 1, 0, 0, 0, 1399, 1391, 1, 0, 0, 0, 1399, 1395, 1, 0, 0, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 5, 59, 0, 0, 1402, 17, 1, 0, 0, 0, 1403, 1404, 5, 38, 0, 0, 1404, 1405, 5, 35, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1408, 7, 0, 0, 0, 1407, 1406, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1407, 1, 0, 0, 0, 1409, 1410, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1423, 5, 59, 0, 0, 1412, 1413, 5, 38, 0, 0, 1413, 1414, 5, 35, 0, 0, 1414, 1415, 5, 120, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1418, 7, 3, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1417, 1, 0, 0, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 5, 59, 0, 0, 1422, 1403, 1, 0, 0, 0, 1422, 1412, 1, 0, 0, 0, 1423, 19, 1, 0, 0, 0, 1424, 1425, 5, 34, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 7, 0, 0, 1427, 21, 1, 0, 0, 0, 1428, 1429, 5, 39, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 8, 1, 0, 1431, 23, 1, 0, 0, 0, 1432, 1433, 5, 60, 0, 0, 1433, 1434, 5, 33, 0, 0, 1434, 1435, 5, 45, 0, 0, 1435, 1436, 5, 45, 0, 0, 1436, 1442, 1, 0, 0, 0, 1437, 1438, 5, 45, 0, 0, 1438, 1441, 8, 4, 0, 0, 1439, 1441, 8, 4, 0, 0, 1440, 1437, 1, 0, 0, 0, 1440, 1439, 1, 0, 0, 0, 1441, 1444, 1, 0, 0, 0, 1442, 1440, 1, 0, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1445, 1, 0, 0, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1446, 5, 45, 0, 0, 1446, 1447, 5, 45, 0, 0, 1447, 1448, 5, 62, 0, 0, 1448, 25, 1, 0, 0, 0, 1449, 1450, 5, 60, 0, 0, 1450, 1451, 5, 63, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 7, 5, 0, 0, 1453, 1454, 7, 6, 0, 0, 1454, 1462, 7, 7, 0, 0, 1455, 1459, 7, 8, 0, 0, 1456, 1458, 9, 0, 0, 0, 1457, 1456, 1, 0, 0, 0, 1458, 1461, 1, 0, 0, 0, 1459, 1460, 1, 0, 0, 0, 1459, 1457, 1, 0, 0, 0, 1460, 1463, 1, 0, 0, 0, 1461, 1459, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1462, 1463, 1, 0, 0, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 5, 63, 0, 0, 1465, 1466, 5, 62, 0, 0, 1466, 27, 1, 0, 0, 0, 1467, 1468, 5, 60, 0, 0, 1468, 1469, 5, 63, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1478, 3, 374, 184, 0, 1471, 1475, 7, 8, 0, 0, 1472, 1474, 9, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1476, 1479, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1471, 1, 0, 0, 0, 1478, 1479, 1, 0, 0, 0, 1479, 1480, 1, 0, 0, 0, 1480, 1481, 5, 63, 0, 0, 1481, 1482, 5, 62, 0, 0, 1482, 29, 1, 0, 0, 0, 1483, 1484, 5, 60, 0, 0, 1484, 1485, 5, 33, 0, 0, 1485, 1486, 5, 91, 0, 0, 1486, 1487, 5, 67, 0, 0, 1487, 1488, 5, 68, 0, 0, 1488, 1489, 5, 65, 0, 0, 1489, 1490, 5, 84, 0, 0, 1490, 1491, 5, 65, 0, 0, 1491, 1492, 5, 91, 0, 0, 1492, 1496, 1, 0, 0, 0, 1493, 1495, 9, 0, 0, 0, 1494, 1493, 1, 0, 0, 0, 1495, 1498, 1, 0, 0, 0, 1496, 1497, 1, 0, 0, 0, 1496, 1494, 1, 0, 0, 0, 1497, 1499, 1, 0, 0, 0, 1498, 1496, 1, 0, 0, 0, 1499, 1500, 5, 93, 0, 0, 1500, 1501, 5, 93, 0, 0, 1501, 1502, 5, 62, 0, 0, 1502, 31, 1, 0, 0, 0, 1503, 1504, 5, 40, 0, 0, 1504, 1505, 5, 35, 0, 0, 1505, 1507, 1, 0, 0, 0, 1506, 1508, 3, 34, 14, 0, 1507, 1506, 1, 0, 0, 0, 1507, 1508, 1, 0, 0, 0, 1508, 1512, 1, 0, 0, 0, 1509, 1510, 3, 374, 184, 0, 1510, 1511, 5, 58, 0, 0, 1511, 1513, 1, 0, 0, 0, 1512, 1509, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1514, 1, 0, 0, 0, 1514, 1522, 3, 374, 184, 0, 1515, 1519, 3, 34, 14, 0, 1516, 1518, 9, 0, 0, 0, 1517, 1516, 1, 0, 0, 0, 1518, 1521, 1, 0, 0, 0, 1519, 1520, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1520, 1523, 1, 0, 0, 0, 1521, 1519, 1, 0, 0, 0, 1522, 1515, 1, 0, 0, 0, 1522, 1523, 1, 0, 0, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 5, 35, 0, 0, 1525, 1526, 5, 41, 0, 0, 1526, 33, 1, 0, 0, 0, 1527, 1529, 7, 8, 0, 0, 1528, 1527, 1, 0, 0, 0, 1529, 1530, 1, 0, 0, 0, 1530, 1528, 1, 0, 0, 0, 1530, 1531, 1, 0, 0, 0, 1531, 1532, 1, 0, 0, 0, 1532, 1533, 6, 14, 2, 0, 1533, 35, 1, 0, 0, 0, 1534, 1535, 5, 61, 0, 0, 1535, 37, 1, 0, 0, 0, 1536, 1537, 5, 33, 0, 0, 1537, 1538, 5, 61, 0, 0, 1538, 39, 1, 0, 0, 0, 1539, 1540, 5, 40, 0, 0, 1540, 41, 1, 0, 0, 0, 1541, 1542, 5, 41, 0, 0, 1542, 43, 1, 0, 0, 0, 1543, 1544, 5, 91, 0, 0, 1544, 45, 1, 0, 0, 0, 1545, 1546, 5, 93, 0, 0, 1546, 47, 1, 0, 0, 0, 1547, 1548, 5, 123, 0, 0, 1548, 49, 1, 0, 0, 0, 1549, 1550, 5, 125, 0, 0, 1550, 51, 1, 0, 0, 0, 1551, 1552, 5, 42, 0, 0, 1552, 53, 1, 0, 0, 0, 1553, 1554, 5, 43, 0, 0, 1554, 55, 1, 0, 0, 0, 1555, 1556, 5, 45, 0, 0, 1556, 57, 1, 0, 0, 0, 1557, 1558, 5, 44, 0, 0, 1558, 59, 1, 0, 0, 0, 1559, 1560, 5, 46, 0, 0, 1560, 61, 1, 0, 0, 0, 1561, 1562, 5, 46, 0, 0, 1562, 1563, 5, 46, 0, 0, 1563, 63, 1, 0, 0, 0, 1564, 1565, 5, 58, 0, 0, 1565, 65, 1, 0, 0, 0, 1566, 1567, 5, 58, 0, 0, 1567, 1568, 5, 61, 0, 0, 1568, 67, 1, 0, 0, 0, 1569, 1570, 5, 59, 0, 0, 1570, 69, 1, 0, 0, 0, 1571, 1572, 5, 47, 0, 0, 1572, 71, 1, 0, 0, 0, 1573, 1574, 5, 47, 0, 0, 1574, 1575, 5, 47, 0, 0, 1575, 73, 1, 0, 0, 0, 1576, 1577, 5, 92, 0, 0, 1577, 75, 1, 0, 0, 0, 1578, 1579, 5, 124, 0, 0, 1579, 77, 1, 0, 0, 0, 1580, 1581, 5, 60, 0, 0, 1581, 79, 1, 0, 0, 0, 1582, 1583, 5, 62, 0, 0, 1583, 81, 1, 0, 0, 0, 1584, 1585, 5, 63, 0, 0, 1585, 83, 1, 0, 0, 0, 1586, 1587, 5, 64, 0, 0, 1587, 85, 1, 0, 0, 0, 1588, 1589, 5, 36, 0, 0, 1589, 87, 1, 0, 0, 0, 1590, 1591, 5, 37, 0, 0, 1591, 89, 1, 0, 0, 0, 1592, 1593, 5, 33, 0, 0, 1593, 91, 1, 0, 0, 0, 1594, 1595, 5, 35, 0, 0, 1595, 93, 1, 0, 0, 0, 1596, 1597, 5, 94, 0, 0, 1597, 95, 1, 0, 0, 0, 1598, 1599, 5, 61, 0, 0, 1599, 1600, 5, 62, 0, 0, 1600, 97, 1, 0, 0, 0, 1601, 1602, 5, 96, 0, 0, 1602, 99, 1, 0, 0, 0, 1603, 1604, 5, 124, 0, 0, 1604, 1605, 5, 124, 0, 0, 1605, 101, 1, 0, 0, 0, 1606, 1607, 5, 126, 0, 0, 1607, 103, 1, 0, 0, 0, 1608, 1609, 5, 97, 0, 0, 1609, 1610, 5, 108, 0, 0, 1610, 1611, 5, 108, 0, 0, 1611, 1612, 5, 111, 0, 0, 1612, 1613, 5, 119, 0, 0, 1613, 1614, 5, 105, 0, 0, 1614, 1615, 5, 110, 0, 0, 1615, 1616, 5, 103, 0, 0, 1616, 105, 1, 0, 0, 0, 1617, 1618, 5, 97, 0, 0, 1618, 1619, 5, 110, 0, 0, 1619, 1620, 5, 99, 0, 0, 1620, 1621, 5, 101, 0, 0, 1621, 1622, 5, 115, 0, 0, 1622, 1623, 5, 116, 0, 0, 1623, 1624, 5, 111, 0, 0, 1624, 1625, 5, 114, 0, 0, 1625, 107, 1, 0, 0, 0, 1626, 1627, 5, 97, 0, 0, 1627, 1628, 5, 110, 0, 0, 1628, 1629, 5, 99, 0, 0, 1629, 1630, 5, 101, 0, 0, 1630, 1631, 5, 115, 0, 0, 1631, 1632, 5, 116, 0, 0, 1632, 1633, 5, 111, 0, 0, 1633, 1634, 5, 114, 0, 0, 1634, 1635, 5, 45, 0, 0, 1635, 1636, 5, 111, 0, 0, 1636, 1637, 5, 114, 0, 0, 1637, 1638, 5, 45, 0, 0, 1638, 1639, 5, 115, 0, 0, 1639, 1640, 5, 101, 0, 0, 1640, 1641, 5, 108, 0, 0, 1641, 1642, 5, 102, 0, 0, 1642, 109, 1, 0, 0, 0, 1643, 1644, 5, 97, 0, 0, 1644, 1645, 5, 110, 0, 0, 1645, 1646, 5, 100, 0, 0, 1646, 111, 1, 0, 0, 0, 1647, 1648, 5, 97, 0, 0, 1648, 1649, 5, 114, 0, 0, 1649, 1650, 5, 114, 0, 0, 1650, 1651, 5, 97, 0, 0, 1651, 1652, 5, 121, 0, 0, 1652, 113, 1, 0, 0, 0, 1653, 1654, 5, 97, 0, 0, 1654, 1655, 5, 115, 0, 0, 1655, 115, 1, 0, 0, 0, 1656, 1657, 5, 97, 0, 0, 1657, 1658, 5, 115, 0, 0, 1658, 1659, 5, 99, 0, 0, 1659, 1660, 5, 101, 0, 0, 1660, 1661, 5, 110, 0, 0, 1661, 1662, 5, 100, 0, 0, 1662, 1663, 5, 105, 0, 0, 1663, 1664, 5, 110, 0, 0, 1664, 1665, 5, 103, 0, 0, 1665, 117, 1, 0, 0, 0, 1666, 1667, 5, 97, 0, 0, 1667, 1668, 5, 116, 0, 0, 1668, 119, 1, 0, 0, 0, 1669, 1670, 5, 97, 0, 0, 1670, 1671, 5, 116, 0, 0, 1671, 1672, 5, 116, 0, 0, 1672, 1673, 5, 114, 0, 0, 1673, 1674, 5, 105, 0, 0, 1674, 1675, 5, 98, 0, 0, 1675, 1676, 5, 117, 0, 0, 1676, 1677, 5, 116, 0, 0, 1677, 1678, 5, 101, 0, 0, 1678, 121, 1, 0, 0, 0, 1679, 1680, 5, 98, 0, 0, 1680, 1681, 5, 97, 0, 0, 1681, 1682, 5, 115, 0, 0, 1682, 1683, 5, 101, 0, 0, 1683, 1684, 5, 45, 0, 0, 1684, 1685, 5, 117, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 105, 0, 0, 1687, 123, 1, 0, 0, 0, 1688, 1689, 5, 98, 0, 0, 1689, 1690, 5, 111, 0, 0, 1690, 1691, 5, 117, 0, 0, 1691, 1692, 5, 110, 0, 0, 1692, 1693, 5, 100, 0, 0, 1693, 1694, 5, 97, 0, 0, 1694, 1695, 5, 114, 0, 0, 1695, 1696, 5, 121, 0, 0, 1696, 1697, 5, 45, 0, 0, 1697, 1698, 5, 115, 0, 0, 1698, 1699, 5, 112, 0, 0, 1699, 1700, 5, 97, 0, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1702, 5, 101, 0, 0, 1702, 125, 1, 0, 0, 0, 1703, 1704, 5, 98, 0, 0, 1704, 1705, 5, 105, 0, 0, 1705, 1706, 5, 110, 0, 0, 1706, 1707, 5, 97, 0, 0, 1707, 1708, 5, 114, 0, 0, 1708, 1709, 5, 121, 0, 0, 1709, 127, 1, 0, 0, 0, 1710, 1711, 5, 98, 0, 0, 1711, 1712, 5, 121, 0, 0, 1712, 129, 1, 0, 0, 0, 1713, 1714, 5, 99, 0, 0, 1714, 1715, 5, 97, 0, 0, 1715, 1716, 5, 115, 0, 0, 1716, 1717, 5, 101, 0, 0, 1717, 131, 1, 0, 0, 0, 1718, 1719, 5, 99, 0, 0, 1719, 1720, 5, 97, 0, 0, 1720, 1721, 5, 115, 0, 0, 1721, 1722, 5, 116, 0, 0, 1722, 133, 1, 0, 0, 0, 1723, 1724, 5, 99, 0, 0, 1724, 1725, 5, 97, 0, 0, 1725, 1726, 5, 115, 0, 0, 1726, 1727, 5, 116, 0, 0, 1727, 1728, 5, 97, 0, 0, 1728, 1729, 5, 98, 0, 0, 1729, 1730, 5, 108, 0, 0, 1730, 1731, 5, 101, 0, 0, 1731, 135, 1, 0, 0, 0, 1732, 1733, 5, 99, 0, 0, 1733, 1734, 5, 97, 0, 0, 1734, 1735, 5, 116, 0, 0, 1735, 1736, 5, 99, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 137, 1, 0, 0, 0, 1738, 1739, 5, 99, 0, 0, 1739, 1740, 5, 104, 0, 0, 1740, 1741, 5, 105, 0, 0, 1741, 1742, 5, 108, 0, 0, 1742, 1743, 5, 100, 0, 0, 1743, 139, 1, 0, 0, 0, 1744, 1745, 5, 99, 0, 0, 1745, 1746, 5, 111, 0, 0, 1746, 1747, 5, 108, 0, 0, 1747, 1748, 5, 108, 0, 0, 1748, 1749, 5, 97, 0, 0, 1749, 1750, 5, 116, 0, 0, 1750, 1751, 5, 105, 0, 0, 1751, 1752, 5, 111, 0, 0, 1752, 1753, 5, 110, 0, 0, 1753, 141, 1, 0, 0, 0, 1754, 1755, 5, 99, 0, 0, 1755, 1756, 5, 111, 0, 0, 1756, 1757, 5, 109, 0, 0, 1757, 1758, 5, 109, 0, 0, 1758, 1759, 5, 101, 0, 0, 1759, 1760, 5, 110, 0, 0, 1760, 1761, 5, 116, 0, 0, 1761, 143, 1, 0, 0, 0, 1762, 1763, 5, 99, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 110, 0, 0, 1765, 1766, 5, 115, 0, 0, 1766, 1767, 5, 116, 0, 0, 1767, 1768, 5, 114, 0, 0, 1768, 1769, 5, 117, 0, 0, 1769, 1770, 5, 99, 0, 0, 1770, 1771, 5, 116, 0, 0, 1771, 1772, 5, 105, 0, 0, 1772, 1773, 5, 111, 0, 0, 1773, 1774, 5, 110, 0, 0, 1774, 145, 1, 0, 0, 0, 1775, 1776, 5, 99, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 110, 0, 0, 1778, 1779, 5, 116, 0, 0, 1779, 1780, 5, 101, 0, 0, 1780, 1781, 5, 120, 0, 0, 1781, 1782, 5, 116, 0, 0, 1782, 147, 1, 0, 0, 0, 1783, 1784, 5, 99, 0, 0, 1784, 1785, 5, 111, 0, 0, 1785, 1786, 5, 112, 0, 0, 1786, 1787, 5, 121, 0, 0, 1787, 1788, 5, 45, 0, 0, 1788, 1789, 5, 110, 0, 0, 1789, 1790, 5, 97, 0, 0, 1790, 1791, 5, 109, 0, 0, 1791, 1792, 5, 101, 0, 0, 1792, 1793, 5, 115, 0, 0, 1793, 1794, 5, 112, 0, 0, 1794, 1795, 5, 97, 0, 0, 1795, 1796, 5, 99, 0, 0, 1796, 1797, 5, 101, 0, 0, 1797, 1798, 5, 115, 0, 0, 1798, 149, 1, 0, 0, 0, 1799, 1800, 5, 99, 0, 0, 1800, 1801, 5, 111, 0, 0, 1801, 1802, 5, 117, 0, 0, 1802, 1803, 5, 110, 0, 0, 1803, 1804, 5, 116, 0, 0, 1804, 151, 1, 0, 0, 0, 1805, 1806, 5, 100, 0, 0, 1806, 1807, 5, 101, 0, 0, 1807, 1808, 5, 99, 0, 0, 1808, 1809, 5, 108, 0, 0, 1809, 1810, 5, 97, 0, 0, 1810, 1811, 5, 114, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 153, 1, 0, 0, 0, 1813, 1814, 5, 100, 0, 0, 1814, 1815, 5, 101, 0, 0, 1815, 1816, 5, 102, 0, 0, 1816, 1817, 5, 97, 0, 0, 1817, 1818, 5, 117, 0, 0, 1818, 1819, 5, 108, 0, 0, 1819, 1820, 5, 116, 0, 0, 1820, 155, 1, 0, 0, 0, 1821, 1822, 5, 100, 0, 0, 1822, 1823, 5, 101, 0, 0, 1823, 1824, 5, 115, 0, 0, 1824, 1825, 5, 99, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 110, 0, 0, 1827, 1828, 5, 100, 0, 0, 1828, 1829, 5, 97, 0, 0, 1829, 1830, 5, 110, 0, 0, 1830, 1831, 5, 116, 0, 0, 1831, 157, 1, 0, 0, 0, 1832, 1833, 5, 100, 0, 0, 1833, 1834, 5, 101, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 99, 0, 0, 1836, 1837, 5, 101, 0, 0, 1837, 1838, 5, 110, 0, 0, 1838, 1839, 5, 100, 0, 0, 1839, 1840, 5, 97, 0, 0, 1840, 1841, 5, 110, 0, 0, 1841, 1842, 5, 116, 0, 0, 1842, 1843, 5, 45, 0, 0, 1843, 1844, 5, 111, 0, 0, 1844, 1845, 5, 114, 0, 0, 1845, 1846, 5, 45, 0, 0, 1846, 1847, 5, 115, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 108, 0, 0, 1849, 1850, 5, 102, 0, 0, 1850, 159, 1, 0, 0, 0, 1851, 1852, 5, 100, 0, 0, 1852, 1853, 5, 101, 0, 0, 1853, 1854, 5, 115, 0, 0, 1854, 1855, 5, 99, 0, 0, 1855, 1856, 5, 101, 0, 0, 1856, 1857, 5, 110, 0, 0, 1857, 1858, 5, 100, 0, 0, 1858, 1859, 5, 105, 0, 0, 1859, 1860, 5, 110, 0, 0, 1860, 1861, 5, 103, 0, 0, 1861, 161, 1, 0, 0, 0, 1862, 1863, 5, 100, 0, 0, 1863, 1864, 5, 101, 0, 0, 1864, 1865, 5, 99, 0, 0, 1865, 1866, 5, 105, 0, 0, 1866, 1867, 5, 109, 0, 0, 1867, 1868, 5, 97, 0, 0, 1868, 1869, 5, 108, 0, 0, 1869, 1870, 5, 45, 0, 0, 1870, 1871, 5, 102, 0, 0, 1871, 1872, 5, 111, 0, 0, 1872, 1873, 5, 114, 0, 0, 1873, 1874, 5, 109, 0, 0, 1874, 1875, 5, 97, 0, 0, 1875, 1876, 5, 116, 0, 0, 1876, 163, 1, 0, 0, 0, 1877, 1878, 5, 100, 0, 0, 1878, 1879, 5, 105, 0, 0, 1879, 1880, 5, 118, 0, 0, 1880, 165, 1, 0, 0, 0, 1881, 1882, 5, 100, 0, 0, 1882, 1883, 5, 111, 0, 0, 1883, 1884, 5, 99, 0, 0, 1884, 1885, 5, 117, 0, 0, 1885, 1886, 5, 109, 0, 0, 1886, 1887, 5, 101, 0, 0, 1887, 1888, 5, 110, 0, 0, 1888, 1889, 5, 116, 0, 0, 1889, 167, 1, 0, 0, 0, 1890, 1891, 5, 100, 0, 0, 1891, 1892, 5, 111, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 117, 0, 0, 1894, 1895, 5, 109, 0, 0, 1895, 1896, 5, 101, 0, 0, 1896, 1897, 5, 110, 0, 0, 1897, 1898, 5, 116, 0, 0, 1898, 1899, 5, 45, 0, 0, 1899, 1900, 5, 110, 0, 0, 1900, 1901, 5, 111, 0, 0, 1901, 1902, 5, 100, 0, 0, 1902, 1903, 5, 101, 0, 0, 1903, 169, 1, 0, 0, 0, 1904, 1905, 5, 101, 0, 0, 1905, 1906, 5, 108, 0, 0, 1906, 1907, 5, 101, 0, 0, 1907, 1908, 5, 109, 0, 0, 1908, 1909, 5, 101, 0, 0, 1909, 1910, 5, 110, 0, 0, 1910, 1911, 5, 116, 0, 0, 1911, 171, 1, 0, 0, 0, 1912, 1913, 5, 101, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 1915, 5, 115, 0, 0, 1915, 1916, 5, 101, 0, 0, 1916, 173, 1, 0, 0, 0, 1917, 1918, 5, 101, 0, 0, 1918, 1919, 5, 109, 0, 0, 1919, 1920, 5, 112, 0, 0, 1920, 1921, 5, 116, 0, 0, 1921, 1922, 5, 121, 0, 0, 1922, 175, 1, 0, 0, 0, 1923, 1924, 5, 101, 0, 0, 1924, 1925, 5, 109, 0, 0, 1925, 1926, 5, 112, 0, 0, 1926, 1927, 5, 116, 0, 0, 1927, 1928, 5, 121, 0, 0, 1928, 1929, 5, 45, 0, 0, 1929, 1930, 5, 115, 0, 0, 1930, 1931, 5, 101, 0, 0, 1931, 1932, 5, 113, 0, 0, 1932, 1933, 5, 117, 0, 0, 1933, 1934, 5, 101, 0, 0, 1934, 1935, 5, 110, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 101, 0, 0, 1937, 177, 1, 0, 0, 0, 1938, 1939, 5, 101, 0, 0, 1939, 1940, 5, 110, 0, 0, 1940, 1941, 5, 99, 0, 0, 1941, 1942, 5, 111, 0, 0, 1942, 1943, 5, 100, 0, 0, 1943, 1944, 5, 105, 0, 0, 1944, 1945, 5, 110, 0, 0, 1945, 1946, 5, 103, 0, 0, 1946, 179, 1, 0, 0, 0, 1947, 1948, 5, 101, 0, 0, 1948, 1949, 5, 110, 0, 0, 1949, 1950, 5, 100, 0, 0, 1950, 181, 1, 0, 0, 0, 1951, 1952, 5, 101, 0, 0, 1952, 1953, 5, 113, 0, 0, 1953, 183, 1, 0, 0, 0, 1954, 1955, 5, 101, 0, 0, 1955, 1956, 5, 118, 0, 0, 1956, 1957, 5, 101, 0, 0, 1957, 1958, 5, 114, 0, 0, 1958, 1959, 5, 121, 0, 0, 1959, 185, 1, 0, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 120, 0, 0, 1962, 1963, 5, 99, 0, 0, 1963, 1964, 5, 101, 0, 0, 1964, 1965, 5, 112, 0, 0, 1965, 1966, 5, 116, 0, 0, 1966, 187, 1, 0, 0, 0, 1967, 1968, 5, 101, 0, 0, 1968, 1969, 5, 120, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 101, 0, 0, 1971, 1972, 5, 114, 0, 0, 1972, 1973, 5, 110, 0, 0, 1973, 1974, 5, 97, 0, 0, 1974, 1975, 5, 108, 0, 0, 1975, 189, 1, 0, 0, 0, 1976, 1977, 5, 102, 0, 0, 1977, 1978, 5, 111, 0, 0, 1978, 1979, 5, 108, 0, 0, 1979, 1980, 5, 108, 0, 0, 1980, 1981, 5, 111, 0, 0, 1981, 1982, 5, 119, 0, 0, 1982, 1983, 5, 105, 0, 0, 1983, 1984, 5, 110, 0, 0, 1984, 1985, 5, 103, 0, 0, 1985, 191, 1, 0, 0, 0, 1986, 1987, 5, 102, 0, 0, 1987, 1988, 5, 111, 0, 0, 1988, 1989, 5, 108, 0, 0, 1989, 1990, 5, 108, 0, 0, 1990, 1991, 5, 111, 0, 0, 1991, 1992, 5, 119, 0, 0, 1992, 1993, 5, 105, 0, 0, 1993, 1994, 5, 110, 0, 0, 1994, 1995, 5, 103, 0, 0, 1995, 1996, 5, 45, 0, 0, 1996, 1997, 5, 115, 0, 0, 1997, 1998, 5, 105, 0, 0, 1998, 1999, 5, 98, 0, 0, 1999, 2000, 5, 108, 0, 0, 2000, 2001, 5, 105, 0, 0, 2001, 2002, 5, 110, 0, 0, 2002, 2003, 5, 103, 0, 0, 2003, 193, 1, 0, 0, 0, 2004, 2005, 5, 102, 0, 0, 2005, 2006, 5, 111, 0, 0, 2006, 2007, 5, 114, 0, 0, 2007, 195, 1, 0, 0, 0, 2008, 2009, 5, 102, 0, 0, 2009, 2010, 5, 117, 0, 0, 2010, 2011, 5, 110, 0, 0, 2011, 2012, 5, 99, 0, 0, 2012, 2013, 5, 116, 0, 0, 2013, 2014, 5, 105, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 110, 0, 0, 2016, 197, 1, 0, 0, 0, 2017, 2018, 5, 103, 0, 0, 2018, 2019, 5, 101, 0, 0, 2019, 199, 1, 0, 0, 0, 2020, 2021, 5, 103, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 2023, 5, 101, 0, 0, 2023, 2024, 5, 97, 0, 0, 2024, 2025, 5, 116, 0, 0, 2025, 2026, 5, 101, 0, 0, 2026, 2027, 5, 115, 0, 0, 2027, 2028, 5, 116, 0, 0, 2028, 201, 1, 0, 0, 0, 2029, 2030, 5, 103, 0, 0, 2030, 2031, 5, 114, 0, 0, 2031, 2032, 5, 111, 0, 0, 2032, 2033, 5, 117, 0, 0, 2033, 2034, 5, 112, 0, 0, 2034, 203, 1, 0, 0, 0, 2035, 2036, 5, 103, 0, 0, 2036, 2037, 5, 116, 0, 0, 2037, 205, 1, 0, 0, 0, 2038, 2039, 5, 105, 0, 0, 2039, 2040, 5, 100, 0, 0, 2040, 2041, 5, 105, 0, 0, 2041, 2042, 5, 118, 0, 0, 2042, 207, 1, 0, 0, 0, 2043, 2044, 5, 105, 0, 0, 2044, 2045, 5, 102, 0, 0, 2045, 209, 1, 0, 0, 0, 2046, 2047, 5, 105, 0, 0, 2047, 2048, 5, 109, 0, 0, 2048, 2049, 5, 112, 0, 0, 2049, 2050, 5, 111, 0, 0, 2050, 2051, 5, 114, 0, 0, 2051, 2052, 5, 116, 0, 0, 2052, 211, 1, 0, 0, 0, 2053, 2054, 5, 105, 0, 0, 2054, 2055, 5, 110, 0, 0, 2055, 213, 1, 0, 0, 0, 2056, 2057, 5, 105, 0, 0, 2057, 2058, 5, 110, 0, 0, 2058, 2059, 5, 104, 0, 0, 2059, 2060, 5, 101, 0, 0, 2060, 2061, 5, 114, 0, 0, 2061, 2062, 5, 105, 0, 0, 2062, 2063, 5, 116, 0, 0, 2063, 215, 1, 0, 0, 0, 2064, 2065, 5, 105, 0, 0, 2065, 2066, 5, 110, 0, 0, 2066, 2067, 5, 115, 0, 0, 2067, 2068, 5, 116, 0, 0, 2068, 2069, 5, 97, 0, 0, 2069, 2070, 5, 110, 0, 0, 2070, 2071, 5, 99, 0, 0, 2071, 2072, 5, 101, 0, 0, 2072, 217, 1, 0, 0, 0, 2073, 2074, 5, 105, 0, 0, 2074, 2075, 5, 110, 0, 0, 2075, 2076, 5, 116, 0, 0, 2076, 2077, 5, 101, 0, 0, 2077, 2078, 5, 114, 0, 0, 2078, 2079, 5, 115, 0, 0, 2079, 2080, 5, 101, 0, 0, 2080, 2081, 5, 99, 0, 0, 2081, 2082, 5, 116, 0, 0, 2082, 219, 1, 0, 0, 0, 2083, 2084, 5, 105, 0, 0, 2084, 2085, 5, 115, 0, 0, 2085, 221, 1, 0, 0, 0, 2086, 2087, 5, 105, 0, 0, 2087, 2088, 5, 116, 0, 0, 2088, 2089, 5, 101, 0, 0, 2089, 2090, 5, 109, 0, 0, 2090, 223, 1, 0, 0, 0, 2091, 2092, 5, 108, 0, 0, 2092, 2093, 5, 97, 0, 0, 2093, 2094, 5, 120, 0, 0, 2094, 225, 1, 0, 0, 0, 2095, 2096, 5, 108, 0, 0, 2096, 2097, 5, 101, 0, 0, 2097, 227, 1, 0, 0, 0, 2098, 2099, 5, 108, 0, 0, 2099, 2100, 5, 101, 0, 0, 2100, 2101, 5, 97, 0, 0, 2101, 2102, 5, 115, 0, 0, 2102, 2103, 5, 116, 0, 0, 2103, 229, 1, 0, 0, 0, 2104, 2105, 5, 108, 0, 0, 2105, 2106, 5, 101, 0, 0, 2106, 2107, 5, 116, 0, 0, 2107, 231, 1, 0, 0, 0, 2108, 2109, 5, 108, 0, 0, 2109, 2110, 5, 116, 0, 0, 2110, 233, 1, 0, 0, 0, 2111, 2112, 5, 109, 0, 0, 2112, 2113, 5, 97, 0, 0, 2113, 2114, 5, 112, 0, 0, 2114, 235, 1, 0, 0, 0, 2115, 2116, 5, 109, 0, 0, 2116, 2117, 5, 111, 0, 0, 2117, 2118, 5, 100, 0, 0, 2118, 237, 1, 0, 0, 0, 2119, 2120, 5, 109, 0, 0, 2120, 2121, 5, 111, 0, 0, 2121, 2122, 5, 100, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 101, 0, 0, 2125, 239, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 97, 0, 0, 2128, 2129, 5, 109, 0, 0, 2129, 2130, 5, 101, 0, 0, 2130, 2131, 5, 115, 0, 0, 2131, 2132, 5, 112, 0, 0, 2132, 2133, 5, 97, 0, 0, 2133, 2134, 5, 99, 0, 0, 2134, 2135, 5, 101, 0, 0, 2135, 241, 1, 0, 0, 0, 2136, 2137, 5, 110, 0, 0, 2137, 2138, 5, 101, 0, 0, 2138, 243, 1, 0, 0, 0, 2139, 2140, 5, 110, 0, 0, 2140, 2141, 5, 101, 0, 0, 2141, 2142, 5, 120, 0, 0, 2142, 2143, 5, 116, 0, 0, 2143, 245, 1, 0, 0, 0, 2144, 2145, 5, 110, 0, 0, 2145, 2146, 5, 97, 0, 0, 2146, 2147, 5, 109, 0, 0, 2147, 2148, 5, 101, 0, 0, 2148, 2149, 5, 115, 0, 0, 2149, 2150, 5, 112, 0, 0, 2150, 2151, 5, 97, 0, 0, 2151, 2152, 5, 99, 0, 0, 2152, 2153, 5, 101, 0, 0, 2153, 2154, 5, 45, 0, 0, 2154, 2155, 5, 110, 0, 0, 2155, 2156, 5, 111, 0, 0, 2156, 2157, 5, 100, 0, 0, 2157, 2158, 5, 101, 0, 0, 2158, 247, 1, 0, 0, 0, 2159, 2160, 5, 110, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 45, 0, 0, 2162, 2163, 5, 105, 0, 0, 2163, 2164, 5, 110, 0, 0, 2164, 2165, 5, 104, 0, 0, 2165, 2166, 5, 101, 0, 0, 2166, 2167, 5, 114, 0, 0, 2167, 2168, 5, 105, 0, 0, 2168, 2169, 5, 116, 0, 0, 2169, 249, 1, 0, 0, 0, 2170, 2171, 5, 110, 0, 0, 2171, 2172, 5, 111, 0, 0, 2172, 2173, 5, 45, 0, 0, 2173, 2174, 5, 112, 0, 0, 2174, 2175, 5, 114, 0, 0, 2175, 2176, 5, 101, 0, 0, 2176, 2177, 5, 115, 0, 0, 2177, 2178, 5, 101, 0, 0, 2178, 2179, 5, 114, 0, 0, 2179, 2180, 5, 118, 0, 0, 2180, 2181, 5, 101, 0, 0, 2181, 251, 1, 0, 0, 0, 2182, 2183, 5, 110, 0, 0, 2183, 2184, 5, 111, 0, 0, 2184, 2185, 5, 100, 0, 0, 2185, 2186, 5, 101, 0, 0, 2186, 253, 1, 0, 0, 0, 2187, 2188, 5, 111, 0, 0, 2188, 2189, 5, 102, 0, 0, 2189, 255, 1, 0, 0, 0, 2190, 2191, 5, 111, 0, 0, 2191, 2192, 5, 110, 0, 0, 2192, 2193, 5, 108, 0, 0, 2193, 2194, 5, 121, 0, 0, 2194, 257, 1, 0, 0, 0, 2195, 2196, 5, 111, 0, 0, 2196, 2197, 5, 112, 0, 0, 2197, 2198, 5, 116, 0, 0, 2198, 2199, 5, 105, 0, 0, 2199, 2200, 5, 111, 0, 0, 2200, 2201, 5, 110, 0, 0, 2201, 259, 1, 0, 0, 0, 2202, 2203, 5, 111, 0, 0, 2203, 2204, 5, 114, 0, 0, 2204, 261, 1, 0, 0, 0, 2205, 2206, 5, 111, 0, 0, 2206, 2207, 5, 114, 0, 0, 2207, 2208, 5, 100, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 114, 0, 0, 2210, 263, 1, 0, 0, 0, 2211, 2212, 5, 111, 0, 0, 2212, 2213, 5, 114, 0, 0, 2213, 2214, 5, 100, 0, 0, 2214, 2215, 5, 101, 0, 0, 2215, 2216, 5, 114, 0, 0, 2216, 2217, 5, 101, 0, 0, 2217, 2218, 5, 100, 0, 0, 2218, 265, 1, 0, 0, 0, 2219, 2220, 5, 111, 0, 0, 2220, 2221, 5, 114, 0, 0, 2221, 2222, 5, 100, 0, 0, 2222, 2223, 5, 101, 0, 0, 2223, 2224, 5, 114, 0, 0, 2224, 2225, 5, 105, 0, 0, 2225, 2226, 5, 110, 0, 0, 2226, 2227, 5, 103, 0, 0, 2227, 267, 1, 0, 0, 0, 2228, 2229, 5, 112, 0, 0, 2229, 2230, 5, 97, 0, 0, 2230, 2231, 5, 114, 0, 0, 2231, 2232, 5, 101, 0, 0, 2232, 2233, 5, 110, 0, 0, 2233, 2234, 5, 116, 0, 0, 2234, 269, 1, 0, 0, 0, 2235, 2236, 5, 112, 0, 0, 2236, 2237, 5, 114, 0, 0, 2237, 2238, 5, 101, 0, 0, 2238, 2239, 5, 99, 0, 0, 2239, 2240, 5, 101, 0, 0, 2240, 2241, 5, 100, 0, 0, 2241, 2242, 5, 105, 0, 0, 2242, 2243, 5, 110, 0, 0, 2243, 2244, 5, 103, 0, 0, 2244, 271, 1, 0, 0, 0, 2245, 2246, 5, 112, 0, 0, 2246, 2247, 5, 114, 0, 0, 2247, 2248, 5, 101, 0, 0, 2248, 2249, 5, 99, 0, 0, 2249, 2250, 5, 101, 0, 0, 2250, 2251, 5, 100, 0, 0, 2251, 2252, 5, 105, 0, 0, 2252, 2253, 5, 110, 0, 0, 2253, 2254, 5, 103, 0, 0, 2254, 2255, 5, 45, 0, 0, 2255, 2256, 5, 115, 0, 0, 2256, 2257, 5, 105, 0, 0, 2257, 2258, 5, 98, 0, 0, 2258, 2259, 5, 108, 0, 0, 2259, 2260, 5, 105, 0, 0, 2260, 2261, 5, 110, 0, 0, 2261, 2262, 5, 103, 0, 0, 2262, 273, 1, 0, 0, 0, 2263, 2264, 5, 112, 0, 0, 2264, 2265, 5, 114, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 2267, 5, 115, 0, 0, 2267, 2268, 5, 101, 0, 0, 2268, 2269, 5, 114, 0, 0, 2269, 2270, 5, 118, 0, 0, 2270, 2271, 5, 101, 0, 0, 2271, 275, 1, 0, 0, 0, 2272, 2273, 5, 112, 0, 0, 2273, 2274, 5, 114, 0, 0, 2274, 2275, 5, 101, 0, 0, 2275, 2276, 5, 118, 0, 0, 2276, 2277, 5, 105, 0, 0, 2277, 2278, 5, 111, 0, 0, 2278, 2279, 5, 117, 0, 0, 2279, 2280, 5, 115, 0, 0, 2280, 277, 1, 0, 0, 0, 2281, 2282, 5, 112, 0, 0, 2282, 2283, 5, 114, 0, 0, 2283, 2284, 5, 111, 0, 0, 2284, 2285, 5, 99, 0, 0, 2285, 2286, 5, 101, 0, 0, 2286, 2287, 5, 115, 0, 0, 2287, 2288, 5, 115, 0, 0, 2288, 2289, 5, 105, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 103, 0, 0, 2291, 2292, 5, 45, 0, 0, 2292, 2293, 5, 105, 0, 0, 2293, 2294, 5, 110, 0, 0, 2294, 2295, 5, 115, 0, 0, 2295, 2296, 5, 116, 0, 0, 2296, 2297, 5, 114, 0, 0, 2297, 2298, 5, 117, 0, 0, 2298, 2299, 5, 99, 0, 0, 2299, 2300, 5, 116, 0, 0, 2300, 2301, 5, 105, 0, 0, 2301, 2302, 5, 111, 0, 0, 2302, 2303, 5, 110, 0, 0, 2303, 279, 1, 0, 0, 0, 2304, 2305, 5, 114, 0, 0, 2305, 2306, 5, 101, 0, 0, 2306, 2307, 5, 116, 0, 0, 2307, 2308, 5, 117, 0, 0, 2308, 2309, 5, 114, 0, 0, 2309, 2310, 5, 110, 0, 0, 2310, 281, 1, 0, 0, 0, 2311, 2312, 5, 115, 0, 0, 2312, 2313, 5, 97, 0, 0, 2313, 2314, 5, 116, 0, 0, 2314, 2315, 5, 105, 0, 0, 2315, 2316, 5, 115, 0, 0, 2316, 2317, 5, 102, 0, 0, 2317, 2318, 5, 105, 0, 0, 2318, 2319, 5, 101, 0, 0, 2319, 2320, 5, 115, 0, 0, 2320, 283, 1, 0, 0, 0, 2321, 2322, 5, 115, 0, 0, 2322, 2323, 5, 99, 0, 0, 2323, 2324, 5, 104, 0, 0, 2324, 2325, 5, 101, 0, 0, 2325, 2326, 5, 109, 0, 0, 2326, 2327, 5, 97, 0, 0, 2327, 285, 1, 0, 0, 0, 2328, 2329, 5, 115, 0, 0, 2329, 2330, 5, 99, 0, 0, 2330, 2331, 5, 104, 0, 0, 2331, 2332, 5, 101, 0, 0, 2332, 2333, 5, 109, 0, 0, 2333, 2334, 5, 97, 0, 0, 2334, 2335, 5, 45, 0, 0, 2335, 2336, 5, 97, 0, 0, 2336, 2337, 5, 116, 0, 0, 2337, 2338, 5, 116, 0, 0, 2338, 2339, 5, 114, 0, 0, 2339, 2340, 5, 105, 0, 0, 2340, 2341, 5, 98, 0, 0, 2341, 2342, 5, 117, 0, 0, 2342, 2343, 5, 116, 0, 0, 2343, 2344, 5, 101, 0, 0, 2344, 287, 1, 0, 0, 0, 2345, 2346, 5, 115, 0, 0, 2346, 2347, 5, 99, 0, 0, 2347, 2348, 5, 104, 0, 0, 2348, 2349, 5, 101, 0, 0, 2349, 2350, 5, 109, 0, 0, 2350, 2351, 5, 97, 0, 0, 2351, 2352, 5, 45, 0, 0, 2352, 2353, 5, 101, 0, 0, 2353, 2354, 5, 108, 0, 0, 2354, 2355, 5, 101, 0, 0, 2355, 2356, 5, 109, 0, 0, 2356, 2357, 5, 101, 0, 0, 2357, 2358, 5, 110, 0, 0, 2358, 2359, 5, 116, 0, 0, 2359, 289, 1, 0, 0, 0, 2360, 2361, 5, 115, 0, 0, 2361, 2362, 5, 101, 0, 0, 2362, 2363, 5, 108, 0, 0, 2363, 2364, 5, 102, 0, 0, 2364, 291, 1, 0, 0, 0, 2365, 2366, 5, 115, 0, 0, 2366, 2367, 5, 108, 0, 0, 2367, 2368, 5, 105, 0, 0, 2368, 2369, 5, 100, 0, 0, 2369, 2370, 5, 105, 0, 0, 2370, 2371, 5, 110, 0, 0, 2371, 2372, 5, 103, 0, 0, 2372, 293, 1, 0, 0, 0, 2373, 2374, 5, 115, 0, 0, 2374, 2375, 5, 111, 0, 0, 2375, 2376, 5, 109, 0, 0, 2376, 2377, 5, 101, 0, 0, 2377, 295, 1, 0, 0, 0, 2378, 2379, 5, 115, 0, 0, 2379, 2380, 5, 116, 0, 0, 2380, 2381, 5, 97, 0, 0, 2381, 2382, 5, 98, 0, 0, 2382, 2383, 5, 108, 0, 0, 2383, 2384, 5, 101, 0, 0, 2384, 297, 1, 0, 0, 0, 2385, 2386, 5, 115, 0, 0, 2386, 2387, 5, 116, 0, 0, 2387, 2388, 5, 97, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 2390, 5, 116, 0, 0, 2390, 299, 1, 0, 0, 0, 2391, 2392, 5, 115, 0, 0, 2392, 2393, 5, 116, 0, 0, 2393, 2394, 5, 114, 0, 0, 2394, 2395, 5, 105, 0, 0, 2395, 2396, 5, 99, 0, 0, 2396, 2397, 5, 116, 0, 0, 2397, 301, 1, 0, 0, 0, 2398, 2399, 5, 115, 0, 0, 2399, 2400, 5, 116, 0, 0, 2400, 2401, 5, 114, 0, 0, 2401, 2402, 5, 105, 0, 0, 2402, 2403, 5, 112, 0, 0, 2403, 303, 1, 0, 0, 0, 2404, 2405, 5, 115, 0, 0, 2405, 2406, 5, 119, 0, 0, 2406, 2407, 5, 105, 0, 0, 2407, 2408, 5, 116, 0, 0, 2408, 2409, 5, 99, 0, 0, 2409, 2410, 5, 104, 0, 0, 2410, 305, 1, 0, 0, 0, 2411, 2412, 5, 116, 0, 0, 2412, 2413, 5, 101, 0, 0, 2413, 2414, 5, 120, 0, 0, 2414, 2415, 5, 116, 0, 0, 2415, 307, 1, 0, 0, 0, 2416, 2417, 5, 116, 0, 0, 2417, 2418, 5, 104, 0, 0, 2418, 2419, 5, 101, 0, 0, 2419, 2420, 5, 110, 0, 0, 2420, 309, 1, 0, 0, 0, 2421, 2422, 5, 116, 0, 0, 2422, 2423, 5, 111, 0, 0, 2423, 311, 1, 0, 0, 0, 2424, 2425, 5, 116, 0, 0, 2425, 2426, 5, 114, 0, 0, 2426, 2427, 5, 101, 0, 0, 2427, 2428, 5, 97, 0, 0, 2428, 2429, 5, 116, 0, 0, 2429, 313, 1, 0, 0, 0, 2430, 2431, 5, 116, 0, 0, 2431, 2432, 5, 114, 0, 0, 2432, 2433, 5, 121, 0, 0, 2433, 315, 1, 0, 0, 0, 2434, 2435, 5, 116, 0, 0, 2435, 2436, 5, 117, 0, 0, 2436, 2437, 5, 109, 0, 0, 2437, 2438, 5, 98, 0, 0, 2438, 2439, 5, 108, 0, 0, 2439, 2440, 5, 105, 0, 0, 2440, 2441, 5, 110, 0, 0, 2441, 2442, 5, 103, 0, 0, 2442, 317, 1, 0, 0, 0, 2443, 2444, 5, 116, 0, 0, 2444, 2445, 5, 121, 0, 0, 2445, 2446, 5, 112, 0, 0, 2446, 2447, 5, 101, 0, 0, 2447, 319, 1, 0, 0, 0, 2448, 2449, 5, 116, 0, 0, 2449, 2450, 5, 121, 0, 0, 2450, 2451, 5, 112, 0, 0, 2451, 2452, 5, 101, 0, 0, 2452, 2453, 5, 115, 0, 0, 2453, 2454, 5, 119, 0, 0, 2454, 2455, 5, 105, 0, 0, 2455, 2456, 5, 116, 0, 0, 2456, 2457, 5, 99, 0, 0, 2457, 2458, 5, 104, 0, 0, 2458, 321, 1, 0, 0, 0, 2459, 2460, 5, 117, 0, 0, 2460, 2461, 5, 110, 0, 0, 2461, 2462, 5, 105, 0, 0, 2462, 2463, 5, 111, 0, 0, 2463, 2464, 5, 110, 0, 0, 2464, 323, 1, 0, 0, 0, 2465, 2466, 5, 117, 0, 0, 2466, 2467, 5, 110, 0, 0, 2467, 2468, 5, 111, 0, 0, 2468, 2469, 5, 114, 0, 0, 2469, 2470, 5, 100, 0, 0, 2470, 2471, 5, 101, 0, 0, 2471, 2472, 5, 114, 0, 0, 2472, 2473, 5, 101, 0, 0, 2473, 2474, 5, 100, 0, 0, 2474, 325, 1, 0, 0, 0, 2475, 2476, 5, 117, 0, 0, 2476, 2477, 5, 112, 0, 0, 2477, 2478, 5, 100, 0, 0, 2478, 2479, 5, 97, 0, 0, 2479, 2480, 5, 116, 0, 0, 2480, 2481, 5, 101, 0, 0, 2481, 327, 1, 0, 0, 0, 2482, 2483, 5, 118, 0, 0, 2483, 2484, 5, 97, 0, 0, 2484, 2485, 5, 108, 0, 0, 2485, 2486, 5, 105, 0, 0, 2486, 2487, 5, 100, 0, 0, 2487, 2488, 5, 97, 0, 0, 2488, 2489, 5, 116, 0, 0, 2489, 2490, 5, 101, 0, 0, 2490, 329, 1, 0, 0, 0, 2491, 2492, 5, 118, 0, 0, 2492, 2493, 5, 97, 0, 0, 2493, 2494, 5, 114, 0, 0, 2494, 2495, 5, 105, 0, 0, 2495, 2496, 5, 97, 0, 0, 2496, 2497, 5, 98, 0, 0, 2497, 2498, 5, 108, 0, 0, 2498, 2499, 5, 101, 0, 0, 2499, 331, 1, 0, 0, 0, 2500, 2501, 5, 118, 0, 0, 2501, 2502, 5, 101, 0, 0, 2502, 2503, 5, 114, 0, 0, 2503, 2504, 5, 115, 0, 0, 2504, 2505, 5, 105, 0, 0, 2505, 2506, 5, 111, 0, 0, 2506, 2507, 5, 110, 0, 0, 2507, 333, 1, 0, 0, 0, 2508, 2509, 5, 119, 0, 0, 2509, 2510, 5, 104, 0, 0, 2510, 2511, 5, 101, 0, 0, 2511, 2512, 5, 110, 0, 0, 2512, 335, 1, 0, 0, 0, 2513, 2514, 5, 119, 0, 0, 2514, 2515, 5, 104, 0, 0, 2515, 2516, 5, 101, 0, 0, 2516, 2517, 5, 114, 0, 0, 2517, 2518, 5, 101, 0, 0, 2518, 337, 1, 0, 0, 0, 2519, 2520, 5, 119, 0, 0, 2520, 2521, 5, 105, 0, 0, 2521, 2522, 5, 110, 0, 0, 2522, 2523, 5, 100, 0, 0, 2523, 2524, 5, 111, 0, 0, 2524, 2525, 5, 119, 0, 0, 2525, 339, 1, 0, 0, 0, 2526, 2527, 5, 120, 0, 0, 2527, 2528, 5, 113, 0, 0, 2528, 2529, 5, 117, 0, 0, 2529, 2530, 5, 101, 0, 0, 2530, 2531, 5, 114, 0, 0, 2531, 2532, 5, 121, 0, 0, 2532, 341, 1, 0, 0, 0, 2533, 2534, 5, 97, 0, 0, 2534, 2535, 5, 114, 0, 0, 2535, 2536, 5, 114, 0, 0, 2536, 2537, 5, 97, 0, 0, 2537, 2538, 5, 121, 0, 0, 2538, 2539, 5, 45, 0, 0, 2539, 2540, 5, 110, 0, 0, 2540, 2541, 5, 111, 0, 0, 2541, 2542, 5, 100, 0, 0, 2542, 2543, 5, 101, 0, 0, 2543, 343, 1, 0, 0, 0, 2544, 2545, 5, 98, 0, 0, 2545, 2546, 5, 111, 0, 0, 2546, 2547, 5, 111, 0, 0, 2547, 2548, 5, 108, 0, 0, 2548, 2549, 5, 101, 0, 0, 2549, 2550, 5, 97, 0, 0, 2550, 2551, 5, 110, 0, 0, 2551, 2552, 5, 45, 0, 0, 2552, 2553, 5, 110, 0, 0, 2553, 2554, 5, 111, 0, 0, 2554, 2555, 5, 100, 0, 0, 2555, 2556, 5, 101, 0, 0, 2556, 345, 1, 0, 0, 0, 2557, 2558, 5, 110, 0, 0, 2558, 2559, 5, 117, 0, 0, 2559, 2560, 5, 108, 0, 0, 2560, 2561, 5, 108, 0, 0, 2561, 2562, 5, 45, 0, 0, 2562, 2563, 5, 110, 0, 0, 2563, 2564, 5, 111, 0, 0, 2564, 2565, 5, 100, 0, 0, 2565, 2566, 5, 101, 0, 0, 2566, 347, 1, 0, 0, 0, 2567, 2568, 5, 110, 0, 0, 2568, 2569, 5, 117, 0, 0, 2569, 2570, 5, 109, 0, 0, 2570, 2571, 5, 98, 0, 0, 2571, 2572, 5, 101, 0, 0, 2572, 2573, 5, 114, 0, 0, 2573, 2574, 5, 45, 0, 0, 2574, 2575, 5, 110, 0, 0, 2575, 2576, 5, 111, 0, 0, 2576, 2577, 5, 100, 0, 0, 2577, 2578, 5, 101, 0, 0, 2578, 349, 1, 0, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 2586, 5, 45, 0, 0, 2586, 2587, 5, 110, 0, 0, 2587, 2588, 5, 111, 0, 0, 2588, 2589, 5, 100, 0, 0, 2589, 2590, 5, 101, 0, 0, 2590, 351, 1, 0, 0, 0, 2591, 2592, 5, 114, 0, 0, 2592, 2593, 5, 101, 0, 0, 2593, 2594, 5, 112, 0, 0, 2594, 2595, 5, 108, 0, 0, 2595, 2596, 5, 97, 0, 0, 2596, 2597, 5, 99, 0, 0, 2597, 2598, 5, 101, 0, 0, 2598, 353, 1, 0, 0, 0, 2599, 2600, 5, 119, 0, 0, 2600, 2601, 5, 105, 0, 0, 2601, 2602, 5, 116, 0, 0, 2602, 2603, 5, 104, 0, 0, 2603, 355, 1, 0, 0, 0, 2604, 2605, 5, 118, 0, 0, 2605, 2606, 5, 97, 0, 0, 2606, 2607, 5, 108, 0, 0, 2607, 2608, 5, 117, 0, 0, 2608, 2609, 5, 101, 0, 0, 2609, 357, 1, 0, 0, 0, 2610, 2611, 5, 105, 0, 0, 2611, 2612, 5, 110, 0, 0, 2612, 2613, 5, 115, 0, 0, 2613, 2614, 5, 101, 0, 0, 2614, 2615, 5, 114, 0, 0, 2615, 2616, 5, 116, 0, 0, 2616, 359, 1, 0, 0, 0, 2617, 2618, 5, 105, 0, 0, 2618, 2619, 5, 110, 0, 0, 2619, 2620, 5, 116, 0, 0, 2620, 2621, 5, 111, 0, 0, 2621, 361, 1, 0, 0, 0, 2622, 2623, 5, 100, 0, 0, 2623, 2624, 5, 101, 0, 0, 2624, 2625, 5, 108, 0, 0, 2625, 2626, 5, 101, 0, 0, 2626, 2627, 5, 116, 0, 0, 2627, 2628, 5, 101, 0, 0, 2628, 363, 1, 0, 0, 0, 2629, 2630, 5, 114, 0, 0, 2630, 2631, 5, 101, 0, 0, 2631, 2632, 5, 110, 0, 0, 2632, 2633, 5, 97, 0, 0, 2633, 2634, 5, 109, 0, 0, 2634, 2635, 5, 101, 0, 0, 2635, 365, 1, 0, 0, 0, 2636, 2637, 5, 81, 0, 0, 2637, 2643, 5, 123, 0, 0, 2638, 2642, 3, 16, 5, 0, 2639, 2642, 3, 18, 6, 0, 2640, 2642, 8, 9, 0, 0, 2641, 2638, 1, 0, 0, 0, 2641, 2639, 1, 0, 0, 0, 2641, 2640, 1, 0, 0, 0, 2642, 2645, 1, 0, 0, 0, 2643, 2641, 1, 0, 0, 0, 2643, 2644, 1, 0, 0, 0, 2644, 2646, 1, 0, 0, 0, 2645, 2643, 1, 0, 0, 0, 2646, 2647, 5, 125, 0, 0, 2647, 2648, 3, 374, 184, 0, 2648, 367, 1, 0, 0, 0, 2649, 2650, 3, 374, 184, 0, 2650, 2651, 5, 58, 0, 0, 2651, 2652, 3, 374, 184, 0, 2652, 369, 1, 0, 0, 0, 2653, 2654, 3, 374, 184, 0, 2654, 2655, 5, 58, 0, 0, 2655, 2656, 5, 42, 0, 0, 2656, 371, 1, 0, 0, 0, 2657, 2658, 5, 42, 0, 0, 2658, 2659, 5, 58, 0, 0, 2659, 2660, 3, 374, 184, 0, 2660, 373, 1, 0, 0, 0, 2661, 2665, 3, 376, 185, 0, 2662, 2664, 3, 378, 186, 0, 2663, 2662, 1, 0, 0, 0, 2664, 2667, 1, 0, 0, 0, 2665, 2663, 1, 0, 0, 0, 2665, 2666, 1, 0, 0, 0, 2666, 375, 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 7, 10, 0, 0, 2669, 2668, 1, 0, 0, 0, 2670, 377, 1, 0, 0, 0, 2671, 2674, 3, 376, 185, 0, 2672, 2674, 7, 11, 0, 0, 2673, 2671, 1, 0, 0, 0, 2673, 2672, 1, 0, 0, 0, 2674, 379, 1, 0, 0, 0, 2675, 2676, 5, 40, 0, 0, 2676, 2677, 5, 58, 0, 0, 2677, 2678, 5, 126, 0, 0, 2678, 381, 1, 0, 0, 0, 2679, 2681, 5, 58, 0, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2682, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2683, 2684, 1, 0, 0, 0, 2684, 2685, 5, 41, 0, 0, 2685, 383, 1, 0, 0, 0, 2686, 2687, 5, 40, 0, 0, 2687, 2688, 5, 58, 0, 0, 2688, 2694, 5, 126, 0, 0, 2689, 2693, 3, 388, 191, 0, 2690, 2691, 5, 58, 0, 0, 2691, 2693, 8, 12, 0, 0, 2692, 2689, 1, 0, 0, 0, 2692, 2690, 1, 0, 0, 0, 2693, 2696, 1, 0, 0, 0, 2694, 2692, 1, 0, 0, 0, 2694, 2695, 1, 0, 0, 0, 2695, 2697, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2697, 2698, 5, 58, 0, 0, 2698, 2699, 5, 41, 0, 0, 2699, 385, 1, 0, 0, 0, 2700, 2701, 5, 40, 0, 0, 2701, 2702, 5, 58, 0, 0, 2702, 2711, 8, 13, 0, 0, 2703, 2710, 3, 386, 190, 0, 2704, 2705, 5, 40, 0, 0, 2705, 2710, 8, 14, 0, 0, 2706, 2707, 5, 58, 0, 0, 2707, 2710, 8, 12, 0, 0, 2708, 2710, 8, 15, 0, 0, 2709, 2703, 1, 0, 0, 0, 2709, 2704, 1, 0, 0, 0, 2709, 2706, 1, 0, 0, 0, 2709, 2708, 1, 0, 0, 0, 2710, 2713, 1, 0, 0, 0, 2711, 2709, 1, 0, 0, 0, 2711, 2712, 1, 0, 0, 0, 2712, 2717, 1, 0, 0, 0, 2713, 2711, 1, 0, 0, 0, 2714, 2716, 5, 58, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 2719, 1, 0, 0, 0, 2717, 2715, 1, 0, 0, 0, 2717, 2718, 1, 0, 0, 0, 2718, 2721, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2720, 2722, 5, 58, 0, 0, 2721, 2720, 1, 0, 0, 0, 2722, 2723, 1, 0, 0, 0, 2723, 2721, 1, 0, 0, 0, 2723, 2724, 1, 0, 0, 0, 2724, 2725, 1, 0, 0, 0, 2725, 2726, 5, 41, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 2728, 6, 190, 2, 0, 2728, 387, 1, 0, 0, 0, 2729, 2730, 7, 16, 0, 0, 2730, 389, 1, 0, 0, 0, 2731, 2732, 3, 98, 46, 0, 2732, 2733, 3, 98, 46, 0, 2733, 2734, 3, 44, 19, 0, 2734, 2735, 1, 0, 0, 0, 2735, 2736, 6, 192, 3, 0, 2736, 391, 1, 0, 0, 0, 2737, 2738, 3, 50, 22, 0, 2738, 2739, 3, 98, 46, 0, 2739, 2740, 1, 0, 0, 0, 2740, 2741, 6, 193, 4, 0, 2741, 393, 1, 0, 0, 0, 2742, 2743, 8, 17, 0, 0, 2743, 395, 1, 0, 0, 0, 2744, 2745, 7, 18, 0, 0, 2745, 397, 1, 0, 0, 0, 2746, 2747, 5, 96, 0, 0, 2747, 2748, 1, 0, 0, 0, 2748, 2749, 6, 196, 5, 0, 2749, 399, 1, 0, 0, 0, 2750, 2751, 5, 93, 0, 0, 2751, 2752, 1, 0, 0, 0, 2752, 2753, 6, 197, 6, 0, 2753, 401, 1, 0, 0, 0, 2754, 2755, 5, 123, 0, 0, 2755, 2756, 1, 0, 0, 0, 2756, 2757, 6, 198, 7, 0, 2757, 403, 1, 0, 0, 0, 2758, 2759, 3, 98, 46, 0, 2759, 2760, 3, 48, 21, 0, 2760, 2761, 1, 0, 0, 0, 2761, 2762, 6, 199, 8, 0, 2762, 405, 1, 0, 0, 0, 2763, 2764, 3, 46, 20, 0, 2764, 2765, 3, 98, 46, 0, 2765, 2766, 3, 98, 46, 0, 2766, 2767, 1, 0, 0, 0, 2767, 2768, 6, 200, 4, 0, 2768, 407, 1, 0, 0, 0, 2769, 2770, 5, 34, 0, 0, 2770, 2771, 5, 34, 0, 0, 2771, 2772, 1, 0, 0, 0, 2772, 2773, 6, 201, 9, 0, 2773, 409, 1, 0, 0, 0, 2774, 2775, 5, 34, 0, 0, 2775, 2776, 1, 0, 0, 0, 2776, 2777, 6, 202, 10, 0, 2777, 2778, 6, 202, 4, 0, 2778, 411, 1, 0, 0, 0, 2779, 2780, 5, 123, 0, 0, 2780, 2781, 5, 123, 0, 0, 2781, 2782, 1, 0, 0, 0, 2782, 2783, 6, 203, 11, 0, 2783, 413, 1, 0, 0, 0, 2784, 2785, 5, 125, 0, 0, 2785, 2786, 5, 125, 0, 0, 2786, 2787, 1, 0, 0, 0, 2787, 2788, 6, 204, 12, 0, 2788, 415, 1, 0, 0, 0, 2789, 2790, 5, 123, 0, 0, 2790, 2791, 1, 0, 0, 0, 2791, 2792, 6, 205, 7, 0, 2792, 2793, 6, 205, 13, 0, 2793, 417, 1, 0, 0, 0, 2794, 2795, 5, 125, 0, 0, 2795, 2796, 1, 0, 0, 0, 2796, 2797, 6, 206, 14, 0, 2797, 419, 1, 0, 0, 0, 2798, 2814, 5, 38, 0, 0, 2799, 2800, 5, 108, 0, 0, 2800, 2815, 5, 116, 0, 0, 2801, 2802, 5, 103, 0, 0, 2802, 2815, 5, 116, 0, 0, 2803, 2804, 5, 97, 0, 0, 2804, 2805, 5, 109, 0, 0, 2805, 2815, 5, 112, 0, 0, 2806, 2807, 5, 113, 0, 0, 2807, 2808, 5, 117, 0, 0, 2808, 2809, 5, 111, 0, 0, 2809, 2815, 5, 116, 0, 0, 2810, 2811, 5, 97, 0, 0, 2811, 2812, 5, 112, 0, 0, 2812, 2813, 5, 111, 0, 0, 2813, 2815, 5, 115, 0, 0, 2814, 2799, 1, 0, 0, 0, 2814, 2801, 1, 0, 0, 0, 2814, 2803, 1, 0, 0, 0, 2814, 2806, 1, 0, 0, 0, 2814, 2810, 1, 0, 0, 0, 2815, 2816, 1, 0, 0, 0, 2816, 2817, 5, 59, 0, 0, 2817, 2818, 1, 0, 0, 0, 2818, 2819, 6, 207, 15, 0, 2819, 421, 1, 0, 0, 0, 2820, 2821, 5, 38, 0, 0, 2821, 2822, 5, 35, 0, 0, 2822, 2824, 1, 0, 0, 0, 2823, 2825, 7, 0, 0, 0, 2824, 2823, 1, 0, 0, 0, 2825, 2826, 1, 0, 0, 0, 2826, 2824, 1, 0, 0, 0, 2826, 2827, 1, 0, 0, 0, 2827, 2828, 1, 0, 0, 0, 2828, 2840, 5, 59, 0, 0, 2829, 2830, 5, 38, 0, 0, 2830, 2831, 5, 35, 0, 0, 2831, 2832, 5, 120, 0, 0, 2832, 2834, 1, 0, 0, 0, 2833, 2835, 7, 3, 0, 0, 2834, 2833, 1, 0, 0, 0, 2835, 2836, 1, 0, 0, 0, 2836, 2834, 1, 0, 0, 0, 2836, 2837, 1, 0, 0, 0, 2837, 2838, 1, 0, 0, 0, 2838, 2840, 5, 59, 0, 0, 2839, 2820, 1, 0, 0, 0, 2839, 2829, 1, 0, 0, 0, 2840, 2841, 1, 0, 0, 0, 2841, 2842, 6, 208, 16, 0, 2842, 423, 1, 0, 0, 0, 2843, 2844, 8, 19, 0, 0, 2844, 2845, 1, 0, 0, 0, 2845, 2846, 6, 209, 17, 0, 2846, 425, 1, 0, 0, 0, 2847, 2848, 5, 39, 0, 0, 2848, 2849, 5, 39, 0, 0, 2849, 2850, 1, 0, 0, 0, 2850, 2851, 6, 210, 18, 0, 2851, 427, 1, 0, 0, 0, 2852, 2853, 5, 39, 0, 0, 2853, 2854, 1, 0, 0, 0, 2854, 2855, 6, 211, 19, 0, 2855, 2856, 6, 211, 4, 0, 2856, 429, 1, 0, 0, 0, 2857, 2858, 5, 123, 0, 0, 2858, 2859, 5, 123, 0, 0, 2859, 2860, 1, 0, 0, 0, 2860, 2861, 6, 212, 11, 0, 2861, 431, 1, 0, 0, 0, 2862, 2863, 5, 125, 0, 0, 2863, 2864, 5, 125, 0, 0, 2864, 2865, 1, 0, 0, 0, 2865, 2866, 6, 213, 12, 0, 2866, 433, 1, 0, 0, 0, 2867, 2868, 5, 123, 0, 0, 2868, 2869, 1, 0, 0, 0, 2869, 2870, 6, 214, 7, 0, 2870, 2871, 6, 214, 20, 0, 2871, 435, 1, 0, 0, 0, 2872, 2873, 5, 125, 0, 0, 2873, 2874, 1, 0, 0, 0, 2874, 2875, 6, 215, 14, 0, 2875, 437, 1, 0, 0, 0, 2876, 2892, 5, 38, 0, 0, 2877, 2878, 5, 108, 0, 0, 2878, 2893, 5, 116, 0, 0, 2879, 2880, 5, 103, 0, 0, 2880, 2893, 5, 116, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 109, 0, 0, 2883, 2893, 5, 112, 0, 0, 2884, 2885, 5, 113, 0, 0, 2885, 2886, 5, 117, 0, 0, 2886, 2887, 5, 111, 0, 0, 2887, 2893, 5, 116, 0, 0, 2888, 2889, 5, 97, 0, 0, 2889, 2890, 5, 112, 0, 0, 2890, 2891, 5, 111, 0, 0, 2891, 2893, 5, 115, 0, 0, 2892, 2877, 1, 0, 0, 0, 2892, 2879, 1, 0, 0, 0, 2892, 2881, 1, 0, 0, 0, 2892, 2884, 1, 0, 0, 0, 2892, 2888, 1, 0, 0, 0, 2893, 2894, 1, 0, 0, 0, 2894, 2895, 5, 59, 0, 0, 2895, 2896, 1, 0, 0, 0, 2896, 2897, 6, 216, 15, 0, 2897, 439, 1, 0, 0, 0, 2898, 2899, 5, 38, 0, 0, 2899, 2900, 5, 35, 0, 0, 2900, 2902, 1, 0, 0, 0, 2901, 2903, 7, 0, 0, 0, 2902, 2901, 1, 0, 0, 0, 2903, 2904, 1, 0, 0, 0, 2904, 2902, 1, 0, 0, 0, 2904, 2905, 1, 0, 0, 0, 2905, 2906, 1, 0, 0, 0, 2906, 2918, 5, 59, 0, 0, 2907, 2908, 5, 38, 0, 0, 2908, 2909, 5, 35, 0, 0, 2909, 2910, 5, 120, 0, 0, 2910, 2912, 1, 0, 0, 0, 2911, 2913, 7, 3, 0, 0, 2912, 2911, 1, 0, 0, 0, 2913, 2914, 1, 0, 0, 0, 2914, 2912, 1, 0, 0, 0, 2914, 2915, 1, 0, 0, 0, 2915, 2916, 1, 0, 0, 0, 2916, 2918, 5, 59, 0, 0, 2917, 2898, 1, 0, 0, 0, 2917, 2907, 1, 0, 0, 0, 2918, 2919, 1, 0, 0, 0, 2919, 2920, 6, 217, 16, 0, 2920, 441, 1, 0, 0, 0, 2921, 2922, 8, 20, 0, 0, 2922, 2923, 1, 0, 0, 0, 2923, 2924, 6, 218, 17, 0, 2924, 443, 1, 0, 0, 0, 2925, 2926, 3, 14, 4, 0, 2926, 2927, 1, 0, 0, 0, 2927, 2928, 6, 219, 21, 0, 2928, 445, 1, 0, 0, 0, 2929, 2930, 5, 46, 0, 0, 2930, 2940, 3, 14, 4, 0, 2931, 2932, 3, 14, 4, 0, 2932, 2936, 5, 46, 0, 0, 2933, 2935, 7, 0, 0, 0, 2934, 2933, 1, 0, 0, 0, 2935, 2938, 1, 0, 0, 0, 2936, 2934, 1, 0, 0, 0, 2936, 2937, 1, 0, 0, 0, 2937, 2940, 1, 0, 0, 0, 2938, 2936, 1, 0, 0, 0, 2939, 2929, 1, 0, 0, 0, 2939, 2931, 1, 0, 0, 0, 2940, 2941, 1, 0, 0, 0, 2941, 2942, 6, 220, 22, 0, 2942, 447, 1, 0, 0, 0, 2943, 2944, 5, 46, 0, 0, 2944, 2956, 3, 14, 4, 0, 2945, 2953, 3, 14, 4, 0, 2946, 2950, 5, 46, 0, 0, 2947, 2949, 7, 0, 0, 0, 2948, 2947, 1, 0, 0, 0, 2949, 2952, 1, 0, 0, 0, 2950, 2948, 1, 0, 0, 0, 2950, 2951, 1, 0, 0, 0, 2951, 2954, 1, 0, 0, 0, 2952, 2950, 1, 0, 0, 0, 2953, 2946, 1, 0, 0, 0, 2953, 2954, 1, 0, 0, 0, 2954, 2956, 1, 0, 0, 0, 2955, 2943, 1, 0, 0, 0, 2955, 2945, 1, 0, 0, 0, 2956, 2957, 1, 0, 0, 0, 2957, 2959, 7, 1, 0, 0, 2958, 2960, 7, 2, 0, 0, 2959, 2958, 1, 0, 0, 0, 2959, 2960, 1, 0, 0, 0, 2960, 2961, 1, 0, 0, 0, 2961, 2962, 3, 14, 4, 0, 2962, 2963, 1, 0, 0, 0, 2963, 2964, 6, 221, 23, 0, 2964, 449, 1, 0, 0, 0, 2965, 2966, 5, 100, 0, 0, 2966, 2967, 5, 101, 0, 0, 2967, 2968, 5, 99, 0, 0, 2968, 2969, 5, 105, 0, 0, 2969, 2970, 5, 109, 0, 0, 2970, 2971, 5, 97, 0, 0, 2971, 2972, 5, 108, 0, 0, 2972, 2973, 5, 45, 0, 0, 2973, 2974, 5, 115, 0, 0, 2974, 2975, 5, 101, 0, 0, 2975, 2976, 5, 112, 0, 0, 2976, 2977, 5, 97, 0, 0, 2977, 2978, 5, 114, 0, 0, 2978, 2979, 5, 97, 0, 0, 2979, 2980, 5, 116, 0, 0, 2980, 2981, 5, 111, 0, 0, 2981, 3088, 5, 114, 0, 0, 2982, 2983, 5, 103, 0, 0, 2983, 2984, 5, 114, 0, 0, 2984, 2985, 5, 111, 0, 0, 2985, 2986, 5, 117, 0, 0, 2986, 2987, 5, 112, 0, 0, 2987, 2988, 5, 105, 0, 0, 2988, 2989, 5, 110, 0, 0, 2989, 2990, 5, 103, 0, 0, 2990, 2991, 5, 45, 0, 0, 2991, 2992, 5, 115, 0, 0, 2992, 2993, 5, 101, 0, 0, 2993, 2994, 5, 112, 0, 0, 2994, 2995, 5, 97, 0, 0, 2995, 2996, 5, 114, 0, 0, 2996, 2997, 5, 97, 0, 0, 2997, 2998, 5, 116, 0, 0, 2998, 2999, 5, 111, 0, 0, 2999, 3088, 5, 114, 0, 0, 3000, 3001, 5, 105, 0, 0, 3001, 3002, 5, 110, 0, 0, 3002, 3003, 5, 102, 0, 0, 3003, 3004, 5, 105, 0, 0, 3004, 3005, 5, 110, 0, 0, 3005, 3006, 5, 105, 0, 0, 3006, 3007, 5, 116, 0, 0, 3007, 3088, 5, 121, 0, 0, 3008, 3009, 5, 109, 0, 0, 3009, 3010, 5, 105, 0, 0, 3010, 3011, 5, 110, 0, 0, 3011, 3012, 5, 117, 0, 0, 3012, 3013, 5, 115, 0, 0, 3013, 3014, 5, 45, 0, 0, 3014, 3015, 5, 115, 0, 0, 3015, 3016, 5, 105, 0, 0, 3016, 3017, 5, 103, 0, 0, 3017, 3088, 5, 110, 0, 0, 3018, 3019, 5, 78, 0, 0, 3019, 3020, 5, 97, 0, 0, 3020, 3088, 5, 78, 0, 0, 3021, 3022, 5, 112, 0, 0, 3022, 3023, 5, 101, 0, 0, 3023, 3024, 5, 114, 0, 0, 3024, 3025, 5, 99, 0, 0, 3025, 3026, 5, 101, 0, 0, 3026, 3027, 5, 110, 0, 0, 3027, 3088, 5, 116, 0, 0, 3028, 3029, 5, 112, 0, 0, 3029, 3030, 5, 101, 0, 0, 3030, 3031, 5, 114, 0, 0, 3031, 3032, 5, 45, 0, 0, 3032, 3033, 5, 109, 0, 0, 3033, 3034, 5, 105, 0, 0, 3034, 3035, 5, 108, 0, 0, 3035, 3036, 5, 108, 0, 0, 3036, 3088, 5, 101, 0, 0, 3037, 3038, 5, 122, 0, 0, 3038, 3039, 5, 101, 0, 0, 3039, 3040, 5, 114, 0, 0, 3040, 3041, 5, 111, 0, 0, 3041, 3042, 5, 45, 0, 0, 3042, 3043, 5, 100, 0, 0, 3043, 3044, 5, 105, 0, 0, 3044, 3045, 5, 103, 0, 0, 3045, 3046, 5, 105, 0, 0, 3046, 3088, 5, 116, 0, 0, 3047, 3048, 5, 100, 0, 0, 3048, 3049, 5, 105, 0, 0, 3049, 3050, 5, 103, 0, 0, 3050, 3051, 5, 105, 0, 0, 3051, 3088, 5, 116, 0, 0, 3052, 3053, 5, 112, 0, 0, 3053, 3054, 5, 97, 0, 0, 3054, 3055, 5, 116, 0, 0, 3055, 3056, 5, 116, 0, 0, 3056, 3057, 5, 101, 0, 0, 3057, 3058, 5, 114, 0, 0, 3058, 3059, 5, 110, 0, 0, 3059, 3060, 5, 45, 0, 0, 3060, 3061, 5, 115, 0, 0, 3061, 3062, 5, 101, 0, 0, 3062, 3063, 5, 112, 0, 0, 3063, 3064, 5, 97, 0, 0, 3064, 3065, 5, 114, 0, 0, 3065, 3066, 5, 97, 0, 0, 3066, 3067, 5, 116, 0, 0, 3067, 3068, 5, 111, 0, 0, 3068, 3088, 5, 114, 0, 0, 3069, 3070, 5, 101, 0, 0, 3070, 3071, 5, 120, 0, 0, 3071, 3072, 5, 112, 0, 0, 3072, 3073, 5, 111, 0, 0, 3073, 3074, 5, 110, 0, 0, 3074, 3075, 5, 101, 0, 0, 3075, 3076, 5, 110, 0, 0, 3076, 3077, 5, 116, 0, 0, 3077, 3078, 5, 45, 0, 0, 3078, 3079, 5, 115, 0, 0, 3079, 3080, 5, 101, 0, 0, 3080, 3081, 5, 112, 0, 0, 3081, 3082, 5, 97, 0, 0, 3082, 3083, 5, 114, 0, 0, 3083, 3084, 5, 97, 0, 0, 3084, 3085, 5, 116, 0, 0, 3085, 3086, 5, 111, 0, 0, 3086, 3088, 5, 114, 0, 0, 3087, 2965, 1, 0, 0, 0, 3087, 2982, 1, 0, 0, 0, 3087, 3000, 1, 0, 0, 0, 3087, 3008, 1, 0, 0, 0, 3087, 3018, 1, 0, 0, 0, 3087, 3021, 1, 0, 0, 0, 3087, 3028, 1, 0, 0, 0, 3087, 3037, 1, 0, 0, 0, 3087, 3047, 1, 0, 0, 0, 3087, 3052, 1, 0, 0, 0, 3087, 3069, 1, 0, 0, 0, 3088, 3089, 1, 0, 0, 0, 3089, 3090, 6, 222, 24, 0, 3090, 451, 1, 0, 0, 0, 3091, 3107, 5, 38, 0, 0, 3092, 3093, 5, 108, 0, 0, 3093, 3108, 5, 116, 0, 0, 3094, 3095, 5, 103, 0, 0, 3095, 3108, 5, 116, 0, 0, 3096, 3097, 5, 97, 0, 0, 3097, 3098, 5, 109, 0, 0, 3098, 3108, 5, 112, 0, 0, 3099, 3100, 5, 113, 0, 0, 3100, 3101, 5, 117, 0, 0, 3101, 3102, 5, 111, 0, 0, 3102, 3108, 5, 116, 0, 0, 3103, 3104, 5, 97, 0, 0, 3104, 3105, 5, 112, 0, 0, 3105, 3106, 5, 111, 0, 0, 3106, 3108, 5, 115, 0, 0, 3107, 3092, 1, 0, 0, 0, 3107, 3094, 1, 0, 0, 0, 3107, 3096, 1, 0, 0, 0, 3107, 3099, 1, 0, 0, 0, 3107, 3103, 1, 0, 0, 0, 3108, 3109, 1, 0, 0, 0, 3109, 3110, 5, 59, 0, 0, 3110, 3111, 1, 0, 0, 0, 3111, 3112, 6, 223, 15, 0, 3112, 453, 1, 0, 0, 0, 3113, 3114, 5, 38, 0, 0, 3114, 3115, 5, 35, 0, 0, 3115, 3117, 1, 0, 0, 0, 3116, 3118, 7, 0, 0, 0, 3117, 3116, 1, 0, 0, 0, 3118, 3119, 1, 0, 0, 0, 3119, 3117, 1, 0, 0, 0, 3119, 3120, 1, 0, 0, 0, 3120, 3121, 1, 0, 0, 0, 3121, 3133, 5, 59, 0, 0, 3122, 3123, 5, 38, 0, 0, 3123, 3124, 5, 35, 0, 0, 3124, 3125, 5, 120, 0, 0, 3125, 3127, 1, 0, 0, 0, 3126, 3128, 7, 3, 0, 0, 3127, 3126, 1, 0, 0, 0, 3128, 3129, 1, 0, 0, 0, 3129, 3127, 1, 0, 0, 0, 3129, 3130, 1, 0, 0, 0, 3130, 3131, 1, 0, 0, 0, 3131, 3133, 5, 59, 0, 0, 3132, 3113, 1, 0, 0, 0, 3132, 3122, 1, 0, 0, 0, 3133, 3134, 1, 0, 0, 0, 3134, 3135, 6, 224, 16, 0, 3135, 455, 1, 0, 0, 0, 3136, 3137, 5, 34, 0, 0, 3137, 3138, 5, 34, 0, 0, 3138, 3139, 1, 0, 0, 0, 3139, 3140, 6, 225, 9, 0, 3140, 457, 1, 0, 0, 0, 3141, 3142, 5, 39, 0, 0, 3142, 3143, 1, 0, 0, 0, 3143, 3144, 6, 226, 1, 0, 3144, 3145, 6, 226, 19, 0, 3145, 459, 1, 0, 0, 0, 3146, 3147, 5, 34, 0, 0, 3147, 3148, 1, 0, 0, 0, 3148, 3149, 6, 227, 10, 0, 3149, 3150, 6, 227, 4, 0, 3150, 3151, 6, 227, 4, 0, 3151, 461, 1, 0, 0, 0, 3152, 3153, 5, 60, 0, 0, 3153, 3154, 5, 33, 0, 0, 3154, 3155, 5, 45, 0, 0, 3155, 3156, 5, 45, 0, 0, 3156, 3162, 1, 0, 0, 0, 3157, 3158, 5, 45, 0, 0, 3158, 3161, 8, 4, 0, 0, 3159, 3161, 8, 4, 0, 0, 3160, 3157, 1, 0, 0, 0, 3160, 3159, 1, 0, 0, 0, 3161, 3164, 1, 0, 0, 0, 3162, 3160, 1, 0, 0, 0, 3162, 3163, 1, 0, 0, 0, 3163, 3165, 1, 0, 0, 0, 3164, 3162, 1, 0, 0, 0, 3165, 3166, 5, 45, 0, 0, 3166, 3167, 5, 45, 0, 0, 3167, 3168, 5, 62, 0, 0, 3168, 3169, 1, 0, 0, 0, 3169, 3170, 6, 228, 25, 0, 3170, 463, 1, 0, 0, 0, 3171, 3172, 5, 60, 0, 0, 3172, 3173, 5, 63, 0, 0, 3173, 3174, 1, 0, 0, 0, 3174, 3175, 7, 5, 0, 0, 3175, 3176, 7, 6, 0, 0, 3176, 3184, 7, 7, 0, 0, 3177, 3181, 7, 8, 0, 0, 3178, 3180, 9, 0, 0, 0, 3179, 3178, 1, 0, 0, 0, 3180, 3183, 1, 0, 0, 0, 3181, 3182, 1, 0, 0, 0, 3181, 3179, 1, 0, 0, 0, 3182, 3185, 1, 0, 0, 0, 3183, 3181, 1, 0, 0, 0, 3184, 3177, 1, 0, 0, 0, 3184, 3185, 1, 0, 0, 0, 3185, 3186, 1, 0, 0, 0, 3186, 3187, 5, 63, 0, 0, 3187, 3188, 5, 62, 0, 0, 3188, 3189, 1, 0, 0, 0, 3189, 3190, 6, 229, 26, 0, 3190, 465, 1, 0, 0, 0, 3191, 3192, 5, 60, 0, 0, 3192, 3193, 5, 63, 0, 0, 3193, 3194, 1, 0, 0, 0, 3194, 3202, 3, 374, 184, 0, 3195, 3199, 7, 8, 0, 0, 3196, 3198, 9, 0, 0, 0, 3197, 3196, 1, 0, 0, 0, 3198, 3201, 1, 0, 0, 0, 3199, 3200, 1, 0, 0, 0, 3199, 3197, 1, 0, 0, 0, 3200, 3203, 1, 0, 0, 0, 3201, 3199, 1, 0, 0, 0, 3202, 3195, 1, 0, 0, 0, 3202, 3203, 1, 0, 0, 0, 3203, 3204, 1, 0, 0, 0, 3204, 3205, 5, 63, 0, 0, 3205, 3206, 5, 62, 0, 0, 3206, 3207, 1, 0, 0, 0, 3207, 3208, 6, 230, 27, 0, 3208, 467, 1, 0, 0, 0, 3209, 3210, 5, 60, 0, 0, 3210, 3211, 5, 33, 0, 0, 3211, 3212, 5, 91, 0, 0, 3212, 3213, 5, 67, 0, 0, 3213, 3214, 5, 68, 0, 0, 3214, 3215, 5, 65, 0, 0, 3215, 3216, 5, 84, 0, 0, 3216, 3217, 5, 65, 0, 0, 3217, 3218, 5, 91, 0, 0, 3218, 3222, 1, 0, 0, 0, 3219, 3221, 9, 0, 0, 0, 3220, 3219, 1, 0, 0, 0, 3221, 3224, 1, 0, 0, 0, 3222, 3223, 1, 0, 0, 0, 3222, 3220, 1, 0, 0, 0, 3223, 3225, 1, 0, 0, 0, 3224, 3222, 1, 0, 0, 0, 3225, 3226, 5, 93, 0, 0, 3226, 3227, 5, 93, 0, 0, 3227, 3228, 5, 62, 0, 0, 3228, 3229, 1, 0, 0, 0, 3229, 3230, 6, 231, 28, 0, 3230, 469, 1, 0, 0, 0, 3231, 3232, 5, 40, 0, 0, 3232, 3233, 5, 35, 0, 0, 3233, 3235, 1, 0, 0, 0, 3234, 3236, 3, 34, 14, 0, 3235, 3234, 1, 0, 0, 0, 3235, 3236, 1, 0, 0, 0, 3236, 3240, 1, 0, 0, 0, 3237, 3238, 3, 374, 184, 0, 3238, 3239, 5, 58, 0, 0, 3239, 3241, 1, 0, 0, 0, 3240, 3237, 1, 0, 0, 0, 3240, 3241, 1, 0, 0, 0, 3241, 3242, 1, 0, 0, 0, 3242, 3250, 3, 374, 184, 0, 3243, 3247, 3, 34, 14, 0, 3244, 3246, 9, 0, 0, 0, 3245, 3244, 1, 0, 0, 0, 3246, 3249, 1, 0, 0, 0, 3247, 3248, 1, 0, 0, 0, 3247, 3245, 1, 0, 0, 0, 3248, 3251, 1, 0, 0, 0, 3249, 3247, 1, 0, 0, 0, 3250, 3243, 1, 0, 0, 0, 3250, 3251, 1, 0, 0, 0, 3251, 3252, 1, 0, 0, 0, 3252, 3253, 5, 35, 0, 0, 3253, 3254, 5, 41, 0, 0, 3254, 3255, 1, 0, 0, 0, 3255, 3256, 6, 232, 29, 0, 3256, 471, 1, 0, 0, 0, 3257, 3259, 7, 8, 0, 0, 3258, 3257, 1, 0, 0, 0, 3259, 3260, 1, 0, 0, 0, 3260, 3258, 1, 0, 0, 0, 3260, 3261, 1, 0, 0, 0, 3261, 3262, 1, 0, 0, 0, 3262, 3263, 6, 233, 2, 0, 3263, 3264, 6, 233, 30, 0, 3264, 473, 1, 0, 0, 0, 3265, 3266, 5, 61, 0, 0, 3266, 3267, 1, 0, 0, 0, 3267, 3268, 6, 234, 31, 0, 3268, 475, 1, 0, 0, 0, 3269, 3270, 5, 33, 0, 0, 3270, 3271, 5, 61, 0, 0, 3271, 3272, 1, 0, 0, 0, 3272, 3273, 6, 235, 32, 0, 3273, 477, 1, 0, 0, 0, 3274, 3275, 5, 40, 0, 0, 3275, 3276, 1, 0, 0, 0, 3276, 3277, 6, 236, 33, 0, 3277, 479, 1, 0, 0, 0, 3278, 3279, 5, 41, 0, 0, 3279, 3280, 1, 0, 0, 0, 3280, 3281, 6, 237, 34, 0, 3281, 481, 1, 0, 0, 0, 3282, 3283, 5, 91, 0, 0, 3283, 3284, 1, 0, 0, 0, 3284, 3285, 6, 238, 35, 0, 3285, 483, 1, 0, 0, 0, 3286, 3287, 5, 93, 0, 0, 3287, 3288, 1, 0, 0, 0, 3288, 3289, 6, 239, 6, 0, 3289, 485, 1, 0, 0, 0, 3290, 3291, 5, 123, 0, 0, 3291, 3292, 6, 240, 36, 0, 3292, 3293, 1, 0, 0, 0, 3293, 3294, 6, 240, 7, 0, 3294, 487, 1, 0, 0, 0, 3295, 3296, 4, 241, 0, 0, 3296, 3297, 5, 125, 0, 0, 3297, 3298, 1, 0, 0, 0, 3298, 3299, 6, 241, 14, 0, 3299, 3300, 6, 241, 4, 0, 3300, 489, 1, 0, 0, 0, 3301, 3302, 4, 242, 1, 0, 3302, 3303, 5, 125, 0, 0, 3303, 3304, 6, 242, 37, 0, 3304, 3305, 1, 0, 0, 0, 3305, 3306, 6, 242, 14, 0, 3306, 491, 1, 0, 0, 0, 3307, 3308, 5, 42, 0, 0, 3308, 3309, 1, 0, 0, 0, 3309, 3310, 6, 243, 38, 0, 3310, 493, 1, 0, 0, 0, 3311, 3312, 5, 43, 0, 0, 3312, 3313, 1, 0, 0, 0, 3313, 3314, 6, 244, 39, 0, 3314, 495, 1, 0, 0, 0, 3315, 3316, 5, 45, 0, 0, 3316, 3317, 1, 0, 0, 0, 3317, 3318, 6, 245, 40, 0, 3318, 497, 1, 0, 0, 0, 3319, 3320, 5, 44, 0, 0, 3320, 3321, 1, 0, 0, 0, 3321, 3322, 6, 246, 41, 0, 3322, 499, 1, 0, 0, 0, 3323, 3324, 5, 46, 0, 0, 3324, 3325, 1, 0, 0, 0, 3325, 3326, 6, 247, 42, 0, 3326, 501, 1, 0, 0, 0, 3327, 3328, 5, 46, 0, 0, 3328, 3329, 5, 46, 0, 0, 3329, 3330, 1, 0, 0, 0, 3330, 3331, 6, 248, 43, 0, 3331, 503, 1, 0, 0, 0, 3332, 3333, 5, 58, 0, 0, 3333, 3334, 1, 0, 0, 0, 3334, 3335, 6, 249, 44, 0, 3335, 505, 1, 0, 0, 0, 3336, 3337, 5, 58, 0, 0, 3337, 3338, 5, 61, 0, 0, 3338, 3339, 1, 0, 0, 0, 3339, 3340, 6, 250, 45, 0, 3340, 507, 1, 0, 0, 0, 3341, 3342, 5, 59, 0, 0, 3342, 3343, 1, 0, 0, 0, 3343, 3344, 6, 251, 46, 0, 3344, 509, 1, 0, 0, 0, 3345, 3346, 5, 47, 0, 0, 3346, 3347, 1, 0, 0, 0, 3347, 3348, 6, 252, 47, 0, 3348, 511, 1, 0, 0, 0, 3349, 3350, 5, 47, 0, 0, 3350, 3351, 5, 47, 0, 0, 3351, 3352, 1, 0, 0, 0, 3352, 3353, 6, 253, 48, 0, 3353, 513, 1, 0, 0, 0, 3354, 3355, 5, 92, 0, 0, 3355, 3356, 1, 0, 0, 0, 3356, 3357, 6, 254, 49, 0, 3357, 515, 1, 0, 0, 0, 3358, 3359, 5, 124, 0, 0, 3359, 3360, 1, 0, 0, 0, 3360, 3361, 6, 255, 50, 0, 3361, 517, 1, 0, 0, 0, 3362, 3363, 5, 60, 0, 0, 3363, 3364, 1, 0, 0, 0, 3364, 3365, 6, 256, 51, 0, 3365, 519, 1, 0, 0, 0, 3366, 3367, 5, 62, 0, 0, 3367, 3368, 1, 0, 0, 0, 3368, 3369, 6, 257, 52, 0, 3369, 521, 1, 0, 0, 0, 3370, 3371, 5, 63, 0, 0, 3371, 3372, 1, 0, 0, 0, 3372, 3373, 6, 258, 53, 0, 3373, 523, 1, 0, 0, 0, 3374, 3375, 5, 64, 0, 0, 3375, 3376, 1, 0, 0, 0, 3376, 3377, 6, 259, 54, 0, 3377, 525, 1, 0, 0, 0, 3378, 3379, 5, 36, 0, 0, 3379, 3380, 1, 0, 0, 0, 3380, 3381, 6, 260, 55, 0, 3381, 527, 1, 0, 0, 0, 3382, 3383, 5, 37, 0, 0, 3383, 3384, 1, 0, 0, 0, 3384, 3385, 6, 261, 56, 0, 3385, 529, 1, 0, 0, 0, 3386, 3387, 5, 33, 0, 0, 3387, 3388, 1, 0, 0, 0, 3388, 3389, 6, 262, 57, 0, 3389, 531, 1, 0, 0, 0, 3390, 3391, 5, 35, 0, 0, 3391, 3392, 1, 0, 0, 0, 3392, 3393, 6, 263, 58, 0, 3393, 533, 1, 0, 0, 0, 3394, 3395, 5, 94, 0, 0, 3395, 3396, 1, 0, 0, 0, 3396, 3397, 6, 264, 59, 0, 3397, 535, 1, 0, 0, 0, 3398, 3399, 5, 61, 0, 0, 3399, 3400, 5, 62, 0, 0, 3400, 3401, 1, 0, 0, 0, 3401, 3402, 6, 265, 60, 0, 3402, 537, 1, 0, 0, 0, 3403, 3404, 5, 96, 0, 0, 3404, 3405, 1, 0, 0, 0, 3405, 3406, 6, 266, 5, 0, 3406, 539, 1, 0, 0, 0, 3407, 3408, 5, 124, 0, 0, 3408, 3409, 5, 124, 0, 0, 3409, 3410, 1, 0, 0, 0, 3410, 3411, 6, 267, 61, 0, 3411, 541, 1, 0, 0, 0, 3412, 3413, 5, 126, 0, 0, 3413, 3414, 1, 0, 0, 0, 3414, 3415, 6, 268, 62, 0, 3415, 543, 1, 0, 0, 0, 3416, 3417, 5, 97, 0, 0, 3417, 3418, 5, 108, 0, 0, 3418, 3419, 5, 108, 0, 0, 3419, 3420, 5, 111, 0, 0, 3420, 3421, 5, 119, 0, 0, 3421, 3422, 5, 105, 0, 0, 3422, 3423, 5, 110, 0, 0, 3423, 3424, 5, 103, 0, 0, 3424, 3425, 1, 0, 0, 0, 3425, 3426, 6, 269, 63, 0, 3426, 545, 1, 0, 0, 0, 3427, 3428, 5, 97, 0, 0, 3428, 3429, 5, 110, 0, 0, 3429, 3430, 5, 99, 0, 0, 3430, 3431, 5, 101, 0, 0, 3431, 3432, 5, 115, 0, 0, 3432, 3433, 5, 116, 0, 0, 3433, 3434, 5, 111, 0, 0, 3434, 3435, 5, 114, 0, 0, 3435, 3436, 1, 0, 0, 0, 3436, 3437, 6, 270, 64, 0, 3437, 547, 1, 0, 0, 0, 3438, 3439, 5, 97, 0, 0, 3439, 3440, 5, 110, 0, 0, 3440, 3441, 5, 99, 0, 0, 3441, 3442, 5, 101, 0, 0, 3442, 3443, 5, 115, 0, 0, 3443, 3444, 5, 116, 0, 0, 3444, 3445, 5, 111, 0, 0, 3445, 3446, 5, 114, 0, 0, 3446, 3447, 5, 45, 0, 0, 3447, 3448, 5, 111, 0, 0, 3448, 3449, 5, 114, 0, 0, 3449, 3450, 5, 45, 0, 0, 3450, 3451, 5, 115, 0, 0, 3451, 3452, 5, 101, 0, 0, 3452, 3453, 5, 108, 0, 0, 3453, 3454, 5, 102, 0, 0, 3454, 3455, 1, 0, 0, 0, 3455, 3456, 6, 271, 65, 0, 3456, 549, 1, 0, 0, 0, 3457, 3458, 5, 97, 0, 0, 3458, 3459, 5, 110, 0, 0, 3459, 3460, 5, 100, 0, 0, 3460, 3461, 1, 0, 0, 0, 3461, 3462, 6, 272, 66, 0, 3462, 551, 1, 0, 0, 0, 3463, 3464, 5, 97, 0, 0, 3464, 3465, 5, 114, 0, 0, 3465, 3466, 5, 114, 0, 0, 3466, 3467, 5, 97, 0, 0, 3467, 3468, 5, 121, 0, 0, 3468, 3469, 1, 0, 0, 0, 3469, 3470, 6, 273, 67, 0, 3470, 553, 1, 0, 0, 0, 3471, 3472, 5, 97, 0, 0, 3472, 3473, 5, 115, 0, 0, 3473, 3474, 1, 0, 0, 0, 3474, 3475, 6, 274, 68, 0, 3475, 555, 1, 0, 0, 0, 3476, 3477, 5, 97, 0, 0, 3477, 3478, 5, 115, 0, 0, 3478, 3479, 5, 99, 0, 0, 3479, 3480, 5, 101, 0, 0, 3480, 3481, 5, 110, 0, 0, 3481, 3482, 5, 100, 0, 0, 3482, 3483, 5, 105, 0, 0, 3483, 3484, 5, 110, 0, 0, 3484, 3485, 5, 103, 0, 0, 3485, 3486, 1, 0, 0, 0, 3486, 3487, 6, 275, 69, 0, 3487, 557, 1, 0, 0, 0, 3488, 3489, 5, 97, 0, 0, 3489, 3490, 5, 116, 0, 0, 3490, 3491, 1, 0, 0, 0, 3491, 3492, 6, 276, 70, 0, 3492, 559, 1, 0, 0, 0, 3493, 3494, 5, 97, 0, 0, 3494, 3495, 5, 116, 0, 0, 3495, 3496, 5, 116, 0, 0, 3496, 3497, 5, 114, 0, 0, 3497, 3498, 5, 105, 0, 0, 3498, 3499, 5, 98, 0, 0, 3499, 3500, 5, 117, 0, 0, 3500, 3501, 5, 116, 0, 0, 3501, 3502, 5, 101, 0, 0, 3502, 3503, 1, 0, 0, 0, 3503, 3504, 6, 277, 71, 0, 3504, 561, 1, 0, 0, 0, 3505, 3506, 5, 98, 0, 0, 3506, 3507, 5, 97, 0, 0, 3507, 3508, 5, 115, 0, 0, 3508, 3509, 5, 101, 0, 0, 3509, 3510, 5, 45, 0, 0, 3510, 3511, 5, 117, 0, 0, 3511, 3512, 5, 114, 0, 0, 3512, 3513, 5, 105, 0, 0, 3513, 3514, 1, 0, 0, 0, 3514, 3515, 6, 278, 72, 0, 3515, 563, 1, 0, 0, 0, 3516, 3517, 5, 98, 0, 0, 3517, 3518, 5, 111, 0, 0, 3518, 3519, 5, 117, 0, 0, 3519, 3520, 5, 110, 0, 0, 3520, 3521, 5, 100, 0, 0, 3521, 3522, 5, 97, 0, 0, 3522, 3523, 5, 114, 0, 0, 3523, 3524, 5, 121, 0, 0, 3524, 3525, 5, 45, 0, 0, 3525, 3526, 5, 115, 0, 0, 3526, 3527, 5, 112, 0, 0, 3527, 3528, 5, 97, 0, 0, 3528, 3529, 5, 99, 0, 0, 3529, 3530, 5, 101, 0, 0, 3530, 3531, 1, 0, 0, 0, 3531, 3532, 6, 279, 73, 0, 3532, 565, 1, 0, 0, 0, 3533, 3534, 5, 98, 0, 0, 3534, 3535, 5, 105, 0, 0, 3535, 3536, 5, 110, 0, 0, 3536, 3537, 5, 97, 0, 0, 3537, 3538, 5, 114, 0, 0, 3538, 3539, 5, 121, 0, 0, 3539, 3540, 1, 0, 0, 0, 3540, 3541, 6, 280, 74, 0, 3541, 567, 1, 0, 0, 0, 3542, 3543, 5, 98, 0, 0, 3543, 3544, 5, 121, 0, 0, 3544, 3545, 1, 0, 0, 0, 3545, 3546, 6, 281, 75, 0, 3546, 569, 1, 0, 0, 0, 3547, 3548, 5, 99, 0, 0, 3548, 3549, 5, 97, 0, 0, 3549, 3550, 5, 115, 0, 0, 3550, 3551, 5, 101, 0, 0, 3551, 3552, 1, 0, 0, 0, 3552, 3553, 6, 282, 76, 0, 3553, 571, 1, 0, 0, 0, 3554, 3555, 5, 99, 0, 0, 3555, 3556, 5, 97, 0, 0, 3556, 3557, 5, 115, 0, 0, 3557, 3558, 5, 116, 0, 0, 3558, 3559, 1, 0, 0, 0, 3559, 3560, 6, 283, 77, 0, 3560, 573, 1, 0, 0, 0, 3561, 3562, 5, 99, 0, 0, 3562, 3563, 5, 97, 0, 0, 3563, 3564, 5, 115, 0, 0, 3564, 3565, 5, 116, 0, 0, 3565, 3566, 5, 97, 0, 0, 3566, 3567, 5, 98, 0, 0, 3567, 3568, 5, 108, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 1, 0, 0, 0, 3570, 3571, 6, 284, 78, 0, 3571, 575, 1, 0, 0, 0, 3572, 3573, 5, 99, 0, 0, 3573, 3574, 5, 97, 0, 0, 3574, 3575, 5, 116, 0, 0, 3575, 3576, 5, 99, 0, 0, 3576, 3577, 5, 104, 0, 0, 3577, 3578, 1, 0, 0, 0, 3578, 3579, 6, 285, 79, 0, 3579, 577, 1, 0, 0, 0, 3580, 3581, 5, 99, 0, 0, 3581, 3582, 5, 104, 0, 0, 3582, 3583, 5, 105, 0, 0, 3583, 3584, 5, 108, 0, 0, 3584, 3585, 5, 100, 0, 0, 3585, 3586, 1, 0, 0, 0, 3586, 3587, 6, 286, 80, 0, 3587, 579, 1, 0, 0, 0, 3588, 3589, 5, 99, 0, 0, 3589, 3590, 5, 111, 0, 0, 3590, 3591, 5, 108, 0, 0, 3591, 3592, 5, 108, 0, 0, 3592, 3593, 5, 97, 0, 0, 3593, 3594, 5, 116, 0, 0, 3594, 3595, 5, 105, 0, 0, 3595, 3596, 5, 111, 0, 0, 3596, 3597, 5, 110, 0, 0, 3597, 3598, 1, 0, 0, 0, 3598, 3599, 6, 287, 81, 0, 3599, 581, 1, 0, 0, 0, 3600, 3601, 5, 99, 0, 0, 3601, 3602, 5, 111, 0, 0, 3602, 3603, 5, 109, 0, 0, 3603, 3604, 5, 109, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 110, 0, 0, 3606, 3607, 5, 116, 0, 0, 3607, 3608, 1, 0, 0, 0, 3608, 3609, 6, 288, 82, 0, 3609, 583, 1, 0, 0, 0, 3610, 3611, 5, 99, 0, 0, 3611, 3612, 5, 111, 0, 0, 3612, 3613, 5, 110, 0, 0, 3613, 3614, 5, 115, 0, 0, 3614, 3615, 5, 116, 0, 0, 3615, 3616, 5, 114, 0, 0, 3616, 3617, 5, 117, 0, 0, 3617, 3618, 5, 99, 0, 0, 3618, 3619, 5, 116, 0, 0, 3619, 3620, 5, 105, 0, 0, 3620, 3621, 5, 111, 0, 0, 3621, 3622, 5, 110, 0, 0, 3622, 3623, 1, 0, 0, 0, 3623, 3624, 6, 289, 83, 0, 3624, 585, 1, 0, 0, 0, 3625, 3626, 5, 99, 0, 0, 3626, 3627, 5, 111, 0, 0, 3627, 3628, 5, 110, 0, 0, 3628, 3629, 5, 116, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 120, 0, 0, 3631, 3632, 5, 116, 0, 0, 3632, 3633, 1, 0, 0, 0, 3633, 3634, 6, 290, 84, 0, 3634, 587, 1, 0, 0, 0, 3635, 3636, 5, 99, 0, 0, 3636, 3637, 5, 111, 0, 0, 3637, 3638, 5, 112, 0, 0, 3638, 3639, 5, 121, 0, 0, 3639, 3640, 5, 45, 0, 0, 3640, 3641, 5, 110, 0, 0, 3641, 3642, 5, 97, 0, 0, 3642, 3643, 5, 109, 0, 0, 3643, 3644, 5, 101, 0, 0, 3644, 3645, 5, 115, 0, 0, 3645, 3646, 5, 112, 0, 0, 3646, 3647, 5, 97, 0, 0, 3647, 3648, 5, 99, 0, 0, 3648, 3649, 5, 101, 0, 0, 3649, 3650, 5, 115, 0, 0, 3650, 3651, 1, 0, 0, 0, 3651, 3652, 6, 291, 85, 0, 3652, 589, 1, 0, 0, 0, 3653, 3654, 5, 99, 0, 0, 3654, 3655, 5, 111, 0, 0, 3655, 3656, 5, 117, 0, 0, 3656, 3657, 5, 110, 0, 0, 3657, 3658, 5, 116, 0, 0, 3658, 3659, 1, 0, 0, 0, 3659, 3660, 6, 292, 86, 0, 3660, 591, 1, 0, 0, 0, 3661, 3662, 5, 100, 0, 0, 3662, 3663, 5, 101, 0, 0, 3663, 3664, 5, 99, 0, 0, 3664, 3665, 5, 108, 0, 0, 3665, 3666, 5, 97, 0, 0, 3666, 3667, 5, 114, 0, 0, 3667, 3668, 5, 101, 0, 0, 3668, 3669, 1, 0, 0, 0, 3669, 3670, 6, 293, 87, 0, 3670, 593, 1, 0, 0, 0, 3671, 3672, 5, 100, 0, 0, 3672, 3673, 5, 101, 0, 0, 3673, 3674, 5, 102, 0, 0, 3674, 3675, 5, 97, 0, 0, 3675, 3676, 5, 117, 0, 0, 3676, 3677, 5, 108, 0, 0, 3677, 3678, 5, 116, 0, 0, 3678, 3679, 1, 0, 0, 0, 3679, 3680, 6, 294, 88, 0, 3680, 595, 1, 0, 0, 0, 3681, 3682, 5, 100, 0, 0, 3682, 3683, 5, 101, 0, 0, 3683, 3684, 5, 115, 0, 0, 3684, 3685, 5, 99, 0, 0, 3685, 3686, 5, 101, 0, 0, 3686, 3687, 5, 110, 0, 0, 3687, 3688, 5, 100, 0, 0, 3688, 3689, 5, 97, 0, 0, 3689, 3690, 5, 110, 0, 0, 3690, 3691, 5, 116, 0, 0, 3691, 3692, 1, 0, 0, 0, 3692, 3693, 6, 295, 89, 0, 3693, 597, 1, 0, 0, 0, 3694, 3695, 5, 100, 0, 0, 3695, 3696, 5, 101, 0, 0, 3696, 3697, 5, 115, 0, 0, 3697, 3698, 5, 99, 0, 0, 3698, 3699, 5, 101, 0, 0, 3699, 3700, 5, 110, 0, 0, 3700, 3701, 5, 100, 0, 0, 3701, 3702, 5, 97, 0, 0, 3702, 3703, 5, 110, 0, 0, 3703, 3704, 5, 116, 0, 0, 3704, 3705, 5, 45, 0, 0, 3705, 3706, 5, 111, 0, 0, 3706, 3707, 5, 114, 0, 0, 3707, 3708, 5, 45, 0, 0, 3708, 3709, 5, 115, 0, 0, 3709, 3710, 5, 101, 0, 0, 3710, 3711, 5, 108, 0, 0, 3711, 3712, 5, 102, 0, 0, 3712, 3713, 1, 0, 0, 0, 3713, 3714, 6, 296, 90, 0, 3714, 599, 1, 0, 0, 0, 3715, 3716, 5, 100, 0, 0, 3716, 3717, 5, 101, 0, 0, 3717, 3718, 5, 115, 0, 0, 3718, 3719, 5, 99, 0, 0, 3719, 3720, 5, 101, 0, 0, 3720, 3721, 5, 110, 0, 0, 3721, 3722, 5, 100, 0, 0, 3722, 3723, 5, 105, 0, 0, 3723, 3724, 5, 110, 0, 0, 3724, 3725, 5, 103, 0, 0, 3725, 3726, 1, 0, 0, 0, 3726, 3727, 6, 297, 91, 0, 3727, 601, 1, 0, 0, 0, 3728, 3729, 5, 100, 0, 0, 3729, 3730, 5, 101, 0, 0, 3730, 3731, 5, 99, 0, 0, 3731, 3732, 5, 105, 0, 0, 3732, 3733, 5, 109, 0, 0, 3733, 3734, 5, 97, 0, 0, 3734, 3735, 5, 108, 0, 0, 3735, 3736, 5, 45, 0, 0, 3736, 3737, 5, 102, 0, 0, 3737, 3738, 5, 111, 0, 0, 3738, 3739, 5, 114, 0, 0, 3739, 3740, 5, 109, 0, 0, 3740, 3741, 5, 97, 0, 0, 3741, 3742, 5, 116, 0, 0, 3742, 3743, 1, 0, 0, 0, 3743, 3744, 6, 298, 92, 0, 3744, 603, 1, 0, 0, 0, 3745, 3746, 5, 100, 0, 0, 3746, 3747, 5, 105, 0, 0, 3747, 3748, 5, 118, 0, 0, 3748, 3749, 1, 0, 0, 0, 3749, 3750, 6, 299, 93, 0, 3750, 605, 1, 0, 0, 0, 3751, 3752, 5, 100, 0, 0, 3752, 3753, 5, 111, 0, 0, 3753, 3754, 5, 99, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 3756, 5, 109, 0, 0, 3756, 3757, 5, 101, 0, 0, 3757, 3758, 5, 110, 0, 0, 3758, 3759, 5, 116, 0, 0, 3759, 3760, 1, 0, 0, 0, 3760, 3761, 6, 300, 94, 0, 3761, 607, 1, 0, 0, 0, 3762, 3763, 5, 100, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 99, 0, 0, 3765, 3766, 5, 117, 0, 0, 3766, 3767, 5, 109, 0, 0, 3767, 3768, 5, 101, 0, 0, 3768, 3769, 5, 110, 0, 0, 3769, 3770, 5, 116, 0, 0, 3770, 3771, 5, 45, 0, 0, 3771, 3772, 5, 110, 0, 0, 3772, 3773, 5, 111, 0, 0, 3773, 3774, 5, 100, 0, 0, 3774, 3775, 5, 101, 0, 0, 3775, 3776, 1, 0, 0, 0, 3776, 3777, 6, 301, 95, 0, 3777, 609, 1, 0, 0, 0, 3778, 3779, 5, 101, 0, 0, 3779, 3780, 5, 108, 0, 0, 3780, 3781, 5, 101, 0, 0, 3781, 3782, 5, 109, 0, 0, 3782, 3783, 5, 101, 0, 0, 3783, 3784, 5, 110, 0, 0, 3784, 3785, 5, 116, 0, 0, 3785, 3786, 1, 0, 0, 0, 3786, 3787, 6, 302, 96, 0, 3787, 611, 1, 0, 0, 0, 3788, 3789, 5, 101, 0, 0, 3789, 3790, 5, 108, 0, 0, 3790, 3791, 5, 115, 0, 0, 3791, 3792, 5, 101, 0, 0, 3792, 3793, 1, 0, 0, 0, 3793, 3794, 6, 303, 97, 0, 3794, 613, 1, 0, 0, 0, 3795, 3796, 5, 101, 0, 0, 3796, 3797, 5, 109, 0, 0, 3797, 3798, 5, 112, 0, 0, 3798, 3799, 5, 116, 0, 0, 3799, 3800, 5, 121, 0, 0, 3800, 3801, 1, 0, 0, 0, 3801, 3802, 6, 304, 98, 0, 3802, 615, 1, 0, 0, 0, 3803, 3804, 5, 101, 0, 0, 3804, 3805, 5, 109, 0, 0, 3805, 3806, 5, 112, 0, 0, 3806, 3807, 5, 116, 0, 0, 3807, 3808, 5, 121, 0, 0, 3808, 3809, 5, 45, 0, 0, 3809, 3810, 5, 115, 0, 0, 3810, 3811, 5, 101, 0, 0, 3811, 3812, 5, 113, 0, 0, 3812, 3813, 5, 117, 0, 0, 3813, 3814, 5, 101, 0, 0, 3814, 3815, 5, 110, 0, 0, 3815, 3816, 5, 99, 0, 0, 3816, 3817, 5, 101, 0, 0, 3817, 3818, 1, 0, 0, 0, 3818, 3819, 6, 305, 99, 0, 3819, 617, 1, 0, 0, 0, 3820, 3821, 5, 101, 0, 0, 3821, 3822, 5, 110, 0, 0, 3822, 3823, 5, 99, 0, 0, 3823, 3824, 5, 111, 0, 0, 3824, 3825, 5, 100, 0, 0, 3825, 3826, 5, 105, 0, 0, 3826, 3827, 5, 110, 0, 0, 3827, 3828, 5, 103, 0, 0, 3828, 3829, 1, 0, 0, 0, 3829, 3830, 6, 306, 100, 0, 3830, 619, 1, 0, 0, 0, 3831, 3832, 5, 101, 0, 0, 3832, 3833, 5, 110, 0, 0, 3833, 3834, 5, 100, 0, 0, 3834, 3835, 1, 0, 0, 0, 3835, 3836, 6, 307, 101, 0, 3836, 621, 1, 0, 0, 0, 3837, 3838, 5, 101, 0, 0, 3838, 3839, 5, 113, 0, 0, 3839, 3840, 1, 0, 0, 0, 3840, 3841, 6, 308, 102, 0, 3841, 623, 1, 0, 0, 0, 3842, 3843, 5, 101, 0, 0, 3843, 3844, 5, 118, 0, 0, 3844, 3845, 5, 101, 0, 0, 3845, 3846, 5, 114, 0, 0, 3846, 3847, 5, 121, 0, 0, 3847, 3848, 1, 0, 0, 0, 3848, 3849, 6, 309, 103, 0, 3849, 625, 1, 0, 0, 0, 3850, 3851, 5, 101, 0, 0, 3851, 3852, 5, 120, 0, 0, 3852, 3853, 5, 99, 0, 0, 3853, 3854, 5, 101, 0, 0, 3854, 3855, 5, 112, 0, 0, 3855, 3856, 5, 116, 0, 0, 3856, 3857, 1, 0, 0, 0, 3857, 3858, 6, 310, 104, 0, 3858, 627, 1, 0, 0, 0, 3859, 3860, 5, 101, 0, 0, 3860, 3861, 5, 120, 0, 0, 3861, 3862, 5, 116, 0, 0, 3862, 3863, 5, 101, 0, 0, 3863, 3864, 5, 114, 0, 0, 3864, 3865, 5, 110, 0, 0, 3865, 3866, 5, 97, 0, 0, 3866, 3867, 5, 108, 0, 0, 3867, 3868, 1, 0, 0, 0, 3868, 3869, 6, 311, 105, 0, 3869, 629, 1, 0, 0, 0, 3870, 3871, 5, 102, 0, 0, 3871, 3872, 5, 111, 0, 0, 3872, 3873, 5, 108, 0, 0, 3873, 3874, 5, 108, 0, 0, 3874, 3875, 5, 111, 0, 0, 3875, 3876, 5, 119, 0, 0, 3876, 3877, 5, 105, 0, 0, 3877, 3878, 5, 110, 0, 0, 3878, 3879, 5, 103, 0, 0, 3879, 3880, 1, 0, 0, 0, 3880, 3881, 6, 312, 106, 0, 3881, 631, 1, 0, 0, 0, 3882, 3883, 5, 102, 0, 0, 3883, 3884, 5, 111, 0, 0, 3884, 3885, 5, 108, 0, 0, 3885, 3886, 5, 108, 0, 0, 3886, 3887, 5, 111, 0, 0, 3887, 3888, 5, 119, 0, 0, 3888, 3889, 5, 105, 0, 0, 3889, 3890, 5, 110, 0, 0, 3890, 3891, 5, 103, 0, 0, 3891, 3892, 5, 45, 0, 0, 3892, 3893, 5, 115, 0, 0, 3893, 3894, 5, 105, 0, 0, 3894, 3895, 5, 98, 0, 0, 3895, 3896, 5, 108, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 110, 0, 0, 3898, 3899, 5, 103, 0, 0, 3899, 3900, 1, 0, 0, 0, 3900, 3901, 6, 313, 107, 0, 3901, 633, 1, 0, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 111, 0, 0, 3904, 3905, 5, 114, 0, 0, 3905, 3906, 1, 0, 0, 0, 3906, 3907, 6, 314, 108, 0, 3907, 635, 1, 0, 0, 0, 3908, 3909, 5, 102, 0, 0, 3909, 3910, 5, 117, 0, 0, 3910, 3911, 5, 110, 0, 0, 3911, 3912, 5, 99, 0, 0, 3912, 3913, 5, 116, 0, 0, 3913, 3914, 5, 105, 0, 0, 3914, 3915, 5, 111, 0, 0, 3915, 3916, 5, 110, 0, 0, 3916, 3917, 1, 0, 0, 0, 3917, 3918, 6, 315, 109, 0, 3918, 637, 1, 0, 0, 0, 3919, 3920, 5, 103, 0, 0, 3920, 3921, 5, 101, 0, 0, 3921, 3922, 1, 0, 0, 0, 3922, 3923, 6, 316, 110, 0, 3923, 639, 1, 0, 0, 0, 3924, 3925, 5, 103, 0, 0, 3925, 3926, 5, 114, 0, 0, 3926, 3927, 5, 101, 0, 0, 3927, 3928, 5, 97, 0, 0, 3928, 3929, 5, 116, 0, 0, 3929, 3930, 5, 101, 0, 0, 3930, 3931, 5, 115, 0, 0, 3931, 3932, 5, 116, 0, 0, 3932, 3933, 1, 0, 0, 0, 3933, 3934, 6, 317, 111, 0, 3934, 641, 1, 0, 0, 0, 3935, 3936, 5, 103, 0, 0, 3936, 3937, 5, 114, 0, 0, 3937, 3938, 5, 111, 0, 0, 3938, 3939, 5, 117, 0, 0, 3939, 3940, 5, 112, 0, 0, 3940, 3941, 1, 0, 0, 0, 3941, 3942, 6, 318, 112, 0, 3942, 643, 1, 0, 0, 0, 3943, 3944, 5, 103, 0, 0, 3944, 3945, 5, 116, 0, 0, 3945, 3946, 1, 0, 0, 0, 3946, 3947, 6, 319, 113, 0, 3947, 645, 1, 0, 0, 0, 3948, 3949, 5, 105, 0, 0, 3949, 3950, 5, 100, 0, 0, 3950, 3951, 5, 105, 0, 0, 3951, 3952, 5, 118, 0, 0, 3952, 3953, 1, 0, 0, 0, 3953, 3954, 6, 320, 114, 0, 3954, 647, 1, 0, 0, 0, 3955, 3956, 5, 105, 0, 0, 3956, 3957, 5, 102, 0, 0, 3957, 3958, 1, 0, 0, 0, 3958, 3959, 6, 321, 115, 0, 3959, 649, 1, 0, 0, 0, 3960, 3961, 5, 105, 0, 0, 3961, 3962, 5, 109, 0, 0, 3962, 3963, 5, 112, 0, 0, 3963, 3964, 5, 111, 0, 0, 3964, 3965, 5, 114, 0, 0, 3965, 3966, 5, 116, 0, 0, 3966, 3967, 1, 0, 0, 0, 3967, 3968, 6, 322, 116, 0, 3968, 651, 1, 0, 0, 0, 3969, 3970, 5, 105, 0, 0, 3970, 3971, 5, 110, 0, 0, 3971, 3972, 1, 0, 0, 0, 3972, 3973, 6, 323, 117, 0, 3973, 653, 1, 0, 0, 0, 3974, 3975, 5, 105, 0, 0, 3975, 3976, 5, 110, 0, 0, 3976, 3977, 5, 104, 0, 0, 3977, 3978, 5, 101, 0, 0, 3978, 3979, 5, 114, 0, 0, 3979, 3980, 5, 105, 0, 0, 3980, 3981, 5, 116, 0, 0, 3981, 3982, 1, 0, 0, 0, 3982, 3983, 6, 324, 118, 0, 3983, 655, 1, 0, 0, 0, 3984, 3985, 5, 105, 0, 0, 3985, 3986, 5, 110, 0, 0, 3986, 3987, 5, 115, 0, 0, 3987, 3988, 5, 116, 0, 0, 3988, 3989, 5, 97, 0, 0, 3989, 3990, 5, 110, 0, 0, 3990, 3991, 5, 99, 0, 0, 3991, 3992, 5, 101, 0, 0, 3992, 3993, 1, 0, 0, 0, 3993, 3994, 6, 325, 119, 0, 3994, 657, 1, 0, 0, 0, 3995, 3996, 5, 105, 0, 0, 3996, 3997, 5, 110, 0, 0, 3997, 3998, 5, 116, 0, 0, 3998, 3999, 5, 101, 0, 0, 3999, 4000, 5, 114, 0, 0, 4000, 4001, 5, 115, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 99, 0, 0, 4003, 4004, 5, 116, 0, 0, 4004, 4005, 1, 0, 0, 0, 4005, 4006, 6, 326, 120, 0, 4006, 659, 1, 0, 0, 0, 4007, 4008, 5, 105, 0, 0, 4008, 4009, 5, 115, 0, 0, 4009, 4010, 1, 0, 0, 0, 4010, 4011, 6, 327, 121, 0, 4011, 661, 1, 0, 0, 0, 4012, 4013, 5, 105, 0, 0, 4013, 4014, 5, 116, 0, 0, 4014, 4015, 5, 101, 0, 0, 4015, 4016, 5, 109, 0, 0, 4016, 4017, 1, 0, 0, 0, 4017, 4018, 6, 328, 122, 0, 4018, 663, 1, 0, 0, 0, 4019, 4020, 5, 108, 0, 0, 4020, 4021, 5, 97, 0, 0, 4021, 4022, 5, 120, 0, 0, 4022, 4023, 1, 0, 0, 0, 4023, 4024, 6, 329, 123, 0, 4024, 665, 1, 0, 0, 0, 4025, 4026, 5, 108, 0, 0, 4026, 4027, 5, 101, 0, 0, 4027, 4028, 1, 0, 0, 0, 4028, 4029, 6, 330, 124, 0, 4029, 667, 1, 0, 0, 0, 4030, 4031, 5, 108, 0, 0, 4031, 4032, 5, 101, 0, 0, 4032, 4033, 5, 97, 0, 0, 4033, 4034, 5, 115, 0, 0, 4034, 4035, 5, 116, 0, 0, 4035, 4036, 1, 0, 0, 0, 4036, 4037, 6, 331, 125, 0, 4037, 669, 1, 0, 0, 0, 4038, 4039, 5, 108, 0, 0, 4039, 4040, 5, 101, 0, 0, 4040, 4041, 5, 116, 0, 0, 4041, 4042, 1, 0, 0, 0, 4042, 4043, 6, 332, 126, 0, 4043, 671, 1, 0, 0, 0, 4044, 4045, 5, 108, 0, 0, 4045, 4046, 5, 116, 0, 0, 4046, 4047, 1, 0, 0, 0, 4047, 4048, 6, 333, 127, 0, 4048, 673, 1, 0, 0, 0, 4049, 4050, 5, 109, 0, 0, 4050, 4051, 5, 97, 0, 0, 4051, 4052, 5, 112, 0, 0, 4052, 4053, 1, 0, 0, 0, 4053, 4054, 6, 334, 128, 0, 4054, 675, 1, 0, 0, 0, 4055, 4056, 5, 109, 0, 0, 4056, 4057, 5, 111, 0, 0, 4057, 4058, 5, 100, 0, 0, 4058, 4059, 1, 0, 0, 0, 4059, 4060, 6, 335, 129, 0, 4060, 677, 1, 0, 0, 0, 4061, 4062, 5, 109, 0, 0, 4062, 4063, 5, 111, 0, 0, 4063, 4064, 5, 100, 0, 0, 4064, 4065, 5, 117, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 101, 0, 0, 4067, 4068, 1, 0, 0, 0, 4068, 4069, 6, 336, 130, 0, 4069, 679, 1, 0, 0, 0, 4070, 4071, 5, 110, 0, 0, 4071, 4072, 5, 97, 0, 0, 4072, 4073, 5, 109, 0, 0, 4073, 4074, 5, 101, 0, 0, 4074, 4075, 5, 115, 0, 0, 4075, 4076, 5, 112, 0, 0, 4076, 4077, 5, 97, 0, 0, 4077, 4078, 5, 99, 0, 0, 4078, 4079, 5, 101, 0, 0, 4079, 4080, 1, 0, 0, 0, 4080, 4081, 6, 337, 131, 0, 4081, 681, 1, 0, 0, 0, 4082, 4083, 5, 110, 0, 0, 4083, 4084, 5, 101, 0, 0, 4084, 4085, 1, 0, 0, 0, 4085, 4086, 6, 338, 132, 0, 4086, 683, 1, 0, 0, 0, 4087, 4088, 5, 110, 0, 0, 4088, 4089, 5, 101, 0, 0, 4089, 4090, 5, 120, 0, 0, 4090, 4091, 5, 116, 0, 0, 4091, 4092, 1, 0, 0, 0, 4092, 4093, 6, 339, 133, 0, 4093, 685, 1, 0, 0, 0, 4094, 4095, 5, 110, 0, 0, 4095, 4096, 5, 97, 0, 0, 4096, 4097, 5, 109, 0, 0, 4097, 4098, 5, 101, 0, 0, 4098, 4099, 5, 115, 0, 0, 4099, 4100, 5, 112, 0, 0, 4100, 4101, 5, 97, 0, 0, 4101, 4102, 5, 99, 0, 0, 4102, 4103, 5, 101, 0, 0, 4103, 4104, 5, 45, 0, 0, 4104, 4105, 5, 110, 0, 0, 4105, 4106, 5, 111, 0, 0, 4106, 4107, 5, 100, 0, 0, 4107, 4108, 5, 101, 0, 0, 4108, 4109, 1, 0, 0, 0, 4109, 4110, 6, 340, 134, 0, 4110, 687, 1, 0, 0, 0, 4111, 4112, 5, 110, 0, 0, 4112, 4113, 5, 111, 0, 0, 4113, 4114, 5, 45, 0, 0, 4114, 4115, 5, 105, 0, 0, 4115, 4116, 5, 110, 0, 0, 4116, 4117, 5, 104, 0, 0, 4117, 4118, 5, 101, 0, 0, 4118, 4119, 5, 114, 0, 0, 4119, 4120, 5, 105, 0, 0, 4120, 4121, 5, 116, 0, 0, 4121, 4122, 1, 0, 0, 0, 4122, 4123, 6, 341, 135, 0, 4123, 689, 1, 0, 0, 0, 4124, 4125, 5, 110, 0, 0, 4125, 4126, 5, 111, 0, 0, 4126, 4127, 5, 45, 0, 0, 4127, 4128, 5, 112, 0, 0, 4128, 4129, 5, 114, 0, 0, 4129, 4130, 5, 101, 0, 0, 4130, 4131, 5, 115, 0, 0, 4131, 4132, 5, 101, 0, 0, 4132, 4133, 5, 114, 0, 0, 4133, 4134, 5, 118, 0, 0, 4134, 4135, 5, 101, 0, 0, 4135, 4136, 1, 0, 0, 0, 4136, 4137, 6, 342, 136, 0, 4137, 691, 1, 0, 0, 0, 4138, 4139, 5, 110, 0, 0, 4139, 4140, 5, 111, 0, 0, 4140, 4141, 5, 100, 0, 0, 4141, 4142, 5, 101, 0, 0, 4142, 4143, 1, 0, 0, 0, 4143, 4144, 6, 343, 137, 0, 4144, 693, 1, 0, 0, 0, 4145, 4146, 5, 111, 0, 0, 4146, 4147, 5, 102, 0, 0, 4147, 4148, 1, 0, 0, 0, 4148, 4149, 6, 344, 138, 0, 4149, 695, 1, 0, 0, 0, 4150, 4151, 5, 111, 0, 0, 4151, 4152, 5, 110, 0, 0, 4152, 4153, 5, 108, 0, 0, 4153, 4154, 5, 121, 0, 0, 4154, 4155, 1, 0, 0, 0, 4155, 4156, 6, 345, 139, 0, 4156, 697, 1, 0, 0, 0, 4157, 4158, 5, 111, 0, 0, 4158, 4159, 5, 112, 0, 0, 4159, 4160, 5, 116, 0, 0, 4160, 4161, 5, 105, 0, 0, 4161, 4162, 5, 111, 0, 0, 4162, 4163, 5, 110, 0, 0, 4163, 4164, 1, 0, 0, 0, 4164, 4165, 6, 346, 140, 0, 4165, 699, 1, 0, 0, 0, 4166, 4167, 5, 111, 0, 0, 4167, 4168, 5, 114, 0, 0, 4168, 4169, 1, 0, 0, 0, 4169, 4170, 6, 347, 141, 0, 4170, 701, 1, 0, 0, 0, 4171, 4172, 5, 111, 0, 0, 4172, 4173, 5, 114, 0, 0, 4173, 4174, 5, 100, 0, 0, 4174, 4175, 5, 101, 0, 0, 4175, 4176, 5, 114, 0, 0, 4176, 4177, 1, 0, 0, 0, 4177, 4178, 6, 348, 142, 0, 4178, 703, 1, 0, 0, 0, 4179, 4180, 5, 111, 0, 0, 4180, 4181, 5, 114, 0, 0, 4181, 4182, 5, 100, 0, 0, 4182, 4183, 5, 101, 0, 0, 4183, 4184, 5, 114, 0, 0, 4184, 4185, 5, 101, 0, 0, 4185, 4186, 5, 100, 0, 0, 4186, 4187, 1, 0, 0, 0, 4187, 4188, 6, 349, 143, 0, 4188, 705, 1, 0, 0, 0, 4189, 4190, 5, 111, 0, 0, 4190, 4191, 5, 114, 0, 0, 4191, 4192, 5, 100, 0, 0, 4192, 4193, 5, 101, 0, 0, 4193, 4194, 5, 114, 0, 0, 4194, 4195, 5, 105, 0, 0, 4195, 4196, 5, 110, 0, 0, 4196, 4197, 5, 103, 0, 0, 4197, 4198, 1, 0, 0, 0, 4198, 4199, 6, 350, 144, 0, 4199, 707, 1, 0, 0, 0, 4200, 4201, 5, 112, 0, 0, 4201, 4202, 5, 97, 0, 0, 4202, 4203, 5, 114, 0, 0, 4203, 4204, 5, 101, 0, 0, 4204, 4205, 5, 110, 0, 0, 4205, 4206, 5, 116, 0, 0, 4206, 4207, 1, 0, 0, 0, 4207, 4208, 6, 351, 145, 0, 4208, 709, 1, 0, 0, 0, 4209, 4210, 5, 112, 0, 0, 4210, 4211, 5, 114, 0, 0, 4211, 4212, 5, 101, 0, 0, 4212, 4213, 5, 99, 0, 0, 4213, 4214, 5, 101, 0, 0, 4214, 4215, 5, 100, 0, 0, 4215, 4216, 5, 105, 0, 0, 4216, 4217, 5, 110, 0, 0, 4217, 4218, 5, 103, 0, 0, 4218, 4219, 1, 0, 0, 0, 4219, 4220, 6, 352, 146, 0, 4220, 711, 1, 0, 0, 0, 4221, 4222, 5, 112, 0, 0, 4222, 4223, 5, 114, 0, 0, 4223, 4224, 5, 101, 0, 0, 4224, 4225, 5, 99, 0, 0, 4225, 4226, 5, 101, 0, 0, 4226, 4227, 5, 100, 0, 0, 4227, 4228, 5, 105, 0, 0, 4228, 4229, 5, 110, 0, 0, 4229, 4230, 5, 103, 0, 0, 4230, 4231, 5, 45, 0, 0, 4231, 4232, 5, 115, 0, 0, 4232, 4233, 5, 105, 0, 0, 4233, 4234, 5, 98, 0, 0, 4234, 4235, 5, 108, 0, 0, 4235, 4236, 5, 105, 0, 0, 4236, 4237, 5, 110, 0, 0, 4237, 4238, 5, 103, 0, 0, 4238, 4239, 1, 0, 0, 0, 4239, 4240, 6, 353, 147, 0, 4240, 713, 1, 0, 0, 0, 4241, 4242, 5, 112, 0, 0, 4242, 4243, 5, 114, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 115, 0, 0, 4245, 4246, 5, 101, 0, 0, 4246, 4247, 5, 114, 0, 0, 4247, 4248, 5, 118, 0, 0, 4248, 4249, 5, 101, 0, 0, 4249, 4250, 1, 0, 0, 0, 4250, 4251, 6, 354, 148, 0, 4251, 715, 1, 0, 0, 0, 4252, 4253, 5, 112, 0, 0, 4253, 4254, 5, 114, 0, 0, 4254, 4255, 5, 101, 0, 0, 4255, 4256, 5, 118, 0, 0, 4256, 4257, 5, 105, 0, 0, 4257, 4258, 5, 111, 0, 0, 4258, 4259, 5, 117, 0, 0, 4259, 4260, 5, 115, 0, 0, 4260, 4261, 1, 0, 0, 0, 4261, 4262, 6, 355, 149, 0, 4262, 717, 1, 0, 0, 0, 4263, 4264, 5, 112, 0, 0, 4264, 4265, 5, 114, 0, 0, 4265, 4266, 5, 111, 0, 0, 4266, 4267, 5, 99, 0, 0, 4267, 4268, 5, 101, 0, 0, 4268, 4269, 5, 115, 0, 0, 4269, 4270, 5, 115, 0, 0, 4270, 4271, 5, 105, 0, 0, 4271, 4272, 5, 110, 0, 0, 4272, 4273, 5, 103, 0, 0, 4273, 4274, 5, 45, 0, 0, 4274, 4275, 5, 105, 0, 0, 4275, 4276, 5, 110, 0, 0, 4276, 4277, 5, 115, 0, 0, 4277, 4278, 5, 116, 0, 0, 4278, 4279, 5, 114, 0, 0, 4279, 4280, 5, 117, 0, 0, 4280, 4281, 5, 99, 0, 0, 4281, 4282, 5, 116, 0, 0, 4282, 4283, 5, 105, 0, 0, 4283, 4284, 5, 111, 0, 0, 4284, 4285, 5, 110, 0, 0, 4285, 4286, 1, 0, 0, 0, 4286, 4287, 6, 356, 150, 0, 4287, 719, 1, 0, 0, 0, 4288, 4289, 5, 114, 0, 0, 4289, 4290, 5, 101, 0, 0, 4290, 4291, 5, 116, 0, 0, 4291, 4292, 5, 117, 0, 0, 4292, 4293, 5, 114, 0, 0, 4293, 4294, 5, 110, 0, 0, 4294, 4295, 1, 0, 0, 0, 4295, 4296, 6, 357, 151, 0, 4296, 721, 1, 0, 0, 0, 4297, 4298, 5, 115, 0, 0, 4298, 4299, 5, 97, 0, 0, 4299, 4300, 5, 116, 0, 0, 4300, 4301, 5, 105, 0, 0, 4301, 4302, 5, 115, 0, 0, 4302, 4303, 5, 102, 0, 0, 4303, 4304, 5, 105, 0, 0, 4304, 4305, 5, 101, 0, 0, 4305, 4306, 5, 115, 0, 0, 4306, 4307, 1, 0, 0, 0, 4307, 4308, 6, 358, 152, 0, 4308, 723, 1, 0, 0, 0, 4309, 4310, 5, 115, 0, 0, 4310, 4311, 5, 99, 0, 0, 4311, 4312, 5, 104, 0, 0, 4312, 4313, 5, 101, 0, 0, 4313, 4314, 5, 109, 0, 0, 4314, 4315, 5, 97, 0, 0, 4315, 4316, 1, 0, 0, 0, 4316, 4317, 6, 359, 153, 0, 4317, 725, 1, 0, 0, 0, 4318, 4319, 5, 115, 0, 0, 4319, 4320, 5, 99, 0, 0, 4320, 4321, 5, 104, 0, 0, 4321, 4322, 5, 101, 0, 0, 4322, 4323, 5, 109, 0, 0, 4323, 4324, 5, 97, 0, 0, 4324, 4325, 5, 45, 0, 0, 4325, 4326, 5, 97, 0, 0, 4326, 4327, 5, 116, 0, 0, 4327, 4328, 5, 116, 0, 0, 4328, 4329, 5, 114, 0, 0, 4329, 4330, 5, 105, 0, 0, 4330, 4331, 5, 98, 0, 0, 4331, 4332, 5, 117, 0, 0, 4332, 4333, 5, 116, 0, 0, 4333, 4334, 5, 101, 0, 0, 4334, 4335, 1, 0, 0, 0, 4335, 4336, 6, 360, 154, 0, 4336, 727, 1, 0, 0, 0, 4337, 4338, 5, 115, 0, 0, 4338, 4339, 5, 99, 0, 0, 4339, 4340, 5, 104, 0, 0, 4340, 4341, 5, 101, 0, 0, 4341, 4342, 5, 109, 0, 0, 4342, 4343, 5, 97, 0, 0, 4343, 4344, 5, 45, 0, 0, 4344, 4345, 5, 101, 0, 0, 4345, 4346, 5, 108, 0, 0, 4346, 4347, 5, 101, 0, 0, 4347, 4348, 5, 109, 0, 0, 4348, 4349, 5, 101, 0, 0, 4349, 4350, 5, 110, 0, 0, 4350, 4351, 5, 116, 0, 0, 4351, 4352, 1, 0, 0, 0, 4352, 4353, 6, 361, 155, 0, 4353, 729, 1, 0, 0, 0, 4354, 4355, 5, 115, 0, 0, 4355, 4356, 5, 101, 0, 0, 4356, 4357, 5, 108, 0, 0, 4357, 4358, 5, 102, 0, 0, 4358, 4359, 1, 0, 0, 0, 4359, 4360, 6, 362, 156, 0, 4360, 731, 1, 0, 0, 0, 4361, 4362, 5, 115, 0, 0, 4362, 4363, 5, 108, 0, 0, 4363, 4364, 5, 105, 0, 0, 4364, 4365, 5, 100, 0, 0, 4365, 4366, 5, 105, 0, 0, 4366, 4367, 5, 110, 0, 0, 4367, 4368, 5, 103, 0, 0, 4368, 4369, 1, 0, 0, 0, 4369, 4370, 6, 363, 157, 0, 4370, 733, 1, 0, 0, 0, 4371, 4372, 5, 115, 0, 0, 4372, 4373, 5, 111, 0, 0, 4373, 4374, 5, 109, 0, 0, 4374, 4375, 5, 101, 0, 0, 4375, 4376, 1, 0, 0, 0, 4376, 4377, 6, 364, 158, 0, 4377, 735, 1, 0, 0, 0, 4378, 4379, 5, 115, 0, 0, 4379, 4380, 5, 116, 0, 0, 4380, 4381, 5, 97, 0, 0, 4381, 4382, 5, 98, 0, 0, 4382, 4383, 5, 108, 0, 0, 4383, 4384, 5, 101, 0, 0, 4384, 4385, 1, 0, 0, 0, 4385, 4386, 6, 365, 159, 0, 4386, 737, 1, 0, 0, 0, 4387, 4388, 5, 115, 0, 0, 4388, 4389, 5, 116, 0, 0, 4389, 4390, 5, 97, 0, 0, 4390, 4391, 5, 114, 0, 0, 4391, 4392, 5, 116, 0, 0, 4392, 4393, 1, 0, 0, 0, 4393, 4394, 6, 366, 160, 0, 4394, 739, 1, 0, 0, 0, 4395, 4396, 5, 115, 0, 0, 4396, 4397, 5, 116, 0, 0, 4397, 4398, 5, 114, 0, 0, 4398, 4399, 5, 105, 0, 0, 4399, 4400, 5, 99, 0, 0, 4400, 4401, 5, 116, 0, 0, 4401, 4402, 1, 0, 0, 0, 4402, 4403, 6, 367, 161, 0, 4403, 741, 1, 0, 0, 0, 4404, 4405, 5, 115, 0, 0, 4405, 4406, 5, 116, 0, 0, 4406, 4407, 5, 114, 0, 0, 4407, 4408, 5, 105, 0, 0, 4408, 4409, 5, 112, 0, 0, 4409, 4410, 1, 0, 0, 0, 4410, 4411, 6, 368, 162, 0, 4411, 743, 1, 0, 0, 0, 4412, 4413, 5, 115, 0, 0, 4413, 4414, 5, 119, 0, 0, 4414, 4415, 5, 105, 0, 0, 4415, 4416, 5, 116, 0, 0, 4416, 4417, 5, 99, 0, 0, 4417, 4418, 5, 104, 0, 0, 4418, 4419, 1, 0, 0, 0, 4419, 4420, 6, 369, 163, 0, 4420, 745, 1, 0, 0, 0, 4421, 4422, 5, 116, 0, 0, 4422, 4423, 5, 101, 0, 0, 4423, 4424, 5, 120, 0, 0, 4424, 4425, 5, 116, 0, 0, 4425, 4426, 1, 0, 0, 0, 4426, 4427, 6, 370, 164, 0, 4427, 747, 1, 0, 0, 0, 4428, 4429, 5, 116, 0, 0, 4429, 4430, 5, 104, 0, 0, 4430, 4431, 5, 101, 0, 0, 4431, 4432, 5, 110, 0, 0, 4432, 4433, 1, 0, 0, 0, 4433, 4434, 6, 371, 165, 0, 4434, 749, 1, 0, 0, 0, 4435, 4436, 5, 116, 0, 0, 4436, 4437, 5, 111, 0, 0, 4437, 4438, 1, 0, 0, 0, 4438, 4439, 6, 372, 166, 0, 4439, 751, 1, 0, 0, 0, 4440, 4441, 5, 116, 0, 0, 4441, 4442, 5, 114, 0, 0, 4442, 4443, 5, 101, 0, 0, 4443, 4444, 5, 97, 0, 0, 4444, 4445, 5, 116, 0, 0, 4445, 4446, 1, 0, 0, 0, 4446, 4447, 6, 373, 167, 0, 4447, 753, 1, 0, 0, 0, 4448, 4449, 5, 116, 0, 0, 4449, 4450, 5, 114, 0, 0, 4450, 4451, 5, 121, 0, 0, 4451, 4452, 1, 0, 0, 0, 4452, 4453, 6, 374, 168, 0, 4453, 755, 1, 0, 0, 0, 4454, 4455, 5, 116, 0, 0, 4455, 4456, 5, 117, 0, 0, 4456, 4457, 5, 109, 0, 0, 4457, 4458, 5, 98, 0, 0, 4458, 4459, 5, 108, 0, 0, 4459, 4460, 5, 105, 0, 0, 4460, 4461, 5, 110, 0, 0, 4461, 4462, 5, 103, 0, 0, 4462, 4463, 1, 0, 0, 0, 4463, 4464, 6, 375, 169, 0, 4464, 757, 1, 0, 0, 0, 4465, 4466, 5, 116, 0, 0, 4466, 4467, 5, 121, 0, 0, 4467, 4468, 5, 112, 0, 0, 4468, 4469, 5, 101, 0, 0, 4469, 4470, 1, 0, 0, 0, 4470, 4471, 6, 376, 170, 0, 4471, 759, 1, 0, 0, 0, 4472, 4473, 5, 116, 0, 0, 4473, 4474, 5, 121, 0, 0, 4474, 4475, 5, 112, 0, 0, 4475, 4476, 5, 101, 0, 0, 4476, 4477, 5, 115, 0, 0, 4477, 4478, 5, 119, 0, 0, 4478, 4479, 5, 105, 0, 0, 4479, 4480, 5, 116, 0, 0, 4480, 4481, 5, 99, 0, 0, 4481, 4482, 5, 104, 0, 0, 4482, 4483, 1, 0, 0, 0, 4483, 4484, 6, 377, 171, 0, 4484, 761, 1, 0, 0, 0, 4485, 4486, 5, 117, 0, 0, 4486, 4487, 5, 110, 0, 0, 4487, 4488, 5, 105, 0, 0, 4488, 4489, 5, 111, 0, 0, 4489, 4490, 5, 110, 0, 0, 4490, 4491, 1, 0, 0, 0, 4491, 4492, 6, 378, 172, 0, 4492, 763, 1, 0, 0, 0, 4493, 4494, 5, 117, 0, 0, 4494, 4495, 5, 110, 0, 0, 4495, 4496, 5, 111, 0, 0, 4496, 4497, 5, 114, 0, 0, 4497, 4498, 5, 100, 0, 0, 4498, 4499, 5, 101, 0, 0, 4499, 4500, 5, 114, 0, 0, 4500, 4501, 5, 101, 0, 0, 4501, 4502, 5, 100, 0, 0, 4502, 4503, 1, 0, 0, 0, 4503, 4504, 6, 379, 173, 0, 4504, 765, 1, 0, 0, 0, 4505, 4506, 5, 117, 0, 0, 4506, 4507, 5, 112, 0, 0, 4507, 4508, 5, 100, 0, 0, 4508, 4509, 5, 97, 0, 0, 4509, 4510, 5, 116, 0, 0, 4510, 4511, 5, 101, 0, 0, 4511, 4512, 1, 0, 0, 0, 4512, 4513, 6, 380, 174, 0, 4513, 767, 1, 0, 0, 0, 4514, 4515, 5, 118, 0, 0, 4515, 4516, 5, 97, 0, 0, 4516, 4517, 5, 108, 0, 0, 4517, 4518, 5, 105, 0, 0, 4518, 4519, 5, 100, 0, 0, 4519, 4520, 5, 97, 0, 0, 4520, 4521, 5, 116, 0, 0, 4521, 4522, 5, 101, 0, 0, 4522, 4523, 1, 0, 0, 0, 4523, 4524, 6, 381, 175, 0, 4524, 769, 1, 0, 0, 0, 4525, 4526, 5, 118, 0, 0, 4526, 4527, 5, 97, 0, 0, 4527, 4528, 5, 114, 0, 0, 4528, 4529, 5, 105, 0, 0, 4529, 4530, 5, 97, 0, 0, 4530, 4531, 5, 98, 0, 0, 4531, 4532, 5, 108, 0, 0, 4532, 4533, 5, 101, 0, 0, 4533, 4534, 1, 0, 0, 0, 4534, 4535, 6, 382, 176, 0, 4535, 771, 1, 0, 0, 0, 4536, 4537, 5, 118, 0, 0, 4537, 4538, 5, 101, 0, 0, 4538, 4539, 5, 114, 0, 0, 4539, 4540, 5, 115, 0, 0, 4540, 4541, 5, 105, 0, 0, 4541, 4542, 5, 111, 0, 0, 4542, 4543, 5, 110, 0, 0, 4543, 4544, 1, 0, 0, 0, 4544, 4545, 6, 383, 177, 0, 4545, 773, 1, 0, 0, 0, 4546, 4547, 5, 119, 0, 0, 4547, 4548, 5, 104, 0, 0, 4548, 4549, 5, 101, 0, 0, 4549, 4550, 5, 110, 0, 0, 4550, 4551, 1, 0, 0, 0, 4551, 4552, 6, 384, 178, 0, 4552, 775, 1, 0, 0, 0, 4553, 4554, 5, 119, 0, 0, 4554, 4555, 5, 104, 0, 0, 4555, 4556, 5, 101, 0, 0, 4556, 4557, 5, 114, 0, 0, 4557, 4558, 5, 101, 0, 0, 4558, 4559, 1, 0, 0, 0, 4559, 4560, 6, 385, 179, 0, 4560, 777, 1, 0, 0, 0, 4561, 4562, 5, 119, 0, 0, 4562, 4563, 5, 105, 0, 0, 4563, 4564, 5, 110, 0, 0, 4564, 4565, 5, 100, 0, 0, 4565, 4566, 5, 111, 0, 0, 4566, 4567, 5, 119, 0, 0, 4567, 4568, 1, 0, 0, 0, 4568, 4569, 6, 386, 180, 0, 4569, 779, 1, 0, 0, 0, 4570, 4571, 5, 120, 0, 0, 4571, 4572, 5, 113, 0, 0, 4572, 4573, 5, 117, 0, 0, 4573, 4574, 5, 101, 0, 0, 4574, 4575, 5, 114, 0, 0, 4575, 4576, 5, 121, 0, 0, 4576, 4577, 1, 0, 0, 0, 4577, 4578, 6, 387, 181, 0, 4578, 781, 1, 0, 0, 0, 4579, 4580, 5, 97, 0, 0, 4580, 4581, 5, 114, 0, 0, 4581, 4582, 5, 114, 0, 0, 4582, 4583, 5, 97, 0, 0, 4583, 4584, 5, 121, 0, 0, 4584, 4585, 5, 45, 0, 0, 4585, 4586, 5, 110, 0, 0, 4586, 4587, 5, 111, 0, 0, 4587, 4588, 5, 100, 0, 0, 4588, 4589, 5, 101, 0, 0, 4589, 4590, 1, 0, 0, 0, 4590, 4591, 6, 388, 182, 0, 4591, 783, 1, 0, 0, 0, 4592, 4593, 5, 98, 0, 0, 4593, 4594, 5, 111, 0, 0, 4594, 4595, 5, 111, 0, 0, 4595, 4596, 5, 108, 0, 0, 4596, 4597, 5, 101, 0, 0, 4597, 4598, 5, 97, 0, 0, 4598, 4599, 5, 110, 0, 0, 4599, 4600, 5, 45, 0, 0, 4600, 4601, 5, 110, 0, 0, 4601, 4602, 5, 111, 0, 0, 4602, 4603, 5, 100, 0, 0, 4603, 4604, 5, 101, 0, 0, 4604, 4605, 1, 0, 0, 0, 4605, 4606, 6, 389, 183, 0, 4606, 785, 1, 0, 0, 0, 4607, 4608, 5, 110, 0, 0, 4608, 4609, 5, 117, 0, 0, 4609, 4610, 5, 108, 0, 0, 4610, 4611, 5, 108, 0, 0, 4611, 4612, 5, 45, 0, 0, 4612, 4613, 5, 110, 0, 0, 4613, 4614, 5, 111, 0, 0, 4614, 4615, 5, 100, 0, 0, 4615, 4616, 5, 101, 0, 0, 4616, 4617, 1, 0, 0, 0, 4617, 4618, 6, 390, 184, 0, 4618, 787, 1, 0, 0, 0, 4619, 4620, 5, 110, 0, 0, 4620, 4621, 5, 117, 0, 0, 4621, 4622, 5, 109, 0, 0, 4622, 4623, 5, 98, 0, 0, 4623, 4624, 5, 101, 0, 0, 4624, 4625, 5, 114, 0, 0, 4625, 4626, 5, 45, 0, 0, 4626, 4627, 5, 110, 0, 0, 4627, 4628, 5, 111, 0, 0, 4628, 4629, 5, 100, 0, 0, 4629, 4630, 5, 101, 0, 0, 4630, 4631, 1, 0, 0, 0, 4631, 4632, 6, 391, 185, 0, 4632, 789, 1, 0, 0, 0, 4633, 4634, 5, 111, 0, 0, 4634, 4635, 5, 98, 0, 0, 4635, 4636, 5, 106, 0, 0, 4636, 4637, 5, 101, 0, 0, 4637, 4638, 5, 99, 0, 0, 4638, 4639, 5, 116, 0, 0, 4639, 4640, 5, 45, 0, 0, 4640, 4641, 5, 110, 0, 0, 4641, 4642, 5, 111, 0, 0, 4642, 4643, 5, 100, 0, 0, 4643, 4644, 5, 101, 0, 0, 4644, 4645, 1, 0, 0, 0, 4645, 4646, 6, 392, 186, 0, 4646, 791, 1, 0, 0, 0, 4647, 4648, 5, 114, 0, 0, 4648, 4649, 5, 101, 0, 0, 4649, 4650, 5, 112, 0, 0, 4650, 4651, 5, 108, 0, 0, 4651, 4652, 5, 97, 0, 0, 4652, 4653, 5, 99, 0, 0, 4653, 4654, 5, 101, 0, 0, 4654, 4655, 1, 0, 0, 0, 4655, 4656, 6, 393, 187, 0, 4656, 793, 1, 0, 0, 0, 4657, 4658, 5, 119, 0, 0, 4658, 4659, 5, 105, 0, 0, 4659, 4660, 5, 116, 0, 0, 4660, 4661, 5, 104, 0, 0, 4661, 4662, 1, 0, 0, 0, 4662, 4663, 6, 394, 188, 0, 4663, 795, 1, 0, 0, 0, 4664, 4665, 5, 118, 0, 0, 4665, 4666, 5, 97, 0, 0, 4666, 4667, 5, 108, 0, 0, 4667, 4668, 5, 117, 0, 0, 4668, 4669, 5, 101, 0, 0, 4669, 4670, 1, 0, 0, 0, 4670, 4671, 6, 395, 189, 0, 4671, 797, 1, 0, 0, 0, 4672, 4673, 5, 105, 0, 0, 4673, 4674, 5, 110, 0, 0, 4674, 4675, 5, 115, 0, 0, 4675, 4676, 5, 101, 0, 0, 4676, 4677, 5, 114, 0, 0, 4677, 4678, 5, 116, 0, 0, 4678, 4679, 1, 0, 0, 0, 4679, 4680, 6, 396, 190, 0, 4680, 799, 1, 0, 0, 0, 4681, 4682, 5, 105, 0, 0, 4682, 4683, 5, 110, 0, 0, 4683, 4684, 5, 116, 0, 0, 4684, 4685, 5, 111, 0, 0, 4685, 4686, 1, 0, 0, 0, 4686, 4687, 6, 397, 191, 0, 4687, 801, 1, 0, 0, 0, 4688, 4689, 5, 100, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 108, 0, 0, 4691, 4692, 5, 101, 0, 0, 4692, 4693, 5, 116, 0, 0, 4693, 4694, 5, 101, 0, 0, 4694, 4695, 1, 0, 0, 0, 4695, 4696, 6, 398, 192, 0, 4696, 803, 1, 0, 0, 0, 4697, 4698, 5, 114, 0, 0, 4698, 4699, 5, 101, 0, 0, 4699, 4700, 5, 110, 0, 0, 4700, 4701, 5, 97, 0, 0, 4701, 4702, 5, 109, 0, 0, 4702, 4703, 5, 101, 0, 0, 4703, 4704, 1, 0, 0, 0, 4704, 4705, 6, 399, 193, 0, 4705, 805, 1, 0, 0, 0, 4706, 4707, 5, 81, 0, 0, 4707, 4713, 5, 123, 0, 0, 4708, 4712, 3, 16, 5, 0, 4709, 4712, 3, 18, 6, 0, 4710, 4712, 8, 9, 0, 0, 4711, 4708, 1, 0, 0, 0, 4711, 4709, 1, 0, 0, 0, 4711, 4710, 1, 0, 0, 0, 4712, 4715, 1, 0, 0, 0, 4713, 4711, 1, 0, 0, 0, 4713, 4714, 1, 0, 0, 0, 4714, 4716, 1, 0, 0, 0, 4715, 4713, 1, 0, 0, 0, 4716, 4717, 5, 125, 0, 0, 4717, 4718, 3, 374, 184, 0, 4718, 4719, 1, 0, 0, 0, 4719, 4720, 6, 400, 194, 0, 4720, 807, 1, 0, 0, 0, 4721, 4722, 3, 374, 184, 0, 4722, 4723, 5, 58, 0, 0, 4723, 4724, 3, 374, 184, 0, 4724, 4725, 1, 0, 0, 0, 4725, 4726, 6, 401, 195, 0, 4726, 809, 1, 0, 0, 0, 4727, 4728, 3, 374, 184, 0, 4728, 4729, 5, 58, 0, 0, 4729, 4730, 5, 42, 0, 0, 4730, 4731, 1, 0, 0, 0, 4731, 4732, 6, 402, 196, 0, 4732, 811, 1, 0, 0, 0, 4733, 4734, 5, 42, 0, 0, 4734, 4735, 5, 58, 0, 0, 4735, 4736, 3, 374, 184, 0, 4736, 4737, 1, 0, 0, 0, 4737, 4738, 6, 403, 197, 0, 4738, 813, 1, 0, 0, 0, 4739, 4743, 3, 376, 185, 0, 4740, 4742, 3, 378, 186, 0, 4741, 4740, 1, 0, 0, 0, 4742, 4745, 1, 0, 0, 0, 4743, 4741, 1, 0, 0, 0, 4743, 4744, 1, 0, 0, 0, 4744, 4746, 1, 0, 0, 0, 4745, 4743, 1, 0, 0, 0, 4746, 4747, 6, 404, 198, 0, 4747, 815, 1, 0, 0, 0, 4748, 4749, 5, 40, 0, 0, 4749, 4750, 5, 58, 0, 0, 4750, 4751, 5, 126, 0, 0, 4751, 4752, 1, 0, 0, 0, 4752, 4753, 6, 405, 199, 0, 4753, 817, 1, 0, 0, 0, 4754, 4756, 5, 58, 0, 0, 4755, 4754, 1, 0, 0, 0, 4756, 4757, 1, 0, 0, 0, 4757, 4755, 1, 0, 0, 0, 4757, 4758, 1, 0, 0, 0, 4758, 4759, 1, 0, 0, 0, 4759, 4760, 5, 41, 0, 0, 4760, 4761, 1, 0, 0, 0, 4761, 4762, 6, 406, 200, 0, 4762, 819, 1, 0, 0, 0, 4763, 4764, 5, 40, 0, 0, 4764, 4765, 5, 58, 0, 0, 4765, 4771, 5, 126, 0, 0, 4766, 4770, 3, 388, 191, 0, 4767, 4768, 5, 58, 0, 0, 4768, 4770, 8, 12, 0, 0, 4769, 4766, 1, 0, 0, 0, 4769, 4767, 1, 0, 0, 0, 4770, 4773, 1, 0, 0, 0, 4771, 4769, 1, 0, 0, 0, 4771, 4772, 1, 0, 0, 0, 4772, 4774, 1, 0, 0, 0, 4773, 4771, 1, 0, 0, 0, 4774, 4775, 5, 58, 0, 0, 4775, 4776, 5, 41, 0, 0, 4776, 4777, 1, 0, 0, 0, 4777, 4778, 6, 407, 201, 0, 4778, 821, 1, 0, 0, 0, 4779, 4780, 5, 40, 0, 0, 4780, 4781, 5, 58, 0, 0, 4781, 4790, 8, 13, 0, 0, 4782, 4789, 3, 386, 190, 0, 4783, 4784, 5, 40, 0, 0, 4784, 4789, 8, 14, 0, 0, 4785, 4786, 5, 58, 0, 0, 4786, 4789, 8, 12, 0, 0, 4787, 4789, 8, 15, 0, 0, 4788, 4782, 1, 0, 0, 0, 4788, 4783, 1, 0, 0, 0, 4788, 4785, 1, 0, 0, 0, 4788, 4787, 1, 0, 0, 0, 4789, 4792, 1, 0, 0, 0, 4790, 4788, 1, 0, 0, 0, 4790, 4791, 1, 0, 0, 0, 4791, 4796, 1, 0, 0, 0, 4792, 4790, 1, 0, 0, 0, 4793, 4795, 5, 58, 0, 0, 4794, 4793, 1, 0, 0, 0, 4795, 4798, 1, 0, 0, 0, 4796, 4794, 1, 0, 0, 0, 4796, 4797, 1, 0, 0, 0, 4797, 4800, 1, 0, 0, 0, 4798, 4796, 1, 0, 0, 0, 4799, 4801, 5, 58, 0, 0, 4800, 4799, 1, 0, 0, 0, 4801, 4802, 1, 0, 0, 0, 4802, 4800, 1, 0, 0, 0, 4802, 4803, 1, 0, 0, 0, 4803, 4804, 1, 0, 0, 0, 4804, 4805, 5, 41, 0, 0, 4805, 4806, 1, 0, 0, 0, 4806, 4807, 6, 408, 2, 0, 4807, 4808, 6, 408, 202, 0, 4808, 823, 1, 0, 0, 0, 4809, 4810, 7, 16, 0, 0, 4810, 4811, 1, 0, 0, 0, 4811, 4812, 6, 409, 203, 0, 4812, 825, 1, 0, 0, 0, 4813, 4814, 3, 98, 46, 0, 4814, 4815, 3, 98, 46, 0, 4815, 4816, 3, 44, 19, 0, 4816, 4817, 1, 0, 0, 0, 4817, 4818, 6, 410, 3, 0, 4818, 4819, 6, 410, 204, 0, 4819, 827, 1, 0, 0, 0, 4820, 4821, 3, 50, 22, 0, 4821, 4822, 3, 98, 46, 0, 4822, 4823, 1, 0, 0, 0, 4823, 4824, 6, 411, 4, 0, 4824, 4825, 6, 411, 205, 0, 4825, 829, 1, 0, 0, 0, 4826, 4827, 8, 17, 0, 0, 4827, 4828, 1, 0, 0, 0, 4828, 4829, 6, 412, 17, 0, 4829, 831, 1, 0, 0, 0, 4830, 4831, 3, 14, 4, 0, 4831, 4832, 1, 0, 0, 0, 4832, 4833, 6, 413, 21, 0, 4833, 833, 1, 0, 0, 0, 4834, 4835, 5, 46, 0, 0, 4835, 4845, 3, 14, 4, 0, 4836, 4837, 3, 14, 4, 0, 4837, 4841, 5, 46, 0, 0, 4838, 4840, 7, 0, 0, 0, 4839, 4838, 1, 0, 0, 0, 4840, 4843, 1, 0, 0, 0, 4841, 4839, 1, 0, 0, 0, 4841, 4842, 1, 0, 0, 0, 4842, 4845, 1, 0, 0, 0, 4843, 4841, 1, 0, 0, 0, 4844, 4834, 1, 0, 0, 0, 4844, 4836, 1, 0, 0, 0, 4845, 4846, 1, 0, 0, 0, 4846, 4847, 6, 414, 22, 0, 4847, 835, 1, 0, 0, 0, 4848, 4849, 5, 46, 0, 0, 4849, 4861, 3, 14, 4, 0, 4850, 4858, 3, 14, 4, 0, 4851, 4855, 5, 46, 0, 0, 4852, 4854, 7, 0, 0, 0, 4853, 4852, 1, 0, 0, 0, 4854, 4857, 1, 0, 0, 0, 4855, 4853, 1, 0, 0, 0, 4855, 4856, 1, 0, 0, 0, 4856, 4859, 1, 0, 0, 0, 4857, 4855, 1, 0, 0, 0, 4858, 4851, 1, 0, 0, 0, 4858, 4859, 1, 0, 0, 0, 4859, 4861, 1, 0, 0, 0, 4860, 4848, 1, 0, 0, 0, 4860, 4850, 1, 0, 0, 0, 4861, 4862, 1, 0, 0, 0, 4862, 4864, 7, 1, 0, 0, 4863, 4865, 7, 2, 0, 0, 4864, 4863, 1, 0, 0, 0, 4864, 4865, 1, 0, 0, 0, 4865, 4866, 1, 0, 0, 0, 4866, 4867, 3, 14, 4, 0, 4867, 4868, 1, 0, 0, 0, 4868, 4869, 6, 415, 23, 0, 4869, 837, 1, 0, 0, 0, 4870, 4871, 5, 100, 0, 0, 4871, 4872, 5, 101, 0, 0, 4872, 4873, 5, 99, 0, 0, 4873, 4874, 5, 105, 0, 0, 4874, 4875, 5, 109, 0, 0, 4875, 4876, 5, 97, 0, 0, 4876, 4877, 5, 108, 0, 0, 4877, 4878, 5, 45, 0, 0, 4878, 4879, 5, 115, 0, 0, 4879, 4880, 5, 101, 0, 0, 4880, 4881, 5, 112, 0, 0, 4881, 4882, 5, 97, 0, 0, 4882, 4883, 5, 114, 0, 0, 4883, 4884, 5, 97, 0, 0, 4884, 4885, 5, 116, 0, 0, 4885, 4886, 5, 111, 0, 0, 4886, 4993, 5, 114, 0, 0, 4887, 4888, 5, 103, 0, 0, 4888, 4889, 5, 114, 0, 0, 4889, 4890, 5, 111, 0, 0, 4890, 4891, 5, 117, 0, 0, 4891, 4892, 5, 112, 0, 0, 4892, 4893, 5, 105, 0, 0, 4893, 4894, 5, 110, 0, 0, 4894, 4895, 5, 103, 0, 0, 4895, 4896, 5, 45, 0, 0, 4896, 4897, 5, 115, 0, 0, 4897, 4898, 5, 101, 0, 0, 4898, 4899, 5, 112, 0, 0, 4899, 4900, 5, 97, 0, 0, 4900, 4901, 5, 114, 0, 0, 4901, 4902, 5, 97, 0, 0, 4902, 4903, 5, 116, 0, 0, 4903, 4904, 5, 111, 0, 0, 4904, 4993, 5, 114, 0, 0, 4905, 4906, 5, 105, 0, 0, 4906, 4907, 5, 110, 0, 0, 4907, 4908, 5, 102, 0, 0, 4908, 4909, 5, 105, 0, 0, 4909, 4910, 5, 110, 0, 0, 4910, 4911, 5, 105, 0, 0, 4911, 4912, 5, 116, 0, 0, 4912, 4993, 5, 121, 0, 0, 4913, 4914, 5, 109, 0, 0, 4914, 4915, 5, 105, 0, 0, 4915, 4916, 5, 110, 0, 0, 4916, 4917, 5, 117, 0, 0, 4917, 4918, 5, 115, 0, 0, 4918, 4919, 5, 45, 0, 0, 4919, 4920, 5, 115, 0, 0, 4920, 4921, 5, 105, 0, 0, 4921, 4922, 5, 103, 0, 0, 4922, 4993, 5, 110, 0, 0, 4923, 4924, 5, 78, 0, 0, 4924, 4925, 5, 97, 0, 0, 4925, 4993, 5, 78, 0, 0, 4926, 4927, 5, 112, 0, 0, 4927, 4928, 5, 101, 0, 0, 4928, 4929, 5, 114, 0, 0, 4929, 4930, 5, 99, 0, 0, 4930, 4931, 5, 101, 0, 0, 4931, 4932, 5, 110, 0, 0, 4932, 4993, 5, 116, 0, 0, 4933, 4934, 5, 112, 0, 0, 4934, 4935, 5, 101, 0, 0, 4935, 4936, 5, 114, 0, 0, 4936, 4937, 5, 45, 0, 0, 4937, 4938, 5, 109, 0, 0, 4938, 4939, 5, 105, 0, 0, 4939, 4940, 5, 108, 0, 0, 4940, 4941, 5, 108, 0, 0, 4941, 4993, 5, 101, 0, 0, 4942, 4943, 5, 122, 0, 0, 4943, 4944, 5, 101, 0, 0, 4944, 4945, 5, 114, 0, 0, 4945, 4946, 5, 111, 0, 0, 4946, 4947, 5, 45, 0, 0, 4947, 4948, 5, 100, 0, 0, 4948, 4949, 5, 105, 0, 0, 4949, 4950, 5, 103, 0, 0, 4950, 4951, 5, 105, 0, 0, 4951, 4993, 5, 116, 0, 0, 4952, 4953, 5, 100, 0, 0, 4953, 4954, 5, 105, 0, 0, 4954, 4955, 5, 103, 0, 0, 4955, 4956, 5, 105, 0, 0, 4956, 4993, 5, 116, 0, 0, 4957, 4958, 5, 112, 0, 0, 4958, 4959, 5, 97, 0, 0, 4959, 4960, 5, 116, 0, 0, 4960, 4961, 5, 116, 0, 0, 4961, 4962, 5, 101, 0, 0, 4962, 4963, 5, 114, 0, 0, 4963, 4964, 5, 110, 0, 0, 4964, 4965, 5, 45, 0, 0, 4965, 4966, 5, 115, 0, 0, 4966, 4967, 5, 101, 0, 0, 4967, 4968, 5, 112, 0, 0, 4968, 4969, 5, 97, 0, 0, 4969, 4970, 5, 114, 0, 0, 4970, 4971, 5, 97, 0, 0, 4971, 4972, 5, 116, 0, 0, 4972, 4973, 5, 111, 0, 0, 4973, 4993, 5, 114, 0, 0, 4974, 4975, 5, 101, 0, 0, 4975, 4976, 5, 120, 0, 0, 4976, 4977, 5, 112, 0, 0, 4977, 4978, 5, 111, 0, 0, 4978, 4979, 5, 110, 0, 0, 4979, 4980, 5, 101, 0, 0, 4980, 4981, 5, 110, 0, 0, 4981, 4982, 5, 116, 0, 0, 4982, 4983, 5, 45, 0, 0, 4983, 4984, 5, 115, 0, 0, 4984, 4985, 5, 101, 0, 0, 4985, 4986, 5, 112, 0, 0, 4986, 4987, 5, 97, 0, 0, 4987, 4988, 5, 114, 0, 0, 4988, 4989, 5, 97, 0, 0, 4989, 4990, 5, 116, 0, 0, 4990, 4991, 5, 111, 0, 0, 4991, 4993, 5, 114, 0, 0, 4992, 4870, 1, 0, 0, 0, 4992, 4887, 1, 0, 0, 0, 4992, 4905, 1, 0, 0, 0, 4992, 4913, 1, 0, 0, 0, 4992, 4923, 1, 0, 0, 0, 4992, 4926, 1, 0, 0, 0, 4992, 4933, 1, 0, 0, 0, 4992, 4942, 1, 0, 0, 0, 4992, 4952, 1, 0, 0, 0, 4992, 4957, 1, 0, 0, 0, 4992, 4974, 1, 0, 0, 0, 4993, 4994, 1, 0, 0, 0, 4994, 4995, 6, 416, 24, 0, 4995, 839, 1, 0, 0, 0, 4996, 5012, 5, 38, 0, 0, 4997, 4998, 5, 108, 0, 0, 4998, 5013, 5, 116, 0, 0, 4999, 5000, 5, 103, 0, 0, 5000, 5013, 5, 116, 0, 0, 5001, 5002, 5, 97, 0, 0, 5002, 5003, 5, 109, 0, 0, 5003, 5013, 5, 112, 0, 0, 5004, 5005, 5, 113, 0, 0, 5005, 5006, 5, 117, 0, 0, 5006, 5007, 5, 111, 0, 0, 5007, 5013, 5, 116, 0, 0, 5008, 5009, 5, 97, 0, 0, 5009, 5010, 5, 112, 0, 0, 5010, 5011, 5, 111, 0, 0, 5011, 5013, 5, 115, 0, 0, 5012, 4997, 1, 0, 0, 0, 5012, 4999, 1, 0, 0, 0, 5012, 5001, 1, 0, 0, 0, 5012, 5004, 1, 0, 0, 0, 5012, 5008, 1, 0, 0, 0, 5013, 5014, 1, 0, 0, 0, 5014, 5015, 5, 59, 0, 0, 5015, 5016, 1, 0, 0, 0, 5016, 5017, 6, 417, 15, 0, 5017, 841, 1, 0, 0, 0, 5018, 5019, 5, 38, 0, 0, 5019, 5020, 5, 35, 0, 0, 5020, 5022, 1, 0, 0, 0, 5021, 5023, 7, 0, 0, 0, 5022, 5021, 1, 0, 0, 0, 5023, 5024, 1, 0, 0, 0, 5024, 5022, 1, 0, 0, 0, 5024, 5025, 1, 0, 0, 0, 5025, 5026, 1, 0, 0, 0, 5026, 5038, 5, 59, 0, 0, 5027, 5028, 5, 38, 0, 0, 5028, 5029, 5, 35, 0, 0, 5029, 5030, 5, 120, 0, 0, 5030, 5032, 1, 0, 0, 0, 5031, 5033, 7, 3, 0, 0, 5032, 5031, 1, 0, 0, 0, 5033, 5034, 1, 0, 0, 0, 5034, 5032, 1, 0, 0, 0, 5034, 5035, 1, 0, 0, 0, 5035, 5036, 1, 0, 0, 0, 5036, 5038, 5, 59, 0, 0, 5037, 5018, 1, 0, 0, 0, 5037, 5027, 1, 0, 0, 0, 5038, 5039, 1, 0, 0, 0, 5039, 5040, 6, 418, 16, 0, 5040, 843, 1, 0, 0, 0, 5041, 5042, 5, 39, 0, 0, 5042, 5043, 5, 39, 0, 0, 5043, 5044, 1, 0, 0, 0, 5044, 5045, 6, 419, 18, 0, 5045, 845, 1, 0, 0, 0, 5046, 5047, 5, 34, 0, 0, 5047, 5048, 1, 0, 0, 0, 5048, 5049, 6, 420, 0, 0, 5049, 5050, 6, 420, 10, 0, 5050, 847, 1, 0, 0, 0, 5051, 5052, 5, 39, 0, 0, 5052, 5053, 1, 0, 0, 0, 5053, 5054, 6, 421, 19, 0, 5054, 5055, 6, 421, 4, 0, 5055, 5056, 6, 421, 4, 0, 5056, 849, 1, 0, 0, 0, 5057, 5058, 5, 60, 0, 0, 5058, 5059, 5, 33, 0, 0, 5059, 5060, 5, 45, 0, 0, 5060, 5061, 5, 45, 0, 0, 5061, 5067, 1, 0, 0, 0, 5062, 5063, 5, 45, 0, 0, 5063, 5066, 8, 4, 0, 0, 5064, 5066, 8, 4, 0, 0, 5065, 5062, 1, 0, 0, 0, 5065, 5064, 1, 0, 0, 0, 5066, 5069, 1, 0, 0, 0, 5067, 5065, 1, 0, 0, 0, 5067, 5068, 1, 0, 0, 0, 5068, 5070, 1, 0, 0, 0, 5069, 5067, 1, 0, 0, 0, 5070, 5071, 5, 45, 0, 0, 5071, 5072, 5, 45, 0, 0, 5072, 5073, 5, 62, 0, 0, 5073, 5074, 1, 0, 0, 0, 5074, 5075, 6, 422, 25, 0, 5075, 851, 1, 0, 0, 0, 5076, 5077, 5, 60, 0, 0, 5077, 5078, 5, 63, 0, 0, 5078, 5079, 1, 0, 0, 0, 5079, 5080, 7, 5, 0, 0, 5080, 5081, 7, 6, 0, 0, 5081, 5089, 7, 7, 0, 0, 5082, 5086, 7, 8, 0, 0, 5083, 5085, 9, 0, 0, 0, 5084, 5083, 1, 0, 0, 0, 5085, 5088, 1, 0, 0, 0, 5086, 5087, 1, 0, 0, 0, 5086, 5084, 1, 0, 0, 0, 5087, 5090, 1, 0, 0, 0, 5088, 5086, 1, 0, 0, 0, 5089, 5082, 1, 0, 0, 0, 5089, 5090, 1, 0, 0, 0, 5090, 5091, 1, 0, 0, 0, 5091, 5092, 5, 63, 0, 0, 5092, 5093, 5, 62, 0, 0, 5093, 5094, 1, 0, 0, 0, 5094, 5095, 6, 423, 26, 0, 5095, 853, 1, 0, 0, 0, 5096, 5097, 5, 60, 0, 0, 5097, 5098, 5, 63, 0, 0, 5098, 5099, 1, 0, 0, 0, 5099, 5107, 3, 374, 184, 0, 5100, 5104, 7, 8, 0, 0, 5101, 5103, 9, 0, 0, 0, 5102, 5101, 1, 0, 0, 0, 5103, 5106, 1, 0, 0, 0, 5104, 5105, 1, 0, 0, 0, 5104, 5102, 1, 0, 0, 0, 5105, 5108, 1, 0, 0, 0, 5106, 5104, 1, 0, 0, 0, 5107, 5100, 1, 0, 0, 0, 5107, 5108, 1, 0, 0, 0, 5108, 5109, 1, 0, 0, 0, 5109, 5110, 5, 63, 0, 0, 5110, 5111, 5, 62, 0, 0, 5111, 5112, 1, 0, 0, 0, 5112, 5113, 6, 424, 27, 0, 5113, 855, 1, 0, 0, 0, 5114, 5115, 5, 60, 0, 0, 5115, 5116, 5, 33, 0, 0, 5116, 5117, 5, 91, 0, 0, 5117, 5118, 5, 67, 0, 0, 5118, 5119, 5, 68, 0, 0, 5119, 5120, 5, 65, 0, 0, 5120, 5121, 5, 84, 0, 0, 5121, 5122, 5, 65, 0, 0, 5122, 5123, 5, 91, 0, 0, 5123, 5127, 1, 0, 0, 0, 5124, 5126, 9, 0, 0, 0, 5125, 5124, 1, 0, 0, 0, 5126, 5129, 1, 0, 0, 0, 5127, 5128, 1, 0, 0, 0, 5127, 5125, 1, 0, 0, 0, 5128, 5130, 1, 0, 0, 0, 5129, 5127, 1, 0, 0, 0, 5130, 5131, 5, 93, 0, 0, 5131, 5132, 5, 93, 0, 0, 5132, 5133, 5, 62, 0, 0, 5133, 5134, 1, 0, 0, 0, 5134, 5135, 6, 425, 28, 0, 5135, 857, 1, 0, 0, 0, 5136, 5137, 5, 40, 0, 0, 5137, 5138, 5, 35, 0, 0, 5138, 5140, 1, 0, 0, 0, 5139, 5141, 3, 34, 14, 0, 5140, 5139, 1, 0, 0, 0, 5140, 5141, 1, 0, 0, 0, 5141, 5145, 1, 0, 0, 0, 5142, 5143, 3, 374, 184, 0, 5143, 5144, 5, 58, 0, 0, 5144, 5146, 1, 0, 0, 0, 5145, 5142, 1, 0, 0, 0, 5145, 5146, 1, 0, 0, 0, 5146, 5147, 1, 0, 0, 0, 5147, 5155, 3, 374, 184, 0, 5148, 5152, 3, 34, 14, 0, 5149, 5151, 9, 0, 0, 0, 5150, 5149, 1, 0, 0, 0, 5151, 5154, 1, 0, 0, 0, 5152, 5153, 1, 0, 0, 0, 5152, 5150, 1, 0, 0, 0, 5153, 5156, 1, 0, 0, 0, 5154, 5152, 1, 0, 0, 0, 5155, 5148, 1, 0, 0, 0, 5155, 5156, 1, 0, 0, 0, 5156, 5157, 1, 0, 0, 0, 5157, 5158, 5, 35, 0, 0, 5158, 5159, 5, 41, 0, 0, 5159, 5160, 1, 0, 0, 0, 5160, 5161, 6, 426, 29, 0, 5161, 859, 1, 0, 0, 0, 5162, 5164, 7, 8, 0, 0, 5163, 5162, 1, 0, 0, 0, 5164, 5165, 1, 0, 0, 0, 5165, 5163, 1, 0, 0, 0, 5165, 5166, 1, 0, 0, 0, 5166, 5167, 1, 0, 0, 0, 5167, 5168, 6, 427, 2, 0, 5168, 5169, 6, 427, 30, 0, 5169, 861, 1, 0, 0, 0, 5170, 5171, 5, 61, 0, 0, 5171, 5172, 1, 0, 0, 0, 5172, 5173, 6, 428, 31, 0, 5173, 863, 1, 0, 0, 0, 5174, 5175, 5, 33, 0, 0, 5175, 5176, 5, 61, 0, 0, 5176, 5177, 1, 0, 0, 0, 5177, 5178, 6, 429, 32, 0, 5178, 865, 1, 0, 0, 0, 5179, 5180, 5, 40, 0, 0, 5180, 5181, 1, 0, 0, 0, 5181, 5182, 6, 430, 33, 0, 5182, 867, 1, 0, 0, 0, 5183, 5184, 5, 41, 0, 0, 5184, 5185, 1, 0, 0, 0, 5185, 5186, 6, 431, 34, 0, 5186, 869, 1, 0, 0, 0, 5187, 5188, 5, 91, 0, 0, 5188, 5189, 1, 0, 0, 0, 5189, 5190, 6, 432, 35, 0, 5190, 871, 1, 0, 0, 0, 5191, 5192, 5, 93, 0, 0, 5192, 5193, 1, 0, 0, 0, 5193, 5194, 6, 433, 6, 0, 5194, 873, 1, 0, 0, 0, 5195, 5196, 5, 123, 0, 0, 5196, 5197, 6, 434, 206, 0, 5197, 5198, 1, 0, 0, 0, 5198, 5199, 6, 434, 7, 0, 5199, 875, 1, 0, 0, 0, 5200, 5201, 4, 435, 2, 0, 5201, 5202, 5, 125, 0, 0, 5202, 5203, 1, 0, 0, 0, 5203, 5204, 6, 435, 14, 0, 5204, 5205, 6, 435, 4, 0, 5205, 877, 1, 0, 0, 0, 5206, 5207, 4, 436, 3, 0, 5207, 5208, 5, 125, 0, 0, 5208, 5209, 6, 436, 207, 0, 5209, 5210, 1, 0, 0, 0, 5210, 5211, 6, 436, 14, 0, 5211, 879, 1, 0, 0, 0, 5212, 5213, 5, 42, 0, 0, 5213, 5214, 1, 0, 0, 0, 5214, 5215, 6, 437, 38, 0, 5215, 881, 1, 0, 0, 0, 5216, 5217, 5, 43, 0, 0, 5217, 5218, 1, 0, 0, 0, 5218, 5219, 6, 438, 39, 0, 5219, 883, 1, 0, 0, 0, 5220, 5221, 5, 45, 0, 0, 5221, 5222, 1, 0, 0, 0, 5222, 5223, 6, 439, 40, 0, 5223, 885, 1, 0, 0, 0, 5224, 5225, 5, 44, 0, 0, 5225, 5226, 1, 0, 0, 0, 5226, 5227, 6, 440, 41, 0, 5227, 887, 1, 0, 0, 0, 5228, 5229, 5, 46, 0, 0, 5229, 5230, 1, 0, 0, 0, 5230, 5231, 6, 441, 42, 0, 5231, 889, 1, 0, 0, 0, 5232, 5233, 5, 46, 0, 0, 5233, 5234, 5, 46, 0, 0, 5234, 5235, 1, 0, 0, 0, 5235, 5236, 6, 442, 43, 0, 5236, 891, 1, 0, 0, 0, 5237, 5238, 5, 58, 0, 0, 5238, 5239, 1, 0, 0, 0, 5239, 5240, 6, 443, 44, 0, 5240, 893, 1, 0, 0, 0, 5241, 5242, 5, 58, 0, 0, 5242, 5243, 5, 61, 0, 0, 5243, 5244, 1, 0, 0, 0, 5244, 5245, 6, 444, 45, 0, 5245, 895, 1, 0, 0, 0, 5246, 5247, 5, 59, 0, 0, 5247, 5248, 1, 0, 0, 0, 5248, 5249, 6, 445, 46, 0, 5249, 897, 1, 0, 0, 0, 5250, 5251, 5, 47, 0, 0, 5251, 5252, 1, 0, 0, 0, 5252, 5253, 6, 446, 47, 0, 5253, 899, 1, 0, 0, 0, 5254, 5255, 5, 47, 0, 0, 5255, 5256, 5, 47, 0, 0, 5256, 5257, 1, 0, 0, 0, 5257, 5258, 6, 447, 48, 0, 5258, 901, 1, 0, 0, 0, 5259, 5260, 5, 92, 0, 0, 5260, 5261, 1, 0, 0, 0, 5261, 5262, 6, 448, 49, 0, 5262, 903, 1, 0, 0, 0, 5263, 5264, 5, 124, 0, 0, 5264, 5265, 1, 0, 0, 0, 5265, 5266, 6, 449, 50, 0, 5266, 905, 1, 0, 0, 0, 5267, 5268, 5, 60, 0, 0, 5268, 5269, 1, 0, 0, 0, 5269, 5270, 6, 450, 51, 0, 5270, 907, 1, 0, 0, 0, 5271, 5272, 5, 62, 0, 0, 5272, 5273, 1, 0, 0, 0, 5273, 5274, 6, 451, 52, 0, 5274, 909, 1, 0, 0, 0, 5275, 5276, 5, 63, 0, 0, 5276, 5277, 1, 0, 0, 0, 5277, 5278, 6, 452, 53, 0, 5278, 911, 1, 0, 0, 0, 5279, 5280, 5, 64, 0, 0, 5280, 5281, 1, 0, 0, 0, 5281, 5282, 6, 453, 54, 0, 5282, 913, 1, 0, 0, 0, 5283, 5284, 5, 36, 0, 0, 5284, 5285, 1, 0, 0, 0, 5285, 5286, 6, 454, 55, 0, 5286, 915, 1, 0, 0, 0, 5287, 5288, 5, 37, 0, 0, 5288, 5289, 1, 0, 0, 0, 5289, 5290, 6, 455, 56, 0, 5290, 917, 1, 0, 0, 0, 5291, 5292, 5, 33, 0, 0, 5292, 5293, 1, 0, 0, 0, 5293, 5294, 6, 456, 57, 0, 5294, 919, 1, 0, 0, 0, 5295, 5296, 5, 35, 0, 0, 5296, 5297, 1, 0, 0, 0, 5297, 5298, 6, 457, 58, 0, 5298, 921, 1, 0, 0, 0, 5299, 5300, 5, 94, 0, 0, 5300, 5301, 1, 0, 0, 0, 5301, 5302, 6, 458, 59, 0, 5302, 923, 1, 0, 0, 0, 5303, 5304, 5, 61, 0, 0, 5304, 5305, 5, 62, 0, 0, 5305, 5306, 1, 0, 0, 0, 5306, 5307, 6, 459, 60, 0, 5307, 925, 1, 0, 0, 0, 5308, 5309, 5, 96, 0, 0, 5309, 5310, 1, 0, 0, 0, 5310, 5311, 6, 460, 5, 0, 5311, 927, 1, 0, 0, 0, 5312, 5313, 5, 124, 0, 0, 5313, 5314, 5, 124, 0, 0, 5314, 5315, 1, 0, 0, 0, 5315, 5316, 6, 461, 61, 0, 5316, 929, 1, 0, 0, 0, 5317, 5318, 5, 126, 0, 0, 5318, 5319, 1, 0, 0, 0, 5319, 5320, 6, 462, 62, 0, 5320, 931, 1, 0, 0, 0, 5321, 5322, 5, 97, 0, 0, 5322, 5323, 5, 108, 0, 0, 5323, 5324, 5, 108, 0, 0, 5324, 5325, 5, 111, 0, 0, 5325, 5326, 5, 119, 0, 0, 5326, 5327, 5, 105, 0, 0, 5327, 5328, 5, 110, 0, 0, 5328, 5329, 5, 103, 0, 0, 5329, 5330, 1, 0, 0, 0, 5330, 5331, 6, 463, 63, 0, 5331, 933, 1, 0, 0, 0, 5332, 5333, 5, 97, 0, 0, 5333, 5334, 5, 110, 0, 0, 5334, 5335, 5, 99, 0, 0, 5335, 5336, 5, 101, 0, 0, 5336, 5337, 5, 115, 0, 0, 5337, 5338, 5, 116, 0, 0, 5338, 5339, 5, 111, 0, 0, 5339, 5340, 5, 114, 0, 0, 5340, 5341, 1, 0, 0, 0, 5341, 5342, 6, 464, 64, 0, 5342, 935, 1, 0, 0, 0, 5343, 5344, 5, 97, 0, 0, 5344, 5345, 5, 110, 0, 0, 5345, 5346, 5, 99, 0, 0, 5346, 5347, 5, 101, 0, 0, 5347, 5348, 5, 115, 0, 0, 5348, 5349, 5, 116, 0, 0, 5349, 5350, 5, 111, 0, 0, 5350, 5351, 5, 114, 0, 0, 5351, 5352, 5, 45, 0, 0, 5352, 5353, 5, 111, 0, 0, 5353, 5354, 5, 114, 0, 0, 5354, 5355, 5, 45, 0, 0, 5355, 5356, 5, 115, 0, 0, 5356, 5357, 5, 101, 0, 0, 5357, 5358, 5, 108, 0, 0, 5358, 5359, 5, 102, 0, 0, 5359, 5360, 1, 0, 0, 0, 5360, 5361, 6, 465, 65, 0, 5361, 937, 1, 0, 0, 0, 5362, 5363, 5, 97, 0, 0, 5363, 5364, 5, 110, 0, 0, 5364, 5365, 5, 100, 0, 0, 5365, 5366, 1, 0, 0, 0, 5366, 5367, 6, 466, 66, 0, 5367, 939, 1, 0, 0, 0, 5368, 5369, 5, 97, 0, 0, 5369, 5370, 5, 114, 0, 0, 5370, 5371, 5, 114, 0, 0, 5371, 5372, 5, 97, 0, 0, 5372, 5373, 5, 121, 0, 0, 5373, 5374, 1, 0, 0, 0, 5374, 5375, 6, 467, 67, 0, 5375, 941, 1, 0, 0, 0, 5376, 5377, 5, 97, 0, 0, 5377, 5378, 5, 115, 0, 0, 5378, 5379, 1, 0, 0, 0, 5379, 5380, 6, 468, 68, 0, 5380, 943, 1, 0, 0, 0, 5381, 5382, 5, 97, 0, 0, 5382, 5383, 5, 115, 0, 0, 5383, 5384, 5, 99, 0, 0, 5384, 5385, 5, 101, 0, 0, 5385, 5386, 5, 110, 0, 0, 5386, 5387, 5, 100, 0, 0, 5387, 5388, 5, 105, 0, 0, 5388, 5389, 5, 110, 0, 0, 5389, 5390, 5, 103, 0, 0, 5390, 5391, 1, 0, 0, 0, 5391, 5392, 6, 469, 69, 0, 5392, 945, 1, 0, 0, 0, 5393, 5394, 5, 97, 0, 0, 5394, 5395, 5, 116, 0, 0, 5395, 5396, 1, 0, 0, 0, 5396, 5397, 6, 470, 70, 0, 5397, 947, 1, 0, 0, 0, 5398, 5399, 5, 97, 0, 0, 5399, 5400, 5, 116, 0, 0, 5400, 5401, 5, 116, 0, 0, 5401, 5402, 5, 114, 0, 0, 5402, 5403, 5, 105, 0, 0, 5403, 5404, 5, 98, 0, 0, 5404, 5405, 5, 117, 0, 0, 5405, 5406, 5, 116, 0, 0, 5406, 5407, 5, 101, 0, 0, 5407, 5408, 1, 0, 0, 0, 5408, 5409, 6, 471, 71, 0, 5409, 949, 1, 0, 0, 0, 5410, 5411, 5, 98, 0, 0, 5411, 5412, 5, 97, 0, 0, 5412, 5413, 5, 115, 0, 0, 5413, 5414, 5, 101, 0, 0, 5414, 5415, 5, 45, 0, 0, 5415, 5416, 5, 117, 0, 0, 5416, 5417, 5, 114, 0, 0, 5417, 5418, 5, 105, 0, 0, 5418, 5419, 1, 0, 0, 0, 5419, 5420, 6, 472, 72, 0, 5420, 951, 1, 0, 0, 0, 5421, 5422, 5, 98, 0, 0, 5422, 5423, 5, 111, 0, 0, 5423, 5424, 5, 117, 0, 0, 5424, 5425, 5, 110, 0, 0, 5425, 5426, 5, 100, 0, 0, 5426, 5427, 5, 97, 0, 0, 5427, 5428, 5, 114, 0, 0, 5428, 5429, 5, 121, 0, 0, 5429, 5430, 5, 45, 0, 0, 5430, 5431, 5, 115, 0, 0, 5431, 5432, 5, 112, 0, 0, 5432, 5433, 5, 97, 0, 0, 5433, 5434, 5, 99, 0, 0, 5434, 5435, 5, 101, 0, 0, 5435, 5436, 1, 0, 0, 0, 5436, 5437, 6, 473, 73, 0, 5437, 953, 1, 0, 0, 0, 5438, 5439, 5, 98, 0, 0, 5439, 5440, 5, 105, 0, 0, 5440, 5441, 5, 110, 0, 0, 5441, 5442, 5, 97, 0, 0, 5442, 5443, 5, 114, 0, 0, 5443, 5444, 5, 121, 0, 0, 5444, 5445, 1, 0, 0, 0, 5445, 5446, 6, 474, 74, 0, 5446, 955, 1, 0, 0, 0, 5447, 5448, 5, 98, 0, 0, 5448, 5449, 5, 121, 0, 0, 5449, 5450, 1, 0, 0, 0, 5450, 5451, 6, 475, 75, 0, 5451, 957, 1, 0, 0, 0, 5452, 5453, 5, 99, 0, 0, 5453, 5454, 5, 97, 0, 0, 5454, 5455, 5, 115, 0, 0, 5455, 5456, 5, 101, 0, 0, 5456, 5457, 1, 0, 0, 0, 5457, 5458, 6, 476, 76, 0, 5458, 959, 1, 0, 0, 0, 5459, 5460, 5, 99, 0, 0, 5460, 5461, 5, 97, 0, 0, 5461, 5462, 5, 115, 0, 0, 5462, 5463, 5, 116, 0, 0, 5463, 5464, 1, 0, 0, 0, 5464, 5465, 6, 477, 77, 0, 5465, 961, 1, 0, 0, 0, 5466, 5467, 5, 99, 0, 0, 5467, 5468, 5, 97, 0, 0, 5468, 5469, 5, 115, 0, 0, 5469, 5470, 5, 116, 0, 0, 5470, 5471, 5, 97, 0, 0, 5471, 5472, 5, 98, 0, 0, 5472, 5473, 5, 108, 0, 0, 5473, 5474, 5, 101, 0, 0, 5474, 5475, 1, 0, 0, 0, 5475, 5476, 6, 478, 78, 0, 5476, 963, 1, 0, 0, 0, 5477, 5478, 5, 99, 0, 0, 5478, 5479, 5, 97, 0, 0, 5479, 5480, 5, 116, 0, 0, 5480, 5481, 5, 99, 0, 0, 5481, 5482, 5, 104, 0, 0, 5482, 5483, 1, 0, 0, 0, 5483, 5484, 6, 479, 79, 0, 5484, 965, 1, 0, 0, 0, 5485, 5486, 5, 99, 0, 0, 5486, 5487, 5, 104, 0, 0, 5487, 5488, 5, 105, 0, 0, 5488, 5489, 5, 108, 0, 0, 5489, 5490, 5, 100, 0, 0, 5490, 5491, 1, 0, 0, 0, 5491, 5492, 6, 480, 80, 0, 5492, 967, 1, 0, 0, 0, 5493, 5494, 5, 99, 0, 0, 5494, 5495, 5, 111, 0, 0, 5495, 5496, 5, 108, 0, 0, 5496, 5497, 5, 108, 0, 0, 5497, 5498, 5, 97, 0, 0, 5498, 5499, 5, 116, 0, 0, 5499, 5500, 5, 105, 0, 0, 5500, 5501, 5, 111, 0, 0, 5501, 5502, 5, 110, 0, 0, 5502, 5503, 1, 0, 0, 0, 5503, 5504, 6, 481, 81, 0, 5504, 969, 1, 0, 0, 0, 5505, 5506, 5, 99, 0, 0, 5506, 5507, 5, 111, 0, 0, 5507, 5508, 5, 109, 0, 0, 5508, 5509, 5, 109, 0, 0, 5509, 5510, 5, 101, 0, 0, 5510, 5511, 5, 110, 0, 0, 5511, 5512, 5, 116, 0, 0, 5512, 5513, 1, 0, 0, 0, 5513, 5514, 6, 482, 82, 0, 5514, 971, 1, 0, 0, 0, 5515, 5516, 5, 99, 0, 0, 5516, 5517, 5, 111, 0, 0, 5517, 5518, 5, 110, 0, 0, 5518, 5519, 5, 115, 0, 0, 5519, 5520, 5, 116, 0, 0, 5520, 5521, 5, 114, 0, 0, 5521, 5522, 5, 117, 0, 0, 5522, 5523, 5, 99, 0, 0, 5523, 5524, 5, 116, 0, 0, 5524, 5525, 5, 105, 0, 0, 5525, 5526, 5, 111, 0, 0, 5526, 5527, 5, 110, 0, 0, 5527, 5528, 1, 0, 0, 0, 5528, 5529, 6, 483, 83, 0, 5529, 973, 1, 0, 0, 0, 5530, 5531, 5, 99, 0, 0, 5531, 5532, 5, 111, 0, 0, 5532, 5533, 5, 110, 0, 0, 5533, 5534, 5, 116, 0, 0, 5534, 5535, 5, 101, 0, 0, 5535, 5536, 5, 120, 0, 0, 5536, 5537, 5, 116, 0, 0, 5537, 5538, 1, 0, 0, 0, 5538, 5539, 6, 484, 84, 0, 5539, 975, 1, 0, 0, 0, 5540, 5541, 5, 99, 0, 0, 5541, 5542, 5, 111, 0, 0, 5542, 5543, 5, 112, 0, 0, 5543, 5544, 5, 121, 0, 0, 5544, 5545, 5, 45, 0, 0, 5545, 5546, 5, 110, 0, 0, 5546, 5547, 5, 97, 0, 0, 5547, 5548, 5, 109, 0, 0, 5548, 5549, 5, 101, 0, 0, 5549, 5550, 5, 115, 0, 0, 5550, 5551, 5, 112, 0, 0, 5551, 5552, 5, 97, 0, 0, 5552, 5553, 5, 99, 0, 0, 5553, 5554, 5, 101, 0, 0, 5554, 5555, 5, 115, 0, 0, 5555, 5556, 1, 0, 0, 0, 5556, 5557, 6, 485, 85, 0, 5557, 977, 1, 0, 0, 0, 5558, 5559, 5, 99, 0, 0, 5559, 5560, 5, 111, 0, 0, 5560, 5561, 5, 117, 0, 0, 5561, 5562, 5, 110, 0, 0, 5562, 5563, 5, 116, 0, 0, 5563, 5564, 1, 0, 0, 0, 5564, 5565, 6, 486, 86, 0, 5565, 979, 1, 0, 0, 0, 5566, 5567, 5, 100, 0, 0, 5567, 5568, 5, 101, 0, 0, 5568, 5569, 5, 99, 0, 0, 5569, 5570, 5, 108, 0, 0, 5570, 5571, 5, 97, 0, 0, 5571, 5572, 5, 114, 0, 0, 5572, 5573, 5, 101, 0, 0, 5573, 5574, 1, 0, 0, 0, 5574, 5575, 6, 487, 87, 0, 5575, 981, 1, 0, 0, 0, 5576, 5577, 5, 100, 0, 0, 5577, 5578, 5, 101, 0, 0, 5578, 5579, 5, 102, 0, 0, 5579, 5580, 5, 97, 0, 0, 5580, 5581, 5, 117, 0, 0, 5581, 5582, 5, 108, 0, 0, 5582, 5583, 5, 116, 0, 0, 5583, 5584, 1, 0, 0, 0, 5584, 5585, 6, 488, 88, 0, 5585, 983, 1, 0, 0, 0, 5586, 5587, 5, 100, 0, 0, 5587, 5588, 5, 101, 0, 0, 5588, 5589, 5, 115, 0, 0, 5589, 5590, 5, 99, 0, 0, 5590, 5591, 5, 101, 0, 0, 5591, 5592, 5, 110, 0, 0, 5592, 5593, 5, 100, 0, 0, 5593, 5594, 5, 97, 0, 0, 5594, 5595, 5, 110, 0, 0, 5595, 5596, 5, 116, 0, 0, 5596, 5597, 1, 0, 0, 0, 5597, 5598, 6, 489, 89, 0, 5598, 985, 1, 0, 0, 0, 5599, 5600, 5, 100, 0, 0, 5600, 5601, 5, 101, 0, 0, 5601, 5602, 5, 115, 0, 0, 5602, 5603, 5, 99, 0, 0, 5603, 5604, 5, 101, 0, 0, 5604, 5605, 5, 110, 0, 0, 5605, 5606, 5, 100, 0, 0, 5606, 5607, 5, 97, 0, 0, 5607, 5608, 5, 110, 0, 0, 5608, 5609, 5, 116, 0, 0, 5609, 5610, 5, 45, 0, 0, 5610, 5611, 5, 111, 0, 0, 5611, 5612, 5, 114, 0, 0, 5612, 5613, 5, 45, 0, 0, 5613, 5614, 5, 115, 0, 0, 5614, 5615, 5, 101, 0, 0, 5615, 5616, 5, 108, 0, 0, 5616, 5617, 5, 102, 0, 0, 5617, 5618, 1, 0, 0, 0, 5618, 5619, 6, 490, 90, 0, 5619, 987, 1, 0, 0, 0, 5620, 5621, 5, 100, 0, 0, 5621, 5622, 5, 101, 0, 0, 5622, 5623, 5, 115, 0, 0, 5623, 5624, 5, 99, 0, 0, 5624, 5625, 5, 101, 0, 0, 5625, 5626, 5, 110, 0, 0, 5626, 5627, 5, 100, 0, 0, 5627, 5628, 5, 105, 0, 0, 5628, 5629, 5, 110, 0, 0, 5629, 5630, 5, 103, 0, 0, 5630, 5631, 1, 0, 0, 0, 5631, 5632, 6, 491, 91, 0, 5632, 989, 1, 0, 0, 0, 5633, 5634, 5, 100, 0, 0, 5634, 5635, 5, 101, 0, 0, 5635, 5636, 5, 99, 0, 0, 5636, 5637, 5, 105, 0, 0, 5637, 5638, 5, 109, 0, 0, 5638, 5639, 5, 97, 0, 0, 5639, 5640, 5, 108, 0, 0, 5640, 5641, 5, 45, 0, 0, 5641, 5642, 5, 102, 0, 0, 5642, 5643, 5, 111, 0, 0, 5643, 5644, 5, 114, 0, 0, 5644, 5645, 5, 109, 0, 0, 5645, 5646, 5, 97, 0, 0, 5646, 5647, 5, 116, 0, 0, 5647, 5648, 1, 0, 0, 0, 5648, 5649, 6, 492, 92, 0, 5649, 991, 1, 0, 0, 0, 5650, 5651, 5, 100, 0, 0, 5651, 5652, 5, 105, 0, 0, 5652, 5653, 5, 118, 0, 0, 5653, 5654, 1, 0, 0, 0, 5654, 5655, 6, 493, 93, 0, 5655, 993, 1, 0, 0, 0, 5656, 5657, 5, 100, 0, 0, 5657, 5658, 5, 111, 0, 0, 5658, 5659, 5, 99, 0, 0, 5659, 5660, 5, 117, 0, 0, 5660, 5661, 5, 109, 0, 0, 5661, 5662, 5, 101, 0, 0, 5662, 5663, 5, 110, 0, 0, 5663, 5664, 5, 116, 0, 0, 5664, 5665, 1, 0, 0, 0, 5665, 5666, 6, 494, 94, 0, 5666, 995, 1, 0, 0, 0, 5667, 5668, 5, 100, 0, 0, 5668, 5669, 5, 111, 0, 0, 5669, 5670, 5, 99, 0, 0, 5670, 5671, 5, 117, 0, 0, 5671, 5672, 5, 109, 0, 0, 5672, 5673, 5, 101, 0, 0, 5673, 5674, 5, 110, 0, 0, 5674, 5675, 5, 116, 0, 0, 5675, 5676, 5, 45, 0, 0, 5676, 5677, 5, 110, 0, 0, 5677, 5678, 5, 111, 0, 0, 5678, 5679, 5, 100, 0, 0, 5679, 5680, 5, 101, 0, 0, 5680, 5681, 1, 0, 0, 0, 5681, 5682, 6, 495, 95, 0, 5682, 997, 1, 0, 0, 0, 5683, 5684, 5, 101, 0, 0, 5684, 5685, 5, 108, 0, 0, 5685, 5686, 5, 101, 0, 0, 5686, 5687, 5, 109, 0, 0, 5687, 5688, 5, 101, 0, 0, 5688, 5689, 5, 110, 0, 0, 5689, 5690, 5, 116, 0, 0, 5690, 5691, 1, 0, 0, 0, 5691, 5692, 6, 496, 96, 0, 5692, 999, 1, 0, 0, 0, 5693, 5694, 5, 101, 0, 0, 5694, 5695, 5, 108, 0, 0, 5695, 5696, 5, 115, 0, 0, 5696, 5697, 5, 101, 0, 0, 5697, 5698, 1, 0, 0, 0, 5698, 5699, 6, 497, 97, 0, 5699, 1001, 1, 0, 0, 0, 5700, 5701, 5, 101, 0, 0, 5701, 5702, 5, 109, 0, 0, 5702, 5703, 5, 112, 0, 0, 5703, 5704, 5, 116, 0, 0, 5704, 5705, 5, 121, 0, 0, 5705, 5706, 1, 0, 0, 0, 5706, 5707, 6, 498, 98, 0, 5707, 1003, 1, 0, 0, 0, 5708, 5709, 5, 101, 0, 0, 5709, 5710, 5, 109, 0, 0, 5710, 5711, 5, 112, 0, 0, 5711, 5712, 5, 116, 0, 0, 5712, 5713, 5, 121, 0, 0, 5713, 5714, 5, 45, 0, 0, 5714, 5715, 5, 115, 0, 0, 5715, 5716, 5, 101, 0, 0, 5716, 5717, 5, 113, 0, 0, 5717, 5718, 5, 117, 0, 0, 5718, 5719, 5, 101, 0, 0, 5719, 5720, 5, 110, 0, 0, 5720, 5721, 5, 99, 0, 0, 5721, 5722, 5, 101, 0, 0, 5722, 5723, 1, 0, 0, 0, 5723, 5724, 6, 499, 99, 0, 5724, 1005, 1, 0, 0, 0, 5725, 5726, 5, 101, 0, 0, 5726, 5727, 5, 110, 0, 0, 5727, 5728, 5, 99, 0, 0, 5728, 5729, 5, 111, 0, 0, 5729, 5730, 5, 100, 0, 0, 5730, 5731, 5, 105, 0, 0, 5731, 5732, 5, 110, 0, 0, 5732, 5733, 5, 103, 0, 0, 5733, 5734, 1, 0, 0, 0, 5734, 5735, 6, 500, 100, 0, 5735, 1007, 1, 0, 0, 0, 5736, 5737, 5, 101, 0, 0, 5737, 5738, 5, 110, 0, 0, 5738, 5739, 5, 100, 0, 0, 5739, 5740, 1, 0, 0, 0, 5740, 5741, 6, 501, 101, 0, 5741, 1009, 1, 0, 0, 0, 5742, 5743, 5, 101, 0, 0, 5743, 5744, 5, 113, 0, 0, 5744, 5745, 1, 0, 0, 0, 5745, 5746, 6, 502, 102, 0, 5746, 1011, 1, 0, 0, 0, 5747, 5748, 5, 101, 0, 0, 5748, 5749, 5, 118, 0, 0, 5749, 5750, 5, 101, 0, 0, 5750, 5751, 5, 114, 0, 0, 5751, 5752, 5, 121, 0, 0, 5752, 5753, 1, 0, 0, 0, 5753, 5754, 6, 503, 103, 0, 5754, 1013, 1, 0, 0, 0, 5755, 5756, 5, 101, 0, 0, 5756, 5757, 5, 120, 0, 0, 5757, 5758, 5, 99, 0, 0, 5758, 5759, 5, 101, 0, 0, 5759, 5760, 5, 112, 0, 0, 5760, 5761, 5, 116, 0, 0, 5761, 5762, 1, 0, 0, 0, 5762, 5763, 6, 504, 104, 0, 5763, 1015, 1, 0, 0, 0, 5764, 5765, 5, 101, 0, 0, 5765, 5766, 5, 120, 0, 0, 5766, 5767, 5, 116, 0, 0, 5767, 5768, 5, 101, 0, 0, 5768, 5769, 5, 114, 0, 0, 5769, 5770, 5, 110, 0, 0, 5770, 5771, 5, 97, 0, 0, 5771, 5772, 5, 108, 0, 0, 5772, 5773, 1, 0, 0, 0, 5773, 5774, 6, 505, 105, 0, 5774, 1017, 1, 0, 0, 0, 5775, 5776, 5, 102, 0, 0, 5776, 5777, 5, 111, 0, 0, 5777, 5778, 5, 108, 0, 0, 5778, 5779, 5, 108, 0, 0, 5779, 5780, 5, 111, 0, 0, 5780, 5781, 5, 119, 0, 0, 5781, 5782, 5, 105, 0, 0, 5782, 5783, 5, 110, 0, 0, 5783, 5784, 5, 103, 0, 0, 5784, 5785, 1, 0, 0, 0, 5785, 5786, 6, 506, 106, 0, 5786, 1019, 1, 0, 0, 0, 5787, 5788, 5, 102, 0, 0, 5788, 5789, 5, 111, 0, 0, 5789, 5790, 5, 108, 0, 0, 5790, 5791, 5, 108, 0, 0, 5791, 5792, 5, 111, 0, 0, 5792, 5793, 5, 119, 0, 0, 5793, 5794, 5, 105, 0, 0, 5794, 5795, 5, 110, 0, 0, 5795, 5796, 5, 103, 0, 0, 5796, 5797, 5, 45, 0, 0, 5797, 5798, 5, 115, 0, 0, 5798, 5799, 5, 105, 0, 0, 5799, 5800, 5, 98, 0, 0, 5800, 5801, 5, 108, 0, 0, 5801, 5802, 5, 105, 0, 0, 5802, 5803, 5, 110, 0, 0, 5803, 5804, 5, 103, 0, 0, 5804, 5805, 1, 0, 0, 0, 5805, 5806, 6, 507, 107, 0, 5806, 1021, 1, 0, 0, 0, 5807, 5808, 5, 102, 0, 0, 5808, 5809, 5, 111, 0, 0, 5809, 5810, 5, 114, 0, 0, 5810, 5811, 1, 0, 0, 0, 5811, 5812, 6, 508, 108, 0, 5812, 1023, 1, 0, 0, 0, 5813, 5814, 5, 102, 0, 0, 5814, 5815, 5, 117, 0, 0, 5815, 5816, 5, 110, 0, 0, 5816, 5817, 5, 99, 0, 0, 5817, 5818, 5, 116, 0, 0, 5818, 5819, 5, 105, 0, 0, 5819, 5820, 5, 111, 0, 0, 5820, 5821, 5, 110, 0, 0, 5821, 5822, 1, 0, 0, 0, 5822, 5823, 6, 509, 109, 0, 5823, 1025, 1, 0, 0, 0, 5824, 5825, 5, 103, 0, 0, 5825, 5826, 5, 101, 0, 0, 5826, 5827, 1, 0, 0, 0, 5827, 5828, 6, 510, 110, 0, 5828, 1027, 1, 0, 0, 0, 5829, 5830, 5, 103, 0, 0, 5830, 5831, 5, 114, 0, 0, 5831, 5832, 5, 101, 0, 0, 5832, 5833, 5, 97, 0, 0, 5833, 5834, 5, 116, 0, 0, 5834, 5835, 5, 101, 0, 0, 5835, 5836, 5, 115, 0, 0, 5836, 5837, 5, 116, 0, 0, 5837, 5838, 1, 0, 0, 0, 5838, 5839, 6, 511, 111, 0, 5839, 1029, 1, 0, 0, 0, 5840, 5841, 5, 103, 0, 0, 5841, 5842, 5, 114, 0, 0, 5842, 5843, 5, 111, 0, 0, 5843, 5844, 5, 117, 0, 0, 5844, 5845, 5, 112, 0, 0, 5845, 5846, 1, 0, 0, 0, 5846, 5847, 6, 512, 112, 0, 5847, 1031, 1, 0, 0, 0, 5848, 5849, 5, 103, 0, 0, 5849, 5850, 5, 116, 0, 0, 5850, 5851, 1, 0, 0, 0, 5851, 5852, 6, 513, 113, 0, 5852, 1033, 1, 0, 0, 0, 5853, 5854, 5, 105, 0, 0, 5854, 5855, 5, 100, 0, 0, 5855, 5856, 5, 105, 0, 0, 5856, 5857, 5, 118, 0, 0, 5857, 5858, 1, 0, 0, 0, 5858, 5859, 6, 514, 114, 0, 5859, 1035, 1, 0, 0, 0, 5860, 5861, 5, 105, 0, 0, 5861, 5862, 5, 102, 0, 0, 5862, 5863, 1, 0, 0, 0, 5863, 5864, 6, 515, 115, 0, 5864, 1037, 1, 0, 0, 0, 5865, 5866, 5, 105, 0, 0, 5866, 5867, 5, 109, 0, 0, 5867, 5868, 5, 112, 0, 0, 5868, 5869, 5, 111, 0, 0, 5869, 5870, 5, 114, 0, 0, 5870, 5871, 5, 116, 0, 0, 5871, 5872, 1, 0, 0, 0, 5872, 5873, 6, 516, 116, 0, 5873, 1039, 1, 0, 0, 0, 5874, 5875, 5, 105, 0, 0, 5875, 5876, 5, 110, 0, 0, 5876, 5877, 1, 0, 0, 0, 5877, 5878, 6, 517, 117, 0, 5878, 1041, 1, 0, 0, 0, 5879, 5880, 5, 105, 0, 0, 5880, 5881, 5, 110, 0, 0, 5881, 5882, 5, 104, 0, 0, 5882, 5883, 5, 101, 0, 0, 5883, 5884, 5, 114, 0, 0, 5884, 5885, 5, 105, 0, 0, 5885, 5886, 5, 116, 0, 0, 5886, 5887, 1, 0, 0, 0, 5887, 5888, 6, 518, 118, 0, 5888, 1043, 1, 0, 0, 0, 5889, 5890, 5, 105, 0, 0, 5890, 5891, 5, 110, 0, 0, 5891, 5892, 5, 115, 0, 0, 5892, 5893, 5, 116, 0, 0, 5893, 5894, 5, 97, 0, 0, 5894, 5895, 5, 110, 0, 0, 5895, 5896, 5, 99, 0, 0, 5896, 5897, 5, 101, 0, 0, 5897, 5898, 1, 0, 0, 0, 5898, 5899, 6, 519, 119, 0, 5899, 1045, 1, 0, 0, 0, 5900, 5901, 5, 105, 0, 0, 5901, 5902, 5, 110, 0, 0, 5902, 5903, 5, 116, 0, 0, 5903, 5904, 5, 101, 0, 0, 5904, 5905, 5, 114, 0, 0, 5905, 5906, 5, 115, 0, 0, 5906, 5907, 5, 101, 0, 0, 5907, 5908, 5, 99, 0, 0, 5908, 5909, 5, 116, 0, 0, 5909, 5910, 1, 0, 0, 0, 5910, 5911, 6, 520, 120, 0, 5911, 1047, 1, 0, 0, 0, 5912, 5913, 5, 105, 0, 0, 5913, 5914, 5, 115, 0, 0, 5914, 5915, 1, 0, 0, 0, 5915, 5916, 6, 521, 121, 0, 5916, 1049, 1, 0, 0, 0, 5917, 5918, 5, 105, 0, 0, 5918, 5919, 5, 116, 0, 0, 5919, 5920, 5, 101, 0, 0, 5920, 5921, 5, 109, 0, 0, 5921, 5922, 1, 0, 0, 0, 5922, 5923, 6, 522, 122, 0, 5923, 1051, 1, 0, 0, 0, 5924, 5925, 5, 108, 0, 0, 5925, 5926, 5, 97, 0, 0, 5926, 5927, 5, 120, 0, 0, 5927, 5928, 1, 0, 0, 0, 5928, 5929, 6, 523, 123, 0, 5929, 1053, 1, 0, 0, 0, 5930, 5931, 5, 108, 0, 0, 5931, 5932, 5, 101, 0, 0, 5932, 5933, 1, 0, 0, 0, 5933, 5934, 6, 524, 124, 0, 5934, 1055, 1, 0, 0, 0, 5935, 5936, 5, 108, 0, 0, 5936, 5937, 5, 101, 0, 0, 5937, 5938, 5, 97, 0, 0, 5938, 5939, 5, 115, 0, 0, 5939, 5940, 5, 116, 0, 0, 5940, 5941, 1, 0, 0, 0, 5941, 5942, 6, 525, 125, 0, 5942, 1057, 1, 0, 0, 0, 5943, 5944, 5, 108, 0, 0, 5944, 5945, 5, 101, 0, 0, 5945, 5946, 5, 116, 0, 0, 5946, 5947, 1, 0, 0, 0, 5947, 5948, 6, 526, 126, 0, 5948, 1059, 1, 0, 0, 0, 5949, 5950, 5, 108, 0, 0, 5950, 5951, 5, 116, 0, 0, 5951, 5952, 1, 0, 0, 0, 5952, 5953, 6, 527, 127, 0, 5953, 1061, 1, 0, 0, 0, 5954, 5955, 5, 109, 0, 0, 5955, 5956, 5, 97, 0, 0, 5956, 5957, 5, 112, 0, 0, 5957, 5958, 1, 0, 0, 0, 5958, 5959, 6, 528, 128, 0, 5959, 1063, 1, 0, 0, 0, 5960, 5961, 5, 109, 0, 0, 5961, 5962, 5, 111, 0, 0, 5962, 5963, 5, 100, 0, 0, 5963, 5964, 1, 0, 0, 0, 5964, 5965, 6, 529, 129, 0, 5965, 1065, 1, 0, 0, 0, 5966, 5967, 5, 109, 0, 0, 5967, 5968, 5, 111, 0, 0, 5968, 5969, 5, 100, 0, 0, 5969, 5970, 5, 117, 0, 0, 5970, 5971, 5, 108, 0, 0, 5971, 5972, 5, 101, 0, 0, 5972, 5973, 1, 0, 0, 0, 5973, 5974, 6, 530, 130, 0, 5974, 1067, 1, 0, 0, 0, 5975, 5976, 5, 110, 0, 0, 5976, 5977, 5, 97, 0, 0, 5977, 5978, 5, 109, 0, 0, 5978, 5979, 5, 101, 0, 0, 5979, 5980, 5, 115, 0, 0, 5980, 5981, 5, 112, 0, 0, 5981, 5982, 5, 97, 0, 0, 5982, 5983, 5, 99, 0, 0, 5983, 5984, 5, 101, 0, 0, 5984, 5985, 1, 0, 0, 0, 5985, 5986, 6, 531, 131, 0, 5986, 1069, 1, 0, 0, 0, 5987, 5988, 5, 110, 0, 0, 5988, 5989, 5, 101, 0, 0, 5989, 5990, 1, 0, 0, 0, 5990, 5991, 6, 532, 132, 0, 5991, 1071, 1, 0, 0, 0, 5992, 5993, 5, 110, 0, 0, 5993, 5994, 5, 101, 0, 0, 5994, 5995, 5, 120, 0, 0, 5995, 5996, 5, 116, 0, 0, 5996, 5997, 1, 0, 0, 0, 5997, 5998, 6, 533, 133, 0, 5998, 1073, 1, 0, 0, 0, 5999, 6000, 5, 110, 0, 0, 6000, 6001, 5, 97, 0, 0, 6001, 6002, 5, 109, 0, 0, 6002, 6003, 5, 101, 0, 0, 6003, 6004, 5, 115, 0, 0, 6004, 6005, 5, 112, 0, 0, 6005, 6006, 5, 97, 0, 0, 6006, 6007, 5, 99, 0, 0, 6007, 6008, 5, 101, 0, 0, 6008, 6009, 5, 45, 0, 0, 6009, 6010, 5, 110, 0, 0, 6010, 6011, 5, 111, 0, 0, 6011, 6012, 5, 100, 0, 0, 6012, 6013, 5, 101, 0, 0, 6013, 6014, 1, 0, 0, 0, 6014, 6015, 6, 534, 134, 0, 6015, 1075, 1, 0, 0, 0, 6016, 6017, 5, 110, 0, 0, 6017, 6018, 5, 111, 0, 0, 6018, 6019, 5, 45, 0, 0, 6019, 6020, 5, 105, 0, 0, 6020, 6021, 5, 110, 0, 0, 6021, 6022, 5, 104, 0, 0, 6022, 6023, 5, 101, 0, 0, 6023, 6024, 5, 114, 0, 0, 6024, 6025, 5, 105, 0, 0, 6025, 6026, 5, 116, 0, 0, 6026, 6027, 1, 0, 0, 0, 6027, 6028, 6, 535, 135, 0, 6028, 1077, 1, 0, 0, 0, 6029, 6030, 5, 110, 0, 0, 6030, 6031, 5, 111, 0, 0, 6031, 6032, 5, 45, 0, 0, 6032, 6033, 5, 112, 0, 0, 6033, 6034, 5, 114, 0, 0, 6034, 6035, 5, 101, 0, 0, 6035, 6036, 5, 115, 0, 0, 6036, 6037, 5, 101, 0, 0, 6037, 6038, 5, 114, 0, 0, 6038, 6039, 5, 118, 0, 0, 6039, 6040, 5, 101, 0, 0, 6040, 6041, 1, 0, 0, 0, 6041, 6042, 6, 536, 136, 0, 6042, 1079, 1, 0, 0, 0, 6043, 6044, 5, 110, 0, 0, 6044, 6045, 5, 111, 0, 0, 6045, 6046, 5, 100, 0, 0, 6046, 6047, 5, 101, 0, 0, 6047, 6048, 1, 0, 0, 0, 6048, 6049, 6, 537, 137, 0, 6049, 1081, 1, 0, 0, 0, 6050, 6051, 5, 111, 0, 0, 6051, 6052, 5, 102, 0, 0, 6052, 6053, 1, 0, 0, 0, 6053, 6054, 6, 538, 138, 0, 6054, 1083, 1, 0, 0, 0, 6055, 6056, 5, 111, 0, 0, 6056, 6057, 5, 110, 0, 0, 6057, 6058, 5, 108, 0, 0, 6058, 6059, 5, 121, 0, 0, 6059, 6060, 1, 0, 0, 0, 6060, 6061, 6, 539, 139, 0, 6061, 1085, 1, 0, 0, 0, 6062, 6063, 5, 111, 0, 0, 6063, 6064, 5, 112, 0, 0, 6064, 6065, 5, 116, 0, 0, 6065, 6066, 5, 105, 0, 0, 6066, 6067, 5, 111, 0, 0, 6067, 6068, 5, 110, 0, 0, 6068, 6069, 1, 0, 0, 0, 6069, 6070, 6, 540, 140, 0, 6070, 1087, 1, 0, 0, 0, 6071, 6072, 5, 111, 0, 0, 6072, 6073, 5, 114, 0, 0, 6073, 6074, 1, 0, 0, 0, 6074, 6075, 6, 541, 141, 0, 6075, 1089, 1, 0, 0, 0, 6076, 6077, 5, 111, 0, 0, 6077, 6078, 5, 114, 0, 0, 6078, 6079, 5, 100, 0, 0, 6079, 6080, 5, 101, 0, 0, 6080, 6081, 5, 114, 0, 0, 6081, 6082, 1, 0, 0, 0, 6082, 6083, 6, 542, 142, 0, 6083, 1091, 1, 0, 0, 0, 6084, 6085, 5, 111, 0, 0, 6085, 6086, 5, 114, 0, 0, 6086, 6087, 5, 100, 0, 0, 6087, 6088, 5, 101, 0, 0, 6088, 6089, 5, 114, 0, 0, 6089, 6090, 5, 101, 0, 0, 6090, 6091, 5, 100, 0, 0, 6091, 6092, 1, 0, 0, 0, 6092, 6093, 6, 543, 143, 0, 6093, 1093, 1, 0, 0, 0, 6094, 6095, 5, 111, 0, 0, 6095, 6096, 5, 114, 0, 0, 6096, 6097, 5, 100, 0, 0, 6097, 6098, 5, 101, 0, 0, 6098, 6099, 5, 114, 0, 0, 6099, 6100, 5, 105, 0, 0, 6100, 6101, 5, 110, 0, 0, 6101, 6102, 5, 103, 0, 0, 6102, 6103, 1, 0, 0, 0, 6103, 6104, 6, 544, 144, 0, 6104, 1095, 1, 0, 0, 0, 6105, 6106, 5, 112, 0, 0, 6106, 6107, 5, 97, 0, 0, 6107, 6108, 5, 114, 0, 0, 6108, 6109, 5, 101, 0, 0, 6109, 6110, 5, 110, 0, 0, 6110, 6111, 5, 116, 0, 0, 6111, 6112, 1, 0, 0, 0, 6112, 6113, 6, 545, 145, 0, 6113, 1097, 1, 0, 0, 0, 6114, 6115, 5, 112, 0, 0, 6115, 6116, 5, 114, 0, 0, 6116, 6117, 5, 101, 0, 0, 6117, 6118, 5, 99, 0, 0, 6118, 6119, 5, 101, 0, 0, 6119, 6120, 5, 100, 0, 0, 6120, 6121, 5, 105, 0, 0, 6121, 6122, 5, 110, 0, 0, 6122, 6123, 5, 103, 0, 0, 6123, 6124, 1, 0, 0, 0, 6124, 6125, 6, 546, 146, 0, 6125, 1099, 1, 0, 0, 0, 6126, 6127, 5, 112, 0, 0, 6127, 6128, 5, 114, 0, 0, 6128, 6129, 5, 101, 0, 0, 6129, 6130, 5, 99, 0, 0, 6130, 6131, 5, 101, 0, 0, 6131, 6132, 5, 100, 0, 0, 6132, 6133, 5, 105, 0, 0, 6133, 6134, 5, 110, 0, 0, 6134, 6135, 5, 103, 0, 0, 6135, 6136, 5, 45, 0, 0, 6136, 6137, 5, 115, 0, 0, 6137, 6138, 5, 105, 0, 0, 6138, 6139, 5, 98, 0, 0, 6139, 6140, 5, 108, 0, 0, 6140, 6141, 5, 105, 0, 0, 6141, 6142, 5, 110, 0, 0, 6142, 6143, 5, 103, 0, 0, 6143, 6144, 1, 0, 0, 0, 6144, 6145, 6, 547, 147, 0, 6145, 1101, 1, 0, 0, 0, 6146, 6147, 5, 112, 0, 0, 6147, 6148, 5, 114, 0, 0, 6148, 6149, 5, 101, 0, 0, 6149, 6150, 5, 115, 0, 0, 6150, 6151, 5, 101, 0, 0, 6151, 6152, 5, 114, 0, 0, 6152, 6153, 5, 118, 0, 0, 6153, 6154, 5, 101, 0, 0, 6154, 6155, 1, 0, 0, 0, 6155, 6156, 6, 548, 148, 0, 6156, 1103, 1, 0, 0, 0, 6157, 6158, 5, 112, 0, 0, 6158, 6159, 5, 114, 0, 0, 6159, 6160, 5, 101, 0, 0, 6160, 6161, 5, 118, 0, 0, 6161, 6162, 5, 105, 0, 0, 6162, 6163, 5, 111, 0, 0, 6163, 6164, 5, 117, 0, 0, 6164, 6165, 5, 115, 0, 0, 6165, 6166, 1, 0, 0, 0, 6166, 6167, 6, 549, 149, 0, 6167, 1105, 1, 0, 0, 0, 6168, 6169, 5, 112, 0, 0, 6169, 6170, 5, 114, 0, 0, 6170, 6171, 5, 111, 0, 0, 6171, 6172, 5, 99, 0, 0, 6172, 6173, 5, 101, 0, 0, 6173, 6174, 5, 115, 0, 0, 6174, 6175, 5, 115, 0, 0, 6175, 6176, 5, 105, 0, 0, 6176, 6177, 5, 110, 0, 0, 6177, 6178, 5, 103, 0, 0, 6178, 6179, 5, 45, 0, 0, 6179, 6180, 5, 105, 0, 0, 6180, 6181, 5, 110, 0, 0, 6181, 6182, 5, 115, 0, 0, 6182, 6183, 5, 116, 0, 0, 6183, 6184, 5, 114, 0, 0, 6184, 6185, 5, 117, 0, 0, 6185, 6186, 5, 99, 0, 0, 6186, 6187, 5, 116, 0, 0, 6187, 6188, 5, 105, 0, 0, 6188, 6189, 5, 111, 0, 0, 6189, 6190, 5, 110, 0, 0, 6190, 6191, 1, 0, 0, 0, 6191, 6192, 6, 550, 150, 0, 6192, 1107, 1, 0, 0, 0, 6193, 6194, 5, 114, 0, 0, 6194, 6195, 5, 101, 0, 0, 6195, 6196, 5, 116, 0, 0, 6196, 6197, 5, 117, 0, 0, 6197, 6198, 5, 114, 0, 0, 6198, 6199, 5, 110, 0, 0, 6199, 6200, 1, 0, 0, 0, 6200, 6201, 6, 551, 151, 0, 6201, 1109, 1, 0, 0, 0, 6202, 6203, 5, 115, 0, 0, 6203, 6204, 5, 97, 0, 0, 6204, 6205, 5, 116, 0, 0, 6205, 6206, 5, 105, 0, 0, 6206, 6207, 5, 115, 0, 0, 6207, 6208, 5, 102, 0, 0, 6208, 6209, 5, 105, 0, 0, 6209, 6210, 5, 101, 0, 0, 6210, 6211, 5, 115, 0, 0, 6211, 6212, 1, 0, 0, 0, 6212, 6213, 6, 552, 152, 0, 6213, 1111, 1, 0, 0, 0, 6214, 6215, 5, 115, 0, 0, 6215, 6216, 5, 99, 0, 0, 6216, 6217, 5, 104, 0, 0, 6217, 6218, 5, 101, 0, 0, 6218, 6219, 5, 109, 0, 0, 6219, 6220, 5, 97, 0, 0, 6220, 6221, 1, 0, 0, 0, 6221, 6222, 6, 553, 153, 0, 6222, 1113, 1, 0, 0, 0, 6223, 6224, 5, 115, 0, 0, 6224, 6225, 5, 99, 0, 0, 6225, 6226, 5, 104, 0, 0, 6226, 6227, 5, 101, 0, 0, 6227, 6228, 5, 109, 0, 0, 6228, 6229, 5, 97, 0, 0, 6229, 6230, 5, 45, 0, 0, 6230, 6231, 5, 97, 0, 0, 6231, 6232, 5, 116, 0, 0, 6232, 6233, 5, 116, 0, 0, 6233, 6234, 5, 114, 0, 0, 6234, 6235, 5, 105, 0, 0, 6235, 6236, 5, 98, 0, 0, 6236, 6237, 5, 117, 0, 0, 6237, 6238, 5, 116, 0, 0, 6238, 6239, 5, 101, 0, 0, 6239, 6240, 1, 0, 0, 0, 6240, 6241, 6, 554, 154, 0, 6241, 1115, 1, 0, 0, 0, 6242, 6243, 5, 115, 0, 0, 6243, 6244, 5, 99, 0, 0, 6244, 6245, 5, 104, 0, 0, 6245, 6246, 5, 101, 0, 0, 6246, 6247, 5, 109, 0, 0, 6247, 6248, 5, 97, 0, 0, 6248, 6249, 5, 45, 0, 0, 6249, 6250, 5, 101, 0, 0, 6250, 6251, 5, 108, 0, 0, 6251, 6252, 5, 101, 0, 0, 6252, 6253, 5, 109, 0, 0, 6253, 6254, 5, 101, 0, 0, 6254, 6255, 5, 110, 0, 0, 6255, 6256, 5, 116, 0, 0, 6256, 6257, 1, 0, 0, 0, 6257, 6258, 6, 555, 155, 0, 6258, 1117, 1, 0, 0, 0, 6259, 6260, 5, 115, 0, 0, 6260, 6261, 5, 101, 0, 0, 6261, 6262, 5, 108, 0, 0, 6262, 6263, 5, 102, 0, 0, 6263, 6264, 1, 0, 0, 0, 6264, 6265, 6, 556, 156, 0, 6265, 1119, 1, 0, 0, 0, 6266, 6267, 5, 115, 0, 0, 6267, 6268, 5, 108, 0, 0, 6268, 6269, 5, 105, 0, 0, 6269, 6270, 5, 100, 0, 0, 6270, 6271, 5, 105, 0, 0, 6271, 6272, 5, 110, 0, 0, 6272, 6273, 5, 103, 0, 0, 6273, 6274, 1, 0, 0, 0, 6274, 6275, 6, 557, 157, 0, 6275, 1121, 1, 0, 0, 0, 6276, 6277, 5, 115, 0, 0, 6277, 6278, 5, 111, 0, 0, 6278, 6279, 5, 109, 0, 0, 6279, 6280, 5, 101, 0, 0, 6280, 6281, 1, 0, 0, 0, 6281, 6282, 6, 558, 158, 0, 6282, 1123, 1, 0, 0, 0, 6283, 6284, 5, 115, 0, 0, 6284, 6285, 5, 116, 0, 0, 6285, 6286, 5, 97, 0, 0, 6286, 6287, 5, 98, 0, 0, 6287, 6288, 5, 108, 0, 0, 6288, 6289, 5, 101, 0, 0, 6289, 6290, 1, 0, 0, 0, 6290, 6291, 6, 559, 159, 0, 6291, 1125, 1, 0, 0, 0, 6292, 6293, 5, 115, 0, 0, 6293, 6294, 5, 116, 0, 0, 6294, 6295, 5, 97, 0, 0, 6295, 6296, 5, 114, 0, 0, 6296, 6297, 5, 116, 0, 0, 6297, 6298, 1, 0, 0, 0, 6298, 6299, 6, 560, 160, 0, 6299, 1127, 1, 0, 0, 0, 6300, 6301, 5, 115, 0, 0, 6301, 6302, 5, 116, 0, 0, 6302, 6303, 5, 114, 0, 0, 6303, 6304, 5, 105, 0, 0, 6304, 6305, 5, 99, 0, 0, 6305, 6306, 5, 116, 0, 0, 6306, 6307, 1, 0, 0, 0, 6307, 6308, 6, 561, 161, 0, 6308, 1129, 1, 0, 0, 0, 6309, 6310, 5, 115, 0, 0, 6310, 6311, 5, 116, 0, 0, 6311, 6312, 5, 114, 0, 0, 6312, 6313, 5, 105, 0, 0, 6313, 6314, 5, 112, 0, 0, 6314, 6315, 1, 0, 0, 0, 6315, 6316, 6, 562, 162, 0, 6316, 1131, 1, 0, 0, 0, 6317, 6318, 5, 115, 0, 0, 6318, 6319, 5, 119, 0, 0, 6319, 6320, 5, 105, 0, 0, 6320, 6321, 5, 116, 0, 0, 6321, 6322, 5, 99, 0, 0, 6322, 6323, 5, 104, 0, 0, 6323, 6324, 1, 0, 0, 0, 6324, 6325, 6, 563, 163, 0, 6325, 1133, 1, 0, 0, 0, 6326, 6327, 5, 116, 0, 0, 6327, 6328, 5, 101, 0, 0, 6328, 6329, 5, 120, 0, 0, 6329, 6330, 5, 116, 0, 0, 6330, 6331, 1, 0, 0, 0, 6331, 6332, 6, 564, 164, 0, 6332, 1135, 1, 0, 0, 0, 6333, 6334, 5, 116, 0, 0, 6334, 6335, 5, 104, 0, 0, 6335, 6336, 5, 101, 0, 0, 6336, 6337, 5, 110, 0, 0, 6337, 6338, 1, 0, 0, 0, 6338, 6339, 6, 565, 165, 0, 6339, 1137, 1, 0, 0, 0, 6340, 6341, 5, 116, 0, 0, 6341, 6342, 5, 111, 0, 0, 6342, 6343, 1, 0, 0, 0, 6343, 6344, 6, 566, 166, 0, 6344, 1139, 1, 0, 0, 0, 6345, 6346, 5, 116, 0, 0, 6346, 6347, 5, 114, 0, 0, 6347, 6348, 5, 101, 0, 0, 6348, 6349, 5, 97, 0, 0, 6349, 6350, 5, 116, 0, 0, 6350, 6351, 1, 0, 0, 0, 6351, 6352, 6, 567, 167, 0, 6352, 1141, 1, 0, 0, 0, 6353, 6354, 5, 116, 0, 0, 6354, 6355, 5, 114, 0, 0, 6355, 6356, 5, 121, 0, 0, 6356, 6357, 1, 0, 0, 0, 6357, 6358, 6, 568, 168, 0, 6358, 1143, 1, 0, 0, 0, 6359, 6360, 5, 116, 0, 0, 6360, 6361, 5, 117, 0, 0, 6361, 6362, 5, 109, 0, 0, 6362, 6363, 5, 98, 0, 0, 6363, 6364, 5, 108, 0, 0, 6364, 6365, 5, 105, 0, 0, 6365, 6366, 5, 110, 0, 0, 6366, 6367, 5, 103, 0, 0, 6367, 6368, 1, 0, 0, 0, 6368, 6369, 6, 569, 169, 0, 6369, 1145, 1, 0, 0, 0, 6370, 6371, 5, 116, 0, 0, 6371, 6372, 5, 121, 0, 0, 6372, 6373, 5, 112, 0, 0, 6373, 6374, 5, 101, 0, 0, 6374, 6375, 1, 0, 0, 0, 6375, 6376, 6, 570, 170, 0, 6376, 1147, 1, 0, 0, 0, 6377, 6378, 5, 116, 0, 0, 6378, 6379, 5, 121, 0, 0, 6379, 6380, 5, 112, 0, 0, 6380, 6381, 5, 101, 0, 0, 6381, 6382, 5, 115, 0, 0, 6382, 6383, 5, 119, 0, 0, 6383, 6384, 5, 105, 0, 0, 6384, 6385, 5, 116, 0, 0, 6385, 6386, 5, 99, 0, 0, 6386, 6387, 5, 104, 0, 0, 6387, 6388, 1, 0, 0, 0, 6388, 6389, 6, 571, 171, 0, 6389, 1149, 1, 0, 0, 0, 6390, 6391, 5, 117, 0, 0, 6391, 6392, 5, 110, 0, 0, 6392, 6393, 5, 105, 0, 0, 6393, 6394, 5, 111, 0, 0, 6394, 6395, 5, 110, 0, 0, 6395, 6396, 1, 0, 0, 0, 6396, 6397, 6, 572, 172, 0, 6397, 1151, 1, 0, 0, 0, 6398, 6399, 5, 117, 0, 0, 6399, 6400, 5, 110, 0, 0, 6400, 6401, 5, 111, 0, 0, 6401, 6402, 5, 114, 0, 0, 6402, 6403, 5, 100, 0, 0, 6403, 6404, 5, 101, 0, 0, 6404, 6405, 5, 114, 0, 0, 6405, 6406, 5, 101, 0, 0, 6406, 6407, 5, 100, 0, 0, 6407, 6408, 1, 0, 0, 0, 6408, 6409, 6, 573, 173, 0, 6409, 1153, 1, 0, 0, 0, 6410, 6411, 5, 117, 0, 0, 6411, 6412, 5, 112, 0, 0, 6412, 6413, 5, 100, 0, 0, 6413, 6414, 5, 97, 0, 0, 6414, 6415, 5, 116, 0, 0, 6415, 6416, 5, 101, 0, 0, 6416, 6417, 1, 0, 0, 0, 6417, 6418, 6, 574, 174, 0, 6418, 1155, 1, 0, 0, 0, 6419, 6420, 5, 118, 0, 0, 6420, 6421, 5, 97, 0, 0, 6421, 6422, 5, 108, 0, 0, 6422, 6423, 5, 105, 0, 0, 6423, 6424, 5, 100, 0, 0, 6424, 6425, 5, 97, 0, 0, 6425, 6426, 5, 116, 0, 0, 6426, 6427, 5, 101, 0, 0, 6427, 6428, 1, 0, 0, 0, 6428, 6429, 6, 575, 175, 0, 6429, 1157, 1, 0, 0, 0, 6430, 6431, 5, 118, 0, 0, 6431, 6432, 5, 97, 0, 0, 6432, 6433, 5, 114, 0, 0, 6433, 6434, 5, 105, 0, 0, 6434, 6435, 5, 97, 0, 0, 6435, 6436, 5, 98, 0, 0, 6436, 6437, 5, 108, 0, 0, 6437, 6438, 5, 101, 0, 0, 6438, 6439, 1, 0, 0, 0, 6439, 6440, 6, 576, 176, 0, 6440, 1159, 1, 0, 0, 0, 6441, 6442, 5, 118, 0, 0, 6442, 6443, 5, 101, 0, 0, 6443, 6444, 5, 114, 0, 0, 6444, 6445, 5, 115, 0, 0, 6445, 6446, 5, 105, 0, 0, 6446, 6447, 5, 111, 0, 0, 6447, 6448, 5, 110, 0, 0, 6448, 6449, 1, 0, 0, 0, 6449, 6450, 6, 577, 177, 0, 6450, 1161, 1, 0, 0, 0, 6451, 6452, 5, 119, 0, 0, 6452, 6453, 5, 104, 0, 0, 6453, 6454, 5, 101, 0, 0, 6454, 6455, 5, 110, 0, 0, 6455, 6456, 1, 0, 0, 0, 6456, 6457, 6, 578, 178, 0, 6457, 1163, 1, 0, 0, 0, 6458, 6459, 5, 119, 0, 0, 6459, 6460, 5, 104, 0, 0, 6460, 6461, 5, 101, 0, 0, 6461, 6462, 5, 114, 0, 0, 6462, 6463, 5, 101, 0, 0, 6463, 6464, 1, 0, 0, 0, 6464, 6465, 6, 579, 179, 0, 6465, 1165, 1, 0, 0, 0, 6466, 6467, 5, 119, 0, 0, 6467, 6468, 5, 105, 0, 0, 6468, 6469, 5, 110, 0, 0, 6469, 6470, 5, 100, 0, 0, 6470, 6471, 5, 111, 0, 0, 6471, 6472, 5, 119, 0, 0, 6472, 6473, 1, 0, 0, 0, 6473, 6474, 6, 580, 180, 0, 6474, 1167, 1, 0, 0, 0, 6475, 6476, 5, 120, 0, 0, 6476, 6477, 5, 113, 0, 0, 6477, 6478, 5, 117, 0, 0, 6478, 6479, 5, 101, 0, 0, 6479, 6480, 5, 114, 0, 0, 6480, 6481, 5, 121, 0, 0, 6481, 6482, 1, 0, 0, 0, 6482, 6483, 6, 581, 181, 0, 6483, 1169, 1, 0, 0, 0, 6484, 6485, 5, 97, 0, 0, 6485, 6486, 5, 114, 0, 0, 6486, 6487, 5, 114, 0, 0, 6487, 6488, 5, 97, 0, 0, 6488, 6489, 5, 121, 0, 0, 6489, 6490, 5, 45, 0, 0, 6490, 6491, 5, 110, 0, 0, 6491, 6492, 5, 111, 0, 0, 6492, 6493, 5, 100, 0, 0, 6493, 6494, 5, 101, 0, 0, 6494, 6495, 1, 0, 0, 0, 6495, 6496, 6, 582, 182, 0, 6496, 1171, 1, 0, 0, 0, 6497, 6498, 5, 98, 0, 0, 6498, 6499, 5, 111, 0, 0, 6499, 6500, 5, 111, 0, 0, 6500, 6501, 5, 108, 0, 0, 6501, 6502, 5, 101, 0, 0, 6502, 6503, 5, 97, 0, 0, 6503, 6504, 5, 110, 0, 0, 6504, 6505, 5, 45, 0, 0, 6505, 6506, 5, 110, 0, 0, 6506, 6507, 5, 111, 0, 0, 6507, 6508, 5, 100, 0, 0, 6508, 6509, 5, 101, 0, 0, 6509, 6510, 1, 0, 0, 0, 6510, 6511, 6, 583, 183, 0, 6511, 1173, 1, 0, 0, 0, 6512, 6513, 5, 110, 0, 0, 6513, 6514, 5, 117, 0, 0, 6514, 6515, 5, 108, 0, 0, 6515, 6516, 5, 108, 0, 0, 6516, 6517, 5, 45, 0, 0, 6517, 6518, 5, 110, 0, 0, 6518, 6519, 5, 111, 0, 0, 6519, 6520, 5, 100, 0, 0, 6520, 6521, 5, 101, 0, 0, 6521, 6522, 1, 0, 0, 0, 6522, 6523, 6, 584, 184, 0, 6523, 1175, 1, 0, 0, 0, 6524, 6525, 5, 110, 0, 0, 6525, 6526, 5, 117, 0, 0, 6526, 6527, 5, 109, 0, 0, 6527, 6528, 5, 98, 0, 0, 6528, 6529, 5, 101, 0, 0, 6529, 6530, 5, 114, 0, 0, 6530, 6531, 5, 45, 0, 0, 6531, 6532, 5, 110, 0, 0, 6532, 6533, 5, 111, 0, 0, 6533, 6534, 5, 100, 0, 0, 6534, 6535, 5, 101, 0, 0, 6535, 6536, 1, 0, 0, 0, 6536, 6537, 6, 585, 185, 0, 6537, 1177, 1, 0, 0, 0, 6538, 6539, 5, 111, 0, 0, 6539, 6540, 5, 98, 0, 0, 6540, 6541, 5, 106, 0, 0, 6541, 6542, 5, 101, 0, 0, 6542, 6543, 5, 99, 0, 0, 6543, 6544, 5, 116, 0, 0, 6544, 6545, 5, 45, 0, 0, 6545, 6546, 5, 110, 0, 0, 6546, 6547, 5, 111, 0, 0, 6547, 6548, 5, 100, 0, 0, 6548, 6549, 5, 101, 0, 0, 6549, 6550, 1, 0, 0, 0, 6550, 6551, 6, 586, 186, 0, 6551, 1179, 1, 0, 0, 0, 6552, 6553, 5, 114, 0, 0, 6553, 6554, 5, 101, 0, 0, 6554, 6555, 5, 112, 0, 0, 6555, 6556, 5, 108, 0, 0, 6556, 6557, 5, 97, 0, 0, 6557, 6558, 5, 99, 0, 0, 6558, 6559, 5, 101, 0, 0, 6559, 6560, 1, 0, 0, 0, 6560, 6561, 6, 587, 187, 0, 6561, 1181, 1, 0, 0, 0, 6562, 6563, 5, 119, 0, 0, 6563, 6564, 5, 105, 0, 0, 6564, 6565, 5, 116, 0, 0, 6565, 6566, 5, 104, 0, 0, 6566, 6567, 1, 0, 0, 0, 6567, 6568, 6, 588, 188, 0, 6568, 1183, 1, 0, 0, 0, 6569, 6570, 5, 118, 0, 0, 6570, 6571, 5, 97, 0, 0, 6571, 6572, 5, 108, 0, 0, 6572, 6573, 5, 117, 0, 0, 6573, 6574, 5, 101, 0, 0, 6574, 6575, 1, 0, 0, 0, 6575, 6576, 6, 589, 189, 0, 6576, 1185, 1, 0, 0, 0, 6577, 6578, 5, 105, 0, 0, 6578, 6579, 5, 110, 0, 0, 6579, 6580, 5, 115, 0, 0, 6580, 6581, 5, 101, 0, 0, 6581, 6582, 5, 114, 0, 0, 6582, 6583, 5, 116, 0, 0, 6583, 6584, 1, 0, 0, 0, 6584, 6585, 6, 590, 190, 0, 6585, 1187, 1, 0, 0, 0, 6586, 6587, 5, 105, 0, 0, 6587, 6588, 5, 110, 0, 0, 6588, 6589, 5, 116, 0, 0, 6589, 6590, 5, 111, 0, 0, 6590, 6591, 1, 0, 0, 0, 6591, 6592, 6, 591, 191, 0, 6592, 1189, 1, 0, 0, 0, 6593, 6594, 5, 100, 0, 0, 6594, 6595, 5, 101, 0, 0, 6595, 6596, 5, 108, 0, 0, 6596, 6597, 5, 101, 0, 0, 6597, 6598, 5, 116, 0, 0, 6598, 6599, 5, 101, 0, 0, 6599, 6600, 1, 0, 0, 0, 6600, 6601, 6, 592, 192, 0, 6601, 1191, 1, 0, 0, 0, 6602, 6603, 5, 114, 0, 0, 6603, 6604, 5, 101, 0, 0, 6604, 6605, 5, 110, 0, 0, 6605, 6606, 5, 97, 0, 0, 6606, 6607, 5, 109, 0, 0, 6607, 6608, 5, 101, 0, 0, 6608, 6609, 1, 0, 0, 0, 6609, 6610, 6, 593, 193, 0, 6610, 1193, 1, 0, 0, 0, 6611, 6612, 5, 81, 0, 0, 6612, 6618, 5, 123, 0, 0, 6613, 6617, 3, 16, 5, 0, 6614, 6617, 3, 18, 6, 0, 6615, 6617, 8, 9, 0, 0, 6616, 6613, 1, 0, 0, 0, 6616, 6614, 1, 0, 0, 0, 6616, 6615, 1, 0, 0, 0, 6617, 6620, 1, 0, 0, 0, 6618, 6616, 1, 0, 0, 0, 6618, 6619, 1, 0, 0, 0, 6619, 6621, 1, 0, 0, 0, 6620, 6618, 1, 0, 0, 0, 6621, 6622, 5, 125, 0, 0, 6622, 6623, 3, 374, 184, 0, 6623, 6624, 1, 0, 0, 0, 6624, 6625, 6, 594, 194, 0, 6625, 1195, 1, 0, 0, 0, 6626, 6627, 3, 374, 184, 0, 6627, 6628, 5, 58, 0, 0, 6628, 6629, 3, 374, 184, 0, 6629, 6630, 1, 0, 0, 0, 6630, 6631, 6, 595, 195, 0, 6631, 1197, 1, 0, 0, 0, 6632, 6633, 3, 374, 184, 0, 6633, 6634, 5, 58, 0, 0, 6634, 6635, 5, 42, 0, 0, 6635, 6636, 1, 0, 0, 0, 6636, 6637, 6, 596, 196, 0, 6637, 1199, 1, 0, 0, 0, 6638, 6639, 5, 42, 0, 0, 6639, 6640, 5, 58, 0, 0, 6640, 6641, 3, 374, 184, 0, 6641, 6642, 1, 0, 0, 0, 6642, 6643, 6, 597, 197, 0, 6643, 1201, 1, 0, 0, 0, 6644, 6648, 3, 376, 185, 0, 6645, 6647, 3, 378, 186, 0, 6646, 6645, 1, 0, 0, 0, 6647, 6650, 1, 0, 0, 0, 6648, 6646, 1, 0, 0, 0, 6648, 6649, 1, 0, 0, 0, 6649, 6651, 1, 0, 0, 0, 6650, 6648, 1, 0, 0, 0, 6651, 6652, 6, 598, 198, 0, 6652, 1203, 1, 0, 0, 0, 6653, 6654, 5, 40, 0, 0, 6654, 6655, 5, 58, 0, 0, 6655, 6656, 5, 126, 0, 0, 6656, 6657, 1, 0, 0, 0, 6657, 6658, 6, 599, 199, 0, 6658, 1205, 1, 0, 0, 0, 6659, 6661, 5, 58, 0, 0, 6660, 6659, 1, 0, 0, 0, 6661, 6662, 1, 0, 0, 0, 6662, 6660, 1, 0, 0, 0, 6662, 6663, 1, 0, 0, 0, 6663, 6664, 1, 0, 0, 0, 6664, 6665, 5, 41, 0, 0, 6665, 6666, 1, 0, 0, 0, 6666, 6667, 6, 600, 200, 0, 6667, 1207, 1, 0, 0, 0, 6668, 6669, 5, 40, 0, 0, 6669, 6670, 5, 58, 0, 0, 6670, 6676, 5, 126, 0, 0, 6671, 6675, 3, 388, 191, 0, 6672, 6673, 5, 58, 0, 0, 6673, 6675, 8, 12, 0, 0, 6674, 6671, 1, 0, 0, 0, 6674, 6672, 1, 0, 0, 0, 6675, 6678, 1, 0, 0, 0, 6676, 6674, 1, 0, 0, 0, 6676, 6677, 1, 0, 0, 0, 6677, 6679, 1, 0, 0, 0, 6678, 6676, 1, 0, 0, 0, 6679, 6680, 5, 58, 0, 0, 6680, 6681, 5, 41, 0, 0, 6681, 6682, 1, 0, 0, 0, 6682, 6683, 6, 601, 201, 0, 6683, 1209, 1, 0, 0, 0, 6684, 6685, 5, 40, 0, 0, 6685, 6686, 5, 58, 0, 0, 6686, 6695, 8, 13, 0, 0, 6687, 6694, 3, 386, 190, 0, 6688, 6689, 5, 40, 0, 0, 6689, 6694, 8, 14, 0, 0, 6690, 6691, 5, 58, 0, 0, 6691, 6694, 8, 12, 0, 0, 6692, 6694, 8, 15, 0, 0, 6693, 6687, 1, 0, 0, 0, 6693, 6688, 1, 0, 0, 0, 6693, 6690, 1, 0, 0, 0, 6693, 6692, 1, 0, 0, 0, 6694, 6697, 1, 0, 0, 0, 6695, 6693, 1, 0, 0, 0, 6695, 6696, 1, 0, 0, 0, 6696, 6701, 1, 0, 0, 0, 6697, 6695, 1, 0, 0, 0, 6698, 6700, 5, 58, 0, 0, 6699, 6698, 1, 0, 0, 0, 6700, 6703, 1, 0, 0, 0, 6701, 6699, 1, 0, 0, 0, 6701, 6702, 1, 0, 0, 0, 6702, 6705, 1, 0, 0, 0, 6703, 6701, 1, 0, 0, 0, 6704, 6706, 5, 58, 0, 0, 6705, 6704, 1, 0, 0, 0, 6706, 6707, 1, 0, 0, 0, 6707, 6705, 1, 0, 0, 0, 6707, 6708, 1, 0, 0, 0, 6708, 6709, 1, 0, 0, 0, 6709, 6710, 5, 41, 0, 0, 6710, 6711, 1, 0, 0, 0, 6711, 6712, 6, 602, 2, 0, 6712, 6713, 6, 602, 202, 0, 6713, 1211, 1, 0, 0, 0, 6714, 6715, 7, 16, 0, 0, 6715, 6716, 1, 0, 0, 0, 6716, 6717, 6, 603, 203, 0, 6717, 1213, 1, 0, 0, 0, 6718, 6719, 3, 98, 46, 0, 6719, 6720, 3, 98, 46, 0, 6720, 6721, 3, 44, 19, 0, 6721, 6722, 1, 0, 0, 0, 6722, 6723, 6, 604, 3, 0, 6723, 6724, 6, 604, 204, 0, 6724, 1215, 1, 0, 0, 0, 6725, 6726, 3, 50, 22, 0, 6726, 6727, 3, 98, 46, 0, 6727, 6728, 1, 0, 0, 0, 6728, 6729, 6, 605, 4, 0, 6729, 6730, 6, 605, 205, 0, 6730, 1217, 1, 0, 0, 0, 6731, 6732, 8, 17, 0, 0, 6732, 6733, 1, 0, 0, 0, 6733, 6734, 6, 606, 17, 0, 6734, 1219, 1, 0, 0, 0, 116, 0, 1, 2, 3, 4, 5, 1229, 1232, 1241, 1244, 1246, 1250, 1376, 1381, 1399, 1409, 1419, 1422, 1440, 1442, 1459, 1462, 1475, 1478, 1496, 1507, 1512, 1519, 1522, 1530, 2641, 2643, 2665, 2669, 2673, 2682, 2692, 2694, 2709, 2711, 2717, 2723, 2814, 2826, 2836, 2839, 2892, 2904, 2914, 2917, 2936, 2939, 2950, 2953, 2955, 2959, 3087, 3107, 3119, 3129, 3132, 3160, 3162, 3181, 3184, 3199, 3202, 3222, 3235, 3240, 3247, 3250, 3260, 4711, 4713, 4743, 4757, 4769, 4771, 4788, 4790, 4796, 4802, 4841, 4844, 4855, 4858, 4860, 4864, 4992, 5012, 5024, 5034, 5037, 5065, 5067, 5086, 5089, 5104, 5107, 5127, 5140, 5145, 5152, 5155, 5165, 6616, 6618, 6648, 6662, 6674, 6676, 6693, 6695, 6701, 6707, 208, 5, 2, 0, 5, 3, 0, 0, 1, 0, 5, 1, 0, 4, 0, 0, 7, 50, 0, 7, 24, 0, 7, 25, 0, 5, 0, 0, 7, 1, 0, 7, 11, 0, 7, 3, 0, 7, 4, 0, 5, 4, 0, 7, 26, 0, 7, 9, 0, 7, 10, 0, 7, 196, 0, 7, 2, 0, 7, 12, 0, 5, 5, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, 18, 0, 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 1, 240, 0, 1, 242, 1, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 34, 0, 7, 35, 0, 7, 36, 0, 7, 37, 0, 7, 38, 0, 7, 39, 0, 7, 40, 0, 7, 41, 0, 7, 42, 0, 7, 43, 0, 7, 44, 0, 7, 45, 0, 7, 46, 0, 7, 47, 0, 7, 48, 0, 7, 49, 0, 7, 51, 0, 7, 52, 0, 7, 53, 0, 7, 54, 0, 7, 55, 0, 7, 56, 0, 7, 57, 0, 7, 58, 0, 7, 59, 0, 7, 60, 0, 7, 61, 0, 7, 62, 0, 7, 63, 0, 7, 64, 0, 7, 65, 0, 7, 66, 0, 7, 67, 0, 7, 68, 0, 7, 69, 0, 7, 70, 0, 7, 71, 0, 7, 72, 0, 7, 73, 0, 7, 74, 0, 7, 75, 0, 7, 76, 0, 7, 77, 0, 7, 78, 0, 7, 79, 0, 7, 80, 0, 7, 81, 0, 7, 82, 0, 7, 83, 0, 7, 84, 0, 7, 85, 0, 7, 86, 0, 7, 87, 0, 7, 88, 0, 7, 89, 0, 7, 90, 0, 7, 91, 0, 7, 92, 0, 7, 93, 0, 7, 94, 0, 7, 95, 0, 7, 96, 0, 7, 97, 0, 7, 98, 0, 7, 99, 0, 7, 100, 0, 7, 101, 0, 7, 102, 0, 7, 103, 0, 7, 104, 0, 7, 105, 0, 7, 106, 0, 7, 107, 0, 7, 108, 0, 7, 109, 0, 7, 110, 0, 7, 111, 0, 7, 112, 0, 7, 113, 0, 7, 114, 0, 7, 115, 0, 7, 116, 0, 7, 117, 0, 7, 118, 0, 7, 119, 0, 7, 120, 0, 7, 121, 0, 7, 122, 0, 7, 123, 0, 7, 124, 0, 7, 125, 0, 7, 126, 0, 7, 127, 0, 7, 128, 0, 7, 129, 0, 7, 130, 0, 7, 131, 0, 7, 132, 0, 7, 133, 0, 7, 134, 0, 7, 135, 0, 7, 136, 0, 7, 137, 0, 7, 138, 0, 7, 139, 0, 7, 140, 0, 7, 141, 0, 7, 142, 0, 7, 143, 0, 7, 144, 0, 7, 145, 0, 7, 146, 0, 7, 147, 0, 7, 148, 0, 7, 149, 0, 7, 150, 0, 7, 151, 0, 7, 152, 0, 7, 153, 0, 7, 154, 0, 7, 155, 0, 7, 156, 0, 7, 157, 0, 7, 158, 0, 7, 159, 0, 7, 160, 0, 7, 161, 0, 7, 162, 0, 7, 163, 0, 7, 164, 0, 7, 165, 0, 7, 166, 0, 7, 167, 0, 7, 168, 0, 7, 169, 0, 7, 170, 0, 7, 171, 0, 7, 172, 0, 7, 173, 0, 7, 174, 0, 7, 175, 0, 7, 176, 0, 7, 177, 0, 7, 178, 0, 7, 179, 0, 7, 180, 0, 7, 181, 0, 7, 182, 0, 7, 183, 0, 7, 184, 0, 7, 185, 0, 7, 186, 0, 7, 187, 0, 7, 188, 0, 7, 189, 0, 7, 190, 0, 7, 191, 0, 7, 192, 0, 7, 193, 0, 7, 194, 0, 7, 198, 0, 1, 434, 2, 1, 436, 3] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/XQueryParser.interp b/src/main/java/org/rumbledb/parser/XQueryParser.interp new file mode 100644 index 0000000000..265dac8da9 --- /dev/null +++ b/src/main/java/org/rumbledb/parser/XQueryParser.interp @@ -0,0 +1,659 @@ +token literal names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +EscapeQuot +EscapeApos +DOUBLE_LBRACE +DOUBLE_RBRACE +IntegerLiteral +DecimalLiteral +DoubleLiteral +DFPropertyName +PredefinedEntityRef +CharRef +Quot +Apos +COMMENT +XMLDECL +PI +CDATA +PRAGMA +WS +EQUAL +NOT_EQUAL +LPAREN +RPAREN +LBRACKET +RBRACKET +LBRACE +RBRACE +STAR +PLUS +MINUS +COMMA +DOT +DDOT +COLON +COLON_EQ +SEMICOLON +SLASH +DSLASH +BACKSLASH +VBAR +LANGLE +RANGLE +QUESTION +AT +DOLLAR +MOD +BANG +HASH +CARAT +ARROW +GRAVE +CONCATENATION +TILDE +KW_ALLOWING +KW_ANCESTOR +KW_ANCESTOR_OR_SELF +KW_AND +KW_ARRAY +KW_AS +KW_ASCENDING +KW_AT +KW_ATTRIBUTE +KW_BASE_URI +KW_BOUNDARY_SPACE +KW_BINARY +KW_BY +KW_CASE +KW_CAST +KW_CASTABLE +KW_CATCH +KW_CHILD +KW_COLLATION +KW_COMMENT +KW_CONSTRUCTION +KW_CONTEXT +KW_COPY_NS +KW_COUNT +KW_DECLARE +KW_DEFAULT +KW_DESCENDANT +KW_DESCENDANT_OR_SELF +KW_DESCENDING +KW_DECIMAL_FORMAT +KW_DIV +KW_DOCUMENT +KW_DOCUMENT_NODE +KW_ELEMENT +KW_ELSE +KW_EMPTY +KW_EMPTY_SEQUENCE +KW_ENCODING +KW_END +KW_EQ +KW_EVERY +KW_EXCEPT +KW_EXTERNAL +KW_FOLLOWING +KW_FOLLOWING_SIBLING +KW_FOR +KW_FUNCTION +KW_GE +KW_GREATEST +KW_GROUP +KW_GT +KW_IDIV +KW_IF +KW_IMPORT +KW_IN +KW_INHERIT +KW_INSTANCE +KW_INTERSECT +KW_IS +KW_ITEM +KW_LAX +KW_LE +KW_LEAST +KW_LET +KW_LT +KW_MAP +KW_MOD +KW_MODULE +KW_NAMESPACE +KW_NE +KW_NEXT +KW_NAMESPACE_NODE +KW_NO_INHERIT +KW_NO_PRESERVE +KW_NODE +KW_OF +KW_ONLY +KW_OPTION +KW_OR +KW_ORDER +KW_ORDERED +KW_ORDERING +KW_PARENT +KW_PRECEDING +KW_PRECEDING_SIBLING +KW_PRESERVE +KW_PREVIOUS +KW_PI +KW_RETURN +KW_SATISFIES +KW_SCHEMA +KW_SCHEMA_ATTR +KW_SCHEMA_ELEM +KW_SELF +KW_SLIDING +KW_SOME +KW_STABLE +KW_START +KW_STRICT +KW_STRIP +KW_SWITCH +KW_TEXT +KW_THEN +KW_TO +KW_TREAT +KW_TRY +KW_TUMBLING +KW_TYPE +KW_TYPESWITCH +KW_UNION +KW_UNORDERED +KW_UPDATE +KW_VALIDATE +KW_VARIABLE +KW_VERSION +KW_WHEN +KW_WHERE +KW_WINDOW +KW_XQUERY +KW_ARRAY_NODE +KW_BOOLEAN_NODE +KW_NULL_NODE +KW_NUMBER_NODE +KW_OBJECT_NODE +KW_REPLACE +KW_WITH +KW_VALUE +KW_INSERT +KW_INTO +KW_DELETE +KW_RENAME +URIQualifiedName +FullQName +NCNameWithLocalWildcard +NCNameWithPrefixWildcard +NCName +XQDOC_COMMENT_START +XQDOC_COMMENT_END +XQDocComment +XQComment +CHAR +ENTER_STRING +EXIT_INTERPOLATION +ContentChar +BASIC_CHAR +ENTER_INTERPOLATION +EXIT_STRING +EscapeQuot_QuotString +DOUBLE_LBRACE_QuotString +DOUBLE_RBRACE_QuotString +EscapeApos_AposString + +rule names: +module +xqDocComment +versionDecl +mainModule +queryBody +libraryModule +moduleDecl +prolog +annotatedDecl +defaultNamespaceDecl +setter +boundarySpaceDecl +defaultCollationDecl +baseURIDecl +constructionDecl +orderingModeDecl +emptyOrderDecl +copyNamespacesDecl +preserveMode +inheritMode +decimalFormatDecl +schemaImport +schemaPrefix +moduleImport +namespaceDecl +varDecl +varValue +varDefaultValue +contextItemDecl +functionDecl +functionParams +functionParam +annotations +annotation +annotList +annotationParam +functionReturn +optionDecl +expr +exprSingle +flworExpr +initialClause +intermediateClause +forClause +forBinding +allowingEmpty +positionalVar +letClause +letBinding +windowClause +tumblingWindowClause +slidingWindowClause +windowStartCondition +windowEndCondition +windowVars +countClause +whereClause +groupByClause +groupingSpecList +groupingSpec +orderByClause +orderSpec +returnClause +quantifiedExpr +quantifiedVar +switchExpr +switchCaseClause +switchCaseOperand +typeswitchExpr +caseClause +sequenceUnionType +ifExpr +tryCatchExpr +tryClause +enclosedTryTargetExpression +catchClause +enclosedExpression +catchErrorList +existUpdateExpr +existReplaceExpr +existValueExpr +existInsertExpr +existDeleteExpr +existRenameExpr +orExpr +andExpr +comparisonExpr +stringConcatExpr +rangeExpr +additiveExpr +multiplicativeExpr +unionExpr +intersectExceptExpr +instanceOfExpr +treatExpr +castableExpr +castExpr +arrowExpr +complexArrow +unaryExpr +valueExpr +generalComp +valueComp +nodeComp +validateExpr +validationMode +extensionExpr +simpleMapExpr +pathExpr +relativePathExpr +stepExpr +axisStep +forwardStep +forwardAxis +abbrevForwardStep +reverseStep +reverseAxis +abbrevReverseStep +nodeTest +nameTest +wildcard +postfixExpr +argumentList +predicateList +predicate +lookup +keySpecifier +arrowFunctionSpecifier +primaryExpr +literal +numericLiteral +varRef +varName +parenthesizedExpr +contextItemExpr +orderedExpr +unorderedExpr +functionCall +argument +nodeConstructor +directConstructor +dirElemConstructorOpenClose +dirElemConstructorSingleTag +dirAttributeList +dirAttributeValueApos +dirAttributeValueQuot +dirAttributeValue +dirAttributeContentQuot +dirAttributeContentApos +dirElemContent +commonContent +computedConstructor +compMLJSONConstructor +compMLJSONArrayConstructor +compMLJSONObjectConstructor +compMLJSONNumberConstructor +compMLJSONBooleanConstructor +compMLJSONNullConstructor +compBinaryConstructor +compDocConstructor +compElemConstructor +enclosedContentExpr +compAttrConstructor +compNamespaceConstructor +prefix +enclosedPrefixExpr +enclosedURIExpr +compTextConstructor +compCommentConstructor +compPIConstructor +functionItemExpr +namedFunctionRef +inlineFunctionRef +functionBody +mapConstructor +mapConstructorEntry +arrayConstructor +squareArrayConstructor +curlyArrayConstructor +stringConstructor +stringConstructorContent +charNoGrave +charNoLBrace +charNoRBrack +stringConstructorChars +stringConstructorInterpolation +unaryLookup +singleType +typeDeclaration +sequenceType +itemType +atomicOrUnionType +kindTest +anyKindTest +binaryNodeTest +documentTest +textTest +commentTest +namespaceNodeTest +piTest +attributeTest +attributeNameOrWildcard +schemaAttributeTest +elementTest +elementNameOrWildcard +schemaElementTest +elementDeclaration +attributeName +elementName +simpleTypeName +typeName +functionTest +anyFunctionTest +typedFunctionTest +mapTest +anyMapTest +typedMapTest +arrayTest +anyArrayTest +typedArrayTest +parenthesizedItemTest +attributeDeclaration +mlNodeTest +mlArrayNodeTest +mlObjectNodeTest +mlNumberNodeTest +mlBooleanNodeTest +mlNullNodeTest +eqName +qName +ncName +functionName +keyword +keywordNotOKForFunction +keywordOKForFunction +uriLiteral +stringLiteralQuot +stringLiteralApos +stringLiteral +stringContentQuot +stringContentApos +noQuotesNoBracesNoAmpNoLAng + + +atn: +[4, 1, 203, 2133, 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, 1, 0, 3, 0, 486, 8, 0, 1, 0, 3, 0, 489, 8, 0, 1, 0, 3, 0, 492, 8, 0, 1, 0, 1, 0, 3, 0, 496, 8, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 505, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 529, 8, 7, 1, 7, 1, 7, 5, 7, 533, 8, 7, 10, 7, 12, 7, 536, 9, 7, 1, 7, 3, 7, 539, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 544, 8, 7, 10, 7, 12, 7, 547, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 553, 8, 8, 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, 3, 10, 569, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 613, 8, 20, 1, 20, 1, 20, 1, 20, 5, 20, 618, 8, 20, 10, 20, 12, 20, 621, 9, 20, 1, 21, 1, 21, 1, 21, 3, 21, 626, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 633, 8, 21, 10, 21, 12, 21, 636, 9, 21, 3, 21, 638, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 647, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 655, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 662, 8, 23, 10, 23, 12, 23, 665, 9, 23, 3, 23, 667, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 681, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 688, 8, 25, 3, 25, 690, 8, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 701, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 708, 8, 28, 3, 28, 710, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 718, 8, 29, 1, 29, 1, 29, 3, 29, 722, 8, 29, 1, 29, 1, 29, 3, 29, 726, 8, 29, 1, 30, 1, 30, 1, 30, 5, 30, 731, 8, 30, 10, 30, 12, 30, 734, 9, 30, 1, 31, 1, 31, 1, 31, 3, 31, 739, 8, 31, 1, 32, 5, 32, 742, 8, 32, 10, 32, 12, 32, 745, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 753, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 758, 8, 34, 10, 34, 12, 34, 761, 9, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 789, 8, 39, 1, 40, 1, 40, 5, 40, 793, 8, 40, 10, 40, 12, 40, 796, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 803, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 810, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 816, 8, 43, 10, 43, 12, 43, 819, 9, 43, 1, 44, 1, 44, 1, 44, 3, 44, 824, 8, 44, 1, 44, 3, 44, 827, 8, 44, 1, 44, 3, 44, 830, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 846, 8, 47, 10, 47, 12, 47, 849, 9, 47, 1, 48, 1, 48, 1, 48, 3, 48, 854, 8, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 3, 49, 862, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 869, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 875, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 882, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 3, 53, 895, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 904, 8, 54, 1, 54, 3, 54, 907, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 912, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 917, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 933, 8, 58, 10, 58, 12, 58, 936, 9, 58, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 3, 59, 945, 8, 59, 1, 59, 1, 59, 3, 59, 949, 8, 59, 1, 60, 3, 60, 952, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 959, 8, 60, 10, 60, 12, 60, 962, 9, 60, 1, 61, 1, 61, 1, 61, 3, 61, 967, 8, 61, 1, 61, 1, 61, 1, 61, 3, 61, 972, 8, 61, 3, 61, 974, 8, 61, 1, 61, 1, 61, 3, 61, 978, 8, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 985, 8, 63, 1, 63, 1, 63, 1, 63, 5, 63, 990, 8, 63, 10, 63, 12, 63, 993, 9, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1001, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 4, 65, 1011, 8, 65, 11, 65, 12, 65, 1012, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 4, 66, 1021, 8, 66, 11, 66, 12, 66, 1022, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 4, 68, 1035, 8, 68, 11, 68, 12, 68, 1036, 1, 68, 1, 68, 1, 68, 3, 68, 1042, 8, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1052, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1061, 8, 70, 10, 70, 12, 70, 1064, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 4, 72, 1077, 8, 72, 11, 72, 12, 72, 1078, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1093, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 3, 76, 1099, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 5, 77, 1106, 8, 77, 10, 77, 12, 77, 1109, 9, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1117, 8, 78, 1, 79, 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, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 5, 84, 1145, 8, 84, 10, 84, 12, 84, 1148, 9, 84, 1, 85, 1, 85, 1, 85, 5, 85, 1153, 8, 85, 10, 85, 12, 85, 1156, 9, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1162, 8, 86, 1, 86, 1, 86, 3, 86, 1166, 8, 86, 1, 87, 1, 87, 1, 87, 5, 87, 1171, 8, 87, 10, 87, 12, 87, 1174, 9, 87, 1, 88, 1, 88, 1, 88, 3, 88, 1179, 8, 88, 1, 89, 1, 89, 1, 89, 5, 89, 1184, 8, 89, 10, 89, 12, 89, 1187, 9, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1192, 8, 90, 10, 90, 12, 90, 1195, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 1200, 8, 91, 10, 91, 12, 91, 1203, 9, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1208, 8, 92, 10, 92, 12, 92, 1211, 9, 92, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1217, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1223, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1229, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1235, 8, 96, 1, 97, 1, 97, 1, 97, 5, 97, 1240, 8, 97, 10, 97, 12, 97, 1243, 9, 97, 1, 98, 1, 98, 1, 98, 1, 99, 5, 99, 1249, 8, 99, 10, 99, 12, 99, 1252, 9, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 3, 100, 1259, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 1269, 8, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1278, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1284, 8, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 4, 106, 1291, 8, 106, 11, 106, 12, 106, 1292, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 5, 107, 1302, 8, 107, 10, 107, 12, 107, 1305, 9, 107, 1, 108, 1, 108, 3, 108, 1309, 8, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1314, 8, 108, 1, 109, 1, 109, 1, 109, 5, 109, 1319, 8, 109, 10, 109, 12, 109, 1322, 9, 109, 1, 110, 1, 110, 3, 110, 1326, 8, 110, 1, 111, 1, 111, 3, 111, 1330, 8, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1338, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 3, 114, 1345, 8, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1353, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 3, 118, 1363, 8, 118, 1, 119, 1, 119, 3, 119, 1367, 8, 119, 1, 120, 1, 120, 1, 120, 3, 120, 1372, 8, 120, 1, 121, 1, 121, 1, 121, 1, 121, 5, 121, 1378, 8, 121, 10, 121, 12, 121, 1381, 9, 121, 1, 122, 1, 122, 1, 122, 1, 122, 5, 122, 1387, 8, 122, 10, 122, 12, 122, 1390, 9, 122, 3, 122, 1392, 8, 122, 1, 122, 1, 122, 1, 123, 5, 123, 1397, 8, 123, 10, 123, 12, 123, 1400, 9, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 3, 126, 1413, 8, 126, 1, 127, 1, 127, 1, 127, 3, 127, 1418, 8, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 3, 128, 1433, 8, 128, 1, 129, 1, 129, 3, 129, 1437, 8, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 3, 133, 1448, 8, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 3, 138, 1465, 8, 138, 1, 139, 1, 139, 3, 139, 1469, 8, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1474, 8, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1481, 8, 141, 10, 141, 12, 141, 1484, 9, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1501, 8, 143, 10, 143, 12, 143, 1504, 9, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1511, 8, 144, 10, 144, 12, 144, 1514, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1523, 8, 145, 10, 145, 12, 145, 1526, 9, 145, 1, 145, 1, 145, 1, 146, 1, 146, 3, 146, 1532, 8, 146, 1, 147, 4, 147, 1535, 8, 147, 11, 147, 12, 147, 1536, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 1544, 8, 147, 1, 147, 3, 147, 1547, 8, 147, 1, 148, 4, 148, 1550, 8, 148, 11, 148, 12, 148, 1551, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 3, 148, 1559, 8, 148, 1, 148, 3, 148, 1562, 8, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 1570, 8, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1581, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 3, 151, 1591, 8, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 1599, 8, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 5, 154, 1614, 8, 154, 10, 154, 12, 154, 1617, 9, 154, 3, 154, 1619, 8, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 3, 160, 1647, 8, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 3, 162, 1659, 8, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 3, 163, 1666, 8, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 1688, 8, 169, 1, 169, 1, 169, 1, 170, 1, 170, 3, 170, 1694, 8, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1704, 8, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1709, 8, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 5, 174, 1720, 8, 174, 10, 174, 12, 174, 1723, 9, 174, 3, 174, 1725, 8, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 3, 176, 1735, 8, 176, 1, 177, 1, 177, 3, 177, 1739, 8, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 1754, 8, 180, 10, 180, 12, 180, 1757, 9, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 5, 184, 1775, 8, 184, 10, 184, 12, 184, 1778, 9, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 3, 187, 1789, 8, 187, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 3, 189, 1801, 8, 189, 3, 189, 1803, 8, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 3, 190, 1814, 8, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 3, 192, 1830, 8, 192, 1, 193, 1, 193, 1, 193, 3, 193, 1835, 8, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 3, 195, 1847, 8, 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, 3, 199, 1867, 8, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 3, 200, 1876, 8, 200, 3, 200, 1878, 8, 200, 1, 200, 1, 200, 1, 201, 1, 201, 3, 201, 1884, 8, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 3, 203, 1897, 8, 203, 3, 203, 1899, 8, 203, 3, 203, 1901, 8, 203, 1, 203, 1, 203, 1, 204, 1, 204, 3, 204, 1907, 8, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 5, 211, 1925, 8, 211, 10, 211, 12, 211, 1928, 9, 211, 1, 211, 1, 211, 3, 211, 1932, 8, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 5, 213, 1944, 8, 213, 10, 213, 12, 213, 1947, 9, 213, 3, 213, 1949, 8, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 3, 214, 1957, 8, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 3, 217, 1973, 8, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 1996, 8, 222, 1, 223, 1, 223, 1, 223, 3, 223, 2001, 8, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 3, 224, 2008, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 3, 225, 2015, 8, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 3, 226, 2022, 8, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 3, 227, 2029, 8, 227, 1, 227, 1, 227, 1, 228, 1, 228, 3, 228, 2035, 8, 228, 1, 229, 1, 229, 3, 229, 2039, 8, 229, 1, 230, 1, 230, 3, 230, 2043, 8, 230, 1, 231, 1, 231, 1, 231, 1, 231, 3, 231, 2049, 8, 231, 1, 232, 1, 232, 3, 232, 2053, 8, 232, 1, 233, 1, 233, 1, 234, 1, 234, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 5, 236, 2066, 8, 236, 10, 236, 12, 236, 2069, 9, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 5, 237, 2078, 8, 237, 10, 237, 12, 237, 2081, 9, 237, 1, 237, 1, 237, 1, 238, 1, 238, 3, 238, 2087, 8, 238, 1, 239, 4, 239, 2090, 8, 239, 11, 239, 12, 239, 2091, 1, 239, 1, 239, 3, 239, 2096, 8, 239, 1, 239, 3, 239, 2099, 8, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 3, 239, 2106, 8, 239, 1, 240, 4, 240, 2109, 8, 240, 11, 240, 12, 240, 2110, 1, 240, 1, 240, 3, 240, 2115, 8, 240, 1, 240, 3, 240, 2118, 8, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 3, 240, 2125, 8, 240, 1, 241, 1, 241, 4, 241, 2129, 8, 241, 11, 241, 12, 241, 2130, 1, 241, 0, 0, 242, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, 482, 0, 27, 2, 0, 86, 86, 99, 99, 2, 0, 138, 138, 152, 152, 2, 0, 133, 133, 163, 163, 2, 0, 101, 101, 115, 115, 2, 0, 126, 126, 138, 138, 2, 0, 108, 108, 125, 125, 3, 0, 96, 96, 136, 136, 181, 181, 1, 0, 28, 29, 4, 0, 27, 27, 83, 83, 104, 104, 119, 119, 2, 0, 39, 39, 162, 162, 2, 0, 94, 94, 110, 110, 6, 0, 92, 92, 100, 100, 103, 103, 114, 114, 117, 117, 122, 122, 2, 0, 58, 58, 160, 160, 2, 0, 113, 113, 151, 151, 1, 0, 36, 37, 5, 0, 61, 61, 70, 70, 79, 80, 96, 97, 146, 146, 2, 0, 54, 55, 135, 137, 1, 0, 5, 7, 2, 0, 13, 13, 15, 15, 1, 0, 9, 10, 1, 0, 33, 34, 2, 0, 24, 25, 197, 197, 3, 0, 24, 24, 50, 50, 197, 197, 3, 0, 25, 25, 50, 50, 197, 197, 28, 0, 8, 8, 53, 53, 57, 57, 61, 61, 64, 64, 69, 69, 72, 72, 74, 74, 76, 76, 82, 82, 85, 86, 89, 89, 91, 91, 105, 105, 112, 112, 118, 118, 123, 124, 127, 127, 129, 129, 140, 140, 144, 145, 147, 147, 153, 154, 158, 161, 164, 164, 168, 168, 170, 170, 172, 183, 26, 0, 54, 56, 58, 60, 62, 63, 65, 68, 70, 71, 73, 73, 75, 75, 77, 81, 83, 84, 87, 88, 90, 90, 92, 104, 106, 111, 113, 117, 119, 122, 125, 126, 128, 128, 130, 138, 141, 143, 146, 146, 148, 152, 155, 157, 162, 163, 165, 167, 169, 169, 171, 171, 11, 0, 5, 7, 13, 13, 17, 17, 19, 24, 27, 39, 41, 50, 52, 52, 123, 123, 139, 139, 184, 189, 196, 196, 2212, 0, 485, 1, 0, 0, 0, 2, 497, 1, 0, 0, 0, 4, 499, 1, 0, 0, 0, 6, 508, 1, 0, 0, 0, 8, 511, 1, 0, 0, 0, 10, 513, 1, 0, 0, 0, 12, 516, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 16, 552, 1, 0, 0, 0, 18, 554, 1, 0, 0, 0, 20, 568, 1, 0, 0, 0, 22, 570, 1, 0, 0, 0, 24, 574, 1, 0, 0, 0, 26, 579, 1, 0, 0, 0, 28, 583, 1, 0, 0, 0, 30, 587, 1, 0, 0, 0, 32, 591, 1, 0, 0, 0, 34, 597, 1, 0, 0, 0, 36, 603, 1, 0, 0, 0, 38, 605, 1, 0, 0, 0, 40, 607, 1, 0, 0, 0, 42, 622, 1, 0, 0, 0, 44, 646, 1, 0, 0, 0, 46, 648, 1, 0, 0, 0, 48, 668, 1, 0, 0, 0, 50, 674, 1, 0, 0, 0, 52, 691, 1, 0, 0, 0, 54, 693, 1, 0, 0, 0, 56, 695, 1, 0, 0, 0, 58, 711, 1, 0, 0, 0, 60, 727, 1, 0, 0, 0, 62, 735, 1, 0, 0, 0, 64, 743, 1, 0, 0, 0, 66, 746, 1, 0, 0, 0, 68, 754, 1, 0, 0, 0, 70, 762, 1, 0, 0, 0, 72, 764, 1, 0, 0, 0, 74, 767, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 790, 1, 0, 0, 0, 82, 802, 1, 0, 0, 0, 84, 809, 1, 0, 0, 0, 86, 811, 1, 0, 0, 0, 88, 820, 1, 0, 0, 0, 90, 834, 1, 0, 0, 0, 92, 837, 1, 0, 0, 0, 94, 841, 1, 0, 0, 0, 96, 850, 1, 0, 0, 0, 98, 858, 1, 0, 0, 0, 100, 863, 1, 0, 0, 0, 102, 876, 1, 0, 0, 0, 104, 888, 1, 0, 0, 0, 106, 894, 1, 0, 0, 0, 108, 903, 1, 0, 0, 0, 110, 918, 1, 0, 0, 0, 112, 922, 1, 0, 0, 0, 114, 925, 1, 0, 0, 0, 116, 929, 1, 0, 0, 0, 118, 937, 1, 0, 0, 0, 120, 951, 1, 0, 0, 0, 122, 963, 1, 0, 0, 0, 124, 979, 1, 0, 0, 0, 126, 984, 1, 0, 0, 0, 128, 997, 1, 0, 0, 0, 130, 1005, 1, 0, 0, 0, 132, 1020, 1, 0, 0, 0, 134, 1027, 1, 0, 0, 0, 136, 1029, 1, 0, 0, 0, 138, 1046, 1, 0, 0, 0, 140, 1057, 1, 0, 0, 0, 142, 1065, 1, 0, 0, 0, 144, 1074, 1, 0, 0, 0, 146, 1080, 1, 0, 0, 0, 148, 1083, 1, 0, 0, 0, 150, 1085, 1, 0, 0, 0, 152, 1096, 1, 0, 0, 0, 154, 1102, 1, 0, 0, 0, 156, 1110, 1, 0, 0, 0, 158, 1118, 1, 0, 0, 0, 160, 1123, 1, 0, 0, 0, 162, 1128, 1, 0, 0, 0, 164, 1133, 1, 0, 0, 0, 166, 1136, 1, 0, 0, 0, 168, 1141, 1, 0, 0, 0, 170, 1149, 1, 0, 0, 0, 172, 1157, 1, 0, 0, 0, 174, 1167, 1, 0, 0, 0, 176, 1175, 1, 0, 0, 0, 178, 1180, 1, 0, 0, 0, 180, 1188, 1, 0, 0, 0, 182, 1196, 1, 0, 0, 0, 184, 1204, 1, 0, 0, 0, 186, 1212, 1, 0, 0, 0, 188, 1218, 1, 0, 0, 0, 190, 1224, 1, 0, 0, 0, 192, 1230, 1, 0, 0, 0, 194, 1236, 1, 0, 0, 0, 196, 1244, 1, 0, 0, 0, 198, 1250, 1, 0, 0, 0, 200, 1258, 1, 0, 0, 0, 202, 1268, 1, 0, 0, 0, 204, 1270, 1, 0, 0, 0, 206, 1277, 1, 0, 0, 0, 208, 1279, 1, 0, 0, 0, 210, 1287, 1, 0, 0, 0, 212, 1290, 1, 0, 0, 0, 214, 1298, 1, 0, 0, 0, 216, 1313, 1, 0, 0, 0, 218, 1315, 1, 0, 0, 0, 220, 1325, 1, 0, 0, 0, 222, 1329, 1, 0, 0, 0, 224, 1337, 1, 0, 0, 0, 226, 1339, 1, 0, 0, 0, 228, 1344, 1, 0, 0, 0, 230, 1352, 1, 0, 0, 0, 232, 1354, 1, 0, 0, 0, 234, 1358, 1, 0, 0, 0, 236, 1362, 1, 0, 0, 0, 238, 1366, 1, 0, 0, 0, 240, 1371, 1, 0, 0, 0, 242, 1373, 1, 0, 0, 0, 244, 1382, 1, 0, 0, 0, 246, 1398, 1, 0, 0, 0, 248, 1401, 1, 0, 0, 0, 250, 1405, 1, 0, 0, 0, 252, 1412, 1, 0, 0, 0, 254, 1417, 1, 0, 0, 0, 256, 1432, 1, 0, 0, 0, 258, 1436, 1, 0, 0, 0, 260, 1438, 1, 0, 0, 0, 262, 1440, 1, 0, 0, 0, 264, 1443, 1, 0, 0, 0, 266, 1445, 1, 0, 0, 0, 268, 1451, 1, 0, 0, 0, 270, 1453, 1, 0, 0, 0, 272, 1456, 1, 0, 0, 0, 274, 1459, 1, 0, 0, 0, 276, 1464, 1, 0, 0, 0, 278, 1468, 1, 0, 0, 0, 280, 1473, 1, 0, 0, 0, 282, 1475, 1, 0, 0, 0, 284, 1490, 1, 0, 0, 0, 286, 1502, 1, 0, 0, 0, 288, 1505, 1, 0, 0, 0, 290, 1517, 1, 0, 0, 0, 292, 1531, 1, 0, 0, 0, 294, 1546, 1, 0, 0, 0, 296, 1561, 1, 0, 0, 0, 298, 1569, 1, 0, 0, 0, 300, 1580, 1, 0, 0, 0, 302, 1590, 1, 0, 0, 0, 304, 1598, 1, 0, 0, 0, 306, 1600, 1, 0, 0, 0, 308, 1603, 1, 0, 0, 0, 310, 1622, 1, 0, 0, 0, 312, 1625, 1, 0, 0, 0, 314, 1630, 1, 0, 0, 0, 316, 1634, 1, 0, 0, 0, 318, 1637, 1, 0, 0, 0, 320, 1640, 1, 0, 0, 0, 322, 1650, 1, 0, 0, 0, 324, 1652, 1, 0, 0, 0, 326, 1662, 1, 0, 0, 0, 328, 1669, 1, 0, 0, 0, 330, 1671, 1, 0, 0, 0, 332, 1673, 1, 0, 0, 0, 334, 1675, 1, 0, 0, 0, 336, 1678, 1, 0, 0, 0, 338, 1681, 1, 0, 0, 0, 340, 1693, 1, 0, 0, 0, 342, 1695, 1, 0, 0, 0, 344, 1699, 1, 0, 0, 0, 346, 1712, 1, 0, 0, 0, 348, 1714, 1, 0, 0, 0, 350, 1728, 1, 0, 0, 0, 352, 1734, 1, 0, 0, 0, 354, 1736, 1, 0, 0, 0, 356, 1742, 1, 0, 0, 0, 358, 1745, 1, 0, 0, 0, 360, 1749, 1, 0, 0, 0, 362, 1758, 1, 0, 0, 0, 364, 1760, 1, 0, 0, 0, 366, 1762, 1, 0, 0, 0, 368, 1776, 1, 0, 0, 0, 370, 1779, 1, 0, 0, 0, 372, 1783, 1, 0, 0, 0, 374, 1786, 1, 0, 0, 0, 376, 1790, 1, 0, 0, 0, 378, 1802, 1, 0, 0, 0, 380, 1813, 1, 0, 0, 0, 382, 1815, 1, 0, 0, 0, 384, 1829, 1, 0, 0, 0, 386, 1831, 1, 0, 0, 0, 388, 1838, 1, 0, 0, 0, 390, 1842, 1, 0, 0, 0, 392, 1850, 1, 0, 0, 0, 394, 1854, 1, 0, 0, 0, 396, 1858, 1, 0, 0, 0, 398, 1862, 1, 0, 0, 0, 400, 1870, 1, 0, 0, 0, 402, 1883, 1, 0, 0, 0, 404, 1885, 1, 0, 0, 0, 406, 1890, 1, 0, 0, 0, 408, 1906, 1, 0, 0, 0, 410, 1908, 1, 0, 0, 0, 412, 1913, 1, 0, 0, 0, 414, 1915, 1, 0, 0, 0, 416, 1917, 1, 0, 0, 0, 418, 1919, 1, 0, 0, 0, 420, 1921, 1, 0, 0, 0, 422, 1926, 1, 0, 0, 0, 424, 1933, 1, 0, 0, 0, 426, 1938, 1, 0, 0, 0, 428, 1956, 1, 0, 0, 0, 430, 1958, 1, 0, 0, 0, 432, 1963, 1, 0, 0, 0, 434, 1972, 1, 0, 0, 0, 436, 1974, 1, 0, 0, 0, 438, 1979, 1, 0, 0, 0, 440, 1984, 1, 0, 0, 0, 442, 1988, 1, 0, 0, 0, 444, 1995, 1, 0, 0, 0, 446, 1997, 1, 0, 0, 0, 448, 2004, 1, 0, 0, 0, 450, 2011, 1, 0, 0, 0, 452, 2018, 1, 0, 0, 0, 454, 2025, 1, 0, 0, 0, 456, 2034, 1, 0, 0, 0, 458, 2038, 1, 0, 0, 0, 460, 2042, 1, 0, 0, 0, 462, 2048, 1, 0, 0, 0, 464, 2052, 1, 0, 0, 0, 466, 2054, 1, 0, 0, 0, 468, 2056, 1, 0, 0, 0, 470, 2058, 1, 0, 0, 0, 472, 2060, 1, 0, 0, 0, 474, 2072, 1, 0, 0, 0, 476, 2086, 1, 0, 0, 0, 478, 2105, 1, 0, 0, 0, 480, 2124, 1, 0, 0, 0, 482, 2128, 1, 0, 0, 0, 484, 486, 3, 2, 1, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 489, 3, 4, 2, 0, 488, 487, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 491, 1, 0, 0, 0, 490, 492, 3, 2, 1, 0, 491, 490, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 495, 1, 0, 0, 0, 493, 496, 3, 10, 5, 0, 494, 496, 3, 6, 3, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 1, 1, 0, 0, 0, 497, 498, 5, 191, 0, 0, 498, 3, 1, 0, 0, 0, 499, 500, 5, 171, 0, 0, 500, 501, 5, 167, 0, 0, 501, 504, 3, 476, 238, 0, 502, 503, 5, 90, 0, 0, 503, 505, 3, 476, 238, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 35, 0, 0, 507, 5, 1, 0, 0, 0, 508, 509, 3, 14, 7, 0, 509, 510, 3, 8, 4, 0, 510, 7, 1, 0, 0, 0, 511, 512, 3, 76, 38, 0, 512, 9, 1, 0, 0, 0, 513, 514, 3, 12, 6, 0, 514, 515, 3, 14, 7, 0, 515, 11, 1, 0, 0, 0, 516, 517, 5, 120, 0, 0, 517, 518, 5, 121, 0, 0, 518, 519, 3, 460, 230, 0, 519, 520, 5, 19, 0, 0, 520, 521, 3, 470, 235, 0, 521, 522, 5, 35, 0, 0, 522, 13, 1, 0, 0, 0, 523, 529, 3, 18, 9, 0, 524, 529, 3, 20, 10, 0, 525, 529, 3, 48, 24, 0, 526, 529, 3, 42, 21, 0, 527, 529, 3, 46, 23, 0, 528, 523, 1, 0, 0, 0, 528, 524, 1, 0, 0, 0, 528, 525, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 528, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 35, 0, 0, 531, 533, 1, 0, 0, 0, 532, 528, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 545, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 539, 3, 2, 1, 0, 538, 537, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 3, 16, 8, 0, 541, 542, 5, 35, 0, 0, 542, 544, 1, 0, 0, 0, 543, 538, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 15, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 553, 3, 50, 25, 0, 549, 553, 3, 58, 29, 0, 550, 553, 3, 56, 28, 0, 551, 553, 3, 74, 37, 0, 552, 548, 1, 0, 0, 0, 552, 549, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 551, 1, 0, 0, 0, 553, 17, 1, 0, 0, 0, 554, 555, 5, 77, 0, 0, 555, 556, 5, 78, 0, 0, 556, 557, 7, 0, 0, 0, 557, 558, 5, 121, 0, 0, 558, 559, 3, 476, 238, 0, 559, 19, 1, 0, 0, 0, 560, 569, 3, 22, 11, 0, 561, 569, 3, 24, 12, 0, 562, 569, 3, 26, 13, 0, 563, 569, 3, 28, 14, 0, 564, 569, 3, 30, 15, 0, 565, 569, 3, 32, 16, 0, 566, 569, 3, 34, 17, 0, 567, 569, 3, 40, 20, 0, 568, 560, 1, 0, 0, 0, 568, 561, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 563, 1, 0, 0, 0, 568, 564, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 567, 1, 0, 0, 0, 569, 21, 1, 0, 0, 0, 570, 571, 5, 77, 0, 0, 571, 572, 5, 63, 0, 0, 572, 573, 7, 1, 0, 0, 573, 23, 1, 0, 0, 0, 574, 575, 5, 77, 0, 0, 575, 576, 5, 78, 0, 0, 576, 577, 5, 71, 0, 0, 577, 578, 3, 470, 235, 0, 578, 25, 1, 0, 0, 0, 579, 580, 5, 77, 0, 0, 580, 581, 5, 62, 0, 0, 581, 582, 3, 470, 235, 0, 582, 27, 1, 0, 0, 0, 583, 584, 5, 77, 0, 0, 584, 585, 5, 73, 0, 0, 585, 586, 7, 1, 0, 0, 586, 29, 1, 0, 0, 0, 587, 588, 5, 77, 0, 0, 588, 589, 5, 134, 0, 0, 589, 590, 7, 2, 0, 0, 590, 31, 1, 0, 0, 0, 591, 592, 5, 77, 0, 0, 592, 593, 5, 78, 0, 0, 593, 594, 5, 132, 0, 0, 594, 595, 5, 88, 0, 0, 595, 596, 7, 3, 0, 0, 596, 33, 1, 0, 0, 0, 597, 598, 5, 77, 0, 0, 598, 599, 5, 75, 0, 0, 599, 600, 3, 36, 18, 0, 600, 601, 5, 30, 0, 0, 601, 602, 3, 38, 19, 0, 602, 35, 1, 0, 0, 0, 603, 604, 7, 4, 0, 0, 604, 37, 1, 0, 0, 0, 605, 606, 7, 5, 0, 0, 606, 39, 1, 0, 0, 0, 607, 612, 5, 77, 0, 0, 608, 609, 5, 82, 0, 0, 609, 613, 3, 456, 228, 0, 610, 611, 5, 78, 0, 0, 611, 613, 5, 82, 0, 0, 612, 608, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 619, 1, 0, 0, 0, 614, 615, 5, 8, 0, 0, 615, 616, 5, 19, 0, 0, 616, 618, 3, 476, 238, 0, 617, 614, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 41, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 623, 5, 106, 0, 0, 623, 625, 5, 143, 0, 0, 624, 626, 3, 44, 22, 0, 625, 624, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 637, 3, 470, 235, 0, 628, 629, 5, 60, 0, 0, 629, 634, 3, 470, 235, 0, 630, 631, 5, 30, 0, 0, 631, 633, 3, 470, 235, 0, 632, 630, 1, 0, 0, 0, 633, 636, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 637, 628, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 43, 1, 0, 0, 0, 639, 640, 5, 121, 0, 0, 640, 641, 3, 460, 230, 0, 641, 642, 5, 19, 0, 0, 642, 647, 1, 0, 0, 0, 643, 644, 5, 78, 0, 0, 644, 645, 5, 86, 0, 0, 645, 647, 5, 121, 0, 0, 646, 639, 1, 0, 0, 0, 646, 643, 1, 0, 0, 0, 647, 45, 1, 0, 0, 0, 648, 649, 5, 106, 0, 0, 649, 654, 5, 120, 0, 0, 650, 651, 5, 121, 0, 0, 651, 652, 3, 460, 230, 0, 652, 653, 5, 19, 0, 0, 653, 655, 1, 0, 0, 0, 654, 650, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 666, 3, 470, 235, 0, 657, 658, 5, 60, 0, 0, 658, 663, 3, 470, 235, 0, 659, 660, 5, 30, 0, 0, 660, 662, 3, 470, 235, 0, 661, 659, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 667, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 47, 1, 0, 0, 0, 668, 669, 5, 77, 0, 0, 669, 670, 5, 121, 0, 0, 670, 671, 3, 460, 230, 0, 671, 672, 5, 19, 0, 0, 672, 673, 3, 470, 235, 0, 673, 49, 1, 0, 0, 0, 674, 675, 5, 77, 0, 0, 675, 676, 3, 64, 32, 0, 676, 677, 5, 166, 0, 0, 677, 678, 5, 44, 0, 0, 678, 680, 3, 264, 132, 0, 679, 681, 3, 376, 188, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 689, 1, 0, 0, 0, 682, 683, 5, 34, 0, 0, 683, 690, 3, 52, 26, 0, 684, 687, 5, 95, 0, 0, 685, 686, 5, 34, 0, 0, 686, 688, 3, 54, 27, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 690, 1, 0, 0, 0, 689, 682, 1, 0, 0, 0, 689, 684, 1, 0, 0, 0, 690, 51, 1, 0, 0, 0, 691, 692, 3, 78, 39, 0, 692, 53, 1, 0, 0, 0, 693, 694, 3, 78, 39, 0, 694, 55, 1, 0, 0, 0, 695, 696, 5, 77, 0, 0, 696, 697, 5, 74, 0, 0, 697, 700, 5, 112, 0, 0, 698, 699, 5, 58, 0, 0, 699, 701, 3, 380, 190, 0, 700, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 709, 1, 0, 0, 0, 702, 703, 5, 34, 0, 0, 703, 710, 3, 78, 39, 0, 704, 707, 5, 95, 0, 0, 705, 706, 5, 34, 0, 0, 706, 708, 3, 78, 39, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 710, 1, 0, 0, 0, 709, 702, 1, 0, 0, 0, 709, 704, 1, 0, 0, 0, 710, 57, 1, 0, 0, 0, 711, 712, 5, 77, 0, 0, 712, 713, 3, 64, 32, 0, 713, 714, 5, 99, 0, 0, 714, 715, 3, 456, 228, 0, 715, 717, 5, 21, 0, 0, 716, 718, 3, 60, 30, 0, 717, 716, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 5, 22, 0, 0, 720, 722, 3, 72, 36, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 726, 3, 346, 173, 0, 724, 726, 5, 95, 0, 0, 725, 723, 1, 0, 0, 0, 725, 724, 1, 0, 0, 0, 726, 59, 1, 0, 0, 0, 727, 732, 3, 62, 31, 0, 728, 729, 5, 30, 0, 0, 729, 731, 3, 62, 31, 0, 730, 728, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 61, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 736, 5, 44, 0, 0, 736, 738, 3, 458, 229, 0, 737, 739, 3, 376, 188, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 63, 1, 0, 0, 0, 740, 742, 3, 66, 33, 0, 741, 740, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 65, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 747, 5, 45, 0, 0, 747, 752, 3, 458, 229, 0, 748, 749, 5, 21, 0, 0, 749, 750, 3, 68, 34, 0, 750, 751, 5, 22, 0, 0, 751, 753, 1, 0, 0, 0, 752, 748, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 67, 1, 0, 0, 0, 754, 759, 3, 70, 35, 0, 755, 756, 5, 30, 0, 0, 756, 758, 3, 70, 35, 0, 757, 755, 1, 0, 0, 0, 758, 761, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 69, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 762, 763, 3, 258, 129, 0, 763, 71, 1, 0, 0, 0, 764, 765, 5, 58, 0, 0, 765, 766, 3, 378, 189, 0, 766, 73, 1, 0, 0, 0, 767, 768, 5, 77, 0, 0, 768, 769, 5, 130, 0, 0, 769, 770, 3, 458, 229, 0, 770, 771, 3, 476, 238, 0, 771, 75, 1, 0, 0, 0, 772, 777, 3, 78, 39, 0, 773, 774, 5, 30, 0, 0, 774, 776, 3, 78, 39, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 77, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 789, 3, 80, 40, 0, 781, 789, 3, 126, 63, 0, 782, 789, 3, 130, 65, 0, 783, 789, 3, 136, 68, 0, 784, 789, 3, 156, 78, 0, 785, 789, 3, 142, 71, 0, 786, 789, 3, 144, 72, 0, 787, 789, 3, 168, 84, 0, 788, 780, 1, 0, 0, 0, 788, 781, 1, 0, 0, 0, 788, 782, 1, 0, 0, 0, 788, 783, 1, 0, 0, 0, 788, 784, 1, 0, 0, 0, 788, 785, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 788, 787, 1, 0, 0, 0, 789, 79, 1, 0, 0, 0, 790, 794, 3, 82, 41, 0, 791, 793, 3, 84, 42, 0, 792, 791, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 124, 62, 0, 798, 81, 1, 0, 0, 0, 799, 803, 3, 86, 43, 0, 800, 803, 3, 94, 47, 0, 801, 803, 3, 98, 49, 0, 802, 799, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 801, 1, 0, 0, 0, 803, 83, 1, 0, 0, 0, 804, 810, 3, 82, 41, 0, 805, 810, 3, 112, 56, 0, 806, 810, 3, 114, 57, 0, 807, 810, 3, 120, 60, 0, 808, 810, 3, 110, 55, 0, 809, 804, 1, 0, 0, 0, 809, 805, 1, 0, 0, 0, 809, 806, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 808, 1, 0, 0, 0, 810, 85, 1, 0, 0, 0, 811, 812, 5, 98, 0, 0, 812, 817, 3, 88, 44, 0, 813, 814, 5, 30, 0, 0, 814, 816, 3, 88, 44, 0, 815, 813, 1, 0, 0, 0, 816, 819, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 87, 1, 0, 0, 0, 819, 817, 1, 0, 0, 0, 820, 821, 5, 44, 0, 0, 821, 823, 3, 264, 132, 0, 822, 824, 3, 376, 188, 0, 823, 822, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 826, 1, 0, 0, 0, 825, 827, 3, 90, 45, 0, 826, 825, 1, 0, 0, 0, 826, 827, 1, 0, 0, 0, 827, 829, 1, 0, 0, 0, 828, 830, 3, 92, 46, 0, 829, 828, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 5, 107, 0, 0, 832, 833, 3, 78, 39, 0, 833, 89, 1, 0, 0, 0, 834, 835, 5, 53, 0, 0, 835, 836, 5, 88, 0, 0, 836, 91, 1, 0, 0, 0, 837, 838, 5, 60, 0, 0, 838, 839, 5, 44, 0, 0, 839, 840, 3, 264, 132, 0, 840, 93, 1, 0, 0, 0, 841, 842, 5, 116, 0, 0, 842, 847, 3, 96, 48, 0, 843, 844, 5, 30, 0, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 845, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 95, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 850, 851, 5, 44, 0, 0, 851, 853, 3, 264, 132, 0, 852, 854, 3, 376, 188, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 856, 5, 34, 0, 0, 856, 857, 3, 78, 39, 0, 857, 97, 1, 0, 0, 0, 858, 861, 5, 98, 0, 0, 859, 862, 3, 100, 50, 0, 860, 862, 3, 102, 51, 0, 861, 859, 1, 0, 0, 0, 861, 860, 1, 0, 0, 0, 862, 99, 1, 0, 0, 0, 863, 864, 5, 159, 0, 0, 864, 865, 5, 170, 0, 0, 865, 866, 5, 44, 0, 0, 866, 868, 3, 458, 229, 0, 867, 869, 3, 376, 188, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 5, 107, 0, 0, 871, 872, 3, 78, 39, 0, 872, 874, 3, 104, 52, 0, 873, 875, 3, 106, 53, 0, 874, 873, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 101, 1, 0, 0, 0, 876, 877, 5, 147, 0, 0, 877, 878, 5, 170, 0, 0, 878, 879, 5, 44, 0, 0, 879, 881, 3, 458, 229, 0, 880, 882, 3, 376, 188, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 107, 0, 0, 884, 885, 3, 78, 39, 0, 885, 886, 3, 104, 52, 0, 886, 887, 3, 106, 53, 0, 887, 103, 1, 0, 0, 0, 888, 889, 5, 150, 0, 0, 889, 890, 3, 108, 54, 0, 890, 891, 5, 168, 0, 0, 891, 892, 3, 78, 39, 0, 892, 105, 1, 0, 0, 0, 893, 895, 5, 129, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 5, 91, 0, 0, 897, 898, 3, 108, 54, 0, 898, 899, 5, 168, 0, 0, 899, 900, 3, 78, 39, 0, 900, 107, 1, 0, 0, 0, 901, 902, 5, 44, 0, 0, 902, 904, 3, 456, 228, 0, 903, 901, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 906, 1, 0, 0, 0, 905, 907, 3, 92, 46, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 911, 1, 0, 0, 0, 908, 909, 5, 139, 0, 0, 909, 910, 5, 44, 0, 0, 910, 912, 3, 456, 228, 0, 911, 908, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 916, 1, 0, 0, 0, 913, 914, 5, 123, 0, 0, 914, 915, 5, 44, 0, 0, 915, 917, 3, 456, 228, 0, 916, 913, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 109, 1, 0, 0, 0, 918, 919, 5, 76, 0, 0, 919, 920, 5, 44, 0, 0, 920, 921, 3, 264, 132, 0, 921, 111, 1, 0, 0, 0, 922, 923, 5, 169, 0, 0, 923, 924, 3, 78, 39, 0, 924, 113, 1, 0, 0, 0, 925, 926, 5, 102, 0, 0, 926, 927, 5, 65, 0, 0, 927, 928, 3, 116, 58, 0, 928, 115, 1, 0, 0, 0, 929, 934, 3, 118, 59, 0, 930, 931, 5, 30, 0, 0, 931, 933, 3, 118, 59, 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, 117, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 938, 5, 44, 0, 0, 938, 944, 3, 264, 132, 0, 939, 941, 3, 376, 188, 0, 940, 939, 1, 0, 0, 0, 940, 941, 1, 0, 0, 0, 941, 942, 1, 0, 0, 0, 942, 943, 5, 34, 0, 0, 943, 945, 3, 78, 39, 0, 944, 940, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 947, 5, 71, 0, 0, 947, 949, 3, 470, 235, 0, 948, 946, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 119, 1, 0, 0, 0, 950, 952, 5, 149, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 5, 132, 0, 0, 954, 955, 5, 65, 0, 0, 955, 960, 3, 122, 61, 0, 956, 957, 5, 30, 0, 0, 957, 959, 3, 122, 61, 0, 958, 956, 1, 0, 0, 0, 959, 962, 1, 0, 0, 0, 960, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 121, 1, 0, 0, 0, 962, 960, 1, 0, 0, 0, 963, 966, 3, 78, 39, 0, 964, 967, 5, 59, 0, 0, 965, 967, 5, 81, 0, 0, 966, 964, 1, 0, 0, 0, 966, 965, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 973, 1, 0, 0, 0, 968, 971, 5, 88, 0, 0, 969, 972, 5, 101, 0, 0, 970, 972, 5, 115, 0, 0, 971, 969, 1, 0, 0, 0, 971, 970, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 976, 5, 71, 0, 0, 976, 978, 3, 470, 235, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 123, 1, 0, 0, 0, 979, 980, 5, 141, 0, 0, 980, 981, 3, 78, 39, 0, 981, 125, 1, 0, 0, 0, 982, 985, 5, 148, 0, 0, 983, 985, 5, 93, 0, 0, 984, 982, 1, 0, 0, 0, 984, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 991, 3, 128, 64, 0, 987, 988, 5, 30, 0, 0, 988, 990, 3, 128, 64, 0, 989, 987, 1, 0, 0, 0, 990, 993, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 994, 995, 5, 142, 0, 0, 995, 996, 3, 78, 39, 0, 996, 127, 1, 0, 0, 0, 997, 998, 5, 44, 0, 0, 998, 1000, 3, 264, 132, 0, 999, 1001, 3, 376, 188, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 5, 107, 0, 0, 1003, 1004, 3, 78, 39, 0, 1004, 129, 1, 0, 0, 0, 1005, 1006, 5, 153, 0, 0, 1006, 1007, 5, 21, 0, 0, 1007, 1008, 3, 76, 38, 0, 1008, 1010, 5, 22, 0, 0, 1009, 1011, 3, 132, 66, 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, 78, 0, 0, 1015, 1016, 5, 141, 0, 0, 1016, 1017, 3, 78, 39, 0, 1017, 131, 1, 0, 0, 0, 1018, 1019, 5, 66, 0, 0, 1019, 1021, 3, 134, 67, 0, 1020, 1018, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 5, 141, 0, 0, 1025, 1026, 3, 78, 39, 0, 1026, 133, 1, 0, 0, 0, 1027, 1028, 3, 78, 39, 0, 1028, 135, 1, 0, 0, 0, 1029, 1030, 5, 161, 0, 0, 1030, 1031, 5, 21, 0, 0, 1031, 1032, 3, 76, 38, 0, 1032, 1034, 5, 22, 0, 0, 1033, 1035, 3, 138, 69, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1041, 5, 78, 0, 0, 1039, 1040, 5, 44, 0, 0, 1040, 1042, 3, 264, 132, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 5, 141, 0, 0, 1044, 1045, 3, 78, 39, 0, 1045, 137, 1, 0, 0, 0, 1046, 1051, 5, 66, 0, 0, 1047, 1048, 5, 44, 0, 0, 1048, 1049, 3, 264, 132, 0, 1049, 1050, 5, 58, 0, 0, 1050, 1052, 1, 0, 0, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 3, 140, 70, 0, 1054, 1055, 5, 141, 0, 0, 1055, 1056, 3, 78, 39, 0, 1056, 139, 1, 0, 0, 0, 1057, 1062, 3, 378, 189, 0, 1058, 1059, 5, 39, 0, 0, 1059, 1061, 3, 378, 189, 0, 1060, 1058, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 141, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1066, 5, 105, 0, 0, 1066, 1067, 5, 21, 0, 0, 1067, 1068, 3, 76, 38, 0, 1068, 1069, 5, 22, 0, 0, 1069, 1070, 5, 155, 0, 0, 1070, 1071, 3, 78, 39, 0, 1071, 1072, 5, 87, 0, 0, 1072, 1073, 3, 78, 39, 0, 1073, 143, 1, 0, 0, 0, 1074, 1076, 3, 146, 73, 0, 1075, 1077, 3, 150, 75, 0, 1076, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 145, 1, 0, 0, 0, 1080, 1081, 5, 158, 0, 0, 1081, 1082, 3, 148, 74, 0, 1082, 147, 1, 0, 0, 0, 1083, 1084, 3, 152, 76, 0, 1084, 149, 1, 0, 0, 0, 1085, 1092, 5, 69, 0, 0, 1086, 1093, 3, 154, 77, 0, 1087, 1088, 5, 21, 0, 0, 1088, 1089, 5, 44, 0, 0, 1089, 1090, 3, 264, 132, 0, 1090, 1091, 5, 22, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1086, 1, 0, 0, 0, 1092, 1087, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 3, 152, 76, 0, 1095, 151, 1, 0, 0, 0, 1096, 1098, 5, 25, 0, 0, 1097, 1099, 3, 76, 38, 0, 1098, 1097, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 5, 26, 0, 0, 1101, 153, 1, 0, 0, 0, 1102, 1107, 3, 238, 119, 0, 1103, 1104, 5, 39, 0, 0, 1104, 1106, 3, 238, 119, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1109, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 155, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1110, 1116, 5, 164, 0, 0, 1111, 1117, 3, 158, 79, 0, 1112, 1117, 3, 160, 80, 0, 1113, 1117, 3, 162, 81, 0, 1114, 1117, 3, 164, 82, 0, 1115, 1117, 3, 166, 83, 0, 1116, 1111, 1, 0, 0, 0, 1116, 1112, 1, 0, 0, 0, 1116, 1113, 1, 0, 0, 0, 1116, 1114, 1, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, 1117, 157, 1, 0, 0, 0, 1118, 1119, 5, 177, 0, 0, 1119, 1120, 3, 76, 38, 0, 1120, 1121, 5, 178, 0, 0, 1121, 1122, 3, 78, 39, 0, 1122, 159, 1, 0, 0, 0, 1123, 1124, 5, 179, 0, 0, 1124, 1125, 3, 76, 38, 0, 1125, 1126, 5, 178, 0, 0, 1126, 1127, 3, 78, 39, 0, 1127, 161, 1, 0, 0, 0, 1128, 1129, 5, 180, 0, 0, 1129, 1130, 3, 78, 39, 0, 1130, 1131, 7, 6, 0, 0, 1131, 1132, 3, 78, 39, 0, 1132, 163, 1, 0, 0, 0, 1133, 1134, 5, 182, 0, 0, 1134, 1135, 3, 78, 39, 0, 1135, 165, 1, 0, 0, 0, 1136, 1137, 5, 183, 0, 0, 1137, 1138, 3, 78, 39, 0, 1138, 1139, 5, 58, 0, 0, 1139, 1140, 3, 78, 39, 0, 1140, 167, 1, 0, 0, 0, 1141, 1146, 3, 170, 85, 0, 1142, 1143, 5, 131, 0, 0, 1143, 1145, 3, 170, 85, 0, 1144, 1142, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 169, 1, 0, 0, 0, 1148, 1146, 1, 0, 0, 0, 1149, 1154, 3, 172, 86, 0, 1150, 1151, 5, 56, 0, 0, 1151, 1153, 3, 172, 86, 0, 1152, 1150, 1, 0, 0, 0, 1153, 1156, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 171, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1157, 1165, 3, 174, 87, 0, 1158, 1162, 3, 204, 102, 0, 1159, 1162, 3, 202, 101, 0, 1160, 1162, 3, 206, 103, 0, 1161, 1158, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 3, 174, 87, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1161, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 173, 1, 0, 0, 0, 1167, 1172, 3, 176, 88, 0, 1168, 1169, 5, 51, 0, 0, 1169, 1171, 3, 176, 88, 0, 1170, 1168, 1, 0, 0, 0, 1171, 1174, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 175, 1, 0, 0, 0, 1174, 1172, 1, 0, 0, 0, 1175, 1178, 3, 178, 89, 0, 1176, 1177, 5, 156, 0, 0, 1177, 1179, 3, 178, 89, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 177, 1, 0, 0, 0, 1180, 1185, 3, 180, 90, 0, 1181, 1182, 7, 7, 0, 0, 1182, 1184, 3, 180, 90, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1187, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 179, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1188, 1193, 3, 182, 91, 0, 1189, 1190, 7, 8, 0, 0, 1190, 1192, 3, 182, 91, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1195, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 181, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1196, 1201, 3, 184, 92, 0, 1197, 1198, 7, 9, 0, 0, 1198, 1200, 3, 184, 92, 0, 1199, 1197, 1, 0, 0, 0, 1200, 1203, 1, 0, 0, 0, 1201, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 183, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1209, 3, 186, 93, 0, 1205, 1206, 7, 10, 0, 0, 1206, 1208, 3, 186, 93, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 185, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1216, 3, 188, 94, 0, 1213, 1214, 5, 109, 0, 0, 1214, 1215, 5, 128, 0, 0, 1215, 1217, 3, 378, 189, 0, 1216, 1213, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 187, 1, 0, 0, 0, 1218, 1222, 3, 190, 95, 0, 1219, 1220, 5, 157, 0, 0, 1220, 1221, 5, 58, 0, 0, 1221, 1223, 3, 378, 189, 0, 1222, 1219, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 189, 1, 0, 0, 0, 1224, 1228, 3, 192, 96, 0, 1225, 1226, 5, 68, 0, 0, 1226, 1227, 5, 58, 0, 0, 1227, 1229, 3, 374, 187, 0, 1228, 1225, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 191, 1, 0, 0, 0, 1230, 1234, 3, 194, 97, 0, 1231, 1232, 5, 67, 0, 0, 1232, 1233, 5, 58, 0, 0, 1233, 1235, 3, 374, 187, 0, 1234, 1231, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 193, 1, 0, 0, 0, 1236, 1241, 3, 198, 99, 0, 1237, 1238, 5, 49, 0, 0, 1238, 1240, 3, 196, 98, 0, 1239, 1237, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 195, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1245, 3, 254, 127, 0, 1245, 1246, 3, 244, 122, 0, 1246, 197, 1, 0, 0, 0, 1247, 1249, 7, 7, 0, 0, 1248, 1247, 1, 0, 0, 0, 1249, 1252, 1, 0, 0, 0, 1250, 1248, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1253, 1, 0, 0, 0, 1252, 1250, 1, 0, 0, 0, 1253, 1254, 3, 200, 100, 0, 1254, 199, 1, 0, 0, 0, 1255, 1259, 3, 208, 104, 0, 1256, 1259, 3, 212, 106, 0, 1257, 1259, 3, 214, 107, 0, 1258, 1255, 1, 0, 0, 0, 1258, 1256, 1, 0, 0, 0, 1258, 1257, 1, 0, 0, 0, 1259, 201, 1, 0, 0, 0, 1260, 1269, 5, 19, 0, 0, 1261, 1269, 5, 20, 0, 0, 1262, 1269, 5, 40, 0, 0, 1263, 1264, 5, 40, 0, 0, 1264, 1269, 5, 19, 0, 0, 1265, 1269, 5, 41, 0, 0, 1266, 1267, 5, 41, 0, 0, 1267, 1269, 5, 19, 0, 0, 1268, 1260, 1, 0, 0, 0, 1268, 1261, 1, 0, 0, 0, 1268, 1262, 1, 0, 0, 0, 1268, 1263, 1, 0, 0, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1269, 203, 1, 0, 0, 0, 1270, 1271, 7, 11, 0, 0, 1271, 205, 1, 0, 0, 0, 1272, 1278, 5, 111, 0, 0, 1273, 1274, 5, 40, 0, 0, 1274, 1278, 5, 40, 0, 0, 1275, 1276, 5, 41, 0, 0, 1276, 1278, 5, 41, 0, 0, 1277, 1272, 1, 0, 0, 0, 1277, 1273, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1278, 207, 1, 0, 0, 0, 1279, 1283, 5, 165, 0, 0, 1280, 1284, 3, 210, 105, 0, 1281, 1282, 7, 12, 0, 0, 1282, 1284, 3, 420, 210, 0, 1283, 1280, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 3, 152, 76, 0, 1286, 209, 1, 0, 0, 0, 1287, 1288, 7, 13, 0, 0, 1288, 211, 1, 0, 0, 0, 1289, 1291, 5, 17, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 25, 0, 0, 1295, 1296, 3, 76, 38, 0, 1296, 1297, 5, 26, 0, 0, 1297, 213, 1, 0, 0, 0, 1298, 1303, 3, 216, 108, 0, 1299, 1300, 5, 46, 0, 0, 1300, 1302, 3, 216, 108, 0, 1301, 1299, 1, 0, 0, 0, 1302, 1305, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 215, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1306, 1308, 5, 36, 0, 0, 1307, 1309, 3, 218, 109, 0, 1308, 1307, 1, 0, 0, 0, 1308, 1309, 1, 0, 0, 0, 1309, 1314, 1, 0, 0, 0, 1310, 1311, 5, 37, 0, 0, 1311, 1314, 3, 218, 109, 0, 1312, 1314, 3, 218, 109, 0, 1313, 1306, 1, 0, 0, 0, 1313, 1310, 1, 0, 0, 0, 1313, 1312, 1, 0, 0, 0, 1314, 217, 1, 0, 0, 0, 1315, 1320, 3, 220, 110, 0, 1316, 1317, 7, 14, 0, 0, 1317, 1319, 3, 220, 110, 0, 1318, 1316, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 219, 1, 0, 0, 0, 1322, 1320, 1, 0, 0, 0, 1323, 1326, 3, 242, 121, 0, 1324, 1326, 3, 222, 111, 0, 1325, 1323, 1, 0, 0, 0, 1325, 1324, 1, 0, 0, 0, 1326, 221, 1, 0, 0, 0, 1327, 1330, 3, 230, 115, 0, 1328, 1330, 3, 224, 112, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 3, 246, 123, 0, 1332, 223, 1, 0, 0, 0, 1333, 1334, 3, 226, 113, 0, 1334, 1335, 3, 236, 118, 0, 1335, 1338, 1, 0, 0, 0, 1336, 1338, 3, 228, 114, 0, 1337, 1333, 1, 0, 0, 0, 1337, 1336, 1, 0, 0, 0, 1338, 225, 1, 0, 0, 0, 1339, 1340, 7, 15, 0, 0, 1340, 1341, 5, 33, 0, 0, 1341, 1342, 5, 33, 0, 0, 1342, 227, 1, 0, 0, 0, 1343, 1345, 5, 43, 0, 0, 1344, 1343, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 3, 236, 118, 0, 1347, 229, 1, 0, 0, 0, 1348, 1349, 3, 232, 116, 0, 1349, 1350, 3, 236, 118, 0, 1350, 1353, 1, 0, 0, 0, 1351, 1353, 3, 234, 117, 0, 1352, 1348, 1, 0, 0, 0, 1352, 1351, 1, 0, 0, 0, 1353, 231, 1, 0, 0, 0, 1354, 1355, 7, 16, 0, 0, 1355, 1356, 5, 33, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 233, 1, 0, 0, 0, 1358, 1359, 5, 32, 0, 0, 1359, 235, 1, 0, 0, 0, 1360, 1363, 3, 238, 119, 0, 1361, 1363, 3, 384, 192, 0, 1362, 1360, 1, 0, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 237, 1, 0, 0, 0, 1364, 1367, 3, 456, 228, 0, 1365, 1367, 3, 240, 120, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 239, 1, 0, 0, 0, 1368, 1372, 5, 27, 0, 0, 1369, 1372, 5, 186, 0, 0, 1370, 1372, 5, 187, 0, 0, 1371, 1368, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1370, 1, 0, 0, 0, 1372, 241, 1, 0, 0, 0, 1373, 1379, 3, 256, 128, 0, 1374, 1378, 3, 248, 124, 0, 1375, 1378, 3, 244, 122, 0, 1376, 1378, 3, 250, 125, 0, 1377, 1374, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1377, 1376, 1, 0, 0, 0, 1378, 1381, 1, 0, 0, 0, 1379, 1377, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 243, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1382, 1391, 5, 21, 0, 0, 1383, 1388, 3, 276, 138, 0, 1384, 1385, 5, 30, 0, 0, 1385, 1387, 3, 276, 138, 0, 1386, 1384, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1392, 1, 0, 0, 0, 1390, 1388, 1, 0, 0, 0, 1391, 1383, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 5, 22, 0, 0, 1394, 245, 1, 0, 0, 0, 1395, 1397, 3, 248, 124, 0, 1396, 1395, 1, 0, 0, 0, 1397, 1400, 1, 0, 0, 0, 1398, 1396, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 247, 1, 0, 0, 0, 1400, 1398, 1, 0, 0, 0, 1401, 1402, 5, 23, 0, 0, 1402, 1403, 3, 76, 38, 0, 1403, 1404, 5, 24, 0, 0, 1404, 249, 1, 0, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1407, 3, 252, 126, 0, 1407, 251, 1, 0, 0, 0, 1408, 1413, 3, 460, 230, 0, 1409, 1413, 5, 5, 0, 0, 1410, 1413, 3, 266, 133, 0, 1411, 1413, 5, 27, 0, 0, 1412, 1408, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 253, 1, 0, 0, 0, 1414, 1418, 3, 456, 228, 0, 1415, 1418, 3, 262, 131, 0, 1416, 1418, 3, 266, 133, 0, 1417, 1414, 1, 0, 0, 0, 1417, 1415, 1, 0, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 255, 1, 0, 0, 0, 1419, 1433, 3, 258, 129, 0, 1420, 1433, 3, 262, 131, 0, 1421, 1433, 3, 266, 133, 0, 1422, 1433, 3, 268, 134, 0, 1423, 1433, 3, 274, 137, 0, 1424, 1433, 3, 270, 135, 0, 1425, 1433, 3, 272, 136, 0, 1426, 1433, 3, 278, 139, 0, 1427, 1433, 3, 340, 170, 0, 1428, 1433, 3, 348, 174, 0, 1429, 1433, 3, 352, 176, 0, 1430, 1433, 3, 358, 179, 0, 1431, 1433, 3, 372, 186, 0, 1432, 1419, 1, 0, 0, 0, 1432, 1420, 1, 0, 0, 0, 1432, 1421, 1, 0, 0, 0, 1432, 1422, 1, 0, 0, 0, 1432, 1423, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1425, 1, 0, 0, 0, 1432, 1426, 1, 0, 0, 0, 1432, 1427, 1, 0, 0, 0, 1432, 1428, 1, 0, 0, 0, 1432, 1429, 1, 0, 0, 0, 1432, 1430, 1, 0, 0, 0, 1432, 1431, 1, 0, 0, 0, 1433, 257, 1, 0, 0, 0, 1434, 1437, 3, 260, 130, 0, 1435, 1437, 3, 476, 238, 0, 1436, 1434, 1, 0, 0, 0, 1436, 1435, 1, 0, 0, 0, 1437, 259, 1, 0, 0, 0, 1438, 1439, 7, 17, 0, 0, 1439, 261, 1, 0, 0, 0, 1440, 1441, 5, 44, 0, 0, 1441, 1442, 3, 456, 228, 0, 1442, 263, 1, 0, 0, 0, 1443, 1444, 3, 456, 228, 0, 1444, 265, 1, 0, 0, 0, 1445, 1447, 5, 21, 0, 0, 1446, 1448, 3, 76, 38, 0, 1447, 1446, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 5, 22, 0, 0, 1450, 267, 1, 0, 0, 0, 1451, 1452, 5, 31, 0, 0, 1452, 269, 1, 0, 0, 0, 1453, 1454, 5, 133, 0, 0, 1454, 1455, 3, 152, 76, 0, 1455, 271, 1, 0, 0, 0, 1456, 1457, 5, 163, 0, 0, 1457, 1458, 3, 152, 76, 0, 1458, 273, 1, 0, 0, 0, 1459, 1460, 3, 456, 228, 0, 1460, 1461, 3, 244, 122, 0, 1461, 275, 1, 0, 0, 0, 1462, 1465, 3, 78, 39, 0, 1463, 1465, 5, 42, 0, 0, 1464, 1462, 1, 0, 0, 0, 1464, 1463, 1, 0, 0, 0, 1465, 277, 1, 0, 0, 0, 1466, 1469, 3, 280, 140, 0, 1467, 1469, 3, 302, 151, 0, 1468, 1466, 1, 0, 0, 0, 1468, 1467, 1, 0, 0, 0, 1469, 279, 1, 0, 0, 0, 1470, 1474, 3, 282, 141, 0, 1471, 1474, 3, 284, 142, 0, 1472, 1474, 7, 18, 0, 0, 1473, 1470, 1, 0, 0, 0, 1473, 1471, 1, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 281, 1, 0, 0, 0, 1475, 1476, 5, 40, 0, 0, 1476, 1477, 3, 458, 229, 0, 1477, 1478, 3, 286, 143, 0, 1478, 1482, 5, 41, 0, 0, 1479, 1481, 3, 298, 149, 0, 1480, 1479, 1, 0, 0, 0, 1481, 1484, 1, 0, 0, 0, 1482, 1480, 1, 0, 0, 0, 1482, 1483, 1, 0, 0, 0, 1483, 1485, 1, 0, 0, 0, 1484, 1482, 1, 0, 0, 0, 1485, 1486, 5, 40, 0, 0, 1486, 1487, 5, 36, 0, 0, 1487, 1488, 3, 458, 229, 0, 1488, 1489, 5, 41, 0, 0, 1489, 283, 1, 0, 0, 0, 1490, 1491, 5, 40, 0, 0, 1491, 1492, 3, 458, 229, 0, 1492, 1493, 3, 286, 143, 0, 1493, 1494, 5, 36, 0, 0, 1494, 1495, 5, 41, 0, 0, 1495, 285, 1, 0, 0, 0, 1496, 1497, 3, 458, 229, 0, 1497, 1498, 5, 19, 0, 0, 1498, 1499, 3, 292, 146, 0, 1499, 1501, 1, 0, 0, 0, 1500, 1496, 1, 0, 0, 0, 1501, 1504, 1, 0, 0, 0, 1502, 1500, 1, 0, 0, 0, 1502, 1503, 1, 0, 0, 0, 1503, 287, 1, 0, 0, 0, 1504, 1502, 1, 0, 0, 0, 1505, 1512, 5, 11, 0, 0, 1506, 1511, 5, 9, 0, 0, 1507, 1511, 5, 10, 0, 0, 1508, 1511, 5, 1, 0, 0, 1509, 1511, 3, 294, 147, 0, 1510, 1506, 1, 0, 0, 0, 1510, 1507, 1, 0, 0, 0, 1510, 1508, 1, 0, 0, 0, 1510, 1509, 1, 0, 0, 0, 1511, 1514, 1, 0, 0, 0, 1512, 1510, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1515, 1, 0, 0, 0, 1514, 1512, 1, 0, 0, 0, 1515, 1516, 5, 11, 0, 0, 1516, 289, 1, 0, 0, 0, 1517, 1524, 5, 12, 0, 0, 1518, 1523, 5, 9, 0, 0, 1519, 1523, 5, 10, 0, 0, 1520, 1523, 5, 2, 0, 0, 1521, 1523, 3, 296, 148, 0, 1522, 1518, 1, 0, 0, 0, 1522, 1519, 1, 0, 0, 0, 1522, 1520, 1, 0, 0, 0, 1522, 1521, 1, 0, 0, 0, 1523, 1526, 1, 0, 0, 0, 1524, 1522, 1, 0, 0, 0, 1524, 1525, 1, 0, 0, 0, 1525, 1527, 1, 0, 0, 0, 1526, 1524, 1, 0, 0, 0, 1527, 1528, 5, 12, 0, 0, 1528, 291, 1, 0, 0, 0, 1529, 1532, 3, 288, 144, 0, 1530, 1532, 3, 290, 145, 0, 1531, 1529, 1, 0, 0, 0, 1531, 1530, 1, 0, 0, 0, 1532, 293, 1, 0, 0, 0, 1533, 1535, 5, 196, 0, 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, 1547, 1, 0, 0, 0, 1538, 1547, 5, 3, 0, 0, 1539, 1547, 5, 4, 0, 0, 1540, 1547, 3, 288, 144, 0, 1541, 1543, 5, 25, 0, 0, 1542, 1544, 3, 76, 38, 0, 1543, 1542, 1, 0, 0, 0, 1543, 1544, 1, 0, 0, 0, 1544, 1545, 1, 0, 0, 0, 1545, 1547, 5, 26, 0, 0, 1546, 1534, 1, 0, 0, 0, 1546, 1538, 1, 0, 0, 0, 1546, 1539, 1, 0, 0, 0, 1546, 1540, 1, 0, 0, 0, 1546, 1541, 1, 0, 0, 0, 1547, 295, 1, 0, 0, 0, 1548, 1550, 5, 196, 0, 0, 1549, 1548, 1, 0, 0, 0, 1550, 1551, 1, 0, 0, 0, 1551, 1549, 1, 0, 0, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1562, 1, 0, 0, 0, 1553, 1562, 5, 3, 0, 0, 1554, 1562, 5, 4, 0, 0, 1555, 1562, 3, 290, 145, 0, 1556, 1558, 5, 25, 0, 0, 1557, 1559, 3, 76, 38, 0, 1558, 1557, 1, 0, 0, 0, 1558, 1559, 1, 0, 0, 0, 1559, 1560, 1, 0, 0, 0, 1560, 1562, 5, 26, 0, 0, 1561, 1549, 1, 0, 0, 0, 1561, 1553, 1, 0, 0, 0, 1561, 1554, 1, 0, 0, 0, 1561, 1555, 1, 0, 0, 0, 1561, 1556, 1, 0, 0, 0, 1562, 297, 1, 0, 0, 0, 1563, 1570, 3, 280, 140, 0, 1564, 1570, 3, 300, 150, 0, 1565, 1570, 5, 16, 0, 0, 1566, 1570, 5, 11, 0, 0, 1567, 1570, 5, 12, 0, 0, 1568, 1570, 3, 482, 241, 0, 1569, 1563, 1, 0, 0, 0, 1569, 1564, 1, 0, 0, 0, 1569, 1565, 1, 0, 0, 0, 1569, 1566, 1, 0, 0, 0, 1569, 1567, 1, 0, 0, 0, 1569, 1568, 1, 0, 0, 0, 1570, 299, 1, 0, 0, 0, 1571, 1581, 7, 19, 0, 0, 1572, 1573, 5, 25, 0, 0, 1573, 1581, 5, 25, 0, 0, 1574, 1575, 5, 26, 0, 0, 1575, 1581, 5, 26, 0, 0, 1576, 1577, 5, 25, 0, 0, 1577, 1578, 3, 76, 38, 0, 1578, 1579, 5, 26, 0, 0, 1579, 1581, 1, 0, 0, 0, 1580, 1571, 1, 0, 0, 0, 1580, 1572, 1, 0, 0, 0, 1580, 1574, 1, 0, 0, 0, 1580, 1576, 1, 0, 0, 0, 1581, 301, 1, 0, 0, 0, 1582, 1591, 3, 318, 159, 0, 1583, 1591, 3, 320, 160, 0, 1584, 1591, 3, 324, 162, 0, 1585, 1591, 3, 326, 163, 0, 1586, 1591, 3, 334, 167, 0, 1587, 1591, 3, 336, 168, 0, 1588, 1591, 3, 338, 169, 0, 1589, 1591, 3, 304, 152, 0, 1590, 1582, 1, 0, 0, 0, 1590, 1583, 1, 0, 0, 0, 1590, 1584, 1, 0, 0, 0, 1590, 1585, 1, 0, 0, 0, 1590, 1586, 1, 0, 0, 0, 1590, 1587, 1, 0, 0, 0, 1590, 1588, 1, 0, 0, 0, 1590, 1589, 1, 0, 0, 0, 1591, 303, 1, 0, 0, 0, 1592, 1599, 3, 306, 153, 0, 1593, 1599, 3, 308, 154, 0, 1594, 1599, 3, 310, 155, 0, 1595, 1599, 3, 312, 156, 0, 1596, 1599, 3, 314, 157, 0, 1597, 1599, 3, 316, 158, 0, 1598, 1592, 1, 0, 0, 0, 1598, 1593, 1, 0, 0, 0, 1598, 1594, 1, 0, 0, 0, 1598, 1595, 1, 0, 0, 0, 1598, 1596, 1, 0, 0, 0, 1598, 1597, 1, 0, 0, 0, 1599, 305, 1, 0, 0, 0, 1600, 1601, 5, 172, 0, 0, 1601, 1602, 3, 322, 161, 0, 1602, 307, 1, 0, 0, 0, 1603, 1604, 5, 176, 0, 0, 1604, 1618, 5, 25, 0, 0, 1605, 1606, 3, 78, 39, 0, 1606, 1607, 5, 33, 0, 0, 1607, 1615, 3, 78, 39, 0, 1608, 1609, 5, 30, 0, 0, 1609, 1610, 3, 78, 39, 0, 1610, 1611, 5, 33, 0, 0, 1611, 1612, 3, 78, 39, 0, 1612, 1614, 1, 0, 0, 0, 1613, 1608, 1, 0, 0, 0, 1614, 1617, 1, 0, 0, 0, 1615, 1613, 1, 0, 0, 0, 1615, 1616, 1, 0, 0, 0, 1616, 1619, 1, 0, 0, 0, 1617, 1615, 1, 0, 0, 0, 1618, 1605, 1, 0, 0, 0, 1618, 1619, 1, 0, 0, 0, 1619, 1620, 1, 0, 0, 0, 1620, 1621, 5, 26, 0, 0, 1621, 309, 1, 0, 0, 0, 1622, 1623, 5, 175, 0, 0, 1623, 1624, 3, 322, 161, 0, 1624, 311, 1, 0, 0, 0, 1625, 1626, 5, 173, 0, 0, 1626, 1627, 5, 25, 0, 0, 1627, 1628, 3, 78, 39, 0, 1628, 1629, 5, 26, 0, 0, 1629, 313, 1, 0, 0, 0, 1630, 1631, 5, 174, 0, 0, 1631, 1632, 5, 25, 0, 0, 1632, 1633, 5, 26, 0, 0, 1633, 315, 1, 0, 0, 0, 1634, 1635, 5, 64, 0, 0, 1635, 1636, 3, 322, 161, 0, 1636, 317, 1, 0, 0, 0, 1637, 1638, 5, 84, 0, 0, 1638, 1639, 3, 152, 76, 0, 1639, 319, 1, 0, 0, 0, 1640, 1646, 5, 86, 0, 0, 1641, 1647, 3, 456, 228, 0, 1642, 1643, 5, 25, 0, 0, 1643, 1644, 3, 76, 38, 0, 1644, 1645, 5, 26, 0, 0, 1645, 1647, 1, 0, 0, 0, 1646, 1641, 1, 0, 0, 0, 1646, 1642, 1, 0, 0, 0, 1647, 1648, 1, 0, 0, 0, 1648, 1649, 3, 322, 161, 0, 1649, 321, 1, 0, 0, 0, 1650, 1651, 3, 152, 76, 0, 1651, 323, 1, 0, 0, 0, 1652, 1658, 5, 61, 0, 0, 1653, 1659, 3, 456, 228, 0, 1654, 1655, 5, 25, 0, 0, 1655, 1656, 3, 76, 38, 0, 1656, 1657, 5, 26, 0, 0, 1657, 1659, 1, 0, 0, 0, 1658, 1653, 1, 0, 0, 0, 1658, 1654, 1, 0, 0, 0, 1659, 1660, 1, 0, 0, 0, 1660, 1661, 3, 152, 76, 0, 1661, 325, 1, 0, 0, 0, 1662, 1665, 5, 121, 0, 0, 1663, 1666, 3, 328, 164, 0, 1664, 1666, 3, 330, 165, 0, 1665, 1663, 1, 0, 0, 0, 1665, 1664, 1, 0, 0, 0, 1666, 1667, 1, 0, 0, 0, 1667, 1668, 3, 332, 166, 0, 1668, 327, 1, 0, 0, 0, 1669, 1670, 3, 460, 230, 0, 1670, 329, 1, 0, 0, 0, 1671, 1672, 3, 152, 76, 0, 1672, 331, 1, 0, 0, 0, 1673, 1674, 3, 152, 76, 0, 1674, 333, 1, 0, 0, 0, 1675, 1676, 5, 154, 0, 0, 1676, 1677, 3, 152, 76, 0, 1677, 335, 1, 0, 0, 0, 1678, 1679, 5, 72, 0, 0, 1679, 1680, 3, 152, 76, 0, 1680, 337, 1, 0, 0, 0, 1681, 1687, 5, 140, 0, 0, 1682, 1688, 3, 460, 230, 0, 1683, 1684, 5, 25, 0, 0, 1684, 1685, 3, 76, 38, 0, 1685, 1686, 5, 26, 0, 0, 1686, 1688, 1, 0, 0, 0, 1687, 1682, 1, 0, 0, 0, 1687, 1683, 1, 0, 0, 0, 1688, 1689, 1, 0, 0, 0, 1689, 1690, 3, 152, 76, 0, 1690, 339, 1, 0, 0, 0, 1691, 1694, 3, 342, 171, 0, 1692, 1694, 3, 344, 172, 0, 1693, 1691, 1, 0, 0, 0, 1693, 1692, 1, 0, 0, 0, 1694, 341, 1, 0, 0, 0, 1695, 1696, 3, 456, 228, 0, 1696, 1697, 5, 47, 0, 0, 1697, 1698, 5, 5, 0, 0, 1698, 343, 1, 0, 0, 0, 1699, 1700, 3, 64, 32, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1703, 5, 21, 0, 0, 1702, 1704, 3, 60, 30, 0, 1703, 1702, 1, 0, 0, 0, 1703, 1704, 1, 0, 0, 0, 1704, 1705, 1, 0, 0, 0, 1705, 1708, 5, 22, 0, 0, 1706, 1707, 5, 58, 0, 0, 1707, 1709, 3, 378, 189, 0, 1708, 1706, 1, 0, 0, 0, 1708, 1709, 1, 0, 0, 0, 1709, 1710, 1, 0, 0, 0, 1710, 1711, 3, 346, 173, 0, 1711, 345, 1, 0, 0, 0, 1712, 1713, 3, 152, 76, 0, 1713, 347, 1, 0, 0, 0, 1714, 1715, 5, 118, 0, 0, 1715, 1724, 5, 25, 0, 0, 1716, 1721, 3, 350, 175, 0, 1717, 1718, 5, 30, 0, 0, 1718, 1720, 3, 350, 175, 0, 1719, 1717, 1, 0, 0, 0, 1720, 1723, 1, 0, 0, 0, 1721, 1719, 1, 0, 0, 0, 1721, 1722, 1, 0, 0, 0, 1722, 1725, 1, 0, 0, 0, 1723, 1721, 1, 0, 0, 0, 1724, 1716, 1, 0, 0, 0, 1724, 1725, 1, 0, 0, 0, 1725, 1726, 1, 0, 0, 0, 1726, 1727, 5, 26, 0, 0, 1727, 349, 1, 0, 0, 0, 1728, 1729, 3, 78, 39, 0, 1729, 1730, 7, 20, 0, 0, 1730, 1731, 3, 78, 39, 0, 1731, 351, 1, 0, 0, 0, 1732, 1735, 3, 354, 177, 0, 1733, 1735, 3, 356, 178, 0, 1734, 1732, 1, 0, 0, 0, 1734, 1733, 1, 0, 0, 0, 1735, 353, 1, 0, 0, 0, 1736, 1738, 5, 23, 0, 0, 1737, 1739, 3, 76, 38, 0, 1738, 1737, 1, 0, 0, 0, 1738, 1739, 1, 0, 0, 0, 1739, 1740, 1, 0, 0, 0, 1740, 1741, 5, 24, 0, 0, 1741, 355, 1, 0, 0, 0, 1742, 1743, 5, 57, 0, 0, 1743, 1744, 3, 152, 76, 0, 1744, 357, 1, 0, 0, 0, 1745, 1746, 5, 194, 0, 0, 1746, 1747, 3, 360, 180, 0, 1747, 1748, 5, 199, 0, 0, 1748, 359, 1, 0, 0, 0, 1749, 1755, 3, 368, 184, 0, 1750, 1751, 3, 370, 185, 0, 1751, 1752, 3, 368, 184, 0, 1752, 1754, 1, 0, 0, 0, 1753, 1750, 1, 0, 0, 0, 1754, 1757, 1, 0, 0, 0, 1755, 1753, 1, 0, 0, 0, 1755, 1756, 1, 0, 0, 0, 1756, 361, 1, 0, 0, 0, 1757, 1755, 1, 0, 0, 0, 1758, 1759, 7, 21, 0, 0, 1759, 363, 1, 0, 0, 0, 1760, 1761, 7, 22, 0, 0, 1761, 365, 1, 0, 0, 0, 1762, 1763, 7, 23, 0, 0, 1763, 367, 1, 0, 0, 0, 1764, 1775, 5, 197, 0, 0, 1765, 1766, 3, 362, 181, 0, 1766, 1767, 3, 364, 182, 0, 1767, 1775, 1, 0, 0, 0, 1768, 1769, 3, 366, 183, 0, 1769, 1770, 3, 362, 181, 0, 1770, 1771, 3, 362, 181, 0, 1771, 1775, 1, 0, 0, 0, 1772, 1775, 3, 362, 181, 0, 1773, 1775, 5, 25, 0, 0, 1774, 1764, 1, 0, 0, 0, 1774, 1765, 1, 0, 0, 0, 1774, 1768, 1, 0, 0, 0, 1774, 1772, 1, 0, 0, 0, 1774, 1773, 1, 0, 0, 0, 1775, 1778, 1, 0, 0, 0, 1776, 1774, 1, 0, 0, 0, 1776, 1777, 1, 0, 0, 0, 1777, 369, 1, 0, 0, 0, 1778, 1776, 1, 0, 0, 0, 1779, 1780, 5, 198, 0, 0, 1780, 1781, 3, 76, 38, 0, 1781, 1782, 5, 195, 0, 0, 1782, 371, 1, 0, 0, 0, 1783, 1784, 5, 42, 0, 0, 1784, 1785, 3, 252, 126, 0, 1785, 373, 1, 0, 0, 0, 1786, 1788, 3, 418, 209, 0, 1787, 1789, 5, 42, 0, 0, 1788, 1787, 1, 0, 0, 0, 1788, 1789, 1, 0, 0, 0, 1789, 375, 1, 0, 0, 0, 1790, 1791, 5, 58, 0, 0, 1791, 1792, 3, 378, 189, 0, 1792, 377, 1, 0, 0, 0, 1793, 1794, 5, 89, 0, 0, 1794, 1795, 5, 21, 0, 0, 1795, 1803, 5, 22, 0, 0, 1796, 1800, 3, 380, 190, 0, 1797, 1801, 5, 42, 0, 0, 1798, 1801, 5, 27, 0, 0, 1799, 1801, 5, 28, 0, 0, 1800, 1797, 1, 0, 0, 0, 1800, 1798, 1, 0, 0, 0, 1800, 1799, 1, 0, 0, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1803, 1, 0, 0, 0, 1802, 1793, 1, 0, 0, 0, 1802, 1796, 1, 0, 0, 0, 1803, 379, 1, 0, 0, 0, 1804, 1814, 3, 384, 192, 0, 1805, 1806, 5, 112, 0, 0, 1806, 1807, 5, 21, 0, 0, 1807, 1814, 5, 22, 0, 0, 1808, 1814, 3, 422, 211, 0, 1809, 1814, 3, 428, 214, 0, 1810, 1814, 3, 434, 217, 0, 1811, 1814, 3, 382, 191, 0, 1812, 1814, 3, 440, 220, 0, 1813, 1804, 1, 0, 0, 0, 1813, 1805, 1, 0, 0, 0, 1813, 1808, 1, 0, 0, 0, 1813, 1809, 1, 0, 0, 0, 1813, 1810, 1, 0, 0, 0, 1813, 1811, 1, 0, 0, 0, 1813, 1812, 1, 0, 0, 0, 1814, 381, 1, 0, 0, 0, 1815, 1816, 3, 456, 228, 0, 1816, 383, 1, 0, 0, 0, 1817, 1830, 3, 390, 195, 0, 1818, 1830, 3, 406, 203, 0, 1819, 1830, 3, 400, 200, 0, 1820, 1830, 3, 410, 205, 0, 1821, 1830, 3, 404, 202, 0, 1822, 1830, 3, 398, 199, 0, 1823, 1830, 3, 394, 197, 0, 1824, 1830, 3, 392, 196, 0, 1825, 1830, 3, 396, 198, 0, 1826, 1830, 3, 444, 222, 0, 1827, 1830, 3, 388, 194, 0, 1828, 1830, 3, 386, 193, 0, 1829, 1817, 1, 0, 0, 0, 1829, 1818, 1, 0, 0, 0, 1829, 1819, 1, 0, 0, 0, 1829, 1820, 1, 0, 0, 0, 1829, 1821, 1, 0, 0, 0, 1829, 1822, 1, 0, 0, 0, 1829, 1823, 1, 0, 0, 0, 1829, 1824, 1, 0, 0, 0, 1829, 1825, 1, 0, 0, 0, 1829, 1826, 1, 0, 0, 0, 1829, 1827, 1, 0, 0, 0, 1829, 1828, 1, 0, 0, 0, 1830, 385, 1, 0, 0, 0, 1831, 1832, 5, 127, 0, 0, 1832, 1834, 5, 21, 0, 0, 1833, 1835, 5, 27, 0, 0, 1834, 1833, 1, 0, 0, 0, 1834, 1835, 1, 0, 0, 0, 1835, 1836, 1, 0, 0, 0, 1836, 1837, 5, 22, 0, 0, 1837, 387, 1, 0, 0, 0, 1838, 1839, 5, 64, 0, 0, 1839, 1840, 5, 21, 0, 0, 1840, 1841, 5, 22, 0, 0, 1841, 389, 1, 0, 0, 0, 1842, 1843, 5, 85, 0, 0, 1843, 1846, 5, 21, 0, 0, 1844, 1847, 3, 406, 203, 0, 1845, 1847, 3, 410, 205, 0, 1846, 1844, 1, 0, 0, 0, 1846, 1845, 1, 0, 0, 0, 1846, 1847, 1, 0, 0, 0, 1847, 1848, 1, 0, 0, 0, 1848, 1849, 5, 22, 0, 0, 1849, 391, 1, 0, 0, 0, 1850, 1851, 5, 154, 0, 0, 1851, 1852, 5, 21, 0, 0, 1852, 1853, 5, 22, 0, 0, 1853, 393, 1, 0, 0, 0, 1854, 1855, 5, 72, 0, 0, 1855, 1856, 5, 21, 0, 0, 1856, 1857, 5, 22, 0, 0, 1857, 395, 1, 0, 0, 0, 1858, 1859, 5, 124, 0, 0, 1859, 1860, 5, 21, 0, 0, 1860, 1861, 5, 22, 0, 0, 1861, 397, 1, 0, 0, 0, 1862, 1863, 5, 140, 0, 0, 1863, 1866, 5, 21, 0, 0, 1864, 1867, 3, 460, 230, 0, 1865, 1867, 3, 476, 238, 0, 1866, 1864, 1, 0, 0, 0, 1866, 1865, 1, 0, 0, 0, 1866, 1867, 1, 0, 0, 0, 1867, 1868, 1, 0, 0, 0, 1868, 1869, 5, 22, 0, 0, 1869, 399, 1, 0, 0, 0, 1870, 1871, 5, 61, 0, 0, 1871, 1877, 5, 21, 0, 0, 1872, 1875, 3, 402, 201, 0, 1873, 1874, 5, 30, 0, 0, 1874, 1876, 3, 420, 210, 0, 1875, 1873, 1, 0, 0, 0, 1875, 1876, 1, 0, 0, 0, 1876, 1878, 1, 0, 0, 0, 1877, 1872, 1, 0, 0, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1879, 1, 0, 0, 0, 1879, 1880, 5, 22, 0, 0, 1880, 401, 1, 0, 0, 0, 1881, 1884, 3, 414, 207, 0, 1882, 1884, 5, 27, 0, 0, 1883, 1881, 1, 0, 0, 0, 1883, 1882, 1, 0, 0, 0, 1884, 403, 1, 0, 0, 0, 1885, 1886, 5, 144, 0, 0, 1886, 1887, 5, 21, 0, 0, 1887, 1888, 3, 442, 221, 0, 1888, 1889, 5, 22, 0, 0, 1889, 405, 1, 0, 0, 0, 1890, 1891, 5, 86, 0, 0, 1891, 1900, 5, 21, 0, 0, 1892, 1898, 3, 408, 204, 0, 1893, 1894, 5, 30, 0, 0, 1894, 1896, 3, 420, 210, 0, 1895, 1897, 5, 42, 0, 0, 1896, 1895, 1, 0, 0, 0, 1896, 1897, 1, 0, 0, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1893, 1, 0, 0, 0, 1898, 1899, 1, 0, 0, 0, 1899, 1901, 1, 0, 0, 0, 1900, 1892, 1, 0, 0, 0, 1900, 1901, 1, 0, 0, 0, 1901, 1902, 1, 0, 0, 0, 1902, 1903, 5, 22, 0, 0, 1903, 407, 1, 0, 0, 0, 1904, 1907, 3, 416, 208, 0, 1905, 1907, 5, 27, 0, 0, 1906, 1904, 1, 0, 0, 0, 1906, 1905, 1, 0, 0, 0, 1907, 409, 1, 0, 0, 0, 1908, 1909, 5, 145, 0, 0, 1909, 1910, 5, 21, 0, 0, 1910, 1911, 3, 412, 206, 0, 1911, 1912, 5, 22, 0, 0, 1912, 411, 1, 0, 0, 0, 1913, 1914, 3, 416, 208, 0, 1914, 413, 1, 0, 0, 0, 1915, 1916, 3, 456, 228, 0, 1916, 415, 1, 0, 0, 0, 1917, 1918, 3, 456, 228, 0, 1918, 417, 1, 0, 0, 0, 1919, 1920, 3, 420, 210, 0, 1920, 419, 1, 0, 0, 0, 1921, 1922, 3, 456, 228, 0, 1922, 421, 1, 0, 0, 0, 1923, 1925, 3, 66, 33, 0, 1924, 1923, 1, 0, 0, 0, 1925, 1928, 1, 0, 0, 0, 1926, 1924, 1, 0, 0, 0, 1926, 1927, 1, 0, 0, 0, 1927, 1931, 1, 0, 0, 0, 1928, 1926, 1, 0, 0, 0, 1929, 1932, 3, 424, 212, 0, 1930, 1932, 3, 426, 213, 0, 1931, 1929, 1, 0, 0, 0, 1931, 1930, 1, 0, 0, 0, 1932, 423, 1, 0, 0, 0, 1933, 1934, 5, 99, 0, 0, 1934, 1935, 5, 21, 0, 0, 1935, 1936, 5, 27, 0, 0, 1936, 1937, 5, 22, 0, 0, 1937, 425, 1, 0, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1948, 5, 21, 0, 0, 1940, 1945, 3, 378, 189, 0, 1941, 1942, 5, 30, 0, 0, 1942, 1944, 3, 378, 189, 0, 1943, 1941, 1, 0, 0, 0, 1944, 1947, 1, 0, 0, 0, 1945, 1943, 1, 0, 0, 0, 1945, 1946, 1, 0, 0, 0, 1946, 1949, 1, 0, 0, 0, 1947, 1945, 1, 0, 0, 0, 1948, 1940, 1, 0, 0, 0, 1948, 1949, 1, 0, 0, 0, 1949, 1950, 1, 0, 0, 0, 1950, 1951, 5, 22, 0, 0, 1951, 1952, 5, 58, 0, 0, 1952, 1953, 3, 378, 189, 0, 1953, 427, 1, 0, 0, 0, 1954, 1957, 3, 430, 215, 0, 1955, 1957, 3, 432, 216, 0, 1956, 1954, 1, 0, 0, 0, 1956, 1955, 1, 0, 0, 0, 1957, 429, 1, 0, 0, 0, 1958, 1959, 5, 118, 0, 0, 1959, 1960, 5, 21, 0, 0, 1960, 1961, 5, 27, 0, 0, 1961, 1962, 5, 22, 0, 0, 1962, 431, 1, 0, 0, 0, 1963, 1964, 5, 118, 0, 0, 1964, 1965, 5, 21, 0, 0, 1965, 1966, 3, 456, 228, 0, 1966, 1967, 5, 30, 0, 0, 1967, 1968, 3, 378, 189, 0, 1968, 1969, 5, 22, 0, 0, 1969, 433, 1, 0, 0, 0, 1970, 1973, 3, 436, 218, 0, 1971, 1973, 3, 438, 219, 0, 1972, 1970, 1, 0, 0, 0, 1972, 1971, 1, 0, 0, 0, 1973, 435, 1, 0, 0, 0, 1974, 1975, 5, 57, 0, 0, 1975, 1976, 5, 21, 0, 0, 1976, 1977, 5, 27, 0, 0, 1977, 1978, 5, 22, 0, 0, 1978, 437, 1, 0, 0, 0, 1979, 1980, 5, 57, 0, 0, 1980, 1981, 5, 21, 0, 0, 1981, 1982, 3, 378, 189, 0, 1982, 1983, 5, 22, 0, 0, 1983, 439, 1, 0, 0, 0, 1984, 1985, 5, 21, 0, 0, 1985, 1986, 3, 380, 190, 0, 1986, 1987, 5, 22, 0, 0, 1987, 441, 1, 0, 0, 0, 1988, 1989, 3, 414, 207, 0, 1989, 443, 1, 0, 0, 0, 1990, 1996, 3, 446, 223, 0, 1991, 1996, 3, 448, 224, 0, 1992, 1996, 3, 450, 225, 0, 1993, 1996, 3, 452, 226, 0, 1994, 1996, 3, 454, 227, 0, 1995, 1990, 1, 0, 0, 0, 1995, 1991, 1, 0, 0, 0, 1995, 1992, 1, 0, 0, 0, 1995, 1993, 1, 0, 0, 0, 1995, 1994, 1, 0, 0, 0, 1996, 445, 1, 0, 0, 0, 1997, 1998, 5, 172, 0, 0, 1998, 2000, 5, 21, 0, 0, 1999, 2001, 3, 476, 238, 0, 2000, 1999, 1, 0, 0, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 1, 0, 0, 0, 2002, 2003, 5, 22, 0, 0, 2003, 447, 1, 0, 0, 0, 2004, 2005, 5, 176, 0, 0, 2005, 2007, 5, 21, 0, 0, 2006, 2008, 3, 476, 238, 0, 2007, 2006, 1, 0, 0, 0, 2007, 2008, 1, 0, 0, 0, 2008, 2009, 1, 0, 0, 0, 2009, 2010, 5, 22, 0, 0, 2010, 449, 1, 0, 0, 0, 2011, 2012, 5, 175, 0, 0, 2012, 2014, 5, 21, 0, 0, 2013, 2015, 3, 476, 238, 0, 2014, 2013, 1, 0, 0, 0, 2014, 2015, 1, 0, 0, 0, 2015, 2016, 1, 0, 0, 0, 2016, 2017, 5, 22, 0, 0, 2017, 451, 1, 0, 0, 0, 2018, 2019, 5, 173, 0, 0, 2019, 2021, 5, 21, 0, 0, 2020, 2022, 3, 476, 238, 0, 2021, 2020, 1, 0, 0, 0, 2021, 2022, 1, 0, 0, 0, 2022, 2023, 1, 0, 0, 0, 2023, 2024, 5, 22, 0, 0, 2024, 453, 1, 0, 0, 0, 2025, 2026, 5, 174, 0, 0, 2026, 2028, 5, 21, 0, 0, 2027, 2029, 3, 476, 238, 0, 2028, 2027, 1, 0, 0, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 1, 0, 0, 0, 2030, 2031, 5, 22, 0, 0, 2031, 455, 1, 0, 0, 0, 2032, 2035, 3, 458, 229, 0, 2033, 2035, 5, 184, 0, 0, 2034, 2032, 1, 0, 0, 0, 2034, 2033, 1, 0, 0, 0, 2035, 457, 1, 0, 0, 0, 2036, 2039, 5, 185, 0, 0, 2037, 2039, 3, 460, 230, 0, 2038, 2036, 1, 0, 0, 0, 2038, 2037, 1, 0, 0, 0, 2039, 459, 1, 0, 0, 0, 2040, 2043, 5, 188, 0, 0, 2041, 2043, 3, 464, 232, 0, 2042, 2040, 1, 0, 0, 0, 2042, 2041, 1, 0, 0, 0, 2043, 461, 1, 0, 0, 0, 2044, 2049, 5, 185, 0, 0, 2045, 2049, 5, 188, 0, 0, 2046, 2049, 5, 184, 0, 0, 2047, 2049, 3, 468, 234, 0, 2048, 2044, 1, 0, 0, 0, 2048, 2045, 1, 0, 0, 0, 2048, 2046, 1, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 463, 1, 0, 0, 0, 2050, 2053, 3, 468, 234, 0, 2051, 2053, 3, 466, 233, 0, 2052, 2050, 1, 0, 0, 0, 2052, 2051, 1, 0, 0, 0, 2053, 465, 1, 0, 0, 0, 2054, 2055, 7, 24, 0, 0, 2055, 467, 1, 0, 0, 0, 2056, 2057, 7, 25, 0, 0, 2057, 469, 1, 0, 0, 0, 2058, 2059, 3, 476, 238, 0, 2059, 471, 1, 0, 0, 0, 2060, 2067, 5, 11, 0, 0, 2061, 2066, 5, 9, 0, 0, 2062, 2066, 5, 10, 0, 0, 2063, 2066, 5, 1, 0, 0, 2064, 2066, 3, 478, 239, 0, 2065, 2061, 1, 0, 0, 0, 2065, 2062, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2064, 1, 0, 0, 0, 2066, 2069, 1, 0, 0, 0, 2067, 2065, 1, 0, 0, 0, 2067, 2068, 1, 0, 0, 0, 2068, 2070, 1, 0, 0, 0, 2069, 2067, 1, 0, 0, 0, 2070, 2071, 5, 11, 0, 0, 2071, 473, 1, 0, 0, 0, 2072, 2079, 5, 12, 0, 0, 2073, 2078, 5, 9, 0, 0, 2074, 2078, 5, 10, 0, 0, 2075, 2078, 5, 2, 0, 0, 2076, 2078, 3, 480, 240, 0, 2077, 2073, 1, 0, 0, 0, 2077, 2074, 1, 0, 0, 0, 2077, 2075, 1, 0, 0, 0, 2077, 2076, 1, 0, 0, 0, 2078, 2081, 1, 0, 0, 0, 2079, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2082, 1, 0, 0, 0, 2081, 2079, 1, 0, 0, 0, 2082, 2083, 5, 12, 0, 0, 2083, 475, 1, 0, 0, 0, 2084, 2087, 3, 472, 236, 0, 2085, 2087, 3, 474, 237, 0, 2086, 2084, 1, 0, 0, 0, 2086, 2085, 1, 0, 0, 0, 2087, 477, 1, 0, 0, 0, 2088, 2090, 5, 196, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2106, 1, 0, 0, 0, 2093, 2095, 5, 25, 0, 0, 2094, 2096, 3, 76, 38, 0, 2095, 2094, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2098, 1, 0, 0, 0, 2097, 2099, 5, 26, 0, 0, 2098, 2097, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2106, 1, 0, 0, 0, 2100, 2106, 5, 26, 0, 0, 2101, 2106, 5, 3, 0, 0, 2102, 2106, 5, 4, 0, 0, 2103, 2106, 3, 482, 241, 0, 2104, 2106, 3, 474, 237, 0, 2105, 2089, 1, 0, 0, 0, 2105, 2093, 1, 0, 0, 0, 2105, 2100, 1, 0, 0, 0, 2105, 2101, 1, 0, 0, 0, 2105, 2102, 1, 0, 0, 0, 2105, 2103, 1, 0, 0, 0, 2105, 2104, 1, 0, 0, 0, 2106, 479, 1, 0, 0, 0, 2107, 2109, 5, 196, 0, 0, 2108, 2107, 1, 0, 0, 0, 2109, 2110, 1, 0, 0, 0, 2110, 2108, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2125, 1, 0, 0, 0, 2112, 2114, 5, 25, 0, 0, 2113, 2115, 3, 76, 38, 0, 2114, 2113, 1, 0, 0, 0, 2114, 2115, 1, 0, 0, 0, 2115, 2117, 1, 0, 0, 0, 2116, 2118, 5, 26, 0, 0, 2117, 2116, 1, 0, 0, 0, 2117, 2118, 1, 0, 0, 0, 2118, 2125, 1, 0, 0, 0, 2119, 2125, 5, 26, 0, 0, 2120, 2125, 5, 3, 0, 0, 2121, 2125, 5, 4, 0, 0, 2122, 2125, 3, 482, 241, 0, 2123, 2125, 3, 472, 236, 0, 2124, 2108, 1, 0, 0, 0, 2124, 2112, 1, 0, 0, 0, 2124, 2119, 1, 0, 0, 0, 2124, 2120, 1, 0, 0, 0, 2124, 2121, 1, 0, 0, 0, 2124, 2122, 1, 0, 0, 0, 2124, 2123, 1, 0, 0, 0, 2125, 481, 1, 0, 0, 0, 2126, 2129, 3, 464, 232, 0, 2127, 2129, 7, 26, 0, 0, 2128, 2126, 1, 0, 0, 0, 2128, 2127, 1, 0, 0, 0, 2129, 2130, 1, 0, 0, 0, 2130, 2128, 1, 0, 0, 0, 2130, 2131, 1, 0, 0, 0, 2131, 483, 1, 0, 0, 0, 204, 485, 488, 491, 495, 504, 528, 534, 538, 545, 552, 568, 612, 619, 625, 634, 637, 646, 654, 663, 666, 680, 687, 689, 700, 707, 709, 717, 721, 725, 732, 738, 743, 752, 759, 777, 788, 794, 802, 809, 817, 823, 826, 829, 847, 853, 861, 868, 874, 881, 894, 903, 906, 911, 916, 934, 940, 944, 948, 951, 960, 966, 971, 973, 977, 984, 991, 1000, 1012, 1022, 1036, 1041, 1051, 1062, 1078, 1092, 1098, 1107, 1116, 1146, 1154, 1161, 1165, 1172, 1178, 1185, 1193, 1201, 1209, 1216, 1222, 1228, 1234, 1241, 1250, 1258, 1268, 1277, 1283, 1292, 1303, 1308, 1313, 1320, 1325, 1329, 1337, 1344, 1352, 1362, 1366, 1371, 1377, 1379, 1388, 1391, 1398, 1412, 1417, 1432, 1436, 1447, 1464, 1468, 1473, 1482, 1502, 1510, 1512, 1522, 1524, 1531, 1536, 1543, 1546, 1551, 1558, 1561, 1569, 1580, 1590, 1598, 1615, 1618, 1646, 1658, 1665, 1687, 1693, 1703, 1708, 1721, 1724, 1734, 1738, 1755, 1774, 1776, 1788, 1800, 1802, 1813, 1829, 1834, 1846, 1866, 1875, 1877, 1883, 1896, 1898, 1900, 1906, 1926, 1931, 1945, 1948, 1956, 1972, 1995, 2000, 2007, 2014, 2021, 2028, 2034, 2038, 2042, 2048, 2052, 2065, 2067, 2077, 2079, 2086, 2091, 2095, 2098, 2105, 2110, 2114, 2117, 2124, 2128, 2130] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java index db14e76fee..d58a597d98 100644 --- a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java @@ -155,8 +155,8 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { } PendingUpdateList pul = new PendingUpdateList(); - for (RuntimeIterator child : children) { - pul = PendingUpdateList.mergeUpdates(pul, child.getPendingUpdateList(context), this.getMetadata()); + for (RuntimeIterator child : this.children) { + pul.mergeUpdates(child.getPendingUpdateList(context), this.getMetadata()); } return pul; } diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index 131742fe57..f6dfc708ac 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -159,8 +159,7 @@ public JavaRDD getRDD(DynamicContext context) { public static JavaRDD dataFrameToRDDOfItems(JSoundDataFrame df, ExceptionMetadata metadata) { JavaRDD rowRDD = df.javaRDD(); - JavaRDD result = rowRDD.map(new RowToItemMapper(metadata, df.getItemType())); - return result; + return rowRDD.map(new RowToItemMapper(metadata, df.getItemType())); } public void materialize(DynamicContext context, List result) { diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index 15ed99c538..b225b1bd35 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -391,7 +391,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { } PendingUpdateList result = new PendingUpdateList(); - if (!isRDDOrDataFrame()) { + if (!this.expression.isRDDOrDataFrame()) { this.child.open(context); this.tupleContext = new DynamicContext(context); // assign current context @@ -401,12 +401,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.tupleContext.getVariableValues().setBindingsFromTuple(tuple, getMetadata()); // assign new // variables // from new tuple - - result = PendingUpdateList.mergeUpdates( - result, - this.expression.getPendingUpdateList(this.tupleContext), - this.getMetadata() - ); + result.mergeUpdates(this.expression.getPendingUpdateList(this.tupleContext), this.getMetadata()); } this.child.close(); @@ -432,7 +427,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { // from new tuple PendingUpdateList intermediateResult = this.expression.getPendingUpdateList(dynamicContext); - result = PendingUpdateList.mergeUpdates(result, intermediateResult, this.getMetadata()); + result.mergeUpdates(intermediateResult, this.getMetadata()); } } return result; diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java index 5e253d0d01..501d17953b 100644 --- a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java @@ -37,6 +37,7 @@ import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.typing.AtMostOneItemTypePromotionIterator; import org.rumbledb.runtime.typing.TypePromotionIterator; +import org.rumbledb.runtime.update.PendingUpdateList; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.SequenceType; import org.rumbledb.types.SequenceType.Arity; @@ -78,6 +79,7 @@ public FunctionItemCallIterator( this.functionItem = functionItem; this.functionArguments = functionArguments; this.functionBodyIterator = null; + this.isUpdating = functionItem.getSignature().isUpdating(); this.validateNumberOfArguments(); this.wrapArgumentIteratorsWithTypeCheckingIterators(); @@ -232,7 +234,8 @@ private RuntimeIterator generatePartiallyAppliedFunction(DynamicContext context) partialApplicationParamNames, new FunctionSignature( partialApplicationParamTypes, - this.functionItem.getSignature().getReturnType() + this.functionItem.getSignature().getReturnType(), + this.functionItem.getSignature().isUpdating() ), this.functionItem.getModuleDynamicContext(), this.functionItem.getBodyIterator(), @@ -346,4 +349,16 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) { this.functionBodyIterator = this.functionItem.getBodyIterator(); return this.functionBodyIterator.getDataFrame(this.dynamicContextForCalls); } + + @Override + public PendingUpdateList getPendingUpdateList(DynamicContext context) { + if (!isUpdating()) { + return new PendingUpdateList(); + } + this.populateDynamicContextWithArguments(context); + DynamicContext contextForUpdates = new DynamicContext(this.dynamicContextForCalls); + contextForUpdates.setCurrentMutabilityLevel(context.getCurrentMutabilityLevel()); + this.functionBodyIterator = this.functionItem.getBodyIterator(); + return this.functionBodyIterator.getPendingUpdateList(contextForUpdates); + } } diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java index b4854d4fad..83ad520810 100644 --- a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java @@ -44,13 +44,15 @@ public FunctionRuntimeIterator( Map paramNameToSequenceTypes, SequenceType returnType, RuntimeIterator bodyIterator, - RuntimeStaticContext staticContext + RuntimeStaticContext staticContext, + boolean isUpdating ) { super(null, staticContext); this.functionName = functionName; this.paramNameToSequenceTypes = paramNameToSequenceTypes; this.returnType = returnType; this.bodyIterator = bodyIterator; + this.isUpdating = isUpdating; } @Override @@ -61,7 +63,8 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { this.paramNameToSequenceTypes, this.returnType, dynamicContext.getModuleContext(), - bodyIteratorCopy + bodyIteratorCopy, + this.isUpdating ); function.populateClosureFromDynamicContext(dynamicContext, getMetadata()); return function; diff --git a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java index 6bf65e3b88..326e01ae76 100644 --- a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java @@ -31,6 +31,7 @@ import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.update.PendingUpdateList; import java.util.List; import java.util.Map; @@ -55,13 +56,15 @@ public class StaticUserDefinedFunctionCallIterator extends HybridRuntimeIterator public StaticUserDefinedFunctionCallIterator( FunctionIdentifier functionIdentifier, List functionArguments, - RuntimeStaticContext staticContext + RuntimeStaticContext staticContext, + boolean isUpdating ) { super(null, staticContext); this.functionIdentifier = functionIdentifier; this.functionArguments = functionArguments; this.userDefinedFunctionCallIterator = null; this.nextExitStatementResult = 0; + this.isUpdating = isUpdating; } protected boolean implementsDataFrames() { @@ -199,4 +202,19 @@ public Map getVariableDependencies() { } return result; } + + @Override + public PendingUpdateList getPendingUpdateList(DynamicContext context) { + if (!isUpdating()) { + return new PendingUpdateList(); + } + this.userDefinedFunctionCallIterator = context.getNamedFunctions() + .getUserDefinedFunctionCallIterator( + this.functionIdentifier, + this.getHighestExecutionMode(), + getMetadata(), + this.functionArguments + ); + return this.userDefinedFunctionCallIterator.getPendingUpdateList(context); + } } diff --git a/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java new file mode 100644 index 0000000000..6934f3b13e --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java @@ -0,0 +1,65 @@ +package org.rumbledb.runtime.functions.input; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.CannotRetrieveResourceException; +import org.rumbledb.items.structured.JSoundDataFrame; +import org.rumbledb.runtime.DataFrameRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; +import sparksoniq.spark.SparkSessionManager; + +import java.net.URI; +import java.util.List; + +import static org.apache.spark.sql.functions.lit; +import static org.apache.spark.sql.functions.monotonically_increasing_id; + +public class DeltaFileFunctionIterator extends DataFrameRuntimeIterator { + + private static final long serialVersionUID = 1L; + + public DeltaFileFunctionIterator( + List arguments, + RuntimeStaticContext staticContext + ) { + super(arguments, staticContext); + } + + @Override + public JSoundDataFrame getDataFrame(DynamicContext context) { + RuntimeIterator urlIterator = this.children.get(0); + urlIterator.open(context); + String url = urlIterator.next().getStringValue(); + urlIterator.close(); + URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata()); + if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) { + throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata()); + } + // DeltaTable deltaTable = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(), + // uri.toString()); + SparkSessionManager.getInstance() + .getOrCreateSession() + .read() + .format("delta") + .load(uri.toString()) + .withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id()) + .write() + .format("delta") + .mode("overwrite") + .option("overwriteSchema", true) + .save(uri.toString()); + Dataset dataFrame = SparkSessionManager.getInstance() + .getOrCreateSession() + .read() + .format("delta") + .load(uri.toString()); + dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0)); + dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id()); + dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit("")); + dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString())); + // TODO: Make unique DeltaTable code + return new JSoundDataFrame(dataFrame); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java index ae28047e8a..6e159fe805 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java @@ -73,7 +73,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) { } } - Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs); + Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true); this.hasNext = false; return result; diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java index edf66d1b5e..4f5bf5b141 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java @@ -113,7 +113,7 @@ private void getDescendantPairs(List items) { List valueList = Collections.singletonList(value); Item result = ItemFactory.getInstance() - .createObjectItem(keyList, valueList, getMetadata()); + .createObjectItem(keyList, valueList, getMetadata(), true); this.nextResults.add(result); getDescendantPairs(valueList); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java index ee05ad56cb..2315c72ac0 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java @@ -88,7 +88,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) { } } - Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs); + Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true); return result; } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java index e64f62c6ad..922dd969be 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java @@ -45,10 +45,10 @@ public Item call(Item arg0) throws Exception { for (String key : arg0.getKeys()) { Item value = arg0.getItemByKey(key); Item arrayValue = ItemFactory.getInstance() - .createArrayItem(new ArrayList(Collections.singletonList(value))); + .createArrayItem(new ArrayList(Collections.singletonList(value)), false); keyValuePairs.put(key, new ArrayList(Collections.singletonList(arrayValue))); } - return ItemFactory.getInstance().createObjectItem(keyValuePairs); + return ItemFactory.getInstance().createObjectItem(keyValuePairs, true); } }; diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java index 48f44c314e..aa3cd8de4e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java @@ -71,6 +71,6 @@ else if (!v2.isObject()) } } - return ItemFactory.getInstance().createObjectItem(keyValuePairs); + return ItemFactory.getInstance().createObjectItem(keyValuePairs, true); } }; diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java index 840c4f029a..4787501129 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java @@ -69,6 +69,18 @@ public void openLocal() { private void setResultsFromDF() { JSoundDataFrame childDF = this.iterator.getDataFrame(this.currentDynamicContextForLocalExecution); for (String key : childDF.getKeys()) { + if (key.equals(SparkSessionManager.mutabilityLevelColumnName)) { + continue; + } + if (key.equals(SparkSessionManager.rowIdColumnName)) { + continue; + } + if (key.equals(SparkSessionManager.tableLocationColumnName)) { + continue; + } + if (key.equals(SparkSessionManager.pathInColumnName)) { + continue; + } if ( !key.equals(SparkSessionManager.emptyObjectJSONiqItemColumnName) && !key.equals(SparkSessionManager.atomicJSONiqItemColumnName) diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java index 72a385ec29..f17a173d03 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java @@ -112,7 +112,7 @@ private Item getProjection(Item objItem, List keys) { } } return ItemFactory.getInstance() - .createObjectItem(finalKeylist, finalValueList, getMetadata()); + .createObjectItem(finalKeylist, finalValueList, getMetadata(), true); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java index 6b5dd20f0e..0a1f967c24 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java @@ -120,7 +120,7 @@ private Item removeKeys(Item objItem, List removalKeys) { } } return ItemFactory.getInstance() - .createObjectItem(finalKeylist, finalValueList, getMetadata()); + .createObjectItem(finalKeylist, finalValueList, getMetadata(), true); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java index cbda4f4ad7..9ae3102bb6 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java @@ -470,6 +470,18 @@ public Item materializeFirstItemOrNull(DynamicContext context) { if (df.isEmptySequence()) { return null; } + ItemType maxType; + if ( + df.getItemType().isObjectItemType() + && df.getItemType().getObjectContentFacet().containsKey("tableLocation") + ) { + maxType = df.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + } else { + maxType = df.getItemType(); + } String input = FlworDataFrameUtils.createTempView(df.getDataFrame()); JSoundDataFrame maxDF = df.evaluateSQL( String.format( @@ -478,7 +490,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) { SparkSessionManager.atomicJSONiqItemColumnName, input ), - df.getItemType() + maxType ); return itemTypePromotion(maxDF.getExactlyOneItem()); } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index 5aec4653a3..de6adcd1d7 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -23,6 +23,8 @@ import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.types.ArrayType; import org.apache.spark.sql.types.DataType; import org.apache.spark.sql.types.StructType; @@ -40,6 +42,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.ItemTypeFactory; import sparksoniq.spark.SparkSessionManager; @@ -237,6 +240,11 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context); initLookupPosition(context); String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame()); + boolean isObject = childDataFrame.getItemType().isObjectItemType(); + boolean hasAtomicJSONiqItem = isObject + && childDataFrame.getItemType() + .getObjectContentFacet() + .containsKey(SparkSessionManager.atomicJSONiqItemColumnName); if (childDataFrame.getItemType().isArrayItemType()) { ItemType elementType = childDataFrame.getItemType().getArrayContentFacet(); if (elementType.isObjectItemType()) { @@ -266,6 +274,66 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ), elementType ); + } else if ( + hasAtomicJSONiqItem + && + childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .isArrayItemType() + && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation") + ) { + ItemType elementType = childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .getArrayContentFacet(); + String sql; + JSoundDataFrame res; + if (elementType.isObjectItemType()) { + sql = String.format( + "SELECT `%s`.*, `%s`, `%s`, `%s`, `%s` FROM (SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s)", + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup - 1, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + this.lookup - 1, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array, + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup + ); + res = childDataFrame.evaluateSQL(sql, elementType); + } else { + sql = String.format( + "SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s", + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup - 1, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + this.lookup - 1, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array, + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup + ); + Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql); + ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema()); + res = new JSoundDataFrame(df, deltaItemType); + } + return res; } if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index ba12801d73..f88af52e11 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -23,6 +23,8 @@ import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.types.ArrayType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; @@ -39,6 +41,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.ItemTypeFactory; import sparksoniq.spark.SparkSessionManager; @@ -182,6 +185,11 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC public JSoundDataFrame getDataFrame(DynamicContext context) { JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context); String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame()); + boolean isObject = childDataFrame.getItemType().isObjectItemType(); + boolean hasAtomicJSONiqItem = isObject + && childDataFrame.getItemType() + .getObjectContentFacet() + .containsKey(SparkSessionManager.atomicJSONiqItemColumnName); if (childDataFrame.getItemType().isArrayItemType()) { ItemType elementType = childDataFrame.getItemType().getArrayContentFacet(); if (elementType.isObjectItemType()) { @@ -205,6 +213,59 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ), elementType ); + } else if ( + hasAtomicJSONiqItem + && childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .isArrayItemType() + && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation") + ) { + ItemType elementType = childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .getArrayContentFacet(); + String sql; + JSoundDataFrame res; + // TODO: SORT OUT INDEXING DURING UNBOXING + if (elementType.isObjectItemType()) { + sql = String.format( + "SELECT col.*, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)", + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array + ); + res = childDataFrame.evaluateSQL(sql, elementType); + } else { + sql = String.format( + "SELECT col, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)", + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array + ); + Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql); + ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema()); + res = new JSoundDataFrame(df, deltaItemType); + } + return res; } if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 1237e01e03..b66278c627 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -20,9 +20,16 @@ package org.rumbledb.runtime.navigation; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Map; + import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.types.DataType; import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; @@ -31,7 +38,12 @@ import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.errorcodes.ErrorCode; -import org.rumbledb.exceptions.*; +import org.rumbledb.exceptions.InvalidSelectorException; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.MoreThanOneItemException; +import org.rumbledb.exceptions.NoItemException; +import org.rumbledb.exceptions.UnexpectedStaticTypeException; +import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; @@ -44,17 +56,13 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; import org.rumbledb.types.SequenceType; import org.rumbledb.types.SequenceType.Arity; import org.rumbledb.types.TypeMappings; import sparksoniq.spark.SparkSessionManager; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Map; - public class ObjectLookupIterator extends HybridRuntimeIterator { private static final long serialVersionUID = 1L; @@ -351,21 +359,61 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { type = fieldDescriptor.getType(); } if (type.isObjectItemType()) { + // TODO: Find another way to check if delta dataframe -- e.g. flag and mutability level + // TODO: implement keyword vars to stop ust using strs + String sql; + if (childDataFrame.getKeys().contains("tableLocation")) { + sql = String.format( + "SELECT `%s`.*, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s", + key, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + key, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + object + ); + + } else { + sql = String.format("SELECT `%s`.* FROM %s", key, object); + } JSoundDataFrame result = childDataFrame.evaluateSQL( - String.format("SELECT `%s`.* FROM %s", key, object), + sql, type ); return result; } else { - JSoundDataFrame result = childDataFrame.evaluateSQL( - String.format( + String sql; + JSoundDataFrame result; + if (childDataFrame.getKeys().contains("tableLocation")) { + sql = String.format( + "SELECT `%s` AS `%s`, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s", + key, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + key, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + object + ); + Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql); + ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema()); + result = new JSoundDataFrame(df, deltaItemType); + } else { + sql = String.format( "SELECT `%s` AS `%s` FROM %s", key, SparkSessionManager.atomicJSONiqItemColumnName, object - ), - type - ); + ); + result = childDataFrame.evaluateSQL( + sql, + type + ); + } return result; } } diff --git a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java index 36b2d8b91d..d4e39c8d99 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java @@ -51,7 +51,7 @@ public Item materializeFirstItemOrNull( if (!this.children.isEmpty()) { result.addAll(this.children.get(0).materialize(dynamicContext)); } - Item item = ItemFactory.getInstance().createArrayItem(result); + Item item = ItemFactory.getInstance().createArrayItem(result, true); return item; } } diff --git a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java index 4c871ea861..cfa46df538 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java @@ -77,7 +77,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { } this.hasNext = false; return ItemFactory.getInstance() - .createObjectItem(keys, values, getMetadata()); + .createObjectItem(keys, values, getMetadata(), true); } else { @@ -90,7 +90,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { valueIterator.close(); // SIMILAR TO ZORBA, if value is more than one item, wrap it in an array if (currentResults.size() > 1) { - values.add(ItemFactory.getInstance().createArrayItem(currentResults)); + values.add(ItemFactory.getInstance().createArrayItem(currentResults, true)); } else if (currentResults.size() == 1) { values.add(currentResults.get(0)); } else { @@ -121,7 +121,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { } this.hasNext = false; return ItemFactory.getInstance() - .createObjectItem(keys, values, getMetadata()); + .createObjectItem(keys, values, getMetadata(), true); } } } diff --git a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java index 256a318fdd..91970ed72d 100644 --- a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java +++ b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java @@ -105,6 +105,16 @@ protected Item nextLocal() { return null; } + @Override + public boolean isSequential() { + return this.statementsAndExprIterator.isSequential(); + } + + @Override + public boolean isUpdating() { + return this.statementsAndExprIterator.isUpdating(); + } + @Override public PendingUpdateList getPendingUpdateList(DynamicContext context) { if (!encounteredExitStatement) { diff --git a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java index 8f7cc5beb4..bf035392dd 100644 --- a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java @@ -156,6 +156,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) { return exprIterator.getDataFrame(dynamicContext); } + @Override + public boolean isUpdating() { + return this.children.get(this.children.size() - 1).isUpdating(); + } + @Override public PendingUpdateList getPendingUpdateList(DynamicContext context) { RuntimeIterator exprIterator = this.children.get(this.children.size() - 1); diff --git a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java index b63ebe5004..39f972fe1e 100644 --- a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java @@ -23,6 +23,7 @@ import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.sequences.general.TreatAsClosure; +import org.rumbledb.runtime.update.PendingUpdateList; import org.rumbledb.types.ItemType; import org.rumbledb.types.ItemTypeFactory; import org.rumbledb.types.SequenceType; @@ -51,12 +52,14 @@ public class TreatIterator extends HybridRuntimeIterator { public TreatIterator( RuntimeIterator iterator, SequenceType sequenceType, + boolean isUpdating, ErrorCode errorCode, RuntimeStaticContext staticContext ) { super(Collections.singletonList(iterator), staticContext); this.iterator = iterator; this.sequenceType = sequenceType; + this.isUpdating = isUpdating; this.errorCode = errorCode; if (!this.sequenceType.isEmptySequence()) { this.itemType = this.sequenceType.getItemType(); @@ -73,6 +76,15 @@ public TreatIterator( } } + public TreatIterator( + RuntimeIterator iterator, + SequenceType sequenceType, + ErrorCode errorCode, + RuntimeStaticContext staticContext + ) { + this(iterator, sequenceType, false, errorCode, staticContext); + } + @Override public boolean hasNextLocal() { return this.hasNext; @@ -226,6 +238,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) { throw errorToThrow("" + dataItemType); } + @Override + public PendingUpdateList getPendingUpdateList(DynamicContext context) { + return iterator.getPendingUpdateList(context); + } + /** * Converts a homogeneous RDD of atomic values to a DataFrame * diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java index c8666e38c6..2bcb717650 100644 --- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java @@ -389,7 +389,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met } Integer minLength = itemType.getMinLengthFacet(); Integer maxLength = itemType.getMaxLengthFacet(); - Item arrayItem = ItemFactory.getInstance().createArrayItem(members); + Item arrayItem = ItemFactory.getInstance().createArrayItem(members, true); if (itemType.getName() == null) { itemType = itemType.getBaseType(); } @@ -453,7 +453,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met } } Item objectItem = ItemFactory.getInstance() - .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA); + .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true); if (itemType.getName() == null) { itemType = itemType.getBaseType(); } diff --git a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java index 6e56434714..346e72d68c 100644 --- a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java +++ b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java @@ -17,9 +17,27 @@ public class PendingUpdateList { private Map> delReplaceArrayMap; private Map> renameObjMap; private Comparator targetComparator; + private Comparator arraySelectorComparator; public PendingUpdateList() { + // TODO: diff comparator for delta this.targetComparator = (item1, item2) -> { + boolean itemIsDelta1 = item1.getTableLocation() != null && !item1.getTableLocation().equals("null"); + boolean itemIsDelta2 = item2.getTableLocation() != null && !item2.getTableLocation().equals("null"); + if (itemIsDelta1 && itemIsDelta2) { + int tableComp = item1.getTableLocation().compareTo(item2.getTableLocation()); + if (tableComp != 0) { + return tableComp; + } + int rowComp = Long.compare(item1.getTopLevelID(), item2.getTopLevelID()); + if (rowComp != 0) { + return rowComp; + } + return item1.getPathIn().compareTo(item2.getPathIn()); + } else if (itemIsDelta1 || itemIsDelta2) { + // TODO: what to compare when one is delta and one is not? Never occurs? + return 0; + } int hashCompare = Integer.compare(item1.hashCode(), item2.hashCode()); if (item1.hashCode() != item2.hashCode()) { return hashCompare; @@ -29,6 +47,7 @@ public PendingUpdateList() { } return Integer.compare(System.identityHashCode(item1), System.identityHashCode(item2)); }; + this.arraySelectorComparator = Comparator.comparingInt(Item::getIntValue).reversed(); this.insertObjMap = new TreeMap<>(this.targetComparator); this.insertArrayMap = new TreeMap<>(this.targetComparator); this.delReplaceObjMap = new TreeMap<>(this.targetComparator); @@ -44,39 +63,39 @@ public PendingUpdateList(UpdatePrimitive updatePrimitive) { public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) { Item target = updatePrimitive.getTarget(); if (updatePrimitive.isDeleteObject()) { - Map locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>()); for (Item locator : updatePrimitive.getContentList()) { locSrcMap.put(locator, null); } - delReplaceObjMap.put(target, locSrcMap); + this.delReplaceObjMap.put(target, locSrcMap); } else if (updatePrimitive.isReplaceObject()) { - Map locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent()); - delReplaceObjMap.put(target, locSrcMap); + this.delReplaceObjMap.put(target, locSrcMap); } else if (updatePrimitive.isInsertObject()) { - insertObjMap.put(target, updatePrimitive.getContent()); + this.insertObjMap.put(target, updatePrimitive.getContent()); } else if (updatePrimitive.isRenameObject()) { - Map locSrcMap = renameObjMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.renameObjMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent()); - renameObjMap.put(target, locSrcMap); + this.renameObjMap.put(target, locSrcMap); } else if (updatePrimitive.isDeleteArray()) { - Map locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), null); - delReplaceArrayMap.put(target, locSrcMap); + this.delReplaceArrayMap.put(target, locSrcMap); } else if (updatePrimitive.isReplaceArray()) { - Map locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent()); - delReplaceArrayMap.put(target, locSrcMap); + this.delReplaceArrayMap.put(target, locSrcMap); } else if (updatePrimitive.isInsertArray()) { - Map> locSrcMap = insertArrayMap.getOrDefault(target, new HashMap<>()); + Map> locSrcMap = this.insertArrayMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContentList()); - insertArrayMap.put(target, locSrcMap); + this.insertArrayMap.put(target, locSrcMap); } else { throw new OurBadException("Invalid UpdatePrimitive created"); } @@ -85,7 +104,9 @@ public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) { public void applyUpdates(ExceptionMetadata metadata) { UpdatePrimitiveFactory upFactory = UpdatePrimitiveFactory.getInstance(); - Map> targetArrayPULs = new HashMap<>(); + // new TreeMap<>(this.targetComparator) sometimes causes null on apply? + Map>> targetArrayPULs = new HashMap<>(); + Map> tempSelPULsMap; List tempArrayPULs; List objectPUL = new ArrayList<>(); @@ -96,9 +117,9 @@ public void applyUpdates(ExceptionMetadata metadata) { ////// OBJECTS // DELETES & REPLACES - for (Item target : delReplaceObjMap.keySet()) { + for (Item target : this.delReplaceObjMap.keySet()) { List toDel = new ArrayList<>(); - tempSelSrcMap = delReplaceObjMap.get(target); + tempSelSrcMap = this.delReplaceObjMap.get(target); for (Item locator : tempSelSrcMap.keySet()) { tempSrc = tempSelSrcMap.get(locator); if (tempSrc == null) { @@ -107,19 +128,21 @@ public void applyUpdates(ExceptionMetadata metadata) { objectPUL.add(upFactory.createReplaceInObjectPrimitive(target, locator, tempSrc, metadata)); } } - objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata)); + if (!toDel.isEmpty()) { + objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata)); + } } // INSERTS - for (Item target : insertObjMap.keySet()) { - objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, insertObjMap.get(target))); + for (Item target : this.insertObjMap.keySet()) { + objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, this.insertObjMap.get(target), metadata)); } // RENAMES - for (Item target : renameObjMap.keySet()) { - tempSelSrcMap = renameObjMap.get(target); + for (Item target : this.renameObjMap.keySet()) { + tempSelSrcMap = this.renameObjMap.get(target); for (Item locator : tempSelSrcMap.keySet()) { objectPUL.add( upFactory.createRenameInObjectPrimitive(target, locator, tempSelSrcMap.get(locator), metadata) @@ -131,9 +154,9 @@ public void applyUpdates(ExceptionMetadata metadata) { // DELETES & REPLACES - for (Item target : delReplaceArrayMap.keySet()) { - tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>()); - tempSelSrcMap = delReplaceArrayMap.get(target); + for (Item target : this.delReplaceArrayMap.keySet()) { + tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator)); + tempSelSrcMap = this.delReplaceArrayMap.get(target); for (Item locator : tempSelSrcMap.keySet()) { UpdatePrimitive up; tempSrc = tempSelSrcMap.get(locator); @@ -142,38 +165,31 @@ public void applyUpdates(ExceptionMetadata metadata) { } else { up = upFactory.createReplaceInArrayPrimitive(target, locator, tempSrc, metadata); } - int index = Collections.binarySearch( - tempArrayPULs, - up, - Comparator.comparing(UpdatePrimitive::getIntSelector) - ); - if (index < 0) { - index = -index - 1; - } - tempArrayPULs.add(index, up); + tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>()); + tempArrayPULs.add(up); + tempSelPULsMap.put(locator, tempArrayPULs); } - targetArrayPULs.put(target, tempArrayPULs); + targetArrayPULs.put(target, tempSelPULsMap); } // INSERTS - for (Item target : insertArrayMap.keySet()) { + for (Item target : this.insertArrayMap.keySet()) { UpdatePrimitive up; - tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>()); - tempSelSrcListMap = insertArrayMap.get(target); + tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator)); + tempSelSrcListMap = this.insertArrayMap.get(target); for (Item locator : tempSelSrcListMap.keySet()) { - up = upFactory.createInsertIntoArrayPrimitive(target, locator, tempSelSrcListMap.get(locator)); - int index = Collections.binarySearch( - tempArrayPULs, - up, - Comparator.comparing(UpdatePrimitive::getIntSelector) + up = upFactory.createInsertIntoArrayPrimitive( + target, + locator, + tempSelSrcListMap.get(locator), + metadata ); - if (index < 0) { - index = -index - 1; - } - tempArrayPULs.add(index, up); + tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>()); + tempArrayPULs.add(up); + tempSelPULsMap.put(locator, tempArrayPULs); } - targetArrayPULs.put(target, tempArrayPULs); + targetArrayPULs.put(target, tempSelPULsMap); } ////// APPLY OBJECTS @@ -183,151 +199,123 @@ public void applyUpdates(ExceptionMetadata metadata) { } ////// APPLY ARRAYS - for (Item target : targetArrayPULs.keySet()) { - tempArrayPULs = targetArrayPULs.get(target); - for (int i = tempArrayPULs.size() - 1; i >= 0; i--) { - tempArrayPULs.get(i).apply(); + tempSelPULsMap = targetArrayPULs.get(target); + for (Item selector : tempSelPULsMap.keySet()) { + tempArrayPULs = tempSelPULsMap.get(selector); + for (UpdatePrimitive up : tempArrayPULs) { + up.apply(); + } } } } - public static PendingUpdateList mergeUpdates( - PendingUpdateList pul1, - PendingUpdateList pul2, + public void mergeUpdates( + PendingUpdateList otherPul, ExceptionMetadata metadata ) { - PendingUpdateList res = new PendingUpdateList(); Map tempSelSrcMap; Map> tempSelSrcListMap; Map tempSelSrcResMap; Map> tempSelSrcResListMap; Item tempSrc; + Item tempSrcRes; List tempSrcList; ////// OBJECTS // DELETES & REPLACES - - for (Item target : pul1.delReplaceObjMap.keySet()) { - tempSelSrcMap = pul1.delReplaceObjMap.get(target); - tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.delReplaceObjMap.keySet()) { + tempSelSrcMap = otherPul.delReplaceObjMap.get(target); + tempSelSrcResMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcMap.keySet()) { - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); - } - res.delReplaceObjMap.put(target, tempSelSrcResMap); - } - - for (Item target : pul2.delReplaceObjMap.keySet()) { - tempSelSrcMap = pul2.delReplaceObjMap.get(target); - tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcMap.keySet()) { - if (tempSelSrcResMap.containsKey(selector)) { - tempSrc = tempSelSrcResMap.get(selector); - if (tempSrc != null) { + tempSrc = tempSelSrcMap.get(selector); + tempSrcRes = tempSelSrcResMap.get(selector); + boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector); + if (tempSrc == null) { + boolean hasRename = this.renameObjMap.containsKey(target) + && this.renameObjMap.get(target).containsKey(selector); + if (hasRename) { + this.renameObjMap.get(target).remove(selector); + } + } else { + if (srcResMapHasSel && tempSrcRes != null) { throw new TooManyReplacesOnSameTargetSelectorException( target.getDynamicType().getName().toString(), selector.getStringValue(), metadata ); + } else if (srcResMapHasSel) { + continue; } - continue; } - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); + tempSelSrcResMap.put(selector, tempSrc); } - res.delReplaceObjMap.put(target, tempSelSrcResMap); + this.delReplaceObjMap.put(target, tempSelSrcResMap); } // INSERTS - - res.insertObjMap.putAll(pul1.insertObjMap); - - for (Item target : pul2.insertObjMap.keySet()) { - tempSrc = pul2.insertObjMap.get(target); - if (res.insertObjMap.containsKey(target)) { - tempSrc = InsertIntoObjectPrimitive.mergeSources(res.insertObjMap.get(target), tempSrc, metadata); + for (Item target : otherPul.insertObjMap.keySet()) { + tempSrc = otherPul.insertObjMap.get(target); + if (this.insertObjMap.containsKey(target)) { + tempSrc = InsertIntoObjectPrimitive.mergeSources(this.insertObjMap.get(target), tempSrc, metadata); } - res.insertObjMap.put(target, tempSrc); + this.insertObjMap.put(target, tempSrc); } // RENAME - - for (Item target : pul1.renameObjMap.keySet()) { - tempSelSrcMap = pul1.renameObjMap.get(target); - tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcMap.keySet()) { - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); - } - res.renameObjMap.put(target, tempSelSrcResMap); - } - - for (Item target : pul2.renameObjMap.keySet()) { - tempSelSrcMap = pul2.renameObjMap.get(target); - tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.renameObjMap.keySet()) { + tempSelSrcMap = otherPul.renameObjMap.get(target); + tempSelSrcResMap = this.renameObjMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcMap.keySet()) { if (tempSelSrcResMap.containsKey(selector)) { throw new TooManyRenamesOnSameTargetSelectorException(selector.getStringValue(), metadata); } + boolean isDelete = this.delReplaceObjMap.containsKey(target) + && this.delReplaceObjMap.get(target).containsKey(selector) + && this.delReplaceObjMap.get(target).get(selector) == null; + if (isDelete) { + continue; + } tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); } - res.renameObjMap.put(target, tempSelSrcResMap); + this.renameObjMap.put(target, tempSelSrcResMap); } ////// ARRAYS // DELETES & REPLACES - - for (Item target : pul1.delReplaceArrayMap.keySet()) { - tempSelSrcMap = pul1.delReplaceArrayMap.get(target); - tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.delReplaceArrayMap.keySet()) { + tempSelSrcMap = otherPul.delReplaceArrayMap.get(target); + tempSelSrcResMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcMap.keySet()) { - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); - } - res.delReplaceArrayMap.put(target, tempSelSrcResMap); - } - - for (Item target : pul2.delReplaceArrayMap.keySet()) { - tempSelSrcMap = pul2.delReplaceArrayMap.get(target); - tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcMap.keySet()) { - if (tempSelSrcResMap.containsKey(selector)) { - tempSrc = tempSelSrcResMap.get(selector); - if (tempSrc != null) { + tempSrc = tempSelSrcMap.get(selector); + tempSrcRes = tempSelSrcResMap.get(selector); + boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector); + if (tempSrc != null && srcResMapHasSel) { + if (tempSrcRes == null) { + continue; + } else { throw new TooManyReplacesOnSameTargetSelectorException( target.getDynamicType().getName().toString(), Integer.toString(selector.getIntValue()), metadata ); } - continue; } - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); + tempSelSrcResMap.put(selector, tempSrc); } - res.delReplaceArrayMap.put(target, tempSelSrcResMap); + this.delReplaceArrayMap.put(target, tempSelSrcResMap); } // INSERTS - - for (Item target : pul1.insertArrayMap.keySet()) { - tempSelSrcListMap = pul1.insertArrayMap.get(target); - tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcListMap.keySet()) { - tempSelSrcResListMap.put(selector, tempSelSrcListMap.get(selector)); - } - res.insertArrayMap.put(target, tempSelSrcResListMap); - } - - for (Item target : pul2.insertArrayMap.keySet()) { - tempSelSrcListMap = pul2.insertArrayMap.get(target); - tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.insertArrayMap.keySet()) { + tempSelSrcListMap = otherPul.insertArrayMap.get(target); + tempSelSrcResListMap = this.insertArrayMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcListMap.keySet()) { tempSrcList = tempSelSrcResListMap.getOrDefault(selector, new ArrayList<>()); @@ -336,10 +324,8 @@ public static PendingUpdateList mergeUpdates( InsertIntoArrayPrimitive.mergeSources(tempSrcList, tempSelSrcListMap.get(selector)) ); } - res.insertArrayMap.put(target, tempSelSrcResListMap); + this.insertArrayMap.put(target, tempSelSrcResListMap); } - - return res; } } diff --git a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java index 054fe6f2b0..5bf329c486 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java @@ -1,5 +1,6 @@ package org.rumbledb.runtime.update.expression; +import org.apache.commons.lang3.SerializationUtils; import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; @@ -72,7 +73,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { try { target = this.arrayIterator.materializeExactlyOneItem(context); - content = this.toAppendIterator.materializeExactlyOneItem(context); + content = SerializationUtils.clone(this.toAppendIterator.materializeExactlyOneItem(context)); } catch (NoItemException | MoreThanOneItemException e) { throw new RuntimeException(e); } @@ -81,13 +82,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { UpdatePrimitive up; if (target.isArray()) { Item locator = ItemFactory.getInstance().createIntItem(target.getSize() + 1); + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", this.getMetadata() ); } - up = factory.createInsertIntoArrayPrimitive(target, locator, Collections.singletonList(content)); + up = factory.createInsertIntoArrayPrimitive( + target, + locator, + Collections.singletonList(content), + this.getMetadata() + ); } else { throw new InvalidUpdateTargetException( "Append expression target must be a single array", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java index c9a4dc6aae..e05c026095 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java @@ -83,6 +83,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", @@ -97,6 +100,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java index 297156cdd6..f36e3b8ebf 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java @@ -42,7 +42,7 @@ public InsertExpressionIterator( } public boolean hasPositionIterator() { - return positionIterator != null; + return this.positionIterator != null; } @Override @@ -84,7 +84,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { try { main = this.mainIterator.materializeExactlyOneItem(context); - content = (Item) SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context)); + content = SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context)); if (this.hasPositionIterator()) { locator = this.positionIterator.materializeExactlyOneItem(context); } @@ -103,13 +103,16 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", this.getMetadata() ); } - up = factory.createInsertIntoObjectPrimitive(main, content); + up = factory.createInsertIntoObjectPrimitive(main, content, this.getMetadata()); } else if (main.isArray()) { if (locator == null) { throw new CannotCastUpdateSelectorException("Insert expression selector is null", this.getMetadata()); @@ -120,13 +123,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", this.getMetadata() ); } - up = factory.createInsertIntoArrayPrimitive(main, locator, Collections.singletonList(content)); + up = factory.createInsertIntoArrayPrimitive( + main, + locator, + Collections.singletonList(content), + this.getMetadata() + ); } else { throw new InvalidUpdateTargetException( "Insert expression target must be a single array or object", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java index 57fbf49e50..9f0142399f 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java @@ -90,6 +90,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java index 25ce38dea5..e32445f544 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java @@ -74,7 +74,6 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { Item target; Item locator; Item content; - try { target = this.mainIterator.materializeExactlyOneItem(context); locator = this.locatorIterator.materializeExactlyOneItem(context); @@ -94,7 +93,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { for (Item item : tempContent) { copyContent.add((Item) SerializationUtils.clone(item)); } - content = ItemFactory.getInstance().createArrayItem(copyContent); + content = ItemFactory.getInstance().createArrayItem(copyContent, true); } UpdatePrimitiveFactory factory = UpdatePrimitiveFactory.getInstance(); @@ -106,6 +105,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", @@ -120,6 +122,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java index fb1a24a0f4..85ae6484c8 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java @@ -46,20 +46,20 @@ public TransformExpressionIterator( protected JavaRDD getRDDAux(DynamicContext context) { PendingUpdateList pul = getPendingUpdateList(context); pul.applyUpdates(this.getMetadata()); - return returnIterator.getRDD(context); + return this.returnIterator.getRDD(context); } @Override protected void openLocal() { PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution); pul.applyUpdates(this.getMetadata()); - returnIterator.open(this.currentDynamicContextForLocalExecution); + this.returnIterator.open(this.currentDynamicContextForLocalExecution); } @Override protected void closeLocal() { - returnIterator.close(); - for (Name copyVar : copyDeclMap.keySet()) { + this.returnIterator.close(); + for (Name copyVar : this.copyDeclMap.keySet()) { this.currentDynamicContextForLocalExecution.getVariableValues().removeVariable(copyVar); } } @@ -68,35 +68,39 @@ protected void closeLocal() { protected void resetLocal() { PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution); pul.applyUpdates(this.getMetadata()); - returnIterator.reset(this.currentDynamicContextForLocalExecution); + this.returnIterator.reset(this.currentDynamicContextForLocalExecution); } @Override protected boolean hasNextLocal() { - return returnIterator.hasNext(); + return this.returnIterator.hasNext(); } @Override protected Item nextLocal() { - return returnIterator.next(); + return this.returnIterator.next(); } @Override public PendingUpdateList getPendingUpdateList(DynamicContext context) { bindCopyDeclarations(context); - context.setCurrentMutabilityLevel(this.mutabilityLevel); - return modifyIterator.getPendingUpdateList(context); + DynamicContext newCtx = new DynamicContext(context); + newCtx.setCurrentMutabilityLevel(this.mutabilityLevel); + return this.modifyIterator.getPendingUpdateList(newCtx); } private void bindCopyDeclarations(DynamicContext context) { - for (Name copyVar : copyDeclMap.keySet()) { - RuntimeIterator copyIterator = copyDeclMap.get(copyVar); + for (Name copyVar : this.copyDeclMap.keySet()) { + RuntimeIterator copyIterator = this.copyDeclMap.get(copyVar); List toCopy = copyIterator.materialize(context); List copy = new ArrayList<>(); Item temp; for (Item item : toCopy) { - temp = (Item) SerializationUtils.clone(item); + temp = SerializationUtils.clone(item); temp.setMutabilityLevel(this.mutabilityLevel); + // TODO: Currently avoids copied delta items being updated via applyDelta but perhaps should be checked + // with mutability level + temp.setTableLocation(null); copy.add(temp); } context.getVariableValues().addVariableValue(copyVar, copy); diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java index 8cf51f57bb..e204578079 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java @@ -1,8 +1,14 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; + public class DeleteFromArrayPrimitive implements UpdatePrimitive { @@ -23,9 +29,53 @@ public DeleteFromArrayPrimitive(Item targetArray, Item positionInt, ExceptionMet @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { this.target.removeItemAt(this.selector.getIntValue() - 1); } + @Override + public void applyDelta() { + String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + String selectArrayQuery = "SELECT " + + pathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + String setClause = "SET " + pathIn + " = "; + this.applyItem(); + setClause = setClause + this.target.getSparkSQLValue(arrayType); + + String query = "UPDATE delta.`" + location + "` " + setClause + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -33,17 +83,17 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public int getIntSelector() { - return selector.getIntValue(); + return this.selector.getIntValue(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java index a55b5b9a3e..5bd8918c24 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java @@ -3,11 +3,13 @@ import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import sparksoniq.spark.SparkSessionManager; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; +import static org.apache.spark.sql.functions.*; + public class DeleteFromObjectPrimitive implements UpdatePrimitive { private Item target; @@ -30,6 +32,15 @@ public DeleteFromObjectPrimitive(Item targetObject, List namesToRemove, Ex @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { for ( String str : this.content.stream().map(Item::getStringValue).collect(Collectors.toList()) ) { @@ -37,6 +48,28 @@ public void apply() { } } + @Override + public void applyDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + List setFieldsToNulls = this.content.stream() + .map(i -> pathIn + i.getStringValue() + " = NULL") + .collect(Collectors.toList()); + String concatSetNulls = String.join(", ", setFieldsToNulls); + + String query = "UPDATE delta.`" + location + "` SET " + concatSetNulls + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return false; @@ -44,12 +77,12 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public List getContentList() { - return content; + return this.content; } @Override @@ -57,10 +90,4 @@ public boolean isDeleteObject() { return true; } - public static List mergeSources(List first, List second) { - List merged = new ArrayList<>(first); - merged.addAll(second); - merged = merged.stream().distinct().collect(Collectors.toList()); - return merged; - } } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java index a6f2d9b4e8..2dc0c8e3c5 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java @@ -1,6 +1,13 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; +import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; import java.util.ArrayList; import java.util.List; @@ -11,12 +18,17 @@ public class InsertIntoArrayPrimitive implements UpdatePrimitive { private Item selector; private List content; - public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List sourceSequence) { - if (!targetArray.isArray() || !positionInt.isNumeric()) { - // TODO ERROR - } - if (positionInt.getIntValue() < 0 || positionInt.getIntValue() >= targetArray.getSize()) { - // TODO throw error or do nothing? + public InsertIntoArrayPrimitive( + Item targetArray, + Item positionInt, + List sourceSequence, + ExceptionMetadata metadata + ) { + if (positionInt.getIntValue() <= 0 || positionInt.getIntValue() > targetArray.getSize() + 1) { + throw new CannotResolveUpdateSelectorException( + "Cannot insert item at index out of range of target array", + metadata + ); } this.target = targetArray; @@ -27,9 +39,60 @@ public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List s @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { this.target.putItemsAt(this.content, this.selector.getIntValue() - 1); } + @Override + public void applyDelta() { + // TODO: Properly discern ItemType to SQLType + // TODO: Sort out types for value item + // ASSUMES ArrayType ONLY CONTAINS 1 TYPE AND INSERTION OF A DIFF TYPE IS INVALID + // TODO: perhaps check for homogenous typing of array w/o relying on SQL error + + String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + // DeltaTable dt = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(), location); + + if (startOfArrayIndexing == -1) { + String selectArrayQuery = "SELECT " + + pathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + String setClause = pathIn + " = "; + this.applyItem(); + setClause = setClause + this.target.getSparkSQLValue(arrayType); + + String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldQuery); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -37,22 +100,22 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public int getIntSelector() { - return selector.getIntValue(); + return this.selector.getIntValue(); } @Override public List getContentList() { - return content; + return this.content; } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java index 7a2a659b0b..e4093e3f06 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java @@ -1,11 +1,15 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.AnalysisException; import org.rumbledb.api.Item; import org.rumbledb.exceptions.*; import org.rumbledb.items.ItemFactory; +import sparksoniq.spark.SparkSessionManager; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; + public class InsertIntoObjectPrimitive implements UpdatePrimitive { @@ -13,9 +17,14 @@ public class InsertIntoObjectPrimitive implements UpdatePrimitive { private Item content; - public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) { - if (!targetObject.isObject() || !contentObject.isObject()) { - // TODO: ERROR + public InsertIntoObjectPrimitive(Item targetObject, Item contentObject, ExceptionMetadata metadata) { + for (String key : contentObject.getKeys()) { + if (targetObject.getItemByKey(key) != null) { + throw new DuplicateKeyOnUpdateApplyException( + "cannot insert a key already present in an object", + metadata + ); + } } this.target = targetObject; this.content = contentObject; @@ -23,6 +32,15 @@ public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) { @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { try { for (String key : this.content.getKeys()) { this.target.putItemByKey(key, this.content.getItemByKey(key)); @@ -32,6 +50,55 @@ public void apply() { } } + @Override + public void applyDelta() { + // TODO: Properly discern ItemType to SQLType + // TODO: Sort out types for value item + + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + + List columnsClauseList = new ArrayList<>(); + List setClauseList = new ArrayList<>(); + List keys = this.content.getKeys(); + List values = this.content.getValues(); + for (int i = 0; i < keys.size(); i++) { + columnsClauseList.add(pathIn + keys.get(i) + " " + values.get(i).getSparkSQLType()); + setClauseList.add(pathIn + keys.get(i) + " = " + values.get(i).getSparkSQLValue()); + } + + String setClauses = String.join(", ", setClauseList); + + List insertColumnQueries = columnsClauseList.stream() + .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");") + .collect(Collectors.toList()); + + String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClauses + " WHERE rowID == " + rowID; + + SparkSessionManager manager = SparkSessionManager.getInstance(); + + // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS + for (String insertColumnQuery : insertColumnQueries) { + try { + manager.getOrCreateSession().sql(insertColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + } + manager.getOrCreateSession().sql(setFieldQuery); + } else { + this.arrayIndexingApplyDelta(); + // TODO: Add new column for changed array and do the null trick -- do not forget the nullable etc + } + } + @Override public boolean hasSelector() { return false; @@ -39,7 +106,7 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override @@ -49,7 +116,7 @@ public Item getSelector() { @Override public Item getContent() { - return content; + return this.content; } @Override @@ -57,6 +124,44 @@ public boolean isInsertObject() { return true; } + @Override + public boolean updatesSchemaDelta() { + return true; + } + + @Override + public void arrayIndexingUpdateSchemaDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + + String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element"); + + List columnsClauseList = new ArrayList<>(); + List keys = this.content.getKeys(); + List values = this.content.getValues(); + for (int i = 0; i < keys.size(); i++) { + columnsClauseList.add(pathInSchema + keys.get(i) + " " + values.get(i).getSparkSQLType()); + } + + List insertColumnQueries = columnsClauseList.stream() + .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");") + .collect(Collectors.toList()); + + SparkSessionManager manager = SparkSessionManager.getInstance(); + + // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS + for (String insertColumnQuery : insertColumnQueries) { + try { + manager.getOrCreateSession().sql(insertColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + } + } + public static Item mergeSources(Item first, Item second, ExceptionMetadata metadata) { Item res; @@ -67,7 +172,7 @@ public static Item mergeSources(Item first, Item second, ExceptionMetadata metad values.addAll(second.getValues()); try { - res = ItemFactory.getInstance().createObjectItem(keys, values, metadata); + res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false); } catch (DuplicateObjectKeyException e) { throw new DuplicateObjectInsertSourceException(e.getMessage(), metadata); } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java index 01c0d4037b..538c36cae3 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java @@ -1,8 +1,16 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.AnalysisException; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; + +import static org.apache.spark.sql.functions.col; public class RenameInObjectPrimitive implements UpdatePrimitive { @@ -32,6 +40,15 @@ public RenameInObjectPrimitive( @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { String name = this.selector.getStringValue(); if (this.target.getKeys().contains(name)) { Item item = this.target.getItemByKey(name); @@ -41,6 +58,61 @@ public void apply() { // TODO: implement replace and rename methods for Array & Object to avoid deletion and append } + @Override + public void applyDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + String oldName = this.selector.getStringValue(); + + String fullOldPath = pathIn + oldName; + String fullNewPath = pathIn + this.content.getStringValue(); + + String setOldFieldClause = fullOldPath + " = NULL"; + String setNewFieldClause = fullNewPath + " = " + this.target.getItemByKey(oldName).getSparkSQLValue(); + String type = SparkSessionManager.getInstance() + .getOrCreateSession() + .sql("DESC (SELECT " + fullOldPath + " FROM delta.`" + location + "`)") + .filter(col("col_name").equalTo(oldName)) + .select("data_type") + .collectAsList() + .get(0) + .getString(0); + + String insertNewColumnQuery = "ALTER TABLE delta.`" + + location + + "` ADD COLUMNS (" + + fullNewPath + + " " + + type + + ");"; + String setFieldsQuery = "UPDATE delta.`" + + location + + "` SET " + + setOldFieldClause + + ", " + + setNewFieldClause + + " WHERE rowID == " + + rowID; + + // SKIP INSERTING NEW COL IF COL ALREADY EXISTS + try { + SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldsQuery); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -48,21 +120,71 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public Item getContent() { - return content; + return this.content; } @Override public boolean isRenameObject() { return true; } + + @Override + public boolean updatesSchemaDelta() { + return true; + } + + @Override + public void arrayIndexingUpdateSchemaDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + + String selectColQuery = "SELECT " + + pathIn + + this.selector.getStringValue() + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset colDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectColQuery); + + ItemType colType = ItemTypeFactory.createItemType(colDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element"); + String fullNewPath = pathInSchema + this.content.getStringValue(); + + String insertNewColumnQuery = "ALTER TABLE delta.`" + + location + + "` ADD COLUMNS (" + + fullNewPath + + " " + + colType.getSparkSQLType() + + ");"; + + // SKIP INSERTING NEW COL IF COL ALREADY EXISTS + try { + SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + } } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java index 9be2c98200..04d027b242 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java @@ -1,8 +1,14 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; + public class ReplaceInArrayPrimitive implements UpdatePrimitive { @@ -30,6 +36,15 @@ public ReplaceInArrayPrimitive( @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { int index = this.selector.getIntValue() - 1; if (index >= 0 || index < this.target.getSize()) { this.target.removeItemAt(index); @@ -41,6 +56,47 @@ public void apply() { } } + @Override + public void applyDelta() { + // TODO: Sort out diff types of content Item + // TODO: Find out name of array column + // ASSUME pathIn CONTAINS ARRAYFIELD NAME + // PERHAPS CASE OF REPLACING ARRAY WITH 1 ITEM SHOULD CREATE NEW ARRAYCOL WITH CORRECTED TYPE IF TYPE CHANGES + + String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + String selectArrayQuery = "SELECT " + + pathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + String setField = pathIn + " = "; + this.applyItem(); + setField = setField + this.target.getSparkSQLValue(arrayType); + + String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -48,22 +104,22 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public int getIntSelector() { - return selector.getIntValue(); + return this.selector.getIntValue(); } @Override public Item getContent() { - return content; + return this.content; } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java index a4d9e0daf1..e8ddd3ab58 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java @@ -3,6 +3,10 @@ import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import sparksoniq.spark.SparkSessionManager; + + +import static org.apache.spark.sql.functions.*; public class ReplaceInObjectPrimitive implements UpdatePrimitive { @@ -19,7 +23,7 @@ public ReplaceInObjectPrimitive( if (targetObject.getItemByKey(targetName.getStringValue()) == null) { throw new CannotResolveUpdateSelectorException( - "Cannot delete key that does not exist in target object", + "Cannot replace key that does not exist in target object", metadata ); } @@ -31,6 +35,15 @@ public ReplaceInObjectPrimitive( @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { String name = this.getSelector().getStringValue(); if (this.getTarget().getKeys().contains(name)) { this.getTarget().removeItemByKey(name); @@ -38,6 +51,29 @@ public void apply() { } } + @Override + public void applyDelta() { + // TODO: Sort out diff types of content Item + // PERHAPS CHANGE OF TYPE SHOULD CREATE NEW COLUMN? + + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + + String setField = pathIn + this.selector.getStringValue() + " = " + this.content.getSparkSQLValue(); + + String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -45,17 +81,17 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public Item getContent() { - return content; + return this.content; } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java index 7827587d36..af73ecea42 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java @@ -1,13 +1,26 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.items.parsing.RowToItemMapper; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; +import java.util.Arrays; import java.util.List; public interface UpdatePrimitive { void apply(); + void applyItem(); + + void applyDelta(); + boolean hasSelector(); Item getTarget(); @@ -56,5 +69,82 @@ default boolean isRenameObject() { return false; } + default boolean updatesSchemaDelta() { + return false; + } + + default void arrayIndexingUpdateSchemaDelta() { + throw new UnsupportedOperationException("Operation not defined"); + } + + default void arrayIndexingApplyDelta() { + Item target = this.getTarget(); + + String pathIn = target.getPathIn().substring(target.getPathIn().indexOf(".") + 1); + String location = target.getTableLocation(); + long rowID = target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + String preIndexingPathIn = pathIn.substring(0, startOfArrayIndexing); + String postIndexingPathIn = pathIn.substring(startOfArrayIndexing); + List fields = Arrays.asList(postIndexingPathIn.split("\\.")); + + // TODO: Perhaps an if here to update schema if required but need to sort out new name of array column -- + if (this.updatesSchemaDelta()) { + this.arrayIndexingUpdateSchemaDelta(); + } + + String selectArrayQuery = "SELECT " + + preIndexingPathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + JavaRDD rowRDD = arrayDF.javaRDD(); + JavaRDD itemRDD = rowRDD.map(new RowToItemMapper(ExceptionMetadata.EMPTY_METADATA, arrayType)); + List collectedItems = itemRDD.take(2); + Item originalArray = collectedItems.get(0); + // TODO: errors if 0 items or more than one item + + Item innerItem = originalArray; + for (int i = 0; i < fields.size() - 1; i++) { + String field = fields.get(i); + if (innerItem.isObject()) { + innerItem = innerItem.getItemByKey(field); + } else if (innerItem.isArray()) { + int index = Integer.parseInt(field.substring(field.indexOf("[") + 1, field.indexOf("]"))); + innerItem = innerItem.getItemAt(index); + } + } + + String finalSelector = fields.get(fields.size() - 1); + this.applyItem(); + if (innerItem.isObject()) { + innerItem.removeItemByKey(finalSelector); + innerItem.putItemByKey(finalSelector, this.getTarget()); + } else if (innerItem.isArray()) { + int finalIndex = Integer.parseInt( + finalSelector.substring(finalSelector.indexOf("[") + 1, finalSelector.indexOf("]")) + ); + innerItem.removeItemAt(finalIndex); + innerItem.putItemAt(this.getTarget(), finalIndex); + } + + String setClause = preIndexingPathIn + " = " + originalArray.getSparkSQLValue(arrayType); + String query = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } + } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java index 2dc938b1c2..c351803af8 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java @@ -32,12 +32,21 @@ public UpdatePrimitive createDeleteFromObjectPrimitive( return new DeleteFromObjectPrimitive(targetObject, selectorStrs, metadata); } - public UpdatePrimitive createInsertIntoArrayPrimitive(Item targetArray, Item selectorInt, List contents) { - return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents); + public UpdatePrimitive createInsertIntoArrayPrimitive( + Item targetArray, + Item selectorInt, + List contents, + ExceptionMetadata metadata + ) { + return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents, metadata); } - public UpdatePrimitive createInsertIntoObjectPrimitive(Item targetObject, Item contentsObject) { - return new InsertIntoObjectPrimitive(targetObject, contentsObject); + public UpdatePrimitive createInsertIntoObjectPrimitive( + Item targetObject, + Item contentsObject, + ExceptionMetadata metadata + ) { + return new InsertIntoObjectPrimitive(targetObject, contentsObject, metadata); } public UpdatePrimitive createReplaceInArrayPrimitive( diff --git a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java index 5899742ed1..8581c4311a 100644 --- a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java +++ b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java @@ -155,7 +155,7 @@ private static Item assembleResponse(RumbleRuntimeConfiguration configuration, L ); } else { if (results != null) { - Item values = ItemFactory.getInstance().createArrayItem(results); + Item values = ItemFactory.getInstance().createArrayItem(results, false); output.putItemByKey("values", values); } } diff --git a/src/main/java/org/rumbledb/types/ArrayItemType.java b/src/main/java/org/rumbledb/types/ArrayItemType.java index ddf40af11e..34d0ab69ee 100644 --- a/src/main/java/org/rumbledb/types/ArrayItemType.java +++ b/src/main/java/org/rumbledb/types/ArrayItemType.java @@ -266,4 +266,12 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati return this.content.isCompatibleWithDataFrames(configuration); } + @Override + public String getSparkSQLType() { + StringBuilder sb = new StringBuilder(); + sb.append("ARRAY<"); + sb.append(this.getArrayContentFacet().getSparkSQLType()); + sb.append(">"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/types/AtomicItemType.java b/src/main/java/org/rumbledb/types/AtomicItemType.java index 02b3b48e82..a4c3fb22e6 100644 --- a/src/main/java/org/rumbledb/types/AtomicItemType.java +++ b/src/main/java/org/rumbledb/types/AtomicItemType.java @@ -547,4 +547,24 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati } return true; } + + @Override + public String getSparkSQLType() { + if (this.getPrimitiveType().equals(stringItem)) { + return "STRING"; + } + if (this.getPrimitiveType().equals(booleanItem)) { + return "BOOLEAN"; + } + if (this.getPrimitiveType().equals(doubleItem)) { + return "DOUBLE"; + } + if (this.getPrimitiveType().equals(floatItem)) { + return "FLOAT"; + } + if (this.getPrimitiveType().equals(decimalItem)) { + return "DECIMAL"; + } + throw new UnsupportedOperationException("getSparkSQLType is unsupported for " + this.getPrimitiveType()); + } } diff --git a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java index 1f7ba3822a..a6e6b27258 100644 --- a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java +++ b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java @@ -613,4 +613,21 @@ public void processBaseType() { ExceptionMetadata.EMPTY_METADATA ); } + + @Override + public String getSparkSQLType() { + if (this.equals(BuiltinTypesCatalogue.integerItem)) { + return "INT"; + } + if (this.equals(BuiltinTypesCatalogue.intItem)) { + return "INT"; + } + if (this.equals(BuiltinTypesCatalogue.longItem)) { + return "LONG"; + } + if (this.equals(BuiltinTypesCatalogue.shortItem)) { + return "SHORT"; + } + return this.primitiveType.getSparkSQLType(); + } } diff --git a/src/main/java/org/rumbledb/types/FunctionSignature.java b/src/main/java/org/rumbledb/types/FunctionSignature.java index be9defb075..8e5369e121 100644 --- a/src/main/java/org/rumbledb/types/FunctionSignature.java +++ b/src/main/java/org/rumbledb/types/FunctionSignature.java @@ -26,14 +26,24 @@ public class FunctionSignature implements Serializable { private List parameterTypes; private SequenceType returnType; + private boolean isUpdating; private static final long serialVersionUID = 1L; public FunctionSignature( List parameterTypes, - SequenceType returnType + SequenceType returnType, + boolean isUpdating ) { this.parameterTypes = parameterTypes; this.returnType = returnType; + this.isUpdating = isUpdating; + } + + public FunctionSignature( + List parameterTypes, + SequenceType returnType + ) { + this(parameterTypes, returnType, false); } @@ -45,6 +55,10 @@ public SequenceType getReturnType() { return this.returnType; } + public boolean isUpdating() { + return this.isUpdating; + } + @Override public boolean equals(Object instance) { return instance instanceof FunctionSignature diff --git a/src/main/java/org/rumbledb/types/ItemType.java b/src/main/java/org/rumbledb/types/ItemType.java index 101c5978a6..c51604f2e8 100644 --- a/src/main/java/org/rumbledb/types/ItemType.java +++ b/src/main/java/org/rumbledb/types/ItemType.java @@ -451,6 +451,15 @@ default boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurat return false; } + /** + * Returns the SparkSQL type of the item type for use in a query. + * + * @return String representing the SparkSQL type of the item type. + */ + default String getSparkSQLType() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getName()); + } + String toString(); default boolean isResolved() { diff --git a/src/main/java/org/rumbledb/types/ObjectItemType.java b/src/main/java/org/rumbledb/types/ObjectItemType.java index 7c189dcbb4..5bb2b3f66d 100644 --- a/src/main/java/org/rumbledb/types/ObjectItemType.java +++ b/src/main/java/org/rumbledb/types/ObjectItemType.java @@ -372,4 +372,28 @@ public void checkSubtypeConsistency() { ); } } + + + @Override + public String getSparkSQLType() { + StringBuilder sb = new StringBuilder(); + Map content = this.getObjectContentFacet(); + String[] keys = content.keySet().toArray(new String[0]); + + sb.append("STRUCT<"); + for (int i = 0; i < keys.length; i++) { + String key = keys[i]; + FieldDescriptor field = content.get(key); + + sb.append(key); + sb.append(":"); + sb.append(field.getType().getSparkSQLType()); + if (i < keys.length - 1) { + sb.append(", "); + } + } + sb.append(">"); + + return sb.toString(); + } } diff --git a/src/main/java/sparksoniq/spark/SparkSessionManager.java b/src/main/java/sparksoniq/spark/SparkSessionManager.java index 17923d698a..cca6a293f0 100644 --- a/src/main/java/sparksoniq/spark/SparkSessionManager.java +++ b/src/main/java/sparksoniq/spark/SparkSessionManager.java @@ -83,12 +83,16 @@ public class SparkSessionManager { private SparkSession session; private JavaSparkContext javaSparkContext; - public static String atomicJSONiqItemColumnName = "0d08af5d-10bb-4a73-af84-c6aac917a830"; - public static String emptyObjectJSONiqItemColumnName = "a84bc646-05af-4383-8853-2e9f31a710f2"; - public static String temporaryColumnName = "0f7b4040-b404-4239-99dd-9b4cf2900594"; - public static String countColumnName = "5af0c0c8-e84c-482a-82ce-1887565cf448"; - public static String rightHandSideHashColumnName = "db273b7d-d927-4c0d-b9c1-665af71faa2b "; - public static String leftHandSideHashColumnName = "171bdb70-7400-48ed-a105-d132f4e38a2d"; + public static String atomicJSONiqItemColumnName = "atomic0d08af5d-10bb-4a73-af84-c6aac917a830"; + public static String emptyObjectJSONiqItemColumnName = "emptyobja84bc646-05af-4383-8853-2e9f31a710f2"; + public static String temporaryColumnName = "tmp0f7b4040-b404-4239-99dd-9b4cf2900594"; + public static String countColumnName = "count5af0c0c8-e84c-482a-82ce-1887565cf448"; + public static String rightHandSideHashColumnName = "rhsdb273b7d-d927-4c0d-b9c1-665af71faa2b "; + public static String leftHandSideHashColumnName = "lhs171bdb70-7400-48ed-a105-d132f4e38a2d"; + public static String mutabilityLevelColumnName = "mutabilityLevel"; + public static String rowIdColumnName = "rowID"; + public static String pathInColumnName = "pathIn"; + public static String tableLocationColumnName = "tableLocation"; private SparkSessionManager() { } @@ -126,6 +130,11 @@ private void setDefaultConfiguration() { this.configuration.setAppName(APP_NAME); } this.configuration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + this.configuration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); + this.configuration.set( + "spark.sql.catalog.spark_catalog", + "org.apache.spark.sql.delta.catalog.DeltaCatalog" + ); if (!this.configuration.contains("spark.master")) { this.configuration.set("spark.master", "local[*]"); } diff --git a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java index 90933724fe..6048587b3a 100644 --- a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java @@ -101,7 +101,8 @@ public Item call(Tuple2 a) { List values = new ArrayList<>(); values.add(ItemFactory.getInstance().createDoubleItem((double) a._1())); values.add(ItemFactory.getInstance().createDoubleItem((double) a._2())); - return ItemFactory.getInstance().createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA); + return ItemFactory.getInstance() + .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true); } } ); diff --git a/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java b/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java index ae3938539d..de967113f9 100644 --- a/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java +++ b/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java @@ -245,7 +245,7 @@ public static Item removeParameter(Item paramMapItem, String key, ExceptionMetad int indexToRemove = keys.indexOf(key); keys.remove(indexToRemove); values.remove(indexToRemove); - return ItemFactory.getInstance().createObjectItem(keys, values, metadata); + return ItemFactory.getInstance().createObjectItem(keys, values, metadata, true); } public static JSoundDataFrame createDataFrameContainingVectorizedColumn( diff --git a/src/test/java/iq/DeltaUpdateRuntimeTests.java b/src/test/java/iq/DeltaUpdateRuntimeTests.java new file mode 100644 index 0000000000..7341472bd4 --- /dev/null +++ b/src/test/java/iq/DeltaUpdateRuntimeTests.java @@ -0,0 +1,347 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import org.apache.commons.io.FileUtils; +import org.rumbledb.cli.JsoniqQueryExecutor; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import utils.annotations.AnnotationParseException; +import utils.annotations.AnnotationProcessor; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.Item; +import org.rumbledb.api.SequenceOfItems; +import scala.util.Properties; +import sparksoniq.spark.SparkSessionManager; +import utils.FileManager; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URI; +import java.util.*; + +@RunWith(Parameterized.class) +public class DeltaUpdateRuntimeTests extends AnnotationsTestsBase { + + public static final File runtimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-delta-updates" + ); + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", "unknown"); + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes", + "--print-iterator-tree", + "yes", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + "--materialization-cap", + "900000" + } + ); + } + + protected static final RumbleRuntimeConfiguration createDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + protected static final RumbleRuntimeConfiguration deleteDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + protected static Map> _testFilesMap; + + protected final File testFile; + + + public DeltaUpdateRuntimeTests(File testFile) { + this.testFile = testFile; + } + + public static void readFileList(File dir) throws IOException, AnnotationParseException { + Map> updateDimToFileMap = new TreeMap<>(); + Map innerMap; + for (File file : FileManager.loadJiqFiles(dir)) { + FileReader reader = new FileReader(file.getPath()); + String dims = AnnotationProcessor.getUpdateDimensionAnnotation(reader); + String[] dimsArr = dims.substring(1, dims.length() - 1).split(","); + int dim1 = Integer.parseInt(dimsArr[0]); + int dim2 = Integer.parseInt(dimsArr[1]); + innerMap = updateDimToFileMap.getOrDefault(dim1, new TreeMap<>()); + innerMap.put(dim2, file); + updateDimToFileMap.put(dim1, innerMap); + } + DeltaUpdateRuntimeTests._testFilesMap = updateDimToFileMap; + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() throws IOException, AnnotationParseException { + List result = new ArrayList<>(); + DeltaUpdateRuntimeTests.readFileList(DeltaUpdateRuntimeTests.runtimeTestsDirectory); + Map innerMap; + File curr; + for (int i : DeltaUpdateRuntimeTests._testFilesMap.keySet()) { + innerMap = DeltaUpdateRuntimeTests._testFilesMap.get(i); + for (int j : innerMap.keySet()) { + curr = innerMap.get(j); + result.add(new Object[] { curr }); + } + } + return result; + } + + @BeforeClass + public static void setupSparkSession() { + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + sparkConfiguration.setMaster("local[*]"); + sparkConfiguration.set("spark.submit.deployMode", "client"); + sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); + sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); + sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); // enables delta + // store + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); // enables + // delta + // store + + // prevents spark from failing to start on MacOS when disconnected from the internet + sparkConfiguration.set("spark.driver.host", "127.0.0.1"); + + + // sparkConfiguration.set("spark.driver.memory", "2g"); + // sparkConfiguration.set("spark.executor.memory", "2g"); + // sparkConfiguration.set("spark.speculation", "true"); + // sparkConfiguration.set("spark.speculation.quantile", "0.5"); + SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); + SparkSessionManager.COLLECT_ITEM_LIMIT = defaultConfiguration.getResultSizeCap(); + System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + try { + this.currentAnnotation = AnnotationProcessor.readAnnotation( + new FileReader(this.testFile.getAbsolutePath()) + ); + } catch (AnnotationParseException e) { + e.printStackTrace(); + Assert.fail(); + } + boolean didDelete = checkTableDeletion(); + boolean didCreate = checkTableCreation(this.testFile.getAbsolutePath()); + if (!(didCreate || didDelete)) { + testAnnotations(this.testFile.getAbsolutePath(), getConfiguration()); + } + } + + private boolean checkTableCreation(String path) throws IOException, InterruptedException { + if (!this.currentAnnotation.shouldCreateTable()) { + return false; + } + + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + this.currentAnnotation.getDeltaTablePath(), + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + URI queryURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + DeltaUpdateRuntimeTests.createDeltaConfiguration.setOutputPath(tableURI.getPath()); + DeltaUpdateRuntimeTests.createDeltaConfiguration.setQueryPath(queryURI.getPath()); + JsoniqQueryExecutor executor = new JsoniqQueryExecutor(DeltaUpdateRuntimeTests.createDeltaConfiguration); + executor.runQuery(); + return true; + } + + private boolean checkTableDeletion() { + if (!this.currentAnnotation.shouldDeleteTable()) { + return false; + } + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + this.currentAnnotation.getDeltaTablePath(), + DeltaUpdateRuntimeTests.deleteDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + try { + File oldTable = new File(tableURI.getPath()); + FileUtils.deleteDirectory(oldTable); + System.err.println("Deleted file: " + oldTable.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + return true; + + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput; + if (!sequence.availableAsRDD()) { + actualOutput = runIterators(sequence); + } else { + actualOutput = getRDDResults(sequence); + } + Assert.assertTrue( + "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } + + protected String runIterators(SequenceOfItems sequence) { + String actualOutput = getIteratorOutput(sequence); + applyPossibleUpdates(sequence); + return actualOutput; + } + + protected String getIteratorOutput(SequenceOfItems sequence) { + sequence.open(); + Item result = null; + if (sequence.hasNext()) { + result = sequence.next(); + } + if (result == null) { + return ""; + } + String singleOutput = result.serialize(); + if (!sequence.hasNext()) { + return singleOutput; + } else { + int itemCount = 1; + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(result.serialize()); + sb.append(", "); + while ( + sequence.hasNext() + && + ((itemCount < getConfiguration().getResultSizeCap() + && getConfiguration().getResultSizeCap() > 0) + || + getConfiguration().getResultSizeCap() == 0) + ) { + sb.append(sequence.next().serialize()); + sb.append(", "); + itemCount++; + } + if (sequence.hasNext() && itemCount == getConfiguration().getResultSizeCap()) { + System.err.println( + "Warning! The output sequence contains a large number of items but its materialization was capped at " + + SparkSessionManager.COLLECT_ITEM_LIMIT + + " items. This value can be configured with the --result-size parameter at startup" + ); + } + // remove last comma + String output = sb.toString(); + output = output.substring(0, output.length() - 2); + output += ")"; + return output; + } + } + + private String getRDDResults(SequenceOfItems sequence) { + JavaRDD rdd = sequence.getAsRDD(); + applyPossibleUpdates(sequence); + JavaRDD output = rdd.map(o -> o.serialize()); + List collectedOutput = new ArrayList(); + SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); + + + if (collectedOutput.isEmpty()) { + return ""; + } + + if (collectedOutput.size() == 1) { + return collectedOutput.get(0); + } + + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (String item : collectedOutput) { + sb.append(item); + sb.append(", "); + } + + String result = sb.toString(); + result = result.substring(0, result.length() - 2); + result += ")"; + return result; + } + + private void applyPossibleUpdates(SequenceOfItems sequence) { + if (getConfiguration().applyUpdates() && sequence.availableAsPUL()) { + sequence.applyPUL(); + } + } + +} diff --git a/src/test/java/iq/JavaAPITest.java b/src/test/java/iq/JavaAPITest.java index 4eda7162ff..9cb946774c 100644 --- a/src/test/java/iq/JavaAPITest.java +++ b/src/test/java/iq/JavaAPITest.java @@ -34,6 +34,8 @@ import java.util.List; +import static org.apache.spark.sql.functions.*; + public class JavaAPITest { public JavaAPITest() { @@ -48,6 +50,9 @@ public static void setupSparkSession() { sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); sparkConfiguration.set("spark.driver.host", "127.0.0.1"); sparkConfiguration.set("spark.driver.bindAddress", "127.0.0.1"); + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); + sparkConfiguration.set("spark.databricks.delta.schema.autoMerge.enabled", "true"); SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); } diff --git a/src/test/java/iq/RuntimeTests.java b/src/test/java/iq/RuntimeTests.java index 4b52934fc1..7dbbffed82 100644 --- a/src/test/java/iq/RuntimeTests.java +++ b/src/test/java/iq/RuntimeTests.java @@ -30,14 +30,15 @@ import org.junit.runners.Parameterized; import org.rumbledb.api.Item; import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.Name; +import org.rumbledb.items.ItemFactory; import scala.util.Properties; import sparksoniq.spark.SparkSessionManager; import utils.FileManager; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; @RunWith(Parameterized.class) public class RuntimeTests extends AnnotationsTestsBase { @@ -58,6 +59,33 @@ public RuntimeTests(File testFile) { this.testFile = testFile; } + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--apply-updates", + "yes" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); + } + public static void readFileList(File dir) { FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTests._testFiles.add(file)); } @@ -80,6 +108,11 @@ public static void setupSparkSession() { sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); // enables delta + // store + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); // enables + // delta + // store // prevents spark from failing to start on MacOS when disconnected from the internet sparkConfiguration.set("spark.driver.host", "127.0.0.1"); diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index 04459353dd..8a9c5222eb 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -48,7 +48,9 @@ public RumbleRuntimeConfiguration getConfiguration() { "--variable:externalUnparsedString", "unparsed string", "--function-inlining", - "no" } + "no", + "--apply-updates", + "yes" } ).setExternalVariableValue( Name.createVariableInNoNamespace("externalStringItem"), Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) diff --git a/src/test/java/iq/UpdatesForRumbleBenchmark.java b/src/test/java/iq/UpdatesForRumbleBenchmark.java new file mode 100644 index 0000000000..da2a41317f --- /dev/null +++ b/src/test/java/iq/UpdatesForRumbleBenchmark.java @@ -0,0 +1,708 @@ +package iq; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.LogManager; +import org.apache.spark.SparkConf; +import org.junit.Assert; +import org.rumbledb.api.Item; +import org.rumbledb.api.Rumble; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.cli.JsoniqQueryExecutor; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import scala.util.Properties; +import sparksoniq.spark.SparkSessionManager; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URI; +import java.util.*; +import java.util.function.Consumer; + +public class UpdatesForRumbleBenchmark { + + private static final String APP_NAME = "Rumble application"; + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", "unknown"); + + public List benchmarkFiles; + + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes", + "--print-iterator-tree", + "yes", + "--apply-updates", + "yes", + "--show-error-info", + "yes", + "--materialization-cap", + "900000" + } + ); + + protected static final RumbleRuntimeConfiguration createDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + "--materialization-cap", + "900000" + } + ); + + public UpdatesForRumbleBenchmark() { + this.benchmarkFiles = new ArrayList<>(); + List powersOf2 = new ArrayList<>(); + powersOf2.add(2); + powersOf2.add(4); + powersOf2.add(8); + powersOf2.add(16); + powersOf2.add(32); + powersOf2.add(64); + powersOf2.add(128); + + ////// GH_Q1 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_" + power + + // ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q1/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // String queryFirstHalf = "UPDATE delta.`"; + // String queryLastHalf = "` SET public = (NOT public)"; + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // queryFirstHalf + + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power + queryLastHalf, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q1/createTables/create_table_" + // + power +".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q1/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// GH_Q2 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q2/q2_" + power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q2/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // (tables) -> { + // String updateSchemaQuery = "ALTER TABLE delta.`" + tables.get(0) + "` ADD COLUMNS (repo.nickname STRING, + // repo.popularity_rating INT)"; + // String setQuery = "UPDATE delta.`" + tables.get(0) +"` SET repo.nickname = 'cool_nickname', + // repo.popularity_rating = -1;"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(updateSchemaQuery); + // SparkSessionManager.getInstance().getOrCreateSession().sql(setQuery); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power +".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q2/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// GH_Q3 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q3/q3_" + power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q3/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // (tables) -> { + // String insertSchemaQuery = "ALTER TABLE delta.`" + tables.get(0) + "` ADD COLUMNS (ids ARRAY>)"; + // String setQuery = "UPDATE delta.`" + tables.get(0) +"` SET ids = array(named_struct('repo_id', repo.id, + // 'actor_id', actor.id, 'id', id)), repo.id = NULL, actor.id = NULL, id = NULL;"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(insertSchemaQuery); + // SparkSessionManager.getInstance().getOrCreateSession().sql(setQuery); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q3/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// NEW ORDER TRANSACTION + // RUMBLE + for (Integer power : powersOf2) { + benchmarkFiles.add( + new FileTuple( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_" + + power + + ".jq", + "null", + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/newOrderTable" + + power + ), + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_" + + power + + ".jq" + ), + "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/RUMBLE_NEW_ORDER_INC_" + + power + + ".txt", + false + ) + ); + } + + // SPARK + for (Integer power : powersOf2) { + benchmarkFiles.add( + new FileTuple( + null, + (tables) -> { + String query = "UPDATE delta.`" + tables.get(0) + "` SET NO_O_ID = (NO_O_ID + 1);"; + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + }, + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/newOrderTable" + + power + ), + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_" + + power + + ".jq" + ), + "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/SPARK_NEW_ORDER_INC_" + + power + + ".txt", + true + ) + ); + } + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // String query = "WITH updates AS ( SELECT S_I_ID, OL_QUANTITY FROM delta.`" + tables.get(0) +"` JOIN delta.`" + // + tables.get(1) + "` ON S_I_ID = OL_I_ID AND S_W_ID = OL_SUPPLY_W_ID )" + + // " MERGE INTO delta.`" + tables.get(0) + "` USING updates" + + // " ON delta.`" + tables.get(0) + "`.S_I_ID = updates.S_I_ID " + + // "WHEN MATCHED THEN UPDATE SET S_QUANTITY = CASE WHEN S_QUANTITY - OL_QUANTITY >= 10 THEN S_QUANTITY - + // OL_QUANTITY ELSE S_QUANTITY - OL_QUANTITY + 91," + + // " S_YTD = S_YTD + OL_QUANTITY, S_ORDER_CNT = S_ORDER_CNT + 1"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Arrays.asList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/stockTable32", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable"), + // Arrays.asList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_stock_table_32.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_order_line_table.jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/SPARK_STOCK_OL_UP.txt", + // true + // )); + + ////// PAYMENT TRANSACTION + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/payment" + + // power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/PAYMENT_TRANS/RUMBLE_CUSTOMER_IF_" + power + ".txt", + // false + // )); + // } + // + // // SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // int h_amt = 343; + // String query = "UPDATE delta.`" + tables.get(0) +"` SET C_BALANCE = (C_BALANCE + " + h_amt + "), C_DATA = + // if(C_CREDIT == 'BC', concat(C_DATA, C_ID, C_D_ID, C_W_ID, " + h_amt + "), C_DATA);"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/PAYMENT_TRANS/SPARK_CUSTOMER_IF_" + power + ".txt", + // true + // )); + // } + + ////// DELIVERY TRANSACTION + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/delivery" + + // power + ".jq", + // "null", + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + power, + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/districtTable", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable" + // ), + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_" + // + power + ".jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq" + // ), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/DELIVERY_TRANS/RUMBLE_CUSTOMER_JOIN_" + power + + // ".txt", + // false + // )); + // } + // + // // SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // int no_o_id = 4; + // int w_id = 1; + // String query = "WITH ol_total_per_dist AS ( " + + // "SELECT D_ID, SUM(OL_AMOUNT) AS OL_TOTAL FROM delta.`" + tables.get(1) + "` JOIN delta.`" + tables.get(2) + + // "` ON D_ID = OL_D_ID" + + // " WHERE OL_W_ID = " + w_id + " AND OL_O_ID = " + no_o_id + + // " GROUP BY D_ID" + + // ")" + + // " MERGE INTO delta.`" + tables.get(0) +"` USING ol_total_per_dist" + + // " ON delta.`" + tables.get(0) +"`.C_D_ID = ol_total_per_dist.D_ID" + + // " WHEN MATCHED THEN UPDATE SET C_BALANCE = (C_BALANCE + ol_total_per_dist.OL_TOTAL);"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + power, + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/districtTable", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable" + // ), + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_" + // + power + ".jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq" + // ), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/DELIVERY_TRANS/SPARK_CUSTOMER_JOIN_" + power + ".txt", + // true + // )); + // } + + } + + public static void setupSparkSession() { + + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + if (sparkConfiguration.get("spark.app.name", "").equals(" benchmarkDeltaTest(Rumble rumble, URI uri) throws IOException { + SequenceOfItems sequence = rumble.runQuery(uri); + List res = new ArrayList<>(); + sequence.populateList(res); + return res; + } + + public void benchmarkDelta( + String queryPath, + List tablePaths, + List createTablePaths, + String outputPath + ) + throws IOException { + long total = 0; + long[] diffs = new long[10]; + long start; + long end; + long diff; + List res; + + this.appendToFile(outputPath, "RUMBLE"); + this.appendToFile(outputPath, queryPath); + + URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory( + queryPath, + configuration, + ExceptionMetadata.EMPTY_METADATA + ); + Rumble rumble = new Rumble(configuration); + + // WARMUP + for (int i = 0; i < 3; i++) { + this.createTables(tablePaths, createTablePaths); + res = this.benchmarkDeltaTest(rumble, uri); + this.deleteTables(tablePaths); + } + this.appendToFile(outputPath, "WARMUP DONE"); + + // TIMING + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + res = this.benchmarkDeltaTest(rumble, uri); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + + this.appendToFile(outputPath, "##########################################"); + this.appendToFile(outputPath, "DONE"); + this.appendToFile(outputPath, queryPath); + this.appendToFile(outputPath, "MS"); + this.appendToFile(outputPath, "TOTAL: " + total); + this.appendToFile(outputPath, "DIFFS: " + Arrays.toString(diffs)); + this.appendToFile(outputPath, "AVG: " + (total / 10)); + this.appendToFile(outputPath, "SD: " + sd(diffs)); + this.appendToFile(outputPath, "##########################################"); + } + + + public void benchmarkSparkSQLTest(String query) { + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } + + public void benchmarkSpark( + String query, + List tablePaths, + List createTablePaths, + String outputPath, + Optional>> possSqlFunc + ) + throws IOException { + long total = 0; + long[] diffs = new long[10]; + long start; + long end; + long diff; + + this.appendToFile(outputPath, "SPARK"); + for (String tablePath : tablePaths) { + this.appendToFile(outputPath, tablePath); + } + + Consumer> func = null; + if (possSqlFunc.isPresent()) { + func = possSqlFunc.get(); + } + + // WARMUP + for (int i = 0; i < 3; i++) { + this.createTables(tablePaths, createTablePaths); + if (func != null) { + func.accept(tablePaths); + } else { + this.benchmarkSparkSQLTest(query); + } + this.deleteTables(tablePaths); + } + this.appendToFile(outputPath, "WARMUP DONE"); + + // TIMING + if (func != null) { + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + func.accept(tablePaths); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + } else { + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + this.benchmarkSparkSQLTest(query); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + } + + this.appendToFile(outputPath, "##########################################"); + this.appendToFile(outputPath, "DONE"); + for (String tablePath : tablePaths) { + this.appendToFile(outputPath, tablePath); + } + this.appendToFile(outputPath, "MS"); + this.appendToFile(outputPath, "TOTAL: " + total); + this.appendToFile(outputPath, "DIFFS: " + Arrays.toString(diffs)); + this.appendToFile(outputPath, "AVG: " + (total / 10)); + this.appendToFile(outputPath, "SD: " + sd(diffs)); + this.appendToFile(outputPath, "##########################################"); + } + + public void appendToFile(String path, String str) { + try ( + FileWriter writer = new FileWriter(path, true); + BufferedWriter bufferedWriter = new BufferedWriter(writer) + ) { + bufferedWriter.write(str); + bufferedWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void createTable(String path, String query) throws IOException { + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + URI queryURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + query, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + UpdatesForRumbleBenchmark.createDeltaConfiguration.setOutputPath(tableURI.getPath()); + UpdatesForRumbleBenchmark.createDeltaConfiguration.setQueryPath(queryURI.getPath()); + JsoniqQueryExecutor executor = new JsoniqQueryExecutor(UpdatesForRumbleBenchmark.createDeltaConfiguration); + executor.runQuery(); + } + + public void createTables(List paths, List queries) throws IOException { + for (int i = 0; i < paths.size(); i++) { + this.createTable(paths.get(i), queries.get(i)); + } + } + + public void deleteTable(String path) { + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + UpdatesForRumbleBenchmark.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + try { + File oldTable = new File(tableURI.getPath()); + FileUtils.deleteDirectory(oldTable); + System.err.println("Deleted file: " + oldTable.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + public void deleteTables(List paths) { + for (String path : paths) { + this.deleteTable(path); + } + } + + public static double sd(long[] arr) { + double sd = 0.0; + + long sum = Arrays.stream(arr).sum(); + long N = arr.length; + double mean = (double) sum / N; + + for (long x : arr) { + sd += Math.pow(x - mean, 2); + } + + return Math.sqrt(sd / N); + } + + + public static void main(String[] args) throws IOException { + + UpdatesForRumbleBenchmark benchmark = new UpdatesForRumbleBenchmark(); + setupSparkSession(); + + for (FileTuple ft : benchmark.benchmarkFiles) { + if (ft.isSQL()) { + benchmark.benchmarkSpark( + ft.getQueryMaterial(), + ft.getTablePaths(), + ft.getCreateTablePaths(), + ft.getOutputPath(), + Optional.ofNullable(ft.getSqlQueryFunc()) + ); + } else { + benchmark.benchmarkDelta( + ft.getQueryMaterial(), + ft.getTablePaths(), + ft.getCreateTablePaths(), + ft.getOutputPath() + ); + } + } + + System.out.println("##########################################"); + System.out.println("DONE"); + System.out.println("##########################################"); + + } + + class FileTuple { + + private String queryPath; + private String sqlQuery; + private Consumer> sqlQueryFunc; + private List tablePaths; + private List createTablePaths; + private String outputPath; + private boolean isSQL; + + public FileTuple( + String queryPath, + String sqlQuery, + List tablePaths, + List createTablePaths, + String outputPath, + boolean isSQL + ) { + this.queryPath = queryPath; + this.sqlQuery = sqlQuery; + this.tablePaths = tablePaths; + this.createTablePaths = createTablePaths; + this.outputPath = outputPath; + this.isSQL = isSQL; + } + + public FileTuple( + String queryPath, + Consumer> sqlQueryFunc, + List tablePaths, + List createTablePaths, + String outputPath, + boolean isSQL + ) { + this.queryPath = queryPath; + this.sqlQuery = null; + this.sqlQueryFunc = sqlQueryFunc; + this.tablePaths = tablePaths; + this.createTablePaths = createTablePaths; + this.outputPath = outputPath; + this.isSQL = isSQL; + } + + public String getQueryMaterial() { + return this.isSQL() ? this.sqlQuery : this.queryPath; + } + + public Consumer> getSqlQueryFunc() { + return this.sqlQueryFunc; + } + + public List getTablePaths() { + return tablePaths; + } + + public List getCreateTablePaths() { + return createTablePaths; + } + + public String getOutputPath() { + return outputPath; + } + + public boolean isSQL() { + return isSQL; + } + } +} diff --git a/src/test/java/utils/annotations/AnnotationProcessor.java b/src/test/java/utils/annotations/AnnotationProcessor.java index bc90d83995..c34a4f9d86 100644 --- a/src/test/java/utils/annotations/AnnotationProcessor.java +++ b/src/test/java/utils/annotations/AnnotationProcessor.java @@ -33,6 +33,10 @@ public class AnnotationProcessor { public static final String OUTPUT_KEY = "Output"; + public static final String UPDATE_DIM_KEY = "UpdateDim"; + public static final String UPDATE_TABLE_KEY = "UpdateTable"; + public static final String CREATE_TABLE = "CreateTable"; + public static final String DELETE_TABLE = "DeleteTable"; public static final String ERROR_MESSAGE = "ErrorCode"; public static final String ERROR_METADATA = "ErrorMetadata"; public static final String SHOULD_PARSE = "ShouldParse"; @@ -68,6 +72,12 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A Optional shouldCompile = Optional.empty(); Optional shouldRun = Optional.empty(); + Optional deleteTable = Optional.of(false); + Optional createTable = Optional.of(false); + + Optional updateDim1 = Optional.empty(); + Optional updateDim2 = Optional.empty(); + Map parameters = new HashMap<>(); for (String token : annotationTokens) { if (token.equals(SHOULD_PARSE)) { @@ -84,6 +94,10 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A shouldRun = Optional.of(true); } else if (token.equals(SHOULD_CRASH)) { shouldRun = Optional.of(false); + } else if (token.equals(DELETE_TABLE)) { + deleteTable = Optional.of(true); + } else if (token.equals(CREATE_TABLE)) { + createTable = Optional.of(true); } else if (token.contains("=")) { String[] tokenParts = token.split("=", 2); @@ -93,6 +107,12 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A if (value.startsWith("\"")) { value = value.substring(1, value.length() - 1); } + if (key.equals(UPDATE_DIM_KEY)) { + String[] dimsArr = value.substring(1, value.length() - 1).split(","); + updateDim1 = Optional.of(Integer.parseInt(dimsArr[0])); + updateDim2 = Optional.of(Integer.parseInt(dimsArr[1])); + } + value = value.replaceAll("([^\\\\])\\\\n", "$1\n").replaceAll("\\\\\\\\n", "\\\\n"); parameters.put(key, value); } @@ -107,7 +127,18 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A if (shouldRun.isPresent()) { if (shouldRun.get()) - return new RunnableTestAnnotation(parameters.get(OUTPUT_KEY)); + if (updateDim1.isPresent() && updateDim2.isPresent()) { + return new UpdatingRunnableTestAnnotation( + parameters.get(OUTPUT_KEY), + parameters.get(UPDATE_TABLE_KEY), + updateDim1.get(), + updateDim2.get(), + deleteTable.get(), + createTable.get() + ); + } else { + return new RunnableTestAnnotation(parameters.get(OUTPUT_KEY)); + } else return new UnrunnableTestAnnotation( parameters.get(ERROR_MESSAGE), @@ -134,10 +165,38 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A ); } + public static String getUpdateDimensionAnnotation(Reader reader) throws IOException, AnnotationParseException { + String annotationText = readAnnotationText(reader); + if (annotationText.isEmpty()) { + throw new AnnotationParseException(annotationText, "Found empty annotation."); + } + String[] annotationTokens = annotationText.split("\\s*;\\s*"); + for (String token : annotationTokens) { + if (token.contains(UPDATE_DIM_KEY)) { + + String[] tokenParts = token.split("=", 2); + String value = tokenParts[1].trim(); + if (!value.matches("\\[\\d+,\\d+]")) { + throw new AnnotationParseException( + annotationText, + "UpdateDim key does not match regex: \"\\[\\d+,\\d+]\"" + ); + } + return value; + } + } + throw new AnnotationParseException(annotationText, "No UpdateDim key found."); + } + public static abstract class TestAnnotation { protected String expectedOutput = ""; protected String errorCode = ""; protected String errorMetadata = ""; + protected String deltaTablePath = ""; + protected int updatingDim1 = -1; + protected int updatingDim2 = -1; + protected boolean shouldDeleteTable = false; + protected boolean shouldCreateTable = false; public TestAnnotation() { } @@ -154,6 +213,26 @@ public String getErrorMetadata() { return this.errorMetadata; } + public String getDeltaTablePath() { + return this.deltaTablePath; + } + + public int getUpdatingDim1() { + return this.updatingDim1; + } + + public int getUpdatingDim2() { + return this.updatingDim2; + } + + public boolean shouldDeleteTable() { + return this.shouldDeleteTable; + } + + public boolean shouldCreateTable() { + return this.shouldCreateTable; + } + public abstract boolean shouldParse(); public abstract boolean shouldCompile(); @@ -189,6 +268,39 @@ public boolean shouldRun() { } } + public static class UpdatingRunnableTestAnnotation extends RunnableTestAnnotation { + public UpdatingRunnableTestAnnotation( + String expectedOut, + String deltaTablePath, + int dim1, + int dim2, + boolean shouldDeleteTable, + boolean shouldCreateTable + ) { + super(expectedOut); + this.deltaTablePath = deltaTablePath; + this.updatingDim1 = dim1; + this.updatingDim2 = dim2; + this.shouldDeleteTable = shouldDeleteTable; + this.shouldCreateTable = shouldCreateTable; + } + + @Override + public boolean shouldParse() { + return true; + } + + @Override + public boolean shouldCompile() { + return true; + } + + @Override + public boolean shouldRun() { + return true; + } + } + public static class UnrunnableTestAnnotation extends TestAnnotation { public UnrunnableTestAnnotation(String errorCode, String errorMetadata) { diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq new file mode 100644 index 0000000000..2e15a1595d --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable1024") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq new file mode 100644 index 0000000000..5829e78979 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq new file mode 100644 index 0000000000..5802ca9cd0 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq new file mode 100644 index 0000000000..f82079b88c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq new file mode 100644 index 0000000000..59f777293f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable256") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq new file mode 100644 index 0000000000..649616afa3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq new file mode 100644 index 0000000000..841d911858 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq new file mode 100644 index 0000000000..40f34d7ca9 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable512") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq new file mode 100644 index 0000000000..c9b7f957be --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq new file mode 100644 index 0000000000..0f9bc71d6c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq new file mode 100644 index 0000000000..06a22738f3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return insert "nickname" : "cool_nickname", "popularity_rating" : -1 into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq new file mode 100644 index 0000000000..23c6e67d3e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq new file mode 100644 index 0000000000..1547b12913 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return insert "nickname" : "cool_nickname", "popularity_rating" : -1 into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq new file mode 100644 index 0000000000..2093d7a1ce --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq new file mode 100644 index 0000000000..410b3b377c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq new file mode 100644 index 0000000000..3711d4999a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq new file mode 100644 index 0000000000..5021eacd49 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq new file mode 100644 index 0000000000..84e471bd83 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq new file mode 100644 index 0000000000..6589171005 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq new file mode 100644 index 0000000000..2dc942b7e6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq new file mode 100644 index 0000000000..891bcfd8eb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq new file mode 100644 index 0000000000..d384fb3915 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq new file mode 100644 index 0000000000..41f1ddcd93 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq new file mode 100644 index 0000000000..79ae554e44 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq new file mode 100644 index 0000000000..097b0c995f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 1024 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq new file mode 100644 index 0000000000..fae644a404 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq new file mode 100644 index 0000000000..d64f128d57 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq new file mode 100644 index 0000000000..7bd206f010 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq new file mode 100644 index 0000000000..efad60cf3e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 256 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq new file mode 100644 index 0000000000..6731689230 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq new file mode 100644 index 0000000000..cde52b0290 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq new file mode 100644 index 0000000000..fb815bb7c9 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 512 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq new file mode 100644 index 0000000000..bc0ddb4ac3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq new file mode 100644 index 0000000000..405cf2a591 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq new file mode 100644 index 0000000000..7797c1b486 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq new file mode 100644 index 0000000000..183462f129 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq new file mode 100644 index 0000000000..6adeb995c7 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq new file mode 100644 index 0000000000..f1a9ec0efa --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq new file mode 100644 index 0000000000..b66eb4d43c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq new file mode 100644 index 0000000000..c970ea676f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq new file mode 100644 index 0000000000..ebd23bdbe3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq new file mode 100644 index 0000000000..5d96bb135c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/district.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq new file mode 100644 index 0000000000..5490e977e4 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/order_line.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq new file mode 100644 index 0000000000..921c7b140a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable128")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq new file mode 100644 index 0000000000..fc05618036 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable16")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq new file mode 100644 index 0000000000..46f73aeecd --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable2")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq new file mode 100644 index 0000000000..aeb4e3ef2a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable32")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq new file mode 100644 index 0000000000..0956fc927f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable4")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq new file mode 100644 index 0000000000..bea5c6cce8 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable64")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq new file mode 100644 index 0000000000..306def01bb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable8")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq new file mode 100644 index 0000000000..5d96bb135c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/district.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq new file mode 100644 index 0000000000..e71e9f916a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq new file mode 100644 index 0000000000..fd520ab0d6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq new file mode 100644 index 0000000000..05802c9ce6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq new file mode 100644 index 0000000000..a870e414e3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq new file mode 100644 index 0000000000..4363d9b5a2 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq new file mode 100644 index 0000000000..c41f9c6706 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq new file mode 100644 index 0000000000..35dc83ca68 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq new file mode 100644 index 0000000000..1241944250 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq @@ -0,0 +1,3 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/districtTable") +where $d.D_ID eq 3 and $d.D_W_ID eq 1 +return replace value of $d.D_NEXT_O_ID with ($d.D_NEXT_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq new file mode 100644 index 0000000000..84aed67ddb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable128") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq new file mode 100644 index 0000000000..9a3adbec20 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable16") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq new file mode 100644 index 0000000000..33b2fed59a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable2") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq new file mode 100644 index 0000000000..e9b0551fe8 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable32") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq new file mode 100644 index 0000000000..124012776e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable4") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq new file mode 100644 index 0000000000..f6de66971c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable64") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq new file mode 100644 index 0000000000..d31d121d48 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable8") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq new file mode 100644 index 0000000000..7797c1b486 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq new file mode 100644 index 0000000000..183462f129 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq new file mode 100644 index 0000000000..6adeb995c7 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq new file mode 100644 index 0000000000..f1a9ec0efa --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq new file mode 100644 index 0000000000..b66eb4d43c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq new file mode 100644 index 0000000000..c970ea676f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq new file mode 100644 index 0000000000..ebd23bdbe3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq new file mode 100644 index 0000000000..b62f191196 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable128") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq new file mode 100644 index 0000000000..dae4bbcc23 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable16") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq new file mode 100644 index 0000000000..06e5224f22 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable2") +return + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + if ($c.C_CREDIT eq "BC") + then + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + else + () + ) diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq new file mode 100644 index 0000000000..10c3a7fe66 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable32") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq new file mode 100644 index 0000000000..5840c4d7fe --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable4") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq new file mode 100644 index 0000000000..5a65d5f25d --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable64") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq new file mode 100644 index 0000000000..ce47364f95 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable8") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..7ff1d10a07 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..21b493d056 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..f9d97bc47e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..6ceaf6d6d5 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..021c5fc602 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..01f7ba6892 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..a053d2b7d8 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..f8dfb82774 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..48010533b1 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..7b4b820771 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..f70a259448 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..30b9fc645a Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..b58d9de8fe Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..88e70a2eb4 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..5e7dd6a7e8 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..0ccc0e3f1e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..3012443cac Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..a9826c146b Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc new file mode 100644 index 0000000000..8f5ec23f1b Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/customer.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet new file mode 100644 index 0000000000..5a53151735 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc new file mode 100644 index 0000000000..03f5b4a9bf Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/district.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet new file mode 100644 index 0000000000..1f5e7cf1b9 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc new file mode 100644 index 0000000000..2096c24645 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/history.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet new file mode 100644 index 0000000000..18c1626200 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc new file mode 100644 index 0000000000..ae1171c149 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/item.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet new file mode 100644 index 0000000000..c671faefd6 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc new file mode 100644 index 0000000000..1dfee0c6a9 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet new file mode 100644 index 0000000000..87a78c631e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc new file mode 100644 index 0000000000..aaceec6e1c Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/order.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet new file mode 100644 index 0000000000..46882244d5 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc new file mode 100644 index 0000000000..faa3168a06 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet new file mode 100644 index 0000000000..7ae0da0023 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc new file mode 100644 index 0000000000..b3afa45e61 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/stock.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet new file mode 100644 index 0000000000..3b8fcfbbc1 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc new file mode 100644 index 0000000000..349d348d83 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet new file mode 100644 index 0000000000..6f4761a7f4 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet differ diff --git a/src/test/resources/queries/multirow.parquet/._SUCCESS.crc b/src/test/resources/queries/multirow.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc b/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc new file mode 100644 index 0000000000..3d4106ee49 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/multirow.parquet/_SUCCESS b/src/test/resources/queries/multirow.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet b/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet new file mode 100644 index 0000000000..ea1eb4d227 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet differ diff --git a/src/test/resources/queries/nested_parquet/._SUCCESS.crc b/src/test/resources/queries/nested_parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc b/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc new file mode 100644 index 0000000000..9534b589d9 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/nested_parquet/_SUCCESS b/src/test/resources/queries/nested_parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet b/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet new file mode 100644 index 0000000000..58b2ec9422 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc new file mode 100644 index 0000000000..d3fe12f6bd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc new file mode 100644 index 0000000000..4937e844ba Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc new file mode 100644 index 0000000000..d3fe12f6bd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc new file mode 100644 index 0000000000..c62e953f4b Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc new file mode 100644 index 0000000000..2501e41449 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc new file mode 100644 index 0000000000..e8e4d1e22e Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc new file mode 100644 index 0000000000..25d19030f1 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc new file mode 100644 index 0000000000..516142b2fd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json new file mode 100644 index 0000000000..f9ea9edf6b --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json @@ -0,0 +1,4 @@ +{"commitInfo":{"timestamp":1689813691596,"operation":"WRITE","operationParameters":{"mode":"ErrorIfExists","partitionBy":"[]"},"isolationLevel":"Serializable","isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6700"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"16dbf65a-b299-458f-83d9-e03565c90b09"}} +{"protocol":{"minReaderVersion":1,"minWriterVersion":2}} +{"metaData":{"id":"2f77d9ee-52ac-42d0-9880-56879974d5fd","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"bool_array\",\"type\":{\"type\":\"array\",\"elementType\":\"boolean\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float_array\",\"type\":{\"type\":\"array\",\"elementType\":\"double\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64_array\",\"type\":{\"type\":\"array\",\"elementType\":\"long\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"object_array\",\"type\":{\"type\":\"array\",\"elementType\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"string_array\",\"type\":{\"type\":\"array\",\"elementType\":\"string\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1689813688368}} +{"add":{"path":"part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet","partitionValues":{},"size":6700,"modificationTime":1689813691396,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\"},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\"},\"nullCount\":{\"bool\":0,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0}}"}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json new file mode 100644 index 0000000000..fe993a51aa --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json @@ -0,0 +1,4 @@ +{"commitInfo":{"timestamp":1689813791145,"operation":"WRITE","operationParameters":{"mode":"Overwrite","partitionBy":"[]"},"readVersion":0,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6952"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"fbc16a9a-8ebb-48b4-b481-23a17dab9b1e"}} +{"metaData":{"id":"2f77d9ee-52ac-42d0-9880-56879974d5fd","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"bool_array\",\"type\":{\"type\":\"array\",\"elementType\":\"boolean\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float_array\",\"type\":{\"type\":\"array\",\"elementType\":\"double\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64_array\",\"type\":{\"type\":\"array\",\"elementType\":\"long\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"object_array\",\"type\":{\"type\":\"array\",\"elementType\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"string_array\",\"type\":{\"type\":\"array\",\"elementType\":\"string\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"rowID\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1689813688368}} +{"add":{"path":"part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet","partitionValues":{},"size":6952,"modificationTime":1689813790779,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":0,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} +{"remove":{"path":"part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet","deletionTimestamp":1689813791143,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6700}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json new file mode 100644 index 0000000000..d68b854a7d --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json @@ -0,0 +1,3 @@ +{"commitInfo":{"timestamp":1689813799061,"operation":"UPDATE","operationParameters":{"predicate":"(rowID#1974L = 0)"},"readVersion":1,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numRemovedFiles":"1","numRemovedBytes":"6952","numCopiedRows":"0","numAddedChangeFiles":"0","executionTimeMs":"4326","scanTimeMs":"3529","numAddedFiles":"1","numUpdatedRows":"1","numAddedBytes":"6937","rewriteTimeMs":"791"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"89f89e3a-6ffb-4955-9d1d-50274b0a0b65"}} +{"remove":{"path":"part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet","deletionTimestamp":1689813799056,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6952}} +{"add":{"path":"part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet","partitionValues":{},"size":6937,"modificationTime":1689813799023,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":1,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json new file mode 100644 index 0000000000..ab4f031b8e --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json @@ -0,0 +1,3 @@ +{"commitInfo":{"timestamp":1689813802612,"operation":"WRITE","operationParameters":{"mode":"Overwrite","partitionBy":"[]"},"readVersion":2,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6937"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"f4fe7ea7-81c9-4545-b379-f31282894f71"}} +{"add":{"path":"part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet","partitionValues":{},"size":6937,"modificationTime":1689813802246,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":1,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} +{"remove":{"path":"part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet","deletionTimestamp":1689813802610,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6937}} diff --git a/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet new file mode 100644 index 0000000000..0601ad41e4 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet new file mode 100644 index 0000000000..62667e229a Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet new file mode 100644 index 0000000000..0601ad41e4 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet new file mode 100644 index 0000000000..5b182bc3cb Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc b/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc b/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc new file mode 100644 index 0000000000..819ca5424d Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/_SUCCESS b/src/test/resources/queries/xQuery_update_R_data/R.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet b/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet new file mode 100644 index 0000000000..72699f151d Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet differ diff --git a/src/test/resources/test_files/composability/FunctionDecl1.jq b/src/test/resources/test_files/composability/FunctionDecl1.jq index 7af7070021..5f4d7585df 100644 --- a/src/test/resources/test_files/composability/FunctionDecl1.jq +++ b/src/test/resources/test_files/composability/FunctionDecl1.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { variable $x := 3; while ($x eq 3) { if ($x eq 3) then { diff --git a/src/test/resources/test_files/composability/FunctionDecl2.jq b/src/test/resources/test_files/composability/FunctionDecl2.jq index 4e28983171..73998d16e6 100644 --- a/src/test/resources/test_files/composability/FunctionDecl2.jq +++ b/src/test/resources/test_files/composability/FunctionDecl2.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { exit returning 1; }; diff --git a/src/test/resources/test_files/composability/FunctionDecl3.jq b/src/test/resources/test_files/composability/FunctionDecl3.jq index a7595b9837..211b34a7e8 100644 --- a/src/test/resources/test_files/composability/FunctionDecl3.jq +++ b/src/test/resources/test_files/composability/FunctionDecl3.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { copy $je := {"a" : 1} modify delete json $je.b return $je diff --git a/src/test/resources/test_files/composability/FunctionDeclErr1.jq b/src/test/resources/test_files/composability/FunctionDeclErr1.jq index b19b7b8323..7fc8e7a1ac 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr1.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr1.jq @@ -1,4 +1,4 @@ (:JIQS: ShouldNotCompile; ErrorCode="XQAN0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) -declare %an:sequential %an:nonsequential function foo() { 1 }; +declare %sequential %nonsequential function foo() { 1 }; (: it is a static error to have both sequential and nonsequential annotations :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/FunctionDeclErr2.jq b/src/test/resources/test_files/composability/FunctionDeclErr2.jq index 2c5dedfe95..ac2d1d5a11 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr2.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr2.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:4:COLUMN:0:" :) -declare %an:sequential function barseq() { 0 }; +declare %sequential function barseq() { 0 }; declare function bar() { barseq() }; -declare %an:nonsequential function foo() {bar()}; +declare %nonsequential function foo() {bar()}; (: declared nonsequential with sequential body is not valid :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/FunctionDeclErr3.jq b/src/test/resources/test_files/composability/FunctionDeclErr3.jq index e7414b521e..1a35893026 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr3.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr3.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function bar() { 1 }; -declare %an:nonsequential function foo() { +declare %sequential function bar() { 1 }; +declare %nonsequential function foo() { bar() }; diff --git a/src/test/resources/test_files/composability/FunctionDeclErr4.jq b/src/test/resources/test_files/composability/FunctionDeclErr4.jq index fb850f17ea..922f053a2e 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr4.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr4.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function bar() { 1 }; -declare %an:nonsequential function foo() { +declare %sequential function bar() { 1 }; +declare %nonsequential function foo() { bar(); }; diff --git a/src/test/resources/test_files/composability/VariableDecl1.jq b/src/test/resources/test_files/composability/VariableDecl1.jq index cf89be90b1..e2f2416676 100644 --- a/src/test/resources/test_files/composability/VariableDecl1.jq +++ b/src/test/resources/test_files/composability/VariableDecl1.jq @@ -1,3 +1,3 @@ (:JIQS: ShouldCompile:) -declare %an:nonsequential function foo() { 1 }; +declare %nonsequential function foo() { 1 }; declare variable $var := foo(); diff --git a/src/test/resources/test_files/composability/VariableDeclErr1.jq b/src/test/resources/test_files/composability/VariableDeclErr1.jq index d1bdc8cd7f..57224cad6b 100644 --- a/src/test/resources/test_files/composability/VariableDeclErr1.jq +++ b/src/test/resources/test_files/composability/VariableDeclErr1.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0001"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function foo() { 1 }; +declare %sequential function foo() { 1 }; declare variable $var := foo(); (: variable declaration not allowed with non-updating and non-sequential expressions :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq b/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq index d15310222e..3e80507965 100644 --- a/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq +++ b/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq @@ -1,4 +1,4 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCIN0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) -%an:nonassignable variable $je; +%nonassignable variable $je; (: at least one expr is not simple :) \ No newline at end of file diff --git a/src/test/resources/test_files/parser/VariableDeclarationStatement.jq b/src/test/resources/test_files/parser/VariableDeclarationStatement.jq index e94cb569f5..67a82ced36 100644 --- a/src/test/resources/test_files/parser/VariableDeclarationStatement.jq +++ b/src/test/resources/test_files/parser/VariableDeclarationStatement.jq @@ -1,2 +1,2 @@ (:JIQS: ShouldParse :) -%an:nonassignable variable $uid := doc("users.xml").users.user_tuple[$$ eq "Roger Smith"].userid; \ No newline at end of file +%nonassignable variable $uid := doc("users.xml").users.user_tuple[$$ eq "Roger Smith"].userid; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq new file mode 100644 index 0000000000..80eb0295c5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[4,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/check-delta-transform/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/sample-json.snappy.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq new file mode 100644 index 0000000000..fcbea7a15f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[4,3]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/check-delta-transform/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq new file mode 100644 index 0000000000..a3abf80a3b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[4,1]; Output="{ "bool" : true, "bool_array" : [ true ], "float" : 4.2, "float_array" : [ 4.2 ], "int64" : 42, "int64_array" : [ 42 ], "object" : { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" }, "object_array" : [ { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" } ], "string_array" : [ "hello" ], "string" : "null" }" :) +copy $je := delta-file("./tempDeltaTable") +modify replace value of json $je.string with "null" +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq new file mode 100644 index 0000000000..9a6d699d59 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; UpdateDim=[4,2]; ErrorCode="XUDY0014"; ErrorMetadata="LINE:5:COLUMN:11:" :) +let $data := delta-file("./tempDeltaTable") +return ( + copy $je := {"a" : 1} + modify delete json $data.string + return $je +) +(: Attempt to modify mutable delta file value inside transform without copy :) diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..e33e4fe550 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/multirow-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/multirow.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..005432527a --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,20]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/multirow-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq new file mode 100644 index 0000000000..8a9f00780f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldRun; UpdateDim=[2,5]; Output="" :) +for $arr in delta-file("./tempDeltaTable").foobar +count $c1 +return + for $val in $arr[] + count $c2 + where $c1 eq $c2 + return delete json $arr[[$c2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq new file mode 100644 index 0000000000..b9e95c4802 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,2]; Output="(-1, -1)" :) +for $data in delta-file("./tempDeltaTable") +return $data.foo \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq new file mode 100644 index 0000000000..2de79a4a98 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,4]; Output="({ "is_1" : true, "is_not_1" : null }, { "is_1" : null, "is_not_1" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1" : $data.is_1, "is_not_1" : $data.is_not_1} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq new file mode 100644 index 0000000000..d19724c780 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,6]; Output="([ "test2" ], [ "test4" ])" :) +for $data in delta-file("./tempDeltaTable") +return $data.foobar \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq new file mode 100644 index 0000000000..57bb8e5e50 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,8]; Output="({ "is_1" : true, "is_not_1" : false }, { "is_1" : false, "is_not_1" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1" : $data.is_1, "is_not_1" : $data.is_not_1} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq new file mode 100644 index 0000000000..7a102cdda2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,10]; Output="({ "is_1_2" : true, "is_not_1_2" : null }, { "is_1_2" : null, "is_not_1_2" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1_2" : $data.is_1_2, "is_not_1_2" : $data.is_not_1_2} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq new file mode 100644 index 0000000000..58f8cefb04 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,12]; Output="({ "is_1_2" : true, "is_not_1_2" : false }, { "is_1_2" : false, "is_not_1_2" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1_2" : $data.is_1_2, "is_not_1_2" : $data.is_not_1_2} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq new file mode 100644 index 0000000000..da94780307 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,14]; Output="({ "key1" : "value1" }, { "key1" : "value1" })" :) +for $data in delta-file("./tempDeltaTable") +return $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq new file mode 100644 index 0000000000..e0b1e0bd90 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,16]; Output="({ "key1" : "value1", "key2" : "value2" }, { "key1" : "value1", "key2" : "value2" })" :) +for $data in delta-file("./tempDeltaTable") +return $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq new file mode 100644 index 0000000000..dec3ec9841 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,13]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return insert json { "nest" : { "key1" : "value1" } } into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq new file mode 100644 index 0000000000..06f1ec6f69 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,15]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return insert json "key2" : "value2" into $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq new file mode 100644 index 0000000000..9840b1fb22 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,3]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_1" : true} into $data + else + insert json {"is_not_1" : true} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq new file mode 100644 index 0000000000..2bf0c4899d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,9]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_1_2" : true} into $data + else + insert json {"is_not_1_2" : true} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq new file mode 100644 index 0000000000..b02277092c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,11]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_not_1_2" : false} into $data + else + insert json {"is_1_2" : false} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq new file mode 100644 index 0000000000..f05fb5b2a6 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,1]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return replace value of json $data.foo with -1 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq new file mode 100644 index 0000000000..f17973da44 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq @@ -0,0 +1,14 @@ +(:JIQS: ShouldRun; UpdateDim=[2,7]; Output="" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + if($o.$key) + then + replace value of json $o.$key with $val + else + insert json $key : $val into $o +}; +for $data in delta-file("./tempDeltaTable") +count $c +return ( + local:upsert($data, "is_1", $c eq 1), + local:upsert($data, "is_not_1", $c ne 1) +) diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..a0cb994520 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/nested-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/nested_parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..a9ed501929 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,15]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/nested-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq new file mode 100644 index 0000000000..4334f51dde --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,13]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq new file mode 100644 index 0000000000..948015557e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,9]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json {"string" : "NEW SUCCESS" } into $data.object.object.object_array at position 2 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq new file mode 100644 index 0000000000..0d1d9c9eda --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,11]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.object.object.object_array[[2]] with { "string" : "NEW DOUBLE SUCCESS" } \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq new file mode 100644 index 0000000000..3cd20c96f3 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,2]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq new file mode 100644 index 0000000000..25ea91ad00 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,4]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq new file mode 100644 index 0000000000..b3fd3479fc --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq new file mode 100644 index 0000000000..cb27982197 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,8]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq new file mode 100644 index 0000000000..49eee99bf5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,10]; Output="{ "string" : "NEW SUCCESS" }" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq new file mode 100644 index 0000000000..5a23d90e0d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,12]; Output="{ "string" : "NEW DOUBLE SUCCESS" }" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq new file mode 100644 index 0000000000..3af8cc118b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,14]; Output="[ { "string" : "hello" } ]" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq new file mode 100644 index 0000000000..ad085737b3 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,7]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq new file mode 100644 index 0000000000..1225fd497e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,1]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "new_ins" : "SUCCESS" into $data.object.object.object_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq new file mode 100644 index 0000000000..3f832e9c20 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,5]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.object.object.object_array[[1]].new_ins as "success" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq new file mode 100644 index 0000000000..762c7b1d0c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,3]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.object.object.object_array[[1]].new_ins with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..aaf6ee4972 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/simple-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/sample-json.snappy.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..52f4b677bb --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,15]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/simple-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq new file mode 100644 index 0000000000..8cda6c5961 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,13]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq new file mode 100644 index 0000000000..e6190a18d8 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,9]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "SUCCESS" into $data.string_array at position 2 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq new file mode 100644 index 0000000000..dc3eab8bf4 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,11]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.string_array[[2]] with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq new file mode 100644 index 0000000000..38a5429ba7 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,2]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return $data.bool \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq new file mode 100644 index 0000000000..9a8b6e73fa --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,4]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq new file mode 100644 index 0000000000..a9d5a32a21 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq new file mode 100644 index 0000000000..70ad65ad1b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,8]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq new file mode 100644 index 0000000000..065f117e7d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,10]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq new file mode 100644 index 0000000000..44f6d47e97 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,12]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq new file mode 100644 index 0000000000..883594e1da --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,14]; Output="[ "hello" ]" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq new file mode 100644 index 0000000000..2272f9b7ed --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,1]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.bool \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq new file mode 100644 index 0000000000..072bd22d5f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,3]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "new_ins" : "SUCCESS" into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq new file mode 100644 index 0000000000..0c3e0e50e2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,7]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.new_ins as "success" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq new file mode 100644 index 0000000000..e3e29f83d6 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,5]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_ins with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq new file mode 100644 index 0000000000..9fc124a3d2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/R"; Output="" :) +let $data := parquet-file("../../../queries/xQuery_update_R_data/R.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq new file mode 100644 index 0000000000..bbe196ccd5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,20]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/R"; Output="" :) +let $data := "" +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq new file mode 100644 index 0000000000..f4a0b62e42 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,1]; Output="" :) +let $users := delta-file("./R").users +return append json {"userID" : "U07", "name" : "Annabel Lee"} into $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq new file mode 100644 index 0000000000..c42bf70c15 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,2]; Output="[ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Dee Linquent", "rating" : "D", "userID" : "U03" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "userID" : "U07" } ]" :) +let $users := delta-file("./R").users +return $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq new file mode 100644 index 0000000000..8e3914ee2e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,3]; Output="" :) +let $bids := delta-file("./R").bids +return append json {"userID" : "U07", "itemNO" : 1001, "bid" : 60, "bid_date" : "1999-02-01"} into $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq new file mode 100644 index 0000000000..f48dbc19f5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,4]; Output="[ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" } ]" :) +let $bids := delta-file("./R").bids +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq new file mode 100644 index 0000000000..3af1edb570 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; UpdateDim=[3,5]; Output="" :) +let $R := delta-file("./R") +let $users := $R.users[] +let $bids := $R.bids[] +let $uid := $users[$$.name eq "Annabel Lee"].userID +let $top_bid := max($bids[$$.itemNO eq 1002].bid) +return append json {"userID" : $uid, "itemNO" : 1002, "bid" : $top_bid * 1.1, "bid_date" : "1999-02-01"} into $R.bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq new file mode 100644 index 0000000000..0276f2c2aa --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,6]; Output="({ "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" })" :) +let $bids := delta-file("./R").bids[] +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq new file mode 100644 index 0000000000..956b2c7502 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[3,7]; Output="" :) +for $user in delta-file("./R").users[] +where $user.name eq "Annabel Lee" +return + if ($user.rating) + then + replace value of json $user.rating with "B" + else + insert json "rating" : "B" into $user \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq new file mode 100644 index 0000000000..efc46afd7c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,8]; Output="[ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Dee Linquent", "rating" : "D", "userID" : "U03" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "rating" : "B", "userID" : "U07" } ]" :) +let $users := delta-file("./R").users +return $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq new file mode 100644 index 0000000000..8299917db7 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq @@ -0,0 +1,12 @@ +(:JIQS: ShouldRun; UpdateDim=[3,9]; Output="" :) +let $R := delta-file("./R") +let $bids := $R.bids[] +let $users := $R.users[] +let $uid := $users[$$.name eq "Annabel Lee"].userID +let $top_bid := max($bids[$$.itemNO eq 1007].bid) +return + if ($top_bid * 1.1 le 200) + then + append json {"userID" : $uid, "itemNO" : 1007, "bid" : $top_bid * 1.1, "bid_date" : "1999-02-01"} into $R.bids + else + () \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq new file mode 100644 index 0000000000..34afea2d7c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,10]; Output="[ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" } ]" :) +let $bids := delta-file("./R").bids +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq new file mode 100644 index 0000000000..b39a77026b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq @@ -0,0 +1,21 @@ +(:JIQS: ShouldRun; UpdateDim=[3,11]; Output="" :) +let $R := delta-file("./R") +let $usersSeq := $R.users[] +let $remove_uid := $usersSeq[$$.name eq "Dee Linquent"].userID +return + ( + for $item in $R.items[] + count $c + where $item.offered_by = $remove_uid + return delete json $R.items[[$c]] + , + for $bid in $R.bids[] + count $c + where $bid.userID = $remove_uid + return delete json $R.bids[[$c]] + , + for $user in $R.users[] + count $c + where $user.name eq "Dee Linquent" + return delete json $R.users[[$c]] + ) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq new file mode 100644 index 0000000000..177704a837 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,12]; Output="{ "bids" : [ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" } ], "items" : [ { "description" : "Red Bicycle", "end_date" : "1999-01-20", "itemNO" : "1001", "offered_by" : "U01", "reserve_price" : 40, "start_date" : "1999-01-05" }, { "description" : "Motorcycle", "end_date" : "1999-03-15", "itemNO" : "1002", "offered_by" : "U02", "reserve_price" : 500, "start_date" : "1999-02-11" }, { "description" : "Old Bicycle", "end_date" : "1999-02-20", "itemNO" : "1003", "offered_by" : "U02", "reserve_price" : 25, "start_date" : "1999-01-10" }, { "description" : "Tricycle", "end_date" : "1999-03-08", "itemNO" : "1004", "offered_by" : "U01", "reserve_price" : 15, "start_date" : "1999-02-25" }, { "description" : "Racing Bicycle", "end_date" : "1999-02-20", "itemNO" : "1007", "offered_by" : "U04", "reserve_price" : 200, "start_date" : "1999-01-20" }, { "description" : "Broken Bicycle", "end_date" : "1999-03-06", "itemNO" : "1008", "offered_by" : "U01", "reserve_price" : 25, "start_date" : "1999-02-05" } ], "users" : [ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "rating" : "B", "userID" : "U07" } ] }" :) +let $R := delta-file("./R") +return $R \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq b/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq new file mode 100644 index 0000000000..2d0ba36f97 --- /dev/null +++ b/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="{ "bool_array" : [ true ], "float" : 4.2, "float_array" : [ 4.2 ], "int64" : 42, "int64_array" : [ 42 ], "object" : { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" }, "object_array" : [ { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" } ], "string" : "hello", "string_array" : [ "hello" ] }" :) +delta-file("../../../queries/sample_json_delta") + diff --git a/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq b/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq new file mode 100644 index 0000000000..96782c23c5 --- /dev/null +++ b/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldCrash; ErrorCode="FODC0002"; ErrorMetadata="LINE:2;COLUMN:0;" :) +delta-file("./does-not-exist") diff --git a/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq b/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq index 96ea32b888..016846e132 100644 --- a/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq +++ b/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldRun; Output="0":) -declare %an:assignable variable $x := 3; +declare %assignable variable $x := 3; declare function local:recursive_decrement_x($to_change) { if ($x gt 0) then { $x := $x - 1; diff --git a/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq b/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq index 5f8edf653d..0ec946fda6 100644 --- a/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq +++ b/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldRun; Output="({ "name" : "test@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "test1@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "aaa@aaa.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "a@a.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "test9999@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" })" :) -declare %an:assignable variable $res as item* := (); +declare %assignable variable $res as item* := (); declare function local:validate-and-return($username as xs:string) { variable $user-doc := json-doc("../../../queries/user-names.json"); variable $log := {}; diff --git a/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq new file mode 100644 index 0000000000..b5bd41bff6 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="[ 1, 2, 4 ]" :) +copy $je := [1 to 4] +modify (replace value of json $je[[3]] with 6, delete json $je[[3]]) +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq new file mode 100644 index 0000000000..e77eb37e3a --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="{ "b" : 2, "c" : 3, "d" : 4 }" :) +copy $je := {"a": 1, "b": 2, "c": 3, "d": 4} +modify (delete json $je.a, replace value of json $je.a with 5) +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq b/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq new file mode 100644 index 0000000000..c16a2967af --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0016"; ErrorMetadata="LINE:3:COLUMN:38:" :) +copy $je := {"a" : 1} +modify (insert json "b" : 4 into $je, delete json $je.b) +return $je + +(: selector string does not exist in target object in snapshot :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq new file mode 100644 index 0000000000..6585bc5cfe --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0016"; ErrorMetadata="LINE:3:COLUMN:7:" :) +copy $je := [1 to 4] +modify insert json 5 into $je at position 6 +return $je + +(: selector expr does not evaluate to int within range of the target array :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq new file mode 100644 index 0000000000..ace107d8de --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0006"; ErrorMetadata="LINE:3:COLUMN:27:" :) +copy $je := {"a": 1, "b": 2, "c": 3, "d": 4} +modify (delete json $je.a, insert json "a" : 10 into $je) +return $je + +(: selector key already exists in object in snapshot :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq new file mode 100644 index 0000000000..f382ed3c90 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq @@ -0,0 +1,20 @@ +(:JIQS: ShouldCrash; ErrorCode="XUDY0014"; ErrorMetadata="LINE:10:COLUMN:27:" :) +copy $je := [1 to 4] +modify () +return ( + let $x := ( + copy $ej := [5 to 8] + modify ( + let $x := ( + copy $ee := [5 to 8] + modify delete json $je[[1]] + return $ee + ) + return delete json $ej[[2]] + ) + return $ej + ) + return $je +) + +(: target of modify is not same level copy var :) diff --git a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq index 488b27d517..46fae609c8 100644 --- a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq +++ b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq @@ -5,4 +5,4 @@ let $y := copy $je := [1 to 4] return $je return $x -(: target of modify is not same level copy var :) +(: target of modify is not mutable :) diff --git a/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq b/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq new file mode 100644 index 0000000000..1105d41ac6 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="" :) +let $data := {"bool" : true, "int": 10} +return delete json $data.bool + +(: attempt to modify immutable variable :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq new file mode 100644 index 0000000000..c8959ac0ac --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq @@ -0,0 +1,11 @@ +(:JIQS: ShouldRun; Output="{ "a" : 1, "b" : 2, "c" : 3 }" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + if($o.$key) + then + replace value of json $o.$key with $val + else + insert json $key : $val into $o +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq new file mode 100644 index 0000000000..4bd8628fa2 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; Output="{ "a" : 1, "b" : 2 }" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq new file mode 100644 index 0000000000..0ffb4c760e --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0001"; ErrorMetadata="LINE:6:COLUMN:20:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert(insert json "c" : 3 into $je, "c", 3) +return $je +(: argument of function call is not simple :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq new file mode 100644 index 0000000000..54e06fd8c0 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare function local:upsert($o as object, $key as string, $val as item) { + insert json $key : $val into $o +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq new file mode 100644 index 0000000000..cb44b83486 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0028"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) as item* { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je +(: declared updating function has return type :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq new file mode 100644 index 0000000000..3a0a8f7a5b --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0002"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + $val +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je +(: updating function has simple body :) \ No newline at end of file diff --git a/src/test/resources/test_files/sequential/BlockStatementSequential.jq b/src/test/resources/test_files/sequential/BlockStatementSequential.jq index d8bee5457c..c7c92f713a 100644 --- a/src/test/resources/test_files/sequential/BlockStatementSequential.jq +++ b/src/test/resources/test_files/sequential/BlockStatementSequential.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:sequential function foo() { 1 }; +declare %sequential function foo() { 1 }; { variable $x := 3; diff --git a/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq b/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq index 8ff7481c3b..74aa093cdb 100644 --- a/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq +++ b/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { 1 }; +declare %nonsequential function foo() { 1 }; { variable $x := 3;