milvus support multi index engine (#27178)

Co-authored-by: longjiquan <jiquan.long@zilliz.com>
This commit is contained in:
foxspy 2023-09-22 09:59:26 +08:00 committed by GitHub
parent 67a471e09c
commit 370b6fde58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 1282 additions and 1033 deletions

View File

@ -45,6 +45,8 @@ GOFUMPT_VERSION := 0.5.0
GOFUMPT_OUTPUT := $(shell $(INSTALL_PATH)/gofumpt --version 2>/dev/null)
INSTALL_GOFUMPT := $(findstring $(GOFUMPT_VERSION),$(GOFUMPT_OUTPUT))
index_engine = knowhere
export GIT_BRANCH=master
ENABLE_AZURE = false
@ -197,19 +199,19 @@ generated-proto: download-milvus-proto build-3rdparty
build-cpp: generated-proto
@echo "Building Milvus cpp library ... ${AZURE_OPTION}"
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION})
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine})
build-cpp-gpu: generated-proto
@echo "Building Milvus cpp gpu library ... "
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -g -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION})
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -g -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine})
build-cpp-with-unittest: generated-proto
@echo "Building Milvus cpp library with unittest ... "
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -u -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION})
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -u -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine})
build-cpp-with-coverage: generated-proto
@echo "Building Milvus cpp library with coverage and unittest ..."
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -a ${useasan} -u -c -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION})
@(env bash $(PWD)/scripts/core_build.sh -t ${mode} -a ${useasan} -u -c -f "$(CUSTOM_THIRDPARTY_PATH)" -n ${disk_index} -y ${use_dynamic_simd} ${AZURE_OPTION} -x ${index_engine})
check-proto-product: generated-proto
@(env bash $(PWD)/scripts/check_proto_product.sh)

View File

@ -523,6 +523,8 @@ common:
info: 500 # minimum milliseconds for printing durations in info level
warn: 1000 # minimum milliseconds for printing durations in warn level
indexEngineVersion: "knowhere-v0"
# QuotaConfig, configurations of Milvus quota and limits.
# By default, we enable:
# 1. TT protection;

View File

@ -37,8 +37,9 @@ WITH_PROMETHEUS="ON"
CUDA_ARCH="DEFAULT"
CUSTOM_THIRDPARTY_PATH=""
BUILD_DISK_ANN="OFF"
INDEX_ENGINE="knowhere"
while getopts "p:t:s:f:o:ulrcghzme" arg; do
while getopts "p:t:s:f:o:ulrcghzmex" arg; do
case $arg in
f)
CUSTOM_THIRDPARTY_PATH=$OPTARG
@ -82,6 +83,9 @@ while getopts "p:t:s:f:o:ulrcghzme" arg; do
n)
BUILD_DISK_ANN="OFF"
;;
x)
INDEX_ENGINE=$OPTARG
;;
h) # help
echo "
parameter:
@ -154,6 +158,7 @@ CMAKE_CMD="cmake \
-DCUSTOM_THIRDPARTY_DOWNLOAD_PATH=${CUSTOM_THIRDPARTY_PATH} \
-DKNOWHERE_GPU_VERSION=${SUPPORT_GPU} \
-DBUILD_DISK_ANN=${BUILD_DISK_ANN} \
-DINDEX_ENGINE=${INDEX_ENGINE} \
${SCRIPTS_DIR}"
echo ${CMAKE_CMD}
${CMAKE_CMD}

View File

@ -166,46 +166,7 @@ PositivelyRelated(const knowhere::MetricType& metric_type) {
inline std::string
KnowhereStatusString(knowhere::Status status) {
switch (status) {
case knowhere::Status::invalid_args:
return "invalid args";
case knowhere::Status::invalid_param_in_json:
return "invalid param in json";
case knowhere::Status::out_of_range_in_json:
return "out of range in json";
case knowhere::Status::type_conflict_in_json:
return "type conflict in json";
case knowhere::Status::invalid_metric_type:
return "invalid metric type";
case knowhere::Status::empty_index:
return "empty index";
case knowhere::Status::not_implemented:
return "not implemented";
case knowhere::Status::index_not_trained:
return "index not trained";
case knowhere::Status::index_already_trained:
return "index already trained";
case knowhere::Status::faiss_inner_error:
return "faiss inner error";
case knowhere::Status::hnsw_inner_error:
return "hnsw inner error";
case knowhere::Status::malloc_error:
return "malloc error";
case knowhere::Status::diskann_inner_error:
return "diskann inner error";
case knowhere::Status::diskann_file_error:
return "diskann file error";
case knowhere::Status::invalid_value_in_json:
return "invalid value in json";
case knowhere::Status::arithmetic_overflow:
return "arithmetic overflow";
case knowhere::Status::raft_inner_error:
return "raft inner error";
case knowhere::Status::invalid_binary_set:
return "invalid binary set";
default:
return "unexpected status";
}
return knowhere::Status2String(status);
}
inline std::vector<IndexType>

View File

@ -20,7 +20,6 @@
#include "common/EasyAssert.h"
#include "glog/logging.h"
#include "log/Log.h"
#include "knowhere/comp/thread_pool.h"
#include "knowhere/comp/knowhere_config.h"
namespace milvus::config {
@ -74,12 +73,12 @@ KnowhereSetSimdType(const char* value) {
void
KnowhereInitBuildThreadPool(const uint32_t num_threads) {
knowhere::ThreadPool::InitGlobalBuildThreadPool(num_threads);
knowhere::KnowhereConfig::SetBuildThreadPoolSize(num_threads);
}
void
KnowhereInitSearchThreadPool(const uint32_t num_threads) {
knowhere::ThreadPool::InitGlobalSearchThreadPool(num_threads);
knowhere::KnowhereConfig::SetSearchThreadPoolSize(num_threads);
if (!knowhere::KnowhereConfig::SetAioContextPool(num_threads)) {
PanicInfo("Failed to set aio context pool with num_threads " +
std::to_string(num_threads));

View File

@ -25,7 +25,8 @@ namespace milvus::index {
using BoolIndexPtr = std::shared_ptr<ScalarIndexSort<bool>>;
inline BoolIndexPtr
CreateBoolIndex(storage::FileManagerImplPtr file_manager = nullptr) {
return std::make_unique<ScalarIndexSort<bool>>(file_manager);
CreateBoolIndex(const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext()) {
return std::make_unique<ScalarIndexSort<bool>>(file_manager_context);
}
} // namespace milvus::index

View File

@ -14,14 +14,8 @@ set(INDEX_FILES
Utils.cpp
VectorMemIndex.cpp
IndexFactory.cpp
)
if ( BUILD_DISK_ANN STREQUAL "ON" )
set(INDEX_FILES
${INDEX_FILES}
VectorDiskIndex.cpp
)
endif ()
milvus_add_pkg_config("milvus_index")
add_library(milvus_index SHARED ${INDEX_FILES})

View File

@ -23,9 +23,10 @@ namespace milvus::index {
template <typename T>
inline ScalarIndexPtr<T>
IndexFactory::CreateScalarIndex(const IndexType& index_type,
storage::FileManagerImplPtr file_manager) {
return CreateScalarIndexSort<T>(file_manager);
IndexFactory::CreateScalarIndex(
const IndexType& index_type,
const storage::FileManagerContext& file_manager_context) {
return CreateScalarIndexSort<T>(file_manager_context);
}
// template <>
@ -36,10 +37,11 @@ IndexFactory::CreateScalarIndex(const IndexType& index_type,
template <>
inline ScalarIndexPtr<std::string>
IndexFactory::CreateScalarIndex(const IndexType& index_type,
storage::FileManagerImplPtr file_manager) {
IndexFactory::CreateScalarIndex(
const IndexType& index_type,
const storage::FileManagerContext& file_manager_context) {
#if defined(__linux__) || defined(__APPLE__)
return CreateStringIndexMarisa(file_manager);
return CreateStringIndexMarisa(file_manager_context);
#else
throw std::runtime_error("unsupported platform");
#endif

View File

@ -18,50 +18,52 @@
#include "index/VectorMemIndex.h"
#include "index/Utils.h"
#include "index/Meta.h"
#include "knowhere/utils.h"
#ifdef BUILD_DISK_ANN
#include "index/VectorDiskIndex.h"
#endif
namespace milvus::index {
IndexBasePtr
IndexFactory::CreateIndex(const CreateIndexInfo& create_index_info,
storage::FileManagerImplPtr file_manager) {
IndexFactory::CreateIndex(
const CreateIndexInfo& create_index_info,
const storage::FileManagerContext& file_manager_context) {
if (datatype_is_vector(create_index_info.field_type)) {
return CreateVectorIndex(create_index_info, file_manager);
return CreateVectorIndex(create_index_info, file_manager_context);
}
return CreateScalarIndex(create_index_info, file_manager);
return CreateScalarIndex(create_index_info, file_manager_context);
}
IndexBasePtr
IndexFactory::CreateScalarIndex(const CreateIndexInfo& create_index_info,
storage::FileManagerImplPtr file_manager) {
IndexFactory::CreateScalarIndex(
const CreateIndexInfo& create_index_info,
const storage::FileManagerContext& file_manager_context) {
auto data_type = create_index_info.field_type;
auto index_type = create_index_info.index_type;
switch (data_type) {
// create scalar index
case DataType::BOOL:
return CreateScalarIndex<bool>(index_type, file_manager);
return CreateScalarIndex<bool>(index_type, file_manager_context);
case DataType::INT8:
return CreateScalarIndex<int8_t>(index_type, file_manager);
return CreateScalarIndex<int8_t>(index_type, file_manager_context);
case DataType::INT16:
return CreateScalarIndex<int16_t>(index_type, file_manager);
return CreateScalarIndex<int16_t>(index_type, file_manager_context);
case DataType::INT32:
return CreateScalarIndex<int32_t>(index_type, file_manager);
return CreateScalarIndex<int32_t>(index_type, file_manager_context);
case DataType::INT64:
return CreateScalarIndex<int64_t>(index_type, file_manager);
return CreateScalarIndex<int64_t>(index_type, file_manager_context);
case DataType::FLOAT:
return CreateScalarIndex<float>(index_type, file_manager);
return CreateScalarIndex<float>(index_type, file_manager_context);
case DataType::DOUBLE:
return CreateScalarIndex<double>(index_type, file_manager);
return CreateScalarIndex<double>(index_type, file_manager_context);
// create string index
case DataType::STRING:
case DataType::VARCHAR:
return CreateScalarIndex<std::string>(index_type, file_manager);
return CreateScalarIndex<std::string>(index_type,
file_manager_context);
default:
throw SegcoreError(
DataTypeInvalid,
@ -70,19 +72,19 @@ IndexFactory::CreateScalarIndex(const CreateIndexInfo& create_index_info,
}
IndexBasePtr
IndexFactory::CreateVectorIndex(const CreateIndexInfo& create_index_info,
storage::FileManagerImplPtr file_manager) {
IndexFactory::CreateVectorIndex(
const CreateIndexInfo& create_index_info,
const storage::FileManagerContext& file_manager_context) {
auto index_type = create_index_info.index_type;
auto metric_type = create_index_info.metric_type;
#ifdef BUILD_DISK_ANN
auto version = create_index_info.index_engine_version;
// create disk index
auto data_type = create_index_info.field_type;
if (is_in_disk_list(index_type)) {
if (knowhere::UseDiskLoad(index_type, version)) {
switch (data_type) {
case DataType::VECTOR_FLOAT: {
return std::make_unique<VectorDiskAnnIndex<float>>(
index_type, metric_type, file_manager);
index_type, metric_type, version, file_manager_context);
}
default:
throw SegcoreError(
@ -91,11 +93,10 @@ IndexFactory::CreateVectorIndex(const CreateIndexInfo& create_index_info,
data_type));
}
}
#endif
// create mem index
return std::make_unique<VectorMemIndex>(
index_type, metric_type, file_manager);
index_type, metric_type, version, file_manager_context);
}
} // namespace milvus::index

View File

@ -48,15 +48,16 @@ class IndexFactory {
IndexBasePtr
CreateIndex(const CreateIndexInfo& create_index_info,
storage::FileManagerImplPtr file_manager);
const storage::FileManagerContext& file_manager_context);
IndexBasePtr
CreateVectorIndex(const CreateIndexInfo& create_index_info,
storage::FileManagerImplPtr file_manager);
const storage::FileManagerContext& file_manager_context);
IndexBasePtr
CreateScalarIndex(const CreateIndexInfo& create_index_info,
storage::FileManagerImplPtr file_manager = nullptr);
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext());
// IndexBasePtr
// CreateIndex(DataType dtype, const IndexType& index_type);
@ -64,7 +65,8 @@ class IndexFactory {
template <typename T>
ScalarIndexPtr<T>
CreateScalarIndex(const IndexType& index_type,
storage::FileManagerImplPtr file_manager = nullptr);
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext());
};
} // namespace milvus::index

View File

@ -24,6 +24,7 @@ struct CreateIndexInfo {
DataType field_type;
IndexType index_type;
MetricType metric_type;
std::string index_engine_version;
};
} // namespace milvus::index

View File

@ -45,10 +45,13 @@ constexpr const char* FIELD_ID = "field_id";
constexpr const char* INDEX_BUILD_ID = "index_build_id";
constexpr const char* INDEX_ID = "index_id";
constexpr const char* INDEX_VERSION = "index_version";
constexpr const char* INDEX_ENGINE_VERSION = "index_engine_version";
// DiskAnn build params
// VecIndex file metas
constexpr const char* DISK_ANN_PREFIX_PATH = "index_prefix";
constexpr const char* DISK_ANN_RAW_DATA_PATH = "data_path";
// DiskAnn build params
constexpr const char* DISK_ANN_MAX_DEGREE = "max_degree";
constexpr const char* DISK_ANN_SEARCH_LIST_SIZE = "search_list_size";
constexpr const char* DISK_ANN_PQ_CODE_BUDGET = "pq_code_budget_gb";

View File

@ -30,11 +30,12 @@ namespace milvus::index {
template <typename T>
inline ScalarIndexSort<T>::ScalarIndexSort(
storage::FileManagerImplPtr file_manager)
const storage::FileManagerContext& file_manager_context)
: is_built_(false), data_() {
if (file_manager != nullptr) {
file_manager_ = std::dynamic_pointer_cast<storage::MemFileManagerImpl>(
file_manager);
if (file_manager_context.Valid()) {
file_manager_ =
std::make_shared<storage::MemFileManagerImpl>(file_manager_context);
AssertInfo(file_manager_ != nullptr, "create file manager failed!");
}
}

View File

@ -33,7 +33,8 @@ template <typename T>
class ScalarIndexSort : public ScalarIndex<T> {
public:
explicit ScalarIndexSort(
storage::FileManagerImplPtr file_manager = nullptr);
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext());
BinarySet
Serialize(const Config& config) override;
@ -113,7 +114,8 @@ using ScalarIndexSortPtr = std::unique_ptr<ScalarIndexSort<T>>;
namespace milvus::index {
template <typename T>
inline ScalarIndexSortPtr<T>
CreateScalarIndexSort(storage::FileManagerImplPtr file_manager = nullptr) {
return std::make_unique<ScalarIndexSort<T>>(file_manager);
CreateScalarIndexSort(const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext()) {
return std::make_unique<ScalarIndexSort<T>>(file_manager_context);
}
} // namespace milvus::index

View File

@ -30,10 +30,11 @@
namespace milvus::index {
StringIndexMarisa::StringIndexMarisa(storage::FileManagerImplPtr file_manager) {
if (file_manager != nullptr) {
file_manager_ = std::dynamic_pointer_cast<storage::MemFileManagerImpl>(
file_manager);
StringIndexMarisa::StringIndexMarisa(
const storage::FileManagerContext& file_manager_context) {
if (file_manager_context.Valid()) {
file_manager_ =
std::make_shared<storage::MemFileManagerImpl>(file_manager_context);
}
}

View File

@ -29,7 +29,8 @@ namespace milvus::index {
class StringIndexMarisa : public StringIndex {
public:
explicit StringIndexMarisa(
storage::FileManagerImplPtr file_manager = nullptr);
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext());
int64_t
Size() override;
@ -107,8 +108,10 @@ class StringIndexMarisa : public StringIndex {
using StringIndexMarisaPtr = std::unique_ptr<StringIndexMarisa>;
inline StringIndexPtr
CreateStringIndexMarisa(storage::FileManagerImplPtr file_manager = nullptr) {
return std::make_unique<StringIndexMarisa>(file_manager);
CreateStringIndexMarisa(
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext()) {
return std::make_unique<StringIndexMarisa>(file_manager_context);
}
} // namespace milvus::index

View File

@ -120,6 +120,13 @@ GetIndexTypeFromConfig(const Config& config) {
return index_type.value();
}
std::string
GetIndexEngineVersionFromConfig(const Config& config) {
auto index_engine_version =
GetValueFromConfig<std::string>(config, INDEX_ENGINE_VERSION);
return index_engine_version.has_value() ? index_engine_version.value() : "";
}
// TODO :: too ugly
storage::FieldDataMeta
GetFieldDataMetaFromConfig(const Config& config) {

View File

@ -100,6 +100,9 @@ GetMetricTypeFromConfig(const Config& config);
std::string
GetIndexTypeFromConfig(const Config& config);
std::string
GetIndexEngineVersionFromConfig(const Config& config);
storage::FieldDataMeta
GetFieldDataMetaFromConfig(const Config& config);

View File

@ -27,8 +27,6 @@
namespace milvus::index {
#ifdef BUILD_DISK_ANN
#define kSearchListMaxValue1 200 // used if tok <= 20
#define kSearchListMaxValue2 65535 // used for topk > 20
#define kPrepareDim 100
@ -38,10 +36,12 @@ template <typename T>
VectorDiskAnnIndex<T>::VectorDiskAnnIndex(
const IndexType& index_type,
const MetricType& metric_type,
storage::FileManagerImplPtr file_manager)
const std::string& version,
const storage::FileManagerContext& file_manager_context)
: VectorIndex(index_type, metric_type) {
file_manager_ =
std::dynamic_pointer_cast<storage::DiskFileManagerImpl>(file_manager);
std::make_shared<storage::DiskFileManagerImpl>(file_manager_context);
AssertInfo(file_manager_ != nullptr, "create file manager failed!");
auto local_chunk_manager =
storage::LocalChunkManagerSingleton::GetInstance().GetChunkManager();
auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix();
@ -52,12 +52,12 @@ VectorDiskAnnIndex<T>::VectorDiskAnnIndex(
if (local_chunk_manager->Exist(local_index_path_prefix)) {
local_chunk_manager->RemoveDir(local_index_path_prefix);
}
CheckCompatible(version);
local_chunk_manager->CreateDir(local_index_path_prefix);
auto diskann_index_pack =
knowhere::Pack(std::shared_ptr<knowhere::FileManager>(file_manager));
index_ = knowhere::IndexFactory::Instance().Create(GetIndexType(),
diskann_index_pack);
knowhere::Pack(std::shared_ptr<knowhere::FileManager>(file_manager_));
index_ = knowhere::IndexFactory::Instance().Create(
GetIndexType(), version, diskann_index_pack);
}
template <typename T>
@ -90,8 +90,9 @@ VectorDiskAnnIndex<T>::Load(const Config& config) {
template <typename T>
BinarySet
VectorDiskAnnIndex<T>::Upload(const Config& config) {
auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize();
BinarySet ret;
index_.Serialize(ret);
auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize();
for (auto& file : remote_paths_to_size) {
ret.Append(file.first, nullptr, file.second);
}
@ -119,11 +120,15 @@ VectorDiskAnnIndex<T>::Build(const Config& config) {
auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix();
build_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix;
if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) {
auto num_threads = GetValueFromConfig<std::string>(
build_config, DISK_ANN_BUILD_THREAD_NUM);
AssertInfo(num_threads.has_value(),
AssertInfo(
num_threads.has_value(),
"param " + std::string(DISK_ANN_BUILD_THREAD_NUM) + "is empty");
build_config[DISK_ANN_THREADS_NUM] = std::atoi(num_threads.value().c_str());
build_config[DISK_ANN_THREADS_NUM] =
std::atoi(num_threads.value().c_str());
}
knowhere::DataSet* ds_ptr = nullptr;
build_config.erase("insert_files");
index_.Build(*ds_ptr, build_config);
@ -151,12 +156,15 @@ VectorDiskAnnIndex<T>::BuildWithDataset(const DatasetPtr& dataset,
auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix();
build_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix;
if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) {
auto num_threads = GetValueFromConfig<std::string>(
build_config, DISK_ANN_BUILD_THREAD_NUM);
AssertInfo(num_threads.has_value(),
AssertInfo(
num_threads.has_value(),
"param " + std::string(DISK_ANN_BUILD_THREAD_NUM) + "is empty");
build_config[DISK_ANN_THREADS_NUM] = std::atoi(num_threads.value().c_str());
build_config[DISK_ANN_THREADS_NUM] =
std::atoi(num_threads.value().c_str());
}
if (!local_chunk_manager->Exist(local_data_path)) {
local_chunk_manager->CreateFile(local_data_path);
}
@ -204,20 +212,21 @@ VectorDiskAnnIndex<T>::Query(const DatasetPtr dataset,
// set search list size
auto search_list_size = GetValueFromConfig<uint32_t>(
search_info.search_params_, DISK_ANN_QUERY_LIST);
if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) {
if (search_list_size.has_value()) {
search_config[DISK_ANN_SEARCH_LIST_SIZE] = search_list_size.value();
}
// set beamwidth
search_config[DISK_ANN_QUERY_BEAMWIDTH] = int(search_beamwidth_);
// set json reset field, will be removed later
search_config[DISK_ANN_PQ_CODE_BUDGET] = 0.0;
}
// set index prefix, will be removed later
auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix();
search_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix;
// set json reset field, will be removed later
search_config[DISK_ANN_PQ_CODE_BUDGET] = 0.0;
auto final = [&] {
auto radius =
GetValueFromConfig<float>(search_info.search_params_, RADIUS);
@ -330,29 +339,31 @@ VectorDiskAnnIndex<T>::update_load_json(const Config& config) {
auto local_index_path_prefix = file_manager_->GetLocalIndexObjectPrefix();
load_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix;
if (GetIndexType() == knowhere::IndexEnum::INDEX_DISKANN) {
// set base info
load_config[DISK_ANN_PREPARE_WARM_UP] = false;
load_config[DISK_ANN_PREPARE_USE_BFS_CACHE] = false;
// set threads number
auto num_threads =
GetValueFromConfig<std::string>(load_config, DISK_ANN_LOAD_THREAD_NUM);
AssertInfo(num_threads.has_value(),
auto num_threads = GetValueFromConfig<std::string>(
load_config, DISK_ANN_LOAD_THREAD_NUM);
AssertInfo(
num_threads.has_value(),
"param " + std::string(DISK_ANN_LOAD_THREAD_NUM) + "is empty");
load_config[DISK_ANN_THREADS_NUM] = std::atoi(num_threads.value().c_str());
load_config[DISK_ANN_THREADS_NUM] =
std::atoi(num_threads.value().c_str());
// update search_beamwidth
auto beamwidth =
GetValueFromConfig<std::string>(load_config, DISK_ANN_QUERY_BEAMWIDTH);
auto beamwidth = GetValueFromConfig<std::string>(
load_config, DISK_ANN_QUERY_BEAMWIDTH);
if (beamwidth.has_value()) {
search_beamwidth_ = std::atoi(beamwidth.value().c_str());
}
}
return load_config;
}
template class VectorDiskAnnIndex<float>;
#endif
} // namespace milvus::index

View File

@ -24,18 +24,19 @@
namespace milvus::index {
#ifdef BUILD_DISK_ANN
template <typename T>
class VectorDiskAnnIndex : public VectorIndex {
public:
explicit VectorDiskAnnIndex(const IndexType& index_type,
explicit VectorDiskAnnIndex(
const IndexType& index_type,
const MetricType& metric_type,
storage::FileManagerImplPtr file_manager);
const std::string& version,
const storage::FileManagerContext& file_manager_context);
BinarySet
Serialize(const Config& config) override { // deprecated
auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize();
BinarySet binary_set;
index_.Serialize(binary_set);
auto remote_paths_to_size = file_manager_->GetRemotePathsToFileSize();
for (auto& file : remote_paths_to_size) {
binary_set.Append(file.first, nullptr, file.second);
}
@ -91,6 +92,5 @@ class VectorDiskAnnIndex : public VectorIndex {
template <typename T>
using VectorDiskAnnIndexPtr = std::unique_ptr<VectorDiskAnnIndex<T>>;
#endif
} // namespace milvus::index

View File

@ -22,12 +22,14 @@
#include <vector>
#include <boost/dynamic_bitset.hpp>
#include "Utils.h"
#include "knowhere/factory.h"
#include "index/Index.h"
#include "common/Types.h"
#include "common/BitsetView.h"
#include "common/QueryResult.h"
#include "common/QueryInfo.h"
#include "knowhere/version.h"
namespace milvus::index {
@ -88,6 +90,17 @@ class VectorIndex : public IndexBase {
CleanLocalData() {
}
void
CheckCompatible(const std::string& version) {
std::string err_msg =
"version not support : " + version +
" , knowhere current version " +
knowhere::Version::GetCurrentVersion().VersionCode();
AssertInfo(
knowhere::Version::VersionSupport(knowhere::Version(version)),
err_msg);
}
private:
MetricType metric_type_;
int64_t dim_;

View File

@ -48,17 +48,21 @@
namespace milvus::index {
VectorMemIndex::VectorMemIndex(const IndexType& index_type,
VectorMemIndex::VectorMemIndex(
const IndexType& index_type,
const MetricType& metric_type,
storage::FileManagerImplPtr file_manager)
const std::string& version,
const storage::FileManagerContext& file_manager_context)
: VectorIndex(index_type, metric_type) {
AssertInfo(!is_unsupported(index_type, metric_type),
index_type + " doesn't support metric: " + metric_type);
if (file_manager != nullptr) {
file_manager_ = std::dynamic_pointer_cast<storage::MemFileManagerImpl>(
file_manager);
if (file_manager_context.Valid()) {
file_manager_ =
std::make_shared<storage::MemFileManagerImpl>(file_manager_context);
AssertInfo(file_manager_ != nullptr, "create file manager failed!");
}
index_ = knowhere::IndexFactory::Instance().Create(GetIndexType());
CheckCompatible(version);
index_ = knowhere::IndexFactory::Instance().Create(GetIndexType(), version);
}
BinarySet
@ -91,7 +95,7 @@ VectorMemIndex::Serialize(const Config& config) {
void
VectorMemIndex::LoadWithoutAssemble(const BinarySet& binary_set,
const Config& config) {
auto stat = index_.Deserialize(binary_set);
auto stat = index_.Deserialize(binary_set, config);
if (stat != knowhere::Status::success)
PanicCodeInfo(
ErrorCode::UnexpectedError,

View File

@ -29,9 +29,12 @@ namespace milvus::index {
class VectorMemIndex : public VectorIndex {
public:
explicit VectorMemIndex(const IndexType& index_type,
explicit VectorMemIndex(
const IndexType& index_type,
const MetricType& metric_type,
storage::FileManagerImplPtr file_manager = nullptr);
const std::string& version,
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext());
BinarySet
Serialize(const Config& config) override;

View File

@ -45,7 +45,7 @@ class IndexFactory {
IndexCreatorBasePtr
CreateIndex(DataType type,
Config& config,
storage::FileManagerImplPtr file_manager) {
const storage::FileManagerContext& context) {
auto invalid_dtype_msg =
std::string("invalid data type: ") + std::to_string(int(type));
@ -59,12 +59,11 @@ class IndexFactory {
case DataType::DOUBLE:
case DataType::VARCHAR:
case DataType::STRING:
return CreateScalarIndex(type, config, file_manager);
return CreateScalarIndex(type, config, context);
case DataType::VECTOR_FLOAT:
case DataType::VECTOR_BINARY:
return std::make_unique<VecIndexCreator>(
type, config, file_manager);
return std::make_unique<VecIndexCreator>(type, config, context);
default:
throw SegcoreError(
DataTypeInvalid,

View File

@ -20,15 +20,16 @@
namespace milvus::indexbuilder {
ScalarIndexCreator::ScalarIndexCreator(DataType dtype,
ScalarIndexCreator::ScalarIndexCreator(
DataType dtype,
Config& config,
storage::FileManagerImplPtr file_manager)
const storage::FileManagerContext& file_manager_context)
: dtype_(dtype), config_(config) {
milvus::index::CreateIndexInfo index_info;
index_info.field_type = dtype_;
index_info.index_type = index_type();
index_ = index::IndexFactory::GetInstance().CreateIndex(index_info,
file_manager);
index_ = index::IndexFactory::GetInstance().CreateIndex(
index_info, file_manager_context);
}
void

View File

@ -24,7 +24,7 @@ class ScalarIndexCreator : public IndexCreatorBase {
public:
ScalarIndexCreator(DataType data_type,
Config& config,
storage::FileManagerImplPtr file_manager);
const storage::FileManagerContext& file_manager_context);
void
Build(const milvus::DatasetPtr& dataset) override;
@ -56,8 +56,9 @@ using ScalarIndexCreatorPtr = std::unique_ptr<ScalarIndexCreator>;
inline ScalarIndexCreatorPtr
CreateScalarIndex(DataType dtype,
Config& config,
storage::FileManagerImplPtr file_manager) {
return std::make_unique<ScalarIndexCreator>(dtype, config, file_manager);
const storage::FileManagerContext& file_manager_context) {
return std::make_unique<ScalarIndexCreator>(
dtype, config, file_manager_context);
}
} // namespace milvus::indexbuilder

View File

@ -19,17 +19,20 @@
namespace milvus::indexbuilder {
VecIndexCreator::VecIndexCreator(DataType data_type,
VecIndexCreator::VecIndexCreator(
DataType data_type,
Config& config,
storage::FileManagerImplPtr file_manager)
const storage::FileManagerContext& file_manager_context)
: data_type_(data_type), config_(config) {
index::CreateIndexInfo index_info;
index_info.field_type = data_type_;
index_info.index_type = index::GetIndexTypeFromConfig(config_);
index_info.metric_type = index::GetMetricTypeFromConfig(config_);
index_info.index_engine_version =
index::GetIndexEngineVersionFromConfig(config_);
index_ = index::IndexFactory::GetInstance().CreateIndex(index_info,
file_manager);
index_ = index::IndexFactory::GetInstance().CreateIndex(
index_info, file_manager_context);
AssertInfo(index_ != nullptr,
"[VecIndexCreator]Index is null after create index");
}

View File

@ -26,9 +26,11 @@ namespace milvus::indexbuilder {
// TODO: better to distinguish binary vec & float vec.
class VecIndexCreator : public IndexCreatorBase {
public:
explicit VecIndexCreator(DataType data_type,
explicit VecIndexCreator(
DataType data_type,
Config& config,
storage::FileManagerImplPtr file_manager);
const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext());
void
Build(const milvus::DatasetPtr& dataset) override;

View File

@ -25,6 +25,7 @@
#include "index/Utils.h"
#include "pb/index_cgo_msg.pb.h"
#include "storage/Util.h"
#include "index/Meta.h"
using namespace milvus;
CStatus
@ -52,9 +53,14 @@ CreateIndex(enum CDataType dtype,
config[param.key()] = param.value();
}
config[milvus::index::INDEX_ENGINE_VERSION] =
knowhere::Version::GetDefaultVersion().VersionCode();
auto& index_factory = milvus::indexbuilder::IndexFactory::GetInstance();
auto index =
index_factory.CreateIndex(milvus::DataType(dtype), config, nullptr);
index_factory.CreateIndex(milvus::DataType(dtype),
config,
milvus::storage::FileManagerContext());
*res_index = index.release();
status.error_code = Success;
@ -84,6 +90,14 @@ CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info) {
AssertInfo(index_type.has_value(), "index type is empty");
index_info.index_type = index_type.value();
auto engine_version =
build_index_info->index_engine_version.empty()
? knowhere::Version::GetDefaultVersion().VersionCode()
: build_index_info->index_engine_version;
index_info.index_engine_version = engine_version;
config[milvus::index::INDEX_ENGINE_VERSION] = engine_version;
// get metric type
if (milvus::datatype_is_vector(field_type)) {
auto metric_type = milvus::index::GetValueFromConfig<std::string>(
@ -104,13 +118,13 @@ CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info) {
build_index_info->index_version};
auto chunk_manager = milvus::storage::CreateChunkManager(
build_index_info->storage_config);
auto file_manager = milvus::storage::CreateFileManager(
index_info.index_type, field_meta, index_meta, chunk_manager);
AssertInfo(file_manager != nullptr, "create file manager failed!");
milvus::storage::FileManagerContext fileManagerContext(
field_meta, index_meta, chunk_manager);
auto index =
milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex(
build_index_info->field_type, config, file_manager);
build_index_info->field_type, config, fileManagerContext);
index->Build();
*res_index = index.release();
auto status = CStatus();
@ -439,10 +453,24 @@ AppendInsertFilePath(CBuildIndexInfo c_build_index_info,
status.error_msg = "";
return status;
} catch (std::exception& e) {
return milvus::FailureCStatus(&e);
}
}
CStatus
AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info,
const char* c_index_engine_version) {
try {
auto build_index_info = (BuildIndexInfo*)c_load_index_info;
std::string index_engine_version(c_index_engine_version);
build_index_info->index_engine_version = index_engine_version;
auto status = CStatus();
status.error_code = UnexpectedError;
status.error_msg = strdup(e.what());
status.error_code = Success;
status.error_msg = "";
return status;
} catch (std::exception& e) {
return milvus::FailureCStatus(&e);
}
}

View File

@ -86,6 +86,10 @@ AppendIndexMetaInfo(CBuildIndexInfo c_build_index_info,
CStatus
AppendInsertFilePath(CBuildIndexInfo c_build_index_info, const char* file_path);
CStatus
AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info,
const char* c_index_engine_version);
CStatus
CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info);

View File

@ -33,4 +33,5 @@ struct BuildIndexInfo {
std::vector<std::string> insert_files;
milvus::storage::StorageConfig storage_config;
milvus::Config config;
std::string index_engine_version;
};

View File

@ -33,8 +33,10 @@ VectorFieldIndexing::VectorFieldIndexing(const FieldMeta& field_meta,
sync_with_index(false),
config_(std::make_unique<VecIndexConfig>(
segment_max_row_count, field_index_meta, segcore_config)) {
index_ = std::make_unique<index::VectorMemIndex>(config_->GetIndexType(),
config_->GetMetricType());
index_ = std::make_unique<index::VectorMemIndex>(
config_->GetIndexType(),
config_->GetMetricType(),
knowhere::Version::GetCurrentVersion().VersionCode());
}
void
@ -54,7 +56,9 @@ VectorFieldIndexing::BuildIndexRange(int64_t ack_beg,
for (int chunk_id = ack_beg; chunk_id < ack_end; chunk_id++) {
const auto& chunk = source->get_chunk(chunk_id);
auto indexing = std::make_unique<index::VectorMemIndex>(
knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::metric::L2);
knowhere::IndexEnum::INDEX_FAISS_IVFFLAT,
knowhere::metric::L2,
knowhere::Version::GetCurrentVersion().VersionCode());
auto dataset = knowhere::GenDataSet(
source->get_size_per_chunk(), dim, chunk.data());
indexing->BuildWithDataset(dataset, conf);

View File

@ -42,6 +42,7 @@ struct LoadIndexInfo {
std::map<std::string, std::string> index_params;
std::vector<std::string> index_files;
index::IndexBasePtr index;
std::string index_engine_version;
};
} // namespace milvus::segcore

View File

@ -18,6 +18,7 @@
#include "index/Meta.h"
#include "index/Utils.h"
#include "log/Log.h"
#include "storage/FileManager.h"
#include "segcore/Types.h"
#include "storage/Util.h"
#include "storage/RemoteChunkManagerSingleton.h"
@ -111,6 +112,7 @@ appendVecIndex(CLoadIndexInfo c_load_index_info, CBinarySet c_binary_set) {
milvus::index::CreateIndexInfo index_info;
index_info.field_type = load_index_info->field_type;
index_info.index_engine_version = load_index_info->index_engine_version;
// get index type
AssertInfo(index_params.find("index_type") != index_params.end(),
@ -135,20 +137,16 @@ appendVecIndex(CLoadIndexInfo c_load_index_info, CBinarySet c_binary_set) {
auto remote_chunk_manager =
milvus::storage::RemoteChunkManagerSingleton::GetInstance()
.GetRemoteChunkManager();
auto file_manager =
milvus::storage::CreateFileManager(index_info.index_type,
field_meta,
index_meta,
remote_chunk_manager);
AssertInfo(file_manager != nullptr, "create file manager failed!");
auto config = milvus::index::ParseConfigFromIndexParams(
load_index_info->index_params);
config["index_files"] = load_index_info->index_files;
milvus::storage::FileManagerContext fileManagerContext(
field_meta, index_meta, remote_chunk_manager);
load_index_info->index =
milvus::index::IndexFactory::GetInstance().CreateIndex(
index_info, file_manager);
index_info, fileManagerContext);
load_index_info->index->Load(*binary_set, config);
auto status = CStatus();
status.error_code = milvus::Success;
@ -180,8 +178,8 @@ appendScalarIndex(CLoadIndexInfo c_load_index_info, CBinarySet c_binary_set) {
index_info.index_type = index_params["index_type"];
load_index_info->index =
milvus::index::IndexFactory::GetInstance().CreateIndex(index_info,
nullptr);
milvus::index::IndexFactory::GetInstance().CreateIndex(
index_info, milvus::storage::FileManagerContext());
load_index_info->index->Load(*binary_set);
auto status = CStatus();
status.error_code = milvus::Success;
@ -213,8 +211,14 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info) {
auto& index_params = load_index_info->index_params;
auto field_type = load_index_info->field_type;
auto engine_version =
load_index_info->index_engine_version.empty()
? knowhere::Version::GetDefaultVersion().VersionCode()
: load_index_info->index_engine_version;
milvus::index::CreateIndexInfo index_info;
index_info.field_type = load_index_info->field_type;
index_info.index_engine_version = engine_version;
// get index type
AssertInfo(index_params.find("index_type") != index_params.end(),
@ -241,20 +245,16 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info) {
auto remote_chunk_manager =
milvus::storage::RemoteChunkManagerSingleton::GetInstance()
.GetRemoteChunkManager();
auto file_manager =
milvus::storage::CreateFileManager(index_info.index_type,
field_meta,
index_meta,
remote_chunk_manager);
AssertInfo(file_manager != nullptr, "create file manager failed!");
auto config = milvus::index::ParseConfigFromIndexParams(
load_index_info->index_params);
config["index_files"] = load_index_info->index_files;
milvus::storage::FileManagerContext fileManagerContext(
field_meta, index_meta, remote_chunk_manager);
load_index_info->index =
milvus::index::IndexFactory::GetInstance().CreateIndex(
index_info, file_manager);
index_info, fileManagerContext);
if (!load_index_info->mmap_dir_path.empty() &&
load_index_info->index->IsMmapSupported()) {
@ -324,6 +324,27 @@ AppendIndexInfo(CLoadIndexInfo c_load_index_info,
}
}
CStatus
AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info,
const char* c_index_engine_version) {
try {
auto load_index_info =
(milvus::segcore::LoadIndexInfo*)c_load_index_info;
std::string index_engine_version(c_index_engine_version);
load_index_info->index_engine_version = index_engine_version;
auto status = CStatus();
status.error_code = milvus::Success;
status.error_msg = "";
return status;
} catch (std::exception& e) {
auto status = CStatus();
status.error_code = milvus::UnexpectedError;
status.error_msg = strdup(e.what());
return status;
}
}
CStatus
CleanLoadedIndex(CLoadIndexInfo c_load_index_info) {
try {

View File

@ -58,6 +58,10 @@ AppendIndexFilePath(CLoadIndexInfo c_load_index_info, const char* file_path);
CStatus
AppendIndexV2(CLoadIndexInfo c_load_index_info);
CStatus
AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info,
const char* c_index_engine_version);
CStatus
CleanLoadedIndex(CLoadIndexInfo c_load_index_info);

View File

@ -31,11 +31,11 @@
namespace milvus::storage {
DiskFileManagerImpl::DiskFileManagerImpl(const FieldDataMeta& field_mata,
IndexMeta index_meta,
ChunkManagerPtr remote_chunk_manager)
: FileManagerImpl(field_mata, index_meta) {
rcm_ = remote_chunk_manager;
DiskFileManagerImpl::DiskFileManagerImpl(
const FileManagerContext& fileManagerContext)
: FileManagerImpl(fileManagerContext.fieldDataMeta,
fileManagerContext.indexMeta) {
rcm_ = fileManagerContext.chunkManagerPtr;
}
DiskFileManagerImpl::~DiskFileManagerImpl() {

View File

@ -32,9 +32,7 @@ namespace milvus::storage {
class DiskFileManagerImpl : public FileManagerImpl {
public:
explicit DiskFileManagerImpl(const FieldDataMeta& field_mata,
IndexMeta index_meta,
ChunkManagerPtr remote_chunk_manager);
explicit DiskFileManagerImpl(const FileManagerContext& fileManagerContext);
virtual ~DiskFileManagerImpl();

View File

@ -28,6 +28,26 @@
namespace milvus::storage {
struct FileManagerContext {
FileManagerContext() : chunkManagerPtr(nullptr) {
}
FileManagerContext(const FieldDataMeta& fieldDataMeta,
const IndexMeta& indexMeta,
const ChunkManagerPtr& chunkManagerPtr)
: fieldDataMeta(fieldDataMeta),
indexMeta(indexMeta),
chunkManagerPtr(chunkManagerPtr) {
}
bool
Valid() const {
return chunkManagerPtr != nullptr;
}
FieldDataMeta fieldDataMeta;
IndexMeta indexMeta;
ChunkManagerPtr chunkManagerPtr;
};
#define FILEMANAGER_TRY try {
#define FILEMANAGER_CATCH \
} \

View File

@ -24,11 +24,11 @@
namespace milvus::storage {
MemFileManagerImpl::MemFileManagerImpl(const FieldDataMeta& field_mata,
IndexMeta index_meta,
ChunkManagerPtr remote_chunk_manager)
: FileManagerImpl(field_mata, index_meta) {
rcm_ = remote_chunk_manager;
MemFileManagerImpl::MemFileManagerImpl(
const FileManagerContext& fileManagerContext)
: FileManagerImpl(fileManagerContext.fieldDataMeta,
fileManagerContext.indexMeta) {
rcm_ = fileManagerContext.chunkManagerPtr;
}
bool

View File

@ -30,9 +30,7 @@ namespace milvus::storage {
class MemFileManagerImpl : public FileManagerImpl {
public:
explicit MemFileManagerImpl(const FieldDataMeta& field_mata,
IndexMeta index_meta,
ChunkManagerPtr remote_chunk_manager);
explicit MemFileManagerImpl(const FileManagerContext& fileManagerContext);
virtual bool
LoadFile(const std::string& filename) noexcept;

View File

@ -1,3 +1,14 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License
//
// Created by zilliz on 2023/7/31.
//

View File

@ -614,19 +614,6 @@ CreateChunkManager(const StorageConfig& storage_config) {
}
}
FileManagerImplPtr
CreateFileManager(IndexType index_type,
const FieldDataMeta& field_meta,
const IndexMeta& index_meta,
ChunkManagerPtr cm) {
if (is_in_disk_list(index_type)) {
return std::make_shared<DiskFileManagerImpl>(
field_meta, index_meta, cm);
}
return std::make_shared<MemFileManagerImpl>(field_meta, index_meta, cm);
}
FieldDataPtr
CreateFieldData(const DataType& type, int64_t dim, int64_t total_num_rows) {
switch (type) {

View File

@ -129,12 +129,6 @@ ReleaseArrowUnused();
ChunkManagerPtr
CreateChunkManager(const StorageConfig& storage_config);
FileManagerImplPtr
CreateFileManager(IndexType index_type,
const FieldDataMeta& field_meta,
const IndexMeta& index_meta,
ChunkManagerPtr cm);
FieldDataPtr
CreateFieldData(const DataType& type,
int64_t dim = 1,

View File

@ -11,7 +11,14 @@
# or implied. See the License for the specific language governing permissions and limitations under the License.
#-------------------------------------------------------------------------------
set( KNOWHERE_VERSION 7b63839 )
set( KNOWHERE_VERSION 1dcd84b4 )
set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git")
if ( INDEX_ENGINE STREQUAL "cardinal" )
set( KNOWHERE_VERSION main)
set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere-cloud.git")
endif()
message(STATUS "Knowhere repo: ${GIT_REPOSITORY}")
message(STATUS "Knowhere version: ${KNOWHERE_VERSION}")
message(STATUS "Building knowhere-${KNOWHERE_SOURCE_VER} from source")
message(STATUS ${CMAKE_BUILD_TYPE})
@ -26,11 +33,10 @@ if ( MILVUS_GPU_VERSION STREQUAL "ON" )
set(WITH_RAFT ON CACHE BOOL "" FORCE )
endif ()
set( CMAKE_PREFIX_PATH ${CONAN_BOOST_ROOT} )
FetchContent_Declare(
knowhere
GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git"
GIT_REPOSITORY ${GIT_REPOSITORY}
GIT_TAG ${KNOWHERE_VERSION}
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/knowhere-src
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/knowhere-build

View File

@ -60,6 +60,8 @@ IndexBuilder_build(benchmark::State& state) {
const auto& param = index_params.params(i);
config[param.key()] = param.value();
}
config[milvus::index::INDEX_ENGINE_VERSION] =
knowhere::Version::GetCurrentVersion().VersionCode();
auto is_binary = state.range(2);
auto dataset = GenDataset(NB, metric_type, is_binary);
@ -68,7 +70,7 @@ IndexBuilder_build(benchmark::State& state) {
for (auto _ : state) {
auto index = std::make_unique<milvus::indexbuilder::VecIndexCreator>(
milvus::DataType::VECTOR_FLOAT, config, nullptr);
milvus::DataType::VECTOR_FLOAT, config);
index->Build(xb_dataset);
}
}
@ -102,7 +104,7 @@ IndexBuilder_build_and_codec(benchmark::State& state) {
for (auto _ : state) {
auto index = std::make_unique<milvus::indexbuilder::VecIndexCreator>(
milvus::DataType::VECTOR_FLOAT, config, nullptr);
milvus::DataType::VECTOR_FLOAT, config);
index->Build(xb_dataset);
index->Serialize();

View File

@ -249,9 +249,11 @@ generate_index(void* raw_data,
IndexType index_type,
int64_t dim,
int64_t N) {
CreateIndexInfo create_index_info{field_type, index_type, metric_type};
auto engine_version = knowhere::Version::GetCurrentVersion().VersionCode();
CreateIndexInfo create_index_info{
field_type, index_type, metric_type, engine_version};
auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, nullptr);
create_index_info, milvus::storage::FileManagerContext());
auto database = knowhere::GenDataSet(N, dim, raw_data);
auto build_config = generate_build_conf(index_type, metric_type);
@ -1597,7 +1599,8 @@ TEST(CApiTest, LoadIndexInfo) {
auto N = 1024 * 10;
auto [raw_data, timestamps, uids] = generate_data(N);
auto indexing = knowhere::IndexFactory::Instance().Create(
knowhere::IndexEnum::INDEX_FAISS_IVFSQ8);
knowhere::IndexEnum::INDEX_FAISS_IVFSQ8,
knowhere::Version::GetCurrentVersion().VersionCode());
auto conf =
knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
{knowhere::meta::DIM, DIM},
@ -1630,6 +1633,7 @@ TEST(CApiTest, LoadIndexInfo) {
status = AppendFieldInfo(
c_load_index_info, 0, 0, 0, 0, CDataType::FloatVector, "");
ASSERT_EQ(status.error_code, Success);
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
status = AppendIndex(c_load_index_info, c_binary_set);
ASSERT_EQ(status.error_code, Success);
DeleteLoadIndexInfo(c_load_index_info);
@ -1643,7 +1647,8 @@ TEST(CApiTest, LoadIndexSearch) {
auto num_query = 100;
auto [raw_data, timestamps, uids] = generate_data(N);
auto indexing = knowhere::IndexFactory::Instance().Create(
knowhere::IndexEnum::INDEX_FAISS_IVFSQ8);
knowhere::IndexEnum::INDEX_FAISS_IVFSQ8,
knowhere::Version::GetCurrentVersion().VersionCode());
auto conf =
knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
{knowhere::meta::DIM, DIM},
@ -1667,7 +1672,9 @@ TEST(CApiTest, LoadIndexSearch) {
auto& index_params = load_index_info.index_params;
index_params["index_type"] = knowhere::IndexEnum::INDEX_FAISS_IVFSQ8;
load_index_info.index = std::make_unique<VectorMemIndex>(
index_params["index_type"], knowhere::metric::L2);
index_params["index_type"],
knowhere::metric::L2,
knowhere::Version::GetCurrentVersion().VersionCode());
load_index_info.index->Load(binary_set);
// search
@ -1785,8 +1792,8 @@ TEST(CApiTest, Indexing_Without_Predicate) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
auto sealed_segment = SealedCreator(schema, dataset);
sealed_segment->DropFieldData(FieldId(100));
@ -1925,6 +1932,7 @@ TEST(CApiTest, Indexing_Expr_Without_Predicate) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -2094,6 +2102,7 @@ TEST(CApiTest, Indexing_With_float_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -2265,6 +2274,7 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -2428,6 +2438,7 @@ TEST(CApiTest, Indexing_With_float_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -2592,6 +2603,7 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -2762,6 +2774,7 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -2932,6 +2945,7 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -3096,6 +3110,7 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -3283,6 +3298,7 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field
@ -3453,6 +3469,7 @@ TEST(CApiTest, SealedSegment_search_float_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
auto query_dataset = knowhere::GenDataSet(num_queries, DIM, query_ptr);
@ -3677,6 +3694,7 @@ TEST(CApiTest, SealedSegment_search_float_With_Expr_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load vec index

View File

@ -61,8 +61,8 @@ TEST_F(DiskAnnFileManagerTest, AddFilePositiveParallel) {
IndexMeta index_meta = {3, 100, 1000, 1, "index"};
int64_t slice_size = milvus::FILE_SLICE_SIZE;
auto diskAnnFileManager =
std::make_shared<DiskFileManagerImpl>(filed_data_meta, index_meta, cm_);
auto diskAnnFileManager = std::make_shared<DiskFileManagerImpl>(
storage::FileManagerContext(filed_data_meta, index_meta, cm_));
auto ok = diskAnnFileManager->AddFile(indexFilePath);
EXPECT_EQ(ok, true);

View File

@ -11,7 +11,6 @@
#include <gtest/gtest.h>
#include "common/LoadInfo.h"
#include "common/Types.h"
#include "index/IndexFactory.h"
@ -80,8 +79,8 @@ TEST(Float16, Insert) {
auto row_count = interface.get_row_count();
ASSERT_EQ(N, row_count);
for (auto chunk_id = 0; chunk_id < num_chunk; ++chunk_id) {
auto float16_span =
interface.chunk_data<milvus::Float16Vector>(float16_vec_fid, chunk_id);
auto float16_span = interface.chunk_data<milvus::Float16Vector>(
float16_vec_fid, chunk_id);
auto begin = chunk_id * size_per_chunk;
auto end = std::min((chunk_id + 1) * size_per_chunk, N);
auto size_of_chunk = end - begin;
@ -150,8 +149,7 @@ TEST(Float16, ExecWithoutPredicateFlat) {
auto vec_ptr = dataset.get_col<float16>(vec_fid);
auto num_queries = 5;
auto ph_group_raw = CreateFloat16PlaceholderGroup(
num_queries, 32, 1024);
auto ph_group_raw = CreateFloat16PlaceholderGroup(num_queries, 32, 1024);
auto ph_group =
ParsePlaceholderGroup(plan.get(), ph_group_raw.SerializeAsString());
@ -286,7 +284,8 @@ TEST(Float16, CApiCPlan) {
milvus::proto::plan::PlanNode plan_node;
auto vector_anns = plan_node.mutable_vector_anns();
vector_anns->set_vector_type(milvus::proto::plan::VectorType::Float16Vector);
vector_anns->set_vector_type(
milvus::proto::plan::VectorType::Float16Vector);
vector_anns->set_placeholder_tag("$0");
vector_anns->set_field_id(100);
auto query_info = vector_anns->mutable_query_info();

View File

@ -58,7 +58,8 @@ TEST(GrowingIndex, Correctness) {
milvus::proto::plan::PlanNode range_query_plan_node;
auto vector_range_querys = range_query_plan_node.mutable_vector_anns();
vector_range_querys->set_vector_type(milvus::proto::plan::VectorType::FloatVector);
vector_range_querys->set_vector_type(
milvus::proto::plan::VectorType::FloatVector);
vector_range_querys->set_placeholder_tag("$0");
vector_range_querys->set_field_id(102);
auto range_query_info = vector_range_querys->mutable_query_info();

View File

@ -70,10 +70,9 @@ class IndexWrapperTest : public ::testing::TestWithParam<Param> {
is_binary = is_binary_map[index_type];
if (is_binary) {
vec_field_data_type = DataType::VECTOR_FLOAT;
;
} else {
vec_field_data_type = DataType::VECTOR_BINARY;
} else {
vec_field_data_type = DataType::VECTOR_FLOAT;
}
auto dataset = GenDataset(NB, metric_type, is_binary);
@ -129,8 +128,15 @@ INSTANTIATE_TEST_CASE_P(
std::pair(knowhere::IndexEnum::INDEX_HNSW, knowhere::metric::L2)));
TEST_P(IndexWrapperTest, BuildAndQuery) {
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
milvus::storage::IndexMeta index_meta{3, 100, 1000, 1};
auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_);
storage::FileManagerContext file_manager_context(
field_data_meta, index_meta, chunk_manager);
config[milvus::index::INDEX_ENGINE_VERSION] = knowhere::Version::GetCurrentVersion().VersionCode();
auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex(
vec_field_data_type, config, nullptr);
vec_field_data_type, config, file_manager_context);
auto dataset = GenDataset(NB, metric_type, is_binary);
knowhere::DataSetPtr xb_dataset;
@ -146,12 +152,18 @@ TEST_P(IndexWrapperTest, BuildAndQuery) {
ASSERT_NO_THROW(index->Build(xb_dataset));
auto binary_set = index->Serialize();
std::vector<std::string> index_files;
for (auto& binary : binary_set.binary_map_) {
index_files.emplace_back(binary.first);
}
config["index_files"] = index_files;
auto copy_index =
milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex(
vec_field_data_type, config, nullptr);
vec_field_data_type, config, file_manager_context);
auto vec_index =
static_cast<milvus::indexbuilder::VecIndexCreator*>(copy_index.get());
ASSERT_EQ(vec_index->dim(), DIM);
ASSERT_NO_THROW(vec_index->Load(binary_set));
milvus::SearchInfo search_info;

View File

@ -223,8 +223,10 @@ TEST(Indexing, Naive) {
create_index_info.field_type = DataType::VECTOR_FLOAT;
create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFPQ;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
auto index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, nullptr);
create_index_info, milvus::storage::FileManagerContext());
auto build_conf = knowhere::Json{
{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
@ -386,15 +388,17 @@ TEST_P(IndexTest, BuildAndQuery) {
create_index_info.index_type = index_type;
create_index_info.metric_type = metric_type;
create_index_info.field_type = vec_field_data_type;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
index::IndexBasePtr index;
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
milvus::storage::IndexMeta index_meta{3, 100, 1000, 1};
auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_);
auto file_manager = milvus::storage::CreateFileManager(
index_type, field_data_meta, index_meta, chunk_manager);
milvus::storage::FileManagerContext file_manager_context(
field_data_meta, index_meta, chunk_manager);
index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
ASSERT_NO_THROW(index->BuildWithDataset(xb_dataset, build_conf));
milvus::index::IndexBasePtr new_index;
@ -404,7 +408,7 @@ TEST_P(IndexTest, BuildAndQuery) {
index.reset();
new_index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
vec_index = dynamic_cast<milvus::index::VectorIndex*>(new_index.get());
std::vector<std::string> index_files;
@ -437,15 +441,17 @@ TEST_P(IndexTest, Mmap) {
create_index_info.index_type = index_type;
create_index_info.metric_type = metric_type;
create_index_info.field_type = vec_field_data_type;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
index::IndexBasePtr index;
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
milvus::storage::IndexMeta index_meta{3, 100, 1000, 1};
auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_);
auto file_manager = milvus::storage::CreateFileManager(
index_type, field_data_meta, index_meta, chunk_manager);
milvus::storage::FileManagerContext file_manager_context(
field_data_meta, index_meta, chunk_manager);
index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
ASSERT_NO_THROW(index->BuildWithDataset(xb_dataset, build_conf));
milvus::index::IndexBasePtr new_index;
@ -455,7 +461,7 @@ TEST_P(IndexTest, Mmap) {
index.reset();
new_index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
if (!new_index->IsMmapSupported()) {
return;
}
@ -492,15 +498,17 @@ TEST_P(IndexTest, GetVector) {
create_index_info.index_type = index_type;
create_index_info.metric_type = metric_type;
create_index_info.field_type = vec_field_data_type;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
index::IndexBasePtr index;
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
milvus::storage::IndexMeta index_meta{3, 100, 1000, 1};
auto chunk_manager = milvus::storage::CreateChunkManager(storage_config_);
auto file_manager = milvus::storage::CreateFileManager(
index_type, field_data_meta, index_meta, chunk_manager);
milvus::storage::FileManagerContext file_manager_context(
field_data_meta, index_meta, chunk_manager);
index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
ASSERT_NO_THROW(index->BuildWithDataset(xb_dataset, build_conf));
milvus::index::IndexBasePtr new_index;
@ -512,7 +520,7 @@ TEST_P(IndexTest, GetVector) {
index.reset();
new_index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
vec_index = dynamic_cast<milvus::index::VectorIndex*>(new_index.get());
@ -569,6 +577,8 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) {
create_index_info.index_type = index_type;
create_index_info.metric_type = metric_type;
create_index_info.field_type = milvus::DataType::VECTOR_FLOAT;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
int64_t collection_id = 1;
int64_t partition_id = 2;
@ -583,10 +593,10 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) {
milvus::storage::IndexMeta index_meta{
segment_id, field_id, build_id, index_version};
auto chunk_manager = storage::CreateChunkManager(storage_config);
auto file_manager = milvus::storage::CreateFileManager(
index_type, field_data_meta, index_meta, chunk_manager);
milvus::storage::FileManagerContext file_manager_context(
field_data_meta, index_meta, chunk_manager);
auto index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
auto build_conf = Config{
{knowhere::meta::METRIC_TYPE, metric_type},
@ -611,7 +621,7 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) {
index.reset();
auto new_index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, file_manager);
create_index_info, file_manager_context);
auto vec_index = dynamic_cast<milvus::index::VectorIndex*>(new_index.get());
std::vector<std::string> index_files;
for (auto& binary : binary_set.binary_map_) {

View File

@ -112,7 +112,9 @@ TYPED_TEST_P(TypedScalarIndexCreatorTest, Constructor) {
}
auto creator = milvus::indexbuilder::CreateScalarIndex(
milvus::DataType(dtype), config, nullptr);
milvus::DataType(dtype),
config,
milvus::storage::FileManagerContext());
}
}
@ -133,12 +135,16 @@ TYPED_TEST_P(TypedScalarIndexCreatorTest, Codec) {
config[iter->first] = iter->second;
}
auto creator = milvus::indexbuilder::CreateScalarIndex(
milvus::DataType(dtype), config, nullptr);
milvus::DataType(dtype),
config,
milvus::storage::FileManagerContext());
auto arr = GenArr<T>(nb);
build_index<T>(creator, arr);
auto binary_set = creator->Serialize();
auto copy_creator = milvus::indexbuilder::CreateScalarIndex(
milvus::DataType(dtype), config, nullptr);
milvus::DataType(dtype),
config,
milvus::storage::FileManagerContext());
copy_creator->Load(binary_set);
}
}

View File

@ -18,6 +18,7 @@
#include "test_utils/storage_test_utils.h"
#include "index/IndexFactory.h"
#include "storage/Util.h"
#include "knowhere/version.h"
#include "storage/ChunkCacheSingleton.h"
#include "storage/RemoteChunkManagerSingleton.h"
#include "storage/MinioChunkManager.h"
@ -88,9 +89,11 @@ TEST(Sealed, without_predicate) {
create_index_info.field_type = DataType::VECTOR_FLOAT;
create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, nullptr);
create_index_info, milvus::storage::FileManagerContext());
auto build_conf =
knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
@ -201,8 +204,10 @@ TEST(Sealed, with_predicate) {
create_index_info.field_type = DataType::VECTOR_FLOAT;
create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, nullptr);
create_index_info, milvus::storage::FileManagerContext());
auto build_conf =
knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
@ -305,8 +310,10 @@ TEST(Sealed, with_predicate_filter_all) {
create_index_info.field_type = DataType::VECTOR_FLOAT;
create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
auto ivf_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, nullptr);
create_index_info, milvus::storage::FileManagerContext());
auto ivf_build_conf =
knowhere::Json{{knowhere::meta::DIM, std::to_string(dim)},
@ -343,8 +350,10 @@ TEST(Sealed, with_predicate_filter_all) {
create_index_info.field_type = DataType::VECTOR_FLOAT;
create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_HNSW;
create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode();
auto hnsw_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, nullptr);
create_index_info, milvus::storage::FileManagerContext());
hnsw_indexing->BuildWithDataset(database, hnsw_conf);
auto hnsw_vec_index =
@ -1212,8 +1221,10 @@ TEST(Sealed, GetVectorFromChunkCache) {
auto fakevec = dataset.get_col<float>(fakevec_id);
auto conf = generate_build_conf(index_type, metric_type);
auto ds = knowhere::GenDataSet(N, dim, fakevec.data());
auto indexing =
std::make_unique<index::VectorMemIndex>(index_type, metric_type);
auto indexing = std::make_unique<index::VectorMemIndex>(
index_type,
metric_type,
knowhere::Version::GetCurrentVersion().VersionCode());
indexing->BuildWithDataset(ds, conf);
auto segment_sealed = CreateSealedSegment(schema);

View File

@ -186,10 +186,7 @@ GenTermPlan(const FieldMeta& fvec_meta,
vector_type = proto::plan::VectorType::Float16Vector;
}
auto anns = GenAnns(expr,
vector_type,
fvec_meta.get_id().get(),
"$0");
auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0");
auto plan_node = GenPlanNode();
plan_node->set_allocated_vector_anns(anns);
@ -232,10 +229,8 @@ GenAlwaysFalsePlan(const FieldMeta& fvec_meta, const FieldMeta& str_meta) {
} else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) {
vector_type = proto::plan::VectorType::Float16Vector;
}
auto anns = GenAnns(always_false_expr,
vector_type,
fvec_meta.get_id().get(),
"$0");
auto anns =
GenAnns(always_false_expr, vector_type, fvec_meta.get_id().get(), "$0");
auto plan_node = GenPlanNode();
plan_node->set_allocated_vector_anns(anns);
@ -253,10 +248,8 @@ GenAlwaysTruePlan(const FieldMeta& fvec_meta, const FieldMeta& str_meta) {
} else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) {
vector_type = proto::plan::VectorType::Float16Vector;
}
auto anns = GenAnns(always_true_expr,
vector_type,
fvec_meta.get_id().get(),
"$0");
auto anns =
GenAnns(always_true_expr, vector_type, fvec_meta.get_id().get(), "$0");
auto plan_node = GenPlanNode();
plan_node->set_allocated_vector_anns(anns);
@ -386,11 +379,7 @@ TEST(StringExpr, Compare) {
} else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) {
vector_type = proto::plan::VectorType::Float16Vector;
}
auto anns =
GenAnns(expr,
vector_type,
fvec_meta.get_id().get(),
"$0");
auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0");
auto plan_node = std::make_unique<proto::plan::PlanNode>();
plan_node->set_allocated_vector_anns(anns);
@ -497,11 +486,7 @@ TEST(StringExpr, UnaryRange) {
} else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) {
vector_type = proto::plan::VectorType::Float16Vector;
}
auto anns =
GenAnns(expr,
vector_type,
fvec_meta.get_id().get(),
"$0");
auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0");
auto plan_node = std::make_unique<proto::plan::PlanNode>();
plan_node->set_allocated_vector_anns(anns);
@ -600,11 +585,7 @@ TEST(StringExpr, BinaryRange) {
} else if (fvec_meta.get_data_type() == DataType::VECTOR_FLOAT16) {
vector_type = proto::plan::VectorType::Float16Vector;
}
auto anns =
GenAnns(expr,
vector_type,
fvec_meta.get_id().get(),
"$0");
auto anns = GenAnns(expr, vector_type, fvec_meta.get_id().get(), "$0");
auto plan_node = std::make_unique<proto::plan::PlanNode>();
plan_node->set_allocated_vector_anns(anns);

View File

@ -910,7 +910,9 @@ GenVecIndexing(int64_t N, int64_t dim, const float* vec) {
{knowhere::meta::DEVICE_ID, 0}};
auto database = knowhere::GenDataSet(N, dim, vec);
auto indexing = std::make_unique<index::VectorMemIndex>(
knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::metric::L2);
knowhere::IndexEnum::INDEX_FAISS_IVFFLAT,
knowhere::metric::L2,
knowhere::Version::GetCurrentVersion().VersionCode());
indexing->BuildWithDataset(database, conf);
return indexing;
}

View File

@ -301,6 +301,7 @@ func (ib *indexBuilder) process(buildID UniqueID) bool {
IndexParams: indexParams,
TypeParams: typeParams,
NumRows: meta.NumRows,
IndexEngineVersion: meta.IndexEngineVersion,
}
if err := ib.assignTask(client, req); err != nil {
// need to release lock then reassign, so set task state to retry

View File

@ -51,7 +51,10 @@ func (s *Server) startIndexService(ctx context.Context) {
}
func (s *Server) createIndexForSegment(segment *SegmentInfo, indexID UniqueID) error {
log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID))
indexEngineVersion := Params.CommonCfg.IndexEngineVersion.GetValue()
log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID),
zap.String("index_engine_version", indexEngineVersion),
)
buildID, err := s.allocator.allocID(context.Background())
if err != nil {
return err
@ -65,6 +68,7 @@ func (s *Server) createIndexForSegment(segment *SegmentInfo, indexID UniqueID) e
BuildID: buildID,
CreateTime: uint64(segment.ID),
WriteHandoff: false,
IndexEngineVersion: indexEngineVersion,
}
if err = s.meta.AddSegmentIndex(segIndex); err != nil {
return err
@ -742,6 +746,7 @@ func (s *Server) GetIndexInfos(ctx context.Context, req *indexpb.GetIndexInfoReq
SerializedSize: segIdx.IndexSize,
IndexVersion: segIdx.IndexVersion,
NumRows: segIdx.NumRows,
IndexEngineVersion: segIdx.IndexEngineVersion,
})
}
}

View File

@ -63,6 +63,7 @@ func (i *IndexNode) CreateJob(ctx context.Context, req *indexpb.CreateJobRequest
zap.Any("typeParams", req.GetTypeParams()),
zap.Any("indexParams", req.GetIndexParams()),
zap.Int64("numRows", req.GetNumRows()),
zap.String("index_engine_version", req.GetIndexEngineVersion()),
)
ctx, sp := otel.Tracer(typeutil.IndexNodeRole).Start(ctx, "IndexNode-CreateIndex", trace.WithAttributes(
attribute.Int64("indexBuildID", req.GetBuildID()),

View File

@ -337,6 +337,11 @@ func (it *indexBuildTask) BuildIndex(ctx context.Context) error {
}
}
if err := buildIndexInfo.AppendIndexEngineVersion(it.req.GetIndexEngineVersion()); err != nil {
log.Ctx(ctx).Warn("append index engine version failed", zap.Error(err))
return err
}
it.index, err = indexcgowrapper.CreateIndex(ctx, buildIndexInfo)
if err != nil {
if it.index != nil && it.index.CleanLocalData() != nil {

View File

@ -23,6 +23,7 @@ type SegmentIndex struct {
IndexSize uint64
// deprecated
WriteHandoff bool
IndexEngineVersion string
}
func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex {
@ -46,6 +47,7 @@ func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex {
IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys),
IndexSize: segIndex.SerializeSize,
WriteHandoff: segIndex.WriteHandoff,
IndexEngineVersion: segIndex.GetIndexEngineVersion(),
}
}
@ -70,6 +72,7 @@ func MarshalSegmentIndexModel(segIdx *SegmentIndex) *indexpb.SegmentIndex {
CreateTime: segIdx.CreateTime,
SerializeSize: segIdx.IndexSize,
WriteHandoff: segIdx.WriteHandoff,
IndexEngineVersion: segIdx.IndexEngineVersion,
}
}
@ -90,5 +93,6 @@ func CloneSegmentIndex(segIndex *SegmentIndex) *SegmentIndex {
IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys),
IndexSize: segIndex.IndexSize,
WriteHandoff: segIndex.WriteHandoff,
IndexEngineVersion: segIndex.IndexEngineVersion,
}
}

View File

@ -83,6 +83,7 @@ message SegmentIndex {
uint64 create_time = 13;
uint64 serialize_size = 14;
bool write_handoff = 15;
string index_engine_version = 16;
}
message RegisterNodeRequest {
@ -152,6 +153,7 @@ message IndexFilePathInfo {
uint64 serialized_size = 8;
int64 index_version = 9;
int64 num_rows = 10;
string index_engine_version = 11;
}
message SegmentInfo {
@ -223,6 +225,7 @@ message CreateJobRequest {
repeated common.KeyValuePair index_params = 9;
repeated common.KeyValuePair type_params = 10;
int64 num_rows = 11;
string index_engine_version = 12;
}
message QueryJobsRequest {

View File

@ -236,6 +236,7 @@ type SegmentIndex struct {
CreateTime uint64 `protobuf:"varint,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
SerializeSize uint64 `protobuf:"varint,14,opt,name=serialize_size,json=serializeSize,proto3" json:"serialize_size,omitempty"`
WriteHandoff bool `protobuf:"varint,15,opt,name=write_handoff,json=writeHandoff,proto3" json:"write_handoff,omitempty"`
IndexEngineVersion string `protobuf:"bytes,16,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -371,6 +372,13 @@ func (m *SegmentIndex) GetWriteHandoff() bool {
return false
}
func (m *SegmentIndex) GetIndexEngineVersion() string {
if m != nil {
return m.IndexEngineVersion
}
return ""
}
type RegisterNodeRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
Address *commonpb.Address `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
@ -893,6 +901,7 @@ type IndexFilePathInfo struct {
SerializedSize uint64 `protobuf:"varint,8,opt,name=serialized_size,json=serializedSize,proto3" json:"serialized_size,omitempty"`
IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"`
NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"`
IndexEngineVersion string `protobuf:"bytes,11,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -993,6 +1002,13 @@ func (m *IndexFilePathInfo) GetNumRows() int64 {
return 0
}
func (m *IndexFilePathInfo) GetIndexEngineVersion() string {
if m != nil {
return m.IndexEngineVersion
}
return ""
}
type SegmentInfo struct {
CollectionID int64 `protobuf:"varint,1,opt,name=collectionID,proto3" json:"collectionID,omitempty"`
SegmentID int64 `protobuf:"varint,2,opt,name=segmentID,proto3" json:"segmentID,omitempty"`
@ -1517,6 +1533,7 @@ type CreateJobRequest struct {
IndexParams []*commonpb.KeyValuePair `protobuf:"bytes,9,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"`
TypeParams []*commonpb.KeyValuePair `protobuf:"bytes,10,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"`
NumRows int64 `protobuf:"varint,11,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"`
IndexEngineVersion string `protobuf:"bytes,12,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1624,6 +1641,13 @@ func (m *CreateJobRequest) GetNumRows() int64 {
return 0
}
func (m *CreateJobRequest) GetIndexEngineVersion() string {
if m != nil {
return m.IndexEngineVersion
}
return ""
}
type QueryJobsRequest struct {
ClusterID string `protobuf:"bytes,1,opt,name=clusterID,proto3" json:"clusterID,omitempty"`
BuildIDs []int64 `protobuf:"varint,2,rep,packed,name=buildIDs,proto3" json:"buildIDs,omitempty"`
@ -2173,152 +2197,154 @@ func init() {
func init() { proto.RegisterFile("index_coord.proto", fileDescriptor_f9e019eb3fda53c2) }
var fileDescriptor_f9e019eb3fda53c2 = []byte{
// 2319 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0xcf, 0x6f, 0x1c, 0x49,
0xf5, 0x4f, 0xbb, 0xc7, 0xf6, 0xf4, 0xeb, 0x19, 0xff, 0xa8, 0x78, 0xbf, 0xdf, 0xc9, 0x24, 0x21,
0x4e, 0x67, 0x93, 0x18, 0x44, 0x9c, 0xe0, 0x65, 0xd1, 0x82, 0x00, 0xc9, 0xb1, 0x37, 0xc9, 0x24,
0x9b, 0xc8, 0xb4, 0xa3, 0x48, 0xac, 0x10, 0x4d, 0xcf, 0x74, 0x8d, 0x5d, 0xeb, 0x9e, 0xae, 0x49,
0x57, 0x75, 0x12, 0x07, 0x09, 0xc1, 0x61, 0x0f, 0xa0, 0x95, 0x10, 0x68, 0x25, 0xfe, 0x01, 0x4e,
0xfb, 0x27, 0x70, 0xe1, 0xc2, 0x91, 0x13, 0x77, 0x2e, 0xfc, 0x13, 0x5c, 0x51, 0xfd, 0xe8, 0x9e,
0xee, 0x9e, 0x1e, 0xcf, 0xc4, 0x36, 0x42, 0x82, 0xdb, 0xd4, 0xab, 0x57, 0x3f, 0xfa, 0xbd, 0xcf,
0x7b, 0xef, 0xf3, 0x6a, 0x60, 0x95, 0x44, 0x01, 0x7e, 0xe3, 0xf5, 0x28, 0x8d, 0x83, 0xcd, 0x61,
0x4c, 0x39, 0x45, 0x68, 0x40, 0xc2, 0x57, 0x09, 0x53, 0xa3, 0x4d, 0x39, 0xdf, 0x6e, 0xf4, 0xe8,
0x60, 0x40, 0x23, 0x25, 0x6b, 0x2f, 0x91, 0x88, 0xe3, 0x38, 0xf2, 0x43, 0x3d, 0x6e, 0xe4, 0x57,
0x38, 0x7f, 0xaf, 0x81, 0xd5, 0x11, 0xab, 0x3a, 0x51, 0x9f, 0x22, 0x07, 0x1a, 0x3d, 0x1a, 0x86,
0xb8, 0xc7, 0x09, 0x8d, 0x3a, 0xbb, 0x2d, 0x63, 0xdd, 0xd8, 0x30, 0xdd, 0x82, 0x0c, 0xb5, 0x60,
0xb1, 0x4f, 0x70, 0x18, 0x74, 0x76, 0x5b, 0x73, 0x72, 0x3a, 0x1d, 0xa2, 0xab, 0x00, 0xea, 0x82,
0x91, 0x3f, 0xc0, 0x2d, 0x73, 0xdd, 0xd8, 0xb0, 0x5c, 0x4b, 0x4a, 0x9e, 0xf9, 0x03, 0x2c, 0x16,
0xca, 0x41, 0x67, 0xb7, 0x55, 0x53, 0x0b, 0xf5, 0x10, 0xdd, 0x07, 0x9b, 0x1f, 0x0f, 0xb1, 0x37,
0xf4, 0x63, 0x7f, 0xc0, 0x5a, 0xf3, 0xeb, 0xe6, 0x86, 0xbd, 0x75, 0x7d, 0xb3, 0xf0, 0x69, 0xfa,
0x9b, 0x9e, 0xe0, 0xe3, 0x17, 0x7e, 0x98, 0xe0, 0x3d, 0x9f, 0xc4, 0x2e, 0x88, 0x55, 0x7b, 0x72,
0x11, 0xda, 0x85, 0x86, 0x3a, 0x5c, 0x6f, 0xb2, 0x30, 0xeb, 0x26, 0xb6, 0x5c, 0xa6, 0x77, 0xb9,
0xae, 0x77, 0xc1, 0x81, 0x17, 0xd3, 0xd7, 0xac, 0xb5, 0x28, 0x2f, 0x6a, 0x6b, 0x99, 0x4b, 0x5f,
0x33, 0xf1, 0x95, 0x9c, 0x72, 0x3f, 0x54, 0x0a, 0x75, 0xa9, 0x60, 0x49, 0x89, 0x9c, 0xfe, 0x10,
0xe6, 0x19, 0xf7, 0x39, 0x6e, 0x59, 0xeb, 0xc6, 0xc6, 0xd2, 0xd6, 0xb5, 0xca, 0x0b, 0x48, 0x8b,
0xef, 0x0b, 0x35, 0x57, 0x69, 0xa3, 0x0f, 0xe1, 0xff, 0xd5, 0xf5, 0xe5, 0xd0, 0xeb, 0xfb, 0x24,
0xf4, 0x62, 0xec, 0x33, 0x1a, 0xb5, 0x40, 0x1a, 0x72, 0x8d, 0x64, 0x6b, 0x1e, 0xf8, 0x24, 0x74,
0xe5, 0x1c, 0x72, 0xa0, 0x49, 0x98, 0xe7, 0x27, 0x9c, 0x7a, 0x72, 0xbe, 0x65, 0xaf, 0x1b, 0x1b,
0x75, 0xd7, 0x26, 0x6c, 0x3b, 0xe1, 0x54, 0x1e, 0x83, 0x9e, 0xc2, 0x6a, 0xc2, 0x70, 0xec, 0x15,
0xcc, 0xd3, 0x98, 0xd5, 0x3c, 0xcb, 0x62, 0x6d, 0x27, 0x67, 0xa2, 0x6f, 0x02, 0x1a, 0xe2, 0x28,
0x20, 0xd1, 0x81, 0xde, 0x51, 0xda, 0xa1, 0x29, 0xed, 0xb0, 0xa2, 0x67, 0xa4, 0xbe, 0x30, 0x87,
0xf3, 0xb9, 0x01, 0xf0, 0x40, 0xe2, 0x43, 0xde, 0xe5, 0xfb, 0x29, 0x44, 0x48, 0xd4, 0xa7, 0x12,
0x5e, 0xf6, 0xd6, 0xd5, 0xcd, 0x71, 0x0c, 0x6f, 0x66, 0x98, 0xd4, 0x08, 0x92, 0xf0, 0x6c, 0xc1,
0x62, 0x80, 0x43, 0xcc, 0x71, 0x20, 0xa1, 0x57, 0x77, 0xd3, 0x21, 0xba, 0x06, 0x76, 0x2f, 0xc6,
0xc2, 0x72, 0x9c, 0x68, 0xec, 0xd5, 0x5c, 0x50, 0xa2, 0xe7, 0x64, 0x80, 0x9d, 0xcf, 0x6b, 0xd0,
0xd8, 0xc7, 0x07, 0x03, 0x1c, 0x71, 0x75, 0x93, 0x59, 0xa0, 0xbe, 0x0e, 0xf6, 0xd0, 0x8f, 0x39,
0xd1, 0x2a, 0x0a, 0xee, 0x79, 0x11, 0xba, 0x02, 0x16, 0xd3, 0xbb, 0xee, 0xca, 0x53, 0x4d, 0x77,
0x24, 0x40, 0x97, 0xa0, 0x1e, 0x25, 0x03, 0x65, 0x20, 0x0d, 0xf9, 0x28, 0x19, 0x48, 0x98, 0xe4,
0x82, 0x61, 0xbe, 0x18, 0x0c, 0x2d, 0x58, 0xec, 0x26, 0x44, 0xc6, 0xd7, 0x82, 0x9a, 0xd1, 0x43,
0xf4, 0x7f, 0xb0, 0x10, 0xd1, 0x00, 0x77, 0x76, 0x35, 0x2c, 0xf5, 0x08, 0xdd, 0x80, 0xa6, 0x32,
0xea, 0x2b, 0x1c, 0x33, 0x42, 0x23, 0x0d, 0x4a, 0x85, 0xe4, 0x17, 0x4a, 0x76, 0x5a, 0x5c, 0x5e,
0x03, 0x7b, 0x1c, 0x8b, 0xd0, 0x1f, 0x21, 0xf0, 0x16, 0x2c, 0xab, 0xc3, 0xfb, 0x24, 0xc4, 0xde,
0x11, 0x3e, 0x66, 0x2d, 0x7b, 0xdd, 0xdc, 0xb0, 0x5c, 0x75, 0xa7, 0x07, 0x24, 0xc4, 0x4f, 0xf0,
0x31, 0xcb, 0xfb, 0xae, 0x71, 0xa2, 0xef, 0x9a, 0x65, 0xdf, 0xa1, 0x9b, 0xb0, 0xc4, 0x70, 0x4c,
0xfc, 0x90, 0xbc, 0xc5, 0x1e, 0x23, 0x6f, 0x71, 0x6b, 0x49, 0xea, 0x34, 0x33, 0xe9, 0x3e, 0x79,
0x8b, 0x85, 0x19, 0x5e, 0xc7, 0x84, 0x63, 0xef, 0xd0, 0x8f, 0x02, 0xda, 0xef, 0xb7, 0x96, 0xe5,
0x39, 0x0d, 0x29, 0x7c, 0xa4, 0x64, 0xce, 0x1f, 0x0c, 0xb8, 0xe8, 0xe2, 0x03, 0xc2, 0x38, 0x8e,
0x9f, 0xd1, 0x00, 0xbb, 0xf8, 0x65, 0x82, 0x19, 0x47, 0xf7, 0xa0, 0xd6, 0xf5, 0x19, 0xd6, 0x90,
0xbc, 0x52, 0x69, 0x9d, 0xa7, 0xec, 0xe0, 0xbe, 0xcf, 0xb0, 0x2b, 0x35, 0xd1, 0x77, 0x60, 0xd1,
0x0f, 0x82, 0x18, 0x33, 0x26, 0x81, 0x31, 0x69, 0xd1, 0xb6, 0xd2, 0x71, 0x53, 0xe5, 0x9c, 0x17,
0xcd, 0xbc, 0x17, 0x9d, 0xdf, 0x1a, 0xb0, 0x56, 0xbc, 0x19, 0x1b, 0xd2, 0x88, 0x61, 0xf4, 0x01,
0x2c, 0x08, 0x5f, 0x24, 0x4c, 0x5f, 0xee, 0x72, 0xe5, 0x39, 0xfb, 0x52, 0xc5, 0xd5, 0xaa, 0x22,
0xa5, 0x92, 0x88, 0xf0, 0x34, 0xdc, 0xd5, 0x0d, 0xaf, 0x97, 0x23, 0x4d, 0x17, 0x86, 0x4e, 0x44,
0xb8, 0x8a, 0x6e, 0x17, 0x48, 0xf6, 0xdb, 0xf9, 0x31, 0xac, 0x3d, 0xc4, 0x3c, 0x87, 0x09, 0x6d,
0xab, 0x59, 0x42, 0xa7, 0x58, 0x0b, 0xe6, 0x4a, 0xb5, 0xc0, 0xf9, 0xa3, 0x01, 0xef, 0x95, 0xf6,
0x3e, 0xcb, 0xd7, 0x66, 0xe0, 0x9e, 0x3b, 0x0b, 0xb8, 0xcd, 0x32, 0xb8, 0x9d, 0x5f, 0x1a, 0x70,
0xf9, 0x21, 0xe6, 0xf9, 0xc4, 0x71, 0xce, 0x96, 0x40, 0x5f, 0x03, 0xc8, 0x12, 0x06, 0x6b, 0x99,
0xeb, 0xe6, 0x86, 0xe9, 0xe6, 0x24, 0xce, 0xaf, 0x0d, 0x58, 0x1d, 0x3b, 0xbf, 0x98, 0x77, 0x8c,
0x72, 0xde, 0xf9, 0x77, 0x99, 0xe3, 0xf7, 0x06, 0x5c, 0xa9, 0x36, 0xc7, 0x59, 0x9c, 0xf7, 0x03,
0xb5, 0x08, 0x0b, 0x94, 0x8a, 0xa2, 0x74, 0xb3, 0xaa, 0x1e, 0x8c, 0x9f, 0xa9, 0x17, 0x39, 0x5f,
0x98, 0x80, 0x76, 0x64, 0xb2, 0x50, 0x55, 0xe7, 0x1d, 0x5c, 0x73, 0x6a, 0x2a, 0x53, 0x22, 0x2c,
0xb5, 0xf3, 0x20, 0x2c, 0xf3, 0xa7, 0x22, 0x2c, 0x57, 0xc0, 0x12, 0x59, 0x93, 0x71, 0x7f, 0x30,
0x94, 0xf5, 0xa2, 0xe6, 0x8e, 0x04, 0xe3, 0xf4, 0x60, 0x71, 0x46, 0x7a, 0x50, 0x3f, 0x2d, 0x3d,
0x70, 0xde, 0xc0, 0xc5, 0x34, 0xb0, 0x65, 0xf9, 0x7e, 0x07, 0x77, 0x14, 0x43, 0x61, 0xae, 0x1c,
0x0a, 0x53, 0x9c, 0xe2, 0xfc, 0x73, 0x0e, 0x56, 0x3b, 0x69, 0xcd, 0xd9, 0xf3, 0xf9, 0xa1, 0xe4,
0x0c, 0x27, 0x47, 0xca, 0x64, 0x04, 0xe4, 0x0a, 0xb4, 0x39, 0xb1, 0x40, 0xd7, 0x8a, 0x05, 0xba,
0x78, 0xc1, 0xf9, 0x32, 0x6a, 0xce, 0x87, 0xa2, 0x6e, 0xc0, 0x4a, 0xae, 0xe0, 0x0e, 0x7d, 0x7e,
0x28, 0x68, 0xaa, 0xa8, 0xb8, 0x4b, 0x24, 0xff, 0xf5, 0x0c, 0xdd, 0x86, 0xe5, 0xac, 0x42, 0x06,
0xaa, 0x70, 0xd6, 0x25, 0x42, 0x46, 0xe5, 0x34, 0x48, 0x2b, 0x67, 0x91, 0x40, 0x58, 0x15, 0x04,
0x22, 0x4f, 0x66, 0xa0, 0x40, 0x66, 0x9c, 0x3f, 0x19, 0x60, 0x67, 0x01, 0x3a, 0x63, 0x1b, 0x51,
0xf0, 0xcb, 0x5c, 0xd9, 0x2f, 0xd7, 0xa1, 0x81, 0x23, 0xbf, 0x1b, 0x62, 0x8d, 0x5b, 0x53, 0xe1,
0x56, 0xc9, 0x14, 0x6e, 0x1f, 0x80, 0x3d, 0xa2, 0x92, 0x69, 0x0c, 0xde, 0x9c, 0xc8, 0x25, 0xf3,
0xa0, 0x70, 0x21, 0xe3, 0x94, 0xcc, 0xf9, 0xcd, 0xdc, 0xa8, 0xcc, 0x29, 0xc4, 0x9e, 0x25, 0x99,
0xfd, 0x04, 0x1a, 0xfa, 0x2b, 0x14, 0xc5, 0x55, 0x29, 0xed, 0xbb, 0x55, 0xd7, 0xaa, 0x3a, 0x74,
0x33, 0x67, 0xc6, 0x8f, 0x23, 0x1e, 0x1f, 0xbb, 0x36, 0x1b, 0x49, 0xda, 0x1e, 0xac, 0x94, 0x15,
0xd0, 0x0a, 0x98, 0x47, 0xf8, 0x58, 0xdb, 0x58, 0xfc, 0x14, 0xe9, 0xff, 0x95, 0xc0, 0x8e, 0xae,
0xfa, 0xd7, 0x4e, 0xcc, 0xa7, 0x7d, 0xea, 0x2a, 0xed, 0xef, 0xcd, 0x7d, 0x64, 0x38, 0x5f, 0x1a,
0xb0, 0xb2, 0x1b, 0xd3, 0xe1, 0x3b, 0xa7, 0x52, 0x07, 0x1a, 0x39, 0x5e, 0x9c, 0x46, 0x6f, 0x41,
0x36, 0x2d, 0xa9, 0x5e, 0x82, 0x7a, 0x10, 0xd3, 0xa1, 0xe7, 0x87, 0xa1, 0x0c, 0x2c, 0x41, 0x11,
0x63, 0x3a, 0xdc, 0x0e, 0x43, 0xe7, 0x35, 0xac, 0xed, 0x62, 0xd6, 0x8b, 0x49, 0xf7, 0xdd, 0x93,
0xfc, 0x94, 0xfa, 0x5b, 0x48, 0xa0, 0x66, 0x29, 0x81, 0x3a, 0x5f, 0x18, 0xf0, 0x5e, 0xe9, 0xe4,
0xb3, 0xa0, 0xe3, 0x87, 0x45, 0xcc, 0x2a, 0x70, 0x4c, 0xe9, 0x7f, 0xf2, 0x58, 0xf5, 0x65, 0xfd,
0x95, 0x73, 0xf7, 0x45, 0xce, 0xd9, 0x8b, 0xe9, 0x81, 0x64, 0x97, 0xe7, 0xc7, 0xcc, 0xfe, 0x62,
0xc0, 0xd5, 0x09, 0x67, 0x9c, 0xe5, 0xcb, 0xcb, 0x8d, 0xf5, 0xdc, 0xb4, 0xc6, 0xda, 0x2c, 0x37,
0xd6, 0xd5, 0x7d, 0x67, 0x6d, 0x42, 0xdf, 0xf9, 0xa5, 0x09, 0xcd, 0x7d, 0x4e, 0x63, 0xff, 0x00,
0xef, 0xd0, 0xa8, 0x4f, 0x0e, 0x44, 0xda, 0x4e, 0xf9, 0xba, 0x21, 0x3f, 0x3a, 0x63, 0xe4, 0xd7,
0xa1, 0xe1, 0xf7, 0x7a, 0x98, 0x31, 0xd1, 0xbe, 0xe8, 0x6c, 0x64, 0xb9, 0xb6, 0x92, 0x3d, 0x11,
0x22, 0xf4, 0x0d, 0x58, 0x65, 0xb8, 0x17, 0x63, 0xee, 0x8d, 0x34, 0x35, 0x82, 0x97, 0xd5, 0xc4,
0x76, 0xaa, 0x2d, 0x08, 0x7e, 0xc2, 0xf0, 0xfe, 0xfe, 0x27, 0x1a, 0xc5, 0x7a, 0x24, 0xe8, 0x55,
0x37, 0xe9, 0x1d, 0x61, 0x9e, 0x2f, 0x0f, 0xa0, 0x44, 0x12, 0x8a, 0x97, 0xc1, 0x8a, 0x29, 0xe5,
0x32, 0xa7, 0xcb, 0x5a, 0x6e, 0xb9, 0x75, 0x21, 0x10, 0x69, 0x4b, 0xef, 0xda, 0xd9, 0x7e, 0xaa,
0x6b, 0xb8, 0x1e, 0x89, 0x1e, 0xb5, 0xb3, 0xfd, 0xf4, 0xe3, 0x28, 0x18, 0x52, 0x12, 0x71, 0x99,
0xe0, 0x2d, 0x37, 0x2f, 0x12, 0x9f, 0xc7, 0x94, 0x25, 0x3c, 0x41, 0x3f, 0x64, 0x72, 0xb7, 0x5c,
0x5b, 0xcb, 0x9e, 0x1f, 0x0f, 0xb1, 0xa8, 0x29, 0x09, 0xc3, 0xde, 0x2b, 0x12, 0xf3, 0xc4, 0x0f,
0xbd, 0x43, 0xca, 0xb8, 0xcc, 0xf1, 0x75, 0x77, 0x29, 0x61, 0xf8, 0x85, 0x12, 0x3f, 0xa2, 0x8c,
0x8b, 0x6b, 0xc4, 0xf8, 0x40, 0xd4, 0x08, 0x5b, 0x6e, 0xa3, 0x47, 0xa2, 0x47, 0xeb, 0x85, 0x34,
0x09, 0xbc, 0x61, 0x4c, 0x5f, 0x91, 0x00, 0xc7, 0xb2, 0xcb, 0xb3, 0xdc, 0xa6, 0x94, 0xee, 0x69,
0xa1, 0xf3, 0x0f, 0x13, 0x56, 0x14, 0x59, 0x7b, 0x4c, 0xbb, 0x29, 0x6a, 0xaf, 0x80, 0xd5, 0x0b,
0x13, 0xd1, 0xf7, 0x68, 0xc8, 0x5a, 0xee, 0x48, 0x20, 0x4c, 0x9f, 0xaf, 0x77, 0x31, 0xee, 0x93,
0x37, 0xda, 0x45, 0xcb, 0xa3, 0x82, 0x27, 0xc5, 0xf9, 0xd2, 0x6c, 0x8e, 0x95, 0xe6, 0xc0, 0xe7,
0xbe, 0xae, 0x97, 0x35, 0x59, 0x2f, 0x2d, 0x21, 0x51, 0xa5, 0x72, 0xac, 0x02, 0xce, 0x57, 0x54,
0xc0, 0x1c, 0x25, 0x58, 0x28, 0x52, 0x82, 0x62, 0x4c, 0x2d, 0x96, 0x73, 0xcc, 0x23, 0x58, 0x4a,
0x3d, 0xd0, 0x93, 0x60, 0x94, 0x6e, 0xaa, 0xe8, 0xc7, 0x64, 0x66, 0xce, 0xa3, 0xd6, 0x6d, 0xb2,
0x02, 0x88, 0xcb, 0x14, 0xc2, 0x3a, 0x15, 0x85, 0x28, 0xd1, 0x57, 0x38, 0x0d, 0x7d, 0xcd, 0xd3,
0x01, 0xbb, 0x48, 0x07, 0x3e, 0x81, 0x95, 0x1f, 0x25, 0x38, 0x3e, 0x7e, 0x4c, 0xbb, 0x6c, 0x36,
0x1f, 0xb7, 0xa1, 0xae, 0x1d, 0x95, 0x56, 0x8e, 0x6c, 0xec, 0xfc, 0xcd, 0x80, 0xa6, 0x8c, 0xeb,
0xe7, 0x3e, 0x3b, 0x4a, 0x9f, 0x81, 0x52, 0x2f, 0x1b, 0x45, 0x2f, 0x9f, 0xb2, 0xf1, 0xa9, 0x78,
0xc3, 0x30, 0xab, 0xde, 0x30, 0x2a, 0x08, 0x55, 0xad, 0x92, 0x50, 0x95, 0x3a, 0xa9, 0xf9, 0xb1,
0x4e, 0xea, 0x2b, 0x03, 0x56, 0x73, 0x36, 0x3a, 0x4b, 0x66, 0x2d, 0x58, 0x76, 0xae, 0x6c, 0xd9,
0xfb, 0xc5, 0x8a, 0x63, 0x56, 0xb9, 0x3a, 0x57, 0x71, 0x52, 0x1b, 0x17, 0xaa, 0xce, 0x13, 0x58,
0x16, 0x9c, 0xe0, 0x7c, 0xdc, 0xf9, 0x57, 0x03, 0x16, 0x1f, 0xd3, 0xae, 0x74, 0x64, 0x1e, 0x43,
0x46, 0xf1, 0x7d, 0x6c, 0x05, 0xcc, 0x80, 0x0c, 0x74, 0x99, 0x10, 0x3f, 0x45, 0x8c, 0x31, 0xee,
0xc7, 0x7c, 0xf4, 0xc2, 0x27, 0x18, 0xa3, 0x90, 0xc8, 0x47, 0xa2, 0x4b, 0x50, 0xc7, 0x51, 0xa0,
0x26, 0x35, 0x2d, 0xc7, 0x51, 0x20, 0xa7, 0xce, 0xa7, 0xd3, 0x5a, 0x83, 0xf9, 0x21, 0x1d, 0xbd,
0xca, 0xa9, 0x81, 0xb3, 0x06, 0xe8, 0x21, 0xe6, 0x8f, 0x69, 0x57, 0x78, 0x25, 0x35, 0x8f, 0xf3,
0xe7, 0x39, 0xd9, 0x05, 0x8d, 0xc4, 0x67, 0x71, 0xb0, 0x03, 0x4d, 0x55, 0x17, 0x3f, 0xa3, 0x5d,
0x2f, 0x4a, 0x52, 0xa3, 0xd8, 0x52, 0xf8, 0x98, 0x76, 0x9f, 0x25, 0x03, 0x74, 0x07, 0x2e, 0x92,
0x48, 0xe4, 0x5e, 0x59, 0xaa, 0x33, 0x4d, 0x65, 0xa5, 0x15, 0x12, 0xa5, 0x45, 0x5c, 0xab, 0xdf,
0x82, 0x65, 0x1c, 0xbd, 0x4c, 0x70, 0x82, 0x33, 0x55, 0x65, 0xb3, 0xa6, 0x16, 0x6b, 0x3d, 0x51,
0x92, 0x7d, 0x76, 0xe4, 0xb1, 0x90, 0x72, 0xa6, 0x73, 0xa2, 0x25, 0x24, 0xfb, 0x42, 0x80, 0x3e,
0x02, 0x4b, 0x2c, 0x57, 0xd0, 0x52, 0xdd, 0xcc, 0xe5, 0x2a, 0x68, 0x69, 0x7f, 0xbb, 0xf5, 0xcf,
0xd4, 0x0f, 0x26, 0x02, 0x44, 0xf3, 0xfb, 0x80, 0xb0, 0x23, 0x5d, 0xd2, 0x40, 0x89, 0x76, 0x09,
0x3b, 0x72, 0x7e, 0x0a, 0x97, 0xf2, 0xef, 0x43, 0x84, 0x71, 0xd2, 0x3b, 0x4f, 0x9a, 0xf3, 0x3b,
0x03, 0xda, 0x55, 0x07, 0xfc, 0x07, 0xd9, 0xdd, 0xd6, 0xaf, 0x6c, 0x00, 0x39, 0xb3, 0x43, 0x69,
0x1c, 0xa0, 0x50, 0x42, 0x6b, 0x87, 0x0e, 0x86, 0x34, 0xc2, 0x11, 0x97, 0x19, 0x8b, 0xa1, 0xcd,
0xe2, 0x7e, 0x7a, 0x30, 0xae, 0xa8, 0x6d, 0xd5, 0x7e, 0xbf, 0x52, 0xbf, 0xa4, 0xec, 0x5c, 0x40,
0x2f, 0x65, 0x17, 0x34, 0x32, 0xc5, 0xce, 0xa1, 0x1f, 0x45, 0x38, 0x44, 0x5b, 0x13, 0xde, 0x0c,
0xab, 0x94, 0xd3, 0x33, 0x6f, 0x54, 0x9e, 0xb9, 0xcf, 0x63, 0x12, 0x1d, 0xa4, 0x26, 0x76, 0x2e,
0xa0, 0xe7, 0x60, 0xe7, 0x1e, 0x6e, 0xd0, 0xad, 0x2a, 0x4b, 0x8d, 0xbf, 0xec, 0xb4, 0x4f, 0xf2,
0x85, 0x73, 0x01, 0xf5, 0xa1, 0x59, 0x78, 0x59, 0x44, 0x1b, 0x27, 0x35, 0x5f, 0xf9, 0xe7, 0xbc,
0xf6, 0xd7, 0x67, 0xd0, 0xcc, 0x6e, 0xff, 0x73, 0x65, 0xb0, 0xb1, 0xa7, 0xb9, 0xbb, 0x13, 0x36,
0x99, 0xf4, 0x88, 0xd8, 0xbe, 0x37, 0xfb, 0x82, 0xec, 0xf0, 0x60, 0xf4, 0x91, 0x2a, 0xa0, 0x6e,
0x4f, 0xef, 0x30, 0xd5, 0x69, 0x1b, 0xb3, 0xb6, 0xa2, 0xce, 0x05, 0xb4, 0x07, 0x56, 0xd6, 0x0c,
0xa2, 0xf7, 0xab, 0x16, 0x96, 0x7b, 0xc5, 0x19, 0x9c, 0x53, 0x68, 0xa7, 0xaa, 0x9d, 0x53, 0xd5,
0xeb, 0x55, 0x3b, 0xa7, 0xb2, 0x37, 0x73, 0x2e, 0xa0, 0x44, 0xc6, 0x4e, 0x29, 0xba, 0xd1, 0x9d,
0x69, 0xfe, 0x2d, 0xa4, 0x99, 0xf6, 0xe6, 0xac, 0xea, 0xd9, 0xb1, 0xbf, 0x18, 0xbd, 0x6a, 0x17,
0x7a, 0x27, 0x74, 0xef, 0xa4, 0xad, 0xaa, 0x5a, 0xb9, 0xf6, 0xb7, 0xde, 0x61, 0x45, 0x0e, 0x93,
0x68, 0xff, 0x90, 0xbe, 0x56, 0x64, 0x31, 0x89, 0x7d, 0x91, 0x0b, 0x2b, 0x0e, 0xd7, 0x21, 0x3c,
0xae, 0x3a, 0xf1, 0xf0, 0x13, 0x56, 0x64, 0x87, 0x7b, 0x00, 0x0f, 0x31, 0x7f, 0x8a, 0x79, 0x2c,
0x6c, 0x7d, 0x6b, 0x52, 0x9e, 0xd2, 0x0a, 0xe9, 0x51, 0xb7, 0xa7, 0xea, 0x65, 0x07, 0x74, 0xc1,
0xde, 0x39, 0xc4, 0xbd, 0xa3, 0x47, 0xd8, 0x0f, 0xf9, 0x21, 0xaa, 0x5e, 0x99, 0xd3, 0x98, 0x00,
0xf9, 0x2a, 0xc5, 0xf4, 0x8c, 0xad, 0xaf, 0x16, 0xf4, 0xff, 0xe1, 0xcf, 0x68, 0x80, 0xff, 0xfb,
0x53, 0xf0, 0x1e, 0x58, 0x59, 0x3b, 0x56, 0x1d, 0xe1, 0xe5, 0x6e, 0x6d, 0x5a, 0x84, 0x7f, 0x0a,
0x56, 0x46, 0x6c, 0xab, 0x77, 0x2c, 0xf7, 0x06, 0xed, 0x9b, 0x53, 0xb4, 0xb2, 0xdb, 0x3e, 0x83,
0x7a, 0x4a, 0x44, 0xd1, 0x8d, 0x49, 0xe9, 0x28, 0xbf, 0xf3, 0x94, 0xbb, 0xfe, 0x0c, 0xec, 0x1c,
0x4b, 0xab, 0x2e, 0x40, 0xe3, 0xec, 0xae, 0x7d, 0x7b, 0xaa, 0xde, 0xff, 0x46, 0x40, 0xde, 0xff,
0xf6, 0xa7, 0x5b, 0x07, 0x84, 0x1f, 0x26, 0x5d, 0x61, 0xd9, 0xbb, 0x4a, 0xf3, 0x0e, 0xa1, 0xfa,
0xd7, 0xdd, 0xf4, 0x96, 0x77, 0xe5, 0x4e, 0x77, 0xa5, 0x9d, 0x86, 0xdd, 0xee, 0x82, 0x1c, 0x7e,
0xf0, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xda, 0xb6, 0x87, 0xda, 0xce, 0x22, 0x00, 0x00,
// 2344 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0xdd, 0x6f, 0xdc, 0x58,
0x15, 0xaf, 0xe3, 0x49, 0x32, 0x3e, 0x9e, 0xc9, 0xc7, 0xdd, 0x2c, 0x4c, 0xa7, 0x5d, 0x9a, 0xba,
0xdb, 0x36, 0x20, 0x9a, 0x96, 0x2c, 0x8b, 0x16, 0x04, 0x48, 0x69, 0xd2, 0x8f, 0xb4, 0xdb, 0x2a,
0x38, 0x55, 0x25, 0x56, 0x08, 0xe3, 0x19, 0xdf, 0x99, 0xdc, 0x8d, 0xc7, 0x77, 0xea, 0x7b, 0xdd,
0x36, 0x45, 0x42, 0xf0, 0xc0, 0x03, 0x68, 0x25, 0x04, 0xaa, 0xc4, 0x3f, 0xc0, 0x0b, 0xfb, 0x0f,
0x20, 0xf1, 0xc2, 0x0b, 0x8f, 0x3c, 0xf1, 0xce, 0xff, 0x82, 0xee, 0x87, 0x3d, 0xb6, 0xc7, 0x93,
0x99, 0x26, 0x41, 0x48, 0xf0, 0x36, 0xf7, 0xdc, 0x73, 0x3f, 0x7c, 0xce, 0xef, 0x9c, 0xdf, 0x39,
0x77, 0x60, 0x95, 0x44, 0x01, 0x7e, 0xed, 0x75, 0x29, 0x8d, 0x83, 0xcd, 0x61, 0x4c, 0x39, 0x45,
0x68, 0x40, 0xc2, 0x97, 0x09, 0x53, 0xa3, 0x4d, 0x39, 0xdf, 0x6e, 0x74, 0xe9, 0x60, 0x40, 0x23,
0x25, 0x6b, 0x2f, 0x91, 0x88, 0xe3, 0x38, 0xf2, 0x43, 0x3d, 0x6e, 0xe4, 0x57, 0x38, 0xff, 0xaa,
0x81, 0xb5, 0x27, 0x56, 0xed, 0x45, 0x3d, 0x8a, 0x1c, 0x68, 0x74, 0x69, 0x18, 0xe2, 0x2e, 0x27,
0x34, 0xda, 0xdb, 0x6d, 0x19, 0xeb, 0xc6, 0x86, 0xe9, 0x16, 0x64, 0xa8, 0x05, 0x8b, 0x3d, 0x82,
0xc3, 0x60, 0x6f, 0xb7, 0x35, 0x27, 0xa7, 0xd3, 0x21, 0xfa, 0x00, 0x40, 0x5d, 0x30, 0xf2, 0x07,
0xb8, 0x65, 0xae, 0x1b, 0x1b, 0x96, 0x6b, 0x49, 0xc9, 0x53, 0x7f, 0x80, 0xc5, 0x42, 0x39, 0xd8,
0xdb, 0x6d, 0xd5, 0xd4, 0x42, 0x3d, 0x44, 0x77, 0xc1, 0xe6, 0xc7, 0x43, 0xec, 0x0d, 0xfd, 0xd8,
0x1f, 0xb0, 0xd6, 0xfc, 0xba, 0xb9, 0x61, 0x6f, 0x5d, 0xdd, 0x2c, 0x7c, 0x9a, 0xfe, 0xa6, 0xc7,
0xf8, 0xf8, 0xb9, 0x1f, 0x26, 0x78, 0xdf, 0x27, 0xb1, 0x0b, 0x62, 0xd5, 0xbe, 0x5c, 0x84, 0x76,
0xa1, 0xa1, 0x0e, 0xd7, 0x9b, 0x2c, 0xcc, 0xba, 0x89, 0x2d, 0x97, 0xe9, 0x5d, 0xae, 0xea, 0x5d,
0x70, 0xe0, 0xc5, 0xf4, 0x15, 0x6b, 0x2d, 0xca, 0x8b, 0xda, 0x5a, 0xe6, 0xd2, 0x57, 0x4c, 0x7c,
0x25, 0xa7, 0xdc, 0x0f, 0x95, 0x42, 0x5d, 0x2a, 0x58, 0x52, 0x22, 0xa7, 0x3f, 0x86, 0x79, 0xc6,
0x7d, 0x8e, 0x5b, 0xd6, 0xba, 0xb1, 0xb1, 0xb4, 0x75, 0xa5, 0xf2, 0x02, 0xd2, 0xe2, 0x07, 0x42,
0xcd, 0x55, 0xda, 0xe8, 0x63, 0xf8, 0xaa, 0xba, 0xbe, 0x1c, 0x7a, 0x3d, 0x9f, 0x84, 0x5e, 0x8c,
0x7d, 0x46, 0xa3, 0x16, 0x48, 0x43, 0xae, 0x91, 0x6c, 0xcd, 0x7d, 0x9f, 0x84, 0xae, 0x9c, 0x43,
0x0e, 0x34, 0x09, 0xf3, 0xfc, 0x84, 0x53, 0x4f, 0xce, 0xb7, 0xec, 0x75, 0x63, 0xa3, 0xee, 0xda,
0x84, 0x6d, 0x27, 0x9c, 0xca, 0x63, 0xd0, 0x13, 0x58, 0x4d, 0x18, 0x8e, 0xbd, 0x82, 0x79, 0x1a,
0xb3, 0x9a, 0x67, 0x59, 0xac, 0xdd, 0xcb, 0x99, 0xe8, 0x9b, 0x80, 0x86, 0x38, 0x0a, 0x48, 0xd4,
0xd7, 0x3b, 0x4a, 0x3b, 0x34, 0xa5, 0x1d, 0x56, 0xf4, 0x8c, 0xd4, 0x17, 0xe6, 0x70, 0x7e, 0x6d,
0x00, 0xdc, 0x97, 0xf8, 0x90, 0x77, 0xf9, 0x7e, 0x0a, 0x11, 0x12, 0xf5, 0xa8, 0x84, 0x97, 0xbd,
0xf5, 0xc1, 0xe6, 0x38, 0x86, 0x37, 0x33, 0x4c, 0x6a, 0x04, 0x49, 0x78, 0xb6, 0x60, 0x31, 0xc0,
0x21, 0xe6, 0x38, 0x90, 0xd0, 0xab, 0xbb, 0xe9, 0x10, 0x5d, 0x01, 0xbb, 0x1b, 0x63, 0x61, 0x39,
0x4e, 0x34, 0xf6, 0x6a, 0x2e, 0x28, 0xd1, 0x33, 0x32, 0xc0, 0xce, 0x5f, 0x6a, 0xd0, 0x38, 0xc0,
0xfd, 0x01, 0x8e, 0xb8, 0xba, 0xc9, 0x2c, 0x50, 0x5f, 0x07, 0x7b, 0xe8, 0xc7, 0x9c, 0x68, 0x15,
0x05, 0xf7, 0xbc, 0x08, 0x5d, 0x06, 0x8b, 0xe9, 0x5d, 0x77, 0xe5, 0xa9, 0xa6, 0x3b, 0x12, 0xa0,
0x8b, 0x50, 0x8f, 0x92, 0x81, 0x32, 0x90, 0x86, 0x7c, 0x94, 0x0c, 0x24, 0x4c, 0x72, 0xc1, 0x30,
0x5f, 0x0c, 0x86, 0x16, 0x2c, 0x76, 0x12, 0x22, 0xe3, 0x6b, 0x41, 0xcd, 0xe8, 0x21, 0xfa, 0x0a,
0x2c, 0x44, 0x34, 0xc0, 0x7b, 0xbb, 0x1a, 0x96, 0x7a, 0x84, 0xae, 0x41, 0x53, 0x19, 0xf5, 0x25,
0x8e, 0x19, 0xa1, 0x91, 0x06, 0xa5, 0x42, 0xf2, 0x73, 0x25, 0x3b, 0x2d, 0x2e, 0xaf, 0x80, 0x3d,
0x8e, 0x45, 0xe8, 0x8d, 0x10, 0x78, 0x03, 0x96, 0xd5, 0xe1, 0x3d, 0x12, 0x62, 0xef, 0x08, 0x1f,
0xb3, 0x96, 0xbd, 0x6e, 0x6e, 0x58, 0xae, 0xba, 0xd3, 0x7d, 0x12, 0xe2, 0xc7, 0xf8, 0x98, 0xe5,
0x7d, 0xd7, 0x38, 0xd1, 0x77, 0xcd, 0xb2, 0xef, 0xd0, 0x75, 0x58, 0x62, 0x38, 0x26, 0x7e, 0x48,
0xde, 0x60, 0x8f, 0x91, 0x37, 0xb8, 0xb5, 0x24, 0x75, 0x9a, 0x99, 0xf4, 0x80, 0xbc, 0xc1, 0xc2,
0x0c, 0xaf, 0x62, 0xc2, 0xb1, 0x77, 0xe8, 0x47, 0x01, 0xed, 0xf5, 0x5a, 0xcb, 0xf2, 0x9c, 0x86,
0x14, 0x3e, 0x54, 0x32, 0x74, 0x07, 0x54, 0x20, 0x79, 0x38, 0xea, 0x93, 0x08, 0x67, 0x26, 0x5b,
0x91, 0x1f, 0x86, 0xe4, 0xdc, 0x3d, 0x39, 0xa5, 0x0d, 0xe7, 0xfc, 0xd1, 0x80, 0xf7, 0x5c, 0xdc,
0x27, 0x8c, 0xe3, 0xf8, 0x29, 0x0d, 0xb0, 0x8b, 0x5f, 0x24, 0x98, 0x71, 0x74, 0x07, 0x6a, 0x1d,
0x9f, 0x61, 0x0d, 0xe2, 0xcb, 0x95, 0xf6, 0x7c, 0xc2, 0xfa, 0x77, 0x7d, 0x86, 0x5d, 0xa9, 0x89,
0xbe, 0x03, 0x8b, 0x7e, 0x10, 0xc4, 0x98, 0x31, 0x09, 0xa5, 0x49, 0x8b, 0xb6, 0x95, 0x8e, 0x9b,
0x2a, 0xe7, 0xfc, 0x6e, 0xe6, 0xfd, 0xee, 0xfc, 0xce, 0x80, 0xb5, 0xe2, 0xcd, 0xd8, 0x90, 0x46,
0x0c, 0xa3, 0x8f, 0x60, 0x41, 0x78, 0x2f, 0x61, 0xfa, 0x72, 0x97, 0x2a, 0xcf, 0x39, 0x90, 0x2a,
0xae, 0x56, 0x15, 0x49, 0x98, 0x44, 0x84, 0xa7, 0x09, 0x42, 0xdd, 0xf0, 0x6a, 0x39, 0x36, 0x35,
0x95, 0xec, 0x45, 0x84, 0xab, 0x7c, 0xe0, 0x02, 0xc9, 0x7e, 0x3b, 0x3f, 0x86, 0xb5, 0x07, 0x98,
0xe7, 0x50, 0xa4, 0x6d, 0x35, 0x4b, 0xb0, 0x15, 0xd9, 0x63, 0xae, 0xc4, 0x1e, 0xce, 0x9f, 0x0c,
0x78, 0xbf, 0xb4, 0xf7, 0x59, 0xbe, 0x36, 0x0b, 0x87, 0xb9, 0xb3, 0x84, 0x83, 0x59, 0x0e, 0x07,
0xe7, 0x97, 0x06, 0x5c, 0x7a, 0x80, 0x79, 0x3e, 0xd5, 0x9c, 0xb3, 0x25, 0xd0, 0xd7, 0x00, 0xb2,
0x14, 0xc3, 0x5a, 0xe6, 0xba, 0xb9, 0x61, 0xba, 0x39, 0x89, 0xf3, 0x1b, 0x03, 0x56, 0xc7, 0xce,
0x2f, 0x66, 0x2a, 0xa3, 0x9c, 0xa9, 0xfe, 0x53, 0xe6, 0xf8, 0x83, 0x01, 0x97, 0xab, 0xcd, 0x71,
0x16, 0xe7, 0xfd, 0x40, 0x2d, 0xc2, 0x02, 0xa5, 0x82, 0xc6, 0xae, 0x57, 0x31, 0xc8, 0xf8, 0x99,
0x7a, 0x91, 0xf3, 0x85, 0x09, 0x68, 0x47, 0xa6, 0x17, 0xc5, 0x53, 0xef, 0xe0, 0x9a, 0x53, 0x17,
0x3f, 0xa5, 0x12, 0xa7, 0x76, 0x1e, 0x25, 0xce, 0xfc, 0xa9, 0x4a, 0x9c, 0xcb, 0x60, 0x89, 0x3c,
0xcb, 0xb8, 0x3f, 0x18, 0x4a, 0x86, 0xa9, 0xb9, 0x23, 0xc1, 0x78, 0x41, 0xb1, 0x38, 0x63, 0x41,
0x51, 0x3f, 0x6d, 0x41, 0xe1, 0xbc, 0x86, 0xf7, 0xd2, 0xc0, 0x96, 0x84, 0xff, 0x0e, 0xee, 0x28,
0x86, 0xc2, 0x5c, 0x39, 0x14, 0xa6, 0x38, 0xc5, 0xf9, 0xb3, 0x09, 0xab, 0x7b, 0x29, 0x4b, 0xed,
0xfb, 0xfc, 0x50, 0x56, 0x19, 0x27, 0x47, 0xca, 0x64, 0x04, 0xe4, 0x28, 0xdd, 0x9c, 0x48, 0xe9,
0xb5, 0x22, 0xa5, 0x17, 0x2f, 0x38, 0x5f, 0x46, 0xcd, 0xf9, 0x14, 0xb5, 0x1b, 0xb0, 0x92, 0xa3,
0xe8, 0xa1, 0xcf, 0x0f, 0x45, 0x61, 0x2b, 0x38, 0x7a, 0x89, 0xe4, 0xbf, 0x9e, 0xa1, 0x9b, 0xb0,
0x9c, 0x71, 0x6a, 0xa0, 0xa8, 0xb6, 0x2e, 0x11, 0x32, 0x22, 0xe0, 0x20, 0xe5, 0xda, 0x62, 0xc9,
0x61, 0x55, 0x94, 0x1c, 0xf9, 0xf2, 0x07, 0x8a, 0xe5, 0xcf, 0x24, 0x1a, 0xb6, 0x27, 0xd2, 0xf0,
0x5f, 0x0d, 0xb0, 0xb3, 0x90, 0x9e, 0xb1, 0x55, 0x29, 0x78, 0x72, 0xae, 0xec, 0xc9, 0xab, 0xd0,
0xc0, 0x91, 0xdf, 0x09, 0xb1, 0x46, 0xba, 0xa9, 0x90, 0xae, 0x64, 0x0a, 0xe9, 0xf7, 0xc1, 0x1e,
0x95, 0xab, 0x69, 0xd4, 0x5e, 0x9f, 0x58, 0xaf, 0xe6, 0x61, 0xe4, 0x42, 0x56, 0xb7, 0x32, 0xe7,
0xb7, 0x73, 0x23, 0x62, 0x54, 0x18, 0x3f, 0x4b, 0xfa, 0xfb, 0x09, 0x34, 0xf4, 0x57, 0xa8, 0x32,
0x5a, 0x25, 0xc1, 0xef, 0x56, 0x5d, 0xab, 0xea, 0xd0, 0xcd, 0x9c, 0x19, 0xef, 0x45, 0x3c, 0x3e,
0x76, 0x6d, 0x36, 0x92, 0xb4, 0x3d, 0x58, 0x29, 0x2b, 0xa0, 0x15, 0x30, 0x8f, 0xf0, 0xb1, 0xb6,
0xb1, 0xf8, 0x29, 0x08, 0xe3, 0xa5, 0x40, 0x9b, 0xae, 0x13, 0xae, 0x9c, 0x98, 0x81, 0x7b, 0xd4,
0x55, 0xda, 0xdf, 0x9b, 0xfb, 0xc4, 0x70, 0xde, 0x1a, 0xb0, 0xb2, 0x1b, 0xd3, 0xe1, 0x3b, 0x27,
0x5f, 0x07, 0x1a, 0xb9, 0xda, 0x3b, 0x8d, 0xf7, 0x82, 0x6c, 0x5a, 0x1a, 0xbe, 0x08, 0xf5, 0x20,
0xa6, 0x43, 0xcf, 0x0f, 0x43, 0x19, 0x8a, 0xa2, 0x0c, 0x8d, 0xe9, 0x70, 0x3b, 0x0c, 0x9d, 0x57,
0xb0, 0xb6, 0x8b, 0x59, 0x37, 0x26, 0x9d, 0x77, 0xa7, 0x85, 0x29, 0x8c, 0x5d, 0x48, 0xb9, 0x66,
0x29, 0xe5, 0x3a, 0x5f, 0x18, 0xf0, 0x7e, 0xe9, 0xe4, 0xb3, 0xa0, 0xe3, 0x87, 0x45, 0xcc, 0x2a,
0x70, 0x4c, 0xe9, 0xb1, 0xf2, 0x58, 0xf5, 0x25, 0x63, 0xcb, 0xb9, 0xbb, 0x22, 0x4b, 0xed, 0xc7,
0xb4, 0x2f, 0xeb, 0xd1, 0xf3, 0xab, 0xe5, 0xfe, 0x6e, 0xc0, 0x07, 0x13, 0xce, 0x38, 0xcb, 0x97,
0x97, 0x9b, 0xf7, 0xb9, 0x69, 0xcd, 0xbb, 0x59, 0x6e, 0xde, 0xab, 0x7b, 0xdb, 0xda, 0x84, 0xde,
0xf6, 0xad, 0x09, 0xcd, 0x03, 0x4e, 0x63, 0xbf, 0x8f, 0x77, 0x68, 0xd4, 0x23, 0x7d, 0x91, 0xe8,
0xd3, 0x0a, 0xdf, 0x90, 0x1f, 0x9d, 0xd5, 0xf0, 0x57, 0xa1, 0xe1, 0x77, 0xbb, 0x98, 0x31, 0xd1,
0x22, 0xe9, 0x6c, 0x64, 0xb9, 0xb6, 0x92, 0x3d, 0x16, 0x22, 0xf4, 0x0d, 0x58, 0x65, 0xb8, 0x1b,
0x63, 0xee, 0x8d, 0x34, 0x35, 0x82, 0x97, 0xd5, 0xc4, 0x76, 0xaa, 0x2d, 0x5a, 0x82, 0x84, 0xe1,
0x83, 0x83, 0x4f, 0x35, 0x8a, 0xf5, 0x48, 0x14, 0x64, 0x9d, 0xa4, 0x7b, 0x84, 0x79, 0x9e, 0x50,
0x40, 0x89, 0x24, 0x14, 0x2f, 0x81, 0x15, 0x53, 0xca, 0x25, 0x0b, 0x48, 0xf6, 0xb7, 0xdc, 0xba,
0x10, 0x88, 0xb4, 0xa5, 0x77, 0xdd, 0xdb, 0x7e, 0xa2, 0x59, 0x5f, 0x8f, 0x44, 0x1f, 0xbc, 0xb7,
0xfd, 0xe4, 0x5e, 0x14, 0x0c, 0x29, 0x89, 0xb8, 0xa4, 0x04, 0xcb, 0xcd, 0x8b, 0xc4, 0xe7, 0x31,
0x65, 0x09, 0x4f, 0x14, 0x2c, 0x92, 0x0e, 0x2c, 0xd7, 0xd6, 0xb2, 0x67, 0xc7, 0x43, 0x2c, 0x58,
0x28, 0x61, 0xd8, 0x7b, 0x49, 0x62, 0x9e, 0xf8, 0xa1, 0x77, 0x48, 0x19, 0x97, 0xac, 0x50, 0x77,
0x97, 0x12, 0x86, 0x9f, 0x2b, 0xf1, 0x43, 0xca, 0xb8, 0xb8, 0x46, 0x8c, 0xfb, 0x23, 0x3a, 0xd0,
0x23, 0xd1, 0x07, 0x76, 0x43, 0x9a, 0x04, 0xde, 0x30, 0xa6, 0x2f, 0x49, 0x80, 0x63, 0xd9, 0x49,
0x5a, 0x6e, 0x53, 0x4a, 0xf7, 0xb5, 0xd0, 0x79, 0x5b, 0x83, 0x15, 0x55, 0xde, 0x3d, 0xa2, 0x9d,
0x14, 0xb5, 0x97, 0xc1, 0xea, 0x86, 0x89, 0xe8, 0x94, 0x34, 0x64, 0x2d, 0x77, 0x24, 0x10, 0xa6,
0xcf, 0x33, 0x64, 0x8c, 0x7b, 0xe4, 0xb5, 0x76, 0xd1, 0xf2, 0x88, 0x22, 0xa5, 0x38, 0x4f, 0xe6,
0xe6, 0x18, 0x99, 0x07, 0x3e, 0xf7, 0x35, 0xc3, 0xd6, 0x24, 0xc3, 0x5a, 0x42, 0xa2, 0xc8, 0x75,
0x8c, 0x33, 0xe7, 0x2b, 0x38, 0x33, 0x57, 0x44, 0x2c, 0x14, 0x8b, 0x88, 0x62, 0x4c, 0x2d, 0x96,
0x73, 0xcc, 0x43, 0x58, 0x4a, 0x3d, 0xd0, 0x95, 0x60, 0x94, 0x6e, 0xaa, 0xe8, 0xe0, 0x64, 0x66,
0xce, 0xa3, 0xd6, 0x6d, 0xb2, 0x02, 0x88, 0xcb, 0x45, 0x87, 0x75, 0xaa, 0xa2, 0xa3, 0x54, 0xf0,
0xc2, 0x69, 0x0a, 0xde, 0x7c, 0x01, 0x61, 0xcf, 0x56, 0x40, 0x34, 0x26, 0x16, 0x10, 0x9f, 0xc2,
0xca, 0x8f, 0x12, 0x1c, 0x1f, 0x3f, 0xa2, 0x1d, 0x36, 0x1b, 0x2a, 0xda, 0x50, 0xd7, 0xae, 0x4d,
0xb9, 0x26, 0x1b, 0x3b, 0xff, 0x34, 0xa0, 0x29, 0x33, 0xc1, 0x33, 0x9f, 0x1d, 0xa5, 0x8f, 0x53,
0x29, 0x2e, 0x8c, 0x22, 0x2e, 0x4e, 0xd9, 0x5c, 0x55, 0xbc, 0xac, 0x98, 0x55, 0x2f, 0x2b, 0x15,
0x45, 0x5b, 0xad, 0xb2, 0x68, 0x2b, 0x75, 0x6b, 0xf3, 0x63, 0xdd, 0xda, 0x97, 0x06, 0xac, 0xe6,
0x6c, 0x74, 0x96, 0x5c, 0x5c, 0xb0, 0xec, 0x5c, 0xd9, 0xb2, 0x77, 0x8b, 0x1c, 0x65, 0x56, 0x81,
0x23, 0xc7, 0x51, 0xa9, 0x8d, 0x0b, 0x3c, 0xf5, 0x18, 0x96, 0x45, 0x15, 0x71, 0x3e, 0xee, 0xfc,
0x87, 0x01, 0x8b, 0x8f, 0x68, 0x47, 0x3a, 0x32, 0x8f, 0x3a, 0xa3, 0x88, 0xba, 0x15, 0x30, 0x03,
0x32, 0xd0, 0xc4, 0x22, 0x7e, 0x8a, 0xa8, 0x64, 0xdc, 0x8f, 0xf9, 0xe8, 0xdd, 0x51, 0xd4, 0x98,
0x42, 0x22, 0x9f, 0xae, 0x2e, 0x42, 0x1d, 0x47, 0x81, 0x9a, 0xd4, 0xa5, 0x3f, 0x8e, 0x02, 0x39,
0x75, 0x3e, 0xdd, 0xdc, 0x1a, 0xcc, 0x0f, 0xe9, 0xe8, 0xad, 0x50, 0x0d, 0x9c, 0x35, 0x40, 0x0f,
0x30, 0x7f, 0x44, 0x3b, 0xc2, 0x2b, 0xa9, 0x79, 0x9c, 0xbf, 0xcd, 0xc9, 0x4e, 0x6b, 0x24, 0x3e,
0x8b, 0x83, 0x1d, 0x68, 0x2a, 0x26, 0xfd, 0x9c, 0x76, 0xbc, 0x28, 0x49, 0x8d, 0x62, 0x4b, 0xe1,
0x23, 0xda, 0x79, 0x9a, 0x0c, 0xd0, 0x2d, 0x78, 0x8f, 0x44, 0x22, 0x5b, 0x4b, 0x72, 0xcf, 0x34,
0x95, 0x95, 0x56, 0x48, 0x94, 0xd2, 0xbe, 0x56, 0xbf, 0x01, 0xcb, 0x38, 0x7a, 0x91, 0xe0, 0x04,
0x67, 0xaa, 0xca, 0x66, 0x4d, 0x2d, 0xd6, 0x7a, 0x82, 0xc4, 0x7d, 0x76, 0xe4, 0xb1, 0x90, 0x72,
0xa6, 0xb3, 0xa8, 0x25, 0x24, 0x07, 0x42, 0x80, 0x3e, 0x01, 0x4b, 0x2c, 0x57, 0xd0, 0x52, 0x1d,
0xd3, 0xa5, 0x2a, 0x68, 0x69, 0x7f, 0xbb, 0xf5, 0xcf, 0xd5, 0x0f, 0x26, 0x02, 0x44, 0x77, 0x04,
0x01, 0x61, 0x47, 0x9a, 0x04, 0x41, 0x89, 0x76, 0x09, 0x3b, 0x72, 0x7e, 0x0a, 0x17, 0xf3, 0x6f,
0x50, 0x84, 0x71, 0xd2, 0x3d, 0xcf, 0xc2, 0xe8, 0xf7, 0x06, 0xb4, 0xab, 0x0e, 0xf8, 0x2f, 0xd6,
0x83, 0x5b, 0xbf, 0xb2, 0x01, 0xe4, 0xcc, 0x0e, 0xa5, 0x71, 0x80, 0x42, 0x09, 0xad, 0x1d, 0x3a,
0x18, 0xd2, 0x08, 0x47, 0x5c, 0x66, 0x2c, 0x86, 0x36, 0x8b, 0xfb, 0xe9, 0xc1, 0xb8, 0xa2, 0xb6,
0x55, 0xfb, 0xc3, 0x4a, 0xfd, 0x92, 0xb2, 0x73, 0x01, 0xbd, 0x90, 0x7d, 0xd3, 0xc8, 0x14, 0x3b,
0x87, 0x7e, 0x14, 0xe1, 0x10, 0x6d, 0x4d, 0x78, 0x97, 0xac, 0x52, 0x4e, 0xcf, 0xbc, 0x56, 0x79,
0xe6, 0x01, 0x8f, 0x49, 0xd4, 0x4f, 0x4d, 0xec, 0x5c, 0x40, 0xcf, 0xc0, 0xce, 0x3d, 0x0e, 0xa1,
0x1b, 0x55, 0x96, 0x1a, 0x7f, 0x3d, 0x6a, 0x9f, 0xe4, 0x0b, 0xe7, 0x02, 0xea, 0x41, 0xb3, 0xf0,
0x7a, 0x89, 0x36, 0x4e, 0x6a, 0xd7, 0xf2, 0x4f, 0x86, 0xed, 0xaf, 0xcf, 0xa0, 0x99, 0xdd, 0xfe,
0xe7, 0xca, 0x60, 0x63, 0xcf, 0x7f, 0xb7, 0x27, 0x6c, 0x32, 0xe9, 0xa1, 0xb2, 0x7d, 0x67, 0xf6,
0x05, 0xd9, 0xe1, 0xc1, 0xe8, 0x23, 0x55, 0x40, 0xdd, 0x9c, 0xde, 0x93, 0xaa, 0xd3, 0x36, 0x66,
0x6d, 0x5e, 0x9d, 0x0b, 0x68, 0x1f, 0xac, 0xac, 0x7d, 0x44, 0x1f, 0x56, 0x2d, 0x2c, 0x77, 0x97,
0x33, 0x38, 0xa7, 0xd0, 0x80, 0x55, 0x3b, 0xa7, 0xaa, 0x3b, 0xac, 0x76, 0x4e, 0x65, 0x37, 0xe7,
0x5c, 0x40, 0x89, 0x8c, 0x9d, 0x52, 0x74, 0xa3, 0x5b, 0xd3, 0xfc, 0x5b, 0x48, 0x33, 0xed, 0xcd,
0x59, 0xd5, 0xb3, 0x63, 0x7f, 0x31, 0x7a, 0x39, 0x2f, 0x74, 0x5b, 0xe8, 0xce, 0x49, 0x5b, 0x55,
0x35, 0x7f, 0xed, 0x6f, 0xbd, 0xc3, 0x8a, 0x1c, 0x26, 0xd1, 0xc1, 0x21, 0x7d, 0xa5, 0xca, 0xcb,
0x24, 0xf6, 0x45, 0x2e, 0xac, 0x38, 0x5c, 0x87, 0xf0, 0xb8, 0xea, 0xc4, 0xc3, 0x4f, 0x58, 0x91,
0x1d, 0xee, 0x01, 0x3c, 0xc0, 0xfc, 0x09, 0xe6, 0xb1, 0xb0, 0xf5, 0x8d, 0x49, 0x79, 0x4a, 0x2b,
0xa4, 0x47, 0xdd, 0x9c, 0xaa, 0x97, 0x1d, 0xd0, 0x01, 0x7b, 0xe7, 0x10, 0x77, 0x8f, 0x1e, 0x62,
0x3f, 0xe4, 0x87, 0xa8, 0x7a, 0x65, 0x4e, 0x63, 0x02, 0xe4, 0xab, 0x14, 0xd3, 0x33, 0xb6, 0xbe,
0x5c, 0xd0, 0xff, 0xd2, 0x3f, 0xa5, 0x01, 0xfe, 0xdf, 0x4f, 0xc1, 0xfb, 0x60, 0x65, 0x0d, 0x5c,
0x75, 0x84, 0x97, 0xfb, 0xbb, 0x69, 0x11, 0xfe, 0x19, 0x58, 0x59, 0x61, 0x5b, 0xbd, 0x63, 0xb9,
0x37, 0x68, 0x5f, 0x9f, 0xa2, 0x95, 0xdd, 0xf6, 0x29, 0xd4, 0xd3, 0x42, 0x14, 0x5d, 0x9b, 0x94,
0x8e, 0xf2, 0x3b, 0x4f, 0xb9, 0xeb, 0xcf, 0xc0, 0xce, 0x55, 0x69, 0xd5, 0x04, 0x34, 0x5e, 0xdd,
0xb5, 0x6f, 0x4e, 0xd5, 0xfb, 0xff, 0x08, 0xc8, 0xbb, 0xdf, 0xfe, 0x6c, 0xab, 0x4f, 0xf8, 0x61,
0xd2, 0x11, 0x96, 0xbd, 0xad, 0x34, 0x6f, 0x11, 0xaa, 0x7f, 0xdd, 0x4e, 0x6f, 0x79, 0x5b, 0xee,
0x74, 0x5b, 0xda, 0x69, 0xd8, 0xe9, 0x2c, 0xc8, 0xe1, 0x47, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff,
0x4f, 0x5f, 0xf8, 0xb7, 0x64, 0x23, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -1106,8 +1106,9 @@ type RetrieveRequest struct {
Limit int64 `protobuf:"varint,11,opt,name=limit,proto3" json:"limit,omitempty"`
IgnoreGrowing bool `protobuf:"varint,12,opt,name=ignoreGrowing,proto3" json:"ignoreGrowing,omitempty"`
IsCount bool `protobuf:"varint,13,opt,name=is_count,json=isCount,proto3" json:"is_count,omitempty"`
ReduceStopForBest bool `protobuf:"varint,14,opt,name=reduce_stop_for_best,json=reduceStopForBest,proto3" json:"reduce_stop_for_best,omitempty"`
IterationExtensionReduceRate int64 `protobuf:"varint,14,opt,name=iteration_extension_reduce_rate,json=iterationExtensionReduceRate,proto3" json:"iteration_extension_reduce_rate,omitempty"`
Username string `protobuf:"bytes,15,opt,name=username,proto3" json:"username,omitempty"`
ReduceStopForBest bool `protobuf:"varint,16,opt,name=reduce_stop_for_best,json=reduceStopForBest,proto3" json:"reduce_stop_for_best,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1229,11 +1230,11 @@ func (m *RetrieveRequest) GetIsCount() bool {
return false
}
func (m *RetrieveRequest) GetReduceStopForBest() bool {
func (m *RetrieveRequest) GetIterationExtensionReduceRate() int64 {
if m != nil {
return m.ReduceStopForBest
return m.IterationExtensionReduceRate
}
return false
return 0
}
func (m *RetrieveRequest) GetUsername() string {
@ -1243,6 +1244,13 @@ func (m *RetrieveRequest) GetUsername() string {
return ""
}
func (m *RetrieveRequest) GetReduceStopForBest() bool {
if m != nil {
return m.ReduceStopForBest
}
return false
}
type RetrieveResults struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
Status *commonpb.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
@ -1999,126 +2007,128 @@ func init() {
func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) }
var fileDescriptor_41f4a519b878ee3b = []byte{
// 1935 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcd, 0x72, 0x1c, 0x49,
0x11, 0xa6, 0xe7, 0x7f, 0x72, 0x46, 0xa3, 0x51, 0x59, 0x36, 0x6d, 0x7b, 0x77, 0xad, 0x1d, 0xfe,
0xc4, 0x12, 0x6b, 0x2d, 0xda, 0xd8, 0x35, 0x07, 0x02, 0xc2, 0x52, 0xdb, 0x8a, 0x89, 0x1d, 0x1b,
0xb9, 0xc7, 0x6c, 0x04, 0x5c, 0x3a, 0x6a, 0xba, 0x4b, 0xa3, 0xc2, 0xdd, 0x5d, 0xad, 0xaa, 0x6a,
0xc9, 0xf2, 0x99, 0x1b, 0x11, 0xdc, 0xb8, 0x10, 0x01, 0x6f, 0xc0, 0x99, 0x80, 0x0b, 0x6f, 0xc0,
0x8b, 0xf0, 0x06, 0x7b, 0x22, 0xea, 0xa7, 0x67, 0x7a, 0x46, 0x23, 0x21, 0xcb, 0xfc, 0x2c, 0xb7,
0xce, 0x2f, 0xb3, 0xb2, 0x2a, 0xb3, 0xb2, 0xbe, 0xca, 0x6a, 0xe8, 0xd1, 0x54, 0x12, 0x9e, 0xe2,
0xf8, 0x61, 0xc6, 0x99, 0x64, 0xe8, 0x76, 0x42, 0xe3, 0xd3, 0x5c, 0x18, 0xe9, 0x61, 0xa1, 0xbc,
0xd7, 0x0d, 0x59, 0x92, 0xb0, 0xd4, 0xc0, 0xf7, 0xba, 0x22, 0x3c, 0x26, 0x09, 0x36, 0xd2, 0xe0,
0x3e, 0xdc, 0x3d, 0x20, 0xf2, 0x25, 0x4d, 0xc8, 0x4b, 0x1a, 0xbe, 0xda, 0x3f, 0xc6, 0x69, 0x4a,
0x62, 0x9f, 0x9c, 0xe4, 0x44, 0xc8, 0xc1, 0xfb, 0x70, 0xff, 0x80, 0xc8, 0xb1, 0xc4, 0x92, 0x0a,
0x49, 0x43, 0xb1, 0xa4, 0xbe, 0x0d, 0xb7, 0x0e, 0x88, 0xf4, 0xa2, 0x25, 0xf8, 0x4b, 0x68, 0x3d,
0x67, 0x11, 0x19, 0xa6, 0x47, 0x0c, 0x7d, 0x0e, 0x4d, 0x1c, 0x45, 0x9c, 0x08, 0xe1, 0x3a, 0x5b,
0xce, 0x76, 0x67, 0xf7, 0xbd, 0x87, 0x0b, 0x6b, 0xb4, 0x2b, 0x7b, 0x6c, 0x6c, 0xfc, 0xc2, 0x18,
0x21, 0xa8, 0x71, 0x16, 0x13, 0xb7, 0xb2, 0xe5, 0x6c, 0xb7, 0x7d, 0xfd, 0x3d, 0xf8, 0x15, 0xc0,
0x30, 0xa5, 0xf2, 0x10, 0x73, 0x9c, 0x08, 0x74, 0x07, 0x1a, 0xa9, 0x9a, 0xc5, 0xd3, 0x8e, 0xab,
0xbe, 0x95, 0x90, 0x07, 0x5d, 0x21, 0x31, 0x97, 0x41, 0xa6, 0xed, 0xdc, 0xca, 0x56, 0x75, 0xbb,
0xb3, 0xfb, 0xe1, 0xca, 0x69, 0xbf, 0x20, 0xe7, 0x5f, 0xe2, 0x38, 0x27, 0x87, 0x98, 0x72, 0xbf,
0xa3, 0x87, 0x19, 0xef, 0x83, 0x5f, 0x00, 0x8c, 0x25, 0xa7, 0xe9, 0x74, 0x44, 0x85, 0x54, 0x73,
0x9d, 0x2a, 0x3b, 0x15, 0x44, 0x75, 0xbb, 0xed, 0x5b, 0x09, 0x7d, 0x0a, 0x0d, 0x21, 0xb1, 0xcc,
0x85, 0x5e, 0x67, 0x67, 0xf7, 0xfe, 0xca, 0x59, 0xc6, 0xda, 0xc4, 0xb7, 0xa6, 0x83, 0x3f, 0x55,
0x60, 0x73, 0x21, 0xab, 0x36, 0x6f, 0xe8, 0x13, 0xa8, 0x4d, 0xb0, 0x20, 0x57, 0x26, 0xea, 0x99,
0x98, 0xee, 0x61, 0x41, 0x7c, 0x6d, 0xa9, 0xb2, 0x14, 0x4d, 0x86, 0x9e, 0x9e, 0xbd, 0xea, 0xeb,
0x6f, 0x34, 0x80, 0x6e, 0xc8, 0xe2, 0x98, 0x84, 0x92, 0xb2, 0x74, 0xe8, 0xb9, 0x55, 0xad, 0x5b,
0xc0, 0x94, 0x4d, 0x86, 0xb9, 0xa4, 0x46, 0x14, 0x6e, 0x6d, 0xab, 0xaa, 0x6c, 0xca, 0x18, 0xfa,
0x3e, 0xf4, 0x25, 0xc7, 0xa7, 0x24, 0x0e, 0x24, 0x4d, 0x88, 0x90, 0x38, 0xc9, 0xdc, 0xfa, 0x96,
0xb3, 0x5d, 0xf3, 0xd7, 0x0d, 0xfe, 0xb2, 0x80, 0xd1, 0x0e, 0xdc, 0x9a, 0xe6, 0x98, 0xe3, 0x54,
0x12, 0x52, 0xb2, 0x6e, 0x68, 0x6b, 0x34, 0x53, 0xcd, 0x07, 0xfc, 0x00, 0x36, 0x94, 0x19, 0xcb,
0x65, 0xc9, 0xbc, 0xa9, 0xcd, 0xfb, 0x56, 0x31, 0x33, 0x1e, 0xfc, 0xd9, 0x81, 0xdb, 0x4b, 0xf9,
0x12, 0x19, 0x4b, 0x05, 0xb9, 0x41, 0xc2, 0x6e, 0xb2, 0x61, 0xe8, 0x11, 0xd4, 0xd5, 0x97, 0x70,
0xab, 0xd7, 0x2d, 0x25, 0x63, 0x3f, 0xf8, 0xa3, 0x03, 0x68, 0x9f, 0x13, 0x2c, 0xc9, 0xe3, 0x98,
0xe2, 0x77, 0xd8, 0xe7, 0x6f, 0x42, 0x33, 0x9a, 0x04, 0x29, 0x4e, 0x8a, 0x03, 0xd1, 0x88, 0x26,
0xcf, 0x71, 0x42, 0xd0, 0xf7, 0x60, 0x7d, 0xbe, 0xb1, 0xc6, 0xa0, 0xaa, 0x0d, 0x7a, 0x73, 0x58,
0x1b, 0x6e, 0x42, 0x1d, 0xab, 0x35, 0xb8, 0x35, 0xad, 0x36, 0xc2, 0x40, 0x40, 0xdf, 0xe3, 0x2c,
0xfb, 0x4f, 0xad, 0x6e, 0x36, 0x69, 0xb5, 0x3c, 0xe9, 0x1f, 0x1c, 0xd8, 0x78, 0x1c, 0x4b, 0xc2,
0xbf, 0xa6, 0x49, 0xf9, 0x5b, 0xa5, 0xd8, 0xb5, 0x61, 0x1a, 0x91, 0xd7, 0xff, 0xcb, 0x05, 0xbe,
0x0f, 0x70, 0x44, 0x49, 0x1c, 0x19, 0x1b, 0xb3, 0xca, 0xb6, 0x46, 0xb4, 0xba, 0x38, 0xfe, 0xf5,
0x2b, 0x8e, 0x7f, 0x63, 0xc5, 0xf1, 0x77, 0xa1, 0xa9, 0x9d, 0x0c, 0x3d, 0x7d, 0xe8, 0xaa, 0x7e,
0x21, 0x2a, 0xf2, 0x24, 0xaf, 0x25, 0xc7, 0x05, 0x79, 0xb6, 0xae, 0x4d, 0x9e, 0x7a, 0x98, 0x25,
0xcf, 0x7f, 0xd4, 0x60, 0x6d, 0x4c, 0x30, 0x0f, 0x8f, 0x6f, 0x9e, 0xbc, 0x4d, 0xa8, 0x73, 0x72,
0x32, 0xe3, 0x36, 0x23, 0xcc, 0x22, 0xae, 0x5e, 0x11, 0x71, 0xed, 0x1a, 0x84, 0x57, 0x5f, 0x41,
0x78, 0x7d, 0xa8, 0x46, 0x22, 0xd6, 0x09, 0x6b, 0xfb, 0xea, 0x53, 0xd1, 0x54, 0x16, 0xe3, 0x90,
0x1c, 0xb3, 0x38, 0x22, 0x3c, 0x98, 0x72, 0x96, 0x1b, 0x9a, 0xea, 0xfa, 0xfd, 0x92, 0xe2, 0x40,
0xe1, 0xe8, 0x11, 0xb4, 0x22, 0x11, 0x07, 0xf2, 0x3c, 0x23, 0x6e, 0x6b, 0xcb, 0xd9, 0xee, 0x5d,
0x12, 0xa6, 0x27, 0xe2, 0x97, 0xe7, 0x19, 0xf1, 0x9b, 0x91, 0xf9, 0x40, 0x9f, 0xc0, 0xa6, 0x20,
0x9c, 0xe2, 0x98, 0xbe, 0x21, 0x51, 0x40, 0x5e, 0x67, 0x3c, 0xc8, 0x62, 0x9c, 0xba, 0x6d, 0x3d,
0x11, 0x9a, 0xeb, 0x9e, 0xbc, 0xce, 0xf8, 0x61, 0x8c, 0x53, 0xb4, 0x0d, 0x7d, 0x96, 0xcb, 0x2c,
0x97, 0x81, 0xde, 0x37, 0x11, 0xd0, 0xc8, 0x05, 0x1d, 0x51, 0xcf, 0xe0, 0x4f, 0x35, 0x3c, 0x8c,
0x2e, 0x63, 0xe6, 0xee, 0xdb, 0x31, 0xf3, 0xda, 0x6a, 0x66, 0x46, 0x3d, 0xa8, 0xa4, 0x27, 0x6e,
0x4f, 0xe7, 0xbb, 0x92, 0x9e, 0xa8, 0xdd, 0x91, 0x2c, 0x7b, 0xe5, 0xae, 0x9b, 0xdd, 0x51, 0xdf,
0xe8, 0x03, 0x80, 0x84, 0x48, 0x4e, 0x43, 0x15, 0xab, 0xdb, 0xd7, 0xc9, 0x2d, 0x21, 0xe8, 0xdb,
0xb0, 0x46, 0xa7, 0x29, 0xe3, 0xe4, 0x80, 0xb3, 0x33, 0x9a, 0x4e, 0xdd, 0x8d, 0x2d, 0x67, 0xbb,
0xe5, 0x2f, 0x82, 0xe8, 0x1e, 0xb4, 0x72, 0xa1, 0x9a, 0x99, 0x84, 0xb8, 0x48, 0xfb, 0x98, 0xc9,
0x83, 0xbf, 0x97, 0xaa, 0x4d, 0xe4, 0xb1, 0x14, 0xff, 0xad, 0x7b, 0x61, 0x56, 0xa2, 0xd5, 0x72,
0x89, 0x3e, 0x80, 0x8e, 0x09, 0xcf, 0x94, 0x42, 0xed, 0x42, 0xc4, 0x0f, 0xa0, 0x93, 0xe6, 0x49,
0x70, 0x92, 0x13, 0x4e, 0x89, 0xb0, 0x87, 0x17, 0xd2, 0x3c, 0x79, 0x61, 0x10, 0x74, 0x0b, 0xea,
0x92, 0x65, 0xc1, 0x2b, 0x7b, 0x76, 0x55, 0x1e, 0xbf, 0x40, 0x3f, 0x86, 0x7b, 0x82, 0xe0, 0x98,
0x44, 0x81, 0x20, 0xd3, 0x84, 0xa4, 0x72, 0xe8, 0x89, 0x40, 0xe8, 0xb0, 0x49, 0xe4, 0x36, 0xf5,
0xee, 0xbb, 0xc6, 0x62, 0x3c, 0x33, 0x18, 0x5b, 0xbd, 0xaa, 0x83, 0xd0, 0x34, 0x69, 0x0b, 0xc3,
0x5a, 0xba, 0x9b, 0x41, 0x73, 0xd5, 0x6c, 0xc0, 0x8f, 0xc0, 0x9d, 0xc6, 0x6c, 0x82, 0xe3, 0xe0,
0xc2, 0xac, 0x6e, 0x5b, 0x4f, 0x76, 0xc7, 0xe8, 0xc7, 0x4b, 0x53, 0xaa, 0xf0, 0x44, 0x4c, 0x43,
0x12, 0x05, 0x93, 0x98, 0x4d, 0x5c, 0xd0, 0x55, 0x0c, 0x06, 0xda, 0x8b, 0xd9, 0x44, 0x55, 0xaf,
0x35, 0x50, 0x69, 0x08, 0x59, 0x9e, 0x4a, 0xb7, 0xa3, 0x23, 0xed, 0x19, 0xfc, 0x79, 0x9e, 0xec,
0x2b, 0x14, 0x7d, 0x0b, 0xd6, 0xac, 0x25, 0x3b, 0x3a, 0x12, 0x44, 0xea, 0xba, 0xad, 0xfa, 0x5d,
0x03, 0xfe, 0x4c, 0x63, 0xe8, 0x50, 0x91, 0xa9, 0x90, 0x8f, 0xa7, 0x53, 0x4e, 0xa6, 0x58, 0x1d,
0x66, 0x5d, 0xaf, 0x9d, 0xdd, 0xef, 0x3e, 0x5c, 0xd9, 0x0d, 0x3f, 0xdc, 0x5f, 0xb4, 0xf6, 0x97,
0x87, 0x0f, 0x4e, 0x60, 0x7d, 0xc9, 0x46, 0xf1, 0x07, 0xb7, 0x5d, 0x87, 0x2a, 0x7f, 0xdb, 0x72,
0x2e, 0x60, 0x68, 0x0b, 0x3a, 0x82, 0xf0, 0x53, 0x1a, 0x1a, 0x13, 0xc3, 0x5b, 0x65, 0x48, 0xf1,
0xae, 0x64, 0x12, 0xc7, 0xcf, 0x5f, 0xd8, 0x92, 0x29, 0xc4, 0xc1, 0x5f, 0x6b, 0xb0, 0xee, 0xab,
0x12, 0x21, 0xa7, 0xe4, 0xff, 0x89, 0x33, 0x2f, 0xe3, 0xae, 0xc6, 0x5b, 0x71, 0x57, 0x73, 0x25,
0x77, 0x7d, 0x07, 0x7a, 0xc9, 0x69, 0x18, 0x96, 0x78, 0xa8, 0xa5, 0x79, 0x68, 0x4d, 0xa1, 0xff,
0xb2, 0xf9, 0x6c, 0xbf, 0x1d, 0xc5, 0xc1, 0x25, 0x14, 0xb7, 0x09, 0xf5, 0x98, 0x26, 0xb4, 0xa8,
0x50, 0x23, 0x5c, 0x24, 0xad, 0xee, 0x2a, 0xd2, 0xba, 0x0b, 0x2d, 0x2a, 0x6c, 0x81, 0xaf, 0x69,
0x83, 0x26, 0x15, 0xa6, 0xb2, 0x77, 0x60, 0x93, 0x93, 0x28, 0x0f, 0x49, 0x20, 0xd4, 0x51, 0x3f,
0x62, 0x3c, 0x98, 0x10, 0x21, 0x35, 0x97, 0xb6, 0xfc, 0x0d, 0xa3, 0x1b, 0x4b, 0x96, 0x3d, 0x65,
0x7c, 0x4f, 0x15, 0x43, 0x99, 0x00, 0xd7, 0x97, 0x08, 0xf0, 0xab, 0x6a, 0xb9, 0x78, 0xbe, 0x06,
0x14, 0xf8, 0x11, 0x54, 0x69, 0x64, 0xba, 0xaa, 0xce, 0xae, 0xbb, 0xe8, 0xc7, 0x3e, 0x3e, 0x87,
0x9e, 0xf0, 0x95, 0x11, 0xfa, 0x29, 0x74, 0x6c, 0x21, 0x44, 0x58, 0x62, 0x5d, 0x64, 0x9d, 0xdd,
0x0f, 0x56, 0x8e, 0xd1, 0x95, 0xe1, 0x61, 0x89, 0x7d, 0xd3, 0x15, 0x09, 0xf5, 0x8d, 0x7e, 0x02,
0xf7, 0x2f, 0x12, 0x23, 0xb7, 0xe9, 0x88, 0xdc, 0x86, 0xae, 0xad, 0xbb, 0xcb, 0xcc, 0x58, 0xe4,
0x2b, 0x42, 0x3f, 0x84, 0xcd, 0x12, 0x35, 0xce, 0x07, 0x36, 0x35, 0x37, 0x96, 0x68, 0x73, 0x3e,
0xe4, 0x2a, 0x72, 0x6c, 0x5d, 0x49, 0x8e, 0xff, 0x7e, 0xb2, 0xfa, 0xca, 0x81, 0xf6, 0x88, 0xe1,
0x48, 0xf7, 0xaa, 0x37, 0xd8, 0xf6, 0xf7, 0xa0, 0x3d, 0x5b, 0xbd, 0xe5, 0x8d, 0x39, 0xa0, 0xb4,
0xb3, 0x76, 0xd3, 0xf6, 0xa8, 0xa5, 0xfe, 0xb3, 0xd4, 0x47, 0xd6, 0x16, 0xfb, 0xc8, 0x07, 0xd0,
0xa1, 0x6a, 0x41, 0x41, 0x86, 0xe5, 0xb1, 0xa1, 0x8e, 0xb6, 0x0f, 0x1a, 0x3a, 0x54, 0x88, 0x6a,
0x34, 0x0b, 0x03, 0xdd, 0x68, 0x36, 0xae, 0xdd, 0x68, 0x5a, 0x27, 0xba, 0xd1, 0xfc, 0xb5, 0x03,
0xa0, 0x03, 0x57, 0x65, 0x79, 0xd1, 0xa9, 0x73, 0x13, 0xa7, 0x8a, 0xd3, 0xd4, 0xc5, 0xc4, 0x49,
0x8c, 0xe5, 0x7c, 0x6f, 0x85, 0x4d, 0x0e, 0x4a, 0xf3, 0xc4, 0x37, 0x2a, 0xbb, 0xaf, 0x62, 0xf0,
0x5b, 0x07, 0x40, 0x17, 0xa7, 0x59, 0xc6, 0x32, 0xb9, 0x3a, 0x57, 0xb7, 0xe0, 0x95, 0xc5, 0xd4,
0xed, 0x15, 0xa9, 0xbb, 0xe2, 0xcd, 0x39, 0x2b, 0x8f, 0x79, 0xf0, 0x36, 0xbb, 0xfa, 0x7b, 0xf0,
0x3b, 0x07, 0xba, 0x76, 0x75, 0x66, 0x49, 0x0b, 0xbb, 0xec, 0x2c, 0xef, 0xb2, 0x6e, 0x59, 0x12,
0xc6, 0xcf, 0x03, 0x41, 0xdf, 0x14, 0x37, 0x17, 0x18, 0x68, 0x4c, 0xdf, 0x10, 0xc5, 0x64, 0x3a,
0x25, 0xec, 0x4c, 0x14, 0x37, 0x97, 0x4a, 0x03, 0x3b, 0x13, 0x8a, 0x4d, 0x39, 0x09, 0x49, 0x2a,
0xe3, 0xf3, 0x20, 0x61, 0x11, 0x3d, 0xa2, 0x24, 0xd2, 0xd5, 0xd0, 0xf2, 0xfb, 0x85, 0xe2, 0x99,
0xc5, 0xd5, 0x53, 0x1e, 0xd9, 0x9f, 0x45, 0xc5, 0x1f, 0xa7, 0x67, 0x62, 0x7a, 0x83, 0xaa, 0x55,
0x29, 0x36, 0x7e, 0x54, 0x21, 0x9a, 0x9f, 0x3c, 0x6d, 0x7f, 0x01, 0x53, 0x9d, 0xe7, 0x8c, 0xdf,
0x4d, 0x1e, 0x6b, 0x7e, 0x09, 0x51, 0x2b, 0x8f, 0xc8, 0x11, 0xce, 0xe3, 0xf2, 0x3d, 0x50, 0x33,
0xf7, 0x80, 0x55, 0x2c, 0xfc, 0x84, 0xe8, 0xed, 0x73, 0x12, 0x91, 0x54, 0x52, 0x1c, 0xeb, 0x5f,
0x5b, 0x65, 0x4a, 0x76, 0x16, 0x29, 0x19, 0x7d, 0x0c, 0x88, 0xa4, 0x21, 0x3f, 0xcf, 0x54, 0x05,
0x65, 0x58, 0x88, 0x33, 0xc6, 0x23, 0xfb, 0x0a, 0xdc, 0x98, 0x69, 0x0e, 0xad, 0x02, 0xdd, 0x81,
0x86, 0x24, 0x29, 0x4e, 0xa5, 0x3d, 0x63, 0x56, 0xb2, 0x37, 0x88, 0xc8, 0x33, 0xc2, 0x6d, 0x4e,
0x9b, 0x54, 0x8c, 0x95, 0xa8, 0xde, 0x90, 0xe2, 0x18, 0xef, 0x7e, 0xf6, 0xf9, 0xdc, 0x7d, 0xdd,
0xbc, 0x21, 0x0d, 0x5c, 0xf8, 0x1e, 0x3c, 0x81, 0x8d, 0x11, 0x15, 0xf2, 0x90, 0xc5, 0x34, 0x3c,
0xbf, 0x71, 0x6f, 0x31, 0xf8, 0x8d, 0x03, 0xa8, 0xec, 0xc7, 0xfe, 0x82, 0x99, 0xdf, 0x1a, 0xce,
0xf5, 0x6f, 0x8d, 0x0f, 0xa1, 0x9b, 0x69, 0x37, 0x01, 0x4d, 0x8f, 0x58, 0xb1, 0x7b, 0x1d, 0x83,
0xa9, 0xdc, 0x0a, 0xf5, 0xf2, 0x55, 0xc9, 0x0c, 0x38, 0x8b, 0x89, 0xd9, 0xbc, 0xb6, 0xdf, 0x56,
0x88, 0xaf, 0x80, 0xc1, 0x14, 0xee, 0x8e, 0x8f, 0xd9, 0xd9, 0x3e, 0x4b, 0x8f, 0xe8, 0x34, 0xe7,
0x9a, 0x0a, 0xdf, 0xe1, 0x57, 0x82, 0x0b, 0xcd, 0x0c, 0x4b, 0x75, 0xa6, 0xec, 0x1e, 0x15, 0xe2,
0xe0, 0xf7, 0x0e, 0xdc, 0x5b, 0x35, 0xd3, 0xbb, 0x84, 0x7f, 0x00, 0x6b, 0xa1, 0x71, 0x67, 0xbc,
0x5d, 0xff, 0x17, 0xe5, 0xe2, 0xb8, 0xc1, 0x13, 0xa8, 0xf9, 0x58, 0x12, 0xb4, 0x03, 0x15, 0x2e,
0xf5, 0x0a, 0x7a, 0xbb, 0x0f, 0x2e, 0x61, 0x0a, 0x65, 0xa8, 0xdf, 0x9d, 0x15, 0x2e, 0x51, 0x17,
0x1c, 0xae, 0x23, 0x75, 0x7c, 0x87, 0x7f, 0xf4, 0x17, 0x07, 0x5a, 0x85, 0x1a, 0x6d, 0xc0, 0x9a,
0xe7, 0x8d, 0xf6, 0x67, 0x5c, 0xd5, 0xff, 0x06, 0xea, 0x43, 0xd7, 0xf3, 0x46, 0x87, 0x45, 0xdf,
0xd7, 0x77, 0x50, 0x17, 0x5a, 0x9e, 0x37, 0xd2, 0xe4, 0xd3, 0xaf, 0x58, 0xe9, 0x69, 0x9c, 0x8b,
0xe3, 0x7e, 0x75, 0xe6, 0x20, 0xc9, 0xb0, 0x71, 0x50, 0x43, 0x6b, 0xd0, 0xf6, 0x9e, 0x8d, 0x86,
0xa9, 0x20, 0x5c, 0xf6, 0xeb, 0x56, 0xf4, 0x48, 0x4c, 0x24, 0xe9, 0x37, 0xd0, 0x3a, 0x74, 0xbc,
0x67, 0xa3, 0xbd, 0x3c, 0x7e, 0xa5, 0xee, 0xb1, 0x7e, 0x53, 0xeb, 0x5f, 0x8c, 0xcc, 0x53, 0xa4,
0xdf, 0xd2, 0xee, 0x5f, 0x8c, 0xd4, 0xe3, 0xe8, 0xbc, 0xdf, 0xb6, 0x83, 0x7f, 0x9e, 0x69, 0x5f,
0xb0, 0xf7, 0xe8, 0x97, 0x9f, 0x4d, 0xa9, 0x3c, 0xce, 0x27, 0x2a, 0x5f, 0x3b, 0x26, 0xf4, 0x8f,
0x29, 0xb3, 0x5f, 0x3b, 0x45, 0xf8, 0x3b, 0x3a, 0x1b, 0x33, 0x31, 0x9b, 0x4c, 0x1a, 0x1a, 0xf9,
0xf4, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x78, 0xf5, 0x94, 0x43, 0x17, 0x00, 0x00,
// 1966 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcb, 0x6e, 0x1c, 0xb9,
0x15, 0x4d, 0xf5, 0xbb, 0x6f, 0xb7, 0x5a, 0x2d, 0x5a, 0x76, 0xca, 0x8f, 0x19, 0x6b, 0x2a, 0x2f,
0x65, 0x82, 0xb1, 0x26, 0x1a, 0xcc, 0x38, 0x8b, 0x20, 0x81, 0xa5, 0xb2, 0x85, 0xc6, 0xb4, 0x1d,
0xb9, 0xda, 0x19, 0x20, 0xd9, 0x14, 0xd8, 0x55, 0x54, 0x8b, 0x71, 0x55, 0xb1, 0x44, 0xb2, 0x64,
0xcb, 0xbb, 0x00, 0xd9, 0x05, 0xc8, 0x2e, 0x9b, 0x00, 0xc9, 0x1f, 0x64, 0x3d, 0xc8, 0x2a, 0x7f,
0x90, 0x1f, 0xc9, 0x1f, 0xcc, 0x2a, 0xe0, 0xa3, 0xfa, 0xa5, 0x96, 0x22, 0xcb, 0x79, 0xcc, 0xec,
0x8a, 0xe7, 0x1e, 0x5e, 0x92, 0x97, 0x97, 0x87, 0x97, 0x05, 0x3d, 0x9a, 0x49, 0xc2, 0x33, 0x9c,
0x3c, 0xc8, 0x39, 0x93, 0x0c, 0xdd, 0x4c, 0x69, 0x72, 0x5a, 0x08, 0xd3, 0x7a, 0x50, 0x1a, 0xef,
0x74, 0x23, 0x96, 0xa6, 0x2c, 0x33, 0xf0, 0x9d, 0xae, 0x88, 0x8e, 0x49, 0x8a, 0x4d, 0xcb, 0xbb,
0x0b, 0xb7, 0x0f, 0x88, 0x7c, 0x41, 0x53, 0xf2, 0x82, 0x46, 0x2f, 0xf7, 0x8f, 0x71, 0x96, 0x91,
0x24, 0x20, 0x27, 0x05, 0x11, 0xd2, 0x7b, 0x0f, 0xee, 0x1e, 0x10, 0x39, 0x92, 0x58, 0x52, 0x21,
0x69, 0x24, 0x96, 0xcc, 0x37, 0xe1, 0xc6, 0x01, 0x91, 0x7e, 0xbc, 0x04, 0x7f, 0x01, 0xad, 0x67,
0x2c, 0x26, 0x83, 0xec, 0x88, 0xa1, 0xcf, 0xa0, 0x89, 0xe3, 0x98, 0x13, 0x21, 0x5c, 0x67, 0xcb,
0xd9, 0xee, 0xec, 0xde, 0x7b, 0xb0, 0x30, 0x47, 0x3b, 0xb3, 0x47, 0x86, 0x13, 0x94, 0x64, 0x84,
0xa0, 0xc6, 0x59, 0x42, 0xdc, 0xca, 0x96, 0xb3, 0xdd, 0x0e, 0xf4, 0xb7, 0xf7, 0x1b, 0x80, 0x41,
0x46, 0xe5, 0x21, 0xe6, 0x38, 0x15, 0xe8, 0x16, 0x34, 0x32, 0x35, 0x8a, 0xaf, 0x1d, 0x57, 0x03,
0xdb, 0x42, 0x3e, 0x74, 0x85, 0xc4, 0x5c, 0x86, 0xb9, 0xe6, 0xb9, 0x95, 0xad, 0xea, 0x76, 0x67,
0xf7, 0x83, 0x95, 0xc3, 0x7e, 0x4e, 0xce, 0xbe, 0xc0, 0x49, 0x41, 0x0e, 0x31, 0xe5, 0x41, 0x47,
0x77, 0x33, 0xde, 0xbd, 0x5f, 0x01, 0x8c, 0x24, 0xa7, 0xd9, 0x64, 0x48, 0x85, 0x54, 0x63, 0x9d,
0x2a, 0x9e, 0x5a, 0x44, 0x75, 0xbb, 0x1d, 0xd8, 0x16, 0xfa, 0x04, 0x1a, 0x42, 0x62, 0x59, 0x08,
0x3d, 0xcf, 0xce, 0xee, 0xdd, 0x95, 0xa3, 0x8c, 0x34, 0x25, 0xb0, 0x54, 0xef, 0xaf, 0x15, 0xd8,
0x5c, 0x88, 0xaa, 0x8d, 0x1b, 0xfa, 0x18, 0x6a, 0x63, 0x2c, 0xc8, 0xa5, 0x81, 0x7a, 0x2a, 0x26,
0x7b, 0x58, 0x90, 0x40, 0x33, 0x55, 0x94, 0xe2, 0xf1, 0xc0, 0xd7, 0xa3, 0x57, 0x03, 0xfd, 0x8d,
0x3c, 0xe8, 0x46, 0x2c, 0x49, 0x48, 0x24, 0x29, 0xcb, 0x06, 0xbe, 0x5b, 0xd5, 0xb6, 0x05, 0x4c,
0x71, 0x72, 0xcc, 0x25, 0x35, 0x4d, 0xe1, 0xd6, 0xb6, 0xaa, 0x8a, 0x33, 0x8f, 0xa1, 0x1f, 0x42,
0x5f, 0x72, 0x7c, 0x4a, 0x92, 0x50, 0xd2, 0x94, 0x08, 0x89, 0xd3, 0xdc, 0xad, 0x6f, 0x39, 0xdb,
0xb5, 0x60, 0xdd, 0xe0, 0x2f, 0x4a, 0x18, 0xed, 0xc0, 0x8d, 0x49, 0x81, 0x39, 0xce, 0x24, 0x21,
0x73, 0xec, 0x86, 0x66, 0xa3, 0xa9, 0x69, 0xd6, 0xe1, 0x47, 0xb0, 0xa1, 0x68, 0xac, 0x90, 0x73,
0xf4, 0xa6, 0xa6, 0xf7, 0xad, 0x61, 0x4a, 0xf6, 0xbe, 0x74, 0xe0, 0xe6, 0x52, 0xbc, 0x44, 0xce,
0x32, 0x41, 0xae, 0x11, 0xb0, 0xeb, 0x6c, 0x18, 0x7a, 0x08, 0x75, 0xf5, 0x25, 0xdc, 0xea, 0x55,
0x53, 0xc9, 0xf0, 0xbd, 0xbf, 0x38, 0x80, 0xf6, 0x39, 0xc1, 0x92, 0x3c, 0x4a, 0x28, 0x7e, 0x87,
0x7d, 0xfe, 0x36, 0x34, 0xe3, 0x71, 0x98, 0xe1, 0xb4, 0x3c, 0x10, 0x8d, 0x78, 0xfc, 0x0c, 0xa7,
0x04, 0xfd, 0x00, 0xd6, 0x67, 0x1b, 0x6b, 0x08, 0x55, 0x4d, 0xe8, 0xcd, 0x60, 0x4d, 0xdc, 0x84,
0x3a, 0x56, 0x73, 0x70, 0x6b, 0xda, 0x6c, 0x1a, 0x9e, 0x80, 0xbe, 0xcf, 0x59, 0xfe, 0xdf, 0x9a,
0xdd, 0x74, 0xd0, 0xea, 0xfc, 0xa0, 0x7f, 0x76, 0x60, 0xe3, 0x51, 0x22, 0x09, 0xff, 0x9a, 0x06,
0xe5, 0xef, 0x95, 0x72, 0xd7, 0x06, 0x59, 0x4c, 0x5e, 0xff, 0x3f, 0x27, 0xf8, 0x1e, 0xc0, 0x11,
0x25, 0x49, 0x6c, 0x38, 0x66, 0x96, 0x6d, 0x8d, 0x68, 0x73, 0x79, 0xfc, 0xeb, 0x97, 0x1c, 0xff,
0xc6, 0x8a, 0xe3, 0xef, 0x42, 0x53, 0x3b, 0x19, 0xf8, 0xfa, 0xd0, 0x55, 0x83, 0xb2, 0xa9, 0xc4,
0x93, 0xbc, 0x96, 0x1c, 0x97, 0xe2, 0xd9, 0xba, 0xb2, 0x78, 0xea, 0x6e, 0x56, 0x3c, 0xff, 0x59,
0x83, 0xb5, 0x11, 0xc1, 0x3c, 0x3a, 0xbe, 0x7e, 0xf0, 0x36, 0xa1, 0xce, 0xc9, 0xc9, 0x54, 0xdb,
0x4c, 0x63, 0xba, 0xe2, 0xea, 0x25, 0x2b, 0xae, 0x5d, 0x41, 0xf0, 0xea, 0x2b, 0x04, 0xaf, 0x0f,
0xd5, 0x58, 0x24, 0x3a, 0x60, 0xed, 0x40, 0x7d, 0x2a, 0x99, 0xca, 0x13, 0x1c, 0x91, 0x63, 0x96,
0xc4, 0x84, 0x87, 0x13, 0xce, 0x0a, 0x23, 0x53, 0xdd, 0xa0, 0x3f, 0x67, 0x38, 0x50, 0x38, 0x7a,
0x08, 0xad, 0x58, 0x24, 0xa1, 0x3c, 0xcb, 0x89, 0xdb, 0xda, 0x72, 0xb6, 0x7b, 0x17, 0x2c, 0xd3,
0x17, 0xc9, 0x8b, 0xb3, 0x9c, 0x04, 0xcd, 0xd8, 0x7c, 0xa0, 0x8f, 0x61, 0x53, 0x10, 0x4e, 0x71,
0x42, 0xdf, 0x90, 0x38, 0x24, 0xaf, 0x73, 0x1e, 0xe6, 0x09, 0xce, 0xdc, 0xb6, 0x1e, 0x08, 0xcd,
0x6c, 0x8f, 0x5f, 0xe7, 0xfc, 0x30, 0xc1, 0x19, 0xda, 0x86, 0x3e, 0x2b, 0x64, 0x5e, 0xc8, 0x50,
0xef, 0x9b, 0x08, 0x69, 0xec, 0x82, 0x5e, 0x51, 0xcf, 0xe0, 0x4f, 0x34, 0x3c, 0x88, 0x2f, 0x52,
0xe6, 0xee, 0xdb, 0x29, 0xf3, 0xda, 0x6a, 0x65, 0x46, 0x3d, 0xa8, 0x64, 0x27, 0x6e, 0x4f, 0xc7,
0xbb, 0x92, 0x9d, 0xa8, 0xdd, 0x91, 0x2c, 0x7f, 0xe9, 0xae, 0x9b, 0xdd, 0x51, 0xdf, 0xe8, 0x7d,
0x80, 0x94, 0x48, 0x4e, 0x23, 0xb5, 0x56, 0xb7, 0xaf, 0x83, 0x3b, 0x87, 0xa0, 0xef, 0xc2, 0x1a,
0x9d, 0x64, 0x8c, 0x93, 0x03, 0xce, 0x5e, 0xd1, 0x6c, 0xe2, 0x6e, 0x6c, 0x39, 0xdb, 0xad, 0x60,
0x11, 0x44, 0x77, 0xa0, 0x55, 0x08, 0x55, 0xcc, 0xa4, 0xc4, 0x45, 0xda, 0xc7, 0xb4, 0xed, 0xfd,
0x63, 0x2e, 0xdb, 0x44, 0x91, 0x48, 0xf1, 0xbf, 0xba, 0x17, 0xa6, 0x29, 0x5a, 0x9d, 0x4f, 0xd1,
0xfb, 0xd0, 0x31, 0xcb, 0x33, 0xa9, 0x50, 0x3b, 0xb7, 0xe2, 0xfb, 0xd0, 0xc9, 0x8a, 0x34, 0x3c,
0x29, 0x08, 0xa7, 0x44, 0xd8, 0xc3, 0x0b, 0x59, 0x91, 0x3e, 0x37, 0x08, 0xba, 0x01, 0x75, 0xc9,
0xf2, 0xf0, 0xa5, 0x3d, 0xbb, 0x2a, 0x8e, 0x9f, 0xa3, 0x9f, 0xc2, 0x1d, 0x41, 0x70, 0x42, 0xe2,
0x50, 0x90, 0x49, 0x4a, 0x32, 0x39, 0xf0, 0x45, 0x28, 0xf4, 0xb2, 0x49, 0xec, 0x36, 0xf5, 0xee,
0xbb, 0x86, 0x31, 0x9a, 0x12, 0x46, 0xd6, 0xae, 0xf2, 0x20, 0x32, 0x45, 0xda, 0x42, 0xb7, 0x96,
0xae, 0x66, 0xd0, 0xcc, 0x34, 0xed, 0xf0, 0x13, 0x70, 0x27, 0x09, 0x1b, 0xe3, 0x24, 0x3c, 0x37,
0xaa, 0xdb, 0xd6, 0x83, 0xdd, 0x32, 0xf6, 0xd1, 0xd2, 0x90, 0x6a, 0x79, 0x22, 0xa1, 0x11, 0x89,
0xc3, 0x71, 0xc2, 0xc6, 0x2e, 0xe8, 0x2c, 0x06, 0x03, 0xed, 0x25, 0x6c, 0xac, 0xb2, 0xd7, 0x12,
0x54, 0x18, 0x22, 0x56, 0x64, 0xd2, 0xed, 0xe8, 0x95, 0xf6, 0x0c, 0xfe, 0xac, 0x48, 0xf7, 0x15,
0x8a, 0xbe, 0x03, 0x6b, 0x96, 0xc9, 0x8e, 0x8e, 0x04, 0x91, 0x3a, 0x6f, 0xab, 0x41, 0xd7, 0x80,
0xbf, 0xd0, 0x18, 0x3a, 0x54, 0x62, 0x2a, 0xe4, 0xa3, 0xc9, 0x84, 0x93, 0x09, 0x56, 0x87, 0x59,
0xe7, 0x6b, 0x67, 0xf7, 0xfb, 0x0f, 0x56, 0x56, 0xc3, 0x0f, 0xf6, 0x17, 0xd9, 0xc1, 0x72, 0x77,
0xef, 0x04, 0xd6, 0x97, 0x38, 0x4a, 0x3f, 0xb8, 0xad, 0x3a, 0x54, 0xfa, 0xdb, 0x92, 0x73, 0x01,
0x43, 0x5b, 0xd0, 0x11, 0x84, 0x9f, 0xd2, 0xc8, 0x50, 0x8c, 0x6e, 0xcd, 0x43, 0x4a, 0x77, 0x25,
0x93, 0x38, 0x79, 0xf6, 0xdc, 0xa6, 0x4c, 0xd9, 0xf4, 0x7e, 0x5b, 0x87, 0xf5, 0x40, 0xa5, 0x08,
0x39, 0x25, 0xdf, 0x24, 0xcd, 0xbc, 0x48, 0xbb, 0x1a, 0x6f, 0xa5, 0x5d, 0xcd, 0x95, 0xda, 0xf5,
0x3d, 0xe8, 0xa5, 0xa7, 0x51, 0x34, 0xa7, 0x43, 0x2d, 0xad, 0x43, 0x6b, 0x0a, 0xfd, 0xb7, 0xc5,
0x67, 0xfb, 0xed, 0x24, 0x0e, 0x2e, 0x90, 0xb8, 0x4d, 0xa8, 0x27, 0x34, 0xa5, 0x65, 0x86, 0x9a,
0xc6, 0x79, 0xd1, 0xea, 0xae, 0x12, 0xad, 0xdb, 0xd0, 0xa2, 0xc2, 0x26, 0xf8, 0x9a, 0x26, 0x34,
0xa9, 0x30, 0x99, 0xfd, 0x18, 0xee, 0x53, 0x49, 0xb8, 0x4e, 0xae, 0x90, 0xbc, 0x96, 0x24, 0x13,
0xea, 0x8b, 0x93, 0xb8, 0x88, 0x48, 0xc8, 0xb1, 0x24, 0x56, 0x56, 0xef, 0x4d, 0x69, 0x8f, 0x4b,
0x56, 0xa0, 0x49, 0x01, 0x96, 0x64, 0x41, 0x16, 0xd7, 0x17, 0x65, 0x11, 0xed, 0xc0, 0xa6, 0x75,
0x27, 0x94, 0x9a, 0x1c, 0x31, 0x1e, 0x8e, 0x89, 0x90, 0x5a, 0x82, 0x5b, 0xc1, 0x86, 0xb1, 0x8d,
0x24, 0xcb, 0x9f, 0x30, 0xbe, 0xa7, 0x9e, 0x6d, 0x5f, 0x55, 0xe7, 0x73, 0xf0, 0x6b, 0xa0, 0xa4,
0x1f, 0x42, 0x95, 0xc6, 0xa6, 0x38, 0xeb, 0xec, 0xba, 0x8b, 0x7e, 0xec, 0x1b, 0x76, 0xe0, 0x8b,
0x40, 0x91, 0xd0, 0xcf, 0xa1, 0x63, 0xf3, 0x29, 0xc6, 0x12, 0xeb, 0x5c, 0xed, 0xec, 0xbe, 0xbf,
0xb2, 0x8f, 0x4e, 0x30, 0x1f, 0x4b, 0x1c, 0x98, 0xe2, 0x4a, 0xa8, 0x6f, 0xf4, 0x33, 0xb8, 0x7b,
0x5e, 0x5f, 0xb9, 0x0d, 0x47, 0xec, 0x36, 0x74, 0x8a, 0xde, 0x5e, 0x16, 0xd8, 0x32, 0x5e, 0x31,
0xfa, 0x31, 0x6c, 0xce, 0x29, 0xec, 0xac, 0x63, 0x53, 0x4b, 0xec, 0x9c, 0xfa, 0xce, 0xba, 0x5c,
0xa6, 0xb1, 0xad, 0x4b, 0x35, 0xf6, 0x3f, 0xaf, 0x79, 0x5f, 0x39, 0xd0, 0x1e, 0x32, 0x1c, 0xeb,
0x92, 0xf7, 0x1a, 0xdb, 0x7e, 0x0f, 0xda, 0xd3, 0xd9, 0x5b, 0xf9, 0x99, 0x01, 0xca, 0x3a, 0xad,
0x5a, 0x6d, 0xa9, 0x3b, 0x57, 0xc6, 0xce, 0x95, 0xa3, 0xb5, 0xc5, 0x72, 0xf4, 0x3e, 0x74, 0xa8,
0x9a, 0x50, 0x98, 0x63, 0x79, 0x6c, 0x14, 0xa8, 0x1d, 0x80, 0x86, 0x0e, 0x15, 0xa2, 0xea, 0xd5,
0x92, 0xa0, 0xeb, 0xd5, 0xc6, 0x95, 0xeb, 0x55, 0xeb, 0x44, 0xd7, 0xab, 0xbf, 0x73, 0x00, 0xf4,
0xc2, 0x55, 0x5a, 0x9e, 0x77, 0xea, 0x5c, 0xc7, 0xa9, 0x92, 0x46, 0x75, 0xbf, 0x71, 0x92, 0x60,
0x39, 0xdb, 0x5b, 0x61, 0x83, 0x83, 0xb2, 0x22, 0x0d, 0x8c, 0xc9, 0xee, 0xab, 0xf0, 0xfe, 0xe0,
0x00, 0xe8, 0xe4, 0x34, 0xd3, 0x58, 0xd6, 0x68, 0xe7, 0xf2, 0x4a, 0xbe, 0xb2, 0x18, 0xba, 0xbd,
0x32, 0x74, 0x97, 0x3c, 0x5d, 0xa7, 0xe9, 0x31, 0x5b, 0xbc, 0x8d, 0xae, 0xfe, 0xf6, 0xfe, 0xe8,
0x40, 0xd7, 0xce, 0xce, 0x4c, 0x69, 0x61, 0x97, 0x9d, 0xe5, 0x5d, 0xd6, 0x95, 0x4f, 0xca, 0xf8,
0x59, 0x28, 0xe8, 0x9b, 0xf2, 0x02, 0x04, 0x03, 0x8d, 0xe8, 0x1b, 0xa2, 0x04, 0x51, 0x87, 0x84,
0xbd, 0x12, 0xe5, 0x05, 0xa8, 0xc2, 0xc0, 0x5e, 0x09, 0x25, 0xca, 0x9c, 0x44, 0x24, 0x93, 0xc9,
0x59, 0x98, 0xb2, 0x98, 0x1e, 0x51, 0x12, 0xeb, 0x6c, 0x68, 0x05, 0xfd, 0xd2, 0xf0, 0xd4, 0xe2,
0xde, 0x97, 0xea, 0x5d, 0x6d, 0x0e, 0x54, 0xf9, 0xe3, 0xea, 0xa9, 0x98, 0x5c, 0x23, 0x6b, 0x55,
0x88, 0x8d, 0x1f, 0x95, 0x88, 0xe6, 0x5f, 0x51, 0x3b, 0x58, 0xc0, 0x54, 0x01, 0x3b, 0xbd, 0x26,
0x4c, 0x1c, 0x6b, 0xc1, 0x1c, 0xa2, 0x66, 0x1e, 0x93, 0x23, 0x5c, 0x24, 0xf3, 0xd7, 0x49, 0xcd,
0x5c, 0x27, 0xd6, 0xb0, 0xf0, 0x2f, 0xa3, 0xb7, 0xcf, 0x49, 0x4c, 0x32, 0x49, 0x71, 0xa2, 0xff,
0x90, 0xcd, 0x6b, 0xb8, 0xb3, 0xa4, 0xe1, 0x1f, 0x01, 0x22, 0x59, 0xc4, 0xcf, 0x72, 0x95, 0x41,
0x39, 0x16, 0xe2, 0x15, 0xe3, 0xb1, 0x7d, 0x4c, 0x6e, 0x4c, 0x2d, 0x87, 0xd6, 0x80, 0x6e, 0x41,
0x43, 0x92, 0x0c, 0x67, 0xd2, 0x9e, 0x31, 0xdb, 0xb2, 0x17, 0x91, 0x28, 0x72, 0xc2, 0x6d, 0x4c,
0x9b, 0x54, 0x8c, 0x54, 0x53, 0x3d, 0x45, 0xc5, 0x31, 0xde, 0xfd, 0xf4, 0xb3, 0x99, 0xfb, 0xba,
0x79, 0x8a, 0x1a, 0xb8, 0xf4, 0xed, 0x3d, 0x86, 0x8d, 0x21, 0x15, 0xf2, 0x90, 0x25, 0x34, 0x3a,
0xbb, 0x76, 0x89, 0xe2, 0xfd, 0xde, 0x01, 0x34, 0xef, 0xc7, 0xfe, 0xc9, 0x99, 0xdd, 0x1a, 0xce,
0xd5, 0x6f, 0x8d, 0x0f, 0xa0, 0x9b, 0x6b, 0x37, 0x21, 0xcd, 0x8e, 0x58, 0xb9, 0x7b, 0x1d, 0x83,
0xa9, 0xd8, 0x0a, 0xf5, 0x80, 0x56, 0xc1, 0x0c, 0x39, 0x4b, 0x88, 0xd9, 0xbc, 0x76, 0xd0, 0x56,
0x48, 0xa0, 0x00, 0x6f, 0x02, 0xb7, 0x47, 0xc7, 0xec, 0xd5, 0x3e, 0xcb, 0x8e, 0xe8, 0xa4, 0x30,
0xf7, 0xec, 0x3b, 0xfc, 0x91, 0x70, 0xa1, 0x99, 0x63, 0xa9, 0xce, 0x94, 0xdd, 0xa3, 0xb2, 0xe9,
0xfd, 0xc9, 0x81, 0x3b, 0xab, 0x46, 0x7a, 0x97, 0xe5, 0x1f, 0xc0, 0x5a, 0x64, 0xdc, 0x19, 0x6f,
0x57, 0xff, 0xd3, 0xb9, 0xd8, 0xcf, 0x7b, 0x0c, 0x35, 0x5d, 0x4d, 0xec, 0x40, 0x85, 0x4b, 0x3d,
0x83, 0xde, 0xee, 0xfd, 0x0b, 0x94, 0x42, 0x11, 0xf5, 0xf3, 0xb5, 0xc2, 0x25, 0xea, 0x82, 0xc3,
0xf5, 0x4a, 0x9d, 0xc0, 0xe1, 0x1f, 0xfe, 0xcd, 0x81, 0x56, 0x69, 0x46, 0x1b, 0xb0, 0xe6, 0xfb,
0xc3, 0xfd, 0xa9, 0x56, 0xf5, 0xbf, 0x85, 0xfa, 0xd0, 0xf5, 0xfd, 0xe1, 0x61, 0x59, 0x3e, 0xf6,
0x1d, 0xd4, 0x85, 0x96, 0xef, 0x0f, 0xb5, 0xf8, 0xf4, 0x2b, 0xb6, 0xf5, 0x24, 0x29, 0xc4, 0x71,
0xbf, 0x3a, 0x75, 0x90, 0xe6, 0xd8, 0x38, 0xa8, 0xa1, 0x35, 0x68, 0xfb, 0x4f, 0x87, 0x83, 0x4c,
0x10, 0x2e, 0xfb, 0x75, 0xdb, 0xf4, 0x49, 0x42, 0x24, 0xe9, 0x37, 0xd0, 0x3a, 0x74, 0xfc, 0xa7,
0xc3, 0xbd, 0x22, 0x79, 0xa9, 0xee, 0xb1, 0x7e, 0x53, 0xdb, 0x9f, 0x0f, 0xcd, 0x8b, 0xa6, 0xdf,
0xd2, 0xee, 0x9f, 0x0f, 0xd5, 0x1b, 0xeb, 0xac, 0xdf, 0xb6, 0x9d, 0x7f, 0x99, 0x6b, 0x5f, 0xb0,
0xf7, 0xf0, 0xd7, 0x9f, 0x4e, 0xa8, 0x3c, 0x2e, 0xc6, 0x2a, 0x5e, 0x3b, 0x66, 0xe9, 0x1f, 0x51,
0x66, 0xbf, 0x76, 0xca, 0xe5, 0xef, 0xe8, 0x68, 0x4c, 0x9b, 0xf9, 0x78, 0xdc, 0xd0, 0xc8, 0x27,
0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x39, 0x3a, 0x8f, 0x34, 0x8a, 0x17, 0x00, 0x00,
}

View File

@ -237,7 +237,6 @@ func (BinaryExpr_BinaryOp) EnumDescriptor() ([]byte, []int) {
type GenericValue struct {
// Types that are valid to be assigned to Val:
//
// *GenericValue_BoolVal
// *GenericValue_Int64Val
// *GenericValue_FloatVal
@ -1298,7 +1297,6 @@ var xxx_messageInfo_AlwaysTrueExpr proto.InternalMessageInfo
type Expr struct {
// Types that are valid to be assigned to Expr:
//
// *Expr_TermExpr
// *Expr_UnaryExpr
// *Expr_BinaryExpr
@ -1670,7 +1668,6 @@ func (m *QueryPlanNode) GetLimit() int64 {
type PlanNode struct {
// Types that are valid to be assigned to Node:
//
// *PlanNode_VectorAnns
// *PlanNode_Predicates
// *PlanNode_Query

View File

@ -29,7 +29,6 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type InvalidateCollMetaCacheRequest struct {
// MsgType:
//
// DropCollection -> {meta cache, dml channels}
// Other -> {meta cache}
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`

View File

@ -270,6 +270,7 @@ message FieldIndexInfo {
int64 index_size = 8;
int64 index_version = 9;
int64 num_rows = 10;
string index_engine_version = 11;
}
enum LoadScope {

View File

@ -1771,6 +1771,7 @@ type FieldIndexInfo struct {
IndexSize int64 `protobuf:"varint,8,opt,name=index_size,json=indexSize,proto3" json:"index_size,omitempty"`
IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"`
NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"`
IndexEngineVersion string `protobuf:"bytes,11,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1871,6 +1872,13 @@ func (m *FieldIndexInfo) GetNumRows() int64 {
return 0
}
func (m *FieldIndexInfo) GetIndexEngineVersion() string {
if m != nil {
return m.IndexEngineVersion
}
return ""
}
type LoadSegmentsRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
DstNodeID int64 `protobuf:"varint,2,opt,name=dst_nodeID,json=dstNodeID,proto3" json:"dst_nodeID,omitempty"`
@ -4574,307 +4582,308 @@ func init() {
func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) }
var fileDescriptor_aab7cc9a69ed26e8 = []byte{
// 4789 bytes of a gzipped FileDescriptorProto
// 4809 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6f, 0x1c, 0x47,
0x7a, 0xea, 0x79, 0x71, 0xe6, 0x9b, 0x57, 0xb3, 0x48, 0x4a, 0xb3, 0xb3, 0x92, 0x2c, 0xb7, 0xfc,
0xe0, 0xca, 0x36, 0xa5, 0xa5, 0xd6, 0x5e, 0xed, 0xda, 0x86, 0x23, 0x91, 0x96, 0xcc, 0xb5, 0x4d,
0x33, 0x4d, 0xca, 0x1b, 0x78, 0xbd, 0x3b, 0x6e, 0x4e, 0x17, 0x87, 0x0d, 0xf5, 0x63, 0xd4, 0xdd,
0x43, 0x9a, 0x0e, 0x10, 0xe4, 0x90, 0x4b, 0x36, 0xd9, 0x20, 0x48, 0x0e, 0xc9, 0x21, 0xc8, 0x21,
0x41, 0x80, 0x4d, 0x90, 0x5c, 0x82, 0x04, 0xc8, 0x21, 0x87, 0xdc, 0x72, 0xca, 0xeb, 0x94, 0x3f,
0x90, 0xdc, 0x02, 0xe4, 0x92, 0x45, 0xe0, 0x5b, 0x50, 0x8f, 0x7e, 0x54, 0x77, 0x0d, 0xa7, 0xc9,
0x91, 0xd6, 0x76, 0xb0, 0xb7, 0xe9, 0xaf, 0x1e, 0xdf, 0x57, 0x5f, 0x7d, 0xef, 0xaa, 0x1a, 0x58,
0x7c, 0x3c, 0xc1, 0xfe, 0xc9, 0x60, 0xe8, 0x79, 0xbe, 0xb9, 0x36, 0xf6, 0xbd, 0xd0, 0x43, 0xc8,
0xb1, 0xec, 0xa3, 0x49, 0xc0, 0xbe, 0xd6, 0x68, 0x7b, 0xbf, 0x35, 0xf4, 0x1c, 0xc7, 0x73, 0x19,
0xac, 0xdf, 0x4a, 0xf7, 0xe8, 0x77, 0x2c, 0x37, 0xc4, 0xbe, 0x6b, 0xd8, 0x51, 0x6b, 0x30, 0x3c,
0xc4, 0x8e, 0xc1, 0xbf, 0x1a, 0x4e, 0x30, 0xe2, 0x3f, 0x55, 0xd3, 0x08, 0x8d, 0x34, 0xaa, 0xfe,
0xa2, 0xe5, 0x9a, 0xf8, 0xd3, 0x34, 0x48, 0xfb, 0x0d, 0x05, 0x2e, 0xee, 0x1e, 0x7a, 0xc7, 0x1b,
0x9e, 0x6d, 0xe3, 0x61, 0x68, 0x79, 0x6e, 0xa0, 0xe3, 0xc7, 0x13, 0x1c, 0x84, 0xe8, 0x16, 0x54,
0xf6, 0x8d, 0x00, 0xf7, 0x94, 0x6b, 0xca, 0x6a, 0x73, 0xfd, 0xf2, 0x9a, 0x40, 0x27, 0x27, 0xf0,
0xfd, 0x60, 0x74, 0xcf, 0x08, 0xb0, 0x4e, 0x7b, 0x22, 0x04, 0x15, 0x73, 0x7f, 0x6b, 0xb3, 0x57,
0xba, 0xa6, 0xac, 0x96, 0x75, 0xfa, 0x1b, 0x3d, 0x07, 0xed, 0x61, 0x3c, 0xf7, 0xd6, 0x66, 0xd0,
0x2b, 0x5f, 0x2b, 0xaf, 0x96, 0x75, 0x11, 0xa8, 0xfd, 0xb8, 0x04, 0x97, 0x72, 0x64, 0x04, 0x63,
0xcf, 0x0d, 0x30, 0xba, 0x0d, 0xb5, 0x20, 0x34, 0xc2, 0x49, 0xc0, 0x29, 0xf9, 0xba, 0x94, 0x92,
0x5d, 0xda, 0x45, 0xe7, 0x5d, 0xf3, 0x68, 0x4b, 0x12, 0xb4, 0xe8, 0x9b, 0xb0, 0x6c, 0xb9, 0xef,
0x63, 0xc7, 0xf3, 0x4f, 0x06, 0x63, 0xec, 0x0f, 0xb1, 0x1b, 0x1a, 0x23, 0x1c, 0xd1, 0xb8, 0x14,
0xb5, 0xed, 0x24, 0x4d, 0xe8, 0x35, 0xb8, 0xc4, 0xf6, 0x30, 0xc0, 0xfe, 0x91, 0x35, 0xc4, 0x03,
0xe3, 0xc8, 0xb0, 0x6c, 0x63, 0xdf, 0xc6, 0xbd, 0xca, 0xb5, 0xf2, 0x6a, 0x5d, 0x5f, 0xa1, 0xcd,
0xbb, 0xac, 0xf5, 0x6e, 0xd4, 0x88, 0xbe, 0x01, 0xaa, 0x8f, 0x0f, 0x7c, 0x1c, 0x1c, 0x0e, 0xc6,
0xbe, 0x37, 0xf2, 0x71, 0x10, 0xf4, 0xaa, 0x14, 0x4d, 0x97, 0xc3, 0x77, 0x38, 0x58, 0xfb, 0x33,
0x05, 0x56, 0x08, 0x33, 0x76, 0x0c, 0x3f, 0xb4, 0x9e, 0xc2, 0x96, 0x68, 0xd0, 0x4a, 0xb3, 0xa1,
0x57, 0xa6, 0x6d, 0x02, 0x8c, 0xf4, 0x19, 0x47, 0xe8, 0x09, 0xfb, 0x2a, 0x94, 0x54, 0x01, 0xa6,
0xfd, 0x0b, 0x97, 0x9d, 0x34, 0x9d, 0xf3, 0xec, 0x59, 0x16, 0x67, 0x29, 0x8f, 0xf3, 0x3c, 0x3b,
0x26, 0xe3, 0x7c, 0x45, 0xce, 0xf9, 0x7f, 0x2a, 0xc3, 0xca, 0x7b, 0x9e, 0x61, 0x26, 0x62, 0xf8,
0xf3, 0xe7, 0xfc, 0x9b, 0x50, 0x63, 0x1a, 0xdd, 0xab, 0x50, 0x5c, 0xcf, 0x8b, 0xb8, 0xb8, 0xb6,
0x27, 0x14, 0xee, 0x52, 0x80, 0xce, 0x07, 0xa1, 0xe7, 0xa1, 0xe3, 0xe3, 0xb1, 0x6d, 0x0d, 0x8d,
0x81, 0x3b, 0x71, 0xf6, 0xb1, 0xdf, 0xab, 0x5e, 0x53, 0x56, 0xab, 0x7a, 0x9b, 0x43, 0xb7, 0x29,
0x10, 0x7d, 0x02, 0xed, 0x03, 0x0b, 0xdb, 0xe6, 0x80, 0x9a, 0x84, 0xad, 0xcd, 0x5e, 0xed, 0x5a,
0x79, 0xb5, 0xb9, 0xfe, 0xfa, 0x5a, 0xde, 0x1a, 0xad, 0x49, 0x39, 0xb2, 0x76, 0x9f, 0x0c, 0xdf,
0x62, 0xa3, 0xdf, 0x76, 0x43, 0xff, 0x44, 0x6f, 0x1d, 0xa4, 0x40, 0xa8, 0x07, 0x0b, 0x9c, 0xbd,
0xbd, 0x85, 0x6b, 0xca, 0x6a, 0x5d, 0x8f, 0x3e, 0xd1, 0x8b, 0xd0, 0xf5, 0x71, 0xe0, 0x4d, 0xfc,
0x21, 0x1e, 0x8c, 0x7c, 0x6f, 0x32, 0x0e, 0x7a, 0xf5, 0x6b, 0xe5, 0xd5, 0x86, 0xde, 0x89, 0xc0,
0x0f, 0x28, 0xb4, 0xff, 0x16, 0x2c, 0xe6, 0xb0, 0x20, 0x15, 0xca, 0x8f, 0xf0, 0x09, 0xdd, 0x88,
0xb2, 0x4e, 0x7e, 0xa2, 0x65, 0xa8, 0x1e, 0x19, 0xf6, 0x04, 0x73, 0x56, 0xb3, 0x8f, 0xef, 0x96,
0xee, 0x28, 0xda, 0x1f, 0x29, 0xd0, 0xd3, 0xb1, 0x8d, 0x8d, 0x00, 0x7f, 0x91, 0x5b, 0x7a, 0x11,
0x6a, 0xae, 0x67, 0xe2, 0xad, 0x4d, 0xba, 0xa5, 0x65, 0x9d, 0x7f, 0x69, 0x9f, 0x2b, 0xb0, 0xfc,
0x00, 0x87, 0x44, 0x0d, 0xac, 0x20, 0xb4, 0x86, 0xb1, 0x9e, 0xbf, 0x09, 0x65, 0x1f, 0x3f, 0xe6,
0x94, 0xbd, 0x24, 0x52, 0x16, 0x9b, 0x7f, 0xd9, 0x48, 0x9d, 0x8c, 0x43, 0xcf, 0x42, 0xcb, 0x74,
0xec, 0xc1, 0xf0, 0xd0, 0x70, 0x5d, 0x6c, 0x33, 0x45, 0x6a, 0xe8, 0x4d, 0xd3, 0xb1, 0x37, 0x38,
0x08, 0x5d, 0x05, 0x08, 0xf0, 0xc8, 0xc1, 0x6e, 0x98, 0xd8, 0xe4, 0x14, 0x04, 0xdd, 0x80, 0xc5,
0x03, 0xdf, 0x73, 0x06, 0xc1, 0xa1, 0xe1, 0x9b, 0x03, 0x1b, 0x1b, 0x26, 0xf6, 0x29, 0xf5, 0x75,
0xbd, 0x4b, 0x1a, 0x76, 0x09, 0xfc, 0x3d, 0x0a, 0x46, 0xb7, 0xa1, 0x1a, 0x0c, 0xbd, 0x31, 0xa6,
0x92, 0xd6, 0x59, 0xbf, 0x22, 0x93, 0xa1, 0x4d, 0x23, 0x34, 0x76, 0x49, 0x27, 0x9d, 0xf5, 0xd5,
0xfe, 0xae, 0xc2, 0x54, 0xed, 0x4b, 0x6e, 0xe4, 0x52, 0xea, 0x58, 0x7d, 0x32, 0xea, 0x58, 0x2b,
0xa4, 0x8e, 0x0b, 0xa7, 0xab, 0x63, 0x8e, 0x6b, 0x67, 0x51, 0xc7, 0xfa, 0x4c, 0x75, 0x6c, 0xc8,
0xd4, 0x11, 0xbd, 0x0d, 0x5d, 0x16, 0x40, 0x58, 0xee, 0x81, 0x37, 0xb0, 0xad, 0x20, 0xec, 0x01,
0x25, 0xf3, 0x4a, 0x56, 0x42, 0x4d, 0xfc, 0xe9, 0x1a, 0x43, 0xec, 0x1e, 0x78, 0x7a, 0xdb, 0x8a,
0x7e, 0xbe, 0x67, 0x05, 0xe1, 0xfc, 0x5a, 0xfd, 0x0f, 0x89, 0x56, 0x7f, 0xd9, 0xa5, 0x27, 0xd1,
0xfc, 0xaa, 0xa0, 0xf9, 0x7f, 0xae, 0xc0, 0xd7, 0x1e, 0xe0, 0x30, 0x26, 0x9f, 0x28, 0x32, 0xfe,
0x92, 0xba, 0xf9, 0xbf, 0x52, 0xa0, 0x2f, 0xa3, 0x75, 0x1e, 0x57, 0xff, 0x11, 0x5c, 0x8c, 0x71,
0x0c, 0x4c, 0x1c, 0x0c, 0x7d, 0x6b, 0x4c, 0xb7, 0x91, 0xda, 0xaa, 0xe6, 0xfa, 0x75, 0x99, 0xe0,
0x67, 0x29, 0x58, 0x89, 0xa7, 0xd8, 0x4c, 0xcd, 0xa0, 0xfd, 0x44, 0x81, 0x15, 0x62, 0x1b, 0xb9,
0x31, 0x23, 0x12, 0x78, 0x6e, 0xbe, 0x8a, 0x66, 0xb2, 0x94, 0x33, 0x93, 0x05, 0x78, 0x4c, 0x43,
0xec, 0x2c, 0x3d, 0xf3, 0xf0, 0xee, 0x55, 0xa8, 0x12, 0x05, 0x8c, 0x58, 0xf5, 0x8c, 0x8c, 0x55,
0x69, 0x64, 0xac, 0xb7, 0xe6, 0x32, 0x2a, 0x12, 0xbb, 0x3d, 0x87, 0xb8, 0x65, 0x97, 0x5d, 0x92,
0x2c, 0xfb, 0xb7, 0x15, 0xb8, 0x94, 0x43, 0x38, 0xcf, 0xba, 0xdf, 0x80, 0x1a, 0xf5, 0x46, 0xd1,
0xc2, 0x9f, 0x93, 0x2e, 0x3c, 0x85, 0x8e, 0x58, 0x1b, 0x9d, 0x8f, 0xd1, 0x3c, 0x50, 0xb3, 0x6d,
0xc4, 0x4f, 0x72, 0x1f, 0x39, 0x70, 0x0d, 0x87, 0x31, 0xa0, 0xa1, 0x37, 0x39, 0x6c, 0xdb, 0x70,
0x30, 0xfa, 0x1a, 0xd4, 0x89, 0xca, 0x0e, 0x2c, 0x33, 0xda, 0xfe, 0x05, 0xaa, 0xc2, 0x66, 0x80,
0xae, 0x00, 0xd0, 0x26, 0xc3, 0x34, 0x7d, 0xe6, 0x42, 0x1b, 0x7a, 0x83, 0x40, 0xee, 0x12, 0x80,
0xf6, 0x87, 0x0a, 0x5c, 0xdd, 0x3d, 0x71, 0x87, 0xdb, 0xf8, 0x78, 0xc3, 0xc7, 0x46, 0x88, 0x13,
0xa3, 0xfd, 0x54, 0x19, 0x8f, 0xae, 0x41, 0x33, 0xa5, 0xbf, 0x5c, 0x24, 0xd3, 0x20, 0xed, 0xaf,
0x15, 0x68, 0x11, 0x2f, 0xf2, 0x3e, 0x0e, 0x0d, 0x22, 0x22, 0xe8, 0x3b, 0xd0, 0xb0, 0x3d, 0xc3,
0x1c, 0x84, 0x27, 0x63, 0x46, 0x4d, 0x27, 0x4b, 0x4d, 0xe2, 0x7a, 0xf6, 0x4e, 0xc6, 0x58, 0xaf,
0xdb, 0xfc, 0x57, 0x21, 0x8a, 0xb2, 0x56, 0xa6, 0x2c, 0xb1, 0x94, 0xcf, 0x40, 0xd3, 0xc1, 0xa1,
0x6f, 0x0d, 0x19, 0x11, 0x15, 0xba, 0x15, 0xc0, 0x40, 0x04, 0x91, 0xf6, 0x93, 0x1a, 0x5c, 0xfc,
0xbe, 0x11, 0x0e, 0x0f, 0x37, 0x9d, 0x28, 0x8a, 0x39, 0x3f, 0x1f, 0x13, 0xbb, 0x5c, 0x4a, 0xdb,
0xe5, 0x27, 0x66, 0xf7, 0x63, 0x1d, 0xad, 0xca, 0x74, 0x94, 0x24, 0xe6, 0x6b, 0x1f, 0x72, 0x31,
0x4b, 0xe9, 0x68, 0x2a, 0xd8, 0xa8, 0x9d, 0x27, 0xd8, 0xd8, 0x80, 0x36, 0xfe, 0x74, 0x68, 0x4f,
0x88, 0xbc, 0x52, 0xec, 0x2c, 0x8a, 0xb8, 0x2a, 0xc1, 0x9e, 0x36, 0x10, 0x2d, 0x3e, 0x68, 0x8b,
0xd3, 0xc0, 0x64, 0xc1, 0xc1, 0xa1, 0x41, 0x43, 0x85, 0xe6, 0xfa, 0xb5, 0x69, 0xb2, 0x10, 0x09,
0x10, 0x93, 0x07, 0xf2, 0x85, 0x2e, 0x43, 0x83, 0x87, 0x36, 0x5b, 0x9b, 0xbd, 0x06, 0x65, 0x5f,
0x02, 0x40, 0x06, 0xb4, 0xb9, 0xf5, 0xe4, 0x14, 0xb2, 0x00, 0xe2, 0x0d, 0x19, 0x02, 0xf9, 0x66,
0xa7, 0x29, 0x0f, 0x78, 0xa0, 0x13, 0xa4, 0x40, 0x24, 0xf3, 0xf7, 0x0e, 0x0e, 0x6c, 0xcb, 0xc5,
0xdb, 0x6c, 0x87, 0x9b, 0x94, 0x08, 0x11, 0x48, 0xc2, 0xa1, 0x23, 0xec, 0x07, 0x96, 0xe7, 0xf6,
0x5a, 0xb4, 0x3d, 0xfa, 0x94, 0x45, 0x39, 0xed, 0x73, 0x44, 0x39, 0x03, 0x58, 0xcc, 0x51, 0x2a,
0x89, 0x72, 0xbe, 0x95, 0x8e, 0x72, 0x66, 0x6f, 0x55, 0x2a, 0x0a, 0xfa, 0xa9, 0x02, 0x2b, 0x0f,
0xdd, 0x60, 0xb2, 0x1f, 0xb3, 0xe8, 0x8b, 0x51, 0x87, 0xac, 0x11, 0xad, 0xe4, 0x8c, 0xa8, 0xf6,
0x3f, 0x55, 0xe8, 0xf2, 0x55, 0x10, 0xa9, 0xa1, 0x26, 0xe7, 0x32, 0x34, 0x62, 0x3f, 0xca, 0x19,
0x92, 0x00, 0xb2, 0x36, 0xac, 0x94, 0xb3, 0x61, 0x85, 0x48, 0x8b, 0xa2, 0xa2, 0x4a, 0x2a, 0x2a,
0xba, 0x02, 0x70, 0x60, 0x4f, 0x82, 0xc3, 0x41, 0x68, 0x39, 0x98, 0x47, 0x65, 0x0d, 0x0a, 0xd9,
0xb3, 0x1c, 0x8c, 0xee, 0x42, 0x6b, 0xdf, 0x72, 0x6d, 0x6f, 0x34, 0x18, 0x1b, 0xe1, 0x61, 0xc0,
0xd3, 0x62, 0xd9, 0xb6, 0xd0, 0x18, 0xf6, 0x1e, 0xed, 0xab, 0x37, 0xd9, 0x98, 0x1d, 0x32, 0x04,
0x5d, 0x85, 0xa6, 0x3b, 0x71, 0x06, 0xde, 0xc1, 0xc0, 0xf7, 0x8e, 0x03, 0x9a, 0xfc, 0x96, 0xf5,
0x86, 0x3b, 0x71, 0x3e, 0x38, 0xd0, 0xbd, 0x63, 0xe2, 0xc7, 0x1a, 0xc4, 0xa3, 0x05, 0xb6, 0x37,
0x62, 0x89, 0xef, 0xec, 0xf9, 0x93, 0x01, 0x64, 0xb4, 0x89, 0xed, 0xd0, 0xa0, 0xa3, 0x1b, 0xc5,
0x46, 0xc7, 0x03, 0xd0, 0x0b, 0xd0, 0x19, 0x7a, 0xce, 0xd8, 0xa0, 0x1c, 0xba, 0xef, 0x7b, 0x0e,
0x55, 0xc0, 0xb2, 0x9e, 0x81, 0xa2, 0x0d, 0x68, 0x26, 0x4a, 0x10, 0xf4, 0x9a, 0x14, 0x8f, 0x26,
0xd3, 0xd2, 0x54, 0x28, 0x4f, 0x04, 0x14, 0x62, 0x2d, 0x08, 0x88, 0x64, 0x44, 0xca, 0x1e, 0x58,
0x9f, 0x61, 0xae, 0x68, 0x4d, 0x0e, 0xdb, 0xb5, 0x3e, 0xc3, 0x24, 0x3d, 0xb2, 0xdc, 0x00, 0xfb,
0x61, 0x94, 0xac, 0xf6, 0xda, 0x54, 0x7c, 0xda, 0x0c, 0xca, 0x05, 0x1b, 0x6d, 0x42, 0x27, 0x08,
0x0d, 0x3f, 0x1c, 0x8c, 0xbd, 0x80, 0x0a, 0x40, 0xaf, 0x43, 0x65, 0x3b, 0xa3, 0x92, 0x4e, 0x30,
0x22, 0x82, 0xbd, 0xc3, 0x3b, 0xe9, 0x6d, 0x3a, 0x28, 0xfa, 0x24, 0xb3, 0x50, 0x4e, 0x24, 0xb3,
0x74, 0x0b, 0xcd, 0x42, 0x07, 0xc5, 0xb3, 0xac, 0x92, 0x74, 0xc9, 0x30, 0x8d, 0x7d, 0x1b, 0x7f,
0xc8, 0x2d, 0x88, 0x4a, 0x17, 0x96, 0x05, 0x6b, 0xff, 0x5d, 0x82, 0x8e, 0xc8, 0x1e, 0x62, 0x76,
0x58, 0x56, 0x16, 0xc9, 0x7c, 0xf4, 0x49, 0x98, 0x85, 0x5d, 0x32, 0x9a, 0xa5, 0x80, 0x54, 0xe4,
0xeb, 0x7a, 0x93, 0xc1, 0xe8, 0x04, 0x44, 0x74, 0xd9, 0xa6, 0x50, 0x3d, 0x2b, 0x53, 0x46, 0x35,
0x28, 0x84, 0x86, 0x2a, 0x3d, 0x58, 0x88, 0xb2, 0x47, 0x26, 0xf0, 0xd1, 0x27, 0x69, 0xd9, 0x9f,
0x58, 0x14, 0x2b, 0x13, 0xf8, 0xe8, 0x13, 0x6d, 0x42, 0x8b, 0x4d, 0x39, 0x36, 0x7c, 0xc3, 0x89,
0xc4, 0xfd, 0x59, 0xa9, 0xc9, 0x78, 0x17, 0x9f, 0x7c, 0x48, 0xac, 0xcf, 0x8e, 0x61, 0xf9, 0x3a,
0x13, 0x8f, 0x1d, 0x3a, 0x0a, 0xad, 0x82, 0xca, 0x66, 0x39, 0xb0, 0x6c, 0xcc, 0x15, 0x67, 0x81,
0xa5, 0x90, 0x14, 0x7e, 0xdf, 0xb2, 0x31, 0xd3, 0x8d, 0x78, 0x09, 0x54, 0x20, 0xea, 0x4c, 0x35,
0x28, 0x84, 0x8a, 0xc3, 0x75, 0x60, 0x56, 0x74, 0x10, 0xd9, 0x66, 0xe6, 0x40, 0x18, 0x8d, 0x9c,
0xad, 0x34, 0x24, 0x9b, 0x38, 0x4c, 0xb9, 0x80, 0x2d, 0xc7, 0x9d, 0x38, 0x44, 0xb5, 0xb4, 0xdf,
0xab, 0xc2, 0x12, 0xb1, 0x30, 0xdc, 0xd8, 0xcc, 0x11, 0x20, 0x5c, 0x01, 0x30, 0x83, 0x70, 0x20,
0x58, 0xc5, 0x86, 0x19, 0x84, 0xdc, 0x7d, 0x7c, 0x27, 0xf2, 0xef, 0xe5, 0xe9, 0xe9, 0x4a, 0xc6,
0xe2, 0xe5, 0x7d, 0xfc, 0xb9, 0xea, 0x7b, 0xd7, 0xa1, 0xcd, 0x73, 0x75, 0x21, 0xb1, 0x6c, 0x31,
0xe0, 0xb6, 0xdc, 0x6e, 0xd7, 0xa4, 0x75, 0xc6, 0x94, 0x9f, 0x5f, 0x98, 0xcf, 0xcf, 0xd7, 0xb3,
0x7e, 0xfe, 0x3e, 0x74, 0x45, 0x55, 0x8b, 0x6c, 0xd5, 0x0c, 0x5d, 0xeb, 0x08, 0xba, 0x16, 0xa4,
0xdd, 0x34, 0x88, 0x6e, 0xfa, 0x3a, 0xb4, 0x5d, 0x8c, 0xcd, 0x41, 0xe8, 0x1b, 0x6e, 0x70, 0x80,
0x7d, 0xea, 0xe6, 0xeb, 0x7a, 0x8b, 0x00, 0xf7, 0x38, 0x0c, 0xbd, 0x01, 0x40, 0xd7, 0xc8, 0xca,
0x53, 0xad, 0xe9, 0xe5, 0x29, 0x2a, 0x34, 0xb4, 0x3c, 0x45, 0x99, 0x42, 0x7f, 0x3e, 0xa1, 0x48,
0x40, 0xfb, 0xe7, 0x12, 0x5c, 0xe4, 0xe5, 0x8a, 0xf9, 0xe5, 0x72, 0x9a, 0xa7, 0x8e, 0x5c, 0x5d,
0xf9, 0x94, 0x02, 0x40, 0xa5, 0x40, 0x30, 0x5b, 0x95, 0x04, 0xb3, 0x62, 0x12, 0x5c, 0xcb, 0x25,
0xc1, 0x71, 0xfd, 0x6f, 0xa1, 0x78, 0xfd, 0x0f, 0x2d, 0x43, 0x95, 0x66, 0x66, 0x54, 0x76, 0x1a,
0x3a, 0xfb, 0x28, 0xb4, 0xab, 0xda, 0x1f, 0x94, 0xa0, 0xbd, 0x8b, 0x0d, 0x7f, 0x78, 0x18, 0xf1,
0xf1, 0xb5, 0x74, 0xbd, 0xf4, 0xb9, 0x29, 0xf5, 0x52, 0x61, 0xc8, 0x57, 0xa6, 0x50, 0x4a, 0x10,
0x84, 0x5e, 0x68, 0xc4, 0x54, 0x0e, 0xdc, 0x89, 0xc3, 0x8b, 0x88, 0x5d, 0xda, 0xc0, 0x49, 0xdd,
0x9e, 0x38, 0xda, 0x7f, 0x29, 0xd0, 0xfa, 0x65, 0x32, 0x4d, 0xc4, 0x98, 0x3b, 0x69, 0xc6, 0xbc,
0x30, 0x85, 0x31, 0x3a, 0x49, 0xb2, 0xf0, 0x11, 0xfe, 0xca, 0xd5, 0x90, 0xff, 0x51, 0x81, 0x3e,
0x49, 0xb1, 0x75, 0x66, 0x77, 0xe6, 0xd7, 0xae, 0xeb, 0xd0, 0x3e, 0x12, 0x82, 0xd9, 0x12, 0x15,
0xce, 0xd6, 0x51, 0xba, 0x24, 0xa0, 0x83, 0x1a, 0x95, 0x74, 0xf9, 0x62, 0x23, 0x37, 0xf0, 0xa2,
0x8c, 0xea, 0x0c, 0x71, 0xd4, 0x42, 0x74, 0x7d, 0x11, 0xa8, 0xfd, 0x8e, 0x02, 0x4b, 0x92, 0x8e,
0xe8, 0x12, 0x2c, 0xf0, 0xf2, 0x03, 0x8f, 0x17, 0x98, 0xbe, 0x9b, 0x64, 0x7b, 0x92, 0x02, 0x9a,
0x65, 0xe6, 0x23, 0x64, 0x93, 0x64, 0xd4, 0x71, 0xae, 0x65, 0xe6, 0xf6, 0xc7, 0x0c, 0x50, 0x1f,
0xea, 0xdc, 0x9a, 0x46, 0x49, 0x6c, 0xfc, 0xad, 0x3d, 0x02, 0xf4, 0x00, 0x27, 0xbe, 0x6b, 0x1e,
0x8e, 0x26, 0xf6, 0x26, 0x21, 0x34, 0x6d, 0x84, 0x4c, 0xed, 0x3f, 0x14, 0x58, 0x12, 0xb0, 0xcd,
0x53, 0x26, 0x4a, 0xfc, 0x6b, 0xe9, 0x3c, 0xfe, 0x55, 0x28, 0x85, 0x94, 0xcf, 0x54, 0x0a, 0xb9,
0x0a, 0x10, 0xf3, 0x3f, 0xe2, 0x68, 0x0a, 0xa2, 0xfd, 0xbd, 0x02, 0x17, 0xdf, 0x31, 0x5c, 0xd3,
0x3b, 0x38, 0x98, 0x5f, 0x54, 0x37, 0x40, 0x48, 0x7b, 0x8b, 0x16, 0x03, 0xc5, 0x5c, 0xf9, 0x25,
0x58, 0xf4, 0x99, 0x67, 0x32, 0x45, 0x59, 0x2e, 0xeb, 0x6a, 0xd4, 0x10, 0xcb, 0xe8, 0x5f, 0x96,
0x00, 0x91, 0x55, 0xdf, 0x33, 0x6c, 0xc3, 0x1d, 0xe2, 0xf3, 0x93, 0xfe, 0x3c, 0x74, 0x84, 0x10,
0x26, 0x3e, 0x9c, 0x4f, 0xc7, 0x30, 0x01, 0x7a, 0x17, 0x3a, 0xfb, 0x0c, 0xd5, 0xc0, 0xc7, 0x46,
0xe0, 0xb9, 0x7c, 0x3b, 0xa4, 0x75, 0xbf, 0x3d, 0xdf, 0x1a, 0x8d, 0xb0, 0xbf, 0xe1, 0xb9, 0x26,
0x8f, 0xda, 0xf7, 0x23, 0x32, 0xc9, 0x50, 0xa2, 0x0c, 0x49, 0x3c, 0x17, 0x6f, 0x4e, 0x1c, 0xd0,
0x51, 0x56, 0x04, 0xd8, 0xb0, 0x13, 0x46, 0x24, 0xde, 0x50, 0x65, 0x0d, 0xbb, 0xd3, 0xcb, 0xbe,
0x92, 0xf8, 0x4a, 0xfb, 0x1b, 0x05, 0x50, 0x9c, 0x9a, 0xd3, 0x5a, 0x06, 0xd5, 0xe8, 0xec, 0x50,
0x45, 0xe2, 0x94, 0x2f, 0x43, 0xc3, 0x8c, 0x46, 0x72, 0x13, 0x94, 0x00, 0xa8, 0x8f, 0xa4, 0x44,
0x0f, 0x88, 0xe4, 0x61, 0x33, 0x4a, 0x7d, 0x19, 0xf0, 0x3d, 0x0a, 0x13, 0xc3, 0xb3, 0x4a, 0x36,
0x3c, 0x4b, 0x57, 0x35, 0xab, 0x42, 0x55, 0x53, 0xfb, 0x69, 0x09, 0x54, 0xea, 0x42, 0x36, 0x92,
0xf2, 0x54, 0x21, 0xa2, 0xaf, 0x43, 0x9b, 0x5f, 0x6e, 0x11, 0x08, 0x6f, 0x3d, 0x4e, 0x4d, 0x86,
0x6e, 0xc1, 0x32, 0xeb, 0xe4, 0xe3, 0x60, 0x62, 0x27, 0x59, 0x1f, 0x4b, 0x66, 0xd0, 0x63, 0xe6,
0xbb, 0x48, 0x53, 0x34, 0xe2, 0x21, 0x5c, 0x1c, 0xd9, 0xde, 0xbe, 0x61, 0x0f, 0xc4, 0xed, 0x61,
0x7b, 0x58, 0x40, 0xe2, 0x97, 0xd9, 0xf0, 0xdd, 0xf4, 0x1e, 0x06, 0xe8, 0x1e, 0xb4, 0x03, 0x8c,
0x1f, 0x25, 0xa9, 0x60, 0xb5, 0x48, 0x2a, 0xd8, 0x22, 0x63, 0xa2, 0x2f, 0xed, 0x8f, 0x15, 0xe8,
0x66, 0xce, 0x24, 0xb2, 0x85, 0x0b, 0x25, 0x5f, 0xb8, 0xb8, 0x03, 0x55, 0x62, 0xa9, 0x98, 0x6f,
0xe9, 0xc8, 0x93, 0x6a, 0x71, 0x56, 0x9d, 0x0d, 0x40, 0x37, 0x61, 0x49, 0x72, 0xf7, 0x81, 0x6f,
0x3f, 0xca, 0x5f, 0x7d, 0xd0, 0x7e, 0x56, 0x81, 0x66, 0x8a, 0x15, 0x33, 0x6a, 0x2e, 0x4f, 0xa4,
0xb6, 0x3c, 0xed, 0xac, 0x9b, 0x88, 0x9c, 0x83, 0x1d, 0x96, 0xf7, 0xf1, 0x24, 0xd4, 0xc1, 0x0e,
0xcd, 0xfa, 0xd2, 0x09, 0x5d, 0x4d, 0x48, 0xe8, 0x32, 0x29, 0xef, 0xc2, 0x29, 0x29, 0x6f, 0x5d,
0x4c, 0x79, 0x05, 0x15, 0x6a, 0x64, 0x55, 0xa8, 0x68, 0x19, 0xe4, 0x16, 0x2c, 0x0d, 0x59, 0xed,
0xfe, 0xde, 0xc9, 0x46, 0xdc, 0xc4, 0x83, 0x52, 0x59, 0x13, 0xba, 0x9f, 0x14, 0x38, 0xd9, 0x2e,
0xb3, 0xa4, 0x43, 0x9e, 0x51, 0xf3, 0xbd, 0x61, 0x9b, 0x1c, 0x59, 0x66, 0xfa, 0x95, 0x2d, 0xc0,
0xb4, 0xcf, 0x55, 0x80, 0x79, 0x06, 0x9a, 0x51, 0xa4, 0x42, 0x34, 0xbd, 0xc3, 0x8c, 0x5e, 0x64,
0x06, 0xcc, 0x40, 0xb0, 0x03, 0x5d, 0xf1, 0x74, 0x23, 0x5b, 0x8f, 0x50, 0xf3, 0xf5, 0x88, 0x4b,
0xb0, 0x60, 0x05, 0x83, 0x03, 0xe3, 0x11, 0xee, 0x2d, 0xd2, 0xd6, 0x9a, 0x15, 0xdc, 0x37, 0x1e,
0x61, 0xed, 0x5f, 0xcb, 0xd0, 0x49, 0x1c, 0x6c, 0x61, 0x0b, 0x52, 0xe4, 0xfe, 0xcf, 0x36, 0xa8,
0x49, 0xdc, 0x43, 0x39, 0x7c, 0x6a, 0x0e, 0x9e, 0x3d, 0x32, 0xec, 0x8e, 0x33, 0xfa, 0x2a, 0xb8,
0xfb, 0xca, 0x99, 0xdc, 0xfd, 0x9c, 0x37, 0x03, 0x6e, 0xc3, 0x4a, 0xec, 0x7b, 0x85, 0x65, 0xb3,
0x04, 0x6b, 0x39, 0x6a, 0xdc, 0x49, 0x2f, 0x7f, 0x8a, 0x09, 0x58, 0x98, 0x66, 0x02, 0xb2, 0x22,
0x50, 0xcf, 0x89, 0x40, 0xfe, 0x82, 0x42, 0x43, 0x72, 0x41, 0x41, 0x7b, 0x08, 0x4b, 0xb4, 0xd8,
0x1c, 0x0c, 0x7d, 0x6b, 0x1f, 0xc7, 0x29, 0x40, 0x91, 0x6d, 0xed, 0x43, 0x3d, 0x93, 0x45, 0xc4,
0xdf, 0xda, 0x8f, 0x15, 0xb8, 0x98, 0x9f, 0x97, 0x4a, 0x4c, 0x62, 0x48, 0x14, 0xc1, 0x90, 0xfc,
0x0a, 0x2c, 0xa5, 0x22, 0x4a, 0x61, 0xe6, 0x29, 0x11, 0xb8, 0x84, 0x70, 0x1d, 0x25, 0x73, 0x44,
0x30, 0xed, 0x67, 0x4a, 0x5c, 0xb3, 0x27, 0xb0, 0x11, 0x3d, 0x10, 0x21, 0x7e, 0xcd, 0x73, 0x6d,
0xcb, 0x8d, 0x0b, 0x2e, 0x7c, 0x8d, 0x0c, 0xc8, 0x0b, 0x2e, 0xef, 0x40, 0x97, 0x77, 0x8a, 0xdd,
0x53, 0xc1, 0x80, 0xac, 0xc3, 0xc6, 0xc5, 0x8e, 0xe9, 0x79, 0xe8, 0xf0, 0x93, 0x8a, 0x08, 0x5f,
0x59, 0x76, 0x7e, 0xf1, 0x3d, 0x50, 0xa3, 0x6e, 0x67, 0x75, 0x88, 0x5d, 0x3e, 0x30, 0x0e, 0xec,
0x7e, 0x53, 0x81, 0x9e, 0xe8, 0x1e, 0x53, 0xcb, 0x3f, 0x7b, 0x78, 0xf7, 0xba, 0x78, 0x3e, 0xfd,
0xfc, 0x29, 0xf4, 0x24, 0x78, 0xa2, 0x53, 0xea, 0xdf, 0x2d, 0xd1, 0xcb, 0x06, 0x24, 0xd5, 0xdb,
0xb4, 0x82, 0xd0, 0xb7, 0xf6, 0x27, 0xf3, 0x9d, 0x98, 0x1a, 0xd0, 0x1c, 0x1e, 0xe2, 0xe1, 0xa3,
0xb1, 0x67, 0x25, 0xbb, 0xf2, 0x96, 0x8c, 0xa6, 0xe9, 0x68, 0xd7, 0x36, 0x92, 0x19, 0xd8, 0x91,
0x53, 0x7a, 0xce, 0xfe, 0x0f, 0x41, 0xcd, 0x76, 0x48, 0x9f, 0xf4, 0x34, 0xd8, 0x49, 0xcf, 0x6d,
0xf1, 0xa4, 0x67, 0x46, 0xa4, 0x91, 0x3a, 0xe8, 0xf9, 0xdb, 0x12, 0x7c, 0x5d, 0x4a, 0xdb, 0x3c,
0x59, 0xd2, 0xb4, 0x3a, 0xd2, 0x3d, 0xa8, 0x67, 0x92, 0xda, 0x17, 0x4e, 0xd9, 0x3f, 0x5e, 0x92,
0x65, 0xa5, 0xc1, 0x20, 0x89, 0xad, 0x12, 0x85, 0xaf, 0x4c, 0x9f, 0x83, 0xeb, 0x9d, 0x30, 0x47,
0x34, 0x0e, 0xdd, 0x85, 0x16, 0x2b, 0x18, 0x0c, 0x8e, 0x2c, 0x7c, 0x1c, 0x9d, 0xa3, 0x5e, 0x95,
0x9a, 0x66, 0xda, 0xef, 0x43, 0x0b, 0x1f, 0xeb, 0x4d, 0x3b, 0xfe, 0x1d, 0x68, 0xbf, 0x5f, 0x01,
0x48, 0xda, 0x48, 0x76, 0x96, 0xe8, 0x3c, 0x57, 0xe2, 0x14, 0x84, 0xc4, 0x12, 0x62, 0xe4, 0x1a,
0x7d, 0x22, 0x3d, 0x39, 0xc7, 0x30, 0xad, 0x20, 0xe4, 0x7c, 0xb9, 0x79, 0x3a, 0x2d, 0x11, 0x8b,
0xc8, 0x96, 0x71, 0x99, 0x09, 0x12, 0x08, 0x7a, 0x05, 0xd0, 0xc8, 0xf7, 0x8e, 0x2d, 0x77, 0x94,
0xce, 0x37, 0x58, 0x5a, 0xb2, 0xc8, 0x5b, 0x52, 0x09, 0xc7, 0x8f, 0x40, 0xcd, 0x74, 0x8f, 0x58,
0x72, 0x7b, 0x06, 0x19, 0x0f, 0x84, 0xb9, 0xb8, 0xf8, 0x76, 0x45, 0x0c, 0xf4, 0xd0, 0x74, 0xcf,
0xf0, 0x47, 0x38, 0xda, 0x51, 0x1e, 0x87, 0x89, 0xc0, 0xfe, 0x00, 0xd4, 0xec, 0xaa, 0x24, 0x47,
0x9a, 0xaf, 0x8a, 0x82, 0x7e, 0x9a, 0x3d, 0x22, 0xd3, 0xa4, 0x44, 0xbd, 0x6f, 0xc0, 0xb2, 0x8c,
0x5e, 0x09, 0x92, 0x73, 0x6b, 0xd3, 0x5b, 0x71, 0x48, 0x4c, 0xf7, 0x61, 0x9a, 0x97, 0x49, 0x15,
0x9e, 0x4b, 0x42, 0xe1, 0x59, 0xfb, 0xf5, 0x32, 0xa0, 0xbc, 0xf8, 0xa3, 0x0e, 0x94, 0xe2, 0x49,
0x4a, 0x5b, 0x9b, 0x19, 0x71, 0x2b, 0xe5, 0xc4, 0xed, 0x32, 0x34, 0x62, 0xaf, 0xcf, 0x4d, 0x7c,
0x02, 0x48, 0x0b, 0x63, 0x45, 0x14, 0xc6, 0x14, 0x61, 0x55, 0xb1, 0x22, 0x7e, 0x0b, 0x96, 0x6d,
0x23, 0x08, 0x07, 0xac, 0xf0, 0x1e, 0x5a, 0x0e, 0x0e, 0x42, 0xc3, 0x19, 0xd3, 0xad, 0xac, 0xe8,
0x88, 0xb4, 0x6d, 0x92, 0xa6, 0xbd, 0xa8, 0x05, 0xed, 0x45, 0xd1, 0x35, 0xb1, 0xbd, 0xfc, 0xb2,
0xc0, 0xab, 0xc5, 0xd4, 0x3d, 0x29, 0x77, 0x33, 0x89, 0x6a, 0xc4, 0x61, 0x67, 0xff, 0x13, 0xe8,
0x88, 0x8d, 0x92, 0xed, 0xbb, 0x23, 0x6e, 0x5f, 0x91, 0xc0, 0x36, 0xb5, 0x87, 0x87, 0x80, 0xf2,
0xc6, 0x23, 0xcd, 0x33, 0x45, 0xe4, 0xd9, 0xac, 0xbd, 0x48, 0xf1, 0xb4, 0x2c, 0x6e, 0xf6, 0x9f,
0x96, 0x01, 0x25, 0x11, 0x5c, 0x7c, 0x78, 0x5d, 0x24, 0xec, 0xb9, 0x09, 0x4b, 0xf9, 0xf8, 0x2e,
0x0a, 0x6a, 0x51, 0x2e, 0xba, 0x93, 0x45, 0x62, 0x65, 0xd9, 0x55, 0xd1, 0xd7, 0x62, 0x73, 0xcf,
0xc2, 0xd5, 0xab, 0x53, 0xcf, 0x33, 0x44, 0x8b, 0xff, 0xc3, 0xec, 0x15, 0x53, 0x66, 0x3f, 0xee,
0x48, 0x4d, 0x73, 0x6e, 0xc9, 0x33, 0xef, 0x97, 0x0a, 0x81, 0x74, 0xed, 0x2c, 0x81, 0xf4, 0xfc,
0x17, 0x42, 0xff, 0xbd, 0x04, 0x8b, 0x31, 0x23, 0xcf, 0xb4, 0x49, 0xb3, 0xef, 0x19, 0x3c, 0xe5,
0x5d, 0xf9, 0x58, 0xbe, 0x2b, 0xdf, 0x3e, 0x35, 0x99, 0x29, 0xba, 0x29, 0xf3, 0x73, 0xf6, 0x33,
0x58, 0xe0, 0x65, 0xe9, 0x9c, 0x81, 0x2b, 0x52, 0x2e, 0x58, 0x86, 0x2a, 0xb1, 0xa7, 0x51, 0x4d,
0x91, 0x7d, 0x30, 0x96, 0xa6, 0x2f, 0x1c, 0x73, 0x1b, 0xd7, 0x16, 0xee, 0x1b, 0x6b, 0xbf, 0x55,
0x06, 0xd8, 0x3d, 0x71, 0x87, 0x77, 0x99, 0x92, 0xde, 0x82, 0xca, 0xac, 0xeb, 0x69, 0xa4, 0x37,
0x95, 0x2d, 0xda, 0xb3, 0xc0, 0xe6, 0x0a, 0x05, 0x91, 0x72, 0xb6, 0x20, 0x32, 0xad, 0x94, 0x31,
0xdd, 0x04, 0x7f, 0x1b, 0x2a, 0xd4, 0x94, 0xb2, 0xdb, 0x5b, 0x85, 0x4e, 0x85, 0xe9, 0x00, 0xb4,
0x0a, 0x91, 0x4b, 0xde, 0x72, 0x99, 0xcf, 0xa5, 0xe6, 0xb8, 0xac, 0x67, 0xc1, 0xe8, 0x05, 0xe8,
0xb0, 0x42, 0x58, 0xdc, 0x91, 0xe5, 0x74, 0x19, 0x68, 0xde, 0xa3, 0x37, 0x24, 0x1e, 0x9d, 0xe0,
0x35, 0x7d, 0x6f, 0x3c, 0x4e, 0x4d, 0xc7, 0x2a, 0x21, 0x59, 0xb0, 0xf6, 0x79, 0x09, 0x2e, 0x11,
0xfe, 0x3e, 0x99, 0xa8, 0xbc, 0x88, 0xf0, 0xa4, 0xec, 0x79, 0x59, 0xb4, 0xe7, 0x77, 0x60, 0x81,
0x95, 0x5b, 0xa2, 0xf8, 0xf2, 0xea, 0x34, 0x69, 0x60, 0xb2, 0xa3, 0x47, 0xdd, 0xe7, 0xcd, 0xd9,
0x85, 0x33, 0xf3, 0xda, 0x7c, 0x67, 0xe6, 0x0b, 0xd9, 0xa2, 0x6c, 0x4a, 0xac, 0xea, 0xa2, 0x17,
0x7a, 0x08, 0x6d, 0x3d, 0xad, 0x1a, 0x08, 0x41, 0x25, 0x75, 0x61, 0x95, 0xfe, 0xa6, 0x69, 0xb6,
0x31, 0x36, 0x86, 0x56, 0x78, 0x42, 0xd9, 0x59, 0xd5, 0xe3, 0x6f, 0xb9, 0x1e, 0x6a, 0xff, 0xab,
0xc0, 0xc5, 0xe8, 0x50, 0x95, 0x6b, 0xf9, 0xf9, 0x77, 0x74, 0x1d, 0x56, 0xb8, 0x4a, 0x67, 0x74,
0x9b, 0x05, 0xd3, 0x4b, 0x0c, 0x26, 0x2e, 0x63, 0x1d, 0x56, 0x42, 0x2a, 0x5d, 0xd9, 0x31, 0x6c,
0xbf, 0x97, 0x58, 0xa3, 0x38, 0xa6, 0xc8, 0xa1, 0xf6, 0x33, 0xec, 0x06, 0x16, 0x67, 0x2d, 0x57,
0x52, 0x70, 0x27, 0x0e, 0x5f, 0xa5, 0x76, 0x0c, 0x97, 0xd9, 0x95, 0xf1, 0x7d, 0x91, 0xa2, 0xb9,
0xce, 0x34, 0xa4, 0xeb, 0xce, 0xd8, 0xb4, 0x3f, 0x51, 0xe0, 0xca, 0x14, 0xcc, 0xf3, 0x64, 0x73,
0xef, 0x49, 0xb1, 0x4f, 0xc9, 0xbd, 0x05, 0xbc, 0xec, 0xc2, 0x82, 0x48, 0xe4, 0xe7, 0x15, 0x58,
0xcc, 0x75, 0x3a, 0xb3, 0xcc, 0xbd, 0x0c, 0x88, 0x6c, 0x42, 0xfc, 0x3c, 0x92, 0x96, 0x33, 0xb8,
0xf3, 0x54, 0xdd, 0x89, 0x13, 0x3f, 0x8d, 0xdc, 0xf6, 0x4c, 0x8c, 0x2c, 0xd6, 0x9b, 0x9d, 0x68,
0xc4, 0x3b, 0x57, 0x99, 0xfe, 0x0a, 0x26, 0x47, 0xe0, 0xda, 0xf6, 0xc4, 0x61, 0x87, 0x1f, 0x7c,
0x97, 0x99, 0x43, 0x24, 0xa8, 0x04, 0x30, 0x3a, 0x80, 0x45, 0x7a, 0x3f, 0x6f, 0x12, 0x8e, 0x3c,
0x92, 0x50, 0x51, 0xba, 0x98, 0xdb, 0xfd, 0x6e, 0x61, 0x4c, 0x1f, 0xf0, 0xd1, 0x84, 0x78, 0x9e,
0x53, 0xb9, 0x22, 0x34, 0xc2, 0x63, 0xb9, 0x43, 0xcf, 0x89, 0xf1, 0xd4, 0xce, 0x88, 0x67, 0x8b,
0x8f, 0x16, 0xf1, 0xa4, 0xa1, 0xfd, 0x0d, 0x58, 0x91, 0x2e, 0x7d, 0x96, 0xa3, 0xaf, 0xa6, 0x33,
0xaf, 0x7b, 0xb0, 0x2c, 0x5b, 0xd5, 0x39, 0xe6, 0xc8, 0x51, 0x7c, 0x96, 0x39, 0xb4, 0xbf, 0x28,
0x41, 0x7b, 0x13, 0xdb, 0x38, 0xc4, 0x4f, 0xf7, 0xcc, 0x39, 0x77, 0x80, 0x5e, 0xce, 0x1f, 0xa0,
0xe7, 0x6e, 0x03, 0x54, 0x24, 0xb7, 0x01, 0xae, 0xc4, 0x97, 0x20, 0xc8, 0x2c, 0x55, 0x31, 0x86,
0x30, 0xd1, 0xeb, 0xd0, 0x1a, 0xfb, 0x96, 0x63, 0xf8, 0x27, 0x83, 0x47, 0xf8, 0x24, 0xe0, 0x4e,
0xa3, 0x27, 0x75, 0x3b, 0x5b, 0x9b, 0x81, 0xde, 0xe4, 0xbd, 0xdf, 0xc5, 0x27, 0xf4, 0x82, 0x45,
0x9c, 0xc6, 0xb1, 0x1b, 0x75, 0x15, 0x3d, 0x05, 0xb9, 0xf1, 0x12, 0x34, 0xe2, 0x8b, 0x4b, 0xa8,
0x0e, 0x95, 0xfb, 0x13, 0xdb, 0x56, 0x2f, 0xa0, 0x06, 0x54, 0x69, 0xa2, 0xa7, 0x2a, 0xe4, 0x27,
0x8d, 0xfd, 0xd4, 0xd2, 0x8d, 0x5f, 0x82, 0x46, 0x7c, 0x81, 0x02, 0x35, 0x61, 0xe1, 0xa1, 0xfb,
0xae, 0xeb, 0x1d, 0xbb, 0xea, 0x05, 0xb4, 0x00, 0xe5, 0xbb, 0xb6, 0xad, 0x2a, 0xa8, 0x0d, 0x8d,
0xdd, 0xd0, 0xc7, 0x06, 0xd9, 0x3e, 0xb5, 0x84, 0x3a, 0x00, 0xef, 0x58, 0x41, 0xe8, 0xf9, 0xd6,
0xd0, 0xb0, 0xd5, 0xf2, 0x8d, 0xcf, 0xa0, 0x23, 0xd6, 0xd3, 0x51, 0x0b, 0xea, 0xdb, 0x5e, 0xf8,
0xf6, 0xa7, 0x56, 0x10, 0xaa, 0x17, 0x48, 0xff, 0x6d, 0x2f, 0xdc, 0xf1, 0x71, 0x80, 0xdd, 0x50,
0x55, 0x10, 0x40, 0xed, 0x03, 0x77, 0xd3, 0x0a, 0x1e, 0xa9, 0x25, 0xb4, 0xc4, 0x8f, 0xca, 0x0c,
0x7b, 0x8b, 0x17, 0xa9, 0xd5, 0x32, 0x19, 0x1e, 0x7f, 0x55, 0x90, 0x0a, 0xad, 0xb8, 0xcb, 0x83,
0x9d, 0x87, 0x6a, 0x95, 0x51, 0x4f, 0x7e, 0xd6, 0x6e, 0x98, 0xa0, 0x66, 0x8f, 0x78, 0xc9, 0x9c,
0x6c, 0x11, 0x31, 0x48, 0xbd, 0x40, 0x56, 0xc6, 0xcf, 0xd8, 0x55, 0x05, 0x75, 0xa1, 0x99, 0x3a,
0xb1, 0x56, 0x4b, 0x04, 0xf0, 0xc0, 0x1f, 0x0f, 0xb9, 0x6c, 0x31, 0x12, 0x88, 0xa0, 0x6e, 0x12,
0x4e, 0x54, 0x6e, 0xdc, 0x83, 0x7a, 0x94, 0x9f, 0x90, 0xae, 0x9c, 0x45, 0xe4, 0x53, 0xbd, 0x80,
0x16, 0xa1, 0x2d, 0x3c, 0xbd, 0x53, 0x15, 0x84, 0xa0, 0x23, 0x3e, 0x8e, 0x55, 0x4b, 0x37, 0xd6,
0x01, 0x92, 0x38, 0x9f, 0x90, 0xb3, 0xe5, 0x1e, 0x19, 0xb6, 0x65, 0x32, 0xda, 0x48, 0x13, 0xe1,
0x2e, 0xe5, 0x0e, 0xd3, 0x59, 0xb5, 0x74, 0xe3, 0x4d, 0xa8, 0x47, 0xb1, 0x2b, 0x81, 0xeb, 0xd8,
0xf1, 0x8e, 0x30, 0xdb, 0x99, 0x5d, 0x1c, 0xb2, 0x7d, 0xbc, 0xeb, 0x60, 0xd7, 0x54, 0x4b, 0x84,
0x8c, 0x87, 0x63, 0xd3, 0x08, 0xa3, 0x6b, 0xa6, 0x6a, 0x79, 0xfd, 0x3f, 0x97, 0x00, 0xd8, 0x99,
0xad, 0xe7, 0xf9, 0x26, 0xb2, 0xe9, 0xdd, 0x8d, 0x0d, 0xcf, 0x19, 0x7b, 0x6e, 0x74, 0xa0, 0x14,
0xa0, 0xb5, 0x4c, 0x89, 0x84, 0x7d, 0xe4, 0x3b, 0x72, 0xde, 0xf4, 0x9f, 0x93, 0xf6, 0xcf, 0x74,
0xd6, 0x2e, 0x20, 0x87, 0x62, 0xdb, 0xb3, 0x1c, 0xbc, 0x67, 0x0d, 0x1f, 0xc5, 0x07, 0xbd, 0xd3,
0x1f, 0xad, 0x66, 0xba, 0x46, 0xf8, 0xae, 0x4b, 0xf1, 0xed, 0x86, 0xbe, 0xe5, 0x8e, 0x22, 0xef,
0xa8, 0x5d, 0x40, 0x8f, 0x33, 0x4f, 0x66, 0x23, 0x84, 0xeb, 0x45, 0x5e, 0xc9, 0x9e, 0x0f, 0xa5,
0x0d, 0xdd, 0xcc, 0x7f, 0x13, 0xa0, 0x1b, 0xf2, 0xb7, 0x47, 0xb2, 0xff, 0x51, 0xe8, 0xbf, 0x54,
0xa8, 0x6f, 0x8c, 0xcd, 0x82, 0x8e, 0xf8, 0xa8, 0x1e, 0x7d, 0x63, 0xda, 0x04, 0xb9, 0xd7, 0x8f,
0xfd, 0x1b, 0x45, 0xba, 0xc6, 0xa8, 0x3e, 0x62, 0xe2, 0x3b, 0x0b, 0x95, 0xf4, 0xc1, 0x69, 0xff,
0xb4, 0xc0, 0x44, 0xbb, 0x80, 0x3e, 0x21, 0x31, 0x44, 0xe6, 0x8d, 0x26, 0x7a, 0x59, 0xee, 0xf7,
0xe4, 0x4f, 0x39, 0x67, 0x61, 0xf8, 0x28, 0xab, 0x7c, 0xd3, 0xa9, 0xcf, 0x3d, 0xfe, 0x2e, 0x4e,
0x7d, 0x6a, 0xfa, 0xd3, 0xa8, 0x3f, 0x33, 0x06, 0x9b, 0xa5, 0x53, 0x92, 0xd7, 0x61, 0x59, 0x51,
0x4e, 0xb2, 0x99, 0xe9, 0x4f, 0xc9, 0x66, 0x61, 0x9b, 0x50, 0x25, 0xcd, 0x5e, 0x56, 0x78, 0x65,
0xca, 0x31, 0x88, 0xfc, 0x59, 0x6a, 0x7f, 0xad, 0x68, 0xf7, 0xb4, 0x2c, 0x8b, 0x2f, 0x1f, 0xe5,
0x5b, 0x24, 0x7d, 0xad, 0x29, 0x97, 0x65, 0xf9, 0x43, 0x4a, 0xed, 0x02, 0xda, 0x13, 0x4c, 0x3d,
0x7a, 0x61, 0x9a, 0x28, 0x88, 0xb7, 0x97, 0x66, 0xf1, 0xed, 0x57, 0x01, 0x31, 0x4d, 0x75, 0x0f,
0xac, 0xd1, 0xc4, 0x37, 0x98, 0x18, 0x4f, 0x33, 0x6e, 0xf9, 0xae, 0x11, 0x9a, 0x6f, 0x9e, 0x61,
0x44, 0xbc, 0xa4, 0x01, 0xc0, 0x03, 0x1c, 0xbe, 0x4f, 0x9f, 0xc0, 0x05, 0xd9, 0x15, 0x25, 0xf6,
0x9b, 0x77, 0x88, 0x50, 0xbd, 0x38, 0xb3, 0x5f, 0x8c, 0x60, 0x1f, 0x9a, 0x0f, 0x48, 0x7e, 0x45,
0x63, 0xc6, 0x00, 0x4d, 0x1d, 0x19, 0xf5, 0x88, 0x50, 0xac, 0xce, 0xee, 0x98, 0x36, 0x9e, 0x99,
0x57, 0xa0, 0x68, 0xea, 0xc6, 0xe6, 0xdf, 0xa6, 0xca, 0x8d, 0xe7, 0x94, 0x67, 0xa5, 0x6c, 0x45,
0xf4, 0x28, 0xee, 0x1d, 0x6c, 0xd8, 0xe1, 0xe1, 0x94, 0x15, 0xa5, 0x7a, 0x9c, 0xbe, 0x22, 0xa1,
0x63, 0x8c, 0x03, 0xc3, 0x12, 0xd3, 0x42, 0x31, 0x31, 0xbd, 0x29, 0x9f, 0x22, 0xdf, 0xb3, 0xa0,
0xe8, 0x19, 0xb0, 0xb8, 0xe9, 0x7b, 0x63, 0x11, 0xc9, 0x2b, 0x52, 0x24, 0xb9, 0x7e, 0x05, 0x51,
0x7c, 0x1f, 0x5a, 0x51, 0xfe, 0x4f, 0x33, 0x16, 0x39, 0x17, 0xd2, 0x5d, 0x0a, 0x4e, 0xfc, 0x31,
0x74, 0x33, 0x85, 0x05, 0xf9, 0xa6, 0xcb, 0xab, 0x0f, 0xb3, 0x66, 0x3f, 0x06, 0x44, 0x9f, 0xf6,
0x8a, 0xff, 0x4e, 0x20, 0x8f, 0x6f, 0xf2, 0x1d, 0x23, 0x24, 0x37, 0x0b, 0xf7, 0x8f, 0x77, 0xfe,
0xd7, 0x60, 0x45, 0x9a, 0xbc, 0x67, 0x0d, 0x02, 0xbf, 0xae, 0x7c, 0x4a, 0x85, 0x21, 0x6b, 0x10,
0x4e, 0x1d, 0x11, 0xe1, 0x5f, 0xff, 0x37, 0x04, 0x0d, 0x1a, 0xe7, 0xd1, 0xdd, 0xfa, 0x45, 0x98,
0xf7, 0x64, 0xc3, 0xbc, 0x8f, 0xa1, 0x9b, 0x79, 0x72, 0x2a, 0x17, 0x5a, 0xf9, 0xbb, 0xd4, 0x02,
0xd1, 0x8a, 0xf8, 0x5a, 0x53, 0xee, 0x0a, 0xa5, 0x2f, 0x3a, 0x67, 0xcd, 0xfd, 0x21, 0x7b, 0xce,
0x1d, 0x9f, 0xe6, 0xbe, 0x38, 0xf5, 0xf0, 0x41, 0xbc, 0x76, 0xfc, 0xc5, 0x47, 0x41, 0x5f, 0xed,
0x08, 0xf4, 0x63, 0xe8, 0x66, 0x1e, 0xf6, 0xc8, 0x25, 0x46, 0xfe, 0xfa, 0x67, 0xd6, 0xec, 0x3f,
0xc7, 0xe0, 0xc9, 0x84, 0x25, 0xc9, 0x3b, 0x0a, 0xb4, 0x36, 0x2d, 0x10, 0x95, 0x3f, 0xb8, 0x98,
0xbd, 0xa0, 0xb6, 0xa0, 0xa6, 0x59, 0x7f, 0x93, 0x10, 0x99, 0xfd, 0x5b, 0xa3, 0xfe, 0xcb, 0xc5,
0xfe, 0x03, 0x29, 0x5e, 0xd0, 0x2e, 0xd4, 0xd8, 0x73, 0x1f, 0xf4, 0xac, 0xfc, 0x10, 0x26, 0xf5,
0x14, 0xa8, 0x3f, 0xeb, 0xc1, 0x50, 0x30, 0xb1, 0x43, 0x42, 0xff, 0x0f, 0xa0, 0xc3, 0x40, 0x31,
0x83, 0x9e, 0xe0, 0xe4, 0xbb, 0x50, 0xa5, 0xa6, 0x1d, 0x49, 0x0f, 0x14, 0xd2, 0x8f, 0x7a, 0xfa,
0xb3, 0xdf, 0xf1, 0x24, 0x14, 0x37, 0xe9, 0x48, 0x56, 0xd5, 0x79, 0x92, 0x53, 0xdf, 0x52, 0xd0,
0x0f, 0xa0, 0xcd, 0x26, 0x8f, 0xb8, 0xf1, 0x24, 0x29, 0x1f, 0xc2, 0x52, 0x8a, 0xf2, 0xa7, 0x81,
0xe2, 0x96, 0xf2, 0xff, 0x3c, 0xba, 0xff, 0x94, 0x3e, 0xaa, 0xc9, 0x5e, 0x1b, 0x43, 0x6b, 0x67,
0xbb, 0xfb, 0xd6, 0xbf, 0x59, 0xb8, 0x7f, 0x8c, 0xf9, 0x47, 0xa0, 0x66, 0x8f, 0x0a, 0xd1, 0x4b,
0xd3, 0x6c, 0x89, 0x0c, 0xe7, 0x0c, 0x43, 0xf2, 0x3d, 0xa8, 0xb1, 0x1a, 0xb1, 0x5c, 0x01, 0x85,
0xfa, 0xf1, 0x8c, 0xb9, 0xee, 0x7d, 0xeb, 0xa3, 0xf5, 0x91, 0x15, 0x1e, 0x4e, 0xf6, 0x49, 0xcb,
0x4d, 0xd6, 0xf5, 0x15, 0xcb, 0xe3, 0xbf, 0x6e, 0x46, 0x7b, 0x79, 0x93, 0x8e, 0xbe, 0x49, 0x11,
0x8c, 0xf7, 0xf7, 0x6b, 0xf4, 0xf3, 0xf6, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xc4, 0x63,
0x89, 0xd0, 0x53, 0x00, 0x00,
0x7a, 0x9a, 0x17, 0x39, 0xf3, 0xcd, 0xab, 0x59, 0x24, 0xa5, 0xd9, 0x59, 0x49, 0x96, 0x5b, 0x7e,
0x70, 0x65, 0x9b, 0xd2, 0x52, 0x6b, 0xaf, 0x76, 0x6d, 0xc3, 0x91, 0x48, 0x4b, 0xe6, 0xda, 0xa6,
0x95, 0xa6, 0xe4, 0x0d, 0xbc, 0xde, 0x1d, 0x37, 0xa7, 0x8b, 0xc3, 0x86, 0xfa, 0x31, 0xea, 0xee,
0x21, 0x4d, 0x07, 0x08, 0x72, 0xc8, 0x25, 0x9b, 0x6c, 0x10, 0x24, 0x87, 0xe4, 0x10, 0x04, 0x48,
0x82, 0x00, 0x9b, 0x20, 0xb9, 0x04, 0x09, 0x90, 0x43, 0x0e, 0xb9, 0xe5, 0x94, 0xd7, 0x29, 0x7f,
0x20, 0xb9, 0xe5, 0x98, 0x45, 0xe0, 0x5b, 0x50, 0xaf, 0xee, 0xae, 0xee, 0x1a, 0x4e, 0x93, 0x23,
0xad, 0xed, 0x60, 0x6f, 0xd3, 0x5f, 0x3d, 0xbe, 0xaf, 0xbe, 0x57, 0x7d, 0xdf, 0x57, 0x55, 0x03,
0x4b, 0x8f, 0x27, 0x38, 0x38, 0x1e, 0x0c, 0x7d, 0x3f, 0xb0, 0xd6, 0xc7, 0x81, 0x1f, 0xf9, 0x08,
0xb9, 0xb6, 0x73, 0x38, 0x09, 0xd9, 0xd7, 0x3a, 0x6d, 0xef, 0xb7, 0x86, 0xbe, 0xeb, 0xfa, 0x1e,
0x83, 0xf5, 0x5b, 0xe9, 0x1e, 0xfd, 0x8e, 0xed, 0x45, 0x38, 0xf0, 0x4c, 0x47, 0xb4, 0x86, 0xc3,
0x03, 0xec, 0x9a, 0xfc, 0xab, 0xe1, 0x86, 0x23, 0xfe, 0x53, 0xb3, 0xcc, 0xc8, 0x4c, 0xa3, 0xea,
0x2f, 0xd9, 0x9e, 0x85, 0x3f, 0x4d, 0x83, 0xf4, 0xdf, 0x28, 0xc1, 0xf9, 0xdd, 0x03, 0xff, 0x68,
0xd3, 0x77, 0x1c, 0x3c, 0x8c, 0x6c, 0xdf, 0x0b, 0x0d, 0xfc, 0x78, 0x82, 0xc3, 0x08, 0xdd, 0x80,
0xea, 0x9e, 0x19, 0xe2, 0x5e, 0xe9, 0x4a, 0x69, 0xad, 0xb9, 0x71, 0x71, 0x5d, 0xa2, 0x93, 0x13,
0xf8, 0x7e, 0x38, 0xba, 0x63, 0x86, 0xd8, 0xa0, 0x3d, 0x11, 0x82, 0xaa, 0xb5, 0xb7, 0xbd, 0xd5,
0x2b, 0x5f, 0x29, 0xad, 0x55, 0x0c, 0xfa, 0x1b, 0x3d, 0x07, 0xed, 0x61, 0x3c, 0xf7, 0xf6, 0x56,
0xd8, 0xab, 0x5c, 0xa9, 0xac, 0x55, 0x0c, 0x19, 0xa8, 0xff, 0xb8, 0x0c, 0x17, 0x72, 0x64, 0x84,
0x63, 0xdf, 0x0b, 0x31, 0xba, 0x09, 0x0b, 0x61, 0x64, 0x46, 0x93, 0x90, 0x53, 0xf2, 0x75, 0x25,
0x25, 0xbb, 0xb4, 0x8b, 0xc1, 0xbb, 0xe6, 0xd1, 0x96, 0x15, 0x68, 0xd1, 0x37, 0x61, 0xc5, 0xf6,
0xde, 0xc7, 0xae, 0x1f, 0x1c, 0x0f, 0xc6, 0x38, 0x18, 0x62, 0x2f, 0x32, 0x47, 0x58, 0xd0, 0xb8,
0x2c, 0xda, 0xee, 0x27, 0x4d, 0xe8, 0x35, 0xb8, 0xc0, 0x64, 0x18, 0xe2, 0xe0, 0xd0, 0x1e, 0xe2,
0x81, 0x79, 0x68, 0xda, 0x8e, 0xb9, 0xe7, 0xe0, 0x5e, 0xf5, 0x4a, 0x65, 0xad, 0x6e, 0xac, 0xd2,
0xe6, 0x5d, 0xd6, 0x7a, 0x5b, 0x34, 0xa2, 0x6f, 0x80, 0x16, 0xe0, 0xfd, 0x00, 0x87, 0x07, 0x83,
0x71, 0xe0, 0x8f, 0x02, 0x1c, 0x86, 0xbd, 0x1a, 0x45, 0xd3, 0xe5, 0xf0, 0xfb, 0x1c, 0xac, 0xff,
0x79, 0x09, 0x56, 0x09, 0x33, 0xee, 0x9b, 0x41, 0x64, 0x3f, 0x05, 0x91, 0xe8, 0xd0, 0x4a, 0xb3,
0xa1, 0x57, 0xa1, 0x6d, 0x12, 0x8c, 0xf4, 0x19, 0x0b, 0xf4, 0x84, 0x7d, 0x55, 0x4a, 0xaa, 0x04,
0xd3, 0xff, 0x95, 0xeb, 0x4e, 0x9a, 0xce, 0x79, 0x64, 0x96, 0xc5, 0x59, 0xce, 0xe3, 0x3c, 0x8b,
0xc4, 0x54, 0x9c, 0xaf, 0xaa, 0x39, 0xff, 0xcf, 0x15, 0x58, 0x7d, 0xcf, 0x37, 0xad, 0x44, 0x0d,
0x7f, 0xfe, 0x9c, 0x7f, 0x13, 0x16, 0x98, 0x45, 0xf7, 0xaa, 0x14, 0xd7, 0xf3, 0x32, 0x2e, 0x6e,
0xed, 0x09, 0x85, 0xbb, 0x14, 0x60, 0xf0, 0x41, 0xe8, 0x79, 0xe8, 0x04, 0x78, 0xec, 0xd8, 0x43,
0x73, 0xe0, 0x4d, 0xdc, 0x3d, 0x1c, 0xf4, 0x6a, 0x57, 0x4a, 0x6b, 0x35, 0xa3, 0xcd, 0xa1, 0x3b,
0x14, 0x88, 0x3e, 0x81, 0xf6, 0xbe, 0x8d, 0x1d, 0x6b, 0x40, 0x5d, 0xc2, 0xf6, 0x56, 0x6f, 0xe1,
0x4a, 0x65, 0xad, 0xb9, 0xf1, 0xfa, 0x7a, 0xde, 0x1b, 0xad, 0x2b, 0x39, 0xb2, 0x7e, 0x97, 0x0c,
0xdf, 0x66, 0xa3, 0xdf, 0xf6, 0xa2, 0xe0, 0xd8, 0x68, 0xed, 0xa7, 0x40, 0xa8, 0x07, 0x8b, 0x9c,
0xbd, 0xbd, 0xc5, 0x2b, 0xa5, 0xb5, 0xba, 0x21, 0x3e, 0xd1, 0x8b, 0xd0, 0x0d, 0x70, 0xe8, 0x4f,
0x82, 0x21, 0x1e, 0x8c, 0x02, 0x7f, 0x32, 0x0e, 0x7b, 0xf5, 0x2b, 0x95, 0xb5, 0x86, 0xd1, 0x11,
0xe0, 0x7b, 0x14, 0xda, 0x7f, 0x0b, 0x96, 0x72, 0x58, 0x90, 0x06, 0x95, 0x47, 0xf8, 0x98, 0x0a,
0xa2, 0x62, 0x90, 0x9f, 0x68, 0x05, 0x6a, 0x87, 0xa6, 0x33, 0xc1, 0x9c, 0xd5, 0xec, 0xe3, 0xbb,
0xe5, 0x5b, 0x25, 0xfd, 0x8f, 0x4a, 0xd0, 0x33, 0xb0, 0x83, 0xcd, 0x10, 0x7f, 0x91, 0x22, 0x3d,
0x0f, 0x0b, 0x9e, 0x6f, 0xe1, 0xed, 0x2d, 0x2a, 0xd2, 0x8a, 0xc1, 0xbf, 0xf4, 0xcf, 0x4b, 0xb0,
0x72, 0x0f, 0x47, 0xc4, 0x0c, 0xec, 0x30, 0xb2, 0x87, 0xb1, 0x9d, 0xbf, 0x09, 0x95, 0x00, 0x3f,
0xe6, 0x94, 0xbd, 0x24, 0x53, 0x16, 0xbb, 0x7f, 0xd5, 0x48, 0x83, 0x8c, 0x43, 0xcf, 0x42, 0xcb,
0x72, 0x9d, 0xc1, 0xf0, 0xc0, 0xf4, 0x3c, 0xec, 0x30, 0x43, 0x6a, 0x18, 0x4d, 0xcb, 0x75, 0x36,
0x39, 0x08, 0x5d, 0x06, 0x08, 0xf1, 0xc8, 0xc5, 0x5e, 0x94, 0xf8, 0xe4, 0x14, 0x04, 0x5d, 0x83,
0xa5, 0xfd, 0xc0, 0x77, 0x07, 0xe1, 0x81, 0x19, 0x58, 0x03, 0x07, 0x9b, 0x16, 0x0e, 0x28, 0xf5,
0x75, 0xa3, 0x4b, 0x1a, 0x76, 0x09, 0xfc, 0x3d, 0x0a, 0x46, 0x37, 0xa1, 0x16, 0x0e, 0xfd, 0x31,
0xa6, 0x9a, 0xd6, 0xd9, 0xb8, 0xa4, 0xd2, 0xa1, 0x2d, 0x33, 0x32, 0x77, 0x49, 0x27, 0x83, 0xf5,
0xd5, 0xff, 0xbe, 0xca, 0x4c, 0xed, 0x4b, 0xee, 0xe4, 0x52, 0xe6, 0x58, 0x7b, 0x32, 0xe6, 0xb8,
0x50, 0xc8, 0x1c, 0x17, 0x4f, 0x36, 0xc7, 0x1c, 0xd7, 0x4e, 0x63, 0x8e, 0xf5, 0x99, 0xe6, 0xd8,
0x50, 0x99, 0x23, 0x7a, 0x1b, 0xba, 0x2c, 0x80, 0xb0, 0xbd, 0x7d, 0x7f, 0xe0, 0xd8, 0x61, 0xd4,
0x03, 0x4a, 0xe6, 0xa5, 0xac, 0x86, 0x5a, 0xf8, 0xd3, 0x75, 0x86, 0xd8, 0xdb, 0xf7, 0x8d, 0xb6,
0x2d, 0x7e, 0xbe, 0x67, 0x87, 0xd1, 0xfc, 0x56, 0xfd, 0x8f, 0x89, 0x55, 0x7f, 0xd9, 0xb5, 0x27,
0xb1, 0xfc, 0x9a, 0x64, 0xf9, 0x7f, 0x51, 0x82, 0xaf, 0xdd, 0xc3, 0x51, 0x4c, 0x3e, 0x31, 0x64,
0xfc, 0x25, 0xdd, 0xe6, 0xff, 0xba, 0x04, 0x7d, 0x15, 0xad, 0xf3, 0x6c, 0xf5, 0x1f, 0xc1, 0xf9,
0x18, 0xc7, 0xc0, 0xc2, 0xe1, 0x30, 0xb0, 0xc7, 0x54, 0x8c, 0xd4, 0x57, 0x35, 0x37, 0xae, 0xaa,
0x14, 0x3f, 0x4b, 0xc1, 0x6a, 0x3c, 0xc5, 0x56, 0x6a, 0x06, 0xfd, 0x27, 0x25, 0x58, 0x25, 0xbe,
0x91, 0x3b, 0x33, 0xa2, 0x81, 0x67, 0xe6, 0xab, 0xec, 0x26, 0xcb, 0x39, 0x37, 0x59, 0x80, 0xc7,
0x34, 0xc4, 0xce, 0xd2, 0x33, 0x0f, 0xef, 0x5e, 0x85, 0x1a, 0x31, 0x40, 0xc1, 0xaa, 0x67, 0x54,
0xac, 0x4a, 0x23, 0x63, 0xbd, 0x75, 0x8f, 0x51, 0x91, 0xf8, 0xed, 0x39, 0xd4, 0x2d, 0xbb, 0xec,
0xb2, 0x62, 0xd9, 0xbf, 0x5d, 0x82, 0x0b, 0x39, 0x84, 0xf3, 0xac, 0xfb, 0x0d, 0x58, 0xa0, 0xbb,
0x91, 0x58, 0xf8, 0x73, 0xca, 0x85, 0xa7, 0xd0, 0x11, 0x6f, 0x63, 0xf0, 0x31, 0xba, 0x0f, 0x5a,
0xb6, 0x8d, 0xec, 0x93, 0x7c, 0x8f, 0x1c, 0x78, 0xa6, 0xcb, 0x18, 0xd0, 0x30, 0x9a, 0x1c, 0xb6,
0x63, 0xba, 0x18, 0x7d, 0x0d, 0xea, 0xc4, 0x64, 0x07, 0xb6, 0x25, 0xc4, 0xbf, 0x48, 0x4d, 0xd8,
0x0a, 0xd1, 0x25, 0x00, 0xda, 0x64, 0x5a, 0x56, 0xc0, 0xb6, 0xd0, 0x86, 0xd1, 0x20, 0x90, 0xdb,
0x04, 0xa0, 0xff, 0x61, 0x09, 0x2e, 0xef, 0x1e, 0x7b, 0xc3, 0x1d, 0x7c, 0xb4, 0x19, 0x60, 0x33,
0xc2, 0x89, 0xd3, 0x7e, 0xaa, 0x8c, 0x47, 0x57, 0xa0, 0x99, 0xb2, 0x5f, 0xae, 0x92, 0x69, 0x90,
0xfe, 0x37, 0x25, 0x68, 0x91, 0x5d, 0xe4, 0x7d, 0x1c, 0x99, 0x44, 0x45, 0xd0, 0x77, 0xa0, 0xe1,
0xf8, 0xa6, 0x35, 0x88, 0x8e, 0xc7, 0x8c, 0x9a, 0x4e, 0x96, 0x9a, 0x64, 0xeb, 0x79, 0x70, 0x3c,
0xc6, 0x46, 0xdd, 0xe1, 0xbf, 0x0a, 0x51, 0x94, 0xf5, 0x32, 0x15, 0x85, 0xa7, 0x7c, 0x06, 0x9a,
0x2e, 0x8e, 0x02, 0x7b, 0xc8, 0x88, 0xa8, 0x52, 0x51, 0x00, 0x03, 0x11, 0x44, 0xfa, 0x4f, 0x16,
0xe0, 0xfc, 0xf7, 0xcd, 0x68, 0x78, 0xb0, 0xe5, 0x8a, 0x28, 0xe6, 0xec, 0x7c, 0x4c, 0xfc, 0x72,
0x39, 0xed, 0x97, 0x9f, 0x98, 0xdf, 0x8f, 0x6d, 0xb4, 0xa6, 0xb2, 0x51, 0x92, 0x98, 0xaf, 0x7f,
0xc8, 0xd5, 0x2c, 0x65, 0xa3, 0xa9, 0x60, 0x63, 0xe1, 0x2c, 0xc1, 0xc6, 0x26, 0xb4, 0xf1, 0xa7,
0x43, 0x67, 0x42, 0xf4, 0x95, 0x62, 0x67, 0x51, 0xc4, 0x65, 0x05, 0xf6, 0xb4, 0x83, 0x68, 0xf1,
0x41, 0xdb, 0x9c, 0x06, 0xa6, 0x0b, 0x2e, 0x8e, 0x4c, 0x1a, 0x2a, 0x34, 0x37, 0xae, 0x4c, 0xd3,
0x05, 0xa1, 0x40, 0x4c, 0x1f, 0xc8, 0x17, 0xba, 0x08, 0x0d, 0x1e, 0xda, 0x6c, 0x6f, 0xf5, 0x1a,
0x94, 0x7d, 0x09, 0x00, 0x99, 0xd0, 0xe6, 0xde, 0x93, 0x53, 0xc8, 0x02, 0x88, 0x37, 0x54, 0x08,
0xd4, 0xc2, 0x4e, 0x53, 0x1e, 0xf2, 0x40, 0x27, 0x4c, 0x81, 0x48, 0xe6, 0xef, 0xef, 0xef, 0x3b,
0xb6, 0x87, 0x77, 0x98, 0x84, 0x9b, 0x94, 0x08, 0x19, 0x48, 0xc2, 0xa1, 0x43, 0x1c, 0x84, 0xb6,
0xef, 0xf5, 0x5a, 0xb4, 0x5d, 0x7c, 0xaa, 0xa2, 0x9c, 0xf6, 0x19, 0xa2, 0x9c, 0x01, 0x2c, 0xe5,
0x28, 0x55, 0x44, 0x39, 0xdf, 0x4a, 0x47, 0x39, 0xb3, 0x45, 0x95, 0x8a, 0x82, 0x7e, 0x5a, 0x82,
0xd5, 0x87, 0x5e, 0x38, 0xd9, 0x8b, 0x59, 0xf4, 0xc5, 0x98, 0x43, 0xd6, 0x89, 0x56, 0x73, 0x4e,
0x54, 0xff, 0x9f, 0x1a, 0x74, 0xf9, 0x2a, 0x88, 0xd6, 0x50, 0x97, 0x73, 0x11, 0x1a, 0xf1, 0x3e,
0xca, 0x19, 0x92, 0x00, 0xb2, 0x3e, 0xac, 0x9c, 0xf3, 0x61, 0x85, 0x48, 0x13, 0x51, 0x51, 0x35,
0x15, 0x15, 0x5d, 0x02, 0xd8, 0x77, 0x26, 0xe1, 0xc1, 0x20, 0xb2, 0x5d, 0xcc, 0xa3, 0xb2, 0x06,
0x85, 0x3c, 0xb0, 0x5d, 0x8c, 0x6e, 0x43, 0x6b, 0xcf, 0xf6, 0x1c, 0x7f, 0x34, 0x18, 0x9b, 0xd1,
0x41, 0xc8, 0xd3, 0x62, 0x95, 0x58, 0x68, 0x0c, 0x7b, 0x87, 0xf6, 0x35, 0x9a, 0x6c, 0xcc, 0x7d,
0x32, 0x04, 0x5d, 0x86, 0xa6, 0x37, 0x71, 0x07, 0xfe, 0xfe, 0x20, 0xf0, 0x8f, 0x42, 0x9a, 0xfc,
0x56, 0x8c, 0x86, 0x37, 0x71, 0x3f, 0xd8, 0x37, 0xfc, 0x23, 0xb2, 0x8f, 0x35, 0xc8, 0x8e, 0x16,
0x3a, 0xfe, 0x88, 0x25, 0xbe, 0xb3, 0xe7, 0x4f, 0x06, 0x90, 0xd1, 0x16, 0x76, 0x22, 0x93, 0x8e,
0x6e, 0x14, 0x1b, 0x1d, 0x0f, 0x40, 0x2f, 0x40, 0x67, 0xe8, 0xbb, 0x63, 0x93, 0x72, 0xe8, 0x6e,
0xe0, 0xbb, 0xd4, 0x00, 0x2b, 0x46, 0x06, 0x8a, 0x36, 0xa1, 0x99, 0x18, 0x41, 0xd8, 0x6b, 0x52,
0x3c, 0xba, 0xca, 0x4a, 0x53, 0xa1, 0x3c, 0x51, 0x50, 0x88, 0xad, 0x20, 0x24, 0x9a, 0x21, 0x8c,
0x3d, 0xb4, 0x3f, 0xc3, 0xdc, 0xd0, 0x9a, 0x1c, 0xb6, 0x6b, 0x7f, 0x86, 0x49, 0x7a, 0x64, 0x7b,
0x21, 0x0e, 0x22, 0x91, 0xac, 0xf6, 0xda, 0x54, 0x7d, 0xda, 0x0c, 0xca, 0x15, 0x1b, 0x6d, 0x41,
0x27, 0x8c, 0xcc, 0x20, 0x1a, 0x8c, 0xfd, 0x90, 0x2a, 0x40, 0xaf, 0x43, 0x75, 0x3b, 0x63, 0x92,
0x6e, 0x38, 0x22, 0x8a, 0x7d, 0x9f, 0x77, 0x32, 0xda, 0x74, 0x90, 0xf8, 0x24, 0xb3, 0x50, 0x4e,
0x24, 0xb3, 0x74, 0x0b, 0xcd, 0x42, 0x07, 0xc5, 0xb3, 0xac, 0x91, 0x74, 0xc9, 0xb4, 0xcc, 0x3d,
0x07, 0x7f, 0xc8, 0x3d, 0x88, 0x46, 0x17, 0x96, 0x05, 0xeb, 0x7f, 0x52, 0x81, 0x8e, 0xcc, 0x1e,
0xe2, 0x76, 0x58, 0x56, 0x26, 0x74, 0x5e, 0x7c, 0x12, 0x66, 0x61, 0x8f, 0x8c, 0x66, 0x29, 0x20,
0x55, 0xf9, 0xba, 0xd1, 0x64, 0x30, 0x3a, 0x01, 0x51, 0x5d, 0x26, 0x14, 0x6a, 0x67, 0x15, 0xca,
0xa8, 0x06, 0x85, 0xd0, 0x50, 0xa5, 0x07, 0x8b, 0x22, 0x7b, 0x64, 0x0a, 0x2f, 0x3e, 0x49, 0xcb,
0xde, 0xc4, 0xa6, 0x58, 0x99, 0xc2, 0x8b, 0x4f, 0xb4, 0x05, 0x2d, 0x36, 0xe5, 0xd8, 0x0c, 0x4c,
0x57, 0xa8, 0xfb, 0xb3, 0x4a, 0x97, 0xf1, 0x2e, 0x3e, 0xfe, 0x90, 0x78, 0x9f, 0xfb, 0xa6, 0x1d,
0x18, 0x4c, 0x3d, 0xee, 0xd3, 0x51, 0x68, 0x0d, 0x34, 0x36, 0xcb, 0xbe, 0xed, 0x60, 0x6e, 0x38,
0x8b, 0x2c, 0x85, 0xa4, 0xf0, 0xbb, 0xb6, 0x83, 0x99, 0x6d, 0xc4, 0x4b, 0xa0, 0x0a, 0x51, 0x67,
0xa6, 0x41, 0x21, 0x54, 0x1d, 0xae, 0x02, 0xf3, 0xa2, 0x03, 0xe1, 0x9b, 0xd9, 0x06, 0xc2, 0x68,
0xe4, 0x6c, 0xa5, 0x21, 0xd9, 0xc4, 0x65, 0xc6, 0x05, 0x6c, 0x39, 0xde, 0xc4, 0xa5, 0xa6, 0x75,
0x03, 0x56, 0xd8, 0x78, 0xec, 0x8d, 0x6c, 0x0f, 0xc7, 0xd3, 0x34, 0x29, 0xaf, 0x10, 0x6d, 0x7b,
0x9b, 0x36, 0x09, 0x19, 0xfd, 0x5e, 0x0d, 0x96, 0x89, 0x4f, 0xe2, 0xee, 0x69, 0x8e, 0x90, 0xe2,
0x12, 0x80, 0x15, 0x46, 0x03, 0xc9, 0x8f, 0x36, 0xac, 0x30, 0xe2, 0x1b, 0xce, 0x77, 0x44, 0x44,
0x50, 0x99, 0x9e, 0xe0, 0x64, 0x7c, 0x64, 0x3e, 0x2a, 0x38, 0x53, 0x45, 0xf0, 0x2a, 0xb4, 0x79,
0x76, 0x2f, 0xa5, 0xa2, 0x2d, 0x06, 0xdc, 0x51, 0x7b, 0xfa, 0x05, 0x65, 0x65, 0x32, 0x15, 0x19,
0x2c, 0xce, 0x17, 0x19, 0xd4, 0xb3, 0x91, 0xc1, 0x5d, 0xe8, 0xca, 0xc6, 0x29, 0xbc, 0xdb, 0x0c,
0xeb, 0xec, 0x48, 0xd6, 0x19, 0xa6, 0x37, 0x76, 0x90, 0x37, 0xf6, 0xab, 0xd0, 0xf6, 0x30, 0xb6,
0x06, 0x51, 0x60, 0x7a, 0xe1, 0x3e, 0x0e, 0xa8, 0x56, 0xd4, 0x8d, 0x16, 0x01, 0x3e, 0xe0, 0x30,
0xf4, 0x06, 0x00, 0x5d, 0x23, 0x2b, 0x68, 0xb5, 0xa6, 0x17, 0xb4, 0xa8, 0xd2, 0xd0, 0x82, 0x16,
0x65, 0x0a, 0xfd, 0xf9, 0x84, 0x62, 0x07, 0xfd, 0x5f, 0xca, 0x70, 0x9e, 0x17, 0x38, 0xe6, 0xd7,
0xcb, 0x69, 0x7b, 0xbb, 0xd8, 0x1c, 0x2b, 0x27, 0x94, 0x0c, 0xaa, 0x05, 0xc2, 0xdf, 0x9a, 0x22,
0xfc, 0x95, 0xd3, 0xe6, 0x85, 0x5c, 0xda, 0x1c, 0x57, 0x0c, 0x17, 0x8b, 0x57, 0x0c, 0xd1, 0x0a,
0xd4, 0x68, 0x2e, 0x47, 0x75, 0xa7, 0x61, 0xb0, 0x8f, 0x42, 0x52, 0xd5, 0xff, 0xa0, 0x0c, 0xed,
0x5d, 0x6c, 0x06, 0xc3, 0x03, 0xc1, 0xc7, 0xd7, 0xd2, 0x15, 0xd6, 0xe7, 0xa6, 0x54, 0x58, 0xa5,
0x21, 0x5f, 0x99, 0xd2, 0x2a, 0x41, 0x10, 0xf9, 0x91, 0x19, 0x53, 0x39, 0xf0, 0x26, 0x2e, 0x2f,
0x3b, 0x76, 0x69, 0x03, 0x27, 0x75, 0x67, 0xe2, 0xea, 0xff, 0x5d, 0x82, 0xd6, 0x2f, 0x93, 0x69,
0x04, 0x63, 0x6e, 0xa5, 0x19, 0xf3, 0xc2, 0x14, 0xc6, 0x18, 0x24, 0x2d, 0xc3, 0x87, 0xf8, 0x2b,
0x57, 0x75, 0xfe, 0xa7, 0x12, 0xf4, 0x49, 0x52, 0x6e, 0x30, 0xbf, 0x33, 0xbf, 0x75, 0x5d, 0x85,
0xf6, 0xa1, 0x14, 0xfe, 0x96, 0xa9, 0x72, 0xb6, 0x0e, 0xd3, 0x45, 0x04, 0x03, 0x34, 0x51, 0x04,
0xe6, 0x8b, 0x15, 0xdb, 0xc0, 0x8b, 0x2a, 0xaa, 0x33, 0xc4, 0x51, 0x0f, 0xd1, 0x0d, 0x64, 0xa0,
0xfe, 0x3b, 0x25, 0x58, 0x56, 0x74, 0x44, 0x17, 0x60, 0x91, 0x17, 0x2c, 0x78, 0x84, 0xc1, 0xec,
0xdd, 0x22, 0xe2, 0x49, 0x4a, 0x6e, 0xb6, 0x95, 0x8f, 0xa9, 0x2d, 0x92, 0x83, 0xc7, 0xd9, 0x99,
0x95, 0x93, 0x8f, 0x15, 0xa2, 0x3e, 0xd4, 0xb9, 0x37, 0x15, 0x69, 0x6f, 0xfc, 0xad, 0x3f, 0x02,
0x74, 0x0f, 0x27, 0x7b, 0xd7, 0x3c, 0x1c, 0x4d, 0xfc, 0x4d, 0x42, 0x68, 0xda, 0x09, 0x59, 0xfa,
0x7f, 0x96, 0x60, 0x59, 0xc2, 0x36, 0x4f, 0x61, 0x29, 0xd9, 0x5f, 0xcb, 0x67, 0xd9, 0x5f, 0xa5,
0xe2, 0x49, 0xe5, 0x54, 0xc5, 0x93, 0xcb, 0x00, 0x31, 0xff, 0x05, 0x47, 0x53, 0x10, 0xfd, 0x1f,
0x4a, 0x70, 0xfe, 0x1d, 0xd3, 0xb3, 0xfc, 0xfd, 0xfd, 0xf9, 0x55, 0x75, 0x13, 0xa4, 0x44, 0xb9,
0x68, 0xf9, 0x50, 0xce, 0xae, 0x5f, 0x82, 0xa5, 0x80, 0xed, 0x4c, 0x96, 0xac, 0xcb, 0x15, 0x43,
0x13, 0x0d, 0xb1, 0x8e, 0xfe, 0x55, 0x19, 0x10, 0x59, 0xf5, 0x1d, 0xd3, 0x31, 0xbd, 0x21, 0x3e,
0x3b, 0xe9, 0xcf, 0x43, 0x47, 0x0a, 0x61, 0xe2, 0xe3, 0xfc, 0x74, 0x0c, 0x13, 0xa2, 0x77, 0xa1,
0xb3, 0xc7, 0x50, 0x0d, 0x02, 0x6c, 0x86, 0xbe, 0xc7, 0xc5, 0xa1, 0xac, 0x14, 0x3e, 0x08, 0xec,
0xd1, 0x08, 0x07, 0x9b, 0xbe, 0x67, 0xf1, 0x38, 0x7f, 0x4f, 0x90, 0x49, 0x86, 0x12, 0x63, 0x48,
0xe2, 0xb9, 0x58, 0x38, 0x71, 0x40, 0x47, 0x59, 0x11, 0x62, 0xd3, 0x49, 0x18, 0x91, 0xec, 0x86,
0x1a, 0x6b, 0xd8, 0x9d, 0x5e, 0x28, 0x56, 0xc4, 0x57, 0xfa, 0xdf, 0x96, 0x00, 0xc5, 0xc9, 0x3c,
0xad, 0x7e, 0x50, 0x8b, 0xce, 0x0e, 0x2d, 0x29, 0x36, 0xe5, 0x8b, 0xd0, 0xb0, 0xc4, 0x48, 0xee,
0x82, 0x12, 0x00, 0xdd, 0x23, 0x29, 0xd1, 0x03, 0xa2, 0x79, 0xd8, 0x12, 0xc9, 0x32, 0x03, 0xbe,
0x47, 0x61, 0x72, 0x78, 0x56, 0xcd, 0x86, 0x67, 0xe9, 0x3a, 0x68, 0x4d, 0xaa, 0x83, 0xea, 0x3f,
0x2d, 0x83, 0x46, 0xb7, 0x90, 0xcd, 0xa4, 0xa0, 0x55, 0x88, 0xe8, 0xab, 0xd0, 0xe6, 0xd7, 0x61,
0x24, 0xc2, 0x5b, 0x8f, 0x53, 0x93, 0x91, 0x90, 0x9e, 0x75, 0x0a, 0x70, 0x38, 0x71, 0x92, 0x3c,
0x91, 0xa5, 0x3f, 0xe8, 0x31, 0xdb, 0xbb, 0x48, 0x93, 0x18, 0xf1, 0x10, 0xce, 0x8f, 0x1c, 0x7f,
0xcf, 0x74, 0x06, 0xb2, 0x78, 0x98, 0x0c, 0x0b, 0x68, 0xfc, 0x0a, 0x1b, 0xbe, 0x9b, 0x96, 0x61,
0x88, 0xee, 0x40, 0x3b, 0xc4, 0xf8, 0x51, 0x92, 0x3c, 0xd6, 0x8a, 0x24, 0x8f, 0x2d, 0x32, 0x46,
0x7c, 0xe9, 0x7f, 0x5c, 0x82, 0x6e, 0xe6, 0x14, 0x23, 0x5b, 0xea, 0x28, 0xe5, 0x4b, 0x1d, 0xb7,
0xa0, 0x46, 0x3c, 0x15, 0xdb, 0x5b, 0x3a, 0xea, 0x34, 0x5c, 0x9e, 0xd5, 0x60, 0x03, 0xd0, 0x75,
0x58, 0x56, 0xdc, 0x96, 0xe0, 0xe2, 0x47, 0xf9, 0xcb, 0x12, 0xfa, 0xcf, 0xaa, 0xd0, 0x4c, 0xb1,
0x62, 0x46, 0x95, 0xe6, 0x89, 0x54, 0xa3, 0xa7, 0x9d, 0x8e, 0x13, 0x95, 0x73, 0xb1, 0xcb, 0x32,
0x45, 0x9e, 0xb6, 0xba, 0xd8, 0xa5, 0x79, 0x62, 0x3a, 0x05, 0x5c, 0x90, 0x53, 0x40, 0x39, 0x49,
0x5e, 0x3c, 0x21, 0x49, 0xae, 0xcb, 0x49, 0xb2, 0x64, 0x42, 0x8d, 0xac, 0x09, 0x15, 0x2d, 0x9c,
0xdc, 0x80, 0xe5, 0x21, 0xab, 0xf6, 0xdf, 0x39, 0xde, 0x8c, 0x9b, 0x78, 0x50, 0xaa, 0x6a, 0x42,
0x77, 0x93, 0x92, 0x28, 0x93, 0x32, 0x4b, 0x3a, 0xd4, 0x39, 0x38, 0x97, 0x0d, 0x13, 0xb2, 0xf0,
0xcc, 0xf4, 0x2b, 0x5b, 0xb2, 0x69, 0x9f, 0xa9, 0x64, 0xf3, 0x0c, 0x34, 0x45, 0xa4, 0x42, 0x2c,
0xbd, 0xc3, 0x9c, 0x9e, 0x70, 0x03, 0x56, 0x28, 0xf9, 0x81, 0xae, 0x7c, 0x1e, 0x92, 0xad, 0x60,
0x68, 0xf9, 0x0a, 0xc6, 0x05, 0x58, 0xb4, 0xc3, 0xc1, 0xbe, 0xf9, 0x08, 0xf7, 0x96, 0x68, 0xeb,
0x82, 0x1d, 0xde, 0x35, 0x1f, 0x61, 0xfd, 0xdf, 0x2a, 0xd0, 0x49, 0x36, 0xd8, 0xc2, 0x1e, 0xa4,
0xc8, 0x8d, 0xa1, 0x1d, 0xd0, 0x92, 0xb8, 0x87, 0x72, 0xf8, 0xc4, 0x1c, 0x3c, 0x7b, 0xc8, 0xd8,
0x1d, 0x67, 0xec, 0x55, 0xda, 0xee, 0xab, 0xa7, 0xda, 0xee, 0xe7, 0xbc, 0x4b, 0x70, 0x13, 0x56,
0xe3, 0xbd, 0x57, 0x5a, 0x36, 0x4b, 0xb0, 0x56, 0x44, 0xe3, 0xfd, 0xf4, 0xf2, 0xa7, 0xb8, 0x80,
0xc5, 0x69, 0x2e, 0x20, 0xab, 0x02, 0xf5, 0x9c, 0x0a, 0xe4, 0xaf, 0x34, 0x34, 0x14, 0x57, 0x1a,
0xf4, 0x87, 0xb0, 0x4c, 0xcb, 0xd3, 0xe1, 0x30, 0xb0, 0xf7, 0x70, 0x9c, 0x02, 0x14, 0x11, 0x6b,
0x1f, 0xea, 0x99, 0x2c, 0x22, 0xfe, 0xd6, 0x7f, 0x5c, 0x82, 0xf3, 0xf9, 0x79, 0xa9, 0xc6, 0x24,
0x8e, 0xa4, 0x24, 0x39, 0x92, 0x5f, 0x81, 0xe5, 0x54, 0x44, 0x29, 0xcd, 0x3c, 0x25, 0x02, 0x57,
0x10, 0x6e, 0xa0, 0x64, 0x0e, 0x01, 0xd3, 0x7f, 0x56, 0x8a, 0xab, 0xfc, 0x04, 0x36, 0xa2, 0x47,
0x28, 0x64, 0x5f, 0xf3, 0x3d, 0xc7, 0xf6, 0xe2, 0x82, 0x0b, 0x5f, 0x23, 0x03, 0xf2, 0x82, 0xcb,
0x3b, 0xd0, 0xe5, 0x9d, 0xe2, 0xed, 0xa9, 0x60, 0x40, 0xd6, 0x61, 0xe3, 0xe2, 0x8d, 0xe9, 0x79,
0xe8, 0xf0, 0xb3, 0x0d, 0x81, 0xaf, 0xa2, 0x3a, 0xf1, 0xf8, 0x1e, 0x68, 0xa2, 0xdb, 0x69, 0x37,
0xc4, 0x2e, 0x1f, 0x18, 0x07, 0x76, 0xbf, 0x59, 0x82, 0x9e, 0xbc, 0x3d, 0xa6, 0x96, 0x7f, 0xfa,
0xf0, 0xee, 0x75, 0xf9, 0x44, 0xfb, 0xf9, 0x13, 0xe8, 0x49, 0xf0, 0x88, 0x73, 0xed, 0xdf, 0x2d,
0xd3, 0xeb, 0x09, 0x24, 0xd5, 0xdb, 0xb2, 0xc3, 0x28, 0xb0, 0xf7, 0x26, 0xf3, 0x9d, 0xb1, 0x9a,
0xd0, 0x1c, 0x1e, 0xe0, 0xe1, 0xa3, 0xb1, 0x6f, 0x27, 0x52, 0x79, 0x4b, 0x45, 0xd3, 0x74, 0xb4,
0xeb, 0x9b, 0xc9, 0x0c, 0xec, 0x90, 0x2a, 0x3d, 0x67, 0xff, 0x87, 0xa0, 0x65, 0x3b, 0xa4, 0xcf,
0x86, 0x1a, 0xec, 0x6c, 0xe8, 0xa6, 0x7c, 0x36, 0x34, 0x23, 0xd2, 0x48, 0x1d, 0x0d, 0xfd, 0x5d,
0x19, 0xbe, 0xae, 0xa4, 0x6d, 0x9e, 0x2c, 0x69, 0x5a, 0x1d, 0xe9, 0x0e, 0xd4, 0x33, 0x49, 0xed,
0x0b, 0x27, 0xc8, 0x8f, 0xd7, 0x5d, 0x59, 0x69, 0x30, 0x4c, 0x62, 0xab, 0xc4, 0xe0, 0xab, 0xd3,
0xe7, 0xe0, 0x76, 0x27, 0xcd, 0x21, 0xc6, 0xa1, 0xdb, 0xd0, 0x62, 0x05, 0x83, 0xc1, 0xa1, 0x8d,
0x8f, 0xc4, 0xc9, 0xeb, 0x65, 0xa5, 0x6b, 0xa6, 0xfd, 0x3e, 0xb4, 0xf1, 0x91, 0xd1, 0x74, 0xe2,
0xdf, 0xa1, 0xfe, 0xfb, 0x55, 0x80, 0xa4, 0x8d, 0x64, 0x67, 0x89, 0xcd, 0x73, 0x23, 0x4e, 0x41,
0x48, 0x2c, 0x21, 0x47, 0xae, 0xe2, 0x13, 0x19, 0xc9, 0xc9, 0x87, 0x65, 0x87, 0x11, 0xe7, 0xcb,
0xf5, 0x93, 0x69, 0x11, 0x2c, 0x22, 0x22, 0xe3, 0x3a, 0x13, 0x26, 0x10, 0xf4, 0x0a, 0xa0, 0x51,
0xe0, 0x1f, 0xd9, 0xde, 0x28, 0x9d, 0x6f, 0xb0, 0xb4, 0x64, 0x89, 0xb7, 0xa4, 0x12, 0x8e, 0x1f,
0x81, 0x96, 0xe9, 0x2e, 0x58, 0x72, 0x73, 0x06, 0x19, 0xf7, 0xa4, 0xb9, 0xb8, 0xfa, 0x76, 0x65,
0x0c, 0xf4, 0x98, 0xf5, 0x81, 0x19, 0x8c, 0xb0, 0x90, 0x28, 0x8f, 0xc3, 0x64, 0x60, 0x7f, 0x00,
0x5a, 0x76, 0x55, 0x8a, 0x43, 0xd0, 0x57, 0x65, 0x45, 0x3f, 0xc9, 0x1f, 0x91, 0x69, 0x52, 0xaa,
0xde, 0x37, 0x61, 0x45, 0x45, 0xaf, 0x02, 0xc9, 0x99, 0xad, 0xe9, 0xad, 0x38, 0x24, 0xa6, 0x72,
0x98, 0xb6, 0xcb, 0xa4, 0x0a, 0xcf, 0x65, 0xa9, 0xf0, 0xac, 0xff, 0x7a, 0x05, 0x50, 0x5e, 0xfd,
0x51, 0x07, 0xca, 0xf1, 0x24, 0xe5, 0xed, 0xad, 0x8c, 0xba, 0x95, 0x73, 0xea, 0x76, 0x11, 0x1a,
0xf1, 0xae, 0xcf, 0x5d, 0x7c, 0x02, 0x48, 0x2b, 0x63, 0x55, 0x56, 0xc6, 0x14, 0x61, 0x35, 0xb9,
0x22, 0x7e, 0x03, 0x56, 0x1c, 0x33, 0x8c, 0x06, 0xac, 0xf0, 0x1e, 0xd9, 0x2e, 0x0e, 0x23, 0xd3,
0x1d, 0x53, 0x51, 0x56, 0x0d, 0x44, 0xda, 0xb6, 0x48, 0xd3, 0x03, 0xd1, 0x82, 0x1e, 0x88, 0xe8,
0x9a, 0xf8, 0x5e, 0x7e, 0xbd, 0xe0, 0xd5, 0x62, 0xe6, 0x9e, 0x94, 0xbb, 0x99, 0x46, 0x35, 0xe2,
0xb0, 0xb3, 0xff, 0x09, 0x74, 0xe4, 0x46, 0x85, 0xf8, 0x6e, 0xc9, 0xe2, 0x2b, 0x12, 0xd8, 0xa6,
0x64, 0x78, 0x00, 0x28, 0xef, 0x3c, 0xd2, 0x3c, 0x2b, 0xc9, 0x3c, 0x9b, 0x25, 0x8b, 0x14, 0x4f,
0x2b, 0xb2, 0xb0, 0xff, 0xac, 0x02, 0x28, 0x89, 0xe0, 0xe2, 0xe3, 0xee, 0x22, 0x61, 0xcf, 0x75,
0x58, 0xce, 0xc7, 0x77, 0x22, 0xa8, 0x45, 0xb9, 0xe8, 0x4e, 0x15, 0x89, 0x55, 0x54, 0x97, 0x4b,
0x5f, 0x8b, 0xdd, 0x3d, 0x0b, 0x57, 0x2f, 0x4f, 0x3d, 0xcf, 0x90, 0x3d, 0xfe, 0x0f, 0xb3, 0x97,
0x52, 0x99, 0xff, 0xb8, 0xa5, 0x74, 0xcd, 0xb9, 0x25, 0xcf, 0xbc, 0x91, 0x2a, 0x05, 0xd2, 0x0b,
0xa7, 0x09, 0xa4, 0xe7, 0xbf, 0x42, 0xfa, 0x1f, 0x65, 0x58, 0x8a, 0x19, 0x79, 0x2a, 0x21, 0xcd,
0xbe, 0x99, 0xf0, 0x94, 0xa5, 0xf2, 0xb1, 0x5a, 0x2a, 0xdf, 0x3e, 0x31, 0x99, 0x29, 0x2a, 0x94,
0xf9, 0x39, 0xfb, 0x19, 0x2c, 0xf2, 0xb2, 0x74, 0xce, 0xc1, 0x15, 0x29, 0x17, 0xac, 0x40, 0x8d,
0xf8, 0x53, 0x51, 0x53, 0x64, 0x1f, 0x8c, 0xa5, 0xe9, 0x2b, 0xca, 0xdc, 0xc7, 0xb5, 0xa5, 0x1b,
0xca, 0xfa, 0x6f, 0x55, 0x00, 0x76, 0x8f, 0xbd, 0xe1, 0x6d, 0x66, 0xa4, 0x37, 0xa0, 0x3a, 0xeb,
0x42, 0x1b, 0xe9, 0x4d, 0x75, 0x8b, 0xf6, 0x2c, 0x20, 0x5c, 0xa9, 0x20, 0x52, 0xc9, 0x16, 0x44,
0xa6, 0x95, 0x32, 0xa6, 0xbb, 0xe0, 0x6f, 0x43, 0x95, 0xba, 0x52, 0x76, 0xdf, 0xab, 0xd0, 0xa9,
0x30, 0x1d, 0x80, 0xd6, 0x40, 0x6c, 0xc9, 0xdb, 0x1e, 0xdb, 0x73, 0xa9, 0x3b, 0xae, 0x18, 0x59,
0x30, 0x7a, 0x01, 0x3a, 0xac, 0x10, 0x16, 0x77, 0x64, 0x39, 0x5d, 0x06, 0x9a, 0xdf, 0xd1, 0x1b,
0x8a, 0x1d, 0x9d, 0xe0, 0xb5, 0x02, 0x7f, 0x3c, 0x4e, 0x4d, 0xc7, 0x2a, 0x21, 0x59, 0xb0, 0xfe,
0x79, 0x19, 0x2e, 0x10, 0xfe, 0x3e, 0x99, 0xa8, 0xbc, 0x88, 0xf2, 0xa4, 0xfc, 0x79, 0x45, 0xf6,
0xe7, 0xb7, 0x60, 0x91, 0x95, 0x5b, 0x44, 0x7c, 0x79, 0x79, 0x9a, 0x36, 0x30, 0xdd, 0x31, 0x44,
0xf7, 0x79, 0x73, 0x76, 0xe9, 0xcc, 0x7c, 0x61, 0xbe, 0x33, 0xf3, 0xc5, 0x6c, 0x51, 0x36, 0xa5,
0x56, 0x75, 0x79, 0x17, 0x7a, 0x08, 0x6d, 0x23, 0x6d, 0x1a, 0x08, 0x41, 0x35, 0x75, 0xc5, 0x95,
0xfe, 0xa6, 0x69, 0xb6, 0x39, 0x36, 0x87, 0x76, 0x74, 0x4c, 0xd9, 0x59, 0x33, 0xe2, 0x6f, 0xb5,
0x1d, 0xea, 0xff, 0x5b, 0x82, 0xf3, 0xe2, 0x50, 0x95, 0x5b, 0xf9, 0xd9, 0x25, 0xba, 0x01, 0xab,
0xdc, 0xa4, 0x33, 0xb6, 0xcd, 0x82, 0xe9, 0x65, 0x06, 0x93, 0x97, 0xb1, 0x01, 0xab, 0x11, 0xd5,
0xae, 0xec, 0x18, 0x26, 0xef, 0x65, 0xd6, 0x28, 0x8f, 0x29, 0x72, 0xa8, 0xfd, 0x0c, 0xbb, 0xb3,
0xc5, 0x59, 0xcb, 0x8d, 0x14, 0xbc, 0x89, 0xcb, 0x57, 0xa9, 0x1f, 0xc1, 0x45, 0x76, 0xc9, 0x7c,
0x4f, 0xa6, 0x68, 0xae, 0x33, 0x0d, 0xe5, 0xba, 0x33, 0x3e, 0xed, 0x4f, 0x4b, 0x70, 0x69, 0x0a,
0xe6, 0x79, 0xb2, 0xb9, 0xf7, 0x94, 0xd8, 0xa7, 0xe4, 0xde, 0x12, 0x5e, 0x76, 0x61, 0x41, 0x26,
0xf2, 0xf3, 0x2a, 0x2c, 0xe5, 0x3a, 0x9d, 0x5a, 0xe7, 0x5e, 0x06, 0x44, 0x84, 0x10, 0x3f, 0xa8,
0xa4, 0xe5, 0x0c, 0xbe, 0x79, 0x6a, 0xde, 0xc4, 0x8d, 0x1f, 0x53, 0xee, 0xf8, 0x16, 0x46, 0x36,
0xeb, 0xcd, 0x4e, 0x34, 0x62, 0xc9, 0x55, 0xa7, 0xbf, 0x9b, 0xc9, 0x11, 0xb8, 0xbe, 0x33, 0x71,
0xd9, 0xe1, 0x07, 0x97, 0x32, 0xdb, 0x10, 0x09, 0x2a, 0x09, 0x8c, 0xf6, 0x61, 0x89, 0xde, 0xe8,
0x9b, 0x44, 0x23, 0x9f, 0x24, 0x54, 0x94, 0x2e, 0xb6, 0xed, 0x7e, 0xb7, 0x30, 0xa6, 0x0f, 0xf8,
0x68, 0x42, 0x3c, 0xcf, 0xa9, 0x3c, 0x19, 0x2a, 0xf0, 0xd8, 0xde, 0xd0, 0x77, 0x63, 0x3c, 0x0b,
0xa7, 0xc4, 0xb3, 0xcd, 0x47, 0xcb, 0x78, 0xd2, 0xd0, 0xfe, 0x26, 0xac, 0x2a, 0x97, 0x3e, 0x6b,
0xa3, 0xaf, 0xa5, 0x33, 0xaf, 0x3b, 0xb0, 0xa2, 0x5a, 0xd5, 0x19, 0xe6, 0xc8, 0x51, 0x7c, 0x9a,
0x39, 0xf4, 0xbf, 0x2c, 0x43, 0x7b, 0x0b, 0x3b, 0x38, 0xc2, 0x4f, 0xf7, 0xcc, 0x39, 0x77, 0x80,
0x5e, 0xc9, 0x1f, 0xa0, 0xe7, 0x6e, 0x03, 0x54, 0x15, 0xb7, 0x01, 0x2e, 0xc5, 0x97, 0x20, 0xc8,
0x2c, 0x35, 0x39, 0x86, 0xb0, 0xd0, 0xeb, 0xd0, 0x1a, 0x07, 0xb6, 0x6b, 0x06, 0xc7, 0x83, 0x47,
0xf8, 0x38, 0xe4, 0x9b, 0x46, 0x4f, 0xb9, 0xed, 0x6c, 0x6f, 0x85, 0x46, 0x93, 0xf7, 0x7e, 0x17,
0x1f, 0xd3, 0x0b, 0x16, 0x71, 0x1a, 0xc7, 0xee, 0xe0, 0x55, 0x8d, 0x14, 0xe4, 0xda, 0x4b, 0xd0,
0x88, 0x2f, 0x2e, 0xa1, 0x3a, 0x54, 0xef, 0x4e, 0x1c, 0x47, 0x3b, 0x87, 0x1a, 0x50, 0xa3, 0x89,
0x9e, 0x56, 0x22, 0x3f, 0x69, 0xec, 0xa7, 0x95, 0xaf, 0xfd, 0x12, 0x34, 0xe2, 0x0b, 0x14, 0xa8,
0x09, 0x8b, 0x0f, 0xbd, 0x77, 0x3d, 0xff, 0xc8, 0xd3, 0xce, 0xa1, 0x45, 0xa8, 0xdc, 0x76, 0x1c,
0xad, 0x84, 0xda, 0xd0, 0xd8, 0x8d, 0x02, 0x6c, 0x12, 0xf1, 0x69, 0x65, 0xd4, 0x01, 0x78, 0xc7,
0x0e, 0x23, 0x3f, 0xb0, 0x87, 0xa6, 0xa3, 0x55, 0xae, 0x7d, 0x06, 0x1d, 0xb9, 0x9e, 0x8e, 0x5a,
0x50, 0xdf, 0xf1, 0xa3, 0xb7, 0x3f, 0xb5, 0xc3, 0x48, 0x3b, 0x47, 0xfa, 0xef, 0xf8, 0xd1, 0xfd,
0x00, 0x87, 0xd8, 0x8b, 0xb4, 0x12, 0x02, 0x58, 0xf8, 0xc0, 0xdb, 0xb2, 0xc3, 0x47, 0x5a, 0x19,
0x2d, 0xf3, 0xa3, 0x32, 0xd3, 0xd9, 0xe6, 0x45, 0x6a, 0xad, 0x42, 0x86, 0xc7, 0x5f, 0x55, 0xa4,
0x41, 0x2b, 0xee, 0x72, 0xef, 0xfe, 0x43, 0xad, 0xc6, 0xa8, 0x27, 0x3f, 0x17, 0xae, 0x59, 0xa0,
0x65, 0x8f, 0x78, 0xc9, 0x9c, 0x6c, 0x11, 0x31, 0x48, 0x3b, 0x47, 0x56, 0xc6, 0xcf, 0xd8, 0xb5,
0x12, 0xea, 0x42, 0x33, 0x75, 0x62, 0xad, 0x95, 0x09, 0xe0, 0x5e, 0x30, 0x1e, 0x72, 0xdd, 0x62,
0x24, 0x10, 0x45, 0xdd, 0x22, 0x9c, 0xa8, 0x5e, 0xbb, 0x03, 0x75, 0x91, 0x9f, 0x90, 0xae, 0x9c,
0x45, 0xe4, 0x53, 0x3b, 0x87, 0x96, 0xa0, 0x2d, 0x3d, 0xd6, 0xd3, 0x4a, 0x08, 0x41, 0x47, 0x7e,
0x4e, 0xab, 0x95, 0xaf, 0x6d, 0x00, 0x24, 0x71, 0x3e, 0x21, 0x67, 0xdb, 0x3b, 0x34, 0x1d, 0xdb,
0x62, 0xb4, 0x91, 0x26, 0xc2, 0x5d, 0xca, 0x1d, 0x66, 0xb3, 0x5a, 0xf9, 0xda, 0x9b, 0x50, 0x17,
0xb1, 0x2b, 0x81, 0x1b, 0xd8, 0xf5, 0x0f, 0x31, 0x93, 0xcc, 0x2e, 0x8e, 0x98, 0x1c, 0x6f, 0xbb,
0xd8, 0xb3, 0xb4, 0x32, 0x21, 0xe3, 0xe1, 0xd8, 0x32, 0x23, 0x71, 0xe9, 0x51, 0xab, 0x6c, 0xfc,
0xd7, 0x32, 0x00, 0x3b, 0xb3, 0xf5, 0xfd, 0xc0, 0x42, 0x0e, 0xbd, 0xbb, 0xb1, 0xe9, 0xbb, 0x63,
0xdf, 0x13, 0x07, 0x4a, 0x21, 0x5a, 0xcf, 0x94, 0x48, 0xd8, 0x47, 0xbe, 0x23, 0xe7, 0x4d, 0xff,
0x39, 0x65, 0xff, 0x4c, 0x67, 0xfd, 0x1c, 0x72, 0x29, 0xb6, 0x07, 0xb6, 0x8b, 0x1f, 0xd8, 0xc3,
0x47, 0xf1, 0x41, 0xef, 0xf4, 0x67, 0xae, 0x99, 0xae, 0x02, 0xdf, 0x55, 0x25, 0xbe, 0xdd, 0x28,
0xb0, 0xbd, 0x91, 0xd8, 0x1d, 0xf5, 0x73, 0xe8, 0x71, 0xe6, 0x91, 0xad, 0x40, 0xb8, 0x51, 0xe4,
0x5d, 0xed, 0xd9, 0x50, 0x3a, 0xd0, 0xcd, 0xfc, 0x9b, 0x01, 0xba, 0xa6, 0x7e, 0xad, 0xa4, 0xfa,
0xe7, 0x85, 0xfe, 0x4b, 0x85, 0xfa, 0xc6, 0xd8, 0x6c, 0xe8, 0xc8, 0xcf, 0xf0, 0xd1, 0x37, 0xa6,
0x4d, 0x90, 0x7b, 0x2f, 0xd9, 0xbf, 0x56, 0xa4, 0x6b, 0x8c, 0xea, 0x23, 0xa6, 0xbe, 0xb3, 0x50,
0x29, 0x9f, 0xa8, 0xf6, 0x4f, 0x0a, 0x4c, 0xf4, 0x73, 0xe8, 0x13, 0x12, 0x43, 0x64, 0x5e, 0x75,
0xa2, 0x97, 0xd5, 0xfb, 0x9e, 0xfa, 0xf1, 0xe7, 0x2c, 0x0c, 0x1f, 0x65, 0x8d, 0x6f, 0x3a, 0xf5,
0xb9, 0xe7, 0xe2, 0xc5, 0xa9, 0x4f, 0x4d, 0x7f, 0x12, 0xf5, 0xa7, 0xc6, 0xe0, 0xb0, 0x74, 0x4a,
0xf1, 0x9e, 0x2c, 0xab, 0xca, 0x49, 0x36, 0x33, 0xfd, 0xf1, 0xd9, 0x2c, 0x6c, 0x13, 0x6a, 0xa4,
0xd9, 0xcb, 0x0a, 0xaf, 0x4c, 0x39, 0x06, 0x51, 0x3f, 0x64, 0xed, 0xaf, 0x17, 0xed, 0x9e, 0xd6,
0x65, 0xf9, 0xad, 0xa4, 0x5a, 0x44, 0xca, 0xf7, 0x9d, 0x6a, 0x5d, 0x56, 0x3f, 0xbd, 0xd4, 0xcf,
0xa1, 0x07, 0x92, 0xab, 0x47, 0x2f, 0x4c, 0x53, 0x05, 0xf9, 0xf6, 0xd2, 0x2c, 0xbe, 0xfd, 0x2a,
0x20, 0x66, 0xa9, 0xde, 0xbe, 0x3d, 0x9a, 0x04, 0x26, 0x53, 0xe3, 0x69, 0xce, 0x2d, 0xdf, 0x55,
0xa0, 0xf9, 0xe6, 0x29, 0x46, 0xc4, 0x4b, 0x1a, 0x00, 0xdc, 0xc3, 0xd1, 0xfb, 0xf4, 0xd1, 0x5c,
0x98, 0x5d, 0x51, 0xe2, 0xbf, 0x79, 0x07, 0x81, 0xea, 0xc5, 0x99, 0xfd, 0x62, 0x04, 0x7b, 0xd0,
0xbc, 0x47, 0xf2, 0x2b, 0x1a, 0x33, 0x86, 0x68, 0xea, 0x48, 0xd1, 0x43, 0xa0, 0x58, 0x9b, 0xdd,
0x31, 0xed, 0x3c, 0x33, 0xef, 0x46, 0xd1, 0x54, 0xc1, 0xe6, 0x5f, 0xb3, 0xaa, 0x9d, 0xe7, 0x94,
0x87, 0xa8, 0x6c, 0x45, 0xf4, 0x28, 0xee, 0x1d, 0x6c, 0x3a, 0xd1, 0xc1, 0x94, 0x15, 0xa5, 0x7a,
0x9c, 0xbc, 0x22, 0xa9, 0x63, 0x8c, 0x03, 0xc3, 0x32, 0xb3, 0x42, 0x39, 0x31, 0xbd, 0xae, 0x9e,
0x22, 0xdf, 0xb3, 0xa0, 0xea, 0x99, 0xb0, 0xb4, 0x15, 0xf8, 0x63, 0x19, 0xc9, 0x2b, 0x4a, 0x24,
0xb9, 0x7e, 0x05, 0x51, 0x7c, 0x1f, 0x5a, 0x22, 0xff, 0xa7, 0x19, 0x8b, 0x9a, 0x0b, 0xe9, 0x2e,
0x05, 0x27, 0xfe, 0x18, 0xba, 0x99, 0xc2, 0x82, 0x5a, 0xe8, 0xea, 0xea, 0xc3, 0xac, 0xd9, 0x8f,
0x00, 0xd1, 0xc7, 0xc0, 0xf2, 0xff, 0x19, 0xa8, 0xe3, 0x9b, 0x7c, 0x47, 0x81, 0xe4, 0x7a, 0xe1,
0xfe, 0xb1, 0xe4, 0x7f, 0x0d, 0x56, 0x95, 0xc9, 0x7b, 0xd6, 0x21, 0xf0, 0xeb, 0xca, 0x27, 0x54,
0x18, 0xb2, 0x0e, 0xe1, 0xc4, 0x11, 0x02, 0xff, 0xc6, 0xbf, 0x23, 0x68, 0xd0, 0x38, 0x8f, 0x4a,
0xeb, 0x17, 0x61, 0xde, 0x93, 0x0d, 0xf3, 0x3e, 0x86, 0x6e, 0xe6, 0x91, 0xaa, 0x5a, 0x69, 0xd5,
0x2f, 0x59, 0x0b, 0x44, 0x2b, 0xf2, 0xfb, 0x4e, 0xf5, 0x56, 0xa8, 0x7c, 0x03, 0x3a, 0x6b, 0xee,
0x0f, 0xd9, 0x03, 0xf0, 0xf8, 0x34, 0xf7, 0xc5, 0xa9, 0x87, 0x0f, 0xf2, 0xb5, 0xe3, 0x2f, 0x3e,
0x0a, 0xfa, 0x6a, 0x47, 0xa0, 0x1f, 0x43, 0x37, 0xf3, 0xb0, 0x47, 0xad, 0x31, 0xea, 0xd7, 0x3f,
0xb3, 0x66, 0xff, 0x39, 0x06, 0x4f, 0x16, 0x2c, 0x2b, 0xde, 0x51, 0xa0, 0xf5, 0x69, 0x81, 0xa8,
0xfa, 0xc1, 0xc5, 0xec, 0x05, 0xb5, 0x25, 0x33, 0xcd, 0xee, 0x37, 0x09, 0x91, 0xd9, 0x3f, 0x42,
0xea, 0xbf, 0x5c, 0xec, 0x5f, 0x93, 0xe2, 0x05, 0xed, 0xc2, 0x02, 0x7b, 0xee, 0x83, 0x9e, 0x55,
0x1f, 0xc2, 0xa4, 0x9e, 0x02, 0xf5, 0x67, 0x3d, 0x18, 0x0a, 0x27, 0x4e, 0x44, 0xe8, 0xff, 0x01,
0x74, 0x18, 0x28, 0x66, 0xd0, 0x13, 0x9c, 0x7c, 0x17, 0x6a, 0xd4, 0xb5, 0x23, 0xe5, 0x81, 0x42,
0xfa, 0x51, 0x4f, 0x7f, 0xf6, 0x3b, 0x9e, 0x84, 0xe2, 0x26, 0x1d, 0xc9, 0xaa, 0x3a, 0x4f, 0x72,
0xea, 0x1b, 0x25, 0xf4, 0x03, 0x68, 0xb3, 0xc9, 0x05, 0x37, 0x9e, 0x24, 0xe5, 0x43, 0x58, 0x4e,
0x51, 0xfe, 0x34, 0x50, 0xdc, 0x28, 0xfd, 0x3f, 0x8f, 0xee, 0x3f, 0xa5, 0x8f, 0x6a, 0xb2, 0xd7,
0xc6, 0xd0, 0xfa, 0xe9, 0xee, 0xbe, 0xf5, 0xaf, 0x17, 0xee, 0x1f, 0x63, 0xfe, 0x11, 0x68, 0xd9,
0xa3, 0x42, 0xf4, 0xd2, 0x34, 0x5f, 0xa2, 0xc2, 0x39, 0xc3, 0x91, 0x7c, 0x0f, 0x16, 0x58, 0x8d,
0x58, 0x6d, 0x80, 0x52, 0xfd, 0x78, 0xc6, 0x5c, 0x77, 0xbe, 0xf5, 0xd1, 0xc6, 0xc8, 0x8e, 0x0e,
0x26, 0x7b, 0xa4, 0xe5, 0x3a, 0xeb, 0xfa, 0x8a, 0xed, 0xf3, 0x5f, 0xd7, 0x85, 0x2c, 0xaf, 0xd3,
0xd1, 0xd7, 0x29, 0x82, 0xf1, 0xde, 0xde, 0x02, 0xfd, 0xbc, 0xf9, 0x7f, 0x01, 0x00, 0x00, 0xff,
0xff, 0x58, 0xcf, 0x74, 0x0f, 0x02, 0x54, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -236,6 +236,7 @@ func (broker *CoordinatorBroker) GetIndexInfo(ctx context.Context, collectionID
IndexSize: int64(info.GetSerializedSize()),
IndexVersion: info.GetIndexVersion(),
NumRows: info.GetNumRows(),
IndexEngineVersion: info.GetIndexEngineVersion(),
})
}

View File

@ -87,6 +87,10 @@ func (li *LoadIndexInfo) appendLoadIndexInfo(indexInfo *querypb.FieldIndexInfo,
}
}
if err := li.appendIndexEngineVersion(indexInfo.GetIndexEngineVersion()); err != nil {
return err
}
err = li.appendIndexData(indexPaths)
return err
}
@ -148,3 +152,11 @@ func (li *LoadIndexInfo) appendIndexData(indexKeys []string) error {
status := C.AppendIndexV2(li.cLoadIndexInfo)
return HandleCStatus(&status, "AppendIndex failed")
}
func (li *LoadIndexInfo) appendIndexEngineVersion(indexEngineVersion string) error {
cIndexEngineVersion := C.CString(indexEngineVersion)
defer C.free(unsafe.Pointer(cIndexEngineVersion))
status := C.AppendIndexEngineVersionToLoadInfo(li.cLoadIndexInfo, cIndexEngineVersion)
return HandleCStatus(&status, "AppendIndexEngineVersion failed")
}

View File

@ -673,6 +673,7 @@ func (loader *segmentLoader) loadFieldsIndex(ctx context.Context,
zap.Int64("segment", segment.segmentID),
zap.Int64("fieldID", fieldID),
zap.Any("binlog", fieldInfo.FieldBinlog.Binlogs),
zap.String("index_engine_version", fieldInfo.IndexInfo.GetIndexEngineVersion()),
)
segment.AddIndex(fieldID, fieldInfo)

View File

@ -150,3 +150,11 @@ func (bi *BuildIndexInfo) AppendInsertFile(filePath string) error {
status := C.AppendInsertFilePath(bi.cBuildIndexInfo, cInsertFilePath)
return HandleCStatus(&status, "appendInsertFile failed")
}
func (bi *BuildIndexInfo) AppendIndexEngineVersion(indexEngineVersion string) error {
cIndexEngineVersion := C.CString(indexEngineVersion)
defer C.free(unsafe.Pointer(cIndexEngineVersion))
status := C.AppendIndexEngineVersionToBuildInfo(bi.cBuildIndexInfo, cIndexEngineVersion)
return HandleCStatus(&status, "AppendIndexEngineVersion failed")
}

View File

@ -216,6 +216,8 @@ type commonConfig struct {
EnableLockMetrics ParamItem `refreshable:"false"`
LockSlowLogInfoThreshold ParamItem `refreshable:"true"`
LockSlowLogWarnThreshold ParamItem `refreshable:"true"`
IndexEngineVersion ParamItem `refreshable:"true"`
}
func (p *commonConfig) init(base *BaseTable) {
@ -612,6 +614,15 @@ like the old password verification when updating the credential`,
Export: true,
}
p.LockSlowLogWarnThreshold.Init(base.mgr)
p.IndexEngineVersion = ParamItem{
Key: "common.indexEngineVersion",
Version: "2.3.2",
DefaultValue: "knowhere-v0",
Doc: "version of index engine",
Export: true,
}
p.IndexEngineVersion.Init(base.mgr)
}
type traceConfig struct {

View File

@ -105,8 +105,9 @@ BUILD_DISK_ANN="OFF"
USE_ASAN="OFF"
OPEN_SIMD="OFF"
USE_DYNAMIC_SIMD="OFF"
INDEX_ENGINE="KNOWHERE"
while getopts "p:d:t:s:f:n:i:y:a:ulrcghzmebZ" arg; do
while getopts "p:d:t:s:f:n:i:y:a:x:ulrcghzmebZ" arg; do
case $arg in
f)
CUSTOM_THIRDPARTY_PATH=$OPTARG
@ -170,6 +171,9 @@ while getopts "p:d:t:s:f:n:i:y:a:ulrcghzmebZ" arg; do
Z)
BUILD_WITHOUT_AZURE="on"
;;
x)
INDEX_ENGINE=$OPTARG
;;
h) # help
echo "
@ -290,8 +294,9 @@ ${CMAKE_EXTRA_ARGS} \
-DBUILD_DISK_ANN=${BUILD_DISK_ANN} \
-DUSE_ASAN=${USE_ASAN} \
-DOPEN_SIMD=${OPEN_SIMD} \
-DUSE_DYNAMIC_SIMD=${USE_DYNAMIC_SIMD}
-DCPU_ARCH=${CPU_ARCH} "
-DUSE_DYNAMIC_SIMD=${USE_DYNAMIC_SIMD} \
-DCPU_ARCH=${CPU_ARCH} \
-DINDEX_ENGINE=${INDEX_ENGINE} "
if [ -z "$BUILD_WITHOUT_AZURE" ]; then
CMAKE_CMD=${CMAKE_CMD}"-DAZURE_BUILD_DIR=${AZURE_BUILD_DIR} \
-DVCPKG_TARGET_TRIPLET=${VCPKG_TARGET_TRIPLET} "

View File

@ -0,0 +1,4 @@
extraConfigFiles:
user.yaml: |+
common:
indexEngineVersion: "cardinal-v0"