Compare commits
9 Commits
62516825d1
...
479b39d055
Author | SHA1 | Date | |
---|---|---|---|
479b39d055 | |||
482408d725 | |||
45995e3307 | |||
359b0b29ff | |||
54e47ebd40 | |||
1c9dda68a6 | |||
142455dd28 | |||
567d385fbd | |||
8a44055533 |
183
ConflictSet.cpp
183
ConflictSet.cpp
@@ -40,11 +40,13 @@ limitations under the License.
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
|
||||
#ifndef __SANITIZE_THREAD__
|
||||
#if defined(__has_feature)
|
||||
#if __has_feature(thread_sanitizer)
|
||||
#define __SANITIZE_THREAD__
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <memcheck.h>
|
||||
|
||||
@@ -1123,12 +1125,68 @@ Node *getFirstChildExists(Node *self) {
|
||||
}
|
||||
}
|
||||
|
||||
// Caller is responsible for assigning a non-null pointer to the returned
|
||||
// reference if null. Updates child's max version to `newMaxVersion` if child
|
||||
// exists but does not have a partial key.
|
||||
Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
void consumePartialKeyFull(Node *&self, std::span<const uint8_t> &key,
|
||||
InternalVersionT writeVersion, WriteContext *tls) {
|
||||
// Handle an existing partial key
|
||||
int commonLen = std::min<int>(self->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(self->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < self->partialKeyLen) {
|
||||
auto *old = self;
|
||||
// Since root cannot have a partial key
|
||||
assert(old->parent != nullptr);
|
||||
InternalVersionT oldMaxVersion = exchangeMaxVersion(old, writeVersion);
|
||||
|
||||
// *self will have one child (old)
|
||||
auto *newSelf = tls->allocate<Node3>(partialKeyIndex);
|
||||
|
||||
newSelf->parent = old->parent;
|
||||
newSelf->parentsIndex = old->parentsIndex;
|
||||
newSelf->partialKeyLen = partialKeyIndex;
|
||||
newSelf->entryPresent = false;
|
||||
newSelf->numChildren = 1;
|
||||
|
||||
memcpy(newSelf->partialKey(), old->partialKey(), newSelf->partialKeyLen);
|
||||
|
||||
uint8_t oldDistinguishingByte = old->partialKey()[partialKeyIndex];
|
||||
old->parent = newSelf;
|
||||
old->parentsIndex = oldDistinguishingByte;
|
||||
newSelf->index[0] = oldDistinguishingByte;
|
||||
newSelf->children[0] = old;
|
||||
newSelf->childMaxVersion[0] = oldMaxVersion;
|
||||
self = newSelf;
|
||||
|
||||
memmove(old->partialKey(), old->partialKey() + partialKeyIndex + 1,
|
||||
old->partialKeyLen - (partialKeyIndex + 1));
|
||||
old->partialKeyLen -= partialKeyIndex + 1;
|
||||
|
||||
// We would consider decreasing capacity here, but we can't invalidate
|
||||
// old since it's not on the search path. setOldestVersion will clean it
|
||||
// up.
|
||||
}
|
||||
key = key.subspan(partialKeyIndex, key.size() - partialKeyIndex);
|
||||
}
|
||||
|
||||
// Consume any partial key of `self`, and update `self` and
|
||||
// `key` such that `self` is along the search path of `key`
|
||||
inline __attribute__((always_inline)) void
|
||||
consumePartialKey(Node *&self, std::span<const uint8_t> &key,
|
||||
InternalVersionT writeVersion, WriteContext *tls) {
|
||||
if (self->partialKeyLen > 0) {
|
||||
consumePartialKeyFull(self, key, writeVersion, tls);
|
||||
}
|
||||
}
|
||||
|
||||
// Return the next node along the search path of key, consuming bytes of key
|
||||
// such that the search path of the result + key is the same as the search path
|
||||
// of self + key before the call. Creates a node if necessary. Updates
|
||||
// `maxVersion` for result.
|
||||
Node *&getOrCreateChild(Node *&self, std::span<const uint8_t> &key,
|
||||
InternalVersionT newMaxVersion, WriteContext *tls) {
|
||||
|
||||
int index = key.front();
|
||||
key = key.subspan(1, key.size() - 1);
|
||||
|
||||
// Fast path for if it exists already
|
||||
switch (self->getType()) {
|
||||
case Type_Node0:
|
||||
@@ -1137,9 +1195,8 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
auto *self3 = static_cast<Node3 *>(self);
|
||||
int i = getNodeIndex(self3, index);
|
||||
if (i >= 0) {
|
||||
if (self3->children[i]->partialKeyLen == 0) {
|
||||
consumePartialKey(self3->children[i], key, newMaxVersion, tls);
|
||||
self3->childMaxVersion[i] = newMaxVersion;
|
||||
}
|
||||
return self3->children[i];
|
||||
}
|
||||
} break;
|
||||
@@ -1147,9 +1204,8 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
auto *self16 = static_cast<Node16 *>(self);
|
||||
int i = getNodeIndex(self16, index);
|
||||
if (i >= 0) {
|
||||
if (self16->children[i]->partialKeyLen == 0) {
|
||||
consumePartialKey(self16->children[i], key, newMaxVersion, tls);
|
||||
self16->childMaxVersion[i] = newMaxVersion;
|
||||
}
|
||||
return self16->children[i];
|
||||
}
|
||||
} break;
|
||||
@@ -1157,23 +1213,21 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
auto *self48 = static_cast<Node48 *>(self);
|
||||
int secondIndex = self48->index[index];
|
||||
if (secondIndex >= 0) {
|
||||
if (self48->children[secondIndex]->partialKeyLen == 0) {
|
||||
consumePartialKey(self48->children[secondIndex], key, newMaxVersion, tls);
|
||||
self48->childMaxVersion[secondIndex] = newMaxVersion;
|
||||
self48->maxOfMax[secondIndex >> Node48::kMaxOfMaxShift] =
|
||||
std::max(self48->maxOfMax[secondIndex >> Node48::kMaxOfMaxShift],
|
||||
newMaxVersion);
|
||||
}
|
||||
return self48->children[secondIndex];
|
||||
}
|
||||
} break;
|
||||
case Type_Node256: {
|
||||
auto *self256 = static_cast<Node256 *>(self);
|
||||
if (auto &result = self256->children[index]; result != nullptr) {
|
||||
if (self256->children[index]->partialKeyLen == 0) {
|
||||
consumePartialKey(result, key, newMaxVersion, tls);
|
||||
self256->childMaxVersion[index] = newMaxVersion;
|
||||
self256->maxOfMax[index >> Node256::kMaxOfMaxShift] = std::max(
|
||||
self256->maxOfMax[index >> Node256::kMaxOfMaxShift], newMaxVersion);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
} break;
|
||||
@@ -1181,6 +1235,14 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
|
||||
auto *newChild = tls->allocate<Node0>(key.size());
|
||||
newChild->numChildren = 0;
|
||||
newChild->entryPresent = false;
|
||||
newChild->partialKeyLen = key.size();
|
||||
newChild->parentsIndex = index;
|
||||
memcpy(newChild->partialKey(), key.data(), key.size());
|
||||
key = {};
|
||||
|
||||
switch (self->getType()) {
|
||||
case Type_Node0: {
|
||||
auto *self0 = static_cast<Node0 *>(self);
|
||||
@@ -1215,8 +1277,10 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
}
|
||||
self3->index[i + 1] = index;
|
||||
auto &result = self3->children[i + 1];
|
||||
result = nullptr;
|
||||
self3->childMaxVersion[i + 1] = newMaxVersion;
|
||||
result = newChild;
|
||||
++self->numChildren;
|
||||
newChild->parent = self;
|
||||
return result;
|
||||
}
|
||||
case Type_Node16: {
|
||||
@@ -1243,8 +1307,10 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
}
|
||||
self16->index[i + 1] = index;
|
||||
auto &result = self16->children[i + 1];
|
||||
result = nullptr;
|
||||
self16->childMaxVersion[i + 1] = newMaxVersion;
|
||||
result = newChild;
|
||||
++self->numChildren;
|
||||
newChild->parent = self;
|
||||
return result;
|
||||
}
|
||||
case Type_Node48: {
|
||||
@@ -1267,7 +1333,11 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
self48->index[index] = nextFree;
|
||||
self48->reverseIndex[nextFree] = index;
|
||||
auto &result = self48->children[nextFree];
|
||||
result = nullptr;
|
||||
self48->childMaxVersion[nextFree] = newMaxVersion;
|
||||
self48->maxOfMax[nextFree >> Node48::kMaxOfMaxShift] = std::max(
|
||||
newMaxVersion, self48->maxOfMax[nextFree >> Node48::kMaxOfMaxShift]);
|
||||
result = newChild;
|
||||
newChild->parent = self;
|
||||
return result;
|
||||
}
|
||||
case Type_Node256: {
|
||||
@@ -1276,7 +1346,13 @@ Node *&getOrCreateChild(Node *&self, uint8_t index,
|
||||
auto *self256 = static_cast<Node256 *>(self);
|
||||
++self->numChildren;
|
||||
self256->bitSet.set(index);
|
||||
return self256->children[index];
|
||||
auto &result = self256->children[index];
|
||||
self256->childMaxVersion[index] = newMaxVersion;
|
||||
self256->maxOfMax[index >> Node256::kMaxOfMaxShift] = std::max(
|
||||
newMaxVersion, self256->maxOfMax[index >> Node256::kMaxOfMaxShift]);
|
||||
result = newChild;
|
||||
newChild->parent = self;
|
||||
return result;
|
||||
}
|
||||
default: // GCOVR_EXCL_LINE
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
@@ -2716,51 +2792,6 @@ checkMaxBetweenExclusiveImpl<true>(Node *n, int begin, int end,
|
||||
InternalVersionT readVersion, ReadContext *);
|
||||
#endif
|
||||
|
||||
// Consume the partial key of `self` (which must exist), and update `self` and
|
||||
// `key` such that `self` is along the search path of `key`
|
||||
void consumePartialKey(Node *&self, std::span<const uint8_t> &key,
|
||||
InternalVersionT writeVersion, WriteContext *tls) {
|
||||
assert(self->partialKeyLen > 0);
|
||||
// Handle an existing partial key
|
||||
int commonLen = std::min<int>(self->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(self->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < self->partialKeyLen) {
|
||||
auto *old = self;
|
||||
// Since root cannot have a partial key
|
||||
assert(old->parent != nullptr);
|
||||
InternalVersionT oldMaxVersion = exchangeMaxVersion(old, writeVersion);
|
||||
|
||||
// *self will have one child (old)
|
||||
auto *newSelf = tls->allocate<Node3>(partialKeyIndex);
|
||||
|
||||
newSelf->parent = old->parent;
|
||||
newSelf->parentsIndex = old->parentsIndex;
|
||||
newSelf->partialKeyLen = partialKeyIndex;
|
||||
newSelf->entryPresent = false;
|
||||
newSelf->numChildren = 1;
|
||||
|
||||
memcpy(newSelf->partialKey(), old->partialKey(), newSelf->partialKeyLen);
|
||||
|
||||
uint8_t oldDistinguishingByte = old->partialKey()[partialKeyIndex];
|
||||
old->parent = newSelf;
|
||||
old->parentsIndex = oldDistinguishingByte;
|
||||
newSelf->index[0] = oldDistinguishingByte;
|
||||
newSelf->children[0] = old;
|
||||
newSelf->childMaxVersion[0] = oldMaxVersion;
|
||||
self = newSelf;
|
||||
|
||||
memmove(old->partialKey(), old->partialKey() + partialKeyIndex + 1,
|
||||
old->partialKeyLen - (partialKeyIndex + 1));
|
||||
old->partialKeyLen -= partialKeyIndex + 1;
|
||||
|
||||
// We would consider decreasing capacity here, but we can't invalidate
|
||||
// old since it's not on the search path. setOldestVersion will clean it
|
||||
// up.
|
||||
}
|
||||
key = key.subspan(partialKeyIndex, key.size() - partialKeyIndex);
|
||||
}
|
||||
|
||||
// Returns a pointer the pointer to the newly inserted node in the tree. Caller
|
||||
// must set `entryPresent`, and `entry` fields. All nodes along the search path
|
||||
// of the result will have `maxVersion` set to `writeVersion` as a
|
||||
@@ -2773,36 +2804,12 @@ Node **insert(Node **self, std::span<const uint8_t> key,
|
||||
assert(maxVersion(*self, impl) <= writeVersion);
|
||||
setMaxVersion(*self, impl, writeVersion);
|
||||
|
||||
for (;; ++tls->accum.insert_iterations) {
|
||||
|
||||
if (key.size() == 0) {
|
||||
for (; key.size() != 0; ++tls->accum.insert_iterations) {
|
||||
self = &getOrCreateChild(*self, key, writeVersion, tls);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
auto &child = getOrCreateChild(*self, key.front(), writeVersion, tls);
|
||||
if (!child) {
|
||||
child = tls->allocate<Node0>(key.size() - 1);
|
||||
child->numChildren = 0;
|
||||
child->entryPresent = false;
|
||||
child->partialKeyLen = key.size() - 1;
|
||||
child->parent = *self;
|
||||
child->parentsIndex = key.front();
|
||||
setMaxVersion(child, impl, writeVersion);
|
||||
memcpy(child->partialKey(), key.data() + 1, child->partialKeyLen);
|
||||
return &child;
|
||||
}
|
||||
|
||||
self = &child;
|
||||
key = key.subspan(1, key.size() - 1);
|
||||
|
||||
if ((*self)->partialKeyLen > 0) {
|
||||
consumePartialKey(*self, key, writeVersion, tls);
|
||||
assert(maxVersion(*self, impl) <= writeVersion);
|
||||
setMaxVersion(*self, impl, writeVersion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void destroyTree(Node *root) {
|
||||
Arena arena;
|
||||
auto toFree = vector<Node *>(arena);
|
||||
|
@@ -11,6 +11,14 @@
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
|
||||
#ifndef __SANITIZE_THREAD__
|
||||
#if defined(__has_feature)
|
||||
#if __has_feature(thread_sanitizer)
|
||||
#define __SANITIZE_THREAD__
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HAS_AVX) || defined(HAS_ARM_NEON)
|
||||
constexpr int kStride = 64;
|
||||
#else
|
||||
@@ -117,7 +125,7 @@ __attribute__((target("default")))
|
||||
inline int
|
||||
longestCommonPrefix(const uint8_t *ap, const uint8_t *bp, int cl) {
|
||||
if (!(cl >= 0)) {
|
||||
__builtin_unreachable();
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
|
BIN
corpus/00c9af5b41b4ae33c12623b6683b5a0315a6a4d4
Normal file
BIN
corpus/00c9af5b41b4ae33c12623b6683b5a0315a6a4d4
Normal file
Binary file not shown.
BIN
corpus/04aae30fd4c1fa9678360ee983a87c11b2d687b4
Normal file
BIN
corpus/04aae30fd4c1fa9678360ee983a87c11b2d687b4
Normal file
Binary file not shown.
BIN
corpus/0c7354a5cee7966f239e458621f9b264f4b6f30e
Normal file
BIN
corpus/0c7354a5cee7966f239e458621f9b264f4b6f30e
Normal file
Binary file not shown.
BIN
corpus/134be17afe8ab5ca62ce76cfafd523b581e90bb9
Normal file
BIN
corpus/134be17afe8ab5ca62ce76cfafd523b581e90bb9
Normal file
Binary file not shown.
BIN
corpus/16946b8d264a686b091def79de1bfb866a76b167
Normal file
BIN
corpus/16946b8d264a686b091def79de1bfb866a76b167
Normal file
Binary file not shown.
BIN
corpus/1e7430360594743dae681f79880d275d6178b76a
Normal file
BIN
corpus/1e7430360594743dae681f79880d275d6178b76a
Normal file
Binary file not shown.
BIN
corpus/35e6c44a434a927dbd99a1bb6ddecbd0ecb45754
Normal file
BIN
corpus/35e6c44a434a927dbd99a1bb6ddecbd0ecb45754
Normal file
Binary file not shown.
BIN
corpus/36ae24ff8ae3dae3302e12bcb2acbb7e2574a148
Normal file
BIN
corpus/36ae24ff8ae3dae3302e12bcb2acbb7e2574a148
Normal file
Binary file not shown.
BIN
corpus/3bed999a619dbe2eedee03ad5a2d2e8cdbef62f8
Normal file
BIN
corpus/3bed999a619dbe2eedee03ad5a2d2e8cdbef62f8
Normal file
Binary file not shown.
BIN
corpus/3c74b098773c633bb593dc139aaef296e59bd766
Normal file
BIN
corpus/3c74b098773c633bb593dc139aaef296e59bd766
Normal file
Binary file not shown.
BIN
corpus/3d931de827b1030b3e1d35b36a35395b332d80a9
Normal file
BIN
corpus/3d931de827b1030b3e1d35b36a35395b332d80a9
Normal file
Binary file not shown.
BIN
corpus/48330eecab1796945467ce1bc5896e96c6ee0cd6
Normal file
BIN
corpus/48330eecab1796945467ce1bc5896e96c6ee0cd6
Normal file
Binary file not shown.
BIN
corpus/4ad43b5c18088e5f1aedca8ebaddeb509dc5e268
Normal file
BIN
corpus/4ad43b5c18088e5f1aedca8ebaddeb509dc5e268
Normal file
Binary file not shown.
BIN
corpus/4cd1d2a53abe09e67d764ad05991fc0c49261eb3
Normal file
BIN
corpus/4cd1d2a53abe09e67d764ad05991fc0c49261eb3
Normal file
Binary file not shown.
BIN
corpus/4e6104dac785c753c166da59ea1a1646217bfc6e
Normal file
BIN
corpus/4e6104dac785c753c166da59ea1a1646217bfc6e
Normal file
Binary file not shown.
BIN
corpus/655fb2b824e340200fd4d07474edd006a4c652bb
Normal file
BIN
corpus/655fb2b824e340200fd4d07474edd006a4c652bb
Normal file
Binary file not shown.
1
corpus/66dd4e8dcb924609d0befb8846f1a0ed77891d80
Normal file
1
corpus/66dd4e8dcb924609d0befb8846f1a0ed77891d80
Normal file
@@ -0,0 +1 @@
|
||||
n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2nn<EFBFBD><EFBFBD><EFBFBD>
|
BIN
corpus/692b1f55a7228b3a49c6d0588fb32c228105b680
Normal file
BIN
corpus/692b1f55a7228b3a49c6d0588fb32c228105b680
Normal file
Binary file not shown.
BIN
corpus/6bfe56396c580d3af96fabf0a10e579b2efa17f1
Normal file
BIN
corpus/6bfe56396c580d3af96fabf0a10e579b2efa17f1
Normal file
Binary file not shown.
BIN
corpus/6ea4c6f98ac399c0df7adf15f0f988f316c87743
Normal file
BIN
corpus/6ea4c6f98ac399c0df7adf15f0f988f316c87743
Normal file
Binary file not shown.
BIN
corpus/7a7e83fe9786d524affcd89b11b999a895ed41e2
Normal file
BIN
corpus/7a7e83fe9786d524affcd89b11b999a895ed41e2
Normal file
Binary file not shown.
BIN
corpus/7b521af42edcb97bf09e40f9c773cce413303d3d
Normal file
BIN
corpus/7b521af42edcb97bf09e40f9c773cce413303d3d
Normal file
Binary file not shown.
BIN
corpus/7d30c505fa35817155c05a28865f0b717d5dafbb
Normal file
BIN
corpus/7d30c505fa35817155c05a28865f0b717d5dafbb
Normal file
Binary file not shown.
BIN
corpus/7f8c814a9018ab9d468594964d6e7cae361a417d
Normal file
BIN
corpus/7f8c814a9018ab9d468594964d6e7cae361a417d
Normal file
Binary file not shown.
BIN
corpus/83b156a1226eb956277c17866de80aa445c1a957
Normal file
BIN
corpus/83b156a1226eb956277c17866de80aa445c1a957
Normal file
Binary file not shown.
BIN
corpus/8c2d3625dd46e54bf7a6b17a1ba52c7a61aa5c34
Normal file
BIN
corpus/8c2d3625dd46e54bf7a6b17a1ba52c7a61aa5c34
Normal file
Binary file not shown.
BIN
corpus/948ad422bf8ada9dd219e01f173f566589ce86a3
Normal file
BIN
corpus/948ad422bf8ada9dd219e01f173f566589ce86a3
Normal file
Binary file not shown.
BIN
corpus/974691442cb6e115ed5ee5f60de93252e61ab501
Normal file
BIN
corpus/974691442cb6e115ed5ee5f60de93252e61ab501
Normal file
Binary file not shown.
BIN
corpus/a1f3e17c5c4b73fab0c8c1e3f72ae566f70910ab
Normal file
BIN
corpus/a1f3e17c5c4b73fab0c8c1e3f72ae566f70910ab
Normal file
Binary file not shown.
BIN
corpus/b06047097faba5031907398b232c45c9ba74f964
Normal file
BIN
corpus/b06047097faba5031907398b232c45c9ba74f964
Normal file
Binary file not shown.
BIN
corpus/b6861dc81212a072d9568e67e2baf796b8dcd889
Normal file
BIN
corpus/b6861dc81212a072d9568e67e2baf796b8dcd889
Normal file
Binary file not shown.
BIN
corpus/bbc68475edb1554be8dc0dc7d054a4acc44a4b8a
Normal file
BIN
corpus/bbc68475edb1554be8dc0dc7d054a4acc44a4b8a
Normal file
Binary file not shown.
BIN
corpus/c24efac2b3142356351fc5d676ac445eba99e263
Normal file
BIN
corpus/c24efac2b3142356351fc5d676ac445eba99e263
Normal file
Binary file not shown.
BIN
corpus/c89b729be6f12554185eb38e284cc809af07b8d4
Normal file
BIN
corpus/c89b729be6f12554185eb38e284cc809af07b8d4
Normal file
Binary file not shown.
BIN
corpus/d0b73353dcc90eeb74348293fb7c92110cd9c6dd
Normal file
BIN
corpus/d0b73353dcc90eeb74348293fb7c92110cd9c6dd
Normal file
Binary file not shown.
BIN
corpus/d43f9cf9ccdadce4a9830536d0480f24500807f6
Normal file
BIN
corpus/d43f9cf9ccdadce4a9830536d0480f24500807f6
Normal file
Binary file not shown.
BIN
corpus/d61e75b6f90981b94ddeb43e65ada3087df75888
Normal file
BIN
corpus/d61e75b6f90981b94ddeb43e65ada3087df75888
Normal file
Binary file not shown.
BIN
corpus/e5bce18a58047af2c6136cd68604a30edb03098d
Normal file
BIN
corpus/e5bce18a58047af2c6136cd68604a30edb03098d
Normal file
Binary file not shown.
BIN
corpus/e5edc49dfe2d240ddef7b7292dbfc6b3a4c7f5cb
Normal file
BIN
corpus/e5edc49dfe2d240ddef7b7292dbfc6b3a4c7f5cb
Normal file
Binary file not shown.
BIN
corpus/ed1b304a97ead710d5f3f1e457208608a32d9800
Normal file
BIN
corpus/ed1b304a97ead710d5f3f1e457208608a32d9800
Normal file
Binary file not shown.
BIN
corpus/edb1b951440c01bbbe90ae60f34737714316fb6d
Normal file
BIN
corpus/edb1b951440c01bbbe90ae60f34737714316fb6d
Normal file
Binary file not shown.
BIN
corpus/f79db6ab768fbafad0241691162f1d2079f36200
Normal file
BIN
corpus/f79db6ab768fbafad0241691162f1d2079f36200
Normal file
Binary file not shown.
Reference in New Issue
Block a user