summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--container-search/abi-spec.json1
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java5
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java136
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java126
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java33
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java56
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java13
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java48
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java17
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java11
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/SelectParser.java1
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/parser/Parser.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/HitGroup.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchchain/Execution.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java3
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java32
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java11
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java9
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java26
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java39
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java12
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonFeedReader.java18
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonWriter.java28
-rw-r--r--document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java20
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java2
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java22
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java21
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java23
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java22
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java39
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java7
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java22
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java117
-rw-r--r--document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java6
-rw-r--r--document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java14
-rwxr-xr-xdocument/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java114
-rw-r--r--document/src/tests/datatype/datatype_test.cpp7
-rw-r--r--documentapi/abi-spec.json94
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java139
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java2
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java1
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java122
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java9
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java24
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java63
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java156
-rw-r--r--documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java4
-rwxr-xr-xdocumentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java6
-rw-r--r--documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java16
-rw-r--r--eval/src/apps/tensor_conformance/generate.cpp9
-rw-r--r--eval/src/apps/tensor_conformance/test_spec.json135
-rw-r--r--eval/src/tests/eval/node_types/node_types_test.cpp84
-rw-r--r--eval/src/tests/eval/tensor_function/tensor_function_test.cpp28
-rw-r--r--eval/src/tests/eval/value_type/value_type_test.cpp261
-rw-r--r--eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp5
-rw-r--r--eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp56
-rw-r--r--eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp5
-rw-r--r--eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp10
-rw-r--r--eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp5
-rw-r--r--eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp3
-rw-r--r--eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp17
-rw-r--r--eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp54
-rw-r--r--eval/src/vespa/eval/eval/node_types.cpp2
-rw-r--r--eval/src/vespa/eval/eval/node_types.h2
-rw-r--r--eval/src/vespa/eval/eval/simple_tensor.cpp1
-rw-r--r--eval/src/vespa/eval/eval/test/eval_fixture.cpp1
-rw-r--r--eval/src/vespa/eval/eval/test/tensor_conformance.cpp18
-rw-r--r--eval/src/vespa/eval/eval/value_type.cpp157
-rw-r--r--eval/src/vespa/eval/eval/value_type.h16
-rw-r--r--eval/src/vespa/eval/eval/value_type_spec.cpp7
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp4
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/tensor_mapper.cpp113
-rw-r--r--jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java13
-rw-r--r--parent/pom.xml8
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/proton.cpp20
-rw-r--r--searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp35
-rw-r--r--searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp13
-rw-r--r--searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp49
-rw-r--r--searchlib/src/vespa/searchlib/features/attributefeature.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/features/constant_feature.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/features/queryfeature.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp3
-rw-r--r--storage/src/vespa/storage/distributor/bucketdbupdater.cpp44
-rw-r--r--storage/src/vespa/storage/distributor/bucketdbupdater.h14
-rw-r--r--vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java42
-rw-r--r--vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java19
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java3
-rw-r--r--vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java3
-rw-r--r--vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java9
-rw-r--r--vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java67
-rw-r--r--vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java289
-rw-r--r--vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java65
-rw-r--r--vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java58
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java6
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java5
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java22
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java3
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java25
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java9
-rw-r--r--vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java5
-rw-r--r--vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java5
-rw-r--r--vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java20
-rw-r--r--vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java7
-rwxr-xr-xvespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java4
122 files changed, 1602 insertions, 2041 deletions
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json
index b968d1c391f..fb50da7bff1 100644
--- a/container-search/abi-spec.json
+++ b/container-search/abi-spec.json
@@ -7252,6 +7252,7 @@
"public void setId(com.yahoo.net.URI)",
"public void setOrdered(boolean)",
"public int size()",
+ "public void ensureCapacity(int)",
"public int getConcreteSize()",
"public int getConcreteSizeShallow()",
"public int getSubgroupCount()",
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java
index 190a7905476..469ef4864bf 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java
@@ -26,7 +26,6 @@ import static com.yahoo.prelude.fastsearch.VespaBackEndSearcher.hitIterator;
* @author ollivir
*/
public class FS4FillInvoker extends FillInvoker {
-
private final VespaBackEndSearcher searcher;
private FS4Channel channel;
@@ -156,10 +155,10 @@ public class FS4FillInvoker extends FillInvoker {
result.getQuery().trace((summaryNeedsQuery ? "Resending " : "Not resending ") + "query during document summary fetching", 3);
GetDocSumsPacket docsumsPacket = GetDocSumsPacket.create(result, summaryClass, summaryNeedsQuery);
- int compressionLimit = result.getQuery().properties().getInteger(FastSearcher.PACKET_COMPRESSION_LIMIT, 0);
+ int compressionLimit = result.getQuery().properties().getInteger(FS4SearchInvoker.PACKET_COMPRESSION_LIMIT, 0);
docsumsPacket.setCompressionLimit(compressionLimit);
if (compressionLimit != 0) {
- docsumsPacket.setCompressionType(result.getQuery().properties().getString(FastSearcher.PACKET_COMPRESSION_TYPE, "lz4"));
+ docsumsPacket.setCompressionType(result.getQuery().properties().getString(FS4SearchInvoker.PACKET_COMPRESSION_TYPE, "lz4"));
}
boolean couldSend = channel.sendPacket(docsumsPacket);
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java
index 2353054103d..27c4c73dd65 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java
@@ -1,21 +1,39 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.fastsearch;
+import com.yahoo.data.access.simple.Value;
+import com.yahoo.data.access.slime.SlimeAdapter;
import com.yahoo.fs4.BasicPacket;
import com.yahoo.fs4.ChannelTimeoutException;
+import com.yahoo.fs4.DocumentInfo;
+import com.yahoo.fs4.FS4Properties;
import com.yahoo.fs4.QueryPacket;
+import com.yahoo.fs4.QueryPacketData;
import com.yahoo.fs4.QueryResultPacket;
import com.yahoo.fs4.mplex.FS4Channel;
import com.yahoo.fs4.mplex.InvalidChannelException;
+import com.yahoo.io.GrowableByteBuffer;
+import com.yahoo.log.LogLevel;
+import com.yahoo.prelude.ConfigurationException;
+import com.yahoo.processing.request.CompoundName;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.dispatch.ResponseMonitor;
import com.yahoo.search.dispatch.SearchInvoker;
import com.yahoo.search.dispatch.searchcluster.Node;
+import com.yahoo.search.query.Sorting;
+import com.yahoo.search.result.Coverage;
import com.yahoo.search.result.ErrorMessage;
+import com.yahoo.search.result.Relevance;
import com.yahoo.search.searchchain.Execution;
+import com.yahoo.searchlib.aggregation.Grouping;
+import com.yahoo.slime.BinaryFormat;
+import com.yahoo.vespa.objects.BufferSerializer;
import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
@@ -25,6 +43,9 @@ import java.util.logging.Logger;
* @author ollivir
*/
public class FS4SearchInvoker extends SearchInvoker implements ResponseMonitor<FS4Channel> {
+ static final CompoundName PACKET_COMPRESSION_LIMIT = new CompoundName("packetcompressionlimit");
+ static final CompoundName PACKET_COMPRESSION_TYPE = new CompoundName("packetcompressiontype");
+
private static final Logger log = Logger.getLogger(FS4SearchInvoker.class.getName());
private final VespaBackEndSearcher searcher;
@@ -48,7 +69,7 @@ public class FS4SearchInvoker extends SearchInvoker implements ResponseMonitor<F
log.finest("sending query packet");
this.query = query;
- this.queryPacket = searcher.createQueryPacket(searcher.getServerId(), query);
+ createQueryPacket(searcher.getServerId(), query);
try {
boolean couldSend = channel.sendPacket(queryPacket);
@@ -98,13 +119,120 @@ public class FS4SearchInvoker extends SearchInvoker implements ResponseMonitor<F
Result result = new Result(query);
- searcher.addMetaInfo(query, queryPacket.getQueryPacketData(), resultPacket, result);
-
- searcher.addUnfilledHits(result, resultPacket.getDocuments(), queryPacket.getQueryPacketData(), distributionKey());
+ ensureResultHitCapacity(result, resultPacket);
+ addMetaInfo(query, queryPacket.getQueryPacketData(), resultPacket, result);
+ addUnfilledHits(result, resultPacket.getDocuments(), queryPacket.getQueryPacketData());
return result;
}
+ private QueryPacket createQueryPacket(String serverId, Query query) {
+ this.queryPacket = QueryPacket.create(serverId, query);
+ int compressionLimit = query.properties().getInteger(PACKET_COMPRESSION_LIMIT, 0);
+ queryPacket.setCompressionLimit(compressionLimit);
+ if (compressionLimit != 0) {
+ queryPacket.setCompressionType(query.properties().getString(PACKET_COMPRESSION_TYPE, "lz4"));
+ }
+ log.fine(() -> "made QueryPacket: " + queryPacket);
+
+ return queryPacket;
+ }
+
+ private void ensureResultHitCapacity(Result result, QueryResultPacket resultPacket) {
+ int hitCount = resultPacket.getDocumentCount();
+ if (resultPacket.getGroupData() != null) {
+ hitCount++;
+ }
+ result.hits().ensureCapacity(hitCount);
+ }
+
+ private void addMetaInfo(Query query, QueryPacketData queryPacketData, QueryResultPacket resultPacket, Result result) {
+ result.setTotalHitCount(resultPacket.getTotalDocumentCount());
+
+ addBackendTrace(query, resultPacket);
+
+ // Grouping
+ if (resultPacket.getGroupData() != null) {
+ byte[] data = resultPacket.getGroupData();
+ ArrayList<Grouping> list = new ArrayList<>();
+ BufferSerializer buf = new BufferSerializer(new GrowableByteBuffer(ByteBuffer.wrap(data)));
+ int cnt = buf.getInt(null);
+ for (int i = 0; i < cnt; i++) {
+ Grouping g = new Grouping();
+ g.deserialize(buf);
+ list.add(g);
+ }
+ GroupingListHit hit = new GroupingListHit(list, searcher.getDocsumDefinitionSet(query));
+ hit.setQuery(result.getQuery());
+ hit.setSource(getName());
+ hit.setQueryPacketData(queryPacketData);
+ result.hits().add(hit);
+ }
+
+ if (resultPacket.getCoverageFeature()) {
+ result.setCoverage(new Coverage(resultPacket.getCoverageDocs(), resultPacket.getActiveDocs(), resultPacket.getNodesReplied())
+ .setSoonActive(resultPacket.getSoonActiveDocs())
+ .setDegradedReason(resultPacket.getDegradedReason())
+ .setNodesTried(resultPacket.getNodesQueried()));
+ }
+ }
+
+ private void addBackendTrace(Query query, QueryResultPacket resultPacket) {
+ if (resultPacket.propsArray == null) return;
+ Value.ArrayValue traces = new Value.ArrayValue();
+ for (FS4Properties properties : resultPacket.propsArray) {
+ if ( ! properties.getName().equals("trace")) continue;
+ for (FS4Properties.Entry entry : properties.getEntries()) {
+ traces.add(new SlimeAdapter(BinaryFormat.decode(entry.getValue()).get()));
+ }
+ }
+ query.trace(traces, query.getTraceLevel());
+ }
+
+ /**
+ * Creates unfilled hits from a List of DocumentInfo instances.
+ */
+ private void addUnfilledHits(Result result, List<DocumentInfo> documents, QueryPacketData queryPacketData) {
+ Query myQuery = result.getQuery();
+ Sorting sorting = myQuery.getRanking().getSorting();
+ Optional<Integer> channelDistributionKey = distributionKey();
+
+ for (DocumentInfo document : documents) {
+
+ try {
+ FastHit hit = new FastHit();
+ hit.setQuery(myQuery);
+ if (queryPacketData != null)
+ hit.setQueryPacketData(queryPacketData);
+
+ hit.setFillable();
+ hit.setCached(false);
+
+ extractDocumentInfo(hit, document, sorting);
+ channelDistributionKey.ifPresent(hit::setDistributionKey);
+
+ result.hits().add(hit);
+ } catch (ConfigurationException e) {
+ log.log(LogLevel.WARNING, "Skipping hit", e);
+ } catch (Exception e) {
+ log.log(LogLevel.ERROR, "Skipping malformed hit", e);
+ }
+ }
+ }
+
+ private void extractDocumentInfo(FastHit hit, DocumentInfo document, Sorting sorting) {
+ hit.setSource(getName());
+
+ Number rank = document.getMetric();
+
+ hit.setRelevance(new Relevance(rank.doubleValue()));
+
+ hit.setDistributionKey(document.getDistributionKey());
+ hit.setGlobalId(document.getGlobalId());
+ hit.setPartId(document.getPartId());
+ hit.setSortData(document.getSortData(), sorting);
+ }
+
@Override
public void release() {
if (channel != null) {
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java
index f5e437c2410..055b41fd89d 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java
@@ -2,18 +2,9 @@
package com.yahoo.prelude.fastsearch;
import com.yahoo.collections.TinyIdentitySet;
-import com.yahoo.data.access.simple.Value;
-import com.yahoo.data.access.slime.SlimeAdapter;
import com.yahoo.fs4.DocsumPacket;
-import com.yahoo.fs4.DocumentInfo;
-import com.yahoo.fs4.FS4Properties;
import com.yahoo.fs4.Packet;
import com.yahoo.fs4.QueryPacket;
-import com.yahoo.fs4.QueryPacketData;
-import com.yahoo.fs4.QueryResultPacket;
-import com.yahoo.io.GrowableByteBuffer;
-import com.yahoo.log.LogLevel;
-import com.yahoo.prelude.ConfigurationException;
import com.yahoo.prelude.query.Item;
import com.yahoo.prelude.query.NullItem;
import com.yahoo.prelude.query.textualrepresentation.TextualQueryRepresentation;
@@ -24,20 +15,14 @@ import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.cluster.PingableSearcher;
import com.yahoo.search.grouping.vespa.GroupingExecutor;
-import com.yahoo.search.query.Sorting;
-import com.yahoo.search.result.Coverage;
import com.yahoo.search.result.ErrorHit;
import com.yahoo.search.result.ErrorMessage;
import com.yahoo.search.result.Hit;
-import com.yahoo.search.result.Relevance;
import com.yahoo.search.searchchain.Execution;
import com.yahoo.searchlib.aggregation.Grouping;
-import com.yahoo.slime.BinaryFormat;
-import com.yahoo.vespa.objects.BufferSerializer;
import java.io.IOException;
import java.lang.reflect.Constructor;
-import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -55,8 +40,6 @@ import java.util.logging.Logger;
*/
public abstract class VespaBackEndSearcher extends PingableSearcher {
- static final CompoundName PACKET_COMPRESSION_LIMIT = new CompoundName("packetcompressionlimit");
- static final CompoundName PACKET_COMPRESSION_TYPE = new CompoundName("packetcompressiontype");
private static final CompoundName TRACE_DISABLE = new CompoundName("trace.disable");
private String serverId;
@@ -198,19 +181,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher {
return result;
}
- protected QueryPacket createQueryPacket(String serverId, Query query) {
- QueryPacket queryPacket = QueryPacket.create(serverId, query);
- int compressionLimit = query.properties().getInteger(PACKET_COMPRESSION_LIMIT, 0);
- queryPacket.setCompressionLimit(compressionLimit);
- if (compressionLimit != 0)
- queryPacket.setCompressionType(query.properties().getString(PACKET_COMPRESSION_TYPE, "lz4"));
-
- if (isLoggingFine())
- getLogger().fine("made QueryPacket: " + queryPacket);
-
- return queryPacket;
- }
-
private List<Result> partitionHits(Result result, String summaryClass) {
List<Result> parts = new ArrayList<>();
TinyIdentitySet<Query> queryMap = new TinyIdentitySet<>(4);
@@ -343,49 +313,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher {
}
}
- private void addBackendTrace(Query query, QueryResultPacket resultPacket) {
- if (resultPacket.propsArray == null) return;
- Value.ArrayValue traces = new Value.ArrayValue();
- for (FS4Properties properties : resultPacket.propsArray) {
- if ( ! properties.getName().equals("trace")) continue;
- for (FS4Properties.Entry entry : properties.getEntries()) {
- traces.add(new SlimeAdapter(BinaryFormat.decode(entry.getValue()).get()));
- }
- }
- query.trace(traces, query.getTraceLevel());
- }
-
- void addMetaInfo(Query query, QueryPacketData queryPacketData, QueryResultPacket resultPacket, Result result) {
- result.setTotalHitCount(resultPacket.getTotalDocumentCount());
-
- addBackendTrace(query, resultPacket);
-
- // Grouping
- if (resultPacket.getGroupData() != null) {
- byte[] data = resultPacket.getGroupData();
- ArrayList<Grouping> list = new ArrayList<>();
- BufferSerializer buf = new BufferSerializer(new GrowableByteBuffer(ByteBuffer.wrap(data)));
- int cnt = buf.getInt(null);
- for (int i = 0; i < cnt; i++) {
- Grouping g = new Grouping();
- g.deserialize(buf);
- list.add(g);
- }
- GroupingListHit hit = new GroupingListHit(list, getDocsumDefinitionSet(query));
- hit.setQuery(result.getQuery());
- hit.setSource(getName());
- hit.setQueryPacketData(queryPacketData);
- result.hits().add(hit);
- }
-
- if (resultPacket.getCoverageFeature()) {
- result.setCoverage(new Coverage(resultPacket.getCoverageDocs(), resultPacket.getActiveDocs(), resultPacket.getNodesReplied())
- .setSoonActive(resultPacket.getSoonActiveDocs())
- .setDegradedReason(resultPacket.getDegradedReason())
- .setNodesTried(resultPacket.getNodesQueried()));
- }
- }
-
static class FillHitResult {
final boolean ok;
final String error;
@@ -451,19 +378,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher {
return new FillHitsResult(skippedHits, lastError);
}
- private void extractDocumentInfo(FastHit hit, DocumentInfo document, Sorting sorting) {
- hit.setSource(getName());
-
- Number rank = document.getMetric();
-
- hit.setRelevance(new Relevance(rank.doubleValue()));
-
- hit.setDistributionKey(document.getDistributionKey());
- hit.setGlobalId(document.getGlobalId());
- hit.setPartId(document.getPartId());
- hit.setSortData(document.getSortData(), sorting);
- }
-
protected DocsumDefinitionSet getDocsumDefinitionSet(Query query) {
DocumentDatabase db = getDocumentDatabase(query);
return db.getDocsumDefinitionSet();
@@ -483,46 +397,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher {
return error;
}
- /**
- * Creates unfilled hits from a List of DocumentInfo instances. Do note
- * cacheKey should be available if a cache is active, even if the hit is not
- * created from a cache in the current call path.
- *
- * @param queryPacketData binary data from first phase of search, or null
- * @param channelDistributionKey distribution key of the node producing these hits.
- * Only set if produced directly by a search node, not dispatch
- * (in which case it is not set in the received packets.)
- */
- void addUnfilledHits(Result result,
- List<DocumentInfo> documents,
- QueryPacketData queryPacketData,
- Optional<Integer> channelDistributionKey) {
- Query myQuery = result.getQuery();
- Sorting sorting = myQuery.getRanking().getSorting();
-
- for (DocumentInfo document : documents) {
-
- try {
- FastHit hit = new FastHit();
- hit.setQuery(myQuery);
- if (queryPacketData != null)
- hit.setQueryPacketData(queryPacketData);
-
- hit.setFillable();
- hit.setCached(false);
-
- extractDocumentInfo(hit, document, sorting);
- channelDistributionKey.ifPresent(hit::setDistributionKey);
-
- result.hits().add(hit);
- } catch (ConfigurationException e) {
- getLogger().log(LogLevel.WARNING, "Skipping hit", e);
- } catch (Exception e) {
- getLogger().log(LogLevel.ERROR, "Skipping malformed hit", e);
- }
- }
- }
-
@SuppressWarnings("rawtypes")
public static VespaBackEndSearcher getSearcher(String s) {
try {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java b/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java
index e44a86ddd2d..d7aec40bcf9 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java
@@ -48,18 +48,12 @@ public class PhraseItem extends CompositeIndexedItem {
}
}
- /**
- * Sets whether this was explicitly written as a phrase using quotes by the
- * user
- */
+ /** Sets whether this was explicitly written as a phrase using quotes by the user */
public void setExplicit(boolean explicit) {
this.explicit = explicit;
}
- /**
- * Returns whether this was explicitly written as a phrase using quotes by
- * the user Default is false
- */
+ /** Returns whether this was explicitly written as a phrase using quotes by the user Default is false */
public boolean isExplicit() {
return explicit;
}
@@ -74,8 +68,7 @@ public class PhraseItem extends CompositeIndexedItem {
* this phrase. If the item is a word, it will simply be added, if the item
* is a phrase, each of the words of the phrase will be added.
*
- * @throws IllegalArgumentException
- * if the given item is not a WordItem or PhraseItem
+ * @throws IllegalArgumentException if the given item is not a WordItem or PhraseItem
*/
public void addItem(Item item) {
if (item instanceof WordItem || item instanceof PhraseSegmentItem || item instanceof WordAlternativesItem) {
@@ -89,8 +82,7 @@ public class PhraseItem extends CompositeIndexedItem {
addIndexedItem((IndexedItem) i.next());
}
} else {
- throw new IllegalArgumentException("Can not add " + item
- + " to a phrase");
+ throw new IllegalArgumentException("Can not add " + item + " to a phrase");
}
}
@@ -107,8 +99,7 @@ public class PhraseItem extends CompositeIndexedItem {
addIndexedItem(index++, (WordItem) i.next());
}
} else {
- throw new IllegalArgumentException("Can not add " + item
- + " to a phrase");
+ throw new IllegalArgumentException("Can not add " + item + " to a phrase");
}
}
@@ -130,8 +121,7 @@ public class PhraseItem extends CompositeIndexedItem {
}
return toReturn;
} else {
- throw new IllegalArgumentException("Can not add " + item
- + " to a phrase");
+ throw new IllegalArgumentException("Can not add " + item + " to a phrase");
}
}
@@ -153,10 +143,8 @@ public class PhraseItem extends CompositeIndexedItem {
/**
* Returns a subitem as a word item
*
- * @param index
- * the (0-base) index of the item to return
- * @throws IndexOutOfBoundsException
- * if there is no subitem at index
+ * @param index the (0-base) index of the item to return
+ * @throws IndexOutOfBoundsException if there is no subitem at index
*/
public WordItem getWordItem(int index) {
return (WordItem) getItem(index);
@@ -197,9 +185,7 @@ public class PhraseItem extends CompositeIndexedItem {
return itemCount;
}
- /**
- * Returns false, no parenthezes for phrases
- */
+ /** Returns false, no parenthezes for phrases */
protected boolean shouldParenthize() {
return false;
}
@@ -263,4 +249,5 @@ public class PhraseItem extends CompositeIndexedItem {
super.disclose(discloser);
discloser.addProperty("explicit", explicit);
}
+
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java
index 5e994dac5d6..72ee4ae2c12 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java
@@ -13,7 +13,8 @@ import static com.yahoo.prelude.query.parser.Token.Kind.SPACE;
/**
* Parser for queries of type all.
*
- * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a>
+ * @author Steinar Knutsen
+ * @author bratseth
*/
public class AllParser extends SimpleParser {
@@ -32,37 +33,37 @@ public class AllParser extends SimpleParser {
protected Item parseItemsBody() {
// Algorithm: Collect positive, negative, and and'ed items, then combine.
- AndItem and=null;
- NotItem not=null; // Store negatives here as we go
+ AndItem and = null;
+ NotItem not = null; // Store negatives here as we go
Item current;
// Find all items
do {
- current=negativeItem();
- if (current!=null) {
- not=addNot(current,not);
+ current = negativeItem();
+ if (current != null) {
+ not = addNot(current, not);
continue;
}
- current=positiveItem();
- if (current==null)
+ current = positiveItem();
+ if (current == null)
current = indexableItem();
if (current == null)
current = compositeItem();
- if (current!=null)
- and=addAnd(current,and);
+ if (current != null)
+ and = addAnd(current, and);
if (current == null)
tokens.skip();
} while (tokens.hasNext());
// Combine the items
- Item topLevel=and;
+ Item topLevel = and;
- if (not!=null && topLevel!=null) {
+ if (not != null && topLevel != null) {
not.setPositiveItem(topLevel);
- topLevel=not;
+ topLevel = not;
}
return simplifyUnnecessaryComposites(topLevel);
@@ -78,23 +79,23 @@ public class AllParser extends SimpleParser {
return root.getRoot() instanceof NullItem ? null : root.getRoot();
}
- protected AndItem addAnd(Item item,AndItem and) {
- if (and==null)
- and=new AndItem();
+ protected AndItem addAnd(Item item, AndItem and) {
+ if (and == null)
+ and = new AndItem();
and.addItem(item);
return and;
}
protected OrItem addOr(Item item,OrItem or) {
- if (or==null)
- or=new OrItem();
+ if (or == null)
+ or = new OrItem();
or.addItem(item);
return or;
}
protected NotItem addNot(Item item,NotItem not) {
- if (not==null)
- not=new NotItem();
+ if (not == null)
+ not = new NotItem();
not.addNegativeItem(item);
return not;
}
@@ -103,8 +104,7 @@ public class AllParser extends SimpleParser {
int position = tokens.getPosition();
Item item = null;
try {
- if (!tokens.skipMultiple(MINUS)) return null;
-
+ if ( ! tokens.skip(MINUS)) return null;
if (tokens.currentIsNoIgnore(SPACE)) return null;
item = indexableItem();
@@ -122,8 +122,18 @@ public class AllParser extends SimpleParser {
}
}
}
- if (item!=null)
+ if (item != null)
item.setProtected(true);
+
+ // Heuristic overdrive engaged!
+ // Interpret -N as a positive item matching a negative number (by backtracking out of this)
+ // but not if there is an explicit index (such as -a:b)
+ // but interpret --N as a negative item matching a negative number
+ if ( item instanceof IntItem &&
+ ((IntItem)item).getIndexName().isEmpty() &&
+ ! ((IntItem)item).getNumber().startsWith(("-")))
+ item = null;
+
return item;
} finally {
if (item == null) {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java
index 291beb40b4c..9ddfea6dffb 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java
@@ -10,10 +10,10 @@ import static com.yahoo.prelude.query.parser.Token.Kind.PLUS;
import static com.yahoo.prelude.query.parser.Token.Kind.SPACE;
/**
- * Base class for parsers of the "simple" query languages (query types
- * ANY and ALL).
+ * Base class for parsers of the "simple" query languages (query types ANY and ALL).
*
* @author Steinar Knutsen
+ * @author bratseth
*/
abstract class SimpleParser extends StructuredParser {
@@ -25,7 +25,6 @@ abstract class SimpleParser extends StructuredParser {
return anyItems(false); // Nesteds are any even if all on top level
}
-
protected abstract Item negativeItem();
/**
@@ -163,11 +162,7 @@ abstract class SimpleParser extends StructuredParser {
return false;
}
-
- /**
- * Removes and returns the first <i>not</i> found in the composite,
- * or returns null if there's none
- */
+ /** Removes and returns the first <i>not</i> found in the composite, or returns null if there's none */
private NotItem removeNot(CompositeItem composite) {
for (int i = 0; i < composite.getItemCount(); i++) {
if (composite.getItem(i) instanceof NotItem) {
@@ -184,7 +179,7 @@ abstract class SimpleParser extends StructuredParser {
Item item = null;
try {
- if (!tokens.skipMultiple(PLUS)) {
+ if ( ! tokens.skipMultiple(PLUS)) {
return null;
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java
index ec1f79828c1..8ecd4d8f81c 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java
@@ -60,7 +60,7 @@ abstract class StructuredParser extends AbstractParser {
String indexName = indexPrefix();
setSubmodeFromIndex(indexName, indexFacts);
- item = number(indexName != null);
+ item = number();
if (item == null) {
item = phrase();
@@ -147,39 +147,36 @@ abstract class StructuredParser extends AbstractParser {
List<Token> firstWord = new ArrayList<>();
List<Token> secondWord = new ArrayList<>();
- tokens.skip(LSQUAREBRACKET); // For test 93 and 60
+ tokens.skip(LSQUAREBRACKET);
- if (!tokens.currentIs(WORD) && !tokens.currentIs(NUMBER)
- && !tokens.currentIs(UNDERSCORE)) {
+ if ( ! tokens.currentIs(WORD) && ! tokens.currentIs(NUMBER) && ! tokens.currentIs(UNDERSCORE)) {
return null;
}
firstWord.add(tokens.next());
while (tokens.currentIsNoIgnore(UNDERSCORE)
- || tokens.currentIsNoIgnore(WORD)
- || tokens.currentIsNoIgnore(NUMBER)) {
+ || tokens.currentIsNoIgnore(WORD)
+ || tokens.currentIsNoIgnore(NUMBER)) {
firstWord.add(tokens.next());
}
if (tokens.currentIsNoIgnore(DOT)) {
tokens.skip();
- if (tokens.currentIsNoIgnore(WORD)
- || tokens.currentIsNoIgnore(NUMBER)) {
+ if (tokens.currentIsNoIgnore(WORD) || tokens.currentIsNoIgnore(NUMBER)) {
secondWord.add(tokens.next());
} else {
return null;
}
while (tokens.currentIsNoIgnore(UNDERSCORE)
- || tokens.currentIsNoIgnore(WORD)
- || tokens.currentIsNoIgnore(NUMBER)) {
+ || tokens.currentIsNoIgnore(WORD)
+ || tokens.currentIsNoIgnore(NUMBER)) {
secondWord.add(tokens.next());
}
}
- if (!tokens.skipNoIgnore(COLON)) {
+ if ( ! tokens.skipNoIgnore(COLON))
return null;
- }
if (secondWord.size() == 0) {
item = concatenate(firstWord);
@@ -195,8 +192,7 @@ abstract class StructuredParser extends AbstractParser {
return null;
} else {
if (nothingAhead(false)) {
- // correct index syntax, correct name, but followed
- // by noise. Let's skip this.
+ // correct index syntax, correct name, but followed by noise. Let's skip this.
nothingAhead(true);
position = tokens.getPosition();
item = indexPrefix();
@@ -253,11 +249,11 @@ abstract class StructuredParser extends AbstractParser {
private boolean endOfNumber() {
return tokens.currentIsNoIgnore(SPACE)
- || tokens.currentIsNoIgnore(RSQUAREBRACKET)
- || tokens.currentIsNoIgnore(SEMICOLON)
- || tokens.currentIsNoIgnore(RBRACE)
- || tokens.currentIsNoIgnore(EOF)
- || tokens.currentIsNoIgnore(EXCLAMATION);
+ || tokens.currentIsNoIgnore(RSQUAREBRACKET)
+ || tokens.currentIsNoIgnore(SEMICOLON)
+ || tokens.currentIsNoIgnore(RBRACE)
+ || tokens.currentIsNoIgnore(EOF)
+ || tokens.currentIsNoIgnore(EXCLAMATION);
}
private String decimalPart() {
@@ -277,19 +273,19 @@ abstract class StructuredParser extends AbstractParser {
}
}
- private IntItem number(boolean hasIndex) {
+ private IntItem number() {
int position = tokens.getPosition();
IntItem item = null;
try {
- if (item == null) {
- item = numberRange();
- }
+ item = numberRange();
- tokens.skip(LSQUAREBRACKET); // For test 93 and 60
+ tokens.skip(LSQUAREBRACKET);
+ if (item == null)
+ tokens.skipNoIgnore(SPACE);
// TODO: Better definition of start and end of numeric items
- if (item == null && hasIndex && tokens.currentIsNoIgnore(MINUS) && (tokens.currentNoIgnore(1).kind == NUMBER)) {
+ if (item == null && tokens.currentIsNoIgnore(MINUS) && (tokens.currentNoIgnore(1).kind == NUMBER)) {
tokens.skipNoIgnore();
Token t = tokens.next();
item = new IntItem("-" + t.toString() + decimalPart(), true);
@@ -307,7 +303,7 @@ abstract class StructuredParser extends AbstractParser {
if (item == null) {
item = numberGreater();
}
- if (item != null && !endOfNumber()) {
+ if (item != null && ! endOfNumber()) {
item = null;
}
return item;
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java
index 42cef67f189..fbaf1675ff1 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java
@@ -1,10 +1,8 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.parser;
-
import java.util.List;
-
/**
* An iterator-like view of a list of tokens, but typed, random-accessible
* and with more convenience methods
@@ -183,8 +181,7 @@ final class TokenPosition {
/**
* Skips one or zero items of the given kind.
*
- * @return true if one item was skipped, false if none was,
- * or if there are no more tokens
+ * @return true if one item was skipped, false if none was, or if there are no more tokens
*/
public boolean skip(Token.Kind kind) {
Token current = current();
@@ -198,20 +195,16 @@ final class TokenPosition {
}
/**
- * Skips one or zero items of the given kind, without ignoring
- * spaces
+ * Skips one or zero items of the given kind, without ignoring spaces
*
- * @return true if one item was skipped, false if none was,
- * or if there are no more tokens
+ * @return true if one item was skipped, false if none was or if there are no more tokens
*/
public boolean skipNoIgnore(Token.Kind kind) {
Token current = currentNoIgnore();
- if (current == null || current.kind != kind) {
- return false;
- }
+ if (current == null || current.kind != kind) return false;
- skip();
+ skipNoIgnore();
return true;
}
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
index 033b507b4a4..76da9fbc1f7 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
@@ -168,10 +168,17 @@ public class ProtobufSerialization {
result.setTotalHitCount(protobuf.getTotalHitCount());
result.setCoverage(convertToCoverage(protobuf));
- if (protobuf.getGroupingBlob() != null && !protobuf.getGroupingBlob().isEmpty()) {
- ArrayList<Grouping> list = new ArrayList<>();
+ int hitItems = protobuf.getHitsCount();
+ var haveGrouping = protobuf.getGroupingBlob() != null && !protobuf.getGroupingBlob().isEmpty();
+ if(haveGrouping) {
+ hitItems++;
+ }
+ result.hits().ensureCapacity(hitItems);
+
+ if (haveGrouping) {
BufferSerializer buf = new BufferSerializer(new GrowableByteBuffer(protobuf.getGroupingBlob().asReadOnlyByteBuffer()));
int cnt = buf.getInt(null);
+ ArrayList<Grouping> list = new ArrayList<>(cnt);
for (int i = 0; i < cnt; i++) {
Grouping g = new Grouping();
g.deserialize(buf);
diff --git a/container-search/src/main/java/com/yahoo/search/query/SelectParser.java b/container-search/src/main/java/com/yahoo/search/query/SelectParser.java
index 18e4cdb35d6..ae1d82ef0fb 100644
--- a/container-search/src/main/java/com/yahoo/search/query/SelectParser.java
+++ b/container-search/src/main/java/com/yahoo/search/query/SelectParser.java
@@ -976,6 +976,7 @@ public class SelectParser implements Parser {
PhraseItem phrase = new PhraseItem();
phrase.setIndexName(field);
+ phrase.setExplicit(true);
HashMap<Integer, Inspector> children = childMap(value);
for (Inspector word : children.values()) {
diff --git a/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java b/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java
index 32c386f0e32..b3d79f65df4 100644
--- a/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java
+++ b/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java
@@ -15,8 +15,7 @@ public interface Parser {
* {@link QueryTree}. If parsing fails without an exception, the contained
* root will be an instance of {@link com.yahoo.prelude.query.NullItem}.
*
- * @param query
- * the Parsable to parse
+ * @param query the Parsable to parse
* @return the parsed QueryTree, never null
*/
QueryTree parse(Parsable query);
diff --git a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java
index 8755d0b0897..9ecd6513a94 100644
--- a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java
+++ b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java
@@ -191,6 +191,10 @@ public class HitGroup extends Hit implements DataList<Hit>, Cloneable, Iterable<
return hits.size();
}
+ public void ensureCapacity(int minCapacity) {
+ hits.ensureCapacity(minCapacity);
+ }
+
/**
* <p>Returns the number of concrete hits contained in this group
* and all subgroups. This should equal the
diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java b/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java
index 6a56f94c724..5427da6c06c 100644
--- a/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java
+++ b/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java
@@ -481,7 +481,7 @@ public class Execution extends com.yahoo.processing.execution.Execution {
* if searchChain is null
*/
@SuppressWarnings("unchecked")
- private Execution(Chain<? extends Processor> searchChain,Context context, int searcherIndex) {
+ private Execution(Chain<? extends Processor> searchChain, Context context, int searcherIndex) {
// Create a new Execution which is placed in the context of the execution of the given Context if any
// "if any" because a context may, or may not, belong to an execution.
// This is decided at the creation time of the Context - Context instances which do not belong
diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
index af095fefc1c..45fdc4653c4 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
@@ -539,6 +539,7 @@ public class YqlParser implements Parser {
PhraseItem phrase = new PhraseItem();
phrase.setIndexName(field);
+ phrase.setExplicit(true);
for (OperatorNode<ExpressionOperator> word : ast.<List<OperatorNode<ExpressionOperator>>> getArgument(1)) {
if (word.getOperator() == ExpressionOperator.CALL) {
List<String> names = word.getArgument(0);
@@ -712,7 +713,7 @@ public class YqlParser implements Parser {
.setLanguage(language)
.setDefaultIndexName(defaultIndex)).getRoot();
// the null check should be unnecessary, but is there to avoid having to suppress null warnings
- if ( !allowNullItem && (item == null || item instanceof NullItem))
+ if ( ! allowNullItem && (item == null || item instanceof NullItem))
throw new IllegalArgumentException("Parsing '" + wordData + "' only resulted in NullItem.");
if (language != Language.ENGLISH) // mark the language used, unless it's the default
diff --git a/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java
index 12f9ef2b18f..dc2f990431a 100644
--- a/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java
@@ -1957,7 +1957,12 @@ public class ParseTestCase {
@Test
public void testNumbersAndNot() {
- tester.assertParsed("+a -12", "a -12", Query.Type.ALL);
+ tester.assertParsed("AND a -12", "a -12", Query.Type.ALL);
+ }
+
+ @Test
+ public void testNumbersAndDoubleNot() {
+ tester.assertParsed("+a --12", "a --12", Query.Type.ALL);
}
@Test
@@ -1966,8 +1971,18 @@ public class ParseTestCase {
}
@Test
+ public void testNegativeTermPositiveNumberWithIndex() {
+ tester.assertParsed("+a -normal:12", "a -normal:12", Query.Type.ALL);
+ }
+
+ @Test
+ public void testNegativeTermNegativeNumberWithIndex() {
+ tester.assertParsed("+a -normal:-12", "a -normal:-12", Query.Type.ALL);
+ }
+
+ @Test
public void testSingleNegativeNumberLikeTerm() {
- tester.assertParsed(null, "-12", Query.Type.ALL);
+ tester.assertParsed("-12", "-12", Query.Type.ALL);
}
@Test
@@ -2004,7 +2019,12 @@ public class ParseTestCase {
@Test
public void testDecimalNumbersAndNot() {
- tester.assertParsed("+a -12.2", "a -12.2", Query.Type.ALL);
+ tester.assertParsed("AND a -12.2", "a -12.2", Query.Type.ALL);
+ }
+
+ @Test
+ public void testDecimalNumbersAndDoubleNot() {
+ tester.assertParsed("+a --12.2", "a --12.2", Query.Type.ALL);
}
@Test
@@ -2014,7 +2034,7 @@ public class ParseTestCase {
@Test
public void testSingleNegativeDecimalNumberLikeTerm() {
- tester.assertParsed(null, "-12.2", Query.Type.ALL);
+ tester.assertParsed("-12.2", "-12.2", Query.Type.ALL);
}
@Test
@@ -2321,12 +2341,12 @@ public class ParseTestCase {
@Test
public void testSingleNegativeNumberLikeTermWeb() {
- tester.assertParsed(null, "-12", Query.Type.WEB);
+ tester.assertParsed("-12", "-12", Query.Type.WEB);
}
@Test
public void testSingleNegativeDecimalNumberLikeTermWeb() {
- tester.assertParsed(null, "-12.2", Query.Type.WEB);
+ tester.assertParsed("-12.2", "-12.2", Query.Type.WEB);
}
@Test
diff --git a/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java
index b5c4166e4de..6173d710434 100644
--- a/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java
@@ -118,6 +118,17 @@ public class UserInputTestCase {
}
@Test
+ public void testNegativeNumberComparison() {
+ URIBuilder builder = searchUri();
+ builder.setParameter("myinput", "-5");
+ builder.setParameter("yql",
+ "select * from ecitem where rank(([{\"defaultIndex\":\"myfield\"}](userInput(@myinput))));");
+ Query query = searchAndAssertNoErrors(builder);
+ assertEquals("select * from ecitem where rank(myfield = (-5));", query.yqlRepresentation());
+ assertEquals("RANK myfield:-5", query.getModel().getQueryTree().getRoot().toString());
+ }
+
+ @Test
public void testAnnotatedUserInputUnrankedTerms() {
URIBuilder builder = searchUri();
builder.setParameter("yql",
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java
new file mode 100644
index 00000000000..2503325760d
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java
@@ -0,0 +1,9 @@
+package com.yahoo.vespa.hosted.controller.api.integration.certificates;
+
+import java.security.KeyPair;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+public interface CertificateProvider {
+ List<X509Certificate> requestCaSignedCertificate(KeyPair keyPair, List<String> domains);
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java
index 63faadfe555..dfed0476aab 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java
@@ -24,18 +24,18 @@ public class MemoryNameService implements NameService {
@Override
public Record createCname(RecordName name, RecordData canonicalName) {
- Record record = new Record(Record.Type.CNAME, name, canonicalName);
+ var record = new Record(Record.Type.CNAME, name, canonicalName);
records.add(record);
return record;
}
@Override
public List<Record> createAlias(RecordName name, Set<AliasTarget> targets) {
- List<Record> records = targets.stream()
- .sorted((a, b) -> Comparator.comparing(AliasTarget::name).compare(a, b))
- .map(target -> new Record(Record.Type.ALIAS, name,
- RecordData.fqdn(target.name().value())))
- .collect(Collectors.toList());
+ var records = targets.stream()
+ .sorted((a, b) -> Comparator.comparing(AliasTarget::name).compare(a, b))
+ .map(target -> new Record(Record.Type.ALIAS, name,
+ RecordData.fqdn(target.name().value())))
+ .collect(Collectors.toList());
// Satisfy idempotency contract of interface
removeRecords(findRecords(Record.Type.ALIAS, name));
this.records.addAll(records);
@@ -43,10 +43,12 @@ public class MemoryNameService implements NameService {
}
@Override
- public Record createTxt(RecordName name, RecordData txtData) {
- Record record = new Record(Record.Type.TXT, name, txtData);
- records.add(record);
- return record;
+ public List<Record> createTxtRecords(RecordName name, List<RecordData> txtData) {
+ var records = txtData.stream()
+ .map(data -> new Record(Record.Type.TXT, name, data))
+ .collect(Collectors.toList());
+ this.records.addAll(records);
+ return records;
}
@Override
@@ -65,7 +67,7 @@ public class MemoryNameService implements NameService {
@Override
public void updateRecord(Record record, RecordData newData) {
- List<Record> records = findRecords(record.type(), record.name());
+ var records = findRecords(record.type(), record.name());
if (records.isEmpty()) {
throw new IllegalArgumentException("No record with data '" + newData.asString() + "' exists");
}
@@ -73,7 +75,7 @@ public class MemoryNameService implements NameService {
throw new IllegalArgumentException("Cannot update multi-value record '" + record.name().asString() +
"' with '" + newData.asString() + "'");
}
- Record existing = records.get(0);
+ var existing = records.get(0);
this.records.remove(existing);
this.records.add(new Record(existing.type(), existing.name(), newData));
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java
index 1bac0f6cfc1..903ea250935 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java
@@ -32,10 +32,10 @@ public interface NameService {
/**
* Create a new TXT record containing the provided data.
* @param name Name of the created record
- * @param txtData TXT data for the record, consisting of one or more space-separated <em>double-quoted</em> strings: "string1" "string2"
- * @return The created record
+ * @param txtRecords TXT data values for the record, each consisting of one or more space-separated <em>double-quoted</em> strings: "string1" "string2"
+ * @return The created records
*/
- Record createTxt(RecordName name, RecordData txtData);
+ List<Record> createTxtRecords(RecordName name, List<RecordData> txtRecords);
/** Find all records matching given type and name */
List<Record> findRecords(Record.Type type, RecordName name);
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
index e6aa8bc51b5..a8130d60cc5 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
@@ -98,7 +98,7 @@ public class DeploymentTrigger {
report.jobType(),
report.applicationId(),
report.projectId()));
- if ( ! applications().get(report.applicationId()).isPresent()) {
+ if (applications().get(report.applicationId()).isEmpty()) {
log.log(LogLevel.WARNING, "Ignoring completion of job of project '" + report.projectId() +
"': Unknown application '" + report.applicationId() + "'");
return;
@@ -285,7 +285,7 @@ public class DeploymentTrigger {
}
private static <T extends Comparable<T>> Optional<T> max(Optional<T> o1, Optional<T> o2) {
- return ! o1.isPresent() ? o2 : ! o2.isPresent() ? o1 : o1.get().compareTo(o2.get()) >= 0 ? o1 : o2;
+ return o1.isEmpty() ? o2 : o2.isEmpty() ? o1 : o1.get().compareTo(o2.get()) >= 0 ? o1 : o2;
}
// ---------- Ready job computation ----------
@@ -396,11 +396,11 @@ public class DeploymentTrigger {
/** Returns whether the given job can trigger at the given instant */
public boolean triggerAt(Instant instant, JobType job, Versions versions, Application application) {
Optional<JobStatus> jobStatus = application.deploymentJobs().statusOf(job);
- if ( ! jobStatus.isPresent()) return true;
+ if (jobStatus.isEmpty()) return true;
if (jobStatus.get().pausedUntil().isPresent() && jobStatus.get().pausedUntil().getAsLong() > clock.instant().toEpochMilli()) return false;
if (jobStatus.get().isSuccess()) return true; // Success
- if ( ! jobStatus.get().lastCompleted().isPresent()) return true; // Never completed
- if ( ! jobStatus.get().firstFailing().isPresent()) return true; // Should not happen as firstFailing should be set for an unsuccessful job
+ if (jobStatus.get().lastCompleted().isEmpty()) return true; // Never completed
+ if (jobStatus.get().firstFailing().isEmpty()) return true; // Should not happen as firstFailing should be set for an unsuccessful job
if ( ! versions.targetsMatch(jobStatus.get().lastCompleted().get())) return true; // Always trigger as targets have changed
if (application.deploymentSpec().upgradePolicy() == DeploymentSpec.UpgradePolicy.canary) return true; // Don't throttle canaries
@@ -516,7 +516,7 @@ public class DeploymentTrigger {
if ( ! application.deploymentSpec().canChangeRevisionAt(clock.instant())) return false;
if (application.change().application().isPresent()) return true; // Replacing a previous application change is ok.
if (application.deploymentJobs().hasFailures()) return true; // Allow changes to fix upgrade problems.
- return ! application.change().platform().isPresent();
+ return application.change().platform().isEmpty();
}
private Change remainingChange(Application application) {
@@ -552,7 +552,7 @@ public class DeploymentTrigger {
for (JobType jobType : steps(application.deploymentSpec()).testJobs()) {
Optional<JobRun> completion = successOn(application, jobType, versions)
.filter(run -> versions.sourcesMatchIfPresent(run) || jobType == systemTest);
- if ( ! completion.isPresent() && condition.test(jobType))
+ if (completion.isEmpty() && condition.test(jobType))
jobs.add(deploymentJob(application, versions, application.change(), jobType, reason, availableSince));
}
return jobs;
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
index 5bff581c4ce..34e04d966a3 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
@@ -237,7 +237,7 @@ public class JobController {
if ( ! application.get().deploymentJobs().deployedInternally()) {
// TODO jvenstad: Remove when there are no more SDv3 pipelines.
// Copy all current packages to the new application store
- application.get().deployments().values().stream()
+ application.get().productionDeployments().values().stream()
.map(Deployment::applicationVersion)
.distinct()
.forEach(appVersion -> {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java
index 9133c8980ec..cd3341ed3a6 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java
@@ -1,16 +1,12 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.maintenance;
-import com.yahoo.config.provision.Environment;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.Controller;
-import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.yolean.Exceptions;
-import java.time.Clock;
import java.time.Duration;
-import java.time.Instant;
import java.util.logging.Level;
/**
@@ -21,41 +17,32 @@ import java.util.logging.Level;
*/
public class DeploymentExpirer extends Maintainer {
- private final Clock clock;
-
public DeploymentExpirer(Controller controller, Duration interval, JobControl jobControl) {
- this(controller, interval, Clock.systemUTC(), jobControl);
- }
-
- public DeploymentExpirer(Controller controller, Duration interval, Clock clock, JobControl jobControl) {
super(controller, interval, jobControl);
- this.clock = clock;
}
@Override
protected void maintain() {
for (Application application : controller().applications().asList()) {
for (Deployment deployment : application.deployments().values()) {
- if (deployment.zone().environment().equals(Environment.prod)) {
- continue;
- }
-
- if (hasExpired(controller().zoneRegistry(), deployment, clock.instant())) {
- try {
- controller().applications().deactivate(application.id(), deployment.zone());
- } catch (Exception e) {
- log.log(Level.WARNING, "Could not expire " + deployment + " of " + application +
- ": " + Exceptions.toMessageString(e) + ". Retrying in " +
- maintenanceInterval());
- }
+ if (!isExpired(deployment)) continue;
+
+ try {
+ controller().applications().deactivate(application.id(), deployment.zone());
+ } catch (Exception e) {
+ log.log(Level.WARNING, "Could not expire " + deployment + " of " + application +
+ ": " + Exceptions.toMessageString(e) + ". Retrying in " +
+ maintenanceInterval());
}
}
}
}
- private static boolean hasExpired(ZoneRegistry zoneRegistry, Deployment deployment, Instant now) {
- return zoneRegistry.getDeploymentTimeToLive(deployment.zone())
- .map(timeToLive -> deployment.at().plus(timeToLive).isBefore(now))
+ /** Returns whether given deployment has expired according to its TTL */
+ private boolean isExpired(Deployment deployment) {
+ if (deployment.zone().environment().isProduction()) return false; // Never expire production deployments
+ return controller().zoneRegistry().getDeploymentTimeToLive(deployment.zone())
+ .map(timeToLive -> deployment.at().plus(timeToLive).isBefore(controller().clock().instant()))
.orElse(false);
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
index 47ae8566ab8..3c2cbade606 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
@@ -47,7 +47,7 @@ import java.util.OptionalLong;
import java.util.TreeMap;
/**
- * Serializes applications to/from slime.
+ * Serializes {@link Application} to/from slime.
* This class is multithread safe.
*
* @author bratseth
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java
index 93dd59e577f..36583f4320e 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java
@@ -14,7 +14,7 @@ import java.util.Optional;
import java.util.function.Function;
/**
- * Slime serializer for the audit log.
+ * Slime serializer for {@link AuditLog}.
*
* @author mpolden
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java
index c56d8b3849c..a87875da104 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java
@@ -1,7 +1,6 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.persistence;
-
import com.yahoo.component.Version;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.ObjectTraverser;
@@ -13,7 +12,7 @@ import java.util.LinkedHashMap;
import java.util.Map;
/**
- * Serializes overrides of version confidence.
+ * Serializer for {@link Confidence} overrides.
*
* @author mpolden
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java
index 36736f7f398..40781ac6e92 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java
@@ -21,7 +21,7 @@ import java.util.Map;
import java.util.stream.Collectors;
/**
- * Serialisation of LogRecord objects. Not all fields are stored!
+ * Serialisation of {@link LogEntry} objects. Not all fields are stored!
*
* @author jonmv
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java
index d996b79fe18..21f8b1bcb80 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java
@@ -14,7 +14,7 @@ import java.util.Set;
import java.util.TreeSet;
/**
- * Serializer for an OS version.
+ * Serializer for an {@link OsVersion}.
*
* @author mpolden
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java
index b0557863426..3e3c0df1673 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java
@@ -20,7 +20,7 @@ import java.util.Objects;
import java.util.TreeMap;
/**
- * Serializer for OS version status.
+ * Serializer for {@link OsVersionStatus}.
*
* @author mpolden
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java
index be464f95385..ce757e015b8 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java
@@ -50,7 +50,7 @@ import static com.yahoo.vespa.hosted.controller.deployment.Step.endTests;
import static java.util.Comparator.comparing;
/**
- * Serialises and deserialises RunStatus objects for persistent storage.
+ * Serialises and deserialises {@link Run} objects for persistent storage.
*
* @author jonmv
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java
index 2a685914408..56e80068908 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java
@@ -23,7 +23,7 @@ import java.util.List;
import java.util.Optional;
/**
- * Slime serialization of tenants.
+ * Slime serialization of {@link Tenant} sub-types.
*
* @author mpolden
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java
index 78045a15e9c..5edae803fdb 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java
@@ -7,7 +7,7 @@ import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
/**
- * Serializer for version numbers.
+ * Serializer for {@link Version}.
*
* @author mpolden
*/
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
index 11f0bfcfa0f..72d38bbee5f 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
@@ -21,7 +21,7 @@ import java.util.List;
import java.util.Set;
/**
- * Serializes VersionStatus to and from slime
+ * Serializer for {@link VersionStatus}.
*
* @author mpolden
*/
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java
index f642f3210b7..730b2943431 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java
@@ -3,14 +3,13 @@ package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.RegionName;
-import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.config.provision.zone.ZoneId;
+import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester;
import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb;
-import org.junit.Before;
import org.junit.Test;
import java.time.Duration;
@@ -24,12 +23,7 @@ import static org.junit.Assert.assertEquals;
*/
public class DeploymentExpirerTest {
- private DeploymentTester tester;
-
- @Before
- public void before() {
- tester = new DeploymentTester();
- }
+ private final DeploymentTester tester = new DeploymentTester();
@Test
public void testDeploymentExpiry() {
@@ -38,7 +32,7 @@ public class DeploymentExpirerTest {
Duration.ofDays(14)
);
DeploymentExpirer expirer = new DeploymentExpirer(tester.controller(), Duration.ofDays(10),
- tester.clock(), new JobControl(new MockCuratorDb()));
+ new JobControl(new MockCuratorDb()));
Application devApp = tester.createApplication("app1", "tenant1", 123L, 1L);
Application prodApp = tester.createApplication("app2", "tenant2", 456L, 2L);
diff --git a/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java b/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java
index 1b5681e7146..be4aa6cfb41 100644
--- a/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java
+++ b/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java
@@ -9,8 +9,11 @@ import com.yahoo.document.DocumentPut;
import com.yahoo.document.DocumentRemove;
import com.yahoo.document.DocumentTypeManager;
import com.yahoo.document.DocumentUpdate;
+import com.yahoo.vespaxmlparser.DocumentFeedOperation;
+import com.yahoo.vespaxmlparser.DocumentUpdateFeedOperation;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.FeedReader;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation;
+import com.yahoo.vespaxmlparser.RemoveFeedOperation;
/**
@@ -34,26 +37,23 @@ public class JsonFeedReader implements FeedReader {
}
@Override
- public void read(Operation operation) throws Exception {
+ public FeedOperation read() throws Exception {
DocumentOperation documentOperation = reader.next();
if (documentOperation == null) {
stream.close();
- operation.setInvalid();
- return;
+ return FeedOperation.INVALID;
}
if (documentOperation instanceof DocumentUpdate) {
- operation.setDocumentUpdate((DocumentUpdate) documentOperation);
+ return new DocumentUpdateFeedOperation((DocumentUpdate) documentOperation, documentOperation.getCondition());
} else if (documentOperation instanceof DocumentRemove) {
- operation.setRemove(documentOperation.getId());
+ return new RemoveFeedOperation(documentOperation.getId(), documentOperation.getCondition());
} else if (documentOperation instanceof DocumentPut) {
- operation.setDocument(((DocumentPut) documentOperation).getDocument());
+ return new DocumentFeedOperation(((DocumentPut) documentOperation).getDocument(), documentOperation.getCondition());
} else {
throw new IllegalStateException("Got unknown class from JSON reader: " + documentOperation.getClass().getName());
}
-
- operation.setCondition(documentOperation.getCondition());
}
}
diff --git a/document/src/main/java/com/yahoo/document/json/JsonWriter.java b/document/src/main/java/com/yahoo/document/json/JsonWriter.java
index ab0884a54a3..d7944246ff2 100644
--- a/document/src/main/java/com/yahoo/document/json/JsonWriter.java
+++ b/document/src/main/java/com/yahoo/document/json/JsonWriter.java
@@ -38,7 +38,33 @@ import java.nio.ByteBuffer;
import java.util.Iterator;
import java.util.Map;
-import static com.yahoo.document.json.JsonSerializationHelper.*;
+import static com.yahoo.document.json.JsonSerializationHelper.fieldNameIfNotNull;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeArrayField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeBoolField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeByte;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeByteArray;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeByteBuffer;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeByteField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeCollectionField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeDouble;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeDoubleField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeFloat;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeFloatField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeInt;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeIntField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeLong;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeLongField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeMapField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializePredicateField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeRawField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeReferenceField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeShort;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeString;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeStringField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeStructField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeStructuredField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeTensorField;
+import static com.yahoo.document.json.JsonSerializationHelper.serializeWeightedSet;
import static com.yahoo.document.json.document.DocumentParser.FIELDS;
import static com.yahoo.document.json.document.DocumentParser.REMOVE;
diff --git a/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java b/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java
index 8012ebafb13..28aa9ed1d8d 100644
--- a/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java
+++ b/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java
@@ -7,7 +7,9 @@ import com.yahoo.document.DocumentPut;
import com.yahoo.document.DocumentTypeManager;
import com.yahoo.document.DocumentUpdate;
import com.yahoo.document.json.document.DocumentParser;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
+import com.yahoo.vespaxmlparser.DocumentFeedOperation;
+import com.yahoo.vespaxmlparser.DocumentUpdateFeedOperation;
+import com.yahoo.vespaxmlparser.FeedOperation;
import java.io.IOException;
import java.io.InputStream;
@@ -25,32 +27,26 @@ public class SingleDocumentParser {
this.docMan = docMan;
}
- public VespaXMLFeedReader.Operation parsePut(InputStream inputStream, String docId) {
+ public FeedOperation parsePut(InputStream inputStream, String docId) {
return parse(inputStream, docId, DocumentParser.SupportedOperation.PUT);
}
- public VespaXMLFeedReader.Operation parseUpdate(InputStream inputStream, String docId) {
+ public FeedOperation parseUpdate(InputStream inputStream, String docId) {
return parse(inputStream, docId, DocumentParser.SupportedOperation.UPDATE);
}
- private VespaXMLFeedReader.Operation parse(InputStream inputStream, String docId, DocumentParser.SupportedOperation supportedOperation) {
+ private FeedOperation parse(InputStream inputStream, String docId, DocumentParser.SupportedOperation supportedOperation) {
final JsonReader reader = new JsonReader(docMan, inputStream, jsonFactory);
final DocumentOperation documentOperation = reader.readSingleDocument(supportedOperation, docId);
- VespaXMLFeedReader.Operation operation = new VespaXMLFeedReader.Operation();
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
if (supportedOperation == DocumentParser.SupportedOperation.PUT) {
- operation.setDocument(((DocumentPut) documentOperation).getDocument());
+ return new DocumentFeedOperation(((DocumentPut) documentOperation).getDocument(), documentOperation.getCondition());
} else {
- operation.setDocumentUpdate((DocumentUpdate) documentOperation);
+ return new DocumentUpdateFeedOperation((DocumentUpdate) documentOperation, documentOperation.getCondition());
}
-
- // (A potentially empty) test-and-set condition is always set by JsonReader
- operation.setCondition(documentOperation.getCondition());
-
- return operation;
}
}
diff --git a/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java b/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java
index 582a6b0bd92..afdce012b0f 100644
--- a/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java
+++ b/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java
@@ -15,7 +15,7 @@ public interface DocumentDeserializer extends DocumentReader, DocumentUpdateRead
/**
* Returns the underlying buffer used for de-serialization.
*/
- public GrowableByteBuffer getBuf();
+ GrowableByteBuffer getBuf();
}
diff --git a/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java b/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java
index 4b87edeeded..d95a344be77 100644
--- a/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java
+++ b/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java
@@ -21,15 +21,15 @@ import com.yahoo.document.update.TensorRemoveUpdate;
* @since 5.1.27
*/
public interface DocumentUpdateWriter {
- public void write(DocumentUpdate update);
- public void write(FieldUpdate update);
- public void write(AddValueUpdate update, DataType superType);
- public void write(MapValueUpdate update, DataType superType);
- public void write(ArithmeticValueUpdate update);
- public void write(AssignValueUpdate update, DataType superType);
- public void write(RemoveValueUpdate update, DataType superType);
- public void write(ClearValueUpdate clearValueUpdate, DataType superType);
- public void write(TensorModifyUpdate update);
- public void write(TensorAddUpdate update);
- public void write(TensorRemoveUpdate update);
+ void write(DocumentUpdate update);
+ void write(FieldUpdate update);
+ void write(AddValueUpdate update, DataType superType);
+ void write(MapValueUpdate update, DataType superType);
+ void write(ArithmeticValueUpdate update);
+ void write(AssignValueUpdate update, DataType superType);
+ void write(RemoveValueUpdate update, DataType superType);
+ void write(ClearValueUpdate clearValueUpdate, DataType superType);
+ void write(TensorModifyUpdate update);
+ void write(TensorAddUpdate update);
+ void write(TensorRemoveUpdate update);
}
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java
new file mode 100644
index 00000000000..e7a06560532
--- /dev/null
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java
@@ -0,0 +1,21 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespaxmlparser;
+
+import com.yahoo.document.TestAndSetCondition;
+
+public class ConditionalFeedOperation extends FeedOperation {
+ private final TestAndSetCondition condition;
+ protected ConditionalFeedOperation(Type type) {
+ super(type);
+ this.condition = TestAndSetCondition.NOT_PRESENT_CONDITION;
+ }
+ protected ConditionalFeedOperation(Type type, TestAndSetCondition condition) {
+ super(type);
+ this.condition = condition;
+ }
+
+ @Override
+ public TestAndSetCondition getCondition() {
+ return condition;
+ }
+}
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java
new file mode 100644
index 00000000000..f3ddbc9196c
--- /dev/null
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java
@@ -0,0 +1,23 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespaxmlparser;
+
+import com.yahoo.document.Document;
+import com.yahoo.document.TestAndSetCondition;
+
+public class DocumentFeedOperation extends ConditionalFeedOperation {
+ private final Document document;
+ public DocumentFeedOperation(Document document) {
+ super(Type.DOCUMENT);
+ this.document = document;
+ }
+
+ public DocumentFeedOperation(Document document, TestAndSetCondition condition) {
+ super(Type.DOCUMENT, condition);
+ this.document = document;
+ }
+
+ @Override
+ public Document getDocument() {
+ return document;
+ }
+}
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java
new file mode 100644
index 00000000000..af20d72a4e2
--- /dev/null
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java
@@ -0,0 +1,22 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespaxmlparser;
+
+import com.yahoo.document.DocumentUpdate;
+import com.yahoo.document.TestAndSetCondition;
+
+public class DocumentUpdateFeedOperation extends ConditionalFeedOperation {
+ private final DocumentUpdate update;
+ public DocumentUpdateFeedOperation(DocumentUpdate update) {
+ super(Type.UPDATE);
+ this.update = update;
+ }
+ public DocumentUpdateFeedOperation(DocumentUpdate update, TestAndSetCondition condition) {
+ super(Type.UPDATE, condition);
+ this.update = update;
+ }
+
+ @Override
+ public DocumentUpdate getDocumentUpdate() {
+ return update;
+ }
+}
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java
new file mode 100644
index 00000000000..9da3408da61
--- /dev/null
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java
@@ -0,0 +1,39 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespaxmlparser;
+
+import com.yahoo.document.Document;
+import com.yahoo.document.DocumentId;
+import com.yahoo.document.DocumentUpdate;
+import com.yahoo.document.TestAndSetCondition;
+
+public class FeedOperation {
+ public enum Type {DOCUMENT, REMOVE, UPDATE, INVALID}
+ public static final FeedOperation INVALID = new FeedOperation(Type.INVALID);
+
+ private Type type;
+ protected FeedOperation(Type type) {
+ this.type = type;
+ }
+ public final Type getType() { return type; }
+ protected final void setType(Type type) {
+ this.type = type;
+ }
+
+ public Document getDocument() { return null; }
+ public DocumentUpdate getDocumentUpdate() { return null; }
+ public DocumentId getRemove() { return null; }
+
+ public TestAndSetCondition getCondition() {
+ return TestAndSetCondition.NOT_PRESENT_CONDITION;
+ }
+ @Override
+ public String toString() {
+ return "Operation{" +
+ "type=" + getType() +
+ ", doc=" + getDocument() +
+ ", remove=" + getRemove() +
+ ", docUpdate=" + getDocumentUpdate() +
+ " testandset=" + getCondition() +
+ '}';
+ }
+} \ No newline at end of file
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java b/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java
index 2c130cae782..c993d5a5153 100644
--- a/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java
@@ -1,8 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespaxmlparser;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation;
-
/**
* Minimal interface for reading operations from a stream for a feeder.
*
@@ -14,8 +12,7 @@ public interface FeedReader {
/**
* Reads the next operation from the stream.
- * @param operation The operation to fill in. Operation is unchanged if none was found.
+ * @return operation, possibly invalid if none was found.
*/
- void read(Operation operation) throws Exception;
-
+ FeedOperation read() throws Exception;
}
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java
new file mode 100644
index 00000000000..782a6295ee1
--- /dev/null
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java
@@ -0,0 +1,22 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespaxmlparser;
+
+import com.yahoo.document.DocumentId;
+import com.yahoo.document.TestAndSetCondition;
+
+public class RemoveFeedOperation extends ConditionalFeedOperation {
+ private final DocumentId documentId;
+ public RemoveFeedOperation(DocumentId documentId) {
+ super(Type.REMOVE);
+ this.documentId = documentId;
+ }
+ public RemoveFeedOperation(DocumentId documentId, TestAndSetCondition condition) {
+ super(Type.REMOVE, condition);
+ this.documentId = documentId;
+ }
+
+ @Override
+ public DocumentId getRemove() {
+ return documentId;
+ }
+}
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java
index e0213b4c88d..7bc0cc871ca 100644
--- a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java
+++ b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java
@@ -74,89 +74,6 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader {
}
}
- public enum OperationType {
- DOCUMENT,
- REMOVE,
- UPDATE,
- INVALID
- }
-
- /**
- * Represents a feed operation found by the parser. Can be one of the following types:
- * - getType() == DOCUMENT: getDocument() is valid.
- * - getType() == REMOVE: getRemove() is valid.
- * - getType() == UPDATE: getUpdate() is valid.
- */
- public static class Operation {
-
- private OperationType type;
- private Document doc;
- private DocumentId remove;
- private DocumentUpdate docUpdate;
- private TestAndSetCondition condition;
-
- public Operation() {
- setInvalid();
- }
-
- public void setInvalid() {
- type = OperationType.INVALID;
- doc = null;
- remove = null;
- docUpdate = null;
- condition = null;
- }
-
- public OperationType getType() {
- return type;
- }
-
- public Document getDocument() {
- return doc;
- }
-
- public void setDocument(Document doc) {
- this.type = OperationType.DOCUMENT;
- this.doc = doc;
- }
-
- public DocumentId getRemove() {
- return remove;
- }
-
- public void setRemove(DocumentId remove) {
- this.type = OperationType.REMOVE;
- this.remove = remove;
- }
-
- public DocumentUpdate getDocumentUpdate() {
- return docUpdate;
- }
-
- public void setDocumentUpdate(DocumentUpdate docUpdate) {
- this.type = OperationType.UPDATE;
- this.docUpdate = docUpdate;
- }
-
- public void setCondition(TestAndSetCondition condition) {
- this.condition = condition;
- }
-
- public TestAndSetCondition getCondition() {
- return condition;
- }
-
- @Override
- public String toString() {
- return "Operation{" +
- "type=" + type +
- ", doc=" + doc +
- ", remove=" + remove +
- ", docUpdate=" + docUpdate +
- '}';
- }
- }
-
/**
* <p>Reads all operations from the XML stream and puts into a list. Note
* that if the XML stream is large, this may cause out of memory errors, so
@@ -164,12 +81,11 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader {
*
* @return The list of all read operations.
*/
- public List<Operation> readAll() throws Exception {
- List<Operation> list = new ArrayList<>();
+ public List<FeedOperation> readAll() throws Exception {
+ List<FeedOperation> list = new ArrayList<>();
while (true) {
- Operation op = new Operation();
- read(op);
- if (op.getType() == OperationType.INVALID) {
+ FeedOperation op = read();
+ if (op.getType() == FeedOperation.Type.INVALID) {
return list;
} else {
list.add(op);
@@ -181,10 +97,8 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader {
* @see com.yahoo.vespaxmlparser.FeedReader#read(com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation)
*/
@Override
- public void read(Operation operation) throws Exception {
+ public FeedOperation read() throws Exception {
String startTag = null;
- operation.setInvalid();
-
try {
while (reader.hasNext()) {
int type = reader.next();
@@ -195,36 +109,28 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader {
if ("document".equals(startTag)) {
VespaXMLDocumentReader documentReader = new VespaXMLDocumentReader(reader, docTypeManager);
Document document = new Document(documentReader);
- operation.setDocument(document);
- operation.setCondition(TestAndSetCondition.fromConditionString(documentReader.getCondition()));
- return;
+ return new DocumentFeedOperation(document, TestAndSetCondition.fromConditionString(documentReader.getCondition()));
} else if ("update".equals(startTag)) {
VespaXMLUpdateReader updateReader = new VespaXMLUpdateReader(reader, docTypeManager);
DocumentUpdate update = new DocumentUpdate(updateReader);
- operation.setDocumentUpdate(update);
- operation.setCondition(TestAndSetCondition.fromConditionString(updateReader.getCondition()));
- return;
+ return new DocumentUpdateFeedOperation(update, TestAndSetCondition.fromConditionString(updateReader.getCondition()));
} else if ("remove".equals(startTag)) {
- boolean documentIdFound = false;
+ DocumentId documentId = null;
Optional<String> condition = Optional.empty();
for (int i = 0; i < reader.getAttributeCount(); i++) {
final String attributeName = reader.getAttributeName(i).toString();
if ("documentid".equals(attributeName) || "id".equals(attributeName)) {
- operation.setRemove(new DocumentId(reader.getAttributeValue(i)));
- documentIdFound = true;
+ documentId = new DocumentId(reader.getAttributeValue(i));
} else if ("condition".equals(attributeName)) {
condition = Optional.of(reader.getAttributeValue(i));
}
}
- if (!documentIdFound) {
+ if (documentId == null) {
throw newDeserializeException("Missing \"documentid\" attribute for remove operation");
}
-
- operation.setCondition(TestAndSetCondition.fromConditionString(condition));
-
- return;
+ return new RemoveFeedOperation(documentId, TestAndSetCondition.fromConditionString(condition));
} else {
throw newDeserializeException("Element \"" + startTag + "\" not allowed in this context");
}
@@ -243,6 +149,7 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader {
throw(e);
}
+ return FeedOperation.INVALID;
}
}
diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java
index a7fd782484e..e2aafcb4fdc 100644
--- a/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java
+++ b/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java
@@ -26,7 +26,7 @@ public class PositionParserTestCase {
mgr.registerDocumentType(docType);
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test_position.xml", mgr);
- Iterator<VespaXMLFeedReader.Operation> it = parser.readAll().iterator();
+ Iterator<FeedOperation> it = parser.readAll().iterator();
assertTrue(it.hasNext());
assertDocument(PositionDataType.valueOf(1, 2), it.next());
assertTrue(it.hasNext());
@@ -38,9 +38,9 @@ public class PositionParserTestCase {
assertFalse(it.hasNext());
}
- private static void assertDocument(Struct expected, VespaXMLFeedReader.Operation operation) {
+ private static void assertDocument(Struct expected, FeedOperation operation) {
assertNotNull(operation);
- assertEquals(VespaXMLFeedReader.OperationType.DOCUMENT, operation.getType());
+ assertEquals(FeedOperation.Type.DOCUMENT, operation.getType());
Document doc = operation.getDocument();
assertNotNull(doc);
assertEquals(expected, doc.getFieldValue("my_pos"));
diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java
index dcdea0975ad..0ccae4dbde5 100644
--- a/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java
+++ b/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java
@@ -28,7 +28,7 @@ public class UriParserTestCase {
mgr.registerDocumentType(docType);
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test_uri.xml", mgr);
- Iterator<VespaXMLFeedReader.Operation> it = parser.readAll().iterator();
+ Iterator<FeedOperation> it = parser.readAll().iterator();
Document doc = nextDocument(it);
assertNotNull(doc);
@@ -59,21 +59,21 @@ public class UriParserTestCase {
assertFalse(it.hasNext());
}
- private static Document nextDocument(Iterator<VespaXMLFeedReader.Operation> it) {
+ private static Document nextDocument(Iterator<FeedOperation> it) {
assertTrue(it.hasNext());
- VespaXMLFeedReader.Operation op = it.next();
+ FeedOperation op = it.next();
assertNotNull(op);
- assertEquals(VespaXMLFeedReader.OperationType.DOCUMENT, op.getType());
+ assertEquals(FeedOperation.Type.DOCUMENT, op.getType());
Document doc = op.getDocument();
assertNotNull(doc);
return doc;
}
- private static DocumentUpdate nextUpdate(Iterator<VespaXMLFeedReader.Operation> it) {
+ private static DocumentUpdate nextUpdate(Iterator<FeedOperation> it) {
assertTrue(it.hasNext());
- VespaXMLFeedReader.Operation op = it.next();
+ FeedOperation op = it.next();
assertNotNull(op);
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate upd = op.getDocumentUpdate();
assertNotNull(upd);
return upd;
diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java
index 29567177642..e33dbfe8898 100755
--- a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java
+++ b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java
@@ -40,7 +40,7 @@ public class VespaXMLReaderTestCase {
}
@Test
- public void testMapNoKey() throws Exception {
+ public void testMapNoKey() {
try {
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/testmapnokey.xml", manager);
parser.readAll();
@@ -51,7 +51,7 @@ public class VespaXMLReaderTestCase {
}
@Test
- public void testMapNoValue() throws Exception {
+ public void testMapNoValue() {
try {
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/testmapnovalue.xml", manager);
parser.readAll();
@@ -64,10 +64,9 @@ public class VespaXMLReaderTestCase {
@Test
public void testNews1() throws Exception {
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/testalltypes.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertTrue(VespaXMLFeedReader.OperationType.INVALID != op.getType());
+ assertTrue(FeedOperation.Type.INVALID != op.getType());
Document doc = op.getDocument();
assertEquals(new StringFieldValue("testUrl"), doc.getFieldValue("url"));
assertEquals(new StringFieldValue("testTitle"), doc.getFieldValue("title"));
@@ -149,10 +148,9 @@ public class VespaXMLReaderTestCase {
public void testNews3() throws Exception {
// Updating all elements in a documentType
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test03.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate docUpdate = op.getDocumentUpdate();
@@ -214,10 +212,9 @@ public class VespaXMLReaderTestCase {
// Test on adding just a few fields to a DocumentUpdate (implies other fields to null)
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test04.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate docUpdate = op.getDocumentUpdate();
//url
@@ -269,10 +266,9 @@ public class VespaXMLReaderTestCase {
// Adding a few new fields to a Document using different syntax
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test05.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate docUpdate = op.getDocumentUpdate();
@@ -334,20 +330,19 @@ public class VespaXMLReaderTestCase {
// long value with txt
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
}
// empty string
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
assertEquals("doc:news:http://news6b", op.getDocument().getId().toString());
// int array with text
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -355,7 +350,7 @@ public class VespaXMLReaderTestCase {
// long array with whitespace
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -363,7 +358,7 @@ public class VespaXMLReaderTestCase {
// byte array with value
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -371,7 +366,7 @@ public class VespaXMLReaderTestCase {
// float array with string
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -379,7 +374,7 @@ public class VespaXMLReaderTestCase {
// weighted set of int with string
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -387,7 +382,7 @@ public class VespaXMLReaderTestCase {
// weighted set of int with string as weight
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -395,17 +390,17 @@ public class VespaXMLReaderTestCase {
// weighted set of string with string as weight
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
}
- parser.read(op = new VespaXMLFeedReader.Operation());
+ op = parser.read();
assertEquals("doc:news:http://news6j", op.getDocument().getId().toString());
- parser.read(op = new VespaXMLFeedReader.Operation());
- assertEquals(VespaXMLFeedReader.OperationType.INVALID, op.getType());
+ op = parser.read();
+ assertEquals(FeedOperation.Type.INVALID, op.getType());
}
@Test
@@ -414,10 +409,9 @@ public class VespaXMLReaderTestCase {
// are also some updates that will fail (be skipped).
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test07.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate docUpdate = op.getDocumentUpdate();
@@ -449,7 +443,7 @@ public class VespaXMLReaderTestCase {
// Trying arithmetic on string (b)
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -457,7 +451,7 @@ public class VespaXMLReaderTestCase {
// "By" as string (c)
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -465,7 +459,7 @@ public class VespaXMLReaderTestCase {
// Empty key in weighted set of int (d)
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -473,7 +467,7 @@ public class VespaXMLReaderTestCase {
// No "by" attribute (e)
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -481,7 +475,7 @@ public class VespaXMLReaderTestCase {
// Float key as string (f)
try {
- parser.read(new VespaXMLFeedReader.Operation());
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -492,10 +486,9 @@ public class VespaXMLReaderTestCase {
public void testNews8() throws Exception {
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test08.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate docUpdate = op.getDocumentUpdate();
@@ -518,24 +511,21 @@ public class VespaXMLReaderTestCase {
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test09.xml", manager);
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.REMOVE, op.getType());
+ assertEquals(FeedOperation.Type.REMOVE, op.getType());
assertEquals("doc:news:http://news9a", op.getRemove().toString());
}
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.REMOVE, op.getType());
+ assertEquals(FeedOperation.Type.REMOVE, op.getType());
assertEquals("doc:news:http://news9b", op.getRemove().toString());
}
{
// Remove without documentid. Not supported.
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
try {
- parser.read(op);
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -547,8 +537,7 @@ public class VespaXMLReaderTestCase {
public void testNews10() throws Exception {
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test10.xml", manager);
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
Document doc = op.getDocument();
assertEquals(new StringFieldValue("testUrl"), doc.getFieldValue("url"));
@@ -585,15 +574,13 @@ public class VespaXMLReaderTestCase {
assertEquals(Integer.valueOf(14), strWset.get(new StringFieldValue("string14")));
}
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
Document doc = op.getDocument();
assertNotNull(doc);
assertEquals(new StringFieldValue("testUrl2"), doc.getFieldValue("url"));
}
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
DocumentUpdate upd = op.getDocumentUpdate();
assertNull(upd.getFieldUpdate("url"));
@@ -629,8 +616,7 @@ public class VespaXMLReaderTestCase {
.getWeight());
}
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
DocumentUpdate upd = op.getDocumentUpdate();
assertEquals(new StringFieldValue("assignUrl"),
@@ -661,15 +647,13 @@ public class VespaXMLReaderTestCase {
assertNull(upd.getFieldUpdate("weightedsetstring"));
}
{
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
assertEquals("doc:news:http://news10e", op.getRemove().toString());
}
{
// Illegal remove without documentid attribute
try {
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ parser.read();
fail();
} catch (Exception e) {
System.out.println(e.getMessage());
@@ -682,10 +666,9 @@ public class VespaXMLReaderTestCase {
// Adding a few new fields to a Document using different syntax
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/tests/vespaxml/fieldpathupdates.xml", manager);
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
- assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType());
+ assertEquals(FeedOperation.Type.UPDATE, op.getType());
DocumentUpdate docUpdate = op.getDocumentUpdate();
@@ -801,13 +784,13 @@ public class VespaXMLReaderTestCase {
.configure(m, "file:src/test/java/com/yahoo/document/documentmanager.docindoc.cfg");
VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test_docindoc.xml", m);
- List<VespaXMLFeedReader.Operation> ops = parser.readAll();
+ List<FeedOperation> ops = parser.readAll();
assertEquals(1, ops.size());
- VespaXMLFeedReader.Operation op = ops.get(0);
+ FeedOperation op = ops.get(0);
System.err.println(op);
- assertEquals(VespaXMLFeedReader.OperationType.DOCUMENT, op.getType());
+ assertEquals(FeedOperation.Type.DOCUMENT, op.getType());
assertNull(op.getRemove());
assertNull(op.getDocumentUpdate());
assertNotNull(op.getDocument());
@@ -886,8 +869,7 @@ public class VespaXMLReaderTestCase {
final int NUM_OPERATIONS_IN_FEED = 3;
for (int i = 0; i < NUM_OPERATIONS_IN_FEED; i++) {
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- parser.read(op);
+ FeedOperation op = parser.read();
assertTrue("Missing test and set condition", op.getCondition().isPresent());
assertEquals("Condition is not the same as in xml feed", "news.value_long == 1", op.getCondition().getSelection());
diff --git a/document/src/tests/datatype/datatype_test.cpp b/document/src/tests/datatype/datatype_test.cpp
index ef41ee770a2..fff913a0f91 100644
--- a/document/src/tests/datatype/datatype_test.cpp
+++ b/document/src/tests/datatype/datatype_test.cpp
@@ -94,13 +94,6 @@ TEST_F("require that TensorDataType can check for assignable tensor type", Tenso
EXPECT_TRUE(f.isAssignableType("tensor(x[2])"));
EXPECT_FALSE(f.isAssignableType("tensor(x[3])"));
EXPECT_FALSE(f.isAssignableType("tensor(y[2])"));
- EXPECT_FALSE(f.isAssignableType("tensor(x[])"));
- EXPECT_FALSE(f.isAssignableType("tensor(x{})"));
- f.setup("tensor(x[])");
- EXPECT_TRUE(f.isAssignableType("tensor(x[2])"));
- EXPECT_TRUE(f.isAssignableType("tensor(x[3])"));
- EXPECT_FALSE(f.isAssignableType("tensor(y[2])"));
- EXPECT_FALSE(f.isAssignableType("tensor(x[])"));
EXPECT_FALSE(f.isAssignableType("tensor(x{})"));
}
diff --git a/documentapi/abi-spec.json b/documentapi/abi-spec.json
index e1e5f778423..415c9df1e77 100644
--- a/documentapi/abi-spec.json
+++ b/documentapi/abi-spec.json
@@ -1441,44 +1441,6 @@
],
"fields": []
},
- "com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState": {
- "superClass": "java.lang.Enum",
- "interfaces": [],
- "attributes": [
- "public",
- "final",
- "enum"
- ],
- "methods": [
- "public static com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState[] values()",
- "public static com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState valueOf(java.lang.String)"
- ],
- "fields": [
- "public static final enum com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState NOT_STARTED",
- "public static final enum com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState RUNNING",
- "public static final enum com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState DONE"
- ]
- },
- "com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy": {
- "superClass": "java.lang.Object",
- "interfaces": [
- "com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy",
- "java.lang.Runnable"
- ],
- "attributes": [
- "public",
- "abstract"
- ],
- "methods": [
- "public static java.util.Map parse(java.lang.String)",
- "public abstract void init()",
- "public abstract void doSelect(com.yahoo.messagebus.routing.RoutingContext)",
- "public void select(com.yahoo.messagebus.routing.RoutingContext)",
- "public void run()",
- "public void destroy()"
- ],
- "fields": []
- },
"com.yahoo.documentapi.messagebus.protocol.ContentPolicy$ContentParameters": {
"superClass": "com.yahoo.documentapi.messagebus.protocol.StoragePolicy$Parameters",
"interfaces": [],
@@ -2025,25 +1987,6 @@
],
"fields": []
},
- "com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy": {
- "superClass": "com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy",
- "interfaces": [
- "com.yahoo.config.subscription.ConfigSubscriber$SingleSubscriber"
- ],
- "attributes": [
- "public",
- "abstract"
- ],
- "methods": [
- "public void init()",
- "public com.yahoo.jrt.slobrok.api.IMirror getMirror()",
- "public java.util.List lookup(com.yahoo.messagebus.routing.RoutingContext, java.lang.String)",
- "public synchronized void configure(com.yahoo.cloud.config.SlobroksConfig)",
- "public void destroy()",
- "public bridge synthetic void configure(com.yahoo.config.ConfigInstance)"
- ],
- "fields": []
- },
"com.yahoo.documentapi.messagebus.protocol.GetBucketListMessage": {
"superClass": "com.yahoo.documentapi.messagebus.protocol.DocumentMessage",
"interfaces": [],
@@ -2212,14 +2155,15 @@
"fields": []
},
"com.yahoo.documentapi.messagebus.protocol.LoadBalancerPolicy": {
- "superClass": "com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy",
+ "superClass": "com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy",
"interfaces": [],
"attributes": [
"public"
],
"methods": [
- "public void doSelect(com.yahoo.messagebus.routing.RoutingContext)",
- "public void merge(com.yahoo.messagebus.routing.RoutingContext)"
+ "public void select(com.yahoo.messagebus.routing.RoutingContext)",
+ "public void merge(com.yahoo.messagebus.routing.RoutingContext)",
+ "public void destroy()"
],
"fields": []
},
@@ -2955,6 +2899,22 @@
],
"fields": []
},
+ "com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy": {
+ "superClass": "java.lang.Object",
+ "interfaces": [
+ "com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy"
+ ],
+ "attributes": [
+ "public",
+ "abstract"
+ ],
+ "methods": [
+ "public void <init>()",
+ "protected java.util.List lookup(com.yahoo.messagebus.routing.RoutingContext, java.lang.String)",
+ "public static java.util.Map parse(java.lang.String)"
+ ],
+ "fields": []
+ },
"com.yahoo.documentapi.messagebus.protocol.StatBucketMessage": {
"superClass": "com.yahoo.documentapi.messagebus.protocol.DocumentMessage",
"interfaces": [],
@@ -3017,7 +2977,7 @@
"abstract"
],
"methods": [
- "public void <init>()",
+ "protected void <init>(int)",
"public abstract java.lang.String getTargetSpec(java.lang.Integer, com.yahoo.messagebus.routing.RoutingContext)",
"public void close()"
],
@@ -3033,11 +2993,10 @@
],
"methods": [
"public void <init>(java.util.Map)",
- "public java.lang.String getDistributionConfigId()",
"public java.lang.String getClusterName()",
"public com.yahoo.documentapi.messagebus.protocol.StoragePolicy$SlobrokHostPatternGenerator createPatternGenerator()",
- "public com.yahoo.documentapi.messagebus.protocol.StoragePolicy$HostFetcher createHostFetcher(com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy)",
- "public com.yahoo.vdslib.distribution.Distribution createDistribution(com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy)"
+ "public com.yahoo.documentapi.messagebus.protocol.StoragePolicy$HostFetcher createHostFetcher(com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy, int)",
+ "public com.yahoo.vdslib.distribution.Distribution createDistribution(com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy)"
],
"fields": [
"protected final java.lang.String clusterName",
@@ -3069,7 +3028,7 @@
"fields": []
},
"com.yahoo.documentapi.messagebus.protocol.StoragePolicy": {
- "superClass": "com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy",
+ "superClass": "com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy",
"interfaces": [],
"attributes": [
"public"
@@ -3077,9 +3036,8 @@
"methods": [
"public void <init>(java.lang.String)",
"public void <init>(java.util.Map)",
- "public void <init>(com.yahoo.documentapi.messagebus.protocol.StoragePolicy$Parameters, java.util.Map)",
- "public void init()",
- "public void doSelect(com.yahoo.messagebus.routing.RoutingContext)",
+ "public void <init>(com.yahoo.documentapi.messagebus.protocol.StoragePolicy$Parameters)",
+ "public void select(com.yahoo.messagebus.routing.RoutingContext)",
"public void merge(com.yahoo.messagebus.routing.RoutingContext)",
"public void destroy()"
],
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java
deleted file mode 100644
index 90fc6de57c7..00000000000
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.documentapi.messagebus.protocol;
-
-import com.yahoo.log.LogLevel;
-import com.yahoo.messagebus.EmptyReply;
-import com.yahoo.messagebus.ErrorCode;
-import com.yahoo.messagebus.Reply;
-import com.yahoo.messagebus.routing.RoutingContext;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.logging.Logger;
-
-/**
- * Abstract class for routing policies that need asynchronous initialization.
- * This is recommended if the routing policy needs configuration, or synchronization with
- * other sources. If this policy is not used in those cases, the messagebus thread might hang
- * waiting for the other sources, causing messages to other routes to be blocked.
- */
-public abstract class AsyncInitializationPolicy implements DocumentProtocolRoutingPolicy, Runnable {
-
- protected enum InitState {
- NOT_STARTED,
- RUNNING,
- DONE
- }
-
- private static final Logger log = Logger.getLogger(AsyncInitializationPolicy.class.getName());
-
- private InitState initState;
- private ScheduledThreadPoolExecutor executor;
- private Exception initException;
- private boolean syncInit = true;
-
- public static Map<String, String> parse(String param) {
- Map<String, String> map = new TreeMap<>();
-
- if (param != null) {
- String[] p = param.split(";");
- for (String s : p) {
- String[] keyValue = s.split("=");
-
- if (keyValue.length == 1) {
- map.put(keyValue[0], "true");
- } else if (keyValue.length == 2) {
- map.put(keyValue[0], keyValue[1]);
- }
- }
- }
-
- return map;
- }
-
- AsyncInitializationPolicy() {
- initState = InitState.NOT_STARTED;
- }
-
- void needAsynchronousInitialization() {
- syncInit = false;
- }
-
- public abstract void init();
-
- public abstract void doSelect(RoutingContext routingContext);
-
- private synchronized void checkStartInit() {
- if (initState == InitState.NOT_STARTED) {
- if (syncInit) {
- init();
- initState = InitState.DONE;
- } else {
- executor = new ScheduledThreadPoolExecutor(1);
- executor.execute(this);
- initState = InitState.RUNNING;
- }
- }
- }
-
- @Override
- public void select(RoutingContext routingContext) {
- synchronized (this) {
- if (initException != null) {
- Reply reply = new EmptyReply();
- reply.addError(new com.yahoo.messagebus.Error(ErrorCode.POLICY_ERROR, "Policy threw exception during init:" + exceptionMessageWithTrace(initException)));
- routingContext.setReply(reply);
- return;
- }
-
- checkStartInit();
-
- if (initState == InitState.RUNNING) {
- Reply reply = new EmptyReply();
- reply.addError(new com.yahoo.messagebus.Error(ErrorCode.SESSION_BUSY, "Policy is waiting to be initialized."));
- routingContext.setReply(reply);
- return;
- }
- }
-
- doSelect(routingContext);
- }
-
- public void run() {
- try {
- init();
- } catch (Exception e) {
- log.log(LogLevel.WARNING,"Init threw exception",e);
- initException = e;
- }
-
- synchronized (this) {
- initState = InitState.DONE;
- this.notifyAll();
- }
- }
-
- @Override
- public void destroy() {
- if (executor != null) {
- executor.shutdownNow();
- }
- }
-
-
- private static String exceptionMessageWithTrace(Exception e) {
- StringWriter sw = new StringWriter();
- try (PrintWriter pw = new PrintWriter(sw)) {
- e.printStackTrace(pw);
- pw.flush();
- }
- return sw.toString();
-
- }
-
-
-
-}
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java
index 3ece2217601..d6e20b9d57f 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java
@@ -33,7 +33,7 @@ public class ContentPolicy extends StoragePolicy {
}
public ContentPolicy(Map<String, String> params) {
- super(new ContentParameters(params), params);
+ super(new ContentParameters(params));
}
public ContentPolicy(String parameters) {
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java
index 77bc904ab12..450f53c4440 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java
@@ -3,7 +3,6 @@ package com.yahoo.documentapi.messagebus.protocol;
import com.yahoo.messagebus.routing.RoutingPolicy;
-
/**
* @author thomasg
*/
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java
deleted file mode 100644
index 39242bb6cab..00000000000
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.documentapi.messagebus.protocol;
-
-import com.yahoo.config.subscription.ConfigSourceSet;
-import com.yahoo.config.subscription.ConfigSubscriber;
-import com.yahoo.jrt.Supervisor;
-import com.yahoo.jrt.Transport;
-import com.yahoo.jrt.slobrok.api.IMirror;
-import com.yahoo.jrt.slobrok.api.Mirror;
-import com.yahoo.jrt.slobrok.api.SlobrokList;
-import com.yahoo.messagebus.routing.RoutingContext;
-import com.yahoo.cloud.config.SlobroksConfig;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Abstract class for policies that allow you to specify which slobrok to use for the
- * routing.
- */
-public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy implements ConfigSubscriber.SingleSubscriber<SlobroksConfig> {
- String error;
- private Supervisor orb = null;
- private Mirror mirror = null;
- private SlobrokList slobroks = null;
- private boolean firstTry = true;
- private ConfigSubscriber subscriber;
- String[] configSources = null;
- private final static String slobrokConfigId = "admin/slobrok.0";
-
-
- ExternalSlobrokPolicy(Map<String, String> param) {
- super();
-
- String conf = param.get("config");
- if (conf != null) {
- configSources = conf.split(",");
- }
-
- String slbrk = param.get("slobroks");
- if (slbrk != null) {
- slobroks = new SlobrokList();
- slobroks.setup(slbrk.split(","));
- }
-
- if (slobroks != null || configSources != null) {
- needAsynchronousInitialization();
- }
- }
-
- @Override
- public void init() {
- if (slobroks != null) {
- orb = new Supervisor(new Transport());
- mirror = new Mirror(orb, slobroks);
- }
-
- if (configSources != null) {
- if (mirror == null) {
- orb = new Supervisor(new Transport());
- subscriber = subscribe(slobrokConfigId, new ConfigSourceSet(configSources));
- }
- }
- }
-
- private ConfigSubscriber subscribe(String configId, final ConfigSourceSet configSourceSet) {
- ConfigSubscriber subscriber = new ConfigSubscriber(configSourceSet);
- subscriber.subscribe(this, SlobroksConfig.class, configId);
- return subscriber;
- }
-
- public IMirror getMirror() {
- return mirror;
- }
-
- public List<Mirror.Entry> lookup(RoutingContext context, String pattern) {
- IMirror mirror1 = (mirror != null ? mirror : context.getMirror());
-
- List<Mirror.Entry> arr = mirror1.lookup(pattern);
-
- if ((arr.isEmpty()) && firstTry) {
- synchronized(this) {
- try {
- int count = 0;
- while (arr.isEmpty() && count < 100) {
- Thread.sleep(50);
- arr = mirror1.lookup(pattern);
- count++;
- }
- } catch (InterruptedException e) {
- }
-
- }
- }
-
- firstTry = false;
- return arr;
- }
-
- @Override
- public synchronized void configure(SlobroksConfig config) {
- String[] slist = new String[config.slobrok().size()];
-
- for(int i = 0; i < config.slobrok().size(); i++) {
- slist[i] = config.slobrok(i).connectionspec();
- }
- if (slobroks == null) {
- slobroks = new SlobrokList();
- }
- slobroks.setup(slist);
- if (mirror == null) {
- mirror = new Mirror(orb, slobroks);
- }
-
- }
-
- @Override
- public void destroy() {
- if (subscriber!=null) subscriber.close();
- }
-
-}
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java
index a2875f14ab5..054b120cf81 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.documentapi.messagebus.protocol;
+import com.google.common.util.concurrent.AtomicDouble;
import com.yahoo.jrt.slobrok.api.Mirror;
import java.util.List;
@@ -28,10 +29,10 @@ public class LoadBalancer {
}
/** Statistics on each node we are load balancing over. Populated lazily. */
- private List<NodeMetrics> nodeWeights = new CopyOnWriteArrayList<>();
+ private final List<NodeMetrics> nodeWeights = new CopyOnWriteArrayList<>();
- private String cluster;
- private double position = 0.0;
+ private final String cluster;
+ private final AtomicDouble safePosition = new AtomicDouble(0.0);
public LoadBalancer(String cluster) {
this.cluster = cluster;
@@ -67,6 +68,7 @@ public class LoadBalancer {
double weightSum = 0.0;
Node selectedNode = null;
+ double position = safePosition.get();
for (Mirror.Entry entry : choices) {
NodeMetrics nodeMetrics = getNodeMetrics(entry);
@@ -82,6 +84,7 @@ public class LoadBalancer {
selectedNode = new Node(choices.get(0), getNodeMetrics(choices.get(0)));
}
position += 1.0;
+ safePosition.set(position);
selectedNode.metrics.sent.incrementAndGet();
return selectedNode;
}
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java
index 9cf82144e71..3d129684465 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java
@@ -23,32 +23,28 @@ import java.util.Map;
*
* @author <a href="mailto:humbe@yahoo-inc.com">Haakon Humberset</a>
*/
-public class LoadBalancerPolicy extends ExternalSlobrokPolicy {
+public class LoadBalancerPolicy extends SlobrokPolicy {
private final String session;
private final String pattern;
- private LoadBalancer loadBalancer;
+ private final LoadBalancer loadBalancer;
LoadBalancerPolicy(String param) {
this(parse(param));
}
private LoadBalancerPolicy(Map<String, String> params) {
- super(params);
+ super();
String cluster = params.get("cluster");
session = params.get("session");
if (cluster == null) {
- error = "Required parameter pattern not set";
- pattern = null;
- return;
+ throw new IllegalArgumentException("Required parameter 'cluster' not set");
}
if (session == null) {
- error = "Required parameter session not set";
- pattern = null;
- return;
+ throw new IllegalArgumentException("Required parameter 'session' not set");
}
pattern = cluster + "/*/" + session;
@@ -56,7 +52,7 @@ public class LoadBalancerPolicy extends ExternalSlobrokPolicy {
}
@Override
- public void doSelect(RoutingContext context) {
+ public void select(RoutingContext context) {
LoadBalancer.Node node = getRecipient(context);
if (node != null) {
@@ -65,8 +61,7 @@ public class LoadBalancerPolicy extends ExternalSlobrokPolicy {
route.setHop(0, Hop.parse(node.entry.getSpec() + "/" + session));
context.addChild(route);
} else {
- context.setError(ErrorCode.NO_ADDRESS_FOR_SERVICE,
- "Could not resolve any nodes to send to in pattern " + pattern);
+ context.setError(ErrorCode.NO_ADDRESS_FOR_SERVICE, "Could not resolve any nodes to send to in pattern " + pattern);
}
}
@@ -95,4 +90,9 @@ public class LoadBalancerPolicy extends ExternalSlobrokPolicy {
context.setReply(reply);
}
+
+ @Override
+ public void destroy() {
+
+ }
}
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java
new file mode 100644
index 00000000000..f4e1bb33dd1
--- /dev/null
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java
@@ -0,0 +1,63 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.documentapi.messagebus.protocol;
+
+import com.yahoo.jrt.slobrok.api.IMirror;
+import com.yahoo.jrt.slobrok.api.Mirror;
+import com.yahoo.messagebus.routing.RoutingContext;
+
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Abstract class for policies that allow you to specify which slobrok to use for the
+ * routing.
+ */
+public abstract class SlobrokPolicy implements DocumentProtocolRoutingPolicy {
+ private boolean firstTry = true;
+
+ protected List<Mirror.Entry> lookup(RoutingContext context, String pattern) {
+ IMirror mirror1 = context.getMirror();
+
+ List<Mirror.Entry> arr = mirror1.lookup(pattern);
+
+ if (arr.isEmpty()) {
+ synchronized(this) {
+ if (firstTry) {
+ try {
+ int count = 0;
+ while (arr.isEmpty() && count < 100) {
+ Thread.sleep(50);
+ arr = mirror1.lookup(pattern);
+ count++;
+ }
+ } catch (InterruptedException e) {
+ }
+ firstTry = true;
+ }
+ }
+ }
+
+ return arr;
+ }
+
+ public static Map<String, String> parse(String param) {
+ Map<String, String> map = new TreeMap<>();
+
+ if (param != null) {
+ String[] p = param.split(";");
+ for (String s : p) {
+ String[] keyValue = s.split("=");
+
+ if (keyValue.length == 1) {
+ map.put(keyValue[0], "true");
+ } else if (keyValue.length == 2) {
+ map.put(keyValue[0], keyValue[1]);
+ }
+ }
+ }
+
+ return map;
+ }
+
+}
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java
index 048149e86ab..918bd193d89 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java
@@ -2,7 +2,6 @@
package com.yahoo.documentapi.messagebus.protocol;
import com.yahoo.concurrent.CopyOnWriteHashMap;
-import com.yahoo.config.subscription.ConfigSourceSet;
import com.yahoo.document.BucketId;
import com.yahoo.document.BucketIdFactory;
import com.yahoo.jrt.slobrok.api.IMirror;
@@ -25,10 +24,14 @@ import com.yahoo.vdslib.state.NodeType;
import com.yahoo.vdslib.state.State;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger;
/**
@@ -42,7 +45,7 @@ import java.util.logging.Logger;
*
* @author Haakon Humberset
*/
-public class StoragePolicy extends ExternalSlobrokPolicy {
+public class StoragePolicy extends SlobrokPolicy {
private static final Logger log = Logger.getLogger(StoragePolicy.class.getName());
public static final String owningBucketStates = "uim";
@@ -50,46 +53,65 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
/** This class merely generates slobrok a host pattern for a given distributor. */
public static class SlobrokHostPatternGenerator {
- private final String clusterName;
- SlobrokHostPatternGenerator(String clusterName) { this.clusterName = clusterName; }
+ private final String base;
+ private final String all;
+ SlobrokHostPatternGenerator(String clusterName) {
+ base = "storage/cluster." + clusterName + "/distributor/";
+ all = base + "*/default";
+
+ }
/**
* Find host pattern of the hosts that are valid targets for this request.
* @param distributor Set to -1 if any distributor is valid target.
*/
public String getDistributorHostPattern(Integer distributor) {
- return "storage/cluster." + clusterName + "/distributor/" + (distributor == null ? "*" : distributor) + "/default";
+ return (distributor == null) ? all : (base + distributor + "/default");
}
}
/** Helper class to match a host pattern with node to use. */
public abstract static class HostFetcher {
- private int requiredUpPercentageToSendToKnownGoodNodes = 60;
- private List<Integer> validRandomTargets = new ArrayList<>();
- private int totalTargets = 1;
+
+ private static class Targets {
+ private final List<Integer> list;
+ private final int total;
+ Targets() {
+ this(Collections.emptyList(), 1);
+ }
+ Targets(List<Integer> list, int total) {
+ this.list = list;
+ this.total = total;
+ }
+ }
+
+ private final int requiredUpPercentageToSendToKnownGoodNodes;
+ private final AtomicReference<Targets> validTargets = new AtomicReference<>(new Targets());
protected final Random randomizer = new Random(12345); // Use same randomizer each time to make unit testing easy.
- void setRequiredUpPercentageToSendToKnownGoodNodes(int percent) { this.requiredUpPercentageToSendToKnownGoodNodes = percent; }
+ protected HostFetcher(int percent) {
+ requiredUpPercentageToSendToKnownGoodNodes = percent;
+ }
void updateValidTargets(ClusterState state) {
List<Integer> validRandomTargets = new ArrayList<>();
for (int i=0; i<state.getNodeCount(NodeType.DISTRIBUTOR); ++i) {
if (state.getNodeState(new Node(NodeType.DISTRIBUTOR, i)).getState().oneOf(upStates)) validRandomTargets.add(i);
}
- this.validRandomTargets = validRandomTargets;
- this.totalTargets = state.getNodeCount(NodeType.DISTRIBUTOR);
+ validTargets.set(new Targets(new CopyOnWriteArrayList<>(validRandomTargets), state.getNodeCount(NodeType.DISTRIBUTOR)));
}
public abstract String getTargetSpec(Integer distributor, RoutingContext context);
String getRandomTargetSpec(RoutingContext context) {
+ Targets targets = validTargets.get();
// Try to use list of random targets, if at least X % of the nodes are up
- while (100 * validRandomTargets.size() / totalTargets >= requiredUpPercentageToSendToKnownGoodNodes) {
- int randIndex = randomizer.nextInt(validRandomTargets.size());
- String targetSpec = getTargetSpec(validRandomTargets.get(randIndex), context);
+ while (100 * targets.list.size() / targets.total >= requiredUpPercentageToSendToKnownGoodNodes) {
+ int randIndex = randomizer.nextInt(targets.list.size());
+ String targetSpec = getTargetSpec(targets.list.get(randIndex), context);
if (targetSpec != null) {
context.trace(3, "Sending to random node seen up in cluster state");
return targetSpec;
}
- validRandomTargets.remove(randIndex);
+ targets.list.remove(randIndex);
}
context.trace(3, "Too few nodes seen up in state. Sending totally random.");
return getTargetSpec(null, context);
@@ -100,9 +122,10 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
/** Host fetcher using a slobrok mirror to find the hosts. */
public static class SlobrokHostFetcher extends HostFetcher {
private final SlobrokHostPatternGenerator patternGenerator;
- ExternalSlobrokPolicy policy;
+ private final SlobrokPolicy policy;
- SlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, ExternalSlobrokPolicy policy) {
+ SlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, SlobrokPolicy policy, int percent) {
+ super(percent);
this.patternGenerator = patternGenerator;
this.policy = policy;
}
@@ -115,6 +138,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
public IMirror getMirror(RoutingContext context) { return context.getMirror(); }
+ @Override
public String getTargetSpec(Integer distributor, RoutingContext context) {
List<Mirror.Entry> arr = getEntries(patternGenerator.getDistributorHostPattern(distributor), context);
if (arr.isEmpty()) return null;
@@ -155,21 +179,21 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
}
- private volatile GenerationCache generationCache = null;
+ private final AtomicReference<GenerationCache> generationCache = new AtomicReference<>(null);
- TargetCachingSlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, ExternalSlobrokPolicy policy) {
- super(patternGenerator, policy);
+ TargetCachingSlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, SlobrokPolicy policy, int percent) {
+ super(patternGenerator, policy, percent);
}
@Override
public String getTargetSpec(Integer distributor, RoutingContext context) {
- GenerationCache cache = generationCache;
+ GenerationCache cache = generationCache.get();
int currentGeneration = getMirror(context).updates();
// The below code might race with other threads during a generation change. That is OK, as the cache
// is thread safe and will quickly converge to a stable state for the new generation.
if (cache == null || currentGeneration != cache.generation()) {
cache = new GenerationCache(currentGeneration);
- generationCache = cache;
+ generationCache.set(cache);
}
if (distributor != null) {
return cachingGetTargetSpec(distributor, context, cache);
@@ -206,7 +230,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
if (clusterName == null) throw new IllegalArgumentException("Required parameter cluster with clustername not set");
}
- public String getDistributionConfigId() {
+ String getDistributionConfigId() {
return (distributionConfigId == null ? "storage/cluster." + clusterName : distributionConfigId);
}
public String getClusterName() {
@@ -215,13 +239,11 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
public SlobrokHostPatternGenerator createPatternGenerator() {
return new SlobrokHostPatternGenerator(getClusterName());
}
- public HostFetcher createHostFetcher(ExternalSlobrokPolicy policy) {
- return new TargetCachingSlobrokHostFetcher(slobrokHostPatternGenerator, policy);
+ public HostFetcher createHostFetcher(SlobrokPolicy policy, int percent) {
+ return new TargetCachingSlobrokHostFetcher(slobrokHostPatternGenerator, policy, percent);
}
- public Distribution createDistribution(ExternalSlobrokPolicy policy) {
- return (policy.configSources != null ?
- new Distribution(getDistributionConfigId(), new ConfigSourceSet(policy.configSources))
- : new Distribution(getDistributionConfigId()));
+ public Distribution createDistribution(SlobrokPolicy policy) {
+ return new Distribution(getDistributionConfigId());
}
/**
@@ -278,8 +300,8 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
public static class DistributorSelectionLogic {
/** Class that tracks a failure of a given type per node. */
static class InstabilityChecker {
- private List<Integer> nodeFailures = new ArrayList<>();
- private int failureLimit;
+ private final List<Integer> nodeFailures = new CopyOnWriteArrayList<>();
+ private final int failureLimit;
InstabilityChecker(int failureLimit) { this.failureLimit = failureLimit; }
@@ -299,10 +321,19 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
/** Message context class. Contains data we want to inspect about a request at reply time. */
private static class MessageContext {
- Integer calculatedDistributor;
- ClusterState usedState;
+ final Integer calculatedDistributor;
+ final ClusterState usedState;
- MessageContext(ClusterState usedState) { this.usedState = usedState; }
+ MessageContext() {
+ this(null, null);
+ }
+ MessageContext(ClusterState usedState) {
+ this(usedState, null);
+ }
+ MessageContext(ClusterState usedState, Integer calculatedDistributor) {
+ this.calculatedDistributor = calculatedDistributor;
+ this.usedState = usedState;
+ }
public String toString() {
return "Context(Distributor " + calculatedDistributor +
@@ -313,13 +344,12 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
private final HostFetcher hostFetcher;
private final Distribution distribution;
private final InstabilityChecker persistentFailureChecker;
- private ClusterState cachedClusterState = null;
- private int oldClusterVersionGottenCount = 0;
+ private final AtomicReference<ClusterState> safeCachedClusterState = new AtomicReference<>(null);
+ private final AtomicInteger oldClusterVersionGottenCount = new AtomicInteger(0);
private final int maxOldClusterVersionBeforeSendingRandom; // Reset cluster version protection
- DistributorSelectionLogic(Parameters params, ExternalSlobrokPolicy policy) {
- this.hostFetcher = params.createHostFetcher(policy);
- this.hostFetcher.setRequiredUpPercentageToSendToKnownGoodNodes(params.getRequiredUpPercentageToSendToKnownGoodNodes());
+ DistributorSelectionLogic(Parameters params, SlobrokPolicy policy) {
+ this.hostFetcher = params.createHostFetcher(policy, params.getRequiredUpPercentageToSendToKnownGoodNodes());
this.distribution = params.createDistribution(policy);
persistentFailureChecker = new InstabilityChecker(params.getAttemptRandomOnFailuresLimit());
maxOldClusterVersionBeforeSendingRandom = params.maxOldClusterStatesSeenBeforeThrowingCachedState();
@@ -332,8 +362,8 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
String getTargetSpec(RoutingContext context, BucketId bucketId) {
String sendRandomReason = null;
- MessageContext messageContext = new MessageContext(cachedClusterState);
- context.setContext(messageContext);
+ ClusterState cachedClusterState = safeCachedClusterState.get();
+
if (cachedClusterState != null) { // If we have a cached cluster state (regular case), we use that to calculate correct node.
try{
Integer target = distribution.getIdealDistributorNode(cachedClusterState, bucketId, owningBucketStates);
@@ -344,19 +374,20 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
// If we have found a target, and the target exists in slobrok, send to it.
if (target != null) {
- messageContext.calculatedDistributor = target;
+ context.setContext(new MessageContext(cachedClusterState, target));
String targetSpec = hostFetcher.getTargetSpec(target, context);
if (targetSpec != null) {
if (context.shouldTrace(1)) {
- context.trace(1, "Using distributor " + messageContext.calculatedDistributor + " for " +
+ context.trace(1, "Using distributor " + target + " for " +
bucketId + " as our state version is " + cachedClusterState.getVersion());
}
- messageContext.usedState = cachedClusterState;
return targetSpec;
} else {
- sendRandomReason = "Want to use distributor " + messageContext.calculatedDistributor + " but it is not in slobrok. Sending to random.";
+ sendRandomReason = "Want to use distributor " + target + " but it is not in slobrok. Sending to random.";
log.log(LogLevel.DEBUG, "Target distributor is not in slobrok");
}
+ } else {
+ context.setContext(new MessageContext(cachedClusterState));
}
} catch (Distribution.TooFewBucketBitsInUseException e) {
Reply reply = new WrongDistributionReply(cachedClusterState.toString(true));
@@ -366,10 +397,11 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
return null;
} catch (Distribution.NoDistributorsAvailableException e) {
log.log(LogLevel.DEBUG, "No distributors available; clearing cluster state");
- cachedClusterState = null;
+ safeCachedClusterState.set(null);
sendRandomReason = "No distributors available. Sending to random distributor.";
}
} else {
+ context.setContext(new MessageContext(null));
sendRandomReason = "No cluster state cached. Sending to random distributor.";
}
if (context.shouldTrace(1)) {
@@ -406,13 +438,14 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
private void updateCachedRoutingStateFromWrongDistribution(MessageContext context, ClusterState newState) {
+ ClusterState cachedClusterState = safeCachedClusterState.get();
if (cachedClusterState == null || newState.getVersion() >= cachedClusterState.getVersion()) {
- cachedClusterState = newState;
+ safeCachedClusterState.set(newState);
if (newState.getClusterState().equals(State.UP)) {
hostFetcher.updateValidTargets(newState);
}
} else if (newState.getVersion() + 2000000000 < cachedClusterState.getVersion()) {
- cachedClusterState = null;
+ safeCachedClusterState.set(null);
} else if (context.calculatedDistributor != null) {
persistentFailureChecker.addFailure(context.calculatedDistributor);
}
@@ -449,10 +482,11 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
private void resetCachedStateIfClusterStateVersionLikelyRolledBack(ClusterState newState) {
+ ClusterState cachedClusterState = safeCachedClusterState.get();
if (cachedClusterState != null && cachedClusterState.getVersion() > newState.getVersion()) {
- if (++oldClusterVersionGottenCount >= maxOldClusterVersionBeforeSendingRandom) {
- oldClusterVersionGottenCount = 0;
- cachedClusterState = null;
+ if (oldClusterVersionGottenCount.incrementAndGet() >= maxOldClusterVersionBeforeSendingRandom) {
+ oldClusterVersionGottenCount.set(0);
+ safeCachedClusterState.set(null);
}
}
}
@@ -473,6 +507,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
if (!reply.getTrace().shouldTrace(1)) {
return;
}
+ ClusterState cachedClusterState = safeCachedClusterState.get();
if (cachedClusterState == null) {
reply.getTrace().trace(1, "Message sent to * with no previous state, received version " + newState.getVersion());
} else if (newState.getVersion() == cachedClusterState.getVersion()) {
@@ -496,8 +531,8 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
private final BucketIdCalculator bucketIdCalculator = new BucketIdCalculator();
- private DistributorSelectionLogic distributorSelectionLogic = null;
- private Parameters parameters;
+ private final DistributorSelectionLogic distributorSelectionLogic;
+ private final Parameters parameters;
/** Constructor used in production. */
public StoragePolicy(String param) {
@@ -505,23 +540,18 @@ public class StoragePolicy extends ExternalSlobrokPolicy {
}
public StoragePolicy(Map<String, String> params) {
- this(new Parameters(params), params);
+ this(new Parameters(params));
}
/** Constructor specifying a bit more in detail, so we can override what needs to be overridden in tests */
- public StoragePolicy(Parameters p, Map<String, String> params) {
- super(params);
+ public StoragePolicy(Parameters p) {
+ super();
parameters = p;
+ distributorSelectionLogic = new DistributorSelectionLogic(parameters, this);
}
@Override
- public void init() {
- super.init();
- this.distributorSelectionLogic = new DistributorSelectionLogic(parameters, this);
- }
-
- @Override
- public void doSelect(RoutingContext context) {
+ public void select(RoutingContext context) {
if (context.shouldTrace(1)) {
context.trace(1, "Selecting route");
}
diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java
index 4413b657739..404a3660208 100644
--- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java
+++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java
@@ -47,10 +47,10 @@ public class TargetCachingSlobrokHostFetcherTest {
}
static class Fixture {
- ExternalSlobrokPolicy mockSlobrokPolicy = mock(ExternalSlobrokPolicy.class);
+ SlobrokPolicy mockSlobrokPolicy = mock(SlobrokPolicy.class);
IMirror mockMirror = mock(IMirror.class);
StoragePolicy.SlobrokHostPatternGenerator patternGenerator = new StoragePolicy.SlobrokHostPatternGenerator("foo");
- StoragePolicy.TargetCachingSlobrokHostFetcher hostFetcher = new StoragePolicy.TargetCachingSlobrokHostFetcher(patternGenerator, mockSlobrokPolicy);
+ StoragePolicy.TargetCachingSlobrokHostFetcher hostFetcher = new StoragePolicy.TargetCachingSlobrokHostFetcher(patternGenerator, mockSlobrokPolicy, 60);
RoutingContext routingContext = mock(RoutingContext.class);
Fixture() {
diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java
index fd9d3f78ca8..fd5f43c23c1 100755
--- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java
+++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java
@@ -59,9 +59,11 @@ import java.util.TreeSet;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
-import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
/**
* @author Simon Thoresen Hult
@@ -101,7 +103,7 @@ public class PolicyTestCase {
policy = new DocumentProtocol(manager).createPolicy("SubsetService", null);
assertTrue(policy instanceof SubsetServicePolicy);
- policy = new DocumentProtocol(manager).createPolicy("LoadBalancer", null);
+ policy = new DocumentProtocol(manager).createPolicy("LoadBalancer", "cluster=docproc/cluster.default;session=chain.default");
assertTrue(policy instanceof LoadBalancerPolicy);
}
diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java
index b2a137abc7d..6a3e6a172c3 100644
--- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java
+++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java
@@ -5,10 +5,9 @@ import com.yahoo.collections.Pair;
import com.yahoo.document.DocumentId;
import com.yahoo.document.DocumentTypeManager;
import com.yahoo.document.DocumentTypeManagerConfigurer;
-import com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy;
import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol;
import com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy;
-import com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy;
+import com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy;
import com.yahoo.documentapi.messagebus.protocol.RemoveDocumentMessage;
import com.yahoo.documentapi.messagebus.protocol.RoutingPolicyFactory;
import com.yahoo.documentapi.messagebus.protocol.StoragePolicy;
@@ -110,6 +109,7 @@ public abstract class StoragePolicyTestEnvironment {
private Integer avoidPickingAtRandom = null;
public TestHostFetcher(String clusterName, Set<Integer> nodes) {
+ super(60);
this.clusterName = clusterName;
this.nodes = nodes;
}
@@ -148,16 +148,16 @@ public abstract class StoragePolicyTestEnvironment {
private final Distribution distribution;
public TestParameters(String parameters, Set<Integer> nodes) {
- super(AsyncInitializationPolicy.parse(parameters));
+ super(SlobrokPolicy.parse(parameters));
hostFetcher = new TestHostFetcher(getClusterName(), nodes);
distribution = new Distribution(Distribution.getDefaultDistributionConfig(2, 10));
}
@Override
- public StoragePolicy.HostFetcher createHostFetcher(ExternalSlobrokPolicy policy) { return hostFetcher; }
+ public StoragePolicy.HostFetcher createHostFetcher(SlobrokPolicy policy, int percent) { return hostFetcher; }
@Override
- public Distribution createDistribution(ExternalSlobrokPolicy policy) { return distribution; }
+ public Distribution createDistribution(SlobrokPolicy policy) { return distribution; }
}
public static class StoragePolicyTestFactory implements RoutingPolicyFactory {
@@ -170,13 +170,13 @@ public abstract class StoragePolicyTestEnvironment {
}
public DocumentProtocolRoutingPolicy createPolicy(String parameters) {
parameterInstances.addLast(new TestParameters(parameters, nodes));
- ((TestHostFetcher) parameterInstances.getLast().createHostFetcher(null)).setAvoidPickingAtRandom(avoidPickingAtRandom);
- return new StoragePolicy(parameterInstances.getLast(), AsyncInitializationPolicy.parse(parameters));
+ ((TestHostFetcher) parameterInstances.getLast().createHostFetcher(null, 60)).setAvoidPickingAtRandom(avoidPickingAtRandom);
+ return new StoragePolicy(parameterInstances.getLast());
}
public void avoidPickingAtRandom(Integer distributor) {
avoidPickingAtRandom = distributor;
for (TestParameters params : parameterInstances) {
- ((TestHostFetcher) params.createHostFetcher(null)).setAvoidPickingAtRandom(avoidPickingAtRandom);
+ ((TestHostFetcher) params.createHostFetcher(null, 60)).setAvoidPickingAtRandom(avoidPickingAtRandom);
}
}
public TestParameters getLastParameters() { return parameterInstances.getLast(); }
diff --git a/eval/src/apps/tensor_conformance/generate.cpp b/eval/src/apps/tensor_conformance/generate.cpp
index f3a99f8a36c..47a37824c3a 100644
--- a/eval/src/apps/tensor_conformance/generate.cpp
+++ b/eval/src/apps/tensor_conformance/generate.cpp
@@ -104,10 +104,9 @@ void generate_join_expr(const vespalib::string &expr, const Sequence &seq, TestB
std::vector<Layout> layouts = {
{}, {},
{x(5)}, {x(5)},
- {x(5)}, {x(3)},
{x(5)}, {y(5)},
{x(5)}, {x(5),y(5)},
- {x(3),y(5)}, {x(4),y(4)},
+ {x(5),y(3)}, {x(5),y(3)},
{x(3),y(5)}, {y(5),z(7)},
{x({"a","b","c"})}, {x({"a","b","c"})},
{x({"a","b","c"})}, {x({"a","b"})},
@@ -161,10 +160,6 @@ void generate_tensor_join(TestBuilder &dst) {
void generate_dot_product(TestBuilder &dst) {
dst.add("reduce(a*b,sum)", {{"a", spec(x(3), Seq({ 2, 3, 5 }))}, {"b", spec(x(3), Seq({ 7, 11, 13 }))}},
spec((2 * 7) + (3 * 11) + (5 * 13)));
- dst.add("reduce(a*b,sum)", {{"a", spec(x(2), Seq({ 2, 3 }))}, {"b", spec(x(3), Seq({ 7, 11, 13 }))}},
- spec((2 * 7) + (3 * 11)));
- dst.add("reduce(a*b,sum)", {{"a", spec(x(3), Seq({ 2, 3, 5 }))}, {"b", spec(x(2), Seq({ 7, 11 }))}},
- spec((2 * 7) + (3 * 11)));
}
//-----------------------------------------------------------------------------
@@ -191,7 +186,7 @@ void generate_tensor_concat(TestBuilder &dst) {
spec({x(4),y(2)}, Seq({1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 6.0})));
dst.add("concat(a,b,x)", {{"a", spec(z(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}},
spec({x(2),y(2),z(3)}, Seq({1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0})));
- dst.add("concat(a,b,x)", {{"a", spec(y(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}},
+ dst.add("concat(a,b,x)", {{"a", spec(y(2), Seq({1.0, 2.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}},
spec({x(2), y(2)}, Seq({1.0, 2.0, 4.0, 5.0})));
dst.add("concat(concat(a,b,x),concat(c,d,x),y)", {{"a", spec(1.0)}, {"b", spec(2.0)}, {"c", spec(3.0)}, {"d", spec(4.0)}},
spec({x(2), y(2)}, Seq({1.0, 3.0, 2.0, 4.0})));
diff --git a/eval/src/apps/tensor_conformance/test_spec.json b/eval/src/apps/tensor_conformance/test_spec.json
index 335c4bcb939..b5374e6033d 100644
--- a/eval/src/apps/tensor_conformance/test_spec.json
+++ b/eval/src/apps/tensor_conformance/test_spec.json
@@ -579,10 +579,9 @@
{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169400199999999999A4008000000000000400E6666666666664012666666666666401599999999999A0161016A4003333333333333400999999999999A4010000000000000401333333333333340166666666666660161016B4004CCCCCCCCCCCD400B3333333333334010CCCCCCCCCCCD401400000000000040173333333333330161016C4006666666666666400CCCCCCCCCCCCD401199999999999A4014CCCCCCCCCCCD4018000000000000016201694018CCCCCCCCCCCD401C000000000000401F33333333333340213333333333334022CCCCCCCCCCCD0162016A401999999999999A401CCCCCCCCCCCCD4020000000000000402199999999999A40233333333333330162016B401A666666666666401D99999999999A40206666666666664022000000000000402399999999999A0162016C401B333333333333401E6666666666664020CCCCCCCCCCCD402266666666666640240000000000000163016940246666666666664026000000000000402799999999999A4029333333333333402ACCCCCCCCCCCD0163016A4024CCCCCCCCCCCD40266666666666664028000000000000402999999999999A402B3333333333330163016B40253333333333334026CCCCCCCCCCCD4028666666666666402A000000000000402B99999999999A0163016C402599999999999A40273333333333334028CCCCCCCCCCCD402A666666666666402C000000000000"}}
{"expression":"a+b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FC999999999999A"}}
{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF0000000000000"}}
-{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FC999999999999A3FD999999999999A3FE3333333333333"}}
{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FD33333333333343FD999999999999A3FE00000000000003FE33333333333343FE66666666666663FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FE00000000000003FE33333333333343FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000"}}
{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF66666666666673FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004CCCCCCCCCCCD400599999999999A400666666666666640073333333333334008000000000000"}}
-{"expression":"a+b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF199999999999A3FF4CCCCCCCCCCCC3FF80000000000003FFB3333333333344000000000000000400199999999999A40033333333333344004CCCCCCCCCCCC"}}
+{"expression":"a+b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF00000000000003FF33333333333333FF66666666666663FF999999999999A3FFCCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}}
{"expression":"a+b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FFCCCCCCCCCCCCD3FFE66666666666740000000000000004000CCCCCCCCCCCD4001999999999999400266666666666640033333333333334004CCCCCCCCCCCD40059999999999994006666666666666400733333333333340080000000000004008CCCCCCCCCCCD4009999999999999400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F33333333333340100000000000003FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCC3FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCC4002666666666666400333333333333440040000000000004004CCCCCCCCCCCD400599999999999A400666666666666640073333333333344008CCCCCCCCCCCD4009999999999999400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D999999999999400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A40120000000000003FF33333333333343FF4CCCCCCCCCCCD3FF66666666666673FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCC4006666666666666400733333333333440080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333334400CCCCCCCCCCCCD400D999999999999400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCC401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A4014000000000000"}}
{"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FC999999999999A01623FD999999999999A01633FE3333333333333"}}
{"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FC999999999999A01623FD999999999999A"}}
@@ -594,10 +593,9 @@
{"expression":"a+b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC999999999999A3FE66666666666663FF33333333333333FFB333333333334400199999999999A0161016A3FD33333333333343FE999999999999A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666660161016B3FD999999999999A3FECCCCCCCCCCCCC3FF66666666666673FFE66666666666640033333333333330161016C3FE00000000000003FF00000000000003FF800000000000040000000000000004004000000000000016201693FE66666666666663FF33333333333333FFB333333333334400199999999999A400599999999999A0162016A3FE999999999999A3FF4CCCCCCCCCCCC3FFCCCCCCCCCCCCD400266666666666640066666666666660162016B3FECCCCCCCCCCCCC3FF66666666666663FFE666666666667400333333333333340073333333333330162016C3FF00000000000003FF8000000000000400000000000000040040000000000004008000000000000016301693FF33333333333343FFB333333333333400199999999999A400599999999999A400999999999999A0163016A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666664006666666666666400A6666666666660163016B3FF66666666666673FFE66666666666640033333333333344007333333333333400B3333333333330163016C3FF8000000000000400000000000000040040000000000004008000000000000400C000000000000"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FC999999999999A"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FC999999999999A3FD999999999999A3FE3333333333333"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FD33333333333343FD999999999999A3FE00000000000003FE33333333333343FE66666666666663FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FE00000000000003FE33333333333343FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF66666666666673FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004CCCCCCCCCCCD400599999999999A400666666666666640073333333333334008000000000000"}}
-{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF199999999999A3FF4CCCCCCCCCCCC3FF80000000000003FFB3333333333344000000000000000400199999999999A40033333333333344004CCCCCCCCCCCC"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF00000000000003FF33333333333333FF66666666666663FF999999999999A3FFCCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FFCCCCCCCCCCCCD3FFE66666666666740000000000000004000CCCCCCCCCCCD4001999999999999400266666666666640033333333333334004CCCCCCCCCCCD40059999999999994006666666666666400733333333333340080000000000004008CCCCCCCCCCCD4009999999999999400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F33333333333340100000000000003FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCC3FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCC4002666666666666400333333333333440040000000000004004CCCCCCCCCCCD400599999999999A400666666666666640073333333333344008CCCCCCCCCCCD4009999999999999400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D999999999999400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A40120000000000003FF33333333333343FF4CCCCCCCCCCCD3FF66666666666673FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCC4006666666666666400733333333333440080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333334400CCCCCCCCCCCCD400D999999999999400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCC401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A4014000000000000"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FC999999999999A01623FD999999999999A01633FE3333333333333"}}
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FC999999999999A01623FD999999999999A"}}
@@ -609,10 +607,9 @@
{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC999999999999A3FE66666666666663FF33333333333333FFB333333333334400199999999999A0161016A3FD33333333333343FE999999999999A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666660161016B3FD999999999999A3FECCCCCCCCCCCCC3FF66666666666673FFE66666666666640033333333333330161016C3FE00000000000003FF00000000000003FF800000000000040000000000000004004000000000000016201693FE66666666666663FF33333333333333FFB333333333334400199999999999A400599999999999A0162016A3FE999999999999A3FF4CCCCCCCCCCCC3FFCCCCCCCCCCCCD400266666666666640066666666666660162016B3FECCCCCCCCCCCCC3FF66666666666663FFE666666666667400333333333333340073333333333330162016C3FF00000000000003FF8000000000000400000000000000040040000000000004008000000000000016301693FF33333333333343FFB333333333333400199999999999A400599999999999A400999999999999A0163016A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666664006666666666666400A6666666666660163016B3FF66666666666673FFE66666666666640033333333333344007333333333333400B3333333333330163016C3FF8000000000000400000000000000040040000000000004008000000000000400C000000000000"}}
{"expression":"a-b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999A3FB999999999999A0000000000000000BFB9999999999998BFC999999999999ABFD33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999A3FD33333333333343FC999999999999A3FB999999999999C0000000000000000BFB99999999999983FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000"}}
{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFD9999999999999BFDFFFFFFFFFFFFFBFE3333333333334BFE6666666666666BFE999999999999ABFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
-{"expression":"a-b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"a-b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a-b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE3333333333333BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFF3333333333333BFF4CCCCCCCCCCCDBFF6666666666666BFF8000000000000BFF9999999999999BFFB333333333333BFFCCCCCCCCCCCCDBFFCCCCCCCCCCCCEBFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666667C003333333333333C003333333333333C004000000000000C004CCCCCCCCCCCDC00599999999999AC006666666666666C007333333333333C0080000000000003FE00000000000003FD99999999999993FD33333333333333FC99999999999983FB99999999999980000000000000000BFB9999999999998BFB99999999999A0BFC999999999999CBFD3333333333334BFD999999999999CBFE0000000000000BFE3333333333334BFE6666666666666BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF4CCCCCCCCCCCDBFF4CCCCCCCCCCCEBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCEBFFE666666666666BFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666666C003333333333333C0040000000000003FF00000000000003FECCCCCCCCCCCCE3FE999999999999A3FE66666666666673FE33333333333343FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB99999999999900000000000000000BFB99999999999A0BFC9999999999998BFC9999999999998BFD3333333333334BFD9999999999998BFE0000000000000BFE3333333333332BFE6666666666666BFE999999999999ABFE999999999999CBFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCEBFF6666666666666BFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
{"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -624,10 +621,9 @@
{"expression":"a-b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000BFD3333333333333BFE3333333333334BFECCCCCCCCCCCCDBFF33333333333330161016ABFB999999999999ABFD9999999999999BFE6666666666666BFEFFFFFFFFFFFFFBFF4CCCCCCCCCCCD0161016BBFC9999999999999BFDFFFFFFFFFFFFFBFE999999999999ABFF199999999999ABFF66666666666660161016CBFD3333333333334BFE3333333333334BFECCCCCCCCCCCCCBFF3333333333334BFF8000000000000016201693FE00000000000003FC9999999999998BFB9999999999998BFD999999999999ABFE66666666666660162016A3FD99999999999993FB9999999999998BFC9999999999998BFDFFFFFFFFFFFFEBFE999999999999A0162016B3FD33333333333330000000000000000BFD3333333333334BFE3333333333333BFECCCCCCCCCCCCC0162016C3FC9999999999998BFB99999999999A0BFD9999999999998BFE6666666666667BFF0000000000000016301693FF00000000000003FE66666666666663FD999999999999A3FB9999999999990BFC99999999999980163016A3FECCCCCCCCCCCCE3FE33333333333333FD33333333333340000000000000000BFD33333333333340163016B3FE999999999999A3FE00000000000003FC9999999999998BFB99999999999A0BFD99999999999980163016C3FE66666666666673FD99999999999983FB99999999999A0BFC99999999999A0BFE0000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999A3FB999999999999A0000000000000000BFB9999999999998BFC999999999999ABFD33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999A3FD33333333333343FC999999999999A3FB999999999999C0000000000000000BFB99999999999983FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFD9999999999999BFDFFFFFFFFFFFFFBFE3333333333334BFE6666666666666BFE999999999999ABFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE3333333333333BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFF3333333333333BFF4CCCCCCCCCCCDBFF6666666666666BFF8000000000000BFF9999999999999BFFB333333333333BFFCCCCCCCCCCCCDBFFCCCCCCCCCCCCEBFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666667C003333333333333C003333333333333C004000000000000C004CCCCCCCCCCCDC00599999999999AC006666666666666C007333333333333C0080000000000003FE00000000000003FD99999999999993FD33333333333333FC99999999999983FB99999999999980000000000000000BFB9999999999998BFB99999999999A0BFC999999999999CBFD3333333333334BFD999999999999CBFE0000000000000BFE3333333333334BFE6666666666666BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF4CCCCCCCCCCCDBFF4CCCCCCCCCCCEBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCEBFFE666666666666BFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666666C003333333333333C0040000000000003FF00000000000003FECCCCCCCCCCCCE3FE999999999999A3FE66666666666673FE33333333333343FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB99999999999900000000000000000BFB99999999999A0BFC9999999999998BFC9999999999998BFD3333333333334BFD9999999999998BFE0000000000000BFE3333333333332BFE6666666666666BFE999999999999ABFE999999999999CBFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCEBFF6666666666666BFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -639,10 +635,9 @@
{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000BFD3333333333333BFE3333333333334BFECCCCCCCCCCCCDBFF33333333333330161016ABFB999999999999ABFD9999999999999BFE6666666666666BFEFFFFFFFFFFFFFBFF4CCCCCCCCCCCD0161016BBFC9999999999999BFDFFFFFFFFFFFFFBFE999999999999ABFF199999999999ABFF66666666666660161016CBFD3333333333334BFE3333333333334BFECCCCCCCCCCCCCBFF3333333333334BFF8000000000000016201693FE00000000000003FC9999999999998BFB9999999999998BFD999999999999ABFE66666666666660162016A3FD99999999999993FB9999999999998BFC9999999999998BFDFFFFFFFFFFFFEBFE999999999999A0162016B3FD33333333333330000000000000000BFD3333333333334BFE3333333333333BFECCCCCCCCCCCCC0162016C3FC9999999999998BFB99999999999A0BFD9999999999998BFE6666666666667BFF0000000000000016301693FF00000000000003FE66666666666663FD999999999999A3FB9999999999990BFC99999999999980163016A3FECCCCCCCCCCCCE3FE33333333333333FD33333333333340000000000000000BFD33333333333340163016B3FE999999999999A3FE00000000000003FC9999999999998BFB99999999999A0BFD99999999999980163016C3FE66666666666673FD99999999999983FB99999999999A0BFC99999999999A0BFE0000000000000"}}
{"expression":"a*b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003F847AE147AE147C"}}
{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD0000000000000"}}
-{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A"}}
{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3F947AE147AE147C3FA47AE147AE147C3FAEB851EB851EB83FB47AE147AE147C3FB999999999999A3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FA47AE147AE147C3FB47AE147AE147C3FBEB851EB851EB83FC47AE147AE147C3FC999999999999A3FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD0000000000000"}}
{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FBEB851EB851EB83FC1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FD51EB851EB851F3FD70A3D70A3D70A3FD8F5C28F5C28F63FDAE147AE147AE13FDCCCCCCCCCCCCC3FE47AE147AE147C3FE5C28F5C28F5C33FE70A3D70A3D70B3FE851EB851EB8523FE999999999999A3FF0CCCCCCCCCCCD3FF199999999999A3FF26666666666663FF33333333333333FF4000000000000"}}
-{"expression":"a*b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD33333333333333FDAE147AE147AE13FE1EB851EB851EB3FE70A3D70A3D70B3FEFAE147AE147AF3FF33333333333333FF6E147AE147AE23FFAE147AE147AE1"}}
+{"expression":"a*b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD00000000000003FD70A3D70A3D70A3FDF5C28F5C28F5B3FE47AE147AE147C3FE9EB851EB851EC3FF00000000000003FF35C28F5C28F5D3FF70A3D70A3D70A3FFB0A3D70A3D70B3FFF5C28F5C28F5B4002000000000000"}}
{"expression":"a*b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FDCCCCCCCCCCCCC3FDEB851EB851EB83FE051EB851EB8523FE147AE147AE1483FE23D70A3D70A3D3FE33333333333333FE428F5C28F5C293FEC28F5C28F5C2A3FED70A3D70A3D703FEEB851EB851EB83FF00000000000003FF0A3D70A3D70A43FF147AE147AE1483FF1EB851EB851EB3FF73333333333333FF80000000000003FF8CCCCCCCCCCCD3FF999999999999A3FFA6666666666663FFB3333333333333FFC0000000000003FAEB851EB851EB83FBEB851EB851EB83FC70A3D70A3D70A3FCEB851EB851EB83FD33333333333333FD70A3D70A3D70A3FDAE147AE147AE13FE1EB851EB851EB3FE428F5C28F5C293FE66666666666663FE8A3D70A3D70A43FEAE147AE147AE13FED1EB851EB851E3FEF5C28F5C28F5B3FF33333333333343FF47AE147AE147C3FF5C28F5C28F5C33FF70A3D70A3D70B3FF851EB851EB8523FF999999999999A3FFAE147AE147AE23FFFAE147AE147AF40008F5C28F5C28F400147AE147AE14840020000000000004002B851EB851EB9400370A3D70A3D71400428F5C28F5C29400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FBC28F5C28F5C2A3FCC28F5C28F5C2A3FD51EB851EB851F3FDC28F5C28F5C2A3FE199999999999A3FE51EB851EB851F3FE8A3D70A3D70A43FEEB851EB851EB83FF147AE147AE1483FF33333333333333FF51EB851EB851F3FF70A3D70A3D70A3FF8F5C28F5C28F63FFAE147AE147AE13FFF3333333333344000A3D70A3D70A44001AE147AE147AE4002B851EB851EB94003C28F5C28F5C24004CCCCCCCCCCCD4005D70A3D70A3D84008A3D70A3D70A44009C28F5C28F5C2400AE147AE147AE1400C000000000000400D1EB851EB851E400E3D70A3D70A3D400F5C28F5C28F5B40116666666666664012000000000000401299999999999A40133333333333344013CCCCCCCCCCCC40146666666666664015000000000000"}}
{"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613F847AE147AE147C01623FA47AE147AE147C01633FB70A3D70A3D70A"}}
{"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613F847AE147AE147C01623FA47AE147AE147C"}}
@@ -654,10 +649,9 @@
{"expression":"a*b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693F847AE147AE147C3FB999999999999A3FD147AE147AE1483FE0A3D70A3D70A43FEB3333333333330161016A3F947AE147AE147C3FBEB851EB851EB83FD33333333333333FE1EB851EB851EB3FECCCCCCCCCCCCD0161016B3F9EB851EB851EB83FC1EB851EB851EB3FD51EB851EB851F3FE33333333333343FEE6666666666660161016C3FA47AE147AE147C3FC47AE147AE147C3FD70A3D70A3D70A3FE47AE147AE147C3FF0000000000000016201693FAEB851EB851EB83FD66666666666663FE70A3D70A3D70B3FF2B851EB851EB93FFB3333333333330162016A3FBEB851EB851EB83FDAE147AE147AE13FE999999999999A3FF428F5C28F5C293FFCCCCCCCCCCCCD0162016B3FC70A3D70A3D70A3FDF5C28F5C28F5B3FEC28F5C28F5C2A3FF599999999999A3FFE6666666666660162016C3FCEB851EB851EB83FE1EB851EB851EB3FEEB851EB851EB83FF70A3D70A3D70B4000000000000000016301693FBC28F5C28F5C2A3FE33333333333333FF2B851EB851EB93FFD1EB851EB851E40046666666666660163016A3FCC28F5C28F5C2A3FE70A3D70A3D70A3FF4CCCCCCCCCCCD3FFF5C28F5C28F5B400599999999999A0163016B3FD51EB851EB851F3FEAE147AE147AE13FF6E147AE147AE24000CCCCCCCCCCCC4006CCCCCCCCCCCC0163016C3FDC28F5C28F5C2A3FEEB851EB851EB83FF8F5C28F5C28F64001EB851EB851EB4008000000000000"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003F847AE147AE147C"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3F947AE147AE147C3FA47AE147AE147C3FAEB851EB851EB83FB47AE147AE147C3FB999999999999A3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FA47AE147AE147C3FB47AE147AE147C3FBEB851EB851EB83FC47AE147AE147C3FC999999999999A3FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD0000000000000"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FBEB851EB851EB83FC1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FD51EB851EB851F3FD70A3D70A3D70A3FD8F5C28F5C28F63FDAE147AE147AE13FDCCCCCCCCCCCCC3FE47AE147AE147C3FE5C28F5C28F5C33FE70A3D70A3D70B3FE851EB851EB8523FE999999999999A3FF0CCCCCCCCCCCD3FF199999999999A3FF26666666666663FF33333333333333FF4000000000000"}}
-{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD33333333333333FDAE147AE147AE13FE1EB851EB851EB3FE70A3D70A3D70B3FEFAE147AE147AF3FF33333333333333FF6E147AE147AE23FFAE147AE147AE1"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD00000000000003FD70A3D70A3D70A3FDF5C28F5C28F5B3FE47AE147AE147C3FE9EB851EB851EC3FF00000000000003FF35C28F5C28F5D3FF70A3D70A3D70A3FFB0A3D70A3D70B3FFF5C28F5C28F5B4002000000000000"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FDCCCCCCCCCCCCC3FDEB851EB851EB83FE051EB851EB8523FE147AE147AE1483FE23D70A3D70A3D3FE33333333333333FE428F5C28F5C293FEC28F5C28F5C2A3FED70A3D70A3D703FEEB851EB851EB83FF00000000000003FF0A3D70A3D70A43FF147AE147AE1483FF1EB851EB851EB3FF73333333333333FF80000000000003FF8CCCCCCCCCCCD3FF999999999999A3FFA6666666666663FFB3333333333333FFC0000000000003FAEB851EB851EB83FBEB851EB851EB83FC70A3D70A3D70A3FCEB851EB851EB83FD33333333333333FD70A3D70A3D70A3FDAE147AE147AE13FE1EB851EB851EB3FE428F5C28F5C293FE66666666666663FE8A3D70A3D70A43FEAE147AE147AE13FED1EB851EB851E3FEF5C28F5C28F5B3FF33333333333343FF47AE147AE147C3FF5C28F5C28F5C33FF70A3D70A3D70B3FF851EB851EB8523FF999999999999A3FFAE147AE147AE23FFFAE147AE147AF40008F5C28F5C28F400147AE147AE14840020000000000004002B851EB851EB9400370A3D70A3D71400428F5C28F5C29400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FBC28F5C28F5C2A3FCC28F5C28F5C2A3FD51EB851EB851F3FDC28F5C28F5C2A3FE199999999999A3FE51EB851EB851F3FE8A3D70A3D70A43FEEB851EB851EB83FF147AE147AE1483FF33333333333333FF51EB851EB851F3FF70A3D70A3D70A3FF8F5C28F5C28F63FFAE147AE147AE13FFF3333333333344000A3D70A3D70A44001AE147AE147AE4002B851EB851EB94003C28F5C28F5C24004CCCCCCCCCCCD4005D70A3D70A3D84008A3D70A3D70A44009C28F5C28F5C2400AE147AE147AE1400C000000000000400D1EB851EB851E400E3D70A3D70A3D400F5C28F5C28F5B40116666666666664012000000000000401299999999999A40133333333333344013CCCCCCCCCCCC40146666666666664015000000000000"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613F847AE147AE147C01623FA47AE147AE147C01633FB70A3D70A3D70A"}}
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613F847AE147AE147C01623FA47AE147AE147C"}}
@@ -669,10 +663,9 @@
{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693F847AE147AE147C3FB999999999999A3FD147AE147AE1483FE0A3D70A3D70A43FEB3333333333330161016A3F947AE147AE147C3FBEB851EB851EB83FD33333333333333FE1EB851EB851EB3FECCCCCCCCCCCCD0161016B3F9EB851EB851EB83FC1EB851EB851EB3FD51EB851EB851F3FE33333333333343FEE6666666666660161016C3FA47AE147AE147C3FC47AE147AE147C3FD70A3D70A3D70A3FE47AE147AE147C3FF0000000000000016201693FAEB851EB851EB83FD66666666666663FE70A3D70A3D70B3FF2B851EB851EB93FFB3333333333330162016A3FBEB851EB851EB83FDAE147AE147AE13FE999999999999A3FF428F5C28F5C293FFCCCCCCCCCCCCD0162016B3FC70A3D70A3D70A3FDF5C28F5C28F5B3FEC28F5C28F5C2A3FF599999999999A3FFE6666666666660162016C3FCEB851EB851EB83FE1EB851EB851EB3FEEB851EB851EB83FF70A3D70A3D70B4000000000000000016301693FBC28F5C28F5C2A3FE33333333333333FF2B851EB851EB93FFD1EB851EB851E40046666666666660163016A3FCC28F5C28F5C2A3FE70A3D70A3D70A3FF4CCCCCCCCCCCD3FFF5C28F5C28F5B400599999999999A0163016B3FD51EB851EB851F3FEAE147AE147AE13FF6E147AE147AE24000CCCCCCCCCCCC4006CCCCCCCCCCCC0163016C3FDC28F5C28F5C2A3FEEB851EB851EB83FF8F5C28F5C28F64001EB851EB851EB4008000000000000"}}
{"expression":"a/b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A40000000000000003FF00000000000003FE55555555555563FE00000000000003FD999999999999A4007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE3333333333333401000000000000040000000000000003FF55555555555563FF00000000000003FE999999999999A401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF0000000000000"}}
{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FD55555555555563FD24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FD1745D1745D1743FD00000000000003FCD89D89D89D89D3FCB6DB6DB6DB6DC3FC99999999999993FD00000000000003FCE1E1E1E1E1E1F3FCC71C71C71C71D3FCAF286BCA1AF293FC999999999999A3FCE79E79E79E79E3FCD1745D1745D173FCBD37A6F4DE9BE3FCAAAAAAAAAAAAB3FC999999999999A"}}
-{"expression":"a/b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF33333333333333FF2AAAAAAAAAAAB3FF24924924924933FF20000000000003FF38E38E38E38E43FF33333333333333FF2E8BA2E8BA2E83FF2AAAAAAAAAAAB"}}
+{"expression":"a/b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a/b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FC99999999999993FC7FFFFFFFFFFFF3FC69696969696973FC55555555555553FC435E50D79435E3FC33333333333333FC24924924924923FC745D1745D17463FC642C8590B21653FC55555555555563FC47AE147AE147B3FC3B13B13B13B143FC2F684BDA12F683FC24924924924933FC611A7B9611A7C3FC55555555555553FC4A5294A5294A53FC40000000000003FC364D9364D93653FC2D2D2D2D2D2D33FC24924924924924017FFFFFFFFFFFF4007FFFFFFFFFFFF40000000000000003FF7FFFFFFFFFFFF3FF33333333333333FF00000000000003FEB6DB6DB6DB6DC3FEBFFFFFFFFFFFF3FE8E38E38E38E383FE66666666666663FE45D1745D1745C3FE2AAAAAAAAAAAB3FE13B13B13B13B13FE00000000000003FE11111111111113FE00000000000003FDE1E1E1E1E1E1F3FDC71C71C71C71D3FDAF286BCA1AF293FD999999999999A3FD86186186186183FDA2E8BA2E8BA2E3FD90B21642C85913FD80000000000003FD70A3D70A3D70A3FD62762762762763FD55555555555553FD49249249249253FD611A7B9611A7C3FD55555555555553FD4A5294A5294A53FD40000000000003FD364D9364D93653FD2D2D2D2D2D2D33FD249249249249240260000000000004016000000000000400D5555555555564006000000000000400199999999999A3FFD5555555555563FF924924924924A3FF7FFFFFFFFFFFF3FF55555555555553FF33333333333333FF1745D1745D1743FF00000000000003FED89D89D89D89D3FEB6DB6DB6DB6DC3FEBBBBBBBBBBBBC3FEA0000000000003FE87878787878793FE71C71C71C71C73FE5E50D79435E513FE4CCCCCCCCCCCD3FE3CF3CF3CF3CF43FE45D1745D1745C3FE37A6F4DE9BD383FE2AAAAAAAAAAAB3FE1EB851EB851EB3FE13B13B13B13B13FE097B425ED097B3FE00000000000003FE08D3DCB08D3DD3FE00000000000003FDEF7BDEF7BDEF73FDE0000000000003FDD1745D1745D183FDC3C3C3C3C3C3C3FDB6DB6DB6DB6DB"}}
{"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -684,10 +677,9 @@
{"expression":"a/b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FD999999999999A3FD55555555555553FD3B13B13B13B143FD2D2D2D2D2D2D30161016A3FE00000000000003FD55555555555563FD33333333333333FD24924924924933FD1C71C71C71C720161016B3FD55555555555563FD24924924924933FD1745D1745D1743FD11111111111113FD0D79435E50D790161016C3FD00000000000003FD00000000000003FD00000000000003FD00000000000003FD0000000000000016201694017FFFFFFFFFFFF3FF66666666666663FEC71C71C71C71D3FE62762762762763FE2D2D2D2D2D2D30162016A4007FFFFFFFFFFFF3FF2AAAAAAAAAAAB3FE999999999999A3FE49249249249253FE1C71C71C71C720162016B40000000000000003FF00000000000003FE745D1745D17463FE33333333333333FE0D79435E50D790162016C3FF7FFFFFFFFFFFF3FEBFFFFFFFFFFFF3FE55555555555563FE20000000000003FE000000000000001630169402600000000000040033333333333333FF71C71C71C71C73FF13B13B13B13B13FEC3C3C3C3C3C3C0163016A401600000000000040000000000000003FF4CCCCCCCCCCCD3FF00000000000003FEAAAAAAAAAAAAA0163016B400D5555555555563FFB6DB6DB6DB6DC3FF2E8BA2E8BA2E83FEDDDDDDDDDDDDD3FE9435E50D794360163016C40060000000000003FF7FFFFFFFFFFFF3FF15555555555563FEBFFFFFFFFFFFF3FE8000000000000"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A40000000000000003FF00000000000003FE55555555555563FE00000000000003FD999999999999A4007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE3333333333333401000000000000040000000000000003FF55555555555563FF00000000000003FE999999999999A401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FD55555555555563FD24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FD1745D1745D1743FD00000000000003FCD89D89D89D89D3FCB6DB6DB6DB6DC3FC99999999999993FD00000000000003FCE1E1E1E1E1E1F3FCC71C71C71C71D3FCAF286BCA1AF293FC999999999999A3FCE79E79E79E79E3FCD1745D1745D173FCBD37A6F4DE9BE3FCAAAAAAAAAAAAB3FC999999999999A"}}
-{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF33333333333333FF2AAAAAAAAAAAB3FF24924924924933FF20000000000003FF38E38E38E38E43FF33333333333333FF2E8BA2E8BA2E83FF2AAAAAAAAAAAB"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FC99999999999993FC7FFFFFFFFFFFF3FC69696969696973FC55555555555553FC435E50D79435E3FC33333333333333FC24924924924923FC745D1745D17463FC642C8590B21653FC55555555555563FC47AE147AE147B3FC3B13B13B13B143FC2F684BDA12F683FC24924924924933FC611A7B9611A7C3FC55555555555553FC4A5294A5294A53FC40000000000003FC364D9364D93653FC2D2D2D2D2D2D33FC24924924924924017FFFFFFFFFFFF4007FFFFFFFFFFFF40000000000000003FF7FFFFFFFFFFFF3FF33333333333333FF00000000000003FEB6DB6DB6DB6DC3FEBFFFFFFFFFFFF3FE8E38E38E38E383FE66666666666663FE45D1745D1745C3FE2AAAAAAAAAAAB3FE13B13B13B13B13FE00000000000003FE11111111111113FE00000000000003FDE1E1E1E1E1E1F3FDC71C71C71C71D3FDAF286BCA1AF293FD999999999999A3FD86186186186183FDA2E8BA2E8BA2E3FD90B21642C85913FD80000000000003FD70A3D70A3D70A3FD62762762762763FD55555555555553FD49249249249253FD611A7B9611A7C3FD55555555555553FD4A5294A5294A53FD40000000000003FD364D9364D93653FD2D2D2D2D2D2D33FD249249249249240260000000000004016000000000000400D5555555555564006000000000000400199999999999A3FFD5555555555563FF924924924924A3FF7FFFFFFFFFFFF3FF55555555555553FF33333333333333FF1745D1745D1743FF00000000000003FED89D89D89D89D3FEB6DB6DB6DB6DC3FEBBBBBBBBBBBBC3FEA0000000000003FE87878787878793FE71C71C71C71C73FE5E50D79435E513FE4CCCCCCCCCCCD3FE3CF3CF3CF3CF43FE45D1745D1745C3FE37A6F4DE9BD383FE2AAAAAAAAAAAB3FE1EB851EB851EB3FE13B13B13B13B13FE097B425ED097B3FE00000000000003FE08D3DCB08D3DD3FE00000000000003FDEF7BDEF7BDEF73FDE0000000000003FDD1745D1745D183FDC3C3C3C3C3C3C3FDB6DB6DB6DB6DB"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -699,10 +691,9 @@
{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FD999999999999A3FD55555555555553FD3B13B13B13B143FD2D2D2D2D2D2D30161016A3FE00000000000003FD55555555555563FD33333333333333FD24924924924933FD1C71C71C71C720161016B3FD55555555555563FD24924924924933FD1745D1745D1743FD11111111111113FD0D79435E50D790161016C3FD00000000000003FD00000000000003FD00000000000003FD00000000000003FD0000000000000016201694017FFFFFFFFFFFF3FF66666666666663FEC71C71C71C71D3FE62762762762763FE2D2D2D2D2D2D30162016A4007FFFFFFFFFFFF3FF2AAAAAAAAAAAB3FE999999999999A3FE49249249249253FE1C71C71C71C720162016B40000000000000003FF00000000000003FE745D1745D17463FE33333333333333FE0D79435E50D790162016C3FF7FFFFFFFFFFFF3FEBFFFFFFFFFFFF3FE55555555555563FE20000000000003FE000000000000001630169402600000000000040033333333333333FF71C71C71C71C73FF13B13B13B13B13FEC3C3C3C3C3C3C0163016A401600000000000040000000000000003FF4CCCCCCCCCCCD3FF00000000000003FEAAAAAAAAAAAAA0163016B400D5555555555563FFB6DB6DB6DB6DC3FF2E8BA2E8BA2E83FEDDDDDDDDDDDDD3FE9435E50D794360163016C40060000000000003FF7FFFFFFFFFFFF3FF15555555555563FEBFFFFFFFFFFFF3FE8000000000000"}}
{"expression":"a%b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
-{"expression":"a%b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"a%b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a%b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
{"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -714,10 +705,9 @@
{"expression":"a%b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -729,10 +719,9 @@
{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
{"expression":"a^b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
-{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
-{"expression":"a^b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"a^b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}}
{"expression":"a^b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
{"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
{"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
@@ -744,10 +733,9 @@
{"expression":"a^b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
-{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
-{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
@@ -759,10 +747,9 @@
{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
{"expression":"pow(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
-{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
-{"expression":"pow(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}}
{"expression":"pow(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
{"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
{"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
@@ -774,10 +761,9 @@
{"expression":"pow(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
-{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
-{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
@@ -789,10 +775,9 @@
{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
{"expression":"a==b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a==b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a==b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -804,10 +789,9 @@
{"expression":"a==b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -819,10 +803,9 @@
{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a!=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -834,10 +817,9 @@
{"expression":"a!=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -849,10 +831,9 @@
{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a~=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -864,10 +845,9 @@
{"expression":"a~=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -879,10 +859,9 @@
{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a<b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a<b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x0202017803017904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a<b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -894,10 +873,9 @@
{"expression":"a<b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A00000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x0202017803017904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -909,10 +887,9 @@
{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A00000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a<=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -924,10 +901,9 @@
{"expression":"a<=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -939,10 +915,9 @@
{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"a>b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a>b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a>b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -954,10 +929,9 @@
{"expression":"a>b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF000000000000000000000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -969,10 +943,9 @@
{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF000000000000000000000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"a>=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -984,10 +957,9 @@
{"expression":"a>=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
@@ -999,10 +971,9 @@
{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
-{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}}
-{"expression":"a&&b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
@@ -1014,10 +985,9 @@
{"expression":"a&&b","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001620169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C00000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
@@ -1029,10 +999,9 @@
{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001620169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C00000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
{"expression":"a||b","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
-{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"a||b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"a||b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
@@ -1044,10 +1013,9 @@
{"expression":"a||b","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
-{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
@@ -1059,10 +1027,9 @@
{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE921FB54442D18"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
-{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FF1B6E192EBBE443FE921FB54442D183FE2D0EAD60663963FDDAC670561BB4F3FD85A376B677DC03FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FF5368C951E9CFD3FF1B6E192EBBE443FEDAC670561BB503FE921FB54442D183FE5977A5103EA933FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D18"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FD4978FA3269EE23FD1CFA95F7A8DCF3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FD10A4608E628493FCF5B75F92C80DD3FCD07BEA194B9913FCB051B394C33AB3FC94441F8F7260B3FCF5B75F92C80DD3FCD94610502338C3FCBFD581196F5C23FCA8F3C814A92D73FC94441F8F7260C3FCDEB4BEABF5A573FCC9AE19AA8FE1E3FCB665729A20CE23FCA4A6567A8DCF43FC94441F8F7260B"}}
-{"expression":"atan2(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FEC08AAE496EFA63FEB96E5A78C5C513FEB434EE31013FD3FEB034F38649C873FEC5277A4A086A23FEC08AAE496EFA63FEBCB1321414BE03FEB96E5A78C5C51"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FC94441F8F7260B3FC7B97B4BCE5B023FC65BA89B2161AB3FC52397843C9ADD3FC40B87C210A2E53FC30ED367D7CD043FC229AEC47638DC3FC7057081D704E63FC60A593E8618943FC52397843C9ADE3FC44ED0CD36E62E3FC38A03609B65453FC2D376AB2BDC173FC229AEC47638DD3FC5DAA6C2C7EF143FC52397843C9ADD3FC47808811538043FC3D6EEE8C6626C3FC33F5EF6C590243FC2B08797D7AFC63FC229AEC47638DD3FF67D8863BC99BD3FF3FC176B7A85603FF1B6E192EBBE443FEF730BD281F69B3FEC08AAE496EFA63FE921FB54442D183FE6AD1100FBFDDF3FE700A7C57846333FE5274400EEA72A3FE38B112D7BD4AD3FE222A54FDE6FA73FE0E5FC62BB05C33FDF9CBC4269AB2A3FDDAC670561BB4F3FDF5B75F92C80DE3FDDAC670561BB4F3FDC266181253B883FDAC42FFA7BCBCF3FD9816449B6FD543FD85A376B677DC03FD74B6E64A9083C3FD8DA36C0BE6CAA3FD7DF07E4BC36343FD6F61941E4DEF13FD61D9527631EA93FD553DFE7B697BA3FD4978FA3269EE13FD3E765551408AD3FD540765A5B20A23FD4978FA3269EE13FD3F87F84C579703FD362773707EBCC3FD2D4BD36A057653FD24EAAB4C991EE3FD1CFA95F7A8DCE3FF7AEA38C1ACBD13FF6414D44094C7C3FF4DF69D20AA3063FF38D6A6CE133533FF24E83FA9B4E483FF124A857547B083FF010A8AC54F5453FEF730BD281F69B3FEDAC670561BB4F3FEC08AAE496EFA63FEA85EE761A35A13FE921FB54442D183FE7DA79F20CC4433FE6AD1100FBFDDF3FE6D9D4BC9D58283FE5D58987169B183FE4E41E9E3C36163FE403F933FEDF173FE3339C815096583FE271AA72553ED53FE1BCE31303A0353FE222A54FDE6FA73FE17F4B4FADFC703FE0E5FC62BB05C33FE055EB9AF3EB4A3FDF9CBC4269AB2A3FDE9D53842EF0533FDDAC670561BB4F3FDE8CD3A58C421F3FDDAC670561BB4F3FDCD7A29A45A6ED3FDC0DB4C94EC9EF3FDB4DDD66A37B403FDA976C28F401F63FD9E9BF3D20DC71"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE921FB54442D1801623FE921FB54442D1801633FE921FB54442D18"}}
{"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE921FB54442D1801623FE921FB54442D18"}}
@@ -1074,10 +1041,9 @@
{"expression":"atan2(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE921FB54442D183FD85A376B677DC03FD4978FA3269EE13FD31A9B43436DE13FD24EAAB4C991EE0161016A3FDDAC670561BB4F3FD4978FA3269EE23FD2A73A661EAF063FD1CFA95F7A8DCF3FD15731754A18210161016B3FD4978FA3269EE23FD1CFA95F7A8DCF3FD10A4608E628493FD0ADB5A7741C043FD077FDE3124EAA0161016C3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD016201693FF67D8863BC99BD3FEE6AE1355353CF3FE740A77023BDA93FE3609F33CE6BDF3FE103E230EBECF30162016A3FF3FC176B7A85603FEB96E5A78C5C513FE5977A5103EA933FE2486589DBA9E03FE03A26A486E6310162016B3FF1B6E192EBBE443FE921FB54442D183FE41F1963C0045F3FE14B1DD5F90CE13FDF01AFB73642BE0162016C3FEF730BD281F69B3FE700A7C57846333FE2D0EAD60663963FE0657E94DB30D03FDDAC670561BB4F016301693FF7AEA38C1ACBD13FF2D0EAD60663953FEEE35774B9EE523FEA514023A34D203FE722A598D15D3A0163016A3FF6414D44094C7C3FF1B6E192EBBE443FED488143AD8C443FE921FB54442D183FE63B4BC3F16A8A0163016B3FF4DF69D20AA3063FF0AEFD22E6AA373FEBCB1321414BE03FE8079C6293AEDF3FE562A07DC47C8F0163016C3FF38D6A6CE133533FEF730BD281F69B3FEA697CB67B95EE3FE700A7C57846333FE4978FA3269EE1"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE921FB54442D18"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
-{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FF1B6E192EBBE443FE921FB54442D183FE2D0EAD60663963FDDAC670561BB4F3FD85A376B677DC03FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FF5368C951E9CFD3FF1B6E192EBBE443FEDAC670561BB503FE921FB54442D183FE5977A5103EA933FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D18"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FD4978FA3269EE23FD1CFA95F7A8DCF3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FD10A4608E628493FCF5B75F92C80DD3FCD07BEA194B9913FCB051B394C33AB3FC94441F8F7260B3FCF5B75F92C80DD3FCD94610502338C3FCBFD581196F5C23FCA8F3C814A92D73FC94441F8F7260C3FCDEB4BEABF5A573FCC9AE19AA8FE1E3FCB665729A20CE23FCA4A6567A8DCF43FC94441F8F7260B"}}
-{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FEC08AAE496EFA63FEB96E5A78C5C513FEB434EE31013FD3FEB034F38649C873FEC5277A4A086A23FEC08AAE496EFA63FEBCB1321414BE03FEB96E5A78C5C51"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FC94441F8F7260B3FC7B97B4BCE5B023FC65BA89B2161AB3FC52397843C9ADD3FC40B87C210A2E53FC30ED367D7CD043FC229AEC47638DC3FC7057081D704E63FC60A593E8618943FC52397843C9ADE3FC44ED0CD36E62E3FC38A03609B65453FC2D376AB2BDC173FC229AEC47638DD3FC5DAA6C2C7EF143FC52397843C9ADD3FC47808811538043FC3D6EEE8C6626C3FC33F5EF6C590243FC2B08797D7AFC63FC229AEC47638DD3FF67D8863BC99BD3FF3FC176B7A85603FF1B6E192EBBE443FEF730BD281F69B3FEC08AAE496EFA63FE921FB54442D183FE6AD1100FBFDDF3FE700A7C57846333FE5274400EEA72A3FE38B112D7BD4AD3FE222A54FDE6FA73FE0E5FC62BB05C33FDF9CBC4269AB2A3FDDAC670561BB4F3FDF5B75F92C80DE3FDDAC670561BB4F3FDC266181253B883FDAC42FFA7BCBCF3FD9816449B6FD543FD85A376B677DC03FD74B6E64A9083C3FD8DA36C0BE6CAA3FD7DF07E4BC36343FD6F61941E4DEF13FD61D9527631EA93FD553DFE7B697BA3FD4978FA3269EE13FD3E765551408AD3FD540765A5B20A23FD4978FA3269EE13FD3F87F84C579703FD362773707EBCC3FD2D4BD36A057653FD24EAAB4C991EE3FD1CFA95F7A8DCE3FF7AEA38C1ACBD13FF6414D44094C7C3FF4DF69D20AA3063FF38D6A6CE133533FF24E83FA9B4E483FF124A857547B083FF010A8AC54F5453FEF730BD281F69B3FEDAC670561BB4F3FEC08AAE496EFA63FEA85EE761A35A13FE921FB54442D183FE7DA79F20CC4433FE6AD1100FBFDDF3FE6D9D4BC9D58283FE5D58987169B183FE4E41E9E3C36163FE403F933FEDF173FE3339C815096583FE271AA72553ED53FE1BCE31303A0353FE222A54FDE6FA73FE17F4B4FADFC703FE0E5FC62BB05C33FE055EB9AF3EB4A3FDF9CBC4269AB2A3FDE9D53842EF0533FDDAC670561BB4F3FDE8CD3A58C421F3FDDAC670561BB4F3FDCD7A29A45A6ED3FDC0DB4C94EC9EF3FDB4DDD66A37B403FDA976C28F401F63FD9E9BF3D20DC71"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE921FB54442D1801623FE921FB54442D1801633FE921FB54442D18"}}
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE921FB54442D1801623FE921FB54442D18"}}
@@ -1089,10 +1055,9 @@
{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE921FB54442D183FD85A376B677DC03FD4978FA3269EE13FD31A9B43436DE13FD24EAAB4C991EE0161016A3FDDAC670561BB4F3FD4978FA3269EE23FD2A73A661EAF063FD1CFA95F7A8DCF3FD15731754A18210161016B3FD4978FA3269EE23FD1CFA95F7A8DCF3FD10A4608E628493FD0ADB5A7741C043FD077FDE3124EAA0161016C3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD016201693FF67D8863BC99BD3FEE6AE1355353CF3FE740A77023BDA93FE3609F33CE6BDF3FE103E230EBECF30162016A3FF3FC176B7A85603FEB96E5A78C5C513FE5977A5103EA933FE2486589DBA9E03FE03A26A486E6310162016B3FF1B6E192EBBE443FE921FB54442D183FE41F1963C0045F3FE14B1DD5F90CE13FDF01AFB73642BE0162016C3FEF730BD281F69B3FE700A7C57846333FE2D0EAD60663963FE0657E94DB30D03FDDAC670561BB4F016301693FF7AEA38C1ACBD13FF2D0EAD60663953FEEE35774B9EE523FEA514023A34D203FE722A598D15D3A0163016A3FF6414D44094C7C3FF1B6E192EBBE443FED488143AD8C443FE921FB54442D183FE63B4BC3F16A8A0163016B3FF4DF69D20AA3063FF0AEFD22E6AA373FEBCB1321414BE03FE8079C6293AEDF3FE562A07DC47C8F0163016C3FF38D6A6CE133533FEF730BD281F69B3FEA697CB67B95EE3FE700A7C57846333FE4978FA3269EE1"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
-{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FF999999999999A40000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
-{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A40033333333333334004CCCCCCCCCCCD4006666666666666"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A40000000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A400999999999999A400999999999999A400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD40100000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF3333333333333400333333333333340033333333333334003333333333333400333333333333340033333333333334004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4014CCCCCCCCCCCD4014CCCCCCCCCCCD40166666666666664016666666666666401666666666666640166666666666664016666666666666401666666666666640166666666666664018000000000000402800000000000040280000000000004028000000000000402800000000000040280000000000004028000000000000"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
{"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
@@ -1104,10 +1069,9 @@
{"expression":"ldexp(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FE999999999999A3FF00000000000000161016A3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016B3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016C3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A4000000000000000016201693FE33333333333333FE66666666666663FE999999999999A3FFCCCCCCCCCCCCD40000000000000000162016A3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016B3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016C3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD4010000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD400666666666666640080000000000000163016A3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016B3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016C3FF199999999999A3FF33333333333334004CCCCCCCCCCCD40066666666666664018000000000000"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
-{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FF999999999999A40000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
-{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A40033333333333334004CCCCCCCCCCCD4006666666666666"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A40000000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A400999999999999A400999999999999A400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD40100000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF3333333333333400333333333333340033333333333334003333333333333400333333333333340033333333333334004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4014CCCCCCCCCCCD4014CCCCCCCCCCCD40166666666666664016666666666666401666666666666640166666666666664016666666666666401666666666666640166666666666664018000000000000402800000000000040280000000000004028000000000000402800000000000040280000000000004028000000000000"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
@@ -1119,10 +1083,9 @@
{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FE999999999999A3FF00000000000000161016A3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016B3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016C3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A4000000000000000016201693FE33333333333333FE66666666666663FE999999999999A3FFCCCCCCCCCCCCD40000000000000000162016A3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016B3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016C3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD4010000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD400666666666666640080000000000000163016A3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016B3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016C3FF199999999999A3FF33333333333334004CCCCCCCCCCCD40066666666666664018000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
-{"expression":"fmod(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -1134,10 +1097,9 @@
{"expression":"fmod(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
-{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
@@ -1149,10 +1111,9 @@
{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
{"expression":"min(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
-{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FD999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
-{"expression":"min(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}}
{"expression":"min(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
{"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
{"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
@@ -1164,10 +1125,9 @@
{"expression":"min(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB999999999999A3FE00000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC999999999999A3FE33333333333333FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B3FD33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FD999999999999A3FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF80000000000000163016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FF80000000000000163016B3FD33333333333333FE66666666666663FF199999999999A3FF66666666666663FF80000000000000163016C3FD999999999999A3FE999999999999A3FF33333333333333FF66666666666663FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
-{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FD999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
-{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
@@ -1179,10 +1139,9 @@
{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB999999999999A3FE00000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC999999999999A3FE33333333333333FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B3FD33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FD999999999999A3FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF80000000000000163016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FF80000000000000163016B3FD33333333333333FE66666666666663FF199999999999A3FF66666666666663FF80000000000000163016C3FD999999999999A3FE999999999999A3FF33333333333333FF66666666666663FF8000000000000"}}
{"expression":"max(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
-{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FC999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"}}
-{"expression":"max(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}}
{"expression":"max(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}}
{"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
{"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
@@ -1194,10 +1153,9 @@
{"expression":"max(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201693FE33333333333333FE66666666666663FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330162016A3FE33333333333333FE66666666666663FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0162016B3FE33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660162016C3FE33333333333333FE999999999999A3FF33333333333333FF999999999999A4000000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFB3333333333330163016A3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFCCCCCCCCCCCCD0163016B3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF80000000000003FFE6666666666660163016C3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF999999999999A4000000000000000"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
-{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FC999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"}}
-{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
@@ -1209,10 +1167,9 @@
{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201693FE33333333333333FE66666666666663FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330162016A3FE33333333333333FE66666666666663FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0162016B3FE33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660162016C3FE33333333333333FE999999999999A3FF33333333333333FF999999999999A4000000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFB3333333333330163016A3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFCCCCCCCCCCCCD0163016B3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF80000000000003FFE6666666666660163016C3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF999999999999A4000000000000000"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02004033FFFFFFFFFFFF"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178054033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF4010000000000000"}}
-{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178034033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179054033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF402E0000000000004023FFFFFFFFFFFF4020AAAAAAAAAAAB401E000000000000401BFFFFFFFFFFFF402AAAAAAAAAAAAB4020AAAAAAAAAAAB401AAAAAAAAAAAAB401755555555555540155555555555564028FFFFFFFFFFFF401E00000000000040175555555555554013FFFFFFFFFFFF40120000000000004027FFFFFFFFFFFF401BFFFFFFFFFFFF401555555555555640120000000000004010000000000000"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179054033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF401AAAAAAAAAAAAB4019B6DB6DB6DB6E4018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4010F83E0F83E0F84010AAAAAAAAAAAB4010690690690691401030C30C30C30C40100000000000014008FFFFFFFFFFFF4008B4B4B4B4B4B5400871C71C71C71C400835E50D79435E4007FFFFFFFFFFFF4003CF3CF3CF3CF44003A2E8BA2E8BA340037A6F4DE9BD3840035555555555554003333333333333"}}
-{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179044033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF400D5555555555564008C30C30C30C3040056DB6DB6DB6DC4002E38E38E38E394000295FAD40A57E3FFD5555555555563FFADA67D508F3783FF8C30C30C30C30"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179034033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF4010000000000000400AAAAAAAAAAAAB4006DB6DB6DB6DB74003FFFFFFFFFFFF4001C71C71C71C7240000000000000003FFD1745D1745D173FFAAAAAAAAAAAAB3FF89D89D89D89D83FF6DB6DB6DB6DB73FF5555555555555"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A074033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF40275555555555554026DB6DB6DB6DB74018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4017A2E8BA2E8BA24017555555555555401713B13B13B13B4016DB6DB6DB6DB74010000000000001400FAAAAAAAAAAAC400F5F5F5F5F5F5F400F1C71C71C71C7400EE08FB823EE09400EAAAAAAAAAAAA400E79E79E79E79E4007A2E8BA2E8BA240077A6F4DE9BD3840075555555555554007333333333333400713B13B13B13B4006F684BDA12F684006DB6DB6DB6DB74002C234F72C234F4002AAAAAAAAAAAB400294A5294A5295400280000000000040026C9B26C9B26D40025A5A5A5A5A5A40024924924924924027555555555555401AAAAAAAAAAAAB40140000000000004010AAAAAAAAAAAB400D555555555556400AAAAAAAAAAAAB4008C30C30C30C3040056DB6DB6DB6DC400451451451451540036DB6DB6DB6DC4002B3884FCACE214002186186186186400195195195195240012492492492493FFEAAAAAAAAAAA93FFE0000000000003FFD6969696969693FFCE38E38E38E383FFC6BCA1AF286BD3FFBFFFFFFFFFFFF3FFB9E79E79E79E83FF90CEDE62433B73FF8BBFB0D9A96E13FF871C71C71C71C3FF82D82D82D82D83FF7EE7EE7EE7EE73FF7B425ED097B423FF77DF7DF7DF7DF3FF58469EE58469F3FF55555555555553FF5294A5294A5293FF50000000000003FF4D9364D9364D93FF4B4B4B4B4B4B53FF49249249249254025D1745D1745D24017A2E8BA2E8BA24010F83E0F83E0F8400B45D1745D1745400745D1745D174640049B26C9B26C9B4002B3884FCACE214000AAAAAAAAAAAB3FFF1C71C71C71C73FFD5555555555563FFBE0F83E0F83E03FFAAAAAAAAAAAAB3FF9A41A41A41A413FF8C30C30C30C303FF6F96F96F96F963FF64EC4EC4EC4ED3FF5B82E55B82E563FF53253253253253FF4BA8F07414BAA3FF44EC4EC4EC4EC3FF3ED3ED3ED3ED43FF2B3884FCACE213FF262957741314B3FF21861861861863FF1D41D41D41D423FF19519519519523FF15AC056B015AC3FF12492492492493FF02F149902F14A3FF00000000000003FEFA7E9FA7E9FA73FEF5555555555543FEF07C1F07C1F093FEEBEBEBEBEBEC03FEE79E79E79E79E"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301614033FFFFFFFFFFFF01624023FFFFFFFFFFFF0163401AAAAAAAAAAAAB"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201614033FFFFFFFFFFFF01624023FFFFFFFFFFFF"}}
@@ -1223,8 +1180,6 @@
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261724018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4017A2E8BA2E8BA24017555555555555401713B13B13B13B4016DB6DB6DB6DB7400E000000000000400CE38E38E38E38400BFFFFFFFFFFFF400B45D1745D1745400AAAAAAAAAAAAB400A2762762762774009B6DB6DB6DB6E4007555555555555400638E38E38E38E400555555555555640049B26C9B26C9B400400000000000040037CB7CB7CB7CB40030C30C30C30C303666F6F4033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF40275555555555554026DB6DB6DB6DB7402AAAAAAAAAAAAB4020AAAAAAAAAAAB401AAAAAAAAAAAAB40175555555555554015555555555556401400000000000040130C30C30C30C34027FFFFFFFFFFFF401BFFFFFFFFFFFF401555555555555640120000000000004010000000000000400D555555555556400B6DB6DB6DB6DC"}}
{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101694033FFFFFFFFFFFF401BFFFFFFFFFFFF4011C71C71C71C71400A2762762762774004B4B4B4B4B4B50161016A402E000000000000401AAAAAAAAAAAAB40115555555555564009B6DB6DB6DB6E400471C71C71C71C0161016B402AAAAAAAAAAAAB4019B6DB6DB6DB6E4010F83E0F83E0F84009555555555554400435E50D79435E0161016C4028FFFFFFFFFFFF4018FFFFFFFFFFFF4010AAAAAAAAAAAB4008FFFFFFFFFFFF4004000000000000016201694027555555555555400B6DB6DB6DB6DC4002E38E38E38E393FFE15E15E15E15E3FF969696969696A0162016A401AAAAAAAAAAAAB4008C30C30C30C3040020000000000003FFD34D34D34D34D3FF8E38E38E38E380162016B40140000000000004006DB6DB6DB6DB7400145D1745D17463FFC71C71C71C71C3FF86BCA1AF286BD0162016C4010AAAAAAAAAAAB40056DB6DB6DB6DC4000AAAAAAAAAAAB3FFBC71C71C71C713FF8000000000000016301694025D1745D1745D24006AAAAAAAAAAAB3FFE15E15E15E15E3FF7BC7BC7BC7BC93FF41414141414150163016A4017A2E8BA2E8BA240040000000000003FFC4EC4EC4EC4EB3FF6DB6DB6DB6DB73FF38E38E38E38E30163016B4010F83E0F83E0F840021861861861863FFADA67D508F3783FF61861861861873FF31674C59D31680163016C400B45D1745D17454000AAAAAAAAAAAB3FF9A41A41A41A413FF56DB6DB6DB6DC3FF2AAAAAAAAAAAB"}}
{"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x0200405C000000000000"}}
-{"expression":"reduce(a*b,sum)","inputs":{"a":"0x020101780240000000000000004008000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x02004047800000000000"}}
-{"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017802401C0000000000004026000000000000"},"result":{"expect":"0x02004047800000000000"}}
{"expression":"reduce(a*b,sum,x)","inputs":{"a":"0x02010178023FF00000000000004000000000000000","b":"0x020201780201790340080000000000004014000000000000401C0000000000004026000000000000402A0000000000004031000000000000"},"result":{"expect":"0x02010179034039000000000000403F0000000000004044800000000000"}}
{"expression":"reduce(a*b,sum,y)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020201780201790340080000000000004014000000000000401C0000000000004026000000000000402A0000000000004031000000000000"},"result":{"expect":"0x020101780240410000000000004056000000000000"}}
{"expression":"concat(a,b,x)","inputs":{"a":"0x02004024000000000000","b":"0x02004034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}}
@@ -1234,7 +1189,7 @@
{"expression":"concat(a,b,y)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101790240140000000000004018000000000000"},"result":{"expect":"0x02020178020179043FF00000000000004000000000000000401400000000000040180000000000004008000000000000401000000000000040140000000000004018000000000000"}}
{"expression":"concat(a,b,x)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101780240140000000000004018000000000000"},"result":{"expect":"0x02020178040179023FF00000000000004000000000000000400800000000000040100000000000004014000000000000401400000000000040180000000000004018000000000000"}}
{"expression":"concat(a,b,x)","inputs":{"a":"0x0201017A033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x0203017802017902017A033FF0000000000000400000000000000040080000000000003FF000000000000040000000000000004008000000000000401000000000000040100000000000004010000000000000401400000000000040140000000000004014000000000000"}}
-{"expression":"concat(a,b,x)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400000000000000040100000000000004014000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02010179023FF00000000000004000000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400000000000000040100000000000004014000000000000"}}
{"expression":"concat(concat(a,b,x),concat(c,d,x),y)","inputs":{"a":"0x02003FF0000000000000","b":"0x02004000000000000000","c":"0x02004008000000000000","d":"0x02004010000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400800000000000040000000000000004010000000000000"}}
{"expression":"rename(a,x,y)","inputs":{"a":"0x02010178053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"},"result":{"expect":"0x02010179053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"}}
{"expression":"rename(a,y,x)","inputs":{"a":"0x0202017905017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x0202017805017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"}}
@@ -1245,4 +1200,4 @@
{"expression":"tensor(x[10])(x+1)","inputs":{},"result":{"expect":"0x020101780A3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402000000000000040220000000000004024000000000000"}}
{"expression":"tensor(x[5],y[4])(x*4+(y+1))","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E00000000000040300000000000004031000000000000403200000000000040330000000000004034000000000000"}}
{"expression":"tensor(x[5],y[4])(x==y)","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"num_tests":1247}
+{"num_tests":1202}
diff --git a/eval/src/tests/eval/node_types/node_types_test.cpp b/eval/src/tests/eval/node_types/node_types_test.cpp
index ce01d3f78c0..c18470887b2 100644
--- a/eval/src/tests/eval/node_types/node_types_test.cpp
+++ b/eval/src/tests/eval/node_types/node_types_test.cpp
@@ -74,47 +74,31 @@ TEST("require that leaf constants have appropriate type") {
}
TEST("require that input parameters preserve their type") {
- TEST_DO(verify("any", "any"));
TEST_DO(verify("error", "error"));
TEST_DO(verify("double", "double"));
- TEST_DO(verify("tensor", "tensor"));
- TEST_DO(verify("tensor(x{},y[10],z[])", "tensor(x{},y[10],z[])"));
+ TEST_DO(verify("tensor", "double"));
+ TEST_DO(verify("tensor(x{},y[10],z[5])", "tensor(x{},y[10],z[5])"));
}
TEST("require that if resolves to the appropriate type") {
TEST_DO(verify("if(error,1,2)", "error"));
TEST_DO(verify("if(1,error,2)", "error"));
TEST_DO(verify("if(1,2,error)", "error"));
- TEST_DO(verify("if(any,1,2)", "double"));
TEST_DO(verify("if(double,1,2)", "double"));
- TEST_DO(verify("if(tensor,1,2)", "double"));
- TEST_DO(verify("if(double,tensor,tensor)", "tensor"));
- TEST_DO(verify("if(double,any,any)", "any"));
- TEST_DO(verify("if(double,tensor(a[2]),tensor(a[2]))", "tensor(a[2])"));
- TEST_DO(verify("if(double,tensor(a[2]),tensor(a[3]))", "tensor(a[])"));
- TEST_DO(verify("if(double,tensor(a[2]),tensor(a[]))", "tensor(a[])"));
- TEST_DO(verify("if(double,tensor(a[2]),tensor(a{}))", "tensor"));
+ TEST_DO(verify("if(tensor(x[10]),1,2)", "double"));
TEST_DO(verify("if(double,tensor(a{}),tensor(a{}))", "tensor(a{})"));
- TEST_DO(verify("if(double,tensor(a{}),tensor(b{}))", "tensor"));
- TEST_DO(verify("if(double,tensor(a{}),tensor)", "tensor"));
- TEST_DO(verify("if(double,tensor,tensor(a{}))", "tensor"));
- TEST_DO(verify("if(double,tensor,any)", "any"));
- TEST_DO(verify("if(double,any,tensor)", "any"));
- TEST_DO(verify("if(double,tensor,double)", "any"));
- TEST_DO(verify("if(double,double,tensor)", "any"));
- TEST_DO(verify("if(double,double,any)", "any"));
- TEST_DO(verify("if(double,any,double)", "any"));
+ TEST_DO(verify("if(double,tensor(a[2]),tensor(a[2]))", "tensor(a[2])"));
+ TEST_DO(verify("if(double,tensor(a[2]),tensor(a[3]))", "error"));
+ TEST_DO(verify("if(double,tensor(a[2]),tensor(a{}))", "error"));
+ TEST_DO(verify("if(double,tensor(a{}),tensor(b{}))", "error"));
+ TEST_DO(verify("if(double,tensor(a{}),double)", "error"));
}
TEST("require that reduce resolves correct type") {
TEST_DO(verify("reduce(error,sum)", "error"));
- TEST_DO(verify("reduce(tensor,sum)", "double"));
TEST_DO(verify("reduce(tensor(x{}),sum)", "double"));
TEST_DO(verify("reduce(double,sum)", "double"));
- TEST_DO(verify("reduce(any,sum)", "any"));
TEST_DO(verify("reduce(error,sum,x)", "error"));
- TEST_DO(verify("reduce(tensor,sum,x)", "any"));
- TEST_DO(verify("reduce(any,sum,x)", "any"));
TEST_DO(verify("reduce(double,sum,x)", "error"));
TEST_DO(verify("reduce(tensor(x{},y{},z{}),sum,y)", "tensor(x{},z{})"));
TEST_DO(verify("reduce(tensor(x{},y{},z{}),sum,x,z)", "tensor(y{})"));
@@ -125,18 +109,16 @@ TEST("require that reduce resolves correct type") {
TEST("require that rename resolves correct type") {
TEST_DO(verify("rename(error,x,y)", "error"));
- TEST_DO(verify("rename(tensor,x,y)", "any"));
TEST_DO(verify("rename(double,x,y)", "error"));
- TEST_DO(verify("rename(any,x,y)", "any"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),a,b)", "error"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),x,y)", "error"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),x,x)", "tensor(x{},y[],z[5])"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),x,w)", "tensor(w{},y[],z[5])"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),y,w)", "tensor(x{},w[],z[5])"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),z,w)", "tensor(x{},y[],w[5])"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),(x,y,z),(z,y,x))", "tensor(z{},y[],x[5])"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),(x,z),(z,x))", "tensor(z{},y[],x[5])"));
- TEST_DO(verify("rename(tensor(x{},y[],z[5]),(x,y,z),(a,b,c))", "tensor(a{},b[],c[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),a,b)", "error"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),x,y)", "error"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),x,x)", "tensor(x{},y[1],z[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),x,w)", "tensor(w{},y[1],z[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),y,w)", "tensor(x{},w[1],z[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),z,w)", "tensor(x{},y[1],w[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),(x,y,z),(z,y,x))", "tensor(z{},y[1],x[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),(x,z),(z,x))", "tensor(z{},y[1],x[5])"));
+ TEST_DO(verify("rename(tensor(x{},y[1],z[5]),(x,y,z),(a,b,c))", "tensor(a{},b[1],c[5])"));
}
vespalib::string strfmt(const char *pattern, const char *a) {
@@ -149,37 +131,24 @@ vespalib::string strfmt(const char *pattern, const char *a, const char *b) {
void verify_op1(const char *pattern) {
TEST_DO(verify(strfmt(pattern, "error"), "error"));
- TEST_DO(verify(strfmt(pattern, "any"), "any"));
TEST_DO(verify(strfmt(pattern, "double"), "double"));
- TEST_DO(verify(strfmt(pattern, "tensor"), "tensor"));
- TEST_DO(verify(strfmt(pattern, "tensor(x{},y[10],z[])"), "tensor(x{},y[10],z[])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{},y[10],z[1])"), "tensor(x{},y[10],z[1])"));
}
void verify_op2(const char *pattern) {
TEST_DO(verify(strfmt(pattern, "error", "error"), "error"));
- TEST_DO(verify(strfmt(pattern, "any", "error"), "error"));
- TEST_DO(verify(strfmt(pattern, "error", "any"), "error"));
TEST_DO(verify(strfmt(pattern, "double", "error"), "error"));
TEST_DO(verify(strfmt(pattern, "error", "double"), "error"));
- TEST_DO(verify(strfmt(pattern, "tensor", "error"), "error"));
- TEST_DO(verify(strfmt(pattern, "error", "tensor"), "error"));
- TEST_DO(verify(strfmt(pattern, "any", "any"), "any"));
- TEST_DO(verify(strfmt(pattern, "any", "double"), "any"));
- TEST_DO(verify(strfmt(pattern, "double", "any"), "any"));
- TEST_DO(verify(strfmt(pattern, "any", "tensor"), "any"));
- TEST_DO(verify(strfmt(pattern, "tensor", "any"), "any"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x{})", "error"), "error"));
+ TEST_DO(verify(strfmt(pattern, "error", "tensor(x{})"), "error"));
TEST_DO(verify(strfmt(pattern, "double", "double"), "double"));
- TEST_DO(verify(strfmt(pattern, "tensor", "double"), "tensor"));
- TEST_DO(verify(strfmt(pattern, "double", "tensor"), "tensor"));
TEST_DO(verify(strfmt(pattern, "tensor(x{})", "double"), "tensor(x{})"));
TEST_DO(verify(strfmt(pattern, "double", "tensor(x{})"), "tensor(x{})"));
- TEST_DO(verify(strfmt(pattern, "tensor", "tensor"), "any"));
TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x{})"), "tensor(x{})"));
TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(y{})"), "tensor(x{},y{})"));
- TEST_DO(verify(strfmt(pattern, "tensor(x[3])", "tensor(x[5])"), "tensor(x[3])"));
- TEST_DO(verify(strfmt(pattern, "tensor(x[])", "tensor(x[5])"), "tensor(x[])"));
- TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[3])"), "tensor(x[3])"));
- TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[])"), "tensor(x[])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[5])"), "tensor(x[5])"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[3])", "tensor(x[5])"), "error"));
+ TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[3])"), "error"));
TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x[5])"), "error"));
}
@@ -249,7 +218,8 @@ TEST("require that lambda tensor resolves correct type") {
TEST("require that tensor concat resolves correct type") {
TEST_DO(verify("concat(double,double,x)", "tensor(x[2])"));
TEST_DO(verify("concat(tensor(x[2]),tensor(x[3]),x)", "tensor(x[5])"));
- TEST_DO(verify("concat(tensor(x[2]),tensor(x[3]),y)", "tensor(x[2],y[2])"));
+ TEST_DO(verify("concat(tensor(x[2]),tensor(x[2]),y)", "tensor(x[2],y[2])"));
+ TEST_DO(verify("concat(tensor(x[2]),tensor(x[3]),y)", "error"));
TEST_DO(verify("concat(tensor(x[2]),tensor(x{}),x)", "error"));
TEST_DO(verify("concat(tensor(x[2]),tensor(y{}),x)", "tensor(x[3],y{})"));
}
@@ -258,7 +228,7 @@ TEST("require that double only expressions can be detected") {
Function plain_fun = Function::parse("1+2");
Function complex_fun = Function::parse("reduce(a,sum)");
NodeTypes plain_types(plain_fun, {});
- NodeTypes complex_types(complex_fun, {ValueType::tensor_type({})});
+ NodeTypes complex_types(complex_fun, {ValueType::tensor_type({{"x"}})});
EXPECT_TRUE(plain_types.get_type(plain_fun.root()).is_double());
EXPECT_TRUE(complex_types.get_type(complex_fun.root()).is_double());
EXPECT_TRUE(plain_types.all_types_are_double());
@@ -269,7 +239,7 @@ TEST("require that empty type repo works as expected") {
NodeTypes types;
Function function = Function::parse("1+2");
EXPECT_FALSE(function.has_error());
- EXPECT_TRUE(types.get_type(function.root()).is_any());
+ EXPECT_TRUE(types.get_type(function.root()).is_error());
EXPECT_FALSE(types.all_types_are_double());
}
diff --git a/eval/src/tests/eval/tensor_function/tensor_function_test.cpp b/eval/src/tests/eval/tensor_function/tensor_function_test.cpp
index 23ea1e8c13a..741b756e46f 100644
--- a/eval/src/tests/eval/tensor_function/tensor_function_test.cpp
+++ b/eval/src/tests/eval/tensor_function/tensor_function_test.cpp
@@ -261,11 +261,16 @@ TEST("require that if_node result is mutable only when both children produce mut
const Node &cond = inject(DoubleValue::double_type(), 0, stash);
const Node &a = inject(ValueType::from_spec("tensor(x[2])"), 0, stash);
const Node &b = inject(ValueType::from_spec("tensor(x[3])"), 0, stash);
+ const Node &c = inject(ValueType::from_spec("tensor(x[5])"), 0, stash);
const Node &tmp = concat(a, b, "x", stash); // will be mutable
- const Node &if_con_con = if_node(cond, a, b, stash);
- const Node &if_mut_con = if_node(cond, tmp, b, stash);
- const Node &if_con_mut = if_node(cond, a, tmp, stash);
+ const Node &if_con_con = if_node(cond, c, c, stash);
+ const Node &if_mut_con = if_node(cond, tmp, c, stash);
+ const Node &if_con_mut = if_node(cond, c, tmp, stash);
const Node &if_mut_mut = if_node(cond, tmp, tmp, stash);
+ EXPECT_EQUAL(if_con_con.result_type(), c.result_type());
+ EXPECT_EQUAL(if_con_mut.result_type(), c.result_type());
+ EXPECT_EQUAL(if_mut_con.result_type(), c.result_type());
+ EXPECT_EQUAL(if_mut_mut.result_type(), c.result_type());
EXPECT_TRUE(!if_con_con.result_is_mutable());
EXPECT_TRUE(!if_mut_con.result_is_mutable());
EXPECT_TRUE(!if_con_mut.result_is_mutable());
@@ -277,21 +282,12 @@ TEST("require that if_node gets expected result type") {
const Node &a = inject(DoubleValue::double_type(), 0, stash);
const Node &b = inject(ValueType::from_spec("tensor(x[2])"), 0, stash);
const Node &c = inject(ValueType::from_spec("tensor(x[3])"), 0, stash);
- const Node &d = inject(ValueType::from_spec("tensor(x[])"), 0, stash);
- const Node &e = inject(ValueType::from_spec("tensor(y[3])"), 0, stash);
- const Node &f = inject(ValueType::from_spec("double"), 0, stash);
- const Node &g = inject(ValueType::from_spec("error"), 0, stash);
+ const Node &d = inject(ValueType::from_spec("error"), 0, stash);
const Node &if_same = if_node(a, b, b, stash);
- const Node &if_similar = if_node(a, b, c, stash);
- const Node &if_subtype = if_node(a, b, d, stash);
- const Node &if_different = if_node(a, b, e, stash);
- const Node &if_different_types = if_node(a, b, f, stash);
- const Node &if_with_error = if_node(a, b, g, stash);
+ const Node &if_different = if_node(a, b, c, stash);
+ const Node &if_with_error = if_node(a, b, d, stash);
EXPECT_EQUAL(if_same.result_type(), ValueType::from_spec("tensor(x[2])"));
- EXPECT_EQUAL(if_similar.result_type(), ValueType::from_spec("tensor(x[])"));
- EXPECT_EQUAL(if_subtype.result_type(), ValueType::from_spec("tensor(x[])"));
- EXPECT_EQUAL(if_different.result_type(), ValueType::from_spec("tensor"));
- EXPECT_EQUAL(if_different_types.result_type(), ValueType::from_spec("any"));
+ EXPECT_EQUAL(if_different.result_type(), ValueType::from_spec("error"));
EXPECT_EQUAL(if_with_error.result_type(), ValueType::from_spec("error"));
}
diff --git a/eval/src/tests/eval/value_type/value_type_test.cpp b/eval/src/tests/eval/value_type/value_type_test.cpp
index f7db7816fad..a755eac965f 100644
--- a/eval/src/tests/eval/value_type/value_type_test.cpp
+++ b/eval/src/tests/eval/value_type/value_type_test.cpp
@@ -10,12 +10,6 @@ using namespace vespalib::eval;
const size_t npos = ValueType::Dimension::npos;
-TEST("require that ANY value type can be created") {
- ValueType t = ValueType::any_type();
- EXPECT_TRUE(t.type() == ValueType::Type::ANY);
- EXPECT_EQUAL(t.dimensions().size(), 0u);
-}
-
TEST("require that ERROR value type can be created") {
ValueType t = ValueType::error_type();
EXPECT_TRUE(t.type() == ValueType::Type::ERROR);
@@ -61,10 +55,9 @@ TEST("require that dimension names can be obtained") {
TEST("require that dimension index can be obtained") {
EXPECT_EQUAL(ValueType::error_type().dimension_index("x"), ValueType::Dimension::npos);
- EXPECT_EQUAL(ValueType::any_type().dimension_index("x"), ValueType::Dimension::npos);
EXPECT_EQUAL(ValueType::double_type().dimension_index("x"), ValueType::Dimension::npos);
EXPECT_EQUAL(ValueType::tensor_type({}).dimension_index("x"), ValueType::Dimension::npos);
- auto my_type = ValueType::tensor_type({{"y", 10}, {"x"}, {"z", 0}});
+ auto my_type = ValueType::tensor_type({{"y", 10}, {"x"}, {"z", 5}});
EXPECT_EQUAL(my_type.dimension_index("x"), 0u);
EXPECT_EQUAL(my_type.dimension_index("y"), 1u);
EXPECT_EQUAL(my_type.dimension_index("z"), 2u);
@@ -72,29 +65,30 @@ TEST("require that dimension index can be obtained") {
}
void verify_equal(const ValueType &a, const ValueType &b) {
- EXPECT_TRUE(a == b);
- EXPECT_TRUE(b == a);
+ EXPECT_EQUAL(a, b);
+ EXPECT_EQUAL(b, a);
EXPECT_FALSE(a != b);
EXPECT_FALSE(b != a);
+ EXPECT_EQUAL(a, ValueType::either(a, b));
+ EXPECT_EQUAL(a, ValueType::either(b, a));
}
-
+
void verify_not_equal(const ValueType &a, const ValueType &b) {
EXPECT_TRUE(a != b);
EXPECT_TRUE(b != a);
EXPECT_FALSE(a == b);
EXPECT_FALSE(b == a);
+ EXPECT_TRUE(ValueType::either(a, b).is_error());
+ EXPECT_TRUE(ValueType::either(b, a).is_error());
}
TEST("require that value types can be compared") {
TEST_DO(verify_equal(ValueType::error_type(), ValueType::error_type()));
- TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::any_type()));
TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::double_type()));
- TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::tensor_type({})));
- TEST_DO(verify_equal(ValueType::any_type(), ValueType::any_type()));
- TEST_DO(verify_not_equal(ValueType::any_type(), ValueType::double_type()));
- TEST_DO(verify_not_equal(ValueType::any_type(), ValueType::tensor_type({})));
+ TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::tensor_type({{"x"}})));
TEST_DO(verify_equal(ValueType::double_type(), ValueType::double_type()));
- TEST_DO(verify_not_equal(ValueType::double_type(), ValueType::tensor_type({})));
+ TEST_DO(verify_equal(ValueType::double_type(), ValueType::tensor_type({})));
+ TEST_DO(verify_not_equal(ValueType::double_type(), ValueType::tensor_type({{"x"}})));
TEST_DO(verify_equal(ValueType::tensor_type({{"x"}, {"y"}}), ValueType::tensor_type({{"y"}, {"x"}})));
TEST_DO(verify_not_equal(ValueType::tensor_type({{"x"}, {"y"}}), ValueType::tensor_type({{"x"}, {"y"}, {"z"}})));
TEST_DO(verify_equal(ValueType::tensor_type({{"x", 10}, {"y", 20}}), ValueType::tensor_type({{"y", 20}, {"x", 10}})));
@@ -103,67 +97,55 @@ TEST("require that value types can be compared") {
}
void verify_predicates(const ValueType &type,
- bool expect_any, bool expect_error, bool expect_double, bool expect_tensor,
- bool expect_maybe_tensor, bool expect_abstract, bool expect_unknown_dimensions)
+ bool expect_error, bool expect_double, bool expect_tensor,
+ bool expect_sparse, bool expect_dense)
{
- EXPECT_EQUAL(type.is_any(), expect_any);
EXPECT_EQUAL(type.is_error(), expect_error);
EXPECT_EQUAL(type.is_double(), expect_double);
EXPECT_EQUAL(type.is_tensor(), expect_tensor);
- EXPECT_EQUAL(type.maybe_tensor(), expect_maybe_tensor);
- EXPECT_EQUAL(type.is_abstract(), expect_abstract);
- EXPECT_EQUAL(type.unknown_dimensions(), expect_unknown_dimensions);
+ EXPECT_EQUAL(type.is_sparse(), expect_sparse);
+ EXPECT_EQUAL(type.is_dense(), expect_dense);
}
TEST("require that type-related predicate functions work as expected") {
- TEST_DO(verify_predicates(ValueType::any_type(),
- true, false, false, false,
- true, true, true));
- TEST_DO(verify_predicates(ValueType::error_type(),
- false, true, false, false,
- false, false, false));
- TEST_DO(verify_predicates(ValueType::double_type(),
- false, false, true, false,
- false, false, false));
- TEST_DO(verify_predicates(ValueType::tensor_type({}),
- false, false, false, true,
- true, true, true));
- TEST_DO(verify_predicates(ValueType::tensor_type({{"x"}}),
- false, false, false, true,
- true, false, false));
- TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 0}}),
- false, false, false, true,
- true, true, false));
+ TEST_DO(verify_predicates(ValueType::error_type(), true, false, false, false, false));
+ TEST_DO(verify_predicates(ValueType::double_type(), false, true, false, false, false));
+ TEST_DO(verify_predicates(ValueType::tensor_type({}), false, true, false, false, false));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x"}}), false, false, true, true, false));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x"},{"y"}}), false, false, true, true, false));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 5}}), false, false, true, false, true));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 5},{"y", 10}}), false, false, true, false, true));
+ TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 5}, {"y"}}), false, false, true, false, false));
}
TEST("require that dimension predicates work as expected") {
- ValueType type = ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}});
- ASSERT_EQUAL(3u, type.dimensions().size());
- EXPECT_TRUE(type.dimensions()[0].is_mapped());
- EXPECT_TRUE(!type.dimensions()[0].is_indexed());
- EXPECT_TRUE(!type.dimensions()[0].is_bound());
- EXPECT_TRUE(!type.dimensions()[1].is_mapped());
- EXPECT_TRUE(type.dimensions()[1].is_indexed());
- EXPECT_TRUE(type.dimensions()[1].is_bound());
- EXPECT_TRUE(!type.dimensions()[2].is_mapped());
- EXPECT_TRUE(type.dimensions()[2].is_indexed());
- EXPECT_TRUE(!type.dimensions()[2].is_bound());
+ ValueType::Dimension x("x");
+ ValueType::Dimension y("y", 10);
+ ValueType::Dimension z("z", 0);
+ EXPECT_TRUE(x.is_mapped());
+ EXPECT_TRUE(!x.is_indexed());
+ EXPECT_TRUE(!x.is_bound());
+ EXPECT_TRUE(!y.is_mapped());
+ EXPECT_TRUE(y.is_indexed());
+ EXPECT_TRUE(y.is_bound());
+ EXPECT_TRUE(!z.is_mapped());
+ EXPECT_TRUE(z.is_indexed());
+ EXPECT_TRUE(!z.is_bound());
+}
+
+TEST("require that use of unbound dimensions result in error types") {
+ EXPECT_TRUE(ValueType::tensor_type({{"x", 0}}).is_error());
}
TEST("require that duplicate dimension names result in error types") {
EXPECT_TRUE(ValueType::tensor_type({{"x"}, {"x"}}).is_error());
}
-TEST("require that removing dimensions from non-abstract non-tensor types gives error type") {
+TEST("require that removing dimensions from non-tensor types gives error type") {
EXPECT_TRUE(ValueType::error_type().reduce({"x"}).is_error());
EXPECT_TRUE(ValueType::double_type().reduce({"x"}).is_error());
}
-TEST("require that removing dimensions from abstract maybe-tensor types gives any type") {
- EXPECT_TRUE(ValueType::any_type().reduce({"x"}).is_any());
- EXPECT_TRUE(ValueType::tensor_type({}).reduce({"x"}).is_any());
-}
-
TEST("require that dimensions can be removed from tensor value types") {
ValueType type = ValueType::tensor_type({{"x", 10}, {"y", 20}, {"z", 30}});
EXPECT_EQUAL(ValueType::tensor_type({{"y", 20}, {"z", 30}}), type.reduce({"x"}));
@@ -187,30 +169,22 @@ TEST("require that removing all dimensions gives double type") {
EXPECT_EQUAL(ValueType::double_type(), type.reduce({"x", "y", "z"}));
}
-TEST("require that dimensions can be combined for tensor value types") {
+TEST("require that dimensions can be combined for value types") {
ValueType tensor_type_xy = ValueType::tensor_type({{"x"}, {"y"}});
ValueType tensor_type_yz = ValueType::tensor_type({{"y"}, {"z"}});
ValueType tensor_type_xyz = ValueType::tensor_type({{"x"}, {"y"}, {"z"}});
ValueType tensor_type_y = ValueType::tensor_type({{"y"}});
+ ValueType tensor_type_a10 = ValueType::tensor_type({{"a", 10}});
+ ValueType tensor_type_a10xyz = ValueType::tensor_type({{"a", 10}, {"x"}, {"y"}, {"z"}});
+ ValueType scalar = ValueType::double_type();
+ EXPECT_EQUAL(ValueType::join(scalar, scalar), scalar);
EXPECT_EQUAL(ValueType::join(tensor_type_xy, tensor_type_yz), tensor_type_xyz);
EXPECT_EQUAL(ValueType::join(tensor_type_yz, tensor_type_xy), tensor_type_xyz);
EXPECT_EQUAL(ValueType::join(tensor_type_y, tensor_type_y), tensor_type_y);
-}
-
-TEST("require that indexed dimensions combine to the minimal dimension size") {
- ValueType tensor_0 = ValueType::tensor_type({{"x", 0}});
- ValueType tensor_10 = ValueType::tensor_type({{"x", 10}});
- ValueType tensor_20 = ValueType::tensor_type({{"x", 20}});
- EXPECT_EQUAL(ValueType::join(tensor_10, tensor_0), tensor_0);
- EXPECT_EQUAL(ValueType::join(tensor_10, tensor_10), tensor_10);
- EXPECT_EQUAL(ValueType::join(tensor_10, tensor_20), tensor_10);
-}
-
-void verify_combinable(const ValueType &a, const ValueType &b) {
- EXPECT_TRUE(!ValueType::join(a, b).is_error());
- EXPECT_TRUE(!ValueType::join(b, a).is_error());
- EXPECT_TRUE(!ValueType::join(a, b).is_any());
- EXPECT_TRUE(!ValueType::join(b, a).is_any());
+ EXPECT_EQUAL(ValueType::join(scalar, tensor_type_y), tensor_type_y);
+ EXPECT_EQUAL(ValueType::join(tensor_type_a10, tensor_type_a10), tensor_type_a10);
+ EXPECT_EQUAL(ValueType::join(tensor_type_a10, scalar), tensor_type_a10);
+ EXPECT_EQUAL(ValueType::join(tensor_type_xyz, tensor_type_a10), tensor_type_a10xyz);
}
void verify_not_combinable(const ValueType &a, const ValueType &b) {
@@ -218,70 +192,49 @@ void verify_not_combinable(const ValueType &a, const ValueType &b) {
EXPECT_TRUE(ValueType::join(b, a).is_error());
}
-void verify_maybe_combinable(const ValueType &a, const ValueType &b) {
- EXPECT_TRUE(ValueType::join(a, b).is_any());
- EXPECT_TRUE(ValueType::join(b, a).is_any());
-}
-
TEST("require that mapped and indexed dimensions are not combinable") {
verify_not_combinable(ValueType::tensor_type({{"x", 10}}), ValueType::tensor_type({{"x"}}));
}
-TEST("require that dimension combining is only allowed (yes/no/maybe) for appropriate types") {
- std::vector<ValueType> types = { ValueType::any_type(), ValueType::error_type(), ValueType::double_type(),
- ValueType::tensor_type({}), ValueType::tensor_type({{"x"}}) };
- for (size_t a = 0; a < types.size(); ++a) {
- for (size_t b = a; b < types.size(); ++b) {
- TEST_STATE(vespalib::make_string("a='%s', b='%s'", types[a].to_spec().c_str(), types[b].to_spec().c_str()).c_str());
- if (types[a].is_error() || types[b].is_error()) {
- verify_not_combinable(types[a], types[b]);
- } else if (types[a].is_any() || types[b].is_any()) {
- verify_maybe_combinable(types[a], types[b]);
- } else if (types[a].is_double() || types[b].is_double()) {
- verify_combinable(types[a], types[b]);
- } else if (types[a].unknown_dimensions() || types[b].unknown_dimensions()) {
- verify_maybe_combinable(types[a], types[b]);
- } else {
- verify_combinable(types[a], types[b]);
- }
- }
- }
+TEST("require that indexed dimensions of different sizes are not combinable") {
+ verify_not_combinable(ValueType::tensor_type({{"x", 10}}), ValueType::tensor_type({{"x", 20}}));
+}
+
+TEST("require that error type combined with anything produces error type") {
+ verify_not_combinable(ValueType::error_type(), ValueType::error_type());
+ verify_not_combinable(ValueType::error_type(), ValueType::double_type());
+ verify_not_combinable(ValueType::error_type(), ValueType::tensor_type({{"x"}}));
+ verify_not_combinable(ValueType::error_type(), ValueType::tensor_type({{"x", 10}}));
}
TEST("require that value type can make spec") {
- EXPECT_EQUAL("any", ValueType::any_type().to_spec());
EXPECT_EQUAL("error", ValueType::error_type().to_spec());
EXPECT_EQUAL("double", ValueType::double_type().to_spec());
- EXPECT_EQUAL("tensor", ValueType::tensor_type({}).to_spec());
+ EXPECT_EQUAL("double", ValueType::tensor_type({}).to_spec());
EXPECT_EQUAL("tensor(x{})", ValueType::tensor_type({{"x"}}).to_spec());
EXPECT_EQUAL("tensor(y[10])", ValueType::tensor_type({{"y", 10}}).to_spec());
- EXPECT_EQUAL("tensor(z[])", ValueType::tensor_type({{"z", 0}}).to_spec());
- EXPECT_EQUAL("tensor(x{},y[10],z[])", ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}).to_spec());
+ EXPECT_EQUAL("tensor(x{},y[10],z[5])", ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 5}}).to_spec());
}
TEST("require that value type spec can be parsed") {
- EXPECT_EQUAL(ValueType::any_type(), ValueType::from_spec("any"));
EXPECT_EQUAL(ValueType::double_type(), ValueType::from_spec("double"));
EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec("tensor"));
EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec("tensor()"));
EXPECT_EQUAL(ValueType::tensor_type({{"x"}}), ValueType::from_spec("tensor(x{})"));
EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor(y[10])"));
- EXPECT_EQUAL(ValueType::tensor_type({{"z", 0}}), ValueType::from_spec("tensor(z[])"));
- EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}), ValueType::from_spec("tensor(x{},y[10],z[])"));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 5}}), ValueType::from_spec("tensor(x{},y[10],z[5])"));
EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor<double>(y[10])"));
EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor<float>(y[10])"));
}
TEST("require that value type spec can be parsed with extra whitespace") {
- EXPECT_EQUAL(ValueType::any_type(), ValueType::from_spec(" any "));
EXPECT_EQUAL(ValueType::double_type(), ValueType::from_spec(" double "));
EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec(" tensor "));
EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec(" tensor ( ) "));
EXPECT_EQUAL(ValueType::tensor_type({{"x"}}), ValueType::from_spec(" tensor ( x { } ) "));
EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor ( y [ 10 ] ) "));
- EXPECT_EQUAL(ValueType::tensor_type({{"z", 0}}), ValueType::from_spec(" tensor ( z [ ] ) "));
- EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}),
- ValueType::from_spec(" tensor ( x { } , y [ 10 ] , z [ ] ) "));
+ EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 5}}),
+ ValueType::from_spec(" tensor ( x { } , y [ 10 ] , z [ 5 ] ) "));
EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor < double > ( y [ 10 ] ) "));
EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor < float > ( y [ 10 ] ) "));
}
@@ -290,6 +243,7 @@ TEST("require that malformed value type spec is parsed as error") {
EXPECT_TRUE(ValueType::from_spec("").is_error());
EXPECT_TRUE(ValueType::from_spec(" ").is_error());
EXPECT_TRUE(ValueType::from_spec("error").is_error());
+ EXPECT_TRUE(ValueType::from_spec("any").is_error());
EXPECT_TRUE(ValueType::from_spec("tensor tensor").is_error());
EXPECT_TRUE(ValueType::from_spec("tensor(x{10})").is_error());
EXPECT_TRUE(ValueType::from_spec("tensor(x{},)").is_error());
@@ -304,6 +258,7 @@ TEST("require that malformed value type spec is parsed as error") {
EXPECT_TRUE(ValueType::from_spec("tensor(x{},x{})").is_error());
EXPECT_TRUE(ValueType::from_spec("tensor(x{},x[10])").is_error());
EXPECT_TRUE(ValueType::from_spec("tensor(x{},x[])").is_error());
+ EXPECT_TRUE(ValueType::from_spec("tensor(z[])").is_error());
EXPECT_TRUE(ValueType::from_spec("tensor<float16>(x[10])").is_error());
}
@@ -327,15 +282,8 @@ ParseResult::ParseResult(const vespalib::string &spec_in)
ParseResult::~ParseResult() { }
TEST("require that we can parse a partial string into a type with the low-level API") {
- ParseResult result("tensor(a[]) , ");
- EXPECT_EQUAL(result.type, ValueType::tensor_type({{"a", 0}}));
- ASSERT_TRUE(result.after_inside());
- EXPECT_EQUAL(*result.after, ',');
-}
-
-TEST("require that we can parse an abstract tensor type from a partial string") {
- ParseResult result("tensor , ");
- EXPECT_EQUAL(result.type, ValueType::tensor_type({}));
+ ParseResult result("tensor(a[5]) , ");
+ EXPECT_EQUAL(result.type, ValueType::tensor_type({{"a", 5}}));
ASSERT_TRUE(result.after_inside());
EXPECT_EQUAL(*result.after, ',');
}
@@ -349,55 +297,28 @@ TEST("require that 'error' is the valid representation of the error type") {
EXPECT_TRUE(invalid.after == nullptr); // parse not ok
}
-TEST("require that a sparse type must be a tensor with dimensions that all are mapped") {
- EXPECT_TRUE(ValueType::from_spec("tensor(x{})").is_sparse());
- EXPECT_TRUE(ValueType::from_spec("tensor(x{},y{})").is_sparse());
- EXPECT_FALSE(ValueType::from_spec("tensor()").is_sparse());
- EXPECT_FALSE(ValueType::from_spec("tensor(x[])").is_sparse());
- EXPECT_FALSE(ValueType::from_spec("tensor(x{},y[])").is_sparse());
- EXPECT_FALSE(ValueType::from_spec("double").is_sparse());
- EXPECT_FALSE(ValueType::from_spec("any").is_sparse());
- EXPECT_FALSE(ValueType::from_spec("error").is_sparse());
-}
-
-TEST("require that a dense type must be a tensor with dimensions that all are indexed") {
- EXPECT_TRUE(ValueType::from_spec("tensor(x[])").is_dense());
- EXPECT_TRUE(ValueType::from_spec("tensor(x[],y[])").is_dense());
- EXPECT_FALSE(ValueType::from_spec("tensor()").is_dense());
- EXPECT_FALSE(ValueType::from_spec("tensor(x{})").is_dense());
- EXPECT_FALSE(ValueType::from_spec("tensor(x[],y{})").is_dense());
- EXPECT_FALSE(ValueType::from_spec("double").is_dense());
- EXPECT_FALSE(ValueType::from_spec("any").is_dense());
- EXPECT_FALSE(ValueType::from_spec("error").is_dense());
-}
-
TEST("require that tensor dimensions can be renamed") {
EXPECT_EQUAL(ValueType::from_spec("tensor(x{})").rename({"x"}, {"y"}),
ValueType::from_spec("tensor(y{})"));
- EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y[])").rename({"x","y"}, {"y","x"}),
- ValueType::from_spec("tensor(y{},x[])"));
+ EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y[5])").rename({"x","y"}, {"y","x"}),
+ ValueType::from_spec("tensor(y{},x[5])"));
EXPECT_EQUAL(ValueType::from_spec("tensor(x{})").rename({"x"}, {"x"}),
ValueType::from_spec("tensor(x{})"));
EXPECT_EQUAL(ValueType::from_spec("tensor(x{})").rename({}, {}), ValueType::error_type());
EXPECT_EQUAL(ValueType::double_type().rename({}, {}), ValueType::error_type());
EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y{})").rename({"x"}, {"y","z"}), ValueType::error_type());
EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y{})").rename({"x","y"}, {"z"}), ValueType::error_type());
- EXPECT_EQUAL(ValueType::tensor_type({}).rename({"x"}, {"y"}), ValueType::any_type());
- EXPECT_EQUAL(ValueType::any_type().rename({"x"}, {"y"}), ValueType::any_type());
EXPECT_EQUAL(ValueType::double_type().rename({"a"}, {"b"}), ValueType::error_type());
EXPECT_EQUAL(ValueType::error_type().rename({"a"}, {"b"}), ValueType::error_type());
}
TEST("require that types can be concatenated") {
ValueType error = ValueType::error_type();
- ValueType any = ValueType::any_type();
- ValueType tensor = ValueType::tensor_type({});
ValueType scalar = ValueType::double_type();
ValueType vx_2 = ValueType::from_spec("tensor(x[2])");
ValueType vx_m = ValueType::from_spec("tensor(x{})");
ValueType vx_3 = ValueType::from_spec("tensor(x[3])");
ValueType vx_5 = ValueType::from_spec("tensor(x[5])");
- ValueType vx_any = ValueType::from_spec("tensor(x[])");
ValueType vy_7 = ValueType::from_spec("tensor(y[7])");
ValueType mxy_22 = ValueType::from_spec("tensor(x[2],y[2])");
ValueType mxy_52 = ValueType::from_spec("tensor(x[5],y[2])");
@@ -407,30 +328,20 @@ TEST("require that types can be concatenated") {
EXPECT_EQUAL(ValueType::concat(error, vx_2, "x"), error);
EXPECT_EQUAL(ValueType::concat(vx_2, error, "x"), error);
- EXPECT_EQUAL(ValueType::concat(error, any, "x"), error);
- EXPECT_EQUAL(ValueType::concat(any, error, "x"), error);
EXPECT_EQUAL(ValueType::concat(vx_m, vx_2, "x"), error);
EXPECT_EQUAL(ValueType::concat(vx_2, vx_m, "x"), error);
EXPECT_EQUAL(ValueType::concat(vx_m, vx_m, "x"), error);
EXPECT_EQUAL(ValueType::concat(vx_m, scalar, "x"), error);
EXPECT_EQUAL(ValueType::concat(scalar, vx_m, "x"), error);
+ EXPECT_EQUAL(ValueType::concat(vx_2, vx_3, "y"), error);
EXPECT_EQUAL(ValueType::concat(vy_7, vx_m, "z"), cxyz_m72);
- EXPECT_EQUAL(ValueType::concat(tensor, vx_2, "x"), any);
- EXPECT_EQUAL(ValueType::concat(vx_2, tensor, "x"), any);
- EXPECT_EQUAL(ValueType::concat(any, vx_2, "x"), any);
- EXPECT_EQUAL(ValueType::concat(vx_2, any, "x"), any);
- EXPECT_EQUAL(ValueType::concat(any, tensor, "x"), any);
- EXPECT_EQUAL(ValueType::concat(tensor, any, "x"), any);
EXPECT_EQUAL(ValueType::concat(scalar, scalar, "x"), vx_2);
EXPECT_EQUAL(ValueType::concat(vx_2, scalar, "x"), vx_3);
EXPECT_EQUAL(ValueType::concat(scalar, vx_2, "x"), vx_3);
EXPECT_EQUAL(ValueType::concat(vx_2, vx_3, "x"), vx_5);
- EXPECT_EQUAL(ValueType::concat(vx_2, vx_any, "x"), vx_any);
- EXPECT_EQUAL(ValueType::concat(vx_any, vx_2, "x"), vx_any);
EXPECT_EQUAL(ValueType::concat(scalar, vx_2, "y"), mxy_22);
EXPECT_EQUAL(ValueType::concat(vx_2, scalar, "y"), mxy_22);
- EXPECT_EQUAL(ValueType::concat(vx_2, vx_3, "y"), mxy_22);
- EXPECT_EQUAL(ValueType::concat(vx_3, vx_2, "y"), mxy_22);
+ EXPECT_EQUAL(ValueType::concat(vx_2, vx_2, "y"), mxy_22);
EXPECT_EQUAL(ValueType::concat(mxy_22, vx_3, "x"), mxy_52);
EXPECT_EQUAL(ValueType::concat(vx_3, mxy_22, "x"), mxy_52);
EXPECT_EQUAL(ValueType::concat(mxy_22, vy_7, "y"), mxy_29);
@@ -438,34 +349,4 @@ TEST("require that types can be concatenated") {
EXPECT_EQUAL(ValueType::concat(vx_5, vy_7, "z"), cxyz_572);
}
-TEST("require that 'either' gives appropriate type") {
- ValueType error = ValueType::error_type();
- ValueType any = ValueType::any_type();
- ValueType tensor = ValueType::tensor_type({});
- ValueType scalar = ValueType::double_type();
- ValueType vx_2 = ValueType::from_spec("tensor(x[2])");
- ValueType vx_m = ValueType::from_spec("tensor(x{})");
- ValueType vx_3 = ValueType::from_spec("tensor(x[3])");
- ValueType vx_any = ValueType::from_spec("tensor(x[])");
- ValueType vy_2 = ValueType::from_spec("tensor(y[2])");
- ValueType mxy_22 = ValueType::from_spec("tensor(x[2],y[2])");
- ValueType mxy_23 = ValueType::from_spec("tensor(x[2],y[3])");
- ValueType mxy_32 = ValueType::from_spec("tensor(x[3],y[2])");
- ValueType mxy_any2 = ValueType::from_spec("tensor(x[],y[2])");
- ValueType mxy_2any = ValueType::from_spec("tensor(x[2],y[])");
-
- EXPECT_EQUAL(ValueType::either(vx_2, error), error);
- EXPECT_EQUAL(ValueType::either(error, vx_2), error);
- EXPECT_EQUAL(ValueType::either(vx_2, vx_2), vx_2);
- EXPECT_EQUAL(ValueType::either(vx_2, scalar), any);
- EXPECT_EQUAL(ValueType::either(scalar, vx_2), any);
- EXPECT_EQUAL(ValueType::either(vx_2, mxy_22), tensor);
- EXPECT_EQUAL(ValueType::either(tensor, vx_2), tensor);
- EXPECT_EQUAL(ValueType::either(vx_2, vy_2), tensor);
- EXPECT_EQUAL(ValueType::either(vx_2, vx_m), tensor);
- EXPECT_EQUAL(ValueType::either(vx_2, vx_3), vx_any);
- EXPECT_EQUAL(ValueType::either(mxy_22, mxy_23), mxy_2any);
- EXPECT_EQUAL(ValueType::either(mxy_32, mxy_22), mxy_any2);
-}
-
TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp b/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp
index ce321b7c3c3..9b46fc3393a 100644
--- a/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp
+++ b/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp
@@ -27,7 +27,6 @@ EvalFixture::ParamRepo make_params() {
.add("x5", spec({x(5)}, N()))
.add("x5y1", spec({x(5),y(1)}, N()))
.add("y1z1", spec({y(1),z(1)}, N()))
- .add("x5_u", spec({x(5)}, N()), "tensor(x[])")
.add("x_m", spec({x({"a"})}, N()));
}
EvalFixture::ParamRepo param_repo = make_params();
@@ -80,15 +79,11 @@ TEST("require that non-canonical dimension addition is not optimized") {
}
TEST("require that dimension addition with overlapping dimensions is not optimized") {
- TEST_DO(verify_not_optimized("x5*tensor(x[1],y[1])(1)"));
- TEST_DO(verify_not_optimized("tensor(x[1],y[1])(1)*x5"));
TEST_DO(verify_not_optimized("x5y1*tensor(y[1],z[1])(1)"));
TEST_DO(verify_not_optimized("tensor(y[1],z[1])(1)*x5y1"));
}
TEST("require that dimension addition with inappropriate dimensions is not optimized") {
- TEST_DO(verify_not_optimized("x5_u*tensor(y[1])(1)"));
- TEST_DO(verify_not_optimized("tensor(y[1])(1)*x5_u"));
TEST_DO(verify_not_optimized("x_m*tensor(y[1])(1)"));
TEST_DO(verify_not_optimized("tensor(y[1])(1)*x_m"));
}
diff --git a/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp b/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp
index 60830e4abd7..fae5db75618 100644
--- a/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp
+++ b/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp
@@ -62,11 +62,6 @@ TEST("require that basic dot product with equal sizes is correct") {
check_gen_with_result(2, 2, (3.0 * 5.0) + (4.0 * 6.0));
}
-TEST("require that basic dot product with un-equal sizes is correct") {
- check_gen_with_result(2, 3, (3.0 * 5.0) + (4.0 * 6.0));
- check_gen_with_result(3, 2, (3.0 * 5.0) + (4.0 * 6.0));
-}
-
//-----------------------------------------------------------------------------
void assertDotProduct(size_t numCells) {
@@ -98,18 +93,6 @@ TEST("require that dot product with equal sizes is correct") {
TEST_DO(assertDotProduct(1024 + 3));
}
-TEST("require that dot product with un-equal sizes is correct") {
- TEST_DO(assertDotProduct(8, 8 + 3));
- TEST_DO(assertDotProduct(8 + 3, 8));
- TEST_DO(assertDotProduct(16, 16 + 3));
- TEST_DO(assertDotProduct(32, 32 + 3));
- TEST_DO(assertDotProduct(64, 64 + 3));
- TEST_DO(assertDotProduct(128, 128 + 3));
- TEST_DO(assertDotProduct(256, 256 + 3));
- TEST_DO(assertDotProduct(512, 512 + 3));
- TEST_DO(assertDotProduct(1024, 1024 + 3));
-}
-
//-----------------------------------------------------------------------------
EvalFixture::ParamRepo make_params() {
@@ -120,14 +103,8 @@ EvalFixture::ParamRepo make_params() {
.add("v04_y3", spec({y(3)}, MyVecSeq(10)))
.add("v05_x5", spec({x(5)}, MyVecSeq(6.0)))
.add("v06_x5", spec({x(5)}, MyVecSeq(7.0)))
- .add("v07_x3_a", spec({x(3)}, MyVecSeq(8.0)), "any")
- .add("v08_x3_u", spec({x(3)}, MyVecSeq(9.0)), "tensor(x[])")
- .add("v09_x4_u", spec({x(4)}, MyVecSeq(3.0)), "tensor(x[])")
.add("m01_x3y3", spec({x(3),y(3)}, MyVecSeq(1.0)))
- .add("m02_x2y3", spec({x(2),y(3)}, MyVecSeq(2.0)))
- .add("m03_x3y2", spec({x(3),y(2)}, MyVecSeq(3.0)))
- .add("m04_xuy3", spec({x(3),y(3)}, MyVecSeq(4.0)), "tensor(x[],y[3])")
- .add("m05_x3yu", spec({x(3),y(3)}, MyVecSeq(5.0)), "tensor(x[3],y[])");
+ .add("m02_x3y3", spec({x(3),y(3)}, MyVecSeq(2.0)));
}
EvalFixture::ParamRepo param_repo = make_params();
@@ -146,11 +123,6 @@ void assertNotOptimized(const vespalib::string &expr) {
EXPECT_TRUE(info.empty());
}
-TEST("require that dot product is not optimized for unknown types") {
- TEST_DO(assertNotOptimized("reduce(v02_x3*v07_x3_a,sum)"));
- TEST_DO(assertNotOptimized("reduce(v07_x3_a*v03_x3,sum)"));
-}
-
TEST("require that dot product works with tensor function") {
TEST_DO(assertOptimized("reduce(v05_x5*v06_x5,sum)"));
TEST_DO(assertOptimized("reduce(v05_x5*v06_x5,sum,x)"));
@@ -162,18 +134,11 @@ TEST("require that dot product with compatible dimensions is optimized") {
TEST_DO(assertOptimized("reduce(v01_x1*v01_x1,sum)"));
TEST_DO(assertOptimized("reduce(v02_x3*v03_x3,sum)"));
TEST_DO(assertOptimized("reduce(v05_x5*v06_x5,sum)"));
-
- TEST_DO(assertOptimized("reduce(v02_x3*v06_x5,sum)"));
- TEST_DO(assertOptimized("reduce(v05_x5*v03_x3,sum)"));
- TEST_DO(assertOptimized("reduce(v08_x3_u*v05_x5,sum)"));
- TEST_DO(assertOptimized("reduce(v05_x5*v08_x3_u,sum)"));
}
TEST("require that dot product with incompatible dimensions is NOT optimized") {
TEST_DO(assertNotOptimized("reduce(v02_x3*v04_y3,sum)"));
TEST_DO(assertNotOptimized("reduce(v04_y3*v02_x3,sum)"));
- TEST_DO(assertNotOptimized("reduce(v08_x3_u*v04_y3,sum)"));
- TEST_DO(assertNotOptimized("reduce(v04_y3*v08_x3_u,sum)"));
TEST_DO(assertNotOptimized("reduce(v02_x3*m01_x3y3,sum)"));
TEST_DO(assertNotOptimized("reduce(m01_x3y3*v02_x3,sum)"));
}
@@ -188,11 +153,8 @@ TEST("require that expressions similar to dot product are not optimized") {
}
TEST("require that multi-dimensional dot product can be optimized") {
- TEST_DO(assertOptimized("reduce(m01_x3y3*m02_x2y3,sum)"));
- TEST_DO(assertOptimized("reduce(m02_x2y3*m01_x3y3,sum)"));
- TEST_DO(assertOptimized("reduce(m01_x3y3*m04_xuy3,sum)"));
- TEST_DO(assertOptimized("reduce(m04_xuy3*m01_x3y3,sum)"));
- TEST_DO(assertOptimized("reduce(m04_xuy3*m04_xuy3,sum)"));
+ TEST_DO(assertOptimized("reduce(m01_x3y3*m02_x3y3,sum)"));
+ TEST_DO(assertOptimized("reduce(m02_x3y3*m01_x3y3,sum)"));
}
TEST("require that result must be double to trigger optimization") {
@@ -201,14 +163,6 @@ TEST("require that result must be double to trigger optimization") {
TEST_DO(assertNotOptimized("reduce(m01_x3y3*m01_x3y3,sum,y)"));
}
-TEST("require that additional dimensions must have matching size") {
- TEST_DO(assertOptimized("reduce(m01_x3y3*m01_x3y3,sum)"));
- TEST_DO(assertNotOptimized("reduce(m01_x3y3*m03_x3y2,sum)"));
- TEST_DO(assertNotOptimized("reduce(m03_x3y2*m01_x3y3,sum)"));
- TEST_DO(assertNotOptimized("reduce(m01_x3y3*m05_x3yu,sum)"));
- TEST_DO(assertNotOptimized("reduce(m05_x3yu*m01_x3y3,sum)"));
-}
-
void verify_compatible(const vespalib::string &a, const vespalib::string &b) {
auto a_type = ValueType::from_spec(a);
auto b_type = ValueType::from_spec(b);
@@ -231,13 +185,9 @@ TEST("require that type compatibility test is appropriate") {
TEST_DO(verify_compatible("tensor(x[5])", "tensor(x[5])"));
TEST_DO(verify_not_compatible("tensor(x[5])", "tensor(y[5])"));
TEST_DO(verify_compatible("tensor(x[5])", "tensor(x[3])"));
- TEST_DO(verify_compatible("tensor(x[])", "tensor(x[3])"));
TEST_DO(verify_compatible("tensor(x[3],y[7],z[9])", "tensor(x[5],y[7],z[9])"));
- TEST_DO(verify_compatible("tensor(x[3],y[7],z[9])", "tensor(x[],y[7],z[9])"));
TEST_DO(verify_not_compatible("tensor(x[5],y[7],z[9])", "tensor(x[5],y[5],z[9])"));
- TEST_DO(verify_not_compatible("tensor(x[5],y[],z[9])", "tensor(x[5],y[7],z[9])"));
TEST_DO(verify_not_compatible("tensor(x[5],y[7],z[9])", "tensor(x[5],y[7],z[5])"));
- TEST_DO(verify_not_compatible("tensor(x[5],y[7],z[])", "tensor(x[5],y[7],z[9])"));
}
//-----------------------------------------------------------------------------
diff --git a/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp b/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp
index c892ed02808..10b4c622a0a 100644
--- a/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp
+++ b/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp
@@ -25,7 +25,6 @@ const TensorEngine &prod_engine = DefaultTensorEngine::ref();
EvalFixture::ParamRepo make_params() {
return EvalFixture::ParamRepo()
.add("x5", spec({x(5)}, N()))
- .add("x5_u", spec({x(5)}, N()), "tensor(x[])")
.add("x_m", spec({x({"a", "b", "c"})}, N()))
.add("x5y3", spec({x(5),y(3)}, N()));
}
@@ -64,10 +63,6 @@ TEST("require that transposing dense renames are not optimized") {
TEST_DO(verify_not_optimized("rename(x5y3,(y,x),(a,b))"));
}
-TEST("require that abstract dense renames are not optimized") {
- TEST_DO(verify_not_optimized("rename(x5_u,x,y)"));
-}
-
TEST("require that non-dense renames are not optimized") {
TEST_DO(verify_not_optimized("rename(x_m,x,y)"));
}
diff --git a/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp b/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp
index 3a5b27965d0..7ee603e1763 100644
--- a/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp
+++ b/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp
@@ -45,10 +45,8 @@ EvalFixture::ParamRepo make_params() {
.add_mutable("mut_x5_A", spec({x(5)}, seq))
.add_mutable("mut_x5_B", spec({x(5)}, seq))
.add_mutable("mut_x5_C", spec({x(5)}, seq))
- .add_mutable("mut_x4", spec({x(4)}, seq))
.add_mutable("mut_x5y3_A", spec({x(5),y(3)}, seq))
.add_mutable("mut_x5y3_B", spec({x(5),y(3)}, seq))
- .add_mutable("mut_x5_unbound", spec({x(5)}, seq), "tensor(x[])")
.add_mutable("mut_x_sparse", spec({x({"a", "b", "c"})}, seq));
}
EvalFixture::ParamRepo param_repo = make_params();
@@ -112,8 +110,6 @@ TEST("require that join(tensor,scalar) operations are not optimized") {
}
TEST("require that join with different tensor shapes are not optimized") {
- TEST_DO(verify_not_optimized("mut_x5_A-mut_x4"));
- TEST_DO(verify_not_optimized("mut_x4-mut_x5_A"));
TEST_DO(verify_not_optimized("mut_x5_A*mut_x5y3_B"));
}
@@ -124,12 +120,6 @@ TEST("require that inplace join operations can be chained") {
TEST_DO(verify_p2_optimized("con_x5_A-(con_x5_B-mut_x5_C)", 2));
}
-TEST("require that abstract tensors are not optimized") {
- TEST_DO(verify_not_optimized("mut_x5_unbound+mut_x5_A"));
- TEST_DO(verify_not_optimized("mut_x5_A+mut_x5_unbound"));
- TEST_DO(verify_not_optimized("mut_x5_unbound+mut_x5_unbound"));
-}
-
TEST("require that non-mutable tensors are not optimized") {
TEST_DO(verify_not_optimized("con_x5_A+con_x5_B"));
}
diff --git a/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp b/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp
index 77af747a066..a17b7e02eb8 100644
--- a/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp
+++ b/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp
@@ -27,7 +27,6 @@ EvalFixture::ParamRepo make_params() {
.add_mutable("_d", spec(5.0))
.add_mutable("_x5", spec({x(5)}, N()))
.add_mutable("_x5y3", spec({x(5),y(3)}, N()))
- .add_mutable("_x5_u", spec({x(5)}, N()), "tensor(x[])")
.add_mutable("_x_m", spec({x({"a", "b", "c"})}, N()));
}
EvalFixture::ParamRepo param_repo = make_params();
@@ -60,10 +59,6 @@ TEST("require that inplace map operations can be chained") {
TEST_DO(verify_optimized("map(map(_x5,f(x)(x+10)),f(x)(x-5))", 2));
}
-TEST("require that abstract tensors are not optimized") {
- TEST_DO(verify_not_optimized("map(_x5_u,f(x)(x+10))"));
-}
-
TEST("require that non-mutable tensors are not optimized") {
TEST_DO(verify_not_optimized("map(x5,f(x)(x+10))"));
}
diff --git a/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp b/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp
index b87393c2980..ac451d10b50 100644
--- a/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp
+++ b/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp
@@ -26,7 +26,6 @@ EvalFixture::ParamRepo make_params() {
return EvalFixture::ParamRepo()
.add("x1y5z1", spec({x(1),y(5),z(1)}, N()))
.add("x1y1z1", spec({x(1),y(1),z(1)}, N()))
- .add("x1y5z1_u", spec({x(1),y(5),z(1)}, N()), "tensor(x[1],y[5],z[])")
.add("x1y5z_m", spec({x(1),y(5),z({"a"})}, N()));
}
EvalFixture::ParamRepo param_repo = make_params();
@@ -74,8 +73,6 @@ TEST("require that full reduce is not optimized") {
}
TEST("require that inappropriate tensor types cannot be optimized") {
- TEST_DO(verify_not_optimized("reduce(x1y5z1_u,sum,x)"));
- TEST_DO(verify_not_optimized("reduce(x1y5z1_u,sum,z)"));
TEST_DO(verify_not_optimized("reduce(x1y5z_m,sum,x)"));
TEST_DO(verify_not_optimized("reduce(x1y5z_m,sum,z)"));
}
diff --git a/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp b/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp
index f18e72b0d07..b55e223ab07 100644
--- a/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp
+++ b/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp
@@ -49,12 +49,7 @@ EvalFixture::ParamRepo make_params() {
.add("x8y5", spec({x(8),y(5)}, MyMatSeq()))
.add("y5z8", spec({y(5),z(8)}, MyMatSeq()))
.add("x5y16", spec({x(5),y(16)}, MyMatSeq()))
- .add("y16z5", spec({y(16),z(5)}, MyMatSeq()))
- .add("a_y3", spec({y(3)}, MyVecSeq()), "any")
- .add("y3_u", spec({y(3)}, MyVecSeq()), "tensor(y[])")
- .add("a_x2y3", spec({x(2),y(3)}, MyMatSeq()), "any")
- .add("x2_uy3", spec({x(2),y(3)}, MyMatSeq()), "tensor(x[],y[3])")
- .add("x2y3_u", spec({x(2),y(3)}, MyMatSeq()), "tensor(x[2],y[])");
+ .add("y16z5", spec({y(16),z(5)}, MyMatSeq()));
}
EvalFixture::ParamRepo param_repo = make_params();
@@ -91,14 +86,6 @@ TEST("require that xw product gives same results as reference join/reduce") {
TEST_DO(verify_optimized("reduce(y16*y16z5,sum,y)", 16, 5, false));
}
-TEST("require that xw product is not optimized for abstract types") {
- TEST_DO(verify_not_optimized("reduce(a_y3*x2y3,sum)"));
- TEST_DO(verify_not_optimized("reduce(y3*a_x2y3,sum)"));
- TEST_DO(verify_not_optimized("reduce(y3_u*x2y3,sum)"));
- TEST_DO(verify_not_optimized("reduce(y3*x2_uy3,sum)"));
- TEST_DO(verify_not_optimized("reduce(y3*x2y3_u,sum)"));
-}
-
TEST("require that various variants of xw product can be optimized") {
TEST_DO(verify_optimized("reduce(y3*x2y3,sum,y)", 3, 2, true));
TEST_DO(verify_optimized("reduce(x2y3*y3,sum,y)", 3, 2, true));
@@ -118,8 +105,6 @@ TEST("require that expressions similar to xw product are not optimized") {
}
TEST("require that xw products with incompatible dimensions are not optimized") {
- TEST_DO(verify_not_optimized("reduce(y3*x1y1,sum,y)"));
- TEST_DO(verify_not_optimized("reduce(y3*x8y5,sum,y)"));
TEST_DO(verify_not_optimized("reduce(y3*x2z3,sum,y)"));
TEST_DO(verify_not_optimized("reduce(y3*x2z3,sum,z)"));
}
diff --git a/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp b/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp
index 124295a500d..60b17930f0b 100644
--- a/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp
+++ b/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp
@@ -96,48 +96,6 @@ TEST("require that sparse tensors can be mapped to dense type") {
.add({{"x",1},{"y",2}}, 0)));
}
-TEST("require that sparse tensors can be mapped to abstract dense type") {
- TEST_DO(verify(TensorSpec("tensor(x{},y{})")
- .add({{"x","0"},{"y","0"}}, 1)
- .add({{"x","1"},{"y","0"}}, 3)
- .add({{"x","0"},{"y","1"}}, 5)
- .add({{"x","10"},{"y","1"}}, 7),
- "tensor(x[2],y[])",
- TensorSpec("tensor(x[2],y[2])")
- .add({{"x",0},{"y",0}}, 1)
- .add({{"x",0},{"y",1}}, 5)
- .add({{"x",1},{"y",0}}, 3)
- .add({{"x",1},{"y",1}}, 0)));
-
- TEST_DO(verify(TensorSpec("tensor(x{},y{})")
- .add({{"x","0"},{"y","0"}}, 1)
- .add({{"x","1"},{"y","0"}}, 3)
- .add({{"x","0"},{"y","1"}}, 5)
- .add({{"x","2"},{"y","0"}}, 7),
- "tensor(x[],y[])",
- TensorSpec("tensor(x[3],y[2])")
- .add({{"x",0},{"y",0}}, 1)
- .add({{"x",0},{"y",1}}, 5)
- .add({{"x",1},{"y",0}}, 3)
- .add({{"x",1},{"y",1}}, 0)
- .add({{"x",2},{"y",0}}, 7)
- .add({{"x",2},{"y",1}}, 0)));
-
- TEST_DO(verify(TensorSpec("tensor(x{},y{})")
- .add({{"x","0"},{"y","0"}}, 1)
- .add({{"x","1"},{"y","0"}}, 3)
- .add({{"x","0"},{"y","1"}}, 5)
- .add({{"x","10"},{"y","3"}}, 7),
- "tensor(x[],y[3])",
- TensorSpec("tensor(x[2],y[3])")
- .add({{"x",0},{"y",0}}, 1)
- .add({{"x",0},{"y",1}}, 5)
- .add({{"x",0},{"y",2}}, 0)
- .add({{"x",1},{"y",0}}, 3)
- .add({{"x",1},{"y",1}}, 0)
- .add({{"x",1},{"y",2}}, 0)));
-}
-
TEST("require that dense tensors can be mapped to sparse type") {
TEST_DO(verify(TensorSpec("tensor(x[2],y[2])")
.add({{"x",0},{"y",0}}, 1)
@@ -168,7 +126,7 @@ TEST("require that mixed tensors can be mapped to dense type") {
.add({{"x",0},{"y","1"}}, 3)
.add({{"x",1},{"y","0"}}, 5)
.add({{"x",1},{"y","1"}}, 7),
- "tensor(y[])",
+ "tensor(y[2])",
TensorSpec("tensor(y[2])")
.add({{"y",0}}, 6)
.add({{"y",1}}, 10)));
@@ -180,7 +138,7 @@ TEST("require that mixed tensors can be mapped to mixed type") {
.add({{"x",0},{"y","1"}}, 3)
.add({{"x",1},{"y","0"}}, 5)
.add({{"x",1},{"y","1"}}, 7),
- "tensor(x{},y[])",
+ "tensor(x{},y[2])",
TensorSpec("tensor(x{},y[2])")
.add({{"x","0"},{"y",0}}, 1)
.add({{"x","0"},{"y",1}}, 3)
@@ -194,7 +152,7 @@ TEST("require that dense tensors can be mapped to mixed type") {
.add({{"x",0},{"y",1}}, 3)
.add({{"x",1},{"y",0}}, 5)
.add({{"x",1},{"y",1}}, 7),
- "tensor(x{},y[])",
+ "tensor(x{},y[2])",
TensorSpec("tensor(x{},y[2])")
.add({{"x","0"},{"y",0}}, 1)
.add({{"x","0"},{"y",1}}, 3)
@@ -208,7 +166,7 @@ TEST("require that sparse tensors can be mapped to mixed type") {
.add({{"x","0"},{"y","1"}}, 3)
.add({{"x","1"},{"y","0"}}, 5)
.add({{"x","1"},{"y","1"}}, 7),
- "tensor(x[],y{})",
+ "tensor(x[2],y{})",
TensorSpec("tensor(x[2],y{})")
.add({{"x",0},{"y","0"}}, 1)
.add({{"x",0},{"y","1"}}, 3)
@@ -225,14 +183,14 @@ TEST("require that missing dimensions are added appropriately") {
TEST_DO(verify(TensorSpec("tensor(x[1])")
.add({{"x",0}}, 42),
- "tensor(x[1],y[],z[2])",
+ "tensor(x[1],y[1],z[2])",
TensorSpec("tensor(x[1],y[1],z[2])")
.add({{"x",0},{"y",0},{"z",0}}, 42)
.add({{"x",0},{"y",0},{"z",1}}, 0)));
TEST_DO(verify(TensorSpec("tensor(a{})")
.add({{"a","foo"}}, 42),
- "tensor(a{},b[],c{},d[2])",
+ "tensor(a{},b[1],c{},d[2])",
TensorSpec("tensor(a{},b[1],c{},d[2])")
.add({{"a","foo"},{"b",0},{"c",""},{"d",0}}, 42)
.add({{"a","foo"},{"b",0},{"c",""},{"d",1}}, 0)));
diff --git a/eval/src/vespa/eval/eval/node_types.cpp b/eval/src/vespa/eval/eval/node_types.cpp
index c85c81b3752..94e69aadf55 100644
--- a/eval/src/vespa/eval/eval/node_types.cpp
+++ b/eval/src/vespa/eval/eval/node_types.cpp
@@ -183,7 +183,7 @@ TypeResolver::~TypeResolver() {}
} // namespace vespalib::eval::nodes
NodeTypes::NodeTypes()
- : _not_found(ValueType::any_type()),
+ : _not_found(ValueType::error_type()),
_type_map()
{
}
diff --git a/eval/src/vespa/eval/eval/node_types.h b/eval/src/vespa/eval/eval/node_types.h
index 0b049598f4c..a9ddf371c31 100644
--- a/eval/src/vespa/eval/eval/node_types.h
+++ b/eval/src/vespa/eval/eval/node_types.h
@@ -16,7 +16,7 @@ class Function;
* calculations for a single function. The constructor performs type
* resolution for each node in the AST based on the type of all
* function parameters. The default constructor creates an empty type
- * repo representing an unknown number of unknown values.
+ * repo where all lookups will result in error types.
**/
class NodeTypes
{
diff --git a/eval/src/vespa/eval/eval/simple_tensor.cpp b/eval/src/vespa/eval/eval/simple_tensor.cpp
index 1bce8983666..36c18183c8a 100644
--- a/eval/src/vespa/eval/eval/simple_tensor.cpp
+++ b/eval/src/vespa/eval/eval/simple_tensor.cpp
@@ -24,7 +24,6 @@ constexpr uint32_t FLOAT_CELL_TYPE = 1;
void assert_type(const ValueType &type) {
(void) type;
- assert(!type.is_abstract());
assert(type.is_double() || type.is_tensor());
}
diff --git a/eval/src/vespa/eval/eval/test/eval_fixture.cpp b/eval/src/vespa/eval/eval/test/eval_fixture.cpp
index bd4dcc37e3c..321b472a3fa 100644
--- a/eval/src/vespa/eval/eval/test/eval_fixture.cpp
+++ b/eval/src/vespa/eval/eval/test/eval_fixture.cpp
@@ -68,7 +68,6 @@ std::vector<Value::UP> make_params(const TensorEngine &engine, const Function &f
auto pos = param_repo.map.find(function.param_name(i));
ASSERT_TRUE(pos != param_repo.map.end());
result.push_back(engine.from_spec(pos->second.value));
- ASSERT_TRUE(!result.back()->type().is_abstract());
}
return result;
}
diff --git a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp
index 7060bb76544..8cbc7507592 100644
--- a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp
+++ b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp
@@ -597,14 +597,6 @@ struct TestContext {
spec({x(1),y(1)}, Seq({ 3 })),
spec({x(1),y(1)}, Seq({ 5 }))));
TEST_DO(test_apply_op(eval,
- spec(x(1), Seq({ op(3, 0) })),
- spec(x(1), Seq({ 3 })),
- spec(x(2), Seq({ 0, 7 }))));
- TEST_DO(test_apply_op(eval,
- spec(x(1), Seq({ op(0, 5) })),
- spec(x(2), Seq({ 0, 3 })),
- spec(x(1), Seq({ 5 }))));
- TEST_DO(test_apply_op(eval,
spec({x(2),y(2),z(2)},
Seq({ op(1, 7), op(1, 11),
op(2, 13), op(2, 17),
@@ -623,11 +615,9 @@ struct TestContext {
std::vector<Layout> layouts = {
{}, {},
{x(5)}, {x(5)},
- {x(5)}, {x(3)},
{x(5)}, {y(5)},
{x(5)}, {x(5),y(5)},
{y(3)}, {x(2),z(3)},
- {x(3),y(5)}, {x(4),y(4)},
{x(3),y(5)}, {y(5),z(7)},
{x({"a","b","c"})}, {x({"a","b","c"})},
{x({"a","b","c"})}, {x({"a","b"})},
@@ -696,12 +686,6 @@ struct TestContext {
TEST_DO(test_dot_product(((2 * 7) + (3 * 11) + (5 * 13)),
spec(x(3), Seq({ 2, 3, 5 })),
spec(x(3), Seq({ 7, 11, 13 }))));
- TEST_DO(test_dot_product(((2 * 7) + (3 * 11)),
- spec(x(2), Seq({ 2, 3 })),
- spec(x(3), Seq({ 7, 11, 13 }))));
- TEST_DO(test_dot_product(((2 * 7) + (3 * 11)),
- spec(x(3), Seq({ 2, 3, 5 })),
- spec(x(2), Seq({ 7, 11 }))));
}
//-------------------------------------------------------------------------
@@ -729,7 +713,7 @@ struct TestContext {
spec({x(4),y(2)}, Seq({1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 6.0}))));
TEST_DO(test_concat(spec(z(3), Seq({1.0, 2.0, 3.0})), spec(y(2), Seq({4.0, 5.0})), "x",
spec({x(2),y(2),z(3)}, Seq({1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0}))));
- TEST_DO(test_concat(spec(y(3), Seq({1.0, 2.0, 3.0})), spec(y(2), Seq({4.0, 5.0})), "x",
+ TEST_DO(test_concat(spec(y(2), Seq({1.0, 2.0})), spec(y(2), Seq({4.0, 5.0})), "x",
spec({x(2), y(2)}, Seq({1.0, 2.0, 4.0, 5.0}))));
}
diff --git a/eval/src/vespa/eval/eval/value_type.cpp b/eval/src/vespa/eval/eval/value_type.cpp
index 1d49fe494b7..269f17b71c5 100644
--- a/eval/src/vespa/eval/eval/value_type.cpp
+++ b/eval/src/vespa/eval/eval/value_type.cpp
@@ -20,11 +20,6 @@ size_t my_dimension_index(const std::vector<Dimension> &list, const vespalib::st
return ValueType::Dimension::npos;
}
-Dimension *find_dimension(std::vector<Dimension> &list, const vespalib::string &name) {
- size_t idx = my_dimension_index(list, name);
- return (idx != ValueType::Dimension::npos) ? &list[idx] : nullptr;
-}
-
const Dimension *find_dimension(const std::vector<Dimension> &list, const vespalib::string &name) {
size_t idx = my_dimension_index(list, name);
return (idx != ValueType::Dimension::npos) ? &list[idx] : nullptr;
@@ -35,50 +30,71 @@ void sort_dimensions(DimensionList &dimensions) {
[](const auto &a, const auto &b){ return (a.name < b.name); });
}
-bool has_duplicates(const DimensionList &dimensions) {
- for (size_t i = 1; i < dimensions.size(); ++i) {
- if (dimensions[i - 1].name == dimensions[i].name) {
- return true;
+bool verify_dimensions(const DimensionList &dimensions) {
+ for (size_t i = 0; i < dimensions.size(); ++i) {
+ if (dimensions[i].size == 0) {
+ return false;
+ }
+ if ((i > 0) && (dimensions[i - 1].name == dimensions[i].name)) {
+ return false;
}
}
- return false;
+ return true;
}
-struct DimensionResult {
+struct MyJoin {
bool mismatch;
DimensionList dimensions;
- DimensionResult() : mismatch(false), dimensions() {}
+ vespalib::string concat_dim;
+ MyJoin(const DimensionList &lhs, const DimensionList &rhs)
+ : mismatch(false), dimensions(), concat_dim() { my_join(lhs, rhs); }
+ MyJoin(const DimensionList &lhs, const DimensionList &rhs, vespalib::string concat_dim_in)
+ : mismatch(false), dimensions(), concat_dim(concat_dim_in) { my_join(lhs, rhs); }
+ ~MyJoin();
+private:
void add(const Dimension &a) {
- dimensions.push_back(a);
+ if (a.name == concat_dim) {
+ if (a.is_indexed()) {
+ dimensions.emplace_back(a.name, a.size + 1);
+ } else {
+ mismatch = true;
+ }
+ } else {
+ dimensions.push_back(a);
+ }
}
void unify(const Dimension &a, const Dimension &b) {
- if (a.is_mapped() == b.is_mapped()) {
- add(Dimension(a.name, std::min(a.size, b.size)));
+ if (a.name == concat_dim) {
+ if (a.is_indexed() && b.is_indexed()) {
+ dimensions.emplace_back(a.name, a.size + b.size);
+ } else {
+ mismatch = true;
+ }
+ } else if (a == b) {
+ add(a);
} else {
mismatch = true;
}
}
-};
-
-DimensionResult my_join(const DimensionList &lhs, const DimensionList &rhs) {
- DimensionResult result;
- auto pos = rhs.begin();
- auto end = rhs.end();
- for (const Dimension &dim: lhs) {
- while ((pos != end) && (pos->name < dim.name)) {
- result.add(*pos++);
+ void my_join(const DimensionList &lhs, const DimensionList &rhs) {
+ auto pos = rhs.begin();
+ auto end = rhs.end();
+ for (const Dimension &dim: lhs) {
+ while ((pos != end) && (pos->name < dim.name)) {
+ add(*pos++);
+ }
+ if ((pos != end) && (pos->name == dim.name)) {
+ unify(dim, *pos++);
+ } else {
+ add(dim);
+ }
}
- if ((pos != end) && (pos->name == dim.name)) {
- result.unify(dim, *pos++);
- } else {
- result.add(dim);
+ while (pos != end) {
+ add(*pos++);
}
}
- while (pos != end) {
- result.add(*pos++);
- }
- return result;
-}
+};
+MyJoin::~MyJoin() = default;
struct Renamer {
const std::vector<vespalib::string> &from;
@@ -104,10 +120,11 @@ struct Renamer {
constexpr ValueType::Dimension::size_type ValueType::Dimension::npos;
ValueType::~ValueType() = default;
+
bool
ValueType::is_sparse() const
{
- if (!is_tensor() || dimensions().empty()) {
+ if (dimensions().empty()) {
return false;
}
for (const auto &dim : dimensions()) {
@@ -121,7 +138,7 @@ ValueType::is_sparse() const
bool
ValueType::is_dense() const
{
- if (!is_tensor() || dimensions().empty()) {
+ if (dimensions().empty()) {
return false;
}
for (const auto &dim : dimensions()) {
@@ -150,14 +167,10 @@ ValueType::dimension_names() const
ValueType
ValueType::reduce(const std::vector<vespalib::string> &dimensions_in) const
{
- if (is_error() || is_any()) {
- return *this;
+ if (is_error()) {
+ return error_type();
} else if (dimensions_in.empty()) {
return double_type();
- } else if (!is_tensor()) {
- return error_type();
- } else if (_dimensions.empty()) {
- return any_type();
}
size_t removed = 0;
std::vector<Dimension> result;
@@ -171,9 +184,6 @@ ValueType::reduce(const std::vector<vespalib::string> &dimensions_in) const
if (removed != dimensions_in.size()) {
return error_type();
}
- if (result.empty()) {
- return double_type();
- }
return tensor_type(std::move(result));
}
@@ -181,12 +191,9 @@ ValueType
ValueType::rename(const std::vector<vespalib::string> &from,
const std::vector<vespalib::string> &to) const
{
- if (!maybe_tensor() || from.empty() || (from.size() != to.size())) {
+ if (from.empty() || (from.size() != to.size())) {
return error_type();
}
- if (unknown_dimensions()) {
- return any_type();
- }
Renamer renamer(from, to);
std::vector<Dimension> dim_list;
for (const auto &dim: _dimensions) {
@@ -201,8 +208,11 @@ ValueType::rename(const std::vector<vespalib::string> &from,
ValueType
ValueType::tensor_type(std::vector<Dimension> dimensions_in)
{
+ if (dimensions_in.empty()) {
+ return double_type();
+ }
sort_dimensions(dimensions_in);
- if (has_duplicates(dimensions_in)) {
+ if (!verify_dimensions(dimensions_in)) {
return error_type();
}
return ValueType(Type::TENSOR, std::move(dimensions_in));
@@ -229,10 +239,8 @@ ValueType::join(const ValueType &lhs, const ValueType &rhs)
return rhs;
} else if (rhs.is_double()) {
return lhs;
- } else if (lhs.unknown_dimensions() || rhs.unknown_dimensions()) {
- return any_type();
}
- DimensionResult result = my_join(lhs._dimensions, rhs._dimensions);
+ MyJoin result(lhs._dimensions, rhs._dimensions);
if (result.mismatch) {
return error_type();
}
@@ -244,22 +252,12 @@ ValueType::concat(const ValueType &lhs, const ValueType &rhs, const vespalib::st
{
if (lhs.is_error() || rhs.is_error()) {
return error_type();
- } else if (lhs.unknown_dimensions() || rhs.unknown_dimensions()) {
- return any_type();
}
- DimensionResult result = my_join(lhs._dimensions, rhs._dimensions);
- auto lhs_dim = find_dimension(lhs.dimensions(), dimension);
- auto rhs_dim = find_dimension(rhs.dimensions(), dimension);
- auto res_dim = find_dimension(result.dimensions, dimension);
- if (result.mismatch || (res_dim && res_dim->is_mapped())) {
+ MyJoin result(lhs._dimensions, rhs._dimensions, dimension);
+ if (result.mismatch) {
return error_type();
}
- if (res_dim) {
- if (res_dim->is_bound()) {
- res_dim->size = (lhs_dim ? lhs_dim->size : 1)
- + (rhs_dim ? rhs_dim->size : 1);
- }
- } else {
+ if (!find_dimension(result.dimensions, dimension)) {
result.dimensions.emplace_back(dimension, 2);
}
return tensor_type(std::move(result.dimensions));
@@ -268,35 +266,10 @@ ValueType::concat(const ValueType &lhs, const ValueType &rhs, const vespalib::st
ValueType
ValueType::either(const ValueType &one, const ValueType &other)
{
- if (one.is_error() || other.is_error()) {
+ if (one != other) {
return error_type();
}
- if (one == other) {
- return one;
- }
- if (!one.is_tensor() || !other.is_tensor()) {
- return any_type();
- }
- if (one.dimensions().size() != other.dimensions().size()) {
- return tensor_type({});
- }
- std::vector<Dimension> dims;
- for (size_t i = 0; i < one.dimensions().size(); ++i) {
- const Dimension &a = one.dimensions()[i];
- const Dimension &b = other.dimensions()[i];
- if (a.name != b.name) {
- return tensor_type({});
- }
- if (a.is_mapped() != b.is_mapped()) {
- return tensor_type({});
- }
- if (a.size == b.size) {
- dims.push_back(a);
- } else {
- dims.emplace_back(a.name, 0);
- }
- }
- return tensor_type(std::move(dims));
+ return one;
}
std::ostream &
diff --git a/eval/src/vespa/eval/eval/value_type.h b/eval/src/vespa/eval/eval/value_type.h
index 9d95d91ae15..6e30a5c0a47 100644
--- a/eval/src/vespa/eval/eval/value_type.h
+++ b/eval/src/vespa/eval/eval/value_type.h
@@ -15,7 +15,7 @@ namespace vespalib::eval {
class ValueType
{
public:
- enum class Type { ANY, ERROR, DOUBLE, TENSOR };
+ enum class Type { ERROR, DOUBLE, TENSOR };
struct Dimension {
using size_type = uint32_t;
static constexpr size_type npos = -1;
@@ -51,7 +51,6 @@ public:
ValueType &operator=(const ValueType &) = default;
~ValueType();
Type type() const { return _type; }
- bool is_any() const { return (_type == Type::ANY); }
bool is_error() const { return (_type == Type::ERROR); }
bool is_double() const { return (_type == Type::DOUBLE); }
bool is_tensor() const { return (_type == Type::TENSOR); }
@@ -60,16 +59,6 @@ public:
const std::vector<Dimension> &dimensions() const { return _dimensions; }
size_t dimension_index(const vespalib::string &name) const;
std::vector<vespalib::string> dimension_names() const;
- bool maybe_tensor() const { return (is_any() || is_tensor()); }
- bool unknown_dimensions() const { return (maybe_tensor() && _dimensions.empty()); }
- bool is_abstract() const {
- for (const auto &dimension: _dimensions) {
- if (dimension.is_indexed() && !dimension.is_bound()) {
- return true;
- }
- }
- return (is_any() || (is_tensor() && (dimensions().empty())));
- }
bool operator==(const ValueType &rhs) const {
return ((_type == rhs._type) && (_dimensions == rhs._dimensions));
}
@@ -79,8 +68,7 @@ public:
ValueType rename(const std::vector<vespalib::string> &from,
const std::vector<vespalib::string> &to) const;
- static ValueType any_type() { return ValueType(Type::ANY); }
- static ValueType error_type() { return ValueType(Type::ERROR); };
+ static ValueType error_type() { return ValueType(Type::ERROR); }
static ValueType double_type() { return ValueType(Type::DOUBLE); }
static ValueType tensor_type(std::vector<Dimension> dimensions_in);
static ValueType from_spec(const vespalib::string &spec);
diff --git a/eval/src/vespa/eval/eval/value_type_spec.cpp b/eval/src/vespa/eval/eval/value_type_spec.cpp
index 6076988ad50..737943f902e 100644
--- a/eval/src/vespa/eval/eval/value_type_spec.cpp
+++ b/eval/src/vespa/eval/eval/value_type_spec.cpp
@@ -167,9 +167,7 @@ parse_spec(const char *pos_in, const char *end_in, const char *&pos_out)
{
ParseContext ctx(pos_in, end_in, pos_out);
vespalib::string type_name = parse_ident(ctx);
- if (type_name == "any") {
- return ValueType::any_type();
- } else if (type_name == "error") {
+ if (type_name == "error") {
return ValueType::error_type();
} else if (type_name == "double") {
return ValueType::double_type();
@@ -206,9 +204,6 @@ to_spec(const ValueType &type)
asciistream os;
size_t cnt = 0;
switch (type.type()) {
- case ValueType::Type::ANY:
- os << "any";
- break;
case ValueType::Type::ERROR:
os << "error";
break;
diff --git a/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp b/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp
index cd874186e46..f55566fe199 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp
@@ -20,7 +20,7 @@ using namespace eval::operation;
namespace {
bool is_concrete_dense_tensor(const ValueType &type) {
- return (type.is_dense() && !type.is_abstract());
+ return type.is_dense();
}
bool not_overlapping(const ValueType &a, const ValueType &b) {
diff --git a/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp b/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp
index 4bc2458c29d..b32a1efa234 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp
@@ -22,8 +22,8 @@ bool is_concrete_dense_stable_rename(const ValueType &from_type, const ValueType
const std::vector<vespalib::string> &from,
const std::vector<vespalib::string> &to)
{
- if (!from_type.is_dense() || from_type.is_abstract() ||
- !to_type.is_dense() || to_type.is_abstract() ||
+ if (!from_type.is_dense() ||
+ !to_type.is_dense() ||
(from.size() != to.size()))
{
return false;
diff --git a/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp
index b3ed588a74a..4828808683a 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp
@@ -41,7 +41,7 @@ void my_inplace_join_op(eval::InterpretedFunction::State &state, uint64_t param)
}
bool sameShapeConcreteDenseTensors(const ValueType &a, const ValueType &b) {
- return (a.is_dense() && !a.is_abstract() && (a == b));
+ return (a.is_dense() && (a == b));
}
} // namespace vespalib::tensor::<unnamed>
diff --git a/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp
index a0aba25f342..bac1e336292 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp
@@ -30,7 +30,7 @@ void my_inplace_map_op(eval::InterpretedFunction::State &state, uint64_t param)
}
bool isConcreteDenseTensor(const ValueType &type) {
- return (type.is_dense() && !type.is_abstract());
+ return type.is_dense();
}
} // namespace vespalib::tensor::<unnamed>
diff --git a/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp b/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp
index 302c81080dd..d6716e8ad1a 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp
@@ -15,7 +15,7 @@ using namespace eval::tensor_function;
namespace {
bool is_concrete_dense_tensor(const ValueType &type) {
- return (type.is_dense() && !type.is_abstract());
+ return type.is_dense();
}
bool is_ident_aggr(Aggr aggr) {
diff --git a/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp
index c7cb16f37fd..660e5e3e0b7 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp
@@ -76,7 +76,7 @@ void my_xw_product_op(eval::InterpretedFunction::State &state, uint64_t param) {
}
bool isConcreteDenseTensor(const ValueType &type, size_t d) {
- return (type.is_dense() && (type.dimensions().size() == d) && !type.is_abstract());
+ return (type.is_dense() && (type.dimensions().size() == d));
}
bool isDenseXWProduct(const ValueType &res, const ValueType &vec, const ValueType &mat) {
diff --git a/eval/src/vespa/eval/tensor/tensor_mapper.cpp b/eval/src/vespa/eval/tensor/tensor_mapper.cpp
index dbf1965d441..e6358675cea 100644
--- a/eval/src/vespa/eval/tensor/tensor_mapper.cpp
+++ b/eval/src/vespa/eval/tensor/tensor_mapper.cpp
@@ -102,111 +102,6 @@ SparseTensorMapper<TensorT>::map(const Tensor &tensor,
//-----------------------------------------------------------------------------
-class TensorTypeMapper : public TensorVisitor
-{
- ValueType _type;
- std::vector<ValueType::Dimension> _dimensions;
-
- bool addressOK(const TensorAddress &address);
- void expandUnboundDimensions(const TensorAddress &address);
-
- virtual void visit(const TensorAddress &address, double value) override;
-
- TensorTypeMapper(const ValueType &type);
- ~TensorTypeMapper();
-
- ValueType build();
-public:
- static ValueType map(const Tensor &tensor, const ValueType &type);
-};
-
-bool
-TensorTypeMapper::addressOK(const TensorAddress &address)
-{
- TensorAddressElementIterator<TensorAddress> addressIterator(address);
- auto dimIterator = _dimensions.begin();
- for (const auto &dimension : _type.dimensions()) {
- if (addressIterator.skipToDimension(dimension.name)) {
- if (dimension.is_indexed()) {
- uint32_t label = DenseTensorAddressMapper::mapLabelToNumber(addressIterator.label());
- if (label == DenseTensorAddressMapper::BAD_LABEL ||
- (dimension.is_bound() && label >= dimIterator->size)) {
- return false;
- }
- }
- addressIterator.next();
- }
- ++dimIterator;
- }
- assert(dimIterator == _dimensions.end());
- return true;
-}
-
-
-void
-TensorTypeMapper::expandUnboundDimensions(const TensorAddress &address)
-{
- TensorAddressElementIterator<TensorAddress> addressIterator(address);
- auto dimIterator = _dimensions.begin();
- for (const auto &dimension : _type.dimensions()) {
- if (addressIterator.skipToDimension(dimension.name)) {
- if (dimension.is_indexed()) {
- uint32_t label = DenseTensorAddressMapper::mapLabelToNumber(addressIterator.label());
- if (label != DenseTensorAddressMapper::BAD_LABEL &&
- !dimension.is_bound() &&
- label >= dimIterator->size) {
- dimIterator->size = label + 1;
- }
- }
- addressIterator.next();
- }
- ++dimIterator;
- }
- assert(dimIterator == _dimensions.end());
-}
-
-void
-TensorTypeMapper::visit(const TensorAddress &address, double value)
-{
- (void) value;
- if (addressOK(address)) {
- expandUnboundDimensions(address);
- }
-}
-
-TensorTypeMapper::TensorTypeMapper(const ValueType &type)
- : _type(type),
- _dimensions(type.dimensions())
-{
- for (auto &dimension : _dimensions) {
- if (dimension.is_indexed()) {
- if (!dimension.is_bound()) {
- dimension.size = 1;
- }
- }
- }
-}
-
-TensorTypeMapper::~TensorTypeMapper()
-{
-}
-
-ValueType
-TensorTypeMapper::build()
-{
- return ValueType::tensor_type(std::move(_dimensions));
-}
-
-ValueType
-TensorTypeMapper::map(const Tensor &tensor, const ValueType &type)
-{
- TensorTypeMapper mapper(type);
- tensor.accept(mapper);
- return mapper.build();
-}
-
-//-----------------------------------------------------------------------------
-
class DenseTensorMapper : public TensorVisitor
{
ValueType _type;
@@ -259,9 +154,7 @@ DenseTensorMapper::visit(const TensorAddress &address, double value)
std::unique_ptr<Tensor>
DenseTensorMapper::map(const Tensor &tensor, const ValueType &type)
{
- DenseTensorMapper mapper(type.is_abstract() ?
- TensorTypeMapper::map(tensor, type) :
- type);
+ DenseTensorMapper mapper(type);
tensor.accept(mapper);
return mapper.build();
}
@@ -322,9 +215,7 @@ WrappedTensorMapper::visit(const TensorAddress &address, double value)
std::unique_ptr<Tensor>
WrappedTensorMapper::map(const Tensor &tensor, const ValueType &type)
{
- WrappedTensorMapper mapper(type.is_abstract() ?
- TensorTypeMapper::map(tensor, type) :
- type);
+ WrappedTensorMapper mapper(type);
tensor.accept(mapper);
return mapper.build();
}
diff --git a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java
index c632191e31d..22abddfe924 100644
--- a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java
+++ b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java
@@ -16,6 +16,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger;
import java.util.logging.Level;
@@ -37,7 +38,7 @@ public class Mirror implements IMirror {
private final BackOffPolicy backOff;
private volatile int updates = 0;
private boolean requestDone = false;
- private volatile Entry[] specs = new Entry[0];
+ private AtomicReference<Entry[]> specs = new AtomicReference<>(new Entry[0]);
private int specsGeneration = 0;
private final Task updateTask;
private final RequestWaiter reqWait;
@@ -90,7 +91,7 @@ public class Mirror implements IMirror {
public List<Entry> lookup(String pattern) {
ArrayList<Entry> found = new ArrayList<>();
char[] p = pattern.toCharArray();
- for (Entry specEntry : specs) {
+ for (Entry specEntry : specs.get()) {
if (match(specEntry.getNameArray(), p)) {
found.add(specEntry);
}
@@ -211,7 +212,7 @@ public class Mirror implements IMirror {
for (int idx = 0; idx < numNames; idx++) {
newSpecs[idx] = new Entry(n[idx], s[idx]);
}
- specs = newSpecs;
+ specs.set(newSpecs);
specsGeneration = answer.get(2).asInt32();
int u = (updates + 1);
@@ -259,7 +260,7 @@ public class Mirror implements IMirror {
}
} else {
Map<String, Entry> map = new HashMap<>();
- for (Entry e : specs) {
+ for (Entry e : specs.get()) {
map.put(e.getName(), e);
}
for (String rem : r) {
@@ -275,7 +276,7 @@ public class Mirror implements IMirror {
}
}
- specs = newSpecs;
+ specs.set(newSpecs);
specsGeneration = diffToGeneration;
int u = (updates + 1);
@@ -301,7 +302,7 @@ public class Mirror implements IMirror {
target.close();
target = null;
}
- specs = new Entry[0];
+ specs.set(new Entry[0]);
}
/**
diff --git a/parent/pom.xml b/parent/pom.xml
index d5e662ed7da..2c8e7264e23 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -122,6 +122,14 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
+ <dependencies>
+ <!-- TODO: Remove when upgrading to 3.1.2 -->
+ <dependency>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-dependency-analyzer</artifactId>
+ <version>1.11.1</version>
+ </dependency>
+ </dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
index 7b27ba2fa3a..2f952f0957c 100644
--- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
@@ -450,17 +450,19 @@ Proton::~Proton()
if (_fs4Server) {
_fs4Server->shutDown();
}
- // size_t numCores = _protonConfigurer.getActiveConfigSnapshot()->getBootstrapConfig()->getHwInfo().cpu().cores();
- size_t numCores = 4;
- const std::shared_ptr<proton::ProtonConfigSnapshot> pcsp = _protonConfigurer.getActiveConfigSnapshot();
- if (pcsp) {
- const std::shared_ptr<proton::BootstrapConfig> bcp = pcsp->getBootstrapConfig();
- if (bcp) {
- numCores = bcp->getHwInfo().cpu().cores();
+ if (_documentDBMap.size() > 0) {
+ size_t numCores = 4;
+ const std::shared_ptr<proton::ProtonConfigSnapshot> pcsp = _protonConfigurer.getActiveConfigSnapshot();
+ if (pcsp) {
+ const std::shared_ptr<proton::BootstrapConfig> bcp = pcsp->getBootstrapConfig();
+ if (bcp) {
+ numCores = std::max(bcp->getHwInfo().cpu().cores(), 1u);
+ }
}
+
+ vespalib::ThreadStackExecutor closePool(std::min(_documentDBMap.size(), numCores), 0x20000, close_executor);
+ closeDocumentDBs(closePool);
}
- vespalib::ThreadStackExecutor closePool(std::min(_documentDBMap.size(), numCores), 0x20000, close_executor);
- closeDocumentDBs(closePool);
_documentDBMap.clear();
_persistenceEngine.reset();
_tls.reset();
diff --git a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
index bd814b0ad32..cbbaa518b16 100644
--- a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
+++ b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
@@ -40,9 +40,6 @@ static bool operator==(const Tensor &lhs, const Tensor &rhs)
vespalib::string sparseSpec("tensor(x{},y{})");
vespalib::string denseSpec("tensor(x[2],y[3])");
-vespalib::string denseAbstractSpec_xy("tensor(x[],y[])");
-vespalib::string denseAbstractSpec_x("tensor(x[2],y[])");
-vespalib::string denseAbstractSpec_y("tensor(x[],y[3])");
struct Fixture
{
@@ -307,7 +304,7 @@ Fixture::testSaveLoad()
void
Fixture::testCompaction()
{
- if (_useDenseTensorAttribute && _denseTensors && !_cfg.tensorType().is_abstract()) {
+ if (_useDenseTensorAttribute && _denseTensors) {
LOG(info, "Skipping compaction test for tensor '%s' which is using free-lists", _cfg.tensorType().to_spec().c_str());
return;
}
@@ -411,34 +408,4 @@ TEST("Test dense tensors with dense tensor attribute")
testAll([]() { return std::make_shared<Fixture>(denseSpec, true); });
}
-TEST("Test dense tensors with generic tensor attribute with unbound x and y dims")
-{
- testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_xy); });
-}
-
-TEST("Test dense tensors with dense tensor attribute with unbound x and y dims")
-{
- testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_xy, true); });
-}
-
-TEST("Test dense tensors with generic tensor attribute with unbound x dim")
-{
- testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_x); });
-}
-
-TEST("Test dense tensors with dense tensor attribute with unbound x dim")
-{
- testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_x, true); });
-}
-
-TEST("Test dense tensors with generic tensor attribute with unbound y dim")
-{
- testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_y); });
-}
-
-TEST("Test dense tensors with dense tensor attribute with unbound y dim")
-{
- testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_y, true); });
-}
-
TEST_MAIN() { TEST_RUN_ALL(); vespalib::unlink("test.dat"); }
diff --git a/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp b/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp
index 2419f450950..c7c3447a4cc 100644
--- a/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp
+++ b/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp
@@ -54,7 +54,7 @@ ExpressionReplacer::SP make_replacer() {
auto replacer = std::make_shared<ListExpressionReplacer>();
replacer->add(std::make_unique<NullExpressionReplacer>());
replacer->add(std::make_unique<DummyReplacer>("foo", FeatureType::number()));
- replacer->add(std::make_unique<DummyReplacer>("bar", FeatureType::object(ValueType::from_spec("tensor(x[])"))));
+ replacer->add(std::make_unique<DummyReplacer>("bar", FeatureType::object(ValueType::from_spec("tensor(x[5])"))));
return replacer;
}
@@ -124,15 +124,6 @@ TEST("require that ranking expression can resolve to concrete complex type") {
FeatureType::object(ValueType::from_spec("tensor(x{},y{},z{})"))));
}
-TEST("require that ranking expression can resolve to abstract complex type") {
- TEST_DO(verify_output_type({{"a", "tensor"}}, "a*b", FeatureType::object(ValueType::from_spec("tensor"))));
-}
-
-TEST("require that ranking expression can resolve to 'any' type") {
- TEST_DO(verify_output_type({{"a", "tensor(x{},y{})"}, {"b", "tensor"}}, "a*b",
- FeatureType::object(ValueType::from_spec("any"))));
-}
-
TEST("require that setup fails for incompatible types") {
TEST_DO(verify_setup_fail({{"a", "tensor(x{},y{})"}, {"b", "tensor(y[10],z{})"}}, "a*b"));
}
@@ -150,7 +141,7 @@ TEST("require that replaced expressions override result type") {
TEST_DO(verify_output_type({{"b", "tensor(z{})"}}, "foo*b*c",
FeatureType::number()));
TEST_DO(verify_output_type({{"b", "tensor(z{})"}}, "a*b*bar",
- FeatureType::object(ValueType::from_spec("tensor(x[])"))));
+ FeatureType::object(ValueType::from_spec("tensor(x[5])"))));
TEST_DO(verify_output_type({{"b", "tensor(z{})"}}, "foo*b*bar",
FeatureType::number()));
}
diff --git a/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp b/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp
index 9f47dede46a..1d80fec720a 100644
--- a/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp
+++ b/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp
@@ -60,34 +60,6 @@ TEST_F("require that we can store 1d bound tensor", Fixture("tensor(x[3])"))
add({{"x", 2}}, 5));
}
-TEST_F("require that we can store 1d un-bound tensor", Fixture("tensor(x[])"))
-{
- f.assertSetAndGetTensor(TensorSpec("tensor(x[3])").
- add({{"x", 0}}, 2).
- add({{"x", 1}}, 3).
- add({{"x", 2}}, 5));
-}
-
-TEST_F("require that un-bound dimension is concrete in returned 2d tensor", Fixture("tensor(x[3],y[])"))
-{
- f.assertSetAndGetTensor(TensorSpec("tensor(x[3],y[2])").
- add({{"x", 0}, {"y", 0}}, 2).
- add({{"x", 0}, {"y", 1}}, 3).
- add({{"x", 1}, {"y", 0}}, 5).
- add({{"x", 1}, {"y", 1}}, 7).
- add({{"x", 2}, {"y", 0}}, 11).
- add({{"x", 2}, {"y", 1}}, 13));
-}
-
-TEST_F("require that un-bound dimensions are concrete in returned 3d tensor", Fixture("tensor(x[],y[2],z[])"))
-{
- f.assertSetAndGetTensor(TensorSpec("tensor(x[1],y[2],z[2])").
- add({{"x", 0}, {"y", 0}, {"z", 0}}, 2).
- add({{"x", 0}, {"y", 0}, {"z", 1}}, 3).
- add({{"x", 0}, {"y", 1}, {"z", 0}}, 5).
- add({{"x", 0}, {"y", 1}, {"z", 1}}, 7));
-}
-
TEST_F("require that correct empty tensor is returned for 1d bound tensor", Fixture("tensor(x[3])"))
{
f.assertEmptyTensor(TensorSpec("tensor(x[3])").
@@ -96,21 +68,6 @@ TEST_F("require that correct empty tensor is returned for 1d bound tensor", Fixt
add({{"x", 2}}, 0));
}
-TEST_F("require that empty 2d tensor has size 1 in un-bound dimension", Fixture("tensor(x[3],y[])"))
-{
- f.assertEmptyTensor(TensorSpec("tensor(x[3],y[1])").
- add({{"x", 0}, {"y", 0}}, 0).
- add({{"x", 1}, {"y", 0}}, 0).
- add({{"x", 2}, {"y", 0}}, 0));
-}
-
-TEST_F("require that empty 3d tensor has size 1 in un-bound dimensions", Fixture("tensor(x[],y[2],z[])"))
-{
- f.assertEmptyTensor(TensorSpec("tensor(x[1],y[2],z[1])").
- add({{"x", 0}, {"y", 0}, {"z", 0}}, 0).
- add({{"x", 0}, {"y", 1}, {"z", 0}}, 0));
-}
-
void
assertArraySize(const vespalib::string &tensorType, uint32_t expArraySize) {
Fixture f(tensorType);
@@ -122,13 +79,7 @@ TEST("require that array size is calculated correctly")
TEST_DO(assertArraySize("tensor(x[1])", 32));
TEST_DO(assertArraySize("tensor(x[10])", 96));
TEST_DO(assertArraySize("tensor(x[3])", 32));
- TEST_DO(assertArraySize("tensor(x[3],y[])", 32));
- TEST_DO(assertArraySize("tensor(x[3],y[],z[])", 32));
- TEST_DO(assertArraySize("tensor(x[3],y[],z[],z2[])", 64));
TEST_DO(assertArraySize("tensor(x[10],y[10])", 800));
- TEST_DO(assertArraySize("tensor(x[])", 32));
- TEST_DO(assertArraySize("tensor(x[],x2[],x3[],x4[],x5[],x6[])", 32));
- TEST_DO(assertArraySize("tensor(x[],x2[],x3[],x4[],x5[],x6[],x7[])", 64));
}
TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/vespa/searchlib/features/attributefeature.cpp b/searchlib/src/vespa/searchlib/features/attributefeature.cpp
index b3ebd0f3822..56d02ce6d4e 100644
--- a/searchlib/src/vespa/searchlib/features/attributefeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/attributefeature.cpp
@@ -295,10 +295,13 @@ AttributeBlueprint::setup(const search::fef::IIndexEnvironment & env,
vespalib::string attrType = type::Attribute::lookup(env.getProperties(), _attrName);
if (!attrType.empty()) {
_tensorType = ValueType::from_spec(attrType);
+ if (_tensorType.is_error()) {
+ LOG(error, "%s: invalid type: '%s'", getName().c_str(), attrType.c_str());
+ }
}
- FeatureType output_type = _tensorType.is_tensor()
- ? FeatureType::object(_tensorType)
- : FeatureType::number();
+ FeatureType output_type = _tensorType.is_double()
+ ? FeatureType::number()
+ : FeatureType::object(_tensorType);
describeOutput("value", "The value of a single value attribute, "
"the value at the given index of an array attribute, "
"the given key of a weighted set attribute, or"
@@ -309,7 +312,7 @@ AttributeBlueprint::setup(const search::fef::IIndexEnvironment & env,
describeOutput("count", "Returns the number of elements in this array or weighted set attribute.");
}
env.hintAttributeAccess(_attrName);
- return true;
+ return !_tensorType.is_error();
}
search::fef::Blueprint::UP
diff --git a/searchlib/src/vespa/searchlib/features/constant_feature.cpp b/searchlib/src/vespa/searchlib/features/constant_feature.cpp
index 4d76512ab00..ced9d95fb33 100644
--- a/searchlib/src/vespa/searchlib/features/constant_feature.cpp
+++ b/searchlib/src/vespa/searchlib/features/constant_feature.cpp
@@ -63,8 +63,10 @@ ConstantBlueprint::setup(const IIndexEnvironment &env,
{
_key = params[0].getValue();
_value = env.getConstantValue(_key);
- if (!_value || _value->type().is_error()) {
+ if (!_value) {
LOG(error, "Constant '%s' not found", _key.c_str());
+ } else if (_value->type().is_error()) {
+ LOG(error, "Constant '%s' has invalid type", _key.c_str());
}
FeatureType output_type = _value ?
FeatureType::object(_value->type()) :
diff --git a/searchlib/src/vespa/searchlib/features/queryfeature.cpp b/searchlib/src/vespa/searchlib/features/queryfeature.cpp
index eb7eb427283..b9041901ced 100644
--- a/searchlib/src/vespa/searchlib/features/queryfeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/queryfeature.cpp
@@ -98,12 +98,15 @@ QueryBlueprint::setup(const IIndexEnvironment &env, const ParameterList &params)
vespalib::string queryFeatureType = type::QueryFeature::lookup(env.getProperties(), _key);
if (!queryFeatureType.empty()) {
_valueType = ValueType::from_spec(queryFeatureType);
+ if (_valueType.is_error()) {
+ LOG(error, "%s: invalid type: '%s'", getName().c_str(), queryFeatureType.c_str());
+ }
}
- FeatureType output_type = _valueType.is_tensor()
- ? FeatureType::object(_valueType)
- : FeatureType::number();
+ FeatureType output_type = _valueType.is_double()
+ ? FeatureType::number()
+ : FeatureType::object(_valueType);
describeOutput("out", "The value looked up in query properties using the given key.", output_type);
- return true;
+ return !_valueType.is_error();
}
namespace {
diff --git a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp
index 72865d042e7..b2c8c64d55a 100644
--- a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp
@@ -239,9 +239,6 @@ RankingExpressionBlueprint::setup(const fef::IIndexEnvironment &env,
LOG(error, "rank expression contains type errors: %s\n", script.c_str());
return false;
}
- if (root_type.is_any()) {
- LOG(warning, "rank expression could produce run-time type errors: %s\n", script.c_str());
- }
auto compile_issues = CompiledFunction::detect_issues(rank_function);
auto interpret_issues = InterpretedFunction::detect_issues(rank_function);
if (do_compile && compile_issues && !interpret_issues) {
diff --git a/storage/src/vespa/storage/distributor/bucketdbupdater.cpp b/storage/src/vespa/storage/distributor/bucketdbupdater.cpp
index 7b2b2561f91..08c8cc59933 100644
--- a/storage/src/vespa/storage/distributor/bucketdbupdater.cpp
+++ b/storage/src/vespa/storage/distributor/bucketdbupdater.cpp
@@ -730,6 +730,23 @@ BucketDBUpdater::BucketListGenerator::process(BucketDatabase::Entry& e)
return true;
}
+BucketDBUpdater::NodeRemover::NodeRemover(
+ const lib::ClusterState& oldState,
+ const lib::ClusterState& s,
+ uint16_t localIndex,
+ const lib::Distribution& distribution,
+ const char* upStates)
+ : _oldState(oldState),
+ _state(s),
+ _nonOwnedBuckets(),
+ _removedBuckets(),
+ _localIndex(localIndex),
+ _distribution(distribution),
+ _upStates(upStates),
+ _cachedDecisionSuperbucket(UINT64_MAX),
+ _cachedOwned(false)
+{}
+
void
BucketDBUpdater::NodeRemover::logRemove(const document::BucketId& bucketId, const char* msg) const
{
@@ -737,14 +754,35 @@ BucketDBUpdater::NodeRemover::logRemove(const document::BucketId& bucketId, cons
LOG_BUCKET_OPERATION_NO_LOCK(bucketId, msg);
}
+namespace {
+
+uint64_t superbucket_from_id(const document::BucketId& id, uint16_t distribution_bits) noexcept {
+ // The n LSBs of the bucket ID contain the superbucket number. Mask off the rest.
+ return id.getRawId() & ~(UINT64_MAX << distribution_bits);
+}
+
+}
+
bool
BucketDBUpdater::NodeRemover::distributorOwnsBucket(
const document::BucketId& bucketId) const
{
+ // TODO "no distributors available" case is the same for _all_ buckets; cache once in constructor.
+ // TODO "too few bits used" case can be cheaply checked without needing exception
try {
- uint16_t distributor(
- _distribution.getIdealDistributorNode(_state, bucketId, "uim"));
- if (distributor != _localIndex) {
+ const auto bits = _state.getDistributionBitCount();
+ const auto this_superbucket = superbucket_from_id(bucketId, bits);
+ if (_cachedDecisionSuperbucket == this_superbucket) {
+ if (!_cachedOwned) {
+ logRemove(bucketId, "bucket now owned by another distributor (cached)");
+ }
+ return _cachedOwned;
+ }
+
+ uint16_t distributor = _distribution.getIdealDistributorNode(_state, bucketId, "uim");
+ _cachedDecisionSuperbucket = this_superbucket;
+ _cachedOwned = (distributor == _localIndex);
+ if (!_cachedOwned) {
logRemove(bucketId, "bucket now owned by another distributor");
return false;
}
diff --git a/storage/src/vespa/storage/distributor/bucketdbupdater.h b/storage/src/vespa/storage/distributor/bucketdbupdater.h
index 393e1e2524e..9ff732a09f5 100644
--- a/storage/src/vespa/storage/distributor/bucketdbupdater.h
+++ b/storage/src/vespa/storage/distributor/bucketdbupdater.h
@@ -201,16 +201,9 @@ private:
const lib::ClusterState& s,
uint16_t localIndex,
const lib::Distribution& distribution,
- const char* upStates)
- : _oldState(oldState),
- _state(s),
- _nonOwnedBuckets(),
- _removedBuckets(),
- _localIndex(localIndex),
- _distribution(distribution),
- _upStates(upStates) {}
-
+ const char* upStates);
~NodeRemover() override;
+
bool process(BucketDatabase::Entry& e) override;
void logRemove(const document::BucketId& bucketId, const char* msg) const;
bool distributorOwnsBucket(const document::BucketId&) const;
@@ -233,6 +226,9 @@ private:
uint16_t _localIndex;
const lib::Distribution& _distribution;
const char* _upStates;
+
+ mutable uint64_t _cachedDecisionSuperbucket;
+ mutable bool _cachedOwned;
};
std::deque<std::pair<framework::MilliSecTime, BucketRequest> > _delayedRequests;
diff --git a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java
index 7d6d75e0ee2..0063011e41c 100644
--- a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java
+++ b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java
@@ -3,13 +3,27 @@ package com.yahoo.vdslib.distribution;
import com.yahoo.collections.BobHash;
import com.yahoo.config.subscription.ConfigSubscriber;
+import com.yahoo.vdslib.state.ClusterState;
+import com.yahoo.vdslib.state.DiskState;
+import com.yahoo.vdslib.state.Node;
+import com.yahoo.vdslib.state.NodeState;
+import com.yahoo.vdslib.state.NodeType;
+import com.yahoo.vdslib.state.State;
import com.yahoo.vespa.config.content.StorDistributionConfig;
-import com.yahoo.config.subscription.ConfigSourceSet;
-import com.yahoo.vdslib.state.*;
import com.yahoo.document.BucketId;
-import java.util.*;
import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.TreeSet;
public class Distribution {
@@ -27,7 +41,7 @@ public class Distribution {
return redundancy;
}
- private ConfigSubscriber.SingleSubscriber<StorDistributionConfig> configSubscriber = new ConfigSubscriber.SingleSubscriber<StorDistributionConfig>() {
+ private ConfigSubscriber.SingleSubscriber<StorDistributionConfig> configSubscriber = new ConfigSubscriber.SingleSubscriber<>() {
private int[] getGroupPath(String path) {
if (path.equals("invalid")) { return new int[0]; }
StringTokenizer st = new StringTokenizer(path, ".");
@@ -65,7 +79,6 @@ public class Distribution {
if (path.length == 0) {
root = group;
} else {
- assert(root != null);
Group parent = root;
for (int j=0; j<path.length - 1; ++j) {
parent = parent.getSubgroups().get(path[j]);
@@ -90,19 +103,12 @@ public class Distribution {
};
public Distribution(String configId) {
- this(configId, null);
- }
- public Distribution(String configId, ConfigSourceSet configSources) {
int mask = 0;
for (int i=0; i<=64; ++i) {
distributionBitMasks[i] = mask;
mask = (mask << 1) | 1;
}
- if (configSources==null) {
- configSub = new ConfigSubscriber();
- } else {
- configSub = new ConfigSubscriber(configSources);
- }
+ configSub = new ConfigSubscriber();
configSub.subscribe(configSubscriber, StorDistributionConfig.class, configId);
}
@@ -213,7 +219,7 @@ public class Distribution {
return group.compareTo(o.group);
}
}
- public void getIdealGroups(BucketId bucketId, ClusterState clusterState, Group parent,
+ private void getIdealGroups(BucketId bucketId, ClusterState clusterState, Group parent,
int redundancy, List<ResultGroup> results) {
if (parent.isLeafGroup()) {
results.add(new ResultGroup(parent, redundancy));
@@ -311,7 +317,7 @@ public class Distribution {
return idealDisk;
}
- public List<Integer> getIdealStorageNodes(ClusterState clusterState, BucketId bucket,
+ List<Integer> getIdealStorageNodes(ClusterState clusterState, BucketId bucket,
String upStates) throws TooFewBucketBitsInUseException {
List<Integer> resultNodes = new ArrayList<>();
@@ -399,12 +405,12 @@ public class Distribution {
}
public static class TooFewBucketBitsInUseException extends Exception {
- public TooFewBucketBitsInUseException(String message) {
+ TooFewBucketBitsInUseException(String message) {
super(message);
}
}
public static class NoDistributorsAvailableException extends Exception {
- public NoDistributorsAvailableException(String message) {
+ NoDistributorsAvailableException(String message) {
super(message);
}
}
@@ -504,7 +510,7 @@ public class Distribution {
public static String getSimpleGroupConfig(int redundancy, int nodeCount) {
return getSimpleGroupConfig(redundancy, nodeCount, StorDistributionConfig.Disk_distribution.Enum.MODULO_BID);
}
- public static String getSimpleGroupConfig(int redundancy, int nodeCount, StorDistributionConfig.Disk_distribution.Enum diskDistribution) {
+ private static String getSimpleGroupConfig(int redundancy, int nodeCount, StorDistributionConfig.Disk_distribution.Enum diskDistribution) {
StringBuilder sb = new StringBuilder();
sb.append("raw:redundancy ").append(redundancy).append("\n").append("group[4]\n");
diff --git a/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java b/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java
index 9dab7e46a88..b13b6230d3e 100644
--- a/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java
+++ b/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java
@@ -3,7 +3,12 @@ package com.yahoo.vdslib.state;
import com.yahoo.text.StringUtilities;
import java.text.ParseException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.TreeSet;
/**
* Be careful about changing this class, as it mirrors the ClusterState in C++.
@@ -127,7 +132,7 @@ public class ClusterState implements Cloneable {
}
private Set<Node> unionNodeSetWith(final Set<Node> otherNodes) {
- final Set<Node> unionNodeSet = new TreeSet<Node>(nodeStates.keySet());
+ final Set<Node> unionNodeSet = new TreeSet<>(nodeStates.keySet());
unionNodeSet.addAll(otherNodes);
return unionNodeSet;
}
@@ -181,7 +186,7 @@ public class ClusterState implements Cloneable {
Node node = new Node(NodeType.STORAGE, 0);
StringBuilder sb = new StringBuilder();
- public void addNodeState() throws ParseException {
+ void addNodeState() throws ParseException {
if (!empty) {
NodeState ns = NodeState.deserialize(node.getType(), sb.toString());
if (!ns.equals(defaultUpNodeState(node.getType()))) {
@@ -234,13 +239,11 @@ public class ClusterState implements Cloneable {
break;
case 'v':
if (key.equals("version")) {
- Integer version;
try{
- version = Integer.valueOf(value);
+ setVersion(Integer.valueOf(value));
} catch (Exception e) {
throw new ParseException("Illegal version '" + value + "'. Must be an integer, in state: " + serialized, 0);
- }
- setVersion(version);
+ }
continue;
}
break;
@@ -308,7 +311,7 @@ public class ClusterState implements Cloneable {
return getDiff(other).toHtml();
}
- public Diff getDiff(ClusterState other) {
+ private Diff getDiff(ClusterState other) {
Diff diff = new Diff();
if (version != other.version) {
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java
index 04d45afe2d0..b03a2541cd0 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java
@@ -4,7 +4,6 @@ package com.yahoo.vespa.http.client;
import com.yahoo.vespa.http.client.config.Cluster;
import com.yahoo.vespa.http.client.config.Endpoint;
import com.yahoo.vespa.http.client.config.SessionParams;
-import com.yahoo.vespa.http.client.core.api.SessionImpl;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -31,7 +30,7 @@ public final class SessionFactory {
@SuppressWarnings("deprecation")
static Session createInternal(SessionParams params) {
- return new SessionImpl(params, createTimeoutExecutor());
+ return new com.yahoo.vespa.http.client.core.api.SessionImpl(params, createTimeoutExecutor());
}
static ScheduledThreadPoolExecutor createTimeoutExecutor() {
diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java
index e11903d7ba7..a5c97351347 100644
--- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java
+++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java
@@ -3,7 +3,6 @@ package com.yahoo.vespa.http.client.core.api;
import com.yahoo.vespa.http.client.FeedClient;
import com.yahoo.vespa.http.client.Result;
-import com.yahoo.vespa.http.client.Session;
import com.yahoo.vespa.http.client.config.SessionParams;
import com.yahoo.vespa.http.client.core.ThrottlePolicy;
import com.yahoo.vespa.http.client.core.operationProcessor.IncompleteResultsThrottler;
@@ -20,7 +19,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
* @deprecated
*/
@Deprecated // TODO: Remove on Vespa 8
-public class SessionImpl implements Session {
+public class SessionImpl implements com.yahoo.vespa.http.client.Session {
private final OperationProcessor operationProcessor;
private final BlockingQueue<Result> resultQueue = new LinkedBlockingQueue<>();
diff --git a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java
index 344f8b46639..08c9299dcde 100644
--- a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java
+++ b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java
@@ -6,7 +6,6 @@ import com.yahoo.vespa.http.client.config.ConnectionParams;
import com.yahoo.vespa.http.client.config.Endpoint;
import com.yahoo.vespa.http.client.config.FeedParams;
import com.yahoo.vespa.http.client.config.SessionParams;
-import com.yahoo.vespa.http.client.core.api.SessionImpl;
import com.yahoo.vespa.http.client.handlers.V3MockParsingRequestHandler;
import org.junit.Test;
@@ -65,7 +64,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly {
mockXmlParsingRequestHandler.setScenario(V3MockParsingRequestHandler.Scenario.DONT_ACCEPT_VERSION);
try (Server server = new Server(mockXmlParsingRequestHandler, 0);
Session session =
- new SessionImpl(
+ new com.yahoo.vespa.http.client.core.api.SessionImpl(
new SessionParams.Builder()
.addCluster(new Cluster.Builder()
.addEndpoint(Endpoint.create("localhost", server.getPort(), false))
@@ -109,7 +108,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly {
try (Server serverA = new Server(new V3MockParsingRequestHandler("A"), 0);
Server serverB = new Server(slowHandler, 0);
- SessionImpl session = new SessionImpl(
+ com.yahoo.vespa.http.client.core.api.SessionImpl session = new com.yahoo.vespa.http.client.core.api.SessionImpl(
new SessionParams.Builder()
.addCluster(new Cluster.Builder()
.addEndpoint(Endpoint.create("localhost", serverA.getPort(), false))
@@ -196,7 +195,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly {
mockXmlParsingRequestHandler.setScenario(V3MockParsingRequestHandler.Scenario.DONT_ACCEPT_VERSION);
try (Server server = new Server(mockXmlParsingRequestHandler, 0);
Session session =
- new SessionImpl(
+ new com.yahoo.vespa.http.client.core.api.SessionImpl(
new SessionParams.Builder()
.addCluster(new Cluster.Builder()
.addEndpoint(Endpoint.create("localhost", server.getPort(), false))
@@ -278,7 +277,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly {
}
}
- private void assertIncompleteResultQueueSize(SessionImpl session, int size, long timeout, TimeUnit timeUnit) throws InterruptedException {
+ private void assertIncompleteResultQueueSize(com.yahoo.vespa.http.client.core.api.SessionImpl session, int size, long timeout, TimeUnit timeUnit) throws InterruptedException {
long timeoutMs = TimeUnit.MILLISECONDS.convert(timeout, timeUnit);
long waitTimeMs = 0;
while (true) {
diff --git a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java
index 0e1b038e6cd..1fcd5d72a00 100644
--- a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java
+++ b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java
@@ -8,33 +8,34 @@ import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author Simon Thoresen Hult
*/
class FeederParams {
- private InputStream stdIn = System.in;
+ enum DumpFormat {JSON, VESPA};
private PrintStream stdErr = System.err;
private PrintStream stdOut = System.out;
private Route route = Route.parse("default");
private String configId = "client";
private OutputStream dumpStream = null;
- private boolean serialTransferEnabled = false;
+ private DumpFormat dumpFormat = DumpFormat.JSON;
+ private boolean benchmarkMode = false;
private int numDispatchThreads = 1;
+ private int maxPending = 0;
+ private List<InputStream> inputStreams = new ArrayList<>();
- InputStream getStdIn() {
- return stdIn;
- }
-
- FeederParams setStdIn(InputStream stdIn) {
- this.stdIn = stdIn;
- return this;
+ FeederParams() {
+ inputStreams.add(System.in);
}
PrintStream getStdErr() {
@@ -64,6 +65,12 @@ class FeederParams {
return this;
}
+ DumpFormat getDumpFormat() { return dumpFormat; }
+ FeederParams setDumpFormat(DumpFormat dumpFormat) {
+ this.dumpFormat = dumpFormat;
+ return this;
+ }
+
String getConfigId() {
return configId;
}
@@ -74,33 +81,61 @@ class FeederParams {
}
boolean isSerialTransferEnabled() {
- return serialTransferEnabled;
+ return maxPending == 1;
}
- FeederParams setSerialTransfer(boolean serial) {
- this.serialTransferEnabled = serial;
+ FeederParams setSerialTransfer() {
+ maxPending = 1;
+ numDispatchThreads = 1;
+ return this;
+ }
+ List<InputStream> getInputStreams() { return inputStreams; }
+ FeederParams setInputStreams(List<InputStream> inputStreams) {
+ this.inputStreams = inputStreams;
return this;
}
int getNumDispatchThreads() { return numDispatchThreads; }
+ int getMaxPending() { return maxPending; }
+ boolean isBenchmarkMode() { return benchmarkMode; }
FeederParams parseArgs(String... args) throws ParseException, FileNotFoundException {
Options opts = new Options();
- opts.addOption("s", "serial", false, "use serial transfer mode, at most 1 pending operation");
+ opts.addOption("s", "serial", false, "use serial transfer mode, at most 1 pending operation and a single thread");
opts.addOption("n", "numthreads", true, "Number of clients for sending messages. Anything, but 1 will bypass sequencing by document id.");
+ opts.addOption("m", "maxpending", true, "Max number of inflights messages. Default is auto.");
opts.addOption("r", "route", true, "Route for sending messages. default is 'default'....");
- opts.addOption("o", "output", true, "File to write to. Extensions gives format (.xml, .json, .v8) json will be produced if no extension.");
+ opts.addOption("b", "mode", true, "Mode for benchmarking.");
+ opts.addOption("o", "output", true, "File to write to. Extensions gives format (.xml, .json, .vespa) json will be produced if no extension.");
CommandLine cmd = new DefaultParser().parse(opts, args);
- serialTransferEnabled = cmd.hasOption('s');
+
if (cmd.hasOption('n')) {
numDispatchThreads = Integer.valueOf(cmd.getOptionValue('n').trim());
}
+ if (cmd.hasOption('m')) {
+ maxPending = Integer.valueOf(cmd.getOptionValue('m').trim());
+ }
if (cmd.hasOption('r')) {
route = Route.parse(cmd.getOptionValue('r').trim());
}
+ benchmarkMode = cmd.hasOption('b');
if (cmd.hasOption('o')) {
- dumpStream = new FileOutputStream(new File(cmd.getOptionValue('o').trim()));
+ String fileName = cmd.getOptionValue('o').trim();
+ dumpStream = new FileOutputStream(new File(fileName));
+ if (fileName.endsWith(".vespa")) {
+ dumpFormat = DumpFormat.VESPA;
+ }
+ }
+ if (cmd.hasOption('s')) {
+ setSerialTransfer();
+ }
+
+ if ( !cmd.getArgList().isEmpty()) {
+ inputStreams.clear();
+ for (String fileName : cmd.getArgList()) {
+ inputStreams.add(new FileInputStream(new File(fileName)));
+ }
}
return this;
diff --git a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java
index b4520c0d9e3..32e883f171a 100644
--- a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java
+++ b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java
@@ -2,14 +2,24 @@
package com.yahoo.vespa.feed.perf;
import com.yahoo.concurrent.ThreadFactoryFactory;
+import com.yahoo.document.Document;
+import com.yahoo.document.DocumentId;
import com.yahoo.document.DocumentPut;
import com.yahoo.document.DocumentTypeManager;
+import com.yahoo.document.DocumentUpdate;
+import com.yahoo.document.TestAndSetCondition;
import com.yahoo.document.json.JsonFeedReader;
import com.yahoo.document.json.JsonWriter;
+import com.yahoo.document.serialization.DocumentDeserializer;
+import com.yahoo.document.serialization.DocumentDeserializerFactory;
+import com.yahoo.document.serialization.DocumentSerializer;
+import com.yahoo.document.serialization.DocumentSerializerFactory;
+import com.yahoo.document.serialization.DocumentWriter;
import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol;
import com.yahoo.documentapi.messagebus.protocol.PutDocumentMessage;
import com.yahoo.documentapi.messagebus.protocol.RemoveDocumentMessage;
import com.yahoo.documentapi.messagebus.protocol.UpdateDocumentMessage;
+import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.messagebus.Error;
import com.yahoo.messagebus.Message;
import com.yahoo.messagebus.MessageBusParams;
@@ -21,13 +31,21 @@ import com.yahoo.messagebus.SourceSessionParams;
import com.yahoo.messagebus.StaticThrottlePolicy;
import com.yahoo.messagebus.network.rpc.RPCNetworkParams;
import com.yahoo.messagebus.routing.Route;
+import com.yahoo.vespaxmlparser.ConditionalFeedOperation;
import com.yahoo.vespaxmlparser.FeedReader;
+import com.yahoo.vespaxmlparser.FeedOperation;
+import com.yahoo.vespaxmlparser.RemoveFeedOperation;
import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
+import net.jpountz.xxhash.XXHashFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
@@ -40,30 +58,66 @@ import java.util.concurrent.atomic.AtomicReference;
*/
public class SimpleFeeder implements ReplyHandler {
- private final static long REPORT_INTERVAL = TimeUnit.SECONDS.toMillis(10);
- private final static long HEADER_INTERVAL = REPORT_INTERVAL * 24;
+
private final DocumentTypeManager docTypeMgr = new DocumentTypeManager();
- private final InputStream in;
+ private final List<InputStream> inputStreams;
private final PrintStream out;
private final RPCMessageBus mbus;
private final SourceSession session;
+ private final int numThreads;
+ private final Destination destination;
+ private final boolean benchmarkMode;
+ private final static long REPORT_INTERVAL = TimeUnit.SECONDS.toMillis(10);
private final long startTime = System.currentTimeMillis();
private final AtomicReference<Throwable> failure = new AtomicReference<>(null);
private final AtomicLong numReplies = new AtomicLong(0);
private long maxLatency = Long.MIN_VALUE;
private long minLatency = Long.MAX_VALUE;
- private long nextHeader = startTime + HEADER_INTERVAL;
private long nextReport = startTime + REPORT_INTERVAL;
private long sumLatency = 0;
- private final int numThreads;
- private final Destination destination;
+
+ static class Metrics {
+
+ private final Destination destination;
+ private final FeedReader reader;
+ private final Executor executor;
+ AtomicReference<Throwable> failure;
+
+ Metrics(Destination destination, FeedReader reader, Executor executor, AtomicReference<Throwable> failure) {
+ this.destination = destination;
+ this.reader = reader;
+ this.executor = executor;
+ this.failure = failure;
+ }
+
+ long feed() throws Throwable {
+ long numMessages = 0;
+ while (failure.get() == null) {
+ FeedOperation op = reader.read();
+ if (op.getType() == FeedOperation.Type.INVALID) {
+ break;
+ }
+ if (executor != null) {
+ executor.execute(() -> sendOperation(op));
+ } else {
+ sendOperation(op);
+ }
+ ++numMessages;
+ }
+ return numMessages;
+ }
+ private void sendOperation(FeedOperation op) {
+ destination.send(op);
+ }
+ }
+
public static void main(String[] args) throws Throwable {
new SimpleFeeder(new FeederParams().parseArgs(args)).run().close();
}
private interface Destination {
- void send(VespaXMLFeedReader.Operation op);
+ void send(FeedOperation op);
void close() throws Exception;
}
@@ -78,7 +132,7 @@ public class SimpleFeeder implements ReplyHandler {
this.session = session;
this.failure = failure;
}
- public void send(VespaXMLFeedReader.Operation op) {
+ public void send(FeedOperation op) {
Message msg = newMessage(op);
if (msg == null) {
err.println("ignoring operation; " + op.getType());
@@ -100,7 +154,7 @@ public class SimpleFeeder implements ReplyHandler {
private static class JsonDestination implements Destination {
private final OutputStream outputStream;
- private final JsonWriter writer;
+ private final DocumentWriter writer;
private final AtomicLong numReplies;
private final AtomicReference<Throwable> failure;
private boolean isFirst = true;
@@ -116,8 +170,8 @@ public class SimpleFeeder implements ReplyHandler {
failure.set(e);
}
}
- public void send(VespaXMLFeedReader.Operation op) {
- if (op.getType() == VespaXMLFeedReader.OperationType.DOCUMENT) {
+ public void send(FeedOperation op) {
+ if (op.getType() == FeedOperation.Type.DOCUMENT) {
if (!isFirst) {
try {
outputStream.write(',');
@@ -137,41 +191,185 @@ public class SimpleFeeder implements ReplyHandler {
outputStream.write(']');
outputStream.close();
}
+ }
+ static private final int NONE = 0;
+ static private final int DOCUMENT = 1;
+ static private final int UPDATE = 2;
+ static private final int REMOVE = 3;
+ private static class VespaV1Destination implements Destination {
+ private final OutputStream outputStream;
+ GrowableByteBuffer buffer = new GrowableByteBuffer(16384);
+ ByteBuffer header = ByteBuffer.allocate(16);
+ private final AtomicLong numReplies;
+ private final AtomicReference<Throwable> failure;
+ VespaV1Destination(OutputStream outputStream, AtomicReference<Throwable> failure, AtomicLong numReplies) {
+ this.outputStream = outputStream;
+ this.numReplies = numReplies;
+ this.failure = failure;
+ try {
+ outputStream.write('V');
+ outputStream.write('1');
+ } catch (IOException e) {
+ failure.set(e);
+ }
+ }
+ public void send(FeedOperation op) {
+ TestAndSetCondition cond = op.getCondition();
+ buffer.putUtf8String(cond.getSelection());
+ DocumentSerializer writer = DocumentSerializerFactory.createHead(buffer);
+ int type = NONE;
+ if (op.getType() == FeedOperation.Type.DOCUMENT) {
+ writer.write(op.getDocument());
+ type = DOCUMENT;
+ } else if (op.getType() == FeedOperation.Type.UPDATE) {
+ writer.write(op.getDocumentUpdate());
+ type = UPDATE;
+ } else if (op.getType() == FeedOperation.Type.REMOVE) {
+ writer.write(op.getRemove());
+ type = REMOVE;
+ }
+ int sz = buffer.position();
+ long hash = hash(buffer.array(), sz);
+ try {
+ header.putInt(sz);
+ header.putInt(type);
+ header.putLong(hash);
+ outputStream.write(header.array(), 0, header.position());
+ outputStream.write(buffer.array(), 0, buffer.position());
+ header.clear();
+ buffer.clear();
+ } catch (IOException e) {
+ failure.set(e);
+ }
+ numReplies.incrementAndGet();
+ }
+ public void close() throws Exception {
+ outputStream.close();
+ }
+ static long hash(byte [] buf, int length) {
+ return XXHashFactory.fastestJavaInstance().hash64().hash(buf, 0, length, 0);
+ }
+ }
+
+ private static int readExact(InputStream in, byte [] buf) throws IOException {
+ return in.readNBytes(buf, 0, buf.length);
+ }
+
+ static class VespaV1FeedReader implements FeedReader {
+ private final InputStream in;
+ private final DocumentTypeManager mgr;
+ private final byte[] prefix = new byte[16];
+ VespaV1FeedReader(InputStream in, DocumentTypeManager mgr) throws IOException {
+ this.in = in;
+ this.mgr = mgr;
+ byte [] header = new byte[2];
+ int read = readExact(in, header);
+ if ((read != header.length) || (header[0] != 'V') || (header[1] != '1')) {
+ throw new IllegalArgumentException("Invalid Header " + Arrays.toString(header));
+ }
+ }
+
+ class LazyDocumentOperation extends ConditionalFeedOperation {
+ private final DocumentDeserializer deserializer;
+ LazyDocumentOperation(DocumentDeserializer deserializer, TestAndSetCondition condition) {
+ super(Type.DOCUMENT, condition);
+ this.deserializer = deserializer;
+ }
+
+ @Override
+ public Document getDocument() {
+ return new Document(deserializer);
+ }
+ }
+ class LazyUpdateOperation extends ConditionalFeedOperation {
+ private final DocumentDeserializer deserializer;
+ LazyUpdateOperation(DocumentDeserializer deserializer, TestAndSetCondition condition) {
+ super(Type.UPDATE, condition);
+ this.deserializer = deserializer;
+ }
+
+ @Override
+ public DocumentUpdate getDocumentUpdate() {
+ return new DocumentUpdate(deserializer);
+ }
+ }
+ @Override
+ public FeedOperation read() throws Exception {
+ int read = readExact(in, prefix);
+ if (read != prefix.length) {
+ return FeedOperation.INVALID;
+ }
+ ByteBuffer header = ByteBuffer.wrap(prefix);
+ int sz = header.getInt();
+ int type = header.getInt();
+ long hash = header.getLong();
+ byte [] blob = new byte[sz];
+ read = readExact(in, blob);
+ if (read != blob.length) {
+ throw new IllegalArgumentException("Underflow, failed reading " + blob.length + "bytes. Got " + read);
+ }
+ long computedHash = VespaV1Destination.hash(blob, blob.length);
+ if (computedHash != hash) {
+ throw new IllegalArgumentException("Hash mismatch, expected " + hash + ", got " + computedHash);
+ }
+ GrowableByteBuffer buf = GrowableByteBuffer.wrap(blob);
+ String condition = buf.getUtf8String();
+ DocumentDeserializer deser = DocumentDeserializerFactory.createHead(mgr, buf);
+ TestAndSetCondition testAndSetCondition = condition.isEmpty()
+ ? TestAndSetCondition.NOT_PRESENT_CONDITION
+ : new TestAndSetCondition(condition);
+ if (type == DOCUMENT) {
+ return new LazyDocumentOperation(deser, testAndSetCondition);
+ } else if (type == UPDATE) {
+ return new LazyUpdateOperation(deser, testAndSetCondition);
+ } else if (type == REMOVE) {
+ return new RemoveFeedOperation(new DocumentId(deser), testAndSetCondition);
+ } else {
+ throw new IllegalArgumentException("Unknown operation " + type);
+ }
+ }
}
+ private Destination createDumper(FeederParams params) {
+ if (params.getDumpFormat() == FeederParams.DumpFormat.VESPA) {
+ return new VespaV1Destination(params.getDumpStream(), failure, numReplies);
+ }
+ return new JsonDestination(params.getDumpStream(), failure, numReplies);
+ }
SimpleFeeder(FeederParams params) {
- in = params.getStdIn();
+ inputStreams = params.getInputStreams();
out = params.getStdOut();
numThreads = params.getNumDispatchThreads();
mbus = newMessageBus(docTypeMgr, params.getConfigId());
- session = newSession(mbus, this, params.isSerialTransferEnabled());
+ session = newSession(mbus, this, params.getMaxPending());
docTypeMgr.configure(params.getConfigId());
+ benchmarkMode = params.isBenchmarkMode();
destination = (params.getDumpStream() != null)
- ? new JsonDestination(params.getDumpStream(), failure, numReplies)
+ ? createDumper(params)
: new MbusDestination(session, params.getRoute(), failure, params.getStdErr());
}
- private void sendOperation(VespaXMLFeedReader.Operation op) {
- destination.send(op);
- }
-
SourceSession getSourceSession() { return session; }
- private FeedReader createFeedReader() throws Exception {
+ private FeedReader createFeedReader(InputStream in) throws Exception {
in.mark(8);
- byte [] b = new byte[1];
- int numRead = in.read(b);
+ byte [] b = new byte[2];
+ int numRead = readExact(in, b);
in.reset();
if (numRead != b.length) {
throw new IllegalArgumentException("Need to read " + b.length + " bytes to detect format. Got " + numRead + " bytes.");
}
if (b[0] == '[') {
return new JsonFeedReader(in, docTypeMgr);
+ } else if ((b[0] == 'V') && (b[1] == '1')) {
+ return new VespaV1FeedReader(in, docTypeMgr);
} else {
return new VespaXMLFeedReader(in, docTypeMgr);
}
}
+
+
SimpleFeeder run() throws Throwable {
ExecutorService executor = (numThreads > 1)
? new ThreadPoolExecutor(numThreads, numThreads, 0L, TimeUnit.SECONDS,
@@ -179,30 +377,19 @@ public class SimpleFeeder implements ReplyHandler {
ThreadFactoryFactory.getDaemonThreadFactory("perf-feeder"),
new ThreadPoolExecutor.CallerRunsPolicy())
: null;
- FeedReader reader = createFeedReader();
-
- printHeader();
- long numMessages = 0;
- while (failure.get() == null) {
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- reader.read(op);
- if (op.getType() == VespaXMLFeedReader.OperationType.INVALID) {
- break;
- }
- if (executor != null) {
- executor.execute(() -> sendOperation(op));
- } else {
- sendOperation(op);
- }
- ++numMessages;
+ printHeader(out);
+ long numMessagesSent = 0;
+ for (InputStream in : inputStreams) {
+ Metrics m = new Metrics(destination, createFeedReader(in), executor, failure);
+ numMessagesSent += m.feed();
}
- while (failure.get() == null && numReplies.get() < numMessages) {
+ while (failure.get() == null && numReplies.get() < numMessagesSent) {
Thread.sleep(100);
}
if (failure.get() != null) {
throw failure.get();
}
- printReport();
+ printReport(out);
return this;
}
@@ -211,7 +398,7 @@ public class SimpleFeeder implements ReplyHandler {
mbus.destroy();
}
- private static Message newMessage(VespaXMLFeedReader.Operation op) {
+ private static Message newMessage(FeedOperation op) {
switch (op.getType()) {
case DOCUMENT: {
PutDocumentMessage message = new PutDocumentMessage(new DocumentPut(op.getDocument()));
@@ -251,23 +438,19 @@ public class SimpleFeeder implements ReplyHandler {
minLatency = Math.min(minLatency, latency);
maxLatency = Math.max(maxLatency, latency);
sumLatency += latency;
- if (now > nextHeader) {
- printHeader();
- nextHeader += HEADER_INTERVAL;
- }
+ if (benchmarkMode) { return; }
if (now > nextReport) {
- printReport();
+ printReport(out);
nextReport += REPORT_INTERVAL;
}
}
-
- private void printHeader() {
- out.println("total time, num messages, min latency, avg latency, max latency");
+ private static void printHeader(PrintStream out) {
+ out.println("# Time used, num ok, num error, min latency, max latency, average latency");
}
- private void printReport() {
+ private synchronized void printReport(PrintStream out) {
out.format("%10d, %12d, %11d, %11d, %11d\n", System.currentTimeMillis() - startTime,
- numReplies.get(), minLatency, sumLatency / numReplies.get(), maxLatency);
+ numReplies.get(), minLatency, maxLatency, sumLatency / Long.max(1, numReplies.get()));
}
private static String formatErrors(Reply reply) {
@@ -285,11 +468,11 @@ public class SimpleFeeder implements ReplyHandler {
configId);
}
- private static SourceSession newSession(RPCMessageBus mbus, ReplyHandler replyHandler, boolean serial) {
+ private static SourceSession newSession(RPCMessageBus mbus, ReplyHandler replyHandler, int maxPending) {
SourceSessionParams params = new SourceSessionParams();
params.setReplyHandler(replyHandler);
- if (serial) {
- params.setThrottlePolicy(new StaticThrottlePolicy().setMaxPendingCount(1));
+ if (maxPending > 0) {
+ params.setThrottlePolicy(new StaticThrottlePolicy().setMaxPendingCount(maxPending));
}
return mbus.getMessageBus().createSourceSession(params);
}
diff --git a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java
index b2800110a39..5cc5d0bc018 100644
--- a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java
+++ b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java
@@ -5,13 +5,12 @@ import com.yahoo.messagebus.routing.Route;
import org.apache.commons.cli.ParseException;
import org.junit.Test;
-import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.io.PrintStream;
import static org.junit.Assert.assertEquals;
@@ -25,16 +24,14 @@ import static org.junit.Assert.assertTrue;
* @author Simon Thoresen Hult
*/
public class FeederParamsTest {
- static final String TESTFILE = "test.json";
+ private static final String TESTFILE_JSON = "test.json";
+ private static final String TESTFILE_VESPA = "test.vespa";
+ private static final String TESTFILE_UNKNOWN = "test.xyz";
@Test
public void requireThatAccessorsWork() {
FeederParams params = new FeederParams();
- InputStream stdIn = new ByteArrayInputStream(new byte[1]);
- params.setStdIn(stdIn);
- assertSame(stdIn, params.getStdIn());
-
PrintStream stdErr = new PrintStream(new ByteArrayOutputStream());
params.setStdErr(stdErr);
assertSame(stdErr, params.getStdErr());
@@ -46,16 +43,15 @@ public class FeederParamsTest {
params.setConfigId("my_config_id");
assertEquals("my_config_id", params.getConfigId());
- params.setSerialTransfer(false);
assertFalse(params.isSerialTransferEnabled());
- params.setSerialTransfer(true);
+ params.setSerialTransfer();
assertTrue(params.isSerialTransferEnabled());
}
@Test
public void requireThatParamsHaveReasonableDefaults() {
FeederParams params = new FeederParams();
- assertSame(System.in, params.getStdIn());
+ assertSame(System.in, params.getInputStreams().get(0));
assertSame(System.err, params.getStdErr());
assertSame(System.out, params.getStdOut());
assertEquals(Route.parse("default"), params.getRoute());
@@ -66,16 +62,14 @@ public class FeederParamsTest {
@Test
public void requireThatSerialTransferOptionIsParsed() throws ParseException, FileNotFoundException {
assertTrue(new FeederParams().parseArgs("-s").isSerialTransferEnabled());
- assertTrue(new FeederParams().parseArgs("foo", "-s").isSerialTransferEnabled());
- assertTrue(new FeederParams().parseArgs("-s", "foo").isSerialTransferEnabled());
assertTrue(new FeederParams().parseArgs("--serial").isSerialTransferEnabled());
- assertTrue(new FeederParams().parseArgs("foo", "--serial").isSerialTransferEnabled());
- assertTrue(new FeederParams().parseArgs("--serial", "foo").isSerialTransferEnabled());
+ assertEquals(1, new FeederParams().parseArgs("-s").getMaxPending());
+ assertEquals(1, new FeederParams().parseArgs("-s").getNumDispatchThreads());
}
@Test
public void requireThatArgumentsAreParsedAsRoute() throws ParseException, FileNotFoundException {
- assertEquals(Route.parse("foo bar"), new FeederParams().parseArgs("-r foo bar").getRoute());
+ assertEquals(Route.parse("foo bar"), new FeederParams().parseArgs("-r", "foo bar").getRoute());
assertEquals(Route.parse("foo bar"), new FeederParams().parseArgs("--route","foo bar").getRoute());
}
@@ -94,10 +88,41 @@ public class FeederParamsTest {
@Test
public void requireThatDumpStreamAreParsed() throws ParseException, IOException {
assertNull(new FeederParams().getDumpStream());
- OutputStream dumpStream = new FeederParams().parseArgs("-o " + TESTFILE).getDumpStream();
- assertNotNull(dumpStream);
- dumpStream.close();
- assertTrue(new File(TESTFILE).delete());
+
+ FeederParams p = new FeederParams().parseArgs("-o " + TESTFILE_JSON);
+ assertNotNull(p.getDumpStream());
+ assertEquals(FeederParams.DumpFormat.JSON, p.getDumpFormat());
+ p.getDumpStream().close();
+
+ p = new FeederParams().parseArgs("-o " + TESTFILE_VESPA);
+ assertNotNull(p.getDumpStream());
+ assertEquals(FeederParams.DumpFormat.VESPA, p.getDumpFormat());
+ p.getDumpStream().close();
+
+ p = new FeederParams().parseArgs("-o " + TESTFILE_UNKNOWN);
+ assertNotNull(p.getDumpStream());
+ assertEquals(FeederParams.DumpFormat.JSON, p.getDumpFormat());
+ p.getDumpStream().close();
+
+ assertTrue(new File(TESTFILE_JSON).delete());
+ assertTrue(new File(TESTFILE_VESPA).delete());
+ assertTrue(new File(TESTFILE_UNKNOWN).delete());
+ }
+
+ @Test
+ public void requireThatInputFilesAreAggregated() throws ParseException, IOException {
+ File json = new File(TESTFILE_JSON);
+ File vespa = new File(TESTFILE_VESPA);
+ new FileOutputStream(json).close();
+ new FileOutputStream(vespa).close();
+ FeederParams p = new FeederParams();
+ p.parseArgs("-n", "3", TESTFILE_JSON, TESTFILE_VESPA);
+ assertEquals(3, p.getNumDispatchThreads());
+ assertEquals(2, p.getInputStreams().size());
+ assertTrue(p.getInputStreams().get(0) instanceof FileInputStream);
+ assertTrue(p.getInputStreams().get(1) instanceof FileInputStream);
+ json.delete();
+ vespa.delete();
}
}
diff --git a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java
index f93657138ca..8af4dd5dac9 100644
--- a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java
+++ b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java
@@ -11,7 +11,6 @@ import com.yahoo.messagebus.ErrorCode;
import com.yahoo.messagebus.Message;
import com.yahoo.messagebus.MessageHandler;
import com.yahoo.messagebus.Reply;
-import com.yahoo.messagebus.SourceSession;
import com.yahoo.messagebus.StaticThrottlePolicy;
import com.yahoo.messagebus.ThrottlePolicy;
import org.junit.Test;
@@ -19,9 +18,11 @@ import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
import java.util.regex.Pattern;
import static org.junit.Assert.assertEquals;
@@ -131,6 +132,42 @@ public class SimpleFeederTest {
}
@Test
+ public void requireThatJson2VespaFeederWorks() throws Throwable {
+ ByteArrayOutputStream dump = new ByteArrayOutputStream();
+ assertFeed(new FeederParams().setDumpStream(dump).setDumpFormat(FeederParams.DumpFormat.VESPA),
+ "[" +
+ " { \"put\": \"id:simple:simple::0\", \"fields\": { \"my_str\":\"foo\"}}," +
+ " { \"update\": \"id:simple:simple::1\", \"fields\": { \"my_str\": { \"assign\":\"bar\"}}}," +
+ " { \"remove\": \"id:simple:simple::2\", \"condition\":\"true\"}" +
+ "]",
+ new MessageHandler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ Reply reply = ((DocumentMessage)msg).createReply();
+ reply.swapState(msg);
+ reply.popHandler().handleReply(reply);
+ }
+ },
+ "",
+ "(.+\n)+" +
+ "\\s*\\d+,\\s*3,.+\n");
+ assertEquals(187, dump.size());
+ assertFeed(new ByteArrayInputStream(dump.toByteArray()),
+ new MessageHandler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Reply reply = ((DocumentMessage)msg).createReply();
+ reply.swapState(msg);
+ reply.popHandler().handleReply(reply);
+ }
+ },
+ "",
+ "(.+\n)+" +
+ "\\s*\\d+,\\s*3,.+\n");
+ }
+
+ @Test
public void requireThatJsonFeederWorks() throws Throwable {
assertFeed("[" +
" { \"put\": \"id:simple:simple::0\", \"fields\": { \"my_str\":\"foo\"}}," +
@@ -221,7 +258,7 @@ public class SimpleFeederTest {
@Test
public void requireThatSerialTransferModeConfiguresStaticThrottling() throws Exception {
- TestDriver driver = new TestDriver(new FeederParams().setSerialTransfer(true), "", null);
+ TestDriver driver = new TestDriver(new FeederParams().setSerialTransfer(), "", null);
assertEquals(StaticThrottlePolicy.class, getThrottlePolicy(driver).getClass());
assertTrue(driver.close());
}
@@ -243,8 +280,13 @@ public class SimpleFeederTest {
private static void assertFeed(String in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable {
assertFeed(new FeederParams(), in, validator, expectedErr, expectedOut);
}
- private static void assertFeed(FeederParams params, String in, MessageHandler validator, String expectedErr, String expectedOut)
- throws Throwable {
+ private static void assertFeed(InputStream in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable {
+ assertFeed(new FeederParams(), in, validator, expectedErr, expectedOut);
+ }
+ private static void assertFeed(FeederParams params, String in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable {
+ assertFeed(params, new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8)), validator, expectedErr, expectedOut);
+ }
+ private static void assertFeed(FeederParams params, InputStream in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable {
TestDriver driver = new TestDriver(params, in, validator);
driver.run();
assertMatches(expectedErr, new String(driver.err.toByteArray(), StandardCharsets.UTF_8));
@@ -265,12 +307,14 @@ public class SimpleFeederTest {
final SimpleFeeder feeder;
final SimpleServer server;
- TestDriver(FeederParams params, String in, MessageHandler validator)
- throws IOException, ListenFailedException {
+ TestDriver(FeederParams params, String in, MessageHandler validator) throws IOException, ListenFailedException {
+ this(params, new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8)), validator);
+ }
+ TestDriver(FeederParams params, InputStream in, MessageHandler validator) throws IOException, ListenFailedException {
server = new SimpleServer(CONFIG_DIR, validator);
feeder = new SimpleFeeder(params.setConfigId("dir:" + CONFIG_DIR)
.setStdErr(new PrintStream(err))
- .setStdIn(new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8)))
+ .setInputStreams(Arrays.asList(in))
.setStdOut(new PrintStream(out)));
}
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java
index cfa77455f41..a6fdcb10a00 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java
@@ -1,7 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.document.restapi;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
+import com.yahoo.vespaxmlparser.FeedOperation;
import java.util.Optional;
@@ -90,9 +90,9 @@ public interface OperationHandler {
VisitResult visit(RestUri restUri, String documentSelection, VisitOptions options) throws RestApiException;
- void put(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException;
+ void put(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException;
- void update(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException;
+ void update(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException;
void delete(RestUri restUri, String condition, Optional<String> route) throws RestApiException;
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java
index bfc4a611a5e..b9bbe4f792e 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java
@@ -25,6 +25,7 @@ import com.yahoo.messagebus.StaticThrottlePolicy;
import com.yahoo.metrics.simple.MetricReceiver;
import com.yahoo.vdslib.VisitorOrdering;
import com.yahoo.vespaclient.ClusterDef;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import com.yahoo.yolean.concurrent.ConcurrentResourcePool;
import com.yahoo.yolean.concurrent.ResourceFactory;
@@ -201,7 +202,7 @@ public class OperationHandlerImpl implements OperationHandler {
}
@Override
- public void put(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException {
+ public void put(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException {
SyncSession syncSession = syncSessions.alloc();
Response response;
try {
@@ -225,7 +226,7 @@ public class OperationHandlerImpl implements OperationHandler {
}
@Override
- public void update(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException {
+ public void update(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException {
SyncSession syncSession = syncSessions.alloc();
Response response;
try {
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java
index 880ea2102ab..873b0569553 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java
@@ -33,6 +33,8 @@ import com.yahoo.vespa.config.content.LoadTypeConfig;
import com.yahoo.vespa.config.content.AllClustersBucketSpacesConfig;
import com.yahoo.vespaclient.ClusterDef;
import com.yahoo.vespaclient.ClusterList;
+import com.yahoo.vespaxmlparser.DocumentFeedOperation;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import java.io.IOException;
@@ -236,23 +238,21 @@ public class RestApi extends LoggingRequestHandler {
return new Response(200, resultJson, Optional.of(restUri));
}
- private VespaXMLFeedReader.Operation createPutOperation(HttpRequest request, String id, String condition) {
- final VespaXMLFeedReader.Operation operationPut =
- singleDocumentParser.parsePut(request.getData(), id);
+ private FeedOperation createPutOperation(HttpRequest request, String id, String condition) {
+ FeedOperation put = singleDocumentParser.parsePut(request.getData(), id);
if (condition != null && ! condition.isEmpty()) {
- operationPut.setCondition(new TestAndSetCondition(condition));
+ return new DocumentFeedOperation(put.getDocument(), new TestAndSetCondition(condition));
}
- return operationPut;
+ return put;
}
- private VespaXMLFeedReader.Operation createUpdateOperation(HttpRequest request, String id, String condition, Optional<Boolean> create) {
- final VespaXMLFeedReader.Operation operationUpdate =
- singleDocumentParser.parseUpdate(request.getData(), id);
+ private FeedOperation createUpdateOperation(HttpRequest request, String id, String condition, Optional<Boolean> create) {
+ FeedOperation update = singleDocumentParser.parseUpdate(request.getData(), id);
if (condition != null && ! condition.isEmpty()) {
- operationUpdate.getDocumentUpdate().setCondition(new TestAndSetCondition(condition));
+ update.getDocumentUpdate().setCondition(new TestAndSetCondition(condition));
}
- create.ifPresent(c -> operationUpdate.getDocumentUpdate().setCreateIfNonExistent(c));
- return operationUpdate;
+ create.ifPresent(c -> update.getDocumentUpdate().setCreateIfNonExistent(c));
+ return update;
}
private HttpResponse handleGet(RestUri restUri, HttpRequest request) throws RestApiException {
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java
index ac2c9515d71..947fcb637fb 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java
@@ -17,6 +17,7 @@ import com.yahoo.net.HostName;
import com.yahoo.vespa.http.client.core.ErrorCode;
import com.yahoo.vespa.http.client.core.Headers;
import com.yahoo.vespa.http.client.core.OperationStatus;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import com.yahoo.yolean.Exceptions;
@@ -274,7 +275,7 @@ class ClientFeederV3 {
/** Returns the next message in the stream, or null if none */
protected DocumentOperationMessageV3 getNextMessage(
String operationId, InputStream requestInputStream, FeederSettings settings) throws Exception {
- VespaXMLFeedReader.Operation operation = streamReaderV3.getNextOperation(requestInputStream, settings);
+ FeedOperation operation = streamReaderV3.getNextOperation(requestInputStream, settings);
// This is a bit hard to set up while testing, so we accept that things are not perfect.
if (sourceSession.getResource().session() != null) {
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java
index ca2fdd6b329..6df6bba5a59 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java
@@ -9,11 +9,7 @@ import com.yahoo.documentapi.messagebus.protocol.RemoveDocumentMessage;
import com.yahoo.documentapi.messagebus.protocol.UpdateDocumentMessage;
import com.yahoo.jdisc.Metric;
import com.yahoo.messagebus.Message;
-import com.yahoo.messagebus.routing.ErrorDirective;
-import com.yahoo.messagebus.routing.Hop;
-import com.yahoo.messagebus.routing.Route;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
-import com.yahoo.yolean.Exceptions;
+import com.yahoo.vespaxmlparser.FeedOperation;
/**
* Keeps an operation with its message.
@@ -40,18 +36,7 @@ class DocumentOperationMessageV3 {
return operationId;
}
- static DocumentOperationMessageV3 newErrorMessage(String operationId, Exception exception) {
- Message feedErrorMessageV3 = new FeedErrorMessage(operationId);
- DocumentOperationMessageV3 msg = new DocumentOperationMessageV3(operationId, feedErrorMessageV3);
- Hop hop = new Hop();
- hop.addDirective(new ErrorDirective(Exceptions.toMessageString(exception)));
- Route route = new Route();
- route.addHop(hop);
- feedErrorMessageV3.setRoute(route);
- return msg;
- }
-
- static DocumentOperationMessageV3 newUpdateMessage(VespaXMLFeedReader.Operation op, String operationId) {
+ private static DocumentOperationMessageV3 newUpdateMessage(FeedOperation op, String operationId) {
DocumentUpdate update = op.getDocumentUpdate();
update.setCondition(op.getCondition());
Message msg = new UpdateDocumentMessage(update);
@@ -60,7 +45,7 @@ class DocumentOperationMessageV3 {
return new DocumentOperationMessageV3(id, msg);
}
- static DocumentOperationMessageV3 newRemoveMessage(VespaXMLFeedReader.Operation op, String operationId) {
+ static DocumentOperationMessageV3 newRemoveMessage(FeedOperation op, String operationId) {
DocumentRemove remove = new DocumentRemove(op.getRemove());
remove.setCondition(op.getCondition());
Message msg = new RemoveDocumentMessage(remove);
@@ -69,7 +54,7 @@ class DocumentOperationMessageV3 {
return new DocumentOperationMessageV3(id, msg);
}
- static DocumentOperationMessageV3 newPutMessage(VespaXMLFeedReader.Operation op, String operationId) {
+ private static DocumentOperationMessageV3 newPutMessage(FeedOperation op, String operationId) {
DocumentPut put = new DocumentPut(op.getDocument());
put.setCondition(op.getCondition());
Message msg = new PutDocumentMessage(put);
@@ -78,7 +63,7 @@ class DocumentOperationMessageV3 {
return new DocumentOperationMessageV3(id, msg);
}
- static DocumentOperationMessageV3 create(VespaXMLFeedReader.Operation operation, String operationId, Metric metric) {
+ static DocumentOperationMessageV3 create(FeedOperation operation, String operationId, Metric metric) {
switch (operation.getType()) {
case DOCUMENT:
metric.add(MetricNames.NUM_PUTS, 1, null /*metricContext*/);
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java
index 00290c4fb09..69f810ad4c7 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java
@@ -5,8 +5,8 @@ import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.document.DocumentTypeManager;
import com.yahoo.vespa.http.client.core.Encoder;
import com.yahoo.vespa.http.server.util.ByteLimitedInputStream;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.FeedReader;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import java.io.IOException;
import java.io.InputStream;
@@ -30,15 +30,14 @@ public class StreamReaderV3 {
this.docTypeManager = docTypeManager;
}
- public VespaXMLFeedReader.Operation getNextOperation(
- InputStream requestInputStream, FeederSettings settings) throws Exception {
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
+ public FeedOperation getNextOperation(InputStream requestInputStream, FeederSettings settings) throws Exception {
+ FeedOperation op = null;
int length = readByteLength(requestInputStream);
try (InputStream limitedInputStream = new ByteLimitedInputStream(requestInputStream, length)){
FeedReader reader = feedReaderFactory.createReader(limitedInputStream, docTypeManager, settings.dataFormat);
- reader.read(op);
+ op = reader.read();
}
return op;
}
diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java
index fbaa7f86bd0..1e982c7b700 100644
--- a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java
+++ b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java
@@ -5,6 +5,7 @@ import com.yahoo.document.restapi.OperationHandler;
import com.yahoo.document.restapi.Response;
import com.yahoo.document.restapi.RestApiException;
import com.yahoo.document.restapi.RestUri;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import java.util.Optional;
@@ -31,13 +32,13 @@ public class MockedOperationHandler implements OperationHandler {
@Override
@SuppressWarnings("deprecation")
- public void put(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException {
+ public void put(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException {
log.append("PUT: " + data.getDocument().getId());
log.append(data.getDocument().getBody().toString());
}
@Override
- public void update(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException {
+ public void update(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException {
log.append("UPDATE: " + data.getDocumentUpdate().getId());
log.append(data.getDocumentUpdate().fieldUpdates().toString());
if (data.getDocumentUpdate().getCreateIfNonExistent()) {
diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java b/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java
index 106dd71b83c..04b66480a82 100644
--- a/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java
+++ b/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java
@@ -18,8 +18,8 @@ import com.yahoo.messagebus.shared.SharedMessageBus;
import com.yahoo.messagebus.shared.SharedSourceSession;
import com.yahoo.metrics.simple.MetricReceiver;
import com.yahoo.vespa.http.client.core.Headers;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.MockFeedReaderFactory;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import org.junit.Before;
import org.junit.Test;
@@ -45,8 +45,7 @@ public class V3CongestionTestCase {
ClientFeederWithMocks(ReferencedResource<SharedSourceSession> sourceSession, FeedReaderFactory feedReaderFactory, DocumentTypeManager docTypeManager, String clientId, Metric metric, ReplyHandler feedReplyHandler, AtomicInteger threadsAvailableForFeeding) {
super(sourceSession, feedReaderFactory, docTypeManager, clientId, metric, feedReplyHandler, threadsAvailableForFeeding);
// The operation to return from the client feeder.
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- docOp = DocumentOperationMessageV3.newRemoveMessage(op, "operation id");
+ docOp = DocumentOperationMessageV3.newRemoveMessage(FeedOperation.INVALID, "operation id");
}
diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java b/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java
index b399b1197da..eabbb2dab20 100644
--- a/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java
+++ b/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java
@@ -7,7 +7,6 @@ import com.yahoo.document.DocumentType;
import com.yahoo.document.DocumentUpdate;
import com.yahoo.vespa.http.server.MetaStream;
import com.yahoo.vespa.http.server.util.ByteLimitedInputStream;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation;
import java.io.InputStream;
import java.lang.reflect.Field;
@@ -45,9 +44,9 @@ public class MockReader implements FeedReader {
}
@Override
- public void read(Operation operation) throws Exception {
+ public FeedOperation read() throws Exception {
if (finished) {
- return;
+ return FeedOperation.INVALID;
}
byte whatToDo = stream.getNextOperation();
@@ -55,19 +54,14 @@ public class MockReader implements FeedReader {
DocumentType docType = new DocumentType("banana");
switch (whatToDo) {
case 0:
- finished = true;
- break;
+ return FeedOperation.INVALID;
case 1:
- Document doc = new Document(docType, id);
- operation.setDocument(doc);
- break;
+ return new DocumentFeedOperation(new Document(docType, id));
case 2:
- operation.setRemove(id);
- break;
+ return new RemoveFeedOperation(id);
case 3:
- operation.setDocumentUpdate(new DocumentUpdate(docType, id));
- break;
- case 4:
+ return new DocumentUpdateFeedOperation(new DocumentUpdate(docType, id));
+ default:
throw new RuntimeException("boom");
}
}
diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java
index e354cba141d..19d074a0ead 100644
--- a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java
+++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java
@@ -10,8 +10,8 @@ import java.util.List;
import javax.xml.stream.XMLStreamException;
import com.yahoo.document.DocumentTypeManager;
+import com.yahoo.vespaxmlparser.FeedOperation;
import com.yahoo.vespaxmlparser.FeedReader;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
/**
* Base class for unpacking document operation streams and pushing to feed
@@ -80,14 +80,13 @@ public abstract class Feeder {
while (!sender.isAborted()) {
try {
- VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation();
- reader.read(op);
+ FeedOperation op = reader.read();
if (createIfNonExistent && op.getDocumentUpdate() != null) {
op.getDocumentUpdate().setCreateIfNonExistent(true);
}
// Done feeding.
- if (op.getType() == VespaXMLFeedReader.OperationType.INVALID) {
+ if (op.getType() == FeedOperation.Type.INVALID) {
break;
} else {
sender.sendOperation(op);
diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java
index b441e81a829..a1666a83856 100755
--- a/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java
+++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java
@@ -1,7 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.feedapi;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
+import com.yahoo.vespaxmlparser.FeedOperation;
/**
* Wrapper class for SimpleFeedAccess to send various XML operations.
@@ -18,7 +18,7 @@ public class VespaFeedSender {
return sender.isAborted();
}
- public void sendOperation(VespaXMLFeedReader.Operation op) {
+ public void sendOperation(FeedOperation op) {
switch (op.getType()) {
case DOCUMENT:
sender.put(op.getDocument(), op.getCondition());