diff --git a/c_src/duckdb/duckdb.cpp b/c_src/duckdb/duckdb.cpp index 9e6d70c..49edac5 100644 --- a/c_src/duckdb/duckdb.cpp +++ b/c_src/duckdb/duckdb.cpp @@ -380,6 +380,7 @@ struct CreateIndexInfo : public CreateInfo { public: DUCKDB_API unique_ptr Copy() const override; + string ToString() const override; void Serialize(Serializer &serializer) const override; static unique_ptr Deserialize(Deserializer &deserializer); }; @@ -572,7 +573,7 @@ class MacroFunction { namespace duckdb { struct CreateMacroInfo : public CreateFunctionInfo { - CreateMacroInfo(CatalogType type); + explicit CreateMacroInfo(CatalogType type); unique_ptr function; @@ -765,7 +766,7 @@ class ColumnList { class ColumnListIterator; public: - DUCKDB_API ColumnList(bool allow_duplicate_names = false); + DUCKDB_API explicit ColumnList(bool allow_duplicate_names = false); DUCKDB_API explicit ColumnList(vector columns, bool allow_duplicate_names = false); DUCKDB_API void AddColumn(ColumnDefinition column); @@ -792,7 +793,7 @@ class ColumnList { idx_t PhysicalColumnCount() const { return physical_columns.size(); } - bool empty() const { + bool empty() const { // NOLINT: match stl API return columns.empty(); } @@ -864,10 +865,10 @@ class ColumnList { return physical ? list.PhysicalColumnCount() : list.LogicalColumnCount(); } - ColumnLogicalIteratorInternal begin() { + ColumnLogicalIteratorInternal begin() { // NOLINT: match stl API return ColumnLogicalIteratorInternal(list, physical, 0, Size()); } - ColumnLogicalIteratorInternal end() { + ColumnLogicalIteratorInternal end() { // NOLINT: match stl API return ColumnLogicalIteratorInternal(list, physical, Size(), Size()); } }; @@ -1411,8 +1412,8 @@ class ObjectCache { return std::static_pointer_cast(object); } - template - shared_ptr GetOrCreate(const string &key, Args &&...args) { + template + shared_ptr GetOrCreate(const string &key, ARGS &&... args) { lock_guard glock(lock); auto entry = cache.find(key); @@ -1430,7 +1431,7 @@ class ObjectCache { void Put(string key, shared_ptr value) { lock_guard glock(lock); - cache[key] = std::move(value); + cache.insert(make_pair(std::move(key), std::move(value))); } void Delete(const string &key) { @@ -1567,7 +1568,7 @@ struct StrTimeFormat { DUCKDB_API virtual void AddFormatSpecifier(string preceding_literal, StrTimeSpecifier specifier); }; -struct StrfTimeFormat : public StrTimeFormat { +struct StrfTimeFormat : public StrTimeFormat { // NOLINT: work-around bug in clang-tidy DUCKDB_API idx_t GetLength(date_t date, dtime_t time, int32_t utc_offset, const char *tz_name); DUCKDB_API void FormatString(date_t date, int32_t data[8], const char *tz_name, char *target); @@ -1600,7 +1601,7 @@ struct StrfTimeFormat : public StrTimeFormat { char *target); }; -struct StrpTimeFormat : public StrTimeFormat { +struct StrpTimeFormat : public StrTimeFormat { // NOLINT: work-around bug in clang-tidy public: StrpTimeFormat(); @@ -1609,15 +1610,17 @@ struct StrpTimeFormat : public StrTimeFormat { int32_t data[8]; // year, month, day, hour, min, sec, µs, offset string tz; string error_message; - idx_t error_position = DConstants::INVALID_INDEX; + optional_idx error_position; bool is_special; date_t special; date_t ToDate(); + dtime_t ToTime(); timestamp_t ToTimestamp(); bool TryToDate(date_t &result); + bool TryToTime(dtime_t &result); bool TryToTimestamp(timestamp_t &result); DUCKDB_API string FormatError(string_t input, const string &format_specifier); @@ -1632,16 +1635,14 @@ struct StrpTimeFormat : public StrTimeFormat { DUCKDB_API bool Parse(string_t str, ParseResult &result) const; DUCKDB_API bool TryParseDate(string_t str, date_t &result, string &error_message) const; + DUCKDB_API bool TryParseTime(string_t str, dtime_t &result, string &error_message) const; DUCKDB_API bool TryParseTimestamp(string_t str, timestamp_t &result, string &error_message) const; - date_t ParseDate(string_t str); - timestamp_t ParseTimestamp(string_t str); - void Serialize(Serializer &serializer) const; static StrpTimeFormat Deserialize(Deserializer &deserializer); protected: - static string FormatStrpTimeError(const string &input, idx_t position); + static string FormatStrpTimeError(const string &input, optional_idx position); DUCKDB_API void AddFormatSpecifier(string preceding_literal, StrTimeSpecifier specifier) override; int NumericSpecifierWidth(StrTimeSpecifier specifier); int32_t TryParseCollection(const char *data, idx_t &pos, idx_t size, const string_t collection[], @@ -1668,10 +1669,12 @@ class Deserializer; //! Wrapper for CSV Options that can be manually set by the user //! It is important to make this difference for options that can be automatically sniffed AND manually set. template -struct CSVOption { +struct CSVOption { // NOLINT: work-around bug in clang-tidy public: - CSVOption(T value_p) : value(value_p) {}; - CSVOption(T value_p, bool set_by_user_p) : value(value_p), set_by_user(set_by_user_p) {}; + CSVOption(T value_p) : value(value_p) { // NOLINT: allow implicit conversion from value + } + CSVOption(T value_p, bool set_by_user_p) : value(value_p), set_by_user(set_by_user_p) { + } CSVOption() {}; //! Sets value. @@ -1717,7 +1720,7 @@ struct CSVOption { return value != other; } //! Returns CSV Option value - const T GetValue() const { + inline const T GetValue() const { return value; } bool IsSetByUser() const { @@ -2003,6 +2006,7 @@ struct ClientData { public: DUCKDB_API static ClientData &Get(ClientContext &context); + DUCKDB_API static const ClientData &Get(const ClientContext &context); }; } // namespace duckdb @@ -2202,6 +2206,8 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"fuzzyduck", "sqlsmith", CatalogType::TABLE_FUNCTION_ENTRY}, {"get_substrait", "substrait", CatalogType::TABLE_FUNCTION_ENTRY}, {"get_substrait_json", "substrait", CatalogType::TABLE_FUNCTION_ENTRY}, + {"hnsw_compact_index", "vss", CatalogType::PRAGMA_FUNCTION_ENTRY}, + {"hnsw_index_scan", "vss", CatalogType::TABLE_FUNCTION_ENTRY}, {"host", "inet", CatalogType::SCALAR_FUNCTION_ENTRY}, {"iceberg_metadata", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, {"iceberg_scan", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, @@ -2243,9 +2249,11 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"pg_clear_cache", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"pg_timezone_names", "icu", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_attach", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, + {"postgres_execute", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_query", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_scan", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_scan_pushdown", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, + {"pragma_hnsw_index_info", "vss", CatalogType::TABLE_FUNCTION_ENTRY}, {"read_json", "json", CatalogType::TABLE_FUNCTION_ENTRY}, {"read_json_auto", "json", CatalogType::TABLE_FUNCTION_ENTRY}, {"read_json_objects", "json", CatalogType::TABLE_FUNCTION_ENTRY}, @@ -2283,6 +2291,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"st_dimension", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_disjoint", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_distance", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, + {"st_distance_sphere", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_distance_spheroid", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_drivers", "spatial", CatalogType::TABLE_FUNCTION_ENTRY}, {"st_dump", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -2305,6 +2314,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"st_geomfromhexwkb", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_geomfromtext", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_geomfromwkb", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, + {"st_hilbert", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_intersection", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_intersection_agg", "spatial", CatalogType::AGGREGATE_FUNCTION_ENTRY}, {"st_intersects", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -2352,6 +2362,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"st_reduceprecision", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_removerepeatedpoints", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_reverse", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, + {"st_shortestline", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_simplify", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_simplifypreservetopology", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_startpoint", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -2412,6 +2423,7 @@ static constexpr ExtensionEntry EXTENSION_SETTINGS[] = { {"pg_experimental_filter_pushdown", "postgres_scanner"}, {"pg_pages_per_task", "postgres_scanner"}, {"pg_use_binary_copy", "postgres_scanner"}, + {"pg_use_ctid_scan", "postgres_scanner"}, {"s3_access_key_id", "httpfs"}, {"s3_endpoint", "httpfs"}, {"s3_region", "httpfs"}, @@ -2522,6 +2534,7 @@ struct ExtensionAlias { struct ExtensionInitResult { string filename; string filebase; + string extension_version; void *lib_hdl; }; @@ -2680,7 +2693,7 @@ namespace duckdb { struct CreatePragmaFunctionInfo : public CreateFunctionInfo { DUCKDB_API explicit CreatePragmaFunctionInfo(PragmaFunction function); - DUCKDB_API CreatePragmaFunctionInfo(string name, PragmaFunctionSet functions_); + DUCKDB_API CreatePragmaFunctionInfo(string name, PragmaFunctionSet functions); PragmaFunctionSet functions; @@ -2737,6 +2750,7 @@ struct CreatePragmaFunctionInfo : public CreateFunctionInfo { + namespace duckdb { class Serializer; // Forward declare @@ -2749,6 +2763,7 @@ const field_id_t MESSAGE_TERMINATOR_FIELD_ID = 0xFFFF; template using void_t = void; +// NOLINTBEGIN: match STL case // Check for anything implementing a `void Serialize(Serializer &Serializer)` method template struct has_serialize : std::false_type {}; @@ -2870,6 +2885,8 @@ struct is_atomic> : std::true_type { typedef T TYPE; }; +// NOLINTEND + struct SerializationDefaultValue { template @@ -2983,6 +3000,16 @@ struct SerializationDefaultValue { static inline bool IsDefault(const typename std::enable_if::value, T>::type &value) { return value.empty(); } + + template + static inline typename std::enable_if::value, T>::type GetDefault() { + return optional_idx(); + } + + template + static inline bool IsDefault(const typename std::enable_if::value, T>::type &value) { + return !value.IsValid(); + } }; } // namespace duckdb @@ -3105,7 +3132,7 @@ struct DeserializationData { stack> databases; stack enums; stack> parameter_data; - stack> types; + stack> types; template void Set(T entry) = delete; @@ -3194,7 +3221,7 @@ inline void DeserializationData::Unset() { template <> inline void DeserializationData::Set(ClientContext &context) { - contexts.push(context); + contexts.emplace(context); } template <> @@ -3211,7 +3238,7 @@ inline void DeserializationData::Unset() { template <> inline void DeserializationData::Set(DatabaseInstance &db) { - databases.push(db); + databases.emplace(db); } template <> @@ -3228,7 +3255,7 @@ inline void DeserializationData::Unset() { template <> inline void DeserializationData::Set(bound_parameter_map_t &context) { - parameter_data.push(context); + parameter_data.emplace(context); } template <> @@ -3249,13 +3276,24 @@ inline void DeserializationData::Set(LogicalType &type) { } template <> -inline LogicalType &DeserializationData::Get() { +inline void DeserializationData::Unset() { + AssertNotEmpty(types); + types.pop(); +} + +template <> +inline void DeserializationData::Set(const LogicalType &type) { + types.emplace(type); +} + +template <> +inline const LogicalType &DeserializationData::Get() { AssertNotEmpty(types); return types.top(); } template <> -inline void DeserializationData::Unset() { +inline void DeserializationData::Unset() { AssertNotEmpty(types); types.pop(); } @@ -3317,6 +3355,9 @@ struct CSVFileHandle { bool CanSeek(); void Seek(idx_t position); bool OnDiskFile(); + bool IsPipe(); + + void Reset(); idx_t FileSize(); @@ -3339,6 +3380,8 @@ struct CSVFileHandle { string path; bool can_seek = false; bool on_disk_file = false; + bool is_pipe = false; + idx_t file_size = 0; idx_t requested_bytes = 0; @@ -3588,7 +3631,6 @@ class BufferManager { } public: - static unique_ptr CreateStandardBufferManager(DatabaseInstance &db, DBConfig &config); virtual BufferHandle Allocate(MemoryTag tag, idx_t block_size, bool can_destroy = true, shared_ptr *block = nullptr) = 0; //! Reallocate an in-memory buffer that is pinned. @@ -3608,9 +3650,8 @@ class BufferManager { //! blocks can be evicted virtual void SetLimit(idx_t limit = (idx_t)-1); virtual vector GetTemporaryFiles(); - virtual const string &GetTemporaryDirectory(); + virtual const string &GetTemporaryDirectory() const; virtual void SetTemporaryDirectory(const string &new_dir); - virtual DatabaseInstance &GetDatabase(); virtual bool HasTemporaryDirectory() const; //! Construct a managed buffer. virtual unique_ptr ConstructManagedBuffer(idx_t size, unique_ptr &&source, @@ -3622,7 +3663,9 @@ class BufferManager { // Static methods DUCKDB_API static BufferManager &GetBufferManager(DatabaseInstance &db); + DUCKDB_API static const BufferManager &GetBufferManager(const DatabaseInstance &db); DUCKDB_API static BufferManager &GetBufferManager(ClientContext &context); + DUCKDB_API static const BufferManager &GetBufferManager(const ClientContext &context); DUCKDB_API static BufferManager &GetBufferManager(AttachedDatabase &db); static idx_t GetAllocSize(idx_t block_size) { @@ -3682,7 +3725,7 @@ struct BufferPoolReservation { ~BufferPoolReservation(); void Resize(idx_t new_size); - void Merge(BufferPoolReservation &&src); + void Merge(BufferPoolReservation src); }; struct TempBufferPoolReservation : BufferPoolReservation { @@ -3785,16 +3828,17 @@ namespace duckdb { class CSVBufferHandle { public: - CSVBufferHandle(BufferHandle handle_p, idx_t actual_size_p, const bool is_final_buffer_p, idx_t file_idx_p, - idx_t buffer_index_p) - : handle(std::move(handle_p)), actual_size(actual_size_p), is_last_buffer(is_final_buffer_p), - file_idx(file_idx_p), buffer_idx(buffer_index_p) {}; - CSVBufferHandle() : actual_size(0), is_last_buffer(false), file_idx(0), buffer_idx(0) {}; + CSVBufferHandle(BufferHandle handle_p, idx_t actual_size_p, idx_t requested_size_p, const bool is_final_buffer_p, + idx_t file_idx_p, idx_t buffer_index_p) + : handle(std::move(handle_p)), actual_size(actual_size_p), requested_size(requested_size_p), + is_last_buffer(is_final_buffer_p), file_idx(file_idx_p), buffer_idx(buffer_index_p) {}; + CSVBufferHandle() : actual_size(0), requested_size(0), is_last_buffer(false), file_idx(0), buffer_idx(0) {}; ~CSVBufferHandle() { } //! Handle created during allocation BufferHandle handle; const idx_t actual_size; + const idx_t requested_size; const bool is_last_buffer; const idx_t file_idx; const idx_t buffer_idx; @@ -3853,13 +3897,15 @@ class CSVBuffer { ClientContext &context; //! Actual size can be smaller than the buffer size in case we allocate it too optimistically. idx_t actual_buffer_size; + idx_t requested_size; //! Global position from the CSV File where this buffer starts idx_t global_csv_start = 0; //! Number of the file that is in this buffer idx_t file_number = 0; //! If we can seek in the file or not. - //! If we can't seek, this means we can't destroy the buffers bool can_seek; + //! If this file is being fed by a pipe. + bool is_pipe; //! Buffer Index, used as a batch index for insertion-order preservation idx_t buffer_idx = 0; //! -------- Allocated Block ---------// @@ -4161,7 +4207,7 @@ class PartitionedColumnData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -4328,7 +4374,7 @@ class ExpressionExecutor { private: // it is possible to create an expression executor without a ClientContext - but it should be avoided DUCKDB_API ExpressionExecutor(); - DUCKDB_API ExpressionExecutor(const vector> &exprs); + DUCKDB_API explicit ExpressionExecutor(const vector> &exprs); }; } // namespace duckdb @@ -4453,14 +4499,13 @@ class Index; class ConflictInfo { public: - ConflictInfo(const unordered_set &column_ids, bool only_check_unique = true) + explicit ConflictInfo(const unordered_set &column_ids, bool only_check_unique = true) : column_ids(column_ids), only_check_unique(only_check_unique) { } const unordered_set &column_ids; public: bool ConflictTargetMatches(Index &index) const; - void VerifyAllConflictsMeetCondition() const; public: bool only_check_unique = true; @@ -4566,6 +4611,7 @@ struct IndexInfo { + namespace duckdb { //! Column segment information @@ -4590,7 +4636,7 @@ struct ColumnSegmentInfo { class TableStorageInfo { public: //! The (estimated) cardinality of the table - idx_t cardinality = DConstants::INVALID_INDEX; + optional_idx cardinality; //! Info of the indexes of a table vector index_info; }; @@ -4741,7 +4787,7 @@ class Index { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -4827,8 +4873,8 @@ namespace duckdb { class SegmentStatistics { public: - SegmentStatistics(LogicalType type); - SegmentStatistics(BaseStatistics statistics); + explicit SegmentStatistics(LogicalType type); + explicit SegmentStatistics(BaseStatistics statistics); //! Type-specific statistics of the segment BaseStatistics statistics; @@ -4949,7 +4995,7 @@ class RowGroup; struct SelectionVector; class Transaction; struct TransactionData; - +struct DeleteInfo; class Serializer; class Deserializer; @@ -5064,7 +5110,7 @@ class ChunkVectorInfo : public ChunkInfo { //! Note that "rows" is written to to reflect the row ids that were actually deleted //! i.e. after calling this function, rows will hold [0..actual_delete_count] row ids of the actually deleted tuples idx_t Delete(transaction_t transaction_id, row_t rows[], idx_t count); - void CommitDelete(transaction_t commit_id, row_t rows[], idx_t count); + void CommitDelete(transaction_t commit_id, const DeleteInfo &info); bool HasDeletes() const override; @@ -5166,7 +5212,7 @@ class RowGroup : public SegmentBase { public: RowGroup(RowGroupCollection &collection, idx_t start, idx_t count); - RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer); + RowGroup(RowGroupCollection &collection, RowGroupPointer pointer); ~RowGroup(); private: @@ -5314,7 +5360,7 @@ struct ColumnSegmentState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -5371,7 +5417,7 @@ struct AnalyzeState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -5387,7 +5433,7 @@ struct CompressionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -5408,7 +5454,7 @@ struct CompressedSegmentState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -5428,7 +5474,7 @@ struct CompressionAppendState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -5779,8 +5825,9 @@ class TableIndexList { void CommitDrop(const string &name); //! Returns true, if the index name does not exist bool NameIsUnique(const string &name); - //! Initializes unknown indexes that might now be present after an extension load - void InitializeIndexes(ClientContext &context, DataTableInfo &table_info); + //! Initializes unknown indexes that might now be present after an extension load, optionally throwing an exception + //! if a index cant be initialized + void InitializeIndexes(ClientContext &context, DataTableInfo &table_info, bool throw_on_failure = false); bool Empty(); idx_t Count(); void Move(TableIndexList &other); @@ -5808,8 +5855,9 @@ class TableIOManager; struct DataTableInfo { DataTableInfo(AttachedDatabase &db, shared_ptr table_io_manager_p, string schema, string table); - //! Initialize any unknown indexes whose types might now be present after an extension load - void InitializeIndexes(ClientContext &context); + //! Initialize any unknown indexes whose types might now be present after an extension load, optionally throwing an + //! exception if an index can't be initialized + void InitializeIndexes(ClientContext &context, bool throw_on_failure = false); //! The database instance of the table AttachedDatabase &db; @@ -5890,7 +5938,7 @@ class ClientContext; struct RandomState; struct RandomEngine { - RandomEngine(int64_t seed = -1); + explicit RandomEngine(int64_t seed = -1); ~RandomEngine(); public: @@ -6048,7 +6096,7 @@ class Deserializer; class TableStatisticsLock { public: - TableStatisticsLock(mutex &l) : guard(l) { + explicit TableStatisticsLock(mutex &l) : guard(l) { } lock_guard guard; @@ -6247,7 +6295,7 @@ struct SegmentLock { public: SegmentLock() { } - SegmentLock(mutex &lock) : lock(lock) { + explicit SegmentLock(mutex &lock) : lock(lock) { } // disable copy constructors SegmentLock(const SegmentLock &other) = delete; @@ -6576,10 +6624,10 @@ class SegmentTree { }; public: - SegmentIterator begin() { + SegmentIterator begin() { // NOLINT: match stl API return SegmentIterator(tree, tree.GetRootSegment()); } - SegmentIterator end() { + SegmentIterator end() { // NOLINT: match stl API return SegmentIterator(tree, nullptr); } }; @@ -6605,8 +6653,8 @@ class SegmentTree { if (!SUPPORTS_LAZY_LOADING) { return; } - while (LoadNextSegment(l)) - ; + while (LoadNextSegment(l)) { + } } }; @@ -6780,7 +6828,7 @@ class PartialBlockManager; class OptimisticDataWriter { public: - OptimisticDataWriter(DataTable &table); + explicit OptimisticDataWriter(DataTable &table); OptimisticDataWriter(DataTable &table, OptimisticDataWriter &parent); ~OptimisticDataWriter(); @@ -7302,7 +7350,7 @@ struct BoundOrderByNode; class StatisticsPropagator { public: - explicit StatisticsPropagator(Optimizer &optimizer); + StatisticsPropagator(Optimizer &optimizer, LogicalOperator &root); unique_ptr PropagateStatistics(unique_ptr &node_ptr); @@ -7312,23 +7360,23 @@ class StatisticsPropagator { private: //! Propagate statistics through an operator - unique_ptr PropagateStatistics(LogicalOperator &node, unique_ptr *node_ptr); - - unique_ptr PropagateStatistics(LogicalFilter &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalGet &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalJoin &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalPositionalJoin &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalProjection &op, unique_ptr *node_ptr); - void PropagateStatistics(LogicalComparisonJoin &op, unique_ptr *node_ptr); - void PropagateStatistics(LogicalAnyJoin &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalSetOperation &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalAggregate &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalCrossProduct &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalLimit &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalOrder &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalWindow &op, unique_ptr *node_ptr); - - unique_ptr PropagateChildren(LogicalOperator &node, unique_ptr *node_ptr); + unique_ptr PropagateStatistics(LogicalOperator &node, unique_ptr &node_ptr); + + unique_ptr PropagateStatistics(LogicalFilter &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalGet &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalJoin &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalPositionalJoin &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalProjection &op, unique_ptr &node_ptr); + void PropagateStatistics(LogicalComparisonJoin &op, unique_ptr &node_ptr); + void PropagateStatistics(LogicalAnyJoin &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalSetOperation &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalAggregate &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalCrossProduct &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalLimit &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalOrder &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalWindow &op, unique_ptr &node_ptr); + + unique_ptr PropagateChildren(LogicalOperator &node, unique_ptr &node_ptr); //! Return statistics from a constant value unique_ptr StatisticsFromValue(const Value &input); @@ -7361,18 +7409,18 @@ class StatisticsPropagator { const BaseStatistics &stats_before, const BaseStatistics &stats_after); unique_ptr PropagateExpression(unique_ptr &expr); - unique_ptr PropagateExpression(Expression &expr, unique_ptr *expr_ptr); - - unique_ptr PropagateExpression(BoundAggregateExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundBetweenExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundCaseExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundCastExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundConjunctionExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundFunctionExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundComparisonExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundConstantExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundColumnRefExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundOperatorExpression &expr, unique_ptr *expr_ptr); + unique_ptr PropagateExpression(Expression &expr, unique_ptr &expr_ptr); + + unique_ptr PropagateExpression(BoundAggregateExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundBetweenExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundCaseExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundCastExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundConjunctionExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundFunctionExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundComparisonExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundConstantExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundColumnRefExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundOperatorExpression &expr, unique_ptr &expr_ptr); void ReplaceWithEmptyResult(unique_ptr &node); @@ -7382,6 +7430,8 @@ class StatisticsPropagator { private: Optimizer &optimizer; ClientContext &context; + //! The root of the query plan + optional_ptr root; //! The map of ColumnBinding -> statistics for the various nodes column_binding_map_t> statistics_map; //! Node stats for the current node @@ -7423,6 +7473,8 @@ class ExpressionIterator { class BoundNodeVisitor { public: + virtual ~BoundNodeVisitor() = default; + virtual void VisitBoundQueryNode(BoundQueryNode &op); virtual void VisitBoundTableRef(BoundTableRef &ref); virtual void VisitExpression(unique_ptr &expression); @@ -7474,6 +7526,19 @@ class BoundNodeVisitor { // "(?i)hello" -- (?i) turns on case-insensitive matching // "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible // +// The double backslashes are needed when writing C++ string literals. +// However, they should NOT be used when writing C++11 raw string literals: +// +// R"(hello (\w+) world)" -- \w matches a "word" character +// R"(version (\d+))" -- \d matches a digit +// R"(hello\s+world)" -- \s matches any whitespace character +// R"(\b(\w+)\b)" -- \b matches non-empty string at word boundary +// R"((?i)hello)" -- (?i) turns on case-insensitive matching +// R"(/\*(.*?)\*/)" -- .*? matches . minimum no. of times possible +// +// When using UTF-8 encoding, case-insensitive matching will perform +// simple case folding, not full case folding. +// // ----------------------------------------------------------------------- // MATCHING INTERFACE: // @@ -7497,17 +7562,17 @@ class BoundNodeVisitor { // CHECK(RE2::FullMatch(latin1_string, RE2(latin1_pattern, RE2::Latin1))); // // ----------------------------------------------------------------------- -// MATCHING WITH SUBSTRING EXTRACTION: +// SUBMATCH EXTRACTION: // -// You can supply extra pointer arguments to extract matched substrings. +// You can supply extra pointer arguments to extract submatches. // On match failure, none of the pointees will have been modified. -// On match success, the substrings will be converted (as necessary) and +// On match success, the submatches will be converted (as necessary) and // their values will be assigned to their pointees until all conversions // have succeeded or one conversion has failed. // On conversion failure, the pointees will be in an indeterminate state // because the caller has no way of knowing which conversion failed. // However, conversion cannot fail for types like string and StringPiece -// that do not inspect the substring contents. Hence, in the common case +// that do not inspect the submatch contents. Hence, in the common case // where all of the pointees are of such types, failure is always due to // match failure and thus none of the pointees will have been modified. // @@ -7531,10 +7596,10 @@ class BoundNodeVisitor { // Example: integer overflow causes failure // CHECK(!RE2::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i)); // -// NOTE(rsc): Asking for substrings slows successful matches quite a bit. +// NOTE(rsc): Asking for submatches slows successful matches quite a bit. // This may get a little faster in the future, but right now is slower // than PCRE. On the other hand, failed matches run *very* fast (faster -// than PCRE), as do matches without substring extraction. +// than PCRE), as do matches without submatch extraction. // // ----------------------------------------------------------------------- // PARTIAL MATCHES @@ -7639,6 +7704,12 @@ class BoundNodeVisitor { #include #include #include +#include +#include + +#if defined(__APPLE__) +#include +#endif @@ -7671,18 +7742,13 @@ class BoundNodeVisitor { // // Arghh! I wish C++ literals were "string". -// Doing this simplifies the logic below. -#ifndef __has_include -#define __has_include(x) 0 -#endif - #include #include #include #include #include #include -#if __has_include() && __cplusplus >= 201703L +#ifdef __cpp_lib_string_view #include #endif @@ -7709,7 +7775,7 @@ class StringPiece { // expected. StringPiece() : data_(NULL), size_(0) {} -#if __has_include() && __cplusplus >= 201703L +#ifdef __cpp_lib_string_view StringPiece(const std::string_view& str) : data_(str.data()), size_(str.size()) {} #endif @@ -7755,6 +7821,14 @@ class StringPiece { size_ = len; } +#ifdef __cpp_lib_string_view + // Converts to `std::basic_string_view`. + operator std::basic_string_view() const { + if (!data_) return {}; + return std::basic_string_view(data_, size_); + } +#endif + // Converts to `std::basic_string`. template explicit operator std::basic_string() const { @@ -7857,7 +7931,7 @@ inline bool operator>=(const StringPiece& x, const StringPiece& y) { // Allow StringPiece to be logged. std::ostream& operator<<(std::ostream& o, const StringPiece& p); -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_STRINGPIECE_H_ @@ -7868,7 +7942,7 @@ std::ostream& operator<<(std::ostream& o, const StringPiece& p); namespace duckdb_re2 { class Prog; class Regexp; -} // namespace duckdb_re2 +} // namespace re2 namespace duckdb_re2 { @@ -7896,6 +7970,7 @@ class RE2 { ErrorBadCharRange, // bad character class range ErrorMissingBracket, // missing closing ] ErrorMissingParen, // missing closing ) + ErrorUnexpectedParen, // unexpected closing ) ErrorTrailingBackslash, // trailing \ at end of regexp ErrorRepeatArgument, // repeat argument missing, e.g. "*" ErrorRepeatSize, // bad repetition argument @@ -7921,21 +7996,33 @@ class RE2 { // Need to have the const char* and const std::string& forms for implicit // conversions when passing string literals to FullMatch and PartialMatch. // Otherwise the StringPiece form would be sufficient. -#ifndef SWIG RE2(const char* pattern); RE2(const std::string& pattern); -#endif RE2(const StringPiece& pattern); RE2(const StringPiece& pattern, const Options& options); ~RE2(); + // Not copyable. + // RE2 objects are expensive. You should probably use std::shared_ptr + // instead. If you really must copy, RE2(first.pattern(), first.options()) + // effectively does so: it produces a second object that mimics the first. + RE2(const RE2&) = delete; + RE2& operator=(const RE2&) = delete; + // Not movable. + // RE2 objects are thread-safe and logically immutable. You should probably + // use std::unique_ptr instead. Otherwise, consider std::deque if + // direct emplacement into a container is desired. If you really must move, + // be prepared to submit a design document along with your feature request. + RE2(RE2&&) = delete; + RE2& operator=(RE2&&) = delete; + // Returns whether RE2 was created properly. bool ok() const { return error_code() == NoError; } // The string specification for this RE2. E.g. // RE2 re("ab*c?d+"); // re.pattern(); // "ab*c?d+" - const std::string& pattern() const { return pattern_; } + const std::string& pattern() const { return *pattern_; } // If RE2 could not be created properly, returns an error string. // Else returns the empty string. @@ -7947,18 +8034,18 @@ class RE2 { // If RE2 could not be created properly, returns the offending // portion of the regexp. - const std::string& error_arg() const { return error_arg_; } + const std::string& error_arg() const { return *error_arg_; } // Returns the program size, a very approximate measure of a regexp's "cost". // Larger numbers are more expensive than smaller numbers. int ProgramSize() const; int ReverseProgramSize() const; - // EXPERIMENTAL! SUBJECT TO CHANGE! - // Outputs the program fanout as a histogram bucketed by powers of 2. + // If histogram is not null, outputs the program fanout + // as a histogram bucketed by powers of 2. // Returns the number of the largest non-empty bucket. - int ProgramFanout(std::map* histogram) const; - int ReverseProgramFanout(std::map* histogram) const; + int ProgramFanout(std::vector* histogram) const; + int ReverseProgramFanout(std::vector* histogram) const; // Returns the underlying Regexp; not for general use. // Returns entire_regexp_ so that callers don't need @@ -7980,7 +8067,6 @@ class RE2 { static bool FindAndConsumeN(StringPiece* input, const RE2& re, const Arg* const args[], int n); -#ifndef SWIG private: template static inline bool Apply(F f, SP sp, const RE2& re) { @@ -8016,12 +8102,12 @@ class RE2 { // (void*)NULL (the corresponding matched sub-pattern is not copied) // // Returns true iff all of the following conditions are satisfied: - // a. "text" matches "re" exactly - // b. The number of matched sub-patterns is >= number of supplied pointers + // a. "text" matches "re" fully - from the beginning to the end of "text". + // b. The number of matched sub-patterns is >= number of supplied pointers. // c. The "i"th argument has a suitable type for holding the // string captured as the "i"th sub-pattern. If you pass in // NULL for the "i"th argument, or pass fewer arguments than - // number of sub-patterns, "i"th captured sub-pattern is + // number of sub-patterns, the "i"th captured sub-pattern is // ignored. // // CAVEAT: An optional sub-pattern that does not exist in the @@ -8035,8 +8121,17 @@ class RE2 { return Apply(FullMatchN, text, re, Arg(std::forward(a))...); } - // Exactly like FullMatch(), except that "re" is allowed to match - // a substring of "text". + // Like FullMatch(), except that "re" is allowed to match a substring + // of "text". + // + // Returns true iff all of the following conditions are satisfied: + // a. "text" matches "re" partially - for some substring of "text". + // b. The number of matched sub-patterns is >= number of supplied pointers. + // c. The "i"th argument has a suitable type for holding the + // string captured as the "i"th sub-pattern. If you pass in + // NULL for the "i"th argument, or pass fewer arguments than + // number of sub-patterns, the "i"th captured sub-pattern is + // ignored. template static bool PartialMatch(const StringPiece& text, const RE2& re, A&&... a) { return Apply(PartialMatchN, text, re, Arg(std::forward(a))...); @@ -8045,7 +8140,16 @@ class RE2 { // Like FullMatch() and PartialMatch(), except that "re" has to match // a prefix of the text, and "input" is advanced past the matched // text. Note: "input" is modified iff this routine returns true - // and "re" matched a non-empty substring of "text". + // and "re" matched a non-empty substring of "input". + // + // Returns true iff all of the following conditions are satisfied: + // a. "input" matches "re" partially - for some prefix of "input". + // b. The number of matched sub-patterns is >= number of supplied pointers. + // c. The "i"th argument has a suitable type for holding the + // string captured as the "i"th sub-pattern. If you pass in + // NULL for the "i"th argument, or pass fewer arguments than + // number of sub-patterns, the "i"th captured sub-pattern is + // ignored. template static bool Consume(StringPiece* input, const RE2& re, A&&... a) { return Apply(ConsumeN, input, re, Arg(std::forward(a))...); @@ -8055,11 +8159,19 @@ class RE2 { // the text. That is, "re" need not start its match at the beginning // of "input". For example, "FindAndConsume(s, "(\\w+)", &word)" finds // the next word in "s" and stores it in "word". + // + // Returns true iff all of the following conditions are satisfied: + // a. "input" matches "re" partially - for some substring of "input". + // b. The number of matched sub-patterns is >= number of supplied pointers. + // c. The "i"th argument has a suitable type for holding the + // string captured as the "i"th sub-pattern. If you pass in + // NULL for the "i"th argument, or pass fewer arguments than + // number of sub-patterns, the "i"th captured sub-pattern is + // ignored. template static bool FindAndConsume(StringPiece* input, const RE2& re, A&&... a) { return Apply(FindAndConsumeN, input, re, Arg(std::forward(a))...); } -#endif // Replace the first match of "re" in "str" with "rewrite". // Within "rewrite", backslash-escaped digits (\1 to \9) can be @@ -8110,7 +8222,7 @@ class RE2 { // Escapes all potentially meaningful regexp characters in // 'unquoted'. The returned string, used as a regular expression, - // will exactly match the original string. For example, + // will match exactly the original string. For example, // 1.5-2.0? // may become: // 1\.5\-2\.0\? @@ -8142,8 +8254,6 @@ class RE2 { ANCHOR_BOTH // Anchor at start and end }; - Anchor Anchored() const; - // Return the number of capturing subpatterns, or -1 if the // regexp wasn't valid on construction. The overall match ($0) // does not count: if the regexp is "(a)(b)", returns 2. @@ -8275,11 +8385,11 @@ class RE2 { }; Options() : + max_mem_(kDefaultMaxMem), encoding_(EncodingUTF8), posix_syntax_(false), longest_match_(false), log_errors_(true), - max_mem_(kDefaultMaxMem), literal_(false), never_nl_(false), dot_nl_(false), @@ -8292,20 +8402,12 @@ class RE2 { /*implicit*/ Options(CannedOptions); + int64_t max_mem() const { return max_mem_; } + void set_max_mem(int64_t m) { max_mem_ = m; } + Encoding encoding() const { return encoding_; } void set_encoding(Encoding encoding) { encoding_ = encoding; } - // Legacy interface to encoding. - // TODO(rsc): Remove once clients have been converted. - bool utf8() const { return encoding_ == EncodingUTF8; } - void set_utf8(bool b) { - if (b) { - encoding_ = EncodingUTF8; - } else { - encoding_ = EncodingLatin1; - } - } - bool posix_syntax() const { return posix_syntax_; } void set_posix_syntax(bool b) { posix_syntax_ = b; } @@ -8315,9 +8417,6 @@ class RE2 { bool log_errors() const { return log_errors_; } void set_log_errors(bool b) { log_errors_ = b; } - int64_t max_mem() const { return max_mem_; } - void set_max_mem(int64_t m) { max_mem_ = m; } - bool literal() const { return literal_; } void set_literal(bool b) { literal_ = b; } @@ -8349,11 +8448,11 @@ class RE2 { int ParseFlags() const; private: + int64_t max_mem_; Encoding encoding_; bool posix_syntax_; bool longest_match_; bool log_errors_; - int64_t max_mem_; bool literal_; bool never_nl_; bool dot_nl_; @@ -8368,32 +8467,16 @@ class RE2 { const Options& options() const { return options_; } // Argument converters; see below. - static inline Arg CRadix(short* x); - static inline Arg CRadix(unsigned short* x); - static inline Arg CRadix(int* x); - static inline Arg CRadix(unsigned int* x); - static inline Arg CRadix(long* x); - static inline Arg CRadix(unsigned long* x); - static inline Arg CRadix(long long* x); - static inline Arg CRadix(unsigned long long* x); - - static inline Arg Hex(short* x); - static inline Arg Hex(unsigned short* x); - static inline Arg Hex(int* x); - static inline Arg Hex(unsigned int* x); - static inline Arg Hex(long* x); - static inline Arg Hex(unsigned long* x); - static inline Arg Hex(long long* x); - static inline Arg Hex(unsigned long long* x); - - static inline Arg Octal(short* x); - static inline Arg Octal(unsigned short* x); - static inline Arg Octal(int* x); - static inline Arg Octal(unsigned int* x); - static inline Arg Octal(long* x); - static inline Arg Octal(unsigned long* x); - static inline Arg Octal(long long* x); - static inline Arg Octal(unsigned long long* x); + template + static Arg CRadix(T* ptr); + template + static Arg Hex(T* ptr); + template + static Arg Octal(T* ptr); + + // Controls the maximum count permitted by GlobalReplace(); -1 is unlimited. + // FOR FUZZING ONLY. + static void FUZZING_ONLY_set_maximum_global_replace_count(int i); private: void Init(const StringPiece& pattern, const Options& options); @@ -8406,166 +8489,167 @@ class RE2 { duckdb_re2::Prog* ReverseProg() const; - std::string pattern_; // string regular expression - Options options_; // option flags - std::string prefix_; // required prefix (before regexp_) - bool prefix_foldcase_; // prefix is ASCII case-insensitive - duckdb_re2::Regexp* entire_regexp_; // parsed regular expression - duckdb_re2::Regexp* suffix_regexp_; // parsed regular expression, prefix removed - duckdb_re2::Prog* prog_; // compiled program for regexp - int num_captures_; // Number of capturing groups - bool is_one_pass_; // can use prog_->SearchOnePass? - - mutable duckdb_re2::Prog* rprog_; // reverse program for regexp - mutable const std::string* error_; // Error indicator - // (or points to empty string) - mutable ErrorCode error_code_; // Error code - mutable std::string error_arg_; // Fragment of regexp showing error - + // First cache line is relatively cold fields. + const std::string* pattern_; // string regular expression + Options options_; // option flags + duckdb_re2::Regexp* entire_regexp_; // parsed regular expression + duckdb_re2::Regexp* suffix_regexp_; // parsed regular expression, prefix_ removed + const std::string* error_; // error indicator (or points to empty string) + const std::string* error_arg_; // fragment of regexp showing error (or ditto) + + // Second cache line is relatively hot fields. + // These are ordered oddly to pack everything. + int num_captures_; // number of capturing groups + ErrorCode error_code_ : 29; // error code (29 bits is more than enough) + bool longest_match_ : 1; // cached copy of options_.longest_match() + bool is_one_pass_ : 1; // can use prog_->SearchOnePass? + bool prefix_foldcase_ : 1; // prefix_ is ASCII case-insensitive + std::string prefix_; // required prefix (before suffix_regexp_) + duckdb_re2::Prog* prog_; // compiled program for regexp + + // Reverse Prog for DFA execution only + mutable duckdb_re2::Prog* rprog_; // Map from capture names to indices mutable const std::map* named_groups_; - // Map from capture indices to names mutable const std::map* group_names_; - // Onces for lazy computations. mutable std::once_flag rprog_once_; mutable std::once_flag named_groups_once_; mutable std::once_flag group_names_once_; - - RE2(const RE2&) = delete; - RE2& operator=(const RE2&) = delete; }; /***** Implementation details *****/ -// Hex/Octal/Binary? +namespace re2_internal { -// Special class for parsing into objects that define a ParseFrom() method -template -class _RE2_MatchObject { - public: - static inline bool Parse(const char* str, size_t n, void* dest) { - if (dest == NULL) return true; - T* object = reinterpret_cast(dest); - return object->ParseFrom(str, n); - } -}; +// Types for which the 3-ary Parse() function template has specializations. +template struct Parse3ary : public std::false_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; + +template +bool Parse(const char* str, size_t n, T* dest); + +// Types for which the 4-ary Parse() function template has specializations. +template struct Parse4ary : public std::false_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; + +template +bool Parse(const char* str, size_t n, T* dest, int radix); + +} // namespace re2_internal class RE2::Arg { + private: + template + using CanParse3ary = typename std::enable_if< + re2_internal::Parse3ary::value, + int>::type; + + template + using CanParse4ary = typename std::enable_if< + re2_internal::Parse4ary::value, + int>::type; + +#if !defined(_MSC_VER) + template + using CanParseFrom = typename std::enable_if< + std::is_member_function_pointer< + decltype(static_cast( + &T::ParseFrom))>::value, + int>::type; +#endif + public: - // Empty constructor so we can declare arrays of RE2::Arg - Arg(); + Arg() : Arg(nullptr) {} + Arg(std::nullptr_t ptr) : arg_(ptr), parser_(DoNothing) {} + + template = 0> + Arg(T* ptr) : arg_(ptr), parser_(DoParse3ary) {} - // Constructor specially designed for NULL arguments - Arg(void*); - Arg(std::nullptr_t); + template = 0> + Arg(T* ptr) : arg_(ptr), parser_(DoParse4ary) {} + +#if !defined(_MSC_VER) + template = 0> + Arg(T* ptr) : arg_(ptr), parser_(DoParseFrom) {} +#endif typedef bool (*Parser)(const char* str, size_t n, void* dest); -// Type-specific parsers -#define MAKE_PARSER(type, name) \ - Arg(type* p) : arg_(p), parser_(name) {} \ - Arg(type* p, Parser parser) : arg_(p), parser_(parser) {} - - MAKE_PARSER(char, parse_char) - MAKE_PARSER(signed char, parse_schar) - MAKE_PARSER(unsigned char, parse_uchar) - MAKE_PARSER(float, parse_float) - MAKE_PARSER(double, parse_double) - MAKE_PARSER(std::string, parse_string) - MAKE_PARSER(StringPiece, parse_stringpiece) - - MAKE_PARSER(short, parse_short) - MAKE_PARSER(unsigned short, parse_ushort) - MAKE_PARSER(int, parse_int) - MAKE_PARSER(unsigned int, parse_uint) - MAKE_PARSER(long, parse_long) - MAKE_PARSER(unsigned long, parse_ulong) - MAKE_PARSER(long long, parse_longlong) - MAKE_PARSER(unsigned long long, parse_ulonglong) - -#undef MAKE_PARSER - - // Generic constructor templates - template Arg(T* p) - : arg_(p), parser_(_RE2_MatchObject::Parse) { } - template Arg(T* p, Parser parser) - : arg_(p), parser_(parser) { } - - // Parse the data - bool Parse(const char* str, size_t n) const; + template + Arg(T* ptr, Parser parser) : arg_(ptr), parser_(parser) {} + + bool Parse(const char* str, size_t n) const { + return (*parser_)(str, n, arg_); + } private: - void* arg_; - Parser parser_; + static bool DoNothing(const char* /*str*/, size_t /*n*/, void* /*dest*/) { + return true; + } - static bool parse_null (const char* str, size_t n, void* dest); - static bool parse_char (const char* str, size_t n, void* dest); - static bool parse_schar (const char* str, size_t n, void* dest); - static bool parse_uchar (const char* str, size_t n, void* dest); - static bool parse_float (const char* str, size_t n, void* dest); - static bool parse_double (const char* str, size_t n, void* dest); - static bool parse_string (const char* str, size_t n, void* dest); - static bool parse_stringpiece (const char* str, size_t n, void* dest); - -#define DECLARE_INTEGER_PARSER(name) \ - private: \ - static bool parse_##name(const char* str, size_t n, void* dest); \ - static bool parse_##name##_radix(const char* str, size_t n, void* dest, \ - int radix); \ - \ - public: \ - static bool parse_##name##_hex(const char* str, size_t n, void* dest); \ - static bool parse_##name##_octal(const char* str, size_t n, void* dest); \ - static bool parse_##name##_cradix(const char* str, size_t n, void* dest); - - DECLARE_INTEGER_PARSER(short) - DECLARE_INTEGER_PARSER(ushort) - DECLARE_INTEGER_PARSER(int) - DECLARE_INTEGER_PARSER(uint) - DECLARE_INTEGER_PARSER(long) - DECLARE_INTEGER_PARSER(ulong) - DECLARE_INTEGER_PARSER(longlong) - DECLARE_INTEGER_PARSER(ulonglong) - -#undef DECLARE_INTEGER_PARSER - -}; - -inline RE2::Arg::Arg() : arg_(NULL), parser_(parse_null) { } -inline RE2::Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } -inline RE2::Arg::Arg(std::nullptr_t p) : arg_(p), parser_(parse_null) { } - -inline bool RE2::Arg::Parse(const char* str, size_t n) const { - return (*parser_)(str, n, arg_); -} - -// This part of the parser, appropriate only for ints, deals with bases -#define MAKE_INTEGER_PARSER(type, name) \ - inline RE2::Arg RE2::Hex(type* ptr) { \ - return RE2::Arg(ptr, RE2::Arg::parse_##name##_hex); \ - } \ - inline RE2::Arg RE2::Octal(type* ptr) { \ - return RE2::Arg(ptr, RE2::Arg::parse_##name##_octal); \ - } \ - inline RE2::Arg RE2::CRadix(type* ptr) { \ - return RE2::Arg(ptr, RE2::Arg::parse_##name##_cradix); \ + template + static bool DoParse3ary(const char* str, size_t n, void* dest) { + return re2_internal::Parse(str, n, reinterpret_cast(dest)); } -MAKE_INTEGER_PARSER(short, short) -MAKE_INTEGER_PARSER(unsigned short, ushort) -MAKE_INTEGER_PARSER(int, int) -MAKE_INTEGER_PARSER(unsigned int, uint) -MAKE_INTEGER_PARSER(long, long) -MAKE_INTEGER_PARSER(unsigned long, ulong) -MAKE_INTEGER_PARSER(long long, longlong) -MAKE_INTEGER_PARSER(unsigned long long, ulonglong) + template + static bool DoParse4ary(const char* str, size_t n, void* dest) { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 10); + } -#undef MAKE_INTEGER_PARSER +#if !defined(_MSC_VER) + template + static bool DoParseFrom(const char* str, size_t n, void* dest) { + if (dest == NULL) return true; + return reinterpret_cast(dest)->ParseFrom(str, n); + } +#endif -#ifndef SWIG + void* arg_; + Parser parser_; +}; + +template +inline RE2::Arg RE2::CRadix(T* ptr) { + return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 0); + }); +} +template +inline RE2::Arg RE2::Hex(T* ptr) { + return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 16); + }); +} + +template +inline RE2::Arg RE2::Octal(T* ptr) { + return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 8); + }); +} + +// Silence warnings about missing initializers for members of LazyRE2. +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 6 +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif // Helper for writing global or static RE2s safely. // Write @@ -8612,9 +8696,56 @@ class LazyRE2 { void operator=(const LazyRE2&); // disallowed }; -#endif // SWIG -} // namespace duckdb_re2 +namespace hooks { + +// Most platforms support thread_local. Older versions of iOS don't support +// thread_local, but for the sake of brevity, we lump together all versions +// of Apple platforms that aren't macOS. If an iOS application really needs +// the context pointee someday, we can get more specific then... +// +// As per https://github.com/google/re2/issues/325, thread_local support in +// MinGW seems to be buggy. (FWIW, Abseil folks also avoid it.) +#define RE2_HAVE_THREAD_LOCAL +#if (defined(__APPLE__) && !(defined(TARGET_OS_OSX) && TARGET_OS_OSX)) || defined(__MINGW32__) +#undef RE2_HAVE_THREAD_LOCAL +#endif + +// A hook must not make any assumptions regarding the lifetime of the context +// pointee beyond the current invocation of the hook. Pointers and references +// obtained via the context pointee should be considered invalidated when the +// hook returns. Hence, any data about the context pointee (e.g. its pattern) +// would have to be copied in order for it to be kept for an indefinite time. +// +// A hook must not use RE2 for matching. Control flow reentering RE2::Match() +// could result in infinite mutual recursion. To discourage that possibility, +// RE2 will not maintain the context pointer correctly when used in that way. +#ifdef RE2_HAVE_THREAD_LOCAL +extern thread_local const RE2* context; +#endif + +struct DFAStateCacheReset { + int64_t state_budget; + size_t state_cache_size; +}; + +struct DFASearchFailure { + // Nothing yet... +}; + +#define DECLARE_HOOK(type) \ + using type##Callback = void(const type&); \ + void Set##type##Hook(type##Callback* cb); \ + type##Callback* Get##type##Hook(); + +DECLARE_HOOK(DFAStateCacheReset) +DECLARE_HOOK(DFASearchFailure) + +#undef DECLARE_HOOK + +} // namespace hooks + +} // namespace re2 using duckdb_re2::RE2; using duckdb_re2::LazyRE2; @@ -8750,7 +8881,7 @@ struct MultiFileReaderOptions { DUCKDB_API void AddBatchInfo(BindInfo &bind_info) const; DUCKDB_API void AutoDetectHivePartitioning(const vector &files, ClientContext &context); DUCKDB_API static bool AutoDetectHivePartitioningInternal(const vector &files, ClientContext &context); - DUCKDB_API void AutoDetectHiveTypesInternal(const string &file, ClientContext &context); + DUCKDB_API void AutoDetectHiveTypesInternal(const vector &file, ClientContext &context); DUCKDB_API void VerifyHiveTypesArePartitions(const std::map &partitions) const; DUCKDB_API LogicalType GetHiveLogicalType(const string &hive_partition_column) const; DUCKDB_API Value GetHivePartitionValue(const string &base, const string &entry, ClientContext &context) const; @@ -8781,19 +8912,19 @@ struct CSVReaderOptions { //! See struct above. DialectOptions dialect_options; //! Whether or not we should ignore InvalidInput errors - bool ignore_errors = false; - //! Rejects table name - string rejects_table_name; + CSVOption ignore_errors = false; + //! Whether we store CSV Errors in the rejects table or not + CSVOption store_rejects = false; + //! Rejects table name (Name of the table the store rejects errors) + CSVOption rejects_table_name = {"reject_errors"}; + //! Rejects Scan name name (Name of the table the store rejects scans) + CSVOption rejects_scan_name = {"reject_scans"}; //! Rejects table entry limit (0 = no limit) idx_t rejects_limit = 0; - //! Columns to use as recovery key for rejected rows when reading with ignore_errors = true - vector rejects_recovery_columns; - //! Index of the recovery columns - vector rejects_recovery_column_ids; //! Number of samples to buffer idx_t buffer_sample_size = (idx_t)STANDARD_VECTOR_SIZE * 50; - //! Specifies the string that represents a null value - string null_str; + //! Specifies the strings that represents a null value + vector null_str = {""}; //! Whether file is compressed or not, and if so which compression type //! AUTO_DETECT (default; infer from file extension) FileCompressionType compression = FileCompressionType::AUTO_DETECT; @@ -8826,6 +8957,8 @@ struct CSVReaderOptions { //! Whether or not header names shall be normalized bool normalize_names = false; //! True, if column with that index must skip null check + unordered_set force_not_null_names; + //! True, if column with that index must skip null check vector force_not_null; //! Number of sample chunks used in auto-detection idx_t sample_size_chunks = 20480 / STANDARD_VECTOR_SIZE; @@ -8848,6 +8981,7 @@ struct CSVReaderOptions { //! User defined parameters for the csv function concatenated on a string string user_defined_parameters; + //===--------------------------------------------------------------------===// // WriteCSVOptions //===--------------------------------------------------------------------===// @@ -8888,7 +9022,7 @@ struct CSVReaderOptions { void SetNewline(const string &input); //! Set an option that is supported by both reading and writing functions, called by //! the SetReadOption and SetWriteOption methods - bool SetBaseOption(const string &loption, const Value &value); + bool SetBaseOption(const string &loption, const Value &value, bool write_option = false); //! loption - lowercase string //! set - argument(s) to the option @@ -8903,6 +9037,17 @@ struct CSVReaderOptions { string ToString() const; //! If the type for column with idx i was manually set bool WasTypeManuallySet(idx_t i) const; + + string NewLineIdentifierToString() { + switch (dialect_options.state_machine_options.new_line.GetValue()) { + case NewLineIdentifier::SINGLE: + return "\\n"; + case NewLineIdentifier::CARRY_ON: + return "\\r\\n"; + default: + return ""; + } + } }; } // namespace duckdb @@ -9004,6 +9149,18 @@ class Deserializer { OnOptionalPropertyEnd(true); } + template + inline void ReadPropertyWithDefault(const field_id_t field_id, const char *tag, CSVOption &ret, + T &&default_value) { + if (!OnOptionalPropertyBegin(field_id, tag)) { + ret = std::forward(default_value); + OnOptionalPropertyEnd(false); + return; + } + ret = Read(); + OnOptionalPropertyEnd(true); + } + // Special case: // Read into an existing data_ptr_t inline void ReadProperty(const field_id_t field_id, const char *tag, data_ptr_t ret, idx_t count) { @@ -9460,6 +9617,7 @@ struct ValueOperations { } // namespace duckdb + namespace duckdb { class Serializer { @@ -9528,6 +9686,21 @@ class Serializer { OnOptionalPropertyEnd(true); } + // Specialization for Value (default Value comparison throws when comparing nulls) + template + void WritePropertyWithDefault(const field_id_t field_id, const char *tag, const CSVOption &value, + const T &&default_value) { + // If current value is default, don't write it + if (!serialize_default_values && (value == default_value)) { + OnOptionalPropertyBegin(field_id, tag, false); + OnOptionalPropertyEnd(false); + return; + } + OnOptionalPropertyBegin(field_id, tag, true); + WriteValue(value.GetValue()); + OnOptionalPropertyEnd(true); + } + // Special case: data_ptr_T void WriteProperty(const field_id_t field_id, const char *tag, const_data_ptr_t ptr, idx_t count) { OnPropertyBegin(field_id, tag); @@ -9802,7 +9975,9 @@ class CreateSecretFunction { //! should be seen as the method of secret creation. (e.g. user-provided config, env variables, auto-detect) class CreateSecretFunctionSet { public: - CreateSecretFunctionSet(string &name) : name(name) {}; + explicit CreateSecretFunctionSet(string &name) : name(name) {}; + +public: bool ProviderExists(const string &provider_name); void AddFunction(CreateSecretFunction &function, OnCreateConflict on_conflict); CreateSecretFunction &GetFunction(const string &provider); @@ -9832,8 +10007,9 @@ class BaseSecret { friend class SecretManager; public: - BaseSecret(const vector &prefix_paths, const string &type, const string &provider, const string &name) - : prefix_paths(prefix_paths), type(type), provider(provider), name(name), serializable(false) { + BaseSecret(vector prefix_paths_p, string type_p, string provider_p, string name_p) + : prefix_paths(std::move(prefix_paths_p)), type(std::move(type_p)), provider(std::move(provider_p)), + name(std::move(name_p)), serializable(false) { D_ASSERT(!type.empty()); } BaseSecret(const BaseSecret &other) @@ -9899,7 +10075,7 @@ class KeyValueSecret : public BaseSecret { D_ASSERT(!type.empty()); serializable = true; } - KeyValueSecret(BaseSecret &secret) + explicit KeyValueSecret(const BaseSecret &secret) : BaseSecret(secret.GetScope(), secret.GetType(), secret.GetProvider(), secret.GetName()) { serializable = true; }; @@ -9909,15 +10085,16 @@ class KeyValueSecret : public BaseSecret { redact_keys = secret.redact_keys; serializable = true; }; - KeyValueSecret(KeyValueSecret &&secret) - : BaseSecret(secret.GetScope(), secret.GetType(), secret.GetProvider(), secret.GetName()) { + KeyValueSecret(KeyValueSecret &&secret) noexcept + : BaseSecret(std::move(secret.prefix_paths), std::move(secret.type), std::move(secret.provider), + std::move(secret.name)) { secret_map = std::move(secret.secret_map); redact_keys = std::move(secret.redact_keys); serializable = true; }; //! Print the secret as a key value map in the format 'key1=value;key2=value2' - virtual string ToString(SecretDisplayType mode = SecretDisplayType::REDACTED) const override; + string ToString(SecretDisplayType mode = SecretDisplayType::REDACTED) const override; void Serialize(Serializer &serializer) const override; //! Tries to get the value at key , depending on error_on_missing will throw or return Value() @@ -9965,7 +10142,7 @@ class KeyValueSecret : public BaseSecret { namespace duckdb { -struct CreateSecretInfo : public CreateInfo { +struct CreateSecretInfo : public CreateInfo { // NOLINT: work-around bug in clang-tidy public: static constexpr const ParseInfoType TYPE = ParseInfoType::CREATE_SECRET_INFO; @@ -9988,7 +10165,7 @@ struct CreateSecretInfo : public CreateInfo { //! Named parameter list (if any) case_insensitive_map_t options; - unique_ptr Copy() const; + unique_ptr Copy() const override; }; } // namespace duckdb @@ -10156,7 +10333,7 @@ struct ExtraDropInfo { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } virtual unique_ptr Copy() const = 0; @@ -10175,9 +10352,9 @@ struct ExtraDropSecretInfo : public ExtraDropInfo { string secret_storage; public: - virtual unique_ptr Copy() const override; + unique_ptr Copy() const override; - virtual void Serialize(Serializer &serializer) const override; + void Serialize(Serializer &serializer) const override; static unique_ptr Deserialize(Deserializer &deserializer); }; @@ -10311,7 +10488,7 @@ struct BoundCreateTableInfo { //! Bound default values vector> bound_defaults; //! Dependents of the table (in e.g. default values) - DependencyList dependencies; + LogicalDependencyList dependencies; //! The existing table data on disk (if any) unique_ptr data; //! CREATE TABLE from QUERY @@ -10321,7 +10498,7 @@ struct BoundCreateTableInfo { CreateTableInfo &Base() { D_ASSERT(base); - return (CreateTableInfo &)*base; + return base->Cast(); } }; @@ -10435,10 +10612,11 @@ class AttachedDatabase : public CatalogEntry { const AttachInfo &info, AccessMode access_mode); ~AttachedDatabase() override; - void Initialize(); + void Initialize(optional_ptr context = nullptr); void Close(); Catalog &ParentCatalog() override; + const Catalog &ParentCatalog() const override; StorageManager &GetStorageManager(); Catalog &GetCatalog(); TransactionManager &GetTransactionManager(); @@ -10453,6 +10631,7 @@ class AttachedDatabase : public CatalogEntry { bool IsReadOnly() const; bool IsInitialDatabase() const; void SetInitialDatabase(); + void SetReadOnlyDatabase(); static bool NameIsReserved(const string &name); static string ExtractDatabaseName(const string &dbpath, FileSystem &fs); @@ -10749,7 +10928,11 @@ AttachedDatabase &Catalog::GetAttached() { return db; } -const string &Catalog::GetName() { +const AttachedDatabase &Catalog::GetAttached() const { + return db; +} + +const string &Catalog::GetName() const { return GetAttached().GetName(); } @@ -11949,168 +12132,6 @@ CopyFunctionCatalogEntry::CopyFunctionCatalogEntry(Catalog &catalog, SchemaCatal -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/catalog/dependency.hpp -// -// -//===----------------------------------------------------------------------===// - - - - - - -namespace duckdb { -class CatalogEntry; - -struct DependencyFlags { -private: -public: - DependencyFlags() : value(0) { - } - DependencyFlags(const DependencyFlags &other) : value(other.value) { - } - DependencyFlags &operator=(const DependencyFlags &other) { - value = other.value; - return *this; - } - bool operator==(const DependencyFlags &other) const { - return other.value == value; - } - bool operator!=(const DependencyFlags &other) const { - return !(*this == other); - } - -public: - virtual string ToString() const = 0; - -protected: - template - bool IsSet() const { - static const uint8_t FLAG = (1 << BIT); - return (value & FLAG) == FLAG; - } - template - void Set() { - static const uint8_t FLAG = (1 << BIT); - value |= FLAG; - } - void Merge(uint8_t other) { - value |= other; - } - uint8_t Value() { - return value; - } - -private: - uint8_t value; -}; - -struct DependencySubjectFlags : public DependencyFlags { -private: - static constexpr uint8_t OWNERSHIP = 0; - -public: - DependencySubjectFlags &Apply(DependencySubjectFlags other) { - Merge(other.Value()); - return *this; - } - -public: - bool IsOwnership() const { - return IsSet(); - } - -public: - DependencySubjectFlags &SetOwnership() { - Set(); - return *this; - } - -public: - string ToString() const override { - string result; - if (IsOwnership()) { - result += "OWNS"; - } - return result; - } -}; - -struct DependencyDependentFlags : public DependencyFlags { -private: - static constexpr uint8_t BLOCKING = 0; - static constexpr uint8_t OWNED_BY = 1; - -public: - DependencyDependentFlags &Apply(DependencyDependentFlags other) { - Merge(other.Value()); - return *this; - } - -public: - bool IsBlocking() const { - return IsSet(); - } - bool IsOwnedBy() const { - return IsSet(); - } - -public: - DependencyDependentFlags &SetBlocking() { - Set(); - return *this; - } - DependencyDependentFlags &SetOwnedBy() { - Set(); - return *this; - } - -public: - string ToString() const override { - string result; - if (IsBlocking()) { - result += "REGULAR"; - } else { - result += "AUTOMATIC"; - } - result += " | "; - if (IsOwnedBy()) { - result += "OWNED BY"; - } - return result; - } -}; - -struct Dependency { - Dependency(CatalogEntry &entry, DependencyDependentFlags flags = DependencyDependentFlags().SetBlocking()) - : // NOLINT: Allow implicit conversion from `CatalogEntry` - entry(entry), flags(flags) { - } - - //! The catalog entry this depends on - reference entry; - //! The type of dependency - DependencyDependentFlags flags; -}; - -struct DependencyHashFunction { - uint64_t operator()(const Dependency &a) const { - std::hash hash_func; - return hash_func((void *)&a.entry.get()); - } -}; - -struct DependencyEquality { - bool operator()(const Dependency &a, const Dependency &b) const { - return RefersToSameObject(a.entry, b.entry); - } -}; -using dependency_set_t = unordered_set; - -} // namespace duckdb //===----------------------------------------------------------------------===// // DuckDB @@ -12128,20 +12149,15 @@ using dependency_set_t = unordered_set namespace duckdb { class DuckCatalog; class ClientContext; -class DependencyList; class DependencyEntry; -class DependencySetCatalogEntry; - -struct CatalogEntryInfo { - CatalogType type; - string schema; - string name; -}; +class LogicalDependencyList; // The subject of this dependency struct DependencySubject { @@ -12171,12 +12187,20 @@ struct DependencyInfo { struct MangledEntryName { public: - MangledEntryName(const CatalogEntryInfo &info); + explicit MangledEntryName(const CatalogEntryInfo &info); MangledEntryName() = delete; public: //! Format: Type\0Schema\0Name string name; + +public: + bool operator==(const MangledEntryName &other) const { + return StringUtil::CIEquals(other.name, name); + } + bool operator!=(const MangledEntryName &other) const { + return !(*this == other); + } }; struct MangledDependencyName { @@ -12192,7 +12216,6 @@ struct MangledDependencyName { //! The DependencyManager is in charge of managing dependencies between catalog entries class DependencyManager { friend class CatalogSet; - friend class DependencySetCatalogEntry; public: explicit DependencyManager(DuckCatalog &catalog); @@ -12210,24 +12233,27 @@ class DependencyManager { private: bool IsSystemEntry(CatalogEntry &entry) const; + optional_ptr LookupEntry(CatalogTransaction transaction, const LogicalDependency &dependency); optional_ptr LookupEntry(CatalogTransaction transaction, CatalogEntry &dependency); void CleanupDependencies(CatalogTransaction transaction, CatalogEntry &entry); public: - static string GetSchema(CatalogEntry &entry); + static string GetSchema(const CatalogEntry &entry); static MangledEntryName MangleName(const CatalogEntryInfo &info); - static MangledEntryName MangleName(CatalogEntry &entry); - static CatalogEntryInfo GetLookupProperties(CatalogEntry &entry); + static MangledEntryName MangleName(const CatalogEntry &entry); + static CatalogEntryInfo GetLookupProperties(const CatalogEntry &entry); private: - void AddObject(CatalogTransaction transaction, CatalogEntry &object, const DependencyList &dependencies); + void AddObject(CatalogTransaction transaction, CatalogEntry &object, const LogicalDependencyList &dependencies); void DropObject(CatalogTransaction transaction, CatalogEntry &object, bool cascade); void AlterObject(CatalogTransaction transaction, CatalogEntry &old_obj, CatalogEntry &new_obj); private: void RemoveDependency(CatalogTransaction transaction, const DependencyInfo &info); void CreateDependency(CatalogTransaction transaction, DependencyInfo &info); + void CreateDependencies(CatalogTransaction transaction, const CatalogEntry &object, + const LogicalDependencyList &dependencies); using dependency_entry_func_t = const std::function( Catalog &catalog, const DependencyDependent &dependent, const DependencySubject &dependency)>; @@ -12475,7 +12501,7 @@ class DuckIndexEntry : public IndexCatalogEntry { //! Create a DuckIndexEntry DuckIndexEntry(Catalog &catalog, SchemaCatalogEntry &schema, CreateIndexInfo &info); - virtual unique_ptr Copy(ClientContext &context) const override; + unique_ptr Copy(ClientContext &context) const override; //! The indexed table information shared_ptr info; @@ -12595,7 +12621,7 @@ class DuckSchemaEntry : public SchemaCatalogEntry { optional_ptr AddEntry(CatalogTransaction transaction, unique_ptr entry, OnCreateConflict on_conflict); optional_ptr AddEntryInternal(CatalogTransaction transaction, unique_ptr entry, - OnCreateConflict on_conflict, DependencyList dependencies); + OnCreateConflict on_conflict, LogicalDependencyList dependencies); optional_ptr CreateTable(CatalogTransaction transaction, BoundCreateTableInfo &info) override; optional_ptr CreateFunction(CatalogTransaction transaction, CreateFunctionInfo &info) override; @@ -12657,15 +12683,15 @@ class DefaultFunctionGenerator : public DefaultGenerator { SchemaCatalogEntry &schema; - DUCKDB_API static unique_ptr CreateInternalMacroInfo(DefaultMacro &default_macro); - DUCKDB_API static unique_ptr CreateInternalTableMacroInfo(DefaultMacro &default_macro); + DUCKDB_API static unique_ptr CreateInternalMacroInfo(const DefaultMacro &default_macro); + DUCKDB_API static unique_ptr CreateInternalTableMacroInfo(const DefaultMacro &default_macro); public: unique_ptr CreateDefaultEntry(ClientContext &context, const string &entry_name) override; vector GetDefaultEntries() override; private: - static unique_ptr CreateInternalTableMacroInfo(DefaultMacro &default_macro, + static unique_ptr CreateInternalTableMacroInfo(const DefaultMacro &default_macro, unique_ptr function); }; @@ -12923,8 +12949,8 @@ class ForeignKeyConstraint : public Constraint { namespace duckdb { -void FindForeignKeyInformation(CatalogEntry &entry, AlterForeignKeyType alter_fk_type, - vector> &fk_arrays) { +static void FindForeignKeyInformation(CatalogEntry &entry, AlterForeignKeyType alter_fk_type, + vector> &fk_arrays) { if (entry.type != CatalogType::TABLE_ENTRY) { return; } @@ -12950,6 +12976,19 @@ void FindForeignKeyInformation(CatalogEntry &entry, AlterForeignKeyType alter_fk } } +static void LazyLoadIndexes(ClientContext &context, CatalogEntry &entry) { + if (entry.type == CatalogType::TABLE_ENTRY) { + auto &table_entry = entry.Cast(); + table_entry.GetStorage().info->InitializeIndexes(context); + } else if (entry.type == CatalogType::INDEX_ENTRY) { + auto &index_entry = entry.Cast(); + auto &table_entry = Catalog::GetEntry(context, CatalogType::TABLE_ENTRY, index_entry.catalog.GetName(), + index_entry.GetSchemaName(), index_entry.GetTableName()) + .Cast(); + table_entry.GetStorage().info->InitializeIndexes(context); + } +} + DuckSchemaEntry::DuckSchemaEntry(Catalog &catalog, CreateSchemaInfo &info) : SchemaCatalogEntry(catalog, info), tables(catalog, make_uniq(catalog, *this)), indexes(catalog), table_functions(catalog), copy_functions(catalog), pragma_functions(catalog), @@ -12969,7 +13008,7 @@ unique_ptr DuckSchemaEntry::Copy(ClientContext &context) const { optional_ptr DuckSchemaEntry::AddEntryInternal(CatalogTransaction transaction, unique_ptr entry, OnCreateConflict on_conflict, - DependencyList dependencies) { + LogicalDependencyList dependencies) { auto entry_name = entry->name; auto entry_type = entry->type; auto result = entry.get(); @@ -13071,7 +13110,7 @@ optional_ptr DuckSchemaEntry::CreateFunction(CatalogTransaction tr optional_ptr DuckSchemaEntry::AddEntry(CatalogTransaction transaction, unique_ptr entry, OnCreateConflict on_conflict) { - DependencyList dependencies; + LogicalDependencyList dependencies; return AddEntryInternal(transaction, std::move(entry), on_conflict, dependencies); } @@ -13092,7 +13131,7 @@ optional_ptr DuckSchemaEntry::CreateView(CatalogTransaction transa optional_ptr DuckSchemaEntry::CreateIndex(ClientContext &context, CreateIndexInfo &info, TableCatalogEntry &table) { - DependencyList dependencies; + LogicalDependencyList dependencies; dependencies.AddDependency(table); // currently, we can not alter PK/FK/UNIQUE constraints @@ -13174,6 +13213,9 @@ void DuckSchemaEntry::DropEntry(ClientContext &context, DropInfo &info) { CatalogTypeToString(existing_entry->type), CatalogTypeToString(info.type)); } + // if this is a index or table with indexes, initialize any unknown index instances + LazyLoadIndexes(context, *existing_entry); + // if there is a foreign key constraint, get that information vector> fk_arrays; FindForeignKeyInformation(*existing_entry, AlterForeignKeyType::AFT_DELETE, fk_arrays); @@ -13571,7 +13613,7 @@ class WriteAheadLog { public: //! Replay the WAL - static bool Replay(AttachedDatabase &database, string &path); + static bool Replay(AttachedDatabase &database, unique_ptr handle); //! Returns the current size of the WAL in bytes int64_t GetWALSize(); @@ -13674,7 +13716,7 @@ class StorageManager { static StorageManager &Get(Catalog &catalog); //! Initialize a database or load an existing database from the given path - void Initialize(); + void Initialize(optional_ptr context); DatabaseInstance &GetDatabase(); AttachedDatabase &GetAttached() { @@ -13701,7 +13743,7 @@ class StorageManager { virtual shared_ptr GetTableIOManager(BoundCreateTableInfo *info) = 0; protected: - virtual void LoadDatabase() = 0; + virtual void LoadDatabase(optional_ptr context = nullptr) = 0; protected: //! The database this storage manager belongs to @@ -13724,7 +13766,7 @@ class StorageManager { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -13749,7 +13791,7 @@ class SingleFileStorageManager : public StorageManager { shared_ptr GetTableIOManager(BoundCreateTableInfo *info) override; protected: - void LoadDatabase() override; + void LoadDatabase(optional_ptr context = nullptr) override; }; } // namespace duckdb @@ -13904,7 +13946,7 @@ class PartialBlockManager { PartialBlockAllocation GetBlockAllocation(uint32_t segment_size); //! Register a partially filled block that is filled with "segment_size" entries - void RegisterPartialBlock(PartialBlockAllocation &&allocation); + void RegisterPartialBlock(PartialBlockAllocation allocation); //! Clear remaining blocks without writing them to disk void ClearBlocks(); @@ -14465,7 +14507,7 @@ struct TableScanBindData : public TableFunctionData { public: bool Equals(const FunctionData &other_p) const override { - auto &other = (const TableScanBindData &)other_p; + auto &other = other_p.Cast(); return &other.table == &table && result_ids == other.result_ids; } }; @@ -14576,14 +14618,6 @@ class UniqueConstraint : public Constraint { DUCKDB_API UniqueConstraint(LogicalIndex index, bool is_primary_key); DUCKDB_API UniqueConstraint(vector columns, bool is_primary_key); - //! The index of the column for which this constraint holds. Only used when the constraint relates to a single - //! column, equal to DConstants::INVALID_INDEX if not used - LogicalIndex index; - //! The set of columns for which this constraint holds by name. Only used when the index field is not used. - vector columns; - //! Whether or not this is a PRIMARY KEY constraint, or a UNIQUE constraint. - bool is_primary_key; - public: DUCKDB_API string ToString() const override; @@ -14592,8 +14626,57 @@ class UniqueConstraint : public Constraint { DUCKDB_API void Serialize(Serializer &serializer) const override; DUCKDB_API static unique_ptr Deserialize(Deserializer &deserializer); + bool IsPrimaryKey() const { + return is_primary_key; + } + + bool HasIndex() const { + return index.index != DConstants::INVALID_INDEX; + } + + LogicalIndex GetIndex() const { + if (!HasIndex()) { + throw InternalException("UniqueConstraint::GetIndex called on a unique constraint without a defined index"); + } + return index; + } + void SetIndex(LogicalIndex new_index) { + D_ASSERT(new_index.index != DConstants::INVALID_INDEX); + index = new_index; + } + + const vector &GetColumnNames() const { + D_ASSERT(columns.size() >= 1); + return columns; + } + vector &GetColumnNamesMutable() { + D_ASSERT(columns.size() >= 1); + return columns; + } + + void SetColumnName(string name) { + if (!columns.empty()) { + // name has already been set + return; + } + columns.push_back(std::move(name)); + } + private: UniqueConstraint(); + +#ifdef DUCKDB_API_1_0 +private: +#else +public: +#endif + //! The index of the column for which this constraint holds. Only used when the constraint relates to a single + //! column, equal to DConstants::INVALID_INDEX if not used + LogicalIndex index; + //! The set of columns for which this constraint holds by name. Only used when the index field is not used. + vector columns; + //! Whether or not this is a PRIMARY KEY constraint, or a UNIQUE constraint. + bool is_primary_key; }; } // namespace duckdb @@ -15085,8 +15168,8 @@ class TransactionException : public Exception { public: DUCKDB_API explicit TransactionException(const string &msg); - template - explicit TransactionException(const string &msg, Args... params) + template + explicit TransactionException(const string &msg, ARGS... params) : TransactionException(ConstructMessage(msg, params...)) { } }; @@ -15396,9 +15479,9 @@ unique_ptr DuckTableEntry::RenameColumn(ClientContext &context, Re case ConstraintType::UNIQUE: { // UNIQUE constraint: possibly need to rename columns auto &unique = copy->Cast(); - for (idx_t i = 0; i < unique.columns.size(); i++) { - if (unique.columns[i] == info.old_name) { - unique.columns[i] = info.new_name; + for (auto &column_name : unique.GetColumnNamesMutable()) { + if (column_name == info.old_name) { + column_name = info.new_name; } } break; @@ -15516,13 +15599,13 @@ void DuckTableEntry::UpdateConstraintsOnColumnDrop(const LogicalIndex &removed_i case ConstraintType::UNIQUE: { auto copy = constraint->Copy(); auto &unique = copy->Cast(); - if (unique.index.index != DConstants::INVALID_INDEX) { - if (unique.index == removed_index) { + if (unique.HasIndex()) { + if (unique.GetIndex() == removed_index) { throw CatalogException( "Cannot drop column \"%s\" because there is a UNIQUE constraint that depends on it", info.removed_column); } - unique.index = adjusted_indices[unique.index.index]; + unique.SetIndex(adjusted_indices[unique.GetIndex().index]); } create_info.constraints.push_back(std::move(copy)); break; @@ -15880,7 +15963,7 @@ void DuckTableEntry::SetAsRoot() { void DuckTableEntry::CommitAlter(string &column_name) { D_ASSERT(!column_name.empty()); - idx_t removed_index = DConstants::INVALID_INDEX; + optional_idx removed_index; for (auto &col : columns.Logical()) { if (col.Name() == column_name) { // No need to alter storage, removed column is generated column @@ -15891,8 +15974,7 @@ void DuckTableEntry::CommitAlter(string &column_name) { break; } } - D_ASSERT(removed_index != DConstants::INVALID_INDEX); - storage->CommitDropColumn(columns.LogicalToPhysical(LogicalIndex(removed_index)).index); + storage->CommitDropColumn(columns.LogicalToPhysical(LogicalIndex(removed_index.GetIndex())).index); } void DuckTableEntry::CommitDrop() { @@ -15969,13 +16051,9 @@ unique_ptr IndexCatalogEntry::GetInfo() const { } string IndexCatalogEntry::ToSQL() const { - if (sql.empty()) { - return sql; - } - if (sql.back() != ';') { - return sql + ";"; - } - return sql; + auto info = GetInfo(); + auto result = info->ToString(); + return result + ";\n"; } bool IndexCatalogEntry::IsUnique() { @@ -16113,7 +16191,7 @@ enum class AlterScalarFunctionType : uint8_t { INVALID = 0, ADD_FUNCTION_OVERLOA struct AlterScalarFunctionInfo : public AlterInfo { AlterScalarFunctionInfo(AlterScalarFunctionType type, AlterEntryData data); - virtual ~AlterScalarFunctionInfo() override; + ~AlterScalarFunctionInfo() override; AlterScalarFunctionType alter_scalar_function_type; @@ -16665,12 +16743,7 @@ template class basic_string_view { using string_view = basic_string_view; using wstring_view = basic_string_view; -// A UTF-8 code unit type. -#if FMT_HAS_FEATURE(__cpp_char8_t) -typedef char8_t fmt_char8_t; -#else typedef char fmt_char8_t; -#endif /** Specifies if ``T`` is a character type. Can be specialized by users. */ template struct is_char : std::false_type {}; @@ -21465,8 +21538,7 @@ struct UhugeintToStringCast { string_t result = StringVector::EmptyString(vector, str.length()); auto data = result.GetDataWriteable(); - // null-termination not required - memcpy(data, str.data(), str.length()); + memcpy(data, str.data(), str.length()); // NOLINT: null-termination not required result.Finalize(); return result; } @@ -21896,7 +21968,7 @@ class DuckTransaction : public Transaction { namespace duckdb { SequenceData::SequenceData(CreateSequenceInfo &info) - : usage_count(info.usage_count), counter(info.start_value), increment(info.increment), + : usage_count(info.usage_count), counter(info.start_value), last_value(info.start_value), increment(info.increment), start_value(info.start_value), min_value(info.min_value), max_value(info.max_value), cycle(info.cycle) { } @@ -22085,19 +22157,18 @@ string TableCatalogEntry::ColumnsToSQL(const ColumnList &columns, const vectortype == ConstraintType::UNIQUE) { auto &pk = constraint->Cast(); - vector constraint_columns = pk.columns; - if (pk.index.index != DConstants::INVALID_INDEX) { + if (pk.HasIndex()) { // no columns specified: single column constraint - if (pk.is_primary_key) { - pk_columns.insert(pk.index); + if (pk.IsPrimaryKey()) { + pk_columns.insert(pk.GetIndex()); } else { - unique_columns.insert(pk.index); + unique_columns.insert(pk.GetIndex()); } } else { // multi-column constraint, this constraint needs to go at the end after all columns - if (pk.is_primary_key) { + if (pk.IsPrimaryKey()) { // multi key pk column: insert set of columns into multi_key_pks - for (auto &col : pk.columns) { + for (auto &col : pk.GetColumnNames()) { multi_key_pks.insert(col); } } @@ -22321,7 +22392,7 @@ enum class AlterTableFunctionType : uint8_t { INVALID = 0, ADD_FUNCTION_OVERLOAD struct AlterTableFunctionInfo : public AlterInfo { AlterTableFunctionInfo(AlterTableFunctionType type, AlterEntryData data); - virtual ~AlterTableFunctionInfo() override; + ~AlterTableFunctionInfo() override; AlterTableFunctionType alter_table_function_type; @@ -23009,9 +23080,17 @@ Catalog &CatalogEntry::ParentCatalog() { throw InternalException("CatalogEntry::ParentCatalog called on catalog entry without catalog"); } +const Catalog &CatalogEntry::ParentCatalog() const { + throw InternalException("CatalogEntry::ParentCatalog called on catalog entry without catalog"); +} + SchemaCatalogEntry &CatalogEntry::ParentSchema() { throw InternalException("CatalogEntry::ParentSchema called on catalog entry without schema"); } + +const SchemaCatalogEntry &CatalogEntry::ParentSchema() const { + throw InternalException("CatalogEntry::ParentSchema called on catalog entry without schema"); +} // LCOV_EXCL_STOP void CatalogEntry::Serialize(Serializer &serializer) const { @@ -23106,6 +23185,11 @@ CatalogSearchEntry CatalogSearchEntry::ParseInternal(const string &input, idx_t if (input[idx] == '"') { //! unquote idx++; + if (idx < input.size() && input[idx] == '"') { + // escaped quote + entry += input[idx]; + continue; + } goto normal; } entry += input[idx]; @@ -23326,7 +23410,7 @@ namespace duckdb { class DuckCatalog : public Catalog { public: explicit DuckCatalog(AttachedDatabase &db); - ~DuckCatalog(); + ~DuckCatalog() override; public: bool IsDuckCatalog() override; @@ -23632,7 +23716,7 @@ bool CatalogSet::CreateEntryInternal(CatalogTransaction transaction, const strin } bool CatalogSet::CreateEntry(CatalogTransaction transaction, const string &name, unique_ptr value, - const DependencyList &dependencies) { + const LogicalDependencyList &dependencies) { CheckCatalogEntryInvariants(*value, name); // Set the timestamp to the timestamp of the current transaction @@ -23650,7 +23734,7 @@ bool CatalogSet::CreateEntry(CatalogTransaction transaction, const string &name, } bool CatalogSet::CreateEntry(ClientContext &context, const string &name, unique_ptr value, - const DependencyList &dependencies) { + const LogicalDependencyList &dependencies) { return CreateEntry(catalog.GetCatalogTransaction(context), name, std::move(value), dependencies); } @@ -24250,7 +24334,7 @@ class GroupByNode; //! plan and executed. class Parser { public: - Parser(ParserOptions options = ParserOptions()); + explicit Parser(ParserOptions options = ParserOptions()); //! The parsed SQL statements from an invocation to ParseQuery. vector> statements; @@ -24344,7 +24428,7 @@ class TableMacroFunction : public MacroFunction { namespace duckdb { -static DefaultMacro internal_macros[] = { +static const DefaultMacro internal_macros[] = { {DEFAULT_SCHEMA, "current_role", {nullptr}, "'duckdb'"}, // user name of current execution context {DEFAULT_SCHEMA, "current_user", {nullptr}, "'duckdb'"}, // user name of current execution context {DEFAULT_SCHEMA, "current_catalog", {nullptr}, "current_database()"}, // name of current database (called "catalog" in the SQL standard) @@ -24395,8 +24479,8 @@ static DefaultMacro internal_macros[] = { {"pg_catalog", "pg_get_viewdef", {"oid", nullptr}, "(select sql from duckdb_views() v where v.view_oid=oid)"}, {"pg_catalog", "pg_get_constraintdef", {"constraint_oid", "pretty_bool", nullptr}, "(select constraint_text from duckdb_constraints() d_constraint where d_constraint.table_oid=constraint_oid//1000000 and d_constraint.constraint_index=constraint_oid%1000000)"}, {"pg_catalog", "pg_get_expr", {"pg_node_tree", "relation_oid", nullptr}, "pg_node_tree"}, - {"pg_catalog", "format_pg_type", {"type_name", nullptr}, "case when logical_type='FLOAT' then 'real' when logical_type='DOUBLE' then 'double precision' when logical_type='DECIMAL' then 'numeric' when logical_type='ENUM' then lower(type_name) when logical_type='VARCHAR' then 'character varying' when logical_type='BLOB' then 'bytea' when logical_type='TIMESTAMP' then 'timestamp without time zone' when logical_type='TIME' then 'time without time zone' else lower(logical_type) end"}, - {"pg_catalog", "format_type", {"type_oid", "typemod", nullptr}, "(select format_pg_type(type_name) from duckdb_types() t where t.type_oid=type_oid) || case when typemod>0 then concat('(', typemod//1000, ',', typemod%1000, ')') else '' end"}, + {"pg_catalog", "format_pg_type", {"logical_type", "type_name", nullptr}, "case when logical_type='FLOAT' then 'real' when logical_type='DOUBLE' then 'double precision' when logical_type='DECIMAL' then 'numeric' when logical_type='ENUM' then lower(type_name) when logical_type='VARCHAR' then 'character varying' when logical_type='BLOB' then 'bytea' when logical_type='TIMESTAMP' then 'timestamp without time zone' when logical_type='TIME' then 'time without time zone' else lower(logical_type) end"}, + {"pg_catalog", "format_type", {"type_oid", "typemod", nullptr}, "(select format_pg_type(logical_type, type_name) from duckdb_types() t where t.type_oid=type_oid) || case when typemod>0 then concat('(', typemod//1000, ',', typemod%1000, ')') else '' end"}, {"pg_catalog", "pg_has_role", {"user", "role", "privilege", nullptr}, "true"}, //boolean //does user have privilege for role {"pg_catalog", "pg_has_role", {"role", "privilege", nullptr}, "true"}, //boolean //does current user have privilege for role @@ -24506,7 +24590,7 @@ static DefaultMacro internal_macros[] = { {nullptr, nullptr, {nullptr}, nullptr} }; -unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(DefaultMacro &default_macro, unique_ptr function) { +unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(const DefaultMacro &default_macro, unique_ptr function) { for (idx_t param_idx = 0; default_macro.parameters[param_idx] != nullptr; param_idx++) { function->parameters.push_back( make_uniq(default_macro.parameters[param_idx])); @@ -24523,7 +24607,7 @@ unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroIn } -unique_ptr DefaultFunctionGenerator::CreateInternalMacroInfo(DefaultMacro &default_macro) { +unique_ptr DefaultFunctionGenerator::CreateInternalMacroInfo(const DefaultMacro &default_macro) { // parse the expression auto expressions = Parser::ParseExpressionList(default_macro.macro); D_ASSERT(expressions.size() == 1); @@ -24532,7 +24616,7 @@ unique_ptr DefaultFunctionGenerator::CreateInternalMacroInfo(De return CreateInternalTableMacroInfo(default_macro, std::move(result)); } -unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(DefaultMacro &default_macro) { +unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(const DefaultMacro &default_macro) { Parser parser; parser.ParseQuery(default_macro.macro); D_ASSERT(parser.statements.size() == 1); @@ -24592,7 +24676,7 @@ struct DefaultSchema { const char *name; }; -static DefaultSchema internal_schemas[] = {{"information_schema"}, {"pg_catalog"}, {nullptr}}; +static const DefaultSchema internal_schemas[] = {{"information_schema"}, {"pg_catalog"}, {nullptr}}; static bool GetDefaultSchema(const string &input_schema) { auto schema = StringUtil::Lower(input_schema); @@ -24792,7 +24876,7 @@ struct DefaultView { const char *sql; }; -static DefaultView internal_views[] = { +static const DefaultView internal_views[] = { {DEFAULT_SCHEMA, "pragma_database_list", "SELECT database_oid AS seq, database_name AS name, path AS file FROM duckdb_databases() WHERE NOT internal ORDER BY 1"}, {DEFAULT_SCHEMA, "sqlite_master", "select 'table' \"type\", table_name \"name\", table_name \"tbl_name\", 0 rootpage, sql from duckdb_tables union all select 'view' \"type\", view_name \"name\", view_name \"tbl_name\", 0 rootpage, sql from duckdb_views union all select 'index' \"type\", index_name \"name\", table_name \"tbl_name\", 0 rootpage, sql from duckdb_indexes;"}, {DEFAULT_SCHEMA, "sqlite_schema", "SELECT * FROM sqlite_master"}, @@ -24824,13 +24908,13 @@ static DefaultView internal_views[] = { {"pg_catalog", "pg_settings", "SELECT name, value setting, description short_desc, CASE WHEN input_type = 'VARCHAR' THEN 'string' WHEN input_type = 'BOOLEAN' THEN 'bool' WHEN input_type IN ('BIGINT', 'UBIGINT') THEN 'integer' ELSE input_type END vartype FROM duckdb_settings()"}, {"pg_catalog", "pg_tables", "SELECT schema_name schemaname, table_name tablename, 'duckdb' tableowner, NULL \"tablespace\", index_count > 0 hasindexes, false hasrules, false hastriggers FROM duckdb_tables()"}, {"pg_catalog", "pg_tablespace", "SELECT 0 oid, 'pg_default' spcname, 0 spcowner, NULL spcacl, NULL spcoptions"}, - {"pg_catalog", "pg_type", "SELECT type_oid oid, format_pg_type(type_name) typname, schema_oid typnamespace, 0 typowner, type_size typlen, false typbyval, CASE WHEN logical_type='ENUM' THEN 'e' else 'b' end typtype, CASE WHEN type_category='NUMERIC' THEN 'N' WHEN type_category='STRING' THEN 'S' WHEN type_category='DATETIME' THEN 'D' WHEN type_category='BOOLEAN' THEN 'B' WHEN type_category='COMPOSITE' THEN 'C' WHEN type_category='USER' THEN 'U' ELSE 'X' END typcategory, false typispreferred, true typisdefined, NULL typdelim, NULL typrelid, NULL typsubscript, NULL typelem, NULL typarray, NULL typinput, NULL typoutput, NULL typreceive, NULL typsend, NULL typmodin, NULL typmodout, NULL typanalyze, 'd' typalign, 'p' typstorage, NULL typnotnull, NULL typbasetype, NULL typtypmod, NULL typndims, NULL typcollation, NULL typdefaultbin, NULL typdefault, NULL typacl FROM duckdb_types() WHERE type_size IS NOT NULL;"}, + {"pg_catalog", "pg_type", "SELECT type_oid oid, format_pg_type(logical_type, type_name) typname, schema_oid typnamespace, 0 typowner, type_size typlen, false typbyval, CASE WHEN logical_type='ENUM' THEN 'e' else 'b' end typtype, CASE WHEN type_category='NUMERIC' THEN 'N' WHEN type_category='STRING' THEN 'S' WHEN type_category='DATETIME' THEN 'D' WHEN type_category='BOOLEAN' THEN 'B' WHEN type_category='COMPOSITE' THEN 'C' WHEN type_category='USER' THEN 'U' ELSE 'X' END typcategory, false typispreferred, true typisdefined, NULL typdelim, NULL typrelid, NULL typsubscript, NULL typelem, NULL typarray, NULL typinput, NULL typoutput, NULL typreceive, NULL typsend, NULL typmodin, NULL typmodout, NULL typanalyze, 'd' typalign, 'p' typstorage, NULL typnotnull, NULL typbasetype, NULL typtypmod, NULL typndims, NULL typcollation, NULL typdefaultbin, NULL typdefault, NULL typacl FROM duckdb_types() WHERE type_size IS NOT NULL;"}, {"pg_catalog", "pg_views", "SELECT schema_name schemaname, view_name viewname, 'duckdb' viewowner, sql definition FROM duckdb_views()"}, - {"information_schema", "columns", "SELECT database_name table_catalog, schema_name table_schema, table_name, column_name, column_index ordinal_position, column_default, CASE WHEN is_nullable THEN 'YES' ELSE 'NO' END is_nullable, data_type, character_maximum_length, NULL character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, NULL datetime_precision, NULL interval_type, NULL interval_precision, NULL character_set_catalog, NULL character_set_schema, NULL character_set_name, NULL collation_catalog, NULL collation_schema, NULL collation_name, NULL domain_catalog, NULL domain_schema, NULL domain_name, NULL udt_catalog, NULL udt_schema, NULL udt_name, NULL scope_catalog, NULL scope_schema, NULL scope_name, NULL maximum_cardinality, NULL dtd_identifier, NULL is_self_referencing, NULL is_identity, NULL identity_generation, NULL identity_start, NULL identity_increment, NULL identity_maximum, NULL identity_minimum, NULL identity_cycle, NULL is_generated, NULL generation_expression, NULL is_updatable, comment AS COLUMN_COMMENT FROM duckdb_columns;"}, - {"information_schema", "schemata", "SELECT database_name catalog_name, schema_name, 'duckdb' schema_owner, NULL default_character_set_catalog, NULL default_character_set_schema, NULL default_character_set_name, sql sql_path FROM duckdb_schemas()"}, - {"information_schema", "tables", "SELECT database_name table_catalog, schema_name table_schema, table_name, CASE WHEN temporary THEN 'LOCAL TEMPORARY' ELSE 'BASE TABLE' END table_type, NULL self_referencing_column_name, NULL reference_generation, NULL user_defined_type_catalog, NULL user_defined_type_schema, NULL user_defined_type_name, 'YES' is_insertable_into, 'NO' is_typed, CASE WHEN temporary THEN 'PRESERVE' ELSE NULL END commit_action, comment AS TABLE_COMMENT FROM duckdb_tables() UNION ALL SELECT database_name table_catalog, schema_name table_schema, view_name table_name, 'VIEW' table_type, NULL self_referencing_column_name, NULL reference_generation, NULL user_defined_type_catalog, NULL user_defined_type_schema, NULL user_defined_type_name, 'NO' is_insertable_into, 'NO' is_typed, NULL commit_action, comment AS TABLE_COMMENT FROM duckdb_views;"}, - {"information_schema", "character_sets", "SELECT NULL character_set_catalog, NULL character_set_schema, 'UTF8' character_set_name, 'UCS' character_repertoire, 'UTF8' form_of_use, current_database() default_collate_catalog, 'pg_catalog' default_collate_schema, 'ucs_basic' default_collate_name;"}, - {"information_schema", "referential_constraints", "SELECT f.database_name constraint_catalog, f.schema_name constraint_schema, concat(f.source, '_', f.target, '_', f.target_column, '_fkey') constraint_name, current_database() unique_constraint_catalog, c.schema_name unique_constraint_schema, concat(c.table_name, '_', f.target_column, '_', CASE WHEN c.constraint_type == 'UNIQUE' THEN 'key' ELSE 'pkey' END) unique_constraint_name, 'NONE' match_option, 'NO ACTION' update_rule, 'NO ACTION' delete_rule FROM duckdb_constraints() c JOIN (SELECT *, name_extract['source'] as source, name_extract['target'] as target, name_extract['target_column'] as target_column FROM (SELECT *, regexp_extract(constraint_text, 'FOREIGN KEY \\(([a-zA-Z_0-9]+)\\) REFERENCES ([a-zA-Z_0-9]+)\\(([a-zA-Z_0-9]+)\\)', ['source', 'target', 'target_column']) name_extract FROM duckdb_constraints() WHERE constraint_type = 'FOREIGN KEY')) f ON name_extract['target'] = c.table_name AND (c.constraint_type = 'UNIQUE' OR c.constraint_type = 'PRIMARY KEY')"}, + {"information_schema", "columns", "SELECT database_name table_catalog, schema_name table_schema, table_name, column_name, column_index ordinal_position, column_default, CASE WHEN is_nullable THEN 'YES' ELSE 'NO' END is_nullable, data_type, character_maximum_length, NULL::INT character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, NULL::INT datetime_precision, NULL::VARCHAR interval_type, NULL::INT interval_precision, NULL::VARCHAR character_set_catalog, NULL::VARCHAR character_set_schema, NULL::VARCHAR character_set_name, NULL::VARCHAR collation_catalog, NULL::VARCHAR collation_schema, NULL::VARCHAR collation_name, NULL::VARCHAR domain_catalog, NULL::VARCHAR domain_schema, NULL::VARCHAR domain_name, NULL::VARCHAR udt_catalog, NULL::VARCHAR udt_schema, NULL::VARCHAR udt_name, NULL::VARCHAR scope_catalog, NULL::VARCHAR scope_schema, NULL::VARCHAR scope_name, NULL::BIGINT maximum_cardinality, NULL::VARCHAR dtd_identifier, NULL::BOOL is_self_referencing, NULL::BOOL is_identity, NULL::VARCHAR identity_generation, NULL::VARCHAR identity_start, NULL::VARCHAR identity_increment, NULL::VARCHAR identity_maximum, NULL::VARCHAR identity_minimum, NULL::BOOL identity_cycle, NULL::VARCHAR is_generated, NULL::VARCHAR generation_expression, NULL::BOOL is_updatable, comment AS COLUMN_COMMENT FROM duckdb_columns;"}, + {"information_schema", "schemata", "SELECT database_name catalog_name, schema_name, 'duckdb' schema_owner, NULL::VARCHAR default_character_set_catalog, NULL::VARCHAR default_character_set_schema, NULL::VARCHAR default_character_set_name, sql sql_path FROM duckdb_schemas()"}, + {"information_schema", "tables", "SELECT database_name table_catalog, schema_name table_schema, table_name, CASE WHEN temporary THEN 'LOCAL TEMPORARY' ELSE 'BASE TABLE' END table_type, NULL::VARCHAR self_referencing_column_name, NULL::VARCHAR reference_generation, NULL::VARCHAR user_defined_type_catalog, NULL::VARCHAR user_defined_type_schema, NULL::VARCHAR user_defined_type_name, 'YES' is_insertable_into, 'NO' is_typed, CASE WHEN temporary THEN 'PRESERVE' ELSE NULL END commit_action, comment AS TABLE_COMMENT FROM duckdb_tables() UNION ALL SELECT database_name table_catalog, schema_name table_schema, view_name table_name, 'VIEW' table_type, NULL self_referencing_column_name, NULL reference_generation, NULL user_defined_type_catalog, NULL user_defined_type_schema, NULL user_defined_type_name, 'NO' is_insertable_into, 'NO' is_typed, NULL commit_action, comment AS TABLE_COMMENT FROM duckdb_views;"}, + {"information_schema", "character_sets", "SELECT NULL::VARCHAR character_set_catalog, NULL::VARCHAR character_set_schema, 'UTF8' character_set_name, 'UCS' character_repertoire, 'UTF8' form_of_use, current_database() default_collate_catalog, 'pg_catalog' default_collate_schema, 'ucs_basic' default_collate_name;"}, + {"information_schema", "referential_constraints", "SELECT f.database_name constraint_catalog, f.schema_name constraint_schema, concat(f.table_name, '_', f.source, '_fkey') constraint_name, current_database() unique_constraint_catalog, c.schema_name unique_constraint_schema, concat(c.table_name, '_', f.target_column, '_', CASE WHEN c.constraint_type == 'UNIQUE' THEN 'key' ELSE 'pkey' END) unique_constraint_name, 'NONE' match_option, 'NO ACTION' update_rule, 'NO ACTION' delete_rule FROM duckdb_constraints() c JOIN (SELECT *, name_extract['source'] as source, name_extract['target'] as target, name_extract['target_column'] as target_column FROM (SELECT *, regexp_extract(constraint_text, 'FOREIGN KEY \\(([a-zA-Z_0-9]+)\\) REFERENCES ([a-zA-Z_0-9]+)\\(([a-zA-Z_0-9]+)\\)', ['source', 'target', 'target_column']) name_extract FROM duckdb_constraints() WHERE constraint_type = 'FOREIGN KEY')) f ON name_extract['target'] = c.table_name AND (c.constraint_type = 'UNIQUE' OR c.constraint_type = 'PRIMARY KEY')"}, {"information_schema", "key_column_usage", "SELECT current_database() constraint_catalog, schema_name constraint_schema, concat(table_name, '_', constraint_column_names[1], CASE constraint_type WHEN 'FOREIGN KEY' THEN '_fkey' WHEN 'PRIMARY KEY' THEN '_pkey' ELSE '_key' END) constraint_name, current_database() table_catalog, schema_name table_schema, table_name, constraint_column_names[1] column_name, 1 ordinal_position, CASE constraint_type WHEN 'FOREIGN KEY' THEN 1 ELSE NULL END position_in_unique_constraint FROM duckdb_constraints() WHERE constraint_type = 'FOREIGN KEY' OR constraint_type = 'PRIMARY KEY' OR constraint_type = 'UNIQUE';"}, {"information_schema", "table_constraints", "SELECT current_database() constraint_catalog, schema_name constraint_schema, concat(table_name, '_', CASE WHEN length(constraint_column_names) > 1 THEN NULL ELSE constraint_column_names[1] || '_' END, CASE constraint_type WHEN 'FOREIGN KEY' THEN 'fkey' WHEN 'PRIMARY KEY' THEN 'pkey' WHEN 'UNIQUE' THEN 'key' WHEN 'CHECK' THEN 'check' WHEN 'NOT NULL' THEN 'not_null' END) constraint_name, current_database() table_catalog, schema_name table_schema, table_name, CASE constraint_type WHEN 'NOT NULL' THEN 'CHECK' ELSE constraint_type END constraint_type, 'NO' is_deferrable, 'NO' initially_deferred, 'YES' enforced, 'YES' nulls_distinct FROM duckdb_constraints() WHERE constraint_type = 'PRIMARY KEY' OR constraint_type = 'FOREIGN KEY' OR constraint_type = 'UNIQUE' OR constraint_type = 'CHECK' OR constraint_type = 'NOT NULL';"}, {nullptr, nullptr, nullptr}}; @@ -24921,7 +25005,8 @@ MangledDependencyName DependencyCatalogSet::ApplyPrefix(const MangledEntryName & bool DependencyCatalogSet::CreateEntry(CatalogTransaction transaction, const MangledEntryName &name, unique_ptr value) { auto new_name = ApplyPrefix(name); - return set.CreateEntry(transaction, new_name.name, std::move(value), DependencyList()); + const LogicalDependencyList EMPTY_DEPENDENCIES; + return set.CreateEntry(transaction, new_name.name, std::move(value), EMPTY_DEPENDENCIES); } CatalogSet::EntryLookup DependencyCatalogSet::GetEntryDetailed(CatalogTransaction transaction, @@ -24961,27 +25046,111 @@ bool DependencyCatalogSet::DropEntry(CatalogTransaction transaction, const Mangl + + + + namespace duckdb { -void DependencyList::AddDependency(CatalogEntry &entry) { - if (entry.internal) { - return; +uint64_t LogicalDependencyHashFunction::operator()(const LogicalDependency &a) const { + auto &name = a.entry.name; + auto &schema = a.entry.schema; + auto &type = a.entry.type; + auto &catalog = a.catalog; + + hash_t hash = duckdb::Hash(name.c_str()); + hash = CombineHash(hash, duckdb::Hash(schema.c_str())); + hash = CombineHash(hash, duckdb::Hash(catalog.c_str())); + hash = CombineHash(hash, duckdb::Hash(static_cast(type))); + return hash; +} + +bool LogicalDependencyEquality::operator()(const LogicalDependency &a, const LogicalDependency &b) const { + if (a.entry.type != b.entry.type) { + return false; } + if (a.entry.name != b.entry.name) { + return false; + } + if (a.entry.schema != b.entry.schema) { + return false; + } + if (a.catalog != b.catalog) { + return false; + } + return true; +} + +LogicalDependency::LogicalDependency() : entry(), catalog() { +} + +static string GetSchema(CatalogEntry &entry) { + if (entry.type == CatalogType::SCHEMA_ENTRY) { + return entry.name; + } + return entry.ParentSchema().name; +} + +LogicalDependency::LogicalDependency(CatalogEntry &entry) { + catalog = INVALID_CATALOG; + if (entry.type == CatalogType::DEPENDENCY_ENTRY) { + auto &dependency_entry = entry.Cast(); + + this->entry = dependency_entry.EntryInfo(); + } else { + this->entry.schema = GetSchema(entry); + this->entry.name = entry.name; + this->entry.type = entry.type; + catalog = entry.ParentCatalog().GetName(); + } +} + +bool LogicalDependency::operator==(const LogicalDependency &other) const { + return other.entry.name == entry.name && other.entry.schema == entry.schema && other.entry.type == entry.type; +} + +void LogicalDependencyList::AddDependency(CatalogEntry &entry) { + LogicalDependency dependency(entry); + set.insert(dependency); +} + +void LogicalDependencyList::AddDependency(const LogicalDependency &entry) { set.insert(entry); } -void DependencyList::VerifyDependencies(Catalog &catalog, const string &name) { - for (auto &dep_entry : set) { - auto &dep = dep_entry.get(); - if (&dep.ParentCatalog() != &catalog) { +bool LogicalDependencyList::Contains(CatalogEntry &entry_p) { + LogicalDependency logical_entry(entry_p); + return set.count(logical_entry); +} + +void LogicalDependencyList::VerifyDependencies(Catalog &catalog, const string &name) { + for (auto &dep : set) { + if (dep.catalog != catalog.GetName()) { throw DependencyException( "Error adding dependency for object \"%s\" - dependency \"%s\" is in catalog " "\"%s\", which does not match the catalog \"%s\".\nCross catalog dependencies are not supported.", - name, dep.name, dep.ParentCatalog().GetName(), catalog.GetName()); + name, dep.entry.name, dep.catalog, catalog.GetName()); } } } +const LogicalDependencyList::create_info_set_t &LogicalDependencyList::Set() const { + return set; +} + +bool LogicalDependencyList::operator==(const LogicalDependencyList &other) const { + if (set.size() != other.set.size()) { + return false; + } + + for (auto &entry : set) { + if (!other.set.count(entry)) { + return false; + } + } + return true; +} + } // namespace duckdb @@ -24999,6 +25168,8 @@ void DependencyList::VerifyDependencies(Catalog &catalog, const string &name) { + + namespace duckdb { static void AssertMangledName(const string &mangled_name, idx_t expected_null_bytes) { @@ -25028,7 +25199,7 @@ MangledDependencyName::MangledDependencyName(const MangledEntryName &from, const DependencyManager::DependencyManager(DuckCatalog &catalog) : catalog(catalog), subjects(catalog), dependents(catalog) { } -string DependencyManager::GetSchema(CatalogEntry &entry) { +string DependencyManager::GetSchema(const CatalogEntry &entry) { if (entry.type == CatalogType::SCHEMA_ENTRY) { return entry.name; } @@ -25039,7 +25210,7 @@ MangledEntryName DependencyManager::MangleName(const CatalogEntryInfo &info) { return MangledEntryName(info); } -MangledEntryName DependencyManager::MangleName(CatalogEntry &entry) { +MangledEntryName DependencyManager::MangleName(const CatalogEntry &entry) { if (entry.type == CatalogType::DEPENDENCY_ENTRY) { auto &dependency_entry = entry.Cast(); return dependency_entry.EntryMangledName(); @@ -25237,47 +25408,42 @@ void DependencyManager::CreateDependency(CatalogTransaction transaction, Depende CreateSubject(transaction, info); } -void DependencyManager::AddObject(CatalogTransaction transaction, CatalogEntry &object, - const DependencyList &dependencies) { - if (IsSystemEntry(object)) { - // Don't do anything for this - return; +void DependencyManager::CreateDependencies(CatalogTransaction transaction, const CatalogEntry &object, + const LogicalDependencyList &dependencies) { + DependencyDependentFlags dependency_flags; + if (object.type != CatalogType::INDEX_ENTRY) { + // indexes do not require CASCADE to be dropped, they are simply always dropped along with the table + dependency_flags.SetBlocking(); } + const auto object_info = GetLookupProperties(object); // check for each object in the sources if they were not deleted yet - for (auto &dep : dependencies.set) { - auto &dependency = dep.get(); - if (&dependency.ParentCatalog() != &object.ParentCatalog()) { + for (auto &dependency : dependencies.Set()) { + if (dependency.catalog != object.ParentCatalog().GetName()) { throw DependencyException( "Error adding dependency for object \"%s\" - dependency \"%s\" is in catalog " "\"%s\", which does not match the catalog \"%s\".\nCross catalog dependencies are not supported.", - object.name, dependency.name, dependency.ParentCatalog().GetName(), object.ParentCatalog().GetName()); - } - if (!dependency.set) { - throw InternalException("Dependency has no set"); - } - auto catalog_entry = dependency.set->GetEntry(transaction, dependency.name); - if (!catalog_entry) { - throw InternalException("Dependency has already been deleted?"); + object.name, dependency.entry.name, dependency.catalog, object.ParentCatalog().GetName()); } } - // indexes do not require CASCADE to be dropped, they are simply always dropped along with the table - DependencyDependentFlags dependency_flags; - if (object.type != CatalogType::INDEX_ENTRY) { - // indexes do not require CASCADE to be dropped, they are simply always dropped along with the table - dependency_flags.SetBlocking(); - } - // add the object to the dependents_map of each object that it depends on - for (auto &dependency : dependencies.set) { - DependencyInfo info { - /*dependent = */ DependencyDependent {GetLookupProperties(object), dependency_flags}, - /*subject = */ DependencySubject {GetLookupProperties(dependency), DependencySubjectFlags()}}; + for (auto &dependency : dependencies.Set()) { + DependencyInfo info {/*dependent = */ DependencyDependent {GetLookupProperties(object), dependency_flags}, + /*subject = */ DependencySubject {dependency.entry, DependencySubjectFlags()}}; CreateDependency(transaction, info); } } +void DependencyManager::AddObject(CatalogTransaction transaction, CatalogEntry &object, + const LogicalDependencyList &dependencies) { + if (IsSystemEntry(object)) { + // Don't do anything for this + return; + } + CreateDependencies(transaction, object, dependencies); +} + static bool CascadeDrop(bool cascade, const DependencyDependentFlags &flags) { if (cascade) { return true; @@ -25289,7 +25455,7 @@ static bool CascadeDrop(bool cascade, const DependencyDependentFlags &flags) { return !flags.IsBlocking(); } -CatalogEntryInfo DependencyManager::GetLookupProperties(CatalogEntry &entry) { +CatalogEntryInfo DependencyManager::GetLookupProperties(const CatalogEntry &entry) { if (entry.type == CatalogType::DEPENDENCY_ENTRY) { auto &dependency_entry = entry.Cast(); return dependency_entry.EntryInfo(); @@ -25302,6 +25468,9 @@ CatalogEntryInfo DependencyManager::GetLookupProperties(CatalogEntry &entry) { } optional_ptr DependencyManager::LookupEntry(CatalogTransaction transaction, CatalogEntry &dependency) { + if (dependency.type != CatalogType::DEPENDENCY_ENTRY) { + return &dependency; + } auto info = GetLookupProperties(dependency); auto &type = info.type; @@ -25384,63 +25553,48 @@ void DependencyManager::AlterObject(CatalogTransaction transaction, CatalogEntry return; } - auto info = GetLookupProperties(old_obj); - dependency_set_t owned_objects; - ScanDependents(transaction, info, [&](DependencyEntry &dep) { + const auto old_info = GetLookupProperties(old_obj); + const auto new_info = GetLookupProperties(new_obj); + + vector dependencies; + // Other entries that depend on us + ScanDependents(transaction, old_info, [&](DependencyEntry &dep) { // It makes no sense to have a schema depend on anything D_ASSERT(dep.EntryInfo().type != CatalogType::SCHEMA_ENTRY); - auto entry = LookupEntry(transaction, dep); - if (!entry) { - return; - } - // conflict: attempting to alter this object but the dependent object still exists - // no cascade and there are objects that depend on this object: throw error throw DependencyException("Cannot alter entry \"%s\" because there are entries that " "depend on it.", old_obj.name); + + auto dep_info = DependencyInfo::FromDependent(dep); + dep_info.subject.entry = new_info; + dependencies.emplace_back(dep_info); }); // Keep old dependencies dependency_set_t dependents; - ScanSubjects(transaction, info, [&](DependencyEntry &dep) { + ScanSubjects(transaction, old_info, [&](DependencyEntry &dep) { auto entry = LookupEntry(transaction, dep); if (!entry) { return; } - if (dep.Subject().flags.IsOwnership()) { - owned_objects.insert(Dependency(*entry, dep.Dependent().flags)); - return; - } - dependents.insert(Dependency(*entry, dep.Dependent().flags)); + + auto dep_info = DependencyInfo::FromSubject(dep); + dep_info.dependent.entry = new_info; + dependencies.emplace_back(dep_info); }); // FIXME: we should update dependencies in the future // some alters could cause dependencies to change (imagine types of table columns) // or DEFAULT depending on a sequence - if (StringUtil::CIEquals(old_obj.name, new_obj.name)) { - // The name was not changed, we do not need to recreate the dependency links - return; - } - CleanupDependencies(transaction, old_obj); - - for (auto &dep : dependents) { - auto &other = dep.entry.get(); - DependencyInfo info {/*dependent = */ DependencyDependent {GetLookupProperties(new_obj), dep.flags}, - /*subject = */ DependencySubject {GetLookupProperties(other), DependencySubjectFlags()}}; - CreateDependency(transaction, info); + if (!StringUtil::CIEquals(old_obj.name, new_obj.name)) { + // The name has been changed, we need to recreate the dependency links + CleanupDependencies(transaction, old_obj); } - // For all the objects we own, re establish the dependency of the owner on the object - for (auto &object : owned_objects) { - auto &entry = object.entry.get(); - { - DependencyInfo info { - /*dependent = */ DependencyDependent {GetLookupProperties(new_obj), - DependencyDependentFlags().SetOwnedBy()}, - /*subject = */ DependencySubject {GetLookupProperties(entry), DependencySubjectFlags().SetOwnership()}}; - CreateDependency(transaction, info); - } + // Reinstate the old dependencies + for (auto &dep : dependencies) { + CreateDependency(transaction, dep); } } @@ -25478,7 +25632,7 @@ void DependencyManager::AddOwnership(CatalogTransaction transaction, CatalogEntr } // If the owner is already owned by something else, throw an error - auto owner_info = GetLookupProperties(owner); + const auto owner_info = GetLookupProperties(owner); ScanDependents(transaction, owner_info, [&](DependencyEntry &dep) { if (dep.Dependent().flags.IsOwnedBy()) { throw DependencyException("%s can not become the owner, it is already owned by %s", owner.name, @@ -25646,7 +25800,7 @@ bool DuckCatalog::IsDuckCatalog() { // Schema //===--------------------------------------------------------------------===// optional_ptr DuckCatalog::CreateSchemaInternal(CatalogTransaction transaction, CreateSchemaInfo &info) { - DependencyList dependencies; + LogicalDependencyList dependencies; auto entry = make_uniq(*this, info); auto result = entry.get(); if (!schemas->CreateEntry(transaction, info.schema, std::move(entry), dependencies)) { @@ -26372,8 +26526,8 @@ struct DuckDBResultData { duckdb_type ConvertCPPTypeToC(const LogicalType &type); LogicalTypeId ConvertCTypeToCPP(duckdb_type c_type); idx_t GetCTypeSize(duckdb_type type); -duckdb_state duckdb_translate_result(unique_ptr result, duckdb_result *out); -bool deprecated_materialize_result(duckdb_result *result); +duckdb_state DuckDBTranslateResult(unique_ptr result, duckdb_result *out); +bool DeprecatedMaterializeResult(duckdb_result *result); duckdb_statement_type StatementTypeToC(duckdb::StatementType statement_type); } // namespace duckdb @@ -26543,21 +26697,21 @@ enum class ArrowDateTimeType : uint8_t { class ArrowType { public: //! From a DuckDB type - ArrowType(LogicalType type_p) + ArrowType(LogicalType type_p) // NOLINT: allow implicit conversion : type(std::move(type_p)), size_type(ArrowVariableSizeType::NORMAL), date_time_precision(ArrowDateTimeType::DAYS) {}; //! From a DuckDB type + fixed_size - ArrowType(LogicalType type_p, idx_t fixed_size_p) + ArrowType(LogicalType type_p, idx_t fixed_size_p) // NOLINT: work-around bug in clang-tidy : type(std::move(type_p)), size_type(ArrowVariableSizeType::FIXED_SIZE), date_time_precision(ArrowDateTimeType::DAYS), fixed_size(fixed_size_p) {}; //! From a DuckDB type + variable size type - ArrowType(LogicalType type_p, ArrowVariableSizeType size_type_p) + ArrowType(LogicalType type_p, ArrowVariableSizeType size_type_p) // NOLINT: work-around bug in clang-tidy : type(std::move(type_p)), size_type(size_type_p), date_time_precision(ArrowDateTimeType::DAYS) {}; //! From a DuckDB type + datetime type - ArrowType(LogicalType type_p, ArrowDateTimeType date_time_precision_p) + ArrowType(LogicalType type_p, ArrowDateTimeType date_time_precision_p) // NOLINT: work-around bug in clang-tidy : type(std::move(type_p)), size_type(ArrowVariableSizeType::NORMAL), date_time_precision(date_time_precision_p) {}; @@ -26679,7 +26833,7 @@ struct ArrowRunEndEncodingState { struct ArrowScanLocalState; struct ArrowArrayScanState { public: - ArrowArrayScanState(ArrowScanLocalState &state); + explicit ArrowArrayScanState(ArrowScanLocalState &state); public: ArrowScanLocalState &state; @@ -26743,7 +26897,7 @@ struct ArrowScanLocalState : public LocalTableFunctionState { if (it == array_states.end()) { auto child_p = make_uniq(*this); auto &child = *child_p; - array_states.emplace(std::make_pair(child_idx, std::move(child_p))); + array_states.emplace(child_idx, std::move(child_p)); return child; } return *it->second; @@ -26874,6 +27028,8 @@ struct DuckDBAdbcStatementWrapper { char *ingestion_table_name; ArrowArrayStream ingestion_stream; IngestionMode ingestion_mode = IngestionMode::CREATE; + uint8_t *substrait_plan; + uint64_t plan_length; }; static AdbcStatusCode QueryInternal(struct AdbcConnection *connection, struct ArrowArrayStream *out, const char *query, @@ -26975,11 +27131,10 @@ AdbcStatusCode StatementSetSubstraitPlan(struct AdbcStatement *statement, const return ADBC_STATUS_INVALID_ARGUMENT; } auto wrapper = reinterpret_cast(statement->private_data); - auto plan_str = std::string(reinterpret_cast(plan), length); - auto query = "CALL from_substrait('" + plan_str + "'::BLOB)"; - auto res = duckdb_prepare(wrapper->connection, query.c_str(), &wrapper->statement); - auto error_msg = duckdb_prepare_error(wrapper->statement); - return CheckResult(res, error, error_msg); + wrapper->substrait_plan = (uint8_t *)malloc(sizeof(uint8_t) * (length)); + wrapper->plan_length = length; + memcpy(wrapper->substrait_plan, plan, length); + return ADBC_STATUS_OK; } AdbcStatusCode DatabaseSetOption(struct AdbcDatabase *database, const char *key, const char *value, @@ -27041,16 +27196,11 @@ AdbcStatusCode ConnectionGetTableSchema(struct AdbcConnection *connection, const SetError(error, "Connection is not set"); return ADBC_STATUS_INVALID_ARGUMENT; } - if (db_schema == nullptr) { + if (db_schema == nullptr || strlen(db_schema) == 0) { // if schema is not set, we use the default schema db_schema = "main"; } - if (catalog != nullptr && strlen(catalog) > 0) { - // In DuckDB this is the name of the database, not sure what's the expected functionality here, so for now, - // scream. - SetError(error, "Catalog Name is not used in DuckDB. It must be set to nullptr or an empty string"); - return ADBC_STATUS_NOT_IMPLEMENTED; - } else if (table_name == nullptr) { + if (table_name == nullptr) { SetError(error, "AdbcConnectionGetTableSchema: must provide table_name"); return ADBC_STATUS_INVALID_ARGUMENT; } else if (strlen(table_name) == 0) { @@ -27060,9 +27210,10 @@ AdbcStatusCode ConnectionGetTableSchema(struct AdbcConnection *connection, const ArrowArrayStream arrow_stream; std::string query = "SELECT * FROM "; - if (strlen(db_schema) > 0) { - query += std::string(db_schema) + "."; + if (catalog != nullptr && strlen(catalog) > 0) { + query += std::string(catalog) + "."; } + query += std::string(db_schema) + "."; query += std::string(table_name) + " LIMIT 0;"; auto success = QueryInternal(connection, &arrow_stream, query.c_str(), error); @@ -27450,6 +27601,8 @@ AdbcStatusCode StatementNew(struct AdbcConnection *connection, struct AdbcStatem statement_wrapper->result = nullptr; statement_wrapper->ingestion_stream.release = nullptr; statement_wrapper->ingestion_table_name = nullptr; + statement_wrapper->substrait_plan = nullptr; + statement_wrapper->ingestion_mode = IngestionMode::CREATE; return ADBC_STATUS_OK; } @@ -27475,6 +27628,10 @@ AdbcStatusCode StatementRelease(struct AdbcStatement *statement, struct AdbcErro free(wrapper->ingestion_table_name); wrapper->ingestion_table_name = nullptr; } + if (wrapper->substrait_plan) { + free(wrapper->substrait_plan); + wrapper->substrait_plan = nullptr; + } free(statement->private_data); statement->private_data = nullptr; return ADBC_STATUS_OK; @@ -27565,8 +27722,24 @@ AdbcStatusCode StatementExecuteQuery(struct AdbcStatement *statement, struct Arr if (has_stream && to_table) { return IngestToTableFromBoundStream(wrapper, error); } - - if (has_stream) { + if (wrapper->substrait_plan != nullptr) { + auto plan_str = std::string(reinterpret_cast(wrapper->substrait_plan), wrapper->plan_length); + duckdb::vector params; + params.emplace_back(duckdb::Value::BLOB_RAW(plan_str)); + duckdb::unique_ptr query_result; + try { + query_result = + ((duckdb::Connection *)wrapper->connection)->TableFunction("from_substrait", params)->Execute(); + } catch (duckdb::Exception &e) { + std::string error_msg = "It was not possible to execute substrait query. " + std::string(e.what()); + SetError(error, error_msg); + return ADBC_STATUS_INVALID_ARGUMENT; + } + auto arrow_wrapper = new duckdb::ArrowResultWrapper(); + arrow_wrapper->result = + duckdb::unique_ptr_cast(std::move(query_result)); + wrapper->result = reinterpret_cast(arrow_wrapper); + } else if (has_stream) { // A stream was bound to the statement, use that to bind parameters duckdb::unique_ptr result; ArrowArrayStream stream = wrapper->ingestion_stream; @@ -27767,57 +27940,280 @@ AdbcStatusCode StatementSetOption(struct AdbcStatement *statement, const char *k AdbcStatusCode ConnectionGetObjects(struct AdbcConnection *connection, int depth, const char *catalog, const char *db_schema, const char *table_name, const char **table_type, const char *column_name, struct ArrowArrayStream *out, struct AdbcError *error) { - if (catalog != nullptr) { - if (strcmp(catalog, "duckdb") == 0) { - SetError(error, "catalog must be NULL or 'duckdb'"); - return ADBC_STATUS_INVALID_ARGUMENT; - } - } - if (table_type != nullptr) { SetError(error, "Table types parameter not yet supported"); return ADBC_STATUS_NOT_IMPLEMENTED; } + + std::string catalog_filter = catalog ? catalog : "%"; + std::string db_schema_filter = db_schema ? db_schema : "%"; + std::string table_name_filter = table_name ? table_name : "%"; + std::string column_name_filter = column_name ? column_name : "%"; + std::string query; switch (depth) { case ADBC_OBJECT_DEPTH_CATALOGS: - SetError(error, "ADBC_OBJECT_DEPTH_CATALOGS not yet supported"); - return ADBC_STATUS_NOT_IMPLEMENTED; + // Return metadata on catalogs. + query = duckdb::StringUtil::Format(R"( + SELECT + catalog_name, + []::STRUCT( + db_schema_name VARCHAR, + db_schema_tables STRUCT( + table_name VARCHAR, + table_type VARCHAR, + table_columns STRUCT( + column_name VARCHAR, + ordinal_position INTEGER, + remarks VARCHAR, + xdbc_data_type SMALLINT, + xdbc_type_name VARCHAR, + xdbc_column_size INTEGER, + xdbc_decimal_digits SMALLINT, + xdbc_num_prec_radix SMALLINT, + xdbc_nullable SMALLINT, + xdbc_column_def VARCHAR, + xdbc_sql_data_type SMALLINT, + xdbc_datetime_sub SMALLINT, + xdbc_char_octet_length INTEGER, + xdbc_is_nullable VARCHAR, + xdbc_scope_catalog VARCHAR, + xdbc_scope_schema VARCHAR, + xdbc_scope_table VARCHAR, + xdbc_is_autoincrement BOOLEAN, + xdbc_is_generatedcolumn BOOLEAN + )[], + table_constraints STRUCT( + constraint_name VARCHAR, + constraint_type VARCHAR, + constraint_column_names VARCHAR[], + constraint_column_usage STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[] + )[] + )[] + )[] catalog_db_schemas + FROM + information_schema.schemata + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name + )", + catalog_filter); + break; case ADBC_OBJECT_DEPTH_DB_SCHEMAS: // Return metadata on catalogs and schemas. query = duckdb::StringUtil::Format(R"( - SELECT table_schema db_schema_name - FROM information_schema.columns - WHERE table_schema LIKE '%s' AND table_name LIKE '%s' AND column_name LIKE '%s' ; + WITH db_schemas AS ( + SELECT + catalog_name, + schema_name, + FROM information_schema.schemata + WHERE schema_name LIKE '%s' + ) + + SELECT + catalog_name, + LIST({ + db_schema_name: schema_name, + db_schema_tables: []::STRUCT( + table_name VARCHAR, + table_type VARCHAR, + table_columns STRUCT( + column_name VARCHAR, + ordinal_position INTEGER, + remarks VARCHAR, + xdbc_data_type SMALLINT, + xdbc_type_name VARCHAR, + xdbc_column_size INTEGER, + xdbc_decimal_digits SMALLINT, + xdbc_num_prec_radix SMALLINT, + xdbc_nullable SMALLINT, + xdbc_column_def VARCHAR, + xdbc_sql_data_type SMALLINT, + xdbc_datetime_sub SMALLINT, + xdbc_char_octet_length INTEGER, + xdbc_is_nullable VARCHAR, + xdbc_scope_catalog VARCHAR, + xdbc_scope_schema VARCHAR, + xdbc_scope_table VARCHAR, + xdbc_is_autoincrement BOOLEAN, + xdbc_is_generatedcolumn BOOLEAN + )[], + table_constraints STRUCT( + constraint_name VARCHAR, + constraint_type VARCHAR, + constraint_column_names VARCHAR[], + constraint_column_usage STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[] + )[] + )[], + }) FILTER (dbs.schema_name is not null) catalog_db_schemas + FROM + information_schema.schemata + LEFT JOIN db_schemas dbs + USING (catalog_name, schema_name) + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name )", - db_schema ? db_schema : "%", table_name ? table_name : "%", - column_name ? column_name : "%"); + db_schema_filter, catalog_filter); break; case ADBC_OBJECT_DEPTH_TABLES: // Return metadata on catalogs, schemas, and tables. query = duckdb::StringUtil::Format(R"( - SELECT table_schema db_schema_name, LIST(table_schema_list) db_schema_tables - FROM ( - SELECT table_schema, { table_name : table_name} table_schema_list - FROM information_schema.columns - WHERE table_schema LIKE '%s' AND table_name LIKE '%s' AND column_name LIKE '%s' GROUP BY table_schema, table_name - ) GROUP BY table_schema; + WITH tables AS ( + SELECT + table_catalog catalog_name, + table_schema schema_name, + LIST({ + table_name: table_name, + table_type: table_type, + table_columns: []::STRUCT( + column_name VARCHAR, + ordinal_position INTEGER, + remarks VARCHAR, + xdbc_data_type SMALLINT, + xdbc_type_name VARCHAR, + xdbc_column_size INTEGER, + xdbc_decimal_digits SMALLINT, + xdbc_num_prec_radix SMALLINT, + xdbc_nullable SMALLINT, + xdbc_column_def VARCHAR, + xdbc_sql_data_type SMALLINT, + xdbc_datetime_sub SMALLINT, + xdbc_char_octet_length INTEGER, + xdbc_is_nullable VARCHAR, + xdbc_scope_catalog VARCHAR, + xdbc_scope_schema VARCHAR, + xdbc_scope_table VARCHAR, + xdbc_is_autoincrement BOOLEAN, + xdbc_is_generatedcolumn BOOLEAN + )[], + table_constraints: []::STRUCT( + constraint_name VARCHAR, + constraint_type VARCHAR, + constraint_column_names VARCHAR[], + constraint_column_usage STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[] + )[], + }) db_schema_tables + FROM information_schema.tables + WHERE table_name LIKE '%s' + GROUP BY table_catalog, table_schema + ), + db_schemas AS ( + SELECT + catalog_name, + schema_name, + db_schema_tables, + FROM information_schema.schemata + LEFT JOIN tables + USING (catalog_name, schema_name) + WHERE schema_name LIKE '%s' + ) + + SELECT + catalog_name, + LIST({ + db_schema_name: schema_name, + db_schema_tables: db_schema_tables, + }) FILTER (dbs.schema_name is not null) catalog_db_schemas + FROM + information_schema.schemata + LEFT JOIN db_schemas dbs + USING (catalog_name, schema_name) + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name )", - db_schema ? db_schema : "%", table_name ? table_name : "%", - column_name ? column_name : "%"); + table_name_filter, db_schema_filter, catalog_filter); break; case ADBC_OBJECT_DEPTH_COLUMNS: // Return metadata on catalogs, schemas, tables, and columns. query = duckdb::StringUtil::Format(R"( - SELECT table_schema db_schema_name, LIST(table_schema_list) db_schema_tables - FROM ( - SELECT table_schema, { table_name : table_name, table_columns : LIST({column_name : column_name, ordinal_position : ordinal_position + 1, remarks : ''})} table_schema_list + WITH columns AS ( + SELECT + table_catalog, + table_schema, + table_name, + LIST({ + column_name: column_name, + ordinal_position: ordinal_position, + remarks : '', + xdbc_data_type: NULL::SMALLINT, + xdbc_type_name: NULL::VARCHAR, + xdbc_column_size: NULL::INTEGER, + xdbc_decimal_digits: NULL::SMALLINT, + xdbc_num_prec_radix: NULL::SMALLINT, + xdbc_nullable: NULL::SMALLINT, + xdbc_column_def: NULL::VARCHAR, + xdbc_sql_data_type: NULL::SMALLINT, + xdbc_datetime_sub: NULL::SMALLINT, + xdbc_char_octet_length: NULL::INTEGER, + xdbc_is_nullable: NULL::VARCHAR, + xdbc_scope_catalog: NULL::VARCHAR, + xdbc_scope_schema: NULL::VARCHAR, + xdbc_scope_table: NULL::VARCHAR, + xdbc_is_autoincrement: NULL::BOOLEAN, + xdbc_is_generatedcolumn: NULL::BOOLEAN, + }) table_columns FROM information_schema.columns - WHERE table_schema LIKE '%s' AND table_name LIKE '%s' AND column_name LIKE '%s' GROUP BY table_schema, table_name - ) GROUP BY table_schema; + WHERE column_name LIKE '%s' + GROUP BY table_catalog, table_schema, table_name + ), + constraints AS ( + SELECT + table_catalog, + table_schema, + table_name, + LIST( + { + constraint_name: constraint_name, + constraint_type: constraint_type, + constraint_column_names: []::VARCHAR[], + constraint_column_usage: []::STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[], + } + ) table_constraints + FROM information_schema.table_constraints + GROUP BY table_catalog, table_schema, table_name + ), + tables AS ( + SELECT + table_catalog catalog_name, + table_schema schema_name, + LIST({ + table_name: table_name, + table_type: table_type, + table_columns: table_columns, + table_constraints: table_constraints, + }) db_schema_tables + FROM information_schema.tables + LEFT JOIN columns + USING (table_catalog, table_schema, table_name) + LEFT JOIN constraints + USING (table_catalog, table_schema, table_name) + WHERE table_name LIKE '%s' + GROUP BY table_catalog, table_schema + ), + db_schemas AS ( + SELECT + catalog_name, + schema_name, + db_schema_tables, + FROM information_schema.schemata + LEFT JOIN tables + USING (catalog_name, schema_name) + WHERE schema_name LIKE '%s' + ) + + SELECT + catalog_name, + LIST({ + db_schema_name: schema_name, + db_schema_tables: db_schema_tables, + }) FILTER (dbs.schema_name is not null) catalog_db_schemas + FROM + information_schema.schemata + LEFT JOIN db_schemas dbs + USING (catalog_name, schema_name) + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name )", - db_schema ? db_schema : "%", table_name ? table_name : "%", - column_name ? column_name : "%"); + column_name_filter, table_name_filter, db_schema_filter, catalog_filter); break; default: SetError(error, "Invalid value of Depth"); @@ -31145,8 +31541,8 @@ void ArrowUnionData::Append(ArrowAppendData &append_data, Vector &input, idx_t f } void ArrowUnionData::Finalize(ArrowAppendData &append_data, const LogicalType &type, ArrowArray *result) { - result->n_buffers = 2; - result->buffers[1] = append_data.main_buffer.data(); + result->n_buffers = 1; + result->buffers[0] = append_data.main_buffer.data(); auto &child_types = UnionType::CopyMemberTypes(type); ArrowAppender::AddChildren(append_data, child_types.size()); @@ -32417,8 +32813,8 @@ class QueryResult; class QueryResultChunkScanState : public ChunkScanState { public: - QueryResultChunkScanState(QueryResult &result); - ~QueryResultChunkScanState(); + explicit QueryResultChunkScanState(QueryResult &result); + ~QueryResultChunkScanState() override; public: bool LoadNextChunk(ErrorData &error) override; @@ -32861,70 +33257,13 @@ class ExpressionExecutor; class PhysicalOperator; class SQLStatement; -//! The ExpressionInfo keeps information related to an expression -struct ExpressionInfo { - explicit ExpressionInfo() : hasfunction(false) { - } - // A vector of children - vector> children; - // Extract ExpressionInformation from a given expression state - void ExtractExpressionsRecursive(unique_ptr &state); - - //! Whether or not expression has function - bool hasfunction; - //! The function Name - string function_name; - //! The function time - uint64_t function_time = 0; - //! Count the number of ALL tuples - uint64_t tuples_count = 0; - //! Count the number of tuples sampled - uint64_t sample_tuples_count = 0; -}; - -//! The ExpressionRootInfo keeps information related to the root of an expression tree -struct ExpressionRootInfo { - ExpressionRootInfo(ExpressionExecutorState &executor, string name); - - //! Count the number of time the executor called - uint64_t total_count = 0; - //! Count the number of time the executor called since last sampling - uint64_t current_count = 0; - //! Count the number of samples - uint64_t sample_count = 0; - //! Count the number of tuples in all samples - uint64_t sample_tuples_count = 0; - //! Count the number of tuples processed by this executor - uint64_t tuples_count = 0; - //! A vector which contain the pointer to root of each expression tree - unique_ptr root; - //! Name - string name; - //! Elapsed time - double time; - //! Extra Info - string extra_info; -}; - -struct ExpressionExecutorInfo { - explicit ExpressionExecutorInfo() {}; - explicit ExpressionExecutorInfo(ExpressionExecutor &executor, const string &name, int id); - - //! A vector which contain the pointer to all ExpressionRootInfo - vector> roots; - //! Id, it will be used as index for executors_info vector - int id; -}; - struct OperatorInformation { - explicit OperatorInformation(double time_ = 0, idx_t elements_ = 0) : time(time_), elements(elements_) { + explicit OperatorInformation(double time_p = 0, idx_t elements_p = 0) : time(time_p), elements(elements_p) { } double time = 0; idx_t elements = 0; string name; - //! A vector of Expression Executor Info - vector> executors_info; }; //! The OperatorProfiler measures timings of individual operators @@ -32958,7 +33297,7 @@ class OperatorProfiler { //! The QueryProfiler can be used to measure timings of queries class QueryProfiler { public: - DUCKDB_API QueryProfiler(ClientContext &context); + DUCKDB_API explicit QueryProfiler(ClientContext &context); public: struct TreeNode { @@ -33106,22 +33445,22 @@ struct BoxRendererConfig { RenderMode render_mode = RenderMode::ROWS; #ifndef DUCKDB_ASCII_TREE_RENDERER - const char *LTCORNER = "\342\224\214"; // "┌"; - const char *RTCORNER = "\342\224\220"; // "┐"; - const char *LDCORNER = "\342\224\224"; // "└"; - const char *RDCORNER = "\342\224\230"; // "┘"; - - const char *MIDDLE = "\342\224\274"; // "┼"; - const char *TMIDDLE = "\342\224\254"; // "┬"; - const char *LMIDDLE = "\342\224\234"; // "├"; - const char *RMIDDLE = "\342\224\244"; // "┤"; - const char *DMIDDLE = "\342\224\264"; // "┴"; - - const char *VERTICAL = "\342\224\202"; // "│"; - const char *HORIZONTAL = "\342\224\200"; // "─"; - - const char *DOTDOTDOT = "\xE2\x80\xA6"; // "…"; - const char *DOT = "\xC2\xB7"; // "·"; + const char *LTCORNER = "\342\224\214"; // NOLINT: "┌"; + const char *RTCORNER = "\342\224\220"; // NOLINT: "┐"; + const char *LDCORNER = "\342\224\224"; // NOLINT: "└"; + const char *RDCORNER = "\342\224\230"; // NOLINT: "┘"; + + const char *MIDDLE = "\342\224\274"; // NOLINT: "┼"; + const char *TMIDDLE = "\342\224\254"; // NOLINT: "┬"; + const char *LMIDDLE = "\342\224\234"; // NOLINT: "├"; + const char *RMIDDLE = "\342\224\244"; // NOLINT: "┤"; + const char *DMIDDLE = "\342\224\264"; // NOLINT: "┴"; + + const char *VERTICAL = "\342\224\202"; // NOLINT: "│"; + const char *HORIZONTAL = "\342\224\200"; // NOLINT: "─"; + + const char *DOTDOTDOT = "\xE2\x80\xA6"; // NOLINT: "…"; + const char *DOT = "\xC2\xB7"; // NOLINT: "·"; const idx_t DOTDOTDOT_LENGTH = 1; #else @@ -33226,6 +33565,8 @@ class Utf8Proc { static char* Normalize(const char* s, size_t len); //! Returns whether or not the UTF8 string is valid static bool IsValid(const char *s, size_t len); + //! Makes Invalid Unicode valid by replacing invalid parts with a given character + static void MakeValid(char *s, size_t len, char special_flag = '?'); //! Returns the position (in bytes) of the next grapheme cluster static size_t NextGraphemeCluster(const char *s, size_t len, size_t pos); //! Returns the position (in bytes) of the previous grapheme cluster @@ -33690,7 +34031,7 @@ void BoxRenderer::RenderHeader(const vector &names, const vector &names, const vector &names, const vector &names, const vector &collections, const vector &column_map, @@ -33778,7 +34119,7 @@ void BoxRenderer::RenderValues(const list &collections, co RenderValue(ss, str, widths[c], alignment); } ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } if (bottom_rows > 0) { @@ -33834,7 +34175,7 @@ void BoxRenderer::RenderValues(const list &collections, co RenderValue(ss, str, widths[c], alignment); } ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } // note that the bottom rows are in reverse order for (idx_t r = 0; r < bottom_rows; r++) { @@ -33849,7 +34190,7 @@ void BoxRenderer::RenderValues(const list &collections, co RenderValue(ss, str, widths[c], alignments[c]); } ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } } } @@ -33888,7 +34229,7 @@ void BoxRenderer::RenderRowCount(string row_count_str, string shown_str, const s } } ss << (render_anything ? config.RMIDDLE : config.RDCORNER); - ss << std::endl; + ss << '\n'; } if (!render_anything) { return; @@ -33902,16 +34243,16 @@ void BoxRenderer::RenderRowCount(string row_count_str, string shown_str, const s ss << column_count_str; ss << " "; ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } else if (render_rows) { RenderValue(ss, row_count_str, total_length - 4); ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; if (display_shown_separately) { RenderValue(ss, shown_str, total_length - 4); ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } } // render the bottom line @@ -33920,7 +34261,7 @@ void BoxRenderer::RenderRowCount(string row_count_str, string shown_str, const s ss << config.HORIZONTAL; } ss << config.RDCORNER; - ss << std::endl; + ss << '\n'; } void BoxRenderer::Render(ClientContext &context, const vector &names, const ColumnDataCollection &result, @@ -34428,7 +34769,6 @@ class MD5Context { private: void MD5Update(const_data_ptr_t data, idx_t len); - static void DigestToBase16(const_data_ptr_t digest, char *zBuf); uint32_t buf[4]; uint32_t bits[2]; @@ -34647,7 +34987,8 @@ void MD5Context::MD5Update(const_data_ptr_t input, idx_t len) { /* Update bitcount */ t = bits[0]; - if ((bits[0] = t + ((uint32_t)len << 3)) < t) { + bits[0] = t + ((uint32_t)len << 3); + if (bits[0] < t) { bits[1]++; /* Carry from low to high */ } bits[1] += len >> 29; @@ -34744,82 +35085,6 @@ void MD5Context::Add(const char *data) { MD5Update(const_data_ptr_cast(data), strlen(data)); } -} // namespace duckdb -// This file is licensed under Apache License 2.0 -// Source code taken from https://github.com/google/benchmark -// It is highly modified - - - - -namespace duckdb { - -inline uint64_t ChronoNow() { - return std::chrono::duration_cast( - std::chrono::time_point_cast(std::chrono::high_resolution_clock::now()) - .time_since_epoch()) - .count(); -} - -inline uint64_t Now() { -#if defined(RDTSC) -#if defined(__i386__) - uint64_t ret; - __asm__ volatile("rdtsc" : "=A"(ret)); - return ret; -#elif defined(__x86_64__) || defined(__amd64__) - uint64_t low, high; - __asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); - return (high << 32) | low; -#elif defined(__powerpc__) || defined(__ppc__) - uint64_t tbl, tbu0, tbu1; - asm("mftbu %0" : "=r"(tbu0)); - asm("mftb %0" : "=r"(tbl)); - asm("mftbu %0" : "=r"(tbu1)); - tbl &= -static_cast(tbu0 == tbu1); - return (tbu1 << 32) | tbl; -#elif defined(__sparc__) - uint64_t tick; - asm(".byte 0x83, 0x41, 0x00, 0x00"); - asm("mov %%g1, %0" : "=r"(tick)); - return tick; -#elif defined(__ia64__) - uint64_t itc; - asm("mov %0 = ar.itc" : "=r"(itc)); - return itc; -#elif defined(COMPILER_MSVC) && defined(_M_IX86) - _asm rdtsc -#elif defined(COMPILER_MSVC) - return __rdtsc(); -#elif defined(__aarch64__) - uint64_t virtual_timer_value; - asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value)); - return virtual_timer_value; -#elif defined(__ARM_ARCH) -#if (__ARM_ARCH >= 6) - uint32_t pmccntr; - uint32_t pmuseren; - uint32_t pmcntenset; - asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); - if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. - asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); - if (pmcntenset & 0x80000000ul) { // Is it counting? - asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); - return static_cast(pmccntr) * 64; // Should optimize to << 6 - } - } -#endif - return ChronoNow(); -#else - return ChronoNow(); -#endif -#else - return ChronoNow(); -#endif // defined(RDTSC) -} -uint64_t CycleCounter::Tick() const { - return Now(); -} } // namespace duckdb //------------------------------------------------------------------------- // This file is automatically generated by scripts/generate_enum_util.py @@ -35021,6 +35286,7 @@ enum class SubqueryType : uint8_t { + //===----------------------------------------------------------------------===// // DuckDB // @@ -35073,7 +35339,7 @@ struct ExtraTypeInfo { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -35242,7 +35508,7 @@ struct AnyTypeInfo : public ExtraTypeInfo { }; struct IntegerLiteralTypeInfo : public ExtraTypeInfo { - IntegerLiteralTypeInfo(Value constant_value); + explicit IntegerLiteralTypeInfo(Value constant_value); Value constant_value; @@ -36555,13 +36821,13 @@ class BoundAggregateExpression; class BoundWindowExpression; struct FunctionDataWrapper { - FunctionDataWrapper(unique_ptr function_data_p) : function_data(std::move(function_data_p)) { + explicit FunctionDataWrapper(unique_ptr function_data_p) : function_data(std::move(function_data_p)) { } unique_ptr function_data; }; -struct AggregateObject { +struct AggregateObject { // NOLINT: work-around bug in clang-tidy AggregateObject(AggregateFunction function, FunctionData *bind_data, idx_t child_count, idx_t payload_size, AggregateType aggr_type, PhysicalType return_type, Expression *filter = nullptr); explicit AggregateObject(BoundAggregateExpression *aggr); @@ -37512,13 +37778,13 @@ struct SBIterator { namespace duckdb { template -struct fixed_size_map_iterator_t; +struct fixed_size_map_iterator_t; // NOLINT: match stl case template -struct const_fixed_size_map_iterator_t; +struct const_fixed_size_map_iterator_t; // NOLINT: match stl case template -class fixed_size_map_t { +class fixed_size_map_t { // NOLINT: match stl case friend struct fixed_size_map_iterator_t; friend struct const_fixed_size_map_iterator_t; @@ -37531,18 +37797,18 @@ class fixed_size_map_t { resize(capacity); } - idx_t size() const { + idx_t size() const { // NOLINT: match stl case return count; } - void resize(idx_t capacity_p) { + void resize(idx_t capacity_p) { // NOLINT: match stl case capacity = capacity_p; occupied = ValidityMask(capacity); values = make_unsafe_uniq_array(capacity + 1); clear(); } - void clear() { + void clear() { // NOLINT: match stl case count = 0; occupied.SetAllInvalid(capacity); } @@ -37559,23 +37825,23 @@ class fixed_size_map_t { return values[key]; } - fixed_size_map_iterator_t begin() { + fixed_size_map_iterator_t begin() { // NOLINT: match stl case return fixed_size_map_iterator_t(begin_internal(), *this); } - const_fixed_size_map_iterator_t begin() const { + const_fixed_size_map_iterator_t begin() const { // NOLINT: match stl case return const_fixed_size_map_iterator_t(begin_internal(), *this); } - fixed_size_map_iterator_t end() { + fixed_size_map_iterator_t end() { // NOLINT: match stl case return fixed_size_map_iterator_t(capacity, *this); } - const_fixed_size_map_iterator_t end() const { + const_fixed_size_map_iterator_t end() const { // NOLINT: match stl case return const_fixed_size_map_iterator_t(capacity, *this); } - fixed_size_map_iterator_t find(const idx_t &index) { + fixed_size_map_iterator_t find(const idx_t &index) { // NOLINT: match stl case if (occupied.RowIsValid(index)) { return fixed_size_map_iterator_t(index, *this); } else { @@ -37583,7 +37849,7 @@ class fixed_size_map_t { } } - const_fixed_size_map_iterator_t find(const idx_t &index) const { + const_fixed_size_map_iterator_t find(const idx_t &index) const { // NOLINT: match stl case if (occupied.RowIsValid(index)) { return const_fixed_size_map_iterator_t(index, *this); } else { @@ -37592,7 +37858,7 @@ class fixed_size_map_t { } private: - idx_t begin_internal() const { + idx_t begin_internal() const { // NOLINT: match stl case idx_t index; for (index = 0; index < capacity; index++) { if (occupied.RowIsValid(index)) { @@ -37767,6 +38033,9 @@ class TupleDataLayout { inline Aggregates &GetAggregates() { return aggregates; } + const inline Aggregates &GetAggregates() const { + return aggregates; + } //! Returns a map from column id to the struct TupleDataLayout const inline TupleDataLayout &GetStructLayout(idx_t col_idx) const { D_ASSERT(struct_layouts->find(col_idx) != struct_layouts->end()); @@ -37806,7 +38075,11 @@ class TupleDataLayout { } //! Returns whether any of the aggregates have a destructor inline bool HasDestructor() const { - return has_destructor; + return !aggr_destructor_idxs.empty(); + } + //! Returns the indices of the aggregates that have destructors + inline const vector &GetAggregateDestructorIndices() const { + return aggr_destructor_idxs; } private: @@ -37830,8 +38103,8 @@ class TupleDataLayout { bool all_constant; //! Offset to the heap size of every row idx_t heap_size_offset; - //! Whether any of the aggregates have a destructor - bool has_destructor; + //! Indices of aggregate functions that have a destructor + vector aggr_destructor_idxs; }; } // namespace duckdb @@ -38071,7 +38344,7 @@ class TupleDataLayout; struct TupleDataChunkPart { public: - TupleDataChunkPart(mutex &lock); + explicit TupleDataChunkPart(mutex &lock); //! Disable copy constructors TupleDataChunkPart(const TupleDataChunkPart &other) = delete; @@ -38588,7 +38861,7 @@ class PartitionedTupleData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -38956,6 +39229,8 @@ class PartitionLocalMergeState { class PartitionGlobalMergeStates { public: struct Callback { + virtual ~Callback() = default; + virtual bool HasError() const { return false; } @@ -39160,6 +39435,8 @@ struct CMStringDecompressFun { + + //===----------------------------------------------------------------------===// // DuckDB // @@ -39194,23 +39471,23 @@ enum class ErrorType : uint16_t { //! It allows for error messages to be overridden by extensions and clients class ErrorManager { public: - template - string FormatException(ErrorType error_type, Args... params) { + template + string FormatException(ErrorType error_type, ARGS... params) { vector values; return FormatExceptionRecursive(error_type, values, params...); } DUCKDB_API string FormatExceptionRecursive(ErrorType error_type, vector &values); - template + template string FormatExceptionRecursive(ErrorType error_type, vector &values, T param, - Args... params) { + ARGS... params) { values.push_back(ExceptionFormatValue::CreateFormatValue(param)); return FormatExceptionRecursive(error_type, values, params...); } - template - static string FormatException(ClientContext &context, ErrorType error_type, Args... params) { + template + static string FormatException(ClientContext &context, ErrorType error_type, ARGS... params) { return Get(context).FormatException(error_type, params...); } @@ -39237,6 +39514,7 @@ class ErrorManager { + //===----------------------------------------------------------------------===// // DuckDB // @@ -39877,7 +40155,7 @@ enum class DataFileType : uint8_t { class MagicBytes { public: - static DataFileType CheckMagicBytes(FileSystem *fs, const string &path); + static DataFileType CheckMagicBytes(FileSystem &fs, const string &path); }; } // namespace duckdb @@ -40385,6 +40663,29 @@ ArrowDateTimeType EnumUtil::FromString(const char *value) { throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ArrowOffsetSize value) { + switch(value) { + case ArrowOffsetSize::REGULAR: + return "REGULAR"; + case ArrowOffsetSize::LARGE: + return "LARGE"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ArrowOffsetSize EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "REGULAR")) { + return ArrowOffsetSize::REGULAR; + } + if (StringUtil::Equals(value, "LARGE")) { + return ArrowOffsetSize::LARGE; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(ArrowVariableSizeType value) { switch(value) { @@ -41471,6 +41772,229 @@ ExceptionFormatValueType EnumUtil::FromString(const ch throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ExceptionType value) { + switch(value) { + case ExceptionType::INVALID: + return "INVALID"; + case ExceptionType::OUT_OF_RANGE: + return "OUT_OF_RANGE"; + case ExceptionType::CONVERSION: + return "CONVERSION"; + case ExceptionType::UNKNOWN_TYPE: + return "UNKNOWN_TYPE"; + case ExceptionType::DECIMAL: + return "DECIMAL"; + case ExceptionType::MISMATCH_TYPE: + return "MISMATCH_TYPE"; + case ExceptionType::DIVIDE_BY_ZERO: + return "DIVIDE_BY_ZERO"; + case ExceptionType::OBJECT_SIZE: + return "OBJECT_SIZE"; + case ExceptionType::INVALID_TYPE: + return "INVALID_TYPE"; + case ExceptionType::SERIALIZATION: + return "SERIALIZATION"; + case ExceptionType::TRANSACTION: + return "TRANSACTION"; + case ExceptionType::NOT_IMPLEMENTED: + return "NOT_IMPLEMENTED"; + case ExceptionType::EXPRESSION: + return "EXPRESSION"; + case ExceptionType::CATALOG: + return "CATALOG"; + case ExceptionType::PARSER: + return "PARSER"; + case ExceptionType::PLANNER: + return "PLANNER"; + case ExceptionType::SCHEDULER: + return "SCHEDULER"; + case ExceptionType::EXECUTOR: + return "EXECUTOR"; + case ExceptionType::CONSTRAINT: + return "CONSTRAINT"; + case ExceptionType::INDEX: + return "INDEX"; + case ExceptionType::STAT: + return "STAT"; + case ExceptionType::CONNECTION: + return "CONNECTION"; + case ExceptionType::SYNTAX: + return "SYNTAX"; + case ExceptionType::SETTINGS: + return "SETTINGS"; + case ExceptionType::BINDER: + return "BINDER"; + case ExceptionType::NETWORK: + return "NETWORK"; + case ExceptionType::OPTIMIZER: + return "OPTIMIZER"; + case ExceptionType::NULL_POINTER: + return "NULL_POINTER"; + case ExceptionType::IO: + return "IO"; + case ExceptionType::INTERRUPT: + return "INTERRUPT"; + case ExceptionType::FATAL: + return "FATAL"; + case ExceptionType::INTERNAL: + return "INTERNAL"; + case ExceptionType::INVALID_INPUT: + return "INVALID_INPUT"; + case ExceptionType::OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case ExceptionType::PERMISSION: + return "PERMISSION"; + case ExceptionType::PARAMETER_NOT_RESOLVED: + return "PARAMETER_NOT_RESOLVED"; + case ExceptionType::PARAMETER_NOT_ALLOWED: + return "PARAMETER_NOT_ALLOWED"; + case ExceptionType::DEPENDENCY: + return "DEPENDENCY"; + case ExceptionType::HTTP: + return "HTTP"; + case ExceptionType::MISSING_EXTENSION: + return "MISSING_EXTENSION"; + case ExceptionType::AUTOLOAD: + return "AUTOLOAD"; + case ExceptionType::SEQUENCE: + return "SEQUENCE"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ExceptionType EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "INVALID")) { + return ExceptionType::INVALID; + } + if (StringUtil::Equals(value, "OUT_OF_RANGE")) { + return ExceptionType::OUT_OF_RANGE; + } + if (StringUtil::Equals(value, "CONVERSION")) { + return ExceptionType::CONVERSION; + } + if (StringUtil::Equals(value, "UNKNOWN_TYPE")) { + return ExceptionType::UNKNOWN_TYPE; + } + if (StringUtil::Equals(value, "DECIMAL")) { + return ExceptionType::DECIMAL; + } + if (StringUtil::Equals(value, "MISMATCH_TYPE")) { + return ExceptionType::MISMATCH_TYPE; + } + if (StringUtil::Equals(value, "DIVIDE_BY_ZERO")) { + return ExceptionType::DIVIDE_BY_ZERO; + } + if (StringUtil::Equals(value, "OBJECT_SIZE")) { + return ExceptionType::OBJECT_SIZE; + } + if (StringUtil::Equals(value, "INVALID_TYPE")) { + return ExceptionType::INVALID_TYPE; + } + if (StringUtil::Equals(value, "SERIALIZATION")) { + return ExceptionType::SERIALIZATION; + } + if (StringUtil::Equals(value, "TRANSACTION")) { + return ExceptionType::TRANSACTION; + } + if (StringUtil::Equals(value, "NOT_IMPLEMENTED")) { + return ExceptionType::NOT_IMPLEMENTED; + } + if (StringUtil::Equals(value, "EXPRESSION")) { + return ExceptionType::EXPRESSION; + } + if (StringUtil::Equals(value, "CATALOG")) { + return ExceptionType::CATALOG; + } + if (StringUtil::Equals(value, "PARSER")) { + return ExceptionType::PARSER; + } + if (StringUtil::Equals(value, "PLANNER")) { + return ExceptionType::PLANNER; + } + if (StringUtil::Equals(value, "SCHEDULER")) { + return ExceptionType::SCHEDULER; + } + if (StringUtil::Equals(value, "EXECUTOR")) { + return ExceptionType::EXECUTOR; + } + if (StringUtil::Equals(value, "CONSTRAINT")) { + return ExceptionType::CONSTRAINT; + } + if (StringUtil::Equals(value, "INDEX")) { + return ExceptionType::INDEX; + } + if (StringUtil::Equals(value, "STAT")) { + return ExceptionType::STAT; + } + if (StringUtil::Equals(value, "CONNECTION")) { + return ExceptionType::CONNECTION; + } + if (StringUtil::Equals(value, "SYNTAX")) { + return ExceptionType::SYNTAX; + } + if (StringUtil::Equals(value, "SETTINGS")) { + return ExceptionType::SETTINGS; + } + if (StringUtil::Equals(value, "BINDER")) { + return ExceptionType::BINDER; + } + if (StringUtil::Equals(value, "NETWORK")) { + return ExceptionType::NETWORK; + } + if (StringUtil::Equals(value, "OPTIMIZER")) { + return ExceptionType::OPTIMIZER; + } + if (StringUtil::Equals(value, "NULL_POINTER")) { + return ExceptionType::NULL_POINTER; + } + if (StringUtil::Equals(value, "IO")) { + return ExceptionType::IO; + } + if (StringUtil::Equals(value, "INTERRUPT")) { + return ExceptionType::INTERRUPT; + } + if (StringUtil::Equals(value, "FATAL")) { + return ExceptionType::FATAL; + } + if (StringUtil::Equals(value, "INTERNAL")) { + return ExceptionType::INTERNAL; + } + if (StringUtil::Equals(value, "INVALID_INPUT")) { + return ExceptionType::INVALID_INPUT; + } + if (StringUtil::Equals(value, "OUT_OF_MEMORY")) { + return ExceptionType::OUT_OF_MEMORY; + } + if (StringUtil::Equals(value, "PERMISSION")) { + return ExceptionType::PERMISSION; + } + if (StringUtil::Equals(value, "PARAMETER_NOT_RESOLVED")) { + return ExceptionType::PARAMETER_NOT_RESOLVED; + } + if (StringUtil::Equals(value, "PARAMETER_NOT_ALLOWED")) { + return ExceptionType::PARAMETER_NOT_ALLOWED; + } + if (StringUtil::Equals(value, "DEPENDENCY")) { + return ExceptionType::DEPENDENCY; + } + if (StringUtil::Equals(value, "HTTP")) { + return ExceptionType::HTTP; + } + if (StringUtil::Equals(value, "MISSING_EXTENSION")) { + return ExceptionType::MISSING_EXTENSION; + } + if (StringUtil::Equals(value, "AUTOLOAD")) { + return ExceptionType::AUTOLOAD; + } + if (StringUtil::Equals(value, "SEQUENCE")) { + return ExceptionType::SEQUENCE; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(ExplainOutputType value) { switch(value) { @@ -41603,6 +42127,8 @@ const char* EnumUtil::ToChars(ExpressionClass value) { return "BOUND_LAMBDA_REF"; case ExpressionClass::BOUND_EXPRESSION: return "BOUND_EXPRESSION"; + case ExpressionClass::BOUND_EXPANDED: + return "BOUND_EXPANDED"; default: throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); } @@ -41727,6 +42253,9 @@ ExpressionClass EnumUtil::FromString(const char *value) { if (StringUtil::Equals(value, "BOUND_EXPRESSION")) { return ExpressionClass::BOUND_EXPRESSION; } + if (StringUtil::Equals(value, "BOUND_EXPANDED")) { + return ExpressionClass::BOUND_EXPANDED; + } throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } @@ -41869,6 +42398,8 @@ const char* EnumUtil::ToChars(ExpressionType value) { return "POSITIONAL_REFERENCE"; case ExpressionType::BOUND_LAMBDA_REF: return "BOUND_LAMBDA_REF"; + case ExpressionType::BOUND_EXPANDED: + return "BOUND_EXPANDED"; default: throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); } @@ -42080,6 +42611,9 @@ ExpressionType EnumUtil::FromString(const char *value) { if (StringUtil::Equals(value, "BOUND_LAMBDA_REF")) { return ExpressionType::BOUND_LAMBDA_REF; } + if (StringUtil::Equals(value, "BOUND_EXPANDED")) { + return ExpressionType::BOUND_EXPANDED; + } throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } @@ -42111,6 +42645,24 @@ ExtensionLoadResult EnumUtil::FromString(const char *value) throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ExternalDependenciesType value) { + switch(value) { + case ExternalDependenciesType::PYTHON_DEPENDENCY: + return "PYTHON_DEPENDENCY"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ExternalDependenciesType EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "PYTHON_DEPENDENCY")) { + return ExternalDependenciesType::PYTHON_DEPENDENCY; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(ExtraDropInfoType value) { switch(value) { @@ -43960,6 +44512,8 @@ const char* EnumUtil::ToChars(ParseInfoType value) { return "COMMENT_ON_INFO"; case ParseInfoType::COMMENT_ON_COLUMN_INFO: return "COMMENT_ON_COLUMN_INFO"; + case ParseInfoType::COPY_DATABASE_INFO: + return "COPY_DATABASE_INFO"; default: throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); } @@ -44012,6 +44566,9 @@ ParseInfoType EnumUtil::FromString(const char *value) { if (StringUtil::Equals(value, "COMMENT_ON_COLUMN_INFO")) { return ParseInfoType::COMMENT_ON_COLUMN_INFO; } + if (StringUtil::Equals(value, "COPY_DATABASE_INFO")) { + return ParseInfoType::COPY_DATABASE_INFO; + } throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } @@ -45142,6 +45699,29 @@ SampleMethod EnumUtil::FromString(const char *value) { throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ScanType value) { + switch(value) { + case ScanType::TABLE: + return "TABLE"; + case ScanType::PARQUET: + return "PARQUET"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ScanType EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "TABLE")) { + return ScanType::TABLE; + } + if (StringUtil::Equals(value, "PARQUET")) { + return ScanType::PARQUET; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(SecretDisplayType value) { switch(value) { @@ -47143,15 +47723,15 @@ class ConversionException : public Exception { public: DUCKDB_API explicit ConversionException(const string &msg); DUCKDB_API explicit ConversionException(optional_idx error_location, const string &msg); - DUCKDB_API ConversionException(const PhysicalType origType, const PhysicalType newType); - DUCKDB_API ConversionException(const LogicalType &origType, const LogicalType &newType); + DUCKDB_API ConversionException(const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API ConversionException(const LogicalType &orig_type, const LogicalType &new_type); - template - explicit ConversionException(const string &msg, Args... params) + template + explicit ConversionException(const string &msg, ARGS... params) : ConversionException(ConstructMessage(msg, params...)) { } - template - explicit ConversionException(optional_idx error_location, const string &msg, Args... params) + template + explicit ConversionException(optional_idx error_location, const string &msg, ARGS... params) : ConversionException(error_location, ConstructMessage(msg, params...)) { } }; @@ -47383,6 +47963,8 @@ string ExpressionTypeToString(ExpressionType type) { return "LAMBDA"; case ExpressionType::ARROW: return "ARROW"; + case ExpressionType::BOUND_EXPANDED: + return "BOUND_EXPANDED"; case ExpressionType::INVALID: break; } @@ -47466,6 +48048,8 @@ string ExpressionClassToString(ExpressionClass type) { return "BOUND_LAMBDA"; case ExpressionClass::BOUND_EXPRESSION: return "BOUND_EXPRESSION"; + case ExpressionClass::BOUND_EXPANDED: + return "BOUND_EXPANDED"; default: return "ExpressionClass::!!UNIMPLEMENTED_CASE!!"; } @@ -47792,7 +48376,7 @@ struct DefaultOptimizerType { OptimizerType type; }; -static DefaultOptimizerType internal_optimizer_types[] = { +static const DefaultOptimizerType internal_optimizer_types[] = { {"expression_rewriter", OptimizerType::EXPRESSION_REWRITER}, {"filter_pullup", OptimizerType::FILTER_PULLUP}, {"filter_pushdown", OptimizerType::FILTER_PUSHDOWN}, @@ -48442,10 +49026,10 @@ class HTTPException : public Exception { public: template struct ResponseShape { - typedef int status; + typedef int status; // NOLINT }; - explicit HTTPException(string message) : Exception(ExceptionType::HTTP, std::move(message)) { + explicit HTTPException(const string &message) : Exception(ExceptionType::HTTP, message) { } template ::status = 0, typename... ARGS> @@ -48455,7 +49039,7 @@ class HTTPException : public Exception { template struct ResponseWrapperShape { - typedef int code; + typedef int code; // NOLINT }; template ::code = 0, typename... ARGS> @@ -50376,12 +50960,15 @@ class FileOpener { virtual SettingLookupResult TryGetCurrentSetting(const string &key, Value &result, FileOpenerInfo &info); virtual SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) = 0; - virtual ClientContext *TryGetClientContext() = 0; + virtual optional_ptr TryGetClientContext() = 0; + virtual optional_ptr TryGetDatabase() = 0; - DUCKDB_API static ClientContext *TryGetClientContext(FileOpener *opener); - DUCKDB_API static SettingLookupResult TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result); - DUCKDB_API static SettingLookupResult TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result, - FileOpenerInfo &info); + DUCKDB_API static optional_ptr TryGetClientContext(optional_ptr opener); + DUCKDB_API static optional_ptr TryGetDatabase(optional_ptr opener); + DUCKDB_API static SettingLookupResult TryGetCurrentSetting(optional_ptr opener, const string &key, + Value &result); + DUCKDB_API static SettingLookupResult TryGetCurrentSetting(optional_ptr opener, const string &key, + Value &result, FileOpenerInfo &info); }; } // namespace duckdb @@ -51190,14 +51777,14 @@ UTF8PROC_DLLEXPORT utf8proc_uint8_t *utf8proc_NFKC_Casefold(const utf8proc_uint8 -namespace re2 { +namespace duckdb_re2 { class RE2; } namespace duckdb { struct LowerFun { - static uint8_t ascii_to_lower_map[]; + static const uint8_t ASCII_TO_LOWER_MAP[]; //! Returns the length of the result string obtained from lowercasing the given input (in bytes) static idx_t LowerLength(const char *input_data, idx_t input_length); @@ -51209,7 +51796,7 @@ struct LowerFun { }; struct UpperFun { - static uint8_t ascii_to_upper_map[]; + static const uint8_t ASCII_TO_UPPER_MAP[]; static void RegisterFunction(BuiltinFunctions &set); }; @@ -51374,6 +51961,41 @@ extern "C" WINBASEAPI BOOL WINAPI GetPhysicallyInstalledSystemMemory(PULONGLONG) namespace duckdb { +constexpr FileOpenFlags FileFlags::FILE_FLAGS_READ; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_WRITE; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_DIRECT_IO; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_FILE_CREATE; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_FILE_CREATE_NEW; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_APPEND; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_PRIVATE; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_PARALLEL_ACCESS; + +void FileOpenFlags::Verify() { +#ifdef DEBUG + bool is_read = flags & FileOpenFlags::FILE_FLAGS_READ; + bool is_write = flags & FileOpenFlags::FILE_FLAGS_WRITE; + bool is_create = + (flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE) || (flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW); + bool is_private = (flags & FileOpenFlags::FILE_FLAGS_PRIVATE); + bool null_if_not_exists = flags & FileOpenFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS; + + // require either READ or WRITE (or both) + D_ASSERT(is_read || is_write); + // CREATE/Append flags require writing + D_ASSERT(is_write || !(flags & FileOpenFlags::FILE_FLAGS_APPEND)); + D_ASSERT(is_write || !(flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE)); + D_ASSERT(is_write || !(flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW)); + // cannot combine CREATE and CREATE_NEW flags + D_ASSERT(!(flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE && flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW)); + + // For is_private can only be set along with a create flag + D_ASSERT(!is_private || is_create); + // FILE_FLAGS_NULL_IF_NOT_EXISTS cannot be combined with CREATE/CREATE_NEW + D_ASSERT(!(null_if_not_exists && is_create)); +#endif +} + FileSystem::~FileSystem() { } @@ -51411,7 +52033,7 @@ void FileSystem::SetWorkingDirectory(const string &path) { } } -idx_t FileSystem::GetAvailableMemory() { +optional_idx FileSystem::GetAvailableMemory() { errno = 0; #ifdef __MVS__ @@ -51422,7 +52044,7 @@ idx_t FileSystem::GetAvailableMemory() { idx_t max_memory = MinValue((idx_t)sysconf(_SC_PHYS_PAGES) * (idx_t)sysconf(_SC_PAGESIZE), UINTPTR_MAX); #endif if (errno != 0) { - return DConstants::INVALID_INDEX; + return optional_idx(); } return max_memory; } @@ -51512,7 +52134,7 @@ void FileSystem::SetWorkingDirectory(const string &path) { } } -idx_t FileSystem::GetAvailableMemory() { +optional_idx FileSystem::GetAvailableMemory() { ULONGLONG available_memory_kb; if (GetPhysicallyInstalledSystemMemory(&available_memory_kb)) { return MinValue(available_memory_kb * 1000, UINTPTR_MAX); @@ -51524,7 +52146,7 @@ idx_t FileSystem::GetAvailableMemory() { if (GlobalMemoryStatusEx(&mem_state)) { return MinValue(mem_state.ullTotalPhys, UINTPTR_MAX); } - return DConstants::INVALID_INDEX; + return optional_idx(); } string FileSystem::GetWorkingDirectory() { @@ -51615,8 +52237,7 @@ string FileSystem::ExpandPath(const string &path) { } // LCOV_EXCL_START -unique_ptr FileSystem::OpenFile(const string &path, uint8_t flags, FileLockType lock, - FileCompressionType compression, FileOpener *opener) { +unique_ptr FileSystem::OpenFile(const string &path, FileOpenFlags flags, optional_ptr opener) { throw NotImplementedException("%s: OpenFile is not implemented!", GetName()); } @@ -51624,6 +52245,11 @@ void FileSystem::Read(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t throw NotImplementedException("%s: Read (with location) is not implemented!", GetName()); } +bool FileSystem::Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) { + // This is not a required method. Derived FileSystems may optionally override/implement. + return false; +} + void FileSystem::Write(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) { throw NotImplementedException("%s: Write (with location) is not implemented!", GetName()); } @@ -51652,15 +52278,15 @@ void FileSystem::Truncate(FileHandle &handle, int64_t new_size) { throw NotImplementedException("%s: Truncate is not implemented!", GetName()); } -bool FileSystem::DirectoryExists(const string &directory) { +bool FileSystem::DirectoryExists(const string &directory, optional_ptr opener) { throw NotImplementedException("%s: DirectoryExists is not implemented!", GetName()); } -void FileSystem::CreateDirectory(const string &directory) { +void FileSystem::CreateDirectory(const string &directory, optional_ptr opener) { throw NotImplementedException("%s: CreateDirectory is not implemented!", GetName()); } -void FileSystem::RemoveDirectory(const string &directory) { +void FileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { throw NotImplementedException("%s: RemoveDirectory is not implemented!", GetName()); } @@ -51669,19 +52295,19 @@ bool FileSystem::ListFiles(const string &directory, const std::function opener) { throw NotImplementedException("%s: MoveFile is not implemented!", GetName()); } -bool FileSystem::FileExists(const string &filename) { +bool FileSystem::FileExists(const string &filename, optional_ptr opener) { throw NotImplementedException("%s: FileExists is not implemented!", GetName()); } -bool FileSystem::IsPipe(const string &filename) { +bool FileSystem::IsPipe(const string &filename, optional_ptr opener) { return false; } -void FileSystem::RemoveFile(const string &filename) { +void FileSystem::RemoveFile(const string &filename, optional_ptr opener) { throw NotImplementedException("%s: RemoveFile is not implemented!", GetName()); } @@ -51787,6 +52413,10 @@ bool FileSystem::CanSeek() { throw NotImplementedException("%s: CanSeek is not implemented!", GetName()); } +bool FileSystem::IsManuallySet() { + return false; +} + unique_ptr FileSystem::OpenCompressedFile(unique_ptr handle, bool write) { throw NotImplementedException("%s: OpenCompressedFile is not implemented!", GetName()); } @@ -51806,6 +52436,10 @@ int64_t FileHandle::Read(void *buffer, idx_t nr_bytes) { return file_system.Read(*this, buffer, nr_bytes); } +bool FileHandle::Trim(idx_t offset_bytes, idx_t length_bytes) { + return file_system.Trim(*this, offset_bytes, length_bytes); +} + int64_t FileHandle::Write(void *buffer, idx_t nr_bytes) { return file_system.Write(*this, buffer, nr_bytes); } @@ -51905,9 +52539,7 @@ class FilenamePattern { friend Deserializer; public: - FilenamePattern() : _base("data_"), _pos(_base.length()), _uuid(false) { - } - ~FilenamePattern() { + FilenamePattern() : base("data_"), pos(base.length()), uuid(false) { } public: @@ -51918,9 +52550,9 @@ class FilenamePattern { static FilenamePattern Deserialize(Deserializer &deserializer); private: - string _base; - idx_t _pos; - bool _uuid; + string base; + idx_t pos; + bool uuid; }; } // namespace duckdb @@ -51933,34 +52565,34 @@ void FilenamePattern::SetFilenamePattern(const string &pattern) { const string id_format {"{i}"}; const string uuid_format {"{uuid}"}; - _base = pattern; + base = pattern; - _pos = _base.find(id_format); - if (_pos != string::npos) { - _base = StringUtil::Replace(_base, id_format, ""); - _uuid = false; + pos = base.find(id_format); + if (pos != string::npos) { + base = StringUtil::Replace(base, id_format, ""); + uuid = false; } - _pos = _base.find(uuid_format); - if (_pos != string::npos) { - _base = StringUtil::Replace(_base, uuid_format, ""); - _uuid = true; + pos = base.find(uuid_format); + if (pos != string::npos) { + base = StringUtil::Replace(base, uuid_format, ""); + uuid = true; } - _pos = std::min(_pos, (idx_t)_base.length()); + pos = std::min(pos, (idx_t)base.length()); } string FilenamePattern::CreateFilename(FileSystem &fs, const string &path, const string &extension, idx_t offset) const { - string result(_base); + string result(base); string replacement; - if (_uuid) { + if (uuid) { replacement = UUID::ToString(UUID::GenerateRandomUUID()); } else { replacement = std::to_string(offset); } - result.insert(_pos, replacement); + result.insert(pos, replacement); return fs.JoinPath(path, result + "." + extension); } @@ -52134,7 +52766,7 @@ struct StringBlock { unique_ptr next; }; -struct string_location_t { +struct string_location_t { // NOLINT string_location_t(block_id_t block_id, int32_t offset) : block_id(block_id), offset(offset) { } string_location_t() { @@ -52399,7 +53031,7 @@ class BoundCaseExpression : public Expression { static constexpr const ExpressionClass TYPE = ExpressionClass::BOUND_CASE; public: - BoundCaseExpression(LogicalType type); + explicit BoundCaseExpression(LogicalType type); BoundCaseExpression(unique_ptr when_expr, unique_ptr then_expr, unique_ptr else_expr); @@ -52449,7 +53081,7 @@ class BoundCastExpression : public Expression { BoundCastInfo bound_cast; public: - LogicalType source_type() { + LogicalType source_type() { // NOLINT: allow casing for legacy reasons D_ASSERT(child->return_type.IsValid()); return child->return_type; } @@ -52620,7 +53252,7 @@ class BoundDefaultExpression : public Expression { public: explicit BoundDefaultExpression(LogicalType type = LogicalType()) - : Expression(ExpressionType::VALUE_DEFAULT, ExpressionClass::BOUND_DEFAULT, type) { + : Expression(ExpressionType::VALUE_DEFAULT, ExpressionClass::BOUND_DEFAULT, std::move(type)) { } public: @@ -52865,7 +53497,7 @@ class BoundSubqueryExpression : public Expression { explicit BoundSubqueryExpression(LogicalType return_type); bool IsCorrelated() { - return binder->correlated_columns.size() > 0; + return !binder->correlated_columns.empty(); } //! The binder used to bind the subquery node @@ -53085,7 +53717,7 @@ struct SegmentScanState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -53101,7 +53733,7 @@ struct IndexScanState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -53152,7 +53784,7 @@ struct ColumnFetchState { class CollectionScanState { public: - CollectionScanState(TableScanState &parent_p); + explicit CollectionScanState(TableScanState &parent_p); //! The current row_group we are scanning RowGroup *row_group; @@ -53283,7 +53915,7 @@ struct ColumnAppendState { }; struct RowGroupAppendState { - RowGroupAppendState(TableAppendState &parent_p) : parent(parent_p) { + explicit RowGroupAppendState(TableAppendState &parent_p) : parent(parent_p) { } //! The parent append state @@ -53372,6 +54004,7 @@ struct UncompressedStringStorage { static unique_ptr StringInitAppend(ColumnSegment &segment) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); + // This block was initialized in StringInitSegment auto handle = buffer_manager.Pin(segment.block); return make_uniq(std::move(handle)); } @@ -53393,9 +54026,9 @@ struct UncompressedStringStorage { D_ASSERT(segment.GetBlockOffset() == 0); auto handle_ptr = handle.Ptr(); auto source_data = UnifiedVectorFormat::GetData(data); - auto result_data = (int32_t *)(handle_ptr + DICTIONARY_HEADER_SIZE); - uint32_t *dictionary_size = (uint32_t *)handle_ptr; - uint32_t *dictionary_end = (uint32_t *)(handle_ptr + sizeof(uint32_t)); + auto result_data = reinterpret_cast(handle_ptr + DICTIONARY_HEADER_SIZE); + auto dictionary_size = reinterpret_cast(handle_ptr); + auto dictionary_end = reinterpret_cast(handle_ptr + sizeof(uint32_t)); idx_t remaining_space = RemainingSpace(segment, handle); auto base_count = segment.count.load(); @@ -53447,18 +54080,19 @@ struct UncompressedStringStorage { if (DUCKDB_UNLIKELY(use_overflow_block)) { // write to overflow blocks block_id_t block; - int32_t offset; + int32_t current_offset; // write the string into the current string block - WriteString(segment, source_data[source_idx], block, offset); + WriteString(segment, source_data[source_idx], block, current_offset); *dictionary_size += BIG_STRING_MARKER_SIZE; remaining_space -= BIG_STRING_MARKER_SIZE; auto dict_pos = end - *dictionary_size; // write a big string marker into the dictionary - WriteStringMarker(dict_pos, block, offset); + WriteStringMarker(dict_pos, block, current_offset); // place the dictionary offset into the set of vectors // note: for overflow strings we write negative value + D_ASSERT(*dictionary_size <= int32_t(Storage::BLOCK_SIZE)); result_data[target_idx] = -(*dictionary_size); } else { // string fits in block, append to dictionary and increment dictionary position @@ -53470,6 +54104,7 @@ struct UncompressedStringStorage { memcpy(dict_pos, source_data[source_idx].GetData(), string_length); // place the dictionary offset into the set of vectors + D_ASSERT(*dictionary_size <= int32_t(Storage::BLOCK_SIZE)); result_data[target_idx] = *dictionary_size; } D_ASSERT(RemainingSpace(segment, handle) <= Storage::BLOCK_SIZE); @@ -53590,7 +54225,7 @@ class FSSTPrimitives { #ifndef FSST_INCLUDED_H #define FSST_INCLUDED_H -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define __restrict__ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __ORDER_LITTLE_ENDIAN__ 2 @@ -55413,7 +56048,7 @@ MiniZStreamWrapper::~MiniZStreamWrapper() { } try { MiniZStreamWrapper::Close(); - } catch (...) { + } catch (...) { // NOLINT - cannot throw in exception } } @@ -56204,7 +56839,7 @@ class HTTPState : public ClientContextState { shared_ptr &GetCachedFile(const string &path); //! Helper functions to get the HTTP state static shared_ptr TryGetState(ClientContext &context, bool create_on_missing = true); - static shared_ptr TryGetState(FileOpener *opener, bool create_on_missing = true); + static shared_ptr TryGetState(optional_ptr opener, bool create_on_missing = true); bool IsEmpty() { return head_count == 0 && get_count == 0 && put_count == 0 && post_count == 0 && total_bytes_received == 0 && @@ -56307,7 +56942,7 @@ shared_ptr HTTPState::TryGetState(ClientContext &context, bool create return http_state; } -shared_ptr HTTPState::TryGetState(FileOpener *opener, bool create_on_missing) { +shared_ptr HTTPState::TryGetState(optional_ptr opener, bool create_on_missing) { auto client_context = FileOpener::TryGetClientContext(opener); if (client_context) { return TryGetState(*client_context, create_on_missing); @@ -56343,9 +56978,8 @@ namespace duckdb { class LocalFileSystem : public FileSystem { public: - unique_ptr OpenFile(const string &path, uint8_t flags, FileLockType lock = FileLockType::NO_LOCK, - FileCompressionType compression = FileCompressionType::UNCOMPRESSED, - FileOpener *opener = nullptr) override; + unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr) override; //! Read exactly nr_bytes from the specified location in the file. Fails if nr_bytes could not be read. This is //! equivalent to calling SetFilePointer(location) followed by calling Read(). @@ -56358,6 +56992,10 @@ class LocalFileSystem : public FileSystem { int64_t Read(FileHandle &handle, void *buffer, int64_t nr_bytes) override; //! Write nr_bytes from the buffer into the file, moving the file pointer forward by nr_bytes. int64_t Write(FileHandle &handle, void *buffer, int64_t nr_bytes) override; + //! Excise a range of the file. The file-system is free to deallocate this + //! range (sparse file support). Reads to the range will succeed but will return + //! undefined data. + bool Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) override; //! Returns the file size of a file handle, returns -1 on error int64_t GetFileSize(FileHandle &handle) override; @@ -56370,24 +57008,24 @@ class LocalFileSystem : public FileSystem { void Truncate(FileHandle &handle, int64_t new_size) override; //! Check if a directory exists - bool DirectoryExists(const string &directory) override; + bool DirectoryExists(const string &directory, optional_ptr opener = nullptr) override; //! Create a directory if it does not exist - void CreateDirectory(const string &directory) override; + void CreateDirectory(const string &directory, optional_ptr opener = nullptr) override; //! Recursively remove a directory and all files in it - void RemoveDirectory(const string &directory) override; + void RemoveDirectory(const string &directory, optional_ptr opener = nullptr) override; //! List files in a directory, invoking the callback method for each one with (filename, is_dir) bool ListFiles(const string &directory, const std::function &callback, FileOpener *opener = nullptr) override; //! Move a file from source path to the target, StorageManager relies on this being an atomic action for ACID //! properties - void MoveFile(const string &source, const string &target) override; + void MoveFile(const string &source, const string &target, optional_ptr opener = nullptr) override; //! Check if a file exists - bool FileExists(const string &filename) override; + bool FileExists(const string &filename, optional_ptr opener = nullptr) override; //! Check if path is a pipe - bool IsPipe(const string &filename) override; + bool IsPipe(const string &filename, optional_ptr opener = nullptr) override; //! Remove a file from disk - void RemoveFile(const string &filename) override; + void RemoveFile(const string &filename, optional_ptr opener = nullptr) override; //! Sync a file handle to disk void FileSync(FileHandle &handle) override; @@ -56472,43 +57110,23 @@ extern "C" WINBASEAPI BOOL WINAPI GetPhysicallyInstalledSystemMemory(PULONGLONG) #endif #if defined(__linux__) +#include #include // See e.g.: // https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html #elif defined(__APPLE__) -#include // NOLINT -#if not(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) // NOLINT -#include // NOLINT -#endif // NOLINT +#include +#if not(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) +#include +#endif #elif defined(_WIN32) #include #endif namespace duckdb { -static void AssertValidFileFlags(uint8_t flags) { -#ifdef DEBUG - bool is_read = flags & FileFlags::FILE_FLAGS_READ; - bool is_write = flags & FileFlags::FILE_FLAGS_WRITE; - bool is_create = (flags & FileFlags::FILE_FLAGS_FILE_CREATE) || (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW); - bool is_private = (flags & FileFlags::FILE_FLAGS_PRIVATE); - - // require either READ or WRITE (or both) - D_ASSERT(is_read || is_write); - // CREATE/Append flags require writing - D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_APPEND)); - D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_FILE_CREATE)); - D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW)); - // cannot combine CREATE and CREATE_NEW flags - D_ASSERT(!(flags & FileFlags::FILE_FLAGS_FILE_CREATE && flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW)); - - // For is_private can only be set along with a create flag - D_ASSERT(!is_private || is_create); -#endif -} - #ifndef _WIN32 -bool LocalFileSystem::FileExists(const string &filename) { +bool LocalFileSystem::FileExists(const string &filename, optional_ptr opener) { if (!filename.empty()) { if (access(filename.c_str(), 0) == 0) { struct stat status; @@ -56522,7 +57140,7 @@ bool LocalFileSystem::FileExists(const string &filename) { return false; } -bool LocalFileSystem::IsPipe(const string &filename) { +bool LocalFileSystem::IsPipe(const string &filename, optional_ptr opener) { if (!filename.empty()) { if (access(filename.c_str(), 0) == 0) { struct stat status; @@ -56537,7 +57155,7 @@ bool LocalFileSystem::IsPipe(const string &filename) { } #else -bool LocalFileSystem::FileExists(const string &filename) { +bool LocalFileSystem::FileExists(const string &filename, optional_ptr opener) { auto unicode_path = WindowsUtil::UTF8ToUnicode(filename.c_str()); const wchar_t *wpath = unicode_path.c_str(); if (_waccess(wpath, 0) == 0) { @@ -56549,7 +57167,7 @@ bool LocalFileSystem::FileExists(const string &filename) { } return false; } -bool LocalFileSystem::IsPipe(const string &filename) { +bool LocalFileSystem::IsPipe(const string &filename, optional_ptr opener) { auto unicode_path = WindowsUtil::UTF8ToUnicode(filename.c_str()); const wchar_t *wpath = unicode_path.c_str(); if (_waccess(wpath, 0) == 0) { @@ -56665,7 +57283,7 @@ static string AdditionalProcessInfo(FileSystem &fs, pid_t pid) { try { auto cmdline_file = fs.OpenFile(StringUtil::Format("/proc/%d/cmdline", pid), FileFlags::FILE_FLAGS_READ); auto cmdline = cmdline_file->ReadLine(); - process_name = basename(const_cast(cmdline.c_str())); + process_name = basename(const_cast(cmdline.c_str())); // NOLINT: old C API does not take const } catch (std::exception &) { // ignore } @@ -56724,19 +57342,19 @@ bool LocalFileSystem::IsPrivateFile(const string &path_p, FileOpener *opener) { return true; } -unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t flags, FileLockType lock_type, - FileCompressionType compression, FileOpener *opener) { +unique_ptr LocalFileSystem::OpenFile(const string &path_p, FileOpenFlags flags, + optional_ptr opener) { auto path = FileSystem::ExpandPath(path_p, opener); - if (compression != FileCompressionType::UNCOMPRESSED) { + if (flags.Compression() != FileCompressionType::UNCOMPRESSED) { throw NotImplementedException("Unsupported compression type for default file system"); } - AssertValidFileFlags(flags); + flags.Verify(); int open_flags = 0; int rc; - bool open_read = flags & FileFlags::FILE_FLAGS_READ; - bool open_write = flags & FileFlags::FILE_FLAGS_WRITE; + bool open_read = flags.OpenForReading(); + bool open_write = flags.OpenForWriting(); if (open_read && open_write) { open_flags = O_RDWR; } else if (open_read) { @@ -56748,18 +57366,18 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f } if (open_write) { // need Read or Write - D_ASSERT(flags & FileFlags::FILE_FLAGS_WRITE); + D_ASSERT(flags.OpenForWriting()); open_flags |= O_CLOEXEC; - if (flags & FileFlags::FILE_FLAGS_FILE_CREATE) { + if (flags.CreateFileIfNotExists()) { open_flags |= O_CREAT; - } else if (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW) { + } else if (flags.OverwriteExistingFile()) { open_flags |= O_CREAT | O_TRUNC; } - if (flags & FileFlags::FILE_FLAGS_APPEND) { + if (flags.OpenForAppending()) { open_flags |= O_APPEND; } } - if (flags & FileFlags::FILE_FLAGS_DIRECT_IO) { + if (flags.DirectIO()) { #if defined(__sun) && defined(__SVR4) throw InvalidInputException("DIRECT_IO not supported on Solaris"); #endif @@ -56773,7 +57391,7 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f // Determine permissions mode_t filesec; - if (flags & FileFlags::FILE_FLAGS_PRIVATE) { + if (flags.CreatePrivateFile()) { open_flags |= O_EXCL; // Ensure we error on existing files or the permissions may not set filesec = 0600; } else { @@ -56784,6 +57402,9 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f int fd = open(path.c_str(), open_flags, filesec); if (fd == -1) { + if (flags.ReturnNullIfNotExists() && errno == ENOENT) { + return nullptr; + } throw IOException("Cannot open file \"%s\": %s", {{"errno", std::to_string(errno)}}, path, strerror(errno)); } // #if defined(__DARWIN__) || defined(__APPLE__) @@ -56795,14 +57416,14 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f // } // } // #endif - if (lock_type != FileLockType::NO_LOCK) { + if (flags.Lock() != FileLockType::NO_LOCK) { // set lock on file // but only if it is not an input/output stream auto file_type = GetFileTypeInternal(fd); if (file_type != FileType::FILE_TYPE_FIFO && file_type != FileType::FILE_TYPE_SOCKET) { struct flock fl; memset(&fl, 0, sizeof fl); - fl.l_type = lock_type == FileLockType::READ_LOCK ? F_RDLCK : F_WRLCK; + fl.l_type = flags.Lock() == FileLockType::READ_LOCK ? F_RDLCK : F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; @@ -56819,7 +57440,7 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f message = AdditionalProcessInfo(*this, fl.l_pid); } - if (lock_type == FileLockType::WRITE_LOCK) { + if (flags.Lock() == FileLockType::WRITE_LOCK) { // maybe we can get a read lock instead and tell this to the user. fl.l_type = F_RDLCK; rc = fcntl(fd, F_SETLK, &fl); @@ -56922,6 +57543,16 @@ int64_t LocalFileSystem::Write(FileHandle &handle, void *buffer, int64_t nr_byte return bytes_written; } +bool LocalFileSystem::Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) { +#if defined(__linux__) + int fd = handle.Cast().fd; + int res = fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset_bytes, length_bytes); + return res == 0; +#else + return false; +#endif +} + int64_t LocalFileSystem::GetFileSize(FileHandle &handle) { int fd = handle.Cast().fd; struct stat s; @@ -56953,7 +57584,7 @@ void LocalFileSystem::Truncate(FileHandle &handle, int64_t new_size) { } } -bool LocalFileSystem::DirectoryExists(const string &directory) { +bool LocalFileSystem::DirectoryExists(const string &directory, optional_ptr opener) { if (!directory.empty()) { if (access(directory.c_str(), 0) == 0) { struct stat status; @@ -56967,7 +57598,7 @@ bool LocalFileSystem::DirectoryExists(const string &directory) { return false; } -void LocalFileSystem::CreateDirectory(const string &directory) { +void LocalFileSystem::CreateDirectory(const string &directory, optional_ptr opener) { struct stat st; if (stat(directory.c_str(), &st) != 0) { @@ -57021,11 +57652,11 @@ int RemoveDirectoryRecursive(const char *path) { return r; } -void LocalFileSystem::RemoveDirectory(const string &directory) { +void LocalFileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { RemoveDirectoryRecursive(directory.c_str()); } -void LocalFileSystem::RemoveFile(const string &filename) { +void LocalFileSystem::RemoveFile(const string &filename, optional_ptr opener) { if (std::remove(filename.c_str()) != 0) { throw IOException("Could not remove file \"%s\": %s", {{"errno", std::to_string(errno)}}, filename, strerror(errno)); @@ -57034,7 +57665,7 @@ void LocalFileSystem::RemoveFile(const string &filename) { bool LocalFileSystem::ListFiles(const string &directory, const std::function &callback, FileOpener *opener) { - if (!DirectoryExists(directory)) { + if (!DirectoryExists(directory, opener)) { return false; } DIR *dir = opendir(directory.c_str()); @@ -57074,7 +57705,7 @@ void LocalFileSystem::FileSync(FileHandle &handle) { } } -void LocalFileSystem::MoveFile(const string &source, const string &target) { +void LocalFileSystem::MoveFile(const string &source, const string &target, optional_ptr opener) { //! FIXME: rename does not guarantee atomicity or overwriting target file if it exists if (rename(source.c_str(), target.c_str()) != 0) { throw IOException("Could not rename file!", {{"errno", std::to_string(errno)}}); @@ -57198,20 +57829,20 @@ bool LocalFileSystem::IsPrivateFile(const string &path_p, FileOpener *opener) { return true; } -unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t flags, FileLockType lock_type, - FileCompressionType compression, FileOpener *opener) { +unique_ptr LocalFileSystem::OpenFile(const string &path_p, FileOpenFlags flags, + optional_ptr opener) { auto path = FileSystem::ExpandPath(path_p, opener); - if (compression != FileCompressionType::UNCOMPRESSED) { + if (flags.Compression() != FileCompressionType::UNCOMPRESSED) { throw NotImplementedException("Unsupported compression type for default file system"); } - AssertValidFileFlags(flags); + flags.Verify(); DWORD desired_access; DWORD share_mode; DWORD creation_disposition = OPEN_EXISTING; DWORD flags_and_attributes = FILE_ATTRIBUTE_NORMAL; - bool open_read = flags & FileFlags::FILE_FLAGS_READ; - bool open_write = flags & FileFlags::FILE_FLAGS_WRITE; + bool open_read = flags.OpenForReading(); + bool open_write = flags.OpenForWriting(); if (open_read && open_write) { desired_access = GENERIC_READ | GENERIC_WRITE; share_mode = 0; @@ -57225,30 +57856,33 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f throw InternalException("READ, WRITE or both should be specified when opening a file"); } if (open_write) { - if (flags & FileFlags::FILE_FLAGS_FILE_CREATE) { + if (flags.CreateFileIfNotExists()) { creation_disposition = OPEN_ALWAYS; - } else if (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW) { + } else if (flags.OverwriteExistingFile()) { creation_disposition = CREATE_ALWAYS; } } - if (flags & FileFlags::FILE_FLAGS_DIRECT_IO) { + if (flags.DirectIO()) { flags_and_attributes |= FILE_FLAG_NO_BUFFERING; } auto unicode_path = WindowsUtil::UTF8ToUnicode(path.c_str()); HANDLE hFile = CreateFileW(unicode_path.c_str(), desired_access, share_mode, NULL, creation_disposition, flags_and_attributes, NULL); if (hFile == INVALID_HANDLE_VALUE) { + if (flags.ReturnNullIfNotExists() && GetLastError() == ERROR_FILE_NOT_FOUND) { + return nullptr; + } auto error = LocalFileSystem::GetLastErrorAsString(); auto better_error = AdditionalLockInfo(unicode_path); if (!better_error.empty()) { throw IOException(better_error); + } else { + throw IOException("Cannot open file \"%s\": %s", path.c_str(), error); } - - throw IOException("Cannot open file \"%s\": %s", path.c_str(), error); } auto handle = make_uniq(*this, path.c_str(), hFile); - if (flags & FileFlags::FILE_FLAGS_APPEND) { + if (flags.OpenForAppending()) { auto file_size = GetFileSize(*handle); SetFilePointer(*handle, file_size); } @@ -57352,6 +57986,11 @@ int64_t LocalFileSystem::Write(FileHandle &handle, void *buffer, int64_t nr_byte return bytes_written; } +bool LocalFileSystem::Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) { + // TODO: Not yet implemented on windows. + return false; +} + int64_t LocalFileSystem::GetFileSize(FileHandle &handle) { HANDLE hFile = handle.Cast().fd; LARGE_INTEGER result; @@ -57403,12 +58042,12 @@ static DWORD WindowsGetFileAttributes(const string &filename) { return GetFileAttributesW(unicode_path.c_str()); } -bool LocalFileSystem::DirectoryExists(const string &directory) { +bool LocalFileSystem::DirectoryExists(const string &directory, optional_ptr opener) { DWORD attrs = WindowsGetFileAttributes(directory); return (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)); } -void LocalFileSystem::CreateDirectory(const string &directory) { +void LocalFileSystem::CreateDirectory(const string &directory, optional_ptr opener) { if (DirectoryExists(directory)) { return; } @@ -57433,7 +58072,7 @@ static void DeleteDirectoryRecursive(FileSystem &fs, string directory) { } } -void LocalFileSystem::RemoveDirectory(const string &directory) { +void LocalFileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { if (FileExists(directory)) { throw IOException("Attempting to delete directory \"%s\", but it is a file and not a directory!", directory); } @@ -57443,7 +58082,7 @@ void LocalFileSystem::RemoveDirectory(const string &directory) { DeleteDirectoryRecursive(*this, directory.c_str()); } -void LocalFileSystem::RemoveFile(const string &filename) { +void LocalFileSystem::RemoveFile(const string &filename, optional_ptr opener) { auto unicode_path = WindowsUtil::UTF8ToUnicode(filename.c_str()); if (!DeleteFileW(unicode_path.c_str())) { auto error = LocalFileSystem::GetLastErrorAsString(); @@ -57487,7 +58126,7 @@ void LocalFileSystem::FileSync(FileHandle &handle) { } } -void LocalFileSystem::MoveFile(const string &source, const string &target) { +void LocalFileSystem::MoveFile(const string &source, const string &target, optional_ptr opener) { auto source_unicode = WindowsUtil::UTF8ToUnicode(source.c_str()); auto target_unicode = WindowsUtil::UTF8ToUnicode(target.c_str()); if (!MoveFileW(source_unicode.c_str(), target_unicode.c_str())) { @@ -57594,7 +58233,7 @@ static void GlobFilesInternal(FileSystem &fs, const string &path, const string & vector LocalFileSystem::FetchFileWithoutGlob(const string &path, FileOpener *opener, bool absolute_path) { vector result; - if (FileExists(path) || IsPipe(path)) { + if (FileExists(path, opener) || IsPipe(path, opener)) { result.push_back(path); } else if (!absolute_path) { Value value; @@ -57603,7 +58242,7 @@ vector LocalFileSystem::FetchFileWithoutGlob(const string &path, FileOpe vector search_paths = StringUtil::Split(search_paths_str, ','); for (const auto &search_path : search_paths) { auto joined_path = JoinPath(search_path, path); - if (FileExists(joined_path) || IsPipe(joined_path)) { + if (FileExists(joined_path, opener) || IsPipe(joined_path, opener)) { result.push_back(joined_path); } } @@ -57694,7 +58333,7 @@ vector LocalFileSystem::Glob(const string &path, FileOpener *opener) { if (is_last_chunk) { for (auto &prev_directory : previous_directories) { const string filename = JoinPath(prev_directory, splits[i]); - if (FileExists(filename) || DirectoryExists(filename)) { + if (FileExists(filename, opener) || DirectoryExists(filename, opener)) { result.push_back(filename); } } @@ -57793,7 +58432,7 @@ class UnionByName { vector> union_readers; case_insensitive_map_t union_names_map; for (idx_t file_idx = 0; file_idx < files.size(); ++file_idx) { - const auto file_name = files[file_idx]; + const auto &file_name = files[file_idx]; auto reader = make_uniq(context, file_name, options); auto &col_names = reader->GetNames(); @@ -58177,7 +58816,7 @@ MultiFileReaderBindData MultiFileReader::BindOptions(MultiFileReaderOptions &opt } for (auto &part : partitions) { - idx_t hive_partitioning_index = DConstants::INVALID_INDEX; + idx_t hive_partitioning_index; auto lookup = std::find(names.begin(), names.end(), part.first); if (lookup != names.end()) { // hive partitioning column also exists in file - override @@ -58426,39 +59065,59 @@ bool MultiFileReaderOptions::AutoDetectHivePartitioningInternal(const vector &files, ClientContext &context) { + const LogicalType candidates[] = {LogicalType::DATE, LogicalType::TIMESTAMP, LogicalType::BIGINT}; + auto &fs = FileSystem::GetFileSystem(context); - std::map partitions; - auto splits = StringUtil::Split(file, fs.PathSeparator(file)); - if (splits.size() < 2) { - return; - } - for (auto it = splits.begin(); it != std::prev(splits.end()); it++) { - auto part = StringUtil::Split(*it, "="); - if (part.size() == 2) { - partitions[part.front()] = part.back(); + unordered_map detected_types; + for (auto &file : files) { + unordered_map partitions; + auto splits = StringUtil::Split(file, fs.PathSeparator(file)); + if (splits.size() < 2) { + return; } - } - if (partitions.empty()) { - return; - } - - const LogicalType candidates[] = {LogicalType::DATE, LogicalType::TIMESTAMP, LogicalType::BIGINT}; - for (auto &part : partitions) { - const string &name = part.first; - if (hive_types_schema.find(name) != hive_types_schema.end()) { - continue; + for (auto it = splits.begin(); it != std::prev(splits.end()); it++) { + auto part = StringUtil::Split(*it, "="); + if (part.size() == 2) { + partitions[part.front()] = part.back(); + } } - Value value(part.second); - for (auto &candidate : candidates) { - const bool success = value.TryCastAs(context, candidate, true); - if (success) { - hive_types_schema[name] = candidate; - break; + if (partitions.empty()) { + return; + } + + for (auto &part : partitions) { + const string &name = part.first; + if (hive_types_schema.find(name) != hive_types_schema.end()) { + // type was explicitly provided by the user + continue; + } + LogicalType detected_type = LogicalType::VARCHAR; + Value value(part.second); + for (auto &candidate : candidates) { + const bool success = value.TryCastAs(context, candidate, true); + if (success) { + detected_type = candidate; + break; + } + } + auto entry = detected_types.find(name); + if (entry == detected_types.end()) { + // type was not yet detected - insert it + detected_types.insert(make_pair(name, std::move(detected_type))); + } else { + // type was already detected - check if the type matches + // if not promote to VARCHAR + if (entry->second != detected_type) { + entry->second = LogicalType::VARCHAR; + } } } } + for (auto &entry : detected_types) { + hive_types_schema.insert(make_pair(entry.first, std::move(entry.second))); + } } void MultiFileReaderOptions::AutoDetectHivePartitioning(const vector &files, ClientContext &context) { D_ASSERT(!files.empty()); @@ -58476,7 +59135,7 @@ void MultiFileReaderOptions::AutoDetectHivePartitioning(const vector &fi hive_partitioning = AutoDetectHivePartitioningInternal(files, context); } if (hive_partitioning && hive_types_autocast) { - AutoDetectHiveTypesInternal(files.front(), context); + AutoDetectHiveTypesInternal(files, context); } } void MultiFileReaderOptions::VerifyHiveTypesArePartitions(const std::map &partitions) const { @@ -67155,7 +67814,7 @@ class PipeFileSystem : public FileSystem { bool CanSeek() override { return false; } - bool IsPipe(const string &filename) override { + bool IsPipe(const string &filename, optional_ptr opener) override { return true; } void FileSync(FileHandle &handle) override; @@ -67370,11 +68029,11 @@ class TerminalProgressBarDisplay : public ProgressBarDisplay { int32_t rendered_percentage = -1; static constexpr const idx_t PARTIAL_BLOCK_COUNT = UnicodeBar::PartialBlocksCount(); #ifndef DUCKDB_ASCII_TREE_RENDERER - const char *PROGRESS_EMPTY = " "; - const char *const *PROGRESS_PARTIAL = UnicodeBar::PartialBlocks(); - const char *PROGRESS_BLOCK = UnicodeBar::FullBlock(); - const char *PROGRESS_START = "\xE2\x96\x95"; - const char *PROGRESS_END = "\xE2\x96\x8F"; + const char *PROGRESS_EMPTY = " "; // NOLINT + const char *const *PROGRESS_PARTIAL = UnicodeBar::PartialBlocks(); // NOLINT + const char *PROGRESS_BLOCK = UnicodeBar::FullBlock(); // NOLINT + const char *PROGRESS_START = "\xE2\x96\x95"; // NOLINT + const char *PROGRESS_END = "\xE2\x96\x8F"; // NOLINT #else const char *PROGRESS_EMPTY = " "; const char *const PROGRESS_PARTIAL[PARTIAL_BLOCK_COUNT] = {" ", " ", " ", " ", " ", " ", " ", " "}; @@ -71436,8 +72095,8 @@ enum class RegexOptions : uint8_t { NONE, CASE_INSENSITIVE }; class Regex { public: - DUCKDB_API Regex(const std::string &pattern, RegexOptions options = RegexOptions::NONE); - Regex(const char *pattern, RegexOptions options = RegexOptions::NONE) : Regex(std::string(pattern)) { + DUCKDB_API explicit Regex(const std::string &pattern, RegexOptions options = RegexOptions::NONE); + explicit Regex(const char *pattern, RegexOptions options = RegexOptions::NONE) : Regex(std::string(pattern)) { } const duckdb_re2::RE2 &GetRegex() const { return *regex; @@ -71451,10 +72110,10 @@ struct GroupMatch { std::string text; uint32_t position; - const std::string &str() const { + const std::string &str() const { // NOLINT return text; } - operator std::string() const { + operator std::string() const { // NOLINT: allow implicit cast return text; } }; @@ -71469,15 +72128,15 @@ struct Match { return groups[index]; } - std::string str(uint64_t index) { + std::string str(uint64_t index) { // NOLINT return GetGroup(index).text; } - uint64_t position(uint64_t index) { + uint64_t position(uint64_t index) { // NOLINT return GetGroup(index).position; } - uint64_t length(uint64_t index) { + uint64_t length(uint64_t index) { // NOLINT return GetGroup(index).text.size(); } @@ -73303,13 +73962,13 @@ static idx_t SelectComparison(Vector &, Vector &, const SelectionVector &, idx_t template <> idx_t SelectComparison(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel); + return VectorOperations::NestedEquals(left, right, &sel, count, true_sel, false_sel); } template <> idx_t SelectComparison(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel); + return VectorOperations::NestedNotEquals(left, right, &sel, count, true_sel, false_sel); } template <> @@ -74695,6 +75354,7 @@ class BufferedFileReader : public ReadStream { public: BufferedFileReader(FileSystem &fs, const char *path, FileLockType lock_type = FileLockType::READ_LOCK, optional_ptr opener = nullptr); + BufferedFileReader(FileSystem &fs, unique_ptr handle); FileSystem &fs; unsafe_unique_array data; @@ -74711,6 +75371,8 @@ class BufferedFileReader : public ReadStream { return file_size; } + //! Resets reading - beginning at position 0 + void Reset(); void Seek(uint64_t location); uint64_t CurrentOffset(); @@ -74732,7 +75394,13 @@ namespace duckdb { BufferedFileReader::BufferedFileReader(FileSystem &fs, const char *path, FileLockType lock_type, optional_ptr opener) : fs(fs), data(make_unsafe_uniq_array(FILE_BUFFER_SIZE)), offset(0), read_data(0), total_read(0) { - handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ, lock_type, FileSystem::DEFAULT_COMPRESSION, opener.get()); + handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ | lock_type, opener.get()); + file_size = fs.GetFileSize(*handle); +} + +BufferedFileReader::BufferedFileReader(FileSystem &fs, unique_ptr handle_p) + : fs(fs), data(make_unsafe_uniq_array(FILE_BUFFER_SIZE)), offset(0), read_data(0), + handle(std::move(handle_p)), total_read(0) { file_size = fs.GetFileSize(*handle); } @@ -74773,6 +75441,12 @@ void BufferedFileReader::Seek(uint64_t location) { read_data = offset = 0; } +void BufferedFileReader::Reset() { + handle->Reset(); + total_read = 0; + read_data = offset = 0; +} + uint64_t BufferedFileReader::CurrentOffset() { return total_read + offset; } @@ -74781,16 +75455,17 @@ uint64_t BufferedFileReader::CurrentOffset() { + #include namespace duckdb { // Remove this when we switch C++17: https://stackoverflow.com/a/53350948 -constexpr uint8_t BufferedFileWriter::DEFAULT_OPEN_FLAGS; +constexpr FileOpenFlags BufferedFileWriter::DEFAULT_OPEN_FLAGS; -BufferedFileWriter::BufferedFileWriter(FileSystem &fs, const string &path_p, uint8_t open_flags) +BufferedFileWriter::BufferedFileWriter(FileSystem &fs, const string &path_p, FileOpenFlags open_flags) : fs(fs), path(path_p), data(make_unsafe_uniq_array(FILE_BUFFER_SIZE)), offset(0), total_written(0) { - handle = fs.OpenFile(path, open_flags, FileLockType::WRITE_LOCK); + handle = fs.OpenFile(path, open_flags | FileLockType::WRITE_LOCK); } int64_t BufferedFileWriter::GetFileSize() { @@ -74802,16 +75477,34 @@ idx_t BufferedFileWriter::GetTotalWritten() { } void BufferedFileWriter::WriteData(const_data_ptr_t buffer, idx_t write_size) { - // first copy anything we can from the buffer - const_data_ptr_t end_ptr = buffer + write_size; - while (buffer < end_ptr) { - idx_t to_write = MinValue((end_ptr - buffer), FILE_BUFFER_SIZE - offset); - D_ASSERT(to_write > 0); - memcpy(data.get() + offset, buffer, to_write); - offset += to_write; - buffer += to_write; - if (offset == FILE_BUFFER_SIZE) { - Flush(); + if (write_size >= (2ULL * FILE_BUFFER_SIZE - offset)) { + idx_t to_copy = 0; + // Check before performing direct IO if there is some data in the current internal buffer. + // If so, then fill the buffer (to avoid to small write operation), flush it and then write + // all the remain data directly. + // This is to avoid to split a large buffer into N*FILE_BUFFER_SIZE buffers + if (offset != 0) { + // Some data are still present in the buffer let write them before + to_copy = FILE_BUFFER_SIZE - offset; + memcpy(data.get() + offset, buffer, to_copy); + offset += to_copy; + Flush(); // Flush buffer before writing every things else + } + idx_t remaining_to_write = write_size - to_copy; + fs.Write(*handle, const_cast(buffer + to_copy), remaining_to_write); // NOLINT: wrong API in Write + total_written += remaining_to_write; + } else { + // first copy anything we can from the buffer + const_data_ptr_t end_ptr = buffer + write_size; + while (buffer < end_ptr) { + idx_t to_write = MinValue((end_ptr - buffer), FILE_BUFFER_SIZE - offset); + D_ASSERT(to_write > 0); + memcpy(data.get() + offset, buffer, to_write); + offset += to_write; + buffer += to_write; + if (offset == FILE_BUFFER_SIZE) { + Flush(); + } } } } @@ -77067,6 +77760,8 @@ using duckdb::make_unsafe_uniq_array; using duckdb::FastMemcpy; using duckdb::FastMemcmp; +// NOLINTBEGIN + enum { // Partitions below this size are sorted using insertion sort. insertion_sort_threshold = 24, @@ -77725,6 +78420,7 @@ inline void pdqsort_branchless(const PDQIterator &begin, const PDQIterator &end, } pdqsort_loop(begin, end, constants, log2(end - begin)); } +// NOLINTEND } // namespace duckdb_pdqsort @@ -79247,7 +79943,6 @@ string StringUtil::Join(const set &input, const string &separator) { string StringUtil::BytesToHumanReadableString(idx_t bytes, idx_t multiplier) { D_ASSERT(multiplier == 1000 || multiplier == 1024); - string db_size; idx_t array[6] = {}; const char *unit[2][6] = {{"bytes", "KiB", "MiB", "GiB", "TiB", "PiB"}, {"bytes", "kB", "MB", "GB", "TB", "PB"}}; @@ -79304,7 +79999,7 @@ bool StringUtil::CIEquals(const string &l1, const string &l2) { if (l1.size() != l2.size()) { return false; } - const auto charmap = LowerFun::ascii_to_lower_map; + const auto charmap = LowerFun::ASCII_TO_LOWER_MAP; for (idx_t c = 0; c < l1.size(); c++) { if (charmap[(uint8_t)l1[c]] != charmap[(uint8_t)l2[c]]) { return false; @@ -79314,7 +80009,7 @@ bool StringUtil::CIEquals(const string &l1, const string &l2) { } bool StringUtil::CILessThan(const string &s1, const string &s2) { - const auto charmap = UpperFun::ascii_to_upper_map; + const auto charmap = UpperFun::ASCII_TO_UPPER_MAP; unsigned char u1, u2; @@ -79766,36 +80461,36 @@ struct RenderTree { }; struct TreeRendererConfig { - void enable_detailed() { - MAX_EXTRA_LINES = 1000; + void EnableDetailed() { + max_extra_lines = 1000; detailed = true; } - void enable_standard() { - MAX_EXTRA_LINES = 30; + void EnableStandard() { + max_extra_lines = 30; detailed = false; } - idx_t MAXIMUM_RENDER_WIDTH = 240; - idx_t NODE_RENDER_WIDTH = 29; - idx_t MINIMUM_RENDER_WIDTH = 15; - idx_t MAX_EXTRA_LINES = 30; + idx_t maximum_render_width = 240; + idx_t node_render_width = 29; + idx_t minimum_render_width = 15; + idx_t max_extra_lines = 30; bool detailed = false; #ifndef DUCKDB_ASCII_TREE_RENDERER - const char *LTCORNER = "\342\224\214"; // "┌"; - const char *RTCORNER = "\342\224\220"; // "┐"; - const char *LDCORNER = "\342\224\224"; // "└"; - const char *RDCORNER = "\342\224\230"; // "┘"; - - const char *MIDDLE = "\342\224\274"; // "┼"; - const char *TMIDDLE = "\342\224\254"; // "┬"; - const char *LMIDDLE = "\342\224\234"; // "├"; - const char *RMIDDLE = "\342\224\244"; // "┤"; - const char *DMIDDLE = "\342\224\264"; // "┴"; - - const char *VERTICAL = "\342\224\202"; // "│"; - const char *HORIZONTAL = "\342\224\200"; // "─"; + const char *LTCORNER = "\342\224\214"; // NOLINT "┌"; + const char *RTCORNER = "\342\224\220"; // NOLINT "┐"; + const char *LDCORNER = "\342\224\224"; // NOLINT "└"; + const char *RDCORNER = "\342\224\230"; // NOLINT "┘"; + + const char *MIDDLE = "\342\224\274"; // NOLINT "┼"; + const char *TMIDDLE = "\342\224\254"; // NOLINT "┬"; + const char *LMIDDLE = "\342\224\234"; // NOLINT "├"; + const char *RMIDDLE = "\342\224\244"; // NOLINT "┤"; + const char *DMIDDLE = "\342\224\264"; // NOLINT "┴"; + + const char *VERTICAL = "\342\224\202"; // NOLINT "│"; + const char *HORIZONTAL = "\342\224\200"; // NOLINT "─"; #else // ASCII version const char *LTCORNER = "<"; @@ -79816,7 +80511,7 @@ struct TreeRendererConfig { class TreeRenderer { public: - explicit TreeRenderer(TreeRendererConfig config_p = TreeRendererConfig()) : config(std::move(config_p)) { + explicit TreeRenderer(TreeRendererConfig config_p = TreeRendererConfig()) : config(config_p) { } string ToString(const LogicalOperator &op); @@ -79832,10 +80527,10 @@ class TreeRenderer { void ToStream(RenderTree &root, std::ostream &ss); void EnableDetailed() { - config.enable_detailed(); + config.EnableDetailed(); } void EnableStandard() { - config.enable_standard(); + config.EnableStandard(); } private: @@ -79871,7 +80566,6 @@ class TreeRenderer { template unique_ptr CreateRenderTree(const T &op); - string ExtractExpressionsRecursive(ExpressionInfo &states); }; } // namespace duckdb @@ -80095,7 +80789,7 @@ struct DistinctAggregateCollectionInfo { struct DistinctAggregateData { public: - DistinctAggregateData(const DistinctAggregateCollectionInfo &info); + explicit DistinctAggregateData(const DistinctAggregateCollectionInfo &info); DistinctAggregateData(const DistinctAggregateCollectionInfo &info, const GroupingSet &groups, const vector> *group_expressions); //! The data used by the hashtables @@ -80405,12 +81099,12 @@ void RenderTree::SetNode(idx_t x, idx_t y, unique_ptr node) { void TreeRenderer::RenderTopLayer(RenderTree &root, std::ostream &ss, idx_t y) { for (idx_t x = 0; x < root.width; x++) { - if (x * config.NODE_RENDER_WIDTH >= config.MAXIMUM_RENDER_WIDTH) { + if (x * config.node_render_width >= config.maximum_render_width) { break; } if (root.HasNode(x, y)) { ss << config.LTCORNER; - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); if (y == 0) { // top level node: no node above this one ss << config.HORIZONTAL; @@ -80418,23 +81112,23 @@ void TreeRenderer::RenderTopLayer(RenderTree &root, std::ostream &ss, idx_t y) { // render connection to node above this one ss << config.DMIDDLE; } - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); ss << config.RTCORNER; } else { - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } - ss << std::endl; + ss << '\n'; } void TreeRenderer::RenderBottomLayer(RenderTree &root, std::ostream &ss, idx_t y) { for (idx_t x = 0; x <= root.width; x++) { - if (x * config.NODE_RENDER_WIDTH >= config.MAXIMUM_RENDER_WIDTH) { + if (x * config.node_render_width >= config.maximum_render_width) { break; } if (root.HasNode(x, y)) { ss << config.LDCORNER; - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); if (root.HasNode(x, y + 1)) { // node below this one: connect to that one ss << config.TMIDDLE; @@ -80442,17 +81136,17 @@ void TreeRenderer::RenderBottomLayer(RenderTree &root, std::ostream &ss, idx_t y // no node below this one: end the box ss << config.HORIZONTAL; } - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); ss << config.RDCORNER; } else if (root.HasNode(x, y + 1)) { - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); ss << config.VERTICAL; - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); } else { - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } - ss << std::endl; + ss << '\n'; } string AdjustTextForRendering(string source, idx_t max_render_width) { @@ -80508,12 +81202,12 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) } } } - extra_height = MinValue(extra_height, config.MAX_EXTRA_LINES); + extra_height = MinValue(extra_height, config.max_extra_lines); idx_t halfway_point = (extra_height + 1) / 2; // now we render the actual node for (idx_t render_y = 0; render_y <= extra_height; render_y++) { for (idx_t x = 0; x < root.width; x++) { - if (x * config.NODE_RENDER_WIDTH >= config.MAXIMUM_RENDER_WIDTH) { + if (x * config.node_render_width >= config.maximum_render_width) { break; } auto node = root.GetNode(x, y); @@ -80522,35 +81216,35 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) bool has_child_to_the_right = NodeHasMultipleChildren(root, x, y); if (root.HasNode(x, y + 1)) { // node right below this one - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2); ss << config.RTCORNER; if (has_child_to_the_right) { // but we have another child to the right! keep rendering the line - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2); } else { // only a child below this one: fill the rest with spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); } } else if (has_child_to_the_right) { // child to the right, but no child right below this one: render a full line - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width); } else { // empty spot: render spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } else if (render_y >= halfway_point) { if (root.HasNode(x, y + 1)) { // we have a node below this empty spot: render a vertical line - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); ss << config.VERTICAL; - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); } else { // empty spot: render spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } else { // empty spot: render spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } else { ss << config.VERTICAL; @@ -80563,7 +81257,7 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) render_text = extra_info[x][render_y - 1]; } } - render_text = AdjustTextForRendering(render_text, config.NODE_RENDER_WIDTH - 2); + render_text = AdjustTextForRendering(render_text, config.node_render_width - 2); ss << render_text; if (render_y == halfway_point && NodeHasMultipleChildren(root, x, y)) { @@ -80573,7 +81267,7 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) } } } - ss << std::endl; + ss << '\n'; } } @@ -80622,11 +81316,11 @@ void TreeRenderer::Render(const Pipeline &op, std::ostream &ss) { } void TreeRenderer::ToStream(RenderTree &root, std::ostream &ss) { - while (root.width * config.NODE_RENDER_WIDTH > config.MAXIMUM_RENDER_WIDTH) { - if (config.NODE_RENDER_WIDTH - 2 < config.MINIMUM_RENDER_WIDTH) { + while (root.width * config.node_render_width > config.maximum_render_width) { + if (config.node_render_width - 2 < config.minimum_render_width) { break; } - config.NODE_RENDER_WIDTH -= 2; + config.node_render_width -= 2; } for (idx_t y = 0; y < root.height; y++) { @@ -80660,7 +81354,7 @@ string TreeRenderer::RemovePadding(string l) { void TreeRenderer::SplitStringBuffer(const string &source, vector &result) { D_ASSERT(Utf8Proc::IsValid(source.c_str(), source.size())); - idx_t max_line_render_size = config.NODE_RENDER_WIDTH - 2; + idx_t max_line_render_size = config.node_render_width - 2; // utf8 in prompt, get render width idx_t cpos = 0; idx_t start_pos = 0; @@ -80715,7 +81409,7 @@ void TreeRenderer::SplitUpExtraInfo(const string &extra_info, vector &re } string TreeRenderer::ExtraInfoSeparator() { - return StringUtil::Repeat(string(config.HORIZONTAL) + " ", (config.NODE_RENDER_WIDTH - 7) / 2); + return StringUtil::Repeat(string(config.HORIZONTAL) + " ", (config.node_render_width - 7) / 2); } unique_ptr TreeRenderer::CreateRenderNode(string name, string extra_info) { @@ -80846,47 +81540,12 @@ unique_ptr TreeRenderer::CreateNode(const PipelineRenderNode &op return CreateNode(op.op); } -string TreeRenderer::ExtractExpressionsRecursive(ExpressionInfo &state) { - string result = "\n[INFOSEPARATOR]"; - result += "\n" + state.function_name; - result += "\n" + StringUtil::Format("%.9f", double(state.function_time)); - if (state.children.empty()) { - return result; - } - // render the children of this node - for (auto &child : state.children) { - result += ExtractExpressionsRecursive(*child); - } - return result; -} - unique_ptr TreeRenderer::CreateNode(const QueryProfiler::TreeNode &op) { auto result = TreeRenderer::CreateRenderNode(op.name, op.extra_info); result->extra_text += "\n[INFOSEPARATOR]"; result->extra_text += "\n" + to_string(op.info.elements); string timing = StringUtil::Format("%.2f", op.info.time); result->extra_text += "\n(" + timing + "s)"; - if (config.detailed) { - for (auto &info : op.info.executors_info) { - if (!info) { - continue; - } - for (auto &executor_info : info->roots) { - string sample_count = to_string(executor_info->sample_count); - result->extra_text += "\n[INFOSEPARATOR]"; - result->extra_text += "\nsample_count: " + sample_count; - string sample_tuples_count = to_string(executor_info->sample_tuples_count); - result->extra_text += "\n[INFOSEPARATOR]"; - result->extra_text += "\nsample_tuples_count: " + sample_tuples_count; - string total_count = to_string(executor_info->total_count); - result->extra_text += "\n[INFOSEPARATOR]"; - result->extra_text += "\ntotal_count: " + total_count; - for (auto &state : executor_info->root->children) { - result->extra_text += ExtractExpressionsRecursive(*state); - } - } - } - } return result; } @@ -80902,8 +81561,8 @@ unique_ptr TreeRenderer::CreateTree(const QueryProfiler::TreeNode &o return CreateRenderTree(op); } -unique_ptr TreeRenderer::CreateTree(const Pipeline &op) { - auto operators = op.GetOperators(); +unique_ptr TreeRenderer::CreateTree(const Pipeline &pipeline) { + auto operators = pipeline.GetOperators(); D_ASSERT(!operators.empty()); unique_ptr node; for (auto &op : operators) { @@ -81139,6 +81798,7 @@ void Bit::Finalize(string_t &str) { for (idx_t i = 0; i < idx_t(padding); i++) { Bit::SetBitInternal(str, i, 1); } + str.Finalize(); Bit::Verify(str); } @@ -81233,7 +81893,6 @@ void Bit::ToBit(string_t str, string_t &output_str) { *(output++) = byte; } Bit::Finalize(output_str); - Bit::Verify(output_str); } string Bit::ToBit(string_t str) { @@ -81375,6 +82034,7 @@ idx_t Bit::GetBitInternal(string_t bit_string, idx_t n) { void Bit::SetBit(string_t &bit_string, idx_t n, idx_t new_value) { SetBitInternal(bit_string, n + GetBitPadding(bit_string), new_value); + Bit::Finalize(bit_string); } void Bit::SetBitInternal(string_t &bit_string, idx_t n, idx_t new_value) { @@ -81420,7 +82080,6 @@ void Bit::LeftShift(const string_t &bit_string, const idx_t &shift, string_t &re } } Bit::Finalize(result); - Bit::Verify(result); } void Bit::BitwiseAnd(const string_t &rhs, const string_t &lhs, string_t &result) { @@ -81436,8 +82095,7 @@ void Bit::BitwiseAnd(const string_t &rhs, const string_t &lhs, string_t &result) for (idx_t i = 1; i < lhs.GetSize(); i++) { buf[i] = l_buf[i] & r_buf[i]; } - // and should preserve padding bits - Bit::Verify(result); + Bit::Finalize(result); } void Bit::BitwiseOr(const string_t &rhs, const string_t &lhs, string_t &result) { @@ -81453,8 +82111,7 @@ void Bit::BitwiseOr(const string_t &rhs, const string_t &lhs, string_t &result) for (idx_t i = 1; i < lhs.GetSize(); i++) { buf[i] = l_buf[i] | r_buf[i]; } - // or should preserve padding bits - Bit::Verify(result); + Bit::Finalize(result); } void Bit::BitwiseXor(const string_t &rhs, const string_t &lhs, string_t &result) { @@ -81491,6 +82148,8 @@ void Bit::Verify(const string_t &input) { for (idx_t i = 0; i < padding; i++) { D_ASSERT(Bit::GetBitInternal(input, i)); } + // verify bit respects the "normal" string_t rules (i.e. null padding for inlined strings, prefix matches) + input.VerifyCharacters(); #endif } @@ -84419,7 +85078,7 @@ void DataChunk::Flatten() { } } -vector DataChunk::GetTypes() { +vector DataChunk::GetTypes() const { vector types; for (idx_t i = 0; i < ColumnCount(); i++) { types.push_back(data[i].GetType()); @@ -84491,7 +85150,7 @@ void DataChunk::Slice(const SelectionVector &sel_vector, idx_t count_p) { } } -void DataChunk::Slice(DataChunk &other, const SelectionVector &sel, idx_t count_p, idx_t col_offset) { +void DataChunk::Slice(const DataChunk &other, const SelectionVector &sel, idx_t count_p, idx_t col_offset) { D_ASSERT(other.ColumnCount() <= col_offset + ColumnCount()); this->count = count_p; SelCache merge_cache; @@ -85252,22 +85911,22 @@ namespace duckdb { template <> hash_t Hash(uint64_t val) { - return murmurhash64(val); + return MurmurHash64(val); } template <> hash_t Hash(int64_t val) { - return murmurhash64((uint64_t)val); + return MurmurHash64((uint64_t)val); } template <> hash_t Hash(hugeint_t val) { - return murmurhash64(val.lower) ^ murmurhash64(val.upper); + return MurmurHash64(val.lower) ^ MurmurHash64(val.upper); } template <> hash_t Hash(uhugeint_t val) { - return murmurhash64(val.lower) ^ murmurhash64(val.upper); + return MurmurHash64(val.lower) ^ MurmurHash64(val.upper); } template @@ -85287,7 +85946,7 @@ hash_t Hash(float val) { static_assert(sizeof(float) == sizeof(uint32_t), ""); FloatingPointEqualityTransform::OP(val); uint32_t uval = Load(const_data_ptr_cast(&val)); - return murmurhash64(uval); + return MurmurHash64(uval); } template <> @@ -85295,7 +85954,7 @@ hash_t Hash(double val) { static_assert(sizeof(double) == sizeof(uint64_t), ""); FloatingPointEqualityTransform::OP(val); uint64_t uval = Load(const_data_ptr_cast(&val)); - return murmurhash64(uval); + return MurmurHash64(uval); } template <> @@ -86547,6 +87206,8 @@ inline uint64_t HashOtherSize(const_data_ptr_t &data, const idx_t &len) { CreateIntegerRecursive<1>(data, x); break; case 0: + default: + D_ASSERT((len & 7) == 0); break; } return TemplatedHash(x); @@ -88916,6 +89577,7 @@ void RowLayout::Initialize(vector types_p, bool align) { + namespace duckdb { using ValidityBytes = TupleDataLayout::ValidityBytes; @@ -88994,6 +89656,18 @@ void TupleDataAllocator::Build(TupleDataSegment &segment, TupleDataPinState &pin segment.data_size += chunk_part.total_heap_size; } + if (layout.HasDestructor()) { + const auto base_row_ptr = GetRowPointer(pin_state, chunk_part); + for (auto &aggr_idx : layout.GetAggregateDestructorIndices()) { + const auto aggr_offset = layout.GetOffsets()[layout.ColumnCount() + aggr_idx]; + auto &aggr_fun = layout.GetAggregates()[aggr_idx]; + for (idx_t i = 0; i < next; i++) { + duckdb::FastMemset(base_row_ptr + i * layout.GetRowWidth() + aggr_offset, '\0', + aggr_fun.payload_size); + } + } + } + offset += next; chunk_part_indices.emplace_back(chunks.size() - 1, chunk.parts.size() - 1); } @@ -90076,8 +90750,7 @@ idx_t *TupleDataChunkIterator::GetHeapSizes() { namespace duckdb { TupleDataLayout::TupleDataLayout() - : flag_width(0), data_width(0), aggr_width(0), row_width(0), all_constant(true), heap_size_offset(0), - has_destructor(false) { + : flag_width(0), data_width(0), aggr_width(0), row_width(0), all_constant(true), heap_size_offset(0) { } TupleDataLayout TupleDataLayout::Copy() const { @@ -90097,7 +90770,7 @@ TupleDataLayout TupleDataLayout::Copy() const { result.offsets = this->offsets; result.all_constant = this->all_constant; result.heap_size_offset = this->heap_size_offset; - result.has_destructor = this->has_destructor; + result.aggr_destructor_idxs = this->aggr_destructor_idxs; return result; } @@ -90180,11 +90853,10 @@ void TupleDataLayout::Initialize(vector types_p, Aggregates aggrega } #endif - has_destructor = false; - for (auto &aggr : GetAggregates()) { + for (idx_t aggr_idx = 0; aggr_idx < aggregates.size(); aggr_idx++) { + const auto &aggr = aggregates[aggr_idx]; if (aggr.function.destructor) { - has_destructor = true; - break; + aggr_destructor_idxs.push_back(aggr_idx); } } } @@ -93520,7 +94192,7 @@ string uhugeint_t::ToString() const { namespace duckdb { -bool UUID::FromString(string str, hugeint_t &result) { +bool UUID::FromString(const string &str, hugeint_t &result) { auto hex2char = [](char ch) -> unsigned char { if (ch >= '0' && ch <= '9') { return ch - '0'; @@ -94021,9 +94693,9 @@ typedef BoundCastInfo (*bind_cast_function_t)(BindCastInput &input, const Logica typedef int64_t (*implicit_cast_cost_t)(const LogicalType &from, const LogicalType &to); struct GetCastFunctionInput { - GetCastFunctionInput(optional_ptr context = nullptr) : context(context) { + explicit GetCastFunctionInput(optional_ptr context = nullptr) : context(context) { } - GetCastFunctionInput(ClientContext &context) : context(&context) { + explicit GetCastFunctionInput(ClientContext &context) : context(&context) { } optional_ptr context; @@ -94031,8 +94703,8 @@ struct GetCastFunctionInput { }; struct BindCastFunction { - BindCastFunction(bind_cast_function_t function, - unique_ptr info = nullptr); // NOLINT: allow implicit cast + BindCastFunction(bind_cast_function_t function, // NOLINT: allow implicit cast + unique_ptr info = nullptr); bind_cast_function_t function; unique_ptr info; @@ -94041,7 +94713,7 @@ struct BindCastFunction { class CastFunctionSet { public: CastFunctionSet(); - CastFunctionSet(DBConfig &config); + explicit CastFunctionSet(DBConfig &config); public: DUCKDB_API static CastFunctionSet &Get(ClientContext &context); @@ -96428,11 +97100,11 @@ Vector::Vector(Vector &other) : type(other.type) { Reference(other); } -Vector::Vector(Vector &other, const SelectionVector &sel, idx_t count) : type(other.type) { +Vector::Vector(const Vector &other, const SelectionVector &sel, idx_t count) : type(other.type) { Slice(other, sel, count); } -Vector::Vector(Vector &other, idx_t offset, idx_t end) : type(other.type) { +Vector::Vector(const Vector &other, idx_t offset, idx_t end) : type(other.type) { Slice(other, offset, end); } @@ -96924,8 +97596,8 @@ Value Vector::GetValueInternal(const Vector &v_p, idx_t index_p) { throw InternalException("FSST Vector with non-string datatype found!"); } auto str_compressed = reinterpret_cast(data)[index]; - Value result = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(const_cast(*vector)), - str_compressed.GetData(), str_compressed.GetSize()); + Value result = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(*vector), str_compressed.GetData(), + str_compressed.GetSize()); return result; } @@ -97126,8 +97798,8 @@ string Vector::ToString(idx_t count) const { case VectorType::FSST_VECTOR: { for (idx_t i = 0; i < count; i++) { string_t compressed_string = reinterpret_cast(data)[i]; - Value val = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(const_cast(*this)), - compressed_string.GetData(), compressed_string.GetSize()); + Value val = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(*this), compressed_string.GetData(), + compressed_string.GetSize()); retval += GetValue(i).ToString() + (i == count - 1 ? "" : ", "); } } break; @@ -98477,7 +99149,8 @@ const vector> &StructVector::GetEntries(const Vector &vector) //===--------------------------------------------------------------------===// // ListVector //===--------------------------------------------------------------------===// -const Vector &ListVector::GetEntry(const Vector &vector) { +template +T &ListVector::GetEntryInternal(T &vector) { D_ASSERT(vector.GetType().id() == LogicalTypeId::LIST || vector.GetType().id() == LogicalTypeId::MAP); if (vector.GetVectorType() == VectorType::DICTIONARY_VECTOR) { auto &child = DictionaryVector::Child(vector); @@ -98487,12 +99160,15 @@ const Vector &ListVector::GetEntry(const Vector &vector) { vector.GetVectorType() == VectorType::CONSTANT_VECTOR); D_ASSERT(vector.auxiliary); D_ASSERT(vector.auxiliary->GetBufferType() == VectorBufferType::LIST_BUFFER); - return vector.auxiliary->Cast().GetChild(); + return vector.auxiliary->template Cast().GetChild(); +} + +const Vector &ListVector::GetEntry(const Vector &vector) { + return GetEntryInternal(vector); } Vector &ListVector::GetEntry(Vector &vector) { - const Vector &cvector = vector; - return const_cast(ListVector::GetEntry(cvector)); + return GetEntryInternal(vector); } void ListVector::Reserve(Vector &vector, idx_t required_capacity) { @@ -98846,7 +99522,8 @@ UnionInvalidReason UnionVector::CheckUnionValidity(Vector &vector_p, idx_t count //===--------------------------------------------------------------------===// // ArrayVector //===--------------------------------------------------------------------===// -const Vector &ArrayVector::GetEntry(const Vector &vector) { +template +T &ArrayVector::GetEntryInternal(T &vector) { D_ASSERT(vector.GetType().id() == LogicalTypeId::ARRAY); if (vector.GetVectorType() == VectorType::DICTIONARY_VECTOR) { auto &child = DictionaryVector::Child(vector); @@ -98856,12 +99533,15 @@ const Vector &ArrayVector::GetEntry(const Vector &vector) { vector.GetVectorType() == VectorType::CONSTANT_VECTOR); D_ASSERT(vector.auxiliary); D_ASSERT(vector.auxiliary->GetBufferType() == VectorBufferType::ARRAY_BUFFER); - return vector.auxiliary->Cast().GetChild(); + return vector.auxiliary->template Cast().GetChild(); +} + +const Vector &ArrayVector::GetEntry(const Vector &vector) { + return GetEntryInternal(vector); } Vector &ArrayVector::GetEntry(Vector &vector) { - const Vector &cvector = vector; - return const_cast(ArrayVector::GetEntry(cvector)); + return GetEntryInternal(vector); } idx_t ArrayVector::GetTotalSize(const Vector &vector) { @@ -100065,6 +100745,8 @@ static bool CombineEqualTypes(const LogicalType &left, const LogicalType &right, // struct: perform recursively on each child auto &left_child_types = StructType::GetChildTypes(left); auto &right_child_types = StructType::GetChildTypes(right); + bool left_unnamed = StructType::IsUnnamed(left); + auto any_unnamed = left_unnamed || StructType::IsUnnamed(right); if (left_child_types.size() != right_child_types.size()) { // child types are not of equal size, we can't cast // return false @@ -100073,10 +100755,15 @@ static bool CombineEqualTypes(const LogicalType &left, const LogicalType &right, child_list_t child_types; for (idx_t i = 0; i < left_child_types.size(); i++) { LogicalType child_type; + // Child names must be in the same order OR either one of the structs must be unnamed + if (!any_unnamed && !StringUtil::CIEquals(left_child_types[i].first, right_child_types[i].first)) { + return false; + } if (!OP::Operation(left_child_types[i].second, right_child_types[i].second, child_type)) { return false; } - child_types.emplace_back(left_child_types[i].first, std::move(child_type)); + auto &child_name = left_unnamed ? right_child_types[i].first : left_child_types[i].first; + child_types.emplace_back(child_name, std::move(child_type)); } result = LogicalType::STRUCT(child_types); return true; @@ -101343,7 +102030,7 @@ bool GreaterThanEquals::Operation(const double &left, const double &right) { struct ComparisonSelector { template static idx_t Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { + SelectionVector *false_sel, ValidityMask &null_mask) { throw NotImplementedException("Unknown comparison operation!"); } }; @@ -101351,44 +102038,44 @@ struct ComparisonSelector { template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::Equals(left, right, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::Equals(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::NotEquals(left, right, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::NotEquals(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThan(left, right, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThan(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> -inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, - const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThanEquals(left, right, sel, count, true_sel, false_sel); +inline idx_t +ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, + idx_t count, SelectionVector *true_sel, + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThanEquals(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThan(right, left, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThan(right, left, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThanEquals(right, left, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThanEquals(right, left, sel, count, true_sel, false_sel, &null_mask); } static void ComparesNotNull(UnifiedVectorFormat &ldata, UnifiedVectorFormat &rdata, ValidityMask &vresult, @@ -101417,8 +102104,9 @@ static void NestedComparisonExecutor(Vector &left, Vector &right, Vector &result if (left_constant && right_constant) { // both sides are constant, and neither is NULL so just compare one element. result.SetVectorType(VectorType::CONSTANT_VECTOR); + auto &result_validity = ConstantVector::Validity(result); SelectionVector true_sel(1); - auto match_count = ComparisonSelector::Select(left, right, nullptr, 1, &true_sel, nullptr); + auto match_count = ComparisonSelector::Select(left, right, nullptr, 1, &true_sel, nullptr, result_validity); auto result_data = ConstantVector::GetData(result); result_data[0] = match_count > 0; return; @@ -101436,7 +102124,8 @@ static void NestedComparisonExecutor(Vector &left, Vector &right, Vector &result } SelectionVector true_sel(count); SelectionVector false_sel(count); - idx_t match_count = ComparisonSelector::Select(left, right, nullptr, count, &true_sel, &false_sel); + idx_t match_count = + ComparisonSelector::Select(left, right, nullptr, count, &true_sel, &false_sel, result_validity); for (idx_t i = 0; i < match_count; ++i) { const auto idx = true_sel.get_index(i); @@ -101610,7 +102299,7 @@ void TemplatedGenerateSequence(Vector &result, idx_t count, const SelectionVecto auto result_data = FlatVector::GetData(result); auto value = (T)start; for (idx_t i = 0; i < count; i++) { - auto idx = sel.get_index(i); + auto idx = UnsafeNumericCast(sel.get_index(i)); result_data[idx] = UnsafeNumericCast(value + increment * idx); } } @@ -101901,12 +102590,37 @@ static idx_t DistinctSelectConstant(Vector &left, Vector &right, const Selection } } +static void UpdateNullMask(Vector &vec, const SelectionVector &sel, idx_t count, ValidityMask &null_mask) { + UnifiedVectorFormat vdata; + vec.ToUnifiedFormat(count, vdata); + + if (vdata.validity.AllValid()) { + return; + } + + for (idx_t i = 0; i < count; ++i) { + const auto ridx = sel.get_index(i); + const auto vidx = vdata.sel->get_index(i); + if (!vdata.validity.RowIsValid(vidx)) { + null_mask.SetInvalid(ridx); + } + } +} + template static idx_t DistinctSelect(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { + SelectionVector *true_sel, SelectionVector *false_sel, + optional_ptr null_mask) { if (!sel) { sel = FlatVector::IncrementalSelectionVector(); } + + // TODO: Push this down? + if (null_mask) { + UpdateNullMask(left, *sel, count, *null_mask); + UpdateNullMask(right, *sel, count, *null_mask); + } + if (left.GetVectorType() == VectorType::CONSTANT_VECTOR && right.GetVectorType() == VectorType::CONSTANT_VECTOR) { return DistinctSelectConstant(left, right, sel, count, true_sel, false_sel); } else if (left.GetVectorType() == VectorType::CONSTANT_VECTOR && @@ -101926,7 +102640,7 @@ static idx_t DistinctSelect(Vector &left, Vector &right, const SelectionVector * template static idx_t DistinctSelectNotNull(Vector &left, Vector &right, const idx_t count, idx_t &true_count, const SelectionVector &sel, SelectionVector &maybe_vec, OptionalSelection &true_opt, - OptionalSelection &false_opt) { + OptionalSelection &false_opt, optional_ptr null_mask) { UnifiedVectorFormat lvdata, rvdata; left.ToUnifiedFormat(count, lvdata); right.ToUnifiedFormat(count, rvdata); @@ -101956,6 +102670,9 @@ static idx_t DistinctSelectNotNull(Vector &left, Vector &right, const idx_t coun const auto rnull = !rmask.RowIsValid(ridx); if (lnull || rnull) { // If either is NULL then we can major distinguish them + if (null_mask) { + null_mask->SetInvalid(result_idx); + } if (!OP::Operation(false, false, lnull, rnull)) { false_opt.Append(false_count, result_idx); } else { @@ -101984,23 +102701,26 @@ struct PositionComparator { // Default to the same as the final row template static idx_t Definite(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector &false_sel) { - return Final(left, right, sel, count, true_sel, &false_sel); + optional_ptr true_sel, SelectionVector &false_sel, + optional_ptr null_mask) { + return Final(left, right, sel, count, true_sel, &false_sel, null_mask); } // Select the possible rows that need further testing. // Usually this means Is Not Distinct, as those are the semantics used by Postges template static idx_t Possible(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector &true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, &true_sel, false_sel); + SelectionVector &true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedEquals(left, right, &sel, count, &true_sel, false_sel, null_mask); } // Select the matching rows for the final position. // This needs to be specialised. template - static idx_t Final(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { + static idx_t Final(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { return 0; } @@ -102016,78 +102736,88 @@ struct PositionComparator { // NotDistinctFrom must always check every column template <> idx_t PositionComparator::Definite(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector &false_sel) { + idx_t count, optional_ptr true_sel, + SelectionVector &false_sel, + optional_ptr null_mask) { return 0; } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedEquals(left, right, &sel, count, true_sel, false_sel, null_mask); } // DistinctFrom must check everything that matched template <> idx_t PositionComparator::Possible(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector &true_sel, - SelectionVector *false_sel) { + optional_ptr false_sel, + optional_ptr null_mask) { return count; } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedNotEquals(left, right, &sel, count, true_sel, false_sel, null_mask); } // Non-strict inequalities must use strict comparisons for Definite template <> idx_t PositionComparator::Definite(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, - SelectionVector &false_sel) { - return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, &false_sel); + optional_ptr true_sel, + SelectionVector &false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, &false_sel, null_mask); } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThanEquals(right, left, &sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThanEquals(right, left, &sel, count, true_sel, false_sel, null_mask); } template <> idx_t PositionComparator::Definite(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, - SelectionVector &false_sel) { - return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, &false_sel); + optional_ptr true_sel, + SelectionVector &false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, &false_sel, null_mask); } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThanEquals(left, right, &sel, count, true_sel, false_sel); + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThanEquals(left, right, &sel, count, true_sel, false_sel, null_mask); } // Strict inequalities just use strict for both Definite and Final template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, false_sel, null_mask); } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, false_sel, null_mask); } using StructEntries = vector>; @@ -102103,6 +102833,24 @@ static void ExtractNestedSelection(const SelectionVector &slice_sel, const idx_t opt.Advance(count); } +static void ExtractNestedMask(const SelectionVector &slice_sel, const idx_t count, const SelectionVector &sel, + ValidityMask *child_mask, optional_ptr null_mask) { + + if (!child_mask) { + return; + } + + for (idx_t i = 0; i < count; ++i) { + const auto slice_idx = slice_sel.get_index(i); + const auto result_idx = sel.get_index(slice_idx); + if (child_mask && !child_mask->RowIsValid(slice_idx)) { + null_mask->SetInvalid(result_idx); + } + } + + child_mask->Reset(null_mask->TargetCount()); +} + static void DensifyNestedSelection(const SelectionVector &dense_sel, const idx_t count, SelectionVector &slice_sel) { for (idx_t i = 0; i < count; ++i) { slice_sel.set_index(i, dense_sel.get_index(i)); @@ -102111,7 +102859,8 @@ static void DensifyNestedSelection(const SelectionVector &dense_sel, const idx_t template static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, const SelectionVector &sel, - OptionalSelection &true_opt, OptionalSelection &false_opt) { + OptionalSelection &true_opt, OptionalSelection &false_opt, + optional_ptr null_mask) { if (count == 0) { return 0; } @@ -102133,6 +102882,13 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons SelectionVector true_sel(count); SelectionVector false_sel(count); + ValidityMask child_validity; + ValidityMask *child_mask = nullptr; + if (null_mask) { + child_mask = &child_validity; + child_mask->Reset(null_mask->TargetCount()); + } + idx_t match_count = 0; for (idx_t col_no = 0; col_no < lchildren.size(); ++col_no) { // Slice the children to maintain density @@ -102145,7 +102901,10 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons rchild.Slice(slice_sel, count); // Find everything that definitely matches - auto true_count = PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel); + auto true_count = + PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel, child_mask); + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); if (true_count > 0) { auto false_count = count - true_count; @@ -102161,9 +102920,13 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons if (col_no != lchildren.size() - 1) { // Find what might match on the next position - true_count = PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel); + true_count = + PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel, child_mask); auto false_count = count - true_count; + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + // Extract the definite failures into the false result ExtractNestedSelection(true_count ? false_sel : slice_sel, false_count, sel, false_opt); @@ -102174,9 +102937,13 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons count = true_count; } else { - true_count = PositionComparator::Final(lchild, rchild, slice_sel, count, &true_sel, &false_sel); + true_count = + PositionComparator::Final(lchild, rchild, slice_sel, count, &true_sel, &false_sel, child_mask); auto false_count = count - true_count; + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + // Extract the definite matches into the true result ExtractNestedSelection(false_count ? true_sel : slice_sel, true_count, sel, true_opt); @@ -102203,7 +102970,8 @@ static void PositionListCursor(SelectionVector &cursor, UnifiedVectorFormat &vda template static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const SelectionVector &sel, - OptionalSelection &true_opt, OptionalSelection &false_opt) { + OptionalSelection &true_opt, OptionalSelection &false_opt, + optional_ptr null_mask) { if (count == 0) { return count; } @@ -102252,6 +103020,13 @@ static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const SelectionVector true_sel(count); SelectionVector false_sel(count); + ValidityMask child_validity; + ValidityMask *child_mask = nullptr; + if (null_mask) { + child_mask = &child_validity; + child_mask->Reset(null_mask->TargetCount()); + } + idx_t match_count = 0; for (idx_t pos = 0; count > 0; ++pos) { // Set up the cursors for the current position @@ -102292,9 +103067,14 @@ static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const } // Find everything that definitely matches - true_count = PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel); + true_count = + PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel, child_mask); + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); if (true_count) { false_count = count - true_count; + + // Extract the definite matches into the true result ExtractNestedSelection(false_count ? true_sel : slice_sel, true_count, sel, true_opt); match_count += true_count; @@ -102306,8 +103086,14 @@ static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const } // Find what might match on the next position - true_count = PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel); + true_count = + PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel, child_mask); false_count = count - true_count; + + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + + // Extract the definite failures into the false result ExtractNestedSelection(true_count ? false_sel : slice_sel, false_count, sel, false_opt); if (false_count) { @@ -102331,7 +103117,8 @@ static void PositionArrayCursor(SelectionVector &cursor, UnifiedVectorFormat &vd template static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const SelectionVector &sel, - OptionalSelection &true_opt, OptionalSelection &false_opt) { + OptionalSelection &true_opt, OptionalSelection &false_opt, + optional_ptr null_mask) { if (count == 0) { return count; } @@ -102369,6 +103156,13 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const SelectionVector true_sel(count); SelectionVector false_sel(count); + ValidityMask child_validity; + ValidityMask *child_mask = nullptr; + if (null_mask) { + child_mask = &child_validity; + child_mask->Reset(null_mask->TargetCount()); + } + idx_t match_count = 0; for (idx_t pos = 0; count > 0; ++pos) { // Set up the cursors for the current position @@ -102405,9 +103199,14 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const } // Find everything that definitely matches - true_count = PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel); + true_count = + PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel, child_mask); + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); if (true_count) { false_count = count - true_count; + + // Extract the definite matches into the true result ExtractNestedSelection(false_count ? true_sel : slice_sel, true_count, sel, true_opt); match_count += true_count; @@ -102419,8 +103218,14 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const } // Find what might match on the next position - true_count = PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel); + true_count = + PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel, null_mask); false_count = count - true_count; + + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + + // Extract the definite failures into the false result ExtractNestedSelection(true_count ? false_sel : slice_sel, false_count, sel, false_opt); if (false_count) { @@ -102432,9 +103237,10 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const return match_count; } -template -static idx_t DistinctSelectNested(Vector &left, Vector &right, const SelectionVector *sel, const idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { +template +static idx_t DistinctSelectNested(Vector &left, Vector &right, optional_ptr sel, + const idx_t count, optional_ptr true_sel, + optional_ptr false_sel, optional_ptr null_mask) { // The Select operations all use a dense pair of input vectors to partition // a selection vector in a single pass. But to implement progressive comparisons, // we have to make multiple passes, so we need to keep track of the original input positions @@ -102458,18 +103264,21 @@ static idx_t DistinctSelectNested(Vector &left, Vector &right, const SelectionVe Vector r_not_null(right); idx_t match_count = 0; - auto unknown = - DistinctSelectNotNull(l_not_null, r_not_null, count, match_count, *sel, maybe_vec, true_opt, false_opt); + auto unknown = DistinctSelectNotNull(l_not_null, r_not_null, count, match_count, *sel, maybe_vec, true_opt, + false_opt, null_mask); switch (left.GetType().InternalType()) { case PhysicalType::LIST: - match_count += DistinctSelectList(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt); + match_count += + DistinctSelectList(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt, null_mask); break; case PhysicalType::STRUCT: - match_count += DistinctSelectStruct(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt); + match_count += + DistinctSelectStruct(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt, null_mask); break; case PhysicalType::ARRAY: - match_count += DistinctSelectArray(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt); + match_count += + DistinctSelectArray(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt, null_mask); break; default: throw NotImplementedException("Unimplemented type for DISTINCT"); @@ -102552,44 +103361,60 @@ static void ExecuteDistinct(Vector &left, Vector &right, Vector &result, idx_t c } } -template -static idx_t TemplatedDistinctSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - // the inplace loops take the result as the last parameter +template +static idx_t TemplatedDistinctSelectOperation(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + switch (left.GetType().InternalType()) { case PhysicalType::BOOL: case PhysicalType::INT8: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT16: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT32: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT64: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT8: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT16: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT32: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT64: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT128: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT128: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), + false_sel.get(), null_mask); case PhysicalType::FLOAT: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::DOUBLE: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INTERVAL: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), + false_sel.get(), null_mask); case PhysicalType::VARCHAR: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::STRUCT: case PhysicalType::LIST: case PhysicalType::ARRAY: - return DistinctSelectNested(left, right, sel, count, true_sel, false_sel); + return DistinctSelectNested(left, right, sel, count, true_sel, false_sel, null_mask); default: throw InternalException("Invalid type for distinct selection"); } @@ -102605,7 +103430,7 @@ static void NestedDistinctExecute(Vector &left, Vector &right, Vector &result, i result.SetVectorType(VectorType::CONSTANT_VECTOR); auto result_data = ConstantVector::GetData(result); SelectionVector true_sel(1); - auto match_count = TemplatedDistinctSelectOperation(left, right, nullptr, 1, &true_sel, nullptr); + auto match_count = TemplatedDistinctSelectOperation(left, right, nullptr, 1, &true_sel, nullptr, nullptr); result_data[0] = match_count > 0; return; } @@ -102614,7 +103439,8 @@ static void NestedDistinctExecute(Vector &left, Vector &right, Vector &result, i SelectionVector false_sel(count); // DISTINCT is either true or false - idx_t match_count = TemplatedDistinctSelectOperation(left, right, nullptr, count, &true_sel, &false_sel); + idx_t match_count = + TemplatedDistinctSelectOperation(left, right, nullptr, count, &true_sel, &false_sel, nullptr); result.SetVectorType(VectorType::FLAT_VECTOR); auto result_data = FlatVector::GetData(result); @@ -102640,65 +103466,85 @@ void VectorOperations::NotDistinctFrom(Vector &left, Vector &right, Vector &resu } // true := A != B with nulls being equal -idx_t VectorOperations::DistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctFrom(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel, + nullptr); } // true := A == B with nulls being equal -idx_t VectorOperations::NotDistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel); +idx_t VectorOperations::NotDistinctFrom(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel) { + return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel, + nullptr); } // true := A > B with nulls being maximal -idx_t VectorOperations::DistinctGreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctGreaterThan(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel, + null_mask); } // true := A > B with nulls being minimal -idx_t VectorOperations::DistinctGreaterThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation( - left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctGreaterThanNullsFirst(Vector &left, Vector &right, + optional_ptr sel, idx_t count, + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, + false_sel, null_mask); } // true := A >= B with nulls being maximal -idx_t VectorOperations::DistinctGreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - - TemplatedDistinctSelectOperation(right, left, sel, count, false_sel, true_sel); +idx_t VectorOperations::DistinctGreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return count - TemplatedDistinctSelectOperation(right, left, sel, count, false_sel, + true_sel, null_mask); } // true := A < B with nulls being maximal -idx_t VectorOperations::DistinctLessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctLessThan(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(right, left, sel, count, true_sel, false_sel, + null_mask); } // true := A < B with nulls being minimal -idx_t VectorOperations::DistinctLessThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation( - right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctLessThanNullsFirst(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(right, left, sel, count, true_sel, + false_sel, nullptr); } // true := A <= B with nulls being maximal -idx_t VectorOperations::DistinctLessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel); +idx_t VectorOperations::DistinctLessThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, + true_sel, null_mask); } // true := A != B with nulls being equal, inputs selected -idx_t VectorOperations::NestedNotEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(left, right, &sel, count, true_sel, false_sel); +idx_t VectorOperations::NestedNotEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel, + null_mask); } // true := A == B with nulls being equal, inputs selected -idx_t VectorOperations::NestedEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - - TemplatedDistinctSelectOperation(left, right, &sel, count, false_sel, true_sel); +idx_t VectorOperations::NestedEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel, + null_mask); } } // namespace duckdb @@ -103202,7 +104048,6 @@ void VectorOperations::Copy(const Vector &source, Vector &target, idx_t source_c - namespace duckdb { struct HashOp { @@ -103284,6 +104129,8 @@ static inline void StructLoopHash(Vector &input, Vector &hashes, const Selection template static inline void ListLoopHash(Vector &input, Vector &hashes, const SelectionVector *rsel, idx_t count) { + // FIXME: if we want to be more efficient we shouldn't flatten, but the logic here currently requires it + hashes.Flatten(count); auto hdata = FlatVector::GetData(hashes); UnifiedVectorFormat idata; @@ -103373,40 +104220,68 @@ static inline void ListLoopHash(Vector &input, Vector &hashes, const SelectionVe template static inline void ArrayLoopHash(Vector &input, Vector &hashes, const SelectionVector *rsel, idx_t count) { + hashes.Flatten(count); auto hdata = FlatVector::GetData(hashes); - if (input.GetVectorType() != VectorType::CONSTANT_VECTOR || input.GetVectorType() != VectorType::FLAT_VECTOR) { - input.Flatten(count); - } - UnifiedVectorFormat idata; input.ToUnifiedFormat(count, idata); // Hash the children into a temporary auto &child = ArrayVector::GetEntry(input); auto array_size = ArrayType::GetSize(input.GetType()); + + auto is_flat = input.GetVectorType() == VectorType::FLAT_VECTOR; auto is_constant = input.GetVectorType() == VectorType::CONSTANT_VECTOR; - auto child_count = array_size * (is_constant ? 1 : count); - Vector child_hashes(LogicalType::HASH, child_count); - if (child_count > 0) { - child_hashes.Flatten(child_count); + if (!HAS_RSEL && (is_flat || is_constant)) { + // Fast path for contiguous vectors with no selection vector + auto child_count = array_size * (is_constant ? 1 : count); + + Vector child_hashes(LogicalType::HASH, child_count); VectorOperations::Hash(child, child_hashes, child_count); - } - auto chdata = FlatVector::GetData(child_hashes); + child_hashes.Flatten(child_count); + auto chdata = FlatVector::GetData(child_hashes); - for (idx_t i = 0; i < count; ++i) { - const auto ridx = HAS_RSEL ? rsel->get_index(i) : i; - const auto lidx = idata.sel->get_index(ridx); - const auto offset = lidx * array_size; - if (idata.validity.RowIsValid(lidx)) { - for (idx_t j = 0; j < array_size; j++) { - hdata[ridx] = CombineHashScalar(hdata[ridx], chdata[offset + j]); + for (idx_t i = 0; i < count; i++) { + auto lidx = idata.sel->get_index(i); + if (idata.validity.RowIsValid(lidx)) { + for (idx_t j = 0; j < array_size; j++) { + auto offset = lidx * array_size + j; + hdata[i] = CombineHashScalar(hdata[i], chdata[offset]); + } + } else if (FIRST_HASH) { + hdata[i] = HashOp::NULL_HASH; + } + } + } else { + // Hash the arrays one-by-one + SelectionVector array_sel(array_size); + Vector array_hashes(LogicalType::HASH, array_size); + for (idx_t i = 0; i < count; i++) { + const auto ridx = HAS_RSEL ? rsel->get_index(i) : i; + const auto lidx = idata.sel->get_index(ridx); + + if (idata.validity.RowIsValid(lidx)) { + // Create a selection vector for the array + for (idx_t j = 0; j < array_size; j++) { + array_sel.set_index(j, lidx * array_size + j); + } + + // Hash the array slice + Vector dict_vec(child, array_sel, array_size); + VectorOperations::Hash(dict_vec, array_hashes, array_size); + auto ahdata = FlatVector::GetData(array_hashes); + + // Combine the hashes of the array + for (idx_t j = 0; j < array_size; j++) { + hdata[ridx] = CombineHashScalar(hdata[ridx], ahdata[j]); + // Clear the hash for the next iteration + ahdata[j] = 0; + } + } else if (FIRST_HASH) { + hdata[ridx] = HashOp::NULL_HASH; } - } else if (FIRST_HASH) { - hdata[ridx] = HashOp::NULL_HASH; } - // Empty or NULL non-first elements have no effect. } } @@ -103772,9 +104647,8 @@ class VirtualFileSystem : public FileSystem { public: VirtualFileSystem(); - unique_ptr OpenFile(const string &path, uint8_t flags, FileLockType lock = FileLockType::NO_LOCK, - FileCompressionType compression = FileCompressionType::UNCOMPRESSED, - FileOpener *opener = nullptr) override; + unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr) override; void Read(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) override; void Write(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) override; @@ -103792,22 +104666,22 @@ class VirtualFileSystem : public FileSystem { void FileSync(FileHandle &handle) override; // need to look up correct fs for this - bool DirectoryExists(const string &directory) override; - void CreateDirectory(const string &directory) override; + bool DirectoryExists(const string &directory, optional_ptr opener) override; + void CreateDirectory(const string &directory, optional_ptr opener) override; - void RemoveDirectory(const string &directory) override; + void RemoveDirectory(const string &directory, optional_ptr opener) override; bool ListFiles(const string &directory, const std::function &callback, FileOpener *opener = nullptr) override; - void MoveFile(const string &source, const string &target) override; + void MoveFile(const string &source, const string &target, optional_ptr opener) override; - bool FileExists(const string &filename) override; + bool FileExists(const string &filename, optional_ptr opener) override; - bool IsPipe(const string &filename) override; - virtual void RemoveFile(const string &filename) override; + bool IsPipe(const string &filename, optional_ptr opener) override; + void RemoveFile(const string &filename, optional_ptr opener) override; - virtual vector Glob(const string &path, FileOpener *opener = nullptr) override; + vector Glob(const string &path, FileOpener *opener = nullptr) override; void RegisterSubSystem(unique_ptr fs) override; @@ -103846,8 +104720,9 @@ VirtualFileSystem::VirtualFileSystem() : default_fs(FileSystem::CreateLocal()) { VirtualFileSystem::RegisterSubSystem(FileCompressionType::GZIP, make_uniq()); } -unique_ptr VirtualFileSystem::OpenFile(const string &path, uint8_t flags, FileLockType lock, - FileCompressionType compression, FileOpener *opener) { +unique_ptr VirtualFileSystem::OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener) { + auto compression = flags.Compression(); if (compression == FileCompressionType::AUTO_DETECT) { // auto detect compression settings based on file name auto lower_path = StringUtil::Lower(path); @@ -103863,8 +104738,12 @@ unique_ptr VirtualFileSystem::OpenFile(const string &path, uint8_t f compression = FileCompressionType::UNCOMPRESSED; } } - // open the base file handle - auto file_handle = FindFileSystem(path).OpenFile(path, flags, lock, FileCompressionType::UNCOMPRESSED, opener); + // open the base file handle in UNCOMPRESSED mode + flags.SetCompression(FileCompressionType::UNCOMPRESSED); + auto file_handle = FindFileSystem(path).OpenFile(path, flags, opener); + if (!file_handle) { + return nullptr; + } if (file_handle->GetType() == FileType::FILE_TYPE_FIFO) { file_handle = PipeFileSystem::OpenPipe(std::move(file_handle)); } else if (compression != FileCompressionType::UNCOMPRESSED) { @@ -103873,7 +104752,7 @@ unique_ptr VirtualFileSystem::OpenFile(const string &path, uint8_t f throw NotImplementedException( "Attempting to open a compressed file, but the compression type is not supported"); } - file_handle = entry->second->OpenCompressedFile(std::move(file_handle), flags & FileFlags::FILE_FLAGS_WRITE); + file_handle = entry->second->OpenCompressedFile(std::move(file_handle), flags.OpenForWriting()); } return file_handle; } @@ -103913,15 +104792,15 @@ void VirtualFileSystem::FileSync(FileHandle &handle) { } // need to look up correct fs for this -bool VirtualFileSystem::DirectoryExists(const string &directory) { - return FindFileSystem(directory).DirectoryExists(directory); +bool VirtualFileSystem::DirectoryExists(const string &directory, optional_ptr opener) { + return FindFileSystem(directory).DirectoryExists(directory, opener); } -void VirtualFileSystem::CreateDirectory(const string &directory) { - FindFileSystem(directory).CreateDirectory(directory); +void VirtualFileSystem::CreateDirectory(const string &directory, optional_ptr opener) { + FindFileSystem(directory).CreateDirectory(directory, opener); } -void VirtualFileSystem::RemoveDirectory(const string &directory) { - FindFileSystem(directory).RemoveDirectory(directory); +void VirtualFileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { + FindFileSystem(directory).RemoveDirectory(directory, opener); } bool VirtualFileSystem::ListFiles(const string &directory, const std::function &callback, @@ -103929,19 +104808,20 @@ bool VirtualFileSystem::ListFiles(const string &directory, const std::function opener) { + FindFileSystem(source).MoveFile(source, target, opener); } -bool VirtualFileSystem::FileExists(const string &filename) { - return FindFileSystem(filename).FileExists(filename); +bool VirtualFileSystem::FileExists(const string &filename, optional_ptr opener) { + return FindFileSystem(filename).FileExists(filename, opener); } -bool VirtualFileSystem::IsPipe(const string &filename) { - return FindFileSystem(filename).IsPipe(filename); +bool VirtualFileSystem::IsPipe(const string &filename, optional_ptr opener) { + return FindFileSystem(filename).IsPipe(filename, opener); } -void VirtualFileSystem::RemoveFile(const string &filename) { - FindFileSystem(filename).RemoveFile(filename); + +void VirtualFileSystem::RemoveFile(const string &filename, optional_ptr opener) { + FindFileSystem(filename).RemoveFile(filename, opener); } string VirtualFileSystem::PathSeparator(const string &path) { @@ -104011,11 +104891,18 @@ FileSystem &VirtualFileSystem::FindFileSystem(const string &path) { } FileSystem &VirtualFileSystem::FindFileSystemInternal(const string &path) { + FileSystem *fs = nullptr; for (auto &sub_system : sub_systems) { if (sub_system->CanHandleFile(path)) { - return *sub_system; + if (sub_system->IsManuallySet()) { + return *sub_system; + } + fs = sub_system.get(); } } + if (fs) { + return *fs; + } return *default_fs; } @@ -104267,6 +105154,18 @@ struct RegularAdd { } }; +struct HugeintAdd { + template + static void AddNumber(STATE &state, T input) { + state.value = Hugeint::Add(state.value, input); + } + + template + static void AddConstant(STATE &state, T input, idx_t count) { + AddNumber(state, Hugeint::Multiply(input, count)); + } +}; + struct KahanAdd { template static void AddNumber(STATE &state, T input) { @@ -104279,7 +105178,7 @@ struct KahanAdd { } }; -struct HugeintAdd { +struct AddToHugeint { static void AddValue(hugeint_t &result, uint64_t value, int positive) { // integer summation taken from Tim Gubner et al. - Efficient Query Processing // with Optimistically Compressed Hash Tables & Strings in the USSR @@ -104457,7 +105356,7 @@ struct IntegerAverageOperation : public BaseSumOperation { +struct IntegerAverageOperationHugeint : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (state.count == 0) { @@ -104469,7 +105368,7 @@ struct IntegerAverageOperationHugeint : public BaseSumOperation { +struct HugeintAverageOperation : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (state.count == 0) { @@ -105197,7 +106096,7 @@ struct SumFun { struct SumNoOverflowFun { static constexpr const char *Name = "sum_no_overflow"; static constexpr const char *Parameters = "arg"; - static constexpr const char *Description = "Calculates the sum value for all tuples in arg without overflow checks."; + static constexpr const char *Description = "Internal only. Calculates the sum value for all tuples in arg without overflow checks."; static constexpr const char *Example = "sum_no_overflow(A)"; static AggregateFunctionSet GetFunctions(); @@ -106772,26 +107671,26 @@ class FunctionBinder { public: //! Bind a scalar function from the set of functions and input arguments. Returns the index of the chosen function, - //! returns DConstants::INVALID_INDEX and sets error if none could be found - DUCKDB_API idx_t BindFunction(const string &name, ScalarFunctionSet &functions, - const vector &arguments, ErrorData &error); - DUCKDB_API idx_t BindFunction(const string &name, ScalarFunctionSet &functions, - vector> &arguments, ErrorData &error); + //! returns optional_idx() and sets error if none could be found + DUCKDB_API optional_idx BindFunction(const string &name, ScalarFunctionSet &functions, + const vector &arguments, ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, ScalarFunctionSet &functions, + vector> &arguments, ErrorData &error); //! Bind an aggregate function from the set of functions and input arguments. Returns the index of the chosen - //! function, returns DConstants::INVALID_INDEX and sets error if none could be found - DUCKDB_API idx_t BindFunction(const string &name, AggregateFunctionSet &functions, - const vector &arguments, ErrorData &error); - DUCKDB_API idx_t BindFunction(const string &name, AggregateFunctionSet &functions, - vector> &arguments, ErrorData &error); + //! function, returns optional_idx() and sets error if none could be found + DUCKDB_API optional_idx BindFunction(const string &name, AggregateFunctionSet &functions, + const vector &arguments, ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, AggregateFunctionSet &functions, + vector> &arguments, ErrorData &error); //! Bind a table function from the set of functions and input arguments. Returns the index of the chosen - //! function, returns DConstants::INVALID_INDEX and sets error if none could be found - DUCKDB_API idx_t BindFunction(const string &name, TableFunctionSet &functions, const vector &arguments, - ErrorData &error); - DUCKDB_API idx_t BindFunction(const string &name, TableFunctionSet &functions, - vector> &arguments, ErrorData &error); + //! function, returns optional_idx() and sets error if none could be found + DUCKDB_API optional_idx BindFunction(const string &name, TableFunctionSet &functions, + const vector &arguments, ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, TableFunctionSet &functions, + vector> &arguments, ErrorData &error); //! Bind a pragma function from the set of functions and input arguments - DUCKDB_API idx_t BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, - ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, + ErrorData &error); DUCKDB_API unique_ptr BindScalarFunction(const string &schema, const string &name, vector> children, ErrorData &error, @@ -106815,20 +107714,21 @@ class FunctionBinder { private: //! Cast a set of expressions to the arguments of this function void CastToFunctionArguments(SimpleFunction &function, vector> &children); - int64_t BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments); - int64_t BindFunctionCost(const SimpleFunction &func, const vector &arguments); + optional_idx BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments); + optional_idx BindFunctionCost(const SimpleFunction &func, const vector &arguments); template vector BindFunctionsFromArguments(const string &name, FunctionSet &functions, const vector &arguments, ErrorData &error); template - idx_t MultipleCandidateException(const string &name, FunctionSet &functions, vector &candidate_functions, - const vector &arguments, ErrorData &error); + optional_idx MultipleCandidateException(const string &name, FunctionSet &functions, + vector &candidate_functions, const vector &arguments, + ErrorData &error); template - idx_t BindFunctionFromArguments(const string &name, FunctionSet &functions, const vector &arguments, - ErrorData &error); + optional_idx BindFunctionFromArguments(const string &name, FunctionSet &functions, + const vector &arguments, ErrorData &error); vector GetLogicalTypesFromExpressions(vector> &arguments); }; @@ -107434,12 +108334,12 @@ unique_ptr BindMinMax(ClientContext &context, AggregateFunction &f FunctionBinder function_binder(context); vector types {arguments[0]->return_type, arguments[0]->return_type}; ErrorData error; - idx_t best_function = function_binder.BindFunction(func_entry.name, func_entry.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { + auto best_function = function_binder.BindFunction(func_entry.name, func_entry.functions, types, error); + if (!best_function.IsValid()) { throw BinderException(string("Fail to find corresponding function for collation min/max: ") + error.Message()); } - function = func_entry.functions.GetFunctionByOffset(best_function); + function = func_entry.functions.GetFunctionByOffset(best_function.GetIndex()); // Create a copied child and PushCollation for it. arguments.push_back(arguments[0]->Copy()); @@ -107841,7 +108741,7 @@ struct IntegerSumOperation : public BaseSumOperation { +struct SumToHugeintOperation : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (!state.isset) { @@ -107867,7 +108767,7 @@ struct DoubleSumOperation : public BaseSumOperation; using KahanSumOperation = DoubleSumOperation; -struct HugeintSumOperation : public BaseSumOperation { +struct HugeintSumOperation : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (!state.isset) { @@ -107878,6 +108778,20 @@ struct HugeintSumOperation : public BaseSumOperation SumNoOverflowBind(ClientContext &context, AggregateFunction &function, + vector> &arguments) { + throw BinderException("sum_no_overflow is for internal use only!"); +} + +void SumNoOverflowSerialize(Serializer &serializer, const optional_ptr bind_data, + const AggregateFunction &function) { + return; +} + +unique_ptr SumNoOverflowDeserialize(Deserializer &deserializer, AggregateFunction &function) { + return nullptr; +} + AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { switch (type) { case PhysicalType::INT32: { @@ -107885,6 +108799,9 @@ AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { LogicalType::INTEGER, LogicalType::HUGEINT); function.name = "sum_no_overflow"; function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT; + function.bind = SumNoOverflowBind; + function.serialize = SumNoOverflowSerialize; + function.deserialize = SumNoOverflowDeserialize; return function; } case PhysicalType::INT64: { @@ -107892,6 +108809,9 @@ AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { LogicalType::BIGINT, LogicalType::HUGEINT); function.name = "sum_no_overflow"; function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT; + function.bind = SumNoOverflowBind; + function.serialize = SumNoOverflowSerialize; + function.deserialize = SumNoOverflowDeserialize; return function; } default: @@ -107899,6 +108819,14 @@ AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { } } +AggregateFunction GetSumAggregateNoOverflowDecimal() { + AggregateFunction aggr({LogicalTypeId::DECIMAL}, LogicalTypeId::DECIMAL, nullptr, nullptr, nullptr, nullptr, + nullptr, FunctionNullHandling::DEFAULT_NULL_HANDLING, nullptr, SumNoOverflowBind); + aggr.serialize = SumNoOverflowSerialize; + aggr.deserialize = SumNoOverflowDeserialize; + return aggr; +} + unique_ptr SumPropagateStats(ClientContext &context, BoundAggregateExpression &expr, AggregateStatisticsInput &input) { if (input.node_stats && input.node_stats->has_max_cardinality) { @@ -107982,17 +108910,6 @@ unique_ptr BindDecimalSum(ClientContext &context, AggregateFunctio return nullptr; } -unique_ptr BindDecimalSumNoOverflow(ClientContext &context, AggregateFunction &function, - vector> &arguments) { - auto decimal_type = arguments[0]->return_type; - function = GetSumAggregateNoOverflow(decimal_type.InternalType()); - function.name = "sum_no_overflow"; - function.arguments[0] = decimal_type; - function.return_type = LogicalType::DECIMAL(Decimal::MAX_WIDTH_DECIMAL, DecimalType::GetScale(decimal_type)); - function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT; - return nullptr; -} - AggregateFunctionSet SumFun::GetFunctions() { AggregateFunctionSet sum; // decimal @@ -108012,9 +108929,7 @@ AggregateFunctionSet SumNoOverflowFun::GetFunctions() { AggregateFunctionSet sum_no_overflow; sum_no_overflow.AddFunction(GetSumAggregateNoOverflow(PhysicalType::INT32)); sum_no_overflow.AddFunction(GetSumAggregateNoOverflow(PhysicalType::INT64)); - sum_no_overflow.AddFunction( - AggregateFunction({LogicalTypeId::DECIMAL}, LogicalTypeId::DECIMAL, nullptr, nullptr, nullptr, nullptr, nullptr, - FunctionNullHandling::DEFAULT_NULL_HANDLING, nullptr, BindDecimalSumNoOverflow)); + sum_no_overflow.AddFunction(GetSumAggregateNoOverflowDecimal()); return sum_no_overflow; } @@ -109761,7 +110676,7 @@ struct MergeSortTree { out << ((i && i % level_width == 0) ? group_separator : separator); out << std::setw(number_width) << level.first[i]; } - out << std::endl; + out << '\n'; } // Print the pointers if (!level.second.empty()) { @@ -109774,7 +110689,7 @@ struct MergeSortTree { : separator); out << std::setw(number_width) << level.second[idx + child_nr]; } - out << std::endl; + out << '\n'; } } level_width *= FANOUT; @@ -109789,7 +110704,7 @@ MergeSortTree::MergeSortTree(Elements &&lowest_level, const CMP const auto fanout = F; const auto cascading = C; const auto count = lowest_level.size(); - tree.emplace_back(Level(lowest_level, Offsets())); + tree.emplace_back(Level(std::move(lowest_level), Offsets())); const RunElement SENTINEL(MergeSortTraits::SENTINEL(), MergeSortTraits::SENTINEL()); @@ -110208,7 +111123,7 @@ inline int8_t TryAbsOperator::Operation(int8_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); } template <> @@ -110216,7 +111131,7 @@ inline int16_t TryAbsOperator::Operation(int16_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); } template <> @@ -110224,7 +111139,7 @@ inline int32_t TryAbsOperator::Operation(int32_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); } template <> @@ -110232,7 +111147,15 @@ inline int64_t TryAbsOperator::Operation(int64_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); +} + +template <> +inline hugeint_t TryAbsOperator::Operation(hugeint_t input) { + if (input == NumericLimits::Minimum()) { + throw OutOfRangeException("Overflow on abs(%s)", input.ToString()); + } + return AbsOperator::Operation(input); } template <> @@ -114228,6 +115151,9 @@ unique_ptr BindQuantile(ClientContext &context, AggregateFunction throw BinderException("QUANTILE can only take constant parameters"); } Value quantile_val = ExpressionExecutor::EvaluateScalar(context, *arguments[1]); + if (quantile_val.IsNull()) { + throw BinderException("QUANTILE argument must not be NULL"); + } vector quantiles; if (quantile_val.type().id() != LogicalTypeId::LIST) { quantiles.push_back(CheckQuantile(quantile_val)); @@ -115254,6 +116180,7 @@ static void ListUpdateFunction(Vector inputs[], AggregateInputData &aggr_input_d for (idx_t i = 0; i < count; i++) { auto &state = *states[states_data.sel->get_index(i)]; + aggr_input_data.allocator.AlignNext(); list_bind_data.functions.AppendRow(aggr_input_data.allocator, state.linked_list, input_data, i); } } @@ -115369,6 +116296,7 @@ static void ListCombineFunction(Vector &states_vector, Vector &combined, Aggrega Vector::RecursiveToUnifiedFormat(input, entry_count, input_data); for (idx_t entry_idx = 0; entry_idx < entry_count; ++entry_idx) { + aggr_input_data.allocator.AlignNext(); list_bind_data.functions.AppendRow(aggr_input_data.allocator, target.linked_list, input_data, entry_idx); } } @@ -115996,7 +116924,7 @@ struct StaticFunctionDefinition { get_aggregate_function_t get_aggregate_function; get_aggregate_function_set_t get_aggregate_function_set; - static StaticFunctionDefinition *GetFunctionList(); + static const StaticFunctionDefinition *GetFunctionList(); }; } // namespace duckdb @@ -116007,7 +116935,7 @@ struct StaticFunctionDefinition { namespace duckdb { template -void FillExtraInfo(StaticFunctionDefinition &function, T &info) { +void FillExtraInfo(const StaticFunctionDefinition &function, T &info) { info.internal = true; info.description = function.description; info.parameter_names = StringUtil::Split(function.parameters, ","); @@ -118729,7 +119657,7 @@ namespace duckdb { { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr } // this list is generated by scripts/generate_functions.py -static StaticFunctionDefinition internal_functions[] = { +static const StaticFunctionDefinition internal_functions[] = { DUCKDB_SCALAR_FUNCTION(FactorialOperatorFun), DUCKDB_SCALAR_FUNCTION_SET(BitwiseAndFun), DUCKDB_SCALAR_FUNCTION(PowOperatorFun), @@ -119076,7 +120004,7 @@ static StaticFunctionDefinition internal_functions[] = { FINAL_FUNCTION }; -StaticFunctionDefinition *StaticFunctionDefinition::GetFunctionList() { +const StaticFunctionDefinition *StaticFunctionDefinition::GetFunctionList() { return internal_functions; } @@ -119171,7 +120099,8 @@ class LambdaFunctions { result_validity = &FlatVector::Validity(result); if (list_column.GetType().id() == LogicalTypeId::SQLNULL) { - result_validity->SetInvalid(0); + result.SetVectorType(VectorType::CONSTANT_VECTOR); + ConstantVector::SetNull(result, true); result_is_null = true; return; } @@ -125474,7 +126403,7 @@ struct TimeBucket { // There are 360 months between 1970-01-01 and 2000-01-01 constexpr static const int32_t DEFAULT_ORIGIN_MONTHS = 360; - enum struct BucketWidthType { CONVERTIBLE_TO_MICROS, CONVERTIBLE_TO_MONTHS, UNCLASSIFIED }; + enum struct BucketWidthType : uint8_t { CONVERTIBLE_TO_MICROS, CONVERTIBLE_TO_MONTHS, UNCLASSIFIED }; static inline BucketWidthType ClassifyBucketWidth(const interval_t bucket_width) { if (bucket_width.months == 0 && Interval::GetMicro(bucket_width) > 0) { @@ -126581,6 +127510,7 @@ ScalarFunction StatsFun::GetFunction() { + namespace duckdb { // current_query @@ -126601,25 +127531,52 @@ static void CurrentDatabaseFunction(DataChunk &input, ExpressionState &state, Ve result.Reference(val); } -// current_schemas -static void CurrentSchemasFunction(DataChunk &input, ExpressionState &state, Vector &result) { - if (!input.AllConstant()) { +struct CurrentSchemasBindData : public FunctionData { + explicit CurrentSchemasBindData(Value result_value) : result(std::move(result_value)) { + } + + Value result; + +public: + unique_ptr Copy() const override { + return make_uniq(result); + } + bool Equals(const FunctionData &other_p) const override { + auto &other = other_p.Cast(); + return Value::NotDistinctFrom(result, other.result); + } +}; + +static unique_ptr CurrentSchemasBind(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + if (arguments[0]->return_type.id() != LogicalTypeId::BOOLEAN) { + throw BinderException("current_schemas requires a boolean input"); + } + if (!arguments[0]->IsFoldable()) { throw NotImplementedException("current_schemas requires a constant input"); } - if (ConstantVector::IsNull(input.data[0])) { - result.SetVectorType(VectorType::CONSTANT_VECTOR); - ConstantVector::SetNull(result, true); - return; + Value schema_value = ExpressionExecutor::EvaluateScalar(context, *arguments[0]); + Value result_val; + if (schema_value.IsNull()) { + // null + result_val = Value(LogicalType::LIST(LogicalType::VARCHAR)); + } else { + auto implicit_schemas = BooleanValue::Get(schema_value); + vector schema_list; + auto &catalog_search_path = ClientData::Get(context).catalog_search_path; + auto &search_path = implicit_schemas ? catalog_search_path->Get() : catalog_search_path->GetSetPaths(); + std::transform(search_path.begin(), search_path.end(), std::back_inserter(schema_list), + [](const CatalogSearchEntry &s) -> Value { return Value(s.schema); }); + result_val = Value::LIST(LogicalType::VARCHAR, schema_list); } - auto implicit_schemas = *ConstantVector::GetData(input.data[0]); - vector schema_list; - auto &catalog_search_path = ClientData::Get(state.GetContext()).catalog_search_path; - auto &search_path = implicit_schemas ? catalog_search_path->Get() : catalog_search_path->GetSetPaths(); - std::transform(search_path.begin(), search_path.end(), std::back_inserter(schema_list), - [](const CatalogSearchEntry &s) -> Value { return Value(s.schema); }); + return make_uniq(std::move(result_val)); +} - auto val = Value::LIST(LogicalType::VARCHAR, schema_list); - result.Reference(val); +// current_schemas +static void CurrentSchemasFunction(DataChunk &input, ExpressionState &state, Vector &result) { + auto &func_expr = state.expr.Cast(); + auto &info = func_expr.bind_info->Cast(); + result.Reference(info.result); } // in_search_path @@ -126667,7 +127624,8 @@ ScalarFunction CurrentDatabaseFun::GetFunction() { ScalarFunction CurrentSchemasFun::GetFunction() { auto varchar_list_type = LogicalType::LIST(LogicalType::VARCHAR); - ScalarFunction current_schemas({LogicalType::BOOLEAN}, varchar_list_type, CurrentSchemasFunction); + ScalarFunction current_schemas({LogicalType::BOOLEAN}, varchar_list_type, CurrentSchemasFunction, + CurrentSchemasBind); current_schemas.stability = FunctionStability::CONSISTENT_WITHIN_QUERY; return current_schemas; } @@ -126820,7 +127778,7 @@ static bool ClampSlice(const INPUT_TYPE &value, INDEX_TYPE &begin, INDEX_TYPE &e } const auto length = ValueLength(value); - if (begin < 0 && -begin > length && end < 0 && -end > length) { + if (begin < 0 && -begin > length && end < 0 && end < -length) { begin = 0; end = 0; return true; @@ -127212,6 +128170,7 @@ struct ListStats { + namespace duckdb { void ListFlattenFunction(DataChunk &args, ExpressionState &state, Vector &result) { @@ -127225,24 +128184,33 @@ void ListFlattenFunction(DataChunk &args, ExpressionState &state, Vector &result idx_t count = args.size(); - UnifiedVectorFormat list_data; - input.ToUnifiedFormat(count, list_data); - auto list_entries = UnifiedVectorFormat::GetData(list_data); - auto &child_vector = ListVector::GetEntry(input); - + // Prepare the result vector result.SetVectorType(VectorType::FLAT_VECTOR); + // This holds the new offsets and lengths auto result_entries = FlatVector::GetData(result); auto &result_validity = FlatVector::Validity(result); - if (child_vector.GetType().id() == LogicalTypeId::SQLNULL) { - for (idx_t i = 0; i < count; i++) { - auto list_index = list_data.sel->get_index(i); - if (!list_data.validity.RowIsValid(list_index)) { - result_validity.SetInvalid(i); + // The outermost list in each row + UnifiedVectorFormat row_data; + input.ToUnifiedFormat(count, row_data); + auto row_entries = UnifiedVectorFormat::GetData(row_data); + + // The list elements in each row: [HERE, ...] + auto &row_lists = ListVector::GetEntry(input); + UnifiedVectorFormat row_lists_data; + idx_t total_row_lists = ListVector::GetListSize(input); + row_lists.ToUnifiedFormat(total_row_lists, row_lists_data); + auto row_lists_entries = UnifiedVectorFormat::GetData(row_lists_data); + + if (row_lists.GetType().id() == LogicalTypeId::SQLNULL) { + for (idx_t row_cnt = 0; row_cnt < count; row_cnt++) { + auto row_idx = row_data.sel->get_index(row_cnt); + if (!row_data.validity.RowIsValid(row_idx)) { + result_validity.SetInvalid(row_cnt); continue; } - result_entries[i].offset = 0; - result_entries[i].length = 0; + result_entries[row_cnt].offset = 0; + result_entries[row_cnt].length = 0; } if (args.AllConstant()) { result.SetVectorType(VectorType::CONSTANT_VECTOR); @@ -127250,48 +128218,59 @@ void ListFlattenFunction(DataChunk &args, ExpressionState &state, Vector &result return; } - auto child_size = ListVector::GetListSize(input); - UnifiedVectorFormat child_data; - child_vector.ToUnifiedFormat(child_size, child_data); - auto child_entries = UnifiedVectorFormat::GetData(child_data); - auto &data_vector = ListVector::GetEntry(child_vector); + // The actual elements inside each row list: [[HERE, ...], []] + // This one becomes the child vector of the result. + auto &elem_vector = ListVector::GetEntry(row_lists); - idx_t offset = 0; - for (idx_t i = 0; i < count; i++) { - auto list_index = list_data.sel->get_index(i); - if (!list_data.validity.RowIsValid(list_index)) { - result_validity.SetInvalid(i); + // We'll use this selection vector to slice the elem_vector. + idx_t child_elem_cnt = ListVector::GetListSize(row_lists); + SelectionVector sel(child_elem_cnt); + idx_t sel_idx = 0; + + // HERE, [[]], ... + for (idx_t row_cnt = 0; row_cnt < count; row_cnt++) { + auto row_idx = row_data.sel->get_index(row_cnt); + + if (!row_data.validity.RowIsValid(row_idx)) { + result_validity.SetInvalid(row_cnt); continue; } - auto list_entry = list_entries[list_index]; - idx_t source_offset = 0; - // Find first valid child list entry to get offset - for (idx_t j = 0; j < list_entry.length; j++) { - auto child_list_index = child_data.sel->get_index(list_entry.offset + j); - if (child_data.validity.RowIsValid(child_list_index)) { - source_offset = child_entries[child_list_index].offset; - break; + idx_t list_offset = sel_idx; + idx_t list_length = 0; + + // [HERE, [...], ...] + auto row_entry = row_entries[row_idx]; + for (idx_t row_lists_cnt = 0; row_lists_cnt < row_entry.length; row_lists_cnt++) { + auto row_lists_idx = row_lists_data.sel->get_index(row_entry.offset + row_lists_cnt); + + // Skip invalid lists + if (!row_lists_data.validity.RowIsValid(row_lists_idx)) { + continue; } - } - idx_t length = 0; - // Find last valid child list entry to get length - for (idx_t j = list_entry.length - 1; j != (idx_t)-1; j--) { - auto child_list_index = child_data.sel->get_index(list_entry.offset + j); - if (child_data.validity.RowIsValid(child_list_index)) { - auto child_entry = child_entries[child_list_index]; - length = child_entry.offset + child_entry.length - source_offset; - break; + // [[HERE, ...], [.., ...]] + auto list_entry = row_lists_entries[row_lists_idx]; + list_length += list_entry.length; + + for (idx_t elem_cnt = 0; elem_cnt < list_entry.length; elem_cnt++) { + // offset of the element in the elem_vector. + idx_t offset = list_entry.offset + elem_cnt; + sel.set_index(sel_idx, offset); + sel_idx++; } } - ListVector::Append(result, data_vector, source_offset + length, source_offset); - result_entries[i].offset = offset; - result_entries[i].length = length; - offset += length; + result_entries[row_cnt].offset = list_offset; + result_entries[row_cnt].length = list_length; } + ListVector::SetListSize(result, sel_idx); + + auto &result_child_vector = ListVector::GetEntry(result); + result_child_vector.Slice(elem_vector, sel, sel_idx); + result_child_vector.Flatten(sel_idx); + if (args.AllConstant()) { result.SetVectorType(VectorType::CONSTANT_VECTOR); } @@ -127301,6 +128280,22 @@ static unique_ptr ListFlattenBind(ClientContext &context, ScalarFu vector> &arguments) { D_ASSERT(bound_function.arguments.size() == 1); + if (arguments[0]->return_type.id() == LogicalTypeId::ARRAY) { + auto child_type = ArrayType::GetChildType(arguments[0]->return_type); + if (child_type.id() == LogicalTypeId::ARRAY) { + child_type = LogicalType::LIST(ArrayType::GetChildType(child_type)); + } + arguments[0] = + BoundCastExpression::AddCastToType(context, std::move(arguments[0]), LogicalType::LIST(child_type)); + } else if (arguments[0]->return_type.id() == LogicalTypeId::LIST) { + auto child_type = ListType::GetChildType(arguments[0]->return_type); + if (child_type.id() == LogicalTypeId::ARRAY) { + child_type = LogicalType::LIST(ArrayType::GetChildType(child_type)); + arguments[0] = + BoundCastExpression::AddCastToType(context, std::move(arguments[0]), LogicalType::LIST(child_type)); + } + } + auto &input_type = arguments[0]->return_type; bound_function.arguments[0] = input_type; if (input_type.id() == LogicalTypeId::UNKNOWN) { @@ -127816,12 +128811,12 @@ static unique_ptr ListAggregatesBind(ClientContext &context, Scala FunctionBinder function_binder(context); auto best_function_idx = function_binder.BindFunction(func.name, func.functions, types, error); - if (best_function_idx == DConstants::INVALID_INDEX) { + if (!best_function_idx.IsValid()) { throw BinderException("No matching aggregate function\n%s", error.Message()); } // found a matching function, bind it as an aggregate - auto best_function = func.functions.GetFunctionByOffset(best_function_idx); + auto best_function = func.functions.GetFunctionByOffset(best_function_idx.GetIndex()); if (IS_AGGR) { return ListAggregatesBindFunction(context, bound_function, child_type, best_function, arguments); } @@ -128627,6 +129622,9 @@ static void ListSortFunction(DataChunk &args, ExpressionState &state, Vector &re auto &result_entry = ListVector::GetEntry(result); auto result_data = ListVector::GetData(result); for (idx_t i = 0; i < count; i++) { + if (!result_validity.RowIsValid(i)) { + continue; + } for (idx_t j = result_data[i].offset; j < result_data[i].offset + result_data[i].length; j++) { auto b = sel_sorted.get_index(j) - result_data[i].offset; result_entry.SetValue(j, Value::BIGINT(b + 1)); @@ -130187,7 +131185,8 @@ ScalarFunctionSet AbsOperatorFun::GetFunctions() { case LogicalTypeId::TINYINT: case LogicalTypeId::SMALLINT: case LogicalTypeId::INTEGER: - case LogicalTypeId::BIGINT: { + case LogicalTypeId::BIGINT: + case LogicalTypeId::HUGEINT: { ScalarFunction func({type}, type, ScalarFunction::GetScalarUnaryFunction(type)); func.statistics = PropagateAbsStats; abs.AddFunction(func); @@ -130595,7 +131594,7 @@ static void DecimalRoundNegativePrecisionFunction(DataChunk &input, ExpressionSt auto &info = func_expr.bind_info->Cast(); auto source_scale = DecimalType::GetScale(func_expr.children[0]->return_type); auto width = DecimalType::GetWidth(func_expr.children[0]->return_type); - if (info.target_scale <= -int32_t(width)) { + if (info.target_scale <= -int32_t(width - source_scale)) { // scale too big for width result.SetVectorType(VectorType::CONSTANT_VECTOR); result.SetValue(0, Value::INTEGER(0)); @@ -131824,7 +132823,7 @@ class SecretStorage { friend class SecretManager; public: - SecretStorage(const string &name) : storage_name(name), persistent(false) {}; + explicit SecretStorage(const string &name) : storage_name(name), persistent(false) {}; virtual ~SecretStorage() = default; public: @@ -131901,8 +132900,8 @@ class CatalogSetSecretStorage : public SecretStorage { return storage_name; }; - virtual unique_ptr StoreSecret(unique_ptr secret, OnCreateConflict on_conflict, - optional_ptr transaction = nullptr) override; + unique_ptr StoreSecret(unique_ptr secret, OnCreateConflict on_conflict, + optional_ptr transaction = nullptr) override; vector AllSecrets(optional_ptr transaction = nullptr) override; void DropSecretByName(const string &name, OnEntryNotFound on_entry_not_found, optional_ptr transaction = nullptr) override; @@ -131951,7 +132950,7 @@ class LocalFileSecretStorage : public CatalogSetSecretStorage { //! Implements the writes to disk void WriteSecret(const BaseSecret &secret, OnCreateConflict on_conflict) override; //! Implements the deletes from disk - virtual void RemoveSecret(const string &secret, OnEntryNotFound on_entry_not_found) override; + void RemoveSecret(const string &secret, OnEntryNotFound on_entry_not_found) override; //! Set of persistent secrets that are lazily loaded case_insensitive_set_t persistent_secrets; @@ -132003,8 +133002,8 @@ struct SecretMatch { //! A Secret Entry in the secret manager struct SecretEntry { public: - SecretEntry(unique_ptr secret) : secret(secret != nullptr ? secret->Clone() : nullptr) {}; - + explicit SecretEntry(unique_ptr secret) : secret(secret != nullptr ? secret->Clone() : nullptr) { + } SecretEntry(const SecretEntry &other) : persist_type(other.persist_type), storage_mode(other.storage_mode), secret((other.secret != nullptr) ? other.secret->Clone() : nullptr) { @@ -132247,10 +133246,9 @@ struct PrimitiveTypeState { template struct PrimitiveType { - PrimitiveType() { + PrimitiveType() = default; + PrimitiveType(INPUT_TYPE val) : val(val) { // NOLINT: allow implicit cast } - PrimitiveType(INPUT_TYPE val) : val(val) { - } // NOLINT: allow implicit cast INPUT_TYPE val; @@ -132931,7 +133929,7 @@ ScalarFunction HammingFun::GetFunction() { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define __restrict__ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __ORDER_LITTLE_ENDIAN__ 2 @@ -133483,16 +134481,14 @@ ScalarFunctionSet HexFun::GetFunctions() { ScalarFunctionSet to_hex; to_hex.AddFunction( ScalarFunction({LogicalType::VARCHAR}, LogicalType::VARCHAR, ToHexFunction)); - + to_hex.AddFunction( + ScalarFunction({LogicalType::BLOB}, LogicalType::VARCHAR, ToHexFunction)); to_hex.AddFunction( ScalarFunction({LogicalType::BIGINT}, LogicalType::VARCHAR, ToHexFunction)); - to_hex.AddFunction( ScalarFunction({LogicalType::UBIGINT}, LogicalType::VARCHAR, ToHexFunction)); - to_hex.AddFunction( ScalarFunction({LogicalType::HUGEINT}, LogicalType::VARCHAR, ToHexFunction)); - to_hex.AddFunction( ScalarFunction({LogicalType::UHUGEINT}, LogicalType::VARCHAR, ToHexFunction)); return to_hex; @@ -135778,34 +136774,25 @@ ScalarFunction RegexpEscapeFun::GetFunction() { - -#include -#include - namespace duckdb { -static string_t RepeatScalarFunction(const string_t &str, const int64_t cnt, vector &result) { - // Get information about the repeated string - auto input_str = str.GetData(); - auto size_str = str.GetSize(); - - // Reuse the buffer - result.clear(); - for (auto remaining = cnt; remaining-- > 0;) { - result.insert(result.end(), input_str, input_str + size_str); - } - - return string_t(result.data(), UnsafeNumericCast(result.size())); -} - -static void RepeatFunction(DataChunk &args, ExpressionState &state, Vector &result) { +static void RepeatFunction(DataChunk &args, ExpressionState &, Vector &result) { auto &str_vector = args.data[0]; auto &cnt_vector = args.data[1]; - vector buffer; BinaryExecutor::Execute( str_vector, cnt_vector, result, args.size(), [&](string_t str, int64_t cnt) { - return StringVector::AddString(result, RepeatScalarFunction(str, cnt, buffer)); + auto input_str = str.GetData(); + auto size_str = str.GetSize(); + + idx_t copy_count = cnt <= 0 || size_str == 0 ? 0 : idx_t(cnt); + auto result_str = StringVector::EmptyString(result, size_str * copy_count); + auto result_data = result_str.GetDataWriteable(); + for (idx_t i = 0; i < copy_count; i++) { + memcpy(result_data + i * size_str, input_str, size_str); + } + result_str.Finalize(); + return result_str; }); } @@ -136085,13 +137072,13 @@ struct RegexpExtractAll { struct RegexpBaseBindData : public FunctionData { RegexpBaseBindData(); RegexpBaseBindData(duckdb_re2::RE2::Options options, string constant_string, bool constant_pattern = true); - virtual ~RegexpBaseBindData(); + ~RegexpBaseBindData() override; duckdb_re2::RE2::Options options; string constant_string; bool constant_pattern; - virtual bool Equals(const FunctionData &other_p) const override; + bool Equals(const FunctionData &other_p) const override; }; struct RegexpMatchesBindData : public RegexpBaseBindData { @@ -136146,7 +137133,7 @@ struct RegexStringPieceArgs { } } - RegexStringPieceArgs &operator=(RegexStringPieceArgs &&other) { + RegexStringPieceArgs &operator=(RegexStringPieceArgs &&other) noexcept { std::swap(this->size, other.size); std::swap(this->capacity, other.capacity); std::swap(this->group_buffer, other.group_buffer); @@ -137367,7 +138354,7 @@ struct FlushMoveState; stores them in the HT. It uses linear probing for collision resolution. */ -struct aggr_ht_entry_t { +struct aggr_ht_entry_t { // NOLINT public: explicit aggr_ht_entry_t(hash_t value_p) : value(value_p) { } @@ -138132,7 +139119,7 @@ namespace duckdb { //! are used within the execution engine class ColumnBindingResolver : public LogicalOperatorVisitor { public: - ColumnBindingResolver(bool verify_only = false); + explicit ColumnBindingResolver(bool verify_only = false); void VisitOperator(LogicalOperator &op) override; static void Verify(LogicalOperator &op); @@ -138376,11 +139363,11 @@ struct LogicalExtensionOperator : public LogicalOperator { public: LogicalExtensionOperator() : LogicalOperator(LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR) { } - LogicalExtensionOperator(vector> expressions) + explicit LogicalExtensionOperator(vector> expressions) : LogicalOperator(LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR, std::move(expressions)) { } - virtual void Serialize(Serializer &serializer) const override; + void Serialize(Serializer &serializer) const override; static unique_ptr Deserialize(Deserializer &deserializer); virtual unique_ptr CreatePlan(ClientContext &context, PhysicalPlanGenerator &generator) = 0; @@ -138421,7 +139408,7 @@ namespace duckdb { template class IndexVector { public: - void push_back(T element) { + void push_back(T element) { // NOLINT: match stl API internal_vector.push_back(std::move(element)); } @@ -138433,34 +139420,34 @@ class IndexVector { return internal_vector[idx.index]; } - idx_t size() const { + idx_t size() const { // NOLINT: match stl API return internal_vector.size(); } - bool empty() const { + bool empty() const { // NOLINT: match stl API return internal_vector.empty(); } - void reserve(idx_t size) { + void reserve(idx_t size) { // NOLINT: match stl API internal_vector.reserve(size); } - typename vector::iterator begin() { + typename vector::iterator begin() { // NOLINT: match stl API return internal_vector.begin(); } - typename vector::iterator end() { + typename vector::iterator end() { // NOLINT: match stl API return internal_vector.end(); } - typename vector::const_iterator cbegin() { + typename vector::const_iterator cbegin() { // NOLINT: match stl API return internal_vector.cbegin(); } - typename vector::const_iterator cend() { + typename vector::const_iterator cend() { // NOLINT: match stl API return internal_vector.cend(); } - typename vector::const_iterator begin() const { + typename vector::const_iterator begin() const { // NOLINT: match stl API return internal_vector.begin(); } - typename vector::const_iterator end() const { + typename vector::const_iterator end() const { // NOLINT: match stl API return internal_vector.end(); } @@ -138705,17 +139692,9 @@ unique_ptr ColumnBindingResolver::VisitReplace(BoundColumnRefExpress // LCOV_EXCL_START // could not bind the column reference, this should never happen and indicates a bug in the code // generate an error message - string bound_columns = "["; - for (idx_t i = 0; i < bindings.size(); i++) { - if (i != 0) { - bound_columns += " "; - } - bound_columns += to_string(bindings[i].table_index) + "." + to_string(bindings[i].column_index); - } - bound_columns += "]"; - throw InternalException("Failed to bind column reference \"%s\" [%d.%d] (bindings: %s)", expr.alias, - expr.binding.table_index, expr.binding.column_index, bound_columns); + expr.binding.table_index, expr.binding.column_index, + LogicalOperator::ColumnBindingsToString(bindings)); // LCOV_EXCL_STOP } @@ -139237,48 +140216,87 @@ void ExpressionExecutor::Execute(const BoundComparisonExpression &expr, Expressi } } +static void UpdateNullMask(Vector &vec, optional_ptr sel, idx_t count, ValidityMask &null_mask) { + UnifiedVectorFormat vdata; + vec.ToUnifiedFormat(count, vdata); + + if (vdata.validity.AllValid()) { + return; + } + + if (!sel) { + sel = FlatVector::IncrementalSelectionVector(); + } + + for (idx_t i = 0; i < count; ++i) { + const auto ridx = sel->get_index(i); + const auto vidx = vdata.sel->get_index(i); + if (!vdata.validity.RowIsValid(vidx)) { + null_mask.SetInvalid(ridx); + } + } +} + template -static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); +static idx_t NestedSelectOperation(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask); template -static idx_t TemplatedSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - // the inplace loops take the result as the last parameter +static idx_t TemplatedSelectOperation(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + if (null_mask) { + UpdateNullMask(left, sel, count, *null_mask); + UpdateNullMask(right, sel, count, *null_mask); + } switch (left.GetType().InternalType()) { case PhysicalType::BOOL: case PhysicalType::INT8: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT16: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT32: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT64: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT8: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT16: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT32: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT64: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT128: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT128: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::FLOAT: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), false_sel.get()); case PhysicalType::DOUBLE: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INTERVAL: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::VARCHAR: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::LIST: case PhysicalType::STRUCT: case PhysicalType::ARRAY: - return NestedSelectOperation(left, right, sel, count, true_sel, false_sel); + return NestedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); default: throw InternalException("Invalid type for comparison"); } @@ -139288,52 +140306,66 @@ struct NestedSelector { // Select the matching rows for the values of a nested type that are not both NULL. // Those semantics are the same as the corresponding non-distinct comparator template - static idx_t Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { + static idx_t Select(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { throw InvalidTypeException(left.GetType(), "Invalid operation for nested SELECT"); } }; template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::DistinctLessThan(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctLessThan(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctLessThanEquals(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, + optional_ptr sel, idx_t count, + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctLessThanEquals(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThanEquals(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, + optional_ptr sel, idx_t count, + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThanEquals(left, right, sel, count, true_sel, false_sel, null_mask); } static inline idx_t SelectNotNull(Vector &left, Vector &right, const idx_t count, const SelectionVector &sel, - SelectionVector &maybe_vec, OptionalSelection &false_opt) { + SelectionVector &maybe_vec, OptionalSelection &false_opt, + optional_ptr null_mask) { UnifiedVectorFormat lvdata, rvdata; left.ToUnifiedFormat(count, lvdata); @@ -139362,6 +140394,9 @@ static inline idx_t SelectNotNull(Vector &left, Vector &right, const idx_t count const auto lidx = lvdata.sel->get_index(i); const auto ridx = rvdata.sel->get_index(i); if (!lmask.RowIsValid(lidx) || !rmask.RowIsValid(ridx)) { + if (null_mask) { + null_mask->SetInvalid(result_idx); + } false_opt.Append(false_count, result_idx); } else { // Neither is NULL, distinguish values. @@ -139379,7 +140414,8 @@ static inline idx_t SelectNotNull(Vector &left, Vector &right, const idx_t count return remaining; } -static void ScatterSelection(SelectionVector *target, const idx_t count, const SelectionVector &dense_vec) { +static void ScatterSelection(optional_ptr target, const idx_t count, + const SelectionVector &dense_vec) { if (target) { for (idx_t i = 0; i < count; ++i) { target->set_index(i, dense_vec.get_index(i)); @@ -139388,8 +140424,9 @@ static void ScatterSelection(SelectionVector *target, const idx_t count, const S } template -static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { +static idx_t NestedSelectOperation(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { // The Select operations all use a dense pair of input vectors to partition // a selection vector in a single pass. But to implement progressive comparisons, // we have to make multiple passes, so we need to keep track of the original input positions @@ -139412,12 +140449,14 @@ static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionV Vector l_not_null(left); Vector r_not_null(right); - auto match_count = SelectNotNull(l_not_null, r_not_null, count, *sel, maybe_vec, false_opt); + auto match_count = SelectNotNull(l_not_null, r_not_null, count, *sel, maybe_vec, false_opt, null_mask); auto no_match_count = count - match_count; count = match_count; // Now that we have handled the NULLs, we can use the recursive nested comparator for the rest. - match_count = NestedSelector::Select(l_not_null, r_not_null, maybe_vec, count, true_opt, false_opt); + match_count = + NestedSelector::Select(l_not_null, r_not_null, &maybe_vec, count, optional_ptr(true_opt), + optional_ptr(false_opt), null_mask); no_match_count += (count - match_count); // Copy the buffered selections to the output selections @@ -139427,34 +140466,41 @@ static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionV return match_count; } -idx_t VectorOperations::Equals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::Equals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::NotEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::NotEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::GreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::GreaterThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::GreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::GreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::LessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::LessThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::LessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::LessThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, optional_ptr null_mask) { + return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel, null_mask); } idx_t ExpressionExecutor::Select(const BoundComparisonExpression &expr, ExpressionState *state, @@ -139731,10 +140777,8 @@ void ExpressionExecutor::Execute(const BoundFunctionExpression &expr, Expression arguments.SetCardinality(count); arguments.Verify(); - state->profiler.BeginSample(); D_ASSERT(expr.function.function); expr.function.function(arguments, *state, result); - state->profiler.EndSample(NumericCast(count)); VerifyNullHandling(expr, arguments, result); D_ASSERT(result.GetType() == expr.return_type); @@ -140015,9 +141059,7 @@ void ExpressionExecutor::ExecuteExpression(DataChunk &input, Vector &result) { idx_t ExpressionExecutor::SelectExpression(DataChunk &input, SelectionVector &sel) { D_ASSERT(expressions.size() == 1); SetChunk(&input); - states[0]->profiler.BeginSample(); idx_t selected_tuples = Select(*expressions[0], states[0]->root_state.get(), nullptr, input.size(), &sel, nullptr); - states[0]->profiler.EndSample(NumericCast(chunk ? chunk->size() : 0)); return selected_tuples; } @@ -140029,9 +141071,7 @@ void ExpressionExecutor::ExecuteExpression(Vector &result) { void ExpressionExecutor::ExecuteExpression(idx_t expr_idx, Vector &result) { D_ASSERT(expr_idx < expressions.size()); D_ASSERT(result.GetType().id() == expressions[expr_idx]->return_type.id()); - states[expr_idx]->profiler.BeginSample(); Execute(*expressions[expr_idx], states[expr_idx]->root_state.get(), nullptr, chunk ? chunk->size() : 1, result); - states[expr_idx]->profiler.EndSample(NumericCast(chunk ? chunk->size() : 0)); } Value ExpressionExecutor::EvaluateScalar(ClientContext &context, const Expression &expr, bool allow_unfoldable) { @@ -140283,7 +141323,7 @@ ClientContext &ExpressionState::GetContext() { ExpressionState::ExpressionState(const Expression &expr, ExpressionExecutorState &root) : expr(expr), root(root) { } -ExpressionExecutorState::ExpressionExecutorState() : profiler() { +ExpressionExecutorState::ExpressionExecutorState() { } void ExpressionState::Verify(ExpressionExecutorState &root_executor) { @@ -141207,7 +142247,7 @@ class TypeMatcher { //! The SpecificTypeMatcher class matches only a single specified type class SpecificTypeMatcher : public TypeMatcher { public: - explicit SpecificTypeMatcher(LogicalType type) : type(type) { + explicit SpecificTypeMatcher(LogicalType type) : type(std::move(type)) { } bool Match(const LogicalType &type_p) override { @@ -141258,9 +142298,9 @@ class FunctionMatcher { virtual ~FunctionMatcher() { } - virtual bool Match(string &name) = 0; + virtual bool Match(const string &name) = 0; - static bool Match(unique_ptr &matcher, string &name) { + static bool Match(unique_ptr &matcher, const string &name) { if (!matcher) { return true; } @@ -141271,11 +142311,11 @@ class FunctionMatcher { //! The SpecificFunctionMatcher class matches a single specified function name class SpecificFunctionMatcher : public FunctionMatcher { public: - explicit SpecificFunctionMatcher(string name) : name(std::move(name)) { + explicit SpecificFunctionMatcher(string name_p) : name(std::move(name_p)) { } - bool Match(string &name) override { - return name == this->name; + bool Match(const string &matched_name) override { + return matched_name == this->name; } private: @@ -141285,10 +142325,10 @@ class SpecificFunctionMatcher : public FunctionMatcher { //! The ManyFunctionMatcher class matches a set of functions class ManyFunctionMatcher : public FunctionMatcher { public: - explicit ManyFunctionMatcher(unordered_set names) : names(std::move(names)) { + explicit ManyFunctionMatcher(unordered_set names_p) : names(std::move(names_p)) { } - bool Match(string &name) override { + bool Match(const string &name) override { return names.find(name) != names.end(); } @@ -141325,7 +142365,7 @@ class ExpressionMatcher { //! The ExpressionEqualityMatcher matches on equality with another (given) expression class ExpressionEqualityMatcher : public ExpressionMatcher { public: - explicit ExpressionEqualityMatcher(Expression &expr) + explicit ExpressionEqualityMatcher(const Expression &expr) : ExpressionMatcher(ExpressionClass::INVALID), expression(expr) { } @@ -141346,7 +142386,7 @@ class CaseExpressionMatcher : public ExpressionMatcher { CaseExpressionMatcher() : ExpressionMatcher(ExpressionClass::BOUND_CASE) { } - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class ComparisonExpressionMatcher : public ExpressionMatcher { @@ -141359,7 +142399,7 @@ class ComparisonExpressionMatcher : public ExpressionMatcher { //! The set matcher matching policy to use SetMatcher::Policy policy; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class CastExpressionMatcher : public ExpressionMatcher { @@ -141369,7 +142409,7 @@ class CastExpressionMatcher : public ExpressionMatcher { //! The matcher for the child expressions unique_ptr matcher; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class InClauseExpressionMatcher : public ExpressionMatcher { @@ -141381,7 +142421,7 @@ class InClauseExpressionMatcher : public ExpressionMatcher { //! The set matcher matching policy to use SetMatcher::Policy policy; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class ConjunctionExpressionMatcher : public ExpressionMatcher { @@ -141394,7 +142434,7 @@ class ConjunctionExpressionMatcher : public ExpressionMatcher { //! The set matcher matching policy to use SetMatcher::Policy policy; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class FunctionExpressionMatcher : public ExpressionMatcher { @@ -141408,7 +142448,7 @@ class FunctionExpressionMatcher : public ExpressionMatcher { //! The function name to match unique_ptr function; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; //! The FoldableConstant matcher matches any expression that is foldable into a constant by the ExpressionExecutor (i.e. @@ -141540,13 +142580,13 @@ unique_ptr ART::TryInitializeScan(const Transaction &transaction // match on a comparison type matcher.expr_type = make_uniq(); // match on a constant comparison with the indexed expression - matcher.matchers.push_back(make_uniq(const_cast(index_expr))); + matcher.matchers.push_back(make_uniq(index_expr)); matcher.matchers.push_back(make_uniq()); matcher.policy = SetMatcher::Policy::UNORDERED; vector> bindings; - if (matcher.Match(const_cast(filter_expr), bindings)) { + if (matcher.Match(const_cast(filter_expr), bindings)) { // NOLINT: Match does not alter the expr // range or equality comparison with constant value // we can use our index here // bindings[0] = the expression @@ -145729,44 +146769,44 @@ string UnknownIndex::GenerateErrorMessage() const { } ErrorData UnknownIndex::Append(IndexLock &, DataChunk &, Vector &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::VerifyAppend(DataChunk &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::VerifyAppend(DataChunk &, ConflictManager &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::CommitDrop(IndexLock &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::Delete(IndexLock &, DataChunk &, Vector &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } ErrorData UnknownIndex::Insert(IndexLock &, DataChunk &, Vector &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } IndexStorageInfo UnknownIndex::GetStorageInfo(bool) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } bool UnknownIndex::MergeIndexes(IndexLock &, Index &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::Vacuum(IndexLock &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } idx_t UnknownIndex::GetInMemorySize(IndexLock &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::CheckConstraintsForChunk(DataChunk &, ConflictManager &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } string UnknownIndex::VerifyAndToString(IndexLock &, bool) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } string UnknownIndex::GetConstraintViolationMessage(VerifyExistenceType, idx_t, DataChunk &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } } // namespace duckdb @@ -146630,7 +147670,7 @@ void ScanStructure::NextInnerJoin(DataChunk &keys, DataChunk &left, DataChunk &r Store(true, ptrs[idx] + ht.tuple_size); } } - // for right semi join, just mark the entry as found and move on. Propogation happens later + // for right semi join, just mark the entry as found and move on. Propagation happens later if (ht.join_type != JoinType::RIGHT_SEMI && ht.join_type != JoinType::RIGHT_ANTI) { // matches were found // construct the result @@ -147505,7 +148545,6 @@ static void TemplatedMarkJoin(Vector &left, Vector &right, idx_t lcount, idx_t r static void MarkJoinNested(Vector &left, Vector &right, idx_t lcount, idx_t rcount, bool found_match[], ExpressionType comparison_type) { Vector left_reference(left.GetType()); - SelectionVector true_sel(rcount); for (idx_t i = 0; i < lcount; i++) { if (found_match[i]) { continue; @@ -150492,7 +151531,7 @@ class WindowAggregatorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -150815,7 +151854,7 @@ class WindowExecutorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -151706,7 +152745,8 @@ namespace duckdb { CSVBuffer::CSVBuffer(ClientContext &context, idx_t buffer_size_p, CSVFileHandle &file_handle, idx_t &global_csv_current_position, idx_t file_number_p) - : context(context), file_number(file_number_p), can_seek(file_handle.CanSeek()) { + : context(context), requested_size(buffer_size_p), file_number(file_number_p), can_seek(file_handle.CanSeek()), + is_pipe(file_handle.IsPipe()) { AllocateBuffer(buffer_size_p); auto buffer = Ptr(); actual_buffer_size = file_handle.Read(buffer, buffer_size_p); @@ -151720,8 +152760,9 @@ CSVBuffer::CSVBuffer(ClientContext &context, idx_t buffer_size_p, CSVFileHandle CSVBuffer::CSVBuffer(CSVFileHandle &file_handle, ClientContext &context, idx_t buffer_size, idx_t global_csv_current_position, idx_t file_number_p, idx_t buffer_idx_p) - : context(context), global_csv_start(global_csv_current_position), file_number(file_number_p), - can_seek(file_handle.CanSeek()), buffer_idx(buffer_idx_p) { + : context(context), requested_size(buffer_size), global_csv_start(global_csv_current_position), + file_number(file_number_p), can_seek(file_handle.CanSeek()), is_pipe(file_handle.IsPipe()), + buffer_idx(buffer_idx_p) { AllocateBuffer(buffer_size); auto buffer = handle.Ptr(); actual_buffer_size = file_handle.Read(handle.Ptr(), buffer_size); @@ -151751,7 +152792,7 @@ shared_ptr CSVBuffer::Next(CSVFileHandle &file_handle, idx_t buffer_s void CSVBuffer::AllocateBuffer(idx_t buffer_size) { auto &buffer_manager = BufferManager::GetBufferManager(context); - bool can_destroy = can_seek; + bool can_destroy = !is_pipe; handle = buffer_manager.Allocate(MemoryTag::CSV_READER, MaxValue(Storage::BLOCK_SIZE, buffer_size), can_destroy, &block); } @@ -151762,20 +152803,21 @@ idx_t CSVBuffer::GetBufferSize() { void CSVBuffer::Reload(CSVFileHandle &file_handle) { AllocateBuffer(actual_buffer_size); + // If we can seek, we seek and return the correct pointers file_handle.Seek(global_csv_start); file_handle.Read(handle.Ptr(), actual_buffer_size); } shared_ptr CSVBuffer::Pin(CSVFileHandle &file_handle, bool &has_seeked) { auto &buffer_manager = BufferManager::GetBufferManager(context); - if (can_seek && block->IsUnloaded()) { + if (!is_pipe && block->IsUnloaded()) { // We have to reload it from disk block = nullptr; Reload(file_handle); has_seeked = true; } - return make_shared(buffer_manager.Pin(block), actual_buffer_size, last_buffer, file_number, - buffer_idx); + return make_shared(buffer_manager.Pin(block), actual_buffer_size, requested_size, last_buffer, + file_number, buffer_idx); } void CSVBuffer::Unpin() { @@ -151833,10 +152875,12 @@ class CSVBufferManager { //! once. bool Done(); + void ResetBufferManager(); string GetFilePath(); ClientContext &context; idx_t skip_rows = 0; + bool sniffing = false; private: //! Reads next buffer in reference to cached_buffers.front() @@ -151860,6 +152904,7 @@ class CSVBufferManager { //! If the file_handle used seek bool has_seeked = false; unordered_set reset_when_possible; + bool is_pipe; }; } // namespace duckdb @@ -151964,6 +153009,10 @@ struct CSVStates { return states[1] == CSVState::CARRIAGE_RETURN; } + inline bool IsInvalid() { + return states[1] == CSVState::INVALID; + } + inline bool IsQuoted() { return states[0] == CSVState::QUOTED; } @@ -152128,61 +153177,79 @@ class LinesPerBoundary { }; enum CSVErrorType : uint8_t { - CAST_ERROR = 0, // If when casting a value from string to the column type fails - COLUMN_NAME_TYPE_MISMATCH = 1, // If there is a mismatch between Column Names and Types - INCORRECT_COLUMN_AMOUNT = 2, // If the CSV is missing a column - UNTERMINATED_QUOTES = 3, // If a quote is not terminated - SNIFFING = 4, // If something went wrong during sniffing and was not possible to find suitable candidates - MAXIMUM_LINE_SIZE = 5, // Maximum line size was exceeded by a line in the CSV File - NULLPADDED_QUOTED_NEW_VALUE = 6, // If the null_padding option is set and we have quoted new values in parallel - INVALID_UNICODE = 7 - + CAST_ERROR = 0, //! If when casting a value from string to the column type fails + COLUMN_NAME_TYPE_MISMATCH = 1, //! If there is a mismatch between Column Names and Types + TOO_FEW_COLUMNS = 2, //! If the CSV has too few columns + TOO_MANY_COLUMNS = 3, //! If the CSV has too many column + UNTERMINATED_QUOTES = 4, //! If a quote is not terminated + SNIFFING = 5, //! If something went wrong during sniffing and was not possible to find suitable candidates + MAXIMUM_LINE_SIZE = 6, //! Maximum line size was exceeded by a line in the CSV File + NULLPADDED_QUOTED_NEW_VALUE = 7, //! If the null_padding option is set, and we have quoted new values in parallel + INVALID_UNICODE = 8 //! If we have invalid unicode values }; class CSVError { public: CSVError() {}; - CSVError(string error_message, CSVErrorType type, idx_t column_idx, vector row, LinesPerBoundary error_info); + CSVError(string error_message, CSVErrorType type, idx_t column_idx, string csv_row, LinesPerBoundary error_info, + idx_t row_byte_position, int64_t byte_position, const CSVReaderOptions &reader_options, + const string &fixes); CSVError(string error_message, CSVErrorType type, LinesPerBoundary error_info); //! Produces error messages for column name -> type mismatch. static CSVError ColumnTypesError(case_insensitive_map_t sql_types_per_column, const vector &names); //! Produces error messages for casting errors static CSVError CastError(const CSVReaderOptions &options, string &column_name, string &cast_error, - idx_t column_idx, vector &row, LinesPerBoundary error_info, LogicalTypeId type); + idx_t column_idx, string &csv_row, LinesPerBoundary error_info, idx_t row_byte_position, + int64_t byte_position, LogicalTypeId type); //! Produces error for when the line size exceeds the maximum line size option - static CSVError LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info); + static CSVError LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info, + string &csv_row, idx_t byte_position); //! Produces error for when the sniffer couldn't find viable options static CSVError SniffingError(string &file_path); //! Produces error messages for unterminated quoted values - static CSVError UnterminatedQuotesError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t current_column, LinesPerBoundary error_info); + static CSVError UnterminatedQuotesError(const CSVReaderOptions &options, idx_t current_column, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position); //! Produces error messages for null_padding option is set and we have quoted new values in parallel static CSVError NullPaddingFail(const CSVReaderOptions &options, LinesPerBoundary error_info); //! Produces error for incorrect (e.g., smaller and lower than the predefined) number of columns in a CSV Line - static CSVError IncorrectColumnAmountError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t actual_columns, - LinesPerBoundary error_info); - //! Produces error message when we detect an invalid utf-8 value - static CSVError InvalidUTF8(const CSVReaderOptions &options, LinesPerBoundary error_info); + static CSVError IncorrectColumnAmountError(const CSVReaderOptions &state_machine, idx_t actual_columns, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position); + static CSVError InvalidUTF8(const CSVReaderOptions &options, idx_t current_column, LinesPerBoundary error_info, + string &csv_row, idx_t row_byte_position, int64_t byte_position); + idx_t GetBoundaryIndex() { return error_info.boundary_idx; } + //! We might want to remove newline in errors if we are doing them for the rejects tables + void RemoveNewLine(string &error); + //! Actual error message string error_message; + //! Full error message used in throws + //! 1. The Actual error + //! 2. How to fix it + //! 3. Options that generated the error + string full_error_message; //! Error Type CSVErrorType type; //! Column Index where error happened idx_t column_idx; - //! Values from the row where error happened - vector row; + //! Original CSV row where error happened + string csv_row; //! Line information regarding this error LinesPerBoundary error_info; + //! Byte position of where the row starts + idx_t row_byte_position; + //! Byte Position where error occurred. + int64_t byte_position; }; class CSVErrorHandler { public: - CSVErrorHandler(bool ignore_errors = false); + explicit CSVErrorHandler(bool ignore_errors = false); //! Throws the error void Error(CSVError csv_error, bool force_error = false); //! If we have a cached error, and we can now error, we error. @@ -152243,6 +153310,7 @@ class CSVFileScan { const vector &GetNames(); const vector &GetTypes(); void InitializeProjection(); + void Finish(); //! Initialize the actual names and types to be scanned from the file void InitializeFileNamesTypes(); @@ -152289,8 +153357,6 @@ class ReadCSV { }; struct BaseCSVData : public TableFunctionData { - virtual ~BaseCSVData() { - } //! The file path of the CSV file to read or write vector files; //! The CSV reader options @@ -152314,7 +153380,7 @@ struct WriteCSVData : public BaseCSVData { //! The newline string to write string newline = "\n"; //! The size of the CSV file (in bytes) that we buffer before we flush it to disk - idx_t flush_size = 4096 * 8; + idx_t flush_size = 4096ULL * 8ULL; //! For each byte whether or not the CSV file requires quotes when containing the byte unsafe_unique_array requires_quotes; }; @@ -152385,6 +153451,7 @@ CSVBufferManager::CSVBufferManager(ClientContext &context_p, const CSVReaderOpti : context(context_p), file_idx(file_idx_p), file_path(file_path_p), buffer_size(CSVBuffer::CSV_BUFFER_SIZE) { D_ASSERT(!file_path.empty()); file_handle = ReadCSV::OpenCSV(file_path, options.compression, context); + is_pipe = file_handle->IsPipe(); skip_rows = options.dialect_options.skip_rows.GetValue(); auto file_size = file_handle->FileSize(); if (file_size > 0 && file_size < buffer_size) { @@ -152440,6 +153507,15 @@ bool CSVBufferManager::ReadNextAndCacheIt() { shared_ptr CSVBufferManager::GetBuffer(const idx_t pos) { lock_guard parallel_lock(main_mutex); + if (pos == 0 && done && cached_buffers.empty()) { + if (is_pipe) { + throw InvalidInputException("Recursive CTEs are not allowed when using piped csv files"); + } + // This is a recursive CTE, we have to reset out whole buffer + done = false; + file_handle->Reset(); + Initialize(); + } while (pos >= cached_buffers.size()) { if (done) { return nullptr; @@ -152448,7 +153524,9 @@ shared_ptr CSVBufferManager::GetBuffer(const idx_t pos) { done = true; } } - if (pos != 0) { + if (pos != 0 && (sniffing || file_handle->CanSeek())) { + // We don't need to unpin the buffers here if we are not sniffing since we + // control it per-thread on the scan if (cached_buffers[pos - 1]) { cached_buffers[pos - 1]->Unpin(); } @@ -152475,6 +153553,12 @@ void CSVBufferManager::ResetBuffer(const idx_t buffer_idx) { } // We only reset if previous one was also already reset if (buffer_idx > 0 && !cached_buffers[buffer_idx - 1]) { + if (cached_buffers[buffer_idx]->last_buffer) { + // We clear the whole shebang + cached_buffers.clear(); + reset_when_possible.clear(); + return; + } cached_buffers[buffer_idx].reset(); idx_t cur_buffer = buffer_idx + 1; while (reset_when_possible.find(cur_buffer) != reset_when_possible.end()) { @@ -152499,6 +153583,19 @@ bool CSVBufferManager::Done() { return done; } +void CSVBufferManager::ResetBufferManager() { + if (!file_handle->IsPipe()) { + // If this is not a pipe we reset the buffer manager and restart it when doing the actual scan + cached_buffers.clear(); + reset_when_possible.clear(); + file_handle->Reset(); + last_buffer = nullptr; + done = false; + global_csv_pos = 0; + Initialize(); + } +} + string CSVBufferManager::GetFilePath() { return file_path; } @@ -152515,12 +153612,13 @@ CSVFileHandle::CSVFileHandle(FileSystem &fs, Allocator &allocator, unique_ptrCanSeek(); on_disk_file = file_handle->OnDiskFile(); file_size = file_handle->GetFileSize(); + is_pipe = file_handle->IsPipe(); uncompressed = compression == FileCompressionType::UNCOMPRESSED; } unique_ptr CSVFileHandle::OpenFileHandle(FileSystem &fs, Allocator &allocator, const string &path, FileCompressionType compression) { - auto file_handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ, FileLockType::NO_LOCK, compression); + auto file_handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ | compression); if (file_handle->CanSeek()) { file_handle->Reset(); } @@ -152539,7 +153637,10 @@ bool CSVFileHandle::CanSeek() { void CSVFileHandle::Seek(idx_t position) { if (!can_seek) { - throw InternalException("Cannot seek in this file"); + if (is_pipe) { + throw InternalException("Trying to seek a piped CSV File."); + } + throw InternalException("Trying to seek a compressed CSV File."); } file_handle->Seek(position); } @@ -152548,6 +153649,16 @@ bool CSVFileHandle::OnDiskFile() { return on_disk_file; } +void CSVFileHandle::Reset() { + file_handle->Reset(); + finished = false; + requested_bytes = 0; +} + +bool CSVFileHandle::IsPipe() { + return is_pipe; +} + idx_t CSVFileHandle::FileSize() { return file_size; } @@ -152894,7 +154005,7 @@ class BaseScanner { Initialize(); initialized = true; } - if (!iterator.done) { + if (!iterator.done && cur_buffer_handle) { Process(result); } FinalizeChunkProcess(); @@ -152933,17 +154044,54 @@ class LinePosition { } return other.buffer_size - other.buffer_pos + buffer_pos; } + + bool operator==(const LinePosition &other) const { + return buffer_pos == other.buffer_pos && buffer_idx == other.buffer_idx && buffer_size == other.buffer_size; + } + + idx_t GetGlobalPosition(idx_t requested_buffer_size, bool first_char_nl = false) { + return requested_buffer_size * buffer_idx + buffer_pos + first_char_nl; + } idx_t buffer_pos = 0; idx_t buffer_size = 0; idx_t buffer_idx = 0; }; +//! Keeps track of start and end of line positions in regard to the CSV file +class FullLinePosition { +public: + FullLinePosition() {}; + LinePosition begin; + LinePosition end; + + //! Reconstructs the current line to be used in error messages + string ReconstructCurrentLine(bool &first_char_nl, + unordered_map> &buffer_handles); +}; + +class CurrentError { +public: + CurrentError(CSVErrorType type, idx_t col_idx_p, LinePosition error_position_p) + : type(type), col_idx(col_idx_p), error_position(error_position_p) {}; + + CSVErrorType type; + idx_t col_idx; + idx_t current_line_size; + string error_message; + //! Exact Position where the error happened + LinePosition error_position; + + friend bool operator==(const CurrentError &error, CSVErrorType other) { + return error.type == other; + } +}; + class StringValueResult : public ScannerResult { public: StringValueResult(CSVStates &states, CSVStateMachine &state_machine, const shared_ptr &buffer_handle, Allocator &buffer_allocator, idx_t result_size, - idx_t buffer_position, CSVErrorHandler &error_hander, CSVIterator &iterator, bool store_line_size, - shared_ptr csv_file_scan, idx_t &lines_read, bool sniffing); + idx_t buffer_position, CSVErrorHandler &error_handler, CSVIterator &iterator, + bool store_line_size, shared_ptr csv_file_scan, idx_t &lines_read, bool sniffing); ~StringValueResult(); @@ -152952,7 +154100,7 @@ class StringValueResult : public ScannerResult { unsafe_vector validity_mask; //! Variables to iterate over the CSV buffers - idx_t last_position; + LinePosition last_position; char *buffer_ptr; idx_t buffer_size; @@ -152960,8 +154108,10 @@ class StringValueResult : public ScannerResult { const uint32_t number_of_columns; const bool null_padding; const bool ignore_errors; - const char *null_str_ptr; - const idx_t null_str_size; + + unsafe_unique_array null_str_ptr; + unsafe_unique_array null_str_size; + idx_t null_str_count; //! Internal Data Chunk used for flushing DataChunk parse_chunk; @@ -152971,16 +154121,16 @@ class StringValueResult : public ScannerResult { //! Information to properly handle errors CSVErrorHandler &error_handler; CSVIterator &iterator; - //! Where the previous line started, used to validate the maximum_line_size option - LinePosition previous_line_start; - LinePosition pre_previous_line_start; + //! Line position of the current line + FullLinePosition current_line_position; + //! Used for CSV line reconstruction on flushed errors + unordered_map line_positions_per_row; bool store_line_size = false; bool added_last_line = false; bool quoted_new_line = false; unsafe_unique_array> parse_types; vector names; - unordered_map cast_errors; shared_ptr csv_file_scan; idx_t &lines_read; @@ -152990,10 +154140,13 @@ class StringValueResult : public ScannerResult { idx_t chunk_col_id = 0; //! We must ensure that we keep the buffers alive until processing the query result - vector> buffer_handles; + unordered_map> buffer_handles; + + //! Requested size of buffers (i.e., either 32Mb or set by buffer_size parameter) + idx_t requested_size; - //! If the current row has an error, we have to skip it - bool ignore_current_row = false; + //! Errors happening in the current line (if any) + vector current_errors; bool sniffing; //! Specialized code for quoted values, makes sure to remove quotes and escapes @@ -153010,8 +154163,10 @@ class StringValueResult : public ScannerResult { //! Handles EmptyLine states static inline bool EmptyLine(StringValueResult &result, const idx_t buffer_pos); inline bool AddRowInternal(); - - void HandleOverLimitRows(); + //! Force the throw of a unicode error + void HandleUnicodeError(idx_t col_idx, LinePosition &error_position); + //! Certain errors should only be handled when adding the line, to ensure proper error propagation. + bool HandleError(); inline void AddValueToVector(const char *value_ptr, const idx_t size, bool allocate = false); @@ -153034,9 +154189,6 @@ class StringValueScanner : public BaseScanner { const shared_ptr &state_machine, const shared_ptr &error_handler); - ~StringValueScanner() { - } - StringValueResult &ParseChunk() override; //! Flushes the result to the insert_chunk @@ -153126,9 +154278,6 @@ class ColumnCountScanner : public BaseScanner { ColumnCountScanner(shared_ptr buffer_manager, const shared_ptr &state_machine, shared_ptr error_handler); - ~ColumnCountScanner() { - } - ColumnCountResult &ParseChunk() override; ColumnCountResult &GetResult() override; @@ -153525,19 +154674,19 @@ CSVIterator::CSVIterator() : is_set(false) { void CSVBoundary::Print() { #ifndef DUCKDB_DISABLE_PRINT - std::cout << "---Boundary: " << boundary_idx << " ---" << std::endl; - std::cout << "File Index:: " << file_idx << std::endl; - std::cout << "Buffer Index: " << buffer_idx << std::endl; - std::cout << "Buffer Pos: " << buffer_pos << std::endl; - std::cout << "End Pos: " << end_pos << std::endl; - std::cout << "------------" << end_pos << std::endl; + std::cout << "---Boundary: " << boundary_idx << " ---" << '\n'; + std::cout << "File Index:: " << file_idx << '\n'; + std::cout << "Buffer Index: " << buffer_idx << '\n'; + std::cout << "Buffer Pos: " << buffer_pos << '\n'; + std::cout << "End Pos: " << end_pos << '\n'; + std::cout << "------------" << end_pos << '\n'; #endif } void CSVIterator::Print() { #ifndef DUCKDB_DISABLE_PRINT boundary.Print(); - std::cout << "Is set: " << is_set << std::endl; + std::cout << "Is set: " << is_set << '\n'; #endif } @@ -153645,9 +154794,6 @@ class SkipScanner : public BaseScanner { SkipScanner(shared_ptr buffer_manager, const shared_ptr &state_machine, shared_ptr error_handler, idx_t rows_to_skip); - ~SkipScanner() { - } - SkipResult &ParseChunk() override; SkipResult &GetResult() override; @@ -153897,22 +155043,22 @@ StringValueResult::StringValueResult(CSVStates &states, CSVStateMachine &state_m shared_ptr csv_file_scan_p, idx_t &lines_read_p, bool sniffing_p) : ScannerResult(states, state_machine), number_of_columns(NumericCast(state_machine.dialect_options.num_cols)), - null_padding(state_machine.options.null_padding), ignore_errors(state_machine.options.ignore_errors), - null_str_ptr(state_machine.options.null_str.c_str()), null_str_size(state_machine.options.null_str.size()), + null_padding(state_machine.options.null_padding), ignore_errors(state_machine.options.ignore_errors.GetValue()), result_size(result_size_p), error_handler(error_hander_p), iterator(iterator_p), store_line_size(store_line_size_p), csv_file_scan(std::move(csv_file_scan_p)), lines_read(lines_read_p), sniffing(sniffing_p) { // Vector information D_ASSERT(number_of_columns > 0); - buffer_handles.push_back(buffer_handle); + buffer_handles[buffer_handle->buffer_idx] = buffer_handle; // Buffer Information buffer_ptr = buffer_handle->Ptr(); buffer_size = buffer_handle->actual_size; - last_position = buffer_position; + last_position = {buffer_handle->buffer_idx, buffer_position, buffer_size}; + requested_size = buffer_handle->requested_size; // Current Result information - previous_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, buffer_handle->actual_size}; - pre_previous_line_start = previous_line_start; + current_line_position.begin = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, buffer_handle->actual_size}; + current_line_position.end = current_line_position.begin; // Fill out Parse Types vector logical_types; parse_types = make_unsafe_uniq_array>(number_of_columns); @@ -153968,6 +155114,15 @@ StringValueResult::StringValueResult(CSVStates &states, CSVStateMachine &state_m vector_ptr.push_back(FlatVector::GetData(col)); validity_mask.push_back(&FlatVector::Validity(col)); } + + // Setup the NullStr information + null_str_count = state_machine.options.null_str.size(); + null_str_ptr = make_unsafe_uniq_array(null_str_count); + null_str_size = make_unsafe_uniq_array(null_str_count); + for (idx_t i = 0; i < null_str_count; i++) { + null_str_ptr[i] = state_machine.options.null_str[i].c_str(); + null_str_size[i] = state_machine.options.null_str[i].size(); + } } StringValueResult::~StringValueResult() { @@ -153994,44 +155149,51 @@ void StringValueResult::AddValueToVector(const char *value_ptr, const idx_t size bool error = true; if (cur_col_id == number_of_columns && ((quoted && state_machine.options.allow_quoted_nulls) || !quoted)) { // we make an exception if the first over-value is null - error = !IsValueNull(null_str_ptr, value_ptr, size); + bool is_value_null = false; + for (idx_t i = 0; i < null_str_count; i++) { + is_value_null = is_value_null || IsValueNull(null_str_ptr[i], value_ptr, size); + } + error = !is_value_null; } if (error) { - HandleOverLimitRows(); + // We error pointing to the current value error. + current_errors.push_back({CSVErrorType::TOO_MANY_COLUMNS, cur_col_id, last_position}); + cur_col_id++; } - } - if (ignore_current_row) { return; } + if (projecting_columns) { if (!projected_columns[cur_col_id]) { cur_col_id++; return; } } - if (size == null_str_size) { - if (((quoted && state_machine.options.allow_quoted_nulls) || !quoted)) { - if (IsValueNull(null_str_ptr, value_ptr, size)) { - bool empty = false; - if (chunk_col_id < state_machine.options.force_not_null.size()) { - empty = state_machine.options.force_not_null[chunk_col_id]; - } - if (empty) { - if (parse_types[chunk_col_id].first != LogicalTypeId::VARCHAR) { - // If it is not a varchar, empty values are not accepted, we must error. - cast_errors[chunk_col_id] = std::string(""); + for (idx_t i = 0; i < null_str_count; i++) { + if (size == null_str_size[i]) { + if (((quoted && state_machine.options.allow_quoted_nulls) || !quoted)) { + if (IsValueNull(null_str_ptr[i], value_ptr, size)) { + bool empty = false; + if (chunk_col_id < state_machine.options.force_not_null.size()) { + empty = state_machine.options.force_not_null[chunk_col_id]; } - static_cast(vector_ptr[chunk_col_id])[number_of_rows] = string_t(); - } else { - if (chunk_col_id == number_of_columns) { - // We check for a weird case, where we ignore an extra value, if it is a null value - return; + if (empty) { + if (parse_types[chunk_col_id].first != LogicalTypeId::VARCHAR) { + // If it is not a varchar, empty values are not accepted, we must error. + current_errors.push_back({CSVErrorType::CAST_ERROR, cur_col_id, last_position}); + } + static_cast(vector_ptr[chunk_col_id])[number_of_rows] = string_t(); + } else { + if (chunk_col_id == number_of_columns) { + // We check for a weird case, where we ignore an extra value, if it is a null value + return; + } + validity_mask[chunk_col_id]->SetInvalid(number_of_rows); } - validity_mask[chunk_col_id]->SetInvalid(number_of_rows); + cur_col_id++; + chunk_col_id++; + return; } - cur_col_id++; - chunk_col_id++; - return; } } } @@ -154092,16 +155254,16 @@ void StringValueResult::AddValueToVector(const char *value_ptr, const idx_t size break; } default: { - // By default we add a string + // By default, we add a string // We only evaluate if a string is utf8 valid, if it's actually a varchar if (parse_types[chunk_col_id].second && !Utf8Proc::IsValid(value_ptr, UnsafeNumericCast(size))) { - bool force_error = !state_machine.options.ignore_errors && sniffing; + bool force_error = !state_machine.options.ignore_errors.GetValue() && sniffing; // Invalid unicode, we must error - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); - auto csv_error = CSVError::InvalidUTF8(state_machine.options, lines_per_batch); - error_handler.Error(csv_error, force_error); + if (force_error) { + HandleUnicodeError(cur_col_id, last_position); + } // If we got here, we are ingoring errors, hence we must ignore this line. - ignore_current_row = true; + current_errors.push_back({CSVErrorType::INVALID_UNICODE, cur_col_id, last_position}); break; } if (allocate) { @@ -154117,7 +155279,12 @@ void StringValueResult::AddValueToVector(const char *value_ptr, const idx_t size } if (!success) { // We had a casting error, we push it here because we can only error when finishing the line read. - cast_errors[cur_col_id] = std::string(value_ptr, size); + std::ostringstream error; + // Casting Error Message + error << "Could not convert string \"" << std::string(value_ptr, size) << "\" to \'" + << LogicalTypeIdToString(parse_types[cur_col_id].first) << "\'"; + current_errors.push_back({CSVErrorType::CAST_ERROR, cur_col_id, last_position}); + current_errors.back().error_message = error.str(); } cur_col_id++; chunk_col_id++; @@ -154149,8 +155316,16 @@ void StringValueResult::Reset() { for (auto &v : validity_mask) { v->SetAllValid(result_size); } + // We keep a reference to the buffer from our current iteration if it already exists + shared_ptr cur_buffer; + if (buffer_handles.find(iterator.GetBufferIdx()) != buffer_handles.end()) { + cur_buffer = buffer_handles[iterator.GetBufferIdx()]; + } buffer_handles.clear(); - ignore_current_row = false; + if (cur_buffer) { + buffer_handles[cur_buffer->buffer_idx] = cur_buffer; + } + current_errors.clear(); } void StringValueResult::AddQuotedValue(StringValueResult &result, const idx_t buffer_pos) { @@ -154170,7 +155345,7 @@ void StringValueResult::AddQuotedValue(StringValueResult &result, const idx_t bu result.parse_chunk.data[result.chunk_col_id]); result.AddValueToVector(value.GetData(), value.GetSize()); } else { - if (buffer_pos < result.last_position + 2) { + if (buffer_pos < result.last_position.buffer_pos + 2) { // empty value auto value = string_t(); result.AddValueToVector(value.GetData(), value.GetSize()); @@ -154184,26 +155359,119 @@ void StringValueResult::AddQuotedValue(StringValueResult &result, const idx_t bu } void StringValueResult::AddValue(StringValueResult &result, const idx_t buffer_pos) { - if (result.last_position > buffer_pos) { + if (result.last_position.buffer_pos > buffer_pos) { return; } if (result.quoted) { StringValueResult::AddQuotedValue(result, buffer_pos); } else { - result.AddValueToVector(result.buffer_ptr + result.last_position, buffer_pos - result.last_position); + result.AddValueToVector(result.buffer_ptr + result.last_position.buffer_pos, + buffer_pos - result.last_position.buffer_pos); } - result.last_position = buffer_pos + 1; + result.last_position.buffer_pos = buffer_pos + 1; } -void StringValueResult::HandleOverLimitRows() { - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), number_of_rows + 1); - auto csv_error = CSVError::IncorrectColumnAmountError(state_machine.options, nullptr, number_of_columns, - cur_col_id + 1, lines_per_batch); - error_handler.Error(csv_error); - // If we get here we need to remove the last line - cur_col_id = 0; - chunk_col_id = 0; - ignore_current_row = true; +void StringValueResult::HandleUnicodeError(idx_t col_idx, LinePosition &error_position) { + bool first_nl; + auto borked_line = current_line_position.ReconstructCurrentLine(first_nl, buffer_handles); + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + if (current_line_position.begin == error_position) { + auto csv_error = CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + error_position.GetGlobalPosition(requested_size, first_nl)); + error_handler.Error(csv_error, true); + } else { + auto csv_error = CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + error_position.GetGlobalPosition(requested_size)); + error_handler.Error(csv_error, true); + } +} + +bool StringValueResult::HandleError() { + // Reconstruct CSV Line + for (auto &cur_error : current_errors) { + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + bool first_nl; + auto borked_line = current_line_position.ReconstructCurrentLine(first_nl, buffer_handles); + CSVError csv_error; + auto col_idx = cur_error.col_idx; + auto &line_pos = cur_error.error_position; + + switch (cur_error.type) { + case CSVErrorType::TOO_MANY_COLUMNS: + case CSVErrorType::TOO_FEW_COLUMNS: + if (current_line_position.begin == line_pos) { + csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl)); + } else { + csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size)); + } + break; + case CSVErrorType::INVALID_UNICODE: { + if (current_line_position.begin == line_pos) { + csv_error = + CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl)); + } else { + csv_error = + CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size)); + } + break; + } + case CSVErrorType::UNTERMINATED_QUOTES: + if (current_line_position.begin == line_pos) { + csv_error = CSVError::UnterminatedQuotesError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl)); + } else { + csv_error = CSVError::UnterminatedQuotesError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size)); + } + break; + case CSVErrorType::CAST_ERROR: + if (current_line_position.begin == line_pos) { + csv_error = CSVError::CastError( + state_machine.options, names[cur_error.col_idx], cur_error.error_message, cur_error.col_idx, + borked_line, lines_per_batch, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl), parse_types[cur_error.col_idx].first); + } else { + csv_error = CSVError::CastError( + state_machine.options, names[cur_error.col_idx], cur_error.error_message, cur_error.col_idx, + borked_line, lines_per_batch, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size), parse_types[cur_error.col_idx].first); + } + break; + case CSVErrorType::MAXIMUM_LINE_SIZE: + csv_error = CSVError::LineSizeError( + state_machine.options, cur_error.current_line_size, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl)); + break; + default: + throw InvalidInputException("CSV Error not allowed when inserting row"); + } + error_handler.Error(csv_error); + } + if (!current_errors.empty()) { + current_errors.clear(); + cur_col_id = 0; + chunk_col_id = 0; + return true; + } + return false; } void StringValueResult::QuotedNewLine(StringValueResult &result) { @@ -154212,55 +155480,72 @@ void StringValueResult::QuotedNewLine(StringValueResult &result) { void StringValueResult::NullPaddingQuotedNewlineCheck() { // We do some checks for null_padding correctness - if (state_machine.options.null_padding && iterator.IsBoundarySet() && quoted_new_line && iterator.done) { - // If we have null_padding set, we found a quoted new line, we are scanning the file in parallel and it's the - // last row of this thread. - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), number_of_rows + 1); + if (state_machine.options.null_padding && iterator.IsBoundarySet() && quoted_new_line) { + // If we have null_padding set, we found a quoted new line, we are scanning the file in parallel; We error. + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); auto csv_error = CSVError::NullPaddingFail(state_machine.options, lines_per_batch); error_handler.Error(csv_error); } } -bool StringValueResult::AddRowInternal() { - if (ignore_current_row) { - cur_col_id = 0; - chunk_col_id = 0; - // An error occurred on this row, we are ignoring it and resetting our control flag - ignore_current_row = false; - return false; - } - if (!cast_errors.empty()) { - // A wild casting error appears - // Recreate row for rejects-table - vector row; - if (!state_machine.options.rejects_table_name.empty()) { - for (idx_t col = 0; col < parse_chunk.ColumnCount(); col++) { - if (cast_errors.find(col) != cast_errors.end()) { - row.push_back(cast_errors[col]); - } else { - row.push_back(parse_chunk.data[col].GetValue(number_of_rows)); - } - } +//! Reconstructs the current line to be used in error messages +string FullLinePosition::ReconstructCurrentLine(bool &first_char_nl, + unordered_map> &buffer_handles) { + string result; + if (end.buffer_idx == begin.buffer_idx) { + if (buffer_handles.find(end.buffer_idx) == buffer_handles.end()) { + throw InternalException("CSV Buffer is not available to reconstruct CSV Line, please open an issue with " + "your query and dataset."); } - for (auto &cast_error : cast_errors) { - std::ostringstream error; - // Casting Error Message - error << "Could not convert string \"" << cast_error.second << "\" to \'" - << LogicalTypeIdToString(parse_types[cast_error.first].first) << "\'"; - auto error_string = error.str(); - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + auto buffer = buffer_handles[begin.buffer_idx]->Ptr(); + first_char_nl = buffer[begin.buffer_pos] == '\n' || buffer[begin.buffer_pos] == '\r'; + for (idx_t i = begin.buffer_pos + first_char_nl; i < end.buffer_pos; i++) { + result += buffer[i]; + } + } else { + if (buffer_handles.find(begin.buffer_idx) == buffer_handles.end() || + buffer_handles.find(end.buffer_idx) == buffer_handles.end()) { + throw InternalException("CSV Buffer is not available to reconstruct CSV Line, please open an issue with " + "your query and dataset."); + } + auto first_buffer = buffer_handles[begin.buffer_idx]->Ptr(); + auto first_buffer_size = buffer_handles[begin.buffer_idx]->actual_size; + auto second_buffer = buffer_handles[end.buffer_idx]->Ptr(); + first_char_nl = first_buffer[begin.buffer_pos] == '\n' || first_buffer[begin.buffer_pos] == '\r'; + for (idx_t i = begin.buffer_pos + first_char_nl; i < first_buffer_size; i++) { + result += first_buffer[i]; + } + for (idx_t i = 0; i < end.buffer_pos; i++) { + result += second_buffer[i]; + } + } + // sanitize borked line + std::vector char_array(result.begin(), result.end()); + char_array.push_back('\0'); // Null-terminate the character array + Utf8Proc::MakeValid(&char_array[0], char_array.size()); + result = {char_array.begin(), char_array.end() - 1}; + return result; +} - auto csv_error = - CSVError::CastError(state_machine.options, names[cast_error.first], error_string, cast_error.first, row, - lines_per_batch, parse_types[cast_error.first].first); - error_handler.Error(csv_error); +bool StringValueResult::AddRowInternal() { + LinePosition current_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, buffer_size}; + idx_t current_line_size = current_line_start - current_line_position.end; + if (store_line_size) { + error_handler.NewMaxLineSize(current_line_size); + } + current_line_position.begin = current_line_position.end; + current_line_position.end = current_line_start; + if (current_line_size > state_machine.options.maximum_line_size) { + current_errors.push_back({CSVErrorType::MAXIMUM_LINE_SIZE, 1, last_position}); + current_errors.back().current_line_size = current_line_size; + } + if (!current_errors.empty()) { + // We need to add a few columns error + for (idx_t col_idx = cur_col_id; col_idx < number_of_columns; col_idx++) { + current_errors.push_back({CSVErrorType::TOO_FEW_COLUMNS, col_idx - 1, last_position}); } - // If we got here it means we are ignoring errors, hence we need to signify to our result scanner to ignore this - // row - // Cleanup this line and continue - cast_errors.clear(); - cur_col_id = 0; - chunk_col_id = 0; + } + if (HandleError()) { return false; } NullPaddingQuotedNewlineCheck(); @@ -154291,14 +155576,27 @@ bool StringValueResult::AddRowInternal() { } } else { // If we are not null-padding this is an error - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), number_of_rows + 1); - auto csv_error = CSVError::IncorrectColumnAmountError(state_machine.options, nullptr, number_of_columns, - cur_col_id, lines_per_batch); - error_handler.Error(csv_error); + bool first_nl; + auto borked_line = current_line_position.ReconstructCurrentLine(first_nl, buffer_handles); + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + if (current_line_position.begin == last_position) { + auto csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, cur_col_id - 1, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + last_position.GetGlobalPosition(requested_size, first_nl)); + error_handler.Error(csv_error); + } else { + auto csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, cur_col_id - 1, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + last_position.GetGlobalPosition(requested_size)); + error_handler.Error(csv_error); + } // If we are here we ignore_errors, so we delete this line number_of_rows--; } } + line_positions_per_row[number_of_rows] = current_line_position; cur_col_id = 0; chunk_col_id = 0; number_of_rows++; @@ -154310,35 +155608,23 @@ bool StringValueResult::AddRowInternal() { } bool StringValueResult::AddRow(StringValueResult &result, const idx_t buffer_pos) { - if (result.last_position <= buffer_pos) { - LinePosition current_line_start = {result.iterator.pos.buffer_idx, result.iterator.pos.buffer_pos, - result.buffer_size}; - idx_t current_line_size = current_line_start - result.previous_line_start; - if (result.store_line_size) { - result.error_handler.NewMaxLineSize(current_line_size); - } - if (current_line_size > result.state_machine.options.maximum_line_size) { - LinesPerBoundary lines_per_batch(result.iterator.GetBoundaryIdx(), result.number_of_rows); - auto csv_error = CSVError::LineSizeError(result.state_machine.options, current_line_size, lines_per_batch); - result.error_handler.Error(csv_error); - } - result.pre_previous_line_start = result.previous_line_start; - result.previous_line_start = current_line_start; + if (result.last_position.buffer_pos <= buffer_pos) { // We add the value if (result.quoted) { StringValueResult::AddQuotedValue(result, buffer_pos); } else { - result.AddValueToVector(result.buffer_ptr + result.last_position, buffer_pos - result.last_position); + result.AddValueToVector(result.buffer_ptr + result.last_position.buffer_pos, + buffer_pos - result.last_position.buffer_pos); } if (result.state_machine.dialect_options.state_machine_options.new_line == NewLineIdentifier::CARRY_ON) { if (result.states.states[1] == CSVState::RECORD_SEPARATOR) { // Even though this is marked as a carry on, this is a hippie mixie - result.last_position = buffer_pos + 1; + result.last_position.buffer_pos = buffer_pos + 1; } else { - result.last_position = buffer_pos + 2; + result.last_position.buffer_pos = buffer_pos + 2; } } else { - result.last_position = buffer_pos + 1; + result.last_position.buffer_pos = buffer_pos + 1; } } @@ -154347,33 +155633,35 @@ bool StringValueResult::AddRow(StringValueResult &result, const idx_t buffer_pos } void StringValueResult::InvalidState(StringValueResult &result) { - // FIXME: How do we recover from an invalid state? Can we restart the state machine and jump to the next row? - LinesPerBoundary lines_per_batch(result.iterator.GetBoundaryIdx(), result.number_of_rows); - auto csv_error = CSVError::UnterminatedQuotesError(result.state_machine.options, - static_cast(result.vector_ptr[result.chunk_col_id]), - result.number_of_rows, result.cur_col_id, lines_per_batch); - result.error_handler.Error(csv_error); + bool force_error = !result.state_machine.options.ignore_errors.GetValue() && result.sniffing; + // Invalid unicode, we must error + if (force_error) { + result.HandleUnicodeError(result.cur_col_id, result.last_position); + } + result.current_errors.push_back({CSVErrorType::UNTERMINATED_QUOTES, result.cur_col_id, result.last_position}); } bool StringValueResult::EmptyLine(StringValueResult &result, const idx_t buffer_pos) { // We care about empty lines if this is a single column csv file - result.last_position = buffer_pos + 1; + result.last_position = {result.iterator.pos.buffer_idx, result.iterator.pos.buffer_pos + 1, result.buffer_size}; if (result.states.IsCarriageReturn() && result.state_machine.dialect_options.state_machine_options.new_line == NewLineIdentifier::CARRY_ON) { - result.last_position++; + result.last_position.buffer_pos++; } if (result.number_of_columns == 1) { - if (result.null_str_size == 0) { - bool empty = false; - if (!result.state_machine.options.force_not_null.empty()) { - empty = result.state_machine.options.force_not_null[0]; - } - if (empty) { - static_cast(result.vector_ptr[0])[result.number_of_rows] = string_t(); - } else { - result.validity_mask[0]->SetInvalid(result.number_of_rows); + for (idx_t i = 0; i < result.null_str_count; i++) { + if (result.null_str_size[i] == 0) { + bool empty = false; + if (!result.state_machine.options.force_not_null.empty()) { + empty = result.state_machine.options.force_not_null[0]; + } + if (empty) { + static_cast(result.vector_ptr[0])[result.number_of_rows] = string_t(); + } else { + result.validity_mask[0]->SetInvalid(result.number_of_rows); + } + result.number_of_rows++; } - result.number_of_rows++; } if (result.number_of_rows >= result.result_size) { // We have a full chunk @@ -154517,7 +155805,7 @@ void StringValueScanner::Flush(DataChunk &insert_chunk) { { vector row; - if (state_machine->options.ignore_errors) { + if (state_machine->options.ignore_errors.GetValue()) { for (idx_t col = 0; col < parse_chunk.ColumnCount(); col++) { row.push_back(parse_chunk.GetValue(col, line_error)); } @@ -154525,13 +155813,19 @@ void StringValueScanner::Flush(DataChunk &insert_chunk) { LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read - parse_chunk.size() + line_error); - auto csv_error = - CSVError::CastError(state_machine->options, csv_file_scan->names[col_idx], error_message, col_idx, - row, lines_per_batch, result_vector.GetType().id()); + bool first_nl; + auto borked_line = + result.line_positions_per_row[line_error].ReconstructCurrentLine(first_nl, result.buffer_handles); + auto csv_error = CSVError::CastError( + state_machine->options, csv_file_scan->names[col_idx], error_message, col_idx, borked_line, + lines_per_batch, + result.line_positions_per_row[line_error].begin.GetGlobalPosition(result.result_size, first_nl), -1, + result_vector.GetType().id()); + error_handler->Error(csv_error); } borked_lines.insert(line_error++); - D_ASSERT(state_machine->options.ignore_errors); + D_ASSERT(state_machine->options.ignore_errors.GetValue()); // We are ignoring errors. We must continue but ignoring borked rows for (; line_error < parse_chunk.size(); line_error++) { if (!inserted_column_data.validity.RowIsValid(line_error) && @@ -154543,10 +155837,14 @@ void StringValueScanner::Flush(DataChunk &insert_chunk) { } LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read - parse_chunk.size() + line_error); - auto csv_error = - CSVError::CastError(state_machine->options, csv_file_scan->names[col_idx], error_message, - col_idx, row, lines_per_batch, result_vector.GetType().id()); - + bool first_nl; + auto borked_line = result.line_positions_per_row[line_error].ReconstructCurrentLine( + first_nl, result.buffer_handles); + auto csv_error = CSVError::CastError( + state_machine->options, csv_file_scan->names[col_idx], error_message, col_idx, borked_line, + lines_per_batch, + result.line_positions_per_row[line_error].begin.GetGlobalPosition(result.result_size, first_nl), + -1, result_vector.GetType().id()); error_handler->Error(csv_error); } } @@ -154573,10 +155871,10 @@ void StringValueScanner::Initialize() { !state_machine->options.dialect_options.skip_rows.IsSetByUser())) { SetStart(); } - result.last_position = iterator.pos.buffer_pos; - result.previous_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, cur_buffer_handle->actual_size}; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, cur_buffer_handle->actual_size}; + result.current_line_position.begin = result.last_position; - result.pre_previous_line_start = result.previous_line_start; + result.current_line_position.end = result.current_line_position.begin; } void StringValueScanner::ProcessExtraRow() { @@ -154591,14 +155889,14 @@ void StringValueScanner::ProcessExtraRow() { return; case CSVState::RECORD_SEPARATOR: if (states.states[0] == CSVState::RECORD_SEPARATOR) { - lines_read++; result.EmptyLine(result, iterator.pos.buffer_pos); iterator.pos.buffer_pos++; + lines_read++; return; } else if (states.states[0] != CSVState::CARRIAGE_RETURN) { - lines_read++; result.AddRow(result, iterator.pos.buffer_pos); iterator.pos.buffer_pos++; + lines_read++; return; } lines_read++; @@ -154692,12 +155990,12 @@ void StringValueScanner::ProcessOverbufferValue() { states.Initialize(); string overbuffer_string; auto previous_buffer = previous_buffer_handle->Ptr(); - if (result.last_position == previous_buffer_handle->actual_size) { - state_machine->Transition(states, previous_buffer[result.last_position - 1]); + if (result.last_position.buffer_pos == previous_buffer_handle->actual_size) { + state_machine->Transition(states, previous_buffer[result.last_position.buffer_pos - 1]); } idx_t j = 0; result.quoted = false; - for (idx_t i = result.last_position; i < previous_buffer_handle->actual_size; i++) { + for (idx_t i = result.last_position.buffer_pos; i < previous_buffer_handle->actual_size; i++) { state_machine->Transition(states, previous_buffer[i]); if (states.EmptyLine() || states.IsCurrentNewRow()) { continue; @@ -154713,6 +156011,9 @@ void StringValueScanner::ProcessOverbufferValue() { if (states.IsEscaped()) { result.escaped = true; } + if (states.IsInvalid()) { + result.InvalidState(result); + } j++; } if (overbuffer_string.empty() && @@ -154742,6 +156043,9 @@ void StringValueScanner::ProcessOverbufferValue() { if (states.IsEscaped()) { result.escaped = true; } + if (states.IsInvalid()) { + result.InvalidState(result); + } j++; } bool skip_value = false; @@ -154787,9 +156091,9 @@ void StringValueScanner::ProcessOverbufferValue() { } if (states.IsCarriageReturn() && state_machine->dialect_options.state_machine_options.new_line == NewLineIdentifier::CARRY_ON) { - result.last_position = ++iterator.pos.buffer_pos + 1; + result.last_position = {iterator.pos.buffer_idx, ++iterator.pos.buffer_pos + 1, result.buffer_size}; } else { - result.last_position = ++iterator.pos.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, ++iterator.pos.buffer_pos, result.buffer_size}; } // Be sure to reset the quoted and escaped variables result.quoted = false; @@ -154800,7 +156104,6 @@ bool StringValueScanner::MoveToNextBuffer() { if (iterator.pos.buffer_pos >= cur_buffer_handle->actual_size) { previous_buffer_handle = cur_buffer_handle; cur_buffer_handle = buffer_manager->GetBuffer(++iterator.pos.buffer_idx); - result.buffer_handles.push_back(cur_buffer_handle); if (!cur_buffer_handle) { iterator.pos.buffer_idx--; buffer_handle_ptr = nullptr; @@ -154823,6 +156126,10 @@ bool StringValueScanner::MoveToNextBuffer() { lines_read++; } else if (states.IsQuotedCurrent()) { // Unterminated quote + LinePosition current_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, + result.buffer_size}; + result.current_line_position.begin = result.current_line_position.end; + result.current_line_position.end = current_line_start; result.InvalidState(result); } else { result.AddRow(result, previous_buffer_handle->actual_size); @@ -154830,6 +156137,8 @@ bool StringValueScanner::MoveToNextBuffer() { } return false; } + result.buffer_handles[cur_buffer_handle->buffer_idx] = cur_buffer_handle; + iterator.pos.buffer_pos = 0; buffer_handle_ptr = cur_buffer_handle->Ptr(); // Handle overbuffer value @@ -154967,24 +156276,43 @@ void StringValueScanner::SetStart() { scan_finder->previous_buffer_handle->is_last_buffer) { iterator.pos.buffer_idx = scan_finder->iterator.pos.buffer_idx; iterator.pos.buffer_pos = scan_finder->iterator.pos.buffer_pos; - result.last_position = iterator.pos.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, result.buffer_size}; iterator.done = scan_finder->iterator.done; return; } } - if (iterator.pos.buffer_pos == cur_buffer_handle->actual_size) { + if (iterator.pos.buffer_pos == cur_buffer_handle->actual_size || + scan_finder->iterator.GetBufferIdx() >= iterator.GetBufferIdx()) { + // Propagate any errors + if (!scan_finder->error_handler->errors.empty() && state_machine->options.ignore_errors.GetValue()) { + for (auto &error_vector : scan_finder->error_handler->errors) { + for (auto &error : error_vector.second) { + error_handler->Error(error); + } + } + result.lines_read++; + } // If things go terribly wrong, we never loop indefinetly. iterator.pos.buffer_idx = scan_finder->iterator.pos.buffer_idx; iterator.pos.buffer_pos = scan_finder->iterator.pos.buffer_pos; - result.last_position = iterator.pos.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, result.buffer_size}; iterator.done = scan_finder->iterator.done; return; } } } while (!line_found); - iterator.pos.buffer_idx = scan_finder->result.pre_previous_line_start.buffer_idx; - iterator.pos.buffer_pos = scan_finder->result.pre_previous_line_start.buffer_pos; - result.last_position = iterator.pos.buffer_pos; + // Propagate any errors + if (!scan_finder->error_handler->errors.empty() && state_machine->options.ignore_errors.GetValue()) { + for (auto &error_vector : scan_finder->error_handler->errors) { + for (auto &error : error_vector.second) { + error_handler->Error(error); + } + } + result.lines_read++; + } + iterator.pos.buffer_idx = scan_finder->result.current_line_position.begin.buffer_idx; + iterator.pos.buffer_pos = scan_finder->result.current_line_position.begin.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, result.buffer_size}; } void StringValueScanner::FinalizeChunkProcess() { @@ -155001,7 +156329,12 @@ void StringValueScanner::FinalizeChunkProcess() { // If we are not done we have two options. // 1) If a boundary is set. if (iterator.IsBoundarySet()) { - iterator.done = true; + for (auto &cur_error : result.current_errors) { + if (!(cur_error == CSVErrorType::UNTERMINATED_QUOTES)) { + iterator.done = true; + } + } + // We read until the next line or until we have nothing else to read. // Move to next buffer if (!cur_buffer_handle) { @@ -155017,6 +156350,14 @@ void StringValueScanner::FinalizeChunkProcess() { if (cur_buffer_handle->is_last_buffer && iterator.pos.buffer_pos >= cur_buffer_handle->actual_size) { MoveToNextBuffer(); } + } else { + result.HandleError(); + } + if (!iterator.done) { + if (iterator.pos.buffer_pos >= iterator.GetEndPos() || iterator.pos.buffer_idx > iterator.GetBufferIdx() || + FinishedFile()) { + iterator.done = true; + } } } else { // 2) If a boundary is not set @@ -155056,7 +156397,7 @@ CSVSniffer::CSVSniffer(CSVReaderOptions &options_p, shared_ptr } // Initialize max columns found to either 0 or however many were set max_columns_found = set_columns.Size(); - error_handler = make_shared(options.ignore_errors); + error_handler = make_shared(options.ignore_errors.GetValue()); detection_error_handler = make_shared(true); } @@ -155126,6 +156467,7 @@ void CSVSniffer::SetResultOptions() { } SnifferResult CSVSniffer::SniffCSV(bool force_match) { + buffer_manager->sniffing = true; // 1. Dialect Detection DetectDialect(); // 2. Type Detection @@ -155136,7 +156478,15 @@ SnifferResult CSVSniffer::SniffCSV(bool force_match) { DetectHeader(); // 5. Type Replacement ReplaceTypes(); - if (!best_candidate->error_handler->errors.empty() && !options.ignore_errors) { + + // We reset the buffer for compressed files + // This is done because we can't easily seek on compressed files, if a buffer goes out of scope we must read from + // the start + if (!buffer_manager->file_handle->uncompressed) { + buffer_manager->ResetBufferManager(); + } + buffer_manager->sniffing = false; + if (!best_candidate->error_handler->errors.empty() && !options.ignore_errors.GetValue()) { for (auto &error_vector : best_candidate->error_handler->errors) { for (auto &error : error_vector.second) { if (error.type == CSVErrorType::MAXIMUM_LINE_SIZE) { @@ -155306,18 +156656,19 @@ void CSVSniffer::AnalyzeDialectCandidate(unique_ptr scanner, if (sniffed_column_counts.result_position > rows_read) { rows_read = sniffed_column_counts.result_position; } - if (set_columns.IsCandidateUnacceptable(num_cols, options.null_padding, options.ignore_errors, + if (set_columns.IsCandidateUnacceptable(num_cols, options.null_padding, options.ignore_errors.GetValue(), sniffed_column_counts.last_value_always_empty)) { // Not acceptable return; } for (idx_t row = start_row; row < sniffed_column_counts.result_position; row++) { - if (set_columns.IsCandidateUnacceptable(sniffed_column_counts[row], options.null_padding, options.ignore_errors, + if (set_columns.IsCandidateUnacceptable(sniffed_column_counts[row], options.null_padding, + options.ignore_errors.GetValue(), sniffed_column_counts.last_value_always_empty)) { // Not acceptable return; } - if (sniffed_column_counts[row] == num_cols || options.ignore_errors) { + if (sniffed_column_counts[row] == num_cols || (options.ignore_errors.GetValue() && !options.null_padding)) { consistent_rows++; } else if (num_cols < sniffed_column_counts[row] && !options.dialect_options.skip_rows.IsSetByUser() && (!set_columns.IsSet() || options.null_padding)) { @@ -155381,10 +156732,19 @@ void CSVSniffer::AnalyzeDialectCandidate(unique_ptr scanner, } auto &sniffing_state_machine = scanner->GetStateMachine(); + if (!candidates.empty() && candidates.front()->ever_quoted && !scanner->ever_quoted) { + // Give preference to quoted boys. + return; + } + best_consistent_rows = consistent_rows; max_columns_found = num_cols; prev_padding_count = padding_count; - sniffing_state_machine.dialect_options.skip_rows = start_row; + if (!options.null_padding && !options.ignore_errors.GetValue()) { + sniffing_state_machine.dialect_options.skip_rows = start_row; + } else { + sniffing_state_machine.dialect_options.skip_rows = options.dialect_options.skip_rows.GetValue(); + } candidates.clear(); sniffing_state_machine.dialect_options.num_cols = num_cols; candidates.emplace_back(std::move(scanner)); @@ -155405,7 +156765,11 @@ void CSVSniffer::AnalyzeDialectCandidate(unique_ptr scanner, } } if (!same_quote_is_candidate) { - sniffing_state_machine.dialect_options.skip_rows = start_row; + if (!options.null_padding && !options.ignore_errors.GetValue()) { + sniffing_state_machine.dialect_options.skip_rows = start_row; + } else { + sniffing_state_machine.dialect_options.skip_rows = options.dialect_options.skip_rows.GetValue(); + } sniffing_state_machine.dialect_options.num_cols = num_cols; candidates.emplace_back(std::move(scanner)); } @@ -155417,10 +156781,11 @@ bool CSVSniffer::RefineCandidateNextChunk(ColumnCountScanner &candidate) { for (idx_t i = 0; i < sniffed_column_counts.result_position; i++) { if (set_columns.IsSet()) { return !set_columns.IsCandidateUnacceptable(sniffed_column_counts[i], options.null_padding, - options.ignore_errors, + options.ignore_errors.GetValue(), sniffed_column_counts.last_value_always_empty); } else { - if (max_columns_found != sniffed_column_counts[i] && (!options.null_padding && !options.ignore_errors)) { + if (max_columns_found != sniffed_column_counts[i] && + (!options.null_padding && !options.ignore_errors.GetValue())) { return false; } } @@ -156079,7 +157444,7 @@ void CSVSniffer::DetectTypes() { // it's good if the dialect creates more non-varchar columns, but only if we sacrifice < 30% of // best_num_cols. if (varchar_cols < min_varchar_cols && info_sql_types_candidates.size() > (max_columns_found * 0.7) && - (!options.ignore_errors || candidate->error_handler->errors.size() < min_errors)) { + (!options.ignore_errors.GetValue() || candidate->error_handler->errors.size() < min_errors)) { min_errors = candidate->error_handler->errors.size(); best_header_row.clear(); // we have a new best_options candidate @@ -156284,7 +157649,6 @@ void CSVStateMachineCache::Insert(const CSVStateMachineOptions &state_machine_op InitializeTransitionArray(transition_array, cur_state, CSVState::QUOTED); break; case CSVState::UNQUOTED: - case CSVState::INVALID: case CSVState::ESCAPE: InitializeTransitionArray(transition_array, cur_state, CSVState::INVALID); break; @@ -156301,15 +157665,16 @@ void CSVStateMachineCache::Insert(const CSVStateMachineOptions &state_machine_op auto new_line_id = state_machine_options.new_line.GetValue(); // Now set values depending on configuration - // 1) Standard State - transition_array[delimiter][static_cast(static_cast(CSVState::STANDARD))] = CSVState::DELIMITER; - transition_array[static_cast('\n')][static_cast(CSVState::STANDARD)] = CSVState::RECORD_SEPARATOR; - if (new_line_id == NewLineIdentifier::CARRY_ON) { - transition_array[static_cast('\r')][static_cast(CSVState::STANDARD)] = - CSVState::CARRIAGE_RETURN; - } else { - transition_array[static_cast('\r')][static_cast(CSVState::STANDARD)] = - CSVState::RECORD_SEPARATOR; + // 1) Standard/Invalid State + vector std_inv {static_cast(CSVState::STANDARD), static_cast(CSVState::INVALID)}; + for (auto &state : std_inv) { + transition_array[delimiter][state] = CSVState::DELIMITER; + transition_array[static_cast('\n')][state] = CSVState::RECORD_SEPARATOR; + if (new_line_id == NewLineIdentifier::CARRY_ON) { + transition_array[static_cast('\r')][state] = CSVState::CARRIAGE_RETURN; + } else { + transition_array[static_cast('\r')][state] = CSVState::RECORD_SEPARATOR; + } } // 2) Field Separator State transition_array[delimiter][static_cast(CSVState::DELIMITER)] = CSVState::DELIMITER; @@ -156499,7 +157864,7 @@ CSVFileScan::CSVFileScan(ClientContext &context, shared_ptr bu vector &file_schema) : file_path(options_p.file_path), file_idx(0), buffer_manager(std::move(buffer_manager_p)), state_machine(std::move(state_machine_p)), file_size(buffer_manager->file_handle->FileSize()), - error_handler(make_shared(options_p.ignore_errors)), + error_handler(make_shared(options_p.ignore_errors.GetValue())), on_disk_file(buffer_manager->file_handle->OnDiskFile()), options(options_p) { if (bind_data.initial_reader.get()) { auto &union_reader = *bind_data.initial_reader; @@ -156532,7 +157897,7 @@ CSVFileScan::CSVFileScan(ClientContext &context, const string &file_path_p, cons const idx_t file_idx_p, const ReadCSVData &bind_data, const vector &column_ids, const vector &file_schema) : file_path(file_path_p), file_idx(file_idx_p), - error_handler(make_shared(options_p.ignore_errors)), options(options_p) { + error_handler(make_shared(options_p.ignore_errors.GetValue())), options(options_p) { if (file_idx < bind_data.union_readers.size()) { // we are doing UNION BY NAME - fetch the options from the union reader for this file optional_ptr union_reader_ptr; @@ -156618,8 +157983,8 @@ CSVFileScan::CSVFileScan(ClientContext &context, const string &file_path_p, cons } CSVFileScan::CSVFileScan(ClientContext &context, const string &file_name, CSVReaderOptions &options_p) - : file_path(file_name), file_idx(0), error_handler(make_shared(options_p.ignore_errors)), - options(options_p) { + : file_path(file_name), file_idx(0), + error_handler(make_shared(options_p.ignore_errors.GetValue())), options(options_p) { buffer_manager = make_shared(context, options, file_path, file_idx); // Initialize On Disk and Size of file on_disk_file = buffer_manager->file_handle->OnDiskFile(); @@ -156661,20 +158026,6 @@ void CSVFileScan::InitializeFileNamesTypes() { projection_ids.emplace_back(result_idx, i); } - if (!projected_columns.empty()) { - // We might have to add recovery rejects column ids - for (idx_t i = 0; i < options.rejects_recovery_column_ids.size(); i++) { - idx_t col_id = options.rejects_recovery_column_ids[i]; - if (projected_columns.find(col_id) == projected_columns.end()) { - // We have to insert this column in our projection - projected_columns.insert(col_id); - file_types.emplace_back(LogicalType::VARCHAR); - projected_columns.insert(col_id); - projection_ids.emplace_back(col_id, col_id); - } - } - } - if (reader_data.column_ids.empty()) { file_types = types; } @@ -156711,6 +158062,11 @@ void CSVFileScan::InitializeProjection() { reader_data.column_mapping.push_back(i); } } + +void CSVFileScan::Finish() { + buffer_manager.reset(); +} + } // namespace duckdb //===----------------------------------------------------------------------===// // DuckDB @@ -156744,7 +158100,7 @@ struct CSVGlobalState : public GlobalTableFunctionState { //! Generates a CSV Scanner, with information regarding the piece of buffer it should be read. //! In case it returns a nullptr it means we are done reading these files. - unique_ptr Next(); + unique_ptr Next(optional_ptr previous_scanner); void FillRejectsTable(); @@ -156789,6 +158145,8 @@ struct CSVGlobalState : public GlobalTableFunctionState { atomic last_file_idx; shared_ptr current_buffer_in_use; + + unordered_map threads_per_file; }; } // namespace duckdb @@ -156812,19 +158170,24 @@ class ClientContext; class CSVRejectsTable : public ObjectCacheEntry { public: - CSVRejectsTable(string name) : name(name), count(0) { + CSVRejectsTable(string rejects_scan, string rejects_error) + : count(0), scan_table(std::move(rejects_scan)), errors_table(std::move(rejects_error)) { } - ~CSVRejectsTable() override = default; mutex write_lock; string name; idx_t count; + string scan_table; + string errors_table; - static shared_ptr GetOrCreate(ClientContext &context, const string &name); + static shared_ptr GetOrCreate(ClientContext &context, const string &rejects_scan, + const string &rejects_error); void InitializeTable(ClientContext &context, const ReadCSVData &options); - TableCatalogEntry &GetTable(ClientContext &context); + TableCatalogEntry &GetErrorsTable(ClientContext &context); + TableCatalogEntry &GetScansTable(ClientContext &context); + + idx_t GetCurrentFileIndex(idx_t query_id); -public: static string ObjectType() { return "csv_rejects_table_cache"; } @@ -156832,6 +158195,12 @@ class CSVRejectsTable : public ObjectCacheEntry { string GetObjectType() override { return ObjectType(); } + +private: + //! Current File Index being used in the query + idx_t current_file_idx = 0; + //! Current Query ID being executed + idx_t current_query_id = 0; }; } // namespace duckdb @@ -156857,7 +158226,7 @@ CSVGlobalState::CSVGlobalState(ClientContext &context_p, const shared_ptr(context, files[0], options, 0, bind_data, column_ids, file_schema)); }; - //! There are situations where we only support single threaded scanning + // There are situations where we only support single threaded scanning bool many_csv_files = files.size() > 1 && files.size() > system_threads * 2; single_threaded = many_csv_files || !options.parallel; last_file_idx = 0; @@ -156876,20 +158245,20 @@ double CSVGlobalState::GetProgress(const ReadCSVData &bind_data_p) const { lock_guard parallel_lock(main_mutex); idx_t total_files = bind_data.files.size(); // get the progress WITHIN the current file - double progress; + double percentage = 0; if (file_scans.back()->file_size == 0) { - progress = 1.0; + percentage = 1.0; } else { // for compressed files, readed bytes may greater than files size. - progress = std::min(1.0, double(file_scans.back()->bytes_read) / double(file_scans.back()->file_size)); + for (auto &file : file_scans) { + percentage += + (double(1) / double(total_files)) * std::min(1.0, double(file->bytes_read) / double(file->file_size)); + } } - // now get the total percentage of files read - double percentage = double(current_boundary.GetFileIdx()) / total_files; - percentage += (double(1) / double(total_files)) * progress; return percentage * 100; } -unique_ptr CSVGlobalState::Next() { +unique_ptr CSVGlobalState::Next(optional_ptr previous_scanner) { if (single_threaded) { idx_t cur_idx = last_file_idx++; if (cur_idx >= bind_data.files.size()) { @@ -156899,8 +158268,16 @@ unique_ptr CSVGlobalState::Next() { if (cur_idx == 0) { current_file = file_scans.back(); } else { - current_file = make_shared(context, bind_data.files[cur_idx], bind_data.options, cur_idx, - bind_data, column_ids, file_schema); + lock_guard parallel_lock(main_mutex); + file_scans.emplace_back(make_shared(context, bind_data.files[cur_idx], bind_data.options, + cur_idx, bind_data, column_ids, file_schema)); + current_file = file_scans.back(); + } + if (previous_scanner) { + lock_guard parallel_lock(main_mutex); + previous_scanner->buffer_tracker.reset(); + current_buffer_in_use.reset(); + previous_scanner->csv_file_scan->Finish(); } auto csv_scanner = make_uniq(scanner_idx++, current_file->buffer_manager, current_file->state_machine, @@ -156920,7 +158297,14 @@ unique_ptr CSVGlobalState::Next() { auto csv_scanner = make_uniq(scanner_idx++, current_file.buffer_manager, current_file.state_machine, current_file.error_handler, file_scans.back(), false, current_boundary); - + threads_per_file[csv_scanner->csv_file_scan->file_idx]++; + if (previous_scanner) { + threads_per_file[previous_scanner->csv_file_scan->file_idx]--; + if (threads_per_file[previous_scanner->csv_file_scan->file_idx] == 0) { + previous_scanner->buffer_tracker.reset(); + previous_scanner->csv_file_scan->Finish(); + } + } csv_scanner->buffer_tracker = current_buffer_in_use; // We then produce the next boundary @@ -156963,6 +158347,9 @@ void CSVGlobalState::DecrementThread() { D_ASSERT(running_threads > 0); running_threads--; if (running_threads == 0) { + for (auto &file : file_scans) { + file->error_handler->ErrorIfNeeded(); + } FillRejectsTable(); if (context.client_data->debug_set_max_line_length) { context.client_data->debug_max_line_length = file_scans[0]->error_handler->GetMaxLineLength(); @@ -156970,24 +158357,119 @@ void CSVGlobalState::DecrementThread() { } } +bool IsCSVErrorAcceptedReject(CSVErrorType type) { + switch (type) { + case CSVErrorType::CAST_ERROR: + case CSVErrorType::TOO_MANY_COLUMNS: + case CSVErrorType::TOO_FEW_COLUMNS: + case CSVErrorType::MAXIMUM_LINE_SIZE: + case CSVErrorType::UNTERMINATED_QUOTES: + case CSVErrorType::INVALID_UNICODE: + return true; + default: + return false; + } +} + +string CSVErrorTypeToEnum(CSVErrorType type) { + switch (type) { + case CSVErrorType::CAST_ERROR: + return "CAST"; + case CSVErrorType::TOO_FEW_COLUMNS: + return "MISSING COLUMNS"; + case CSVErrorType::TOO_MANY_COLUMNS: + return "TOO MANY COLUMNS"; + case CSVErrorType::MAXIMUM_LINE_SIZE: + return "LINE SIZE OVER MAXIMUM"; + case CSVErrorType::UNTERMINATED_QUOTES: + return "UNQUOTED VALUE"; + case CSVErrorType::INVALID_UNICODE: + return "INVALID UNICODE"; + default: + throw InternalException("CSV Error is not valid to be stored in a Rejects Table"); + } +} + +void FillScanErrorTable(InternalAppender &scan_appender, idx_t scan_idx, idx_t file_idx, CSVFileScan &file) { + CSVReaderOptions &options = file.options; + // Add the row to the rejects table + scan_appender.BeginRow(); + // 1. Scan Idx + scan_appender.Append(scan_idx); + // 2. File Idx + scan_appender.Append(file_idx); + // 3. File Path + scan_appender.Append(string_t(file.file_path)); + // 4. Delimiter + scan_appender.Append(string_t(options.dialect_options.state_machine_options.delimiter.FormatValue())); + // 5. Quote + scan_appender.Append(string_t(options.dialect_options.state_machine_options.quote.FormatValue())); + // 6. Escape + scan_appender.Append(string_t(options.dialect_options.state_machine_options.escape.FormatValue())); + // 7. NewLine Delimiter + scan_appender.Append(string_t(options.NewLineIdentifierToString())); + // 8. Skip Rows + scan_appender.Append(Value::UINTEGER(NumericCast(options.dialect_options.skip_rows.GetValue()))); + // 9. Has Header + scan_appender.Append(Value::BOOLEAN(options.dialect_options.header.GetValue())); + // 10. List> {'col1': 'INTEGER', 'col2': 'VARCHAR'} + std::ostringstream columns; + columns << "{"; + for (idx_t i = 0; i < file.types.size(); i++) { + columns << "'" << file.names[i] << "': '" << file.types[i].ToString() << "'"; + if (i != file.types.size() - 1) { + columns << ","; + } + } + columns << "}"; + scan_appender.Append(string_t(columns.str())); + // 11. Date Format + auto date_format = options.dialect_options.date_format[LogicalType::DATE].GetValue(); + if (!date_format.Empty()) { + scan_appender.Append(string_t(date_format.format_specifier)); + } else { + scan_appender.Append(Value()); + } + + // 12. Timestamp Format + auto timestamp_format = options.dialect_options.date_format[LogicalType::TIMESTAMP].GetValue(); + if (!timestamp_format.Empty()) { + scan_appender.Append(string_t(timestamp_format.format_specifier)); + } else { + scan_appender.Append(Value()); + } + + // 13. The Extra User Arguments + if (options.user_defined_parameters.empty()) { + scan_appender.Append(Value()); + } else { + scan_appender.Append(string_t(options.user_defined_parameters)); + } + // Finish the row to the rejects table + scan_appender.EndRow(); +} + void CSVGlobalState::FillRejectsTable() { auto &options = bind_data.options; - if (!options.rejects_table_name.empty()) { + if (options.store_rejects.GetValue()) { auto limit = options.rejects_limit; - - auto rejects = CSVRejectsTable::GetOrCreate(context, options.rejects_table_name); + auto rejects = CSVRejectsTable::GetOrCreate(context, options.rejects_scan_name.GetValue(), + options.rejects_table_name.GetValue()); lock_guard lock(rejects->write_lock); - auto &table = rejects->GetTable(context); - InternalAppender appender(context, table); - + auto &errors_table = rejects->GetErrorsTable(context); + auto &scans_table = rejects->GetScansTable(context); + InternalAppender errors_appender(context, errors_table); + InternalAppender scans_appender(context, scans_table); + idx_t scan_idx = context.transaction.GetActiveQuery(); for (auto &file : file_scans) { + idx_t file_idx = rejects->GetCurrentFileIndex(scan_idx); auto file_name = file->file_path; auto &errors = file->error_handler->errors; + // We first insert the file into the file scans table for (auto &error_vector : errors) { for (auto &error : error_vector.second) { - if (error.type != CSVErrorType::CAST_ERROR) { - // For now we only will use it for casting errors + if (!IsCSVErrorAcceptedReject(error.type)) { continue; } // short circuit if we already have too many rejects @@ -156998,46 +158480,68 @@ void CSVGlobalState::FillRejectsTable() { rejects->count++; auto row_line = file->error_handler->GetLine(error.error_info); auto col_idx = error.column_idx; - auto col_name = bind_data.return_names[col_idx]; // Add the row to the rejects table - appender.BeginRow(); - appender.Append(string_t(file_name)); - appender.Append(row_line); - appender.Append(col_idx); - appender.Append(string_t("\"" + col_name + "\"")); - appender.Append(error.row[col_idx]); - - if (!options.rejects_recovery_columns.empty()) { - child_list_t recovery_key; - for (auto &key_idx : options.rejects_recovery_column_ids) { - // Figure out if the recovery key is valid. - // If not, error out for real. - auto &value = error.row[key_idx]; - if (value.IsNull()) { - throw InvalidInputException("%s at line %llu in column %s. Parser options:\n%s ", - "Could not parse recovery column", row_line, col_name, - options.ToString()); - } - recovery_key.emplace_back(bind_data.return_names[key_idx], value); - } - appender.Append(Value::STRUCT(recovery_key)); + errors_appender.BeginRow(); + // 1. Scan Id + errors_appender.Append(scan_idx); + // 2. File Id + errors_appender.Append(file_idx); + // 3. Row Line + errors_appender.Append(row_line); + // 4. Byte Position of the row error + errors_appender.Append(error.row_byte_position + 1); + // 5. Byte Position where error occurred + if (error.byte_position == -1) { + // This means this error comes from a flush, and we don't support this yet, so we give it + // a null + errors_appender.Append(Value()); + } else { + errors_appender.Append(error.byte_position + 1); + } + // 6. Column Index + if (error.type == CSVErrorType::MAXIMUM_LINE_SIZE) { + errors_appender.Append(Value()); + } else { + errors_appender.Append(col_idx + 1); + } + // 7. Column Name (If Applicable) + switch (error.type) { + case CSVErrorType::TOO_MANY_COLUMNS: + case CSVErrorType::MAXIMUM_LINE_SIZE: + errors_appender.Append(Value()); + break; + case CSVErrorType::TOO_FEW_COLUMNS: + D_ASSERT(bind_data.return_names.size() > col_idx + 1); + errors_appender.Append(string_t(bind_data.return_names[col_idx + 1])); + break; + default: + errors_appender.Append(string_t(bind_data.return_names[col_idx])); } - auto row_error_msg = - StringUtil::Format("Could not convert string '%s' to '%s'", error.row[col_idx].ToString(), - file->types[col_idx].ToString()); - appender.Append(string_t(row_error_msg)); - appender.EndRow(); + // 8. Error Type + errors_appender.Append(string_t(CSVErrorTypeToEnum(error.type))); + // 9. Original CSV Line + errors_appender.Append(string_t(error.csv_row)); + // 10. Full Error Message + errors_appender.Append(string_t(error.error_message)); + errors_appender.EndRow(); } - appender.Close(); } } + if (rejects->count != 0) { + rejects->count = 0; + FillScanErrorTable(scans_appender, scan_idx, file_idx, *file); + } } + errors_appender.Close(); + scans_appender.Close(); } } } // namespace duckdb + + #include namespace duckdb { @@ -157054,9 +158558,17 @@ CSVErrorHandler::CSVErrorHandler(bool ignore_errors_p) : ignore_errors(ignore_er void CSVErrorHandler::ThrowError(CSVError csv_error) { std::ostringstream error; if (PrintLineNumber(csv_error)) { - error << "CSV Error on Line: " << GetLine(csv_error.error_info) << std::endl; + error << "CSV Error on Line: " << GetLine(csv_error.error_info) << '\n'; + if (!csv_error.csv_row.empty()) { + error << "Original Line: " << csv_error.csv_row << '\n'; + } + } + if (csv_error.full_error_message.empty()) { + error << csv_error.error_message; + } else { + error << csv_error.full_error_message; } - error << csv_error.error_message; + switch (csv_error.type) { case CSVErrorType::CAST_ERROR: throw ConversionException(error.str()); @@ -157114,10 +158626,21 @@ CSVError::CSVError(string error_message_p, CSVErrorType type_p, LinesPerBoundary : error_message(std::move(error_message_p)), type(type_p), error_info(error_info_p) { } -CSVError::CSVError(string error_message_p, CSVErrorType type_p, idx_t column_idx_p, vector row_p, - LinesPerBoundary error_info_p) - : error_message(std::move(error_message_p)), type(type_p), column_idx(column_idx_p), row(std::move(row_p)), - error_info(error_info_p) { +CSVError::CSVError(string error_message_p, CSVErrorType type_p, idx_t column_idx_p, string csv_row_p, + LinesPerBoundary error_info_p, idx_t row_byte_position, int64_t byte_position_p, + const CSVReaderOptions &reader_options, const string &fixes) + : error_message(std::move(error_message_p)), type(type_p), column_idx(column_idx_p), csv_row(std::move(csv_row_p)), + error_info(error_info_p), row_byte_position(row_byte_position), byte_position(byte_position_p) { + // What were the options + std::ostringstream error; + if (reader_options.ignore_errors.GetValue()) { + RemoveNewLine(error_message); + } + error << error_message << '\n'; + error << fixes << '\n'; + error << reader_options.ToString(); + error << '\n'; + full_error_message = error.str(); } CSVError CSVError::ColumnTypesError(case_insensitive_map_t sql_types_per_column, const vector &names) { @@ -157140,47 +158663,60 @@ CSVError CSVError::ColumnTypesError(case_insensitive_map_t sql_types_per_ return CSVError(exception, CSVErrorType::COLUMN_NAME_TYPE_MISMATCH, {}); } +void CSVError::RemoveNewLine(string &error) { + error = StringUtil::Split(error, "\n")[0]; +} + CSVError CSVError::CastError(const CSVReaderOptions &options, string &column_name, string &cast_error, idx_t column_idx, - vector &row, LinesPerBoundary error_info, LogicalTypeId type) { + string &csv_row, LinesPerBoundary error_info, idx_t row_byte_position, + int64_t byte_position, LogicalTypeId type) { std::ostringstream error; // Which column - error << "Error when converting column \"" << column_name << "\"." << std::endl; + error << "Error when converting column \"" << column_name << "\". "; // What was the cast error - error << cast_error << std::endl; - - error << "Column " << column_name << " is being converted as type " << LogicalTypeIdToString(type) << std::endl; + error << cast_error << '\n'; + std::ostringstream how_to_fix_it; + how_to_fix_it << "Column " << column_name << " is being converted as type " << LogicalTypeIdToString(type) << '\n'; if (!options.WasTypeManuallySet(column_idx)) { - error << "This type was auto-detected from the CSV file." << std::endl; - error << "Possible solutions:" << std::endl; - error << "* Override the type for this column manually by setting the type explicitly, e.g. types={'" - << column_name << "': 'VARCHAR'}" << std::endl; - error << "* Set the sample size to a larger value to enable the auto-detection to scan more values, e.g. " - "sample_size=-1" - << std::endl; - error << "* Use a COPY statement to automatically derive types from an existing table." << std::endl; + how_to_fix_it << "This type was auto-detected from the CSV file." << '\n'; + how_to_fix_it << "Possible solutions:" << '\n'; + how_to_fix_it << "* Override the type for this column manually by setting the type explicitly, e.g. types={'" + << column_name << "': 'VARCHAR'}" << '\n'; + how_to_fix_it + << "* Set the sample size to a larger value to enable the auto-detection to scan more values, e.g. " + "sample_size=-1" + << '\n'; + how_to_fix_it << "* Use a COPY statement to automatically derive types from an existing table." << '\n'; } else { - error << "This type was either manually set or derived from an existing table. Select a different type to " - "correctly parse this column." - << std::endl; + how_to_fix_it + << "This type was either manually set or derived from an existing table. Select a different type to " + "correctly parse this column." + << '\n'; } - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::CAST_ERROR, column_idx, row, error_info); + return CSVError(error.str(), CSVErrorType::CAST_ERROR, column_idx, csv_row, error_info, row_byte_position, + byte_position, options, how_to_fix_it.str()); } -CSVError CSVError::LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info) { +CSVError CSVError::LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info, + string &csv_row, idx_t byte_position) { std::ostringstream error; error << "Maximum line size of " << options.maximum_line_size << " bytes exceeded. "; - error << "Actual Size:" << actual_size << " bytes." << std::endl; - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::MAXIMUM_LINE_SIZE, error_info); + error << "Actual Size:" << actual_size << " bytes." << '\n'; + + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible Solution: Change the maximum length size, e.g., max_line_size=" << actual_size + 1 + << "\n"; + + return CSVError(error.str(), CSVErrorType::MAXIMUM_LINE_SIZE, 0, csv_row, error_info, byte_position, byte_position, + options, how_to_fix_it.str()); } CSVError CSVError::SniffingError(string &file_path) { std::ostringstream error; // Which column - error << "Error when sniffing file \"" << file_path << "\"." << std::endl; - error << "CSV options could not be auto-detected. Consider setting parser options manually." << std::endl; + error << "Error when sniffing file \"" << file_path << "\"." << '\n'; + error << "CSV options could not be auto-detected. Consider setting parser options manually." << '\n'; return CSVError(error.str(), CSVErrorType::SNIFFING, {}); } @@ -157188,49 +158724,56 @@ CSVError CSVError::NullPaddingFail(const CSVReaderOptions &options, LinesPerBoun std::ostringstream error; error << " The parallel scanner does not support null_padding in conjunction with quoted new lines. Please " "disable the parallel csv reader with parallel=false" - << std::endl; + << '\n'; // What were the options error << options.ToString(); return CSVError(error.str(), CSVErrorType::NULLPADDED_QUOTED_NEW_VALUE, error_info); } -CSVError CSVError::UnterminatedQuotesError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t current_column, LinesPerBoundary error_info) { +CSVError CSVError::UnterminatedQuotesError(const CSVReaderOptions &options, idx_t current_column, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position) { std::ostringstream error; - error << "Value with unterminated quote found." << std::endl; - error << std::endl; - // What were the options - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::UNTERMINATED_QUOTES, error_info); + error << "Value with unterminated quote found." << '\n'; + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible Solution: Enable ignore errors (ignore_errors=true) to skip this row" << '\n'; + return CSVError(error.str(), CSVErrorType::UNTERMINATED_QUOTES, current_column, csv_row, error_info, + row_byte_position, byte_position, options, how_to_fix_it.str()); } -CSVError CSVError::IncorrectColumnAmountError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t actual_columns, - LinesPerBoundary error_info) { +CSVError CSVError::IncorrectColumnAmountError(const CSVReaderOptions &options, idx_t actual_columns, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position) { std::ostringstream error; - // How many columns were expected and how many were found - error << "Expected Number of Columns: " << options.dialect_options.num_cols << " Found: " << actual_columns - << std::endl; - error << std::endl << "Possible fixes:" << std::endl; + // We don't have a fix for this + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible fixes:" << '\n'; if (!options.null_padding) { - error << "* Enable null padding (null_padding=true) to replace missing values with NULL" << std::endl; + how_to_fix_it << "* Enable null padding (null_padding=true) to replace missing values with NULL" << '\n'; } - if (!options.ignore_errors) { - error << "* Enable ignore errors (ignore_errors=true) to skip this row" << std::endl; + if (!options.ignore_errors.GetValue()) { + how_to_fix_it << "* Enable ignore errors (ignore_errors=true) to skip this row" << '\n'; + } + // How many columns were expected and how many were found + error << "Expected Number of Columns: " << options.dialect_options.num_cols << " Found: " << actual_columns + 1; + if (actual_columns >= options.dialect_options.num_cols) { + return CSVError(error.str(), CSVErrorType::TOO_MANY_COLUMNS, actual_columns, csv_row, error_info, + row_byte_position, byte_position - 1, options, how_to_fix_it.str()); + } else { + return CSVError(error.str(), CSVErrorType::TOO_FEW_COLUMNS, actual_columns, csv_row, error_info, + row_byte_position, byte_position - 1, options, how_to_fix_it.str()); } - error << std::endl; - // What were the options - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::INCORRECT_COLUMN_AMOUNT, error_info); } -CSVError CSVError::InvalidUTF8(const CSVReaderOptions &options, LinesPerBoundary error_info) { +CSVError CSVError::InvalidUTF8(const CSVReaderOptions &options, idx_t current_column, LinesPerBoundary error_info, + string &csv_row, idx_t row_byte_position, int64_t byte_position) { std::ostringstream error; // How many columns were expected and how many were found - error << "Invalid unicode (byte sequence mismatch) detected." << std::endl; - // What were the options - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::INVALID_UNICODE, error_info); + error << "Invalid unicode (byte sequence mismatch) detected." << '\n'; + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible Solution: Enable ignore errors (ignore_errors=true) to skip this row" << '\n'; + return CSVError(error.str(), CSVErrorType::INVALID_UNICODE, current_column, csv_row, error_info, row_byte_position, + byte_position, options, how_to_fix_it.str()); } bool CSVErrorHandler::PrintLineNumber(CSVError &error) { @@ -157240,7 +158783,8 @@ bool CSVErrorHandler::PrintLineNumber(CSVError &error) { switch (error.type) { case CSVErrorType::CAST_ERROR: case CSVErrorType::UNTERMINATED_QUOTES: - case CSVErrorType::INCORRECT_COLUMN_AMOUNT: + case CSVErrorType::TOO_FEW_COLUMNS: + case CSVErrorType::TOO_MANY_COLUMNS: case CSVErrorType::MAXIMUM_LINE_SIZE: case CSVErrorType::NULLPADDED_QUOTED_NEW_VALUE: case CSVErrorType::INVALID_UNICODE: @@ -157452,8 +158996,6 @@ void CSVReaderOptions::SetReadOption(const string &loption, const Value &value, SetSkipRows(ParseInteger(value, loption)); } else if (loption == "max_line_size" || loption == "maximum_line_size") { maximum_line_size = ParseInteger(value, loption); - } else if (loption == "force_not_null") { - force_not_null = ParseColumnList(value, expected_names, loption); } else if (loption == "date_format" || loption == "dateformat") { string format = ParseString(value, loption); SetDateFormat(LogicalTypeId::DATE, format, true); @@ -157461,7 +159003,7 @@ void CSVReaderOptions::SetReadOption(const string &loption, const Value &value, string format = ParseString(value, loption); SetDateFormat(LogicalTypeId::TIMESTAMP, format, true); } else if (loption == "ignore_errors") { - ignore_errors = ParseBoolean(value, loption); + ignore_errors.Set(ParseBoolean(value, loption)); } else if (loption == "buffer_size") { buffer_size = ParseInteger(value, loption); if (buffer_size == 0) { @@ -157478,20 +159020,34 @@ void CSVReaderOptions::SetReadOption(const string &loption, const Value &value, parallel = ParseBoolean(value, loption); } else if (loption == "allow_quoted_nulls") { allow_quoted_nulls = ParseBoolean(value, loption); + } else if (loption == "store_rejects") { + store_rejects.Set(ParseBoolean(value, loption)); + } else if (loption == "force_not_null") { + if (!expected_names.empty()) { + force_not_null = ParseColumnList(value, expected_names, loption); + } else { + // Get the list of columns to use as a recovery key + auto &children = ListValue::GetChildren(value); + for (auto &child : children) { + auto col_name = child.GetValue(); + force_not_null_names.insert(col_name); + } + } + } else if (loption == "rejects_table") { // skip, handled in SetRejectsOptions auto table_name = ParseString(value, loption); if (table_name.empty()) { throw BinderException("REJECTS_TABLE option cannot be empty"); } - rejects_table_name = table_name; - } else if (loption == "rejects_recovery_columns") { - // Get the list of columns to use as a recovery key - auto &children = ListValue::GetChildren(value); - for (auto &child : children) { - auto col_name = child.GetValue(); - rejects_recovery_columns.push_back(col_name); + rejects_table_name.Set(table_name); + } else if (loption == "rejects_scan") { + // skip, handled in SetRejectsOptions + auto table_name = ParseString(value, loption); + if (table_name.empty()) { + throw BinderException("rejects_scan option cannot be empty"); } + rejects_scan_name.Set(table_name); } else if (loption == "rejects_limit") { int64_t limit = ParseInteger(value, loption); if (limit < 0) { @@ -157510,7 +159066,7 @@ void CSVReaderOptions::SetWriteOption(const string &loption, const Value &value) return; } - if (SetBaseOption(loption, value)) { + if (SetBaseOption(loption, value, true)) { return; } @@ -157535,7 +159091,7 @@ void CSVReaderOptions::SetWriteOption(const string &loption, const Value &value) } } -bool CSVReaderOptions::SetBaseOption(const string &loption, const Value &value) { +bool CSVReaderOptions::SetBaseOption(const string &loption, const Value &value, bool write_option) { // Make sure this function was only called after the option was turned into lowercase D_ASSERT(!std::any_of(loption.begin(), loption.end(), ::isupper)); @@ -157549,8 +159105,50 @@ bool CSVReaderOptions::SetBaseOption(const string &loption, const Value &value) SetEscape(ParseString(value, loption)); } else if (loption == "header") { SetHeader(ParseBoolean(value, loption)); - } else if (loption == "null" || loption == "nullstr") { - null_str = ParseString(value, loption); + } else if (loption == "nullstr" || loption == "null") { + auto &child_type = value.type(); + null_str.clear(); + if (child_type.id() != LogicalTypeId::LIST && child_type.id() != LogicalTypeId::VARCHAR) { + throw BinderException("CSV Reader function option %s requires a string or a list as input", loption); + } + if (!null_str.empty()) { + throw BinderException("CSV Reader function option nullstr can only be supplied once"); + } + if (child_type.id() == LogicalTypeId::LIST) { + auto &list_child = ListType::GetChildType(child_type); + const vector *children = nullptr; + if (list_child.id() == LogicalTypeId::LIST) { + // This can happen if it comes from a copy FROM/TO + auto &list_grandchild = ListType::GetChildType(list_child); + auto &children_ref = ListValue::GetChildren(value); + if (list_grandchild.id() != LogicalTypeId::VARCHAR || children_ref.size() != 1) { + throw BinderException("CSV Reader function option %s requires a non-empty list of possible null " + "strings (varchar) as input", + loption); + } + children = &ListValue::GetChildren(children_ref.back()); + } else if (list_child.id() != LogicalTypeId::VARCHAR) { + throw BinderException("CSV Reader function option %s requires a non-empty list of possible null " + "strings (varchar) as input", + loption); + } + if (!children) { + children = &ListValue::GetChildren(value); + } + for (auto &child : *children) { + if (child.IsNull()) { + throw BinderException( + "CSV Reader function option %s does not accept NULL values as a valid nullstr option", loption); + } + null_str.push_back(StringValue::Get(child)); + } + } else { + null_str.push_back(StringValue::Get(ParseString(value, loption))); + } + if (null_str.size() > 1 && write_option) { + throw BinderException("CSV Writer function option %s only accepts one nullstr value.", loption); + } + } else if (loption == "encoding") { auto encoding = StringUtil::Lower(ParseString(value, loption)); if (encoding != "utf8" && encoding != "utf-8") { @@ -157609,7 +159207,7 @@ string CSVReaderOptions::ToString() const { // sample_size error += "sample_size=" + std::to_string(sample_size_chunks * STANDARD_VECTOR_SIZE) + "\n "; // ignore_errors - error += "ignore_errors=" + std::to_string(ignore_errors) + "\n "; + error += "ignore_errors=" + ignore_errors.FormatValue() + "\n "; // all_varchar error += "all_varchar=" + std::to_string(all_varchar) + "\n"; @@ -157633,9 +159231,10 @@ static uint8_t GetCandidateSpecificity(const LogicalType &candidate_type) { {(uint8_t)LogicalTypeId::VARCHAR, 0}, {(uint8_t)LogicalTypeId::TIMESTAMP, 1}, {(uint8_t)LogicalTypeId::DATE, 2}, {(uint8_t)LogicalTypeId::TIME, 3}, {(uint8_t)LogicalTypeId::DOUBLE, 4}, {(uint8_t)LogicalTypeId::FLOAT, 5}, - {(uint8_t)LogicalTypeId::BIGINT, 6}, {(uint8_t)LogicalTypeId::INTEGER, 7}, - {(uint8_t)LogicalTypeId::SMALLINT, 8}, {(uint8_t)LogicalTypeId::TINYINT, 9}, - {(uint8_t)LogicalTypeId::BOOLEAN, 10}, {(uint8_t)LogicalTypeId::SQLNULL, 11}}; + {(uint8_t)LogicalTypeId::DECIMAL, 6}, {(uint8_t)LogicalTypeId::BIGINT, 7}, + {(uint8_t)LogicalTypeId::INTEGER, 8}, {(uint8_t)LogicalTypeId::SMALLINT, 9}, + {(uint8_t)LogicalTypeId::TINYINT, 10}, {(uint8_t)LogicalTypeId::BOOLEAN, 11}, + {(uint8_t)LogicalTypeId::SQLNULL, 12}}; auto id = (uint8_t)candidate_type.id(); auto it = auto_type_candidates_specificity.find(id); @@ -157645,17 +159244,26 @@ static uint8_t GetCandidateSpecificity(const LogicalType &candidate_type) { } return it->second; } - +bool StoreUserDefinedParameter(string &option) { + if (option == "column_types" || option == "types" || option == "dtypes" || option == "auto_detect" || + option == "auto_type_candidates" || option == "columns" || option == "names") { + // We don't store options related to types, names and auto-detection since these are either irrelevant to our + // prompt or are covered by the columns option. + return false; + } + return true; +} void CSVReaderOptions::FromNamedParameters(named_parameter_map_t &in, ClientContext &context, vector &return_types, vector &names) { + map ordered_user_defined_parameters; for (auto &kv : in) { if (MultiFileReader::ParseOption(kv.first, kv.second, file_options, context)) { continue; } auto loption = StringUtil::Lower(kv.first); // skip variables that are specific to auto detection - if (loption != "auto_detect" && loption != "auto_type_candidates") { - user_defined_parameters += loption + "=" + kv.second.ToSQLString() + ", "; + if (StoreUserDefinedParameter(loption)) { + ordered_user_defined_parameters[loption] = kv.second.ToSQLString(); } if (loption == "columns") { auto &child_type = kv.second.type(); @@ -157761,6 +159369,9 @@ void CSVReaderOptions::FromNamedParameters(named_parameter_map_t &in, ClientCont SetReadOption(loption, kv.second, names); } } + for (auto &udf_parameter : ordered_user_defined_parameters) { + user_defined_parameters += udf_parameter.first + "=" + udf_parameter.second + ", "; + } if (user_defined_parameters.size() >= 2) { user_defined_parameters.erase(user_defined_parameters.size() - 2); } @@ -157979,7 +159590,7 @@ namespace duckdb { class PhysicalBatchCollector : public PhysicalResultCollector { public: - PhysicalBatchCollector(PreparedStatementData &data); + explicit PhysicalBatchCollector(PreparedStatementData &data); public: unique_ptr GetResult(GlobalSinkState &state) override; @@ -158501,7 +160112,7 @@ class PhysicalExplainAnalyze : public PhysicalOperator { static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::EXPLAIN_ANALYZE; public: - PhysicalExplainAnalyze(vector types) + explicit PhysicalExplainAnalyze(vector types) : PhysicalOperator(PhysicalOperatorType::EXPLAIN_ANALYZE, std::move(types), 1) { } @@ -159432,9 +161043,9 @@ class PhysicalPrepare : public PhysicalOperator { static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::PREPARE; public: - PhysicalPrepare(string name, shared_ptr prepared, idx_t estimated_cardinality) - : PhysicalOperator(PhysicalOperatorType::PREPARE, {LogicalType::BOOLEAN}, estimated_cardinality), name(name), - prepared(std::move(prepared)) { + PhysicalPrepare(string name_p, shared_ptr prepared, idx_t estimated_cardinality) + : PhysicalOperator(PhysicalOperatorType::PREPARE, {LogicalType::BOOLEAN}, estimated_cardinality), + name(std::move(name_p)), prepared(std::move(prepared)) { } string name; @@ -159722,6 +161333,7 @@ class BoundBaseTableRef : public BoundTableRef { + namespace duckdb { class Serializer; class Deserializer; @@ -159745,13 +161357,9 @@ struct VacuumInfo : public ParseInfo { explicit VacuumInfo(VacuumOptions options); const VacuumOptions options; - -public: + vector columns; bool has_table; unique_ptr ref; - optional_ptr table; - unordered_map column_id_map; - vector columns; public: unique_ptr Copy(); @@ -159957,7 +161565,7 @@ class PhysicalSet : public PhysicalOperator { public: PhysicalSet(const std::string &name_p, Value value_p, SetScope scope_p, idx_t estimated_cardinality) : PhysicalOperator(PhysicalOperatorType::SET, {LogicalType::BOOLEAN}, estimated_cardinality), name(name_p), - value(value_p), scope(scope_p) { + value(std::move(value_p)), scope(scope_p) { } public: @@ -160368,9 +161976,12 @@ class PhysicalVacuum : public PhysicalOperator { static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::VACUUM; public: - PhysicalVacuum(unique_ptr info, idx_t estimated_cardinality); + PhysicalVacuum(unique_ptr info, optional_ptr table, + unordered_map column_id_map, idx_t estimated_cardinality); unique_ptr info; + optional_ptr table; + unordered_map column_id_map; public: // Source interface @@ -160409,16 +162020,17 @@ class PhysicalVacuum : public PhysicalOperator { namespace duckdb { -PhysicalVacuum::PhysicalVacuum(unique_ptr info_p, idx_t estimated_cardinality) +PhysicalVacuum::PhysicalVacuum(unique_ptr info_p, optional_ptr table, + unordered_map column_id_map, idx_t estimated_cardinality) : PhysicalOperator(PhysicalOperatorType::VACUUM, {LogicalType::BOOLEAN}, estimated_cardinality), - info(std::move(info_p)) { + info(std::move(info_p)), table(table), column_id_map(std::move(column_id_map)) { } class VacuumLocalSinkState : public LocalSinkState { public: - explicit VacuumLocalSinkState(VacuumInfo &info) { + explicit VacuumLocalSinkState(VacuumInfo &info, optional_ptr table) { for (const auto &column_name : info.columns) { - auto &column = info.table->GetColumn(column_name); + auto &column = table->GetColumn(column_name); if (DistinctStatistics::TypeIsSupported(column.GetType())) { column_distinct_stats.push_back(make_uniq()); } else { @@ -160431,15 +162043,14 @@ class VacuumLocalSinkState : public LocalSinkState { }; unique_ptr PhysicalVacuum::GetLocalSinkState(ExecutionContext &context) const { - return make_uniq(*info); + return make_uniq(*info, table); } class VacuumGlobalSinkState : public GlobalSinkState { public: - explicit VacuumGlobalSinkState(VacuumInfo &info) { - + explicit VacuumGlobalSinkState(VacuumInfo &info, optional_ptr table) { for (const auto &column_name : info.columns) { - auto &column = info.table->GetColumn(column_name); + auto &column = table->GetColumn(column_name); if (DistinctStatistics::TypeIsSupported(column.GetType())) { column_distinct_stats.push_back(make_uniq()); } else { @@ -160453,12 +162064,12 @@ class VacuumGlobalSinkState : public GlobalSinkState { }; unique_ptr PhysicalVacuum::GetGlobalSinkState(ClientContext &context) const { - return make_uniq(*info); + return make_uniq(*info, table); } SinkResultType PhysicalVacuum::Sink(ExecutionContext &context, DataChunk &chunk, OperatorSinkInput &input) const { auto &lstate = input.local_state.Cast(); - D_ASSERT(lstate.column_distinct_stats.size() == info->column_id_map.size()); + D_ASSERT(lstate.column_distinct_stats.size() == column_id_map.size()); for (idx_t col_idx = 0; col_idx < chunk.data.size(); col_idx++) { if (!DistinctStatistics::TypeIsSupported(chunk.data[col_idx].GetType())) { @@ -160491,10 +162102,9 @@ SinkFinalizeType PhysicalVacuum::Finalize(Pipeline &pipeline, Event &event, Clie OperatorSinkFinalizeInput &input) const { auto &sink = input.global_state.Cast(); - auto table = info->table; + auto tbl = table; for (idx_t col_idx = 0; col_idx < sink.column_distinct_stats.size(); col_idx++) { - table->GetStorage().SetDistinct(info->column_id_map.at(col_idx), - std::move(sink.column_distinct_stats[col_idx])); + tbl->GetStorage().SetDistinct(column_id_map.at(col_idx), std::move(sink.column_distinct_stats[col_idx])); } return SinkFinalizeType::READY; @@ -164840,6 +166450,7 @@ struct IEJoinUnion { DataChunk payload; payload.Initialize(Allocator::DefaultAllocator(), gstate.payload_layout.GetTypes()); for (;;) { + payload.Reset(); scanner.Scan(payload); const auto count = payload.size(); if (!count) { @@ -164921,6 +166532,7 @@ idx_t IEJoinUnion::AppendKey(SortedTable &table, ExpressionExecutor &executor, S idx_t inserted = 0; for (auto rid = base; table_idx < valid;) { + scanned.Reset(); scanner.Scan(scanned); // NULLs are at the end, so stop when we reach them @@ -169156,43 +170768,138 @@ string PhysicalTopN::ParamsToString() const { + namespace duckdb { -TableCatalogEntry &CSVRejectsTable::GetTable(ClientContext &context) { +TableCatalogEntry &CSVRejectsTable::GetErrorsTable(ClientContext &context) { + auto &temp_catalog = Catalog::GetCatalog(context, TEMP_CATALOG); + auto &table_entry = temp_catalog.GetEntry(context, TEMP_CATALOG, DEFAULT_SCHEMA, errors_table); + return table_entry; +} + +TableCatalogEntry &CSVRejectsTable::GetScansTable(ClientContext &context) { auto &temp_catalog = Catalog::GetCatalog(context, TEMP_CATALOG); - auto &table_entry = temp_catalog.GetEntry(context, TEMP_CATALOG, DEFAULT_SCHEMA, name); + auto &table_entry = temp_catalog.GetEntry(context, TEMP_CATALOG, DEFAULT_SCHEMA, scan_table); return table_entry; } -shared_ptr CSVRejectsTable::GetOrCreate(ClientContext &context, const string &name) { - auto key = "CSV_REJECTS_TABLE_CACHE_ENTRY_" + StringUtil::Upper(name); +idx_t CSVRejectsTable::GetCurrentFileIndex(idx_t query_id) { + if (current_query_id != query_id) { + current_query_id = query_id; + current_file_idx = 0; + } + return current_file_idx++; +} + +shared_ptr CSVRejectsTable::GetOrCreate(ClientContext &context, const string &rejects_scan, + const string &rejects_error) { + // Check that these names can't be the same + if (rejects_scan == rejects_error) { + throw BinderException("The names of the rejects scan and rejects error tables can't be the same. Use different " + "names for these tables."); + } + auto key = + "CSV_REJECTS_TABLE_CACHE_ENTRY_" + StringUtil::Upper(rejects_scan) + "_" + StringUtil::Upper(rejects_error); auto &cache = ObjectCache::GetObjectCache(context); - return cache.GetOrCreate(key, name); + auto &catalog = Catalog::GetCatalog(context, TEMP_CATALOG); + auto rejects_scan_exist = catalog.GetEntry(context, CatalogType::TABLE_ENTRY, DEFAULT_SCHEMA, rejects_scan, + OnEntryNotFound::RETURN_NULL) != nullptr; + auto rejects_error_exist = catalog.GetEntry(context, CatalogType::TABLE_ENTRY, DEFAULT_SCHEMA, rejects_error, + OnEntryNotFound::RETURN_NULL) != nullptr; + if ((rejects_scan_exist || rejects_error_exist) && !cache.Get(key)) { + std::ostringstream error; + if (rejects_scan_exist) { + error << "Reject Scan Table name \"" << rejects_scan << "\" is already in use. "; + } + if (rejects_error_exist) { + error << "Reject Error Table name \"" << rejects_error << "\" is already in use. "; + } + error << "Either drop the used name(s), or give other name options in the CSV Reader function.\n"; + throw BinderException(error.str()); + } + + return cache.GetOrCreate(key, rejects_scan, rejects_error); } void CSVRejectsTable::InitializeTable(ClientContext &context, const ReadCSVData &data) { // (Re)Create the temporary rejects table auto &catalog = Catalog::GetCatalog(context, TEMP_CATALOG); - auto info = make_uniq(TEMP_CATALOG, DEFAULT_SCHEMA, name); - info->temporary = true; - info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; - info->columns.AddColumn(ColumnDefinition("file", LogicalType::VARCHAR)); - info->columns.AddColumn(ColumnDefinition("line", LogicalType::BIGINT)); - info->columns.AddColumn(ColumnDefinition("column", LogicalType::BIGINT)); - info->columns.AddColumn(ColumnDefinition("column_name", LogicalType::VARCHAR)); - info->columns.AddColumn(ColumnDefinition("parsed_value", LogicalType::VARCHAR)); - if (!data.options.rejects_recovery_columns.empty()) { - child_list_t recovery_key_components; - for (auto &col_name : data.options.rejects_recovery_columns) { - recovery_key_components.emplace_back(col_name, LogicalType::VARCHAR); - } - info->columns.AddColumn(ColumnDefinition("recovery_columns", LogicalType::STRUCT(recovery_key_components))); + // Create CSV_ERROR_TYPE ENUM + string enum_name = "CSV_ERROR_TYPE"; + Vector order_errors(LogicalType::VARCHAR, 6); + order_errors.SetValue(0, "CAST"); + order_errors.SetValue(1, "MISSING COLUMNS"); + order_errors.SetValue(2, "TOO MANY COLUMNS"); + order_errors.SetValue(3, "UNQUOTED VALUE"); + order_errors.SetValue(4, "LINE SIZE OVER MAXIMUM"); + order_errors.SetValue(5, "INVALID UNICODE"); + LogicalType enum_type = LogicalType::ENUM(enum_name, order_errors, 6); + auto type_info = make_uniq(enum_name, enum_type); + type_info->temporary = true; + type_info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; + catalog.CreateType(context, *type_info); + + // Create Rejects Scans Table + { + auto info = make_uniq(TEMP_CATALOG, DEFAULT_SCHEMA, scan_table); + info->temporary = true; + info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; + // 0. Scan ID + info->columns.AddColumn(ColumnDefinition("scan_id", LogicalType::UBIGINT)); + // 1. File ID (within the scan) + info->columns.AddColumn(ColumnDefinition("file_id", LogicalType::UBIGINT)); + // 2. File Path + info->columns.AddColumn(ColumnDefinition("file_path", LogicalType::VARCHAR)); + // 3. Delimiter + info->columns.AddColumn(ColumnDefinition("delimiter", LogicalType::VARCHAR)); + // 4. Quote + info->columns.AddColumn(ColumnDefinition("quote", LogicalType::VARCHAR)); + // 5. Escape + info->columns.AddColumn(ColumnDefinition("escape", LogicalType::VARCHAR)); + // 6. NewLine Delimiter + info->columns.AddColumn(ColumnDefinition("newline_delimiter", LogicalType::VARCHAR)); + // 7. Skip Rows + info->columns.AddColumn(ColumnDefinition("skip_rows", LogicalType::UINTEGER)); + // 8. Has Header + info->columns.AddColumn(ColumnDefinition("has_header", LogicalType::BOOLEAN)); + // 9. List> + info->columns.AddColumn(ColumnDefinition("columns", LogicalType::VARCHAR)); + // 10. Date Format + info->columns.AddColumn(ColumnDefinition("date_format", LogicalType::VARCHAR)); + // 11. Timestamp Format + info->columns.AddColumn(ColumnDefinition("timestamp_format", LogicalType::VARCHAR)); + // 12. CSV read function with all the options used + info->columns.AddColumn(ColumnDefinition("user_arguments", LogicalType::VARCHAR)); + catalog.CreateTable(context, std::move(info)); + } + { + // Create Rejects Error Table + auto info = make_uniq(TEMP_CATALOG, DEFAULT_SCHEMA, errors_table); + info->temporary = true; + info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; + // 0. Scan ID + info->columns.AddColumn(ColumnDefinition("scan_id", LogicalType::UBIGINT)); + // 1. File ID (within the scan) + info->columns.AddColumn(ColumnDefinition("file_id", LogicalType::UBIGINT)); + // 2. Row Line + info->columns.AddColumn(ColumnDefinition("line", LogicalType::UBIGINT)); + // 3. Byte Position of the start of the line + info->columns.AddColumn(ColumnDefinition("line_byte_position", LogicalType::UBIGINT)); + // 4. Byte Position where error occurred + info->columns.AddColumn(ColumnDefinition("byte_position", LogicalType::UBIGINT)); + // 5. Column Index (If Applicable) + info->columns.AddColumn(ColumnDefinition("column_idx", LogicalType::UBIGINT)); + // 6. Column Name (If Applicable) + info->columns.AddColumn(ColumnDefinition("column_name", LogicalType::VARCHAR)); + // 7. Error Type + info->columns.AddColumn(ColumnDefinition("error_type", enum_type)); + // 8. Original CSV Line + info->columns.AddColumn(ColumnDefinition("csv_line", LogicalType::VARCHAR)); + // 9. Full Error Message + info->columns.AddColumn(ColumnDefinition("error_message", LogicalType::VARCHAR)); + catalog.CreateTable(context, std::move(info)); } - - info->columns.AddColumn(ColumnDefinition("error", LogicalType::VARCHAR)); - - catalog.CreateTable(context, std::move(info)); count = 0; } @@ -169629,7 +171336,7 @@ struct FixedPreparedBatchData { class FixedBatchCopyGlobalState : public GlobalSinkState { public: // heuristic - we need at least 4MB of cache space per column per thread we launch - static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN_PER_THREAD = 4 * 1024 * 1024; + static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN_PER_THREAD = 4ULL * 1024ULL * 1024ULL; public: explicit FixedBatchCopyGlobalState(ClientContext &context_p, unique_ptr global_state, @@ -169684,7 +171391,7 @@ class FixedBatchCopyGlobalState : public GlobalSinkState { } }; -enum class FixedBatchCopyState { SINKING_DATA = 1, PROCESSING_TASKS = 2 }; +enum class FixedBatchCopyState : uint8_t { SINKING_DATA = 1, PROCESSING_TASKS = 2 }; class FixedBatchCopyLocalState : public LocalSinkState { public: @@ -170505,8 +172212,9 @@ class BatchInsertTask { class BatchInsertGlobalState : public GlobalSinkState { public: - explicit BatchInsertGlobalState(ClientContext &context, DuckTableEntry &table, idx_t initial_memory) - : memory_manager(context, initial_memory), table(table), insert_count(0), optimistically_written(false) { + explicit BatchInsertGlobalState(ClientContext &context, DuckTableEntry &table, idx_t minimum_memory_per_thread) + : memory_manager(context, minimum_memory_per_thread), table(table), insert_count(0), + optimistically_written(false), minimum_memory_per_thread(minimum_memory_per_thread) { } BatchMemoryManager memory_manager; @@ -170517,6 +172225,7 @@ class BatchInsertGlobalState : public GlobalSinkState { vector collections; idx_t next_start = 0; atomic optimistically_written; + idx_t minimum_memory_per_thread; static bool ReadyToMerge(idx_t count); void ScheduleMergeTasks(idx_t min_batch_index); @@ -170526,6 +172235,13 @@ class BatchInsertGlobalState : public GlobalSinkState { void AddCollection(ClientContext &context, idx_t batch_index, idx_t min_batch_index, unique_ptr current_collection, optional_ptr writer = nullptr); + + idx_t MaxThreads(idx_t source_max_threads) override { + // try to request 4MB per column per thread + memory_manager.SetMemorySize(source_max_threads * minimum_memory_per_thread); + // cap the concurrent threads working on this task based on the amount of available memory + return MinValue(source_max_threads, memory_manager.AvailableMemory() / minimum_memory_per_thread + 1); + } }; class BatchInsertLocalState : public LocalSinkState { @@ -170756,9 +172472,9 @@ unique_ptr PhysicalBatchInsert::GetGlobalSinkState(ClientContex table = insert_table.get_mutable(); } // heuristic - we start off by allocating 4MB of cache space per column - static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN = 4 * 1024 * 1024; - auto initial_memory = table->GetColumns().PhysicalColumnCount() * MINIMUM_MEMORY_PER_COLUMN; - auto result = make_uniq(context, table->Cast(), initial_memory); + static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN = 4ULL * 1024ULL * 1024ULL; + auto minimum_memory_per_thread = table->GetColumns().PhysicalColumnCount() * MINIMUM_MEMORY_PER_COLUMN; + auto result = make_uniq(context, table->Cast(), minimum_memory_per_thread); return std::move(result); } @@ -171024,7 +172740,7 @@ SourceResultType PhysicalBatchInsert::GetData(ExecutionContext &context, DataChu //===----------------------------------------------------------------------===// // DuckDB // -// duckdb/parser/parsed_data/export_table_data.hpp +// duckdb/parser/parsed_data/copy_database_info.hpp // // //===----------------------------------------------------------------------===// @@ -171034,59 +172750,37 @@ SourceResultType PhysicalBatchInsert::GetData(ExecutionContext &context, DataChu -namespace duckdb { -class TableCatalogEntry; -struct ExportedTableData { - //! Name of the exported table - string table_name; - //! Name of the schema - string schema_name; +namespace duckdb { - //! Name of the database - string database_name; +struct CopyDatabaseInfo : public ParseInfo { +public: + static constexpr const ParseInfoType TYPE = ParseInfoType::COPY_DATABASE_INFO; - //! Path to be exported - string file_path; -}; +public: + explicit CopyDatabaseInfo() : ParseInfo(TYPE), target_database(INVALID_CATALOG) { + } -struct ExportedTableInfo { - ExportedTableInfo(TableCatalogEntry &entry, ExportedTableData table_data) - : entry(entry), table_data(std::move(table_data)) { + explicit CopyDatabaseInfo(const string &target_database) : ParseInfo(TYPE), target_database(target_database) { } - TableCatalogEntry &entry; - ExportedTableData table_data; -}; + // The destination database to which catalog entries are being copied + string target_database; -struct BoundExportData : public ParseInfo { -public: - static constexpr const ParseInfoType TYPE = ParseInfoType::BOUND_EXPORT_DATA; + // The catalog entries that are going to be created in the destination DB + vector> entries; public: - BoundExportData() : ParseInfo(TYPE) { - } - - vector data; + void Serialize(Serializer &serializer) const override; + static unique_ptr Deserialize(Deserializer &deserializer); }; } // namespace duckdb - - namespace duckdb { -struct CopyDatabaseInfo { - CopyDatabaseInfo(Catalog &from_database, Catalog &to_database); - ~CopyDatabaseInfo(); - - Catalog &from_database; - Catalog &to_database; - vector> entries; -}; - class LogicalCopyDatabase : public LogicalOperator { public: static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_COPY_DATABASE; @@ -171103,6 +172797,9 @@ class LogicalCopyDatabase : public LogicalOperator { protected: void ResolveTypes() override; + +private: + explicit LogicalCopyDatabase(unique_ptr info_p); }; } // namespace duckdb @@ -171157,7 +172854,7 @@ PhysicalCopyDatabase::~PhysicalCopyDatabase() { //===--------------------------------------------------------------------===// SourceResultType PhysicalCopyDatabase::GetData(ExecutionContext &context, DataChunk &chunk, OperatorSourceInput &input) const { - auto &catalog = info->to_database; + auto &catalog = Catalog::GetCatalog(context.client, info->target_database); for (auto &create_info : info->entries) { switch (create_info->type) { case CatalogType::SCHEMA_ENTRY: @@ -171794,6 +173491,57 @@ SourceResultType PhysicalDelete::GetData(ExecutionContext &context, DataChunk &c +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/parser/parsed_data/export_table_data.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + +namespace duckdb { +class TableCatalogEntry; + +struct ExportedTableData { + //! Name of the exported table + string table_name; + + //! Name of the schema + string schema_name; + + //! Name of the database + string database_name; + + //! Path to be exported + string file_path; +}; + +struct ExportedTableInfo { + ExportedTableInfo(TableCatalogEntry &entry, ExportedTableData table_data) + : entry(entry), table_data(std::move(table_data)) { + } + + TableCatalogEntry &entry; + ExportedTableData table_data; +}; + +struct BoundExportData : public ParseInfo { +public: + static constexpr const ParseInfoType TYPE = ParseInfoType::BOUND_EXPORT_DATA; + +public: + BoundExportData() : ParseInfo(TYPE) { + } + + vector data; +}; + +} // namespace duckdb namespace duckdb { @@ -171880,15 +173628,15 @@ static void WriteCatalogEntries(stringstream &ss, vector if (entry.get().internal) { continue; } - ss << entry.get().ToSQL() << std::endl; + ss << entry.get().ToSQL() << '\n'; } - ss << std::endl; + ss << '\n'; } static void WriteStringStreamToFile(FileSystem &fs, stringstream &ss, const string &path) { auto ss_string = ss.str(); - auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW, - FileLockType::WRITE_LOCK); + auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW | + FileLockType::WRITE_LOCK); fs.Write(*handle, (void *)ss_string.c_str(), ss_string.size()); handle.reset(); } @@ -171935,7 +173683,7 @@ static void WriteCopyStatement(FileSystem &fs, stringstream &ss, CopyInfo &info, throw NotImplementedException("FIXME: serialize list of options"); } } - ss << ");" << std::endl; + ss << ");" << '\n'; } //===--------------------------------------------------------------------===// @@ -174857,10 +176605,10 @@ struct DBPathAndType { //! Parse database extension type and rest of path from combined form (type:path) static void ExtractExtensionPrefix(string &path, string &db_type); //! Check the magic bytes of a file and set the database type based on that - static void CheckMagicBytes(string &path, string &db_type, const DBConfig &config); + static void CheckMagicBytes(FileSystem &fs, string &path, string &db_type); //! Run ExtractExtensionPrefix followed by CheckMagicBytes - static void ResolveDatabaseType(string &path, string &db_type, const DBConfig &config); + static void ResolveDatabaseType(FileSystem &fs, string &path, string &db_type); }; } // namespace duckdb @@ -174956,7 +176704,7 @@ SourceResultType PhysicalAttach::GetData(ExecutionContext &context, DataChunk &c // get the database type and attach the database db_manager.GetDatabaseType(context.client, db_type, *info, config, unrecognized_option); auto attached_db = db_manager.AttachDatabase(context.client, *info, db_type, access_mode); - attached_db->Initialize(); + attached_db->Initialize(&context.client); return SourceResultType::FINISHED; } @@ -178214,7 +179962,7 @@ class LogicalCreateSecret : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_CREATE_SECRET; public: - LogicalCreateSecret(CreateSecretFunction function_p, CreateSecretInfo info_p) + explicit LogicalCreateSecret(CreateSecretInfo info_p) : LogicalOperator(LogicalOperatorType::LOGICAL_CREATE_SECRET), info(std::move(info_p)) { } @@ -178448,8 +180196,8 @@ class LogicalCTERef : public LogicalOperator { : LogicalOperator(LogicalOperatorType::LOGICAL_CTE_REF), table_index(table_index), cte_index(cte_index), correlated_columns(0), materialized_cte(materialized_cte) { D_ASSERT(types.size() > 0); - chunk_types = types; - bound_columns = colnames; + chunk_types = std::move(types); + bound_columns = std::move(colnames); } vector bound_columns; @@ -178503,10 +180251,10 @@ class LogicalMaterializedCTE : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_MATERIALIZED_CTE; public: - LogicalMaterializedCTE(string ctename, idx_t table_index, idx_t column_count, unique_ptr cte, + LogicalMaterializedCTE(string ctename_p, idx_t table_index, idx_t column_count, unique_ptr cte, unique_ptr child) : LogicalOperator(LogicalOperatorType::LOGICAL_MATERIALIZED_CTE), table_index(table_index), - column_count(column_count), ctename(ctename) { + column_count(column_count), ctename(std::move(ctename_p)) { children.push_back(std::move(cte)); children.push_back(std::move(child)); } @@ -178659,7 +180407,7 @@ class LogicalDelimGet : public LogicalOperator { LogicalDelimGet(idx_t table_index, vector types) : LogicalOperator(LogicalOperatorType::LOGICAL_DELIM_GET), table_index(table_index) { D_ASSERT(types.size() > 0); - chunk_types = types; + chunk_types = std::move(types); } //! The table index in the current bind context @@ -179042,7 +180790,7 @@ class LogicalDummyScan : public LogicalOperator { protected: void ResolveTypes() override { - if (types.size() == 0) { + if (types.empty()) { types.emplace_back(LogicalType::INTEGER); } } @@ -179202,7 +180950,7 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalExecute &o namespace duckdb { class LogicalExplain : public LogicalOperator { - LogicalExplain(ExplainType explain_type) + explicit LogicalExplain(ExplainType explain_type) : LogicalOperator(LogicalOperatorType::LOGICAL_EXPLAIN), explain_type(explain_type) {}; public: @@ -179322,8 +181070,8 @@ class LogicalExport : public LogicalOperator { public: LogicalExport(CopyFunction function, unique_ptr copy_info, BoundExportData exported_tables) - : LogicalOperator(LogicalOperatorType::LOGICAL_EXPORT), function(function), copy_info(std::move(copy_info)), - exported_tables(std::move(exported_tables)) { + : LogicalOperator(LogicalOperatorType::LOGICAL_EXPORT), function(std::move(function)), + copy_info(std::move(copy_info)), exported_tables(std::move(exported_tables)) { } CopyFunction function; unique_ptr copy_info; @@ -179384,8 +181132,8 @@ class LogicalExpressionGet : public LogicalOperator { public: LogicalExpressionGet(idx_t table_index, vector types, vector>> expressions) - : LogicalOperator(LogicalOperatorType::LOGICAL_EXPRESSION_GET), table_index(table_index), expr_types(types), - expressions(std::move(expressions)) { + : LogicalOperator(LogicalOperatorType::LOGICAL_EXPRESSION_GET), table_index(table_index), + expr_types(std::move(types)), expressions(std::move(expressions)) { } //! The table index in the current bind context @@ -180064,7 +181812,7 @@ class LogicalPragma : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_PRAGMA; public: - LogicalPragma(unique_ptr info_p) + explicit LogicalPragma(unique_ptr info_p) : LogicalOperator(LogicalOperatorType::LOGICAL_PRAGMA), info(std::move(info_p)) { } @@ -180119,8 +181867,9 @@ class LogicalPrepare : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_PREPARE; public: - LogicalPrepare(string name, shared_ptr prepared, unique_ptr logical_plan) - : LogicalOperator(LogicalOperatorType::LOGICAL_PREPARE), name(name), prepared(std::move(prepared)) { + LogicalPrepare(string name_p, shared_ptr prepared, unique_ptr logical_plan) + : LogicalOperator(LogicalOperatorType::LOGICAL_PREPARE), name(std::move(name_p)), + prepared(std::move(prepared)) { if (logical_plan) { children.push_back(std::move(logical_plan)); } @@ -180241,10 +181990,10 @@ class LogicalRecursiveCTE : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_RECURSIVE_CTE; public: - LogicalRecursiveCTE(string ctename, idx_t table_index, idx_t column_count, bool union_all, + LogicalRecursiveCTE(string ctename_p, idx_t table_index, idx_t column_count, bool union_all, unique_ptr top, unique_ptr bottom) - : LogicalOperator(LogicalOperatorType::LOGICAL_RECURSIVE_CTE), union_all(union_all), ctename(ctename), - table_index(table_index), column_count(column_count) { + : LogicalOperator(LogicalOperatorType::LOGICAL_RECURSIVE_CTE), union_all(union_all), + ctename(std::move(ctename_p)), table_index(table_index), column_count(column_count) { children.push_back(std::move(top)); children.push_back(std::move(bottom)); } @@ -180358,7 +182107,7 @@ class LogicalReset : public LogicalOperator { public: LogicalReset(std::string name_p, SetScope scope_p) - : LogicalOperator(LogicalOperatorType::LOGICAL_RESET), name(name_p), scope(scope_p) { + : LogicalOperator(LogicalOperatorType::LOGICAL_RESET), name(std::move(name_p)), scope(scope_p) { } std::string name; @@ -180489,7 +182238,8 @@ class LogicalSet : public LogicalOperator { public: LogicalSet(std::string name_p, Value value_p, SetScope scope_p) - : LogicalOperator(LogicalOperatorType::LOGICAL_SET), name(name_p), value(value_p), scope(scope_p) { + : LogicalOperator(LogicalOperatorType::LOGICAL_SET), name(std::move(name_p)), value(std::move(value_p)), + scope(scope_p) { } std::string name; @@ -180767,15 +182517,6 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalSimple &op case LogicalOperatorType::LOGICAL_TRANSACTION: return make_uniq(unique_ptr_cast(std::move(op.info)), op.estimated_cardinality); - case LogicalOperatorType::LOGICAL_VACUUM: { - auto result = make_uniq(unique_ptr_cast(std::move(op.info)), - op.estimated_cardinality); - if (!op.children.empty()) { - auto child = CreatePlan(*op.children[0]); - result->children.push_back(std::move(child)); - } - return std::move(result); - } case LogicalOperatorType::LOGICAL_LOAD: return make_uniq(unique_ptr_cast(std::move(op.info)), op.estimated_cardinality); @@ -180940,6 +182681,76 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalUpdate &op +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/planner/operator/logical_vacuum.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + + + +namespace duckdb { + +//! LogicalVacuum represents a simple logical operator that only passes on the parse info +class LogicalVacuum : public LogicalOperator { +public: + static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_VACUUM; + +public: + LogicalVacuum(); + explicit LogicalVacuum(unique_ptr info); + +public: + VacuumInfo &GetInfo() { + return *info; + } + + TableCatalogEntry &GetTable(); + bool HasTable() const; + void SetTable(TableCatalogEntry &table_p); + +public: + optional_ptr table; + unordered_map column_id_map; + unique_ptr info; + +public: + void Serialize(Serializer &serializer) const override; + static unique_ptr Deserialize(Deserializer &deserializer); + idx_t EstimateCardinality(ClientContext &context) override; + +protected: + void ResolveTypes() override { + types.emplace_back(LogicalType::BOOLEAN); + } +}; + +} // namespace duckdb + + +namespace duckdb { + +unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalVacuum &op) { + auto result = make_uniq(unique_ptr_cast(std::move(op.info)), op.table, + std::move(op.column_id_map), op.estimated_cardinality); + if (!op.children.empty()) { + auto child = CreatePlan(*op.children[0]); + result->children.push_back(std::move(child)); + } + return std::move(result); +} + +} // namespace duckdb + + + @@ -181205,13 +183016,14 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalWindow &op + namespace duckdb { class DependencyExtractor : public LogicalOperatorVisitor { public: - explicit DependencyExtractor(DependencyList &dependencies) : dependencies(dependencies) { + explicit DependencyExtractor(LogicalDependencyList &dependencies) : dependencies(dependencies) { } protected: @@ -181224,7 +183036,7 @@ class DependencyExtractor : public LogicalOperatorVisitor { } private: - DependencyList &dependencies; + LogicalDependencyList &dependencies; }; PhysicalPlanGenerator::PhysicalPlanGenerator(ClientContext &context) : context(context) { @@ -181372,10 +183184,12 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalOperator & case LogicalOperatorType::LOGICAL_PRAGMA: plan = CreatePlan(op.Cast()); break; + case LogicalOperatorType::LOGICAL_VACUUM: + plan = CreatePlan(op.Cast()); + break; case LogicalOperatorType::LOGICAL_TRANSACTION: case LogicalOperatorType::LOGICAL_ALTER: case LogicalOperatorType::LOGICAL_DROP: - case LogicalOperatorType::LOGICAL_VACUUM: case LogicalOperatorType::LOGICAL_LOAD: case LogicalOperatorType::LOGICAL_ATTACH: case LogicalOperatorType::LOGICAL_DETACH: @@ -181503,13 +183317,27 @@ unique_ptr RadixPartitionedHashTable::CreateHT(Client //===--------------------------------------------------------------------===// // Sink //===--------------------------------------------------------------------===// +enum class AggregatePartitionState : uint8_t { + //! Can be finalized + READY_TO_FINALIZE = 0, + //! Finalize is in progress + FINALIZE_IN_PROGRESS = 1, + //! Finalized, ready to scan + READY_TO_SCAN = 2 +}; + struct AggregatePartition { explicit AggregatePartition(unique_ptr data_p) - : data(std::move(data_p)), progress(0), finalized(false) { + : state(AggregatePartitionState::READY_TO_FINALIZE), data(std::move(data_p)), progress(0) { } + + mutex lock; + AggregatePartitionState state; + unique_ptr data; atomic progress; - atomic finalized; + + vector blocked_tasks; }; class RadixHTGlobalSinkState; @@ -181599,9 +183427,7 @@ class RadixHTGlobalSinkState : public GlobalSinkState { //! Partitions that are finalized during GetData vector> partitions; - - //! For synchronizing finalize tasks - atomic finalize_idx; + //! For keeping track of progress atomic finalize_done; //! Pin properties when scanning @@ -181610,16 +183436,13 @@ class RadixHTGlobalSinkState : public GlobalSinkState { idx_t count_before_combining; //! Maximum partition size if all unique idx_t max_partition_size; - - vector blocked_tasks; }; RadixHTGlobalSinkState::RadixHTGlobalSinkState(ClientContext &context_p, const RadixPartitionedHashTable &radix_ht_p) : context(context_p), temporary_memory_state(TemporaryMemoryManager::Get(context).Register(context)), radix_ht(radix_ht_p), config(context, *this), finalized(false), external(false), active_threads(0), - any_combined(false), finalize_idx(0), finalize_done(0), - scan_pin_properties(TupleDataPinProperties::DESTROY_AFTER_DONE), count_before_combining(0), - max_partition_size(0) { + any_combined(false), finalize_done(0), scan_pin_properties(TupleDataPinProperties::DESTROY_AFTER_DONE), + count_before_combining(0), max_partition_size(0) { auto tuples_per_block = Storage::BLOCK_ALLOC_SIZE / radix_ht.GetLayout().GetRowWidth(); idx_t ht_count = config.sink_capacity / GroupedAggregateHashTable::LOAD_FACTOR; @@ -181950,8 +183773,9 @@ void RadixPartitionedHashTable::Finalize(ClientContext &context, GlobalSinkState gstate.partitions.emplace_back(make_uniq(std::move(partition))); if (single_ht) { - gstate.finalize_idx++; - gstate.partitions.back()->finalized = true; + gstate.finalize_done++; + gstate.partitions.back()->progress = 1; + gstate.partitions.back()->state = AggregatePartitionState::READY_TO_SCAN; } } } else { @@ -182000,7 +183824,8 @@ class RadixHTGlobalSourceState : public GlobalSourceState { RadixHTGlobalSourceState(ClientContext &context, const RadixPartitionedHashTable &radix_ht); //! Assigns a task to a local source state - bool AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate); + SourceResultType AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate, + InterruptState &interrupt_state); public: //! The client context @@ -182011,10 +183836,10 @@ class RadixHTGlobalSourceState : public GlobalSourceState { //! Column ids for scanning vector column_ids; - //! For synchronizing scan tasks + //! For synchronizing tasks mutex lock; - idx_t scan_idx; - atomic scan_done; + idx_t task_idx; + atomic task_done; }; enum class RadixHTScanStatus : uint8_t { INIT, IN_PROGRESS, DONE }; @@ -182063,61 +183888,44 @@ unique_ptr RadixPartitionedHashTable::GetLocalSourceState(Exec } RadixHTGlobalSourceState::RadixHTGlobalSourceState(ClientContext &context_p, const RadixPartitionedHashTable &radix_ht) - : context(context_p), finished(false), scan_idx(0), scan_done(0) { + : context(context_p), finished(false), task_idx(0), task_done(0) { for (column_t column_id = 0; column_id < radix_ht.group_types.size(); column_id++) { column_ids.push_back(column_id); } } -bool RadixHTGlobalSourceState::AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate) { - D_ASSERT(lstate.scan_status != RadixHTScanStatus::IN_PROGRESS); - - const auto n_partitions = sink.partitions.size(); +SourceResultType RadixHTGlobalSourceState::AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate, + InterruptState &interrupt_state) { + // First, try to get a partition index + lock_guard gstate_guard(lock); if (finished) { - return false; + return SourceResultType::FINISHED; } - - // We first try to assign a Scan task, then a Finalize task if that didn't work - bool scan_assigned = false; - if (scan_idx < n_partitions && sink.partitions[scan_idx]->finalized) { - lstate.task_idx = scan_idx++; - scan_assigned = true; - if (scan_idx == n_partitions) { - // We will never be able to assign another task, unblock blocked tasks - lock_guard sink_guard(sink.lock); - if (!sink.blocked_tasks.empty()) { - for (auto &state : sink.blocked_tasks) { - state.Callback(); - } - sink.blocked_tasks.clear(); - } - } + if (task_idx == sink.partitions.size()) { + return SourceResultType::FINISHED; } + lstate.task_idx = task_idx++; - if (scan_assigned) { - // We successfully assigned a Scan task - D_ASSERT(lstate.task_idx < n_partitions && sink.partitions[lstate.task_idx]->finalized); + // We got a partition index + auto &partition = *sink.partitions[lstate.task_idx]; + auto partition_lock = unique_lock(partition.lock); + switch (partition.state) { + case AggregatePartitionState::READY_TO_FINALIZE: + partition.state = AggregatePartitionState::FINALIZE_IN_PROGRESS; + lstate.task = RadixHTSourceTaskType::FINALIZE; + return SourceResultType::HAVE_MORE_OUTPUT; + case AggregatePartitionState::FINALIZE_IN_PROGRESS: lstate.task = RadixHTSourceTaskType::SCAN; lstate.scan_status = RadixHTScanStatus::INIT; - return true; - } - - // We didn't assign a Scan task - if (sink.finalize_idx >= n_partitions) { - lstate.ht.reset(); - return false; // No finalize tasks left - } - - // We can just increment the atomic here, much simpler than assigning the scan task - lstate.task_idx = sink.finalize_idx++; - if (lstate.task_idx < n_partitions) { - // We successfully assigned a Finalize task - lstate.task = RadixHTSourceTaskType::FINALIZE; - return true; + partition.blocked_tasks.push_back(interrupt_state); + return SourceResultType::BLOCKED; + case AggregatePartitionState::READY_TO_SCAN: + lstate.task = RadixHTSourceTaskType::SCAN; + lstate.scan_status = RadixHTScanStatus::INIT; + return SourceResultType::HAVE_MORE_OUTPUT; + default: + throw InternalException("Unexpected AggregatePartitionState in RadixHTLocalSourceState::Finalize!"); } - - // We didn't manage to assign a Finalize task because there are none left - return false; } RadixHTLocalSourceState::RadixHTLocalSourceState(ExecutionContext &context, const RadixPartitionedHashTable &radix_ht) @@ -182133,6 +183941,7 @@ RadixHTLocalSourceState::RadixHTLocalSourceState(ExecutionContext &context, cons void RadixHTLocalSourceState::ExecuteTask(RadixHTGlobalSinkState &sink, RadixHTGlobalSourceState &gstate, DataChunk &chunk) { + D_ASSERT(task != RadixHTSourceTaskType::NO_TASK); switch (task) { case RadixHTSourceTaskType::FINALIZE: Finalize(sink, gstate); @@ -182148,12 +183957,7 @@ void RadixHTLocalSourceState::ExecuteTask(RadixHTGlobalSinkState &sink, RadixHTG void RadixHTLocalSourceState::Finalize(RadixHTGlobalSinkState &sink, RadixHTGlobalSourceState &gstate) { D_ASSERT(task == RadixHTSourceTaskType::FINALIZE); D_ASSERT(scan_status != RadixHTScanStatus::IN_PROGRESS); - auto &partition = *sink.partitions[task_idx]; - if (partition.data->Count() == 0) { - partition.finalized = true; - return; - } if (!ht) { // This capacity would always be sufficient for all data @@ -182164,7 +183968,7 @@ void RadixHTLocalSourceState::Finalize(RadixHTGlobalSinkState &sink, RadixHTGlob const idx_t memory_limit = BufferManager::GetBufferManager(gstate.context).GetMaxMemory(); const idx_t thread_limit = 0.6 * memory_limit / n_threads; - const idx_t size_per_entry = partition.data->SizeInBytes() / partition.data->Count() + + const idx_t size_per_entry = partition.data->SizeInBytes() / MaxValue(partition.data->Count(), 1) + idx_t(GroupedAggregateHashTable::LOAD_FACTOR * sizeof(aggr_ht_entry_t)); const auto capacity_limit = NextPowerOfTwo(thread_limit / size_per_entry); @@ -182179,32 +183983,34 @@ void RadixHTLocalSourceState::Finalize(RadixHTGlobalSinkState &sink, RadixHTGlob // Now combine the uncombined data using this thread's HT ht->Combine(*partition.data, &partition.progress); ht->UnpinData(); + partition.progress = 1; // Move the combined data back to the partition partition.data = make_uniq(BufferManager::GetBufferManager(gstate.context), sink.radix_ht.GetLayout()); partition.data->Combine(*ht->GetPartitionedData()->GetPartitions()[0]); - // Mark partition as ready to scan - lock_guard glock(gstate.lock); - partition.finalized = true; - - if (++sink.finalize_done == sink.partitions.size()) { + // Update thread-global state + lock_guard global_guard(gstate.lock); + sink.stored_allocators.emplace_back(ht->GetAggregateAllocator()); + const auto finalizes_done = ++sink.finalize_done; + D_ASSERT(finalizes_done <= sink.partitions.size()); + if (finalizes_done == sink.partitions.size()) { // All finalizes are done, set remaining size to 0 sink.temporary_memory_state->SetRemainingSize(sink.context, 0); } - // Unblock blocked tasks so they can scan this partition - lock_guard sink_guard(sink.lock); - if (!sink.blocked_tasks.empty()) { - for (auto &state : sink.blocked_tasks) { - state.Callback(); - } - sink.blocked_tasks.clear(); + // Update partition state + lock_guard partition_guard(partition.lock); + partition.state = AggregatePartitionState::READY_TO_SCAN; + for (auto &blocked_task : partition.blocked_tasks) { + blocked_task.Callback(); } + partition.blocked_tasks.clear(); - // Make sure this thread's aggregate allocator does not get lost - sink.stored_allocators.emplace_back(ht->GetAggregateAllocator()); + // This thread will scan the partition + task = RadixHTSourceTaskType::SCAN; + scan_status = RadixHTScanStatus::INIT; } void RadixHTLocalSourceState::Scan(RadixHTGlobalSinkState &sink, RadixHTGlobalSourceState &gstate, DataChunk &chunk) { @@ -182212,36 +184018,24 @@ void RadixHTLocalSourceState::Scan(RadixHTGlobalSinkState &sink, RadixHTGlobalSo D_ASSERT(scan_status != RadixHTScanStatus::DONE); auto &partition = *sink.partitions[task_idx]; - D_ASSERT(partition.finalized); + D_ASSERT(partition.state == AggregatePartitionState::READY_TO_SCAN); auto &data_collection = *partition.data; - if (data_collection.Count() == 0) { - scan_status = RadixHTScanStatus::DONE; - lock_guard gstate_guard(gstate.lock); - if (++gstate.scan_done == sink.partitions.size()) { - gstate.finished = true; - } - return; - } - if (scan_status == RadixHTScanStatus::INIT) { data_collection.InitializeScan(scan_state, gstate.column_ids, sink.scan_pin_properties); scan_status = RadixHTScanStatus::IN_PROGRESS; } if (!data_collection.Scan(scan_state, scan_chunk)) { - scan_status = RadixHTScanStatus::DONE; if (sink.scan_pin_properties == TupleDataPinProperties::DESTROY_AFTER_DONE) { data_collection.Reset(); } - return; - } - - if (data_collection.ScanComplete(scan_state)) { + scan_status = RadixHTScanStatus::DONE; lock_guard gstate_guard(gstate.lock); - if (++gstate.scan_done == sink.partitions.size()) { + if (++gstate.task_done == sink.partitions.size()) { gstate.finished = true; } + return; } RowOperationsState row_state(aggregate_allocator); @@ -182336,15 +184130,10 @@ SourceResultType RadixPartitionedHashTable::GetData(ExecutionContext &context, D while (!gstate.finished && chunk.size() == 0) { if (lstate.TaskFinished()) { - lock_guard gstate_guard(gstate.lock); - if (!gstate.AssignTask(sink, lstate)) { - if (gstate.scan_idx < sink.partitions.size()) { - lock_guard sink_guard(sink.lock); - sink.blocked_tasks.push_back(input.interrupt_state); - return SourceResultType::BLOCKED; - } else { - return SourceResultType::FINISHED; - } + const auto res = gstate.AssignTask(sink, lstate, input.interrupt_state); + if (res != SourceResultType::HAVE_MORE_OUTPUT) { + D_ASSERT(res == SourceResultType::FINISHED || res == SourceResultType::BLOCKED); + return res; } } lstate.ExecuteTask(sink, gstate, chunk); @@ -182365,11 +184154,11 @@ double RadixPartitionedHashTable::GetProgress(ClientContext &, GlobalSinkState & // Get partition combine progress, weigh it 2x double total_progress = 0; for (auto &partition : sink.partitions) { - total_progress += partition->progress * 2.0; + total_progress += 2.0 * partition->progress; } // Get scan progress, weigh it 1x - total_progress += gstate.scan_done; + total_progress += 1.0 * gstate.task_done; // Divide by 3x for the weights, and the number of partitions to get a value between 0 and 1 again total_progress /= 3.0 * sink.partitions.size(); @@ -182686,7 +184475,7 @@ void BaseReservoirSampling::ReplaceElement(double with_weight) { r2 = with_weight; } //! now we insert the new weight into the reservoir - reservoir_weights.push(std::make_pair(-r2, min_weighted_entry_index)); + reservoir_weights.emplace(-r2, min_weighted_entry_index); //! we update the min entry with the new min entry in the reservoir SetNextEntry(); } @@ -182893,17 +184682,34 @@ struct OperationCompare : public std::function { template static idx_t FindTypedRangeBound(const WindowInputColumn &over, const idx_t order_begin, const idx_t order_end, - WindowInputExpression &boundary, const idx_t chunk_idx, const FrameBounds &prev) { + const WindowBoundary range, WindowInputExpression &boundary, const idx_t chunk_idx, + const FrameBounds &prev) { D_ASSERT(!boundary.CellIsNull(chunk_idx)); const auto val = boundary.GetCell(chunk_idx); OperationCompare comp; - WindowColumnIterator begin(over, order_begin); - WindowColumnIterator end(over, order_end); + + // Check that the value we are searching for is in range. + if (range == WindowBoundary::EXPR_PRECEDING_RANGE) { + // Preceding but value past the end + const auto cur_val = over.GetCell(order_end); + if (comp(cur_val, val)) { + throw OutOfRangeException("Invalid RANGE PRECEDING value"); + } + } else { + // Following but value before beginning + D_ASSERT(range == WindowBoundary::EXPR_FOLLOWING_RANGE); + const auto cur_val = over.GetCell(order_begin); + if (comp(val, cur_val)) { + throw OutOfRangeException("Invalid RANGE FOLLOWING value"); + } + } // Try to reuse the previous bounds to restrict the search. // This is only valid if the previous bounds were non-empty // Only inject the comparisons if the previous bounds are a strict subset. + WindowColumnIterator begin(over, order_begin); + WindowColumnIterator end(over, order_end); if (prev.start < prev.end) { if (order_begin < prev.start && prev.start < order_end) { const auto first = over.GetCell(prev.start); @@ -182931,37 +184737,40 @@ static idx_t FindTypedRangeBound(const WindowInputColumn &over, const idx_t orde template static idx_t FindRangeBound(const WindowInputColumn &over, const idx_t order_begin, const idx_t order_end, - WindowInputExpression &boundary, const idx_t chunk_idx, const FrameBounds &prev) { + const WindowBoundary range, WindowInputExpression &boundary, const idx_t chunk_idx, + const FrameBounds &prev) { D_ASSERT(boundary.chunk.ColumnCount() == 1); D_ASSERT(boundary.chunk.data[0].GetType().InternalType() == over.input_expr.ptype); switch (over.input_expr.ptype) { case PhysicalType::INT8: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT16: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT32: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT64: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT8: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT16: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT32: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT64: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT128: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT128: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, + prev); case PhysicalType::FLOAT: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::DOUBLE: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INTERVAL: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, + prev); default: throw InternalException("Unsupported column type for RANGE"); } @@ -182969,13 +184778,13 @@ static idx_t FindRangeBound(const WindowInputColumn &over, const idx_t order_beg template static idx_t FindOrderedRangeBound(const WindowInputColumn &over, const OrderType range_sense, const idx_t order_begin, - const idx_t order_end, WindowInputExpression &boundary, const idx_t chunk_idx, - const FrameBounds &prev) { + const idx_t order_end, const WindowBoundary range, WindowInputExpression &boundary, + const idx_t chunk_idx, const FrameBounds &prev) { switch (range_sense) { case OrderType::ASCENDING: - return FindRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case OrderType::DESCENDING: - return FindRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); default: throw InternalException("Unsupported ORDER BY sense for RANGE"); } @@ -183152,7 +184961,7 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn window_start = peer_start; } else { prev.start = FindOrderedRangeBound(range_collection, range_sense, valid_start, row_idx, - boundary_start, chunk_idx, prev); + start_boundary, boundary_start, chunk_idx, prev); window_start = prev.start; } break; @@ -183161,8 +184970,8 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn if (boundary_start.CellIsNull(chunk_idx)) { window_start = peer_start; } else { - prev.start = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, boundary_start, - chunk_idx, prev); + prev.start = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, start_boundary, + boundary_start, chunk_idx, prev); window_start = prev.start; } break; @@ -183196,8 +185005,8 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn if (boundary_end.CellIsNull(chunk_idx)) { window_end = peer_end; } else { - prev.end = FindOrderedRangeBound(range_collection, range_sense, valid_start, row_idx, boundary_end, - chunk_idx, prev); + prev.end = FindOrderedRangeBound(range_collection, range_sense, valid_start, row_idx, end_boundary, + boundary_end, chunk_idx, prev); window_end = prev.end; } break; @@ -183206,8 +185015,8 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn if (boundary_end.CellIsNull(chunk_idx)) { window_end = peer_end; } else { - prev.end = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, boundary_end, - chunk_idx, prev); + prev.end = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, end_boundary, + boundary_end, chunk_idx, prev); window_end = prev.end; } break; @@ -184284,9 +186093,9 @@ namespace duckdb { WindowAggregatorState::WindowAggregatorState() : allocator(Allocator::DefaultAllocator()) { } -WindowAggregator::WindowAggregator(AggregateObject aggr, const LogicalType &result_type_p, +WindowAggregator::WindowAggregator(AggregateObject aggr_p, const LogicalType &result_type_p, const WindowExcludeMode exclude_mode_p, idx_t partition_count_p) - : aggr(std::move(aggr)), result_type(result_type_p), partition_count(partition_count_p), + : aggr(std::move(aggr_p)), result_type(result_type_p), partition_count(partition_count_p), state_size(aggr.function.state_size()), filter_pos(0), exclude_mode(exclude_mode_p) { } @@ -184736,7 +186545,7 @@ WindowNaiveState::WindowNaiveState(const WindowNaiveAggregator &gstate) row_set(STANDARD_VECTOR_SIZE, hash_row, equal_row) { InitSubFrames(frames, gstate.exclude_mode); - auto &inputs = const_cast(gstate.GetInputs()); + auto &inputs = gstate.GetInputs(); if (inputs.ColumnCount() > 0) { leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes()); } @@ -184760,9 +186569,8 @@ void WindowNaiveState::FlushStates() { return; } - auto &inputs = const_cast(gstate.GetInputs()); - leaves.Reference(inputs); - leaves.Slice(update_sel, flush_count); + auto &inputs = gstate.GetInputs(); + leaves.Slice(inputs, update_sel, flush_count); auto &aggr = gstate.aggr; AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator); @@ -184772,19 +186580,18 @@ void WindowNaiveState::FlushStates() { } size_t WindowNaiveState::Hash(idx_t rid) { - auto &inputs = const_cast(gstate.GetInputs()); - leaves.Reference(inputs); + auto &inputs = gstate.GetInputs(); auto s = UnsafeNumericCast(rid); SelectionVector sel(&s); - leaves.Slice(sel, 1); + leaves.Slice(inputs, sel, 1); leaves.Hash(hashes); return *FlatVector::GetData(hashes); } bool WindowNaiveState::KeyEqual(const idx_t &lhs, const idx_t &rhs) { - auto &inputs = const_cast(gstate.GetInputs()); + auto &inputs = gstate.GetInputs(); auto l = UnsafeNumericCast(lhs); SelectionVector lsel(&l); @@ -184910,7 +186717,7 @@ class WindowSegmentTreePart { enum FramePart : uint8_t { FULL = 0, LEFT = 1, RIGHT = 2 }; - WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs, + WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, const DataChunk &inputs, const ValidityMask &filter_mask); ~WindowSegmentTreePart(); @@ -184947,7 +186754,7 @@ class WindowSegmentTreePart { //! Order insensitive aggregate (we can optimise internal combines) const bool order_insensitive; //! The partition arguments - DataChunk &inputs; + const DataChunk &inputs; //! The filtered rows in inputs const ValidityMask &filter_mask; //! The size of a single aggregate state @@ -184972,14 +186779,14 @@ class WindowSegmentTreePart { class WindowSegmentTreeState : public WindowAggregatorState { public: - WindowSegmentTreeState(const AggregateObject &aggr, DataChunk &inputs, const ValidityMask &filter_mask) + WindowSegmentTreeState(const AggregateObject &aggr, const DataChunk &inputs, const ValidityMask &filter_mask) : aggr(aggr), inputs(inputs), filter_mask(filter_mask), part(allocator, aggr, inputs, filter_mask) { } //! The aggregate function const AggregateObject &aggr; //! The aggregate function - DataChunk &inputs; + const DataChunk &inputs; //! The filtered rows in inputs const ValidityMask &filter_mask; //! The left (default) segment tree part @@ -184988,8 +186795,8 @@ class WindowSegmentTreeState : public WindowAggregatorState { unique_ptr right_part; }; -WindowSegmentTreePart::WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs, - const ValidityMask &filter_mask) +WindowSegmentTreePart::WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, + const DataChunk &inputs, const ValidityMask &filter_mask) : allocator(allocator), aggr(aggr), order_insensitive(aggr.function.order_dependent == AggregateOrderDependent::NOT_ORDER_DEPENDENT), inputs(inputs), filter_mask(filter_mask), state_size(aggr.function.state_size()), state(state_size * STANDARD_VECTOR_SIZE), @@ -185015,7 +186822,7 @@ WindowSegmentTreePart::~WindowSegmentTreePart() { } unique_ptr WindowSegmentTree::GetLocalState() const { - return make_uniq(aggr, const_cast(inputs), filter_mask); + return make_uniq(aggr, inputs, filter_mask); } void WindowSegmentTreePart::FlushStates(bool combining) { @@ -185028,8 +186835,7 @@ void WindowSegmentTreePart::FlushStates(bool combining) { statel.Verify(flush_count); aggr.function.combine(statel, statep, aggr_input_data, flush_count); } else { - leaves.Reference(inputs); - leaves.Slice(filter_sel, flush_count); + leaves.Slice(inputs, filter_sel, flush_count); aggr.function.update(&leaves.data[0], aggr_input_data, leaves.ColumnCount(), statep, flush_count); } @@ -185648,7 +187454,7 @@ WindowDistinctAggregator::DistinctSortTree::DistinctSortTree(ZippedElements &&pr class WindowDistinctState : public WindowAggregatorState { public: - WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs, const WindowDistinctAggregator &tree); + WindowDistinctState(const AggregateObject &aggr, const DataChunk &inputs, const WindowDistinctAggregator &tree); void Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx); @@ -185659,7 +187465,7 @@ class WindowDistinctState : public WindowAggregatorState { //! The aggregate function const AggregateObject &aggr; //! The aggregate function - DataChunk &inputs; + const DataChunk &inputs; //! The merge sort tree data const WindowDistinctAggregator &tree; //! The size of a single aggregate state @@ -185678,7 +187484,7 @@ class WindowDistinctState : public WindowAggregatorState { SubFrames frames; }; -WindowDistinctState::WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs, +WindowDistinctState::WindowDistinctState(const AggregateObject &aggr, const DataChunk &inputs, const WindowDistinctAggregator &tree) : aggr(aggr), inputs(inputs), tree(tree), state_size(aggr.function.state_size()), state((state_size * STANDARD_VECTOR_SIZE)), statef(LogicalType::POINTER), statep(LogicalType::POINTER), @@ -185754,7 +187560,7 @@ void WindowDistinctState::Evaluate(const DataChunk &bounds, Vector &result, idx_ } unique_ptr WindowDistinctAggregator::GetLocalState() const { - return make_uniq(aggr, const_cast(inputs), *this); + return make_uniq(aggr, inputs, *this); } void WindowDistinctAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result, @@ -186942,7 +188748,7 @@ struct SortedAggregateFunction { template static void Combine(const STATE &source, STATE &target, AggregateInputData &aggr_input_data) { auto &order_bind = aggr_input_data.bind_data->Cast(); - auto &other = const_cast(source); + auto &other = const_cast(source); // NOLINT: absorb explicitly allows destruction target.Absorb(order_bind, other); } @@ -187655,7 +189461,8 @@ struct VectorTryCastData { struct HandleVectorCastError { template - static RESULT_TYPE Operation(string error_message, ValidityMask &mask, idx_t idx, VectorTryCastData &cast_data) { + static RESULT_TYPE Operation(const string &error_message, ValidityMask &mask, idx_t idx, + VectorTryCastData &cast_data) { HandleCastError::AssignError(error_message, cast_data.parameters); cast_data.all_converted = false; mask.SetInvalid(idx); @@ -187675,7 +189482,7 @@ template struct VectorStringCastOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto result = (Vector *)dataptr; + auto result = reinterpret_cast(dataptr); return OP::template Operation(input, *result); } }; @@ -187688,7 +189495,7 @@ struct VectorTryCastOperator { if (DUCKDB_LIKELY(OP::template Operation(input, output))) { return output; } - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); return HandleVectorCastError::Operation(CastExceptionText(input), mask, idx, *data); } @@ -187698,7 +189505,7 @@ template struct VectorTryCastStrictOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE output; if (DUCKDB_LIKELY(OP::template Operation(input, output, data->parameters.strict))) { return output; @@ -187712,7 +189519,7 @@ template struct VectorTryCastErrorOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE output; if (DUCKDB_LIKELY(OP::template Operation(input, output, data->parameters))) { return output; @@ -187728,7 +189535,7 @@ template struct VectorTryCastStringOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE output; if (DUCKDB_LIKELY( OP::template Operation(input, output, data->result, data->parameters))) { @@ -187753,7 +189560,7 @@ template struct VectorDecimalCastOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorDecimalCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE result_value; if (!OP::template Operation(input, result_value, data->vector_cast_data.parameters, data->width, data->scale)) { @@ -188642,43 +190449,26 @@ namespace duckdb { template bool EnumEnumCast(Vector &source, Vector &result, idx_t count, CastParameters ¶meters) { - result.SetVectorType(VectorType::FLAT_VECTOR); - - auto &str_vec = EnumType::GetValuesInsertOrder(source.GetType()); - auto str_vec_ptr = FlatVector::GetData(str_vec); - + auto &enum_dictionary = EnumType::GetValuesInsertOrder(source.GetType()); + auto dictionary_data = FlatVector::GetData(enum_dictionary); auto res_enum_type = result.GetType(); - UnifiedVectorFormat vdata; - source.ToUnifiedFormat(count, vdata); - - auto source_data = UnifiedVectorFormat::GetData(vdata); - auto source_sel = vdata.sel; - auto source_mask = vdata.validity; - - auto result_data = FlatVector::GetData(result); - auto &result_mask = FlatVector::Validity(result); - VectorTryCastData vector_cast_data(result, parameters); - for (idx_t i = 0; i < count; i++) { - auto src_idx = source_sel->get_index(i); - if (!source_mask.RowIsValid(src_idx)) { - result_mask.SetInvalid(i); - continue; - } - auto key = EnumType::GetPos(res_enum_type, str_vec_ptr[source_data[src_idx]]); - if (key == -1) { - // key doesn't exist on result enum - if (!parameters.error_message) { - result_data[i] = HandleVectorCastError::Operation( - CastExceptionText(source_data[src_idx]), result_mask, i, vector_cast_data); - } else { - result_mask.SetInvalid(i); - } - continue; - } - result_data[i] = UnsafeNumericCast(key); - } + UnaryExecutor::ExecuteWithNulls( + source, result, count, [&](SRC_TYPE value, ValidityMask &mask, idx_t row_idx) { + auto key = EnumType::GetPos(res_enum_type, dictionary_data[value]); + if (key == -1) { + if (!parameters.error_message) { + return HandleVectorCastError::Operation(CastExceptionText(value), + mask, row_idx, vector_cast_data); + } else { + mask.SetInvalid(row_idx); + } + return RES_TYPE(); + } else { + return UnsafeNumericCast(key); + } + }); return vector_cast_data.all_converted; } @@ -188700,27 +190490,9 @@ template static bool EnumToVarcharCast(Vector &source, Vector &result, idx_t count, CastParameters ¶meters) { auto &enum_dictionary = EnumType::GetValuesInsertOrder(source.GetType()); auto dictionary_data = FlatVector::GetData(enum_dictionary); - auto result_data = FlatVector::GetData(result); - auto &result_mask = FlatVector::Validity(result); - - UnifiedVectorFormat vdata; - source.ToUnifiedFormat(count, vdata); - auto source_data = UnifiedVectorFormat::GetData(vdata); - for (idx_t i = 0; i < count; i++) { - auto source_idx = vdata.sel->get_index(i); - if (!vdata.validity.RowIsValid(source_idx)) { - result_mask.SetInvalid(i); - continue; - } - auto enum_idx = source_data[source_idx]; - result_data[i] = dictionary_data[enum_idx]; - } - if (source.GetVectorType() == VectorType::CONSTANT_VECTOR) { - result.SetVectorType(VectorType::CONSTANT_VECTOR); - } else { - result.SetVectorType(VectorType::FLAT_VECTOR); - } + UnaryExecutor::Execute(source, result, count, + [&](SRC enum_idx) { return dictionary_data[enum_idx]; }); return true; } @@ -190801,25 +192573,26 @@ static bool SkipToCloseQuotes(idx_t &pos, const char *buf, idx_t &len) { static bool SkipToClose(idx_t &idx, const char *buf, idx_t &len, idx_t &lvl, char close_bracket) { idx++; + vector brackets; + brackets.push_back(close_bracket); while (idx < len) { if (buf[idx] == '"' || buf[idx] == '\'') { if (!SkipToCloseQuotes(idx, buf, len)) { return false; } } else if (buf[idx] == '{') { - if (!SkipToClose(idx, buf, len, lvl, '}')) { - return false; - } + brackets.push_back('}'); } else if (buf[idx] == '[') { - if (!SkipToClose(idx, buf, len, lvl, ']')) { - return false; - } + brackets.push_back(']'); lvl++; - } else if (buf[idx] == close_bracket) { - if (close_bracket == ']') { + } else if (buf[idx] == brackets.back()) { + if (buf[idx] == ']') { lvl--; } - return true; + brackets.pop_back(); + if (brackets.empty()) { + return true; + } } idx++; } @@ -191143,6 +192916,8 @@ static int64_t TargetTypeCost(const LogicalType &type) { return 121; case LogicalTypeId::TIMESTAMP_SEC: return 122; + case LogicalTypeId::TIMESTAMP_TZ: + return 123; case LogicalTypeId::VARCHAR: return 149; case LogicalTypeId::STRUCT: @@ -191378,6 +193153,8 @@ static int64_t ImplicitCastTimestamp(const LogicalType &to) { switch (to.id()) { case LogicalTypeId::TIMESTAMP_NS: return TargetTypeCost(to); + case LogicalTypeId::TIMESTAMP_TZ: + return TargetTypeCost(to); default: return -1; } @@ -191501,8 +193278,12 @@ int64_t CastRules::ImplicitCast(const LogicalType &from, const LogicalType &to) } if (from.id() == LogicalTypeId::ARRAY && to.id() == LogicalTypeId::LIST) { // Arrays can be cast to lists for the cost of casting the child type + auto child_cost = ImplicitCast(ArrayType::GetChildType(from), ListType::GetChildType(to)); + if (child_cost < 0) { + return -1; + } // add 1 because we prefer ARRAY->ARRAY casts over ARRAY->LIST casts - return ImplicitCast(ArrayType::GetChildType(from), ListType::GetChildType(to)) + 1; + return child_cost + 1; } if (from.id() == LogicalTypeId::LIST && (to.id() == LogicalTypeId::ARRAY && !ArrayType::IsAnySize(to))) { // Lists can be cast to arrays for the cost of casting the child type, if the target size is known @@ -191686,7 +193467,7 @@ struct DefaultCompressionMethod { compression_supports_type_t supports_type; }; -static DefaultCompressionMethod internal_compression_methods[] = { +static const DefaultCompressionMethod internal_compression_methods[] = { {CompressionType::COMPRESSION_CONSTANT, ConstantFun::GetFunction, ConstantFun::TypeIsSupported}, {CompressionType::COMPRESSION_UNCOMPRESSED, UncompressedFun::GetFunction, UncompressedFun::TypeIsSupported}, {CompressionType::COMPRESSION_RLE, RLEFun::GetFunction, RLEFun::TypeIsSupported}, @@ -191953,12 +193734,12 @@ namespace duckdb { FunctionBinder::FunctionBinder(ClientContext &context) : context(context) { } -int64_t FunctionBinder::BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments) { +optional_idx FunctionBinder::BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments) { if (arguments.size() < func.arguments.size()) { // not enough arguments to fulfill the non-vararg part of the function - return -1; + return optional_idx(); } - int64_t cost = 0; + idx_t cost = 0; for (idx_t i = 0; i < arguments.size(); i++) { LogicalType arg_type = i < func.arguments.size() ? func.arguments[i] : func.varargs; if (arguments[i] == arg_type) { @@ -191968,25 +193749,25 @@ int64_t FunctionBinder::BindVarArgsFunctionCost(const SimpleFunction &func, cons int64_t cast_cost = CastFunctionSet::Get(context).ImplicitCastCost(arguments[i], arg_type); if (cast_cost >= 0) { // we can implicitly cast, add the cost to the total cost - cost += cast_cost; + cost += idx_t(cast_cost); } else { // we can't implicitly cast: throw an error - return -1; + return optional_idx(); } } return cost; } -int64_t FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vector &arguments) { +optional_idx FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vector &arguments) { if (func.HasVarArgs()) { // special case varargs function return BindVarArgsFunctionCost(func, arguments); } if (func.arguments.size() != arguments.size()) { // invalid argument count: check the next function - return -1; + return optional_idx(); } - int64_t cost = 0; + idx_t cost = 0; bool has_parameter = false; for (idx_t i = 0; i < arguments.size(); i++) { if (arguments[i].id() == LogicalTypeId::UNKNOWN) { @@ -191996,10 +193777,10 @@ int64_t FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vecto int64_t cast_cost = CastFunctionSet::Get(context).ImplicitCastCost(arguments[i], func.arguments[i]); if (cast_cost >= 0) { // we can implicitly cast, add the cost to the total cost - cost += cast_cost; + cost += idx_t(cast_cost); } else { // we can't implicitly cast: throw an error - return -1; + return optional_idx(); } } if (has_parameter) { @@ -192012,17 +193793,18 @@ int64_t FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vecto template vector FunctionBinder::BindFunctionsFromArguments(const string &name, FunctionSet &functions, const vector &arguments, ErrorData &error) { - idx_t best_function = DConstants::INVALID_INDEX; - int64_t lowest_cost = NumericLimits::Maximum(); + optional_idx best_function; + idx_t lowest_cost = NumericLimits::Maximum(); vector candidate_functions; for (idx_t f_idx = 0; f_idx < functions.functions.size(); f_idx++) { auto &func = functions.functions[f_idx]; // check the arguments of the function - int64_t cost = BindFunctionCost(func, arguments); - if (cost < 0) { + auto bind_cost = BindFunctionCost(func, arguments); + if (!bind_cost.IsValid()) { // auto casting was not possible continue; } + auto cost = bind_cost.GetIndex(); if (cost == lowest_cost) { candidate_functions.push_back(f_idx); continue; @@ -192034,7 +193816,7 @@ vector FunctionBinder::BindFunctionsFromArguments(const string &name, Fun lowest_cost = cost; best_function = f_idx; } - if (best_function == DConstants::INVALID_INDEX) { + if (!best_function.IsValid()) { // no matching function was found, throw an error vector candidates; for (auto &f : functions.functions) { @@ -192043,14 +193825,14 @@ vector FunctionBinder::BindFunctionsFromArguments(const string &name, Fun error = ErrorData(BinderException::NoMatchingFunction(name, arguments, candidates)); return candidate_functions; } - candidate_functions.push_back(best_function); + candidate_functions.push_back(best_function.GetIndex()); return candidate_functions; } template -idx_t FunctionBinder::MultipleCandidateException(const string &name, FunctionSet &functions, - vector &candidate_functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::MultipleCandidateException(const string &name, FunctionSet &functions, + vector &candidate_functions, + const vector &arguments, ErrorData &error) { D_ASSERT(functions.functions.size() > 1); // there are multiple possible function definitions // throw an exception explaining which overloads are there @@ -192065,16 +193847,16 @@ idx_t FunctionBinder::MultipleCandidateException(const string &name, FunctionSet StringUtil::Format("Could not choose a best candidate function for the function call \"%s\". In order to " "select one, please add explicit type casts.\n\tCandidate functions:\n%s", call_str, candidate_str)); - return DConstants::INVALID_INDEX; + return optional_idx(); } template -idx_t FunctionBinder::BindFunctionFromArguments(const string &name, FunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunctionFromArguments(const string &name, FunctionSet &functions, + const vector &arguments, ErrorData &error) { auto candidate_functions = BindFunctionsFromArguments(name, functions, arguments, error); if (candidate_functions.empty()) { // no candidates - return DConstants::INVALID_INDEX; + return optional_idx(); } if (candidate_functions.size() > 1) { // multiple candidates, check if there are any unknown arguments @@ -192092,32 +193874,32 @@ idx_t FunctionBinder::BindFunctionFromArguments(const string &name, FunctionSet< return candidate_functions[0]; } -idx_t FunctionBinder::BindFunction(const string &name, ScalarFunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, ScalarFunctionSet &functions, + const vector &arguments, ErrorData &error) { return BindFunctionFromArguments(name, functions, arguments, error); } -idx_t FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, + const vector &arguments, ErrorData &error) { return BindFunctionFromArguments(name, functions, arguments, error); } -idx_t FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, + const vector &arguments, ErrorData &error) { return BindFunctionFromArguments(name, functions, arguments, error); } -idx_t FunctionBinder::BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, - ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, + ErrorData &error) { vector types; for (auto &value : parameters) { types.push_back(value.type()); } - idx_t entry = BindFunctionFromArguments(name, functions, types, error); - if (entry == DConstants::INVALID_INDEX) { + auto entry = BindFunctionFromArguments(name, functions, types, error); + if (!entry.IsValid()) { error.Throw(); } - auto candidate_function = functions.GetFunctionByOffset(entry); + auto candidate_function = functions.GetFunctionByOffset(entry.GetIndex()); // cast the input parameters for (idx_t i = 0; i < parameters.size(); i++) { auto target_type = @@ -192136,25 +193918,25 @@ vector FunctionBinder::GetLogicalTypesFromExpressions(vector> &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, ScalarFunctionSet &functions, + vector> &arguments, ErrorData &error) { auto types = GetLogicalTypesFromExpressions(arguments); return BindFunction(name, functions, types, error); } -idx_t FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, - vector> &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, + vector> &arguments, ErrorData &error) { auto types = GetLogicalTypesFromExpressions(arguments); return BindFunction(name, functions, types, error); } -idx_t FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, - vector> &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, + vector> &arguments, ErrorData &error) { auto types = GetLogicalTypesFromExpressions(arguments); return BindFunction(name, functions, types, error); } -enum class LogicalTypeComparisonResult { IDENTICAL_TYPE, TARGET_IS_ANY, DIFFERENT_TYPES }; +enum class LogicalTypeComparisonResult : uint8_t { IDENTICAL_TYPE, TARGET_IS_ANY, DIFFERENT_TYPES }; LogicalTypeComparisonResult RequiresCast(const LogicalType &source_type, const LogicalType &target_type) { if (target_type.id() == LogicalTypeId::ANY) { @@ -192226,13 +194008,13 @@ unique_ptr FunctionBinder::BindScalarFunction(ScalarFunctionCatalogE vector> children, ErrorData &error, bool is_operator, Binder *binder) { // bind the function - idx_t best_function = BindFunction(func.name, func.functions, children, error); - if (best_function == DConstants::INVALID_INDEX) { + auto best_function = BindFunction(func.name, func.functions, children, error); + if (!best_function.IsValid()) { return nullptr; } // found a matching function! - auto bound_function = func.functions.GetFunctionByOffset(best_function); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); // If any of the parameters are NULL, the function will just be replaced with a NULL constant // But this NULL constant needs to have to correct type, because we use LogicalType::SQLNULL for binding macro's @@ -192325,12 +194107,12 @@ ScalarFunctionSet::ScalarFunctionSet(ScalarFunction fun) : FunctionSet(std::move ScalarFunction ScalarFunctionSet::GetFunctionByArguments(ClientContext &context, const vector &arguments) { ErrorData error; FunctionBinder binder(context); - idx_t index = binder.BindFunction(name, *this, arguments, error); - if (index == DConstants::INVALID_INDEX) { + auto index = binder.BindFunction(name, *this, arguments, error); + if (!index.IsValid()) { throw InternalException("Failed to find function %s(%s)\n%s", name, StringUtil::ToString(arguments, ","), error.Message()); } - return GetFunctionByOffset(index); + return GetFunctionByOffset(index.GetIndex()); } AggregateFunctionSet::AggregateFunctionSet() : FunctionSet("") { @@ -192347,8 +194129,8 @@ AggregateFunction AggregateFunctionSet::GetFunctionByArguments(ClientContext &co const vector &arguments) { ErrorData error; FunctionBinder binder(context); - idx_t index = binder.BindFunction(name, *this, arguments, error); - if (index == DConstants::INVALID_INDEX) { + auto index = binder.BindFunction(name, *this, arguments, error); + if (!index.IsValid()) { // check if the arguments are a prefix of any of the arguments // this is used for functions such as quantile or string_agg that delete part of their arguments during bind // FIXME: we should come up with a better solution here @@ -192370,7 +194152,7 @@ AggregateFunction AggregateFunctionSet::GetFunctionByArguments(ClientContext &co throw InternalException("Failed to find function %s(%s)\n%s", name, StringUtil::ToString(arguments, ","), error.Message()); } - return GetFunctionByOffset(index); + return GetFunctionByOffset(index.GetIndex()); } TableFunctionSet::TableFunctionSet(string name) : FunctionSet(std::move(name)) { @@ -192383,12 +194165,12 @@ TableFunctionSet::TableFunctionSet(TableFunction fun) : FunctionSet(std::move(fu TableFunction TableFunctionSet::GetFunctionByArguments(ClientContext &context, const vector &arguments) { ErrorData error; FunctionBinder binder(context); - idx_t index = binder.BindFunction(name, *this, arguments, error); - if (index == DConstants::INVALID_INDEX) { + auto index = binder.BindFunction(name, *this, arguments, error); + if (!index.IsValid()) { throw InternalException("Failed to find function %s(%s)\n%s", name, StringUtil::ToString(arguments, ","), error.Message()); } - return GetFunctionByOffset(index); + return GetFunctionByOffset(index.GetIndex()); } PragmaFunctionSet::PragmaFunctionSet(string name) : FunctionSet(std::move(name)) { @@ -192862,8 +194644,7 @@ string PragmaImportDatabase(ClientContext &context, const FunctionParameters &pa vector files = {"schema.sql", "load.sql"}; for (auto &file : files) { auto file_path = fs.JoinPath(parameters.values[0].ToString(), file); - auto handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, - FileSystem::DEFAULT_COMPRESSION); + auto handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_READ); auto fsize = fs.GetFileSize(*handle); auto buffer = make_unsafe_uniq_array(fsize); fs.Read(*handle, buffer.get(), fsize); @@ -193081,9 +194862,25 @@ static string IntegralDecompressFunctionName(const LogicalType &result_type) { } template -static inline RESULT_TYPE TemplatedIntegralDecompress(const INPUT_TYPE &input, const RESULT_TYPE &min_val) { - return UnsafeNumericCast(min_val + input); -} +struct TemplatedIntegralDecompress { + static inline RESULT_TYPE Operation(const INPUT_TYPE &input, const RESULT_TYPE &min_val) { + return min_val + UnsafeNumericCast(input); + } +}; + +template +struct TemplatedIntegralDecompress { + static inline hugeint_t Operation(const INPUT_TYPE &input, const hugeint_t &min_val) { + return min_val + hugeint_t(0, input); + } +}; + +template +struct TemplatedIntegralDecompress { + static inline uhugeint_t Operation(const INPUT_TYPE &input, const uhugeint_t &min_val) { + return min_val + uhugeint_t(0, input); + } +}; template static void IntegralDecompressFunction(DataChunk &args, ExpressionState &state, Vector &result) { @@ -193092,7 +194889,7 @@ static void IntegralDecompressFunction(DataChunk &args, ExpressionState &state, D_ASSERT(args.data[1].GetType() == result.GetType()); const auto min_val = ConstantVector::GetData(args.data[1])[0]; UnaryExecutor::Execute(args.data[0], result, args.size(), [&](const INPUT_TYPE &input) { - return TemplatedIntegralDecompress(input, min_val); + return TemplatedIntegralDecompress::Operation(input, min_val); }); } @@ -193222,13 +195019,13 @@ static string StringCompressFunctionName(const LogicalType &result_type) { } template -static inline void TemplatedReverseMemCpy(const data_ptr_t __restrict &dest, const const_data_ptr_t __restrict &src) { +static inline void TemplatedReverseMemCpy(const data_ptr_t &__restrict dest, const const_data_ptr_t &__restrict src) { for (idx_t i = 0; i < LENGTH; i++) { dest[i] = src[LENGTH - 1 - i]; } } -static inline void ReverseMemCpy(const data_ptr_t __restrict &dest, const const_data_ptr_t __restrict &src, +static inline void ReverseMemCpy(const data_ptr_t &__restrict dest, const const_data_ptr_t &__restrict src, const idx_t &length) { for (idx_t i = 0; i < length; i++) { dest[i] = src[length - 1 - i]; @@ -194307,6 +196104,7 @@ void ListResizeFun::RegisterFunction(BuiltinFunctions &set) { + namespace duckdb { struct SetSelectionVectorSelect { @@ -194443,6 +196241,10 @@ static void ListSelectFunction(DataChunk &args, ExpressionState &state, Vector & static unique_ptr ListSelectBind(ClientContext &context, ScalarFunction &bound_function, vector> &arguments) { D_ASSERT(bound_function.arguments.size() == 2); + + // If the first argument is an array, cast it to a list + arguments[0] = BoundCastExpression::AddArrayCastToList(context, std::move(arguments[0])); + LogicalType child_type; if (arguments[0]->return_type == LogicalTypeId::UNKNOWN || arguments[1]->return_type == LogicalTypeId::UNKNOWN) { bound_function.arguments[0] = LogicalTypeId::UNKNOWN; @@ -194452,8 +196254,6 @@ static unique_ptr ListSelectBind(ClientContext &context, ScalarFun D_ASSERT(LogicalTypeId::LIST == arguments[0]->return_type.id() || LogicalTypeId::SQLNULL == arguments[0]->return_type.id()); - D_ASSERT(LogicalTypeId::LIST == arguments[1]->return_type.id() || - LogicalTypeId::SQLNULL == arguments[1]->return_type.id()); bound_function.return_type = arguments[0]->return_type; return make_uniq(bound_function.return_type); @@ -194510,13 +196310,14 @@ static void ListZipFunction(DataChunk &args, ExpressionState &state, Vector &res idx_t result_size = 0; vector lengths; for (idx_t j = 0; j < count; j++) { - // Is flag for current row set bool truncate_to_shortest = false; if (truncate_flags_set) { - idx_t flag_idx = input_lists.back().sel->get_index(j); - auto flag_data = UnifiedVectorFormat::GetData(input_lists.back()); - truncate_to_shortest = flag_data[flag_idx]; + auto &flag_vec = input_lists.back(); + idx_t flag_idx = flag_vec.sel->get_index(j); + if (flag_vec.validity.RowIsValid(flag_idx)) { + truncate_to_shortest = UnifiedVectorFormat::GetData(flag_vec)[flag_idx]; + } } // Calculation of the outgoing list size @@ -195134,7 +196935,7 @@ struct SubtractPropagateStatistics { }; struct DecimalArithmeticBindData : public FunctionData { - DecimalArithmeticBindData() : check_overflow(true) { + DecimalArithmeticBindData() : check_overflow(false) { } unique_ptr Copy() const override { @@ -195201,10 +197002,9 @@ static unique_ptr PropagateNumericStats(ClientContext &context, return result.ToUnique(); } -template -unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFunction &bound_function, - vector> &arguments) { - +template +unique_ptr BindDecimalArithmetic(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { auto bind_data = make_uniq(); // get the max width and scale of the input arguments @@ -195223,12 +197023,15 @@ unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFu max_width_over_scale = MaxValue(width - scale, max_width_over_scale); } D_ASSERT(max_width > 0); - // for addition/subtraction, we add 1 to the width to ensure we don't overflow - auto required_width = NumericCast(MaxValue(max_scale + max_width_over_scale, max_width) + 1); - if (required_width > Decimal::MAX_WIDTH_INT64 && max_width <= Decimal::MAX_WIDTH_INT64) { - // we don't automatically promote past the hugeint boundary to avoid the large hugeint performance penalty - bind_data->check_overflow = true; - required_width = Decimal::MAX_WIDTH_INT64; + uint8_t required_width = MaxValue(max_scale + max_width_over_scale, max_width); + if (!IS_MODULO) { + // for addition/subtraction, we add 1 to the width to ensure we don't overflow + required_width = NumericCast(required_width + 1); + if (required_width > Decimal::MAX_WIDTH_INT64 && max_width <= Decimal::MAX_WIDTH_INT64) { + // we don't automatically promote past the hugeint boundary to avoid the large hugeint performance penalty + bind_data->check_overflow = true; + required_width = Decimal::MAX_WIDTH_INT64; + } } if (required_width > Decimal::MAX_WIDTH_DECIMAL) { // target width does not fit in decimal at all: truncate the scale and perform overflow detection @@ -195251,7 +197054,16 @@ unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFu } } bound_function.return_type = result_type; + return bind_data; +} + +template +unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + auto bind_data = BindDecimalArithmetic(context, bound_function, arguments); + // now select the physical function to execute + auto &result_type = bound_function.return_type; if (bind_data->check_overflow) { bound_function.function = GetScalarBinaryFunction(result_type.InternalType()); } else { @@ -195454,8 +197266,8 @@ void AddFun::RegisterFunction(BuiltinFunctions &set) { struct NegateOperator { template static bool CanNegate(T input) { - using Limits = std::numeric_limits; - return !(Limits::is_integer && Limits::is_signed && Limits::lowest() == input); + using Limits = NumericLimits; + return !(Limits::IsSigned() && Limits::Minimum() == input); } template @@ -195929,31 +197741,31 @@ static void BinaryScalarFunctionIgnoreZero(DataChunk &input, ExpressionState &st } template -static scalar_function_t GetBinaryFunctionIgnoreZero(const LogicalType &type) { - switch (type.id()) { - case LogicalTypeId::TINYINT: +static scalar_function_t GetBinaryFunctionIgnoreZero(PhysicalType type) { + switch (type) { + case PhysicalType::INT8: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::SMALLINT: + case PhysicalType::INT16: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::INTEGER: + case PhysicalType::INT32: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::BIGINT: + case PhysicalType::INT64: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UTINYINT: + case PhysicalType::UINT8: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::USMALLINT: + case PhysicalType::UINT16: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UINTEGER: + case PhysicalType::UINT32: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UBIGINT: + case PhysicalType::UINT64: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::HUGEINT: + case PhysicalType::INT128: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UHUGEINT: + case PhysicalType::UINT128: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::FLOAT: + case PhysicalType::FLOAT: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::DOUBLE: + case PhysicalType::DOUBLE: return BinaryScalarFunctionIgnoreZero; default: throw NotImplementedException("Unimplemented type for GetScalarUnaryFunction"); @@ -195963,9 +197775,9 @@ static scalar_function_t GetBinaryFunctionIgnoreZero(const LogicalType &type) { void DivideFun::RegisterFunction(BuiltinFunctions &set) { ScalarFunctionSet fp_divide("/"); fp_divide.AddFunction(ScalarFunction({LogicalType::FLOAT, LogicalType::FLOAT}, LogicalType::FLOAT, - GetBinaryFunctionIgnoreZero(LogicalType::FLOAT))); + GetBinaryFunctionIgnoreZero(PhysicalType::FLOAT))); fp_divide.AddFunction(ScalarFunction({LogicalType::DOUBLE, LogicalType::DOUBLE}, LogicalType::DOUBLE, - GetBinaryFunctionIgnoreZero(LogicalType::DOUBLE))); + GetBinaryFunctionIgnoreZero(PhysicalType::DOUBLE))); fp_divide.AddFunction( ScalarFunction({LogicalType::INTERVAL, LogicalType::BIGINT}, LogicalType::INTERVAL, BinaryScalarFunctionIgnoreZero)); @@ -195977,7 +197789,7 @@ void DivideFun::RegisterFunction(BuiltinFunctions &set) { continue; } else { full_divide.AddFunction( - ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type))); + ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type.InternalType()))); } } set.AddFunction(full_divide); @@ -195989,6 +197801,23 @@ void DivideFun::RegisterFunction(BuiltinFunctions &set) { //===--------------------------------------------------------------------===// // % [modulo] //===--------------------------------------------------------------------===// +template +unique_ptr BindDecimalModulo(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + auto bind_data = BindDecimalArithmetic(context, bound_function, arguments); + // now select the physical function to execute + if (bind_data->check_overflow) { + // fallback to DOUBLE if the decimal type is not guaranteed to fit within the max decimal width + for (auto &arg : bound_function.arguments) { + arg = LogicalType::DOUBLE; + } + bound_function.return_type = LogicalType::DOUBLE; + } + auto &result_type = bound_function.return_type; + bound_function.function = GetBinaryFunctionIgnoreZero(result_type.InternalType()); + return std::move(bind_data); +} + template <> float ModuloOperator::Operation(float left, float right) { D_ASSERT(right != 0); @@ -196015,10 +197844,10 @@ void ModFun::RegisterFunction(BuiltinFunctions &set) { ScalarFunctionSet functions("%"); for (auto &type : LogicalType::Numeric()) { if (type.id() == LogicalTypeId::DECIMAL) { - continue; + functions.AddFunction(ScalarFunction({type, type}, type, nullptr, BindDecimalModulo)); } else { functions.AddFunction( - ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type))); + ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type.InternalType()))); } } set.AddFunction(functions); @@ -196662,7 +198491,7 @@ static unique_ptr NextValBind(ClientContext &context, ScalarFuncti return make_uniq(sequence); } -static void NextValDependency(BoundFunctionExpression &expr, DependencyList &dependencies) { +static void NextValDependency(BoundFunctionExpression &expr, LogicalDependencyList &dependencies) { auto &info = expr.bind_info->Cast(); if (info.sequence) { dependencies.AddDependency(*info.sequence); @@ -196723,6 +198552,7 @@ void BuiltinFunctions::RegisterSequenceFunctions() { +#include namespace duckdb { @@ -197316,7 +199146,9 @@ string StrTimeFormat::ParseFormatSpecifier(const string &format_string, StrTimeF // parse the subformat in a separate format specifier StrfTimeFormat locale_format; string error = StrTimeFormat::ParseFormatSpecifier(subformat, locale_format); - D_ASSERT(error.empty()); + if (!error.empty()) { + throw InternalException("Failed to bind sub-format specifier \"%s\": %s", subformat, error); + } // add the previous literal to the first literal of the subformat locale_format.literals[0] = std::move(current_literal) + locale_format.literals[0]; current_literal = ""; @@ -198057,11 +199889,11 @@ bool StrTimeFormat::Empty() const { return format_specifier.empty(); } -string StrpTimeFormat::FormatStrpTimeError(const string &input, idx_t position) { - if (position == DConstants::INVALID_INDEX) { +string StrpTimeFormat::FormatStrpTimeError(const string &input, optional_idx position) { + if (!position.IsValid()) { return string(); } - return input + "\n" + string(position, ' ') + "^"; + return input + "\n" + string(position.GetIndex(), ' ') + "^"; } date_t StrpTimeFormat::ParseResult::ToDate() { @@ -198075,6 +199907,20 @@ bool StrpTimeFormat::ParseResult::TryToDate(date_t &result) { return Date::TryFromDate(data[0], data[1], data[2], result); } +dtime_t StrpTimeFormat::ParseResult::ToTime() { + const auto hour_offset = data[7] / Interval::MINS_PER_HOUR; + const auto mins_offset = data[7] % Interval::MINS_PER_HOUR; + return Time::FromTime(data[3] - hour_offset, data[4] - mins_offset, data[5], data[6]); +} + +bool StrpTimeFormat::ParseResult::TryToTime(dtime_t &result) { + if (data[7]) { + return false; + } + result = Time::FromTime(data[3], data[4], data[5], data[6]); + return true; +} + timestamp_t StrpTimeFormat::ParseResult::ToTimestamp() { if (is_special) { if (special == date_t::infinity()) { @@ -198086,9 +199932,7 @@ timestamp_t StrpTimeFormat::ParseResult::ToTimestamp() { } date_t date = Date::FromDate(data[0], data[1], data[2]); - const auto hour_offset = data[7] / Interval::MINS_PER_HOUR; - const auto mins_offset = data[7] % Interval::MINS_PER_HOUR; - dtime_t time = Time::FromTime(data[3] - hour_offset, data[4] - mins_offset, data[5], data[6]); + dtime_t time = ToTime(); return Timestamp::FromDatetime(date, time); } @@ -198097,9 +199941,7 @@ bool StrpTimeFormat::ParseResult::TryToTimestamp(timestamp_t &result) { if (!TryToDate(date)) { return false; } - const auto hour_offset = data[7] / Interval::MINS_PER_HOUR; - const auto mins_offset = data[7] % Interval::MINS_PER_HOUR; - dtime_t time = Time::FromTime(data[3] - hour_offset, data[4] - mins_offset, data[5], data[6]); + dtime_t time = ToTime(); return Timestamp::TryFromDatetime(date, time, result); } @@ -198118,29 +199960,22 @@ bool StrpTimeFormat::TryParseDate(string_t input, date_t &result, string &error_ return parse_result.TryToDate(result); } -bool StrpTimeFormat::TryParseTimestamp(string_t input, timestamp_t &result, string &error_message) const { +bool StrpTimeFormat::TryParseTime(string_t input, dtime_t &result, string &error_message) const { ParseResult parse_result; if (!Parse(input, parse_result)) { error_message = parse_result.FormatError(input, format_specifier); return false; } - return parse_result.TryToTimestamp(result); -} - -date_t StrpTimeFormat::ParseDate(string_t input) { - ParseResult result; - if (!Parse(input, result)) { - throw InvalidInputException(result.FormatError(input, format_specifier)); - } - return result.ToDate(); + return parse_result.TryToTime(result); } -timestamp_t StrpTimeFormat::ParseTimestamp(string_t input) { - ParseResult result; - if (!Parse(input, result)) { - throw InvalidInputException(result.FormatError(input, format_specifier)); +bool StrpTimeFormat::TryParseTimestamp(string_t input, timestamp_t &result, string &error_message) const { + ParseResult parse_result; + if (!Parse(input, parse_result)) { + error_message = parse_result.FormatError(input, format_specifier); + return false; } - return result.ToTimestamp(); + return parse_result.TryToTimestamp(result); } } // namespace duckdb @@ -198157,7 +199992,7 @@ timestamp_t StrpTimeFormat::ParseTimestamp(string_t input) { namespace duckdb { -uint8_t UpperFun::ascii_to_upper_map[] = { +const uint8_t UpperFun::ASCII_TO_UPPER_MAP[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, @@ -198170,7 +200005,7 @@ uint8_t UpperFun::ascii_to_upper_map[] = { 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}; -uint8_t LowerFun::ascii_to_lower_map[] = { +const uint8_t LowerFun::ASCII_TO_LOWER_MAP[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, @@ -198190,8 +200025,8 @@ static string_t ASCIICaseConvert(Vector &result, const char *input_data, idx_t i auto result_str = StringVector::EmptyString(result, output_length); auto result_data = result_str.GetDataWriteable(); for (idx_t i = 0; i < input_length; i++) { - result_data[i] = IS_UPPER ? UpperFun::ascii_to_upper_map[uint8_t(input_data[i])] - : LowerFun::ascii_to_lower_map[uint8_t(input_data[i])]; + result_data[i] = IS_UPPER ? UpperFun::ASCII_TO_UPPER_MAP[uint8_t(input_data[i])] + : LowerFun::ASCII_TO_LOWER_MAP[uint8_t(input_data[i])]; } result_str.Finalize(); return result_str; @@ -198234,8 +200069,8 @@ static void CaseConvert(const char *input_data, idx_t input_length, char *result i += sz; } else { // ascii - *result_data = IS_UPPER ? UpperFun::ascii_to_upper_map[uint8_t(input_data[i])] - : LowerFun::ascii_to_lower_map[uint8_t(input_data[i])]; + *result_data = IS_UPPER ? UpperFun::ASCII_TO_UPPER_MAP[uint8_t(input_data[i])] + : LowerFun::ASCII_TO_LOWER_MAP[uint8_t(input_data[i])]; result_data++; i++; } @@ -198840,7 +200675,6 @@ static unique_ptr LengthPropagateStats(ClientContext &context, F //------------------------------------------------------------------ // ARRAY / LIST LENGTH //------------------------------------------------------------------ - static void ListLengthFunction(DataChunk &args, ExpressionState &state, Vector &result) { auto &input = args.data[0]; D_ASSERT(input.GetType().id() == LogicalTypeId::LIST); @@ -198853,9 +200687,31 @@ static void ListLengthFunction(DataChunk &args, ExpressionState &state, Vector & static void ArrayLengthFunction(DataChunk &args, ExpressionState &state, Vector &result) { auto &input = args.data[0]; - // If the input is an array, the length is constant + + UnifiedVectorFormat format; + args.data[0].ToUnifiedFormat(args.size(), format); + + // for arrays the length is constant result.SetVectorType(VectorType::CONSTANT_VECTOR); ConstantVector::GetData(result)[0] = static_cast(ArrayType::GetSize(input.GetType())); + + // but we do need to take null values into account + if (format.validity.AllValid()) { + // if there are no null values we can just return the constant + return; + } + // otherwise we flatten and inherit the null values of the parent + result.Flatten(args.size()); + auto &result_validity = FlatVector::Validity(result); + for (idx_t r = 0; r < args.size(); r++) { + auto idx = format.sel->get_index(r); + if (!format.validity.RowIsValid(idx)) { + result_validity.SetInvalid(r); + } + } + if (args.AllConstant()) { + result.SetVectorType(VectorType::CONSTANT_VECTOR); + } } static unique_ptr ArrayOrListLengthBind(ClientContext &context, ScalarFunction &bound_function, @@ -199037,7 +200893,7 @@ struct ASCIILCaseReader { } static char Operation(const char *data, idx_t pos) { - return (char)LowerFun::ascii_to_lower_map[(uint8_t)data[pos]]; + return (char)LowerFun::ASCII_TO_LOWER_MAP[(uint8_t)data[pos]]; } }; @@ -199702,7 +201558,7 @@ bool ExtractAll(duckdb_re2::StringPiece &input, duckdb_re2::RE2 &pattern, idx_t D_ASSERT(pattern.ok()); D_ASSERT(pattern.NumberOfCapturingGroups() == ngroups); - if (!pattern.Match(input, *startpos, input.size(), pattern.Anchored(), groups, ngroups + 1)) { + if (!pattern.Match(input, *startpos, input.size(), pattern.UNANCHORED, groups, ngroups + 1)) { return false; } idx_t consumed = static_cast(groups[0].end() - (input.begin() + *startpos)); @@ -201304,13 +203160,13 @@ static unique_ptr BindAggregateState(ClientContext &context, Scala ErrorData error; FunctionBinder function_binder(context); - idx_t best_function = + auto best_function = function_binder.BindFunction(aggr.name, aggr.functions, state_type.bound_argument_types, error); - if (best_function == DConstants::INVALID_INDEX) { + if (!best_function.IsValid()) { throw InternalException("Could not re-bind exported aggregate %s: %s", state_type.function_name, error.Message()); } - auto bound_aggr = aggr.functions.GetFunctionByOffset(best_function); + auto bound_aggr = aggr.functions.GetFunctionByOffset(best_function.GetIndex()); if (bound_aggr.bind) { // FIXME: this is really hacky // but the aggregate state export needs a rework around how it handles more complex aggregates anyway @@ -201613,7 +203469,7 @@ ArrowArrayScanState &ArrowArrayScanState::GetChild(idx_t child_idx) { auto child_p = make_uniq(state); auto &child = *child_p; child.owned_data = owned_data; - children.emplace(std::make_pair(child_idx, std::move(child_p))); + children.emplace(child_idx, std::move(child_p)); return child; } if (!it->second->owned_data) { @@ -201895,6 +203751,10 @@ static unique_ptr GetArrowLogicalTypeNoDictionary(ArrowSchema &schema } else if (format == "+s") { child_list_t child_types; vector> children; + if (schema.n_children == 0) { + throw InvalidInputException( + "Attempted to convert a STRUCT with no fields to DuckDB which is not supported"); + } for (idx_t type_idx = 0; type_idx < (idx_t)schema.n_children; type_idx++) { children.emplace_back(ArrowTableFunction::GetArrowLogicalType(*schema.children[type_idx])); child_types.emplace_back(schema.children[type_idx]->name, children.back()->GetDuckType()); @@ -201914,6 +203774,9 @@ static unique_ptr GetArrowLogicalTypeNoDictionary(ArrowSchema &schema child_list_t members; vector> children; + if (schema.n_children == 0) { + throw InvalidInputException("Attempted to convert a UNION with no fields to DuckDB which is not supported"); + } for (idx_t type_idx = 0; type_idx < (idx_t)schema.n_children; type_idx++) { auto type = schema.children[type_idx]; @@ -202007,7 +203870,6 @@ void ArrowTableFunction::PopulateArrowTableType(ArrowTableType &arrow_table, Arr auto arrow_type = GetArrowLogicalType(schema); return_types.emplace_back(arrow_type->GetDuckType(true)); arrow_table.AddColumn(col_idx, std::move(arrow_type)); - auto format = string(schema.format); auto name = string(schema.name); if (name.empty()) { name = string("v") + to_string(col_idx); @@ -203594,17 +205456,20 @@ void BaseCSVData::Finalize() { AreOptionsEqual(options.dialect_options.state_machine_options.quote.GetValue(), options.dialect_options.state_machine_options.escape.GetValue(), "QUOTE", "ESCAPE"); } - if (!options.null_str.empty()) { - // null string and delimiter must not be substrings of each other - SubstringDetection(options.dialect_options.state_machine_options.delimiter.GetValue(), options.null_str, - "DELIMITER", "NULL"); - // quote/escape and nullstr must not be substrings of each other - SubstringDetection(options.dialect_options.state_machine_options.quote.GetValue(), options.null_str, "QUOTE", - "NULL"); + // null string and delimiter must not be substrings of each other + for (auto &null_str : options.null_str) { + if (!null_str.empty()) { + SubstringDetection(options.dialect_options.state_machine_options.delimiter.GetValue(), null_str, + "DELIMITER", "NULL"); - SubstringDetection(options.dialect_options.state_machine_options.escape.GetValue(), options.null_str, "ESCAPE", - "NULL"); + // quote/escape and nullstr must not be substrings of each other + SubstringDetection(options.dialect_options.state_machine_options.quote.GetValue(), null_str, "QUOTE", + "NULL"); + + SubstringDetection(options.dialect_options.state_machine_options.escape.GetValue(), null_str, "ESCAPE", + "NULL"); + } } if (!options.prefix.empty() || !options.suffix.empty()) { @@ -203727,7 +205592,7 @@ static string AddEscapes(char to_be_escaped, const char escape, const string &va static bool RequiresQuotes(WriteCSVData &csv_data, const char *str, idx_t len) { auto &options = csv_data.options; // check if the string is equal to the null string - if (len == options.null_str.size() && memcmp(str, options.null_str.c_str(), len) == 0) { + if (len == options.null_str[0].size() && memcmp(str, options.null_str[0].c_str(), len) == 0) { return true; } auto str_data = reinterpret_cast(str); @@ -203803,8 +205668,8 @@ struct LocalWriteCSVData : public LocalFunctionData { struct GlobalWriteCSVData : public GlobalFunctionData { GlobalWriteCSVData(FileSystem &fs, const string &file_path, FileCompressionType compression) : fs(fs), written_anything(false) { - handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW, - FileLockType::WRITE_LOCK, compression); + handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW | + FileLockType::WRITE_LOCK | compression); } //! Write generic data, e.g., CSV header @@ -203926,13 +205791,14 @@ static void WriteCSVChunkInternal(ClientContext &context, FunctionData &bind_dat writer.WriteData(const_data_ptr_cast(csv_data.newline.c_str()), csv_data.newline.size()); } // write values + D_ASSERT(options.null_str.size() == 1); for (idx_t col_idx = 0; col_idx < cast_chunk.ColumnCount(); col_idx++) { if (col_idx != 0) { WriteQuoteOrEscape(writer, options.dialect_options.state_machine_options.delimiter.GetValue()); } if (FlatVector::IsNull(cast_chunk.data[col_idx], row_idx)) { // write null value - writer.WriteData(const_data_ptr_cast(options.null_str.c_str()), options.null_str.size()); + writer.WriteData(const_data_ptr_cast(options.null_str[0].c_str()), options.null_str[0].size()); continue; } @@ -204479,22 +206345,6 @@ ReadCSVData::ReadCSVData() { void ReadCSVData::FinalizeRead(ClientContext &context) { BaseCSVData::Finalize(); - if (!options.rejects_recovery_columns.empty()) { - for (auto &recovery_col : options.rejects_recovery_columns) { - bool found = false; - for (idx_t col_idx = 0; col_idx < return_names.size(); col_idx++) { - if (StringUtil::CIEquals(return_names[col_idx], recovery_col)) { - options.rejects_recovery_column_ids.push_back(col_idx); - found = true; - break; - } - } - if (!found) { - throw BinderException("Unsupported parameter for REJECTS_RECOVERY_COLUMNS: column \"%s\" not found", - recovery_col); - } - } - } } static unique_ptr ReadCSVBind(ClientContext &context, TableFunctionBindInput &input, @@ -204505,26 +206355,32 @@ static unique_ptr ReadCSVBind(ClientContext &context, TableFunctio result->files = MultiFileReader::GetFileList(context, input.inputs[0], "CSV"); options.FromNamedParameters(input.named_parameters, context, return_types, names); - + if (options.rejects_table_name.IsSetByUser() && !options.store_rejects.GetValue() && + options.store_rejects.IsSetByUser()) { + throw BinderException("REJECTS_TABLE option is only supported when store_rejects is not manually set to false"); + } + if (options.rejects_scan_name.IsSetByUser() && !options.store_rejects.GetValue() && + options.store_rejects.IsSetByUser()) { + throw BinderException("REJECTS_SCAN option is only supported when store_rejects is not manually set to false"); + } + if (options.rejects_scan_name.IsSetByUser() || options.rejects_table_name.IsSetByUser()) { + // Ensure we set store_rejects to true automagically + options.store_rejects.Set(true, false); + } // Validate rejects_table options - if (!options.rejects_table_name.empty()) { - if (!options.ignore_errors) { - throw BinderException("REJECTS_TABLE option is only supported when IGNORE_ERRORS is set to true"); + if (options.store_rejects.GetValue()) { + if (!options.ignore_errors.GetValue() && options.ignore_errors.IsSetByUser()) { + throw BinderException( + "STORE_REJECTS option is only supported when IGNORE_ERRORS is not manually set to false"); } + // Ensure we set ignore errors to true automagically + options.ignore_errors.Set(true, false); if (options.file_options.union_by_name) { throw BinderException("REJECTS_TABLE option is not supported when UNION_BY_NAME is set to true"); } } - - if (options.rejects_limit != 0) { - if (options.rejects_table_name.empty()) { - throw BinderException("REJECTS_LIMIT option is only supported when REJECTS_TABLE is set to a table name"); - } - } - - if (!options.rejects_recovery_columns.empty() && options.rejects_table_name.empty()) { - throw BinderException( - "REJECTS_RECOVERY_COLUMNS option is only supported when REJECTS_TABLE is set to a table name"); + if (options.rejects_limit != 0 && !options.store_rejects.GetValue()) { + throw BinderException("REJECTS_LIMIT option is only supported when REJECTS_TABLE is set to a table name"); } options.file_options.AutoDetectHivePartitioning(result->files, context); @@ -204580,8 +206436,28 @@ static unique_ptr ReadCSVBind(ClientContext &context, TableFunctio } result->return_types = return_types; result->return_names = names; - - result->FinalizeRead(context); + if (!options.force_not_null_names.empty()) { + // Lets first check all column names match + duckdb::unordered_set column_names; + for (auto &name : names) { + column_names.insert(name); + } + for (auto &force_name : options.force_not_null_names) { + if (column_names.find(force_name) == column_names.end()) { + throw BinderException("\"force_not_null\" expected to find %s, but it was not found in the table", + force_name); + } + } + D_ASSERT(options.force_not_null.empty()); + for (idx_t i = 0; i < names.size(); i++) { + if (options.force_not_null_names.find(names[i]) != options.force_not_null_names.end()) { + options.force_not_null.push_back(true); + } else { + options.force_not_null.push_back(false); + } + } + } + result->Finalize(); return std::move(result); } @@ -204605,9 +206481,10 @@ static unique_ptr ReadCSVInitGlobal(ClientContext &con auto &bind_data = input.bind_data->Cast(); // Create the temporary rejects table - auto rejects_table = bind_data.options.rejects_table_name; - if (!rejects_table.empty()) { - CSVRejectsTable::GetOrCreate(context, rejects_table)->InitializeTable(context, bind_data); + if (bind_data.options.store_rejects.GetValue()) { + CSVRejectsTable::GetOrCreate(context, bind_data.options.rejects_scan_name.GetValue(), + bind_data.options.rejects_table_name.GetValue()) + ->InitializeTable(context, bind_data); } if (bind_data.files.empty()) { // This can happen when a filename based filter pushdown has eliminated all possible files for this scan. @@ -204623,7 +206500,7 @@ unique_ptr ReadCSVInitLocal(ExecutionContext &context, return nullptr; } auto &global_state = global_state_p->Cast(); - auto csv_scanner = global_state.Next(); + auto csv_scanner = global_state.Next(nullptr); if (!csv_scanner) { global_state.DecrementThread(); } @@ -204649,7 +206526,7 @@ static void ReadCSVFunction(ClientContext &context, TableFunctionInput &data_p, break; } if (csv_local_state.csv_reader->FinishedIterator()) { - csv_local_state.csv_reader = csv_global_state.Next(); + csv_local_state.csv_reader = csv_global_state.Next(csv_local_state.csv_reader.get()); if (!csv_local_state.csv_reader) { csv_global_state.DecrementThread(); break; @@ -204672,7 +206549,7 @@ void ReadCSVTableFunction::ReadCSVAddNamedParameters(TableFunction &table_functi table_function.named_parameters["quote"] = LogicalType::VARCHAR; table_function.named_parameters["new_line"] = LogicalType::VARCHAR; table_function.named_parameters["escape"] = LogicalType::VARCHAR; - table_function.named_parameters["nullstr"] = LogicalType::VARCHAR; + table_function.named_parameters["nullstr"] = LogicalType::ANY; table_function.named_parameters["columns"] = LogicalType::ANY; table_function.named_parameters["auto_type_candidates"] = LogicalType::ANY; table_function.named_parameters["header"] = LogicalType::BOOLEAN; @@ -204687,9 +206564,11 @@ void ReadCSVTableFunction::ReadCSVAddNamedParameters(TableFunction &table_functi table_function.named_parameters["max_line_size"] = LogicalType::VARCHAR; table_function.named_parameters["maximum_line_size"] = LogicalType::VARCHAR; table_function.named_parameters["ignore_errors"] = LogicalType::BOOLEAN; + table_function.named_parameters["store_rejects"] = LogicalType::BOOLEAN; table_function.named_parameters["rejects_table"] = LogicalType::VARCHAR; + table_function.named_parameters["rejects_scan"] = LogicalType::VARCHAR; table_function.named_parameters["rejects_limit"] = LogicalType::BIGINT; - table_function.named_parameters["rejects_recovery_columns"] = LogicalType::LIST(LogicalType::VARCHAR); + table_function.named_parameters["force_not_null"] = LogicalType::LIST(LogicalType::VARCHAR); table_function.named_parameters["buffer_size"] = LogicalType::UBIGINT; table_function.named_parameters["decimal_separator"] = LogicalType::VARCHAR; table_function.named_parameters["parallel"] = LogicalType::BOOLEAN; @@ -205264,17 +207143,6 @@ static unique_ptr CSVSniffBind(ClientContext &context, TableFuncti return std::move(result); } -string NewLineIdentifierToString(NewLineIdentifier identifier) { - switch (identifier) { - case NewLineIdentifier::SINGLE: - return "\\n"; - case NewLineIdentifier::CARRY_ON: - return "\\r\\n"; - default: - return ""; - } -} - string FormatOptions(char opt) { if (opt == '\'') { return "''"; @@ -205302,6 +207170,12 @@ static void CSVSniffFunction(ClientContext &context, TableFunctionInput &data_p, sniffer_options.file_path = data.path; auto buffer_manager = make_shared(context, sniffer_options, sniffer_options.file_path, 0); + if (sniffer_options.name_list.empty()) { + sniffer_options.name_list = data.names_csv; + } + if (sniffer_options.sql_type_list.empty()) { + sniffer_options.sql_type_list = data.return_types_csv; + } CSVSniffer sniffer(sniffer_options, buffer_manager, CSVStateMachineCache::Get(context)); auto sniffer_result = sniffer.SniffCSV(true); string str_opt; @@ -205319,8 +207193,7 @@ static void CSVSniffFunction(ClientContext &context, TableFunctionInput &data_p, str_opt = sniffer_options.dialect_options.state_machine_options.escape.GetValue(); output.SetValue(2, 0, str_opt); // 4. NewLine Delimiter - auto new_line_identifier = - NewLineIdentifierToString(sniffer_options.dialect_options.state_machine_options.new_line.GetValue()); + auto new_line_identifier = sniffer_options.NewLineIdentifierToString(); output.SetValue(3, 0, new_line_identifier); // 5. Skip Rows output.SetValue(4, 0, Value::UINTEGER(NumericCast(sniffer_options.dialect_options.skip_rows.GetValue()))); @@ -206155,7 +208028,7 @@ void DuckDBConstraintsFunction(ClientContext &context, TableFunctionInput &data_ break; case ConstraintType::UNIQUE: { auto &unique = constraint->Cast(); - constraint_type = unique.is_primary_key ? "PRIMARY KEY" : "UNIQUE"; + constraint_type = unique.IsPrimaryKey() ? "PRIMARY KEY" : "UNIQUE"; break; } case ConstraintType::NOT_NULL: @@ -206348,6 +208221,9 @@ static unique_ptr DuckDBDatabasesBind(ClientContext &context, Tabl names.emplace_back("type"); return_types.emplace_back(LogicalType::VARCHAR); + names.emplace_back("readonly"); + return_types.emplace_back(LogicalType::BOOLEAN); + return nullptr; } @@ -206380,8 +208256,9 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, output.SetValue(col++, count, attached.GetName()); // database_oid, BIGINT output.SetValue(col++, count, Value::BIGINT(attached.oid)); - // path, VARCHAR bool is_internal = attached.IsSystem() || attached.IsTemporary(); + bool is_readonly = attached.IsReadOnly(); + // path, VARCHAR Value db_path; if (!is_internal) { bool in_memory = attached.GetCatalog().InMemory(); @@ -206396,6 +208273,8 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, output.SetValue(col++, count, Value::BOOLEAN(is_internal)); // type, VARCHAR output.SetValue(col++, count, Value(attached.GetCatalog().GetCatalogType())); + // readonly, BOOLEAN + output.SetValue(col++, count, Value::BOOLEAN(is_readonly)); count++; } @@ -206544,6 +208423,7 @@ struct ExtensionInformation { string file_path; string description; vector aliases; + string extension_version; }; struct DuckDBExtensionsData : public GlobalTableFunctionState { @@ -206574,6 +208454,9 @@ static unique_ptr DuckDBExtensionsBind(ClientContext &context, Tab names.emplace_back("aliases"); return_types.emplace_back(LogicalType::LIST(LogicalType::VARCHAR)); + names.emplace_back("extension_version"); + return_types.emplace_back(LogicalType::VARCHAR); + return nullptr; } @@ -206625,16 +208508,20 @@ unique_ptr DuckDBExtensionsInit(ClientContext &context }); #endif // now check the list of currently loaded extensions - auto &loaded_extensions = db.LoadedExtensions(); - for (auto &ext_name : loaded_extensions) { + auto &loaded_extensions = db.LoadedExtensionsData(); + for (auto &e : loaded_extensions) { + auto &ext_name = e.first; + auto &ext_info = e.second; auto entry = installed_extensions.find(ext_name); if (entry == installed_extensions.end()) { ExtensionInformation info; info.name = ext_name; info.loaded = true; + info.extension_version = ext_info.extension_version; installed_extensions[ext_name] = std::move(info); } else { entry->second.loaded = true; + entry->second.extension_version = ext_info.extension_version; } } @@ -206670,6 +208557,8 @@ void DuckDBExtensionsFunction(ClientContext &context, TableFunctionInput &data_p output.SetValue(4, count, Value(entry.description)); // aliases LogicalType::LIST(LogicalType::VARCHAR) output.SetValue(5, count, Value::LIST(LogicalType::VARCHAR, entry.aliases)); + // extension version LogicalType::LIST(LogicalType::VARCHAR) + output.SetValue(6, count, Value(entry.extension_version)); data.offset++; count++; @@ -207933,8 +209822,7 @@ void DuckDBSequencesFunction(ClientContext &context, TableFunctionInput &data_p, // cycle, BOOLEAN output.SetValue(col++, count, Value::BOOLEAN(seq_data.cycle)); // last_value, BIGINT - output.SetValue(col++, count, - seq_data.usage_count == 0 ? Value() : Value::BOOLEAN(NumericCast(seq_data.last_value))); + output.SetValue(col++, count, seq_data.usage_count == 0 ? Value() : Value::BIGINT(seq_data.last_value)); // sql, LogicalType::VARCHAR output.SetValue(col++, count, Value(seq.ToSQL())); @@ -208154,7 +210042,7 @@ static bool TableHasPrimaryKey(TableCatalogEntry &table) { for (auto &constraint : table.GetConstraints()) { if (constraint->type == ConstraintType::UNIQUE) { auto &unique = constraint->Cast(); - if (unique.is_primary_key) { + if (unique.IsPrimaryKey()) { return true; } } @@ -208213,7 +210101,7 @@ void DuckDBTablesFunction(ClientContext &context, TableFunctionInput &data_p, Da output.SetValue(col++, count, Value::BOOLEAN(TableHasPrimaryKey(table))); // estimated_size, LogicalType::BIGINT Value card_val = - storage_info.cardinality == DConstants::INVALID_INDEX ? Value() : Value::BIGINT(storage_info.cardinality); + !storage_info.cardinality.IsValid() ? Value() : Value::BIGINT(storage_info.cardinality.GetIndex()); output.SetValue(col++, count, card_val); // column_count, LogicalType::BIGINT output.SetValue(col++, count, Value::BIGINT(table.GetColumns().LogicalColumnCount())); @@ -208799,8 +210687,15 @@ static unique_ptr PragmaMetadataInfoBind(ClientContext &context, T names.emplace_back("free_list"); return_types.emplace_back(LogicalType::LIST(LogicalType::BIGINT)); - string db_name = - input.inputs.empty() ? DatabaseManager::GetDefaultDatabase(context) : StringValue::Get(input.inputs[0]); + string db_name; + if (input.inputs.empty()) { + db_name = DatabaseManager::GetDefaultDatabase(context); + } else { + if (input.inputs[0].IsNull()) { + throw BinderException("Database argument for pragma_metadata_info cannot be NULL"); + } + db_name = StringValue::Get(input.inputs[0]); + } auto &catalog = Catalog::GetCatalog(context, db_name); auto result = make_uniq(); result->metadata_info = catalog.GetMetadataInfo(context); @@ -209194,12 +211089,16 @@ static ColumnConstraintInfo CheckConstraints(TableCatalogEntry &table, const Col } case ConstraintType::UNIQUE: { auto &unique = constraint->Cast(); - bool &constraint_info = unique.is_primary_key ? result.pk : result.unique; - if (unique.index == column.Logical()) { - constraint_info = true; - } - if (std::find(unique.columns.begin(), unique.columns.end(), column.GetName()) != unique.columns.end()) { - constraint_info = true; + bool &constraint_info = unique.IsPrimaryKey() ? result.pk : result.unique; + if (unique.HasIndex()) { + if (unique.GetIndex() == column.Logical()) { + constraint_info = true; + } + } else { + auto &columns = unique.GetColumnNames(); + if (std::find(columns.begin(), columns.end(), column.GetName()) != columns.end()) { + constraint_info = true; + } } break; } @@ -210005,7 +211904,7 @@ class StarExpression : public ParsedExpression { static constexpr const ExpressionClass TYPE = ExpressionClass::STAR; public: - StarExpression(string relation_name = string()); + explicit StarExpression(string relation_name = string()); //! The relation name in case of tbl.*, or empty if this is a normal * string relation_name; @@ -210264,7 +212163,7 @@ BindInfo TableScanGetBindInfo(const optional_ptr bind_data_p) { return BindInfo(bind_data.table); } -void TableScanDependency(DependencyList &entries, const FunctionData *bind_data_p) { +void TableScanDependency(LogicalDependencyList &entries, const FunctionData *bind_data_p) { auto &bind_data = bind_data_p->Cast(); entries.AddDependency(bind_data.table); } @@ -210377,9 +212276,6 @@ void TableScanPushdownComplexFilter(ClientContext &context, LogicalGet &get, Fun return; } - // Lazily initialize any unknown indexes that might have been loaded by an extension - storage.info->InitializeIndexes(context); - // behold storage.info->indexes.Scan([&](Index &index) { // first rewrite the index expression so the ColumnBindings align with the column bindings of the current table @@ -210608,7 +212504,7 @@ void UnnestTableFunction::RegisterFunction(BuiltinFunctions &set) { namespace duckdb { -std::string DuckDBPlatform() { +std::string DuckDBPlatform() { // NOLINT: allow definition in header #if defined(DUCKDB_CUSTOM_PLATFORM) return DUCKDB_QUOTE_DEFINE(DUCKDB_CUSTOM_PLATFORM); #endif @@ -210910,7 +212806,7 @@ void BaseAppender::Destructor() { // wrapped in a try/catch because Close() can throw if the table was dropped in the meantime try { Close(); - } catch (...) { + } catch (...) { // NOLINT } } @@ -211442,14 +213338,14 @@ string AttachedDatabase::ExtractDatabaseName(const string &dbpath, FileSystem &f return name; } -void AttachedDatabase::Initialize() { +void AttachedDatabase::Initialize(optional_ptr context) { if (IsSystem()) { catalog->Initialize(true); } else { catalog->Initialize(false); } if (storage) { - storage->Initialize(); + storage->Initialize(context); } } @@ -211472,6 +213368,10 @@ Catalog &AttachedDatabase::ParentCatalog() { return *parent_catalog; } +const Catalog &AttachedDatabase::ParentCatalog() const { + return *parent_catalog; +} + bool AttachedDatabase::IsInitialDatabase() const { return is_initial_database; } @@ -211480,6 +213380,10 @@ void AttachedDatabase::SetInitialDatabase() { is_initial_database = true; } +void AttachedDatabase::SetReadOnlyDatabase() { + type = AttachedDatabaseType::READ_ONLY_DATABASE; +} + void AttachedDatabase::Close() { D_ASSERT(catalog); if (is_closed) { @@ -211508,7 +213412,7 @@ void AttachedDatabase::Close() { } storage->CreateCheckpoint(true); } - } catch (...) { + } catch (...) { // NOLINT } } @@ -211885,8 +213789,12 @@ duckdb_state duckdb_query_arrow_schema(duckdb_arrow result, duckdb_arrow_schema return DuckDBSuccess; } auto wrapper = reinterpret_cast(result); - ArrowConverter::ToArrowSchema((ArrowSchema *)*out_schema, wrapper->result->types, wrapper->result->names, - wrapper->result->client_properties); + try { + ArrowConverter::ToArrowSchema((ArrowSchema *)*out_schema, wrapper->result->types, wrapper->result->names, + wrapper->result->client_properties); + } catch (...) { + return DuckDBError; + } return DuckDBSuccess; } @@ -212570,7 +214478,7 @@ bool CanUseDeprecatedFetch(duckdb_result *result, idx_t col, idx_t row) { if (!result) { return false; } - if (!duckdb::deprecated_materialize_result(result)) { + if (!duckdb::DeprecatedMaterializeResult(result)) { return false; } if (col >= result->__deprecated_column_count || row >= result->__deprecated_row_count) { @@ -213054,7 +214962,7 @@ void duckdb_disconnect(duckdb_connection *connection) { duckdb_state duckdb_query(duckdb_connection connection, const char *query, duckdb_result *out) { Connection *conn = reinterpret_cast(connection); auto result = conn->Query(query); - return duckdb_translate_result(std::move(result), out); + return DuckDBTranslateResult(std::move(result), out); } const char *duckdb_library_version() { @@ -214179,7 +216087,7 @@ duckdb_state duckdb_execute_pending(duckdb_pending_result pending_result, duckdb } wrapper->statement.reset(); - return duckdb_translate_result(std::move(result), out_result); + return DuckDBTranslateResult(std::move(result), out_result); } @@ -214516,7 +216424,7 @@ duckdb_state duckdb_execute_prepared(duckdb_prepared_statement prepared_statemen } auto result = wrapper->statement->Execute(wrapper->values, false); - return duckdb_translate_result(std::move(result), out_result); + return DuckDBTranslateResult(std::move(result), out_result); } duckdb_state duckdb_execute_prepared_streaming(duckdb_prepared_statement prepared_statement, @@ -214527,7 +216435,7 @@ duckdb_state duckdb_execute_prepared_streaming(duckdb_prepared_statement prepare } auto result = wrapper->statement->Execute(wrapper->values, true); - return duckdb_translate_result(std::move(result), out_result); + return DuckDBTranslateResult(std::move(result), out_result); } duckdb_statement_type duckdb_prepared_statement_type(duckdb_prepared_statement statement) { @@ -214928,7 +216836,7 @@ duckdb_state deprecated_duckdb_translate_column(MaterializedQueryResult &result, return DuckDBSuccess; } -duckdb_state duckdb_translate_result(unique_ptr result_p, duckdb_result *out) { +duckdb_state DuckDBTranslateResult(unique_ptr result_p, duckdb_result *out) { auto &result = *result_p; D_ASSERT(result_p); if (!out) { @@ -214956,7 +216864,7 @@ duckdb_state duckdb_translate_result(unique_ptr result_p, duckdb_re return DuckDBSuccess; } -bool deprecated_materialize_result(duckdb_result *result) { +bool DeprecatedMaterializeResult(duckdb_result *result) { if (!result) { return false; } @@ -215130,7 +217038,7 @@ void *duckdb_column_data(duckdb_result *result, idx_t col) { if (!result || col >= result->__deprecated_column_count) { return nullptr; } - if (!duckdb::deprecated_materialize_result(result)) { + if (!duckdb::DeprecatedMaterializeResult(result)) { return nullptr; } return result->__deprecated_columns[col].__deprecated_data; @@ -215140,7 +217048,7 @@ bool *duckdb_nullmask_data(duckdb_result *result, idx_t col) { if (!result || col >= result->__deprecated_column_count) { return nullptr; } - if (!duckdb::deprecated_materialize_result(result)) { + if (!duckdb::DeprecatedMaterializeResult(result)) { return nullptr; } return result->__deprecated_columns[col].__deprecated_nullmask; @@ -216221,9 +218129,10 @@ class ClientContextFileOpener : public FileOpener { SettingLookupResult TryGetCurrentSetting(const string &key, Value &result, FileOpenerInfo &info) override; SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) override; - ClientContext *TryGetClientContext() override { + optional_ptr TryGetClientContext() override { return &context; - }; + } + optional_ptr TryGetDatabase() override; private: ClientContext &context; @@ -216315,7 +218224,10 @@ class Optimizer { unique_ptr Optimize(unique_ptr plan); //! Return a reference to the client context of this optimizer ClientContext &GetContext(); + //! Whether the specific optimizer is disabled + bool OptimizerDisabled(OptimizerType type); +public: ClientContext &context; Binder &binder; ExpressionRewriter rewriter; @@ -217789,7 +219701,7 @@ unique_ptr ClientContext::Execute(const shared_ptr &relat return ErrorResult(ErrorData(err_str)); } -SettingLookupResult ClientContext::TryGetCurrentSetting(const std::string &key, Value &result) { +SettingLookupResult ClientContext::TryGetCurrentSetting(const std::string &key, Value &result) const { // first check the built-in settings auto &db_config = DBConfig::GetConfig(*this); auto option = db_config.GetOptionByName(key); @@ -217824,17 +219736,9 @@ ParserOptions ClientContext::GetParserOptions() const { ClientProperties ClientContext::GetClientProperties() const { string timezone = "UTC"; Value result; - // 1) Check Set Variable - auto &client_config = ClientConfig::GetConfig(*this); - auto tz_config = client_config.set_variables.find("timezone"); - if (tz_config == client_config.set_variables.end()) { - // 2) Check for Default Value - auto default_value = db->config.extension_parameters.find("timezone"); - if (default_value != db->config.extension_parameters.end()) { - timezone = default_value->second.default_value.GetValue(); - } - } else { - timezone = tz_config->second.GetValue(); + + if (TryGetCurrentSetting("TimeZone", result)) { + timezone = result.ToString(); } return {timezone, db->config.options.arrow_offset_size}; } @@ -217863,21 +219767,33 @@ SettingLookupResult ClientContextFileOpener::TryGetCurrentSetting(const string & return context.TryGetCurrentSetting(key, result); } -ClientContext *FileOpener::TryGetClientContext(FileOpener *opener) { +optional_ptr ClientContextFileOpener::TryGetDatabase() { + return context.db.get(); +} + +optional_ptr FileOpener::TryGetClientContext(optional_ptr opener) { if (!opener) { return nullptr; } return opener->TryGetClientContext(); } -SettingLookupResult FileOpener::TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result) { +optional_ptr FileOpener::TryGetDatabase(optional_ptr opener) { + if (!opener) { + return nullptr; + } + return opener->TryGetDatabase(); +} + +SettingLookupResult FileOpener::TryGetCurrentSetting(optional_ptr opener, const string &key, + Value &result) { if (!opener) { return SettingLookupResult(); } return opener->TryGetCurrentSetting(key, result); } -SettingLookupResult FileOpener::TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result, +SettingLookupResult FileOpener::TryGetCurrentSetting(optional_ptr opener, const string &key, Value &result, FileOpenerInfo &info) { if (!opener) { return SettingLookupResult(); @@ -217923,13 +219839,16 @@ class OpenerFileSystem : public FileSystem { virtual FileSystem &GetFileSystem() const = 0; virtual optional_ptr GetOpener() const = 0; - unique_ptr OpenFile(const string &path, uint8_t flags, FileLockType lock = FileLockType::NO_LOCK, - FileCompressionType compression = FileCompressionType::UNCOMPRESSED, - FileOpener *opener = nullptr) override { + void VerifyNoOpener(optional_ptr opener) { if (opener) { throw InternalException("OpenerFileSystem cannot take an opener - the opener is pushed automatically"); } - return GetFileSystem().OpenFile(path, flags, lock, compression, GetOpener().get()); + } + + unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr) override { + VerifyNoOpener(opener); + return GetFileSystem().OpenFile(path, flags, GetOpener()); } void Read(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) override { @@ -217966,27 +219885,29 @@ class OpenerFileSystem : public FileSystem { GetFileSystem().FileSync(handle); } - bool DirectoryExists(const string &directory) override { - return GetFileSystem().DirectoryExists(directory); + bool DirectoryExists(const string &directory, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().DirectoryExists(directory, GetOpener()); } - void CreateDirectory(const string &directory) override { - return GetFileSystem().CreateDirectory(directory); + void CreateDirectory(const string &directory, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().CreateDirectory(directory, GetOpener()); } - void RemoveDirectory(const string &directory) override { - return GetFileSystem().RemoveDirectory(directory); + void RemoveDirectory(const string &directory, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().RemoveDirectory(directory, GetOpener()); } bool ListFiles(const string &directory, const std::function &callback, FileOpener *opener = nullptr) override { - if (opener) { - throw InternalException("OpenerFileSystem cannot take an opener - the opener is pushed automatically"); - } + VerifyNoOpener(opener); return GetFileSystem().ListFiles(directory, callback, GetOpener().get()); } - void MoveFile(const string &source, const string &target) override { - GetFileSystem().MoveFile(source, target); + void MoveFile(const string &source, const string &target, optional_ptr opener) override { + VerifyNoOpener(opener); + GetFileSystem().MoveFile(source, target, GetOpener()); } string GetHomeDirectory() override { @@ -217997,15 +219918,18 @@ class OpenerFileSystem : public FileSystem { return FileSystem::ExpandPath(path, GetOpener()); } - bool FileExists(const string &filename) override { - return GetFileSystem().FileExists(filename); + bool FileExists(const string &filename, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().FileExists(filename, GetOpener()); } - bool IsPipe(const string &filename) override { - return GetFileSystem().IsPipe(filename); + bool IsPipe(const string &filename, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().IsPipe(filename, GetOpener()); } - void RemoveFile(const string &filename) override { - GetFileSystem().RemoveFile(filename); + void RemoveFile(const string &filename, optional_ptr opener) override { + VerifyNoOpener(opener); + GetFileSystem().RemoveFile(filename, GetOpener()); } string PathSeparator(const string &path) override { @@ -218013,15 +219937,33 @@ class OpenerFileSystem : public FileSystem { } vector Glob(const string &path, FileOpener *opener = nullptr) override { - if (opener) { - throw InternalException("OpenerFileSystem cannot take an opener - the opener is pushed automatically"); - } + VerifyNoOpener(opener); return GetFileSystem().Glob(path, GetOpener().get()); } std::string GetName() const override { return "OpenerFileSystem - " + GetFileSystem().GetName(); } + + void RegisterSubSystem(unique_ptr sub_fs) override { + GetFileSystem().RegisterSubSystem(std::move(sub_fs)); + } + + void RegisterSubSystem(FileCompressionType compression_type, unique_ptr fs) override { + GetFileSystem().RegisterSubSystem(compression_type, std::move(fs)); + } + + void UnregisterSubSystem(const string &name) override { + GetFileSystem().UnregisterSubSystem(name); + } + + void SetDisabledFileSystems(const vector &names) override { + GetFileSystem().SetDisabledFileSystems(names); + } + + vector ListSubSystems() override { + return GetFileSystem().ListSubSystems(); + } }; } // namespace duckdb @@ -218038,6 +219980,7 @@ class ClientFileSystem : public OpenerFileSystem { auto &config = DBConfig::GetConfig(context); return *config.file_system; } + optional_ptr GetOpener() const override { return ClientData::Get(context).file_opener.get(); } @@ -218063,6 +220006,10 @@ ClientData &ClientData::Get(ClientContext &context) { return *context.client_data; } +const ClientData &ClientData::Get(const ClientContext &context) { + return *context.client_data; +} + RandomEngine &RandomEngine::Get(ClientContext &context) { return *ClientData::Get(context).random_engine; } @@ -218293,77 +220240,79 @@ bool DBConfigOptions::debug_print_bindings = false; #define FINAL_SETTING \ { nullptr, nullptr, LogicalTypeId::INVALID, nullptr, nullptr, nullptr, nullptr, nullptr } -static ConfigurationOption internal_options[] = {DUCKDB_GLOBAL(AccessModeSetting), - DUCKDB_GLOBAL(AllowPersistentSecrets), - DUCKDB_GLOBAL(CheckpointThresholdSetting), - DUCKDB_GLOBAL(DebugCheckpointAbort), - DUCKDB_LOCAL(DebugForceExternal), - DUCKDB_LOCAL(DebugForceNoCrossProduct), - DUCKDB_LOCAL(DebugAsOfIEJoin), - DUCKDB_LOCAL(PreferRangeJoins), - DUCKDB_GLOBAL(DebugWindowMode), - DUCKDB_GLOBAL_LOCAL(DefaultCollationSetting), - DUCKDB_GLOBAL(DefaultOrderSetting), - DUCKDB_GLOBAL(DefaultNullOrderSetting), - DUCKDB_GLOBAL(DisabledFileSystemsSetting), - DUCKDB_GLOBAL(DisabledOptimizersSetting), - DUCKDB_GLOBAL(EnableExternalAccessSetting), - DUCKDB_GLOBAL(EnableFSSTVectors), - DUCKDB_GLOBAL(AllowUnsignedExtensionsSetting), - DUCKDB_GLOBAL(AllowUnredactedSecretsSetting), - DUCKDB_GLOBAL(CustomExtensionRepository), - DUCKDB_GLOBAL(AutoloadExtensionRepository), - DUCKDB_GLOBAL(AutoinstallKnownExtensions), - DUCKDB_GLOBAL(AutoloadKnownExtensions), - DUCKDB_GLOBAL(EnableObjectCacheSetting), - DUCKDB_GLOBAL(EnableHTTPMetadataCacheSetting), - DUCKDB_LOCAL(EnableProfilingSetting), - DUCKDB_LOCAL(EnableProgressBarSetting), - DUCKDB_LOCAL(EnableProgressBarPrintSetting), - DUCKDB_LOCAL(ErrorsAsJsonSetting), - DUCKDB_LOCAL(ExplainOutputSetting), - DUCKDB_GLOBAL(ExtensionDirectorySetting), - DUCKDB_GLOBAL(ExternalThreadsSetting), - DUCKDB_LOCAL(FileSearchPathSetting), - DUCKDB_GLOBAL(ForceCompressionSetting), - DUCKDB_GLOBAL(ForceBitpackingModeSetting), - DUCKDB_LOCAL(HomeDirectorySetting), - DUCKDB_LOCAL(LogQueryPathSetting), - DUCKDB_GLOBAL(LockConfigurationSetting), - DUCKDB_GLOBAL(ImmediateTransactionModeSetting), - DUCKDB_LOCAL(IntegerDivisionSetting), - DUCKDB_LOCAL(MaximumExpressionDepthSetting), - DUCKDB_GLOBAL(MaximumMemorySetting), - DUCKDB_GLOBAL(OldImplicitCasting), - DUCKDB_GLOBAL_ALIAS("memory_limit", MaximumMemorySetting), - DUCKDB_GLOBAL_ALIAS("null_order", DefaultNullOrderSetting), - DUCKDB_LOCAL(OrderedAggregateThreshold), - DUCKDB_GLOBAL(PasswordSetting), - DUCKDB_LOCAL(PerfectHashThresholdSetting), - DUCKDB_LOCAL(PivotFilterThreshold), - DUCKDB_LOCAL(PivotLimitSetting), - DUCKDB_LOCAL(PreserveIdentifierCase), - DUCKDB_GLOBAL(PreserveInsertionOrder), - DUCKDB_LOCAL(ProfileOutputSetting), - DUCKDB_LOCAL(ProfilingModeSetting), - DUCKDB_LOCAL_ALIAS("profiling_output", ProfileOutputSetting), - DUCKDB_LOCAL(ProgressBarTimeSetting), - DUCKDB_LOCAL(SchemaSetting), - DUCKDB_LOCAL(SearchPathSetting), - DUCKDB_GLOBAL(SecretDirectorySetting), - DUCKDB_GLOBAL(DefaultSecretStorage), - DUCKDB_GLOBAL(TempDirectorySetting), - DUCKDB_GLOBAL(ThreadsSetting), - DUCKDB_GLOBAL(UsernameSetting), - DUCKDB_GLOBAL(ExportLargeBufferArrow), - DUCKDB_GLOBAL_ALIAS("user", UsernameSetting), - DUCKDB_GLOBAL_ALIAS("wal_autocheckpoint", CheckpointThresholdSetting), - DUCKDB_GLOBAL_ALIAS("worker_threads", ThreadsSetting), - DUCKDB_GLOBAL(FlushAllocatorSetting), - DUCKDB_GLOBAL(DuckDBApiSetting), - DUCKDB_GLOBAL(CustomUserAgentSetting), - DUCKDB_LOCAL(PartitionedWriteFlushThreshold), - FINAL_SETTING}; +static const ConfigurationOption internal_options[] = { + DUCKDB_GLOBAL(AccessModeSetting), + DUCKDB_GLOBAL(AllowPersistentSecrets), + DUCKDB_GLOBAL(CheckpointThresholdSetting), + DUCKDB_GLOBAL(DebugCheckpointAbort), + DUCKDB_LOCAL(DebugForceExternal), + DUCKDB_LOCAL(DebugForceNoCrossProduct), + DUCKDB_LOCAL(DebugAsOfIEJoin), + DUCKDB_LOCAL(PreferRangeJoins), + DUCKDB_GLOBAL(DebugWindowMode), + DUCKDB_GLOBAL_LOCAL(DefaultCollationSetting), + DUCKDB_GLOBAL(DefaultOrderSetting), + DUCKDB_GLOBAL(DefaultNullOrderSetting), + DUCKDB_GLOBAL(DisabledFileSystemsSetting), + DUCKDB_GLOBAL(DisabledOptimizersSetting), + DUCKDB_GLOBAL(EnableExternalAccessSetting), + DUCKDB_GLOBAL(EnableFSSTVectors), + DUCKDB_GLOBAL(AllowUnsignedExtensionsSetting), + DUCKDB_GLOBAL(AllowExtensionsMetadataMismatchSetting), + DUCKDB_GLOBAL(AllowUnredactedSecretsSetting), + DUCKDB_GLOBAL(CustomExtensionRepository), + DUCKDB_GLOBAL(AutoloadExtensionRepository), + DUCKDB_GLOBAL(AutoinstallKnownExtensions), + DUCKDB_GLOBAL(AutoloadKnownExtensions), + DUCKDB_GLOBAL(EnableObjectCacheSetting), + DUCKDB_GLOBAL(EnableHTTPMetadataCacheSetting), + DUCKDB_LOCAL(EnableProfilingSetting), + DUCKDB_LOCAL(EnableProgressBarSetting), + DUCKDB_LOCAL(EnableProgressBarPrintSetting), + DUCKDB_LOCAL(ErrorsAsJsonSetting), + DUCKDB_LOCAL(ExplainOutputSetting), + DUCKDB_GLOBAL(ExtensionDirectorySetting), + DUCKDB_GLOBAL(ExternalThreadsSetting), + DUCKDB_LOCAL(FileSearchPathSetting), + DUCKDB_GLOBAL(ForceCompressionSetting), + DUCKDB_GLOBAL(ForceBitpackingModeSetting), + DUCKDB_LOCAL(HomeDirectorySetting), + DUCKDB_LOCAL(LogQueryPathSetting), + DUCKDB_GLOBAL(LockConfigurationSetting), + DUCKDB_GLOBAL(ImmediateTransactionModeSetting), + DUCKDB_LOCAL(IntegerDivisionSetting), + DUCKDB_LOCAL(MaximumExpressionDepthSetting), + DUCKDB_GLOBAL(MaximumMemorySetting), + DUCKDB_GLOBAL(OldImplicitCasting), + DUCKDB_GLOBAL_ALIAS("memory_limit", MaximumMemorySetting), + DUCKDB_GLOBAL_ALIAS("null_order", DefaultNullOrderSetting), + DUCKDB_LOCAL(OrderedAggregateThreshold), + DUCKDB_GLOBAL(PasswordSetting), + DUCKDB_LOCAL(PerfectHashThresholdSetting), + DUCKDB_LOCAL(PivotFilterThreshold), + DUCKDB_LOCAL(PivotLimitSetting), + DUCKDB_LOCAL(PreserveIdentifierCase), + DUCKDB_GLOBAL(PreserveInsertionOrder), + DUCKDB_LOCAL(ProfileOutputSetting), + DUCKDB_LOCAL(ProfilingModeSetting), + DUCKDB_LOCAL_ALIAS("profiling_output", ProfileOutputSetting), + DUCKDB_LOCAL(ProgressBarTimeSetting), + DUCKDB_LOCAL(SchemaSetting), + DUCKDB_LOCAL(SearchPathSetting), + DUCKDB_GLOBAL(SecretDirectorySetting), + DUCKDB_GLOBAL(DefaultSecretStorage), + DUCKDB_GLOBAL(TempDirectorySetting), + DUCKDB_GLOBAL(ThreadsSetting), + DUCKDB_GLOBAL(UsernameSetting), + DUCKDB_GLOBAL(ExportLargeBufferArrow), + DUCKDB_GLOBAL_ALIAS("user", UsernameSetting), + DUCKDB_GLOBAL_ALIAS("wal_autocheckpoint", CheckpointThresholdSetting), + DUCKDB_GLOBAL_ALIAS("worker_threads", ThreadsSetting), + DUCKDB_GLOBAL(FlushAllocatorSetting), + DUCKDB_GLOBAL(DuckDBApiSetting), + DUCKDB_GLOBAL(CustomUserAgentSetting), + DUCKDB_LOCAL(PartitionedWriteFlushThreshold), + FINAL_SETTING}; vector DBConfig::GetOptions() { vector options; @@ -218389,7 +220338,7 @@ vector DBConfig::GetOptionNames() { return names; } -ConfigurationOption *DBConfig::GetOptionByIndex(idx_t target_index) { +optional_ptr DBConfig::GetOptionByIndex(idx_t target_index) { for (idx_t index = 0; internal_options[index].name; index++) { if (index == target_index) { return internal_options + index; @@ -218398,7 +220347,7 @@ ConfigurationOption *DBConfig::GetOptionByIndex(idx_t target_index) { return nullptr; } -ConfigurationOption *DBConfig::GetOptionByName(const string &name) { +optional_ptr DBConfig::GetOptionByName(const string &name) { auto lname = StringUtil::Lower(name); for (idx_t index = 0; internal_options[index].name; index++) { D_ASSERT(StringUtil::Lower(internal_options[index].name) == string(internal_options[index].name)); @@ -218495,8 +220444,8 @@ IndexTypeSet &DBConfig::GetIndexTypes() { void DBConfig::SetDefaultMaxMemory() { auto memory = FileSystem::GetAvailableMemory(); - if (memory != DConstants::INVALID_INDEX) { - options.maximum_memory = memory * 8 / 10; + if (memory.IsValid()) { + options.maximum_memory = memory.GetIndex() * 8 / 10; } } @@ -218527,8 +220476,7 @@ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) { if (fs.FileExists(CPU_MAX)) { // cgroup v2 // https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html - handle = - fs.OpenFile(CPU_MAX, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, FileSystem::DEFAULT_COMPRESSION); + handle = fs.OpenFile(CPU_MAX, FileFlags::FILE_FLAGS_READ); read_bytes = fs.Read(*handle, (void *)byte_buffer, 999); byte_buffer[read_bytes] = '\0'; if (std::sscanf(byte_buffer, "%" SCNd64 " %" SCNd64 "", "a, &period) != 2) { @@ -218539,8 +220487,7 @@ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) { // https://www.kernel.org/doc/html/latest/scheduler/sched-bwc.html#management // Read the quota, this indicates how many microseconds the CPU can be utilized by this cgroup per period - handle = fs.OpenFile(CFS_QUOTA, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, - FileSystem::DEFAULT_COMPRESSION); + handle = fs.OpenFile(CFS_QUOTA, FileFlags::FILE_FLAGS_READ); read_bytes = fs.Read(*handle, (void *)byte_buffer, 999); byte_buffer[read_bytes] = '\0'; if (std::sscanf(byte_buffer, "%" SCNd64 "", "a) != 1) { @@ -218548,8 +220495,7 @@ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) { } // Read the time period, a cgroup can utilize the CPU up to quota microseconds every period - handle = fs.OpenFile(CFS_PERIOD, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, - FileSystem::DEFAULT_COMPRESSION); + handle = fs.OpenFile(CFS_PERIOD, FileFlags::FILE_FLAGS_READ); read_bytes = fs.Read(*handle, (void *)byte_buffer, 999); byte_buffer[read_bytes] = '\0'; if (std::sscanf(byte_buffer, "%" SCNd64 "", &period) != 1) { @@ -218582,7 +220528,8 @@ idx_t DBConfig::GetSystemMaxThreads(FileSystem &fs) { idx_t DBConfig::ParseMemoryLimit(const string &arg) { if (arg[0] == '-' || arg == "null" || arg == "none") { - return DConstants::INVALID_INDEX; + // infinite + return NumericLimits::Maximum(); } // split based on the number/non-number idx_t idx = 0; @@ -218772,7 +220719,7 @@ class SelectStatement; class QueryRelation : public Relation { public: QueryRelation(const std::shared_ptr &context, unique_ptr select_stmt, string alias); - ~QueryRelation(); + ~QueryRelation() override; unique_ptr select_stmt; string alias; @@ -219436,7 +221383,7 @@ class StandardBufferManager : public BufferManager { public: StandardBufferManager(DatabaseInstance &db, string temp_directory); - virtual ~StandardBufferManager(); + ~StandardBufferManager() override; public: static unique_ptr CreateBufferManager(DatabaseInstance &db, string temp_directory); @@ -219446,41 +221393,41 @@ class StandardBufferManager : public BufferManager { //! Registers an in-memory buffer that cannot be unloaded until it is destroyed //! This buffer can be small (smaller than BLOCK_SIZE) //! Unpin and pin are nops on this block of memory - shared_ptr RegisterSmallMemory(idx_t block_size) final override; + shared_ptr RegisterSmallMemory(idx_t block_size) final; - idx_t GetUsedMemory() const final override; - idx_t GetMaxMemory() const final override; + idx_t GetUsedMemory() const final; + idx_t GetMaxMemory() const final; //! Allocate an in-memory buffer with a single pin. //! The allocated memory is released when the buffer handle is destroyed. DUCKDB_API BufferHandle Allocate(MemoryTag tag, idx_t block_size, bool can_destroy = true, - shared_ptr *block = nullptr) final override; + shared_ptr *block = nullptr) final; //! Reallocate an in-memory buffer that is pinned. - void ReAllocate(shared_ptr &handle, idx_t block_size) final override; + void ReAllocate(shared_ptr &handle, idx_t block_size) final; - BufferHandle Pin(shared_ptr &handle) final override; - void Unpin(shared_ptr &handle) final override; + BufferHandle Pin(shared_ptr &handle) final; + void Unpin(shared_ptr &handle) final; //! Set a new memory limit to the buffer manager, throws an exception if the new limit is too low and not enough //! blocks can be evicted - void SetLimit(idx_t limit = (idx_t)-1) final override; + void SetLimit(idx_t limit = (idx_t)-1) final; //! Returns informaton about memory usage vector GetMemoryUsageInfo() const override; //! Returns a list of all temporary files - vector GetTemporaryFiles() final override; + vector GetTemporaryFiles() final; - const string &GetTemporaryDirectory() final override { + const string &GetTemporaryDirectory() const final { return temp_directory; } - void SetTemporaryDirectory(const string &new_dir) final override; + void SetTemporaryDirectory(const string &new_dir) final; - DUCKDB_API Allocator &GetBufferAllocator() final override; + DUCKDB_API Allocator &GetBufferAllocator() final; - DatabaseInstance &GetDatabase() final override { + DatabaseInstance &GetDatabase() { return db; } @@ -219488,9 +221435,9 @@ class StandardBufferManager : public BufferManager { unique_ptr ConstructManagedBuffer(idx_t size, unique_ptr &&source, FileBufferType type = FileBufferType::MANAGED_BUFFER) override; - DUCKDB_API void ReserveMemory(idx_t size) final override; - DUCKDB_API void FreeReservedMemory(idx_t size) final override; - bool HasTemporaryDirectory() const final override; + DUCKDB_API void ReserveMemory(idx_t size) final; + DUCKDB_API void FreeReservedMemory(idx_t size) final; + bool HasTemporaryDirectory() const final; protected: //! Helper @@ -219506,24 +221453,24 @@ class StandardBufferManager : public BufferManager { shared_ptr RegisterMemory(MemoryTag tag, idx_t block_size, bool can_destroy); //! Garbage collect eviction queue - void PurgeQueue() final override; + void PurgeQueue() final; - BufferPool &GetBufferPool() const final override; - TemporaryMemoryManager &GetTemporaryMemoryManager() final override; + BufferPool &GetBufferPool() const final; + TemporaryMemoryManager &GetTemporaryMemoryManager() final; //! Write a temporary buffer to disk - void WriteTemporaryBuffer(MemoryTag tag, block_id_t block_id, FileBuffer &buffer) final override; + void WriteTemporaryBuffer(MemoryTag tag, block_id_t block_id, FileBuffer &buffer) final; //! Read a temporary buffer from disk unique_ptr ReadTemporaryBuffer(MemoryTag tag, block_id_t id, - unique_ptr buffer = nullptr) final override; + unique_ptr buffer = nullptr) final; //! Get the path of the temporary buffer string GetTemporaryPath(block_id_t id); - void DeleteTemporaryFile(block_id_t id) final override; + void DeleteTemporaryFile(block_id_t id) final; void RequireTemporaryDirectory(); - void AddToEvictionQueue(shared_ptr &handle) final override; + void AddToEvictionQueue(shared_ptr &handle) final; const char *InMemoryWarning(); @@ -219563,6 +221510,65 @@ class StandardBufferManager : public BufferManager { +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/main/database_file_opener.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + + + +namespace duckdb { +class DatabaseInstance; + +class DatabaseFileOpener : public FileOpener { +public: + explicit DatabaseFileOpener(DatabaseInstance &db_p) : db(db_p) { + } + + SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) override { + return SettingLookupResult(); + } + + optional_ptr TryGetClientContext() override { + return nullptr; + } + + optional_ptr TryGetDatabase() override { + return &db; + } + +private: + DatabaseInstance &db; +}; + +class DatabaseFileSystem : public OpenerFileSystem { +public: + explicit DatabaseFileSystem(DatabaseInstance &db_p) : db(db_p), database_opener(db_p) { + } + + FileSystem &GetFileSystem() const override { + auto &config = DBConfig::GetConfig(db); + return *config.file_system; + } + optional_ptr GetOpener() const override { + return &database_opener; + } + +private: + DatabaseInstance &db; + mutable DatabaseFileOpener database_opener; +}; + +} // namespace duckdb + #ifndef DUCKDB_NO_THREADS @@ -219611,6 +221617,10 @@ BufferManager &BufferManager::GetBufferManager(DatabaseInstance &db) { return db.GetBufferManager(); } +const BufferManager &BufferManager::GetBufferManager(const DatabaseInstance &db) { + return db.GetBufferManager(); +} + BufferManager &BufferManager::GetBufferManager(AttachedDatabase &db) { return BufferManager::GetBufferManager(db.GetDatabase()); } @@ -219619,6 +221629,10 @@ DatabaseInstance &DatabaseInstance::GetDatabase(ClientContext &context) { return *context.db; } +const DatabaseInstance &DatabaseInstance::GetDatabase(const ClientContext &context) { + return *context.db; +} + DatabaseManager &DatabaseInstance::GetDatabaseManager() { if (!db_manager) { throw InternalException("Missing DB manager"); @@ -219762,18 +221776,24 @@ void DatabaseInstance::Initialize(const char *database_path, DBConfig *user_conf config.options.temporary_directory = string(); } + db_file_system = make_uniq(*this); db_manager = make_uniq(*this); - buffer_manager = make_uniq(*this, config.options.temporary_directory); + if (config.buffer_manager) { + buffer_manager = config.buffer_manager; + } else { + buffer_manager = make_uniq(*this, config.options.temporary_directory); + } scheduler = make_uniq(*this); object_cache = make_uniq(); connection_manager = make_uniq(); - // resolve the type of teh database we are opening - DBPathAndType::ResolveDatabaseType(config.options.database_path, config.options.database_type, config); - // initialize the secret manager config.secret_manager->Initialize(*this); + // resolve the type of teh database we are opening + auto &fs = FileSystem::GetFileSystem(*this); + DBPathAndType::ResolveDatabaseType(fs, config.options.database_path, config.options.database_type); + // initialize the system catalog db_manager->InitializeSystemCatalog(); @@ -219822,6 +221842,10 @@ BufferManager &DatabaseInstance::GetBufferManager() { return *buffer_manager; } +const BufferManager &DatabaseInstance::GetBufferManager() const { + return *buffer_manager; +} + BufferPool &DatabaseInstance::GetBufferPool() const { return *config.buffer_pool; } @@ -219843,7 +221867,7 @@ ObjectCache &DatabaseInstance::GetObjectCache() { } FileSystem &DatabaseInstance::GetFileSystem() { - return *config.file_system; + return *db_file_system; } ConnectionManager &DatabaseInstance::GetConnectionManager() { @@ -219922,6 +221946,10 @@ const unordered_set &DatabaseInstance::LoadedExtensions() { return loaded_extensions; } +const unordered_map &DatabaseInstance::LoadedExtensionsData() { + return loaded_extensions_data; +} + idx_t DuckDB::NumberOfThreads() { return instance->NumberOfThreads(); } @@ -219935,9 +221963,10 @@ bool DuckDB::ExtensionIsLoaded(const std::string &name) { return instance->ExtensionIsLoaded(name); } -void DatabaseInstance::SetExtensionLoaded(const std::string &name) { +void DatabaseInstance::SetExtensionLoaded(const std::string &name, const std::string &extension_version) { auto extension_name = ExtensionHelper::GetExtensionName(name); loaded_extensions.insert(extension_name); + loaded_extensions_data.insert({extension_name, ExtensionInfo(extension_version)}); auto &callbacks = DBConfig::GetConfig(*this).extension_callbacks; for (auto &callback : callbacks) { @@ -219945,7 +221974,7 @@ void DatabaseInstance::SetExtensionLoaded(const std::string &name) { } } -SettingLookupResult DatabaseInstance::TryGetCurrentSetting(const std::string &key, Value &result) { +SettingLookupResult DatabaseInstance::TryGetCurrentSetting(const std::string &key, Value &result) const { // check the session values auto &db_config = DBConfig::GetConfig(*this); const auto &global_config_map = db_config.options.set_variables; @@ -220019,7 +222048,7 @@ optional_ptr DatabaseManager::AttachDatabase(ClientContext &co const auto name = attached_db->GetName(); attached_db->oid = ModifyCatalog(); - DependencyList dependencies; + LogicalDependencyList dependencies; if (default_database.empty()) { default_database = name; } @@ -220121,7 +222150,8 @@ void DatabaseManager::GetDatabaseType(ClientContext &context, string &db_type, A if (db_type.empty()) { CheckPathConflict(context, info.path); - DBPathAndType::CheckMagicBytes(info.path, db_type, config); + auto &fs = FileSystem::GetFileSystem(context); + DBPathAndType::CheckMagicBytes(fs, info.path, db_type); } // if we are loading a database type from an extension - check if that extension is loaded @@ -220210,9 +222240,9 @@ void DBPathAndType::ExtractExtensionPrefix(string &path, string &db_type) { } } -void DBPathAndType::CheckMagicBytes(string &path, string &db_type, const DBConfig &config) { +void DBPathAndType::CheckMagicBytes(FileSystem &fs, string &path, string &db_type) { // if there isn't - check the magic bytes of the file (if any) - auto file_type = MagicBytes::CheckMagicBytes(config.file_system.get(), path); + auto file_type = MagicBytes::CheckMagicBytes(fs, path); if (file_type == DataFileType::SQLITE_FILE) { db_type = "sqlite"; } else { @@ -220220,7 +222250,7 @@ void DBPathAndType::CheckMagicBytes(string &path, string &db_type, const DBConfi } } -void DBPathAndType::ResolveDatabaseType(string &path, string &db_type, const DBConfig &config) { +void DBPathAndType::ResolveDatabaseType(FileSystem &fs, string &path, string &db_type) { if (!db_type.empty()) { // database type specified explicitly - no need to check return; @@ -220232,7 +222262,7 @@ void DBPathAndType::ResolveDatabaseType(string &path, string &db_type, const DBC return; } // check database type by reading the magic bytes of a file - DBPathAndType::CheckMagicBytes(path, db_type, config); + DBPathAndType::CheckMagicBytes(fs, path, db_type); } } // namespace duckdb @@ -220381,7 +222411,7 @@ struct DefaultError { const char *error; }; -static DefaultError internal_errors[] = { +static const DefaultError internal_errors[] = { {ErrorType::UNSIGNED_EXTENSION, "Extension \"%s\" could not be loaded because its signature is either missing or invalid and unsigned extensions " "are disabled by configuration (allow_unsigned_extensions)"}, @@ -220452,15 +222482,15 @@ ErrorManager &ErrorManager::Get(DatabaseInstance &context) { namespace duckdb { -static ExtensionAlias internal_aliases[] = {{"http", "httpfs"}, // httpfs - {"https", "httpfs"}, - {"md", "motherduck"}, // motherduck - {"mysql", "mysql_scanner"}, // mysql - {"s3", "httpfs"}, - {"postgres", "postgres_scanner"}, // postgres - {"sqlite", "sqlite_scanner"}, // sqlite - {"sqlite3", "sqlite_scanner"}, - {nullptr, nullptr}}; +static const ExtensionAlias internal_aliases[] = {{"http", "httpfs"}, // httpfs + {"https", "httpfs"}, + {"md", "motherduck"}, // motherduck + {"mysql", "mysql_scanner"}, // mysql + {"s3", "httpfs"}, + {"postgres", "postgres_scanner"}, // postgres + {"sqlite", "sqlite_scanner"}, // sqlite + {"sqlite3", "sqlite_scanner"}, + {nullptr, nullptr}}; idx_t ExtensionHelper::ExtensionAliasCount() { idx_t index; @@ -220587,7 +222617,7 @@ namespace duckdb { //===--------------------------------------------------------------------===// // Default Extensions //===--------------------------------------------------------------------===// -static DefaultExtension internal_extensions[] = { +static const DefaultExtension internal_extensions[] = { {"icu", "Adds support for time zones and collations using the ICU library", DUCKDB_EXTENSION_ICU_LINKED}, {"excel", "Adds support for Excel-like format strings", DUCKDB_EXTENSION_EXCEL_LINKED}, {"parquet", "Adds support for reading and writing parquet files", DUCKDB_EXTENSION_PARQUET_LINKED}, @@ -220626,7 +222656,8 @@ DefaultExtension ExtensionHelper::GetDefaultExtension(idx_t index) { //===--------------------------------------------------------------------===// // Allow Auto-Install Extensions //===--------------------------------------------------------------------===// -static const char *auto_install[] = {"motherduck", "postgres_scanner", "mysql_scanner", "sqlite_scanner", nullptr}; +static const char *const auto_install[] = {"motherduck", "postgres_scanner", "mysql_scanner", "sqlite_scanner", + nullptr}; // TODO: unify with new autoload mechanism bool ExtensionHelper::AllowAutoInstall(const string &extension) { @@ -220885,7 +222916,7 @@ ExtensionLoadResult ExtensionHelper::LoadExtensionInternal(DuckDB &db, const std return ExtensionLoadResult::LOADED_EXTENSION; } -static vector public_keys = { +static const char *const public_keys[] = { R"( -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6aZuHUa1cLR9YDDYaEfi @@ -221105,10 +223136,14 @@ SLWQo0+/ciQ21Zwz5SwimX8ep1YpqYirO04gcyGZzAfGboXRvdUwA+1bZvuUXdKC EMS5gLv50CzQqJXK9mNzPuYXNUIc4Pw4ssVWe0OfN3Od90gl5uFUwk/G9lWSYnBN 3wIDAQAB -----END PUBLIC KEY----- -)"}; +)", nullptr}; const vector ExtensionHelper::GetPublicKeys() { - return public_keys; + vector keys; + for (idx_t i = 0; public_keys[i]; i++) { + keys.emplace_back(public_keys[i]); + } + return keys; } } // namespace duckdb @@ -229345,7 +231380,7 @@ namespace duckdb { // Install Extension //===--------------------------------------------------------------------===// const string ExtensionHelper::NormalizeVersionTag(const string &version_tag) { - if (version_tag.length() > 0 && version_tag[0] != 'v') { + if (!version_tag.empty() && version_tag[0] != 'v') { return "v" + version_tag; } return version_tag; @@ -229730,7 +231765,7 @@ static void ComputeSHA256String(const std::string &to_hash, std::string *res) { static void ComputeSHA256FileSegment(FileHandle *handle, const idx_t start, const idx_t end, std::string *res) { idx_t iter = start; - const idx_t segment_size = 1024 * 8; + const idx_t segment_size = 1024ULL * 8ULL; duckdb_mbedtls::MbedTlsWrapper::SHA256State state; @@ -229749,6 +231784,39 @@ static void ComputeSHA256FileSegment(FileHandle *handle, const idx_t start, cons } #endif +static string FilterZeroAtEnd(string s) { + while (!s.empty() && s.back() == '\0') { + s.pop_back(); + } + return s; +} + +static string PrettyPrintString(const string &s) { + string res = ""; + for (auto c : s) { + if (StringUtil::CharacterIsAlpha(c) || StringUtil::CharacterIsDigit(c) || c == '_' || c == '-' || c == ' ' || + c == '.') { + res += c; + } else { + uint8_t value = c; + res += "\\x"; + uint8_t first = value / 16; + if (first < 10) { + res.push_back((char)('0' + first)); + } else { + res.push_back((char)('a' + first - 10)); + } + uint8_t second = value % 16; + if (second < 10) { + res.push_back((char)('0' + second)); + } else { + res.push_back((char)('a' + second - 10)); + } + } + } + return res; +} + bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const string &extension, ExtensionInitResult &result, string &error) { #ifdef DUCKDB_DISABLE_EXTENSION_LOAD @@ -229811,15 +231879,66 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const str error = StringUtil::Format("Extension \"%s\" not found.\n%s", filename, message); return false; } - if (!config.options.allow_unsigned_extensions) { - auto handle = fs.OpenFile(filename, FileFlags::FILE_FLAGS_READ); - // signature is the last 256 bytes of the file + string metadata_segment; + metadata_segment.resize(512); - string signature; - signature.resize(256); + const std::string engine_version = std::string(GetVersionDirectoryName()); + const std::string engine_platform = std::string(DuckDB::Platform()); - auto signature_offset = handle->GetFileSize() - signature.size(); + auto handle = fs.OpenFile(filename, FileFlags::FILE_FLAGS_READ); + + idx_t file_size = handle->GetFileSize(); + + if (file_size < 1024) { + throw InvalidInputException( + "Extension \"%s\" do not have metadata compatible with DuckDB loading it " + "(version %s, platform %s). File size in particular is lower than minimum threshold of 1024", + filename, engine_version, engine_platform); + } + + auto metadata_offset = file_size - metadata_segment.size(); + + handle->Read((void *)metadata_segment.data(), metadata_segment.size(), metadata_offset); + + std::vector metadata_field; + for (idx_t i = 0; i < 8; i++) { + metadata_field.emplace_back(metadata_segment, i * 32, 32); + } + + std::reverse(metadata_field.begin(), metadata_field.end()); + + std::string extension_duckdb_platform = FilterZeroAtEnd(metadata_field[1]); + std::string extension_duckdb_version = FilterZeroAtEnd(metadata_field[2]); + std::string extension_version = FilterZeroAtEnd(metadata_field[3]); + + string metadata_mismatch_error = ""; + { + char a[32] = {0}; + a[0] = '4'; + if (strncmp(a, metadata_field[0].data(), 32) != 0) { + // metadata do not looks right, add this to the error message + metadata_mismatch_error = + "\n" + StringUtil::Format("Extension \"%s\" do not have metadata compatible with DuckDB " + "loading it (version %s, platform %s)", + filename, engine_version, engine_platform); + } else if (engine_version != extension_duckdb_version || engine_platform != extension_duckdb_platform) { + metadata_mismatch_error = "\n" + StringUtil::Format("Extension \"%s\" (version %s, platfrom %s) does not " + "match DuckDB loading it (version %s, platform %s)", + filename, PrettyPrintString(extension_duckdb_version), + PrettyPrintString(extension_duckdb_platform), + engine_version, engine_platform); + + } else { + // All looks good + } + } + + if (!config.options.allow_unsigned_extensions) { + // signature is the last 256 bytes of the file + string signature(metadata_segment, metadata_segment.size() - 256); + + auto signature_offset = metadata_offset + metadata_segment.size() - signature.size(); const idx_t maxLenChunks = 1024ULL * 1024ULL; const idx_t numChunks = (signature_offset + maxLenChunks - 1) / maxLenChunks; @@ -229868,9 +231987,26 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const str } } if (!any_valid) { - throw IOException(config.error_manager->FormatException(ErrorType::UNSIGNED_EXTENSION, filename)); + throw IOException(config.error_manager->FormatException(ErrorType::UNSIGNED_EXTENSION, filename) + + metadata_mismatch_error); + } + + if (!metadata_mismatch_error.empty()) { + // Signed extensions perform the full check + throw InvalidInputException(metadata_mismatch_error.substr(1)); + } + } else if (!config.options.allow_extensions_metadata_mismatch) { + if (!metadata_mismatch_error.empty()) { + // Unsigned extensions AND configuration allowing metadata_mismatch_error, loading allowed, mainly for + // debugging purposes + throw InvalidInputException(metadata_mismatch_error.substr(1)); } } + + auto number_metadata_fields = 3; + D_ASSERT(number_metadata_fields == 3); // Currently hardcoded value + metadata_field.resize(number_metadata_fields + 1); + auto filebase = fs.ExtractBaseName(filename); #ifdef WASM_LOADABLE_EXTENSIONS @@ -229902,35 +232038,8 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const str auto lowercase_extension_name = StringUtil::Lower(filebase); - ext_version_fun_t version_fun; - auto version_fun_name = lowercase_extension_name + "_version"; - - version_fun = LoadFunctionFromDLL(lib_hdl, version_fun_name, filename); - - std::string engine_version = std::string(DuckDB::LibraryVersion()); - - auto version_fun_result = (*version_fun)(); - if (version_fun_result == nullptr) { - throw InvalidInputException("Extension \"%s\" returned a nullptr", filename); - } - std::string extension_version = std::string(version_fun_result); - - // Trim v's if necessary - std::string extension_version_trimmed = extension_version; - std::string engine_version_trimmed = engine_version; - if (extension_version.length() > 0 && extension_version[0] == 'v') { - extension_version_trimmed = extension_version.substr(1); - } - if (engine_version.length() > 0 && engine_version[0] == 'v') { - engine_version_trimmed = engine_version.substr(1); - } - - if (extension_version_trimmed != engine_version_trimmed) { - throw InvalidInputException("Extension \"%s\" version (%s) does not match DuckDB version (%s)", filename, - extension_version, engine_version); - } - result.filebase = lowercase_extension_name; + result.extension_version = extension_version; result.filename = filename; result.lib_hdl = lib_hdl; return true; @@ -229996,7 +232105,7 @@ void ExtensionHelper::LoadExternalExtension(DatabaseInstance &db, FileSystem &fs init_fun_name, res.filename, error.RawMessage()); } - db.SetExtensionLoaded(extension); + db.SetExtensionLoaded(extension, res.extension_version); #endif } @@ -231023,10 +233132,6 @@ void OperatorProfiler::Flush(const PhysicalOperator &phys_op, ExpressionExecutor return; } auto &operator_timing = timings.find(phys_op)->second; - if (int(operator_timing.executors_info.size()) <= id) { - operator_timing.executors_info.resize(id + 1); - } - operator_timing.executors_info[id] = make_uniq(expression_executor, name, id); operator_timing.name = phys_op.GetName(); } @@ -231046,16 +233151,6 @@ void QueryProfiler::Flush(OperatorProfiler &profiler) { if (!IsDetailedEnabled()) { continue; } - for (auto &info : node.second.executors_info) { - if (!info) { - continue; - } - auto info_id = info->id; - if (int32_t(tree_node.info.executors_info.size()) <= info_id) { - tree_node.info.executors_info.resize(info_id + 1); - } - tree_node.info.executors_info[info_id] = std::move(info); - } } profiler.timings.clear(); } @@ -231223,70 +233318,12 @@ static string JSONSanitize(const string &text) { return result; } -// Print a row -static void PrintRow(std::ostream &ss, const string &annotation, int id, const string &name, double time, - int sample_counter, int tuple_counter, const string &extra_info, int depth) { - ss << string(depth * 3, ' ') << " {\n"; - ss << string(depth * 3, ' ') << " \"annotation\": \"" + JSONSanitize(annotation) + "\",\n"; - ss << string(depth * 3, ' ') << " \"id\": " + to_string(id) + ",\n"; - ss << string(depth * 3, ' ') << " \"name\": \"" + JSONSanitize(name) + "\",\n"; -#if defined(RDTSC) - ss << string(depth * 3, ' ') << " \"timing\": \"NULL\" ,\n"; - ss << string(depth * 3, ' ') << " \"cycles_per_tuple\": " + StringUtil::Format("%.4f", time) + ",\n"; -#else - ss << string(depth * 3, ' ') << " \"timing\":" + to_string(time) + ",\n"; - ss << string(depth * 3, ' ') << " \"cycles_per_tuple\": \"NULL\" ,\n"; -#endif - ss << string(depth * 3, ' ') << " \"sample_size\": " << to_string(sample_counter) + ",\n"; - ss << string(depth * 3, ' ') << " \"input_size\": " << to_string(tuple_counter) + ",\n"; - ss << string(depth * 3, ' ') << " \"extra_info\": \"" << JSONSanitize(extra_info) + "\"\n"; - ss << string(depth * 3, ' ') << " },\n"; -} - -static void ExtractFunctions(std::ostream &ss, ExpressionInfo &info, int &fun_id, int depth) { - if (info.hasfunction) { - double time = info.sample_tuples_count == 0 ? 0 : int(info.function_time) / double(info.sample_tuples_count); - PrintRow(ss, "Function", fun_id++, info.function_name, time, NumericCast(info.sample_tuples_count), - NumericCast(info.tuples_count), "", NumericCast(depth)); - } - if (info.children.empty()) { - return; - } - // extract the children of this node - for (auto &child : info.children) { - ExtractFunctions(ss, *child, fun_id, depth); - } -} - -static void ToJSONRecursive(QueryProfiler::TreeNode &node, std::ostream &ss, int depth = 1) { +static void ToJSONRecursive(QueryProfiler::TreeNode &node, std::ostream &ss, idx_t depth = 1) { ss << string(depth * 3, ' ') << " {\n"; ss << string(depth * 3, ' ') << " \"name\": \"" + JSONSanitize(node.name) + "\",\n"; ss << string(depth * 3, ' ') << " \"timing\":" + to_string(node.info.time) + ",\n"; ss << string(depth * 3, ' ') << " \"cardinality\":" + to_string(node.info.elements) + ",\n"; ss << string(depth * 3, ' ') << " \"extra_info\": \"" + JSONSanitize(node.extra_info) + "\",\n"; - ss << string(depth * 3, ' ') << " \"timings\": ["; - int32_t function_counter = 1; - int32_t expression_counter = 1; - ss << "\n "; - for (auto &expr_executor : node.info.executors_info) { - // For each Expression tree - if (!expr_executor) { - continue; - } - for (auto &expr_timer : expr_executor->roots) { - double time = expr_timer->sample_tuples_count == 0 - ? 0 - : double(expr_timer->time) / double(expr_timer->sample_tuples_count); - PrintRow(ss, "ExpressionRoot", expression_counter++, expr_timer->name, time, - NumericCast(expr_timer->sample_tuples_count), NumericCast(expr_timer->tuples_count), - expr_timer->extra_info, depth + 1); - // Extract all functions inside the tree - ExtractFunctions(ss, *expr_timer->root, function_counter, depth + 1); - } - } - ss.seekp(-2, ss.cur); - ss << "\n"; - ss << string(depth * 3, ' ') << " ],\n"; ss << string(depth * 3, ' ') << " \"children\": [\n"; if (node.children.empty()) { ss << string(depth * 3, ' ') << " ]\n"; @@ -231403,51 +233440,6 @@ vector QueryProfiler::GetOrderedPhaseTimings() c void QueryProfiler::Propagate(QueryProfiler &qp) { } -void ExpressionInfo::ExtractExpressionsRecursive(unique_ptr &state) { - if (state->child_states.empty()) { - return; - } - // extract the children of this node - for (auto &child : state->child_states) { - auto expr_info = make_uniq(); - if (child->expr.expression_class == ExpressionClass::BOUND_FUNCTION) { - expr_info->hasfunction = true; - expr_info->function_name = child->expr.Cast().function.ToString(); - expr_info->function_time = child->profiler.time; - expr_info->sample_tuples_count = child->profiler.sample_tuples_count; - expr_info->tuples_count = child->profiler.tuples_count; - } - expr_info->ExtractExpressionsRecursive(child); - children.push_back(std::move(expr_info)); - } - return; -} - -ExpressionExecutorInfo::ExpressionExecutorInfo(ExpressionExecutor &executor, const string &name, int id) : id(id) { - // Extract Expression Root Information from ExpressionExecutorStats - for (auto &state : executor.GetStates()) { - roots.push_back(make_uniq(*state, name)); - } -} - -ExpressionRootInfo::ExpressionRootInfo(ExpressionExecutorState &state, string name) - : current_count(state.profiler.current_count), sample_count(state.profiler.sample_count), - sample_tuples_count(state.profiler.sample_tuples_count), tuples_count(state.profiler.tuples_count), - name("expression"), time(state.profiler.time) { - // Use the name of expression-tree as extra-info - extra_info = std::move(name); - auto expression_info_p = make_uniq(); - // Maybe root has a function - if (state.root_state->expr.expression_class == ExpressionClass::BOUND_FUNCTION) { - expression_info_p->hasfunction = true; - expression_info_p->function_name = (state.root_state->expr.Cast()).function.name; - expression_info_p->function_time = state.root_state->profiler.time; - expression_info_p->sample_tuples_count = state.root_state->profiler.sample_tuples_count; - expression_info_p->tuples_count = state.root_state->profiler.tuples_count; - } - expression_info_p->ExtractExpressionsRecursive(state.root_state); - root = std::move(expression_info_p); -} } // namespace duckdb @@ -234884,7 +236876,7 @@ BoundStatement SecretManager::BindCreateSecret(CatalogTransaction transaction, C BoundStatement result; result.names = {"Success"}; result.types = {LogicalType::BOOLEAN}; - result.plan = make_uniq(*function, std::move(bound_info)); + result.plan = make_uniq(std::move(bound_info)); return result; } @@ -235206,7 +237198,6 @@ unique_ptr DefaultSecretGenerator::CreateDefaultEntry(ClientContex auto deserialized_secret = secret_manager.DeserializeSecret(deserializer); deserializer.End(); - auto name = deserialized_secret->GetName(); auto entry = make_uniq(std::move(deserialized_secret), catalog); entry->secret->storage_mode = SecretManager::LOCAL_FILE_STORAGE_NAME; entry->secret->persist_type = SecretPersistType::PERSISTENT; @@ -235332,7 +237323,7 @@ unique_ptr CatalogSetSecretStorage::StoreSecret(unique_ptrtemporary = !persistent; secret_entry->secret->storage_mode = storage_name; secret_entry->secret->persist_type = persistent ? SecretPersistType::PERSISTENT : SecretPersistType::TEMPORARY; - DependencyList l; + LogicalDependencyList l; secrets->CreateEntry(GetTransactionOrDefault(transaction), secret_name, std::move(secret_entry), l); auto secret_catalog_entry = @@ -235552,7 +237543,7 @@ void AccessModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.access_mode = DBConfig().options.access_mode; } -Value AccessModeSetting::GetSetting(ClientContext &context) { +Value AccessModeSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); switch (config.options.access_mode) { case AccessMode::AUTOMATIC: @@ -235578,7 +237569,7 @@ void AllowPersistentSecrets::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.secret_manager->ResetEnablePersistentSecrets(); } -Value AllowPersistentSecrets::GetSetting(ClientContext &context) { +Value AllowPersistentSecrets::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.secret_manager->PersistentSecretsEnabled()); } @@ -235595,7 +237586,7 @@ void CheckpointThresholdSetting::ResetGlobal(DatabaseInstance *db, DBConfig &con config.options.checkpoint_wal_size = DBConfig().options.checkpoint_wal_size; } -Value CheckpointThresholdSetting::GetSetting(ClientContext &context) { +Value CheckpointThresholdSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(StringUtil::BytesToHumanReadableString(config.options.checkpoint_wal_size)); } @@ -235623,7 +237614,7 @@ void DebugCheckpointAbort::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.checkpoint_abort = DBConfig().options.checkpoint_abort; } -Value DebugCheckpointAbort::GetSetting(ClientContext &context) { +Value DebugCheckpointAbort::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(*context.db); auto setting = config.options.checkpoint_abort; switch (setting) { @@ -235651,7 +237642,7 @@ void DebugForceExternal::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).force_external = input.GetValue(); } -Value DebugForceExternal::GetSetting(ClientContext &context) { +Value DebugForceExternal::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).force_external); } @@ -235666,7 +237657,7 @@ void DebugForceNoCrossProduct::SetLocal(ClientContext &context, const Value &inp ClientConfig::GetConfig(context).force_no_cross_product = input.GetValue(); } -Value DebugForceNoCrossProduct::GetSetting(ClientContext &context) { +Value DebugForceNoCrossProduct::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).force_no_cross_product); } @@ -235685,7 +237676,7 @@ void OrderedAggregateThreshold::SetLocal(ClientContext &context, const Value &in ClientConfig::GetConfig(context).ordered_aggregate_threshold = param; } -Value OrderedAggregateThreshold::GetSetting(ClientContext &context) { +Value OrderedAggregateThreshold::GetSetting(const ClientContext &context) { return Value::UBIGINT(ClientConfig::GetConfig(context).ordered_aggregate_threshold); } @@ -235709,7 +237700,7 @@ void DebugWindowMode::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.window_mode = DBConfig().options.window_mode; } -Value DebugWindowMode::GetSetting(ClientContext &context) { +Value DebugWindowMode::GetSetting(const ClientContext &context) { return Value(); } @@ -235724,7 +237715,7 @@ void DebugAsOfIEJoin::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).force_asof_iejoin = input.GetValue(); } -Value DebugAsOfIEJoin::GetSetting(ClientContext &context) { +Value DebugAsOfIEJoin::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).force_asof_iejoin); } @@ -235739,7 +237730,7 @@ void PreferRangeJoins::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).prefer_range_joins = input.GetValue(); } -Value PreferRangeJoins::GetSetting(ClientContext &context) { +Value PreferRangeJoins::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).prefer_range_joins); } @@ -235768,7 +237759,7 @@ void DefaultCollationSetting::SetLocal(ClientContext &context, const Value &inpu config.options.collation = parameter; } -Value DefaultCollationSetting::GetSetting(ClientContext &context) { +Value DefaultCollationSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.collation); } @@ -235792,7 +237783,7 @@ void DefaultOrderSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.default_order_type = DBConfig().options.default_order_type; } -Value DefaultOrderSetting::GetSetting(ClientContext &context) { +Value DefaultOrderSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); switch (config.options.default_order_type) { case OrderType::ASCENDING: @@ -235830,7 +237821,7 @@ void DefaultNullOrderSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config config.options.default_null_order = DBConfig().options.default_null_order; } -Value DefaultNullOrderSetting::GetSetting(ClientContext &context) { +Value DefaultNullOrderSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); switch (config.options.default_null_order) { case DefaultOrderByNullType::NULLS_FIRST: @@ -235857,7 +237848,7 @@ void DefaultSecretStorage::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.secret_manager->ResetDefaultStorage(); } -Value DefaultSecretStorage::GetSetting(ClientContext &context) { +Value DefaultSecretStorage::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return config.secret_manager->DefaultStorage(); } @@ -235882,7 +237873,7 @@ void DisabledFileSystemsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &con fs.SetDisabledFileSystems(vector()); } -Value DisabledFileSystemsSetting::GetSetting(ClientContext &context) { +Value DisabledFileSystemsSetting::GetSetting(const ClientContext &context) { return Value(""); } @@ -235907,7 +237898,7 @@ void DisabledOptimizersSetting::ResetGlobal(DatabaseInstance *db, DBConfig &conf config.options.disabled_optimizers = DBConfig().options.disabled_optimizers; } -Value DisabledOptimizersSetting::GetSetting(ClientContext &context) { +Value DisabledOptimizersSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); string result; for (auto &optimizer : config.options.disabled_optimizers) { @@ -235937,7 +237928,7 @@ void EnableExternalAccessSetting::ResetGlobal(DatabaseInstance *db, DBConfig &co config.options.enable_external_access = DBConfig().options.enable_external_access; } -Value EnableExternalAccessSetting::GetSetting(ClientContext &context) { +Value EnableExternalAccessSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.enable_external_access); } @@ -235953,7 +237944,7 @@ void EnableFSSTVectors::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.enable_fsst_vectors = DBConfig().options.enable_fsst_vectors; } -Value EnableFSSTVectors::GetSetting(ClientContext &context) { +Value EnableFSSTVectors::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.enable_fsst_vectors); } @@ -235976,11 +237967,28 @@ void AllowUnsignedExtensionsSetting::ResetGlobal(DatabaseInstance *db, DBConfig config.options.allow_unsigned_extensions = DBConfig().options.allow_unsigned_extensions; } -Value AllowUnsignedExtensionsSetting::GetSetting(ClientContext &context) { +Value AllowUnsignedExtensionsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.allow_unsigned_extensions); } +//===--------------------------------------------------------------------===// +// Allow Extensions Metadata Mismatch +//===--------------------------------------------------------------------===// +void AllowExtensionsMetadataMismatchSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const Value &input) { + auto new_value = input.GetValue(); + config.options.allow_extensions_metadata_mismatch = new_value; +} + +void AllowExtensionsMetadataMismatchSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { + config.options.allow_extensions_metadata_mismatch = DBConfig().options.allow_extensions_metadata_mismatch; +} + +Value AllowExtensionsMetadataMismatchSetting::GetSetting(const ClientContext &context) { + auto &config = DBConfig::GetConfig(context); + return Value::BOOLEAN(config.options.allow_extensions_metadata_mismatch); +} + //===--------------------------------------------------------------------===// // Allow Unredacted Secrets //===--------------------------------------------------------------------===// @@ -235999,7 +238007,7 @@ void AllowUnredactedSecretsSetting::ResetGlobal(DatabaseInstance *db, DBConfig & config.options.allow_unredacted_secrets = DBConfig().options.allow_unredacted_secrets; } -Value AllowUnredactedSecretsSetting::GetSetting(ClientContext &context) { +Value AllowUnredactedSecretsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.allow_unredacted_secrets); } @@ -236015,7 +238023,7 @@ void EnableObjectCacheSetting::ResetGlobal(DatabaseInstance *db, DBConfig &confi config.options.object_cache_enable = DBConfig().options.object_cache_enable; } -Value EnableObjectCacheSetting::GetSetting(ClientContext &context) { +Value EnableObjectCacheSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.object_cache_enable); } @@ -236031,7 +238039,7 @@ void EnableHTTPMetadataCacheSetting::ResetGlobal(DatabaseInstance *db, DBConfig config.options.http_metadata_cache_enable = DBConfig().options.http_metadata_cache_enable; } -Value EnableHTTPMetadataCacheSetting::GetSetting(ClientContext &context) { +Value EnableHTTPMetadataCacheSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.http_metadata_cache_enable); } @@ -236064,7 +238072,7 @@ void EnableProfilingSetting::SetLocal(ClientContext &context, const Value &input config.emit_profiler_output = true; } -Value EnableProfilingSetting::GetSetting(ClientContext &context) { +Value EnableProfilingSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); if (!config.enable_profiler) { return Value(); @@ -236092,7 +238100,7 @@ void CustomExtensionRepository::SetGlobal(DatabaseInstance *db, DBConfig &config config.options.custom_extension_repo = input.ToString(); } -Value CustomExtensionRepository::GetSetting(ClientContext &context) { +Value CustomExtensionRepository::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.custom_extension_repo); } @@ -236108,7 +238116,7 @@ void AutoloadExtensionRepository::SetGlobal(DatabaseInstance *db, DBConfig &conf config.options.autoinstall_extension_repo = input.ToString(); } -Value AutoloadExtensionRepository::GetSetting(ClientContext &context) { +Value AutoloadExtensionRepository::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.autoinstall_extension_repo); } @@ -236124,7 +238132,7 @@ void AutoinstallKnownExtensions::ResetGlobal(DatabaseInstance *db, DBConfig &con config.options.autoinstall_known_extensions = DBConfig().options.autoinstall_known_extensions; } -Value AutoinstallKnownExtensions::GetSetting(ClientContext &context) { +Value AutoinstallKnownExtensions::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.autoinstall_known_extensions); } @@ -236139,7 +238147,7 @@ void AutoloadKnownExtensions::ResetGlobal(DatabaseInstance *db, DBConfig &config config.options.autoload_known_extensions = DBConfig().options.autoload_known_extensions; } -Value AutoloadKnownExtensions::GetSetting(ClientContext &context) { +Value AutoloadKnownExtensions::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.autoload_known_extensions); } @@ -236159,7 +238167,7 @@ void EnableProgressBarSetting::SetLocal(ClientContext &context, const Value &inp config.enable_progress_bar = input.GetValue(); } -Value EnableProgressBarSetting::GetSetting(ClientContext &context) { +Value EnableProgressBarSetting::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).enable_progress_bar); } @@ -236178,7 +238186,7 @@ void EnableProgressBarPrintSetting::ResetLocal(ClientContext &context) { config.print_progress_bar = ClientConfig().print_progress_bar; } -Value EnableProgressBarPrintSetting::GetSetting(ClientContext &context) { +Value EnableProgressBarPrintSetting::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).print_progress_bar); } @@ -236193,7 +238201,7 @@ void ErrorsAsJsonSetting::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).errors_as_json = BooleanValue::Get(input); } -Value ErrorsAsJsonSetting::GetSetting(ClientContext &context) { +Value ErrorsAsJsonSetting::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).errors_as_json ? 1 : 0); } @@ -236218,7 +238226,7 @@ void ExplainOutputSetting::SetLocal(ClientContext &context, const Value &input) } } -Value ExplainOutputSetting::GetSetting(ClientContext &context) { +Value ExplainOutputSetting::GetSetting(const ClientContext &context) { switch (ClientConfig::GetConfig(context).explain_output_type) { case ExplainOutputType::ALL: return "all"; @@ -236235,7 +238243,6 @@ Value ExplainOutputSetting::GetSetting(ClientContext &context) { // Extension Directory Setting //===--------------------------------------------------------------------===// void ExtensionDirectorySetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const Value &input) { - auto new_directory = input.ToString(); config.options.extension_directory = input.ToString(); } @@ -236243,7 +238250,7 @@ void ExtensionDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &conf config.options.extension_directory = DBConfig().options.extension_directory; } -Value ExtensionDirectorySetting::GetSetting(ClientContext &context) { +Value ExtensionDirectorySetting::GetSetting(const ClientContext &context) { return Value(DBConfig::GetConfig(context).options.extension_directory); } @@ -236270,7 +238277,7 @@ void ExternalThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.external_threads = new_external_threads; } -Value ExternalThreadsSetting::GetSetting(ClientContext &context) { +Value ExternalThreadsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BIGINT(config.options.external_threads); } @@ -236289,7 +238296,7 @@ void FileSearchPathSetting::SetLocal(ClientContext &context, const Value &input) client_data.file_search_path = parameter; } -Value FileSearchPathSetting::GetSetting(ClientContext &context) { +Value FileSearchPathSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); return Value(client_data.file_search_path); } @@ -236319,7 +238326,7 @@ void ForceCompressionSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config config.options.force_compression = DBConfig().options.force_compression; } -Value ForceCompressionSetting::GetSetting(ClientContext &context) { +Value ForceCompressionSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(*context.db); return CompressionTypeToString(config.options.force_compression); } @@ -236341,7 +238348,7 @@ void ForceBitpackingModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &con config.options.force_bitpacking_mode = DBConfig().options.force_bitpacking_mode; } -Value ForceBitpackingModeSetting::GetSetting(ClientContext &context) { +Value ForceBitpackingModeSetting::GetSetting(const ClientContext &context) { return Value(BitpackingModeToString(context.db->config.options.force_bitpacking_mode)); } @@ -236362,7 +238369,7 @@ void HomeDirectorySetting::SetLocal(ClientContext &context, const Value &input) config.home_directory = input.IsNull() ? string() : input.ToString(); } -Value HomeDirectorySetting::GetSetting(ClientContext &context) { +Value HomeDirectorySetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); return Value(config.home_directory); } @@ -236379,7 +238386,7 @@ void IntegerDivisionSetting::SetLocal(ClientContext &context, const Value &input config.integer_division = input.GetValue(); } -Value IntegerDivisionSetting::GetSetting(ClientContext &context) { +Value IntegerDivisionSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); return Value(config.integer_division); } @@ -236405,7 +238412,7 @@ void LogQueryPathSetting::SetLocal(ClientContext &context, const Value &input) { } } -Value LogQueryPathSetting::GetSetting(ClientContext &context) { +Value LogQueryPathSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); return client_data.log_query_writer ? Value(client_data.log_query_writer->path) : Value(); } @@ -236422,7 +238429,7 @@ void LockConfigurationSetting::ResetGlobal(DatabaseInstance *db, DBConfig &confi config.options.lock_configuration = DBConfig().options.lock_configuration; } -Value LockConfigurationSetting::GetSetting(ClientContext &context) { +Value LockConfigurationSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.lock_configuration); } @@ -236438,7 +238445,7 @@ void ImmediateTransactionModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig config.options.immediate_transaction_mode = DBConfig().options.immediate_transaction_mode; } -Value ImmediateTransactionModeSetting::GetSetting(ClientContext &context) { +Value ImmediateTransactionModeSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.immediate_transaction_mode); } @@ -236454,7 +238461,7 @@ void MaximumExpressionDepthSetting::SetLocal(ClientContext &context, const Value ClientConfig::GetConfig(context).max_expression_depth = input.GetValue(); } -Value MaximumExpressionDepthSetting::GetSetting(ClientContext &context) { +Value MaximumExpressionDepthSetting::GetSetting(const ClientContext &context) { return Value::UBIGINT(ClientConfig::GetConfig(context).max_expression_depth); } @@ -236472,7 +238479,7 @@ void MaximumMemorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.SetDefaultMaxMemory(); } -Value MaximumMemorySetting::GetSetting(ClientContext &context) { +Value MaximumMemorySetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(StringUtil::BytesToHumanReadableString(config.options.maximum_memory)); } @@ -236488,7 +238495,7 @@ void OldImplicitCasting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.old_implicit_casting = DBConfig().options.old_implicit_casting; } -Value OldImplicitCasting::GetSetting(ClientContext &context) { +Value OldImplicitCasting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.old_implicit_casting); } @@ -236505,7 +238512,7 @@ void PartitionedWriteFlushThreshold::SetLocal(ClientContext &context, const Valu ClientConfig::GetConfig(context).partitioned_write_flush_threshold = input.GetValue(); } -Value PartitionedWriteFlushThreshold::GetSetting(ClientContext &context) { +Value PartitionedWriteFlushThreshold::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).partitioned_write_flush_threshold); } @@ -236520,7 +238527,7 @@ void PasswordSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { // nop } -Value PasswordSetting::GetSetting(ClientContext &context) { +Value PasswordSetting::GetSetting(const ClientContext &context) { return Value(); } @@ -236539,7 +238546,7 @@ void PerfectHashThresholdSetting::SetLocal(ClientContext &context, const Value & ClientConfig::GetConfig(context).perfect_ht_threshold = bits; } -Value PerfectHashThresholdSetting::GetSetting(ClientContext &context) { +Value PerfectHashThresholdSetting::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).perfect_ht_threshold); } @@ -236554,7 +238561,7 @@ void PivotFilterThreshold::SetLocal(ClientContext &context, const Value &input) ClientConfig::GetConfig(context).pivot_filter_threshold = input.GetValue(); } -Value PivotFilterThreshold::GetSetting(ClientContext &context) { +Value PivotFilterThreshold::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).pivot_filter_threshold); } @@ -236569,7 +238576,7 @@ void PivotLimitSetting::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).pivot_limit = input.GetValue(); } -Value PivotLimitSetting::GetSetting(ClientContext &context) { +Value PivotLimitSetting::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).pivot_limit); } @@ -236584,7 +238591,7 @@ void PreserveIdentifierCase::SetLocal(ClientContext &context, const Value &input ClientConfig::GetConfig(context).preserve_identifier_case = input.GetValue(); } -Value PreserveIdentifierCase::GetSetting(ClientContext &context) { +Value PreserveIdentifierCase::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).preserve_identifier_case); } @@ -236599,7 +238606,7 @@ void PreserveInsertionOrder::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.preserve_insertion_order = DBConfig().options.preserve_insertion_order; } -Value PreserveInsertionOrder::GetSetting(ClientContext &context) { +Value PreserveInsertionOrder::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.preserve_insertion_order); } @@ -236617,7 +238624,7 @@ void ExportLargeBufferArrow::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.arrow_offset_size = DBConfig().options.arrow_offset_size; } -Value ExportLargeBufferArrow::GetSetting(ClientContext &context) { +Value ExportLargeBufferArrow::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); bool export_large_buffers_arrow = config.options.arrow_offset_size == ArrowOffsetSize::LARGE; return Value::BOOLEAN(export_large_buffers_arrow); @@ -236636,7 +238643,7 @@ void ProfileOutputSetting::SetLocal(ClientContext &context, const Value &input) config.profiler_save_location = parameter; } -Value ProfileOutputSetting::GetSetting(ClientContext &context) { +Value ProfileOutputSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); return Value(config.profiler_save_location); } @@ -236666,7 +238673,7 @@ void ProfilingModeSetting::SetLocal(ClientContext &context, const Value &input) } } -Value ProfilingModeSetting::GetSetting(ClientContext &context) { +Value ProfilingModeSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); if (!config.enable_profiler) { return Value(); @@ -236691,7 +238698,7 @@ void ProgressBarTimeSetting::SetLocal(ClientContext &context, const Value &input config.enable_progress_bar = true; } -Value ProgressBarTimeSetting::GetSetting(ClientContext &context) { +Value ProgressBarTimeSetting::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).wait_time); } @@ -236710,7 +238717,7 @@ void SchemaSetting::SetLocal(ClientContext &context, const Value &input) { client_data.catalog_search_path->Set(CatalogSearchEntry::Parse(parameter), CatalogSetPathType::SET_SCHEMA); } -Value SchemaSetting::GetSetting(ClientContext &context) { +Value SchemaSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); return client_data.catalog_search_path->GetDefault().schema; } @@ -236730,7 +238737,7 @@ void SearchPathSetting::SetLocal(ClientContext &context, const Value &input) { client_data.catalog_search_path->Set(CatalogSearchEntry::ParseList(parameter), CatalogSetPathType::SET_SCHEMAS); } -Value SearchPathSetting::GetSetting(ClientContext &context) { +Value SearchPathSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); auto &set_paths = client_data.catalog_search_path->GetSetPaths(); return Value(CatalogSearchEntry::ListToString(set_paths)); @@ -236747,7 +238754,7 @@ void SecretDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.secret_manager->ResetPersistentSecretPath(); } -Value SecretDirectorySetting::GetSetting(ClientContext &context) { +Value SecretDirectorySetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return config.secret_manager->PersistentSecretPath(); } @@ -236773,7 +238780,7 @@ void TempDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { } } -Value TempDirectorySetting::GetSetting(ClientContext &context) { +Value TempDirectorySetting::GetSetting(const ClientContext &context) { auto &buffer_manager = BufferManager::GetBufferManager(context); return Value(buffer_manager.GetTemporaryDirectory()); } @@ -236801,7 +238808,7 @@ void ThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.maximum_threads = new_maximum_threads; } -Value ThreadsSetting::GetSetting(ClientContext &context) { +Value ThreadsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BIGINT(config.options.maximum_threads); } @@ -236817,7 +238824,7 @@ void UsernameSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { // nop } -Value UsernameSetting::GetSetting(ClientContext &context) { +Value UsernameSetting::GetSetting(const ClientContext &context) { return Value(); } @@ -236838,7 +238845,7 @@ void FlushAllocatorSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) } } -Value FlushAllocatorSetting::GetSetting(ClientContext &context) { +Value FlushAllocatorSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(StringUtil::BytesToHumanReadableString(config.options.allocator_flush_threshold)); } @@ -236862,7 +238869,7 @@ void DuckDBApiSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.duckdb_api = GetDefaultUserAgent(); } -Value DuckDBApiSetting::GetSetting(ClientContext &context) { +Value DuckDBApiSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.duckdb_api); } @@ -236887,7 +238894,7 @@ void CustomUserAgentSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.custom_user_agent = DBConfig().options.custom_user_agent; } -Value CustomUserAgentSetting::GetSetting(ClientContext &context) { +Value CustomUserAgentSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.custom_user_agent); } @@ -237157,7 +239164,7 @@ void ColumnBindingReplacer::VisitExpression(unique_ptr *expression) //===----------------------------------------------------------------------===// // DuckDB // -// duckdb/optimizer/column_lifetime_optimizer.hpp +// duckdb/optimizer/column_lifetime_analyzer.hpp // // //===----------------------------------------------------------------------===// @@ -237204,6 +239211,7 @@ class ColumnLifetimeAnalyzer : public LogicalOperatorVisitor { + namespace duckdb { void ColumnLifetimeAnalyzer::ExtractUnusedColumnBindings(vector bindings, @@ -237340,6 +239348,12 @@ void ColumnLifetimeAnalyzer::VisitOperator(LogicalOperator &op) { // then generate the projection map GenerateProjectionMap(op.children[0]->GetColumnBindings(), unused_bindings, filter.projection_map); + auto bindings = filter.GetColumnBindings(); + + if (bindings.empty()) { + return; + } + return; } default: @@ -237463,11 +239477,11 @@ void CommonAggregateOptimizer::ExtractCommonAggregates(LogicalAggregate &aggr) { - namespace duckdb { +class Optimizer; +class ClientContext; class LogicalOperator; -struct JoinCondition; struct CMChildInfo { public: @@ -237526,14 +239540,11 @@ typedef column_binding_map_t> statistics_map_t; //! but only if the data enters a materializing operator class CompressedMaterialization { public: - explicit CompressedMaterialization(ClientContext &context, Binder &binder, statistics_map_t &&statistics_map); + CompressedMaterialization(Optimizer &optimizer, LogicalOperator &root, statistics_map_t &statistics_map); void Compress(unique_ptr &op); private: - //! Depth-first traversal of the plan - void CompressInternal(unique_ptr &op); - //! Compress materializing operators void CompressAggregate(unique_ptr &op); void CompressDistinct(unique_ptr &op); @@ -237553,7 +239564,7 @@ class CompressedMaterialization { bool TryCompressChild(CompressedMaterializationInfo &info, const CMChildInfo &child_info, vector> &compress_expressions); void CreateCompressProjection(unique_ptr &child_op, - vector> &&compress_exprs, + vector> compress_exprs, CompressedMaterializationInfo &info, CMChildInfo &child_info); void CreateDecompressProjection(unique_ptr &op, CompressedMaterializationInfo &info); @@ -237569,15 +239580,16 @@ class CompressedMaterialization { const BaseStatistics &stats); unique_ptr GetIntegralDecompress(unique_ptr input, const LogicalType &result_type, const BaseStatistics &stats); - unique_ptr GetStringDecompress(unique_ptr input, const BaseStatistics &stats); + unique_ptr GetStringDecompress(unique_ptr input, const LogicalType &result_type, + const BaseStatistics &stats); private: + Optimizer &optimizer; ClientContext &context; - Binder &binder; - statistics_map_t statistics_map; - unordered_set compression_table_indices; - unordered_set decompression_table_indices; + //! The root of the query plan optional_ptr root; + //! The map of ColumnBinding -> statistics for the various nodes + statistics_map_t &statistics_map; }; } // namespace duckdb @@ -237590,6 +239602,9 @@ namespace duckdb { void CompressedMaterialization::CompressAggregate(unique_ptr &op) { auto &aggregate = op->Cast(); + if (aggregate.grouping_sets.size() > 1) { + return; // FIXME: we should be able to compress here but for some reason the NULL statistics ain't right + } auto &groups = aggregate.groups; column_binding_set_t group_binding_set; for (const auto &group : groups) { @@ -237833,6 +239848,8 @@ void CompressedMaterialization::UpdateOrderStats(unique_ptr &op + + //===----------------------------------------------------------------------===// // DuckDB // @@ -237865,7 +239882,6 @@ class TopN { - namespace duckdb { CMChildInfo::CMChildInfo(LogicalOperator &op, const column_binding_set_t &referenced_bindings) @@ -237885,7 +239901,7 @@ CMBindingInfo::CMBindingInfo(ColumnBinding binding_p, const LogicalType &type_p) CompressedMaterializationInfo::CompressedMaterializationInfo(LogicalOperator &op, vector &&child_idxs_p, const column_binding_set_t &referenced_bindings) - : child_idxs(child_idxs_p) { + : child_idxs(std::move(child_idxs_p)) { child_info.reserve(child_idxs.size()); for (const auto &child_idx : child_idxs) { child_info.emplace_back(*op.children[child_idx], referenced_bindings); @@ -237896,9 +239912,9 @@ CompressExpression::CompressExpression(unique_ptr expression_p, uniq : expression(std::move(expression_p)), stats(std::move(stats_p)) { } -CompressedMaterialization::CompressedMaterialization(ClientContext &context_p, Binder &binder_p, - statistics_map_t &&statistics_map_p) - : context(context_p), binder(binder_p), statistics_map(std::move(statistics_map_p)) { +CompressedMaterialization::CompressedMaterialization(Optimizer &optimizer_p, LogicalOperator &root_p, + statistics_map_t &statistics_map_p) + : optimizer(optimizer_p), context(optimizer.context), root(&root_p), statistics_map(statistics_map_p) { } void CompressedMaterialization::GetReferencedBindings(const Expression &expression, @@ -237929,22 +239945,21 @@ void CompressedMaterialization::UpdateBindingInfo(CompressedMaterializationInfo } void CompressedMaterialization::Compress(unique_ptr &op) { - root = op.get(); - root->ResolveOperatorTypes(); - - CompressInternal(op); -} - -void CompressedMaterialization::CompressInternal(unique_ptr &op) { if (TopN::CanOptimize(*op)) { // Let's not mess with the TopN optimizer - CompressInternal(op->children[0]->children[0]); return; } - for (auto &child : op->children) { - CompressInternal(child); + switch (op->type) { + case LogicalOperatorType::LOGICAL_AGGREGATE_AND_GROUP_BY: + case LogicalOperatorType::LOGICAL_DISTINCT: + case LogicalOperatorType::LOGICAL_ORDER_BY: + break; + default: + return; } + root->ResolveOperatorTypes(); + switch (op->type) { case LogicalOperatorType::LOGICAL_AGGREGATE_AND_GROUP_BY: CompressAggregate(op); @@ -238013,7 +240028,7 @@ bool CompressedMaterialization::TryCompressChild(CompressedMaterializationInfo & } void CompressedMaterialization::CreateCompressProjection(unique_ptr &child_op, - vector> &&compress_exprs, + vector> compress_exprs, CompressedMaterializationInfo &info, CMChildInfo &child_info) { // Replace child op with a projection vector> projections; @@ -238021,9 +240036,8 @@ void CompressedMaterialization::CreateCompressProjection(unique_ptrexpression)); } - const auto table_index = binder.GenerateTableIndex(); + const auto table_index = optimizer.binder.GenerateTableIndex(); auto compress_projection = make_uniq(table_index, std::move(projections)); - compression_table_indices.insert(table_index); compress_projection->ResolveOperatorTypes(); compress_projection->children.emplace_back(std::move(child_op)); @@ -238046,7 +240060,7 @@ void CompressedMaterialization::CreateCompressProjection(unique_ptr(table_index, std::move(decompress_exprs)); - decompression_table_indices.insert(table_index); decompress_projection->children.emplace_back(std::move(op)); op = std::move(decompress_projection); // Check if we're placing a projection on top of the root - if (op->children[0].get() == root.get()) { - root = op.get(); + if (RefersToSameObject(*op->children[0], *root)) { + root = op; return; } @@ -238265,11 +240278,11 @@ unique_ptr CompressedMaterialization::GetStringCompress(uniq auto max_string = StringStats::Max(stats); uint8_t min_numeric = 0; - if (max_string_length != 0 && min_string.length() != 0) { + if (max_string_length != 0 && !min_string.empty()) { min_numeric = *reinterpret_cast(min_string.c_str()); } uint8_t max_numeric = 0; - if (max_string_length != 0 && max_string.length() != 0) { + if (max_string_length != 0 && !max_string.empty()) { max_numeric = *reinterpret_cast(max_string.c_str()); } @@ -238302,7 +240315,7 @@ unique_ptr CompressedMaterialization::GetDecompressExpression(unique if (TypeIsIntegral(type.InternalType())) { return GetIntegralDecompress(std::move(input), result_type, stats); } else if (type.id() == LogicalTypeId::VARCHAR) { - return GetStringDecompress(std::move(input), stats); + return GetStringDecompress(std::move(input), result_type, stats); } else { throw InternalException("Type other than integral/string marked for decompression!"); } @@ -238320,13 +240333,13 @@ unique_ptr CompressedMaterialization::GetIntegralDecompress(unique_p } unique_ptr CompressedMaterialization::GetStringDecompress(unique_ptr input, + const LogicalType &result_type, const BaseStatistics &stats) { D_ASSERT(StringStats::HasMaxStringLength(stats)); auto decompress_function = CMStringDecompressFun::GetFunction(input->return_type); vector> arguments; arguments.emplace_back(std::move(input)); - return make_uniq(decompress_function.return_type, decompress_function, - std::move(arguments), nullptr); + return make_uniq(result_type, decompress_function, std::move(arguments), nullptr); } } // namespace duckdb @@ -238386,9 +240399,9 @@ namespace duckdb { //! underlying projection struct CSENode { idx_t count; - idx_t column_index; + optional_idx column_index; - CSENode() : count(1), column_index(DConstants::INVALID_INDEX) { + CSENode() : count(1), column_index() { } }; @@ -238475,7 +240488,7 @@ void CommonSubExpressionOptimizer::PerformCSEReplacement(unique_ptr // check if it has already been pushed into the projection auto alias = expr.alias; auto type = expr.return_type; - if (node.column_index == DConstants::INVALID_INDEX) { + if (!node.column_index.IsValid()) { // has not been pushed yet: push it node.column_index = state.expressions.size(); state.expressions.push_back(std::move(expr_ptr)); @@ -238483,8 +240496,8 @@ void CommonSubExpressionOptimizer::PerformCSEReplacement(unique_ptr state.cached_expressions.push_back(std::move(expr_ptr)); } // replace the original expression with a bound column ref - expr_ptr = make_uniq(alias, type, - ColumnBinding(state.projection_index, node.column_index)); + expr_ptr = make_uniq( + alias, type, ColumnBinding(state.projection_index, node.column_index.GetIndex())); return; } } @@ -241306,7 +243319,7 @@ struct FilterInfo { //! When the plan enumerator finishes, the Query Graph Manger can then recreate the logical plan. class QueryGraphManager { public: - QueryGraphManager(ClientContext &context) : relation_manager(context), context(context) { + explicit QueryGraphManager(ClientContext &context) : relation_manager(context), context(context) { } //! manage relations and the logical operators they represent @@ -241492,9 +243505,9 @@ void CardinalityEstimator::AddRelationTdom(FilterInfo &filter_info) { relations_to_tdoms.emplace_back(new_r2tdom); } -bool CardinalityEstimator::SingleColumnFilter(FilterInfo &filter_info) { - if (filter_info.left_set && filter_info.right_set) { - // Both set +bool CardinalityEstimator::SingleRelationFilter(FilterInfo &filter_info) { + if (filter_info.left_set && filter_info.right_set && filter_info.set.count > 1) { + // Both set and are from different relations return false; } if (EmptyFilter(filter_info)) { @@ -241555,7 +243568,7 @@ void CardinalityEstimator::InitEquivalentRelations(const vector &stats) for (auto &total_domain : relations_to_tdoms) { for (auto &binding : total_domain.equivalent_relations) { D_ASSERT(binding.table_index < stats.size()); - D_ASSERT(binding.column_index < stats.at(binding.table_index).column_names.size()); - string column_name = stats.at(binding.table_index).column_names.at(binding.column_index); + string column_name; + if (binding.column_index < stats[binding.table_index].column_names.size()) { + column_name = stats[binding.table_index].column_names[binding.column_index]; + } else { + column_name = "[unknown]"; + } total_domain.column_names.push_back(column_name); } } @@ -241828,7 +243845,7 @@ class QueryGraphManager; class CostModel { public: - CostModel(QueryGraphManager &query_graph_manager); + explicit CostModel(QueryGraphManager &query_graph_manager); private: //! query graph storing relation manager information @@ -244329,7 +246346,6 @@ bool FoldableConstantMatcher::Match(Expression &expr, vector &callback) { +bool Optimizer::OptimizerDisabled(OptimizerType type) { auto &config = DBConfig::GetConfig(context); - if (config.options.disabled_optimizers.find(type) != config.options.disabled_optimizers.end()) { + return config.options.disabled_optimizers.find(type) != config.options.disabled_optimizers.end(); +} + +void Optimizer::RunOptimizer(OptimizerType type, const std::function &callback) { + if (OptimizerDisabled(type)) { // optimizer is marked as disabled: skip return; } @@ -245037,6 +247057,12 @@ unique_ptr Optimizer::Optimize(unique_ptr plan cse_optimizer.VisitOperator(*plan); }); + // transform ORDER BY + LIMIT to TopN + RunOptimizer(OptimizerType::TOP_N, [&]() { + TopN topn; + plan = topn.Optimize(std::move(plan)); + }); + // creates projection maps so unused columns are projected out early RunOptimizer(OptimizerType::COLUMN_LIFETIME, [&]() { ColumnLifetimeAnalyzer column_lifetime(true); @@ -245046,7 +247072,7 @@ unique_ptr Optimizer::Optimize(unique_ptr plan // perform statistics propagation column_binding_map_t> statistics_map; RunOptimizer(OptimizerType::STATISTICS_PROPAGATION, [&]() { - StatisticsPropagator propagator(*this); + StatisticsPropagator propagator(*this, *plan); propagator.PropagateStatistics(plan); statistics_map = propagator.GetStatisticsMap(); }); @@ -245063,18 +247089,6 @@ unique_ptr Optimizer::Optimize(unique_ptr plan column_lifetime.VisitOperator(*plan); }); - // compress data based on statistics for materializing operators - RunOptimizer(OptimizerType::COMPRESSED_MATERIALIZATION, [&]() { - CompressedMaterialization compressed_materialization(context, binder, std::move(statistics_map)); - compressed_materialization.Compress(plan); - }); - - // transform ORDER BY + LIMIT to TopN - RunOptimizer(OptimizerType::TOP_N, [&]() { - TopN topn; - plan = topn.Optimize(std::move(plan)); - }); - // apply simple expression heuristics to get an initial reordering RunOptimizer(OptimizerType::REORDER_FILTER, [&]() { ExpressionHeuristics expression_heuristics(*this); @@ -245413,9 +247427,19 @@ namespace duckdb { using Filter = FilterPushdown::Filter; unique_ptr FilterPushdown::PushdownCrossProduct(unique_ptr op) { - D_ASSERT(op->type == LogicalOperatorType::LOGICAL_CROSS_PRODUCT); + D_ASSERT(op->children.size() > 1); FilterPushdown left_pushdown(optimizer), right_pushdown(optimizer); vector> join_expressions; + auto join_ref_type = JoinRefType::REGULAR; + switch (op->type) { + case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: + break; + case LogicalOperatorType::LOGICAL_ASOF_JOIN: + join_ref_type = JoinRefType::ASOF; + break; + default: + throw InternalException("Unsupported join type for cross product push down"); + } unordered_set left_bindings, right_bindings; if (!filters.empty()) { // check to see into which side we should push the filters @@ -245447,16 +247471,17 @@ unique_ptr FilterPushdown::PushdownCrossProduct(unique_ptr conditions; vector> arbitrary_expressions; - auto join_type = JoinType::INNER; + const auto join_type = JoinType::INNER; LogicalComparisonJoin::ExtractJoinConditions(GetContext(), join_type, op->children[0], op->children[1], left_bindings, right_bindings, join_expressions, conditions, arbitrary_expressions); // create the join from the join conditions - return LogicalComparisonJoin::CreateJoin(GetContext(), JoinType::INNER, JoinRefType::REGULAR, - std::move(op->children[0]), std::move(op->children[1]), - std::move(conditions), std::move(arbitrary_expressions)); + return LogicalComparisonJoin::CreateJoin(GetContext(), join_type, join_ref_type, std::move(op->children[0]), + std::move(op->children[1]), std::move(conditions), + std::move(arbitrary_expressions)); } else { // no join conditions found: keep as cross product + D_ASSERT(op->type == LogicalOperatorType::LOGICAL_CROSS_PRODUCT); return op; } } @@ -245613,12 +247638,10 @@ unique_ptr FilterPushdown::PushdownInnerJoin(unique_ptr(std::move(op)); } - } else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) { - // Don't mess with non-standard condition interpretations - return FinishPushdown(std::move(op)); } else { // comparison join - D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN); + D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN || + op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN); auto &comp_join = join.Cast(); // turn the conditions into filters for (auto &i : comp_join.conditions) { @@ -245631,6 +247654,11 @@ unique_ptr FilterPushdown::PushdownInnerJoin(unique_ptrtype == LogicalOperatorType::LOGICAL_ASOF_JOIN) { + return PushdownCrossProduct(std::move(op)); + } + // turn the inner join into a cross product auto cross_product = make_uniq(std::move(op->children[0]), std::move(op->children[1])); // then push down cross product @@ -246075,7 +248103,7 @@ unique_ptr FilterPushdown::PushdownSetOperation(unique_ptr(std::move(op)); } - if (left_empty) { + if (left_empty && setop.setop_all) { // left child is empty result switch (op->type) { case LogicalOperatorType::LOGICAL_UNION: @@ -246094,7 +248122,7 @@ unique_ptr FilterPushdown::PushdownSetOperation(unique_ptrtype) { case LogicalOperatorType::LOGICAL_UNION: @@ -246571,17 +248599,17 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) { // for every table filter, push a column binding into the column references map to prevent the column from // being projected out for (auto &filter : get.table_filters.filters) { - idx_t index = DConstants::INVALID_INDEX; + optional_idx index; for (idx_t i = 0; i < get.column_ids.size(); i++) { if (get.column_ids[i] == filter.first) { index = i; break; } } - if (index == DConstants::INVALID_INDEX) { + if (!index.IsValid()) { throw InternalException("Could not find column index for table filter"); } - ColumnBinding filter_binding(get.table_index, index); + ColumnBinding filter_binding(get.table_index, index.GetIndex()); if (column_references.find(filter_binding) == column_references.end()) { column_references.insert(make_pair(filter_binding, vector())); } @@ -247976,11 +250004,11 @@ unique_ptr OrderedAggregateOptimizer::Apply(ClientContext &context, types.emplace_back(child->return_type); } auto best_function = binder.BindFunction(func.name, func.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { + if (!best_function.IsValid()) { error.Throw(); } // found a matching function! - auto bound_function = func.functions.GetFunctionByOffset(best_function); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); return binder.BindAggregateFunction(bound_function, std::move(children), std::move(aggr.filter), aggr.IsDistinct() ? AggregateType::DISTINCT : AggregateType::NON_DISTINCT); } @@ -248096,6 +250124,7 @@ unique_ptr OrderedAggregateOptimizer::Apply(LogicalOperator &op, vec // form accessible to clients, so that client code can analyze the // parsed regular expressions. +#include #include #include #include @@ -248114,7 +250143,7 @@ unique_ptr OrderedAggregateOptimizer::Apply(LogicalOperator &op, vec #ifndef UTIL_UTIL_H_ #define UTIL_UTIL_H_ -#define arraysize(array) (int)(sizeof(array)/sizeof((array)[0])) +#define arraysize(array) (sizeof(array)/sizeof((array)[0])) #ifndef ATTRIBUTE_NORETURN #if defined(__GNUC__) @@ -248126,6 +250155,14 @@ unique_ptr OrderedAggregateOptimizer::Apply(LogicalOperator &op, vec #endif #endif +#ifndef ATTRIBUTE_UNUSED +#if defined(__GNUC__) +#define ATTRIBUTE_UNUSED __attribute__((unused)) +#else +#define ATTRIBUTE_UNUSED +#endif +#endif + #ifndef FALLTHROUGH_INTENDED #if defined(__clang__) #define FALLTHROUGH_INTENDED [[clang::fallthrough]] @@ -248165,6 +250202,7 @@ unique_ptr OrderedAggregateOptimizer::Apply(LogicalOperator &op, vec #include #include #include +#include @@ -248207,23 +250245,18 @@ unique_ptr OrderedAggregateOptimizer::Apply(LogicalOperator &op, vec #define VLOG(x) if((x)>0){}else LOG_INFO.stream() -namespace duckdb_re2 { - - class LogMessage { public: LogMessage(const char* file, int line) : flushed_(false) { - stream() << file << ":" << line << ": "; +// stream() << file << ":" << line << ": "; } void Flush() { - stream() << "\n"; - /*// R does not allow us to have a reference to stderr even if we are not using it - std::string s = str_.str(); - size_t n = s.size(); - if (fwrite(s.data(), 1, n, stderr) < n) {} // shut up gcc - */ - flushed_ = true; +// stream() << "\n"; +// std::string s = str_.str(); +// size_t n = s.size(); +// if (fwrite(s.data(), 1, n, stderr) < n) {} // shut up gcc +// flushed_ = true; } ~LogMessage() { if (!flushed_) { @@ -248243,26 +250276,26 @@ class LogMessage { // Silence "destructor never returns" warning for ~LogMessageFatal(). // Since this is a header file, push and then pop to limit the scope. #ifdef _MSC_VER -//#pragma warning(push) -//#pragma warning(disable: 4722) +#pragma warning(push) +#pragma warning(disable: 4722) #endif class LogMessageFatal : public LogMessage { public: LogMessageFatal(const char* file, int line) - : LogMessage(file, line) {} - ATTRIBUTE_NORETURN ~LogMessageFatal() { + : LogMessage(file, line) { + throw std::runtime_error("RE2 Fatal Error"); + } + ~LogMessageFatal() { Flush(); - abort(); } private: LogMessageFatal(const LogMessageFatal&) = delete; LogMessageFatal& operator=(const LogMessageFatal&) = delete; }; -} // namespace #ifdef _MSC_VER -//#pragma warning(pop) +#pragma warning(pop) #endif #endif // UTIL_LOGGING_H_ @@ -248317,7 +250350,7 @@ int fullrune(const char* s, int n); int utflen(const char* s); char* utfrune(const char*, Rune); -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_UTF_H_ @@ -248407,6 +250440,7 @@ enum RegexpStatusCode { kRegexpBadCharRange, // bad character class range kRegexpMissingBracket, // missing closing ] kRegexpMissingParen, // missing closing ) + kRegexpUnexpectedParen, // unexpected closing ) kRegexpTrailingBackslash, // at end of regexp kRegexpRepeatArgument, // repeat argument missing, e.g. "*" kRegexpRepeatSize, // bad repetition argument @@ -248482,13 +250516,13 @@ class CharClass { bool full() { return nrunes_ == Runemax+1; } bool FoldsASCII() { return folds_ascii_; } - bool Contains(Rune r); + bool Contains(Rune r) const; CharClass* Negate(); private: CharClass(); // not implemented ~CharClass(); // not implemented - static CharClass* New(int maxranges); + static CharClass* New(size_t maxranges); friend class CharClassBuilder; @@ -248501,29 +250535,6 @@ class CharClass { CharClass& operator=(const CharClass&) = delete; }; -struct repeat_t { // Repeat - int max_; - int min_; -}; - -struct capture_t { // Capture - int cap_; - std::string* name_; -}; - -struct literal_string_t{ // LiteralString - int nrunes_; - Rune* runes_; -}; - -struct char_class_t { // CharClass - // These two could be in separate union members, - // but it wouldn't save any space (there are other two-word structs) - // and keeping them separate avoids confusion during parsing. - CharClass* cc_; - CharClassBuilder* ccb_; -}; - class Regexp { public: @@ -248584,15 +250595,15 @@ class Regexp { return submany_; } - int min() { DCHECK_EQ(op_, kRegexpRepeat); return repeat_.min_; } - int max() { DCHECK_EQ(op_, kRegexpRepeat); return repeat_.max_; } - Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return rune_; } - CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return char_class_.cc_; } - int cap() { DCHECK_EQ(op_, kRegexpCapture); return capture_.cap_; } - const std::string* name() { DCHECK_EQ(op_, kRegexpCapture); return capture_.name_; } - Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return literal_string_.runes_; } - int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return literal_string_.nrunes_; } - int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return match_id_; } + int min() { DCHECK_EQ(op_, kRegexpRepeat); return arguments.repeat.min_; } + int max() { DCHECK_EQ(op_, kRegexpRepeat); return arguments.repeat.max_; } + Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return arguments.rune_; } + CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return arguments.char_class.cc_; } + int cap() { DCHECK_EQ(op_, kRegexpCapture); return arguments.capture.cap_; } + const std::string* name() { DCHECK_EQ(op_, kRegexpCapture); return arguments.capture.name_; } + Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return arguments.literal_string.runes_; } + int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return arguments.literal_string.nrunes_; } + int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return arguments.match_id_; } // Increments reference count, returns object as convenience. Regexp* Incref(); @@ -248693,6 +250704,17 @@ class Regexp { bool RequiredPrefix(std::string* prefix, bool* foldcase, Regexp** suffix); + // Whether every match of this regexp must be unanchored and + // begin with a non-empty fixed string (perhaps after ASCII + // case-folding). If so, returns the prefix. + // Callers should expect *prefix and *foldcase to be "zeroed" + // regardless of the return value. + bool RequiredPrefixForAccel(std::string* prefix, bool* foldcase); + + // Controls the maximum repeat count permitted by the parser. + // FOR FUZZING ONLY. + static void FUZZING_ONLY_set_maximum_repeat_count(int i); + private: // Constructor allocates vectors as appropriate for operator. explicit Regexp(RegexpOp op, ParseFlags parse_flags); @@ -248811,14 +250833,29 @@ class Regexp { // Arguments to operator. See description of operators above. union { - repeat_t repeat_; - capture_t capture_; - literal_string_t literal_string_; - char_class_t char_class_; + struct { // Repeat + int max_; + int min_; + } repeat; + struct { // Capture + int cap_; + std::string* name_; + } capture; + struct { // LiteralString + int nrunes_; + Rune* runes_; + } literal_string; + struct { // CharClass + // These two could be in separate union members, + // but it wouldn't save any space (there are other two-word structs) + // and keeping them separate avoids confusion during parsing. + CharClass* cc_; + CharClassBuilder* ccb_; + } char_class; Rune rune_; // Literal int match_id_; // HaveMatch void *the_union_[2]; // as big as any other element, for memset - }; + } arguments; Regexp(const Regexp&) = delete; Regexp& operator=(const Regexp&) = delete; @@ -248885,7 +250922,7 @@ inline Regexp::ParseFlags operator~(Regexp::ParseFlags a) { ~static_cast(a) & static_cast(Regexp::AllParseFlags)); } -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_REGEXP_H_ @@ -249102,7 +251139,7 @@ unique_ptr RegexOptimizationRule::Apply(LogicalOperator &op, vector< namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundAggregateExpression &aggr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { vector stats; stats.reserve(aggr.children.size()); for (auto &child : aggr.children) { @@ -249130,7 +251167,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundAggreg namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundBetweenExpression &between, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { // propagate in all the children auto input_stats = PropagateExpression(between.input); auto lower_stats = PropagateExpression(between.lower); @@ -249152,11 +251189,11 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee if (lower_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE && upper_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE) { // both filters are always true: replace the between expression with a constant true - *expr_ptr = make_uniq(Value::BOOLEAN(true)); + expr_ptr = make_uniq(Value::BOOLEAN(true)); } else if (lower_prune == FilterPropagateResult::FILTER_ALWAYS_FALSE || upper_prune == FilterPropagateResult::FILTER_ALWAYS_FALSE) { // either one of the filters is always false: replace the between expression with a constant false - *expr_ptr = make_uniq(Value::BOOLEAN(false)); + expr_ptr = make_uniq(Value::BOOLEAN(false)); } else if (lower_prune == FilterPropagateResult::FILTER_FALSE_OR_NULL || upper_prune == FilterPropagateResult::FILTER_FALSE_OR_NULL) { // either one of the filters is false or null: replace with a constant or null (false) @@ -249164,7 +251201,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee children.push_back(std::move(between.input)); children.push_back(std::move(between.lower)); children.push_back(std::move(between.upper)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); } else if (lower_prune == FilterPropagateResult::FILTER_TRUE_OR_NULL && upper_prune == FilterPropagateResult::FILTER_TRUE_OR_NULL) { // both filters are true or null: replace with a true or null @@ -249172,14 +251209,14 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee children.push_back(std::move(between.input)); children.push_back(std::move(between.lower)); children.push_back(std::move(between.upper)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); } else if (lower_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE) { // lower filter is always true: replace with upper comparison - *expr_ptr = + expr_ptr = make_uniq(upper_comparison, std::move(between.input), std::move(between.upper)); } else if (upper_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE) { // upper filter is always true: replace with lower comparison - *expr_ptr = + expr_ptr = make_uniq(lower_comparison, std::move(between.input), std::move(between.lower)); } return nullptr; @@ -249192,7 +251229,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundCaseExpression &bound_case, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { // propagate in all the children auto result_stats = PropagateExpression(bound_case.else_expr); for (auto &case_check : bound_case.case_checks) { @@ -249332,7 +251369,7 @@ static unique_ptr StatisticsNumericCastSwitch(const BaseStatisti } unique_ptr StatisticsPropagator::PropagateExpression(BoundCastExpression &cast, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto child_stats = PropagateExpression(cast.child); if (!child_stats) { return nullptr; @@ -249364,7 +251401,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundCastEx namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundColumnRefExpression &colref, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto stats = statistics_map.find(colref.binding); if (stats == statistics_map.end()) { return nullptr; @@ -249467,7 +251504,7 @@ FilterPropagateResult StatisticsPropagator::PropagateComparison(BaseStatistics & } unique_ptr StatisticsPropagator::PropagateExpression(BoundComparisonExpression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto left_stats = PropagateExpression(expr.left); auto right_stats = PropagateExpression(expr.right); if (!left_stats || !right_stats) { @@ -249477,23 +251514,23 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundCompar auto propagate_result = PropagateComparison(*left_stats, *right_stats, expr.type); switch (propagate_result) { case FilterPropagateResult::FILTER_ALWAYS_TRUE: - *expr_ptr = make_uniq(Value::BOOLEAN(true)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(true)); + return PropagateExpression(expr_ptr); case FilterPropagateResult::FILTER_ALWAYS_FALSE: - *expr_ptr = make_uniq(Value::BOOLEAN(false)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(false)); + return PropagateExpression(expr_ptr); case FilterPropagateResult::FILTER_TRUE_OR_NULL: { vector> children; children.push_back(std::move(expr.left)); children.push_back(std::move(expr.right)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); return nullptr; } case FilterPropagateResult::FILTER_FALSE_OR_NULL: { vector> children; children.push_back(std::move(expr.left)); children.push_back(std::move(expr.right)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); return nullptr; } default: @@ -249513,7 +251550,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundCompar namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundConjunctionExpression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto is_and = expr.type == ExpressionType::CONJUNCTION_AND; for (idx_t expr_idx = 0; expr_idx < expr.children.size(); expr_idx++) { auto &child = expr.children[expr_idx]; @@ -249555,16 +251592,16 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundConjun expr_idx--; continue; } - *expr_ptr = make_uniq(Value::BOOLEAN(constant_value)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(constant_value)); + return PropagateExpression(expr_ptr); } if (expr.children.empty()) { // if there are no children left, replace the conjunction with TRUE (for AND) or FALSE (for OR) - *expr_ptr = make_uniq(Value::BOOLEAN(is_and)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(is_and)); + return PropagateExpression(expr_ptr); } else if (expr.children.size() == 1) { // if there is one child left, replace the conjunction with that one child - *expr_ptr = std::move(expr.children[0]); + expr_ptr = std::move(expr.children[0]); } return nullptr; } @@ -249583,7 +251620,7 @@ unique_ptr StatisticsPropagator::StatisticsFromValue(const Value } unique_ptr StatisticsPropagator::PropagateExpression(BoundConstantExpression &constant, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { return StatisticsFromValue(constant.value); } @@ -249594,7 +251631,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundConsta namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundFunctionExpression &func, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { vector stats; stats.reserve(func.children.size()); for (idx_t i = 0; i < func.children.size(); i++) { @@ -249608,7 +251645,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundFuncti if (!func.function.statistics) { return nullptr; } - FunctionStatisticsInput input(func, func.bind_info.get(), stats, expr_ptr); + FunctionStatisticsInput input(func, func.bind_info.get(), stats, &expr_ptr); return func.function.statistics(context, input); } @@ -249620,7 +251657,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundFuncti namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundOperatorExpression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { bool all_have_stats = true; vector> child_stats; child_stats.reserve(expr.children.size()); @@ -249662,7 +251699,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundOperat D_ASSERT(expr.children.size() == child_stats.size()); if (expr.children.size() == 1) { // coalesce of one entry: simply return that entry - *expr_ptr = std::move(expr.children[0]); + expr_ptr = std::move(expr.children[0]); } else { // coalesce of multiple entries // merge the stats @@ -249674,25 +251711,25 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundOperat case ExpressionType::OPERATOR_IS_NULL: if (!child_stats[0]->CanHaveNull()) { // child has no null values: x IS NULL will always be false - *expr_ptr = make_uniq(Value::BOOLEAN(false)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(false)); + return PropagateExpression(expr_ptr); } if (!child_stats[0]->CanHaveNoNull()) { // child has no valid values: x IS NULL will always be true - *expr_ptr = make_uniq(Value::BOOLEAN(true)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(true)); + return PropagateExpression(expr_ptr); } return nullptr; case ExpressionType::OPERATOR_IS_NOT_NULL: if (!child_stats[0]->CanHaveNull()) { // child has no null values: x IS NOT NULL will always be true - *expr_ptr = make_uniq(Value::BOOLEAN(true)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(true)); + return PropagateExpression(expr_ptr); } if (!child_stats[0]->CanHaveNoNull()) { // child has no valid values: x IS NOT NULL will always be false - *expr_ptr = make_uniq(Value::BOOLEAN(false)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(false)); + return PropagateExpression(expr_ptr); } return nullptr; default: @@ -249707,7 +251744,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundOperat namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalAggregate &aggr, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate statistics in the child node node_stats = PropagateStatistics(aggr.children[0]); @@ -249748,7 +251785,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalAggr namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalCrossProduct &cp, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate statistics in the child node auto left_stats = PropagateStatistics(cp.children[0]); auto right_stats = PropagateStatistics(cp.children[1]); @@ -249770,6 +251807,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalCros + namespace duckdb { static bool IsCompareDistinct(ExpressionType type) { @@ -249777,12 +251815,18 @@ static bool IsCompareDistinct(ExpressionType type) { } bool StatisticsPropagator::ExpressionIsConstant(Expression &expr, const Value &val) { - if (expr.GetExpressionClass() != ExpressionClass::BOUND_CONSTANT) { + Value expr_value; + if (expr.GetExpressionClass() == ExpressionClass::BOUND_CONSTANT) { + expr_value = expr.Cast().value; + } else if (expr.IsFoldable()) { + if (!ExpressionExecutor::TryEvaluateScalar(context, expr, expr_value)) { + return false; + } + } else { return false; } - auto &bound_constant = expr.Cast(); - D_ASSERT(bound_constant.value.type() == val.type()); - return Value::NotDistinctFrom(bound_constant.value, val); + D_ASSERT(expr_value.type() == val.type()); + return Value::NotDistinctFrom(expr_value, val); } bool StatisticsPropagator::ExpressionIsConstantOrNull(Expression &expr, const Value &val) { @@ -249977,11 +252021,11 @@ void StatisticsPropagator::UpdateFilterStatistics(Expression &condition) { } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalFilter &filter, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(filter.children[0]); if (filter.children[0]->type == LogicalOperatorType::LOGICAL_EMPTY_RESULT) { - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return make_uniq(0, 0); } @@ -250002,7 +252046,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalFilt } else if (ExpressionIsConstant(*condition, Value::BOOLEAN(false)) || ExpressionIsConstantOrNull(*condition, Value::BOOLEAN(false))) { // filter is always false or null; this entire filter should be replaced by an empty result block - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return make_uniq(0, 0); } else { // cannot prune this filter: propagate statistics from the filter @@ -250047,7 +252091,7 @@ void StatisticsPropagator::UpdateFilterStatistics(BaseStatistics &input, TableFi } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalGet &get, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { if (get.function.cardinality) { node_stats = get.function.cardinality(context, get.bind_data.get()); } @@ -250101,7 +252145,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalGet case FilterPropagateResult::FILTER_FALSE_OR_NULL: case FilterPropagateResult::FILTER_ALWAYS_FALSE: // filter is always false; this entire filter should be replaced by an empty result block - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return make_uniq(0, 0); default: // general case: filter can be true or false, update this columns' statistics @@ -250129,7 +252173,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalGet namespace duckdb { -void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, unique_ptr *node_ptr) { +void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, unique_ptr &node_ptr) { for (idx_t i = 0; i < join.conditions.size(); i++) { auto &condition = join.conditions[i]; const auto stats_left = PropagateExpression(condition.left); @@ -250155,7 +252199,7 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq case JoinType::SEMI: case JoinType::INNER: // semi or inner join on false; entire node can be pruned - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return; case JoinType::RIGHT_ANTI: case JoinType::ANTI: { @@ -250163,7 +252207,7 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq std::swap(join.children[0], join.children[1]); } // If the filter is always false or Null, just return the left child. - *node_ptr = std::move(join.children[0]); + node_ptr = std::move(join.children[0]); return; } case JoinType::LEFT: @@ -250221,19 +252265,19 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq auto limit = make_uniq(BoundLimitNode::ConstantValue(1), BoundLimitNode()); limit->AddChild(std::move(join.children[1])); auto cross_product = LogicalCrossProduct::Create(std::move(join.children[0]), std::move(limit)); - *node_ptr = std::move(cross_product); + node_ptr = std::move(cross_product); return; } case JoinType::INNER: { // inner, replace with cross product auto cross_product = LogicalCrossProduct::Create(std::move(join.children[0]), std::move(join.children[1])); - *node_ptr = std::move(cross_product); + node_ptr = std::move(cross_product); return; } case JoinType::ANTI: case JoinType::RIGHT_ANTI: { - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return; } default: @@ -250290,7 +252334,7 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq } } -void StatisticsPropagator::PropagateStatistics(LogicalAnyJoin &join, unique_ptr *node_ptr) { +void StatisticsPropagator::PropagateStatistics(LogicalAnyJoin &join, unique_ptr &node_ptr) { // propagate the expression into the join condition PropagateExpression(join.condition); } @@ -250316,7 +252360,7 @@ void StatisticsPropagator::MultiplyCardinalities(unique_ptr &sta } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalJoin &join, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate through the children of the join node_stats = PropagateStatistics(join.children[0]); for (idx_t child_idx = 1; child_idx < join.children.size(); child_idx++) { @@ -250389,7 +252433,7 @@ static void MaxCardinalities(unique_ptr &stats, NodeStatistics & } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalPositionalJoin &join, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { D_ASSERT(join.type == LogicalOperatorType::LOGICAL_POSITIONAL_JOIN); // first propagate through the children of the join @@ -250484,7 +252528,7 @@ void StatisticsPropagator::CreateFilterFromJoinStats(unique_ptr namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalLimit &limit, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // propagate statistics in the child node PropagateStatistics(limit.children[0]); // return the node stats, with as expected cardinality the amount specified in the limit @@ -250503,7 +252547,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalLimi namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalOrder &order, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(order.children[0]); @@ -250521,11 +252565,11 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalOrde namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalProjection &proj, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(proj.children[0]); if (proj.children[0]->type == LogicalOperatorType::LOGICAL_EMPTY_RESULT) { - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return std::move(node_stats); } // then propagate to each of the expressions @@ -250566,7 +252610,7 @@ void StatisticsPropagator::AddCardinalities(unique_ptr &stats, N } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalSetOperation &setop, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate statistics in the child nodes auto left_stats = PropagateStatistics(setop.children[0]); auto right_stats = PropagateStatistics(setop.children[1]); @@ -250625,7 +252669,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalSetO namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalWindow &window, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(window.children[0]); @@ -250686,10 +252730,12 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalWind + namespace duckdb { -StatisticsPropagator::StatisticsPropagator(Optimizer &optimizer_p) - : optimizer(optimizer_p), context(optimizer.context) { +StatisticsPropagator::StatisticsPropagator(Optimizer &optimizer_p, LogicalOperator &root_p) + : optimizer(optimizer_p), context(optimizer.context), root(&root_p) { + root->ResolveOperatorTypes(); } void StatisticsPropagator::ReplaceWithEmptyResult(unique_ptr &node) { @@ -250697,7 +252743,7 @@ void StatisticsPropagator::ReplaceWithEmptyResult(unique_ptr &n } unique_ptr StatisticsPropagator::PropagateChildren(LogicalOperator &node, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { for (idx_t child_idx = 0; child_idx < node.children.size(); child_idx++) { PropagateStatistics(node.children[child_idx]); } @@ -250705,45 +252751,64 @@ unique_ptr StatisticsPropagator::PropagateChildren(LogicalOperat } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalOperator &node, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { + unique_ptr result; switch (node.type) { case LogicalOperatorType::LOGICAL_AGGREGATE_AND_GROUP_BY: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_FILTER: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_GET: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_PROJECTION: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_ANY_JOIN: case LogicalOperatorType::LOGICAL_ASOF_JOIN: case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: case LogicalOperatorType::LOGICAL_JOIN: case LogicalOperatorType::LOGICAL_DELIM_JOIN: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_POSITIONAL_JOIN: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_UNION: case LogicalOperatorType::LOGICAL_EXCEPT: case LogicalOperatorType::LOGICAL_INTERSECT: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_ORDER_BY: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_WINDOW: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; default: - return PropagateChildren(node, node_ptr); + result = PropagateChildren(node, node_ptr); } + + if (!optimizer.OptimizerDisabled(OptimizerType::COMPRESSED_MATERIALIZATION)) { + // compress data based on statistics for materializing operators + CompressedMaterialization compressed_materialization(optimizer, *root, statistics_map); + compressed_materialization.Compress(node_ptr); + } + + return result; } unique_ptr StatisticsPropagator::PropagateStatistics(unique_ptr &node_ptr) { - return PropagateStatistics(*node_ptr, &node_ptr); + return PropagateStatistics(*node_ptr, node_ptr); } unique_ptr StatisticsPropagator::PropagateExpression(Expression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { switch (expr.GetExpressionClass()) { case ExpressionClass::BOUND_AGGREGATE: return PropagateExpression(expr.Cast(), expr_ptr); @@ -250773,7 +252838,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(Expression } unique_ptr StatisticsPropagator::PropagateExpression(unique_ptr &expr) { - auto stats = PropagateExpression(*expr, &expr); + auto stats = PropagateExpression(*expr, expr); if (ClientConfig::GetConfig(context).query_verification_enabled && stats) { expr->verification_stats = stats->ToUnique(); } @@ -251316,7 +253381,7 @@ namespace duckdb { //! A PipelineEvent is responsible for scheduling a pipeline class PipelineEvent : public BasePipelineEvent { public: - PipelineEvent(shared_ptr pipeline); + explicit PipelineEvent(shared_ptr pipeline); public: void Schedule() override; @@ -253422,7 +255487,7 @@ class PipelineFinishTask : public ExecutorTask { //! Debugging state: number of times blocked int debug_blocked_count = 0; //! Number of times the Finalize will block before actually returning data - int debug_blocked_target_count = 10; + int debug_blocked_target_count = 1; #endif }; @@ -257899,7 +259964,14 @@ void TaskScheduler::RelaunchThreadsInternal(int32_t n) { for (idx_t i = 0; i < create_new_threads; i++) { // launch a thread and assign it a cancellation marker auto marker = unique_ptr>(new atomic(true)); - auto worker_thread = make_uniq(ThreadExecuteTasks, this, marker.get()); + unique_ptr worker_thread; + try { + worker_thread = make_uniq(ThreadExecuteTasks, this, marker.get()); + } catch (std::exception &ex) { + // thread constructor failed - this can happen when the system has too many threads allocated + // in this case we cannot allocate more threads - stop launching them + break; + } auto thread_wrapper = make_uniq(std::move(worker_thread)); threads.push_back(std::move(thread_wrapper)); @@ -258511,11 +260583,13 @@ string UniqueConstraint::ToString() const { } unique_ptr UniqueConstraint::Copy() const { - if (index.index == DConstants::INVALID_INDEX) { + if (!HasIndex()) { return make_uniq(columns, is_primary_key); } else { auto result = make_uniq(index, is_primary_key); - result->columns = columns; + if (!columns.empty()) { + result->columns.push_back(columns[0]); + } return std::move(result); } } @@ -259604,7 +261678,7 @@ class PositionalReferenceExpression : public ParsedExpression { static constexpr const ExpressionClass TYPE = ExpressionClass::POSITIONAL_REFERENCE; public: - DUCKDB_API PositionalReferenceExpression(idx_t index); + DUCKDB_API explicit PositionalReferenceExpression(idx_t index); idx_t index; @@ -260566,6 +262640,8 @@ unique_ptr CreateCopyFunctionInfo::Copy() const { } // namespace duckdb + + namespace duckdb { CreateIndexInfo::CreateIndexInfo() : CreateInfo(CatalogType::INDEX_ENTRY) { @@ -260577,6 +262653,68 @@ CreateIndexInfo::CreateIndexInfo(const duckdb::CreateIndexInfo &info) scan_types(info.scan_types), names(info.names) { } +static void RemoveTableQualificationRecursive(unique_ptr &expr, const string &table_name) { + if (expr->GetExpressionType() == ExpressionType::COLUMN_REF) { + auto &col_ref = expr->Cast(); + auto &col_names = col_ref.column_names; + if (col_ref.IsQualified() && col_ref.GetTableName() == table_name) { + col_names.erase(col_names.begin()); + } + } else { + ParsedExpressionIterator::EnumerateChildren(*expr, [&table_name](unique_ptr &child) { + RemoveTableQualificationRecursive(child, table_name); + }); + } +} + +string CreateIndexInfo::ToString() const { + string result; + + result += "CREATE"; + D_ASSERT(constraint_type == IndexConstraintType::UNIQUE || constraint_type == IndexConstraintType::NONE); + if (constraint_type == IndexConstraintType::UNIQUE) { + result += " UNIQUE"; + } + result += " INDEX "; + if (on_conflict == OnCreateConflict::IGNORE_ON_CONFLICT) { + result += "IF NOT EXISTS "; + } + result += KeywordHelper::WriteOptionallyQuoted(index_name); + result += " ON "; + result += KeywordHelper::WriteOptionallyQuoted(table); + if (index_type != "ART") { + result += " USING "; + result += KeywordHelper::WriteOptionallyQuoted(index_type); + result += " "; + } + result += "("; + for (idx_t i = 0; i < parsed_expressions.size(); i++) { + auto &expr = parsed_expressions[i]; + auto copy = expr->Copy(); + if (i > 0) { + result += ", "; + } + // column ref expressions are qualified with the table name + // we need to remove them to reproduce the original query + RemoveTableQualificationRecursive(copy, table); + result += copy->ToString(); + } + result += ")"; + if (!options.empty()) { + result += " WITH ("; + idx_t i = 0; + for (auto &opt : options) { + result += StringUtil::Format("%s = %s", opt.first, opt.second.ToString()); + if (i > 0) { + result += ", "; + } + i++; + } + result += " )"; + } + return result; +} + unique_ptr CreateIndexInfo::Copy() const { auto result = make_uniq(*this); @@ -261096,6 +263234,7 @@ unique_ptr VacuumInfo::Copy() { if (has_table) { result->ref = ref->Copy(); } + result->columns = columns; return result; } @@ -264824,6 +266963,13 @@ typedef enum PGSortByDir { SORTBY_USING /* not allowed in CREATE INDEX ... */ } PGSortByDir; +/* PGFuncCall options RESPECT/IGNORE NULLS */ +typedef enum PGIgnoreNulls { + PG_DEFAULT_NULLS, + PG_RESPECT_NULLS, + PG_IGNORE_NULLS +} PGIgnoreNulls; + typedef enum PGSortByNulls { PG_SORTBY_NULLS_DEFAULT, PG_SORTBY_NULLS_FIRST, PG_SORTBY_NULLS_LAST } PGSortByNulls; /***************************************************************************** @@ -265065,7 +267211,7 @@ typedef struct PGFuncCall { bool agg_within_group; /* ORDER BY appeared in WITHIN GROUP */ bool agg_star; /* argument was really '*' */ bool agg_distinct; /* arguments were labeled DISTINCT */ - bool agg_ignore_nulls; /* arguments were labeled IGNORE NULLS */ + PGIgnoreNulls agg_ignore_nulls; /* arguments were labeled IGNORE NULLS */ bool func_variadic; /* last argument was labeled VARIADIC */ struct PGWindowDef *over; /* OVER clause, if any */ int location; /* token location, or -1 if unknown */ @@ -267015,7 +269161,7 @@ class Transformer { public: explicit Transformer(ParserOptions &options); - explicit Transformer(Transformer &parent); + Transformer(Transformer &parent); ~Transformer(); //! Transforms a Postgres parse tree into a set of SQL Statements @@ -267246,10 +269392,8 @@ class Transformer { OnCreateConflict TransformOnConflict(duckdb_libpgquery::PGOnCreateConflict conflict); string TransformAlias(duckdb_libpgquery::PGAlias *root, vector &column_name_alias); vector TransformStringList(duckdb_libpgquery::PGList *list); - void TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map, - vector> &materialized_ctes); - static unique_ptr TransformMaterializedCTE(unique_ptr root, - vector> &materialized_ctes); + void TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map); + static unique_ptr TransformMaterializedCTE(unique_ptr root); unique_ptr TransformRecursiveCTE(duckdb_libpgquery::PGCommonTableExpr &node, CommonTableExpressionInfo &info); @@ -271448,12 +273592,13 @@ unique_ptr Transformer::TransformFuncCall(duckdb_libpgquery::P throw ParserException("EXPORT_STATE is not supported for window functions!"); } - if (win_fun_type == ExpressionType::WINDOW_AGGREGATE && root.agg_ignore_nulls) { - throw ParserException("IGNORE NULLS is not supported for windowed aggregates"); + if (win_fun_type == ExpressionType::WINDOW_AGGREGATE && + root.agg_ignore_nulls != duckdb_libpgquery::PG_DEFAULT_NULLS) { + throw ParserException("RESPECT/IGNORE NULLS is not supported for windowed aggregates"); } auto expr = make_uniq(win_fun_type, std::move(catalog), std::move(schema), lowercase_name); - expr->ignore_nulls = root.agg_ignore_nulls; + expr->ignore_nulls = (root.agg_ignore_nulls == duckdb_libpgquery::PG_IGNORE_NULLS); expr->distinct = root.agg_distinct; if (root.agg_filter) { @@ -271523,8 +273668,8 @@ unique_ptr Transformer::TransformFuncCall(duckdb_libpgquery::P return std::move(expr); } - if (root.agg_ignore_nulls) { - throw ParserException("IGNORE NULLS is not supported for non-window functions"); + if (root.agg_ignore_nulls != duckdb_libpgquery::PG_DEFAULT_NULLS) { + throw ParserException("RESPECT/IGNORE NULLS is not supported for non-window functions"); } unique_ptr filter_expr; @@ -271583,6 +273728,13 @@ unique_ptr Transformer::TransformFuncCall(duckdb_libpgquery::P auto construct_array = make_uniq(ExpressionType::ARRAY_CONSTRUCTOR); construct_array->children = std::move(children); return std::move(construct_array); + } else if (lowercase_name == "__internal_position_operator") { + if (children.size() != 2) { + throw ParserException("Wrong number of arguments to __internal_position_operator."); + } + // swap arguments for POSITION(x IN y) + std::swap(children[0], children[1]); + lowercase_name = "position"; } else if (lowercase_name == "ifnull") { if (children.size() != 2) { throw ParserException("Wrong number of arguments to IFNULL."); @@ -272183,6 +274335,8 @@ unique_ptr Transformer::TransformPositionalReference(duckdb_li + + namespace duckdb { unique_ptr Transformer::TransformSubquery(duckdb_libpgquery::PGSubLink &root) { @@ -272249,6 +274403,28 @@ unique_ptr Transformer::TransformSubquery(duckdb_libpgquery::P vector> children; children.push_back(std::move(columns_star)); auto aggr = make_uniq("array_agg", std::move(children)); + // push ORDER BY modifiers into the array_agg + for (auto &modifier : subquery_expr->subquery->node->modifiers) { + if (modifier->type == ResultModifierType::ORDER_MODIFIER) { + aggr->order_bys = unique_ptr_cast(modifier->Copy()); + break; + } + } + // transform constants (e.g. ORDER BY 1) into positional references (ORDER BY #1) + if (aggr->order_bys) { + for (auto &order : aggr->order_bys->orders) { + if (order.expression->type == ExpressionType::VALUE_CONSTANT) { + auto &constant_expr = order.expression->Cast(); + Value bigint_value; + string error; + if (constant_expr.value.DefaultTryCastAs(LogicalType::BIGINT, bigint_value, &error)) { + int64_t order_index = BigIntValue::Get(bigint_value); + idx_t positional_index = order_index < 0 ? NumericLimits::Maximum() : idx_t(order_index); + order.expression = make_uniq(positional_index); + } + } + } + } // ARRAY_AGG(COLUMNS(*)) IS NULL auto agg_is_null = make_uniq(ExpressionType::OPERATOR_IS_NULL, aggr->Copy()); // empty list @@ -273165,8 +275341,7 @@ void Transformer::ExtractCTEsRecursive(CommonTableExpressionMap &cte_map) { } } -void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map, - vector> &materialized_ctes) { +void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map) { stored_cte_map.push_back(&cte_map); // TODO: might need to update in case of future lawsuit @@ -273222,12 +275397,6 @@ void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, #else if (cte.ctematerialized == duckdb_libpgquery::PGCTEMaterializeAlways) { #endif - auto materialize = make_uniq(); - materialize->query = info->query->node->Copy(); - materialize->ctename = cte_name; - materialize->aliases = info->aliases; - materialized_ctes.push_back(std::move(materialize)); - info->materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS; } @@ -274395,10 +276564,11 @@ unique_ptr Transformer::TransformCreateFunction(duckdb_libpgque break; case duckdb_libpgquery::PG_RELPERSISTENCE_UNLOGGED: throw ParserException("Unlogged flag not supported for macros: '%s'", qname.name); - break; case duckdb_libpgquery::RELPERSISTENCE_PERMANENT: info->temporary = false; break; + default: + throw ParserException("Unsupported persistence flag for table '%s'", qname.name); } // what to do on conflict @@ -274515,6 +276685,9 @@ unique_ptr Transformer::TransformCreateIndex(duckdb_libpgquery: for (auto &expr : info->expressions) { info->parsed_expressions.emplace_back(expr->Copy()); } + if (stmt.whereClause) { + throw NotImplementedException("Creating partial indexes is not supported currently"); + } result->info = std::move(info); return result; } @@ -274986,13 +277159,8 @@ namespace duckdb { unique_ptr Transformer::TransformDelete(duckdb_libpgquery::PGDeleteStmt &stmt) { auto result = make_uniq(); - vector> materialized_ctes; if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map, - materialized_ctes); - if (!materialized_ctes.empty()) { - throw NotImplementedException("Materialized CTEs are not implemented for delete."); - } + TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map); } result->condition = TransformExpression(stmt.whereClause); @@ -275011,6 +277179,7 @@ unique_ptr Transformer::TransformDelete(duckdb_libpgquery::PGDe if (stmt.returningList) { TransformExpressionList(*stmt.returningList, result->returning_list); } + return result; } @@ -275217,13 +277386,8 @@ unique_ptr Transformer::TransformValuesList(duckdb_libpgquery::PGList unique_ptr Transformer::TransformInsert(duckdb_libpgquery::PGInsertStmt &stmt) { auto result = make_uniq(); - vector> materialized_ctes; if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map, - materialized_ctes); - if (!materialized_ctes.empty()) { - throw NotImplementedException("Materialized CTEs are not implemented for insert."); - } + TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map); } // first check if there are any columns specified @@ -275240,6 +277404,7 @@ unique_ptr Transformer::TransformInsert(duckdb_libpgquery::PGIn } if (stmt.selectStmt) { result->select_statement = TransformSelect(stmt.selectStmt, false); + result->select_statement->node = TransformMaterializedCTE(std::move(result->select_statement->node)); } else { result->default_values = true; } @@ -275447,11 +277612,9 @@ unique_ptr Transformer::TransformPivotStatement(duckdb_libpgquery::PG bool has_parameters = next_param_count > current_param_count; auto select_node = make_uniq(); - vector> materialized_ctes; // handle the CTEs if (select.withClause) { - TransformCTE(*PGPointerCast(select.withClause), select_node->cte_map, - materialized_ctes); + TransformCTE(*PGPointerCast(select.withClause), select_node->cte_map); } if (!pivot->columns) { // no pivot columns - not actually a pivot @@ -275522,9 +277685,7 @@ unique_ptr Transformer::TransformPivotStatement(duckdb_libpgquery::PG // transform order by/limit modifiers TransformModifiers(select, *select_node); - auto node = Transformer::TransformMaterializedCTE(std::move(select_node), materialized_ctes); - - return node; + return std::move(select_node); } } // namespace duckdb @@ -275579,7 +277740,7 @@ unique_ptr Transformer::TransformPragma(duckdb_libpgquery::PGPragm break; case duckdb_libpgquery::PG_PRAGMA_TYPE_ASSIGNMENT: if (info.parameters.size() != 1) { - throw InternalException("PRAGMA statement with assignment should contain exactly one parameter"); + throw ParserException("PRAGMA statement with assignment should contain exactly one parameter"); } if (!info.named_parameters.empty()) { throw InternalException("PRAGMA statement with assignment cannot have named parameters"); @@ -275842,11 +278003,14 @@ unique_ptr Transformer::TransformSecret(duckdb_libpgquery::PGCr namespace duckdb { unique_ptr Transformer::TransformSelectNode(duckdb_libpgquery::PGSelectStmt &select) { + unique_ptr stmt = nullptr; if (select.pivot) { - return TransformPivotStatement(select); + stmt = TransformPivotStatement(select); } else { - return TransformSelectInternal(select); + stmt = TransformSelectInternal(select); } + + return TransformMaterializedCTE(std::move(stmt)); } unique_ptr Transformer::TransformSelect(duckdb_libpgquery::PGSelectStmt &select, bool is_select) { @@ -275927,15 +278091,13 @@ unique_ptr Transformer::TransformSelectInternal(duckdb_libpgquery::PG auto stack_checker = StackCheck(); unique_ptr node; - vector> materialized_ctes; switch (stmt.op) { case duckdb_libpgquery::PG_SETOP_NONE: { node = make_uniq(); auto &result = node->Cast(); if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map, - materialized_ctes); + TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map); } if (stmt.windowClause) { for (auto window_ele = stmt.windowClause->head; window_ele != nullptr; window_ele = window_ele->next) { @@ -275997,8 +278159,7 @@ unique_ptr Transformer::TransformSelectInternal(duckdb_libpgquery::PG node = make_uniq(); auto &result = node->Cast(); if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map, - materialized_ctes); + TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map); } result.left = TransformSelectNode(*stmt.larg); result.right = TransformSelectNode(*stmt.rarg); @@ -276034,9 +278195,6 @@ unique_ptr Transformer::TransformSelectInternal(duckdb_libpgquery::PG TransformModifiers(stmt, *node); - // Handle materialized CTEs - node = Transformer::TransformMaterializedCTE(std::move(node), materialized_ctes); - return node; } @@ -276234,13 +278392,8 @@ unique_ptr Transformer::TransformUpdateSetInfo(duckdb_libpgquery: unique_ptr Transformer::TransformUpdate(duckdb_libpgquery::PGUpdateStmt &stmt) { auto result = make_uniq(); - vector> materialized_ctes; if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map, - materialized_ctes); - if (!materialized_ctes.empty()) { - throw NotImplementedException("Materialized CTEs are not implemented for update."); - } + TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map); } result->table = TransformRangeVar(*stmt.relation); @@ -276367,9 +278520,10 @@ unique_ptr Transformer::TransformUse(duckdb_libpgquery::PGUseStmt } string name; if (IsInvalidSchema(qualified_name.schema)) { - name = qualified_name.name; + name = KeywordHelper::WriteOptionallyQuoted(qualified_name.name, '"'); } else { - name = qualified_name.schema + "." + qualified_name.name; + name = KeywordHelper::WriteOptionallyQuoted(qualified_name.schema, '"') + "." + + KeywordHelper::WriteOptionallyQuoted(qualified_name.name, '"'); } auto name_expr = make_uniq(Value(name)); return make_uniq("schema", std::move(name_expr), SetScope::AUTOMATIC); @@ -277127,8 +279281,20 @@ unique_ptr Transformer::TransformStatementInternal(duckdb_libpgque } } -unique_ptr Transformer::TransformMaterializedCTE(unique_ptr root, - vector> &materialized_ctes) { +unique_ptr Transformer::TransformMaterializedCTE(unique_ptr root) { + // Extract materialized CTEs from cte_map + vector> materialized_ctes; + for (auto &cte : root->cte_map.map) { + auto &cte_entry = cte.second; + if (cte_entry->materialized == CTEMaterialize::CTE_MATERIALIZE_ALWAYS) { + auto mat_cte = make_uniq(); + mat_cte->ctename = cte.first; + mat_cte->query = cte_entry->query->node->Copy(); + mat_cte->aliases = cte_entry->aliases; + materialized_ctes.push_back(std::move(mat_cte)); + } + } + while (!materialized_ctes.empty()) { unique_ptr node_result; node_result = std::move(materialized_ctes.back()); @@ -277820,8 +279986,6 @@ struct BoundGroupInformation { //! functions. class BaseSelectBinder : public ExpressionBinder { public: - BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t alias_map); BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info); bool BoundAggregates() { @@ -277843,17 +280007,16 @@ class BaseSelectBinder : public ExpressionBinder { BoundSelectNode &node; BoundGroupInformation &info; - case_insensitive_map_t alias_map; protected: - BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth); BindResult BindGroupingFunction(OperatorExpression &op, idx_t depth) override; - BindResult BindWindow(WindowExpression &expr, idx_t depth); - idx_t TryBindGroup(ParsedExpression &expr, idx_t depth); - BindResult BindGroup(ParsedExpression &expr, idx_t depth, idx_t group_index); + //! Binds a WINDOW expression and returns the result. + virtual BindResult BindWindow(WindowExpression &expr, idx_t depth); + virtual BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression); - bool QualifyColumnAlias(const ColumnRefExpression &colref) override; + idx_t TryBindGroup(ParsedExpression &expr); + BindResult BindGroup(ParsedExpression &expr, idx_t depth, idx_t group_index); }; } // namespace duckdb @@ -277874,6 +280037,59 @@ class BaseSelectBinder : public ExpressionBinder { +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/planner/expression_binder/select_bind_state.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + + + + + +namespace duckdb { + +//! Bind state during a SelectNode +struct SelectBindState { + // Mapping of (alias -> index) and a mapping of (Expression -> index) for the SELECT list + case_insensitive_map_t alias_map; + parsed_expression_map_t projection_map; + //! The original unparsed expressions. This is exported after binding, because the binding might change the + //! expressions (e.g. when a * clause is present) + vector> original_expressions; + +public: + unique_ptr BindAlias(idx_t index); + + void SetExpressionIsVolatile(idx_t index); + void SetExpressionHasSubquery(idx_t index); + + bool AliasHasSubquery(idx_t index) const; + + void AddExpandedColumn(idx_t expand_count); + void AddRegularColumn(); + idx_t GetFinalIndex(idx_t index) const; + +private: + //! The set of referenced aliases + unordered_set referenced_aliases; + //! The set of expressions that is volatile + unordered_set volatile_expressions; + //! The set of expressions that contains a subquery + unordered_set subquery_expressions; + //! Column indices after expansion of Expanded expressions (e.g. UNNEST(STRUCT) clauses) + vector expanded_column_indices; +}; + +} // namespace duckdb + namespace duckdb { @@ -277901,10 +280117,8 @@ class BoundSelectNode : public BoundQueryNode { BoundSelectNode() : BoundQueryNode(QueryNodeType::SELECT_NODE) { } - //! The original unparsed expressions. This is exported after binding, because the binding might change the - //! expressions (e.g. when a * clause is present) - vector> original_expressions; - + //! Bind information + SelectBindState bind_state; //! The projection list vector> select_list; //! The FROM clause @@ -277922,6 +280136,8 @@ class BoundSelectNode : public BoundQueryNode { //! The amount of columns in the final result idx_t column_count; + //! The amount of bound columns in the select list + idx_t bound_column_count = 0; //! Index used by the LogicalProjection idx_t projection_index; @@ -278048,14 +280264,17 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu // Handle ordered-set aggregates by moving the single ORDER BY expression to the front of the children. // https://www.postgresql.org/docs/current/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE - bool ordered_set_agg = false; + // We also have to handle ORDER BY in the argument list, so note how many arguments we should have + // and only inject the ordering expression if there are too few. + idx_t ordered_set_agg = 0; bool negate_fractions = false; if (aggr.order_bys && aggr.order_bys->orders.size() == 1) { const auto &func_name = aggr.function_name; - ordered_set_agg = (func_name == "quantile_cont" || func_name == "quantile_disc" || - (func_name == "mode" && aggr.children.empty())); + if (func_name == "mode") { + ordered_set_agg = 1; + } else if (func_name == "quantile_cont" || func_name == "quantile_disc") { + ordered_set_agg = 2; - if (ordered_set_agg) { auto &config = DBConfig::GetConfig(context); const auto &order = aggr.order_bys->orders[0]; const auto sense = @@ -278064,10 +280283,11 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu } } - for (auto &child : aggr.children) { + for (idx_t i = 0; i < aggr.children.size(); ++i) { + auto &child = aggr.children[i]; aggregate_binder.BindChild(child, 0, error); // We have to negate the fractions for PERCENTILE_XXXX DESC - if (!error.HasError() && ordered_set_agg) { + if (!error.HasError() && ordered_set_agg && i == aggr.children.size() - 1) { NegatePercentileFractions(context, child, negate_fractions); } } @@ -278134,14 +280354,17 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu if (ordered_set_agg) { const bool order_sensitive = (aggr.function_name == "mode"); - for (auto &order : aggr.order_bys->orders) { - auto &child = BoundExpression::GetExpression(*order.expression); - types.push_back(child->return_type); - arguments.push_back(child->return_type); - if (order_sensitive) { - children.push_back(child->Copy()); - } else { - children.push_back(std::move(child)); + // Inject missing ordering arguments + if (aggr.children.size() < ordered_set_agg) { + for (auto &order : aggr.order_bys->orders) { + auto &child = BoundExpression::GetExpression(*order.expression); + types.push_back(child->return_type); + arguments.push_back(child->return_type); + if (order_sensitive) { + children.push_back(child->Copy()); + } else { + children.push_back(std::move(child)); + } } } if (!order_sensitive) { @@ -278158,13 +280381,13 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu // bind the aggregate FunctionBinder function_binder(context); - idx_t best_function = function_binder.BindFunction(func.name, func.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { + auto best_function = function_binder.BindFunction(func.name, func.functions, types, error); + if (!best_function.IsValid()) { error.AddQueryLocation(aggr); error.Throw(); } // found a matching function! - auto bound_function = func.functions.GetFunctionByOffset(best_function); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); // Bind any sort columns, unless the aggregate is order-insensitive unique_ptr order_bys; @@ -278179,6 +280402,22 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu } } + // If the aggregate is DISTINCT then the ORDER BYs need to be arguments. + if (aggr.distinct && order_bys) { + for (const auto &order_by : order_bys->orders) { + bool is_arg = false; + for (const auto &child : children) { + if (order_by.expression->Equals(*child)) { + is_arg = true; + break; + } + } + if (!is_arg) { + throw BinderException("In a DISTINCT aggregate, ORDER BY expressions must appear in the argument list"); + } + } + } + auto aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children), std::move(bound_filter), aggr.distinct ? AggregateType::DISTINCT : AggregateType::NON_DISTINCT); @@ -280111,14 +282350,17 @@ namespace duckdb { //! The table function binder can bind standard table function parameters (i.e., non-table-in-out functions) class TableFunctionBinder : public ExpressionBinder { public: - TableFunctionBinder(Binder &binder, ClientContext &context); + TableFunctionBinder(Binder &binder, ClientContext &context, string table_function_name = string()); protected: BindResult BindLambdaReference(LambdaRefExpression &expr, idx_t depth); - BindResult BindColumnReference(ColumnRefExpression &expr, idx_t depth, bool root_expression); + BindResult BindColumnReference(unique_ptr &expr, idx_t depth, bool root_expression); BindResult BindExpression(unique_ptr &expr, idx_t depth, bool root_expression = false) override; string UnsupportedAggregateMessage() override; + +private: + string table_function_name; }; } // namespace duckdb @@ -280493,6 +282735,41 @@ BindResult ExpressionBinder::BindExpression(SubqueryExpression &expr, idx_t dept +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/planner/expression/bound_expanded_expression.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + +namespace duckdb { + +//! BoundExpression is an intermediate dummy expression used by the binder. +//! It holds a set of expressions that will be "expanded" in the select list of a query +class BoundExpandedExpression : public Expression { +public: + static constexpr const ExpressionClass TYPE = ExpressionClass::BOUND_EXPANDED; + +public: + explicit BoundExpandedExpression(vector> expanded_expressions); + + vector> expanded_expressions; + +public: + string ToString() const override; + + bool Equals(const BaseExpression &other) const override; + + unique_ptr Copy() override; +}; + +} // namespace duckdb + @@ -280513,22 +282790,16 @@ namespace duckdb { //! The SELECT binder is responsible for binding an expression within the SELECT clause of a SQL statement class SelectBinder : public BaseSelectBinder { public: - SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t alias_map); SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info); - bool HasExpandedExpressions() { - return !expanded_expressions.empty(); - } - vector> &ExpandedExpressions() { - return expanded_expressions; - } - protected: BindResult BindUnnest(FunctionExpression &function, idx_t depth, bool root_expression) override; + BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) override; + + bool QualifyColumnAlias(const ColumnRefExpression &colref) override; +protected: idx_t unnest_level = 0; - vector> expanded_expressions; }; } // namespace duckdb @@ -280572,10 +282843,15 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b if (depth > 0) { return BindResult(BinderException(function, "UNNEST() for correlated expressions is not supported yet")); } + ErrorData error; if (function.children.empty()) { return BindResult(BinderException(function, "UNNEST() requires a single argument")); } + if (inside_window) { + return BindResult(BinderException(function, UnsupportedUnnestMessage())); + } + idx_t max_depth = 1; if (function.children.size() != 1) { bool has_parameter = false; @@ -280590,7 +282866,7 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b if (!function.children[i]->IsScalar()) { break; } - auto alias = function.children[i]->alias; + auto alias = StringUtil::Lower(function.children[i]->alias); BindChild(function.children[i], depth, error); if (error.HasError()) { return BindResult(std::move(error)); @@ -280744,8 +283020,7 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b break; } } - expanded_expressions = std::move(struct_expressions); - unnest_expr = make_uniq(Value(42)); + unnest_expr = make_uniq(std::move(struct_expressions)); } return BindResult(std::move(unnest_expr)); } @@ -280767,8 +283042,6 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b - - namespace duckdb { static LogicalType ResolveWindowExpressionType(ExpressionType window_type, const vector &child_types) { @@ -280906,6 +283179,7 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { if (depth > 0) { throw BinderException(error_context, "correlated columns in window functions not supported"); } + // If we have range expressions, then only one order by clause is allowed. const auto is_range = (window.start == WindowBoundary::EXPR_PRECEDING_RANGE || window.start == WindowBoundary::EXPR_FOLLOWING_RANGE || @@ -280915,7 +283189,7 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { } // bind inside the children of the window function // we set the inside_window flag to true to prevent binding nested window functions - this->inside_window = true; + inside_window = true; ErrorData error; for (auto &child : window.children) { BindChild(child, depth, error); @@ -280947,7 +283221,7 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { BindChild(window.offset_expr, depth, error); BindChild(window.default_expr, depth, error); - this->inside_window = false; + inside_window = false; if (error.HasError()) { // failed to bind children of window function return BindResult(std::move(error)); @@ -281002,21 +283276,23 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { D_ASSERT(func.type == CatalogType::AGGREGATE_FUNCTION_ENTRY); // bind the aggregate - ErrorData error; + ErrorData error_aggr; FunctionBinder function_binder(context); - auto best_function = function_binder.BindFunction(func.name, func.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { - error.AddQueryLocation(window); - error.Throw(); + auto best_function = function_binder.BindFunction(func.name, func.functions, types, error_aggr); + if (!best_function.IsValid()) { + error_aggr.AddQueryLocation(window); + error_aggr.Throw(); } + // found a matching function! bind it as an aggregate - auto bound_function = func.functions.GetFunctionByOffset(best_function); - auto bound_aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children)); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); + auto window_bound_aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children)); // create the aggregate - aggregate = make_uniq(bound_aggregate->function); - bind_info = std::move(bound_aggregate->bind_info); - children = std::move(bound_aggregate->children); - sql_type = bound_aggregate->return_type; + aggregate = make_uniq(window_bound_aggregate->function); + bind_info = std::move(window_bound_aggregate->bind_info); + children = std::move(window_bound_aggregate->children); + sql_type = window_bound_aggregate->return_type; + } else { // fetch the child of the non-aggregate window function (if any) sql_type = ResolveWindowExpressionType(window.type, types); @@ -281039,26 +283315,28 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { if (window.start == WindowBoundary::EXPR_PRECEDING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; - start_type = BindRangeExpression(context, name, window.start_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; + start_type = BindRangeExpression(context, range_name, window.start_expr, window.orders[0].expression); + } else if (window.start == WindowBoundary::EXPR_FOLLOWING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; - start_type = BindRangeExpression(context, name, window.start_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; + start_type = BindRangeExpression(context, range_name, window.start_expr, window.orders[0].expression); } LogicalType end_type = LogicalType::BIGINT; if (window.end == WindowBoundary::EXPR_PRECEDING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; - end_type = BindRangeExpression(context, name, window.end_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; + end_type = BindRangeExpression(context, range_name, window.end_expr, window.orders[0].expression); + } else if (window.end == WindowBoundary::EXPR_FOLLOWING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; - end_type = BindRangeExpression(context, name, window.end_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; + end_type = BindRangeExpression(context, range_name, window.end_expr, window.orders[0].expression); } // Cast ORDER and boundary expressions to the same type @@ -281090,7 +283368,6 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { } result->filter_expr = CastWindowExpression(window.filter_expr, LogicalType::BOOLEAN); - result->start_expr = CastWindowExpression(window.start_expr, start_type); result->end_expr = CastWindowExpression(window.end_expr, end_type); result->offset_expr = CastWindowExpression(window.offset_expr, LogicalType::BIGINT); @@ -281163,12 +283440,19 @@ class BoundCTENode : public BoundQueryNode { namespace duckdb { unique_ptr Binder::BindNode(CTENode &statement) { + // first recursively visit the materialized CTE operations + // the left side is visited first and is added to the BindContext of the right side + D_ASSERT(statement.query); + + return BindCTE(statement); +} + +unique_ptr Binder::BindCTE(CTENode &statement) { auto result = make_uniq(); // first recursively visit the materialized CTE operations // the left side is visited first and is added to the BindContext of the right side D_ASSERT(statement.query); - D_ASSERT(statement.child); result->ctename = statement.ctename; result->setop_index = GenerateTableIndex(); @@ -281200,28 +283484,32 @@ unique_ptr Binder::BindNode(CTENode &statement) { result->child_binder = Binder::CreateBinder(context, this); - // Move all modifiers to the child node. - for (auto &modifier : statement.modifiers) { - statement.child->modifiers.push_back(std::move(modifier)); - } - - statement.modifiers.clear(); - // Add bindings of left side to temporary CTE bindings context result->child_binder->bind_context.AddCTEBinding(result->setop_index, statement.ctename, names, result->types); - result->child = result->child_binder->BindNode(*statement.child); - for (auto &c : result->query_binder->correlated_columns) { - result->child_binder->AddCorrelatedColumn(c); - } - // the result types of the CTE are the types of the LHS - result->types = result->child->types; - result->names = result->child->names; + if (statement.child) { + // Move all modifiers to the child node. + for (auto &modifier : statement.modifiers) { + statement.child->modifiers.push_back(std::move(modifier)); + } + + statement.modifiers.clear(); + + result->child = result->child_binder->BindNode(*statement.child); + for (auto &c : result->query_binder->correlated_columns) { + result->child_binder->AddCorrelatedColumn(c); + } + + // the result types of the CTE are the types of the LHS + result->types = result->child->types; + result->names = result->child->names; + + MoveCorrelatedExpressions(*result->child_binder); + } MoveCorrelatedExpressions(*result->query_binder); - MoveCorrelatedExpressions(*result->child_binder); - return std::move(result); + return result; } } // namespace duckdb @@ -281352,6 +283640,8 @@ unique_ptr Binder::BindNode(RecursiveCTENode &statement) { + + //===----------------------------------------------------------------------===// // DuckDB // @@ -281367,20 +283657,19 @@ unique_ptr Binder::BindNode(RecursiveCTENode &statement) { namespace duckdb { -class BoundSelectNode; class ColumnRefExpression; +struct SelectBindState; //! A helper binder for WhereBinder and HavingBinder which support alias as a columnref. class ColumnAliasBinder { public: - ColumnAliasBinder(BoundSelectNode &node, const case_insensitive_map_t &alias_map); + explicit ColumnAliasBinder(SelectBindState &bind_state); bool BindAlias(ExpressionBinder &enclosing_binder, unique_ptr &expr_ptr, idx_t depth, bool root_expression, BindResult &result); private: - BoundSelectNode &node; - const case_insensitive_map_t &alias_map; + SelectBindState &bind_state; unordered_set visited_select_indexes; }; @@ -281403,12 +283692,13 @@ class ColumnAliasBinder { namespace duckdb { class ConstantExpression; class ColumnRefExpression; +struct SelectBindState; //! The GROUP binder is responsible for binding expressions in the GROUP BY clause class GroupBinder : public ExpressionBinder { public: GroupBinder(Binder &binder, ClientContext &context, SelectNode &node, idx_t group_index, - case_insensitive_map_t &alias_map, case_insensitive_map_t &group_alias_map); + SelectBindState &bind_state, case_insensitive_map_t &group_alias_map); //! The unbound root expression unique_ptr unbound_expression; @@ -281425,7 +283715,7 @@ class GroupBinder : public ExpressionBinder { BindResult BindConstant(ConstantExpression &expr); SelectNode &node; - case_insensitive_map_t &alias_map; + SelectBindState &bind_state; case_insensitive_map_t &group_alias_map; unordered_set used_aliases; @@ -281454,15 +283744,13 @@ namespace duckdb { class HavingBinder : public BaseSelectBinder { public: HavingBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map, AggregateHandling aggregate_handling); + AggregateHandling aggregate_handling); protected: - BindResult BindExpression(unique_ptr &expr_ptr, idx_t depth, - bool root_expression = false) override; + BindResult BindWindow(WindowExpression &expr, idx_t depth) override; + BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) override; private: - BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression); - ColumnAliasBinder column_alias_binder; AggregateHandling aggregate_handling; }; @@ -281488,21 +283776,17 @@ namespace duckdb { class Binder; class Expression; class SelectNode; +struct SelectBindState; //! The ORDER binder is responsible for binding an expression within the ORDER BY clause of a SQL statement class OrderBinder { public: - OrderBinder(vector binders, idx_t projection_index, case_insensitive_map_t &alias_map, - parsed_expression_map_t &projection_map, idx_t max_count); - OrderBinder(vector binders, idx_t projection_index, SelectNode &node, - case_insensitive_map_t &alias_map, parsed_expression_map_t &projection_map); + OrderBinder(vector binders, SelectBindState &bind_state); + OrderBinder(vector binders, SelectNode &node, SelectBindState &bind_state); public: unique_ptr Bind(unique_ptr expr); - idx_t MaxCount() const { - return max_count; - } bool HasExtraList() const { return extra_list; } @@ -281513,17 +283797,13 @@ class OrderBinder { unique_ptr CreateExtraReference(unique_ptr expr); private: - unique_ptr CreateProjectionReference(ParsedExpression &expr, const idx_t index, - const LogicalType &logical_type); + unique_ptr CreateProjectionReference(ParsedExpression &expr, const idx_t index); unique_ptr BindConstant(ParsedExpression &expr, const Value &val); private: vector binders; - idx_t projection_index; - idx_t max_count; - vector> *extra_list; - case_insensitive_map_t &alias_map; - parsed_expression_map_t &projection_map; + optional_ptr>> extra_list; + SelectBindState &bind_state; }; } // namespace duckdb @@ -281542,20 +283822,17 @@ class OrderBinder { namespace duckdb { +struct SelectBindState; //! The QUALIFY binder is responsible for binding an expression within the QUALIFY clause of a SQL statement class QualifyBinder : public BaseSelectBinder { public: - QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map); + QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info); protected: - BindResult BindExpression(unique_ptr &expr_ptr, idx_t depth, - bool root_expression = false) override; + BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) override; private: - BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression); - ColumnAliasBinder column_alias_binder; }; @@ -281567,6 +283844,7 @@ class QualifyBinder : public BaseSelectBinder { + namespace duckdb { unique_ptr Binder::BindOrderExpression(OrderBinder &order_binder, unique_ptr expr) { @@ -281577,29 +283855,29 @@ unique_ptr Binder::BindOrderExpression(OrderBinder &order_binder, un // remove the expression from the DISTINCT ON list return nullptr; } - D_ASSERT(bound_expr->type == ExpressionType::BOUND_COLUMN_REF); + D_ASSERT(bound_expr->type == ExpressionType::VALUE_CONSTANT); return bound_expr; } BoundLimitNode Binder::BindLimitValue(OrderBinder &order_binder, unique_ptr limit_val, bool is_percentage, bool is_offset) { auto new_binder = Binder::CreateBinder(context, this, true); - if (limit_val->HasSubquery()) { + ExpressionBinder expr_binder(*new_binder, context); + auto target_type = is_percentage ? LogicalType::DOUBLE : LogicalType::BIGINT; + expr_binder.target_type = target_type; + auto original_limit = limit_val->Copy(); + auto expr = expr_binder.Bind(limit_val); + if (expr->HasSubquery()) { if (!order_binder.HasExtraList()) { throw BinderException("Subquery in LIMIT/OFFSET not supported in set operation"); } - auto bound_limit = order_binder.CreateExtraReference(std::move(limit_val)); + auto bound_limit = order_binder.CreateExtraReference(std::move(original_limit)); if (is_percentage) { return BoundLimitNode::ExpressionPercentage(std::move(bound_limit)); } else { return BoundLimitNode::ExpressionValue(std::move(bound_limit)); } } - ExpressionBinder expr_binder(*new_binder, context); - auto target_type = is_percentage ? LogicalType::DOUBLE : LogicalType::BIGINT; - ; - expr_binder.target_type = target_type; - auto expr = expr_binder.Bind(limit_val); if (expr->IsFoldable()) { //! this is a constant auto val = ExpressionExecutor::EvaluateScalar(context, *expr).CastAs(context, target_type); @@ -281662,7 +283940,7 @@ unique_ptr Binder::BindLimitPercent(OrderBinder &order_bind return std::move(result); } -void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result) { +void Binder::PrepareModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result) { for (auto &mod : statement.modifiers) { unique_ptr bound_modifier; switch (mod->type) { @@ -281698,16 +283976,12 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun if (star.exclude_list.empty() && star.replace_list.empty() && !star.expr) { // ORDER BY ALL // replace the order list with the all elements in the SELECT list - auto order_type = order.orders[0].type; - auto null_order = order.orders[0].null_order; - - vector new_orders; - for (idx_t i = 0; i < order_binder.MaxCount(); i++) { - new_orders.emplace_back( - order_type, null_order, - make_uniq(Value::INTEGER(UnsafeNumericCast(i + 1)))); - } - order.orders = std::move(new_orders); + auto order_type = config.ResolveOrder(order.orders[0].type); + auto null_order = config.ResolveNullOrder(order_type, order.orders[0].null_order); + auto constant_expr = make_uniq(Value("ALL")); + bound_order->orders.emplace_back(order_type, null_order, std::move(constant_expr)); + bound_modifier = std::move(bound_order); + break; } } #if 0 @@ -281774,10 +284048,66 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun } } -static void AssignReturnType(unique_ptr &expr, const vector &sql_types) { +unique_ptr CreateOrderExpression(unique_ptr expr, const vector &names, + const vector &sql_types, idx_t table_index, idx_t index) { + if (index >= sql_types.size()) { + throw BinderException(*expr, "ORDER term out of range - should be between 1 and %lld", sql_types.size()); + } + auto result = make_uniq(std::move(expr->alias), sql_types[index], + ColumnBinding(table_index, index)); + if (result->alias.empty() && index < names.size()) { + result->alias = names[index]; + } + return std::move(result); +} + +unique_ptr FinalizeBindOrderExpression(unique_ptr expr, idx_t table_index, + const vector &names, const vector &sql_types, + const SelectBindState &bind_state) { + auto &constant = expr->Cast(); + switch (constant.value.type().id()) { + case LogicalTypeId::UBIGINT: { + // index + auto index = UBigIntValue::Get(constant.value); + return CreateOrderExpression(std::move(expr), names, sql_types, table_index, bind_state.GetFinalIndex(index)); + } + case LogicalTypeId::VARCHAR: { + // ORDER BY ALL + return nullptr; + } + case LogicalTypeId::STRUCT: { + // collation + auto &struct_values = StructValue::GetChildren(constant.value); + if (struct_values.size() > 2) { + throw InternalException("Expected one or two children: index and optional collation"); + } + auto index = UBigIntValue::Get(struct_values[0]); + string collation; + if (struct_values.size() == 2) { + collation = StringValue::Get(struct_values[1]); + } + auto result = CreateOrderExpression(std::move(expr), names, sql_types, table_index, index); + if (!collation.empty()) { + if (sql_types[index].id() != LogicalTypeId::VARCHAR) { + throw BinderException(*result, "COLLATE can only be applied to varchar columns"); + } + result->return_type = LogicalType::VARCHAR_COLLATION(std::move(collation)); + } + return result; + } + default: + throw InternalException("Unknown type in FinalizeBindOrderExpression"); + } +} + +static void AssignReturnType(unique_ptr &expr, idx_t table_index, const vector &names, + const vector &sql_types, const SelectBindState &bind_state) { if (!expr) { return; } + if (expr->type == ExpressionType::VALUE_CONSTANT) { + expr = FinalizeBindOrderExpression(std::move(expr), table_index, names, sql_types, bind_state); + } if (expr->type != ExpressionType::BOUND_COLUMN_REF) { return; } @@ -281785,8 +284115,8 @@ static void AssignReturnType(unique_ptr &expr, const vector &sql_types, idx_t, - const vector &expansion_count) { +void Binder::BindModifiers(BoundQueryNode &result, idx_t table_index, const vector &names, + const vector &sql_types, const SelectBindState &bind_state) { for (auto &bound_mod : result.modifiers) { switch (bound_mod->type) { case ResultModifierType::DISTINCT_MODIFIER: { @@ -281794,59 +284124,48 @@ void Binder::BindModifierTypes(BoundQueryNode &result, const vector D_ASSERT(!distinct.target_distincts.empty()); // set types of distinct targets for (auto &expr : distinct.target_distincts) { - D_ASSERT(expr->type == ExpressionType::BOUND_COLUMN_REF); - auto &bound_colref = expr->Cast(); - if (bound_colref.binding.column_index == DConstants::INVALID_INDEX) { - throw BinderException("Ambiguous name in DISTINCT ON!"); - } - - idx_t max_count = sql_types.size(); - if (bound_colref.binding.column_index > max_count - 1) { - D_ASSERT(bound_colref.return_type == LogicalType::ANY); - throw BinderException("ORDER term out of range - should be between 1 and %lld", max_count); + expr = FinalizeBindOrderExpression(std::move(expr), table_index, names, sql_types, bind_state); + if (!expr) { + throw InternalException("DISTINCT ON ORDER BY ALL not supported"); } - - bound_colref.return_type = sql_types[bound_colref.binding.column_index]; } - for (auto &target_distinct : distinct.target_distincts) { - auto &bound_colref = target_distinct->Cast(); - const auto &sql_type = sql_types[bound_colref.binding.column_index]; - ExpressionBinder::PushCollation(context, target_distinct, sql_type, true); + for (auto &expr : distinct.target_distincts) { + ExpressionBinder::PushCollation(context, expr, expr->return_type, true); } break; } case ResultModifierType::LIMIT_MODIFIER: { auto &limit = bound_mod->Cast(); - AssignReturnType(limit.limit_val.GetExpression(), sql_types); - AssignReturnType(limit.offset_val.GetExpression(), sql_types); + AssignReturnType(limit.limit_val.GetExpression(), table_index, names, sql_types, bind_state); + AssignReturnType(limit.offset_val.GetExpression(), table_index, names, sql_types, bind_state); break; } case ResultModifierType::ORDER_MODIFIER: { - auto &order = bound_mod->Cast(); + bool order_by_all = false; for (auto &order_node : order.orders) { - auto &expr = order_node.expression; - D_ASSERT(expr->type == ExpressionType::BOUND_COLUMN_REF); - auto &bound_colref = expr->Cast(); - if (bound_colref.binding.column_index == DConstants::INVALID_INDEX) { - throw BinderException("Ambiguous name in ORDER BY!"); - } - - if (!expansion_count.empty() && bound_colref.return_type.id() != LogicalTypeId::ANY) { - bound_colref.binding.column_index = expansion_count[bound_colref.binding.column_index]; + expr = FinalizeBindOrderExpression(std::move(expr), table_index, names, sql_types, bind_state); + if (!expr) { + order_by_all = true; } - - idx_t max_count = sql_types.size(); - if (bound_colref.binding.column_index > max_count - 1) { - D_ASSERT(bound_colref.return_type == LogicalType::ANY); - throw BinderException("ORDER term out of range - should be between 1 and %lld", max_count); + } + if (order_by_all) { + D_ASSERT(order.orders.size() == 1); + auto order_type = order.orders[0].type; + auto null_order = order.orders[0].null_order; + order.orders.clear(); + for (idx_t i = 0; i < sql_types.size(); i++) { + auto expr = make_uniq(sql_types[i], ColumnBinding(table_index, i)); + if (i < names.size()) { + expr->alias = names[i]; + } + order.orders.emplace_back(order_type, null_order, std::move(expr)); } - - const auto &sql_type = sql_types[bound_colref.binding.column_index]; - bound_colref.return_type = sql_type; - - ExpressionBinder::PushCollation(context, order_node.expression, sql_type); + } + for (auto &order_node : order.orders) { + auto &expr = order_node.expression; + ExpressionBinder::PushCollation(context, order_node.expression, expr->return_type); } break; } @@ -281921,19 +284240,17 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ } statement.select_list = std::move(new_select_list); - // create a mapping of (alias -> index) and a mapping of (Expression -> index) for the SELECT list - case_insensitive_map_t alias_map; - parsed_expression_map_t projection_map; + auto &bind_state = result->bind_state; for (idx_t i = 0; i < statement.select_list.size(); i++) { auto &expr = statement.select_list[i]; result->names.push_back(expr->GetName()); ExpressionBinder::QualifyColumnNames(*this, expr); if (!expr->alias.empty()) { - alias_map[expr->alias] = i; + bind_state.alias_map[expr->alias] = i; result->names[i] = expr->alias; } - projection_map[*expr] = i; - result->original_expressions.push_back(expr->Copy()); + bind_state.projection_map[*expr] = i; + bind_state.original_expressions.push_back(expr->Copy()); } result->column_count = statement.select_list.size(); @@ -281943,15 +284260,15 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ // bind any star expressions in the WHERE clause BindWhereStarExpression(statement.where_clause); - ColumnAliasBinder alias_binder(*result, alias_map); + ColumnAliasBinder alias_binder(bind_state); WhereBinder where_binder(*this, context, &alias_binder); unique_ptr condition = std::move(statement.where_clause); result->where_clause = where_binder.Bind(condition); } // now bind all the result modifiers; including DISTINCT and ORDER BY targets - OrderBinder order_binder({this}, result->projection_index, statement, alias_map, projection_map); - BindModifiers(order_binder, statement, *result); + OrderBinder order_binder({this}, statement, bind_state); + PrepareModifiers(order_binder, statement, *result); vector> unbound_groups; BoundGroupInformation info; @@ -281959,7 +284276,7 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ if (!group_expressions.empty()) { // the statement has a GROUP BY clause, bind it unbound_groups.resize(group_expressions.size()); - GroupBinder group_binder(*this, context, statement, result->group_index, alias_map, info.alias_map); + GroupBinder group_binder(*this, context, statement, result->group_index, bind_state, info.alias_map); for (idx_t i = 0; i < group_expressions.size(); i++) { // we keep a copy of the unbound expression; @@ -282009,35 +284326,36 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ // bind the HAVING clause, if any if (statement.having) { - HavingBinder having_binder(*this, context, *result, info, alias_map, statement.aggregate_handling); + HavingBinder having_binder(*this, context, *result, info, statement.aggregate_handling); ExpressionBinder::QualifyColumnNames(*this, statement.having); result->having = having_binder.Bind(statement.having); } // bind the QUALIFY clause, if any - unique_ptr qualify_binder; + vector bound_qualify_columns; if (statement.qualify) { if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) { throw BinderException("Combining QUALIFY with GROUP BY ALL is not supported yet"); } - qualify_binder = make_uniq(*this, context, *result, info, alias_map); + QualifyBinder qualify_binder(*this, context, *result, info); ExpressionBinder::QualifyColumnNames(*this, statement.qualify); - result->qualify = qualify_binder->Bind(statement.qualify); - if (qualify_binder->HasBoundColumns() && qualify_binder->BoundAggregates()) { - throw BinderException("Cannot mix aggregates with non-aggregated columns!"); + result->qualify = qualify_binder.Bind(statement.qualify); + if (qualify_binder.HasBoundColumns()) { + if (qualify_binder.BoundAggregates()) { + throw BinderException("Cannot mix aggregates with non-aggregated columns!"); + } + bound_qualify_columns = qualify_binder.GetBoundColumns(); } } // after that, we bind to the SELECT list - SelectBinder select_binder(*this, context, *result, info, alias_map); + SelectBinder select_binder(*this, context, *result, info); // if we expand select-list expressions, e.g., via UNNEST, then we need to possibly // adjust the column index of the already bound ORDER BY modifiers, and not only set their types - vector modifier_sql_types; - vector modifier_expansion_count; - vector group_by_all_indexes; vector new_names; + vector internal_sql_types; for (idx_t i = 0; i < statement.select_list.size(); i++) { bool is_window = statement.select_list[i]->IsWindow(); @@ -282047,33 +284365,37 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ bool is_original_column = i < result->column_count; bool can_group_by_all = statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES && is_original_column; + result->bound_column_count++; - if (select_binder.HasExpandedExpressions()) { + if (expr->type == ExpressionType::BOUND_EXPANDED) { if (!is_original_column) { - throw InternalException("Only original columns can have expanded expressions"); + throw BinderException("UNNEST of struct cannot be used in ORDER BY/DISTINCT ON clause"); } if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) { throw BinderException("UNNEST of struct cannot be combined with GROUP BY ALL"); } - auto &struct_expressions = select_binder.ExpandedExpressions(); + auto &expanded = expr->Cast(); + auto &struct_expressions = expanded.expanded_expressions; D_ASSERT(!struct_expressions.empty()); - modifier_expansion_count.push_back(modifier_sql_types.size()); for (auto &struct_expr : struct_expressions) { - modifier_sql_types.push_back(struct_expr->return_type); new_names.push_back(struct_expr->GetName()); result->types.push_back(struct_expr->return_type); + internal_sql_types.push_back(struct_expr->return_type); result->select_list.push_back(std::move(struct_expr)); } - - struct_expressions.clear(); + bind_state.AddExpandedColumn(struct_expressions.size()); continue; } - // not an expanded expression - modifier_expansion_count.push_back(modifier_sql_types.size()); - modifier_sql_types.push_back(result_type); + if (expr->IsVolatile()) { + bind_state.SetExpressionIsVolatile(i); + } + if (expr->HasSubquery()) { + bind_state.SetExpressionHasSubquery(i); + } + bind_state.AddRegularColumn(); if (can_group_by_all && select_binder.HasBoundColumns()) { if (select_binder.BoundAggregates()) { @@ -282095,6 +284417,7 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ new_names.push_back(std::move(result->names[i])); result->types.push_back(result_type); } + internal_sql_types.push_back(result_type); if (can_group_by_all) { select_binder.ResetBindings(); @@ -282122,17 +284445,14 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ if (statement.aggregate_handling == AggregateHandling::NO_AGGREGATES_ALLOWED) { throw BinderException("Aggregates cannot be present in a Project relation!"); } else { - vector> to_check_binders; - to_check_binders.push_back(select_binder); - if (qualify_binder) { - to_check_binders.push_back(*qualify_binder); - } - for (auto &binder : to_check_binders) { - auto &sel_binder = binder.get(); - if (!sel_binder.HasBoundColumns()) { - continue; - } - auto &bound_columns = sel_binder.GetBoundColumns(); + vector bound_columns; + if (select_binder.HasBoundColumns()) { + bound_columns = select_binder.GetBoundColumns(); + } + for (auto &bound_qualify_col : bound_qualify_columns) { + bound_columns.push_back(bound_qualify_col); + } + if (!bound_columns.empty()) { string error; error = "column \"%s\" must appear in the GROUP BY clause or must be part of an aggregate function."; if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) { @@ -282157,7 +284477,7 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ } // now that the SELECT list is bound, we set the types of DISTINCT/ORDER BY expressions - BindModifierTypes(*result, modifier_sql_types, result->projection_index, modifier_expansion_count); + BindModifiers(*result, result->projection_index, result->names, internal_sql_types, bind_state); return std::move(result); } @@ -282233,10 +284553,10 @@ class BoundSetOperationNode : public BoundQueryNode { + namespace duckdb { -static void GatherAliases(BoundQueryNode &node, case_insensitive_map_t &aliases, - parsed_expression_map_t &expressions, const vector &reorder_idx) { +static void GatherAliases(BoundQueryNode &node, SelectBindState &bind_state, const vector &reorder_idx) { if (node.type == QueryNodeType::SET_OPERATION_NODE) { // setop, recurse auto &setop = node.Cast(); @@ -282254,41 +284574,45 @@ static void GatherAliases(BoundQueryNode &node, case_insensitive_map_t &a } // use new reorder index - GatherAliases(*setop.left, aliases, expressions, new_left_reorder_idx); - GatherAliases(*setop.right, aliases, expressions, new_right_reorder_idx); + GatherAliases(*setop.left, bind_state, new_left_reorder_idx); + GatherAliases(*setop.right, bind_state, new_right_reorder_idx); return; } - GatherAliases(*setop.left, aliases, expressions, reorder_idx); - GatherAliases(*setop.right, aliases, expressions, reorder_idx); + GatherAliases(*setop.left, bind_state, reorder_idx); + GatherAliases(*setop.right, bind_state, reorder_idx); } else { // query node D_ASSERT(node.type == QueryNodeType::SELECT_NODE); auto &select = node.Cast(); - // fill the alias lists + // fill the alias lists with the names for (idx_t i = 0; i < select.names.size(); i++) { auto &name = select.names[i]; - auto &expr = select.original_expressions[i]; // first check if the alias is already in there - auto entry = aliases.find(name); + auto entry = bind_state.alias_map.find(name); idx_t index = reorder_idx[i]; - if (entry == aliases.end()) { + if (entry == bind_state.alias_map.end()) { // the alias is not in there yet, just assign it - aliases[name] = index; + bind_state.alias_map[name] = index; } + } + // check if the expression matches one of the expressions in the original expression liset + for (idx_t i = 0; i < select.bind_state.original_expressions.size(); i++) { + auto &expr = select.bind_state.original_expressions[i]; + idx_t index = reorder_idx[i]; // now check if the node is already in the set of expressions - auto expr_entry = expressions.find(*expr); - if (expr_entry != expressions.end()) { + auto expr_entry = bind_state.projection_map.find(*expr); + if (expr_entry != bind_state.projection_map.end()) { // the node is in there // repeat the same as with the alias: if there is an ambiguity we insert "-1" if (expr_entry->second != index) { - expressions[*expr] = DConstants::INVALID_INDEX; + bind_state.projection_map[*expr] = DConstants::INVALID_INDEX; } } else { // not in there yet, just place it in there - expressions[*expr] = index; + bind_state.projection_map[*expr] = index; } } } @@ -282336,8 +284660,8 @@ static void BuildUnionByNameInfo(ClientContext &context, BoundSetOperationNode & bool right_exist = right_index != right_names_map.end(); LogicalType result_type; if (left_exist && right_exist) { - result_type = LogicalType::MaxLogicalType(context, left_node.types[left_index->second], - right_node.types[right_index->second]); + result_type = LogicalType::ForceMaxLogicalType(left_node.types[left_index->second], + right_node.types[right_index->second]); if (left_index->second != i || right_index->second != i) { need_reorder = true; } @@ -282447,32 +284771,30 @@ unique_ptr Binder::BindNode(SetOperationNode &statement) { } } + SelectBindState bind_state; if (!statement.modifiers.empty()) { // handle the ORDER BY/DISTINCT clauses // we recursively visit the children of this node to extract aliases and expressions that can be referenced // in the ORDER BY - case_insensitive_map_t alias_map; - parsed_expression_map_t expression_map; if (result->setop_type == SetOperationType::UNION_BY_NAME) { - GatherAliases(*result->left, alias_map, expression_map, result->left_reorder_idx); - GatherAliases(*result->right, alias_map, expression_map, result->right_reorder_idx); + GatherAliases(*result->left, bind_state, result->left_reorder_idx); + GatherAliases(*result->right, bind_state, result->right_reorder_idx); } else { vector reorder_idx; for (idx_t i = 0; i < result->names.size(); i++) { reorder_idx.push_back(i); } - GatherAliases(*result, alias_map, expression_map, reorder_idx); + GatherAliases(*result, bind_state, reorder_idx); } // now we perform the actual resolution of the ORDER BY/DISTINCT expressions - OrderBinder order_binder({result->left_binder.get(), result->right_binder.get()}, result->setop_index, - alias_map, expression_map, result->names.size()); - BindModifiers(order_binder, statement, *result); + OrderBinder order_binder({result->left_binder.get(), result->right_binder.get()}, bind_state); + PrepareModifiers(order_binder, statement, *result); } // finally bind the types of the ORDER/DISTINCT clause expressions - BindModifierTypes(*result, result->types, result->setop_index); + BindModifiers(*result, result->setop_index, result->names, result->types, bind_state); return std::move(result); } @@ -282570,6 +284892,35 @@ unique_ptr Binder::CreatePlan(BoundCTENode &node) { return VisitQueryNode(node, std::move(root)); } +unique_ptr Binder::CreatePlan(BoundCTENode &node, unique_ptr base) { + // Generate the logical plan for the cte_query and child. + auto cte_query = CreatePlan(*node.query); + unique_ptr cte_child; + if (node.child && node.child->type == QueryNodeType::CTE_NODE) { + cte_child = CreatePlan(node.child->Cast(), std::move(base)); + } else if (node.child) { + cte_child = CreatePlan(*node.child); + } else { + cte_child = std::move(base); + } + + // Only keep the materialized CTE, if it is used + if (node.child_binder->bind_context.cte_references[node.ctename] && + *node.child_binder->bind_context.cte_references[node.ctename] > 0) { + auto root = make_uniq(node.ctename, node.setop_index, node.types.size(), + std::move(cte_query), std::move(cte_child)); + + // check if there are any unplanned subqueries left in either child + has_unplanned_dependent_joins = has_unplanned_dependent_joins || + node.child_binder->has_unplanned_dependent_joins || + node.query_binder->has_unplanned_dependent_joins; + + return VisitQueryNode(node, std::move(root)); + } else { + return VisitQueryNode(node, std::move(cte_child)); + } +} + } // namespace duckdb @@ -282961,7 +285312,7 @@ struct FlattenDependentJoins { //! Detects which Logical Operators have correlated expressions that they are dependent upon, filling the //! has_correlated_expressions map. - bool DetectCorrelatedExpressions(LogicalOperator *op, bool lateral = false, idx_t lateral_depth = 0); + bool DetectCorrelatedExpressions(LogicalOperator &op, bool lateral = false, idx_t lateral_depth = 0); //! Mark entire subtree of Logical Operators as correlated by adding them to the has_correlated_expressions map. bool MarkSubtreeCorrelated(LogicalOperator &op); @@ -282973,7 +285324,7 @@ struct FlattenDependentJoins { ColumnBinding base_binding; idx_t delim_offset; idx_t data_offset; - unordered_map has_correlated_expressions; + reference_map_t has_correlated_expressions; column_binding_map_t correlated_map; column_binding_map_t replacement_map; const vector &correlated_columns; @@ -283345,7 +285696,7 @@ static unique_ptr PlanCorrelatedSubquery(Binder &binder, BoundSubque FlattenDependentJoins flatten(binder, correlated_columns, perform_delim); // first we check which logical operators have correlated expressions in the first place - flatten.DetectCorrelatedExpressions(plan.get()); + flatten.DetectCorrelatedExpressions(*plan); // now we push the dependent join down auto dependent_join = flatten.PushDownDependentJoin(std::move(plan)); @@ -283370,7 +285721,7 @@ static unique_ptr PlanCorrelatedSubquery(Binder &binder, BoundSubque delim_join->mark_index = mark_index; // RHS FlattenDependentJoins flatten(binder, correlated_columns, perform_delim, true); - flatten.DetectCorrelatedExpressions(plan.get()); + flatten.DetectCorrelatedExpressions(*plan); auto dependent_join = flatten.PushDownDependentJoin(std::move(plan)); // fetch the set of columns @@ -283398,7 +285749,7 @@ static unique_ptr PlanCorrelatedSubquery(Binder &binder, BoundSubque delim_join->mark_index = mark_index; // RHS FlattenDependentJoins flatten(binder, correlated_columns, true, true); - flatten.DetectCorrelatedExpressions(plan.get()); + flatten.DetectCorrelatedExpressions(*plan); auto dependent_join = flatten.PushDownDependentJoin(std::move(plan)); // fetch the columns @@ -283502,8 +285853,8 @@ void Binder::PlanSubqueries(unique_ptr &expr_ptr, unique_ptr Binder::PlanLateralJoin(unique_ptr left, unique_ptr right, - vector &correlated_columns, - JoinType join_type, unique_ptr condition) { + vector &correlated, JoinType join_type, + unique_ptr condition) { // scan the right operator for correlated columns // correlated LATERAL JOIN vector conditions; @@ -283514,13 +285865,13 @@ unique_ptr Binder::PlanLateralJoin(unique_ptr arbitrary_expressions); } - auto perform_delim = PerformDuplicateElimination(*this, correlated_columns); - auto delim_join = CreateDuplicateEliminatedJoin(correlated_columns, join_type, std::move(left), perform_delim); + auto perform_delim = PerformDuplicateElimination(*this, correlated); + auto delim_join = CreateDuplicateEliminatedJoin(correlated, join_type, std::move(left), perform_delim); - FlattenDependentJoins flatten(*this, correlated_columns, perform_delim); + FlattenDependentJoins flatten(*this, correlated, perform_delim); // first we check which logical operators have correlated expressions in the first place - flatten.DetectCorrelatedExpressions(right.get(), true); + flatten.DetectCorrelatedExpressions(*right, true); // now we push the dependent join down auto dependent_join = flatten.PushDownDependentJoin(std::move(right)); @@ -283539,7 +285890,7 @@ unique_ptr Binder::PlanLateralJoin(unique_ptr D_ASSERT(delim_join->conditions.empty()); delim_join->conditions = std::move(conditions); // then add the delim join conditions - CreateDelimJoinConditions(*delim_join, correlated_columns, plan_columns, flatten.delim_offset, perform_delim); + CreateDelimJoinConditions(*delim_join, correlated, plan_columns, flatten.delim_offset, perform_delim); delim_join->AddChild(std::move(dependent_join)); // check if there are any arbitrary expressions left @@ -283761,11 +286112,12 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt) { if (file_size_bytes.IsValid() && !partition_cols.empty()) { throw NotImplementedException("Can't combine FILE_SIZE_BYTES and PARTITION_BY for COPY"); } - bool is_remote_file = config.file_system->IsRemoteFile(stmt.info->file_path); + bool is_remote_file = FileSystem::IsRemoteFile(stmt.info->file_path); if (is_remote_file) { use_tmp_file = false; } else { - bool is_file_and_exists = config.file_system->FileExists(stmt.info->file_path); + auto &fs = FileSystem::GetFileSystem(context); + bool is_file_and_exists = fs.FileExists(stmt.info->file_path); bool is_stdout = stmt.info->file_path == "/dev/stdout"; if (!user_set_use_tmp_file) { use_tmp_file = is_file_and_exists && !per_thread_output && partition_cols.empty() && !is_stdout; @@ -283913,31 +286265,27 @@ BoundStatement Binder::Bind(CopyStatement &stmt) { - - - - namespace duckdb { -unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database) { - auto from_schemas = from_database.GetSchemas(context); +unique_ptr Binder::BindCopyDatabaseSchema(Catalog &source_catalog, + const string &target_database_name) { + auto source_schemas = source_catalog.GetSchemas(context); ExportEntries entries; - PhysicalExport::ExtractEntries(context, from_schemas, entries); + PhysicalExport::ExtractEntries(context, source_schemas, entries); - auto info = make_uniq(from_database, to_database); + auto info = make_uniq(target_database_name); // get a list of all schemas to copy over - for (auto &schema_ref : from_schemas) { + for (auto &schema_ref : source_schemas) { auto &schema = schema_ref.get().Cast(); if (schema.internal) { continue; } auto create_info = schema.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -283948,7 +286296,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = seq_entry.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -283959,7 +286307,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = type_entry.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -283970,7 +286318,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = table.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -283980,7 +286328,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = macro.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -283991,7 +286339,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = view.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -284000,24 +286348,23 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement return make_uniq(std::move(info)); } -unique_ptr Binder::BindCopyDatabaseData(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database) { - auto from_schemas = from_database.GetSchemas(context); +unique_ptr Binder::BindCopyDatabaseData(Catalog &source_catalog, const string &target_database_name) { + auto source_schemas = source_catalog.GetSchemas(context); ExportEntries entries; - PhysicalExport::ExtractEntries(context, from_schemas, entries); + PhysicalExport::ExtractEntries(context, source_schemas, entries); unique_ptr result; for (auto &table_ref : entries.tables) { auto &table = table_ref.get(); // generate the insert statement InsertStatement insert_stmt; - insert_stmt.catalog = stmt.to_database; + insert_stmt.catalog = target_database_name; insert_stmt.schema = table.ParentSchema().name; insert_stmt.table = table.name; auto from_tbl = make_uniq(); - from_tbl->catalog_name = stmt.from_database; + from_tbl->catalog_name = source_catalog.GetName(); from_tbl->schema_name = table.ParentSchema().name; from_tbl->table_name = table.name; @@ -284058,9 +286405,9 @@ BoundStatement Binder::Bind(CopyDatabaseStatement &stmt) { BoundStatement result; unique_ptr plan; - auto &from_database = Catalog::GetCatalog(context, stmt.from_database); - auto &to_database = Catalog::GetCatalog(context, stmt.to_database); - if (&from_database == &to_database) { + auto &source_catalog = Catalog::GetCatalog(context, stmt.from_database); + auto &target_catalog = Catalog::GetCatalog(context, stmt.to_database); + if (&source_catalog == &target_catalog) { throw BinderException("Cannot copy from \"%s\" to \"%s\" - FROM and TO databases are the same", stmt.from_database, stmt.to_database); } @@ -284068,18 +286415,18 @@ BoundStatement Binder::Bind(CopyDatabaseStatement &stmt) { result.types = {LogicalType::BOOLEAN}; result.names = {"Success"}; - plan = BindCopyDatabaseSchema(stmt, from_database, to_database); + plan = BindCopyDatabaseSchema(source_catalog, target_catalog.GetName()); } else { result.types = {LogicalType::BIGINT}; result.names = {"Count"}; - plan = BindCopyDatabaseData(stmt, from_database, to_database); + plan = BindCopyDatabaseData(source_catalog, target_catalog.GetName()); } result.plan = std::move(plan); properties.allow_stream_result = false; properties.return_type = StatementReturnType::NOTHING; - properties.modified_databases.insert(stmt.to_database); + properties.modified_databases.insert(target_catalog.GetName()); return result; } @@ -284164,6 +286511,7 @@ class IndexBinder : public ExpressionBinder { + namespace duckdb { @@ -284307,11 +286655,10 @@ SchemaCatalogEntry &Binder::BindCreateFunctionInfo(CreateInfo &info) { // bind it to verify the function was defined correctly ErrorData error; - auto sel_node = make_uniq(); - auto group_info = make_uniq(); - SelectBinder binder(*this, context, *sel_node, *group_info); + BoundSelectNode sel_node; + BoundGroupInformation group_info; + SelectBinder binder(*this, context, sel_node, group_info); error = binder.Bind(expression, 0, false); - if (error.HasError()) { error.Throw(); } @@ -284395,16 +286742,16 @@ static void FindMatchingPrimaryKeyColumns(const ColumnList &columns, const vecto continue; } auto &unique = constr->Cast(); - if (find_primary_key && !unique.is_primary_key) { + if (find_primary_key && !unique.IsPrimaryKey()) { continue; } found_constraint = true; vector pk_names; - if (unique.index.index != DConstants::INVALID_INDEX) { - pk_names.push_back(columns.GetColumn(LogicalIndex(unique.index)).Name()); + if (unique.HasIndex()) { + pk_names.push_back(columns.GetColumn(LogicalIndex(unique.GetIndex())).Name()); } else { - pk_names = unique.columns; + pk_names = unique.GetColumnNames(); } if (find_primary_key) { // found matching primary key @@ -284537,15 +286884,14 @@ static bool AnyConstraintReferencesGeneratedColumn(CreateTableInfo &table_info) } case ConstraintType::UNIQUE: { auto &constraint = constr->Cast(); - auto index = constraint.index; - if (index.index == DConstants::INVALID_INDEX) { - for (auto &col : constraint.columns) { + if (!constraint.HasIndex()) { + for (auto &col : constraint.GetColumnNames()) { if (generated_columns.count(col)) { return true; } } } else { - if (table_info.columns.GetColumn(index).Generated()) { + if (table_info.columns.GetColumn(constraint.GetIndex()).Generated()) { return true; } } @@ -284906,17 +287252,16 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) { // have to resolve columns of the unique constraint vector keys; logical_index_set_t key_set; - if (unique.index.index != DConstants::INVALID_INDEX) { - D_ASSERT(unique.index.index < base.columns.LogicalColumnCount()); + if (unique.HasIndex()) { + D_ASSERT(unique.GetIndex().index < base.columns.LogicalColumnCount()); // unique constraint is given by single index - unique.columns.push_back(base.columns.GetColumn(unique.index).Name()); - keys.push_back(unique.index); - key_set.insert(unique.index); + unique.SetColumnName(base.columns.GetColumn(unique.GetIndex()).Name()); + keys.push_back(unique.GetIndex()); + key_set.insert(unique.GetIndex()); } else { // unique constraint is given by list of names // have to resolve names - D_ASSERT(!unique.columns.empty()); - for (auto &keyname : unique.columns) { + for (auto &keyname : unique.GetColumnNames()) { if (!base.columns.ColumnExists(keyname)) { throw ParserException("column \"%s\" named in key does not exist", keyname); } @@ -284932,7 +287277,7 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) { } } - if (unique.is_primary_key) { + if (unique.IsPrimaryKey()) { // we can only have one primary key per table if (has_primary_key) { throw ParserException("table \"%s\" has more than one primary key", base.table); @@ -284941,7 +287286,7 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) { primary_keys = keys; } info.bound_constraints.push_back( - make_uniq(std::move(keys), std::move(key_set), unique.is_primary_key)); + make_uniq(std::move(keys), std::move(key_set), unique.IsPrimaryKey())); break; } case ConstraintType::FOREIGN_KEY: { @@ -285032,7 +287377,6 @@ void Binder::BindGeneratedColumns(BoundCreateTableInfo &info) { col.SetType(bound_expression->return_type); // Update the type in the binding, for future expansions - string ignore; table_binding->types[i.index] = col.Type(); } bound_indices.insert(i); @@ -285060,7 +287404,7 @@ void Binder::BindDefaultValues(const ColumnList &columns, vector(); if (function.function.dependency) { @@ -286228,25 +288572,23 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl } auto bindings = insert.children[0]->GetColumnBindings(); - idx_t projection_index = DConstants::INVALID_INDEX; - vector> *insert_child_operators; - insert_child_operators = &insert.children; - while (projection_index == DConstants::INVALID_INDEX) { - if (insert_child_operators->empty()) { + optional_idx projection_index; + reference>> insert_child_operators = insert.children; + while (!projection_index.IsValid()) { + if (insert_child_operators.get().empty()) { // No further children to visit break; } - D_ASSERT(insert_child_operators->size() >= 1); - auto ¤t_child = (*insert_child_operators)[0]; + auto ¤t_child = insert_child_operators.get()[0]; auto table_indices = current_child->GetTableIndex(); if (table_indices.empty()) { // This operator does not have a table index to refer to, we have to visit its children - insert_child_operators = ¤t_child->children; + insert_child_operators = current_child->children; continue; } projection_index = table_indices[0]; } - if (projection_index == DConstants::INVALID_INDEX) { + if (!projection_index.IsValid()) { throw InternalException("Could not locate a table_index from the children of the insert"); } @@ -286258,7 +288600,7 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl // Replace any column bindings to refer to the projection table_index, rather than the source table if (insert.on_conflict_condition) { - ReplaceColumnBindings(*insert.on_conflict_condition, table_index, projection_index); + ReplaceColumnBindings(*insert.on_conflict_condition, table_index, projection_index.GetIndex()); } if (insert.action_type == OnConflictAction::REPLACE) { @@ -286310,11 +288652,11 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl // Replace the column bindings to refer to the child operator for (auto &expr : insert.expressions) { // Change the non-excluded column references to refer to the projection index - ReplaceColumnBindings(*expr, table_index, projection_index); + ReplaceColumnBindings(*expr, table_index, projection_index.GetIndex()); } // Do the same for the (optional) DO UPDATE condition if (insert.do_update_condition) { - ReplaceColumnBindings(*insert.do_update_condition, table_index, projection_index); + ReplaceColumnBindings(*insert.do_update_condition, table_index, projection_index.GetIndex()); } } @@ -286365,7 +288707,6 @@ BoundStatement Binder::Bind(InsertStatement &stmt) { if (!entry.second) { throw BinderException("Duplicate column name \"%s\" in INSERT", stmt.columns[i]); } - column_name_map[stmt.columns[i]] = i; auto column_index = table.GetColumnIndex(stmt.columns[i]); if (column_index.index == COLUMN_IDENTIFIER_ROW_ID) { throw BinderException("Cannot explicitly insert values into rowid column"); @@ -286564,13 +288905,13 @@ unique_ptr Binder::BindPragma(PragmaInfo &info, QueryErrorConte auto &entry = Catalog::GetEntry(context, INVALID_CATALOG, DEFAULT_SCHEMA, info.name); FunctionBinder function_binder(context); ErrorData error; - idx_t bound_idx = function_binder.BindFunction(entry.name, entry.functions, params, error); - if (bound_idx == DConstants::INVALID_INDEX) { + auto bound_idx = function_binder.BindFunction(entry.name, entry.functions, params, error); + if (!bound_idx.IsValid()) { D_ASSERT(error.HasError()); error.AddQueryLocation(error_context); error.Throw(); } - auto bound_function = entry.functions.GetFunctionByOffset(bound_idx); + auto bound_function = entry.functions.GetFunctionByOffset(bound_idx.GetIndex()); // bind and check named params BindNamedParameters(bound_function.named_parameters, named_parameters, error_context, bound_function.name); return make_uniq(std::move(bound_function), std::move(params), std::move(named_parameters)); @@ -286666,6 +289007,9 @@ BoundStatement Binder::Bind(SetVariableStatement &stmt) { // evaluate the scalar value ConstantBinder default_binder(*this, context, "SET value"); auto bound_value = default_binder.Bind(stmt.value); + if (bound_value->HasParameter()) { + throw NotImplementedException("SET statements cannot have parameters"); + } auto value = ExpressionExecutor::EvaluateScalar(context, *bound_value, true); result.plan = make_uniq(stmt.name, std::move(value), stmt.scope); @@ -287126,79 +289470,80 @@ BoundStatement Binder::Bind(UpdateStatement &stmt) { namespace duckdb { -BoundStatement Binder::Bind(VacuumStatement &stmt) { - BoundStatement result; +void Binder::BindVacuumTable(LogicalVacuum &vacuum, unique_ptr &root) { + auto &info = vacuum.GetInfo(); + if (!info.has_table) { + return; + } - unique_ptr root; + D_ASSERT(vacuum.column_id_map.empty()); + auto bound_table = Bind(*info.ref); + if (bound_table->type != TableReferenceType::BASE_TABLE) { + throw InvalidInputException("Can only vacuum/analyze base tables!"); + } + auto ref = unique_ptr_cast(std::move(bound_table)); + auto &table = ref->table; + vacuum.SetTable(table); - if (stmt.info->has_table) { - D_ASSERT(!stmt.info->table); - D_ASSERT(stmt.info->column_id_map.empty()); - auto bound_table = Bind(*stmt.info->ref); - if (bound_table->type != TableReferenceType::BASE_TABLE) { - throw InvalidInputException("Can only vacuum/analyze base tables!"); - } - auto ref = unique_ptr_cast(std::move(bound_table)); - auto &table = ref->table; - stmt.info->table = &table; + vector> select_list; + auto &columns = info.columns; + if (columns.empty()) { + // Empty means ALL columns should be vacuumed/analyzed + auto &get = ref->get->Cast(); + columns.insert(columns.end(), get.names.begin(), get.names.end()); + } - auto &columns = stmt.info->columns; - vector> select_list; - if (columns.empty()) { - // Empty means ALL columns should be vacuumed/analyzed - auto &get = ref->get->Cast(); - columns.insert(columns.end(), get.names.begin(), get.names.end()); + case_insensitive_set_t column_name_set; + vector non_generated_column_names; + for (auto &col_name : columns) { + if (column_name_set.count(col_name) > 0) { + throw BinderException("Vacuum the same column twice(same name in column name list)"); } - - case_insensitive_set_t column_name_set; - vector non_generated_column_names; - for (auto &col_name : columns) { - if (column_name_set.count(col_name) > 0) { - throw BinderException("Vacuum the same column twice(same name in column name list)"); - } - column_name_set.insert(col_name); - if (!table.ColumnExists(col_name)) { - throw BinderException("Column with name \"%s\" does not exist", col_name); - } - auto &col = table.GetColumn(col_name); - // ignore generated column - if (col.Generated()) { - continue; - } - non_generated_column_names.push_back(col_name); - ColumnRefExpression colref(col_name, table.name); - auto result = bind_context.BindColumn(colref, 0); - if (result.HasError()) { - result.error.Throw(); - } - select_list.push_back(std::move(result.expression)); + column_name_set.insert(col_name); + if (!table.ColumnExists(col_name)) { + throw BinderException("Column with name \"%s\" does not exist", col_name); } - stmt.info->columns = std::move(non_generated_column_names); - if (!select_list.empty()) { - auto table_scan = CreatePlan(*ref); - D_ASSERT(table_scan->type == LogicalOperatorType::LOGICAL_GET); - - auto &get = table_scan->Cast(); + auto &col = table.GetColumn(col_name); + // ignore generated column + if (col.Generated()) { + continue; + } + non_generated_column_names.push_back(col_name); + ColumnRefExpression colref(col_name, table.name); + auto result = bind_context.BindColumn(colref, 0); + if (result.HasError()) { + result.error.Throw(); + } + select_list.push_back(std::move(result.expression)); + } + info.columns = std::move(non_generated_column_names); + // Creating a table without any physical columns is not supported + D_ASSERT(!select_list.empty()); - D_ASSERT(select_list.size() == get.column_ids.size()); - D_ASSERT(stmt.info->columns.size() == get.column_ids.size()); - for (idx_t i = 0; i < get.column_ids.size(); i++) { - stmt.info->column_id_map[i] = - table.GetColumns().LogicalToPhysical(LogicalIndex(get.column_ids[i])).index; - } + auto table_scan = CreatePlan(*ref); + D_ASSERT(table_scan->type == LogicalOperatorType::LOGICAL_GET); - auto projection = make_uniq(GenerateTableIndex(), std::move(select_list)); - projection->children.push_back(std::move(table_scan)); + auto &get = table_scan->Cast(); - root = std::move(projection); - } else { - // eg. CREATE TABLE test (x AS (1)); - // ANALYZE test; - // Make it not a SINK so it doesn't have to do anything - stmt.info->has_table = false; - } + D_ASSERT(select_list.size() == get.column_ids.size()); + D_ASSERT(info.columns.size() == get.column_ids.size()); + for (idx_t i = 0; i < get.column_ids.size(); i++) { + vacuum.column_id_map[i] = table.GetColumns().LogicalToPhysical(LogicalIndex(get.column_ids[i])).index; } - auto vacuum = make_uniq(LogicalOperatorType::LOGICAL_VACUUM, std::move(stmt.info)); + + auto projection = make_uniq(GenerateTableIndex(), std::move(select_list)); + projection->children.push_back(std::move(table_scan)); + + root = std::move(projection); +} + +BoundStatement Binder::Bind(VacuumStatement &stmt) { + BoundStatement result; + + unique_ptr root; + + auto vacuum = make_uniq(std::move(stmt.info)); + BindVacuumTable(*vacuum, root); if (root) { vacuum->children.push_back(std::move(root)); } @@ -287361,62 +289706,70 @@ unique_ptr Binder::Bind(BaseTableRef &ref) { // check if the table name refers to a CTE // CTE name should never be qualified (i.e. schema_name should be empty) - optional_ptr found_cte = nullptr; + vector> found_ctes; if (ref.schema_name.empty()) { - found_cte = FindCTE(ref.table_name, ref.table_name == alias); + found_ctes = FindCTE(ref.table_name, ref.table_name == alias); } - if (found_cte) { + if (!found_ctes.empty()) { // Check if there is a CTE binding in the BindContext - auto &cte = *found_cte; - auto ctebinding = bind_context.GetCTEBinding(ref.table_name); - if (!ctebinding) { - if (CTEIsAlreadyBound(cte)) { - throw BinderException( - "Circular reference to CTE \"%s\", There are two possible solutions. \n1. use WITH RECURSIVE to " - "use recursive CTEs. \n2. If " - "you want to use the TABLE name \"%s\" the same as the CTE name, please explicitly add " - "\"SCHEMA\" before table name. You can try \"main.%s\" (main is the duckdb default schema)", - ref.table_name, ref.table_name, ref.table_name); - } - // Move CTE to subquery and bind recursively - SubqueryRef subquery(unique_ptr_cast(cte.query->Copy())); - subquery.alias = ref.alias.empty() ? ref.table_name : ref.alias; - subquery.column_name_alias = cte.aliases; - for (idx_t i = 0; i < ref.column_name_alias.size(); i++) { - if (i < subquery.column_name_alias.size()) { - subquery.column_name_alias[i] = ref.column_name_alias[i]; - } else { - subquery.column_name_alias.push_back(ref.column_name_alias[i]); + bool circular_cte = false; + for (auto found_cte : found_ctes) { + auto &cte = found_cte.get(); + auto ctebinding = bind_context.GetCTEBinding(ref.table_name); + if (!ctebinding) { + if (CTEIsAlreadyBound(cte)) { + // remember error state + circular_cte = true; + // retry with next candidate CTE + continue; } - } - return Bind(subquery, found_cte); - } else { - // There is a CTE binding in the BindContext. - // This can only be the case if there is a recursive CTE, - // or a materialized CTE present. - auto index = GenerateTableIndex(); - auto materialized = cte.materialized; - if (materialized == CTEMaterialize::CTE_MATERIALIZE_DEFAULT) { + // Move CTE to subquery and bind recursively + SubqueryRef subquery(unique_ptr_cast(cte.query->Copy())); + subquery.alias = ref.alias.empty() ? ref.table_name : ref.alias; + subquery.column_name_alias = cte.aliases; + for (idx_t i = 0; i < ref.column_name_alias.size(); i++) { + if (i < subquery.column_name_alias.size()) { + subquery.column_name_alias[i] = ref.column_name_alias[i]; + } else { + subquery.column_name_alias.push_back(ref.column_name_alias[i]); + } + } + return Bind(subquery, &found_cte.get()); + } else { + // There is a CTE binding in the BindContext. + // This can only be the case if there is a recursive CTE, + // or a materialized CTE present. + auto index = GenerateTableIndex(); + auto materialized = cte.materialized; + if (materialized == CTEMaterialize::CTE_MATERIALIZE_DEFAULT) { #ifdef DUCKDB_ALTERNATIVE_VERIFY - materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS; + materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS; #else - materialized = CTEMaterialize::CTE_MATERIALIZE_NEVER; + materialized = CTEMaterialize::CTE_MATERIALIZE_NEVER; #endif - } - auto result = make_uniq(index, ctebinding->index, materialized); - auto b = ctebinding; - auto alias = ref.alias.empty() ? ref.table_name : ref.alias; - auto names = BindContext::AliasColumnNames(alias, b->names, ref.column_name_alias); + } + auto result = make_uniq(index, ctebinding->index, materialized); + auto alias = ref.alias.empty() ? ref.table_name : ref.alias; + auto names = BindContext::AliasColumnNames(alias, ctebinding->names, ref.column_name_alias); - bind_context.AddGenericBinding(index, alias, names, b->types); - // Update references to CTE - auto cteref = bind_context.cte_references[ref.table_name]; - (*cteref)++; + bind_context.AddGenericBinding(index, alias, names, ctebinding->types); + // Update references to CTE + auto cteref = bind_context.cte_references[ref.table_name]; + (*cteref)++; - result->types = b->types; - result->bound_columns = std::move(names); - return std::move(result); + result->types = ctebinding->types; + result->bound_columns = std::move(names); + return std::move(result); + } + } + if (circular_cte) { + throw BinderException( + "Circular reference to CTE \"%s\", There are two possible solutions. \n1. use WITH RECURSIVE to " + "use recursive CTEs. \n2. If " + "you want to use the TABLE name \"%s\" the same as the CTE name, please explicitly add " + "\"SCHEMA\" before table name. You can try \"main.%s\" (main is the duckdb default schema)", + ref.table_name, ref.table_name, ref.table_name); } } // not a CTE @@ -288049,6 +290402,7 @@ void Binder::BindNamedParameters(named_parameter_type_map_t &types, named_parame + namespace duckdb { @@ -288375,7 +290729,9 @@ unique_ptr Binder::BindBoundPivot(PivotRef &ref) { result->bound_pivot.group_count = ref.bound_group_names.size(); result->bound_pivot.types = types; auto subquery_alias = ref.alias.empty() ? "__unnamed_pivot" : ref.alias; + QueryResult::DeduplicateColumns(names); bind_context.AddGenericBinding(result->bind_index, subquery_alias, names, types); + MoveCorrelatedExpressions(*result->child_binder); return std::move(result); } @@ -288837,8 +291193,8 @@ unique_ptr Binder::Bind(SubqueryRef &ref, optional_ptrbound_ctes.insert(*cte); } - binder->alias = ref.alias.empty() ? "unnamed_subquery" : ref.alias; auto subquery = binder->BindNode(*ref.subquery->node); + binder->alias = ref.alias.empty() ? "unnamed_subquery" : ref.alias; idx_t bind_index = subquery->GetRootIndex(); string subquery_alias; if (ref.alias.empty()) { @@ -288962,7 +291318,7 @@ bool Binder::BindTableFunctionParameters(TableFunctionCatalogEntry &table_functi continue; } - TableFunctionBinder binder(*this, context); + TableFunctionBinder binder(*this, context, table_function.name); LogicalType sql_type; auto expr = binder.Bind(child, &sql_type); if (expr->HasParameter()) { @@ -289000,7 +291356,7 @@ Binder::BindTableFunctionInternal(TableFunction &table_function, const string &f vector return_names; if (table_function.bind || table_function.bind_replace) { TableFunctionBindInput bind_input(parameters, named_parameters, input_table_types, input_table_names, - table_function.function_info.get()); + table_function.function_info.get(), this); if (table_function.bind_replace) { auto new_plan = table_function.bind_replace(context, bind_input); if (new_plan != nullptr) { @@ -289111,12 +291467,12 @@ unique_ptr Binder::Bind(TableFunctionRef &ref) { // select the function based on the input parameters FunctionBinder function_binder(context); - idx_t best_function_idx = function_binder.BindFunction(function.name, function.functions, arguments, error); - if (best_function_idx == DConstants::INVALID_INDEX) { + auto best_function_idx = function_binder.BindFunction(function.name, function.functions, arguments, error); + if (!best_function_idx.IsValid()) { error.AddQueryLocation(ref); error.Throw(); } - auto table_function = function.functions.GetFunctionByOffset(best_function_idx); + auto table_function = function.functions.GetFunctionByOffset(best_function_idx.GetIndex()); // now check the named parameters BindNamedParameters(table_function.named_parameters, named_parameters, error_context, table_function.name); @@ -289706,6 +292062,76 @@ Binder::Binder(bool, ClientContext &context, shared_ptr parent_p, bool i } } +unique_ptr Binder::BindMaterializedCTE(CommonTableExpressionMap &cte_map) { + // Extract materialized CTEs from cte_map + vector> materialized_ctes; + for (auto &cte : cte_map.map) { + auto &cte_entry = cte.second; + if (cte_entry->materialized == CTEMaterialize::CTE_MATERIALIZE_ALWAYS) { + auto mat_cte = make_uniq(); + mat_cte->ctename = cte.first; + mat_cte->query = cte_entry->query->node->Copy(); + mat_cte->aliases = cte_entry->aliases; + materialized_ctes.push_back(std::move(mat_cte)); + } + } + + if (materialized_ctes.empty()) { + return nullptr; + } + + unique_ptr cte_root = nullptr; + while (!materialized_ctes.empty()) { + unique_ptr node_result; + node_result = std::move(materialized_ctes.back()); + node_result->cte_map = cte_map.Copy(); + if (cte_root) { + node_result->child = std::move(cte_root); + } else { + node_result->child = nullptr; + } + cte_root = std::move(node_result); + materialized_ctes.pop_back(); + } + + AddCTEMap(cte_map); + auto bound_cte = BindCTE(cte_root->Cast()); + + return bound_cte; +} + +template +BoundStatement Binder::BindWithCTE(T &statement) { + BoundStatement bound_statement; + auto bound_cte = BindMaterializedCTE(statement.template Cast().cte_map); + if (bound_cte) { + BoundCTENode *tail = bound_cte.get(); + + while (tail->child && tail->child->type == QueryNodeType::CTE_NODE) { + tail = &tail->child->Cast(); + } + + bound_statement = tail->child_binder->Bind(statement.template Cast()); + + tail->types = bound_statement.types; + tail->names = bound_statement.names; + + for (auto &c : tail->query_binder->correlated_columns) { + tail->child_binder->AddCorrelatedColumn(c); + } + + MoveCorrelatedExpressions(*tail->child_binder); + + // extract operator below root operation + auto plan = std::move(bound_statement.plan->children[0]); + bound_statement.plan->children.clear(); + bound_statement.plan->children.push_back(CreatePlan(*bound_cte, std::move(plan))); + } else { + bound_statement = Bind(statement.template Cast()); + } + return bound_statement; +} + BoundStatement Binder::Bind(SQLStatement &statement) { root_statement = &statement; switch (statement.type) { @@ -289716,9 +292142,9 @@ BoundStatement Binder::Bind(SQLStatement &statement) { case StatementType::COPY_STATEMENT: return Bind(statement.Cast()); case StatementType::DELETE_STATEMENT: - return Bind(statement.Cast()); + return BindWithCTE(statement.Cast()); case StatementType::UPDATE_STATEMENT: - return Bind(statement.Cast()); + return BindWithCTE(statement.Cast()); case StatementType::RELATION_STATEMENT: return Bind(statement.Cast()); case StatementType::CREATE_STATEMENT: @@ -289902,17 +292328,19 @@ void Binder::AddCTE(const string &name, CommonTableExpressionInfo &info) { CTE_bindings.insert(make_pair(name, reference(info))); } -optional_ptr Binder::FindCTE(const string &name, bool skip) { +vector> Binder::FindCTE(const string &name, bool skip) { auto entry = CTE_bindings.find(name); + vector> ctes; if (entry != CTE_bindings.end()) { if (!skip || entry->second.get().query->node->type == QueryNodeType::RECURSIVE_CTE_NODE) { - return &entry->second.get(); + ctes.push_back(entry->second); } } if (parent && inherit_ctes) { - return parent->FindCTE(name, name == alias); + auto parent_ctes = parent->FindCTE(name, name == alias); + ctes.insert(ctes.end(), parent_ctes.begin(), parent_ctes.end()); } - return nullptr; + return ctes; } bool Binder::CTEIsAlreadyBound(CommonTableExpressionInfo &cte) { @@ -290499,7 +292927,7 @@ class FunctionSerializer { template static pair> Deserialize(Deserializer &deserializer, CatalogType catalog_type, vector> &children, - LogicalType return_type) { + LogicalType return_type) { // NOLINT: clang-tidy bug auto &context = deserializer.Get(); auto entry = DeserializeBase(deserializer, catalog_type); auto &function = entry.first; @@ -290872,7 +293300,12 @@ bool BoundCastExpression::CastIsInvertible(const LogicalType &source_type, const } return true; } - if (source_type.id() == LogicalTypeId::TIMESTAMP || source_type.id() == LogicalTypeId::TIMESTAMP_TZ) { + switch (source_type.id()) { + case LogicalTypeId::TIMESTAMP: + case LogicalTypeId::TIMESTAMP_TZ: + case LogicalTypeId::TIMESTAMP_SEC: + case LogicalTypeId::TIMESTAMP_MS: + case LogicalTypeId::TIMESTAMP_NS: switch (target_type.id()) { case LogicalTypeId::DATE: case LogicalTypeId::TIME: @@ -290881,8 +293314,8 @@ bool BoundCastExpression::CastIsInvertible(const LogicalType &source_type, const default: break; } - } - if (source_type.id() == LogicalTypeId::VARCHAR) { + break; + case LogicalTypeId::VARCHAR: switch (target_type.id()) { case LogicalTypeId::TIMESTAMP: case LogicalTypeId::TIMESTAMP_NS: @@ -290893,6 +293326,9 @@ bool BoundCastExpression::CastIsInvertible(const LogicalType &source_type, const default: return false; } + break; + default: + break; } if (target_type.id() == LogicalTypeId::VARCHAR) { switch (source_type.id()) { @@ -291111,6 +293547,28 @@ unique_ptr BoundConstantExpression::Copy() { } // namespace duckdb +namespace duckdb { + +BoundExpandedExpression::BoundExpandedExpression(vector> expanded_expressions_p) + : Expression(ExpressionType::BOUND_EXPANDED, ExpressionClass::BOUND_EXPANDED, LogicalType::INTEGER), + expanded_expressions(std::move(expanded_expressions_p)) { +} + +string BoundExpandedExpression::ToString() const { + return "BOUND_EXPANDED"; +} + +bool BoundExpandedExpression::Equals(const BaseExpression &other_p) const { + return false; +} + +unique_ptr BoundExpandedExpression::Copy() { + throw SerializationException("Cannot copy BoundExpandedExpression"); +} + +} // namespace duckdb + + namespace duckdb { BoundExpression::BoundExpression(unique_ptr expr_p) @@ -292015,29 +294473,23 @@ BindResult AlterBinder::BindColumn(ColumnRefExpression &colref) { - namespace duckdb { -BaseSelectBinder::BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, - BoundGroupInformation &info, case_insensitive_map_t alias_map) - : ExpressionBinder(binder, context), inside_window(false), node(node), info(info), alias_map(std::move(alias_map)) { -} - BaseSelectBinder::BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) - : BaseSelectBinder(binder, context, node, info, case_insensitive_map_t()) { + : ExpressionBinder(binder, context), inside_window(false), node(node), info(info) { } BindResult BaseSelectBinder::BindExpression(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { auto &expr = *expr_ptr; // check if the expression binds to one of the groups - auto group_index = TryBindGroup(expr, depth); + auto group_index = TryBindGroup(expr); if (group_index != DConstants::INVALID_INDEX) { return BindGroup(expr, depth, group_index); } switch (expr.expression_class) { case ExpressionClass::COLUMN_REF: - return BindColumnRef(expr_ptr, depth); + return BindColumnRef(expr_ptr, depth, root_expression); case ExpressionClass::DEFAULT: return BindResult("SELECT clause cannot contain DEFAULT clause"); case ExpressionClass::WINDOW: @@ -292047,7 +294499,7 @@ BindResult BaseSelectBinder::BindExpression(unique_ptr &expr_p } } -idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr, idx_t depth) { +idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr) { // first check the group alias map, if expr is a ColumnRefExpression if (expr.type == ExpressionType::COLUMN_REF) { auto &colref = expr.Cast(); @@ -292066,50 +294518,16 @@ idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr, idx_t depth) { return entry->second; } #ifdef DEBUG - for (auto entry : info.map) { - D_ASSERT(!entry.first.get().Equals(expr)); - D_ASSERT(!expr.Equals(entry.first.get())); + for (auto map_entry : info.map) { + D_ASSERT(!map_entry.first.get().Equals(expr)); + D_ASSERT(!expr.Equals(map_entry.first.get())); } #endif return DConstants::INVALID_INDEX; } -BindResult BaseSelectBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth) { - // first try to bind the column reference regularly - auto result = ExpressionBinder::BindExpression(expr_ptr, depth); - if (!result.HasError()) { - return result; - } - // binding failed - // check in the alias map - auto &colref = (expr_ptr.get())->Cast(); - if (!colref.IsQualified()) { - auto alias_entry = alias_map.find(colref.column_names[0]); - if (alias_entry != alias_map.end()) { - // found entry! - auto index = alias_entry->second; - if (index >= node.select_list.size()) { - throw BinderException("Column \"%s\" referenced that exists in the SELECT clause - but this column " - "cannot be referenced before it is defined", - colref.column_names[0]); - } - if (node.select_list[index]->IsVolatile()) { - throw BinderException("Alias \"%s\" referenced in a SELECT clause - but the expression has side " - "effects. This is not yet supported.", - colref.column_names[0]); - } - if (node.select_list[index]->HasSubquery()) { - throw BinderException("Alias \"%s\" referenced in a SELECT clause - but the expression has a subquery." - " This is not yet supported.", - colref.column_names[0]); - } - auto copied_expression = node.original_expressions[index]->Copy(); - result = BindExpression(copied_expression, depth, false); - return result; - } - } - // entry was not found in the alias map: return the original error - return result; +BindResult BaseSelectBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { + return ExpressionBinder::BindExpression(expr_ptr, depth); } BindResult BaseSelectBinder::BindGroupingFunction(OperatorExpression &op, idx_t depth) { @@ -292126,7 +294544,7 @@ BindResult BaseSelectBinder::BindGroupingFunction(OperatorExpression &op, idx_t group_indexes.reserve(op.children.size()); for (auto &child : op.children) { ExpressionBinder::QualifyColumnNames(binder, child); - auto idx = TryBindGroup(*child, depth); + auto idx = TryBindGroup(*child); if (idx == DConstants::INVALID_INDEX) { return BindResult(BinderException(op, "GROUPING child \"%s\" must be a grouping column", child->GetName())); } @@ -292152,13 +294570,6 @@ BindResult BaseSelectBinder::BindGroup(ParsedExpression &expr, idx_t depth, idx_ } } -bool BaseSelectBinder::QualifyColumnAlias(const ColumnRefExpression &colref) { - if (!colref.IsQualified()) { - return alias_map.find(colref.column_names[0]) != alias_map.end(); - } - return false; -} - } // namespace duckdb @@ -292247,8 +294658,7 @@ BindResult CheckBinder::BindCheckColumn(ColumnRefExpression &colref) { namespace duckdb { -ColumnAliasBinder::ColumnAliasBinder(BoundSelectNode &node, const case_insensitive_map_t &alias_map) - : node(node), alias_map(alias_map), visited_select_indexes() { +ColumnAliasBinder::ColumnAliasBinder(SelectBindState &bind_state) : bind_state(bind_state), visited_select_indexes() { } bool ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, unique_ptr &expr_ptr, @@ -292263,8 +294673,8 @@ bool ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, unique_ptr } // We try to find the alias in the alias_map and return false, if no alias exists. - auto alias_entry = alias_map.find(expr.column_names[0]); - if (alias_entry == alias_map.end()) { + auto alias_entry = bind_state.alias_map.find(expr.column_names[0]); + if (alias_entry == bind_state.alias_map.end()) { return false; } @@ -292274,12 +294684,10 @@ bool ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, unique_ptr } // We found an alias, so we copy the alias expression into this expression. - auto original_expr = node.original_expressions[alias_entry->second]->Copy(); + auto original_expr = bind_state.BindAlias(alias_entry->second); expr_ptr = std::move(original_expr); visited_select_indexes.insert(alias_entry->second); - // Since the alias has been found, we pass a depth of 0. See issue 4978 (#16). - // Only HAVING, QUALIFY, and WHERE binders contain ColumnAliasBinders. result = enclosing_binder.BindExpression(expr_ptr, depth, root_expression); visited_select_indexes.erase(alias_entry->second); return true; @@ -292333,11 +294741,12 @@ string ConstantBinder::UnsupportedAggregateMessage() { + namespace duckdb { GroupBinder::GroupBinder(Binder &binder, ClientContext &context, SelectNode &node, idx_t group_index, - case_insensitive_map_t &alias_map, case_insensitive_map_t &group_alias_map) - : ExpressionBinder(binder, context), node(node), alias_map(alias_map), group_alias_map(group_alias_map), + SelectBindState &bind_state, case_insensitive_map_t &group_alias_map) + : ExpressionBinder(binder, context), node(node), bind_state(bind_state), group_alias_map(group_alias_map), group_index(group_index) { } @@ -292421,8 +294830,8 @@ BindResult GroupBinder::BindColumnRef(ColumnRefExpression &colref) { // failed to bind the column and the node is the root expression with depth = 0 // check if refers to an alias in the select clause auto alias_name = colref.column_names[0]; - auto entry = alias_map.find(alias_name); - if (entry == alias_map.end()) { + auto entry = bind_state.alias_map.find(alias_name); + if (entry == bind_state.alias_map.end()) { // no matching alias found return result; } @@ -292446,14 +294855,13 @@ BindResult GroupBinder::BindColumnRef(ColumnRefExpression &colref) { namespace duckdb { HavingBinder::HavingBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map, AggregateHandling aggregate_handling) - : BaseSelectBinder(binder, context, node, info), column_alias_binder(node, alias_map), + AggregateHandling aggregate_handling) + : BaseSelectBinder(binder, context, node, info), column_alias_binder(node.bind_state), aggregate_handling(aggregate_handling) { target_type = LogicalType(LogicalTypeId::BOOLEAN); } BindResult HavingBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - // Keep the original column name to return a meaningful error message. auto column_name = expr_ptr->Cast().GetColumnName(); @@ -292474,7 +294882,7 @@ BindResult HavingBinder::BindColumnRef(unique_ptr &expr_ptr, i "Having clause cannot reference column \"%s\" in correlated subquery and group by all", column_name); } - auto expr = duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); + auto expr = duckdb::BaseSelectBinder::BindColumnRef(expr_ptr, depth, root_expression); if (expr.HasError()) { return expr; } @@ -292491,21 +294899,8 @@ BindResult HavingBinder::BindColumnRef(unique_ptr &expr_ptr, i "column %s must appear in the GROUP BY clause or be used in an aggregate function", column_name)); } -BindResult HavingBinder::BindExpression(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - auto &expr = *expr_ptr; - // check if the expression binds to one of the groups - auto group_index = TryBindGroup(expr, depth); - if (group_index != DConstants::INVALID_INDEX) { - return BindGroup(expr, depth, group_index); - } - switch (expr.expression_class) { - case ExpressionClass::WINDOW: - return BindResult("HAVING clause cannot contain window functions!"); - case ExpressionClass::COLUMN_REF: - return BindColumnRef(expr_ptr, depth, root_expression); - default: - return duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); - } +BindResult HavingBinder::BindWindow(WindowExpression &expr, idx_t depth) { + return BindResult("HAVING clause cannot contain window functions!"); } } // namespace duckdb @@ -292649,11 +295044,6 @@ static void ReduceColumnDepth(vector &columns, } } -static void ReduceExpressionSubquery(BoundSubqueryExpression &expr, - const vector &correlated_columns) { - ReduceColumnDepth(expr.binder->correlated_columns, correlated_columns); -} - class ExpressionDepthReducerRecursive : public BoundNodeVisitor { public: explicit ExpressionDepthReducerRecursive(const vector &correlated) @@ -292679,6 +295069,13 @@ class ExpressionDepthReducerRecursive : public BoundNodeVisitor { BoundNodeVisitor::VisitBoundTableRef(ref); } + static void ReduceExpressionSubquery(BoundSubqueryExpression &expr, + const vector &correlated_columns) { + ReduceColumnDepth(expr.binder->correlated_columns, correlated_columns); + ExpressionDepthReducerRecursive recursive(correlated_columns); + recursive.VisitBoundQueryNode(*expr.subquery); + } + private: const vector &correlated_columns; }; @@ -292695,9 +295092,7 @@ class ExpressionDepthReducer : public LogicalOperatorVisitor { } unique_ptr VisitReplace(BoundSubqueryExpression &expr, unique_ptr *expr_ptr) override { - ReduceExpressionSubquery(expr, correlated_columns); - ExpressionDepthReducerRecursive recursive(correlated_columns); - recursive.VisitBoundQueryNode(*expr.subquery); + ExpressionDepthReducerRecursive::ReduceExpressionSubquery(expr, correlated_columns); return nullptr; } @@ -292722,23 +295117,21 @@ void LateralBinder::ReduceExpressionDepth(LogicalOperator &op, const vector binders, idx_t projection_index, case_insensitive_map_t &alias_map, - parsed_expression_map_t &projection_map, idx_t max_count) - : binders(std::move(binders)), projection_index(projection_index), max_count(max_count), extra_list(nullptr), - alias_map(alias_map), projection_map(projection_map) { +OrderBinder::OrderBinder(vector binders, SelectBindState &bind_state) + : binders(std::move(binders)), extra_list(nullptr), bind_state(bind_state) { } -OrderBinder::OrderBinder(vector binders, idx_t projection_index, SelectNode &node, - case_insensitive_map_t &alias_map, parsed_expression_map_t &projection_map) - : binders(std::move(binders)), projection_index(projection_index), alias_map(alias_map), - projection_map(projection_map) { - this->max_count = node.select_list.size(); +OrderBinder::OrderBinder(vector binders, SelectNode &node, SelectBindState &bind_state) + : binders(std::move(binders)), bind_state(bind_state) { this->extra_list = &node.select_list; } -unique_ptr OrderBinder::CreateProjectionReference(ParsedExpression &expr, const idx_t index, - const LogicalType &logical_type) { +unique_ptr OrderBinder::CreateProjectionReference(ParsedExpression &expr, const idx_t index) { string alias; if (extra_list && index < extra_list->size()) { alias = extra_list->at(index)->ToString(); @@ -292747,15 +295140,18 @@ unique_ptr OrderBinder::CreateProjectionReference(ParsedExpression & alias = expr.alias; } } - return make_uniq(std::move(alias), logical_type, ColumnBinding(projection_index, index)); + auto result = make_uniq(Value::UBIGINT(index)); + result->alias = std::move(alias); + result->query_location = expr.query_location; + return std::move(result); } unique_ptr OrderBinder::CreateExtraReference(unique_ptr expr) { if (!extra_list) { throw InternalException("CreateExtraReference called without extra_list"); } - projection_map[*expr] = extra_list->size(); - auto result = CreateProjectionReference(*expr, extra_list->size(), LogicalType::INVALID); + bind_state.projection_map[*expr] = extra_list->size(); + auto result = CreateProjectionReference(*expr, extra_list->size()); extra_list->push_back(std::move(expr)); return result; } @@ -292769,8 +295165,14 @@ unique_ptr OrderBinder::BindConstant(ParsedExpression &expr, const V return nullptr; } // INTEGER constant: we use the integer as an index into the select list (e.g. ORDER BY 1) - auto index = (idx_t)val.GetValue(); - return CreateProjectionReference(expr, index - 1, LogicalType::ANY); + auto order_value = val.GetValue(); + auto index = order_value <= 0 ? NumericLimits::Maximum() : idx_t(order_value - 1); + child_list_t values; + values.push_back(make_pair("index", Value::UBIGINT(index))); + auto result = make_uniq(Value::STRUCT(std::move(values))); + result->alias = std::move(expr.alias); + result->query_location = expr.query_location; + return std::move(result); } unique_ptr OrderBinder::Bind(unique_ptr expr) { @@ -292795,23 +295197,32 @@ unique_ptr OrderBinder::Bind(unique_ptr expr) { break; } // check the alias list - auto entry = alias_map.find(colref.column_names[0]); - if (entry != alias_map.end()) { + auto entry = bind_state.alias_map.find(colref.column_names[0]); + if (entry != bind_state.alias_map.end()) { // it does! point it to that entry - return CreateProjectionReference(*expr, entry->second, LogicalType::INVALID); + return CreateProjectionReference(*expr, entry->second); } break; } case ExpressionClass::POSITIONAL_REFERENCE: { auto &posref = expr->Cast(); - if (posref.index < 1 || posref.index > max_count) { - throw BinderException("ORDER term out of range - should be between 1 and %lld", (idx_t)max_count); - } - return CreateProjectionReference(*expr, posref.index - 1, LogicalType::ANY); + return CreateProjectionReference(*expr, posref.index - 1); } case ExpressionClass::PARAMETER: { throw ParameterNotAllowedException("Parameter not supported in ORDER BY clause"); } + case ExpressionClass::COLLATE: { + auto &collation = expr->Cast(); + if (collation.child->expression_class == ExpressionClass::CONSTANT) { + auto &constant = collation.child->Cast(); + auto index = NumericCast(constant.value.GetValue()) - 1; + child_list_t values; + values.push_back(make_pair("index", Value::UBIGINT(index))); + values.push_back(make_pair("collation", Value(std::move(collation.collation)))); + return make_uniq(Value::STRUCT(std::move(values))); + } + break; + } default: break; } @@ -292821,14 +295232,14 @@ unique_ptr OrderBinder::Bind(unique_ptr expr) { ExpressionBinder::QualifyColumnNames(*binder, expr); } // first check if the ORDER BY clause already points to an entry in the projection list - auto entry = projection_map.find(*expr); - if (entry != projection_map.end()) { + auto entry = bind_state.projection_map.find(*expr); + if (entry != bind_state.projection_map.end()) { if (entry->second == DConstants::INVALID_INDEX) { throw BinderException("Ambiguous reference to column"); } // there is a matching entry in the projection list // just point to that entry - return CreateProjectionReference(*expr, entry->second, LogicalType::INVALID); + return CreateProjectionReference(*expr, entry->second); } if (!extra_list) { // no extra list specified: we cannot push an extra ORDER BY clause @@ -292852,15 +295263,13 @@ unique_ptr OrderBinder::Bind(unique_ptr expr) { namespace duckdb { -QualifyBinder::QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map) - : BaseSelectBinder(binder, context, node, info), column_alias_binder(node, alias_map) { +QualifyBinder::QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) + : BaseSelectBinder(binder, context, node, info), column_alias_binder(node.bind_state) { target_type = LogicalType(LogicalTypeId::BOOLEAN); } BindResult QualifyBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - - auto result = duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); + auto result = duckdb::BaseSelectBinder::BindColumnRef(expr_ptr, depth, root_expression); if (!result.HasError()) { return result; } @@ -292879,23 +295288,6 @@ BindResult QualifyBinder::BindColumnRef(unique_ptr &expr_ptr, StringUtil::Format("Referenced column %s not found in FROM clause and can't find in alias map.", expr_string)); } -BindResult QualifyBinder::BindExpression(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - auto &expr = *expr_ptr; - // check if the expression binds to one of the groups - auto group_index = TryBindGroup(expr, depth); - if (group_index != DConstants::INVALID_INDEX) { - return BindGroup(expr, depth, group_index); - } - switch (expr.expression_class) { - case ExpressionClass::WINDOW: - return BindWindow(expr.Cast(), depth); - case ExpressionClass::COLUMN_REF: - return BindColumnRef(expr_ptr, depth, root_expression); - default: - return duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); - } -} - } // namespace duckdb //===----------------------------------------------------------------------===// // DuckDB @@ -292981,15 +295373,105 @@ BindResult ReturningBinder::BindExpression(unique_ptr &expr_pt } // namespace duckdb + namespace duckdb { -SelectBinder::SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t alias_map) - : BaseSelectBinder(binder, context, node, info, std::move(alias_map)) { +unique_ptr SelectBindState::BindAlias(idx_t index) { + if (volatile_expressions.find(index) != volatile_expressions.end()) { + throw BinderException("Alias \"%s\" referenced - but the expression has side " + "effects. This is not yet supported.", + original_expressions[index]->alias); + } + referenced_aliases.insert(index); + return original_expressions[index]->Copy(); +} + +void SelectBindState::SetExpressionIsVolatile(idx_t index) { + // check if this expression has been referenced before + if (referenced_aliases.find(index) != referenced_aliases.end()) { + throw BinderException("Alias \"%s\" referenced - but the expression has side " + "effects. This is not yet supported.", + original_expressions[index]->alias); + } + volatile_expressions.insert(index); +} + +void SelectBindState::SetExpressionHasSubquery(idx_t index) { + subquery_expressions.insert(index); +} + +bool SelectBindState::AliasHasSubquery(idx_t index) const { + return subquery_expressions.find(index) != subquery_expressions.end(); } +void SelectBindState::AddExpandedColumn(idx_t expand_count) { + if (expanded_column_indices.empty()) { + expanded_column_indices.push_back(0); + } + expanded_column_indices.push_back(expanded_column_indices.back() + expand_count); +} + +void SelectBindState::AddRegularColumn() { + AddExpandedColumn(1); +} + +idx_t SelectBindState::GetFinalIndex(idx_t index) const { + if (index >= expanded_column_indices.size()) { + return index; + } + return expanded_column_indices[index]; +} + +} // namespace duckdb + + + + +namespace duckdb { + SelectBinder::SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) - : SelectBinder(binder, context, node, info, case_insensitive_map_t()) { + : BaseSelectBinder(binder, context, node, info) { +} + +BindResult SelectBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { + // first try to bind the column reference regularly + auto result = BaseSelectBinder::BindColumnRef(expr_ptr, depth, root_expression); + if (!result.HasError()) { + return result; + } + // binding failed + // check in the alias map + auto &colref = (expr_ptr.get())->Cast(); + if (!colref.IsQualified()) { + auto &bind_state = node.bind_state; + auto alias_entry = node.bind_state.alias_map.find(colref.column_names[0]); + if (alias_entry != node.bind_state.alias_map.end()) { + // found entry! + auto index = alias_entry->second; + if (index >= node.bound_column_count) { + throw BinderException("Column \"%s\" referenced that exists in the SELECT clause - but this column " + "cannot be referenced before it is defined", + colref.column_names[0]); + } + if (bind_state.AliasHasSubquery(index)) { + throw BinderException("Alias \"%s\" referenced in a SELECT clause - but the expression has a subquery." + " This is not yet supported.", + colref.column_names[0]); + } + auto copied_expression = node.bind_state.BindAlias(index); + result = BindExpression(copied_expression, depth, false); + return result; + } + } + // entry was not found in the alias map: return the original error + return result; +} + +bool SelectBinder::QualifyColumnAlias(const ColumnRefExpression &colref) { + if (!colref.IsQualified()) { + return node.bind_state.alias_map.find(colref.column_names[0]) != node.bind_state.alias_map.end(); + } + return false; } } // namespace duckdb @@ -293000,7 +295482,8 @@ SelectBinder::SelectBinder(Binder &binder, ClientContext &context, BoundSelectNo namespace duckdb { -TableFunctionBinder::TableFunctionBinder(Binder &binder, ClientContext &context) : ExpressionBinder(binder, context) { +TableFunctionBinder::TableFunctionBinder(Binder &binder, ClientContext &context, string table_function_name_p) + : ExpressionBinder(binder, context), table_function_name(std::move(table_function_name_p)) { } BindResult TableFunctionBinder::BindLambdaReference(LambdaRefExpression &expr, idx_t depth) { @@ -293009,23 +295492,34 @@ BindResult TableFunctionBinder::BindLambdaReference(LambdaRefExpression &expr, i return (*lambda_bindings)[expr.lambda_idx].Bind(lambda_ref, depth); } -BindResult TableFunctionBinder::BindColumnReference(ColumnRefExpression &expr, idx_t depth, bool root_expression) { - +BindResult TableFunctionBinder::BindColumnReference(unique_ptr &expr_ptr, idx_t depth, + bool root_expression) { // try binding as a lambda parameter - auto &col_ref = expr.Cast(); + auto &col_ref = expr_ptr->Cast(); if (!col_ref.IsQualified()) { auto lambda_ref = LambdaRefExpression::FindMatchingBinding(lambda_bindings, col_ref.GetName()); if (lambda_ref) { return BindLambdaReference(lambda_ref->Cast(), depth); } } + auto column_names = col_ref.column_names; + auto result_name = StringUtil::Join(column_names, "."); + if (!table_function_name.empty()) { + // check if this is a lateral join column/parameter + auto result = BindCorrelatedColumns(expr_ptr, ErrorData("error")); + if (!result.HasError()) { + // it is a lateral join parameter - this is not supported in this type of table function + throw BinderException("Table function \"%s\" does not support lateral join column parameters - cannot use " + "column \"%s\" in this context", + table_function_name, result_name); + } + } - auto value_function = ExpressionBinder::GetSQLValueFunction(expr.GetColumnName()); + auto value_function = ExpressionBinder::GetSQLValueFunction(column_names.back()); if (value_function) { return BindExpression(value_function, depth, root_expression); } - auto result_name = StringUtil::Join(expr.column_names, "."); return BindResult(make_uniq(Value(result_name))); } @@ -293036,7 +295530,7 @@ BindResult TableFunctionBinder::BindExpression(unique_ptr &exp case ExpressionClass::LAMBDA_REF: return BindLambdaReference(expr.Cast(), depth); case ExpressionClass::COLUMN_REF: - return BindColumnReference(expr.Cast(), depth, root_expression); + return BindColumnReference(expr_ptr, depth, root_expression); case ExpressionClass::SUBQUERY: throw BinderException("Table function cannot contain subqueries"); case ExpressionClass::DEFAULT: @@ -294043,6 +296537,23 @@ vector LogicalOperator::GetColumnBindings() { return {ColumnBinding(0, 0)}; } +// LCOV_EXCL_START +string LogicalOperator::ColumnBindingsToString(const vector &bindings) { + string result = "{"; + for (idx_t i = 0; i < bindings.size(); i++) { + if (i != 0) { + result += ", "; + } + result += bindings[i].ToString(); + } + return result + "}"; +} + +void LogicalOperator::PrintColumnBindings() { + Printer::Print(ColumnBindingsToString(GetColumnBindings())); +} +// LCOV_EXCL_STOP + string LogicalOperator::GetName() const { return LogicalOperatorToString(type); } @@ -294640,28 +297151,18 @@ string LogicalComparisonJoin::ParamsToString() const { - namespace duckdb { -CopyDatabaseInfo::CopyDatabaseInfo(Catalog &from_database, Catalog &to_database) - : from_database(from_database), to_database(to_database) { -} - -CopyDatabaseInfo::~CopyDatabaseInfo() { -} - LogicalCopyDatabase::LogicalCopyDatabase(unique_ptr info_p) : LogicalOperator(LogicalOperatorType::LOGICAL_COPY_DATABASE), info(std::move(info_p)) { } -LogicalCopyDatabase::~LogicalCopyDatabase() { +LogicalCopyDatabase::LogicalCopyDatabase(unique_ptr info_p) + : LogicalOperator(LogicalOperatorType::LOGICAL_COPY_DATABASE), + info(unique_ptr_cast(std::move(info_p))) { } -void LogicalCopyDatabase::Serialize(Serializer &serializer) const { - throw NotImplementedException("LogicalCopyDatabase::Serialize"); -} -unique_ptr LogicalCopyDatabase::Deserialize(Deserializer &deserializer) { - throw NotImplementedException("LogicalCopyDatabase::Deserialize"); +LogicalCopyDatabase::~LogicalCopyDatabase() { } void LogicalCopyDatabase::ResolveTypes() { @@ -294922,7 +297423,7 @@ LogicalDelete::LogicalDelete(TableCatalogEntry &table, idx_t table_index) LogicalDelete::LogicalDelete(ClientContext &context, const unique_ptr &table_info) : LogicalOperator(LogicalOperatorType::LOGICAL_DELETE), table(Catalog::GetEntry(context, table_info->catalog, table_info->schema, - dynamic_cast(*table_info).table)) { + table_info->Cast().table)) { } idx_t LogicalDelete::EstimateCardinality(ClientContext &context) { @@ -295341,7 +297842,7 @@ unique_ptr LogicalGet::Deserialize(Deserializer &deserializer) deserializer.ReadProperty(208, "input_table_types", result->input_table_types); deserializer.ReadProperty(209, "input_table_names", result->input_table_names); TableFunctionBindInput input(result->parameters, result->named_parameters, result->input_table_types, - result->input_table_names, function.function_info.get()); + result->input_table_names, function.function_info.get(), nullptr); vector bind_return_types; vector bind_names; @@ -295396,7 +297897,7 @@ LogicalInsert::LogicalInsert(TableCatalogEntry &table, idx_t table_index) LogicalInsert::LogicalInsert(ClientContext &context, const unique_ptr table_info) : LogicalOperator(LogicalOperatorType::LOGICAL_INSERT), table(Catalog::GetEntry(context, table_info->catalog, table_info->schema, - dynamic_cast(*table_info).table)) { + table_info->Cast().table)) { } idx_t LogicalInsert::EstimateCardinality(ClientContext &context) { @@ -295903,7 +298404,7 @@ LogicalUpdate::LogicalUpdate(TableCatalogEntry &table) LogicalUpdate::LogicalUpdate(ClientContext &context, const unique_ptr &table_info) : LogicalOperator(LogicalOperatorType::LOGICAL_UPDATE), table(Catalog::GetEntry(context, table_info->catalog, table_info->schema, - dynamic_cast(*table_info).table)) { + table_info->Cast().table)) { } idx_t LogicalUpdate::EstimateCardinality(ClientContext &context) { @@ -295939,6 +298440,71 @@ string LogicalUpdate::GetName() const { + + + +namespace duckdb { + +LogicalVacuum::LogicalVacuum() : LogicalOperator(LogicalOperatorType::LOGICAL_VACUUM) { +} + +LogicalVacuum::LogicalVacuum(unique_ptr info) + : LogicalOperator(LogicalOperatorType::LOGICAL_VACUUM), info(std::move(info)) { +} + +TableCatalogEntry &LogicalVacuum::GetTable() { + D_ASSERT(HasTable()); + return *table; +} +bool LogicalVacuum::HasTable() const { + return table != nullptr; +} + +void LogicalVacuum::SetTable(TableCatalogEntry &table_p) { + table = &table_p; +} + +void LogicalVacuum::Serialize(Serializer &serializer) const { + LogicalOperator::Serialize(serializer); + + serializer.WriteProperty(200, "info", info); + serializer.WriteProperty(201, "column_id_map", column_id_map); +} + +unique_ptr LogicalVacuum::Deserialize(Deserializer &deserializer) { + auto result = unique_ptr(new LogicalVacuum()); + + auto tmp_info = deserializer.ReadPropertyWithDefault>(200, "info"); + deserializer.ReadProperty(201, "column_id_map", result->column_id_map); + + result->info = unique_ptr_cast(std::move(tmp_info)); + auto &info = *result->info; + if (info.has_table) { + // deserialize the 'table' + auto &context = deserializer.Get(); + auto binder = Binder::CreateBinder(context); + auto bound_table = binder->Bind(*info.ref); + if (bound_table->type != TableReferenceType::BASE_TABLE) { + throw InvalidInputException("Can only vacuum/analyze base tables!"); + } + auto ref = unique_ptr_cast(std::move(bound_table)); + auto &table = ref->table; + result->SetTable(table); + // FIXME: we should probably verify that the 'column_id_map' and 'columns' are the same on the bound table after + // deserialization? + } + return std::move(result); +} + +idx_t LogicalVacuum::EstimateCardinality(ClientContext &context) { + return 1; +} + +} // namespace duckdb + + + + namespace duckdb { vector LogicalWindow::GetColumnBindings() { @@ -296154,10 +298720,10 @@ void Planner::VerifyPlan(ClientContext &context, unique_ptr &op *map = std::move(parameters); } op = std::move(new_plan); - } catch (SerializationException &ex) { - // pass - } catch (NotImplementedException &ex) { - // pass + } catch (SerializationException &ex) { // NOLINT: explicitly allowing these errors (for now) + // pass + } catch (NotImplementedException &ex) { // NOLINT: explicitly allowing these errors (for now) + // pass } } @@ -296389,21 +298955,20 @@ FlattenDependentJoins::FlattenDependentJoins(Binder &binder, const vectortype == LogicalOperatorType::LOGICAL_DEPENDENT_JOIN) { + if (op.type == LogicalOperatorType::LOGICAL_DEPENDENT_JOIN) { is_lateral_join = true; } HasCorrelatedExpressions visitor(correlated_columns, lateral, lateral_depth); - visitor.VisitOperator(*op); + visitor.VisitOperator(op); bool has_correlation = visitor.has_correlated_expressions; int child_idx = 0; // now visit the children of this entry and check if they have correlated expressions - for (auto &child : op->children) { + for (auto &child : op.children) { auto new_lateral_depth = lateral_depth; if (is_lateral_join && child_idx == 1) { new_lateral_depth = lateral_depth + 1; @@ -296411,7 +298976,7 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo // we OR the property with its children such that has_correlation is true if either // (1) this node has a correlated expression or // (2) one of its children has a correlated expression - if (DetectCorrelatedExpressions(child.get(), lateral, new_lateral_depth)) { + if (DetectCorrelatedExpressions(*child, lateral, new_lateral_depth)) { has_correlation = true; } child_idx++; @@ -296422,10 +298987,10 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo // If we detect correlation in a materialized or recursive CTE, the entire right side of the operator // needs to be marked as correlated. Otherwise, function PushDownDependentJoinInternal does not do the // right thing. - if (op->type == LogicalOperatorType::LOGICAL_MATERIALIZED_CTE || - op->type == LogicalOperatorType::LOGICAL_RECURSIVE_CTE) { + if (op.type == LogicalOperatorType::LOGICAL_MATERIALIZED_CTE || + op.type == LogicalOperatorType::LOGICAL_RECURSIVE_CTE) { if (has_correlation) { - MarkSubtreeCorrelated(*op->children[1].get()); + MarkSubtreeCorrelated(*op.children[1].get()); } } return has_correlation; @@ -296433,7 +298998,7 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo bool FlattenDependentJoins::MarkSubtreeCorrelated(LogicalOperator &op) { // Do not mark base table scans as correlated - auto entry = has_correlated_expressions.find(&op); + auto entry = has_correlated_expressions.find(op); D_ASSERT(entry != has_correlated_expressions.end()); bool has_correlation = entry->second; for (auto &child : op.children) { @@ -296441,10 +299006,10 @@ bool FlattenDependentJoins::MarkSubtreeCorrelated(LogicalOperator &op) { } if (op.type != LogicalOperatorType::LOGICAL_GET || op.children.size() == 1) { if (op.type == LogicalOperatorType::LOGICAL_CTE_REF) { - has_correlated_expressions[&op] = true; + has_correlated_expressions[op] = true; return true; } else { - has_correlated_expressions[&op] = has_correlation; + has_correlated_expressions[op] = has_correlation; } } return has_correlation; @@ -296461,17 +299026,17 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoin(unique_ return result; } -bool SubqueryDependentFilter(Expression *expr) { - if (expr->expression_class == ExpressionClass::BOUND_CONJUNCTION && - expr->GetExpressionType() == ExpressionType::CONJUNCTION_AND) { - auto &bound_conjuction = expr->Cast(); +bool SubqueryDependentFilter(Expression &expr) { + if (expr.expression_class == ExpressionClass::BOUND_CONJUNCTION && + expr.GetExpressionType() == ExpressionType::CONJUNCTION_AND) { + auto &bound_conjuction = expr.Cast(); for (auto &child : bound_conjuction.children) { - if (SubqueryDependentFilter(child.get())) { + if (SubqueryDependentFilter(*child)) { return true; } } } - if (expr->expression_class == ExpressionClass::BOUND_SUBQUERY) { + if (expr.expression_class == ExpressionClass::BOUND_SUBQUERY) { return true; } return false; @@ -296481,7 +299046,7 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal bool &parent_propagate_null_values, idx_t lateral_depth) { // first check if the logical operator has correlated expressions - auto entry = has_correlated_expressions.find(plan.get()); + auto entry = has_correlated_expressions.find(*plan); D_ASSERT(entry != has_correlated_expressions.end()); if (!entry->second) { // we reached a node without correlated expressions @@ -296513,7 +299078,7 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal // filter // first we flatten the dependent join in the child of the filter for (auto &expr : plan->expressions) { - any_join |= SubqueryDependentFilter(expr.get()); + any_join |= SubqueryDependentFilter(*expr); } plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth); @@ -296650,8 +299215,8 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: { // cross product // push into both sides of the plan - bool left_has_correlation = has_correlated_expressions.find(plan->children[0].get())->second; - bool right_has_correlation = has_correlated_expressions.find(plan->children[1].get())->second; + bool left_has_correlation = has_correlated_expressions.find(*plan->children[0])->second; + bool right_has_correlation = has_correlated_expressions.find(*plan->children[1])->second; if (!right_has_correlation) { // only left has correlation: push into left plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), @@ -296712,8 +299277,8 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal auto &join = plan->Cast(); D_ASSERT(plan->children.size() == 2); // check the correlated expressions in the children of the join - bool left_has_correlation = has_correlated_expressions.find(plan->children[0].get())->second; - bool right_has_correlation = has_correlated_expressions.find(plan->children[1].get())->second; + bool left_has_correlation = has_correlated_expressions.find(*plan->children[0])->second; + bool right_has_correlation = has_correlated_expressions.find(*plan->children[1])->second; if (join.join_type == JoinType::INNER) { // inner join @@ -296795,12 +299360,12 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal auto &comparison_join = join.Cast(); comparison_join.conditions.push_back(std::move(cond)); } else { - auto &any_join = join.Cast(); + auto &logical_any_join = join.Cast(); auto comparison = make_uniq(ExpressionType::COMPARE_NOT_DISTINCT_FROM, std::move(left), std::move(right)); auto conjunction = make_uniq( - ExpressionType::CONJUNCTION_AND, std::move(comparison), std::move(any_join.condition)); - any_join.condition = std::move(conjunction); + ExpressionType::CONJUNCTION_AND, std::move(comparison), std::move(logical_any_join.condition)); + logical_any_join.condition = std::move(conjunction); } } // then we replace any correlated expressions with the corresponding entry in the correlated_map @@ -297751,11 +300316,20 @@ data_ptr_t ArenaAllocator::Reallocate(data_ptr_t pointer, idx_t old_size, idx_t } } +void ArenaAllocator::AlignNext() { + if (head && !ValueIsAligned(head->current_position)) { + // move the current position forward so that the next allocation is aligned + head->current_position = AlignValue(head->current_position); + } +} + data_ptr_t ArenaAllocator::AllocateAligned(idx_t size) { + AlignNext(); return Allocate(AlignValue(size)); } data_ptr_t ArenaAllocator::ReallocateAligned(data_ptr_t pointer, idx_t old_size, idx_t size) { + AlignNext(); return Reallocate(pointer, old_size, AlignValue(size)); } @@ -298485,7 +301059,7 @@ void BufferPoolReservation::Resize(idx_t new_size) { size = new_size; } -void BufferPoolReservation::Merge(BufferPoolReservation &&src) { +void BufferPoolReservation::Merge(BufferPoolReservation src) { size += src.size; src.size = 0; } @@ -298501,10 +301075,6 @@ void BufferPoolReservation::Merge(BufferPoolReservation &&src) { namespace duckdb { -unique_ptr BufferManager::CreateStandardBufferManager(DatabaseInstance &db, DBConfig &config) { - return make_uniq(db, config.options.temporary_directory); -} - shared_ptr BufferManager::RegisterSmallMemory(idx_t block_size) { throw NotImplementedException("This type of BufferManager can not create 'small-memory' blocks"); } @@ -298528,7 +301098,7 @@ vector BufferManager::GetTemporaryFiles() { throw InternalException("This type of BufferManager does not allow temporary files"); } -const string &BufferManager::GetTemporaryDirectory() { +const string &BufferManager::GetTemporaryDirectory() const { throw InternalException("This type of BufferManager does not allow a temporary directory"); } @@ -298544,10 +301114,6 @@ void BufferManager::SetTemporaryDirectory(const string &new_dir) { throw NotImplementedException("This type of BufferManager can not set a temporary directory"); } -DatabaseInstance &BufferManager::GetDatabase() { - throw NotImplementedException("This type of BufferManager is not linked to a DatabaseInstance"); -} - bool BufferManager::HasTemporaryDirectory() const { return false; } @@ -298557,7 +301123,7 @@ idx_t BufferManager::GetQueryMaxMemory() const { return GetBufferPool().GetQueryMaxMemory(); } -unique_ptr BufferManager::ConstructManagedBuffer(idx_t size, unique_ptr &&source, +unique_ptr BufferManager::ConstructManagedBuffer(idx_t size, unique_ptr &&, FileBufferType type) { throw NotImplementedException("This type of BufferManager can not construct managed buffers"); } @@ -298654,7 +301220,7 @@ class CheckpointWriter { class CheckpointReader { public: - CheckpointReader(Catalog &catalog) : catalog(catalog) { + explicit CheckpointReader(Catalog &catalog) : catalog(catalog) { } virtual ~CheckpointReader() { } @@ -298683,7 +301249,7 @@ class SingleFileCheckpointReader final : public CheckpointReader { : CheckpointReader(Catalog::GetCatalog(storage.GetAttached())), storage(storage) { } - void LoadFromStorage(); + void LoadFromStorage(optional_ptr context = nullptr); MetadataManager &GetMetadataManager(); //! The database @@ -298705,9 +301271,9 @@ class SingleFileCheckpointWriter final : public CheckpointWriter { //! connection is available because right now the checkpointing cannot be done online. (TODO) void CreateCheckpoint(); - virtual MetadataWriter &GetMetadataWriter() override; - virtual MetadataManager &GetMetadataManager() override; - virtual unique_ptr GetTableDataWriter(TableCatalogEntry &table) override; + MetadataWriter &GetMetadataWriter() override; + MetadataManager &GetMetadataManager() override; + unique_ptr GetTableDataWriter(TableCatalogEntry &table) override; BlockManager &GetBlockManager(); @@ -298770,10 +301336,9 @@ class SingleFileRowGroupWriter : public RowGroupWriter { MetadataWriter &table_data_writer; public: - virtual void WriteColumnDataPointers(ColumnCheckpointState &column_checkpoint_state, - Serializer &serializer) override; + void WriteColumnDataPointers(ColumnCheckpointState &column_checkpoint_state, Serializer &serializer) override; - virtual MetadataWriter &GetPayloadWriter() override; + MetadataWriter &GetPayloadWriter() override; }; } // namespace duckdb @@ -298800,10 +301365,10 @@ class TableDataWriter { CompressionType GetColumnCompressionType(idx_t i); - virtual void FinalizeTable(TableStatistics &&global_stats, DataTableInfo *info, Serializer &serializer) = 0; + virtual void FinalizeTable(const TableStatistics &global_stats, DataTableInfo *info, Serializer &serializer) = 0; virtual unique_ptr GetRowGroupWriter(RowGroup &row_group) = 0; - virtual void AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr &&writer); + virtual void AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr writer); TaskScheduler &GetScheduler(); @@ -298819,7 +301384,7 @@ class SingleFileTableDataWriter : public TableDataWriter { MetadataWriter &table_data_writer); public: - void FinalizeTable(TableStatistics &&global_stats, DataTableInfo *info, Serializer &serializer) override; + void FinalizeTable(const TableStatistics &global_stats, DataTableInfo *info, Serializer &serializer) override; unique_ptr GetRowGroupWriter(RowGroup &row_group) override; private: @@ -298941,6 +301506,8 @@ class ColumnData { virtual void SetStart(idx_t new_start); //! The root type of the column const LogicalType &RootType() const; + //! Whether or not the column has any updates + virtual bool HasUpdates() const; //! Initialize a scan of the column virtual void InitializeScan(ColumnScanState &state); @@ -299025,11 +301592,18 @@ class ColumnData { template idx_t ScanVector(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result); + void ClearUpdates(); + void FetchUpdates(TransactionData transaction, idx_t vector_index, Vector &result, idx_t scan_count, + bool allow_updates, bool scan_committed); + void FetchUpdateRow(TransactionData transaction, row_t row_id, Vector &result, idx_t result_idx); + void UpdateInternal(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, + idx_t update_count, Vector &base_vector); + protected: //! The segments holding the data of this column segment ColumnSegmentTree data; //! The lock for the updates - mutex update_lock; + mutable mutex update_lock; //! The updates for this column segment unique_ptr updates; //! The stats of the root segment @@ -299077,7 +301651,7 @@ struct ColumnCheckpointState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -299220,9 +301794,8 @@ CompressionType TableDataWriter::GetColumnCompressionType(idx_t i) { return table.GetColumn(LogicalIndex(i)).CompressionType(); } -void TableDataWriter::AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr &&writer) { +void TableDataWriter::AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr writer) { row_group_pointers.push_back(std::move(row_group_pointer)); - writer.reset(); } TaskScheduler &TableDataWriter::GetScheduler() { @@ -299238,7 +301811,7 @@ unique_ptr SingleFileTableDataWriter::GetRowGroupWriter(RowGroup return make_uniq(table, checkpoint_manager.partial_block_manager, table_data_writer); } -void SingleFileTableDataWriter::FinalizeTable(TableStatistics &&global_stats, DataTableInfo *info, +void SingleFileTableDataWriter::FinalizeTable(const TableStatistics &global_stats, DataTableInfo *info, Serializer &serializer) { // store the current position in the metadata writer // this is where the row groups for this table start @@ -299655,7 +302228,7 @@ MetadataManager &SingleFileCheckpointReader::GetMetadataManager() { return storage.block_manager->GetMetadataManager(); } -void SingleFileCheckpointReader::LoadFromStorage() { +void SingleFileCheckpointReader::LoadFromStorage(optional_ptr context) { auto &block_manager = *storage.block_manager; auto &metadata_manager = GetMetadataManager(); MetaBlockPointer meta_block(block_manager.GetMetaBlock(), 0); @@ -299664,13 +302237,20 @@ void SingleFileCheckpointReader::LoadFromStorage() { return; } - Connection con(storage.GetDatabase()); - con.BeginTransaction(); - // create the MetadataReader to read from the storage - MetadataReader reader(metadata_manager, meta_block); - // reader.SetContext(*con.context); - LoadCheckpoint(*con.context, reader); - con.Commit(); + if (context) { + // create the MetadataReader to read from the storage + MetadataReader reader(metadata_manager, meta_block); + // reader.SetContext(*con.context); + LoadCheckpoint(*context, reader); + } else { + Connection con(storage.GetDatabase()); + con.BeginTransaction(); + // create the MetadataReader to read from the storage + MetadataReader reader(metadata_manager, meta_block); + // reader.SetContext(*con.context); + LoadCheckpoint(*con.context, reader); + con.Commit(); + } } void CheckpointWriter::WriteEntry(CatalogEntry &entry, Serializer &serializer) { @@ -300592,20 +303172,20 @@ struct FloatingToExact {}; template <> struct FloatingToExact { - typedef uint64_t type; + using TYPE = uint64_t; }; template <> struct FloatingToExact { - typedef uint32_t type; + using TYPE = uint32_t; }; template struct PatasState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; - PatasState(void *state_p = nullptr) : data_ptr(state_p), patas_state() { + explicit PatasState(void *state_p = nullptr) : data_ptr(state_p), patas_state() { } //! The Compress/Analyze State void *data_ptr; @@ -302721,7 +305301,7 @@ namespace duckdb { template struct AlpAnalyzeState : public AnalyzeState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpAnalyzeState() : state() { } @@ -302947,7 +305527,7 @@ template struct AlpCompressionState : public CompressionState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpCompressionState(ColumnDataCheckpointer &checkpointer, AlpAnalyzeState *analyze_state) : checkpointer(checkpointer), function(checkpointer.GetCompressionFunction(CompressionType::COMPRESSION_ALP)) { CreateEmptySegment(checkpointer.GetRowGroup().start); @@ -303265,7 +305845,7 @@ struct AlpVectorState { template struct AlpScanState : public SegmentScanState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpScanState(ColumnSegment &segment) : segment(segment), count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -303469,7 +306049,7 @@ namespace duckdb { template void AlpFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpScanState scan_state(segment); scan_state.Skip(segment, row_id); @@ -303635,7 +306215,7 @@ struct AlpRDLeftPartInfo { template class AlpRDCompressionState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpRDCompressionState() : right_bit_width(0), left_bit_width(0), exceptions_count(0) { } @@ -303664,7 +306244,7 @@ class AlpRDCompressionState { template struct AlpRDCompression { using State = AlpRDCompressionState; - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; static constexpr uint8_t EXACT_TYPE_BITSIZE = sizeof(EXACT_TYPE) * 8; /* @@ -303800,7 +306380,7 @@ struct AlpRDCompression { template struct AlpRDDecompression { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; static void Decompress(uint8_t *left_encoded, uint8_t *right_encoded, const uint16_t *left_parts_dict, EXACT_TYPE *output, idx_t values_count, uint16_t exceptions_count, @@ -303849,7 +306429,7 @@ namespace duckdb { template struct AlpRDAnalyzeState : public AnalyzeState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpRDAnalyzeState() : state() { } @@ -303871,7 +306451,7 @@ unique_ptr AlpRDInitAnalyze(ColumnData &col_data, PhysicalType typ */ template bool AlpRDAnalyze(AnalyzeState &state, Vector &input, idx_t count) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; auto &analyze_state = (AlpRDAnalyzeState &)state; bool must_skip_current_vector = alp::AlpUtils::MustSkipSamplingFromCurrentVector( @@ -303999,7 +306579,7 @@ template struct AlpRDCompressionState : public CompressionState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpRDCompressionState(ColumnDataCheckpointer &checkpointer, AlpRDAnalyzeState *analyze_state) : checkpointer(checkpointer), function(checkpointer.GetCompressionFunction(CompressionType::COMPRESSION_ALPRD)) { @@ -304305,7 +306885,7 @@ namespace duckdb { template struct AlpRDVectorState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; void Reset() { index = 0; @@ -304347,7 +306927,7 @@ struct AlpRDVectorState { template struct AlpRDScanState : public SegmentScanState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpRDScanState(ColumnSegment &segment) : segment(segment), count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -304497,7 +307077,7 @@ unique_ptr AlpRDInitScan(ColumnSegment &segment) { template void AlpRDScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result, idx_t result_offset) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; auto &scan_state = (AlpRDScanState &)*state.scan_state; // Get the pointer to the result values @@ -304544,7 +307124,7 @@ namespace duckdb { template void AlpRDFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpRDScanState scan_state(segment); scan_state.Skip(segment, row_id); auto result_data = FlatVector::GetData(result); @@ -305129,7 +307709,8 @@ struct BitpackingCompressState : public CompressionState { auto base_ptr = handle.Ptr(); // Compact the segment by moving the metadata next to the data. - idx_t metadata_offset = AlignValue(data_ptr - base_ptr); + idx_t unaligned_offset = data_ptr - base_ptr; + idx_t metadata_offset = AlignValue(unaligned_offset); idx_t metadata_size = base_ptr + Storage::BLOCK_SIZE - metadata_ptr; idx_t total_segment_size = metadata_offset + metadata_size; @@ -305138,6 +307719,10 @@ struct BitpackingCompressState : public CompressionState { throw InternalException("Error in bitpacking size calculation"); } + if (unaligned_offset != metadata_offset) { + // zero initialize any padding bits + memset(base_ptr + unaligned_offset, 0, metadata_offset - unaligned_offset); + } memmove(base_ptr + metadata_offset, metadata_ptr, metadata_size); // Store the offset of the metadata of the first group (which is at the highest address). @@ -306186,7 +308771,7 @@ class LeadingZeroBuffer { } uint64_t BitsWritten() const { - return counter * 3; + return counter * 3ULL; } // Reset the counter, but don't replace the buffer @@ -306207,7 +308792,7 @@ class LeadingZeroBuffer { #endif inline uint64_t BlockIndex() const { - return ((counter >> 3) * (LEADING_ZERO_BLOCK_BIT_SIZE / 8)); + return ((counter >> 3ULL) * (LEADING_ZERO_BLOCK_BIT_SIZE / 8ULL)); } void FlushBuffer() { @@ -306220,7 +308805,7 @@ class LeadingZeroBuffer { // Verify that the bits are copied correctly uint32_t temp_value = 0; - memcpy((uint8_t *)&temp_value, (void *)(buffer + buffer_idx), 3); + memcpy(reinterpret_cast(&temp_value), (void *)(buffer + buffer_idx), 3); for (idx_t i = 0; i < flags.size(); i++) { D_ASSERT(flags[i] == ExtractValue(temp_value, i)); } @@ -306335,7 +308920,7 @@ class FlagBuffer { #endif uint64_t BitsWritten() const { - return counter * 2; + return counter * 2ULL; } void Insert(ChimpConstants::Flags value) { @@ -306918,12 +309503,12 @@ struct ChimpType {}; template <> struct ChimpType { - typedef uint64_t type; + using TYPE = uint64_t; }; template <> struct ChimpType { - typedef uint32_t type; + using TYPE = uint32_t; }; class ChimpPrimitives { @@ -306939,7 +309524,7 @@ class ChimpPrimitives { template struct ChimpState { public: - using CHIMP_TYPE = typename ChimpType::type; + using CHIMP_TYPE = typename ChimpType::TYPE; ChimpState() : chimp() { } @@ -307016,7 +309601,6 @@ bool ChimpAnalyze(AnalyzeState &state, Vector &input, idx_t count) { template idx_t ChimpFinalAnalyze(AnalyzeState &state) { throw InternalException("Chimp has been deprecated, can no longer be used to compress data"); - return DConstants::INVALID_INDEX; } } // namespace duckdb @@ -307198,7 +309782,7 @@ struct ChimpGroupState { template struct ChimpScanState : public SegmentScanState { public: - using CHIMP_TYPE = typename ChimpType::type; + using CHIMP_TYPE = typename ChimpType::TYPE; explicit ChimpScanState(ColumnSegment &segment) : segment(segment), segment_count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -307266,7 +309850,7 @@ struct ChimpScanState : public SegmentScanState { D_ASSERT(leading_zero_block_count <= ChimpPrimitives::CHIMP_SEQUENCE_SIZE / 8); // Load the leading zero block count - metadata_ptr -= 3 * leading_zero_block_count; + metadata_ptr -= 3ULL * leading_zero_block_count; const auto leading_zero_block_ptr = metadata_ptr; // Figure out how many flags there are @@ -307303,7 +309887,7 @@ struct ChimpScanState : public SegmentScanState { //! Skip the next 'skip_count' values, we don't store the values // TODO: use the metadata to determine if we can skip a group void Skip(ColumnSegment &segment, idx_t skip_count) { - using INTERNAL_TYPE = typename ChimpType::type; + using INTERNAL_TYPE = typename ChimpType::TYPE; INTERNAL_TYPE buffer[ChimpPrimitives::CHIMP_SEQUENCE_SIZE]; while (skip_count) { @@ -307326,7 +309910,7 @@ unique_ptr ChimpInitScan(ColumnSegment &segment) { template void ChimpScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result, idx_t result_offset) { - using INTERNAL_TYPE = typename ChimpType::type; + using INTERNAL_TYPE = typename ChimpType::TYPE; auto &scan_state = state.scan_state->Cast>(); T *result_data = FlatVector::GetData(result); @@ -307383,7 +309967,7 @@ namespace duckdb { template void ChimpFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using INTERNAL_TYPE = typename ChimpType::type; + using INTERNAL_TYPE = typename ChimpType::TYPE; ChimpScanState scan_state(segment); scan_state.Skip(segment, row_id); @@ -309381,7 +311965,6 @@ bool PatasAnalyze(AnalyzeState &state, Vector &input, idx_t count) { template idx_t PatasFinalAnalyze(AnalyzeState &state) { throw InternalException("Patas has been deprecated, can no longer be used to compress data"); - return DConstants::INVALID_INDEX; } } // namespace duckdb @@ -309516,7 +312099,7 @@ struct PatasGroupState { template struct PatasScanState : public SegmentScanState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit PatasScanState(ColumnSegment &segment) : segment(segment), count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -309603,7 +312186,7 @@ struct PatasScanState : public SegmentScanState { public: //! Skip the next 'skip_count' values, we don't store the values void Skip(ColumnSegment &segment, idx_t skip_count) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; if (total_value_count != 0 && !GroupFinished()) { // Finish skipping the current group @@ -309639,7 +312222,7 @@ unique_ptr PatasInitScan(ColumnSegment &segment) { template void PatasScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result, idx_t result_offset) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; auto &scan_state = (PatasScanState &)*state.scan_state; // Get the pointer to the result values @@ -309698,7 +312281,7 @@ namespace duckdb { template void PatasFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; PatasScanState scan_state(segment); scan_state.Skip(segment, row_id); @@ -310638,7 +313221,7 @@ string_location_t UncompressedStringStorage::FetchStringLocation(StringDictionar D_ASSERT(dict_offset >= -1 * int32_t(Storage::BLOCK_SIZE) && dict_offset <= int32_t(Storage::BLOCK_SIZE)); if (dict_offset < 0) { string_location_t result; - ReadStringMarker(baseptr + dict.end - (-1 * dict_offset), result.block_id, result.offset); + ReadStringMarker(baseptr + dict.end - idx_t(-1 * dict_offset), result.block_id, result.offset); return result; } else { return string_location_t(INVALID_BLOCK, dict_offset); @@ -311200,7 +313783,7 @@ namespace duckdb { unique_ptr ColumnSegmentState::Deserialize(Deserializer &deserializer) { auto compression_type = deserializer.Get(); auto &db = deserializer.Get(); - auto &type = deserializer.Get(); + auto &type = deserializer.Get(); auto compression_function = DBConfig::GetConfig(db).GetCompressionFunction(compression_type, type.InternalType()); if (!compression_function || !compression_function->deserialize_state) { throw SerializationException("Deserializing a ColumnSegmentState but could not find deserialize method"); @@ -311277,6 +313860,8 @@ class StandardColumnData : public ColumnData { ValidityColumnData validity; public: + bool HasUpdates() const override; + void SetStart(idx_t new_start) override; bool CheckZonemap(ColumnScanState &state, TableFilter &filter) override; @@ -311335,8 +313920,8 @@ DataTableInfo::DataTableInfo(AttachedDatabase &db, shared_ptr ta table(std::move(table)) { } -void DataTableInfo::InitializeIndexes(ClientContext &context) { - indexes.InitializeIndexes(context, *this); +void DataTableInfo::InitializeIndexes(ClientContext &context, bool throw_on_failure) { + indexes.InitializeIndexes(context, *this, throw_on_failure); } bool DataTableInfo::IsTemporary() const { @@ -311390,8 +313975,8 @@ DataTable::DataTable(ClientContext &context, DataTable &parent, idx_t removed_co column_definitions.emplace_back(column_def.Copy()); } - // try to initialize unknown indexes info->InitializeIndexes(context); + // first check if there are any indexes that exist that point to the removed column info->indexes.Scan([&](Index &index) { for (auto &column_id : index.column_ids) { @@ -311438,6 +314023,8 @@ DataTable::DataTable(ClientContext &context, DataTable &parent, unique_ptrInitializeIndexes(context); + // Verify the new constraint against current persistent/local data VerifyNewConstraint(context, parent, constraint.get()); @@ -311456,7 +314043,7 @@ DataTable::DataTable(ClientContext &context, DataTable &parent, idx_t changed_id for (auto &column_def : parent.column_definitions) { column_definitions.emplace_back(column_def.Copy()); } - // try to initialize unknown indexes + info->InitializeIndexes(context); // first check if there are any indexes that exist that point to the changed column @@ -312159,7 +314746,9 @@ void DataTable::RevertAppend(idx_t start_row, idx_t count) { row_data[i] = current_row_base + i; } info->indexes.Scan([&](Index &index) { - index.Delete(chunk, row_identifiers); + if (!index.IsUnknown()) { + index.Delete(chunk, row_identifiers); + } return false; }); current_row_base += chunk.size(); @@ -312169,7 +314758,9 @@ void DataTable::RevertAppend(idx_t start_row, idx_t count) { // we need to vacuum the indexes to remove any buffers that are now empty // due to reverting the appends info->indexes.Scan([&](Index &index) { - index.Vacuum(); + if (!index.IsUnknown()) { + index.Vacuum(); + } return false; }); @@ -312301,6 +314892,8 @@ idx_t DataTable::Delete(TableCatalogEntry &table, ClientContext &context, Vector return 0; } + info->InitializeIndexes(context, true); + auto &transaction = DuckTransaction::Get(context, db); auto &local_storage = LocalStorage::Get(transaction); bool has_delete_constraints = TableHasDeleteConstraints(table); @@ -312458,6 +315051,9 @@ void DataTable::Update(TableCatalogEntry &table, ClientContext &context, Vector throw TransactionException("Transaction conflict: cannot update a table that has been altered!"); } + // check that there are no unknown indexes + info->InitializeIndexes(context, true); + // first verify that no constraints are violated VerifyUpdateConstraints(context, table, updates, column_ids); @@ -312545,7 +315141,7 @@ void DataTable::Checkpoint(TableDataWriter &writer, Serializer &serializer) { // row-group pointers // table pointer // index data - writer.FinalizeTable(std::move(global_stats), info.get(), serializer); + writer.FinalizeTable(global_stats, info.get(), serializer); } void DataTable::CommitDropColumn(idx_t index) { @@ -312896,7 +315492,11 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen // we need to vacuum the indexes to remove any buffers that are now empty // due to reverting the appends table.info->indexes.Scan([&](Index &index) { - index.Vacuum(); + try { + index.Vacuum(); + } catch (std::exception &ex) { // LCOV_EXCL_START + error = ErrorData(ex); + } // LCOV_EXCL_STOP return false; }); error.Throw(); @@ -313053,6 +315653,7 @@ bool LocalStorage::NextParallelScan(ClientContext &context, DataTable &table, Pa } void LocalStorage::InitializeAppend(LocalAppendState &state, DataTable &table) { + table.info->InitializeIndexes(context); state.storage = &table_manager.GetOrCreateStorage(table); state.storage->row_groups->InitializeAppend(TransactionData(transaction), state.append_state); } @@ -313144,6 +315745,8 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) { } idx_t append_count = storage.row_groups->GetTotalRows() - storage.deleted_rows; + table.info->InitializeIndexes(context); + TableAppendState append_state; table.AppendLock(append_state); transaction.PushAppend(table, append_state.row_start, append_count); @@ -313169,9 +315772,6 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) { storage.AppendToIndexes(transaction, append_state, append_count, true); } - // try to initialize any unknown indexes - table.info->InitializeIndexes(context); - // possibly vacuum any excess index data table.info->indexes.Scan([&](Index &index) { index.Vacuum(); @@ -313274,7 +315874,6 @@ TableIndexList &LocalStorage::GetIndexes(DataTable &table) { if (!storage) { throw InternalException("LocalStorage::GetIndexes - local storage not found"); } - table.info->InitializeIndexes(context); return storage->indexes; } @@ -313293,13 +315892,14 @@ void LocalStorage::VerifyNewConstraint(DataTable &parent, const BoundConstraint namespace duckdb { -DataFileType MagicBytes::CheckMagicBytes(FileSystem *fs_p, const string &path) { - LocalFileSystem lfs; - FileSystem &fs = fs_p ? *fs_p : lfs; - if (!fs.FileExists(path)) { +DataFileType MagicBytes::CheckMagicBytes(FileSystem &fs, const string &path) { + if (path.empty() || path == IN_MEMORY_PATH) { + return DataFileType::DUCKDB_FILE; + } + auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS); + if (!handle) { return DataFileType::FILE_DOES_NOT_EXIST; } - auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ); constexpr const idx_t MAGIC_BYTES_READ_SIZE = 16; char buffer[MAGIC_BYTES_READ_SIZE]; @@ -314014,7 +316614,7 @@ bool PartialBlockManager::GetPartialBlock(idx_t segment_size, unique_ptrstate; D_ASSERT(checkpoint_type != CheckpointType::FULL_CHECKPOINT || state.block_id >= 0); if (state.block_use_count < max_use_count) { @@ -314786,6 +317386,9 @@ unique_ptr LogicalOperator::Deserialize(Deserializer &deseriali case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: result = LogicalComparisonJoin::Deserialize(deserializer); break; + case LogicalOperatorType::LOGICAL_COPY_DATABASE: + result = LogicalCopyDatabase::Deserialize(deserializer); + break; case LogicalOperatorType::LOGICAL_COPY_TO_FILE: result = LogicalCopyToFile::Deserialize(deserializer); break; @@ -314912,9 +317515,6 @@ unique_ptr LogicalOperator::Deserialize(Deserializer &deseriali case LogicalOperatorType::LOGICAL_UPDATE: result = LogicalUpdate::Deserialize(deserializer); break; - case LogicalOperatorType::LOGICAL_VACUUM: - result = LogicalSimple::Deserialize(deserializer); - break; case LogicalOperatorType::LOGICAL_WINDOW: result = LogicalWindow::Deserialize(deserializer); break; @@ -314927,16 +317527,16 @@ unique_ptr LogicalOperator::Deserialize(Deserializer &deseriali } void FilenamePattern::Serialize(Serializer &serializer) const { - serializer.WritePropertyWithDefault(200, "base", _base); - serializer.WritePropertyWithDefault(201, "pos", _pos); - serializer.WritePropertyWithDefault(202, "uuid", _uuid); + serializer.WritePropertyWithDefault(200, "base", base); + serializer.WritePropertyWithDefault(201, "pos", pos); + serializer.WritePropertyWithDefault(202, "uuid", uuid); } FilenamePattern FilenamePattern::Deserialize(Deserializer &deserializer) { FilenamePattern result; - deserializer.ReadPropertyWithDefault(200, "base", result._base); - deserializer.ReadPropertyWithDefault(201, "pos", result._pos); - deserializer.ReadPropertyWithDefault(202, "uuid", result._uuid); + deserializer.ReadPropertyWithDefault(200, "base", result.base); + deserializer.ReadPropertyWithDefault(201, "pos", result.pos); + deserializer.ReadPropertyWithDefault(202, "uuid", result.uuid); return result; } @@ -315041,6 +317641,17 @@ unique_ptr LogicalComparisonJoin::Deserialize(Deserializer &des return std::move(result); } +void LogicalCopyDatabase::Serialize(Serializer &serializer) const { + LogicalOperator::Serialize(serializer); + serializer.WritePropertyWithDefault>(200, "info", info); +} + +unique_ptr LogicalCopyDatabase::Deserialize(Deserializer &deserializer) { + auto info = deserializer.ReadPropertyWithDefault>(200, "info"); + auto result = duckdb::unique_ptr(new LogicalCopyDatabase(std::move(info))); + return std::move(result); +} + void LogicalCreate::Serialize(Serializer &serializer) const { LogicalOperator::Serialize(serializer); serializer.WritePropertyWithDefault>(200, "info", info); @@ -315651,9 +318262,9 @@ CSVOption CSVOption::Deserialize(Deserializer &deserializer) { } void CSVReaderOptions::Serialize(Serializer &serializer) const { - serializer.WritePropertyWithDefault(100, "ignore_errors", ignore_errors); + serializer.WritePropertyWithDefault(100, "ignore_errors", ignore_errors, false); serializer.WritePropertyWithDefault(101, "buffer_sample_size", buffer_sample_size); - serializer.WritePropertyWithDefault(102, "null_str", null_str); + serializer.WritePropertyWithDefault>(102, "null_str", null_str); serializer.WriteProperty(103, "compression", compression); serializer.WritePropertyWithDefault(104, "allow_quoted_nulls", allow_quoted_nulls); serializer.WritePropertyWithDefault(105, "maximum_line_size", maximum_line_size); @@ -315668,10 +318279,10 @@ void CSVReaderOptions::Serialize(Serializer &serializer) const { serializer.WritePropertyWithDefault(114, "buffer_size", buffer_size); serializer.WriteProperty(115, "file_options", file_options); serializer.WritePropertyWithDefault>(116, "force_quote", force_quote); - serializer.WritePropertyWithDefault(117, "rejects_table_name", rejects_table_name); + serializer.WritePropertyWithDefault(117, "rejects_table_name", rejects_table_name, "reject_errors"); serializer.WritePropertyWithDefault(118, "rejects_limit", rejects_limit); - serializer.WritePropertyWithDefault>(119, "rejects_recovery_columns", rejects_recovery_columns); - serializer.WritePropertyWithDefault>(120, "rejects_recovery_column_ids", rejects_recovery_column_ids); + /* [Deleted] (vector) "rejects_recovery_columns" */ + /* [Deleted] (vector) "rejects_recovery_column_ids" */ serializer.WriteProperty>(121, "dialect_options.state_machine_options.delimiter", dialect_options.state_machine_options.delimiter); serializer.WriteProperty>(122, "dialect_options.state_machine_options.quote", dialect_options.state_machine_options.quote); serializer.WriteProperty>(123, "dialect_options.state_machine_options.escape", dialect_options.state_machine_options.escape); @@ -315683,13 +318294,14 @@ void CSVReaderOptions::Serialize(Serializer &serializer) const { serializer.WritePropertyWithDefault(129, "sniffer_user_mismatch_error", sniffer_user_mismatch_error); serializer.WritePropertyWithDefault(130, "parallel", parallel); serializer.WritePropertyWithDefault>(131, "was_type_manually_set", was_type_manually_set); + serializer.WritePropertyWithDefault>(132, "rejects_scan_name", rejects_scan_name, {"reject_scans"}); } CSVReaderOptions CSVReaderOptions::Deserialize(Deserializer &deserializer) { CSVReaderOptions result; - deserializer.ReadPropertyWithDefault(100, "ignore_errors", result.ignore_errors); + deserializer.ReadPropertyWithDefault(100, "ignore_errors", result.ignore_errors, false); deserializer.ReadPropertyWithDefault(101, "buffer_sample_size", result.buffer_sample_size); - deserializer.ReadPropertyWithDefault(102, "null_str", result.null_str); + deserializer.ReadPropertyWithDefault>(102, "null_str", result.null_str); deserializer.ReadProperty(103, "compression", result.compression); deserializer.ReadPropertyWithDefault(104, "allow_quoted_nulls", result.allow_quoted_nulls); deserializer.ReadPropertyWithDefault(105, "maximum_line_size", result.maximum_line_size); @@ -315704,10 +318316,10 @@ CSVReaderOptions CSVReaderOptions::Deserialize(Deserializer &deserializer) { deserializer.ReadPropertyWithDefault(114, "buffer_size", result.buffer_size); deserializer.ReadProperty(115, "file_options", result.file_options); deserializer.ReadPropertyWithDefault>(116, "force_quote", result.force_quote); - deserializer.ReadPropertyWithDefault(117, "rejects_table_name", result.rejects_table_name); + deserializer.ReadPropertyWithDefault(117, "rejects_table_name", result.rejects_table_name, "reject_errors"); deserializer.ReadPropertyWithDefault(118, "rejects_limit", result.rejects_limit); - deserializer.ReadPropertyWithDefault>(119, "rejects_recovery_columns", result.rejects_recovery_columns); - deserializer.ReadPropertyWithDefault>(120, "rejects_recovery_column_ids", result.rejects_recovery_column_ids); + deserializer.ReadDeletedProperty>(119, "rejects_recovery_columns"); + deserializer.ReadDeletedProperty>(120, "rejects_recovery_column_ids"); deserializer.ReadProperty>(121, "dialect_options.state_machine_options.delimiter", result.dialect_options.state_machine_options.delimiter); deserializer.ReadProperty>(122, "dialect_options.state_machine_options.quote", result.dialect_options.state_machine_options.quote); deserializer.ReadProperty>(123, "dialect_options.state_machine_options.escape", result.dialect_options.state_machine_options.escape); @@ -315719,6 +318331,7 @@ CSVReaderOptions CSVReaderOptions::Deserialize(Deserializer &deserializer) { deserializer.ReadPropertyWithDefault(129, "sniffer_user_mismatch_error", result.sniffer_user_mismatch_error); deserializer.ReadPropertyWithDefault(130, "parallel", result.parallel); deserializer.ReadPropertyWithDefault>(131, "was_type_manually_set", result.was_type_manually_set); + deserializer.ReadPropertyWithDefault>(132, "rejects_scan_name", result.rejects_scan_name, {"reject_scans"}); return result; } @@ -316035,6 +318648,7 @@ interval_t interval_t::Deserialize(Deserializer &deserializer) { + namespace duckdb { void ParseInfo::Serialize(Serializer &serializer) const { @@ -316051,6 +318665,9 @@ unique_ptr ParseInfo::Deserialize(Deserializer &deserializer) { case ParseInfoType::ATTACH_INFO: result = AttachInfo::Deserialize(deserializer); break; + case ParseInfoType::COPY_DATABASE_INFO: + result = CopyDatabaseInfo::Deserialize(deserializer); + break; case ParseInfoType::COPY_INFO: result = CopyInfo::Deserialize(deserializer); break; @@ -316246,6 +318863,19 @@ unique_ptr ChangeColumnTypeInfo::Deserialize(Deserializer &deser return std::move(result); } +void CopyDatabaseInfo::Serialize(Serializer &serializer) const { + ParseInfo::Serialize(serializer); + serializer.WritePropertyWithDefault(200, "target_database", target_database); + serializer.WritePropertyWithDefault>>(201, "entries", entries); +} + +unique_ptr CopyDatabaseInfo::Deserialize(Deserializer &deserializer) { + auto result = duckdb::unique_ptr(new CopyDatabaseInfo()); + deserializer.ReadPropertyWithDefault(200, "target_database", result->target_database); + deserializer.ReadPropertyWithDefault>>(201, "entries", result->entries); + return std::move(result); +} + void CopyInfo::Serialize(Serializer &serializer) const { ParseInfo::Serialize(serializer); serializer.WritePropertyWithDefault(200, "catalog", catalog); @@ -316466,11 +319096,17 @@ unique_ptr TransactionInfo::Deserialize(Deserializer &deserializer) { void VacuumInfo::Serialize(Serializer &serializer) const { ParseInfo::Serialize(serializer); serializer.WriteProperty(200, "options", options); + serializer.WritePropertyWithDefault(201, "has_table", has_table); + serializer.WritePropertyWithDefault>(202, "ref", ref); + serializer.WritePropertyWithDefault>(203, "columns", columns); } unique_ptr VacuumInfo::Deserialize(Deserializer &deserializer) { auto options = deserializer.ReadProperty(200, "options"); auto result = duckdb::unique_ptr(new VacuumInfo(options)); + deserializer.ReadPropertyWithDefault(201, "has_table", result->has_table); + deserializer.ReadPropertyWithDefault>(202, "ref", result->ref); + deserializer.ReadPropertyWithDefault>(203, "columns", result->columns); return std::move(result); } @@ -317712,7 +320348,7 @@ class SingleFileBlockManager : public BlockManager { public: SingleFileBlockManager(AttachedDatabase &db, string path, StorageManagerOptions options); - void GetFileFlags(uint8_t &flags, FileLockType &lock, bool create_new); + FileOpenFlags GetFileFlags(bool create_new) const; void CreateNewDatabase(); void LoadExistingDatabase(); @@ -317756,6 +320392,7 @@ class SingleFileBlockManager : public BlockManager { //! Return the blocks to which we will write the free list and modified blocks vector GetFreeListBlocks(); + void TrimFreeBlocks(); private: AttachedDatabase &db; @@ -317769,6 +320406,8 @@ class SingleFileBlockManager : public BlockManager { FileBuffer header_buffer; //! The list of free blocks that can be written to currently set free_list; + //! The list of blocks that were freed since the last checkpoint. + set newly_freed_list; //! The list of multi-use blocks (i.e. blocks that have >1 reference in the file) //! When a multi-use block is marked as modified, the reference count is decreased by 1 instead of directly //! Appending the block to the modified_blocks list @@ -317941,31 +320580,31 @@ SingleFileBlockManager::SingleFileBlockManager(AttachedDatabase &db, string path iteration_count(0), options(options) { } -void SingleFileBlockManager::GetFileFlags(uint8_t &flags, FileLockType &lock, bool create_new) { +FileOpenFlags SingleFileBlockManager::GetFileFlags(bool create_new) const { + FileOpenFlags result; if (options.read_only) { D_ASSERT(!create_new); - flags = FileFlags::FILE_FLAGS_READ; - lock = FileLockType::READ_LOCK; + result = FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS | FileLockType::READ_LOCK; } else { - flags = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_READ; - lock = FileLockType::WRITE_LOCK; + result = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_READ | FileLockType::WRITE_LOCK; if (create_new) { - flags |= FileFlags::FILE_FLAGS_FILE_CREATE; + result |= FileFlags::FILE_FLAGS_FILE_CREATE; } } if (options.use_direct_io) { - flags |= FileFlags::FILE_FLAGS_DIRECT_IO; + result |= FileFlags::FILE_FLAGS_DIRECT_IO; } + // database files can be read from in parallel + result |= FileFlags::FILE_FLAGS_PARALLEL_ACCESS; + return result; } void SingleFileBlockManager::CreateNewDatabase() { - uint8_t flags; - FileLockType lock; - GetFileFlags(flags, lock, true); + auto flags = GetFileFlags(true); // open the RDBMS handle auto &fs = FileSystem::Get(db); - handle = fs.OpenFile(path, flags, lock); + handle = fs.OpenFile(path, flags); // if we create a new file, we fill the metadata of the file // first fill in the new header @@ -318012,13 +320651,15 @@ void SingleFileBlockManager::CreateNewDatabase() { } void SingleFileBlockManager::LoadExistingDatabase() { - uint8_t flags; - FileLockType lock; - GetFileFlags(flags, lock, false); + auto flags = GetFileFlags(false); // open the RDBMS handle auto &fs = FileSystem::Get(db); - handle = fs.OpenFile(path, flags, lock); + handle = fs.OpenFile(path, flags); + if (!handle) { + // this can only happen in read-only mode - as that is when we set FILE_FLAGS_NULL_IF_NOT_EXISTS + throw CatalogException("Cannot open database \"%s\" in read-only mode: database does not exist", path); + } MainHeader::CheckMagicBytes(*handle); // otherwise, we check the metadata of the file @@ -318085,7 +320726,9 @@ void SingleFileBlockManager::LoadFreeList() { auto free_list_count = reader.Read(); free_list.clear(); for (idx_t i = 0; i < free_list_count; i++) { - free_list.insert(reader.Read()); + auto block = reader.Read(); + free_list.insert(block); + newly_freed_list.insert(block); } auto multi_use_blocks_count = reader.Read(); multi_use_blocks.clear(); @@ -318111,6 +320754,7 @@ block_id_t SingleFileBlockManager::GetFreeBlockId() { block = *free_list.begin(); // erase the entry from the free list again free_list.erase(free_list.begin()); + newly_freed_list.erase(block); } else { block = max_block++; } @@ -318126,6 +320770,7 @@ void SingleFileBlockManager::MarkBlockAsFree(block_id_t block_id) { } multi_use_blocks.erase(block_id); free_list.insert(block_id); + newly_freed_list.insert(block_id); } void SingleFileBlockManager::MarkBlockAsModified(block_id_t block_id) { @@ -318223,9 +320868,8 @@ void SingleFileBlockManager::Truncate() { return; } // truncate the file - for (idx_t i = 0; i < blocks_to_truncate; i++) { - free_list.erase(max_block + i); - } + free_list.erase(free_list.lower_bound(max_block), free_list.end()); + newly_freed_list.erase(newly_freed_list.lower_bound(max_block), newly_freed_list.end()); handle->Truncate(BLOCK_START + max_block * Storage::BLOCK_ALLOC_SIZE); } @@ -318285,6 +320929,7 @@ void SingleFileBlockManager::WriteHeader(DatabaseHeader header) { metadata_manager.MarkBlocksAsModified(); for (auto &block : modified_blocks) { free_list.insert(block); + newly_freed_list.insert(block); } modified_blocks.clear(); @@ -318338,6 +320983,27 @@ void SingleFileBlockManager::WriteHeader(DatabaseHeader header) { active_header = 1 - active_header; //! Ensure the header write ends up on disk handle->Sync(); + // Release the free blocks to the filesystem. + TrimFreeBlocks(); +} + +void SingleFileBlockManager::TrimFreeBlocks() { + if (DBConfig::Get(db).options.trim_free_blocks) { + for (auto itr = newly_freed_list.begin(); itr != newly_freed_list.end(); ++itr) { + block_id_t first = *itr; + block_id_t last = first; + // Find end of contiguous range. + for (++itr; itr != newly_freed_list.end() && (*itr == last + 1); ++itr) { + last = *itr; + } + // We are now one too far. + --itr; + // Trim the range. + handle->Trim(BLOCK_START + (first * Storage::BLOCK_ALLOC_SIZE), + (last + 1 - first) * Storage::BLOCK_ALLOC_SIZE); + } + } + newly_freed_list.clear(); } } // namespace duckdb @@ -318589,6 +321255,12 @@ class TemporaryFileManager { namespace duckdb { +#ifdef DUCKDB_DEBUG_DESTROY_BLOCKS +static void WriteGarbageIntoBuffer(FileBuffer &buffer) { + memset(buffer.buffer, 0xa5, buffer.size); // 0xa5 is default memory in debug mode +} +#endif + struct BufferAllocatorData : PrivateAllocatorData { explicit BufferAllocatorData(StandardBufferManager &manager) : manager(manager) { } @@ -318661,14 +321333,20 @@ TempBufferPoolReservation StandardBufferManager::EvictBlocksOrThrow(MemoryTag ta shared_ptr StandardBufferManager::RegisterSmallMemory(idx_t block_size) { D_ASSERT(block_size < Storage::BLOCK_SIZE); - auto res = EvictBlocksOrThrow(MemoryTag::BASE_TABLE, block_size, nullptr, "could not allocate block of size %s%s", - StringUtil::BytesToHumanReadableString(block_size)); + auto reservation = + EvictBlocksOrThrow(MemoryTag::BASE_TABLE, block_size, nullptr, "could not allocate block of size %s%s", + StringUtil::BytesToHumanReadableString(block_size)); auto buffer = ConstructManagedBuffer(block_size, nullptr, FileBufferType::TINY_BUFFER); // create a new block pointer for this block - return make_shared(*temp_block_manager, ++temporary_id, MemoryTag::BASE_TABLE, std::move(buffer), - false, block_size, std::move(res)); + auto result = make_shared(*temp_block_manager, ++temporary_id, MemoryTag::BASE_TABLE, + std::move(buffer), false, block_size, std::move(reservation)); +#ifdef DUCKDB_DEBUG_DESTROY_BLOCKS + // Initialize the memory with garbage data + WriteGarbageIntoBuffer(*result->buffer); +#endif + return result; } shared_ptr StandardBufferManager::RegisterMemory(MemoryTag tag, idx_t block_size, bool can_destroy) { @@ -318691,6 +321369,10 @@ BufferHandle StandardBufferManager::Allocate(MemoryTag tag, idx_t block_size, bo shared_ptr local_block; auto block_ptr = block ? block : &local_block; *block_ptr = RegisterMemory(tag, block_size, can_destroy); +#ifdef DUCKDB_DEBUG_DESTROY_BLOCKS + // Initialize the memory with garbage data + WriteGarbageIntoBuffer(*(*block_ptr)->buffer); +#endif return Pin(*block_ptr); } @@ -318782,7 +321464,7 @@ void StandardBufferManager::VerifyZeroReaders(shared_ptr &handle) { auto replacement_buffer = make_uniq(Allocator::Get(db), handle->buffer->type, handle->memory_usage - Storage::BLOCK_HEADER_SIZE); memcpy(replacement_buffer->buffer, handle->buffer->buffer, handle->buffer->size); - memset(handle->buffer->buffer, 0xa5, handle->buffer->size); // 0xa5 is default memory in debug mode + WriteGarbageIntoBuffer(*handle->buffer); handle->buffer = std::move(replacement_buffer); #endif } @@ -319109,7 +321791,7 @@ void ArrayStats::Deserialize(Deserializer &deserializer, BaseStatistics &base) { auto &child_type = ArrayType::GetChildType(type); // Push the logical type of the child type to the deserialization context - deserializer.Set(const_cast(child_type)); + deserializer.Set(child_type); base.child_stats[0].Copy(deserializer.ReadProperty(200, "child_stats")); deserializer.Unset(); } @@ -319503,11 +322185,10 @@ BaseStatistics BaseStatistics::Deserialize(Deserializer &deserializer) { auto distinct_count = deserializer.ReadProperty(102, "distinct_count"); // Get the logical type from the deserializer context. - auto type = deserializer.Get(); - + auto &type = deserializer.Get(); auto stats_type = GetStatsType(type); - BaseStatistics stats(std::move(type)); + BaseStatistics stats(type); stats.has_null = has_null; stats.has_no_null = has_no_null; @@ -319916,7 +322597,7 @@ void ListStats::Deserialize(Deserializer &deserializer, BaseStatistics &base) { auto &child_type = ListType::GetChildType(type); // Push the logical type of the child type to the deserialization context - deserializer.Set(const_cast(child_type)); + deserializer.Set(child_type); base.child_stats[0].Copy(deserializer.ReadProperty(200, "child_stats")); deserializer.Unset(); } @@ -321068,7 +323749,7 @@ void StructStats::Deserialize(Deserializer &deserializer, BaseStatistics &base) auto &child_types = StructType::GetChildTypes(type); deserializer.ReadList(200, "child_stats", [&](Deserializer::List &list, idx_t i) { - deserializer.Set(const_cast(child_types[i].second)); + deserializer.Set(child_types[i].second); auto stat = list.ReadElement(); base.child_stats[i].Copy(stat); deserializer.Unset(); @@ -321108,25 +323789,25 @@ struct StorageVersionInfo { idx_t storage_version; }; -static StorageVersionInfo storage_version_info[] = {{"v0.9.0, v0.9.1, v0.9.2 or v0.10.0", 64}, - {"v0.8.0 or v0.8.1", 51}, - {"v0.7.0 or v0.7.1", 43}, - {"v0.6.0 or v0.6.1", 39}, - {"v0.5.0 or v0.5.1", 38}, - {"v0.3.3, v0.3.4 or v0.4.0", 33}, - {"v0.3.2", 31}, - {"v0.3.1", 27}, - {"v0.3.0", 25}, - {"v0.2.9", 21}, - {"v0.2.8", 18}, - {"v0.2.7", 17}, - {"v0.2.6", 15}, - {"v0.2.5", 13}, - {"v0.2.4", 11}, - {"v0.2.3", 6}, - {"v0.2.2", 4}, - {"v0.2.1 and prior", 1}, - {nullptr, 0}}; +static const StorageVersionInfo storage_version_info[] = {{"v0.9.0, v0.9.1, v0.9.2 or v0.10.0", 64}, + {"v0.8.0 or v0.8.1", 51}, + {"v0.7.0 or v0.7.1", 43}, + {"v0.6.0 or v0.6.1", 39}, + {"v0.5.0 or v0.5.1", 38}, + {"v0.3.3, v0.3.4 or v0.4.0", 33}, + {"v0.3.2", 31}, + {"v0.3.1", 27}, + {"v0.3.0", 25}, + {"v0.2.9", 21}, + {"v0.2.8", 18}, + {"v0.2.7", 17}, + {"v0.2.6", 15}, + {"v0.2.5", 13}, + {"v0.2.4", 11}, + {"v0.2.3", 6}, + {"v0.2.2", 4}, + {"v0.2.1 and prior", 1}, + {nullptr, 0}}; const char *GetDuckDBVersion(idx_t version_number) { for (idx_t i = 0; storage_version_info[i].version_name; i++) { @@ -321228,6 +323909,10 @@ BufferManager &BufferManager::GetBufferManager(ClientContext &context) { return BufferManager::GetBufferManager(*context.db); } +const BufferManager &BufferManager::GetBufferManager(const ClientContext &context) { + return BufferManager::GetBufferManager(*context.db); +} + ObjectCache &ObjectCache::GetObjectCache(ClientContext &context) { return context.db->GetObjectCache(); } @@ -321267,14 +323952,14 @@ bool StorageManager::InMemory() { return path == IN_MEMORY_PATH; } -void StorageManager::Initialize() { +void StorageManager::Initialize(optional_ptr context) { bool in_memory = InMemory(); if (in_memory && read_only) { throw CatalogException("Cannot launch in-memory database in read-only mode!"); } // create or load the database from disk, if not in-memory mode - LoadDatabase(); + LoadDatabase(context); } /////////////////////////////////////////////////////////////////////////// @@ -321301,8 +323986,7 @@ SingleFileStorageManager::SingleFileStorageManager(AttachedDatabase &db, string : StorageManager(db, std::move(path), read_only) { } -void SingleFileStorageManager::LoadDatabase() { - +void SingleFileStorageManager::LoadDatabase(optional_ptr context) { if (InMemory()) { block_manager = make_uniq(BufferManager::GetBufferManager(db)); table_io_manager = make_uniq(*block_manager); @@ -321323,12 +324007,11 @@ void SingleFileStorageManager::LoadDatabase() { options.debug_initialize = config.options.debug_initialize; // first check if the database exists - if (!fs.FileExists(path)) { - if (read_only) { - throw CatalogException("Cannot open database \"%s\" in read-only mode: database does not exist", path); - } + if (!read_only && !fs.FileExists(path)) { + // file does not exist and we are in read-write mode + // create a new file - // check if the WAL exists + // check if a WAL file already exists auto wal_path = GetWALPath(); if (fs.FileExists(wal_path)) { // WAL file exists but database file does not @@ -321341,8 +324024,10 @@ void SingleFileStorageManager::LoadDatabase() { sf_block_manager->CreateNewDatabase(); block_manager = std::move(sf_block_manager); table_io_manager = make_uniq(*block_manager); - } else { + // either the file exists, or we are in read-only mode + // try to read the existing file on disk + // initialize the block manager while loading the current db file auto sf_block_manager = make_uniq(db, path, options); sf_block_manager->LoadExistingDatabase(); @@ -321351,13 +324036,14 @@ void SingleFileStorageManager::LoadDatabase() { // load the db from storage auto checkpoint_reader = SingleFileCheckpointReader(*this); - checkpoint_reader.LoadFromStorage(); + checkpoint_reader.LoadFromStorage(context); // check if the WAL file exists auto wal_path = GetWALPath(); - if (fs.FileExists(wal_path)) { + auto handle = fs.OpenFile(wal_path, FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS); + if (handle) { // replay the WAL - if (WriteAheadLog::Replay(db, wal_path)) { + if (WriteAheadLog::Replay(db, std::move(handle))) { fs.RemoveFile(wal_path); } } @@ -321811,6 +324497,52 @@ void ArrayColumnData::Verify(RowGroup &parent) { +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/transaction/delete_info.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + +namespace duckdb { +class DataTable; +class RowVersionManager; + +struct DeleteInfo { + DataTable *table; + RowVersionManager *version_info; + idx_t vector_idx; + idx_t count; + idx_t base_row; + //! Whether or not row ids are consecutive (0, 1, 2, ..., count). + //! If this is true no rows are stored and `rows` should not be accessed. + bool is_consecutive; + + uint16_t *GetRows() { + if (is_consecutive) { + throw InternalException("DeleteInfo is consecutive - rows are not accessible"); + } + return rows; + } + const uint16_t *GetRows() const { + if (is_consecutive) { + throw InternalException("DeleteInfo is consecutive - rows are not accessible"); + } + return rows; + } + +private: + //! The per-vector row identifiers (actual row id is base_row + rows[x]) + uint16_t rows[1]; +}; + +} // namespace duckdb + namespace duckdb { @@ -322005,9 +324737,16 @@ idx_t ChunkVectorInfo::Delete(transaction_t transaction_id, row_t rows[], idx_t return deleted_tuples; } -void ChunkVectorInfo::CommitDelete(transaction_t commit_id, row_t rows[], idx_t count) { - for (idx_t i = 0; i < count; i++) { - deleted[rows[i]] = commit_id; +void ChunkVectorInfo::CommitDelete(transaction_t commit_id, const DeleteInfo &info) { + if (info.is_consecutive) { + for (idx_t i = 0; i < info.count; i++) { + deleted[i] = commit_id; + } + } else { + auto rows = info.GetRows(); + for (idx_t i = 0; i < info.count; i++) { + deleted[rows[i]] = commit_id; + } } } @@ -322463,7 +325202,7 @@ struct UpdateNode; class UpdateSegment { public: - UpdateSegment(ColumnData &column_data); + explicit UpdateSegment(ColumnData &column_data); ~UpdateSegment(); ColumnData &column_data; @@ -322592,6 +325331,16 @@ const LogicalType &ColumnData::RootType() const { return type; } +bool ColumnData::HasUpdates() const { + lock_guard update_guard(update_lock); + return updates.get(); +} + +void ColumnData::ClearUpdates() { + lock_guard update_guard(update_lock); + updates.reset(); +} + idx_t ColumnData::GetMaxEntry() { return count; } @@ -322668,26 +325417,52 @@ idx_t ColumnData::ScanVector(ColumnScanState &state, Vector &result, idx_t remai return initial_remaining - remaining; } -template -idx_t ColumnData::ScanVector(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result) { - bool has_updates; - { - lock_guard update_guard(update_lock); - has_updates = updates ? true : false; +unique_ptr ColumnData::GetUpdateStatistics() { + lock_guard update_guard(update_lock); + return updates ? updates->GetStatistics() : nullptr; +} + +void ColumnData::FetchUpdates(TransactionData transaction, idx_t vector_index, Vector &result, idx_t scan_count, + bool allow_updates, bool scan_committed) { + lock_guard update_guard(update_lock); + if (!updates) { + return; } - auto scan_count = ScanVector(state, result, STANDARD_VECTOR_SIZE, has_updates); - if (has_updates) { - lock_guard update_guard(update_lock); - if (!ALLOW_UPDATES && updates->HasUncommittedUpdates(vector_index)) { - throw TransactionException("Cannot create index with outstanding updates"); - } - result.Flatten(scan_count); - if (SCAN_COMMITTED) { - updates->FetchCommitted(vector_index, result); - } else { - updates->FetchUpdates(transaction, vector_index, result); - } + if (!allow_updates && updates->HasUncommittedUpdates(vector_index)) { + throw TransactionException("Cannot create index with outstanding updates"); + } + result.Flatten(scan_count); + if (scan_committed) { + updates->FetchCommitted(vector_index, result); + } else { + updates->FetchUpdates(transaction, vector_index, result); + } +} + +void ColumnData::FetchUpdateRow(TransactionData transaction, row_t row_id, Vector &result, idx_t result_idx) { + lock_guard update_guard(update_lock); + if (!updates) { + return; } + updates->FetchRow(transaction, row_id, result, result_idx); +} + +void ColumnData::UpdateInternal(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, + idx_t update_count, Vector &base_vector) { + lock_guard update_guard(update_lock); + if (!updates) { + updates = make_uniq(*this); + } + updates->Update(transaction, column_index, update_vector, row_ids, update_count, base_vector); +} + +template +idx_t ColumnData::ScanVector(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result) { + idx_t current_row = vector_index * STANDARD_VECTOR_SIZE; + auto vector_count = MinValue(STANDARD_VECTOR_SIZE, count - current_row); + + auto scan_count = ScanVector(state, result, vector_count, HasUpdates()); + FetchUpdates(transaction, vector_index, result, scan_count, ALLOW_UPDATES, SCAN_COMMITTED); return scan_count; } @@ -322712,61 +325487,62 @@ idx_t ColumnData::ScanCommitted(idx_t vector_index, ColumnScanState &state, Vect } } -void ColumnData::ScanCommittedRange(idx_t row_group_start, idx_t offset_in_row_group, idx_t count, Vector &result) { +void ColumnData::ScanCommittedRange(idx_t row_group_start, idx_t offset_in_row_group, idx_t s_count, Vector &result) { ColumnScanState child_state; InitializeScanWithOffset(child_state, row_group_start + offset_in_row_group); - auto scan_count = ScanVector(child_state, result, count, updates ? true : false); - if (updates) { + bool has_updates = HasUpdates(); + auto scan_count = ScanVector(child_state, result, s_count, has_updates); + if (has_updates) { result.Flatten(scan_count); - updates->FetchCommittedRange(offset_in_row_group, count, result); + updates->FetchCommittedRange(offset_in_row_group, s_count, result); } } -idx_t ColumnData::ScanCount(ColumnScanState &state, Vector &result, idx_t count) { - if (count == 0) { +idx_t ColumnData::ScanCount(ColumnScanState &state, Vector &result, idx_t scan_count) { + if (scan_count == 0) { return 0; } // ScanCount can only be used if there are no updates - D_ASSERT(!updates); - return ScanVector(state, result, count, false); + D_ASSERT(!HasUpdates()); + return ScanVector(state, result, scan_count, false); } void ColumnData::Select(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result, - SelectionVector &sel, idx_t &count, const TableFilter &filter) { + SelectionVector &sel, idx_t &s_count, const TableFilter &filter) { idx_t scan_count = Scan(transaction, vector_index, state, result); UnifiedVectorFormat vdata; result.ToUnifiedFormat(scan_count, vdata); - ColumnSegment::FilterSelection(sel, result, vdata, filter, scan_count, count); + ColumnSegment::FilterSelection(sel, result, vdata, filter, scan_count, s_count); } void ColumnData::FilterScan(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result, - SelectionVector &sel, idx_t count) { + SelectionVector &sel, idx_t s_count) { Scan(transaction, vector_index, state, result); - result.Slice(sel, count); + result.Slice(sel, s_count); } void ColumnData::FilterScanCommitted(idx_t vector_index, ColumnScanState &state, Vector &result, SelectionVector &sel, - idx_t count, bool allow_updates) { + idx_t s_count, bool allow_updates) { ScanCommitted(vector_index, state, result, allow_updates); - result.Slice(sel, count); + result.Slice(sel, s_count); } -void ColumnData::Skip(ColumnScanState &state, idx_t count) { - state.Next(count); +void ColumnData::Skip(ColumnScanState &state, idx_t s_count) { + state.Next(s_count); } -void ColumnData::Append(BaseStatistics &stats, ColumnAppendState &state, Vector &vector, idx_t count) { +void ColumnData::Append(BaseStatistics &append_stats, ColumnAppendState &state, Vector &vector, idx_t append_count) { UnifiedVectorFormat vdata; vector.ToUnifiedFormat(count, vdata); - AppendData(stats, state, vdata, count); + AppendData(append_stats, state, vdata, append_count); } -void ColumnData::Append(ColumnAppendState &state, Vector &vector, idx_t count) { +void ColumnData::Append(ColumnAppendState &state, Vector &vector, idx_t append_count) { if (parent || !stats) { throw InternalException("ColumnData::Append called on a column with a parent or without stats"); } - Append(stats->statistics, state, vector, count); + Append(stats->statistics, state, vector, append_count); } bool ColumnData::CheckZonemap(TableFilter &filter) { @@ -322823,14 +325599,15 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) { D_ASSERT(state.current->function.get().append); } -void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, idx_t count) { +void ColumnData::AppendData(BaseStatistics &append_stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, + idx_t append_count) { idx_t offset = 0; - this->count += count; + this->count += append_count; while (true) { // append the data from the vector - idx_t copied_elements = state.current->Append(state, vdata, offset, count); - stats.Merge(state.current->stats.statistics); - if (copied_elements == count) { + idx_t copied_elements = state.current->Append(state, vdata, offset, append_count); + append_stats.Merge(state.current->stats.statistics); + if (copied_elements == append_count) { // finished copying everything break; } @@ -322843,7 +325620,7 @@ void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, Uni state.current->InitializeAppend(state); } offset += copied_elements; - count -= copied_elements; + append_count -= copied_elements; } } @@ -322887,24 +325664,17 @@ void ColumnData::FetchRow(TransactionData transaction, ColumnFetchState &state, // now perform the fetch within the segment segment->FetchRow(state, row_id, result, result_idx); // merge any updates made to this row - lock_guard update_guard(update_lock); - if (updates) { - updates->FetchRow(transaction, row_id, result, result_idx); - } + FetchUpdateRow(transaction, row_id, result, result_idx); } void ColumnData::Update(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, idx_t update_count) { - lock_guard update_guard(update_lock); - if (!updates) { - updates = make_uniq(*this); - } Vector base_vector(type); ColumnScanState state; auto fetch_count = Fetch(state, row_ids[0], base_vector); base_vector.Flatten(fetch_count); - updates->Update(transaction, column_index, update_vector, row_ids, update_count, base_vector); + UpdateInternal(transaction, column_index, update_vector, row_ids, update_count, base_vector); } void ColumnData::UpdateColumn(TransactionData transaction, const vector &column_path, Vector &update_vector, @@ -322914,11 +325684,6 @@ void ColumnData::UpdateColumn(TransactionData transaction, const vector ColumnData::GetUpdateStatistics() { - lock_guard update_guard(update_lock); - return updates ? updates->GetStatistics() : nullptr; -} - void ColumnData::AppendTransientSegment(SegmentLock &l, idx_t start_row) { idx_t vector_segment_size = Storage::BLOCK_SIZE; @@ -322957,11 +325722,11 @@ void ColumnData::CheckpointScan(ColumnSegment &segment, ColumnScanState &state, segment.FetchRow(fetch_state, state.row_index + i, scan_vector, i); } } else { - segment.Scan(state, count, scan_vector, 0, true); + segment.Scan(state, count, scan_vector, 0, !HasUpdates()); } if (updates) { - scan_vector.Flatten(count); + D_ASSERT(scan_vector.GetVectorType() == VectorType::FLAT_VECTOR); updates->FetchCommittedRange(state.row_index - row_group_start, count, scan_vector); } } @@ -322980,14 +325745,13 @@ unique_ptr ColumnData::Checkpoint(RowGroup &row_group, // empty table: flush the empty list return checkpoint_state; } - lock_guard update_guard(update_lock); ColumnDataCheckpointer checkpointer(*this, row_group, *checkpoint_state, checkpoint_info); checkpointer.Checkpoint(std::move(nodes)); // replace the old tree with the new one data.Replace(l, checkpoint_state->new_tree); - updates.reset(); + ClearUpdates(); return checkpoint_state; } @@ -323062,10 +325826,7 @@ void ColumnData::GetColumnSegmentInfo(idx_t row_group_index, vector col_p column_info.segment_count = segment->count; column_info.compression_type = CompressionTypeToString(segment->function.get().type); column_info.segment_stats = segment->stats.statistics.ToString(); - { - lock_guard ulock(update_lock); - column_info.has_updates = updates ? true : false; - } + column_info.has_updates = ColumnData::HasUpdates(); // persistent // block_id // block_offset @@ -324343,6 +327104,7 @@ PersistentTableData::~PersistentTableData() { namespace duckdb { +struct DeleteInfo; class MetadataManager; struct MetaBlockPointer; @@ -324366,7 +327128,7 @@ class RowVersionManager { void RevertAppend(idx_t start_row); idx_t DeleteRows(idx_t vector_idx, transaction_t transaction_id, row_t rows[], idx_t count); - void CommitDelete(idx_t vector_idx, transaction_t commit_id, row_t rows[], idx_t count); + void CommitDelete(idx_t vector_idx, transaction_t commit_id, const DeleteInfo &info); vector Checkpoint(MetadataManager &manager); static shared_ptr Deserialize(MetaBlockPointer delete_pointer, MetadataManager &manager, @@ -324394,15 +327156,15 @@ class RowVersionManager { namespace duckdb { -RowGroup::RowGroup(RowGroupCollection &collection, idx_t start, idx_t count) - : SegmentBase(start, count), collection(collection), allocation_size(0) { +RowGroup::RowGroup(RowGroupCollection &collection_p, idx_t start, idx_t count) + : SegmentBase(start, count), collection(collection_p), allocation_size(0) { Verify(); } -RowGroup::RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer) - : SegmentBase(pointer.row_start, pointer.tuple_count), collection(collection), allocation_size(0) { +RowGroup::RowGroup(RowGroupCollection &collection_p, RowGroupPointer pointer) + : SegmentBase(pointer.row_start, pointer.tuple_count), collection(collection_p), allocation_size(0) { // deserialize the columns - if (pointer.data_pointers.size() != collection.GetTypes().size()) { + if (pointer.data_pointers.size() != collection_p.GetTypes().size()) { throw IOException("Row group column count is unaligned with table column count. Corrupt file?"); } this->column_pointers = std::move(pointer.data_pointers); @@ -324417,8 +327179,8 @@ RowGroup::RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer) Verify(); } -void RowGroup::MoveToCollection(RowGroupCollection &collection, idx_t new_start) { - this->collection = collection; +void RowGroup::MoveToCollection(RowGroupCollection &collection_p, idx_t new_start) { + this->collection = collection_p; this->start = new_start; for (auto &column : GetColumns()) { column->SetStart(new_start); @@ -325400,7 +328162,7 @@ class MetadataReader; class RowGroupSegmentTree : public SegmentTree { public: - RowGroupSegmentTree(RowGroupCollection &collection); + explicit RowGroupSegmentTree(RowGroupCollection &collection); ~RowGroupSegmentTree() override; void Initialize(PersistentTableData &data); @@ -326734,10 +329496,10 @@ idx_t RowVersionManager::DeleteRows(idx_t vector_idx, transaction_t transaction_ return GetVectorInfo(vector_idx).Delete(transaction_id, rows, count); } -void RowVersionManager::CommitDelete(idx_t vector_idx, transaction_t commit_id, row_t rows[], idx_t count) { +void RowVersionManager::CommitDelete(idx_t vector_idx, transaction_t commit_id, const DeleteInfo &info) { lock_guard lock(version_lock); has_changes = true; - GetVectorInfo(vector_idx).CommitDelete(commit_id, rows, count); + GetVectorInfo(vector_idx).CommitDelete(commit_id, info); } vector RowVersionManager::Checkpoint(MetadataManager &manager) { @@ -326968,6 +329730,10 @@ void StandardColumnData::SetStart(idx_t new_start) { validity.SetStart(new_start); } +bool StandardColumnData::HasUpdates() const { + return ColumnData::HasUpdates() || validity.HasUpdates(); +} + bool StandardColumnData::CheckZonemap(ColumnScanState &state, TableFilter &filter) { if (!state.segment_checked) { if (!state.current) { @@ -327679,7 +330445,7 @@ struct UpdateInfo { //! The vector index within the uncompressed segment idx_t vector_index; //! The amount of updated tuples - sel_t N; + sel_t N; // NOLINT //! The maximum amount of tuples that can fit into this UpdateInfo sel_t max; //! The row ids of the tuples that have been updated. This should always be kept sorted! @@ -328210,7 +330976,9 @@ void UpdateSegment::RollbackUpdate(UpdateInfo &info) { auto lock_handle = lock.GetExclusiveLock(); // move the data from the UpdateInfo back into the base info - D_ASSERT(root->info[info.vector_index]); + if (!root->info[info.vector_index]) { + return; + } rollback_update_function(*root->info[info.vector_index]->info, info); // clean up the update chain @@ -329017,7 +331785,7 @@ bool TableIndexList::NameIsUnique(const string &name) { return true; } -void TableIndexList::InitializeIndexes(ClientContext &context, DataTableInfo &table_info) { +void TableIndexList::InitializeIndexes(ClientContext &context, DataTableInfo &table_info, bool throw_on_failure) { lock_guard lock(indexes_lock); for (auto &index : indexes) { if (!index->IsUnknown()) { @@ -329030,6 +331798,11 @@ void TableIndexList::InitializeIndexes(ClientContext &context, DataTableInfo &ta // Do we know the type of this index now? auto index_type = context.db->config.GetIndexTypes().FindByName(index_type_name); if (!index_type) { + if (throw_on_failure) { + throw MissingExtensionException( + "Cannot initialize index '%s', unknown index type '%s'. You probably need to load an extension.", + unknown_index.name, index_type_name); + } continue; } @@ -329253,7 +332026,7 @@ void TemporaryFileHandle::CreateFileIfNotExists(TemporaryFileLock &) { return; } auto &fs = FileSystem::GetFileSystem(db); - uint8_t open_flags = FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; + auto open_flags = FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; handle = fs.OpenFile(path, open_flags); } @@ -329758,10 +332531,10 @@ class WriteAheadLogDeserializer { //===--------------------------------------------------------------------===// // Replay //===--------------------------------------------------------------------===// -bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { +bool WriteAheadLog::Replay(AttachedDatabase &database, unique_ptr handle) { Connection con(database.GetDatabase()); - auto initial_source = make_uniq(FileSystem::Get(database), path.c_str()); - if (initial_source->Finished()) { + BufferedFileReader reader(FileSystem::Get(database), std::move(handle)); + if (reader.Finished()) { // WAL is empty return false; } @@ -329774,10 +332547,10 @@ bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { try { while (true) { // read the current entry (deserialize only) - auto deserializer = WriteAheadLogDeserializer::Open(checkpoint_state, *initial_source, true); + auto deserializer = WriteAheadLogDeserializer::Open(checkpoint_state, reader, true); if (deserializer.ReplayEntry()) { // check if the file is exhausted - if (initial_source->Finished()) { + if (reader.Finished()) { // we finished reading the file: break break; } @@ -329796,7 +332569,6 @@ bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { Printer::Print("Unknown Exception in WAL playback during initial read"); return false; } // LCOV_EXCL_STOP - initial_source.reset(); if (checkpoint_state.checkpoint_id.IsValid()) { // there is a checkpoint flag: check if we need to deserialize the WAL auto &manager = database.GetStorageManager(); @@ -329808,9 +332580,11 @@ bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { } // we need to recover from the WAL: actually set up the replay state - BufferedFileReader reader(FileSystem::Get(database), path.c_str()); ReplayState state(database, *con.context); + // reset the reader - we are going to read the WAL from the beginning again + reader.Reset(); + // replay the WAL // note that everything is wrapped inside a try/catch block here // there can be errors in WAL replay because of a corrupt WAL file @@ -330336,10 +333110,9 @@ const uint64_t WAL_VERSION_NUMBER = 2; WriteAheadLog::WriteAheadLog(AttachedDatabase &database, const string &path) : skip_writing(false), database(database) { wal_path = path; - writer = make_uniq(FileSystem::Get(database), path.c_str(), - NumericCast(FileFlags::FILE_FLAGS_WRITE | - FileFlags::FILE_FLAGS_FILE_CREATE | - FileFlags::FILE_FLAGS_APPEND)); + writer = make_uniq(FileSystem::Get(database), path, + FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE | + FileFlags::FILE_FLAGS_APPEND); } WriteAheadLog::~WriteAheadLog() { @@ -330759,32 +333532,6 @@ class CleanupState { } // namespace duckdb -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/transaction/delete_info.hpp -// -// -//===----------------------------------------------------------------------===// - - - - - -namespace duckdb { -class DataTable; -class RowVersionManager; - -struct DeleteInfo { - DataTable *table; - RowVersionManager *version_info; - idx_t vector_idx; - idx_t count; - idx_t base_row; - row_t rows[1]; -}; - -} // namespace duckdb @@ -330856,8 +333603,15 @@ void CleanupState::CleanupDelete(DeleteInfo &info) { indexed_tables[current_table->info->table] = current_table; count = 0; - for (idx_t i = 0; i < info.count; i++) { - row_numbers[count++] = info.base_row + info.rows[i]; + if (info.is_consecutive) { + for (idx_t i = 0; i < info.count; i++) { + row_numbers[count++] = info.base_row + i; + } + } else { + auto rows = info.GetRows(); + for (idx_t i = 0; i < info.count; i++) { + row_numbers[count++] = info.base_row + rows[i]; + } } Flush(); } @@ -330873,7 +333627,7 @@ void CleanupState::Flush() { // delete the tuples from all the indexes try { current_table->RemoveFromIndexes(row_identifiers, count); - } catch (...) { + } catch (...) { // NOLINT: ignore errors here } count = 0; @@ -331159,8 +333913,15 @@ void CommitState::WriteDelete(DeleteInfo &info) { delete_chunk->Initialize(Allocator::DefaultAllocator(), delete_types); } auto rows = FlatVector::GetData(delete_chunk->data[0]); - for (idx_t i = 0; i < info.count; i++) { - rows[i] = info.base_row + info.rows[i]; + if (info.is_consecutive) { + for (idx_t i = 0; i < info.count; i++) { + rows[i] = info.base_row + i; + } + } else { + auto delete_rows = info.GetRows(); + for (idx_t i = 0; i < info.count; i++) { + rows[i] = info.base_row + delete_rows[i]; + } } delete_chunk->SetCardinality(info.count); log->WriteDelete(*delete_chunk); @@ -331265,7 +334026,7 @@ void CommitState::CommitEntry(UndoFlags type, data_ptr_t data) { WriteDelete(*info); } // mark the tuples as committed - info->version_info->CommitDelete(info->vector_idx, commit_id, info->rows, info->count); + info->version_info->CommitDelete(info->vector_idx, commit_id, *info); break; } case UndoFlags::UPDATE_TUPLE: { @@ -331306,7 +334067,7 @@ void CommitState::RevertCommit(UndoFlags type, data_ptr_t data) { auto info = reinterpret_cast(data); info->table->info->cardinality += info->count; // revert the commit by writing the (uncommitted) transaction_id back into the version info - info->version_info->CommitDelete(info->vector_idx, transaction_id, info->rows, info->count); + info->version_info->CommitDelete(info->vector_idx, transaction_id, *info); break; } case UndoFlags::UPDATE_TUPLE: { @@ -331399,14 +334160,34 @@ void DuckTransaction::PushCatalogEntry(CatalogEntry &entry, data_ptr_t extra_dat void DuckTransaction::PushDelete(DataTable &table, RowVersionManager &info, idx_t vector_idx, row_t rows[], idx_t count, idx_t base_row) { - auto delete_info = reinterpret_cast( - undo_buffer.CreateEntry(UndoFlags::DELETE_TUPLE, sizeof(DeleteInfo) + sizeof(row_t) * count)); + bool is_consecutive = true; + // check if the rows are consecutive + for (idx_t i = 0; i < count; i++) { + if (rows[i] != row_t(i)) { + is_consecutive = false; + break; + } + } + idx_t alloc_size = sizeof(DeleteInfo); + if (!is_consecutive) { + // if rows are not consecutive we need to allocate row identifiers + alloc_size += sizeof(uint16_t) * count; + } + + auto delete_info = reinterpret_cast(undo_buffer.CreateEntry(UndoFlags::DELETE_TUPLE, alloc_size)); delete_info->version_info = &info; delete_info->vector_idx = vector_idx; delete_info->table = &table; delete_info->count = count; delete_info->base_row = base_row; - memcpy(delete_info->rows, rows, sizeof(row_t) * count); + delete_info->is_consecutive = is_consecutive; + if (!is_consecutive) { + // if rows are not consecutive + auto delete_rows = delete_info->GetRows(); + for (idx_t i = 0; i < count; i++) { + delete_rows[i] = NumericCast(rows[i]); + } + } } void DuckTransaction::PushAppend(DataTable &table, idx_t start_row, idx_t row_count) { @@ -332025,7 +334806,7 @@ void RollbackState::RollbackEntry(UndoFlags type, data_ptr_t data) { case UndoFlags::DELETE_TUPLE: { auto info = reinterpret_cast(data); // reset the deleted flag on rollback - info->version_info->CommitDelete(info->vector_idx, NOT_DELETED_ID, info->rows, info->count); + info->version_info->CommitDelete(info->vector_idx, NOT_DELETED_ID, *info); break; } case UndoFlags::UPDATE_TUPLE: { @@ -332084,7 +334865,7 @@ TransactionContext::~TransactionContext() { if (current_transaction) { try { Rollback(); - } catch (...) { + } catch (...) { // NOLINT } } } @@ -332324,7 +335105,9 @@ void UndoBuffer::Cleanup() { // possibly vacuum indexes for (const auto &table : state.indexed_tables) { table.second->info->indexes.Scan([&](Index &index) { - index.Vacuum(); + if (!index.IsUnknown()) { + index.Vacuum(); + } return false; }); } @@ -334768,19 +337551,6 @@ struct SIMDjob { u64 out:19,pos:9,end:18,cur:18; // cur/end is input offsets (2^18=256KB), out is output offset (2^19=512KB) }; -extern bool -duckdb_fsst_hasAVX512(); // runtime check for avx512 capability - -extern size_t -duckdb_fsst_compressAVX512( - SymbolTable &symbolTable, - u8* codeBase, // IN: base address for codes, i.e. compression output (points to simdbuf+256KB) - u8* symbolBase, // IN: base address for string bytes, i.e. compression input (points to simdbuf) - SIMDjob* input, // IN: input array (size n) with job information: what to encode, where to store it. - SIMDjob* output, // OUT: output array (size n) with job information: how much got encoded, end output pointer. - size_t n, // IN: size of arrays input and output (should be max 512) - size_t unroll); // IN: degree of SIMD unrolling - // C++ fsst-compress function with some more control of how the compression happens (algorithm flavor, simd unroll degree) size_t compressImpl(Encoder *encoder, size_t n, size_t lenIn[], u8 *strIn[], size_t size, u8 * output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int simd); size_t compressAuto(Encoder *encoder, size_t n, size_t lenIn[], u8 *strIn[], size_t size, u8 * output, size_t *lenOut, u8 *strOut[], int simd); @@ -334789,761 +337559,6 @@ size_t compressAuto(Encoder *encoder, size_t n, size_t lenIn[], u8 *strIn[], siz // LICENSE_CHANGE_END -#if DUCKDB_FSST_ENABLE_INTRINSINCS && (defined(__x86_64__) || defined(_M_X64)) -#include - -#ifdef _WIN32 -bool duckdb_fsst_hasAVX512() { - int info[4]; - __cpuidex(info, 0x00000007, 0); - return (info[1]>>16)&1; -} -#else -#include -bool duckdb_fsst_hasAVX512() { - int info[4]; - __cpuid_count(0x00000007, 0, info[0], info[1], info[2], info[3]); - return (info[1]>>16)&1; -} -#endif -#else -bool duckdb_fsst_hasAVX512() { return false; } -#endif - -// BULK COMPRESSION OF STRINGS -// -// In one call of this function, we can compress 512 strings, each of maximum length 511 bytes. -// strings can be shorter than 511 bytes, no problem, but if they are longer we need to cut them up. -// -// In each iteration of the while loop, we find one code in each of the unroll*8 strings, i.e. (8,16,24 or 32) for resp. unroll=1,2,3,4 -// unroll3 performs best on my hardware -// -// In the worst case, each final encoded string occupies 512KB bytes (512*1024; with 1024=512xexception, exception = 2 bytes). -// - hence codeBase is a buffer of 512KB (needs 19 bits jobs), symbolBase of 256KB (needs 18 bits jobs). -// -// 'jobX' controls the encoding of each string and is therefore a u64 with format [out:19][pos:9][end:18][cur:18] (low-to-high bits) -// The field 'pos' tells which string we are processing (0..511). We need this info as strings will complete compressing out-of-order. -// -// Strings will have different lengths, and when a string is finished, we reload from the buffer of 512 input strings. -// This continues until we have less than (8,16,24 or 32; depending on unroll) strings left to process. -// - so 'processed' is the amount of strings we started processing and it is between [480,512]. -// Note that when we quit, there will still be some (<32) strings that we started to process but which are unfinished. -// - so 'unfinished' is that amount. These unfinished strings will be encoded further using the scalar method. -// -// Apart from the coded strings, we return in a output[] array of size 'processed' the job values of the 'finished' strings. -// In the following 'unfinished' slots (processed=finished+unfinished) we output the 'job' values of the unfinished strings. -// -// For the finished strings, we need [out:19] to see the compressed size and [pos:9] to see which string we refer to. -// For the unfinished strings, we need all fields of 'job' to continue the compression with scalar code (see SIMD code in compressBatch). -// -// THIS IS A SEPARATE CODE FILE NOT BECAUSE OF MY LOVE FOR MODULARIZED CODE BUT BECAUSE IT ALLOWS TO COMPILE IT WITH DIFFERENT FLAGS -// in particular, unrolling is crucial for gather/scatter performance, but requires registers. the #define all_* expressions however, -// will be detected to be constants by g++ -O2 and will be precomputed and placed into AVX512 registers - spoiling 9 of them. -// This reduces the effectiveness of unrolling, hence -O2 makes the loop perform worse than -O1 which skips this optimization. -// Assembly inspection confirmed that 3-way unroll with -O1 avoids needless load/stores. - -size_t duckdb_fsst_compressAVX512(SymbolTable &symbolTable, u8* codeBase, u8* symbolBase, SIMDjob *input, SIMDjob *output, size_t n, size_t unroll) { - size_t processed = 0; - // define some constants (all_x means that all 8 lanes contain 64-bits value X) -#if defined(__AVX512F__) and DUCKDB_FSST_ENABLE_INTRINSINCS - //__m512i all_suffixLim= _mm512_broadcastq_epi64(_mm_set1_epi64((__m64) (u64) symbolTable->suffixLim)); -- for variants b,c - __m512i all_MASK = _mm512_broadcastq_epi64(_mm_set1_epi64((__m64) (u64) -1)); - __m512i all_PRIME = _mm512_broadcastq_epi64(_mm_set1_epi64((__m64) (u64) FSST_HASH_PRIME)); - __m512i all_ICL_FREE = _mm512_broadcastq_epi64(_mm_set1_epi64((__m64) (u64) FSST_ICL_FREE)); -#define all_HASH _mm512_srli_epi64(all_MASK, 64-FSST_HASH_LOG2SIZE) -#define all_ONE _mm512_srli_epi64(all_MASK, 63) -#define all_M19 _mm512_srli_epi64(all_MASK, 45) -#define all_M18 _mm512_srli_epi64(all_MASK, 46) -#define all_M28 _mm512_srli_epi64(all_MASK, 36) -#define all_FFFFFF _mm512_srli_epi64(all_MASK, 40) -#define all_FFFF _mm512_srli_epi64(all_MASK, 48) -#define all_FF _mm512_srli_epi64(all_MASK, 56) - - SIMDjob *inputEnd = input+n; - assert(n >= unroll*8 && n <= 512); // should be close to 512 - __m512i job1, job2, job3, job4; // will contain current jobs, for each unroll 1,2,3,4 - __mmask8 loadmask1 = 255, loadmask2 = 255*(unroll>1), loadmask3 = 255*(unroll>2), loadmask4 = 255*(unroll>3); // 2b loaded new strings bitmask per unroll - u32 delta1 = 8, delta2 = 8*(unroll>1), delta3 = 8*(unroll>2), delta4 = 8*(unroll>3); // #new loads this SIMD iteration per unroll - - if (unroll >= 4) { - while (input+delta1+delta2+delta3+delta4 < inputEnd) { - - -// LICENSE_CHANGE_BEGIN -// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #6 -// See the end of this file for a list - -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// -// -// -// -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// -// -// -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// furnished to do so, subject to the following conditions: -// furnished to do so, subject to the following conditions: -// furnished to do so, subject to the following conditions: -// -// -// -// -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// -// -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E1PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E2PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E3PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E4PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// -// -// -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// -// -// -// - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask1=11111111, delta1=8). - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask2=11111111, delta2=8). - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask3=11111111, delta3=8). - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask4=11111111, delta4=8). - job1 = _mm512_mask_expandloadu_epi64(job1, loadmask1, input); input += delta1; - job2 = _mm512_mask_expandloadu_epi64(job2, loadmask2, input); input += delta2; - job3 = _mm512_mask_expandloadu_epi64(job3, loadmask3, input); input += delta3; - job4 = _mm512_mask_expandloadu_epi64(job4, loadmask4, input); input += delta4; - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - __m512i word1 = _mm512_i64gather_epi64(_mm512_srli_epi64(job1, 46), symbolBase, 1); - __m512i word2 = _mm512_i64gather_epi64(_mm512_srli_epi64(job2, 46), symbolBase, 1); - __m512i word3 = _mm512_i64gather_epi64(_mm512_srli_epi64(job3, 46), symbolBase, 1); - __m512i word4 = _mm512_i64gather_epi64(_mm512_srli_epi64(job4, 46), symbolBase, 1); - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // code1: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - // code2: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - // code3: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - // code4: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - __m512i code1 = _mm512_i64gather_epi64(_mm512_and_epi64(word1, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - __m512i code2 = _mm512_i64gather_epi64(_mm512_and_epi64(word2, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - __m512i code3 = _mm512_i64gather_epi64(_mm512_and_epi64(word3, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - __m512i code4 = _mm512_i64gather_epi64(_mm512_and_epi64(word4, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - // get the first three bytes of the string. - // get the first three bytes of the string. - // get the first three bytes of the string. - // get the first three bytes of the string. - __m512i pos1 = _mm512_mullo_epi64(_mm512_and_epi64(word1, all_FFFFFF), all_PRIME); - __m512i pos2 = _mm512_mullo_epi64(_mm512_and_epi64(word2, all_FFFFFF), all_PRIME); - __m512i pos3 = _mm512_mullo_epi64(_mm512_and_epi64(word3, all_FFFFFF), all_PRIME); - __m512i pos4 = _mm512_mullo_epi64(_mm512_and_epi64(word4, all_FFFFFF), all_PRIME); - // hash them into a random number: pos1 = pos1*PRIME; pos1 ^= pos1>>SHIFT - // hash them into a random number: pos2 = pos2*PRIME; pos2 ^= pos2>>SHIFT - // hash them into a random number: pos3 = pos3*PRIME; pos3 ^= pos3>>SHIFT - // hash them into a random number: pos4 = pos4*PRIME; pos4 ^= pos4>>SHIFT - pos1 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos1,_mm512_srli_epi64(pos1,FSST_SHIFT)), all_HASH), 4); - pos2 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos2,_mm512_srli_epi64(pos2,FSST_SHIFT)), all_HASH), 4); - pos3 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos3,_mm512_srli_epi64(pos3,FSST_SHIFT)), all_HASH), 4); - pos4 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos4,_mm512_srli_epi64(pos4,FSST_SHIFT)), all_HASH), 4); - // lookup in the 3-byte-prefix keyed hash table - // lookup in the 3-byte-prefix keyed hash table - // lookup in the 3-byte-prefix keyed hash table - // lookup in the 3-byte-prefix keyed hash table - __m512i icl1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 8), 1); - __m512i icl2 = _mm512_i64gather_epi64(pos2, (((char*) symbolTable.hashTab) + 8), 1); - __m512i icl3 = _mm512_i64gather_epi64(pos3, (((char*) symbolTable.hashTab) + 8), 1); - __m512i icl4 = _mm512_i64gather_epi64(pos4, (((char*) symbolTable.hashTab) + 8), 1); - // speculatively store the first input byte into the second position of the write1 register (in case it turns out to be an escaped byte). - // speculatively store the first input byte into the second position of the write2 register (in case it turns out to be an escaped byte). - // speculatively store the first input byte into the second position of the write3 register (in case it turns out to be an escaped byte). - // speculatively store the first input byte into the second position of the write4 register (in case it turns out to be an escaped byte). - __m512i write1 = _mm512_slli_epi64(_mm512_and_epi64(word1, all_FF), 8); - __m512i write2 = _mm512_slli_epi64(_mm512_and_epi64(word2, all_FF), 8); - __m512i write3 = _mm512_slli_epi64(_mm512_and_epi64(word3, all_FF), 8); - __m512i write4 = _mm512_slli_epi64(_mm512_and_epi64(word4, all_FF), 8); - // lookup just like the icl1 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - // lookup just like the icl2 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - // lookup just like the icl3 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - // lookup just like the icl4 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - __m512i symb1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 0), 1); - __m512i symb2 = _mm512_i64gather_epi64(pos2, (((char*) symbolTable.hashTab) + 0), 1); - __m512i symb3 = _mm512_i64gather_epi64(pos3, (((char*) symbolTable.hashTab) + 0), 1); - __m512i symb4 = _mm512_i64gather_epi64(pos4, (((char*) symbolTable.hashTab) + 0), 1); - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - pos1 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl1, all_FF)); - pos2 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl2, all_FF)); - pos3 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl3, all_FF)); - pos4 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl4, all_FF)); - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - __mmask8 match1 = _mm512_cmpeq_epi64_mask(symb1, _mm512_and_epi64(word1, pos1)) & _mm512_cmplt_epi64_mask(icl1, all_ICL_FREE); - __mmask8 match2 = _mm512_cmpeq_epi64_mask(symb2, _mm512_and_epi64(word2, pos2)) & _mm512_cmplt_epi64_mask(icl2, all_ICL_FREE); - __mmask8 match3 = _mm512_cmpeq_epi64_mask(symb3, _mm512_and_epi64(word3, pos3)) & _mm512_cmplt_epi64_mask(icl3, all_ICL_FREE); - __mmask8 match4 = _mm512_cmpeq_epi64_mask(symb4, _mm512_and_epi64(word4, pos4)) & _mm512_cmplt_epi64_mask(icl4, all_ICL_FREE); - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - code1 = _mm512_mask_mov_epi64(code1, match1, _mm512_srli_epi64(icl1, 16)); - code2 = _mm512_mask_mov_epi64(code2, match2, _mm512_srli_epi64(icl2, 16)); - code3 = _mm512_mask_mov_epi64(code3, match3, _mm512_srli_epi64(icl3, 16)); - code4 = _mm512_mask_mov_epi64(code4, match4, _mm512_srli_epi64(icl4, 16)); - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - write1 = _mm512_or_epi64(write1, _mm512_and_epi64(code1, all_FF)); - write2 = _mm512_or_epi64(write2, _mm512_and_epi64(code2, all_FF)); - write3 = _mm512_or_epi64(write3, _mm512_and_epi64(code3, all_FF)); - write4 = _mm512_or_epi64(write4, _mm512_and_epi64(code4, all_FF)); - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - code1 = _mm512_and_epi64(code1, all_FFFF); - code2 = _mm512_and_epi64(code2, all_FFFF); - code3 = _mm512_and_epi64(code3, all_FFFF); - code4 = _mm512_and_epi64(code4, all_FFFF); - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job1, all_M19), write1, 1); - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job2, all_M19), write2, 1); - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job3, all_M19), write3, 1); - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job4, all_M19), write4, 1); - // increase the job1.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - // increase the job2.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - // increase the job3.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - // increase the job4.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - job1 = _mm512_add_epi64(job1, _mm512_slli_epi64(_mm512_srli_epi64(code1, FSST_LEN_BITS), 46)); - job2 = _mm512_add_epi64(job2, _mm512_slli_epi64(_mm512_srli_epi64(code2, FSST_LEN_BITS), 46)); - job3 = _mm512_add_epi64(job3, _mm512_slli_epi64(_mm512_srli_epi64(code3, FSST_LEN_BITS), 46)); - job4 = _mm512_add_epi64(job4, _mm512_slli_epi64(_mm512_srli_epi64(code4, FSST_LEN_BITS), 46)); - // increase the job1.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - // increase the job2.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - // increase the job3.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - // increase the job4.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - job1 = _mm512_add_epi64(job1, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code1, 8), all_ONE))); - job2 = _mm512_add_epi64(job2, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code2, 8), all_ONE))); - job3 = _mm512_add_epi64(job3, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code3, 8), all_ONE))); - job4 = _mm512_add_epi64(job4, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code4, 8), all_ONE))); - // test which lanes are done now (job1.cur==job1.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job1 register) - // test which lanes are done now (job2.cur==job2.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job2 register) - // test which lanes are done now (job3.cur==job3.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job3 register) - // test which lanes are done now (job4.cur==job4.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job4 register) - loadmask1 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job1, 46), _mm512_and_epi64(_mm512_srli_epi64(job1, 28), all_M18)); - loadmask2 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job2, 46), _mm512_and_epi64(_mm512_srli_epi64(job2, 28), all_M18)); - loadmask3 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job3, 46), _mm512_and_epi64(_mm512_srli_epi64(job3, 28), all_M18)); - loadmask4 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job4, 46), _mm512_and_epi64(_mm512_srli_epi64(job4, 28), all_M18)); - // calculate the amount of lanes in job1 that are done - // calculate the amount of lanes in job2 that are done - // calculate the amount of lanes in job3 that are done - // calculate the amount of lanes in job4 that are done - delta1 = _mm_popcnt_u32((int) loadmask1); - delta2 = _mm_popcnt_u32((int) loadmask2); - delta3 = _mm_popcnt_u32((int) loadmask3); - delta4 = _mm_popcnt_u32((int) loadmask4); - // write out the job state for the lanes that are done (we need the final 'job1.out' value to compute the compressed string length) - // write out the job state for the lanes that are done (we need the final 'job2.out' value to compute the compressed string length) - // write out the job state for the lanes that are done (we need the final 'job3.out' value to compute the compressed string length) - // write out the job state for the lanes that are done (we need the final 'job4.out' value to compute the compressed string length) - _mm512_mask_compressstoreu_epi64(output, loadmask1, job1); output += delta1; - _mm512_mask_compressstoreu_epi64(output, loadmask2, job2); output += delta2; - _mm512_mask_compressstoreu_epi64(output, loadmask3, job3); output += delta3; - _mm512_mask_compressstoreu_epi64(output, loadmask4, job4); output += delta4; - - -// LICENSE_CHANGE_END - - } - } else if (unroll == 3) { - while (input+delta1+delta2+delta3 < inputEnd) { - - -// LICENSE_CHANGE_BEGIN -// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #6 -// See the end of this file for a list - -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// -// -// -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// -// -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// furnished to do so, subject to the following conditions: -// furnished to do so, subject to the following conditions: -// -// -// -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E1PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E2PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E3PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// -// -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// -// -// - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask1=11111111, delta1=8). - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask2=11111111, delta2=8). - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask3=11111111, delta3=8). - job1 = _mm512_mask_expandloadu_epi64(job1, loadmask1, input); input += delta1; - job2 = _mm512_mask_expandloadu_epi64(job2, loadmask2, input); input += delta2; - job3 = _mm512_mask_expandloadu_epi64(job3, loadmask3, input); input += delta3; - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - __m512i word1 = _mm512_i64gather_epi64(_mm512_srli_epi64(job1, 46), symbolBase, 1); - __m512i word2 = _mm512_i64gather_epi64(_mm512_srli_epi64(job2, 46), symbolBase, 1); - __m512i word3 = _mm512_i64gather_epi64(_mm512_srli_epi64(job3, 46), symbolBase, 1); - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // code1: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - // code2: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - // code3: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - __m512i code1 = _mm512_i64gather_epi64(_mm512_and_epi64(word1, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - __m512i code2 = _mm512_i64gather_epi64(_mm512_and_epi64(word2, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - __m512i code3 = _mm512_i64gather_epi64(_mm512_and_epi64(word3, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - // get the first three bytes of the string. - // get the first three bytes of the string. - // get the first three bytes of the string. - __m512i pos1 = _mm512_mullo_epi64(_mm512_and_epi64(word1, all_FFFFFF), all_PRIME); - __m512i pos2 = _mm512_mullo_epi64(_mm512_and_epi64(word2, all_FFFFFF), all_PRIME); - __m512i pos3 = _mm512_mullo_epi64(_mm512_and_epi64(word3, all_FFFFFF), all_PRIME); - // hash them into a random number: pos1 = pos1*PRIME; pos1 ^= pos1>>SHIFT - // hash them into a random number: pos2 = pos2*PRIME; pos2 ^= pos2>>SHIFT - // hash them into a random number: pos3 = pos3*PRIME; pos3 ^= pos3>>SHIFT - pos1 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos1,_mm512_srli_epi64(pos1,FSST_SHIFT)), all_HASH), 4); - pos2 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos2,_mm512_srli_epi64(pos2,FSST_SHIFT)), all_HASH), 4); - pos3 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos3,_mm512_srli_epi64(pos3,FSST_SHIFT)), all_HASH), 4); - // lookup in the 3-byte-prefix keyed hash table - // lookup in the 3-byte-prefix keyed hash table - // lookup in the 3-byte-prefix keyed hash table - __m512i icl1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 8), 1); - __m512i icl2 = _mm512_i64gather_epi64(pos2, (((char*) symbolTable.hashTab) + 8), 1); - __m512i icl3 = _mm512_i64gather_epi64(pos3, (((char*) symbolTable.hashTab) + 8), 1); - // speculatively store the first input byte into the second position of the write1 register (in case it turns out to be an escaped byte). - // speculatively store the first input byte into the second position of the write2 register (in case it turns out to be an escaped byte). - // speculatively store the first input byte into the second position of the write3 register (in case it turns out to be an escaped byte). - __m512i write1 = _mm512_slli_epi64(_mm512_and_epi64(word1, all_FF), 8); - __m512i write2 = _mm512_slli_epi64(_mm512_and_epi64(word2, all_FF), 8); - __m512i write3 = _mm512_slli_epi64(_mm512_and_epi64(word3, all_FF), 8); - // lookup just like the icl1 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - // lookup just like the icl2 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - // lookup just like the icl3 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - __m512i symb1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 0), 1); - __m512i symb2 = _mm512_i64gather_epi64(pos2, (((char*) symbolTable.hashTab) + 0), 1); - __m512i symb3 = _mm512_i64gather_epi64(pos3, (((char*) symbolTable.hashTab) + 0), 1); - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - pos1 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl1, all_FF)); - pos2 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl2, all_FF)); - pos3 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl3, all_FF)); - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - __mmask8 match1 = _mm512_cmpeq_epi64_mask(symb1, _mm512_and_epi64(word1, pos1)) & _mm512_cmplt_epi64_mask(icl1, all_ICL_FREE); - __mmask8 match2 = _mm512_cmpeq_epi64_mask(symb2, _mm512_and_epi64(word2, pos2)) & _mm512_cmplt_epi64_mask(icl2, all_ICL_FREE); - __mmask8 match3 = _mm512_cmpeq_epi64_mask(symb3, _mm512_and_epi64(word3, pos3)) & _mm512_cmplt_epi64_mask(icl3, all_ICL_FREE); - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - code1 = _mm512_mask_mov_epi64(code1, match1, _mm512_srli_epi64(icl1, 16)); - code2 = _mm512_mask_mov_epi64(code2, match2, _mm512_srli_epi64(icl2, 16)); - code3 = _mm512_mask_mov_epi64(code3, match3, _mm512_srli_epi64(icl3, 16)); - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - write1 = _mm512_or_epi64(write1, _mm512_and_epi64(code1, all_FF)); - write2 = _mm512_or_epi64(write2, _mm512_and_epi64(code2, all_FF)); - write3 = _mm512_or_epi64(write3, _mm512_and_epi64(code3, all_FF)); - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - code1 = _mm512_and_epi64(code1, all_FFFF); - code2 = _mm512_and_epi64(code2, all_FFFF); - code3 = _mm512_and_epi64(code3, all_FFFF); - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job1, all_M19), write1, 1); - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job2, all_M19), write2, 1); - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job3, all_M19), write3, 1); - // increase the job1.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - // increase the job2.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - // increase the job3.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - job1 = _mm512_add_epi64(job1, _mm512_slli_epi64(_mm512_srli_epi64(code1, FSST_LEN_BITS), 46)); - job2 = _mm512_add_epi64(job2, _mm512_slli_epi64(_mm512_srli_epi64(code2, FSST_LEN_BITS), 46)); - job3 = _mm512_add_epi64(job3, _mm512_slli_epi64(_mm512_srli_epi64(code3, FSST_LEN_BITS), 46)); - // increase the job1.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - // increase the job2.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - // increase the job3.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - job1 = _mm512_add_epi64(job1, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code1, 8), all_ONE))); - job2 = _mm512_add_epi64(job2, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code2, 8), all_ONE))); - job3 = _mm512_add_epi64(job3, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code3, 8), all_ONE))); - // test which lanes are done now (job1.cur==job1.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job1 register) - // test which lanes are done now (job2.cur==job2.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job2 register) - // test which lanes are done now (job3.cur==job3.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job3 register) - loadmask1 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job1, 46), _mm512_and_epi64(_mm512_srli_epi64(job1, 28), all_M18)); - loadmask2 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job2, 46), _mm512_and_epi64(_mm512_srli_epi64(job2, 28), all_M18)); - loadmask3 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job3, 46), _mm512_and_epi64(_mm512_srli_epi64(job3, 28), all_M18)); - // calculate the amount of lanes in job1 that are done - // calculate the amount of lanes in job2 that are done - // calculate the amount of lanes in job3 that are done - delta1 = _mm_popcnt_u32((int) loadmask1); - delta2 = _mm_popcnt_u32((int) loadmask2); - delta3 = _mm_popcnt_u32((int) loadmask3); - // write out the job state for the lanes that are done (we need the final 'job1.out' value to compute the compressed string length) - // write out the job state for the lanes that are done (we need the final 'job2.out' value to compute the compressed string length) - // write out the job state for the lanes that are done (we need the final 'job3.out' value to compute the compressed string length) - _mm512_mask_compressstoreu_epi64(output, loadmask1, job1); output += delta1; - _mm512_mask_compressstoreu_epi64(output, loadmask2, job2); output += delta2; - _mm512_mask_compressstoreu_epi64(output, loadmask3, job3); output += delta3; - - -// LICENSE_CHANGE_END - - } - } else if (unroll == 2) { - while (input+delta1+delta2 < inputEnd) { - - -// LICENSE_CHANGE_BEGIN -// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #6 -// See the end of this file for a list - -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// -// -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// furnished to do so, subject to the following conditions: -// -// -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E1PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E2PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// -// - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask1=11111111, delta1=8). - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask2=11111111, delta2=8). - job1 = _mm512_mask_expandloadu_epi64(job1, loadmask1, input); input += delta1; - job2 = _mm512_mask_expandloadu_epi64(job2, loadmask2, input); input += delta2; - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - __m512i word1 = _mm512_i64gather_epi64(_mm512_srli_epi64(job1, 46), symbolBase, 1); - __m512i word2 = _mm512_i64gather_epi64(_mm512_srli_epi64(job2, 46), symbolBase, 1); - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // code1: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - // code2: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - __m512i code1 = _mm512_i64gather_epi64(_mm512_and_epi64(word1, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - __m512i code2 = _mm512_i64gather_epi64(_mm512_and_epi64(word2, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - // get the first three bytes of the string. - // get the first three bytes of the string. - __m512i pos1 = _mm512_mullo_epi64(_mm512_and_epi64(word1, all_FFFFFF), all_PRIME); - __m512i pos2 = _mm512_mullo_epi64(_mm512_and_epi64(word2, all_FFFFFF), all_PRIME); - // hash them into a random number: pos1 = pos1*PRIME; pos1 ^= pos1>>SHIFT - // hash them into a random number: pos2 = pos2*PRIME; pos2 ^= pos2>>SHIFT - pos1 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos1,_mm512_srli_epi64(pos1,FSST_SHIFT)), all_HASH), 4); - pos2 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos2,_mm512_srli_epi64(pos2,FSST_SHIFT)), all_HASH), 4); - // lookup in the 3-byte-prefix keyed hash table - // lookup in the 3-byte-prefix keyed hash table - __m512i icl1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 8), 1); - __m512i icl2 = _mm512_i64gather_epi64(pos2, (((char*) symbolTable.hashTab) + 8), 1); - // speculatively store the first input byte into the second position of the write1 register (in case it turns out to be an escaped byte). - // speculatively store the first input byte into the second position of the write2 register (in case it turns out to be an escaped byte). - __m512i write1 = _mm512_slli_epi64(_mm512_and_epi64(word1, all_FF), 8); - __m512i write2 = _mm512_slli_epi64(_mm512_and_epi64(word2, all_FF), 8); - // lookup just like the icl1 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - // lookup just like the icl2 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - __m512i symb1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 0), 1); - __m512i symb2 = _mm512_i64gather_epi64(pos2, (((char*) symbolTable.hashTab) + 0), 1); - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - pos1 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl1, all_FF)); - pos2 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl2, all_FF)); - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - __mmask8 match1 = _mm512_cmpeq_epi64_mask(symb1, _mm512_and_epi64(word1, pos1)) & _mm512_cmplt_epi64_mask(icl1, all_ICL_FREE); - __mmask8 match2 = _mm512_cmpeq_epi64_mask(symb2, _mm512_and_epi64(word2, pos2)) & _mm512_cmplt_epi64_mask(icl2, all_ICL_FREE); - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - code1 = _mm512_mask_mov_epi64(code1, match1, _mm512_srli_epi64(icl1, 16)); - code2 = _mm512_mask_mov_epi64(code2, match2, _mm512_srli_epi64(icl2, 16)); - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - write1 = _mm512_or_epi64(write1, _mm512_and_epi64(code1, all_FF)); - write2 = _mm512_or_epi64(write2, _mm512_and_epi64(code2, all_FF)); - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - code1 = _mm512_and_epi64(code1, all_FFFF); - code2 = _mm512_and_epi64(code2, all_FFFF); - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job1, all_M19), write1, 1); - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job2, all_M19), write2, 1); - // increase the job1.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - // increase the job2.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - job1 = _mm512_add_epi64(job1, _mm512_slli_epi64(_mm512_srli_epi64(code1, FSST_LEN_BITS), 46)); - job2 = _mm512_add_epi64(job2, _mm512_slli_epi64(_mm512_srli_epi64(code2, FSST_LEN_BITS), 46)); - // increase the job1.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - // increase the job2.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - job1 = _mm512_add_epi64(job1, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code1, 8), all_ONE))); - job2 = _mm512_add_epi64(job2, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code2, 8), all_ONE))); - // test which lanes are done now (job1.cur==job1.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job1 register) - // test which lanes are done now (job2.cur==job2.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job2 register) - loadmask1 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job1, 46), _mm512_and_epi64(_mm512_srli_epi64(job1, 28), all_M18)); - loadmask2 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job2, 46), _mm512_and_epi64(_mm512_srli_epi64(job2, 28), all_M18)); - // calculate the amount of lanes in job1 that are done - // calculate the amount of lanes in job2 that are done - delta1 = _mm_popcnt_u32((int) loadmask1); - delta2 = _mm_popcnt_u32((int) loadmask2); - // write out the job state for the lanes that are done (we need the final 'job1.out' value to compute the compressed string length) - // write out the job state for the lanes that are done (we need the final 'job2.out' value to compute the compressed string length) - _mm512_mask_compressstoreu_epi64(output, loadmask1, job1); output += delta1; - _mm512_mask_compressstoreu_epi64(output, loadmask2, job2); output += delta2; - - -// LICENSE_CHANGE_END - - } - } else { - while (input+delta1 < inputEnd) { - - -// LICENSE_CHANGE_BEGIN -// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #6 -// See the end of this file for a list - -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, E1PRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst -// - // load new jobs in the empty lanes (initially, all lanes are empty, so loadmask1=11111111, delta1=8). - job1 = _mm512_mask_expandloadu_epi64(job1, loadmask1, input); input += delta1; - // load the next 8 input string bytes (uncompressed data, aka 'symbols'). - __m512i word1 = _mm512_i64gather_epi64(_mm512_srli_epi64(job1, 46), symbolBase, 1); - // load 16-bits codes from the 2-byte-prefix keyed lookup table. It also store 1-byte codes in all free slots. - // code1: Lowest 8 bits contain the code. Eleventh bit is whether it is an escaped code. Next 4 bits is length (2 or 1). - __m512i code1 = _mm512_i64gather_epi64(_mm512_and_epi64(word1, all_FFFF), symbolTable.shortCodes, sizeof(u16)); - // get the first three bytes of the string. - __m512i pos1 = _mm512_mullo_epi64(_mm512_and_epi64(word1, all_FFFFFF), all_PRIME); - // hash them into a random number: pos1 = pos1*PRIME; pos1 ^= pos1>>SHIFT - pos1 = _mm512_slli_epi64(_mm512_and_epi64(_mm512_xor_epi64(pos1,_mm512_srli_epi64(pos1,FSST_SHIFT)), all_HASH), 4); - // lookup in the 3-byte-prefix keyed hash table - __m512i icl1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 8), 1); - // speculatively store the first input byte into the second position of the write1 register (in case it turns out to be an escaped byte). - __m512i write1 = _mm512_slli_epi64(_mm512_and_epi64(word1, all_FF), 8); - // lookup just like the icl1 above, but loads the next 8 bytes. This fetches the actual string bytes in the hash table. - __m512i symb1 = _mm512_i64gather_epi64(pos1, (((char*) symbolTable.hashTab) + 0), 1); - // generate the FF..FF mask with an FF for each byte of the symbol (we need to AND the input with this to correctly check equality). - pos1 = _mm512_srlv_epi64(all_MASK, _mm512_and_epi64(icl1, all_FF)); - // check symbol < |str| as well as whether it is an occupied slot (cmplt checks both conditions at once) and check string equality (cmpeq). - __mmask8 match1 = _mm512_cmpeq_epi64_mask(symb1, _mm512_and_epi64(word1, pos1)) & _mm512_cmplt_epi64_mask(icl1, all_ICL_FREE); - // for the hits, overwrite the codes with what comes from the hash table (codes for symbols of length >=3). The rest stays with what shortCodes gave. - code1 = _mm512_mask_mov_epi64(code1, match1, _mm512_srli_epi64(icl1, 16)); - // write out the code byte as the first output byte. Notice that this byte may also be the escape code 255 (for escapes) coming from shortCodes. - write1 = _mm512_or_epi64(write1, _mm512_and_epi64(code1, all_FF)); - // zip the irrelevant 6 bytes (just stay with the 2 relevant bytes containing the 16-bits code) - code1 = _mm512_and_epi64(code1, all_FFFF); - // write out the compressed data. It writes 8 bytes, but only 1 byte is relevant :-(or 2 bytes are, in case of an escape code) - _mm512_i64scatter_epi64(codeBase, _mm512_and_epi64(job1, all_M19), write1, 1); - // increase the job1.cur field in the job with the symbol length (for this, shift away 12 bits from the code) - job1 = _mm512_add_epi64(job1, _mm512_slli_epi64(_mm512_srli_epi64(code1, FSST_LEN_BITS), 46)); - // increase the job1.out' field with one, or two in case of an escape code (add 1 plus the escape bit, i.e the 8th) - job1 = _mm512_add_epi64(job1, _mm512_add_epi64(all_ONE, _mm512_and_epi64(_mm512_srli_epi64(code1, 8), all_ONE))); - // test which lanes are done now (job1.cur==job1.end), cur starts at bit 46, end starts at bit 28 (the highest 2x18 bits in the job1 register) - loadmask1 = _mm512_cmpeq_epi64_mask(_mm512_srli_epi64(job1, 46), _mm512_and_epi64(_mm512_srli_epi64(job1, 28), all_M18)); - // calculate the amount of lanes in job1 that are done - delta1 = _mm_popcnt_u32((int) loadmask1); - // write out the job state for the lanes that are done (we need the final 'job1.out' value to compute the compressed string length) - _mm512_mask_compressstoreu_epi64(output, loadmask1, job1); output += delta1; - - -// LICENSE_CHANGE_END - - } - } - - // flush the job states of the unfinished strings at the end of output[] - processed = n - (inputEnd - input); - u32 unfinished = 0; - if (unroll > 1) { - if (unroll > 2) { - if (unroll > 3) { - _mm512_mask_compressstoreu_epi64(output+unfinished, loadmask4=~loadmask4, job4); - unfinished += _mm_popcnt_u32((int) loadmask4); - } - _mm512_mask_compressstoreu_epi64(output+unfinished, loadmask3=~loadmask3, job3); - unfinished += _mm_popcnt_u32((int) loadmask3); - } - _mm512_mask_compressstoreu_epi64(output+unfinished, loadmask2=~loadmask2, job2); - unfinished += _mm_popcnt_u32((int) loadmask2); - } - _mm512_mask_compressstoreu_epi64(output+unfinished, loadmask1=~loadmask1, job1); -#else - (void) symbolTable; - (void) codeBase; - (void) symbolBase; - (void) input; - (void) output; - (void) n; - (void) unroll; -#endif - return processed; -} - - -// LICENSE_CHANGE_END - - -// LICENSE_CHANGE_BEGIN -// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #6 -// See the end of this file for a list - -// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT): -// -// Copyright 2018-2020, CWI, TU Munich, FSU Jena -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst - - Symbol concat(Symbol a, Symbol b) { Symbol s; u32 length = a.length()+b.length(); @@ -335768,140 +337783,6 @@ SymbolTable *buildSymbolTable(Counters& counters, vector line, size_t len[] return bestTable; } -static inline size_t compressSIMD(SymbolTable &symbolTable, u8* symbolBase, size_t nlines, size_t len[], u8* line[], size_t size, u8* dst, size_t lenOut[], u8* strOut[], int unroll) { - size_t curLine = 0, inOff = 0, outOff = 0, batchPos = 0, empty = 0, budget = size; - u8 *lim = dst + size, *codeBase = symbolBase + (1<<18); // 512KB temp space for compressing 512 strings - SIMDjob input[512]; // combined offsets of input strings (cur,end), and string #id (pos) and output (dst) pointer - SIMDjob output[512]; // output are (pos:9,dst:19) end pointers (compute compressed length from this) - size_t jobLine[512]; // for which line in the input sequence was this job (needed because we may split a line into multiple jobs) - - while (curLine < nlines && outOff <= (1<<19)) { - size_t prevLine = curLine, chunk, curOff = 0; - - // bail out if the output buffer cannot hold the compressed next string fully - if (((len[curLine]-curOff)*2 + 7) > budget) break; // see below for the +7 - else budget -= (len[curLine]-curOff)*2; - - strOut[curLine] = (u8*) 0; - lenOut[curLine] = 0; - - do { - do { - chunk = len[curLine] - curOff; - if (chunk > 511) { - chunk = 511; // large strings need to be chopped up into segments of 511 bytes - } - // create a job in this batch - SIMDjob job; - job.cur = inOff; - job.end = job.cur + chunk; - job.pos = batchPos; - job.out = outOff; - - // worst case estimate for compressed size (+7 is for the scatter that writes extra 7 zeros) - outOff += 7 + 2*(size_t)(job.end - job.cur); // note, total size needed is 512*(511*2+7) bytes. - if (outOff > (1<<19)) break; // simdbuf may get full, stop before this chunk - - // register job in this batch - input[batchPos] = job; - jobLine[batchPos] = curLine; - - if (chunk == 0) { - empty++; // detect empty chunks -- SIMD code cannot handle empty strings, so they need to be filtered out - } else { - // copy string chunk into temp buffer - memcpy(symbolBase + inOff, line[curLine] + curOff, chunk); - inOff += chunk; - curOff += chunk; - symbolBase[inOff++] = (u8) symbolTable.terminator; // write an extra char at the end that will not be encoded - } - if (++batchPos == 512) break; - } while(curOff < len[curLine]); - - if ((batchPos == 512) || (outOff > (1<<19)) || (++curLine >= nlines)) { // cannot accumulate more? - if (batchPos-empty >= 32) { // if we have enough work, fire off fsst_compressAVX512 (32 is due to max 4x8 unrolling) - // radix-sort jobs on length (longest string first) - // -- this provides best load balancing and allows to skip empty jobs at the end - u16 sortpos[513]; - memset(sortpos, 0, sizeof(sortpos)); - - // calculate length histo - for(size_t i=0; i> (u8) s.icl); - if ((s.icl < FSST_ICL_FREE) && s.val.num == word) { - *out++ = (u8) s.code(); cur += s.length(); - } else { - // could be a 2-byte or 1-byte code, or miss - // handle everything with predication - *out = (u8) code; - out += 1+((code&FSST_CODE_BASE)>>8); - cur += (code>>FSST_LEN_BITS); - } - } - job.out = out - codeBase; - } - // postprocess job info - job.cur = 0; - job.end = job.out - input[job.pos].out; // misuse .end field as compressed size - job.out = input[job.pos].out; // reset offset to start of encoded string - input[job.pos] = job; - } - - // copy out the result data - for(size_t i=0; isymbolTable, e->simdbuf, nlines, lenIn, strIn, size, output, lenOut, strOut, simd); -#endif - (void) simd; +inline size_t _compressImpl(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int) { return compressBulk(*e->symbolTable, nlines, lenIn, strIn, size, output, lenOut, strOut, noSuffixOpt, avoidBranch); } size_t compressImpl(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int simd) { @@ -343726,6 +345602,154 @@ mz_bool mz_zip_end(mz_zip_archive *pZip) // LICENSE_CHANGE_END +// LICENSE_CHANGE_BEGIN +// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #2 +// See the end of this file for a list + +// Copyright 2023 The RE2 Authors. All Rights Reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + + + +// LICENSE_CHANGE_BEGIN +// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #2 +// See the end of this file for a list + +// Copyright 2016 The RE2 Authors. All Rights Reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef RE2_BITMAP256_H_ +#define RE2_BITMAP256_H_ + +#ifdef _MSC_VER +#include +#endif +#include +#include + + + +namespace duckdb_re2 { + +class Bitmap256 { + public: + Bitmap256() { + Clear(); + } + + // Clears all of the bits. + void Clear() { + memset(words_, 0, sizeof words_); + } + + // Tests the bit with index c. + bool Test(int c) const { + DCHECK_GE(c, 0); + DCHECK_LE(c, 255); + + return (words_[c / 64] & (uint64_t{1} << (c % 64))) != 0; + } + + // Sets the bit with index c. + void Set(int c) { + DCHECK_GE(c, 0); + DCHECK_LE(c, 255); + + words_[c / 64] |= (uint64_t{1} << (c % 64)); + } + + // Finds the next non-zero bit with index >= c. + // Returns -1 if no such bit exists. + int FindNextSetBit(int c) const; + + private: + // Finds the least significant non-zero bit in n. + static int FindLSBSet(uint64_t n) { + DCHECK_NE(n, 0); +#if defined(__GNUC__) + return __builtin_ctzll(n); +#elif defined(_MSC_VER) && defined(_M_X64) + unsigned long c; + _BitScanForward64(&c, n); + return static_cast(c); +#elif defined(_MSC_VER) && defined(_M_IX86) + unsigned long c; + if (static_cast(n) != 0) { + _BitScanForward(&c, static_cast(n)); + return static_cast(c); + } else { + _BitScanForward(&c, static_cast(n >> 32)); + return static_cast(c) + 32; + } +#else + int c = 63; + for (int shift = 1 << 5; shift != 0; shift >>= 1) { + uint64_t word = n << shift; + if (word != 0) { + n = word; + c -= shift; + } + } + return c; +#endif + } + + uint64_t words_[4]; +}; + +} // namespace re2 + +#endif // RE2_BITMAP256_H_ + + +// LICENSE_CHANGE_END + + +#include + + + + +namespace duckdb_re2 { + +int Bitmap256::FindNextSetBit(int c) const { + DCHECK_GE(c, 0); + DCHECK_LE(c, 255); + + // Check the word that contains the bit. Mask out any lower bits. + int i = c / 64; + uint64_t word = words_[i] & (~uint64_t{0} << (c % 64)); + if (word != 0) + return (i * 64) + FindLSBSet(word); + + // Check any following words. + i++; + switch (i) { + case 1: + if (words_[1] != 0) + return (1 * 64) + FindLSBSet(words_[1]); + FALLTHROUGH_INTENDED; + case 2: + if (words_[2] != 0) + return (2 * 64) + FindLSBSet(words_[2]); + FALLTHROUGH_INTENDED; + case 3: + if (words_[3] != 0) + return (3 * 64) + FindLSBSet(words_[3]); + FALLTHROUGH_INTENDED; + default: + return -1; + } +} + +} // namespace re2 + + +// LICENSE_CHANGE_END + + // LICENSE_CHANGE_BEGIN // The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #2 // See the end of this file for a list @@ -343739,7 +345763,7 @@ mz_bool mz_zip_end(mz_zip_archive *pZip) // Prog::SearchBitState is a regular expression search with submatch // tracking for small regular expressions and texts. Similarly to // testing/backtrack.cc, it allocates a bitmap with (count of -// lists) * (length of prog) bits to make sure it never explores the +// lists) * (length of text) bits to make sure it never explores the // same (instruction list, character position) multiple times. This // limits the search to run in time linear in the length of the text. // @@ -343766,8 +345790,8 @@ mz_bool mz_zip_end(mz_zip_archive *pZip) // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -#ifndef UTIL_POD_ARRAY_H_ -#define UTIL_POD_ARRAY_H_ +#ifndef RE2_POD_ARRAY_H_ +#define RE2_POD_ARRAY_H_ #include #include @@ -343777,7 +345801,7 @@ namespace duckdb_re2 { template class PODArray { public: - static_assert(std::is_pod::value, + static_assert(std::is_trivial::value && std::is_standard_layout::value, "T must be POD"); PODArray() @@ -343814,9 +345838,9 @@ class PODArray { std::unique_ptr ptr_; }; -} // namespace duckdb_re2 +} // namespace re2 -#endif // UTIL_POD_ARRAY_H_ +#endif // RE2_POD_ARRAY_H_ // LICENSE_CHANGE_END @@ -343850,6 +345874,7 @@ class PODArray { + // LICENSE_CHANGE_BEGIN // The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #2 // See the end of this file for a list @@ -343858,8 +345883,8 @@ class PODArray { // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -#ifndef UTIL_SPARSE_ARRAY_H_ -#define UTIL_SPARSE_ARRAY_H_ +#ifndef RE2_SPARSE_ARRAY_H_ +#define RE2_SPARSE_ARRAY_H_ // DESCRIPTION // @@ -344243,9 +346268,9 @@ template bool SparseArray::less(const IndexValue& a, return a.index_ < b.index_; } -} // namespace duckdb_re2 +} // namespace re2 -#endif // UTIL_SPARSE_ARRAY_H_ +#endif // RE2_SPARSE_ARRAY_H_ // LICENSE_CHANGE_END @@ -344260,8 +346285,8 @@ template bool SparseArray::less(const IndexValue& a, // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -#ifndef UTIL_SPARSE_SET_H_ -#define UTIL_SPARSE_SET_H_ +#ifndef RE2_SPARSE_SET_H_ +#define RE2_SPARSE_SET_H_ // DESCRIPTION // @@ -344517,15 +346542,14 @@ template bool SparseSetT::less(int a, int b) { typedef SparseSetT SparseSet; -} // namespace duckdb_re2 +} // namespace re2 -#endif // UTIL_SPARSE_SET_H_ +#endif // RE2_SPARSE_SET_H_ // LICENSE_CHANGE_END - namespace duckdb_re2 { // Opcodes for Inst @@ -344552,18 +346576,6 @@ enum EmptyOp { kEmptyAllFlags = (1<<6)-1, }; -struct inst_byte_range_data_t { // opcode == kInstByteRange - uint8_t lo_; // byte range is lo_-hi_ inclusive - uint8_t hi_; // - uint16_t hint_foldcase_; // 15 bits: hint, 1 (low) bit: foldcase - // hint to execution engines: the delta to the - // next instruction (in the current list) worth - // exploring iff this instruction matched; 0 - // means there are no remaining possibilities, - // which is most likely for character classes. - // foldcase: A-Z -> a-z before checking range. -} ; - class DFA; class Regexp; @@ -344599,10 +346611,10 @@ class Prog { int out() { return out_opcode_>>4; } int out1() { DCHECK(opcode() == kInstAlt || opcode() == kInstAltMatch); return out1_; } int cap() { DCHECK_EQ(opcode(), kInstCapture); return cap_; } - int lo() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.lo_; } - int hi() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.hi_; } - int foldcase() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.hint_foldcase_&1; } - int hint() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.hint_foldcase_>>1; } + int lo() { DCHECK_EQ(opcode(), kInstByteRange); return lo_; } + int hi() { DCHECK_EQ(opcode(), kInstByteRange); return hi_; } + int foldcase() { DCHECK_EQ(opcode(), kInstByteRange); return hint_foldcase_&1; } + int hint() { DCHECK_EQ(opcode(), kInstByteRange); return hint_foldcase_>>1; } int match_id() { DCHECK_EQ(opcode(), kInstMatch); return match_id_; } EmptyOp empty() { DCHECK_EQ(opcode(), kInstEmptyWidth); return empty_; } @@ -344618,7 +346630,7 @@ class Prog { DCHECK_EQ(opcode(), kInstByteRange); if (foldcase() && 'A' <= c && c <= 'Z') c += 'a' - 'A'; - return inst_byte_range_data_.lo_ <= c && c <= inst_byte_range_data_.hi_; + return lo_ <= c && c <= hi_; } // Returns string representation for debugging. @@ -344660,7 +346672,17 @@ class Prog { int32_t match_id_; // opcode == kInstMatch // Match ID to identify this match (for duckdb_re2::Set). - struct inst_byte_range_data_t inst_byte_range_data_; + struct { // opcode == kInstByteRange + uint8_t lo_; // byte range is lo_-hi_ inclusive + uint8_t hi_; // + uint16_t hint_foldcase_; // 15 bits: hint, 1 (low) bit: foldcase + // hint to execution engines: the delta to the + // next instruction (in the current list) worth + // exploring iff this instruction matched; 0 + // means there are no remaining possibilities, + // which is most likely for character classes. + // foldcase: A-Z -> a-z before checking range. + }; EmptyOp empty_; // opcode == kInstEmptyWidth // empty_ is bitwise OR of kEmpty* flags above. @@ -344703,8 +346725,8 @@ class Prog { Inst *inst(int id) { return &inst_[id]; } int start() { return start_; } - int start_unanchored() { return start_unanchored_; } void set_start(int start) { start_ = start; } + int start_unanchored() { return start_unanchored_; } void set_start_unanchored(int start) { start_unanchored_ = start; } int size() { return size_; } bool reversed() { return reversed_; } @@ -344712,19 +346734,40 @@ class Prog { int list_count() { return list_count_; } int inst_count(InstOp op) { return inst_count_[op]; } uint16_t* list_heads() { return list_heads_.data(); } - void set_dfa_mem(int64_t dfa_mem) { dfa_mem_ = dfa_mem; } + size_t bit_state_text_max_size() { return bit_state_text_max_size_; } int64_t dfa_mem() { return dfa_mem_; } - int flags() { return flags_; } - void set_flags(int flags) { flags_ = flags; } + void set_dfa_mem(int64_t dfa_mem) { dfa_mem_ = dfa_mem; } bool anchor_start() { return anchor_start_; } void set_anchor_start(bool b) { anchor_start_ = b; } bool anchor_end() { return anchor_end_; } void set_anchor_end(bool b) { anchor_end_ = b; } int bytemap_range() { return bytemap_range_; } const uint8_t* bytemap() { return bytemap_; } + bool can_prefix_accel() { return prefix_size_ != 0; } - // Lazily computed. - int first_byte(); + // Accelerates to the first likely occurrence of the prefix. + // Returns a pointer to the first byte or NULL if not found. + const void* PrefixAccel(const void* data, size_t size) { + DCHECK(can_prefix_accel()); + if (prefix_foldcase_) { + return PrefixAccel_ShiftDFA(data, size); + } else if (prefix_size_ != 1) { + return PrefixAccel_FrontAndBack(data, size); + } else { + return memchr(data, prefix_front_, size); + } + } + + // Configures prefix accel using the analysis performed during compilation. + void ConfigurePrefixAccel(const std::string& prefix, bool prefix_foldcase); + + // An implementation of prefix accel that uses prefix_dfa_ to perform + // case-insensitive search. + const void* PrefixAccel_ShiftDFA(const void* data, size_t size); + + // An implementation of prefix accel that looks for prefix_front_ and + // prefix_back_ to return fewer false positives than memchr(3) alone. + const void* PrefixAccel_FrontAndBack(const void* data, size_t size); // Returns string representation of program for debugging. std::string Dump(); @@ -344795,17 +346838,9 @@ class Prog { // FOR TESTING OR EXPERIMENTAL PURPOSES ONLY. int BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb); - // Controls whether the DFA should bail out early if the NFA would be faster. - // FOR TESTING ONLY. - static void TEST_dfa_should_bail_when_slow(bool b); - // Compute bytemap. void ComputeByteMap(); - // Computes whether all matches must begin with the same first - // byte, and if so, returns that byte. If not, returns -1. - int ComputeFirstByte(); - // Run peep-hole optimizer on program. void Optimize(); @@ -344853,7 +346888,6 @@ class Prog { // Returns true on success, false on error. bool PossibleMatchRange(std::string* min, std::string* max, int maxlen); - // EXPERIMENTAL! SUBJECT TO CHANGE! // Outputs the program fanout into the given sparse array. void Fanout(SparseArray* fanout); @@ -344891,6 +346925,10 @@ class Prog { // Computes hints for ByteRange instructions in [begin, end). void ComputeHints(std::vector* flat, int begin, int end); + // Controls whether the DFA should bail out early if the NFA would be faster. + // FOR TESTING ONLY. + static void TESTING_ONLY_set_dfa_should_bail_when_slow(bool b); + private: friend class Compiler; @@ -344907,13 +346945,22 @@ class Prog { int start_unanchored_; // unanchored entry point for program int size_; // number of instructions int bytemap_range_; // bytemap_[x] < bytemap_range_ - int first_byte_; // required first byte for match, or -1 if none - int flags_; // regexp parse flags - int list_count_; // count of lists (see above) - int inst_count_[kNumInst]; // count of instructions by opcode - PODArray list_heads_; // sparse array enumerating list heads - // not populated if size_ is overly large + bool prefix_foldcase_; // whether prefix is case-insensitive + size_t prefix_size_; // size of prefix (0 if no prefix) + union { + uint64_t* prefix_dfa_; // "Shift DFA" for prefix + struct { + int prefix_front_; // first byte of prefix + int prefix_back_; // last byte of prefix + }; + }; + + int list_count_; // count of lists (see above) + int inst_count_[kNumInst]; // count of instructions by opcode + PODArray list_heads_; // sparse array enumerating list heads + // not populated if size_ is overly large + size_t bit_state_text_max_size_; // upper bound (inclusive) on text.size() PODArray inst_; // pointer to instruction array PODArray onepass_nodes_; // data for OnePass nodes @@ -344924,7 +346971,6 @@ class Prog { uint8_t bytemap_[256]; // map from input bytes to byte classes - std::once_flag first_byte_once_; std::once_flag dfa_first_once_; std::once_flag dfa_longest_once_; @@ -344932,7 +346978,18 @@ class Prog { Prog& operator=(const Prog&) = delete; }; -} // namespace duckdb_re2 +// std::string_view in MSVC has iterators that aren't just pointers and +// that don't allow comparisons between different objects - not even if +// those objects are views into the same string! Thus, we provide these +// conversion functions for convenience. +static inline const char* BeginPtr(const StringPiece& s) { + return s.data(); +} +static inline const char* EndPtr(const StringPiece& s) { + return s.data() + s.size(); +} + +} // namespace re2 #endif // RE2_PROG_H_ @@ -344976,11 +347033,14 @@ class BitState { int nsubmatch_; // # of submatches to fill in // Search state - static const int VisitedBits = 32; - PODArray visited_; // bitmap: (list ID, char*) pairs visited + static constexpr int kVisitedBits = 64; + PODArray visited_; // bitmap: (list ID, char*) pairs visited PODArray cap_; // capture registers PODArray job_; // stack of text positions to explore int njob_; // stack size + + BitState(const BitState&) = delete; + BitState& operator=(const BitState&) = delete; }; BitState::BitState(Prog* prog) @@ -344999,10 +347059,10 @@ BitState::BitState(Prog* prog) // we don't repeat the visit. bool BitState::ShouldVisit(int id, const char* p) { int n = prog_->list_heads()[id] * static_cast(text_.size()+1) + - static_cast(p-text_.begin()); - if (visited_[n/VisitedBits] & (1 << (n & (VisitedBits-1)))) + static_cast(p-text_.data()); + if (visited_[n/kVisitedBits] & (uint64_t{1} << (n & (kVisitedBits-1)))) return false; - visited_[n/VisitedBits] |= 1 << (n & (VisitedBits-1)); + visited_[n/kVisitedBits] |= uint64_t{1} << (n & (kVisitedBits-1)); return true; } @@ -345047,7 +347107,7 @@ void BitState::Push(int id, const char* p) { // Return whether it succeeded. bool BitState::TrySearch(int id0, const char* p0) { bool matched = false; - const char* end = text_.end(); + const char* end = text_.data() + text_.size(); njob_ = 0; // Push() no longer checks ShouldVisit(), // so we must perform the check ourselves. @@ -345164,7 +347224,7 @@ bool BitState::TrySearch(int id0, const char* p0) { matched = true; cap_[1] = p; if (submatch_[0].data() == NULL || - (longest_ && p > submatch_[0].end())) { + (longest_ && p > submatch_[0].data() + submatch_[0].size())) { for (int i = 0; i < nsubmatch_; i++) submatch_[i] = StringPiece(cap_[2 * i], @@ -345201,11 +347261,11 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // Search parameters. text_ = text; context_ = context; - if (context_.begin() == NULL) + if (context_.data() == NULL) context_ = text; - if (prog_->anchor_start() && context_.begin() != text.begin()) + if (prog_->anchor_start() && BeginPtr(context_) != BeginPtr(text)) return false; - if (prog_->anchor_end() && context_.end() != text.end()) + if (prog_->anchor_end() && EndPtr(context_) != EndPtr(text)) return false; anchored_ = anchored || prog_->anchor_start(); longest_ = longest || prog_->anchor_end(); @@ -345217,8 +347277,8 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // Allocate scratch space. int nvisited = prog_->list_count() * static_cast(text.size()+1); - nvisited = (nvisited + VisitedBits-1) / VisitedBits; - visited_ = PODArray(nvisited); + nvisited = (nvisited + kVisitedBits-1) / kVisitedBits; + visited_ = PODArray(nvisited); memset(visited_.data(), 0, nvisited*sizeof visited_[0]); int ncap = 2*nsubmatch; @@ -345232,8 +347292,8 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // Anchored search must start at text.begin(). if (anchored_) { - cap_[0] = text.begin(); - return TrySearch(prog_->start(), text.begin()); + cap_[0] = text.data(); + return TrySearch(prog_->start(), text.data()); } // Unanchored search, starting from each possible text position. @@ -345242,18 +347302,22 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // This looks like it's quadratic in the size of the text, // but we are not clearing visited_ between calls to TrySearch, // so no work is duplicated and it ends up still being linear. - for (const char* p = text.begin(); p <= text.end(); p++) { - // Try to use memchr to find the first byte quickly. - int fb = prog_->first_byte(); - if (fb >= 0 && p < text.end() && (p[0] & 0xFF) != fb) { - p = reinterpret_cast(memchr(p, fb, text.end() - p)); + const char* etext = text.data() + text.size(); + for (const char* p = text.data(); p <= etext; p++) { + // Try to use prefix accel (e.g. memchr) to skip ahead. + if (p < etext && prog_->can_prefix_accel()) { + p = reinterpret_cast(prog_->PrefixAccel(p, etext - p)); if (p == NULL) - p = text.end(); + p = etext; } cap_[0] = p; if (TrySearch(prog_->start(), p)) // Match must be leftmost; done. return true; + // Avoid invoking undefined behavior (arithmetic on a null pointer) + // by simply not continuing the loop. + if (p == NULL) + break; } return false; } @@ -345283,12 +347347,12 @@ bool Prog::SearchBitState(const StringPiece& text, bool longest = kind != kFirstMatch; if (!b.Search(text, context, anchored, longest, match, nmatch)) return false; - if (kind == kFullMatch && match[0].end() != text.end()) + if (kind == kFullMatch && EndPtr(match[0]) != EndPtr(text)) return false; return true; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -345352,10 +347416,7 @@ template struct WalkState; template class Regexp::Walker { public: Walker(); - virtual ~Walker() { - Reset(); - delete stack_; - } + virtual ~Walker(); // Virtual method called before visiting re's children. // PreVisit passes ownership of its return value to its caller. @@ -345419,7 +347480,7 @@ template class Regexp::Walker { private: // Walk state for the entire traversal. - std::stack >* stack_; + std::stack> stack_; bool stopped_early_; int max_visits_; @@ -345449,7 +347510,7 @@ template T Regexp::Walker::Copy(T arg) { // State about a single level in the traversal. template struct WalkState { - WalkState(Regexp* re, T parent) + WalkState(Regexp* re, T parent) : re(re), n(-1), parent_arg(parent), @@ -345464,19 +347525,23 @@ template struct WalkState { }; template Regexp::Walker::Walker() { - stack_ = new std::stack >; stopped_early_ = false; } +template Regexp::Walker::~Walker() { + Reset(); +} + // Clears the stack. Should never be necessary, since // Walk always enters and exits with an empty stack. // Logs DFATAL if stack is not already clear. template void Regexp::Walker::Reset() { - if (stack_ && stack_->size() > 0) { + if (!stack_.empty()) { LOG(DFATAL) << "Stack not empty."; - while (stack_->size() > 0) { - delete stack_->top().child_args; - stack_->pop(); + while (!stack_.empty()) { + if (stack_.top().re->nsub_ > 1) + delete[] stack_.top().child_args; + stack_.pop(); } } } @@ -345490,13 +347555,13 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, return top_arg; } - stack_->push(WalkState(re, top_arg)); + stack_.push(WalkState(re, top_arg)); WalkState* s; for (;;) { T t; - s = &stack_->top(); - Regexp* re = s->re; + s = &stack_.top(); + re = s->re; switch (s->n) { case -1: { if (--max_visits_ < 0) { @@ -345526,7 +347591,7 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, s->child_args[s->n] = Copy(s->child_args[s->n - 1]); s->n++; } else { - stack_->push(WalkState(sub[s->n], s->pre_arg)); + stack_.push(WalkState(sub[s->n], s->pre_arg)); } continue; } @@ -345539,12 +347604,12 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, } } - // We've finished stack_->top(). + // We've finished stack_.top(). // Update next guy down. - stack_->pop(); - if (stack_->size() == 0) + stack_.pop(); + if (stack_.empty()) return t; - s = &stack_->top(); + s = &stack_.top(); if (s->child_args != NULL) s->child_args[s->n] = t; else @@ -345568,7 +347633,7 @@ template T Regexp::Walker::WalkExponential(Regexp* re, T top_arg, return WalkInternal(re, top_arg, false); } -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_WALKER_INL_H_ @@ -345585,92 +347650,60 @@ namespace duckdb_re2 { // See http://swtch.com/~rsc/regexp/regexp1.html for inspiration. // // Because the out and out1 fields in Inst are no longer pointers, -// we can't use pointers directly here either. Instead, p refers -// to inst_[p>>1].out (p&1 == 0) or inst_[p>>1].out1 (p&1 == 1). -// p == 0 represents the NULL list. This is okay because instruction #0 +// we can't use pointers directly here either. Instead, head refers +// to inst_[head>>1].out (head&1 == 0) or inst_[head>>1].out1 (head&1 == 1). +// head == 0 represents the NULL list. This is okay because instruction #0 // is always the fail instruction, which never appears on a list. - struct PatchList { - uint32_t p; - // Returns patch list containing just p. - static PatchList Mk(uint32_t p); + static PatchList Mk(uint32_t p) { + return {p, p}; + } - // Patches all the entries on l to have value v. + // Patches all the entries on l to have value p. // Caller must not ever use patch list again. - static void Patch(Prog::Inst *inst0, PatchList l, uint32_t v); - - // Deref returns the next pointer pointed at by p. - static PatchList Deref(Prog::Inst *inst0, PatchList l); - - // Appends two patch lists and returns result. - static PatchList Append(Prog::Inst *inst0, PatchList l1, PatchList l2); -}; - -static PatchList nullPatchList = { 0 }; - -// Returns patch list containing just p. -PatchList PatchList::Mk(uint32_t p) { - PatchList l; - l.p = p; - return l; -} - -// Returns the next pointer pointed at by l. -PatchList PatchList::Deref(Prog::Inst* inst0, PatchList l) { - Prog::Inst* ip = &inst0[l.p>>1]; - if (l.p&1) - l.p = ip->out1(); - else - l.p = ip->out(); - return l; -} - -// Patches all the entries on l to have value v. -void PatchList::Patch(Prog::Inst *inst0, PatchList l, uint32_t val) { - while (l.p != 0) { - Prog::Inst* ip = &inst0[l.p>>1]; - if (l.p&1) { - l.p = ip->out1(); - ip->out1_ = val; - } else { - l.p = ip->out(); - ip->set_out(val); + static void Patch(Prog::Inst* inst0, PatchList l, uint32_t p) { + while (l.head != 0) { + Prog::Inst* ip = &inst0[l.head>>1]; + if (l.head&1) { + l.head = ip->out1(); + ip->out1_ = p; + } else { + l.head = ip->out(); + ip->set_out(p); + } } } -} -// Appends two patch lists and returns result. -PatchList PatchList::Append(Prog::Inst* inst0, PatchList l1, PatchList l2) { - if (l1.p == 0) - return l2; - if (l2.p == 0) - return l1; - - PatchList l = l1; - for (;;) { - PatchList next = PatchList::Deref(inst0, l); - if (next.p == 0) - break; - l = next; + // Appends two patch lists and returns result. + static PatchList Append(Prog::Inst* inst0, PatchList l1, PatchList l2) { + if (l1.head == 0) + return l2; + if (l2.head == 0) + return l1; + Prog::Inst* ip = &inst0[l1.tail>>1]; + if (l1.tail&1) + ip->out1_ = l2.head; + else + ip->set_out(l2.head); + return {l1.head, l2.tail}; } - Prog::Inst* ip = &inst0[l.p>>1]; - if (l.p&1) - ip->out1_ = l2.p; - else - ip->set_out(l2.p); + uint32_t head; + uint32_t tail; // for constant-time append +}; - return l1; -} +static const PatchList kNullPatchList = {0, 0}; // Compiled program fragment. struct Frag { uint32_t begin; PatchList end; + bool nullable; - Frag() : begin(0) { end.p = 0; } // needed so Frag can go in vector - Frag(uint32_t begin, PatchList end) : begin(begin), end(end) {} + Frag() : begin(0), end(kNullPatchList), nullable(false) {} + Frag(uint32_t begin, PatchList end, bool nullable) + : begin(begin), end(end), nullable(nullable) {} }; // Input encodings. @@ -345767,8 +347800,8 @@ class Compiler : public Regexp::Walker { int AddSuffixRecursive(int root, int id); // Finds the trie node for the given suffix. Returns a Frag in order to - // distinguish between pointing at the root node directly (end.p == 0) - // and pointing at an Alt's out1 or out (end.p&1 == 1 or 0, respectively). + // distinguish between pointing at the root node directly (end.head == 0) + // and pointing at an Alt's out1 or out (end.head&1 == 1 or 0, respectively). Frag FindByteRange(int root, int id); // Compares two ByteRanges and returns true iff they are equal. @@ -345780,8 +347813,8 @@ class Compiler : public Regexp::Walker { // Single rune. Frag Literal(Rune r, bool foldcase); - void Setup(Regexp::ParseFlags, int64_t, RE2::Anchor); - Prog* Finish(); + void Setup(Regexp::ParseFlags flags, int64_t max_mem, RE2::Anchor anchor); + Prog* Finish(Regexp* re); // Returns .* where dot = any byte Frag DotStar(); @@ -345853,7 +347886,7 @@ int Compiler::AllocInst(int n) { // Returns an unmatchable fragment. Frag Compiler::NoMatch() { - return Frag(0, nullPatchList); + return Frag(); } // Is a an unmatchable fragment? @@ -345869,7 +347902,7 @@ Frag Compiler::Cat(Frag a, Frag b) { // Elide no-op. Prog::Inst* begin = &inst_[a.begin]; if (begin->opcode() == kInstNop && - a.end.p == (a.begin << 1) && + a.end.head == (a.begin << 1) && begin->out() == 0) { // in case refs to a somewhere PatchList::Patch(inst_.data(), a.end, b.begin); @@ -345879,11 +347912,11 @@ Frag Compiler::Cat(Frag a, Frag b) { // To run backward over string, reverse all concatenations. if (reversed_) { PatchList::Patch(inst_.data(), b.end, a.begin); - return Frag(b.begin, a.end); + return Frag(b.begin, a.end, b.nullable && a.nullable); } PatchList::Patch(inst_.data(), a.end, b.begin); - return Frag(a.begin, b.end); + return Frag(a.begin, b.end, a.nullable && b.nullable); } // Given fragments for a and b, returns fragment for a|b. @@ -345899,7 +347932,8 @@ Frag Compiler::Alt(Frag a, Frag b) { return NoMatch(); inst_[id].InitAlt(a.begin, b.begin); - return Frag(id, PatchList::Append(inst_.data(), a.end, b.end)); + return Frag(id, PatchList::Append(inst_.data(), a.end, b.end), + a.nullable || b.nullable); } // When capturing submatches in like-Perl mode, a kOpAlt Inst @@ -345909,27 +347943,44 @@ Frag Compiler::Alt(Frag a, Frag b) { // then the operator is greedy. If out1_ is the repetition // (and out_ moves forward), then the operator is non-greedy. -// Given a fragment a, returns a fragment for a* or a*? (if nongreedy) -Frag Compiler::Star(Frag a, bool nongreedy) { +// Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy) +Frag Compiler::Plus(Frag a, bool nongreedy) { int id = AllocInst(1); if (id < 0) return NoMatch(); - inst_[id].InitAlt(0, 0); - PatchList::Patch(inst_.data(), a.end, id); + PatchList pl; if (nongreedy) { - inst_[id].out1_ = a.begin; - return Frag(id, PatchList::Mk(id << 1)); + inst_[id].InitAlt(0, a.begin); + pl = PatchList::Mk(id << 1); } else { - inst_[id].set_out(a.begin); - return Frag(id, PatchList::Mk((id << 1) | 1)); + inst_[id].InitAlt(a.begin, 0); + pl = PatchList::Mk((id << 1) | 1); } + PatchList::Patch(inst_.data(), a.end, id); + return Frag(a.begin, pl, a.nullable); } -// Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy) -Frag Compiler::Plus(Frag a, bool nongreedy) { - // a+ is just a* with a different entry point. - Frag f = Star(a, nongreedy); - return Frag(a.begin, f.end); +// Given a fragment for a, returns a fragment for a* or a*? (if nongreedy) +Frag Compiler::Star(Frag a, bool nongreedy) { + // When the subexpression is nullable, one Alt isn't enough to guarantee + // correct priority ordering within the transitive closure. The simplest + // solution is to handle it as (a+)? instead, which adds the second Alt. + if (a.nullable) + return Quest(Plus(a, nongreedy), nongreedy); + + int id = AllocInst(1); + if (id < 0) + return NoMatch(); + PatchList pl; + if (nongreedy) { + inst_[id].InitAlt(0, a.begin); + pl = PatchList::Mk(id << 1); + } else { + inst_[id].InitAlt(a.begin, 0); + pl = PatchList::Mk((id << 1) | 1); + } + PatchList::Patch(inst_.data(), a.end, id); + return Frag(id, pl, true); } // Given a fragment for a, returns a fragment for a? or a?? (if nongreedy) @@ -345947,7 +347998,7 @@ Frag Compiler::Quest(Frag a, bool nongreedy) { inst_[id].InitAlt(a.begin, 0); pl = PatchList::Mk((id << 1) | 1); } - return Frag(id, PatchList::Append(inst_.data(), pl, a.end)); + return Frag(id, PatchList::Append(inst_.data(), pl, a.end), true); } // Returns a fragment for the byte range lo-hi. @@ -345956,7 +348007,7 @@ Frag Compiler::ByteRange(int lo, int hi, bool foldcase) { if (id < 0) return NoMatch(); inst_[id].InitByteRange(lo, hi, foldcase, 0); - return Frag(id, PatchList::Mk(id << 1)); + return Frag(id, PatchList::Mk(id << 1), false); } // Returns a no-op fragment. Sometimes unavoidable. @@ -345965,7 +348016,7 @@ Frag Compiler::Nop() { if (id < 0) return NoMatch(); inst_[id].InitNop(0); - return Frag(id, PatchList::Mk(id << 1)); + return Frag(id, PatchList::Mk(id << 1), true); } // Returns a fragment that signals a match. @@ -345974,7 +348025,7 @@ Frag Compiler::Match(int32_t match_id) { if (id < 0) return NoMatch(); inst_[id].InitMatch(match_id); - return Frag(id, nullPatchList); + return Frag(id, kNullPatchList, false); } // Returns a fragment matching a particular empty-width op (like ^ or $) @@ -345983,7 +348034,7 @@ Frag Compiler::EmptyWidth(EmptyOp empty) { if (id < 0) return NoMatch(); inst_[id].InitEmptyWidth(empty, 0); - return Frag(id, PatchList::Mk(id << 1)); + return Frag(id, PatchList::Mk(id << 1), true); } // Given a fragment a, returns a fragment with capturing parens around a. @@ -345997,7 +348048,7 @@ Frag Compiler::Capture(Frag a, int n) { inst_[id+1].InitCapture(2*n+1, 0); PatchList::Patch(inst_.data(), a.end, id+1); - return Frag(id, PatchList::Mk((id+1) << 1)); + return Frag(id, PatchList::Mk((id+1) << 1), a.nullable); } // A Rune is a name for a Unicode code point. @@ -346022,7 +348073,7 @@ static int MaxRune(int len) { void Compiler::BeginRange() { rune_cache_.clear(); rune_range_.begin = 0; - rune_range_.end = nullPatchList; + rune_range_.end = kNullPatchList; } int Compiler::UncachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase, @@ -346056,8 +348107,8 @@ int Compiler::CachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase, } bool Compiler::IsCachedRuneByteSuffix(int id) { - uint8_t lo = inst_[id].inst_byte_range_data_.lo_; - uint8_t hi = inst_[id].inst_byte_range_data_.hi_; + uint8_t lo = inst_[id].lo_; + uint8_t hi = inst_[id].hi_; bool foldcase = inst_[id].foldcase() != 0; int next = inst_[id].out(); @@ -346103,9 +348154,9 @@ int Compiler::AddSuffixRecursive(int root, int id) { } int br; - if (f.end.p == 0) + if (f.end.head == 0) br = root; - else if (f.end.p&1) + else if (f.end.head&1) br = inst_[f.begin].out1(); else br = inst_[f.begin].out(); @@ -346121,9 +348172,9 @@ int Compiler::AddSuffixRecursive(int root, int id) { // Ensure that the parent points to the clone, not to the original. // Note that this could leave the head unreachable except via the cache. br = byterange; - if (f.end.p == 0) + if (f.end.head == 0) root = br; - else if (f.end.p&1) + else if (f.end.head&1) inst_[f.begin].out1_ = br; else inst_[f.begin].set_out(br); @@ -346156,7 +348207,7 @@ bool Compiler::ByteRangeEqual(int id1, int id2) { Frag Compiler::FindByteRange(int root, int id) { if (inst_[root].opcode() == kInstByteRange) { if (ByteRangeEqual(root, id)) - return Frag(root, nullPatchList); + return Frag(root, kNullPatchList, false); else return NoMatch(); } @@ -346164,7 +348215,7 @@ Frag Compiler::FindByteRange(int root, int id) { while (inst_[root].opcode() == kInstAlt) { int out1 = inst_[root].out1(); if (ByteRangeEqual(out1, id)) - return Frag(root, PatchList::Mk((root << 1) | 1)); + return Frag(root, PatchList::Mk((root << 1) | 1), false); // CharClass is a sorted list of ranges, so if out1 of the root Alt wasn't // what we're looking for, then we can stop immediately. Unfortunately, we @@ -346176,7 +348227,7 @@ Frag Compiler::FindByteRange(int root, int id) { if (inst_[out].opcode() == kInstAlt) root = out; else if (ByteRangeEqual(out, id)) - return Frag(root, PatchList::Mk(root << 1)); + return Frag(root, PatchList::Mk(root << 1), false); else return NoMatch(); } @@ -346217,48 +348268,43 @@ void Compiler::AddRuneRangeLatin1(Rune lo, Rune hi, bool foldcase) { static_cast(hi), foldcase, 0)); } -// Table describing how to make a UTF-8 matching machine -// for the rune range 80-10FFFF (Runeself-Runemax). -// This range happens frequently enough (for example /./ and /[^a-z]/) -// and the rune_cache_ map is slow enough that this is worth -// special handling. Makes compilation of a small expression -// with a dot in it about 10% faster. -// The * in the comments below mark whole sequences. -static struct ByteRangeProg { - int next; - int lo; - int hi; -} prog_80_10ffff[] = { - // Two-byte - { -1, 0x80, 0xBF, }, // 0: 80-BF - { 0, 0xC2, 0xDF, }, // 1: C2-DF 80-BF* - - // Three-byte - { 0, 0xA0, 0xBF, }, // 2: A0-BF 80-BF - { 2, 0xE0, 0xE0, }, // 3: E0 A0-BF 80-BF* - { 0, 0x80, 0xBF, }, // 4: 80-BF 80-BF - { 4, 0xE1, 0xEF, }, // 5: E1-EF 80-BF 80-BF* - - // Four-byte - { 4, 0x90, 0xBF, }, // 6: 90-BF 80-BF 80-BF - { 6, 0xF0, 0xF0, }, // 7: F0 90-BF 80-BF 80-BF* - { 4, 0x80, 0xBF, }, // 8: 80-BF 80-BF 80-BF - { 8, 0xF1, 0xF3, }, // 9: F1-F3 80-BF 80-BF 80-BF* - { 4, 0x80, 0x8F, }, // 10: 80-8F 80-BF 80-BF - { 10, 0xF4, 0xF4, }, // 11: F4 80-8F 80-BF 80-BF* -}; - void Compiler::Add_80_10ffff() { - int inst[arraysize(prog_80_10ffff)] = { 0 }; // does not need to be initialized; silences gcc warning - for (int i = 0; i < arraysize(prog_80_10ffff); i++) { - const ByteRangeProg& p = prog_80_10ffff[i]; - int next = 0; - if (p.next >= 0) - next = inst[p.next]; - inst[i] = UncachedRuneByteSuffix(static_cast(p.lo), - static_cast(p.hi), false, next); - if ((p.lo & 0xC0) != 0x80) - AddSuffix(inst[i]); + // The 80-10FFFF (Runeself-Runemax) rune range occurs frequently enough + // (for example, for /./ and /[^a-z]/) that it is worth simplifying: by + // permitting overlong encodings in E0 and F0 sequences and code points + // over 10FFFF in F4 sequences, the size of the bytecode and the number + // of equivalence classes are reduced significantly. + int id; + if (reversed_) { + // Prefix factoring matters, but we don't have to handle it here + // because the rune range trie logic takes care of that already. + id = UncachedRuneByteSuffix(0xC2, 0xDF, false, 0); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + AddSuffix(id); + + id = UncachedRuneByteSuffix(0xE0, 0xEF, false, 0); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + AddSuffix(id); + + id = UncachedRuneByteSuffix(0xF0, 0xF4, false, 0); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + AddSuffix(id); + } else { + // Suffix factoring matters - and we do have to handle it here. + int cont1 = UncachedRuneByteSuffix(0x80, 0xBF, false, 0); + id = UncachedRuneByteSuffix(0xC2, 0xDF, false, cont1); + AddSuffix(id); + + int cont2 = UncachedRuneByteSuffix(0x80, 0xBF, false, cont1); + id = UncachedRuneByteSuffix(0xE0, 0xEF, false, cont2); + AddSuffix(id); + + int cont3 = UncachedRuneByteSuffix(0x80, 0xBF, false, cont2); + id = UncachedRuneByteSuffix(0xF0, 0xF4, false, cont3); + AddSuffix(id); } } @@ -346266,9 +348312,8 @@ void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) { if (lo > hi) return; - // Pick off 80-10FFFF as a common special case - // that can bypass the slow rune_cache_. - if (lo == 0x80 && hi == 0x10ffff && !reversed_) { + // Pick off 80-10FFFF as a common special case. + if (lo == 0x80 && hi == 0x10ffff) { Add_80_10ffff(); return; } @@ -346364,8 +348409,8 @@ void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) { // Should not be called. Frag Compiler::Copy(Frag arg) { // We're using WalkExponential; there should be no copying. - LOG(DFATAL) << "Compiler::Copy called!"; failed_ = true; + LOG(DFATAL) << "Compiler::Copy called!"; return NoMatch(); } @@ -346491,8 +348536,8 @@ Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags, CharClass* cc = re->cc(); if (cc->empty()) { // This can't happen. - LOG(DFATAL) << "No ranges in char class"; failed_ = true; + LOG(DFATAL) << "No ranges in char class"; return NoMatch(); } @@ -346549,8 +348594,8 @@ Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags, case kRegexpNoWordBoundary: return EmptyWidth(kEmptyNonWordBoundary); } - LOG(DFATAL) << "Missing case in Compiler: " << re->op(); failed_ = true; + LOG(DFATAL) << "Missing case in Compiler: " << re->op(); return NoMatch(); } @@ -346650,8 +348695,6 @@ static bool IsAnchorEnd(Regexp** pre, int depth) { void Compiler::Setup(Regexp::ParseFlags flags, int64_t max_mem, RE2::Anchor anchor) { - prog_->set_flags(flags); - if (flags & Regexp::Latin1) encoding_ = kEncodingLatin1; max_mem_ = max_mem; @@ -346672,14 +348715,11 @@ void Compiler::Setup(Regexp::ParseFlags flags, int64_t max_mem, // on the program.) if (m >= 1<<24) m = 1<<24; - // Inst imposes its own limit (currently bigger than 2^24 but be safe). if (m > Prog::Inst::kMaxInst) m = Prog::Inst::kMaxInst; - max_ninst_ = static_cast(m); } - anchor_ = anchor; } @@ -346733,10 +348773,10 @@ Prog* Compiler::Compile(Regexp* re, bool reversed, int64_t max_mem) { c.prog_->set_start_unanchored(all.begin); // Hand ownership of prog_ to caller. - return c.Finish(); + return c.Finish(re); } -Prog* Compiler::Finish() { +Prog* Compiler::Finish(Regexp* re) { if (failed_) return NULL; @@ -346753,6 +348793,13 @@ Prog* Compiler::Finish() { prog_->Flatten(); prog_->ComputeByteMap(); + if (!prog_->reversed()) { + std::string prefix; + bool prefix_foldcase; + if (re->RequiredPrefixForAccel(&prefix, &prefix_foldcase)) + prog_->ConfigurePrefixAccel(prefix, prefix_foldcase); + } + // Record remaining memory for DFA. if (max_mem_ <= 0) { prog_->set_dfa_mem(1<<20); @@ -346809,7 +348856,7 @@ Prog* Compiler::CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem) { c.prog_->set_start(all.begin); c.prog_->set_start_unanchored(all.begin); - Prog* prog = c.Finish(); + Prog* prog = c.Finish(re); if (prog == NULL) return NULL; @@ -346831,7 +348878,7 @@ Prog* Prog::CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem) { return Compiler::CompileSet(re, anchor, max_mem); } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -346901,8 +348948,8 @@ namespace duckdb_re2 { // Silence "truncation of constant value" warning for kMul in 32-bit mode. // Since this is a header file, push and then pop to limit the scope. #ifdef _MSC_VER -//#pragma warning(push) -//#pragma warning(disable: 4309) +#pragma warning(push) +#pragma warning(disable: 4309) #endif class HashMix { @@ -346921,10 +348968,10 @@ class HashMix { }; #ifdef _MSC_VER -//#pragma warning(pop) +#pragma warning(pop) #endif -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_MIX_H_ @@ -346949,24 +348996,39 @@ class HashMix { * You should assume the locks are *not* re-entrant. */ -#if !defined(_WIN32) +#ifdef RE2_NO_THREADS +#include +#define MUTEX_IS_LOCK_COUNTER +#else +#ifdef _WIN32 +// Requires Windows Vista or Windows Server 2008 at minimum. +#include +#if defined(WINVER) && WINVER >= 0x0600 +#define MUTEX_IS_WIN32_SRWLOCK +#endif +#else #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #include -//#if defined(_POSIX_READER_WRITER_LOCKS) && _POSIX_READER_WRITER_LOCKS > 0 -//#define MUTEX_IS_PTHREAD_RWLOCK -//#endif +#if defined(_POSIX_READER_WRITER_LOCKS) && _POSIX_READER_WRITER_LOCKS > 0 +#define MUTEX_IS_PTHREAD_RWLOCK +#endif +#endif #endif -#if defined(MUTEX_IS_PTHREAD_RWLOCK) -#error We really dont want to include pthread +#if defined(MUTEX_IS_LOCK_COUNTER) +typedef int MutexType; +#elif defined(MUTEX_IS_WIN32_SRWLOCK) +typedef SRWLOCK MutexType; +#elif defined(MUTEX_IS_PTHREAD_RWLOCK) +#include #include #include typedef pthread_rwlock_t MutexType; #else -#include -typedef std::mutex MutexType; +#include +typedef std::shared_mutex MutexType; #endif namespace duckdb_re2 { @@ -346996,15 +349058,33 @@ class Mutex { Mutex& operator=(const Mutex&) = delete; }; -#if defined(MUTEX_IS_PTHREAD_RWLOCK) +#if defined(MUTEX_IS_LOCK_COUNTER) + +Mutex::Mutex() : mutex_(0) { } +Mutex::~Mutex() { assert(mutex_ == 0); } +void Mutex::Lock() { assert(--mutex_ == -1); } +void Mutex::Unlock() { assert(mutex_++ == -1); } +void Mutex::ReaderLock() { assert(++mutex_ > 0); } +void Mutex::ReaderUnlock() { assert(mutex_-- > 0); } + +#elif defined(MUTEX_IS_WIN32_SRWLOCK) + +Mutex::Mutex() : mutex_(SRWLOCK_INIT) { } +Mutex::~Mutex() { } +void Mutex::Lock() { AcquireSRWLockExclusive(&mutex_); } +void Mutex::Unlock() { ReleaseSRWLockExclusive(&mutex_); } +void Mutex::ReaderLock() { AcquireSRWLockShared(&mutex_); } +void Mutex::ReaderUnlock() { ReleaseSRWLockShared(&mutex_); } + +#elif defined(MUTEX_IS_PTHREAD_RWLOCK) #define SAFE_PTHREAD(fncall) \ do { \ - if ((fncall) != 0) abort(); \ - } while (0) + if ((fncall) != 0) throw std::runtime_error("RE2 pthread failure"); \ + } while (0); Mutex::Mutex() { SAFE_PTHREAD(pthread_rwlock_init(&mutex_, NULL)); } -Mutex::~Mutex() { SAFE_PTHREAD(pthread_rwlock_destroy(&mutex_)); } +Mutex::~Mutex() { pthread_rwlock_destroy(&mutex_); } void Mutex::Lock() { SAFE_PTHREAD(pthread_rwlock_wrlock(&mutex_)); } void Mutex::Unlock() { SAFE_PTHREAD(pthread_rwlock_unlock(&mutex_)); } void Mutex::ReaderLock() { SAFE_PTHREAD(pthread_rwlock_rdlock(&mutex_)); } @@ -347018,8 +349098,8 @@ Mutex::Mutex() { } Mutex::~Mutex() { } void Mutex::Lock() { mutex_.lock(); } void Mutex::Unlock() { mutex_.unlock(); } -void Mutex::ReaderLock() { Lock(); } // C++11 doesn't have std::shared_mutex. -void Mutex::ReaderUnlock() { Unlock(); } +void Mutex::ReaderLock() { mutex_.lock_shared(); } +void Mutex::ReaderUnlock() { mutex_.unlock_shared(); } #endif @@ -347066,7 +349146,7 @@ class WriterMutexLock { #define ReaderMutexLock(x) static_assert(false, "ReaderMutexLock declaration missing variable name") #define WriterMutexLock(x) static_assert(false, "WriterMutexLock declaration missing variable name") -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_MUTEX_H_ @@ -347075,8 +349155,6 @@ class WriterMutexLock { - - // LICENSE_CHANGE_BEGIN // The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #2 // See the end of this file for a list @@ -347098,10 +349176,8 @@ namespace duckdb_re2 { std::string CEscape(const StringPiece& src); void PrefixSuccessor(std::string* prefix); std::string StringPrintf(const char* format, ...); -void SStringPrintf(std::string* dst, const char* format, ...); -void StringAppendF(std::string* dst, const char* format, ...); -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_STRUTIL_H_ @@ -347111,27 +349187,23 @@ void StringAppendF(std::string* dst, const char* format, ...); + + + // Silence "zero-sized array in struct/union" warning for DFA::State::next_. #ifdef _MSC_VER -//#pragma warning(disable: 4200) +#pragma warning(disable: 4200) #endif namespace duckdb_re2 { -#if !defined(__linux__) /* only Linux seems to have memrchr */ -static void* memrchr(const void* s, int c, size_t n) { - const unsigned char* p = (const unsigned char*)s; - for (p += n; n > 0; n--) - if (*--p == c) - return (void*)p; - - return NULL; -} -#endif - // Controls whether the DFA should bail out early if the NFA would be faster. static bool dfa_should_bail_when_slow = true; +void Prog::TESTING_ONLY_set_dfa_should_bail_when_slow(bool b) { + dfa_should_bail_when_slow = b; +} + // A DFA implementation of a regular expression program. // Since this is entirely a forward declaration mandated by C++, // some of the comments here are better understood after reading @@ -347181,7 +349253,6 @@ class DFA { // byte c, the next state should be s->next_[c]. struct State { inline bool IsMatch() const { return (flag_ & kFlagMatch) != 0; } - void SaveMatch(std::vector* v); int* inst_; // Instruction pointers in the state. int ninst_; // # of inst_ pointers. @@ -347191,17 +349262,15 @@ class DFA { // Work around the bug affecting flexible array members in GCC 6.x (for x >= 1). // (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70932) - std::atomic next_[1]; // Outgoing arrows from State, +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ == 6 && __GNUC_MINOR__ >= 1 + std::atomic next_[0]; // Outgoing arrows from State, +#else + std::atomic next_[]; // Outgoing arrows from State, +#endif + // one per input byte class }; - // Marks separate thread groups of different priority - // in the work queue when in leftmost-longest matching mode. - constexpr static int32_t Mark = -1; - // Separates the match IDs from the instructions in inst_. - // Used only for "many match" DFA states. - constexpr static int32_t MatchSep = -2; - enum { kByteEndText = 256, // imaginary byte at end of text @@ -347242,11 +349311,8 @@ class DFA { typedef std::unordered_set StateSet; private: - // Special "first_byte" values for a state. (Values >= 0 denote actual bytes.) - enum { - kFbUnknown = -1, // No analysis has been performed. - kFbNone = -2, // The first-byte trick cannot be used. - }; + // Make it easier to swap in a scalable reader-writer mutex. + using CacheMutex = Mutex; enum { // Indices into start_ for unanchored searches. @@ -347314,25 +349380,26 @@ class DFA { struct SearchParams { SearchParams(const StringPiece& text, const StringPiece& context, RWLocker* cache_lock) - : text(text), context(context), + : text(text), + context(context), anchored(false), + can_prefix_accel(false), want_earliest_match(false), run_forward(false), start(NULL), - first_byte(kFbUnknown), cache_lock(cache_lock), failed(false), ep(NULL), - matches(NULL) { } + matches(NULL) {} StringPiece text; StringPiece context; bool anchored; + bool can_prefix_accel; bool want_earliest_match; bool run_forward; State* start; - int first_byte; - RWLocker *cache_lock; + RWLocker* cache_lock; bool failed; // "out" parameter: whether search gave up const char* ep; // "out" parameter: end pointer for match SparseSet* matches; @@ -347343,15 +349410,13 @@ class DFA { }; // Before each search, the parameters to Search are analyzed by - // AnalyzeSearch to determine the state in which to start and the - // "first_byte" for that state, if any. + // AnalyzeSearch to determine the state in which to start. struct StartInfo { - StartInfo() : start(NULL), first_byte(kFbUnknown) {} - State* start; - std::atomic first_byte; + StartInfo() : start(NULL) {} + std::atomic start; }; - // Fills in params->start and params->first_byte using + // Fills in params->start and params->can_prefix_accel using // the other search parameters. Returns true on success, // false on failure. // cache_mutex_.r <= L < mutex_ @@ -347362,10 +349427,10 @@ class DFA { // The generic search loop, inlined to create specialized versions. // cache_mutex_.r <= L < mutex_ // Might unlock and relock cache_mutex_ via params->cache_lock. - inline bool InlinedSearchLoop(SearchParams* params, - bool have_first_byte, - bool want_earliest_match, - bool run_forward); + template + inline bool InlinedSearchLoop(SearchParams* params); // The specialized versions of InlinedSearchLoop. The three letters // at the ends of the name denote the true/false values used as the @@ -347387,13 +349452,6 @@ class DFA { // Might unlock and relock cache_mutex_ via params->cache_lock. bool FastSearchLoop(SearchParams* params); - // For debugging, a slow search loop that calls InlinedSearchLoop - // directly -- because the booleans passed are not constants, the - // loop is not specialized like the SearchFFF etc. versions, so it - // runs much more slowly. Useful only for debugging. - // cache_mutex_.r <= L < mutex_ - // Might unlock and relock cache_mutex_ via params->cache_lock. - bool SlowSearchLoop(SearchParams* params); // Looks up bytes in bytemap_ but handles case c == kByteEndText too. int ByteMap(int c) { @@ -347420,11 +349478,14 @@ class DFA { // while holding cache_mutex_ for writing, to avoid interrupting other // readers. Any State* pointers are only valid while cache_mutex_ // is held. - Mutex cache_mutex_; + CacheMutex cache_mutex_; int64_t mem_budget_; // Total memory budget for all States. int64_t state_budget_; // Amount of memory remaining for new States. StateSet state_cache_; // All States computed so far. StartInfo start_[kMaxStart]; + + DFA(const DFA&) = delete; + DFA& operator=(const DFA&) = delete; }; // Shorthand for casting to uint8_t*. @@ -347434,6 +349495,17 @@ static inline const uint8_t* BytePtr(const void* v) { // Work queues +// Marks separate thread groups of different priority +// in the work queue when in leftmost-longest matching mode. +//#define Mark (-1) +constexpr auto Mark = -1; + + +// Separates the match IDs from the instructions in inst_. +// Used only for "many match" DFA states. +//#define MatchSep (-2) +constexpr auto MatchSep = -2; + // Internally, the DFA uses a sparse array of // program instruction pointers as a work queue. // In leftmost longest mode, marks separate sections @@ -347564,10 +349636,10 @@ std::string DFA::DumpWorkq(Workq* q) { const char* sep = ""; for (Workq::iterator it = q->begin(); it != q->end(); ++it) { if (q->is_mark(*it)) { - StringAppendF(&s, "|"); + s += "|"; sep = ""; } else { - StringAppendF(&s, "%s%d", sep, *it); + s += StringPrintf("%s%d", sep, *it); sep = ","; } } @@ -347584,20 +349656,20 @@ std::string DFA::DumpState(State* state) { return "*"; std::string s; const char* sep = ""; - StringAppendF(&s, "(%p)", state); + s += StringPrintf("(%p)", state); for (int i = 0; i < state->ninst_; i++) { if (state->inst_[i] == Mark) { - StringAppendF(&s, "|"); + s += "|"; sep = ""; } else if (state->inst_[i] == MatchSep) { - StringAppendF(&s, "||"); + s += "||"; sep = ""; } else { - StringAppendF(&s, "%s%d", sep, state->inst_[i]); + s += StringPrintf("%s%d", sep, state->inst_[i]); sep = ","; } } - StringAppendF(&s, " flag=%#x", state->flag_); + s += StringPrintf(" flag=%#x", state->flag_); return s; } @@ -347668,11 +349740,12 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // Only ByteRange, EmptyWidth, and Match instructions are useful to keep: // those are the only operators with any effect in // RunWorkqOnEmptyString or RunWorkqOnByte. - int* inst = new int[q->size()]; + PODArray inst(q->size()); int n = 0; uint32_t needflags = 0; // flags needed by kInstEmptyWidth instructions bool sawmatch = false; // whether queue contains guaranteed kInstMatch bool sawmark = false; // whether queue contains a Mark + for (Workq::iterator it = q->begin(); it != q->end(); ++it) { int id = *it; if (sawmatch && (kind_ == Prog::kFirstMatch || q->is_mark(id))) @@ -347696,7 +349769,6 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { (it == q->begin() && ip->greedy(prog_))) && (kind_ != Prog::kLongestMatch || !sawmark) && (flag & kFlagMatch)) { - delete[] inst; return FullMatchState; } FALLTHROUGH_INTENDED; @@ -347741,7 +349813,6 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // the execution loop can stop early. This is only okay // if the state is *not* a matching state. if (n == 0 && flag == 0) { - delete[] inst; return DeadState; } @@ -347749,7 +349820,7 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // unordered state sets separated by Marks. Sort each set // to canonicalize, to reduce the number of distinct sets stored. if (kind_ == Prog::kLongestMatch) { - int* ip = inst; + int* ip = inst.data(); int* ep = ip + n; while (ip < ep) { int* markp = ip; @@ -347762,6 +349833,15 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { } } + // If we're in many match mode, canonicalize for similar reasons: + // we have an unordered set of states (i.e. we don't have Marks) + // and sorting will reduce the number of distinct sets stored. + if (kind_ == Prog::kManyMatch) { + int* ip = inst.data(); + int* ep = ip + n; + std::sort(ip, ep); + } + // Append MatchSep and the match IDs in mq if necessary. if (mq != NULL) { inst[n++] = MatchSep; @@ -347776,8 +349856,7 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // Save the needed empty-width flags in the top bits for use later. flag |= needflags << kFlagNeedShift; - State* state = CachedState(inst, n, flag); - delete[] inst; + State* state = CachedState(inst.data(), n, flag); return state; } @@ -348006,8 +350085,21 @@ void DFA::RunWorkqOnByte(Workq* oldq, Workq* newq, break; case kInstByteRange: // can follow if c is in range - if (ip->Matches(c)) - AddToQueue(newq, ip->out(), flag); + if (!ip->Matches(c)) + break; + AddToQueue(newq, ip->out(), flag); + if (ip->hint() != 0) { + // We have a hint, but we must cancel out the + // increment that will occur after the break. + i += ip->hint() - 1; + } else { + // We have no hint, so we must find the end + // of the current list and then skip to it. + Prog::Inst* ip0 = ip; + while (!ip->last()) + ++ip; + i += ip - ip0; + } break; case kInstMatch: @@ -348022,6 +350114,7 @@ void DFA::RunWorkqOnByte(Workq* oldq, Workq* newq, break; } } + } // Processes input byte c in state, returning new state. @@ -348148,7 +350241,7 @@ DFA::State* DFA::RunStateOnByte(State* state, int c) { class DFA::RWLocker { public: - explicit RWLocker(Mutex* mu); + explicit RWLocker(CacheMutex* mu); ~RWLocker(); // If the lock is only held for reading right now, @@ -348158,19 +350251,19 @@ class DFA::RWLocker { void LockForWriting(); private: - Mutex* mu_; + CacheMutex* mu_; bool writing_; RWLocker(const RWLocker&) = delete; RWLocker& operator=(const RWLocker&) = delete; }; -DFA::RWLocker::RWLocker(Mutex* mu) : mu_(mu), writing_(false) { +DFA::RWLocker::RWLocker(CacheMutex* mu) : mu_(mu), writing_(false) { mu_->ReaderLock(); } -// This function is marked as NO_THREAD_SAFETY_ANALYSIS because the annotations -// does not support lock upgrade. +// This function is marked as NO_THREAD_SAFETY_ANALYSIS because +// the annotations don't support lock upgrade. void DFA::RWLocker::LockForWriting() NO_THREAD_SAFETY_ANALYSIS { if (!writing_) { mu_->ReaderUnlock(); @@ -348202,11 +350295,14 @@ void DFA::ResetCache(RWLocker* cache_lock) { // Re-acquire the cache_mutex_ for writing (exclusive use). cache_lock->LockForWriting(); + hooks::GetDFAStateCacheResetHook()({ + state_budget_, + state_cache_.size(), + }); + // Clear the cache, reset the memory budget. - for (int i = 0; i < kMaxStart; i++) { - start_[i].start = NULL; - start_[i].first_byte.store(kFbUnknown, std::memory_order_relaxed); - } + for (int i = 0; i < kMaxStart; i++) + start_[i].start.store(NULL, std::memory_order_relaxed); ClearCache(); mem_budget_ = state_budget_; } @@ -348321,8 +350417,7 @@ DFA::State* DFA::StateSaver::Restore() { // situation, the DFA can do better than executing the simple loop. // Instead, it can call memchr to search very quickly for the byte c. // Whether the start state has this property is determined during a -// pre-compilation pass, and if so, the byte b is passed to the search -// loop as the "first_byte" argument, along with a boolean "have_first_byte". +// pre-compilation pass and the "can_prefix_accel" argument is set. // // Fourth, the desired behavior is to search for the leftmost-best match // (approximately, the same one that Perl would find), which is not @@ -348345,7 +350440,7 @@ DFA::State* DFA::StateSaver::Restore() { // inline it to create the specialized ones. // // Note that matches are delayed by one byte, to make it easier to -// accommodate match conditions depending on the next input byte (like $ and \b). +// accomodate match conditions depending on the next input byte (like $ and \b). // When s->next[c]->IsMatch(), it means that there is a match ending just // *before* byte c. @@ -348354,15 +350449,16 @@ DFA::State* DFA::StateSaver::Restore() { // The bools are equal to the same-named variables in params, but // making them function arguments lets the inliner specialize // this function to each combination (see two paragraphs above). -inline bool DFA::InlinedSearchLoop(SearchParams* params, - bool have_first_byte, - bool want_earliest_match, - bool run_forward) { +template +inline bool DFA::InlinedSearchLoop(SearchParams* params) { State* start = params->start; - const uint8_t* bp = BytePtr(params->text.begin()); // start of text - const uint8_t* p = bp; // text scanning point - const uint8_t* ep = BytePtr(params->text.end()); // end of text - const uint8_t* resetp = NULL; // p at last cache reset + const uint8_t* bp = BytePtr(params->text.data()); // start of text + const uint8_t* p = bp; // text scanning point + const uint8_t* ep = BytePtr(params->text.data() + + params->text.size()); // end of text + const uint8_t* resetp = NULL; // p at last cache reset if (!run_forward) { using std::swap; swap(p, ep); @@ -348392,22 +350488,15 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, } while (p != ep) { - if (have_first_byte && s == start) { - // In start state, only way out is to find first_byte, - // so use optimized assembly in memchr to skip ahead. - // If first_byte isn't found, we can skip to the end - // of the string. - if (run_forward) { - if ((p = BytePtr(memchr(p, params->first_byte, ep - p))) == NULL) { - p = ep; - break; - } - } else { - if ((p = BytePtr(memrchr(ep, params->first_byte, p - ep))) == NULL) { - p = ep; - break; - } - p++; + + if (can_prefix_accel && s == start) { + // In start state, only way out is to find the prefix, + // so we use prefix accel (e.g. memchr) to skip ahead. + // If not found, we can skip to the end of the string. + p = BytePtr(prog_->PrefixAccel(p, ep - p)); + if (p == NULL) { + p = ep; + break; } } @@ -348446,9 +350535,11 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, // byte runs at about 0.2 MB/s, while the NFA (nfa.cc) can do the // same at about 2 MB/s. Unless we're processing an average // of 10 bytes per state computation, fail so that RE2 can - // fall back to the NFA. + // fall back to the NFA. However, RE2::Set cannot fall back, + // so we just have to keep on keeping on in that case. if (dfa_should_bail_when_slow && resetp != NULL && - static_cast(p - resetp) < 10*state_cache_.size()) { + static_cast(p - resetp) < 10*state_cache_.size() && + kind_ != Prog::kManyMatch) { params->failed = true; return false; } @@ -348512,17 +350603,18 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, // Process one more byte to see if it triggers a match. // (Remember, matches are delayed one byte.) + int lastbyte; if (run_forward) { - if (params->text.end() == params->context.end()) + if (EndPtr(params->text) == EndPtr(params->context)) lastbyte = kByteEndText; else - lastbyte = params->text.end()[0] & 0xFF; + lastbyte = EndPtr(params->text)[0] & 0xFF; } else { - if (params->text.begin() == params->context.begin()) + if (BeginPtr(params->text) == BeginPtr(params->context)) lastbyte = kByteEndText; else - lastbyte = params->text.begin()[-1] & 0xFF; + lastbyte = BeginPtr(params->text)[-1] & 0xFF; } State* ns = s->next_[ByteMap(lastbyte)].load(std::memory_order_acquire); @@ -348573,36 +350665,28 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, // Inline specializations of the general loop. bool DFA::SearchFFF(SearchParams* params) { - return InlinedSearchLoop(params, 0, 0, 0); + return InlinedSearchLoop(params); } bool DFA::SearchFFT(SearchParams* params) { - return InlinedSearchLoop(params, 0, 0, 1); + return InlinedSearchLoop(params); } bool DFA::SearchFTF(SearchParams* params) { - return InlinedSearchLoop(params, 0, 1, 0); + return InlinedSearchLoop(params); } bool DFA::SearchFTT(SearchParams* params) { - return InlinedSearchLoop(params, 0, 1, 1); + return InlinedSearchLoop(params); } bool DFA::SearchTFF(SearchParams* params) { - return InlinedSearchLoop(params, 1, 0, 0); + return InlinedSearchLoop(params); } bool DFA::SearchTFT(SearchParams* params) { - return InlinedSearchLoop(params, 1, 0, 1); + return InlinedSearchLoop(params); } bool DFA::SearchTTF(SearchParams* params) { - return InlinedSearchLoop(params, 1, 1, 0); + return InlinedSearchLoop(params); } bool DFA::SearchTTT(SearchParams* params) { - return InlinedSearchLoop(params, 1, 1, 1); -} - -// For debugging, calls the general code directly. -bool DFA::SlowSearchLoop(SearchParams* params) { - return InlinedSearchLoop(params, - params->first_byte >= 0, - params->want_earliest_match, - params->run_forward); + return InlinedSearchLoop(params); } // For performance, calls the appropriate specialized version @@ -348621,8 +350705,7 @@ bool DFA::FastSearchLoop(SearchParams* params) { &DFA::SearchTTT, }; - bool have_first_byte = params->first_byte >= 0; - int index = 4 * have_first_byte + + int index = 4 * params->can_prefix_accel + 2 * params->want_earliest_match + 1 * params->run_forward; return (this->*Searches[index])(params); @@ -348660,7 +350743,7 @@ bool DFA::AnalyzeSearch(SearchParams* params) { const StringPiece& context = params->context; // Sanity check: make sure that text lies within context. - if (text.begin() < context.begin() || text.end() > context.end()) { + if (BeginPtr(text) < BeginPtr(context) || EndPtr(text) > EndPtr(context)) { LOG(DFATAL) << "context does not contain text"; params->start = DeadState; return true; @@ -348670,13 +350753,13 @@ bool DFA::AnalyzeSearch(SearchParams* params) { int start; uint32_t flags; if (params->run_forward) { - if (text.begin() == context.begin()) { + if (BeginPtr(text) == BeginPtr(context)) { start = kStartBeginText; flags = kEmptyBeginText|kEmptyBeginLine; - } else if (text.begin()[-1] == '\n') { + } else if (BeginPtr(text)[-1] == '\n') { start = kStartBeginLine; flags = kEmptyBeginLine; - } else if (Prog::IsWordChar(text.begin()[-1] & 0xFF)) { + } else if (Prog::IsWordChar(BeginPtr(text)[-1] & 0xFF)) { start = kStartAfterWordChar; flags = kFlagLastWord; } else { @@ -348684,13 +350767,13 @@ bool DFA::AnalyzeSearch(SearchParams* params) { flags = 0; } } else { - if (text.end() == context.end()) { + if (EndPtr(text) == EndPtr(context)) { start = kStartBeginText; flags = kEmptyBeginText|kEmptyBeginLine; - } else if (text.end()[0] == '\n') { + } else if (EndPtr(text)[0] == '\n') { start = kStartBeginLine; flags = kEmptyBeginLine; - } else if (Prog::IsWordChar(text.end()[0] & 0xFF)) { + } else if (Prog::IsWordChar(EndPtr(text)[0] & 0xFF)) { start = kStartAfterWordChar; flags = kFlagLastWord; } else { @@ -348708,14 +350791,23 @@ bool DFA::AnalyzeSearch(SearchParams* params) { if (!AnalyzeSearchHelper(params, info, flags)) { ResetCache(params->cache_lock); if (!AnalyzeSearchHelper(params, info, flags)) { - LOG(DFATAL) << "Failed to analyze start state."; params->failed = true; + LOG(DFATAL) << "Failed to analyze start state."; return false; } } - params->start = info->start; - params->first_byte = info->first_byte.load(std::memory_order_acquire); + params->start = info->start.load(std::memory_order_acquire); + + // Even if we could prefix accel, we cannot do so when anchored and, + // less obviously, we cannot do so when we are going to need flags. + // This trick works only when there is a single byte that leads to a + // different state! + if (prog_->can_prefix_accel() && + !params->anchored && + params->start > SpecialStateMax && + params->start->flag_ >> kFlagNeedShift == 0) + params->can_prefix_accel = true; return true; } @@ -348724,47 +350816,25 @@ bool DFA::AnalyzeSearch(SearchParams* params) { bool DFA::AnalyzeSearchHelper(SearchParams* params, StartInfo* info, uint32_t flags) { // Quick check. - int fb = info->first_byte.load(std::memory_order_acquire); - if (fb != kFbUnknown) + State* start = info->start.load(std::memory_order_acquire); + if (start != NULL) return true; MutexLock l(&mutex_); - fb = info->first_byte.load(std::memory_order_relaxed); - if (fb != kFbUnknown) + start = info->start.load(std::memory_order_relaxed); + if (start != NULL) return true; q0_->clear(); AddToQueue(q0_, params->anchored ? prog_->start() : prog_->start_unanchored(), flags); - info->start = WorkqToCachedState(q0_, NULL, flags); - if (info->start == NULL) + start = WorkqToCachedState(q0_, NULL, flags); + if (start == NULL) return false; - if (info->start == DeadState) { - // Synchronize with "quick check" above. - info->first_byte.store(kFbNone, std::memory_order_release); - return true; - } - - if (info->start == FullMatchState) { - // Synchronize with "quick check" above. - info->first_byte.store(kFbNone, std::memory_order_release); // will be ignored - return true; - } - - // Even if we have a first_byte, we cannot use it when anchored and, - // less obviously, we cannot use it when we are going to need flags. - // This trick works only when there is a single byte that leads to a - // different state! - int first_byte = prog_->first_byte(); - if (first_byte == -1 || - params->anchored || - info->start->flag_ >> kFlagNeedShift != 0) - first_byte = kFbNone; - // Synchronize with "quick check" above. - info->first_byte.store(first_byte, std::memory_order_release); + info->start.store(start, std::memory_order_release); return true; } @@ -348799,9 +350869,9 @@ bool DFA::Search(const StringPiece& text, return false; if (params.start == FullMatchState) { if (run_forward == want_earliest_match) - *epp = text.begin(); + *epp = text.data(); else - *epp = text.end(); + *epp = text.data() + text.size(); return true; } bool ret = FastSearchLoop(¶ms); @@ -348862,17 +350932,17 @@ bool Prog::SearchDFA(const StringPiece& text, const StringPiece& const_context, *failed = false; StringPiece context = const_context; - if (context.begin() == NULL) + if (context.data() == NULL) context = text; - bool carat = anchor_start(); + bool caret = anchor_start(); bool dollar = anchor_end(); if (reversed_) { using std::swap; - swap(carat, dollar); + swap(caret, dollar); } - if (carat && context.begin() != text.begin()) + if (caret && BeginPtr(context) != BeginPtr(text)) return false; - if (dollar && context.end() != text.end()) + if (dollar && EndPtr(context) != EndPtr(text)) return false; // Handle full match by running an anchored longest match @@ -348905,11 +350975,15 @@ bool Prog::SearchDFA(const StringPiece& text, const StringPiece& const_context, bool matched = dfa->Search(text, context, anchored, want_earliest_match, !reversed_, failed, &ep, matches); - if (*failed) + if (*failed) { + hooks::GetDFASearchFailureHook()({ + // Nothing yet... + }); return false; + } if (!matched) return false; - if (endmatch && ep != (reversed_ ? text.begin() : text.end())) + if (endmatch && ep != (reversed_ ? text.data() : text.data() + text.size())) return false; // If caller cares, record the boundary of the match. @@ -348917,10 +350991,11 @@ bool Prog::SearchDFA(const StringPiece& text, const StringPiece& const_context, // as the beginning. if (match0) { if (reversed_) - *match0 = StringPiece(ep, static_cast(text.end() - ep)); + *match0 = + StringPiece(ep, static_cast(text.data() + text.size() - ep)); else *match0 = - StringPiece(text.begin(), static_cast(ep - text.begin())); + StringPiece(text.data(), static_cast(ep - text.data())); } return true; } @@ -348998,10 +351073,6 @@ int Prog::BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb) { return GetDFA(kind)->BuildAllStates(cb); } -void Prog::TEST_dfa_should_bail_when_slow(bool b) { - dfa_should_bail_when_slow = b; -} - // Computes min and max for matching string. // Won't return strings bigger than maxlen. bool DFA::PossibleMatchRange(std::string* min, std::string* max, int maxlen) { @@ -349147,7 +351218,7 @@ bool Prog::PossibleMatchRange(std::string* min, std::string* max, int maxlen) { return GetDFA(kLongestMatch)->PossibleMatchRange(min, max, maxlen); } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -349179,17 +351250,18 @@ bool Prog::PossibleMatchRange(std::string* min, std::string* max, int maxlen) { // number of regexps that need to be actually searched. // // By design, it does not include a string matching engine. This is to -// allow the user of the class to use their favorite string match +// allow the user of the class to use their favorite string matching // engine. The overall flow is: Add all the regexps using Add, then -// Compile the FilteredRE2. The compile returns strings that need to -// be matched. Note that all returned strings are lowercase. For -// applying regexps to a search text, the caller does the string -// matching using the strings returned. When doing the string match, -// note that the caller has to do that on lower cased version of the -// search text. Then call FirstMatch or AllMatches with a vector of -// indices of strings that were found in the text to get the actual -// regexp matches. +// Compile the FilteredRE2. Compile returns strings that need to be +// matched. Note that the returned strings are lowercased and distinct. +// For applying regexps to a search text, the caller does the string +// matching using the returned strings. When doing the string match, +// note that the caller has to do that in a case-insensitive way or +// on a lowercased version of the search text. Then call FirstMatch +// or AllMatches with a vector of indices of strings that were found +// in the text to get the actual regexp matches. +#include #include #include @@ -349205,18 +351277,25 @@ class FilteredRE2 { explicit FilteredRE2(int min_atom_len); ~FilteredRE2(); + // Not copyable. + FilteredRE2(const FilteredRE2&) = delete; + FilteredRE2& operator=(const FilteredRE2&) = delete; + // Movable. + FilteredRE2(FilteredRE2&& other); + FilteredRE2& operator=(FilteredRE2&& other); + // Uses RE2 constructor to create a RE2 object (re). Returns // re->error_code(). If error_code is other than NoError, then re is // deleted and not added to re2_vec_. RE2::ErrorCode Add(const StringPiece& pattern, const RE2::Options& options, - int *id); + int* id); // Prepares the regexps added by Add for filtering. Returns a set // of strings that the caller should check for in candidate texts. - // The returned strings are lowercased. When doing string matching, - // the search text should be lowercased first to find matching - // strings from the set of strings returned by Compile. Call after + // The returned strings are lowercased and distinct. When doing + // string matching, it should be performed in a case-insensitive + // way or the search text should be lowercased first. Call after // all Add calls are done. void Compile(std::vector* strings_to_match); @@ -349249,11 +351328,10 @@ class FilteredRE2 { // The number of regexps added. int NumRegexps() const { return static_cast(re2_vec_.size()); } - private: - - // Get the individual RE2 objects. Useful for testing. - RE2* GetRE2(int regexpid) const { return re2_vec_[regexpid]; } + // Get the individual RE2 objects. + const RE2& GetRE2(int regexpid) const { return *re2_vec_[regexpid]; } + private: // Print prefilter. void PrintPrefilter(int regexpid); @@ -349268,13 +351346,10 @@ class FilteredRE2 { bool compiled_; // An AND-OR tree of string atoms used for filtering regexps. - PrefilterTree* prefilter_tree_; - - FilteredRE2(const FilteredRE2&) = delete; - FilteredRE2& operator=(const FilteredRE2&) = delete; + std::unique_ptr prefilter_tree_; }; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_FILTERED_RE2_H_ @@ -349284,6 +351359,7 @@ class FilteredRE2 { #include #include +#include @@ -349355,8 +351431,21 @@ class Prefilter { std::string DebugString() const; private: + // A comparator used to store exact strings. We compare by length, + // then lexicographically. This ordering makes it easier to reduce the + // set of strings in SimplifyStringSet. + struct LengthThenLex { + bool operator()(const std::string& a, const std::string& b) const { + return (a.size() < b.size()) || (a.size() == b.size() && a < b); + } + }; + class Info; + using SSet = std::set; + using SSIter = SSet::iterator; + using ConstSSIter = SSet::const_iterator; + // Combines two prefilters together to create an AND. The passed // Prefilters will be part of the returned Prefilter or deleted. static Prefilter* And(Prefilter* a, Prefilter* b); @@ -349372,12 +351461,21 @@ class Prefilter { static Prefilter* FromString(const std::string& str); - static Prefilter* OrStrings(std::set* ss); + static Prefilter* OrStrings(SSet* ss); static Info* BuildInfo(Regexp* re); Prefilter* Simplify(); + // Removes redundant strings from the set. A string is redundant if + // any of the other strings appear as a substring. The empty string + // is a special case, which is ignored. + static void SimplifyStringSet(SSet* ss); + + // Adds the cross-product of a and b to dst. + // (For each string i in a and j in b, add i+j.) + static void CrossProduct(const SSet& a, const SSet& b, SSet* dst); + // Kind of Prefilter. Op op_; @@ -349398,7 +351496,7 @@ class Prefilter { Prefilter& operator=(const Prefilter&) = delete; }; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_PREFILTER_H_ @@ -349420,7 +351518,7 @@ class Prefilter { // The PrefilterTree class is used to form an AND-OR tree of strings // that would trigger each regexp. The 'prefilter' of each regexp is -// added tp PrefilterTree, and then PrefilterTree is used to find all +// added to PrefilterTree, and then PrefilterTree is used to find all // the unique strings across the prefilters. During search, by using // matches from a string matching engine, PrefilterTree deduces the // set of regexps that are to be triggered. The 'string matching @@ -349472,7 +351570,8 @@ class PrefilterTree { private: typedef SparseArray IntMap; - typedef std::map StdIntMap; + // TODO(junyer): Use std::unordered_set instead? + // It should be trivial to get rid of the stringification... typedef std::map NodeMap; // Each unique node has a corresponding Entry that helps in @@ -349490,7 +351589,7 @@ class PrefilterTree { // are two different nodes, but they share the atom 'def'. So when // 'def' matches, it triggers two parents, corresponding to the two // different OR nodes. - StdIntMap* parents; + std::vector parents; // When this node is ready to trigger the parent, what are the // regexps that are triggered. @@ -349570,7 +351669,22 @@ FilteredRE2::FilteredRE2(int min_atom_len) FilteredRE2::~FilteredRE2() { for (size_t i = 0; i < re2_vec_.size(); i++) delete re2_vec_[i]; - delete prefilter_tree_; +} + +FilteredRE2::FilteredRE2(FilteredRE2&& other) + : re2_vec_(std::move(other.re2_vec_)), + compiled_(other.compiled_), + prefilter_tree_(std::move(other.prefilter_tree_)) { + other.re2_vec_.clear(); + other.re2_vec_.shrink_to_fit(); + other.compiled_ = false; + other.prefilter_tree_.reset(new PrefilterTree()); +} + +FilteredRE2& FilteredRE2::operator=(FilteredRE2&& other) { + this->~FilteredRE2(); + (void) new (this) FilteredRE2(std::move(other)); + return *this; } RE2::ErrorCode FilteredRE2::Add(const StringPiece& pattern, @@ -349581,7 +351695,7 @@ RE2::ErrorCode FilteredRE2::Add(const StringPiece& pattern, if (!re->ok()) { if (options.log_errors()) { LOG(ERROR) << "Couldn't compile regular expression, skipping: " - << re << " due to error " << re->error(); + << pattern << " due to error " << re->error(); } delete re; } else { @@ -349661,7 +351775,7 @@ void FilteredRE2::PrintPrefilter(int regexpid) { prefilter_tree_->PrintPrefilter(regexpid); } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -349711,14 +351825,21 @@ static bool CanBeEmptyString(Regexp *re); class PCREWalker : public Regexp::Walker { public: PCREWalker() {} - bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, bool* child_args, - int nchild_args); - bool ShortVisit(Regexp* re, bool a) { - // Should never be called: we use Walk not WalkExponential. - LOG(DFATAL) << "EmptyStringWalker::ShortVisit called"; + virtual bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, + bool* child_args, int nchild_args); + + virtual bool ShortVisit(Regexp* re, bool a) { + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + LOG(DFATAL) << "PCREWalker::ShortVisit called"; +#endif return a; } + + private: + PCREWalker(const PCREWalker&) = delete; + PCREWalker& operator=(const PCREWalker&) = delete; }; // Called after visiting each of re's children and accumulating @@ -349787,13 +351908,16 @@ bool Regexp::MimicsPCRE() { class EmptyStringWalker : public Regexp::Walker { public: - EmptyStringWalker() { } - bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, - bool* child_args, int nchild_args); + EmptyStringWalker() {} - bool ShortVisit(Regexp* re, bool a) { - // Should never be called: we use Walk not WalkExponential. + virtual bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, + bool* child_args, int nchild_args); + + virtual bool ShortVisit(Regexp* re, bool a) { + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "EmptyStringWalker::ShortVisit called"; +#endif return a; } @@ -349857,7 +351981,7 @@ static bool CanBeEmptyString(Regexp* re) { return w.Walk(re, true); } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -349896,6 +352020,7 @@ static bool CanBeEmptyString(Regexp* re) { #include #include #include +#include #include #include #include @@ -349974,18 +352099,21 @@ class NFA { // Returns text version of capture information, for debugging. std::string FormatCapture(const char** capture); - inline void CopyCapture(const char** dst, const char** src); + void CopyCapture(const char** dst, const char** src) { + memmove(dst, src, ncapture_*sizeof src[0]); + } Prog* prog_; // underlying program int start_; // start instruction in program int ncapture_; // number of submatches to track bool longest_; // whether searching for longest match bool endmatch_; // whether match must end at text.end() - const char* btext_; // beginning of text being matched (for FormatSubmatch) - const char* etext_; // end of text being matched (for endmatch_) + const char* btext_; // beginning of text (for FormatSubmatch) + const char* etext_; // end of text (for endmatch_) Threadq q0_, q1_; // pre-allocated for Search. PODArray stack_; // pre-allocated for AddToThreadq - Thread* free_threads_; // free list + std::deque arena_; // thread arena + Thread* freelist_; // thread freelist const char** match_; // best match so far bool matched_; // any match so far? @@ -350008,31 +352136,30 @@ NFA::NFA(Prog* prog) { prog_->inst_count(kInstEmptyWidth) + prog_->inst_count(kInstNop) + 1; // + 1 for start inst stack_ = PODArray(nstack); - free_threads_ = NULL; + freelist_ = NULL; match_ = NULL; matched_ = false; } NFA::~NFA() { delete[] match_; - Thread* next; - for (Thread* t = free_threads_; t; t = next) { - next = t->next; - delete[] t->capture; - delete t; - } + for (const Thread& t : arena_) + delete[] t.capture; } NFA::Thread* NFA::AllocThread() { - Thread* t = free_threads_; - if (t == NULL) { - t = new Thread; + Thread* t = freelist_; + if (t != NULL) { + freelist_ = t->next; t->ref = 1; - t->capture = new const char*[ncapture_]; + // We don't need to touch t->capture because + // the caller will immediately overwrite it. return t; } - free_threads_ = t->next; + arena_.emplace_back(); + t = &arena_.back(); t->ref = 1; + t->capture = new const char*[ncapture_]; return t; } @@ -350043,21 +352170,13 @@ NFA::Thread* NFA::Incref(Thread* t) { } void NFA::Decref(Thread* t) { - if (t == NULL) - return; + DCHECK(t != NULL); t->ref--; if (t->ref > 0) return; DCHECK_EQ(t->ref, 0); - t->next = free_threads_; - free_threads_ = t; -} - -void NFA::CopyCapture(const char** dst, const char** src) { - for (int i = 0; i < ncapture_; i+=2) { - dst[i] = src[i]; - dst[i+1] = src[i+1]; - } + t->next = freelist_; + freelist_ = t; } // Follows all empty arrows from id0 and enqueues all the states reached. @@ -350157,6 +352276,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, const StringPiece& context, // Save state; will pick up at next byte. t = Incref(t0); *tp = t; + if (ip->hint() == 0) break; a = {id+ip->hint(), NULL}; @@ -350166,6 +352286,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, const StringPiece& context, // Save state; will pick up at next byte. t = Incref(t0); *tp = t; + Next: if (ip->last()) break; @@ -350231,8 +352352,10 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, const StringPiece& context, matched_ = true; Decref(t); - for (++i; i != runq->end(); ++i) - Decref(i->value()); + for (++i; i != runq->end(); ++i) { + if (i->value() != NULL) + Decref(i->value()); + } runq->clear(); if (ip->greedy(prog_)) return ip->out1(); @@ -350241,10 +352364,15 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, const StringPiece& context, break; case kInstMatch: { - // Avoid invoking undefined behavior when p happens - // to be null - and p-1 would be meaningless anyway. - if (p == NULL) + // Avoid invoking undefined behavior (arithmetic on a null pointer) + // by storing p instead of p-1. (What would the latter even mean?!) + // This complements the special case in NFA::Search(). + if (p == NULL) { + CopyCapture(match_, t->capture); + match_[1] = p; + matched_ = true; break; + } if (endmatch_ && p-1 != etext_) break; @@ -350270,8 +352398,10 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, const StringPiece& context, // worse than the one we just found: don't run the // rest of the current Threadq. Decref(t); - for (++i; i != runq->end(); ++i) - Decref(i->value()); + for (++i; i != runq->end(); ++i) { + if (i->value() != NULL) + Decref(i->value()); + } runq->clear(); return 0; } @@ -350288,13 +352418,14 @@ std::string NFA::FormatCapture(const char** capture) { std::string s; for (int i = 0; i < ncapture_; i+=2) { if (capture[i] == NULL) - StringAppendF(&s, "(?,?)"); + s += "(?,?)"; else if (capture[i+1] == NULL) - StringAppendF(&s, "(%d,?)", (int)(capture[i] - btext_)); + s += StringPrintf("(%td,?)", + capture[i] - btext_); else - StringAppendF(&s, "(%d,%d)", - (int)(capture[i] - btext_), - (int)(capture[i+1] - btext_)); + s += StringPrintf("(%td,%td)", + capture[i] - btext_, + capture[i+1] - btext_); } return s; } @@ -350306,24 +352437,23 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, return false; StringPiece context = const_context; - if (context.begin() == NULL) + if (context.data() == NULL) context = text; // Sanity check: make sure that text lies within context. - if (text.begin() < context.begin() || text.end() > context.end()) { + if (BeginPtr(text) < BeginPtr(context) || EndPtr(text) > EndPtr(context)) { LOG(DFATAL) << "context does not contain text"; return false; } - if (prog_->anchor_start() && context.begin() != text.begin()) + if (prog_->anchor_start() && BeginPtr(context) != BeginPtr(text)) return false; - if (prog_->anchor_end() && context.end() != text.end()) + if (prog_->anchor_end() && EndPtr(context) != EndPtr(text)) return false; anchored |= prog_->anchor_start(); if (prog_->anchor_end()) { longest = true; endmatch_ = true; - etext_ = text.end(); } if (nsubmatch < 0) { @@ -350343,29 +352473,31 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, } match_ = new const char*[ncapture_]; + memset(match_, 0, ncapture_*sizeof match_[0]); matched_ = false; // For debugging prints. - btext_ = context.begin(); + btext_ = context.data(); + // For convenience. + etext_ = text.data() + text.size(); // Set up search. Threadq* runq = &q0_; Threadq* nextq = &q1_; runq->clear(); nextq->clear(); - memset(&match_[0], 0, ncapture_*sizeof match_[0]); // Loop over the text, stepping the machine. - for (const char* p = text.begin();; p++) { + for (const char* p = text.data();; p++) { // This is a no-op the first time around the loop because runq is empty. - int id = Step(runq, nextq, p < text.end() ? p[0] & 0xFF : -1, context, p); + int id = Step(runq, nextq, p < etext_ ? p[0] & 0xFF : -1, context, p); DCHECK_EQ(runq->size(), 0); using std::swap; swap(nextq, runq); nextq->clear(); if (id != 0) { // We're done: full match ahead. - p = text.end(); + p = etext_; for (;;) { Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { @@ -350393,30 +352525,28 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, break; } - if (p > text.end()) + if (p > etext_) break; // Start a new thread if there have not been any matches. // (No point in starting a new thread if there have been // matches, since it would be to the right of the match // we already found.) - if (!matched_ && (!anchored || p == text.begin())) { - // If there's a required first byte for an unanchored search - // and we're not in the middle of any possible matches, - // use memchr to search for the byte quickly. - int fb = prog_->first_byte(); + if (!matched_ && (!anchored || p == text.data())) { + // Try to use prefix accel (e.g. memchr) to skip ahead. + // The search must be unanchored and there must be zero + // possible matches already. if (!anchored && runq->size() == 0 && - fb >= 0 && p < text.end() && (p[0] & 0xFF) != fb) { - p = reinterpret_cast(memchr(p, fb, text.end() - p)); - if (p == NULL) { - p = text.end(); - } + p < etext_ && prog_->can_prefix_accel()) { + p = reinterpret_cast(prog_->PrefixAccel(p, etext_ - p)); + if (p == NULL) + p = etext_; } Thread* t = AllocThread(); CopyCapture(t->capture, match_); t->capture[0] = p; - AddToThreadq(runq, start_, p < text.end() ? p[0] & 0xFF : -1, context, p, + AddToThreadq(runq, start_, p < etext_ ? p[0] & 0xFF : -1, context, p, t); Decref(t); } @@ -350425,10 +352555,24 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, if (runq->size() == 0) { break; } + + // Avoid invoking undefined behavior (arithmetic on a null pointer) + // by simply not continuing the loop. + // This complements the special case in NFA::Step(). + if (p == NULL) { + (void) Step(runq, nextq, -1, context, p); + DCHECK_EQ(runq->size(), 0); + using std::swap; + swap(nextq, runq); + nextq->clear(); + break; + } } - for (Threadq::iterator i = runq->begin(); i != runq->end(); ++i) - Decref(i->value()); + for (Threadq::iterator i = runq->begin(); i != runq->end(); ++i) { + if (i->value() != NULL) + Decref(i->value()); + } if (matched_) { for (int i = 0; i < nsubmatch; i++) @@ -350440,71 +352584,11 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, return false; } -// Computes whether all successful matches have a common first byte, -// and if so, returns that byte. If not, returns -1. -int Prog::ComputeFirstByte() { - int b = -1; - SparseSet q(size()); - q.insert(start()); - for (SparseSet::iterator it = q.begin(); it != q.end(); ++it) { - int id = *it; - Prog::Inst* ip = inst(id); - switch (ip->opcode()) { - default: - LOG(DFATAL) << "unhandled " << ip->opcode() << " in ComputeFirstByte"; - break; - - case kInstMatch: - // The empty string matches: no first byte. - return -1; - - case kInstByteRange: - if (!ip->last()) - q.insert(id+1); - - // Must match only a single byte - if (ip->lo() != ip->hi()) - return -1; - if (ip->foldcase() && 'a' <= ip->lo() && ip->lo() <= 'z') - return -1; - // If we haven't seen any bytes yet, record it; - // otherwise must match the one we saw before. - if (b == -1) - b = ip->lo(); - else if (b != ip->lo()) - return -1; - break; - - case kInstNop: - case kInstCapture: - case kInstEmptyWidth: - if (!ip->last()) - q.insert(id+1); - - // Continue on. - // Ignore ip->empty() flags for kInstEmptyWidth - // in order to be as conservative as possible - // (assume all possible empty-width flags are true). - if (ip->out()) - q.insert(ip->out()); - break; - - case kInstAltMatch: - DCHECK(!ip->last()); - q.insert(id+1); - break; - - case kInstFail: - break; - } - } - return b; -} - bool Prog::SearchNFA(const StringPiece& text, const StringPiece& context, Anchor anchor, MatchKind kind, StringPiece* match, int nmatch) { + NFA nfa(this); StringPiece sp; if (kind == kFullMatch) { @@ -350516,7 +352600,7 @@ Prog::SearchNFA(const StringPiece& text, const StringPiece& context, } if (!nfa.Search(text, context, anchor == kAnchored, kind != kFirstMatch, match, nmatch)) return false; - if (kind == kFullMatch && match[0].end() != text.end()) + if (kind == kFullMatch && EndPtr(match[0]) != EndPtr(text)) return false; return true; } @@ -350580,7 +352664,7 @@ void Prog::Fanout(SparseArray* fanout) { } } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -350660,7 +352744,7 @@ void Prog::Fanout(SparseArray* fanout) { // Silence "zero-sized array in struct/union" warning for OneState::action. #ifdef _MSC_VER -//#pragma warning(disable: 4200) +#pragma warning(disable: 4200) #endif namespace duckdb_re2 { @@ -350735,7 +352819,7 @@ namespace duckdb_re2 { // the memory footprint.) struct OneState { uint32_t matchcond; // conditions to match right now. - uint32_t action[1]; + uint32_t action[]; }; // The uint32_t conditions in the action are a combination of @@ -350825,11 +352909,11 @@ bool Prog::SearchOnePass(const StringPiece& text, matchcap[i] = NULL; StringPiece context = const_context; - if (context.begin() == NULL) + if (context.data() == NULL) context = text; - if (anchor_start() && context.begin() != text.begin()) + if (anchor_start() && BeginPtr(context) != BeginPtr(text)) return false; - if (anchor_end() && context.end() != text.end()) + if (anchor_end() && EndPtr(context) != EndPtr(text)) return false; if (anchor_end()) kind = kFullMatch; @@ -350839,8 +352923,8 @@ bool Prog::SearchOnePass(const StringPiece& text, // start() is always mapped to the zeroth OneState. OneState* state = IndexToNode(nodes, statesize, 0); uint8_t* bytemap = bytemap_; - const char* bp = text.begin(); - const char* ep = text.end(); + const char* bp = text.data(); + const char* ep = text.data() + text.size(); const char* p; bool matched = false; matchcap[0] = bp; @@ -351155,6 +353239,7 @@ bool Prog::IsOnePass() { } } } + dfa_mem_ -= nalloc*statesize; onepass_nodes_ = PODArray(nalloc*statesize); memmove(onepass_nodes_.data(), nodes.data(), nalloc*statesize); @@ -351164,7 +353249,7 @@ bool Prog::IsOnePass() { return false; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -351289,7 +353374,7 @@ extern const CaseFold* LookupCaseFold(const CaseFold*, int, Rune rune); // Returns the result of applying the fold f to the rune r. extern Rune ApplyFold(const CaseFold *f, Rune r); -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_UNICODE_CASEFOLD_H_ @@ -351366,7 +353451,7 @@ extern const int num_posix_groups; extern const UGroup perl_groups[]; extern const int num_perl_groups; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_UNICODE_GROUPS_H_ @@ -351375,20 +353460,20 @@ extern const int num_perl_groups; -// #if defined(RE2_USE_ICU) -// #include "unicode/uniset.h" -// #include "unicode/unistr.h" -// #include "unicode/utypes.h" -// #endif +#if defined(RE2_USE_ICU) +//#include "unicode/uniset.h" +//#include "unicode/unistr.h" +//#include "unicode/utypes.h" +#endif namespace duckdb_re2 { -// Reduce the maximum repeat count by an order of magnitude when fuzzing. -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -static const int kMaxRepeat = 100; -#else -static const int kMaxRepeat = 1000; -#endif +// Controls the maximum repeat count permitted by the parser. +static int maximum_repeat_count = 1000; + +void Regexp::FUZZING_ONLY_set_maximum_repeat_count(int i) { + maximum_repeat_count = i; +} // Regular expression parse state. // The list of parsed regexps so far is maintained as a vector of @@ -351432,7 +353517,7 @@ class Regexp::ParseState { bool PushSimpleOp(RegexpOp op); // Pushes a ^ onto the stack. - bool PushCarat(); + bool PushCaret(); // Pushes a \b (word == true) or \B (word == false) onto the stack. bool PushWordBoundary(bool word); @@ -351548,7 +353633,7 @@ Regexp::ParseState::~ParseState() { next = re->down_; re->down_ = NULL; if (re->op() == kLeftParen) - delete re->capture_.name_; + delete re->arguments.capture.name_; re->Decref(); } } @@ -351561,10 +353646,10 @@ Regexp* Regexp::ParseState::FinishRegexp(Regexp* re) { return NULL; re->down_ = NULL; - if (re->op_ == kRegexpCharClass && re->char_class_.ccb_ != NULL) { - CharClassBuilder* ccb = re->char_class_.ccb_; - re->char_class_.ccb_ = NULL; - re->char_class_.cc_ = ccb->GetCharClass(); + if (re->op_ == kRegexpCharClass && re->arguments.char_class.ccb_ != NULL) { + CharClassBuilder* ccb = re->arguments.char_class.ccb_; + re->arguments.char_class.ccb_ = NULL; + re->arguments.char_class.cc_ = ccb->GetCharClass(); delete ccb; } @@ -351581,20 +353666,19 @@ bool Regexp::ParseState::PushRegexp(Regexp* re) { // single characters (e.g., [.] instead of \.), and some // analysis does better with fewer character classes. // Similarly, [Aa] can be rewritten as a literal A with ASCII case folding. - auto ccb = re->char_class_.ccb_; - if (re->op_ == kRegexpCharClass && ccb != NULL) { - ccb->RemoveAbove(rune_max_); - if (ccb->size() == 1) { - Rune r = ccb->begin()->lo; + if (re->op_ == kRegexpCharClass && re->arguments.char_class.ccb_ != NULL) { + re->arguments.char_class.ccb_->RemoveAbove(rune_max_); + if (re->arguments.char_class.ccb_->size() == 1) { + Rune r = re->arguments.char_class.ccb_->begin()->lo; re->Decref(); re = new Regexp(kRegexpLiteral, flags_); - re->rune_ = r; - } else if (ccb->size() == 2) { - Rune r = ccb->begin()->lo; - if ('A' <= r && r <= 'Z' && ccb->Contains(r + 'a' - 'A')) { + re->arguments.rune_ = r; + } else if (re->arguments.char_class.ccb_->size() == 2) { + Rune r = re->arguments.char_class.ccb_->begin()->lo; + if ('A' <= r && r <= 'Z' && re->arguments.char_class.ccb_->Contains(r + 'a' - 'A')) { re->Decref(); re = new Regexp(kRegexpLiteral, flags_ | FoldCase); - re->rune_ = r + 'a' - 'A'; + re->arguments.rune_ = r + 'a' - 'A'; } } } @@ -351738,11 +353822,11 @@ bool Regexp::ParseState::PushLiteral(Rune r) { // Do case folding if needed. if ((flags_ & FoldCase) && CycleFoldRune(r) != r) { Regexp* re = new Regexp(kRegexpCharClass, flags_ & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; + re->arguments.char_class.ccb_ = new CharClassBuilder; Rune r1 = r; do { if (!(flags_ & NeverNL) || r != '\n') { - re->char_class_.ccb_->AddRange(r, r); + re->arguments.char_class.ccb_->AddRange(r, r); } r = CycleFoldRune(r); } while (r != r1); @@ -351758,12 +353842,12 @@ bool Regexp::ParseState::PushLiteral(Rune r) { return true; Regexp* re = new Regexp(kRegexpLiteral, flags_); - re->rune_ = r; + re->arguments.rune_ = r; return PushRegexp(re); } // Pushes a ^ onto the stack. -bool Regexp::ParseState::PushCarat() { +bool Regexp::ParseState::PushCaret() { if (flags_ & OneLine) { return PushSimpleOp(kRegexpBeginText); } @@ -351797,9 +353881,9 @@ bool Regexp::ParseState::PushDot() { return PushSimpleOp(kRegexpAnyChar); // Rewrite . into [^\n] Regexp* re = new Regexp(kRegexpCharClass, flags_ & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; - re->char_class_.ccb_->AddRange(0, '\n' - 1); - re->char_class_.ccb_->AddRange('\n' + 1, rune_max_); + re->arguments.char_class.ccb_ = new CharClassBuilder; + re->arguments.char_class.ccb_->AddRange(0, '\n' - 1); + re->arguments.char_class.ccb_->AddRange('\n' + 1, rune_max_); return PushRegexp(re); } @@ -351896,9 +353980,10 @@ int RepetitionWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, } int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) { - // This should never be called, since we use Walk and not - // WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "RepetitionWalker::ShortVisit called"; +#endif return 0; } @@ -351907,7 +353992,9 @@ int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) { bool Regexp::ParseState::PushRepetition(int min, int max, const StringPiece& s, bool nongreedy) { - if ((max != -1 && max < min) || min > kMaxRepeat || max > kMaxRepeat) { + if ((max != -1 && max < min) || + min > maximum_repeat_count || + max > maximum_repeat_count) { status_->set_code(kRegexpRepeatSize); status_->set_error_arg(s); return false; @@ -351921,8 +354008,8 @@ bool Regexp::ParseState::PushRepetition(int min, int max, if (nongreedy) fl = fl ^ NonGreedy; Regexp* re = new Regexp(kRegexpRepeat, fl); - re->repeat_.min_ = min; - re->repeat_.max_ = max; + re->arguments.repeat.min_ = min; + re->arguments.repeat.max_ = max; re->AllocSub(1); re->down_ = stacktop_->down_; re->sub()[0] = FinishRegexp(stacktop_); @@ -351930,7 +354017,7 @@ bool Regexp::ParseState::PushRepetition(int min, int max, stacktop_ = re; if (min >= 2 || max >= 2) { RepetitionWalker w; - if (w.Walk(stacktop_, kMaxRepeat) == 0) { + if (w.Walk(stacktop_, maximum_repeat_count) == 0) { status_->set_code(kRegexpRepeatSize); status_->set_error_arg(s); return false; @@ -351948,16 +354035,16 @@ bool Regexp::ParseState::IsMarker(RegexpOp op) { // Pushes a marker onto the stack. bool Regexp::ParseState::DoLeftParen(const StringPiece& name) { Regexp* re = new Regexp(kLeftParen, flags_); - re->capture_.cap_ = ++ncap_; + re->arguments.capture.cap_ = ++ncap_; if (name.data() != NULL) - re->capture_.name_ = new std::string(name); + re->arguments.capture.name_ = new std::string(name); return PushRegexp(re); } // Pushes a non-capturing marker onto the stack. bool Regexp::ParseState::DoLeftParenNoCapture() { Regexp* re = new Regexp(kLeftParen, flags_); - re->capture_.cap_ = -1; + re->arguments.capture.cap_ = -1; return PushRegexp(re); } @@ -352024,7 +354111,7 @@ bool Regexp::ParseState::DoRightParen() { if ((r1 = stacktop_) == NULL || (r2 = r1->down_) == NULL || r2->op() != kLeftParen) { - status_->set_code(kRegexpMissingParen); + status_->set_code(kRegexpUnexpectedParen); status_->set_error_arg(whole_regexp_); return false; } @@ -352037,7 +354124,7 @@ bool Regexp::ParseState::DoRightParen() { flags_ = re->parse_flags(); // Rewrite LeftParen as capture if needed. - if (re->capture_.cap_ > 0) { + if (re->arguments.capture.cap_ > 0) { re->op_ = kRegexpCapture; // re->cap_ is already set re->AllocSub(1); @@ -352120,12 +354207,12 @@ Rune* Regexp::LeadingString(Regexp* re, int *nrune, if (re->op() == kRegexpLiteral) { *nrune = 1; - return &re->rune_; + return &re->arguments.rune_; } if (re->op() == kRegexpLiteralString) { - *nrune = re->literal_string_.nrunes_; - return re->literal_string_.runes_; + *nrune = re->arguments.literal_string.nrunes_; + return re->arguments.literal_string.runes_; } *nrune = 0; @@ -352141,7 +354228,7 @@ void Regexp::RemoveLeadingString(Regexp* re, int n) { // limit on the size of a concatenation, so we should never // see more than two here. Regexp* stk[4]; - int d = 0; + size_t d = 0; while (re->op() == kRegexpConcat) { if (d < arraysize(stk)) stk[d++] = re; @@ -352150,30 +354237,30 @@ void Regexp::RemoveLeadingString(Regexp* re, int n) { // Remove leading string from re. if (re->op() == kRegexpLiteral) { - re->rune_ = 0; + re->arguments.rune_ = 0; re->op_ = kRegexpEmptyMatch; } else if (re->op() == kRegexpLiteralString) { - if (n >= re->literal_string_.nrunes_) { - delete[] re->literal_string_.runes_; - re->literal_string_.runes_ = NULL; - re->literal_string_.nrunes_ = 0; + if (n >= re->arguments.literal_string.nrunes_) { + delete[] re->arguments.literal_string.runes_; + re->arguments.literal_string.runes_ = NULL; + re->arguments.literal_string.nrunes_ = 0; re->op_ = kRegexpEmptyMatch; - } else if (n == re->literal_string_.nrunes_ - 1) { - Rune rune = re->literal_string_.runes_[re->literal_string_.nrunes_ - 1]; - delete[] re->literal_string_.runes_; - re->literal_string_.runes_ = NULL; - re->literal_string_.nrunes_ = 0; - re->rune_ = rune; + } else if (n == re->arguments.literal_string.nrunes_ - 1) { + Rune rune = re->arguments.literal_string.runes_[re->arguments.literal_string.nrunes_ - 1]; + delete[] re->arguments.literal_string.runes_; + re->arguments.literal_string.runes_ = NULL; + re->arguments.literal_string.nrunes_ = 0; + re->arguments.rune_ = rune; re->op_ = kRegexpLiteral; } else { - re->literal_string_.nrunes_ -= n; - memmove(re->literal_string_.runes_, re->literal_string_.runes_ + n, re->literal_string_.nrunes_ * sizeof re->literal_string_.runes_[0]); + re->arguments.literal_string.nrunes_ -= n; + memmove(re->arguments.literal_string.runes_, re->arguments.literal_string.runes_ + n, re->arguments.literal_string.nrunes_ * sizeof re->arguments.literal_string.runes_[0]); } } // If re is now empty, concatenations might simplify too. - while (d-- > 0) { - re = stk[d]; + while (d > 0) { + re = stk[--d]; Regexp** sub = re->sub(); if (sub[0]->op() == kRegexpEmptyMatch) { sub[0]->Decref(); @@ -352627,28 +354714,28 @@ bool Regexp::ParseState::MaybeConcatString(int r, ParseFlags flags) { if (re2->op_ == kRegexpLiteral) { // convert into string - Rune rune = re2->rune_; + Rune rune = re2->arguments.rune_; re2->op_ = kRegexpLiteralString; - re2->literal_string_.nrunes_ = 0; - re2->literal_string_.runes_ = NULL; + re2->arguments.literal_string.nrunes_ = 0; + re2->arguments.literal_string.runes_ = NULL; re2->AddRuneToString(rune); } // push re1 into re2. if (re1->op_ == kRegexpLiteral) { - re2->AddRuneToString(re1->rune_); + re2->AddRuneToString(re1->arguments.rune_); } else { - for (int i = 0; i < re1->literal_string_.nrunes_; i++) - re2->AddRuneToString(re1->literal_string_.runes_[i]); - re1->literal_string_.nrunes_ = 0; - delete[] re1->literal_string_.runes_; - re1->literal_string_.runes_ = NULL; + for (int i = 0; i < re1->arguments.literal_string.nrunes_; i++) + re2->AddRuneToString(re1->arguments.literal_string.runes_[i]); + re1->arguments.literal_string.nrunes_ = 0; + delete[] re1->arguments.literal_string.runes_; + re1->arguments.literal_string.runes_ = NULL; } // reuse re1 if possible if (r >= 0) { re1->op_ = kRegexpLiteral; - re1->rune_ = r; + re1->arguments.rune_ = r; re1->parse_flags_ = static_cast(flags); return true; } @@ -352663,14 +354750,14 @@ bool Regexp::ParseState::MaybeConcatString(int r, ParseFlags flags) { // Parses a decimal integer, storing it in *np. // Sets *s to span the remainder of the string. static bool ParseInteger(StringPiece* s, int* np) { - if (s->size() == 0 || !isdigit((*s)[0] & 0xFF)) + if (s->empty() || !isdigit((*s)[0] & 0xFF)) return false; // Disallow leading zeros. if (s->size() >= 2 && (*s)[0] == '0' && isdigit((*s)[1] & 0xFF)) return false; int n = 0; int c; - while (s->size() > 0 && isdigit(c = (*s)[0] & 0xFF)) { + while (!s->empty() && isdigit(c = (*s)[0] & 0xFF)) { // Avoid overflow. if (n >= 100000000) return false; @@ -352692,16 +354779,16 @@ static bool ParseInteger(StringPiece* s, int* np) { // s must NOT be edited unless MaybeParseRepetition returns true. static bool MaybeParseRepetition(StringPiece* sp, int* lo, int* hi) { StringPiece s = *sp; - if (s.size() == 0 || s[0] != '{') + if (s.empty() || s[0] != '{') return false; s.remove_prefix(1); // '{' if (!ParseInteger(&s, lo)) return false; - if (s.size() == 0) + if (s.empty()) return false; if (s[0] == ',') { s.remove_prefix(1); // ',' - if (s.size() == 0) + if (s.empty()) return false; if (s[0] == '}') { // {2,} means at least 2 @@ -352715,7 +354802,7 @@ static bool MaybeParseRepetition(StringPiece* sp, int* lo, int* hi) { // {2} means exactly two *hi = *lo; } - if (s.size() == 0 || s[0] != '}') + if (s.empty() || s[0] != '}') return false; s.remove_prefix(1); // '}' *sp = s; @@ -352746,17 +354833,19 @@ static int StringPieceToRune(Rune *r, StringPiece *sp, RegexpStatus* status) { } } - status->set_code(kRegexpBadUTF8); - status->set_error_arg(StringPiece()); + if (status != NULL) { + status->set_code(kRegexpBadUTF8); + status->set_error_arg(StringPiece()); + } return -1; } -// Return whether name is valid UTF-8. -// If not, set status to kRegexpBadUTF8. +// Returns whether name is valid UTF-8. +// If not, sets status to kRegexpBadUTF8. static bool IsValidUTF8(const StringPiece& s, RegexpStatus* status) { StringPiece t = s; Rune r; - while (t.size() > 0) { + while (!t.empty()) { if (StringPieceToRune(&r, &t, status) < 0) return false; } @@ -352787,14 +354876,14 @@ static int UnHex(int c) { // Sets *rp to the named character. static bool ParseEscape(StringPiece* s, Rune* rp, RegexpStatus* status, int rune_max) { - const char* begin = s->begin(); - if (s->size() < 1 || (*s)[0] != '\\') { + const char* begin = s->data(); + if (s->empty() || (*s)[0] != '\\') { // Should not happen - caller always checks. status->set_code(kRegexpInternalError); status->set_error_arg(StringPiece()); return false; } - if (s->size() < 2) { + if (s->size() == 1) { status->set_code(kRegexpTrailingBackslash); status->set_error_arg(StringPiece()); return false; @@ -352825,16 +354914,16 @@ static bool ParseEscape(StringPiece* s, Rune* rp, case '6': case '7': // Single non-zero octal digit is a backreference; not supported. - if (s->size() == 0 || (*s)[0] < '0' || (*s)[0] > '7') + if (s->empty() || (*s)[0] < '0' || (*s)[0] > '7') goto BadEscape; FALLTHROUGH_INTENDED; case '0': // consume up to three octal digits; already have one. code = c - '0'; - if (s->size() > 0 && '0' <= (c = (*s)[0]) && c <= '7') { + if (!s->empty() && '0' <= (c = (*s)[0]) && c <= '7') { code = code * 8 + c - '0'; s->remove_prefix(1); // digit - if (s->size() > 0) { + if (!s->empty()) { c = (*s)[0]; if ('0' <= c && c <= '7') { code = code * 8 + c - '0'; @@ -352849,7 +354938,7 @@ static bool ParseEscape(StringPiece* s, Rune* rp, // Hexadecimal escapes case 'x': - if (s->size() == 0) + if (s->empty()) goto BadEscape; if (StringPieceToRune(&c, s, status) < 0) return false; @@ -352869,7 +354958,7 @@ static bool ParseEscape(StringPiece* s, Rune* rp, code = code * 16 + UnHex(c); if (code > rune_max) goto BadEscape; - if (s->size() == 0) + if (s->empty()) goto BadEscape; if (StringPieceToRune(&c, s, status) < 0) return false; @@ -352880,7 +354969,7 @@ static bool ParseEscape(StringPiece* s, Rune* rp, return true; } // Easy case: two hex digits. - if (s->size() == 0) + if (s->empty()) goto BadEscape; if (StringPieceToRune(&c1, s, status) < 0) return false; @@ -352924,13 +355013,11 @@ static bool ParseEscape(StringPiece* s, Rune* rp, // return true; } - LOG(DFATAL) << "Not reached in ParseEscape."; - BadEscape: // Unrecognized escape sequence. status->set_code(kRegexpBadEscape); status->set_error_arg( - StringPiece(begin, static_cast(s->begin() - begin))); + StringPiece(begin, static_cast(s->data() - begin))); return false; } @@ -353050,7 +355137,7 @@ const UGroup* MaybeParsePerlCCEscape(StringPiece* s, Regexp::ParseFlags parse_fl return NULL; // Could use StringPieceToRune, but there aren't // any non-ASCII Perl group names. - StringPiece name(s->begin(), 2); + StringPiece name(s->data(), 2); const UGroup *g = LookupPerlGroup(name); if (g == NULL) return NULL; @@ -353090,8 +355177,8 @@ ParseStatus ParseUnicodeGroup(StringPiece* s, Regexp::ParseFlags parse_flags, return kParseError; if (c != '{') { // Name is the bit of string we just skipped over for c. - const char* p = seq.begin() + 2; - name = StringPiece(p, static_cast(s->begin() - p)); + const char* p = seq.data() + 2; + name = StringPiece(p, static_cast(s->data() - p)); } else { // Name is in braces. Look for closing } size_t end = s->find('}', 0); @@ -353102,16 +355189,16 @@ ParseStatus ParseUnicodeGroup(StringPiece* s, Regexp::ParseFlags parse_flags, status->set_error_arg(seq); return kParseError; } - name = StringPiece(s->begin(), end); // without '}' + name = StringPiece(s->data(), end); // without '}' s->remove_prefix(end + 1); // with '}' if (!IsValidUTF8(name, status)) return kParseError; } // Chop seq where s now begins. - seq = StringPiece(seq.begin(), static_cast(s->begin() - seq.begin())); + seq = StringPiece(seq.data(), static_cast(s->data() - seq.data())); - if (name.size() > 0 && name[0] == '^') { + if (!name.empty() && name[0] == '^') { sign = -sign; name.remove_prefix(1); // '^' } @@ -353141,14 +355228,13 @@ ParseStatus ParseUnicodeGroup(StringPiece* s, Regexp::ParseFlags parse_flags, // Convert the UnicodeSet to a URange32 and UGroup that we can add. int nr = uset.getRangeCount(); - URange32* r = new URange32[nr]; + PODArray r(nr); for (int i = 0; i < nr; i++) { r[i].lo = uset.getRangeStart(i); r[i].hi = uset.getRangeEnd(i); } - UGroup g = {"", +1, 0, 0, r, nr}; + UGroup g = {"", +1, 0, 0, r.data(), nr}; AddUGroup(cc, &g, sign, parse_flags); - delete[] r; #endif return kParseOk; @@ -353198,7 +355284,7 @@ static ParseStatus ParseCCName(StringPiece* s, Regexp::ParseFlags parse_flags, bool Regexp::ParseState::ParseCCCharacter(StringPiece* s, Rune *rp, const StringPiece& whole_class, RegexpStatus* status) { - if (s->size() == 0) { + if (s->empty()) { status->set_code(kRegexpMissingBracket); status->set_error_arg(whole_class); return false; @@ -353206,7 +355292,7 @@ bool Regexp::ParseState::ParseCCCharacter(StringPiece* s, Rune *rp, // Allow regular escape sequences even though // many need not be escaped in this context. - if (s->size() >= 1 && (*s)[0] == '\\') + if ((*s)[0] == '\\') return ParseEscape(s, rp, status, rune_max_); // Otherwise take the next rune. @@ -353248,7 +355334,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, Regexp** out_re, RegexpStatus* status) { StringPiece whole_class = *s; - if (s->size() == 0 || (*s)[0] != '[') { + if (s->empty() || (*s)[0] != '[') { // Caller checked this. status->set_code(kRegexpInternalError); status->set_error_arg(StringPiece()); @@ -353256,19 +355342,19 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, } bool negated = false; Regexp* re = new Regexp(kRegexpCharClass, flags_ & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; + re->arguments.char_class.ccb_ = new CharClassBuilder; s->remove_prefix(1); // '[' - if (s->size() > 0 && (*s)[0] == '^') { + if (!s->empty() && (*s)[0] == '^') { s->remove_prefix(1); // '^' negated = true; if (!(flags_ & ClassNL) || (flags_ & NeverNL)) { // If NL can't match implicitly, then pretend // negated classes include a leading \n. - re->char_class_.ccb_->AddRange('\n', '\n'); + re->arguments.char_class.ccb_->AddRange('\n', '\n'); } } bool first = true; // ] is okay as first char in class - while (s->size() > 0 && ((*s)[0] != ']' || first)) { + while (!s->empty() && ((*s)[0] != ']' || first)) { // - is only okay unescaped as first or last in class. // Except that Perl allows - anywhere. if ((*s)[0] == '-' && !first && !(flags_&PerlX) && @@ -353290,7 +355376,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, // Look for [:alnum:] etc. if (s->size() > 2 && (*s)[0] == '[' && (*s)[1] == ':') { - switch (ParseCCName(s, flags_, re->char_class_.ccb_, status)) { + switch (ParseCCName(s, flags_, re->arguments.char_class.ccb_, status)) { case kParseOk: continue; case kParseError: @@ -353305,7 +355391,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, if (s->size() > 2 && (*s)[0] == '\\' && ((*s)[1] == 'p' || (*s)[1] == 'P')) { - switch (ParseUnicodeGroup(s, flags_, re->char_class_.ccb_, status)) { + switch (ParseUnicodeGroup(s, flags_, re->arguments.char_class.ccb_, status)) { case kParseOk: continue; case kParseError: @@ -353319,7 +355405,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, // Look for Perl character class symbols (extension). const UGroup *g = MaybeParsePerlCCEscape(s, flags_); if (g != NULL) { - AddUGroup(re->char_class_.ccb_, g, g->sign, flags_); + AddUGroup(re->arguments.char_class.ccb_, g, g->sign, flags_); continue; } @@ -353334,9 +355420,9 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, // Regexp::ClassNL is set. In an explicit range or singleton // like we just parsed, we do not filter \n out, so set ClassNL // in the flags. - re->char_class_.ccb_->AddRangeFlags(rr.lo, rr.hi, flags_ | Regexp::ClassNL); + re->arguments.char_class.ccb_->AddRangeFlags(rr.lo, rr.hi, flags_ | Regexp::ClassNL); } - if (s->size() == 0) { + if (s->empty()) { status->set_code(kRegexpMissingBracket); status->set_error_arg(whole_class); re->Decref(); @@ -353345,25 +355431,40 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, s->remove_prefix(1); // ']' if (negated) - re->char_class_.ccb_->Negate(); + re->arguments.char_class.ccb_->Negate(); *out_re = re; return true; } -// Is this a valid capture name? [A-Za-z0-9_]+ -// PCRE limits names to 32 bytes. -// Python rejects names starting with digits. -// We don't enforce either of those. +// Returns whether name is a valid capture name. static bool IsValidCaptureName(const StringPiece& name) { - if (name.size() == 0) + if (name.empty()) return false; - for (size_t i = 0; i < name.size(); i++) { - int c = name[i]; - if (('0' <= c && c <= '9') || - ('a' <= c && c <= 'z') || - ('A' <= c && c <= 'Z') || - c == '_') + + // Historically, we effectively used [0-9A-Za-z_]+ to validate; that + // followed Python 2 except for not restricting the first character. + // As of Python 3, Unicode characters beyond ASCII are also allowed; + // accordingly, we permit the Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd and + // Pc categories, but again without restricting the first character. + // Also, Unicode normalization (e.g. NFKC) isn't performed: Python 3 + // performs it for identifiers, but seemingly not for capture names; + // if they start doing that for capture names, we won't follow suit. + static const CharClass* const cc = []() { + CharClassBuilder ccb; + for (StringPiece group : + {"Lu", "Ll", "Lt", "Lm", "Lo", "Nl", "Mn", "Mc", "Nd", "Pc"}) + AddUGroup(&ccb, LookupGroup(group, unicode_groups, num_unicode_groups), + +1, Regexp::NoParseFlags); + return ccb.GetCharClass(); + }(); + + StringPiece t = name; + Rune r; + while (!t.empty()) { + if (StringPieceToRune(&r, &t, NULL) < 0) + return false; + if (cc->Contains(r)) continue; return false; } @@ -353380,8 +355481,8 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { // Caller is supposed to check this. if (!(flags_ & PerlX) || t.size() < 2 || t[0] != '(' || t[1] != '?') { - LOG(DFATAL) << "Bad call to ParseState::ParsePerlFlags"; status_->set_code(kRegexpInternalError); + LOG(DFATAL) << "Bad call to ParseState::ParsePerlFlags"; return false; } @@ -353414,8 +355515,8 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { } // t is "P...", t[end] == '>' - StringPiece capture(t.begin()-2, end+3); // "(?P" - StringPiece name(t.begin()+2, end-2); // "name" + StringPiece capture(t.data()-2, end+3); // "(?P" + StringPiece name(t.data()+2, end-2); // "name" if (!IsValidUTF8(name, status_)) return false; if (!IsValidCaptureName(name)) { @@ -353429,7 +355530,8 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { return false; } - s->remove_prefix(static_cast(capture.end() - s->begin())); + s->remove_prefix( + static_cast(capture.data() + capture.size() - s->data())); return true; } @@ -353438,7 +355540,7 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { int nflags = flags_; Rune c; for (bool done = false; !done; ) { - if (t.size() == 0) + if (t.empty()) goto BadPerlOp; if (StringPieceToRune(&c, &t, status_) < 0) return false; @@ -353513,7 +355615,7 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { BadPerlOp: status_->set_code(kRegexpBadPerlOp); status_->set_error_arg( - StringPiece(s->begin(), static_cast(t.begin() - s->begin()))); + StringPiece(s->data(), static_cast(t.data() - s->data()))); return false; } @@ -353556,7 +355658,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, if (global_flags & Literal) { // Special parse loop for literal string. - while (t.size() > 0) { + while (!t.empty()) { Rune r; if (StringPieceToRune(&r, &t, status) < 0) return NULL; @@ -353567,7 +355669,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, } StringPiece lastunary = StringPiece(); - while (t.size() > 0) { + while (!t.empty()) { StringPiece isunary = StringPiece(); switch (t[0]) { default: { @@ -353610,7 +355712,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, break; case '^': // Beginning of line. - if (!ps.PushCarat()) + if (!ps.PushCaret()) return NULL; t.remove_prefix(1); // '^' break; @@ -353651,18 +355753,18 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, bool nongreedy = false; t.remove_prefix(1); // '*' or '+' or '?' if (ps.flags() & PerlX) { - if (t.size() > 0 && t[0] == '?') { + if (!t.empty() && t[0] == '?') { nongreedy = true; t.remove_prefix(1); // '?' } - if (lastunary.size() > 0) { + if (!lastunary.empty()) { // In Perl it is not allowed to stack repetition operators: // a** is a syntax error, not a double-star. // (and a++ means something else entirely, which we don't support!) status->set_code(kRegexpRepeatOp); status->set_error_arg(StringPiece( - lastunary.begin(), - static_cast(t.begin() - lastunary.begin()))); + lastunary.data(), + static_cast(t.data() - lastunary.data()))); return NULL; } } @@ -353686,16 +355788,16 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, } bool nongreedy = false; if (ps.flags() & PerlX) { - if (t.size() > 0 && t[0] == '?') { + if (!t.empty() && t[0] == '?') { nongreedy = true; t.remove_prefix(1); // '?' } - if (lastunary.size() > 0) { + if (!lastunary.empty()) { // Not allowed to stack repetition operators. status->set_code(kRegexpRepeatOp); status->set_error_arg(StringPiece( - lastunary.begin(), - static_cast(t.begin() - lastunary.begin()))); + lastunary.data(), + static_cast(t.data() - lastunary.data()))); return NULL; } } @@ -353744,7 +355846,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, if (t[1] == 'Q') { // \Q ... \E: the ... is always literals t.remove_prefix(2); // '\\', 'Q' - while (t.size() > 0) { + while (!t.empty()) { if (t.size() >= 2 && t[0] == '\\' && t[1] == 'E') { t.remove_prefix(2); // '\\', 'E' break; @@ -353761,8 +355863,8 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, if (t.size() >= 2 && (t[1] == 'p' || t[1] == 'P')) { Regexp* re = new Regexp(kRegexpCharClass, ps.flags() & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; - switch (ParseUnicodeGroup(&t, ps.flags(), re->char_class_.ccb_, status)) { + re->arguments.char_class.ccb_ = new CharClassBuilder; + switch (ParseUnicodeGroup(&t, ps.flags(), re->arguments.char_class.ccb_, status)) { case kParseOk: if (!ps.PushRegexp(re)) return NULL; @@ -353779,8 +355881,8 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, const UGroup *g = MaybeParsePerlCCEscape(&t, ps.flags()); if (g != NULL) { Regexp* re = new Regexp(kRegexpCharClass, ps.flags() & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; - AddUGroup(re->char_class_.ccb_, g, g->sign, ps.flags()); + re->arguments.char_class.ccb_ = new CharClassBuilder; + AddUGroup(re->arguments.char_class.ccb_, g, g->sign, ps.flags()); if (!ps.PushRegexp(re)) return NULL; break; @@ -353800,7 +355902,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, return ps.DoFinish(); } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -353832,12 +355934,12 @@ static const URange16 code3[] = { /* \w */ { 0x61, 0x7a }, }; const UGroup perl_groups[] = { - { "\\d", +1, code1, 1 , nullptr, 0}, - { "\\D", -1, code1, 1 , nullptr, 0}, - { "\\s", +1, code2, 3 , nullptr, 0}, - { "\\S", -1, code2, 3 , nullptr, 0}, - { "\\w", +1, code3, 4 , nullptr, 0}, - { "\\W", -1, code3, 4 , nullptr, 0}, + { "\\d", +1, code1, 1, 0, 0 }, + { "\\D", -1, code1, 1, 0, 0 }, + { "\\s", +1, code2, 3, 0, 0 }, + { "\\S", -1, code2, 3, 0, 0 }, + { "\\w", +1, code3, 4, 0, 0 }, + { "\\W", -1, code3, 4, 0, 0 }, }; const int num_perl_groups = 6; static const URange16 code4[] = { /* [:alnum:] */ @@ -353897,38 +355999,38 @@ static const URange16 code17[] = { /* [:xdigit:] */ { 0x61, 0x66 }, }; const UGroup posix_groups[] = { - { "[:alnum:]", +1, code4, 3 , nullptr, 0}, - { "[:^alnum:]", -1, code4, 3 , nullptr, 0}, - { "[:alpha:]", +1, code5, 2 , nullptr, 0}, - { "[:^alpha:]", -1, code5, 2 , nullptr, 0}, - { "[:ascii:]", +1, code6, 1 , nullptr, 0}, - { "[:^ascii:]", -1, code6, 1 , nullptr, 0}, - { "[:blank:]", +1, code7, 2 , nullptr, 0}, - { "[:^blank:]", -1, code7, 2 , nullptr, 0}, - { "[:cntrl:]", +1, code8, 2 , nullptr, 0}, - { "[:^cntrl:]", -1, code8, 2 , nullptr, 0}, - { "[:digit:]", +1, code9, 1 , nullptr, 0}, - { "[:^digit:]", -1, code9, 1 , nullptr, 0}, - { "[:graph:]", +1, code10, 1 , nullptr, 0}, - { "[:^graph:]", -1, code10, 1 , nullptr, 0}, - { "[:lower:]", +1, code11, 1 , nullptr, 0}, - { "[:^lower:]", -1, code11, 1 , nullptr, 0}, - { "[:print:]", +1, code12, 1 , nullptr, 0}, - { "[:^print:]", -1, code12, 1 , nullptr, 0}, - { "[:punct:]", +1, code13, 4 , nullptr, 0}, - { "[:^punct:]", -1, code13, 4 , nullptr, 0}, - { "[:space:]", +1, code14, 2 , nullptr, 0}, - { "[:^space:]", -1, code14, 2 , nullptr, 0}, - { "[:upper:]", +1, code15, 1 , nullptr, 0}, - { "[:^upper:]", -1, code15, 1, nullptr, 0}, - { "[:word:]", +1, code16, 4 , nullptr, 0}, - { "[:^word:]", -1, code16, 4 , nullptr, 0}, - { "[:xdigit:]", +1, code17, 3 , nullptr, 0}, - { "[:^xdigit:]", -1, code17, 3 , nullptr, 0}, + { "[:alnum:]", +1, code4, 3, 0, 0 }, + { "[:^alnum:]", -1, code4, 3, 0, 0 }, + { "[:alpha:]", +1, code5, 2, 0, 0 }, + { "[:^alpha:]", -1, code5, 2, 0, 0 }, + { "[:ascii:]", +1, code6, 1, 0, 0 }, + { "[:^ascii:]", -1, code6, 1, 0, 0 }, + { "[:blank:]", +1, code7, 2, 0, 0 }, + { "[:^blank:]", -1, code7, 2, 0, 0 }, + { "[:cntrl:]", +1, code8, 2, 0, 0 }, + { "[:^cntrl:]", -1, code8, 2, 0, 0 }, + { "[:digit:]", +1, code9, 1, 0, 0 }, + { "[:^digit:]", -1, code9, 1, 0, 0 }, + { "[:graph:]", +1, code10, 1, 0, 0 }, + { "[:^graph:]", -1, code10, 1, 0, 0 }, + { "[:lower:]", +1, code11, 1, 0, 0 }, + { "[:^lower:]", -1, code11, 1, 0, 0 }, + { "[:print:]", +1, code12, 1, 0, 0 }, + { "[:^print:]", -1, code12, 1, 0, 0 }, + { "[:punct:]", +1, code13, 4, 0, 0 }, + { "[:^punct:]", -1, code13, 4, 0, 0 }, + { "[:space:]", +1, code14, 2, 0, 0 }, + { "[:^space:]", -1, code14, 2, 0, 0 }, + { "[:upper:]", +1, code15, 1, 0, 0 }, + { "[:^upper:]", -1, code15, 1, 0, 0 }, + { "[:word:]", +1, code16, 4, 0, 0 }, + { "[:^word:]", -1, code16, 4, 0, 0 }, + { "[:xdigit:]", +1, code17, 3, 0, 0 }, + { "[:^xdigit:]", -1, code17, 3, 0, 0 }, }; const int num_posix_groups = 28; -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -353947,6 +356049,7 @@ const int num_posix_groups = 28; #include #include #include +#include #include @@ -353959,9 +356062,6 @@ const int num_posix_groups = 28; namespace duckdb_re2 { -typedef std::set::iterator SSIter; -typedef std::set::const_iterator ConstSSIter; - // Initializes a Prefilter, allocating subs_ as necessary. Prefilter::Prefilter(Op op) { op_ = op; @@ -354078,35 +356178,41 @@ Prefilter* Prefilter::Or(Prefilter* a, Prefilter* b) { return AndOr(OR, a, b); } -static void SimplifyStringSet(std::set *ss) { +void Prefilter::SimplifyStringSet(SSet* ss) { // Now make sure that the strings aren't redundant. For example, if // we know "ab" is a required string, then it doesn't help at all to // know that "abc" is also a required string, so delete "abc". This // is because, when we are performing a string search to filter - // regexps, matching ab will already allow this regexp to be a - // candidate for match, so further matching abc is redundant. - - for (SSIter i = ss->begin(); i != ss->end(); ++i) { + // regexps, matching "ab" will already allow this regexp to be a + // candidate for match, so further matching "abc" is redundant. + // Note that we must ignore "" because find() would find it at the + // start of everything and thus we would end up erasing everything. + // + // The SSet sorts strings by length, then lexicographically. Note that + // smaller strings appear first and all strings must be unique. These + // observations let us skip string comparisons when possible. + SSIter i = ss->begin(); + if (i != ss->end() && i->empty()) { + ++i; + } + for (; i != ss->end(); ++i) { SSIter j = i; ++j; while (j != ss->end()) { - // Increment j early so that we can erase the element it points to. - SSIter old_j = j; + if (j->size() > i->size() && j->find(*i) != std::string::npos) { + j = ss->erase(j); + continue; + } ++j; - if (old_j->find(*i) != std::string::npos) - ss->erase(old_j); } } } -Prefilter* Prefilter::OrStrings(std::set* ss) { +Prefilter* Prefilter::OrStrings(SSet* ss) { + Prefilter* or_prefilter = new Prefilter(NONE); SimplifyStringSet(ss); - Prefilter* or_prefilter = NULL; - if (!ss->empty()) { - or_prefilter = new Prefilter(NONE); - for (SSIter i = ss->begin(); i != ss->end(); ++i) - or_prefilter = Or(or_prefilter, FromString(*i)); - } + for (SSIter i = ss->begin(); i != ss->end(); ++i) + or_prefilter = Or(or_prefilter, FromString(*i)); return or_prefilter; } @@ -354164,14 +356270,14 @@ class Prefilter::Info { // Caller takes ownership of the Prefilter. Prefilter* TakeMatch(); - std::set& exact() { return exact_; } + SSet& exact() { return exact_; } bool is_exact() const { return is_exact_; } class Walker; private: - std::set exact_; + SSet exact_; // When is_exact_ is true, the strings that match // are placed in exact_. When it is no longer an exact @@ -354224,18 +356330,7 @@ std::string Prefilter::Info::ToString() { return ""; } -// Add the strings from src to dst. -static void CopyIn(const std::set& src, - std::set* dst) { - for (ConstSSIter i = src.begin(); i != src.end(); ++i) - dst->insert(*i); -} - -// Add the cross-product of a and b to dst. -// (For each string i in a and j in b, add i+j.) -static void CrossProduct(const std::set& a, - const std::set& b, - std::set* dst) { +void Prefilter::CrossProduct(const SSet& a, const SSet& b, SSet* dst) { for (ConstSSIter i = a.begin(); i != a.end(); ++i) for (ConstSSIter j = b.begin(); j != b.end(); ++j) dst->insert(*i + *j); @@ -354281,8 +356376,14 @@ Prefilter::Info* Prefilter::Info::Alt(Info* a, Info* b) { Info *ab = new Info(); if (a->is_exact_ && b->is_exact_) { - CopyIn(a->exact_, &ab->exact_); - CopyIn(b->exact_, &ab->exact_); + // Avoid string copies by moving the larger exact_ set into + // ab directly, then merge in the smaller set. + if (a->exact_.size() < b->exact_.size()) { + using std::swap; + swap(a, b); + } + ab->exact_ = std::move(a->exact_); + ab->exact_.insert(b->exact_.begin(), b->exact_.end()); ab->is_exact_ = true; } else { // Either a or b has is_exact_ = false. If the other @@ -354389,6 +356490,7 @@ Prefilter::Info* Prefilter::Info::EmptyString() { typedef CharClass::iterator CCIter; Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, bool latin1) { + // If the class is too large, it's okay to overestimate. if (cc->size() > 10) return AnyCharOrAnyByte(); @@ -354405,7 +356507,6 @@ Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, a->is_exact_ = true; - return a; } @@ -354458,8 +356559,8 @@ Prefilter::Info* Prefilter::Info::Walker::PostVisit( switch (re->op()) { default: case kRegexpRepeat: - LOG(DFATAL) << "Bad regexp op " << re->op(); info = EmptyString(); + LOG(DFATAL) << "Bad regexp op " << re->op(); break; case kRegexpNoMatch: @@ -354570,14 +356671,15 @@ Prefilter* Prefilter::FromRegexp(Regexp* re) { return NULL; Regexp* simple = re->Simplify(); - Prefilter::Info *info = BuildInfo(simple); + if (simple == NULL) + return NULL; + Prefilter::Info* info = BuildInfo(simple); simple->Decref(); if (info == NULL) return NULL; Prefilter* m = info->TakeMatch(); - delete info; return m; } @@ -354629,7 +356731,7 @@ Prefilter* Prefilter::FromRE2(const RE2* re2) { } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -354647,9 +356749,9 @@ Prefilter* Prefilter::FromRE2(const RE2* re2) { #include #include +#include #include #include -#include #include #include #include @@ -354675,9 +356777,6 @@ PrefilterTree::PrefilterTree(int min_atom_len) PrefilterTree::~PrefilterTree() { for (size_t i = 0; i < prefilter_vec_.size(); i++) delete prefilter_vec_[i]; - - for (size_t i = 0; i < entries_.size(); i++) - delete entries_[i].parents; } void PrefilterTree::Add(Prefilter* prefilter) { @@ -354706,44 +356805,13 @@ void PrefilterTree::Compile(std::vector* atom_vec) { compiled_ = true; - // TODO(junyer): Use std::unordered_set instead? NodeMap nodes; AssignUniqueIds(&nodes, atom_vec); - - // Identify nodes that are too common among prefilters and are - // triggering too many parents. Then get rid of them if possible. - // Note that getting rid of a prefilter node simply means they are - // no longer necessary for their parent to trigger; that is, we do - // not miss out on any regexps triggering by getting rid of a - // prefilter node. - for (size_t i = 0; i < entries_.size(); i++) { - StdIntMap* parents = entries_[i].parents; - if (parents->size() > 8) { - // This one triggers too many things. If all the parents are AND - // nodes and have other things guarding them, then get rid of - // this trigger. TODO(vsri): Adjust the threshold appropriately, - // make it a function of total number of nodes? - bool have_other_guard = true; - for (StdIntMap::iterator it = parents->begin(); - it != parents->end(); ++it) { - have_other_guard = have_other_guard && - (entries_[it->first].propagate_up_at_count > 1); - } - - if (have_other_guard) { - for (StdIntMap::iterator it = parents->begin(); - it != parents->end(); ++it) - entries_[it->first].propagate_up_at_count -= 1; - - parents->clear(); // Forget the parents - } - } - } } Prefilter* PrefilterTree::CanonicalNode(NodeMap* nodes, Prefilter* node) { std::string node_string = NodeString(node); - std::map::iterator iter = nodes->find(node_string); + NodeMap::iterator iter = nodes->find(node_string); if (iter == nodes->end()) return NULL; return (*iter).second; @@ -354853,65 +356921,42 @@ void PrefilterTree::AssignUniqueIds(NodeMap* nodes, node->set_unique_id(canonical->unique_id()); } } - entries_.resize(nodes->size()); - - // Create parent StdIntMap for the entries. - for (int i = static_cast(v.size()) - 1; i >= 0; i--) { - Prefilter* prefilter = v[i]; - if (prefilter == NULL) - continue; - - if (CanonicalNode(nodes, prefilter) != prefilter) - continue; - - Entry* entry = &entries_[prefilter->unique_id()]; - entry->parents = new StdIntMap(); - } + entries_.resize(unique_id); // Fill the entries. for (int i = static_cast(v.size()) - 1; i >= 0; i--) { Prefilter* prefilter = v[i]; if (prefilter == NULL) continue; - if (CanonicalNode(nodes, prefilter) != prefilter) continue; - - Entry* entry = &entries_[prefilter->unique_id()]; - + int id = prefilter->unique_id(); switch (prefilter->op()) { default: - case Prefilter::ALL: LOG(DFATAL) << "Unexpected op: " << prefilter->op(); return; case Prefilter::ATOM: - entry->propagate_up_at_count = 1; + entries_[id].propagate_up_at_count = 1; break; case Prefilter::OR: case Prefilter::AND: { - std::set uniq_child; + // For each child, we append our id to the child's list of + // parent ids... unless we happen to have done so already. + // The number of appends is the number of unique children, + // which allows correct upward propagation from AND nodes. + int up_count = 0; for (size_t j = 0; j < prefilter->subs()->size(); j++) { - Prefilter* child = (*prefilter->subs())[j]; - Prefilter* canonical = CanonicalNode(nodes, child); - if (canonical == NULL) { - LOG(DFATAL) << "Null canonical node"; - return; - } - int child_id = canonical->unique_id(); - uniq_child.insert(child_id); - // To the child, we want to add to parent indices. - Entry* child_entry = &entries_[child_id]; - if (child_entry->parents->find(prefilter->unique_id()) == - child_entry->parents->end()) { - (*child_entry->parents)[prefilter->unique_id()] = 1; + int child_id = (*prefilter->subs())[j]->unique_id(); + std::vector& parents = entries_[child_id].parents; + if (parents.empty() || parents.back() != id) { + parents.push_back(id); + up_count++; } } - entry->propagate_up_at_count = prefilter->op() == Prefilter::AND - ? static_cast(uniq_child.size()) - : 1; - + entries_[id].propagate_up_at_count = + prefilter->op() == Prefilter::AND ? up_count : 1; break; } } @@ -354926,6 +356971,52 @@ void PrefilterTree::AssignUniqueIds(NodeMap* nodes, Entry* entry = &entries_[id]; entry->regexps.push_back(static_cast(i)); } + + // Lastly, using probability-based heuristics, we identify nodes + // that trigger too many parents and then we try to prune edges. + // We use logarithms below to avoid the likelihood of underflow. + double log_num_regexps = std::log(prefilter_vec_.size() - unfiltered_.size()); + // Hoisted this above the loop so that we don't thrash the heap. + std::vector> entries_by_num_edges; + for (int i = static_cast(v.size()) - 1; i >= 0; i--) { + Prefilter* prefilter = v[i]; + // Pruning applies only to AND nodes because it "just" reduces + // precision; applied to OR nodes, it would break correctness. + if (prefilter == NULL || prefilter->op() != Prefilter::AND) + continue; + if (CanonicalNode(nodes, prefilter) != prefilter) + continue; + int id = prefilter->unique_id(); + + // Sort the current node's children by the numbers of parents. + entries_by_num_edges.clear(); + for (size_t j = 0; j < prefilter->subs()->size(); j++) { + int child_id = (*prefilter->subs())[j]->unique_id(); + const std::vector& parents = entries_[child_id].parents; + entries_by_num_edges.emplace_back(parents.size(), child_id); + } + std::stable_sort(entries_by_num_edges.begin(), entries_by_num_edges.end()); + + // A running estimate of how many regexps will be triggered by + // pruning the remaining children's edges to the current node. + // Our nominal target is one, so the threshold is log(1) == 0; + // pruning occurs iff the child has more than nine edges left. + double log_num_triggered = log_num_regexps; + for (const auto& pair : entries_by_num_edges) { + int child_id = pair.second; + std::vector& parents = entries_[child_id].parents; + if (log_num_triggered > 0.) { + log_num_triggered += std::log(parents.size()); + log_num_triggered -= log_num_regexps; + } else if (parents.size() > 9) { + auto it = std::find(parents.begin(), parents.end(), id); + if (it != parents.end()) { + parents.erase(it); + entries_[id].propagate_up_at_count--; + } + } + } + } } // Functions for triggering during search. @@ -354972,10 +357063,7 @@ void PrefilterTree::PropagateMatch(const std::vector& atom_ids, regexps->set(entry.regexps[i], 1); int c; // Pass trigger up to parents. - for (StdIntMap::iterator it = entry.parents->begin(); - it != entry.parents->end(); - ++it) { - int j = it->first; + for (int j : entry.parents) { const Entry& parent = entries_[j]; // Delay until all the children have succeeded. if (parent.propagate_up_at_count > 1) { @@ -355005,15 +357093,15 @@ void PrefilterTree::PrintDebugInfo(NodeMap* nodes) { LOG(ERROR) << "#Unique Nodes: " << entries_.size(); for (size_t i = 0; i < entries_.size(); i++) { - StdIntMap* parents = entries_[i].parents; + const std::vector& parents = entries_[i].parents; const std::vector& regexps = entries_[i].regexps; LOG(ERROR) << "EntryId: " << i - << " N: " << parents->size() << " R: " << regexps.size(); - for (StdIntMap::iterator it = parents->begin(); it != parents->end(); ++it) - LOG(ERROR) << it->first; + << " N: " << parents.size() << " R: " << regexps.size(); + for (int parent : parents) + LOG(ERROR) << parent; } LOG(ERROR) << "Map:"; - for (std::map::const_iterator iter = nodes->begin(); + for (NodeMap::const_iterator iter = nodes->begin(); iter != nodes->end(); ++iter) LOG(ERROR) << "NodeId: " << (*iter).second->unique_id() << " Str: " << (*iter).first; @@ -355040,7 +357128,7 @@ std::string PrefilterTree::DebugNodeString(Prefilter* node) const { return node_string; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -355059,142 +357147,21 @@ std::string PrefilterTree::DebugNodeString(Prefilter* node) const { -#include -#include -#include -#include -#include - - - - - - -// LICENSE_CHANGE_BEGIN -// The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #2 -// See the end of this file for a list - -// Copyright 2016 The RE2 Authors. All Rights Reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#ifndef RE2_BITMAP256_H_ -#define RE2_BITMAP256_H_ - +#if defined(__AVX2__) +#include #ifdef _MSC_VER #include #endif +#endif #include #include +#include +#include +#include -namespace duckdb_re2 { - -class Bitmap256 { - public: - Bitmap256() { - Clear(); - } - - // Clears all of the bits. - void Clear() { - memset(words_, 0, sizeof words_); - } - - // Tests the bit with index c. - bool Test(int c) const { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); - - return (words_[c / 64] & (1ULL << (c % 64))) != 0; - } - - // Sets the bit with index c. - void Set(int c) { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); - - words_[c / 64] |= (1ULL << (c % 64)); - } - - // Finds the next non-zero bit with index >= c. - // Returns -1 if no such bit exists. - int FindNextSetBit(int c) const; - - private: - // Finds the least significant non-zero bit in n. - static int FindLSBSet(uint64_t n) { - DCHECK_NE(n, 0); - -#if defined(__GNUC__) - return __builtin_ctzll(n); -#elif defined(_MSC_VER) && defined(_M_X64) - unsigned long c; - _BitScanForward64(&c, n); - return static_cast(c); -#elif defined(_MSC_VER) && defined(_M_IX86) - unsigned long c; - if (static_cast(n) != 0) { - _BitScanForward(&c, static_cast(n)); - return static_cast(c); - } else { - _BitScanForward(&c, static_cast(n >> 32)); - return static_cast(c) + 32; - } -#else - int c = 63; - for (int shift = 1 << 5; shift != 0; shift >>= 1) { - uint64_t word = n << shift; - if (word != 0) { - n = word; - c -= shift; - } - } - return c; -#endif - } - - uint64_t words_[4]; -}; - -int Bitmap256::FindNextSetBit(int c) const { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); - - // Check the word that contains the bit. Mask out any lower bits. - int i = c / 64; - uint64_t word = words_[i] & (~0ULL << (c % 64)); - if (word != 0) - return (i * 64) + FindLSBSet(word); - - // Check any following words. - i++; - switch (i) { - case 1: - if (words_[1] != 0) - return (1 * 64) + FindLSBSet(words_[1]); - FALLTHROUGH_INTENDED; - case 2: - if (words_[2] != 0) - return (2 * 64) + FindLSBSet(words_[2]); - FALLTHROUGH_INTENDED; - case 3: - if (words_[3] != 0) - return (3 * 64) + FindLSBSet(words_[3]); - FALLTHROUGH_INTENDED; - default: - return -1; - } -} - -} // namespace duckdb_re2 - -#endif // RE2_BITMAP256_H_ - - -// LICENSE_CHANGE_END @@ -355211,9 +357178,9 @@ void Prog::Inst::InitAlt(uint32_t out, uint32_t out1) { void Prog::Inst::InitByteRange(int lo, int hi, int foldcase, uint32_t out) { DCHECK_EQ(out_opcode_, 0); set_out_opcode(out, kInstByteRange); - inst_byte_range_data_.lo_ = lo & 0xFF; - inst_byte_range_data_.hi_ = hi & 0xFF; - inst_byte_range_data_.hint_foldcase_ = foldcase&1; + lo_ = lo & 0xFF; + hi_ = hi & 0xFF; + hint_foldcase_ = foldcase&1; } void Prog::Inst::InitCapture(int cap, uint32_t out) { @@ -355258,7 +357225,7 @@ std::string Prog::Inst::Dump() { case kInstByteRange: return StringPrintf("byte%s [%02x-%02x] %d -> %d", foldcase() ? "/i" : "", - inst_byte_range_data_.lo_, inst_byte_range_data_.hi_, hint(), out()); + lo_, hi_, hint(), out()); case kInstCapture: return StringPrintf("capture %d -> %d", cap_, out()); @@ -355288,9 +357255,10 @@ Prog::Prog() start_unanchored_(0), size_(0), bytemap_range_(0), - first_byte_(-1), - flags_(0), + prefix_foldcase_(false), + prefix_size_(0), list_count_(0), + bit_state_text_max_size_(0), dfa_mem_(0), dfa_first_(NULL), dfa_longest_(NULL) { @@ -355299,6 +357267,8 @@ Prog::Prog() Prog::~Prog() { DeleteDFA(dfa_longest_); DeleteDFA(dfa_first_); + if (prefix_foldcase_) + delete[] prefix_dfa_; } typedef SparseSet Workq; @@ -355313,7 +357283,7 @@ static std::string ProgToString(Prog* prog, Workq* q) { for (Workq::iterator i = q->begin(); i != q->end(); ++i) { int id = *i; Prog::Inst* ip = prog->inst(id); - StringAppendF(&s, "%d. %s\n", id, ip->Dump().c_str()); + s += StringPrintf("%d. %s\n", id, ip->Dump().c_str()); AddToQueue(q, ip->out()); if (ip->opcode() == kInstAlt || ip->opcode() == kInstAltMatch) AddToQueue(q, ip->out1()); @@ -355326,9 +357296,9 @@ static std::string FlattenedProgToString(Prog* prog, int start) { for (int id = start; id < prog->size(); id++) { Prog::Inst* ip = prog->inst(id); if (ip->last()) - StringAppendF(&s, "%d. %s\n", id, ip->Dump().c_str()); + s += StringPrintf("%d. %s\n", id, ip->Dump().c_str()); else - StringAppendF(&s, "%d+ %s\n", id, ip->Dump().c_str()); + s += StringPrintf("%d+ %s\n", id, ip->Dump().c_str()); } return s; } @@ -355359,19 +357329,36 @@ std::string Prog::DumpByteMap() { while (c < 256-1 && bytemap_[c+1] == b) c++; int hi = c; - StringAppendF(&map, "[%02x-%02x] -> %d\n", lo, hi, b); + map += StringPrintf("[%02x-%02x] -> %d\n", lo, hi, b); } return map; } -int Prog::first_byte() { - std::call_once(first_byte_once_, [](Prog* prog) { - prog->first_byte_ = prog->ComputeFirstByte(); - }, this); - return first_byte_; -} +// Is ip a guaranteed match at end of text, perhaps after some capturing? +static bool IsMatch(Prog* prog, Prog::Inst* ip) { + for (;;) { + switch (ip->opcode()) { + default: + LOG(DFATAL) << "Unexpected opcode in IsMatch: " << ip->opcode(); + return false; -static bool IsMatch(Prog*, Prog::Inst*); + case kInstAlt: + case kInstAltMatch: + case kInstByteRange: + case kInstFail: + case kInstEmptyWidth: + return false; + + case kInstCapture: + case kInstNop: + ip = prog->inst(ip->out()); + break; + + case kInstMatch: + return true; + } + } +} // Peep-hole optimizer. void Prog::Optimize() { @@ -355437,54 +357424,28 @@ void Prog::Optimize() { } } -// Is ip a guaranteed match at end of text, perhaps after some capturing? -static bool IsMatch(Prog* prog, Prog::Inst* ip) { - for (;;) { - switch (ip->opcode()) { - default: - LOG(DFATAL) << "Unexpected opcode in IsMatch: " << ip->opcode(); - return false; - - case kInstAlt: - case kInstAltMatch: - case kInstByteRange: - case kInstFail: - case kInstEmptyWidth: - return false; - - case kInstCapture: - case kInstNop: - ip = prog->inst(ip->out()); - break; - - case kInstMatch: - return true; - } - } -} - uint32_t Prog::EmptyFlags(const StringPiece& text, const char* p) { int flags = 0; // ^ and \A - if (p == text.begin()) + if (p == text.data()) flags |= kEmptyBeginText | kEmptyBeginLine; else if (p[-1] == '\n') flags |= kEmptyBeginLine; // $ and \z - if (p == text.end()) + if (p == text.data() + text.size()) flags |= kEmptyEndText | kEmptyEndLine; - else if (p < text.end() && p[0] == '\n') + else if (p < text.data() + text.size() && p[0] == '\n') flags |= kEmptyEndLine; // \b and \B - if (p == text.begin() && p == text.end()) { + if (p == text.data() && p == text.data() + text.size()) { // no word boundary here - } else if (p == text.begin()) { + } else if (p == text.data()) { if (IsWordChar(p[0])) flags |= kEmptyWordBoundary; - } else if (p == text.end()) { + } else if (p == text.data() + text.size()) { if (IsWordChar(p[-1])) flags |= kEmptyWordBoundary; } else { @@ -355689,13 +357650,13 @@ void Prog::ComputeByteMap() { } builder.Build(bytemap_, &bytemap_range_); -} -int TotalInstructions(int inst_count_[]) { - int total = 0; - for (int i = 0; i < kNumInst; i++) - total += inst_count_[i]; - return total; + if ((0)) { // For debugging, use trivial bytemap. + LOG(ERROR) << "Using trivial bytemap."; + for (int i = 0; i < 256; i++) + bytemap_[i] = static_cast(i); + bytemap_range_ = 256; + } } // Prog::Flatten() implements a graph rewriting algorithm. @@ -355790,7 +357751,13 @@ void Prog::Flatten() { inst_count_[ip->opcode()]++; } - DCHECK_EQ(TotalInstructions(inst_count_), static_cast(flat.size())); +#if !defined(NDEBUG) + // Address a `-Wunused-but-set-variable' warning from Clang 13.x. + size_t total = 0; + for (int i = 0; i < kNumInst; i++) + total += inst_count_[i]; + CHECK_EQ(total, flat.size()); +#endif // Remap start_unanchored and start. if (start_unanchored() == 0) { @@ -355817,6 +357784,11 @@ void Prog::Flatten() { for (int i = 0; i < list_count_; ++i) list_heads_[flatmap[i]] = i; } + + // BitState allocates a bitmap of size list_count_ * (text.size()+1) + // for tracking pairs of possibilities that it has already explored. + const size_t kBitStateBitmapMaxSize = 256*1024; // max size in bits + bit_state_text_max_size_ = kBitStateBitmapMaxSize / list_count_ - 1; } void Prog::MarkSuccessors(SparseArray* rootmap, @@ -356089,12 +358061,258 @@ void Prog::ComputeHints(std::vector* flat, int begin, int end) { if (first != end) { uint16_t hint = static_cast(std::min(first - id, 32767)); - ip->inst_byte_range_data_.hint_foldcase_ |= hint<<1; + ip->hint_foldcase_ |= hint<<1; + } + } +} + +// The final state will always be this, which frees up a register for the hot +// loop and thus avoids the spilling that can occur when building with Clang. +static const size_t kShiftDFAFinal = 9; + +// This function takes the prefix as std::string (i.e. not const std::string& +// as normal) because it's going to clobber it, so a temporary is convenient. +static uint64_t* BuildShiftDFA(std::string prefix) { + // This constant is for convenience now and also for correctness later when + // we clobber the prefix, but still need to know how long it was initially. + const size_t size = prefix.size(); + + // Construct the NFA. + // The table is indexed by input byte; each element is a bitfield of states + // reachable by the input byte. Given a bitfield of the current states, the + // bitfield of states reachable from those is - for this specific purpose - + // always ((ncurr << 1) | 1). Intersecting the reachability bitfields gives + // the bitfield of the next states reached by stepping over the input byte. + // Credits for this technique: the Hyperscan paper by Geoff Langdale et al. + uint16_t nfa[256]{}; + for (size_t i = 0; i < size; ++i) { + uint8_t b = prefix[i]; + nfa[b] |= 1 << (i+1); + } + // This is the `\C*?` for unanchored search. + for (int b = 0; b < 256; ++b) + nfa[b] |= 1; + + // This maps from DFA state to NFA states; the reverse mapping is used when + // recording transitions and gets implemented with plain old linear search. + // The "Shift DFA" technique limits this to ten states when using uint64_t; + // to allow for the initial state, we use at most nine bytes of the prefix. + // That same limit is also why uint16_t is sufficient for the NFA bitfield. + uint16_t states[kShiftDFAFinal+1]{}; + states[0] = 1; + for (size_t dcurr = 0; dcurr < size; ++dcurr) { + uint8_t b = prefix[dcurr]; + uint16_t ncurr = states[dcurr]; + uint16_t nnext = nfa[b] & ((ncurr << 1) | 1); + size_t dnext = dcurr+1; + if (dnext == size) + dnext = kShiftDFAFinal; + states[dnext] = nnext; + } + + // Sort and unique the bytes of the prefix to avoid repeating work while we + // record transitions. This clobbers the prefix, but it's no longer needed. + std::sort(prefix.begin(), prefix.end()); + prefix.erase(std::unique(prefix.begin(), prefix.end()), prefix.end()); + + // Construct the DFA. + // The table is indexed by input byte; each element is effectively a packed + // array of uint6_t; each array value will be multiplied by six in order to + // avoid having to do so later in the hot loop as well as masking/shifting. + // Credits for this technique: "Shift-based DFAs" on GitHub by Per Vognsen. + uint64_t* dfa = new uint64_t[256]{}; + // Record a transition from each state for each of the bytes of the prefix. + // Note that all other input bytes go back to the initial state by default. + for (size_t dcurr = 0; dcurr < size; ++dcurr) { + for (uint8_t b : prefix) { + uint16_t ncurr = states[dcurr]; + uint16_t nnext = nfa[b] & ((ncurr << 1) | 1); + size_t dnext = 0; + while (states[dnext] != nnext) + ++dnext; + dfa[b] |= static_cast(dnext * 6) << (dcurr * 6); + // Convert ASCII letters to uppercase and record the extra transitions. + // Note that ASCII letters are guaranteed to be lowercase at this point + // because that's how the parser normalises them. #FunFact: 'k' and 's' + // match U+212A and U+017F, respectively, so they won't occur here when + // using UTF-8 encoding because the parser will emit character classes. + if ('a' <= b && b <= 'z') { + b -= 'a' - 'A'; + dfa[b] |= static_cast(dnext * 6) << (dcurr * 6); + } + } + } + // This lets the final state "saturate", which will matter for performance: + // in the hot loop, we check for a match only at the end of each iteration, + // so we must keep signalling the match until we get around to checking it. + for (int b = 0; b < 256; ++b) + dfa[b] |= static_cast(kShiftDFAFinal * 6) << (kShiftDFAFinal * 6); + + return dfa; +} + +void Prog::ConfigurePrefixAccel(const std::string& prefix, + bool prefix_foldcase) { + prefix_foldcase_ = prefix_foldcase; + prefix_size_ = prefix.size(); + if (prefix_foldcase_) { + // Use PrefixAccel_ShiftDFA(). + // ... and no more than nine bytes of the prefix. (See above for details.) + prefix_size_ = std::min(prefix_size_, kShiftDFAFinal); + prefix_dfa_ = BuildShiftDFA(prefix.substr(0, prefix_size_)); + } else if (prefix_size_ != 1) { + // Use PrefixAccel_FrontAndBack(). + prefix_front_ = prefix.front(); + prefix_back_ = prefix.back(); + } else { + // Use memchr(3). + prefix_front_ = prefix.front(); + } +} + +const void* Prog::PrefixAccel_ShiftDFA(const void* data, size_t size) { + if (size < prefix_size_) + return NULL; + + uint64_t curr = 0; + + // At the time of writing, rough benchmarks on a Broadwell machine showed + // that this unroll factor (i.e. eight) achieves a speedup factor of two. + if (size >= 8) { + const uint8_t* p = reinterpret_cast(data); + const uint8_t* endp = p + (size&~7); + do { + uint8_t b0 = p[0]; + uint8_t b1 = p[1]; + uint8_t b2 = p[2]; + uint8_t b3 = p[3]; + uint8_t b4 = p[4]; + uint8_t b5 = p[5]; + uint8_t b6 = p[6]; + uint8_t b7 = p[7]; + + uint64_t next0 = prefix_dfa_[b0]; + uint64_t next1 = prefix_dfa_[b1]; + uint64_t next2 = prefix_dfa_[b2]; + uint64_t next3 = prefix_dfa_[b3]; + uint64_t next4 = prefix_dfa_[b4]; + uint64_t next5 = prefix_dfa_[b5]; + uint64_t next6 = prefix_dfa_[b6]; + uint64_t next7 = prefix_dfa_[b7]; + + uint64_t curr0 = next0 >> (curr & 63); + uint64_t curr1 = next1 >> (curr0 & 63); + uint64_t curr2 = next2 >> (curr1 & 63); + uint64_t curr3 = next3 >> (curr2 & 63); + uint64_t curr4 = next4 >> (curr3 & 63); + uint64_t curr5 = next5 >> (curr4 & 63); + uint64_t curr6 = next6 >> (curr5 & 63); + uint64_t curr7 = next7 >> (curr6 & 63); + + if ((curr7 & 63) == kShiftDFAFinal * 6) { + // At the time of writing, using the same masking subexpressions from + // the preceding lines caused Clang to clutter the hot loop computing + // them - even though they aren't actually needed for shifting! Hence + // these rewritten conditions, which achieve a speedup factor of two. + if (((curr7-curr0) & 63) == 0) return p+1-prefix_size_; + if (((curr7-curr1) & 63) == 0) return p+2-prefix_size_; + if (((curr7-curr2) & 63) == 0) return p+3-prefix_size_; + if (((curr7-curr3) & 63) == 0) return p+4-prefix_size_; + if (((curr7-curr4) & 63) == 0) return p+5-prefix_size_; + if (((curr7-curr5) & 63) == 0) return p+6-prefix_size_; + if (((curr7-curr6) & 63) == 0) return p+7-prefix_size_; + if (((curr7-curr7) & 63) == 0) return p+8-prefix_size_; + } + + curr = curr7; + p += 8; + } while (p != endp); + data = p; + size = size&7; + } + + const uint8_t* p = reinterpret_cast(data); + const uint8_t* endp = p + size; + while (p != endp) { + uint8_t b = *p++; + uint64_t next = prefix_dfa_[b]; + curr = next >> (curr & 63); + if ((curr & 63) == kShiftDFAFinal * 6) + return p-prefix_size_; + } + return NULL; +} + +#if defined(__AVX2__) +// Finds the least significant non-zero bit in n. +static int FindLSBSet(uint32_t n) { + DCHECK_NE(n, 0); +#if defined(__GNUC__) + return __builtin_ctz(n); +#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + unsigned long c; + _BitScanForward(&c, n); + return static_cast(c); +#else + int c = 31; + for (int shift = 1 << 4; shift != 0; shift >>= 1) { + uint32_t word = n << shift; + if (word != 0) { + n = word; + c -= shift; } } + return c; +#endif } +#endif -} // namespace duckdb_re2 +const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) { + DCHECK_GE(prefix_size_, 2); + if (size < prefix_size_) + return NULL; + // Don't bother searching the last prefix_size_-1 bytes for prefix_front_. + // This also means that probing for prefix_back_ doesn't go out of bounds. + size -= prefix_size_-1; + +#if defined(__AVX2__) + // Use AVX2 to look for prefix_front_ and prefix_back_ 32 bytes at a time. + if (size >= sizeof(__m256i)) { + const __m256i* fp = reinterpret_cast( + reinterpret_cast(data)); + const __m256i* bp = reinterpret_cast( + reinterpret_cast(data) + prefix_size_-1); + const __m256i* endfp = fp + size/sizeof(__m256i); + const __m256i f_set1 = _mm256_set1_epi8(prefix_front_); + const __m256i b_set1 = _mm256_set1_epi8(prefix_back_); + do { + const __m256i f_loadu = _mm256_loadu_si256(fp++); + const __m256i b_loadu = _mm256_loadu_si256(bp++); + const __m256i f_cmpeq = _mm256_cmpeq_epi8(f_set1, f_loadu); + const __m256i b_cmpeq = _mm256_cmpeq_epi8(b_set1, b_loadu); + const int fb_testz = _mm256_testz_si256(f_cmpeq, b_cmpeq); + if (fb_testz == 0) { // ZF: 1 means zero, 0 means non-zero. + const __m256i fb_and = _mm256_and_si256(f_cmpeq, b_cmpeq); + const int fb_movemask = _mm256_movemask_epi8(fb_and); + const int fb_ctz = FindLSBSet(fb_movemask); + return reinterpret_cast(fp-1) + fb_ctz; + } + } while (fp != endfp); + data = fp; + size = size%sizeof(__m256i); + } +#endif + + const char* p0 = reinterpret_cast(data); + for (const char* p = p0;; p++) { + DCHECK_GE(size, static_cast(p-p0)); + p = reinterpret_cast(memchr(p, prefix_front_, size - (p-p0))); + if (p == NULL || p[prefix_size_-1] == prefix_back_) + return p; + } +} + +} // namespace re2 // LICENSE_CHANGE_END @@ -356118,10 +358336,14 @@ void Prog::ComputeHints(std::vector* flat, int begin, int end) { #include #include #include +#ifdef _MSC_VER +#include +#endif #include #include #include #include +#include #include #include #include @@ -356138,6 +358360,13 @@ void Prog::ComputeHints(std::vector* flat, int begin, int end) { namespace duckdb_re2 { +// Controls the maximum count permitted by GlobalReplace(); -1 is unlimited. +static int maximum_global_replace_count = -1; + +void RE2::FUZZING_ONLY_set_maximum_global_replace_count(int i) { + maximum_global_replace_count = i; +} + // Maximum number of args we can set static const int kMaxArgs = 16; static const int kVecSize = 1+kMaxArgs; @@ -356145,11 +358374,11 @@ static const int kVecSize = 1+kMaxArgs; const int RE2::Options::kDefaultMaxMem; // initialized in re2.h RE2::Options::Options(RE2::CannedOptions opt) - : encoding_(opt == RE2::Latin1 ? EncodingLatin1 : EncodingUTF8), + : max_mem_(kDefaultMaxMem), + encoding_(opt == RE2::Latin1 ? EncodingLatin1 : EncodingUTF8), posix_syntax_(opt == RE2::POSIX), longest_match_(opt == RE2::POSIX), log_errors_(opt != RE2::Quiet), - max_mem_(kDefaultMaxMem), literal_(false), never_nl_(false), dot_nl_(false), @@ -356160,11 +358389,30 @@ RE2::Options::Options(RE2::CannedOptions opt) one_line_(false) { } -// static empty objects for use as const references. -// To avoid global constructors, allocated in RE2::Init(). -static const std::string* empty_string; -static const std::map* empty_named_groups; -static const std::map* empty_group_names; +// Empty objects for use as const references. +// Statically allocating the storage and then +// lazily constructing the objects (in a once +// in RE2::Init()) avoids global constructors +// and the false positives (thanks, Valgrind) +// about memory leaks at program termination. +struct EmptyStorage { + std::string empty_string; + std::map empty_named_groups; + std::map empty_group_names; +}; +alignas(EmptyStorage) static char empty_storage[sizeof(EmptyStorage)]; + +static inline std::string* empty_string() { + return &reinterpret_cast(empty_storage)->empty_string; +} + +static inline std::map* empty_named_groups() { + return &reinterpret_cast(empty_storage)->empty_named_groups; +} + +static inline std::map* empty_group_names() { + return &reinterpret_cast(empty_storage)->empty_group_names; +} // Converts from Regexp error code to RE2 error code. // Maybe some day they will diverge. In any event, this @@ -356185,6 +358433,8 @@ static RE2::ErrorCode RegexpErrorToRE2(duckdb_re2::RegexpStatusCode code) { return RE2::ErrorMissingBracket; case duckdb_re2::kRegexpMissingParen: return RE2::ErrorMissingParen; + case duckdb_re2::kRegexpUnexpectedParen: + return RE2::ErrorUnexpectedParen; case duckdb_re2::kRegexpTrailingBackslash: return RE2::ErrorTrailingBackslash; case duckdb_re2::kRegexpRepeatArgument: @@ -356273,44 +358523,53 @@ int RE2::Options::ParseFlags() const { void RE2::Init(const StringPiece& pattern, const Options& options) { static std::once_flag empty_once; std::call_once(empty_once, []() { - empty_string = new std::string; - empty_named_groups = new std::map; - empty_group_names = new std::map; + (void) new (empty_storage) EmptyStorage; }); - pattern_ = std::string(pattern); + pattern_ = new std::string(pattern); options_.Copy(options); entire_regexp_ = NULL; suffix_regexp_ = NULL; - prog_ = NULL; + error_ = empty_string(); + error_arg_ = empty_string(); + num_captures_ = -1; - rprog_ = NULL; - error_ = empty_string; error_code_ = NoError; + longest_match_ = options_.longest_match(); + is_one_pass_ = false; + prefix_foldcase_ = false; + prefix_.clear(); + prog_ = NULL; + + rprog_ = NULL; named_groups_ = NULL; group_names_ = NULL; RegexpStatus status; entire_regexp_ = Regexp::Parse( - pattern_, + *pattern_, static_cast(options_.ParseFlags()), &status); if (entire_regexp_ == NULL) { if (options_.log_errors()) { - LOG(ERROR) << "Error parsing '" << trunc(pattern_) << "': " + LOG(ERROR) << "Error parsing '" << trunc(*pattern_) << "': " << status.Text(); } error_ = new std::string(status.Text()); error_code_ = RegexpErrorToRE2(status.code()); - error_arg_ = std::string(status.error_arg()); + error_arg_ = new std::string(status.error_arg()); return; } + bool foldcase; duckdb_re2::Regexp* suffix; - if (entire_regexp_->RequiredPrefix(&prefix_, &prefix_foldcase_, &suffix)) + if (entire_regexp_->RequiredPrefix(&prefix_, &foldcase, &suffix)) { + prefix_foldcase_ = foldcase; suffix_regexp_ = suffix; - else + } + else { suffix_regexp_ = entire_regexp_->Incref(); + } // Two thirds of the memory goes to the forward Prog, // one third to the reverse prog, because the forward @@ -356318,7 +358577,7 @@ void RE2::Init(const StringPiece& pattern, const Options& options) { prog_ = suffix_regexp_->CompileToProg(options_.max_mem()*2/3); if (prog_ == NULL) { if (options_.log_errors()) - LOG(ERROR) << "Error compiling '" << trunc(pattern_) << "'"; + LOG(ERROR) << "Error compiling '" << trunc(*pattern_) << "'"; error_ = new std::string("pattern too large - compile failed"); error_code_ = RE2::ErrorPatternTooLarge; return; @@ -356344,28 +358603,34 @@ duckdb_re2::Prog* RE2::ReverseProg() const { re->suffix_regexp_->CompileToReverseProg(re->options_.max_mem() / 3); if (re->rprog_ == NULL) { if (re->options_.log_errors()) - LOG(ERROR) << "Error reverse compiling '" << trunc(re->pattern_) << "'"; - re->error_ = - new std::string("pattern too large - reverse compile failed"); - re->error_code_ = RE2::ErrorPatternTooLarge; + LOG(ERROR) << "Error reverse compiling '" << trunc(*re->pattern_) + << "'"; + // We no longer touch error_ and error_code_ because failing to compile + // the reverse Prog is not a showstopper: falling back to NFA execution + // is fine. More importantly, an RE2 object is supposed to be logically + // immutable: whatever ok() would have returned after Init() completed, + // it should continue to return that no matter what ReverseProg() does. } }, this); return rprog_; } RE2::~RE2() { + if (group_names_ != empty_group_names()) + delete group_names_; + if (named_groups_ != empty_named_groups()) + delete named_groups_; + delete rprog_; + delete prog_; + if (error_arg_ != empty_string()) + delete error_arg_; + if (error_ != empty_string()) + delete error_; if (suffix_regexp_) suffix_regexp_->Decref(); if (entire_regexp_) entire_regexp_->Decref(); - delete prog_; - delete rprog_; - if (error_ != empty_string) - delete error_; - if (named_groups_ != NULL && named_groups_ != empty_named_groups) - delete named_groups_; - if (group_names_ != NULL && group_names_ != empty_group_names) - delete group_names_; + delete pattern_; } int RE2::ProgramSize() const { @@ -356383,28 +358648,54 @@ int RE2::ReverseProgramSize() const { return prog->size(); } -static int Fanout(Prog* prog, std::map* histogram) { +// Finds the most significant non-zero bit in n. +static int FindMSBSet(uint32_t n) { + DCHECK_NE(n, 0); +#if defined(__GNUC__) + return 31 ^ __builtin_clz(n); +#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + unsigned long c; + _BitScanReverse(&c, n); + return static_cast(c); +#else + int c = 0; + for (int shift = 1 << 4; shift != 0; shift >>= 1) { + uint32_t word = n >> shift; + if (word != 0) { + n = word; + c += shift; + } + } + return c; +#endif +} + +static int Fanout(Prog* prog, std::vector* histogram) { SparseArray fanout(prog->size()); prog->Fanout(&fanout); - histogram->clear(); + int data[32] = {}; + int size = 0; for (SparseArray::iterator i = fanout.begin(); i != fanout.end(); ++i) { - // TODO(junyer): Optimise this? - int bucket = 0; - while (1 << bucket < i->value()) { - bucket++; - } - (*histogram)[bucket]++; + if (i->value() == 0) + continue; + uint32_t value = i->value(); + int bucket = FindMSBSet(value); + bucket += value & (value-1) ? 1 : 0; + ++data[bucket]; + size = std::max(size, bucket+1); } - return histogram->rbegin()->first; + if (histogram != NULL) + histogram->assign(data, data+size); + return size-1; } -int RE2::ProgramFanout(std::map* histogram) const { +int RE2::ProgramFanout(std::vector* histogram) const { if (prog_ == NULL) return -1; return Fanout(prog_, histogram); } -int RE2::ReverseProgramFanout(std::map* histogram) const { +int RE2::ReverseProgramFanout(std::vector* histogram) const { if (prog_ == NULL) return -1; Prog* prog = ReverseProg(); @@ -356419,7 +358710,7 @@ const std::map& RE2::NamedCapturingGroups() const { if (re->suffix_regexp_ != NULL) re->named_groups_ = re->suffix_regexp_->NamedCaptures(); if (re->named_groups_ == NULL) - re->named_groups_ = empty_named_groups; + re->named_groups_ = empty_named_groups(); }, this); return *named_groups_; } @@ -356430,7 +358721,7 @@ const std::map& RE2::CapturingGroupNames() const { if (re->suffix_regexp_ != NULL) re->group_names_ = re->suffix_regexp_->CaptureNames(); if (re->group_names_ == NULL) - re->group_names_ = empty_group_names; + re->group_names_ = empty_group_names(); }, this); return *group_names_; } @@ -356474,7 +358765,9 @@ bool RE2::Replace(std::string* str, const StringPiece& rewrite) { StringPiece vec[kVecSize]; int nvec = 1 + MaxSubmatch(rewrite); - if (nvec > arraysize(vec)) + if (nvec > 1 + re.NumberOfCapturingGroups()) + return false; + if (nvec > static_cast(arraysize(vec))) return false; if (!re.Match(*str, 0, str->size(), UNANCHORED, vec, nvec)) return false; @@ -356483,8 +358776,8 @@ bool RE2::Replace(std::string* str, if (!re.Rewrite(&s, rewrite, vec, nvec)) return false; - assert(vec[0].begin() >= str->data()); - assert(vec[0].end() <= str->data()+str->size()); + assert(vec[0].data() >= str->data()); + assert(vec[0].data() + vec[0].size() <= str->data() + str->size()); str->replace(vec[0].data() - str->data(), vec[0].size(), s); return true; } @@ -356494,7 +358787,9 @@ int RE2::GlobalReplace(std::string* str, const StringPiece& rewrite) { StringPiece vec[kVecSize]; int nvec = 1 + MaxSubmatch(rewrite); - if (nvec > arraysize(vec)) + if (nvec > 1 + re.NumberOfCapturingGroups()) + return false; + if (nvec > static_cast(arraysize(vec))) return false; const char* p = str->data(); @@ -356502,19 +358797,16 @@ int RE2::GlobalReplace(std::string* str, const char* lastend = NULL; std::string out; int count = 0; -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - // Iterate just once when fuzzing. Otherwise, we easily get bogged down - // and coverage is unlikely to improve despite significant expense. - while (p == str->data()) { -#else while (p <= ep) { -#endif + if (maximum_global_replace_count != -1 && + count >= maximum_global_replace_count) + break; if (!re.Match(*str, static_cast(p - str->data()), str->size(), UNANCHORED, vec, nvec)) break; - if (p < vec[0].begin()) - out.append(p, vec[0].begin() - p); - if (vec[0].begin() == lastend && vec[0].size() == 0) { + if (p < vec[0].data()) + out.append(p, vec[0].data() - p); + if (vec[0].data() == lastend && vec[0].empty()) { // Disallow empty match at end of last match: skip ahead. // // fullrune() takes int, not ptrdiff_t. However, it just looks @@ -356545,7 +358837,7 @@ int RE2::GlobalReplace(std::string* str, continue; } re.Rewrite(&out, rewrite, vec, nvec); - p = vec[0].end(); + p = vec[0].data() + vec[0].size(); lastend = p; count++; } @@ -356566,9 +358858,10 @@ bool RE2::Extract(const StringPiece& text, std::string* out) { StringPiece vec[kVecSize]; int nvec = 1 + MaxSubmatch(rewrite); - if (nvec > arraysize(vec)) + if (nvec > 1 + re.NumberOfCapturingGroups()) + return false; + if (nvec > static_cast(arraysize(vec))) return false; - if (!re.Match(text, 0, text.size(), UNANCHORED, vec, nvec)) return false; @@ -356672,15 +358965,6 @@ static int ascii_strcasecmp(const char* a, const char* b, size_t len) { return 0; } -RE2::Anchor RE2::Anchored() const { - if (prog_->anchor_start()) { - if (prog_->anchor_end()) { - return Anchor::ANCHOR_BOTH; - } - return Anchor::ANCHOR_START; - } - return Anchor::UNANCHORED; -} /***** Actual matching and rewriting code *****/ @@ -356725,6 +359009,8 @@ bool RE2::Match(const StringPiece& text, // If the regexp is anchored explicitly, must not be in middle of text. if (prog_->anchor_start() && startpos != 0) return false; + if (prog_->anchor_end() && endpos != text.size()) + return false; // If the regexp is anchored explicitly, update re_anchor // so that we can potentially fall into a faster case below. @@ -356755,53 +359041,89 @@ bool RE2::Match(const StringPiece& text, } Prog::Anchor anchor = Prog::kUnanchored; - Prog::MatchKind kind = Prog::kFirstMatch; - if (options_.longest_match()) - kind = Prog::kLongestMatch; - bool skipped_test = false; - - bool can_one_pass = (is_one_pass_ && ncap <= Prog::kMaxOnePassCapture); + Prog::MatchKind kind = + longest_match_ ? Prog::kLongestMatch : Prog::kFirstMatch; - // BitState allocates a bitmap of size prog_->list_count() * text.size(). - // It also allocates a stack of 3-word structures which could potentially - // grow as large as prog_->list_count() * text.size(), but in practice is - // much smaller. - const int kMaxBitStateBitmapSize = 256*1024; // bitmap size <= max (bits) + bool can_one_pass = is_one_pass_ && ncap <= Prog::kMaxOnePassCapture; bool can_bit_state = prog_->CanBitState(); - size_t bit_state_text_max = kMaxBitStateBitmapSize / prog_->list_count(); + size_t bit_state_text_max_size = prog_->bit_state_text_max_size(); +#ifdef RE2_HAVE_THREAD_LOCAL + hooks::context = this; +#endif bool dfa_failed = false; + bool skipped_test = false; switch (re_anchor) { default: + LOG(DFATAL) << "Unexpected re_anchor value: " << re_anchor; + return false; + case UNANCHORED: { + if (prog_->anchor_end()) { + // This is a very special case: we don't need the forward DFA because + // we already know where the match must end! Instead, the reverse DFA + // can say whether there is a match and (optionally) where it starts. + Prog* prog = ReverseProg(); + if (prog == NULL) { + // Fall back to NFA below. + skipped_test = true; + break; + } + if (!prog->SearchDFA(subtext, text, Prog::kAnchored, + Prog::kLongestMatch, matchp, &dfa_failed, NULL)) { + if (dfa_failed) { + if (options_.log_errors()) + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog->size() << ", " + << "list count " << prog->list_count() << ", " + << "bytemap range " << prog->bytemap_range(); + // Fall back to NFA below. + skipped_test = true; + break; + } + return false; + } + if (matchp == NULL) // Matched. Don't care where. + return true; + break; + } + if (!prog_->SearchDFA(subtext, text, anchor, kind, matchp, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog_->size() << ", " - << "bytemap range " << prog_->bytemap_range() << ", " - << "list count " << prog_->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; } return false; } - if (matchp == NULL) // Matched. Don't care where + if (matchp == NULL) // Matched. Don't care where. return true; - // SearchDFA set match[0].end() but didn't know where the - // match started. Run the regexp backward from match[0].end() + // SearchDFA set match.end() but didn't know where the + // match started. Run the regexp backward from match.end() // to find the longest possible match -- that's where it started. Prog* prog = ReverseProg(); - if (prog == NULL) - return false; + if (prog == NULL) { + // Fall back to NFA below. + skipped_test = true; + break; + } if (!prog->SearchDFA(match, text, Prog::kAnchored, Prog::kLongestMatch, &match, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog->size() << ", " - << "bytemap range " << prog->bytemap_range() << ", " - << "list count " << prog->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog->size() << ", " + << "list count " << prog->list_count() << ", " + << "bytemap range " << prog->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -356827,11 +359149,12 @@ bool RE2::Match(const StringPiece& text, // it doesn't have the shared state and occasional mutex that // the DFA does. if (can_one_pass && text.size() <= 4096 && - (ncap > 1 || text.size() <= 8)) { + (ncap > 1 || text.size() <= 16)) { skipped_test = true; break; } - if (can_bit_state && text.size() <= bit_state_text_max && ncap > 1) { + if (can_bit_state && text.size() <= bit_state_text_max_size && + ncap > 1) { skipped_test = true; break; } @@ -356839,9 +359162,11 @@ bool RE2::Match(const StringPiece& text, &match, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog_->size() << ", " - << "bytemap range " << prog_->bytemap_range() << ", " - << "list count " << prog_->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -356876,7 +359201,7 @@ bool RE2::Match(const StringPiece& text, LOG(ERROR) << "SearchOnePass inconsistency"; return false; } - } else if (can_bit_state && subtext1.size() <= bit_state_text_max) { + } else if (can_bit_state && subtext1.size() <= bit_state_text_max_size) { if (!prog_->SearchBitState(subtext1, text, anchor, kind, submatch, ncap)) { if (!skipped_test && options_.log_errors()) @@ -356931,7 +359256,7 @@ bool RE2::DoMatch(const StringPiece& text, StringPiece stkvec[kVecSize]; StringPiece* heapvec = NULL; - if (nvec <= arraysize(stkvec)) { + if (nvec <= static_cast(arraysize(stkvec))) { vec = stkvec; } else { vec = new StringPiece[nvec]; @@ -356944,7 +359269,7 @@ bool RE2::DoMatch(const StringPiece& text, } if (consumed != NULL) - *consumed = static_cast(vec[0].end() - text.begin()); + *consumed = static_cast(EndPtr(vec[0]) - BeginPtr(text)); if (n == 0 || args == NULL) { // We are not interested in results @@ -356997,9 +359322,10 @@ bool RE2::CheckRewriteString(const StringPiece& rewrite, } if (max_token > NumberOfCapturingGroups()) { - SStringPrintf(error, "Rewrite schema requests %d matches, " - "but the regexp only has %d parenthesized subexpressions.", - max_token, NumberOfCapturingGroups()); + *error = StringPrintf( + "Rewrite schema requests %d matches, but the regexp only has %d " + "parenthesized subexpressions.", + max_token, NumberOfCapturingGroups()); return false; } return true; @@ -357042,13 +359368,13 @@ bool RE2::Rewrite(std::string* out, int n = (c - '0'); if (n >= veclen) { if (options_.log_errors()) { - LOG(ERROR) << "requested group " << n - << " in regexp " << rewrite.data(); + LOG(ERROR) << "invalid substitution \\" << n + << " from " << veclen << " groups"; } return false; } StringPiece snip = vec[n]; - if (snip.size() > 0) + if (!snip.empty()) out->append(snip.data(), snip.size()); } else if (c == '\\') { out->push_back('\\'); @@ -357063,41 +359389,49 @@ bool RE2::Rewrite(std::string* out, /***** Parsers for various types *****/ -bool RE2::Arg::parse_null(const char* str, size_t n, void* dest) { +namespace re2_internal { + +template <> +bool Parse(const char* str, size_t n, void* dest) { // We fail if somebody asked us to store into a non-NULL void* pointer return (dest == NULL); } -bool RE2::Arg::parse_string(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, std::string* dest) { if (dest == NULL) return true; - reinterpret_cast(dest)->assign(str, n); + dest->assign(str, n); return true; } -bool RE2::Arg::parse_stringpiece(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, StringPiece* dest) { if (dest == NULL) return true; - *(reinterpret_cast(dest)) = StringPiece(str, n); + *dest = StringPiece(str, n); return true; } -bool RE2::Arg::parse_char(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, char* dest) { if (n != 1) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = str[0]; + *dest = str[0]; return true; } -bool RE2::Arg::parse_schar(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, signed char* dest) { if (n != 1) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = str[0]; + *dest = str[0]; return true; } -bool RE2::Arg::parse_uchar(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, unsigned char* dest) { if (n != 1) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = str[0]; + *dest = str[0]; return true; } @@ -357161,10 +359495,40 @@ static const char* TerminateNumber(char* buf, size_t nbuf, const char* str, return buf; } -bool RE2::Arg::parse_long_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, float* dest) { + if (n == 0) return false; + static const int kMaxLength = 200; + char buf[kMaxLength+1]; + str = TerminateNumber(buf, sizeof buf, str, &n, true); + char* end; + errno = 0; + float r = strtof(str, &end); + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *dest = r; + return true; +} + +template <> +bool Parse(const char* str, size_t n, double* dest) { + if (n == 0) return false; + static const int kMaxLength = 200; + char buf[kMaxLength+1]; + str = TerminateNumber(buf, sizeof buf, str, &n, true); + char* end; + errno = 0; + double r = strtod(str, &end); + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *dest = r; + return true; +} + +template <> +bool Parse(const char* str, size_t n, long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -357174,14 +359538,12 @@ bool RE2::Arg::parse_long_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -bool RE2::Arg::parse_ulong_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -357197,62 +359559,52 @@ bool RE2::Arg::parse_ulong_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -bool RE2::Arg::parse_short_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, short* dest, int radix) { long r; - if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse - if ((short)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((short)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (short)r; + *dest = (short)r; return true; } -bool RE2::Arg::parse_ushort_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned short* dest, int radix) { unsigned long r; - if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse - if ((unsigned short)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((unsigned short)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (unsigned short)r; + *dest = (unsigned short)r; return true; } -bool RE2::Arg::parse_int_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, int* dest, int radix) { long r; - if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse - if ((int)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((int)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (int)r; + *dest = (int)r; return true; } -bool RE2::Arg::parse_uint_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned int* dest, int radix) { unsigned long r; - if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse - if ((unsigned int)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((unsigned int)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (unsigned int)r; + *dest = (unsigned int)r; return true; } -bool RE2::Arg::parse_longlong_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, long long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -357262,14 +359614,12 @@ bool RE2::Arg::parse_longlong_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -bool RE2::Arg::parse_ulonglong_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned long long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -357284,70 +359634,50 @@ bool RE2::Arg::parse_ulonglong_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -static bool parse_double_float(const char* str, size_t n, bool isfloat, - void* dest) { - if (n == 0) return false; - static const int kMaxLength = 200; - char buf[kMaxLength+1]; - str = TerminateNumber(buf, sizeof buf, str, &n, true); - char* end; - errno = 0; - double r; - if (isfloat) { - r = strtof(str, &end); - } else { - r = strtod(str, &end); - } - if (end != str + n) return false; // Leftover junk - if (errno) return false; - if (dest == NULL) return true; - if (isfloat) { - *(reinterpret_cast(dest)) = (float)r; - } else { - *(reinterpret_cast(dest)) = r; - } - return true; -} +} // namespace re2_internal -bool RE2::Arg::parse_double(const char* str, size_t n, void* dest) { - return parse_double_float(str, n, false, dest); -} +namespace hooks { -bool RE2::Arg::parse_float(const char* str, size_t n, void* dest) { - return parse_double_float(str, n, true, dest); -} +#ifdef RE2_HAVE_THREAD_LOCAL +thread_local const RE2* context = NULL; +#endif -#define DEFINE_INTEGER_PARSER(name) \ - bool RE2::Arg::parse_##name(const char* str, size_t n, void* dest) { \ - return parse_##name##_radix(str, n, dest, 10); \ - } \ - bool RE2::Arg::parse_##name##_hex(const char* str, size_t n, void* dest) { \ - return parse_##name##_radix(str, n, dest, 16); \ - } \ - bool RE2::Arg::parse_##name##_octal(const char* str, size_t n, void* dest) { \ - return parse_##name##_radix(str, n, dest, 8); \ - } \ - bool RE2::Arg::parse_##name##_cradix(const char* str, size_t n, \ - void* dest) { \ - return parse_##name##_radix(str, n, dest, 0); \ - } +template +union Hook { + void Store(T* cb) { cb_.store(cb, std::memory_order_release); } + T* Load() const { return cb_.load(std::memory_order_acquire); } + +#if !defined(__clang__) && defined(_MSC_VER) + // Citing https://github.com/protocolbuffers/protobuf/pull/4777 as precedent, + // this is a gross hack to make std::atomic constant-initialized on MSVC. + static_assert(ATOMIC_POINTER_LOCK_FREE == 2, + "std::atomic must be always lock-free"); + T* cb_for_constinit_; +#endif + + std::atomic cb_; +}; + +template +static void DoNothing(const T&) {} + +#define DEFINE_HOOK(type, name) \ + static Hook name##_hook = {{&DoNothing}}; \ + void Set##type##Hook(type##Callback* cb) { name##_hook.Store(cb); } \ + type##Callback* Get##type##Hook() { return name##_hook.Load(); } -DEFINE_INTEGER_PARSER(short) -DEFINE_INTEGER_PARSER(ushort) -DEFINE_INTEGER_PARSER(int) -DEFINE_INTEGER_PARSER(uint) -DEFINE_INTEGER_PARSER(long) -DEFINE_INTEGER_PARSER(ulong) -DEFINE_INTEGER_PARSER(longlong) -DEFINE_INTEGER_PARSER(ulonglong) +DEFINE_HOOK(DFAStateCacheReset, dfa_state_cache_reset) +DEFINE_HOOK(DFASearchFailure, dfa_search_failure) -#undef DEFINE_INTEGER_PARSER +#undef DEFINE_HOOK -} // namespace duckdb_re2 +} // namespace hooks + +} // namespace re2 // LICENSE_CHANGE_END @@ -357382,6 +359712,14 @@ DEFINE_INTEGER_PARSER(ulonglong) + +#ifdef min +#undef min +#endif +#ifdef max +#undef max +#endif + namespace duckdb_re2 { // Constructor. Allocates vectors as appropriate for operator. @@ -357393,7 +359731,7 @@ Regexp::Regexp(RegexpOp op, ParseFlags parse_flags) nsub_(0), down_(NULL) { subone_ = NULL; - memset(the_union_, 0, sizeof the_union_); + memset(arguments.the_union_, 0, sizeof arguments.the_union_); } // Destructor. Assumes already cleaned up children. @@ -357409,15 +359747,15 @@ Regexp::~Regexp() { default: break; case kRegexpCapture: - delete capture_.name_; + delete arguments.capture.name_; break; case kRegexpLiteralString: - delete[] literal_string_.runes_; + delete[] arguments.literal_string.runes_; break; case kRegexpCharClass: - if (char_class_.cc_) - char_class_.cc_->Delete(); - delete char_class_.ccb_; + if (arguments.char_class.cc_) + arguments.char_class.cc_->Delete(); + delete arguments.char_class.ccb_; break; } } @@ -357432,16 +359770,27 @@ bool Regexp::QuickDestroy() { return false; } -// Lazily allocated. -static Mutex* ref_mutex; -static std::map* ref_map; +// Similar to EmptyStorage in re2.cc. +struct RefStorage { + Mutex ref_mutex; + std::map ref_map; +}; +alignas(RefStorage) static char ref_storage[sizeof(RefStorage)]; + +static inline Mutex* ref_mutex() { + return &reinterpret_cast(ref_storage)->ref_mutex; +} + +static inline std::map* ref_map() { + return &reinterpret_cast(ref_storage)->ref_map; +} int Regexp::Ref() { if (ref_ < kMaxRef) return ref_; - MutexLock l(ref_mutex); - return (*ref_map)[this]; + MutexLock l(ref_mutex()); + return (*ref_map())[this]; } // Increments reference count, returns object as convenience. @@ -357449,18 +359798,17 @@ Regexp* Regexp::Incref() { if (ref_ >= kMaxRef-1) { static std::once_flag ref_once; std::call_once(ref_once, []() { - ref_mutex = new Mutex; - ref_map = new std::map; + (void) new (ref_storage) RefStorage; }); // Store ref count in overflow map. - MutexLock l(ref_mutex); + MutexLock l(ref_mutex()); if (ref_ == kMaxRef) { // already overflowed - (*ref_map)[this]++; + (*ref_map())[this]++; } else { // overflowing now - (*ref_map)[this] = kMaxRef; + (*ref_map())[this] = kMaxRef; ref_ = kMaxRef; } return this; @@ -357474,13 +359822,13 @@ Regexp* Regexp::Incref() { void Regexp::Decref() { if (ref_ == kMaxRef) { // Ref count is stored in overflow map. - MutexLock l(ref_mutex); - int r = (*ref_map)[this] - 1; + MutexLock l(ref_mutex()); + int r = (*ref_map())[this] - 1; if (r < kMaxRef) { ref_ = static_cast(r); - ref_map->erase(this); + ref_map()->erase(this); } else { - (*ref_map)[this] = r; + (*ref_map())[this] = r; } return; } @@ -357528,24 +359876,24 @@ void Regexp::Destroy() { void Regexp::AddRuneToString(Rune r) { DCHECK(op_ == kRegexpLiteralString); - if (literal_string_.nrunes_ == 0) { + if (arguments.literal_string.nrunes_ == 0) { // start with 8 - literal_string_.runes_ = new Rune[8]; - } else if (literal_string_.nrunes_ >= 8 && (literal_string_.nrunes_ & (literal_string_.nrunes_ - 1)) == 0) { + arguments.literal_string.runes_ = new Rune[8]; + } else if (arguments.literal_string.nrunes_ >= 8 && (arguments.literal_string.nrunes_ & (arguments.literal_string.nrunes_ - 1)) == 0) { // double on powers of two - Rune *old = literal_string_.runes_; - literal_string_.runes_ = new Rune[literal_string_.nrunes_ * 2]; - for (int i = 0; i < literal_string_.nrunes_; i++) - literal_string_.runes_[i] = old[i]; + Rune *old = arguments.literal_string.runes_; + arguments.literal_string.runes_ = new Rune[arguments.literal_string.nrunes_ * 2]; + for (int i = 0; i < arguments.literal_string.nrunes_; i++) + arguments.literal_string.runes_[i] = old[i]; delete[] old; } - literal_string_.runes_[literal_string_.nrunes_++] = r; + arguments.literal_string.runes_[arguments.literal_string.nrunes_++] = r; } Regexp* Regexp::HaveMatch(int match_id, ParseFlags flags) { Regexp* re = new Regexp(kRegexpHaveMatch, flags); - re->match_id_ = match_id; + re->arguments.match_id_ = match_id; return re; } @@ -357602,16 +359950,15 @@ Regexp* Regexp::ConcatOrAlternate(RegexpOp op, Regexp** sub, int nsub, return new Regexp(kRegexpEmptyMatch, flags); } - Regexp** subcopy = NULL; + PODArray subcopy; if (op == kRegexpAlternate && can_factor) { // Going to edit sub; make a copy so we don't step on caller. - subcopy = new Regexp*[nsub]; - memmove(subcopy, sub, nsub * sizeof sub[0]); - sub = subcopy; + subcopy = PODArray(nsub); + memmove(subcopy.data(), sub, nsub * sizeof sub[0]); + sub = subcopy.data(); nsub = FactorAlternation(sub, nsub, flags); if (nsub == 1) { Regexp* re = sub[0]; - delete[] subcopy; return re; } } @@ -357628,7 +359975,6 @@ Regexp* Regexp::ConcatOrAlternate(RegexpOp op, Regexp** sub, int nsub, subs[nbigsub - 1] = ConcatOrAlternate(op, sub+(nbigsub-1)*kMaxNsub, nsub - (nbigsub-1)*kMaxNsub, flags, false); - delete[] subcopy; return re; } @@ -357637,8 +359983,6 @@ Regexp* Regexp::ConcatOrAlternate(RegexpOp op, Regexp** sub, int nsub, Regexp** subs = re->sub(); for (int i = 0; i < nsub; i++) subs[i] = sub[i]; - - delete[] subcopy; return re; } @@ -357658,7 +360002,7 @@ Regexp* Regexp::Capture(Regexp* sub, ParseFlags flags, int cap) { Regexp* re = new Regexp(kRegexpCapture, flags); re->AllocSub(1); re->sub()[0] = sub; - re->capture_.cap_ = cap; + re->arguments.capture.cap_ = cap; return re; } @@ -357666,14 +360010,14 @@ Regexp* Regexp::Repeat(Regexp* sub, ParseFlags flags, int min, int max) { Regexp* re = new Regexp(kRegexpRepeat, flags); re->AllocSub(1); re->sub()[0] = sub; - re->repeat_.min_ = min; - re->repeat_.max_ = max; + re->arguments.repeat.min_ = min; + re->arguments.repeat.max_ = max; return re; } Regexp* Regexp::NewLiteral(Rune rune, ParseFlags flags) { Regexp* re = new Regexp(kRegexpLiteral, flags); - re->rune_ = rune; + re->arguments.rune_ = rune; return re; } @@ -357690,7 +360034,7 @@ Regexp* Regexp::LiteralString(Rune* runes, int nrunes, ParseFlags flags) { Regexp* Regexp::NewCharClass(CharClass* cc, ParseFlags flags) { Regexp* re = new Regexp(kRegexpCharClass, flags); - re->char_class_.cc_ = cc; + re->arguments.char_class.cc_ = cc; return re; } @@ -357860,6 +360204,7 @@ static const char *kErrorStrings[] = { "invalid character class range", "missing ]", "missing )", + "unexpected )", "trailing \\", "no argument for repetition operator", "invalid repetition size", @@ -357903,9 +360248,12 @@ class NumCapturesWalker : public Regexp::Walker { ncapture_++; return ignored; } + virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { - // Should never be called: we use Walk not WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "NumCapturesWalker::ShortVisit called"; +#endif return ignored; } @@ -357934,7 +360282,7 @@ class NamedCapturesWalker : public Regexp::Walker { return m; } - Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { + virtual Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { if (re->op() == kRegexpCapture && re->name() != NULL) { // Allocate map once we find a name. if (map_ == NULL) @@ -357943,15 +360291,16 @@ class NamedCapturesWalker : public Regexp::Walker { // Record first occurrence of each name. // (The rule is that if you have the same name // multiple times, only the leftmost one counts.) - if (map_->find(*re->name()) == map_->end()) - (*map_)[*re->name()] = re->cap(); + map_->insert({*re->name(), re->cap()}); } return ignored; } virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { - // Should never be called: we use Walk not WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "NamedCapturesWalker::ShortVisit called"; +#endif return ignored; } @@ -357980,7 +360329,7 @@ class CaptureNamesWalker : public Regexp::Walker { return m; } - Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { + virtual Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { if (re->op() == kRegexpCapture && re->name() != NULL) { // Allocate map once we find a name. if (map_ == NULL) @@ -357992,8 +360341,10 @@ class CaptureNamesWalker : public Regexp::Walker { } virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { - // Should never be called: we use Walk not WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "CaptureNamesWalker::ShortVisit called"; +#endif return ignored; } @@ -358010,78 +360361,89 @@ std::map* Regexp::CaptureNames() { return w.TakeMap(); } +void ConvertRunesToBytes(bool latin1, Rune* runes, int nrunes, + std::string* bytes) { + if (latin1) { + bytes->resize(nrunes); + for (int i = 0; i < nrunes; i++) + (*bytes)[i] = static_cast(runes[i]); + } else { + bytes->resize(nrunes * UTFmax); // worst case + char* p = &(*bytes)[0]; + for (int i = 0; i < nrunes; i++) + p += runetochar(p, &runes[i]); + bytes->resize(p - &(*bytes)[0]); + bytes->shrink_to_fit(); + } +} + // Determines whether regexp matches must be anchored // with a fixed string prefix. If so, returns the prefix and // the regexp that remains after the prefix. The prefix might // be ASCII case-insensitive. bool Regexp::RequiredPrefix(std::string* prefix, bool* foldcase, Regexp** suffix) { + prefix->clear(); + *foldcase = false; + *suffix = NULL; + // No need for a walker: the regexp must be of the form // 1. some number of ^ anchors // 2. a literal char or string // 3. the rest - prefix->clear(); - *foldcase = false; - *suffix = NULL; if (op_ != kRegexpConcat) return false; - - // Some number of anchors, then a literal or concatenation. int i = 0; - Regexp** sub = this->sub(); - while (i < nsub_ && sub[i]->op_ == kRegexpBeginText) + while (i < nsub_ && sub()[i]->op_ == kRegexpBeginText) i++; if (i == 0 || i >= nsub_) return false; - - Regexp* re = sub[i]; - switch (re->op_) { - default: - return false; - - case kRegexpLiteralString: - // Convert to string in proper encoding. - if (re->parse_flags() & Latin1) { - prefix->resize(re->literal_string_.nrunes_); - for (int j = 0; j < re->literal_string_.nrunes_; j++) - (*prefix)[j] = static_cast(re->literal_string_.runes_[j]); - } else { - // Convert to UTF-8 in place. - // Assume worst-case space and then trim. - prefix->resize(re->literal_string_.nrunes_ * UTFmax); - char *p = &(*prefix)[0]; - for (int j = 0; j < re->literal_string_.nrunes_; j++) { - Rune r = re->literal_string_.runes_[j]; - if (r < Runeself) - *p++ = static_cast(r); - else - p += runetochar(p, &r); - } - prefix->resize(p - &(*prefix)[0]); - } - break; - - case kRegexpLiteral: - if ((re->parse_flags() & Latin1) || re->rune_ < Runeself) { - prefix->append(1, static_cast(re->rune_)); - } else { - char buf[UTFmax]; - prefix->append(buf, runetochar(buf, &re->rune_)); - } - break; - } - *foldcase = (sub[i]->parse_flags() & FoldCase) != 0; + Regexp* re = sub()[i]; + if (re->op_ != kRegexpLiteral && + re->op_ != kRegexpLiteralString) + return false; i++; - - // The rest. if (i < nsub_) { for (int j = i; j < nsub_; j++) - sub[j]->Incref(); - re = Concat(sub + i, nsub_ - i, parse_flags()); + sub()[j]->Incref(); + *suffix = Concat(sub() + i, nsub_ - i, parse_flags()); } else { - re = new Regexp(kRegexpEmptyMatch, parse_flags()); + *suffix = new Regexp(kRegexpEmptyMatch, parse_flags()); } - *suffix = re; + + bool latin1 = (re->parse_flags() & Latin1) != 0; + Rune* runes = re->op_ == kRegexpLiteral ? &re->arguments.rune_ : re->arguments.literal_string.runes_; + int nrunes = re->op_ == kRegexpLiteral ? 1 : re->arguments.literal_string.nrunes_; + ConvertRunesToBytes(latin1, runes, nrunes, prefix); + *foldcase = (re->parse_flags() & FoldCase) != 0; + return true; +} + +// Determines whether regexp matches must be unanchored +// with a fixed string prefix. If so, returns the prefix. +// The prefix might be ASCII case-insensitive. +bool Regexp::RequiredPrefixForAccel(std::string* prefix, bool* foldcase) { + prefix->clear(); + *foldcase = false; + + // No need for a walker: the regexp must either begin with or be + // a literal char or string. We "see through" capturing groups, + // but make no effort to glue multiple prefix fragments together. + Regexp* re = op_ == kRegexpConcat && nsub_ > 0 ? sub()[0] : this; + while (re->op_ == kRegexpCapture) { + re = re->sub()[0]; + if (re->op_ == kRegexpConcat && re->nsub_ > 0) + re = re->sub()[0]; + } + if (re->op_ != kRegexpLiteral && + re->op_ != kRegexpLiteralString) + return false; + + bool latin1 = (re->parse_flags() & Latin1) != 0; + Rune* runes = re->op_ == kRegexpLiteral ? &re->arguments.rune_ : re->arguments.literal_string.runes_; + int nrunes = re->op_ == kRegexpLiteral ? 1 : re->arguments.literal_string.nrunes_; + ConvertRunesToBytes(latin1, runes, nrunes, prefix); + *foldcase = (re->parse_flags() & FoldCase) != 0; return true; } @@ -358262,7 +360624,7 @@ void CharClassBuilder::Negate() { // The ranges are allocated in the same block as the header, // necessitating a special allocator and Delete method. -CharClass* CharClass::New(int maxranges) { +CharClass* CharClass::New(size_t maxranges) { CharClass* cc; uint8_t* data = new uint8_t[sizeof *cc + maxranges*sizeof cc->ranges_[0]]; cc = reinterpret_cast(data); @@ -358279,7 +360641,7 @@ void CharClass::Delete() { } CharClass* CharClass::Negate() { - CharClass* cc = CharClass::New(nranges_+1); + CharClass* cc = CharClass::New(static_cast(nranges_+1)); cc->folds_ascii_ = folds_ascii_; cc->nrunes_ = Runemax + 1 - nrunes_; int n = 0; @@ -358298,7 +360660,7 @@ CharClass* CharClass::Negate() { return cc; } -bool CharClass::Contains(Rune r) { +bool CharClass::Contains(Rune r) const { RuneRange* rr = ranges_; int n = nranges_; while (n > 0) { @@ -358316,7 +360678,7 @@ bool CharClass::Contains(Rune r) { } CharClass* CharClassBuilder::GetCharClass() { - CharClass* cc = CharClass::New(static_cast(ranges_.size())); + CharClass* cc = CharClass::New(ranges_.size()); int n = 0; for (iterator it = begin(); it != end(); ++it) cc->ranges_[n++] = *it; @@ -358327,7 +360689,7 @@ CharClass* CharClassBuilder::GetCharClass() { return cc; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -358354,6 +360716,7 @@ CharClass* CharClassBuilder::GetCharClass() { #ifndef RE2_SET_H_ #define RE2_SET_H_ +#include #include #include #include @@ -358363,7 +360726,7 @@ CharClass* CharClassBuilder::GetCharClass() { namespace duckdb_re2 { class Prog; class Regexp; -} // namespace duckdb_re2 +} // namespace re2 namespace duckdb_re2 { @@ -358385,6 +360748,13 @@ class RE2::Set { Set(const RE2::Options& options, RE2::Anchor anchor); ~Set(); + // Not copyable. + Set(const Set&) = delete; + Set& operator=(const Set&) = delete; + // Movable. + Set(Set&& other); + Set& operator=(Set&& other); + // Adds pattern to the set using the options passed to the constructor. // Returns the index that will identify the regexp in the output of Match(), // or -1 if the regexp cannot be parsed. @@ -358416,15 +360786,12 @@ class RE2::Set { RE2::Options options_; RE2::Anchor anchor_; std::vector elem_; - duckdb_re2::Prog* prog_; bool compiled_; int size_; - - Set(const Set&) = delete; - Set& operator=(const Set&) = delete; + std::unique_ptr prog_; }; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_SET_H_ @@ -358435,6 +360802,7 @@ class RE2::Set { #include #include #include +#include @@ -358446,19 +360814,37 @@ class RE2::Set { namespace duckdb_re2 { -RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor) { - options_.Copy(options); +RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor) + : options_(options), + anchor_(anchor), + compiled_(false), + size_(0) { options_.set_never_capture(true); // might unblock some optimisations - anchor_ = anchor; - prog_ = NULL; - compiled_ = false; - size_ = 0; } RE2::Set::~Set() { for (size_t i = 0; i < elem_.size(); i++) elem_[i].second->Decref(); - delete prog_; +} + +RE2::Set::Set(Set&& other) + : options_(other.options_), + anchor_(other.anchor_), + elem_(std::move(other.elem_)), + compiled_(other.compiled_), + size_(other.size_), + prog_(std::move(other.prog_)) { + other.elem_.clear(); + other.elem_.shrink_to_fit(); + other.compiled_ = false; + other.size_ = 0; + other.prog_.reset(); +} + +RE2::Set& RE2::Set::operator=(Set&& other) { + this->~Set(); + (void) new (this) Set(std::move(other)); + return *this; } int RE2::Set::Add(const StringPiece& pattern, std::string* error) { @@ -358525,9 +360911,9 @@ bool RE2::Set::Compile() { options_.ParseFlags()); duckdb_re2::Regexp* re = duckdb_re2::Regexp::Alternate(sub.data(), size_, pf); - prog_ = Prog::CompileSet(re, anchor_, options_.max_mem()); + prog_.reset(Prog::CompileSet(re, anchor_, options_.max_mem())); re->Decref(); - return prog_ != NULL; + return prog_ != nullptr; } bool RE2::Set::Match(const StringPiece& text, std::vector* v) const { @@ -358537,11 +360923,14 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v) const { bool RE2::Set::Match(const StringPiece& text, std::vector* v, ErrorInfo* error_info) const { if (!compiled_) { - LOG(DFATAL) << "RE2::Set::Match() called before compiling"; if (error_info != NULL) error_info->kind = kNotCompiled; + LOG(DFATAL) << "RE2::Set::Match() called before compiling"; return false; } +#ifdef RE2_HAVE_THREAD_LOCAL + hooks::context = NULL; +#endif bool dfa_failed = false; std::unique_ptr matches; if (v != NULL) { @@ -358552,9 +360941,10 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v, NULL, &dfa_failed, matches.get()); if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog_->size() << ", " - << "bytemap range " << prog_->bytemap_range() << ", " - << "list count " << prog_->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); if (error_info != NULL) error_info->kind = kOutOfMemory; return false; @@ -358566,9 +360956,9 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v, } if (v != NULL) { if (matches->empty()) { - LOG(DFATAL) << "RE2::Set::Match() matched, but no matches returned?!"; if (error_info != NULL) error_info->kind = kInconsistent; + LOG(DFATAL) << "RE2::Set::Match() matched, but no matches returned?!"; return false; } v->assign(matches->begin(), matches->end()); @@ -358578,7 +360968,7 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v, return true; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -358618,8 +361008,6 @@ bool Regexp::SimplifyRegexp(const StringPiece& src, ParseFlags flags, Regexp* sre = re->Simplify(); re->Decref(); if (sre == NULL) { - // Should not happen, since Simplify never fails. - LOG(ERROR) << "Simplify failed on " << src; if (status) { status->set_code(kRegexpInternalError); status->set_error_arg(src); @@ -358635,9 +361023,6 @@ bool Regexp::SimplifyRegexp(const StringPiece& src, ParseFlags flags, // is this Regexp* simple? bool Regexp::ComputeSimple() { Regexp** subs; - auto ccb = char_class_.ccb_; - auto cc = char_class_.cc_; - switch (op_) { case kRegexpNoMatch: case kRegexpEmptyMatch: @@ -358663,9 +361048,9 @@ bool Regexp::ComputeSimple() { return true; case kRegexpCharClass: // Simple as long as the char class is not empty, not full. - if (ccb != NULL) - return !ccb->empty() && !ccb->full(); - return !cc->empty() && !cc->full(); + if (arguments.char_class.ccb_ != NULL) + return !arguments.char_class.ccb_->empty() && !arguments.char_class.ccb_->full(); + return !arguments.char_class.cc_->empty() && !arguments.char_class.cc_->full(); case kRegexpCapture: subs = sub(); return subs[0]->simple(); @@ -358773,13 +361158,25 @@ Regexp* Regexp::Simplify() { CoalesceWalker cw; Regexp* cre = cw.Walk(this, NULL); if (cre == NULL) - return cre; + return NULL; + if (cw.stopped_early()) { + cre->Decref(); + return NULL; + } SimplifyWalker sw; Regexp* sre = sw.Walk(cre, NULL); cre->Decref(); + if (sre == NULL) + return NULL; + if (sw.stopped_early()) { + sre->Decref(); + return NULL; + } return sre; } +#define Simplify DontCallSimplify // Avoid accidental recursion + // Utility function for PostVisit implementations that compares re->sub() with // child_args to determine whether any child_args changed. In the common case, // where nothing changed, calls Decref() for all child_args and returns false, @@ -358803,9 +361200,10 @@ Regexp* CoalesceWalker::Copy(Regexp* re) { } Regexp* CoalesceWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { - // This should never be called, since we use Walk and not - // WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "CoalesceWalker::ShortVisit called"; +#endif return re->Incref(); } @@ -358829,10 +361227,10 @@ Regexp* CoalesceWalker::PostVisit(Regexp* re, nre_subs[i] = child_args[i]; // Repeats and Captures have additional data that must be copied. if (re->op() == kRegexpRepeat) { - nre->repeat_.min_ = re->min(); - nre->repeat_.max_ = re->max(); + nre->arguments.repeat.min_ = re->min(); + nre->arguments.repeat.max_ = re->max(); } else if (re->op() == kRegexpCapture) { - nre->capture_.cap_ = re->cap(); + nre->arguments.capture.cap_ = re->cap(); } return nre; } @@ -358933,61 +361331,61 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { switch (r1->op()) { case kRegexpStar: - nre->repeat_.min_ = 0; - nre->repeat_.max_ = -1; + nre->arguments.repeat.min_ = 0; + nre->arguments.repeat.max_ = -1; break; case kRegexpPlus: - nre->repeat_.min_ = 1; - nre->repeat_.max_ = -1; + nre->arguments.repeat.min_ = 1; + nre->arguments.repeat.max_ = -1; break; case kRegexpQuest: - nre->repeat_.min_ = 0; - nre->repeat_.max_ = 1; + nre->arguments.repeat.min_ = 0; + nre->arguments.repeat.max_ = 1; break; case kRegexpRepeat: - nre->repeat_.min_ = r1->min(); - nre->repeat_.max_ = r1->max(); + nre->arguments.repeat.min_ = r1->min(); + nre->arguments.repeat.max_ = r1->max(); break; default: - LOG(DFATAL) << "DoCoalesce failed: r1->op() is " << r1->op(); nre->Decref(); + LOG(DFATAL) << "DoCoalesce failed: r1->op() is " << r1->op(); return; } switch (r2->op()) { case kRegexpStar: - nre->repeat_.max_ = -1; + nre->arguments.repeat.max_ = -1; goto LeaveEmpty; case kRegexpPlus: - nre->repeat_.min_++; - nre->repeat_.max_ = -1; + nre->arguments.repeat.min_++; + nre->arguments.repeat.max_ = -1; goto LeaveEmpty; case kRegexpQuest: if (nre->max() != -1) - nre->repeat_.max_++; + nre->arguments.repeat.max_++; goto LeaveEmpty; case kRegexpRepeat: - nre->repeat_.min_ += r2->min(); + nre->arguments.repeat.min_ += r2->min(); if (r2->max() == -1) - nre->repeat_.max_ = -1; + nre->arguments.repeat.max_ = -1; else if (nre->max() != -1) - nre->repeat_.max_ += r2->max(); + nre->arguments.repeat.max_ += r2->max(); goto LeaveEmpty; case kRegexpLiteral: case kRegexpCharClass: case kRegexpAnyChar: case kRegexpAnyByte: - nre->repeat_.min_++; + nre->arguments.repeat.min_++; if (nre->max() != -1) - nre->repeat_.max_++; + nre->arguments.repeat.max_++; goto LeaveEmpty; LeaveEmpty: @@ -359002,9 +361400,9 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { int n = 1; while (n < r2->nrunes() && r2->runes()[n] == r) n++; - nre->repeat_.min_ += n; + nre->arguments.repeat.min_ += n; if (nre->max() != -1) - nre->repeat_.max_ += n; + nre->arguments.repeat.max_ += n; if (n == r2->nrunes()) goto LeaveEmpty; *r1ptr = nre; @@ -359014,8 +361412,8 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { } default: - LOG(DFATAL) << "DoCoalesce failed: r2->op() is " << r2->op(); nre->Decref(); + LOG(DFATAL) << "DoCoalesce failed: r2->op() is " << r2->op(); return; } @@ -359028,9 +361426,10 @@ Regexp* SimplifyWalker::Copy(Regexp* re) { } Regexp* SimplifyWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { - // This should never be called, since we use Walk and not - // WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "SimplifyWalker::ShortVisit called"; +#endif return re->Incref(); } @@ -359091,7 +361490,7 @@ Regexp* SimplifyWalker::PostVisit(Regexp* re, Regexp* nre = new Regexp(kRegexpCapture, re->parse_flags()); nre->AllocSub(1); nre->sub()[0] = newsub; - nre->capture_.cap_ = re->cap(); + nre->arguments.capture.cap_ = re->cap(); nre->simple_ = true; return nre; } @@ -359131,7 +361530,7 @@ Regexp* SimplifyWalker::PostVisit(Regexp* re, if (newsub->op() == kRegexpEmptyMatch) return newsub; - Regexp* nre = SimplifyRepeat(newsub, re->repeat_.min_, re->repeat_.max_, + Regexp* nre = SimplifyRepeat(newsub, re->arguments.repeat.min_, re->arguments.repeat.max_, re->parse_flags()); newsub->Decref(); nre->simple_ = true; @@ -359243,7 +361642,7 @@ Regexp* SimplifyWalker::SimplifyCharClass(Regexp* re) { return re->Incref(); } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -359317,7 +361716,7 @@ std::ostream& operator<<(std::ostream& o, const StringPiece& p) { return o; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -359390,6 +361789,8 @@ std::string Regexp::ToString() { return t; } +#define ToString DontCallToString // Avoid accidental recursion. + // Visits re before children are processed. // Appends ( if needed and passes new precedence to children. int ToStringWalker::PreVisit(Regexp* re, int parent_arg, bool* stop) { @@ -359596,9 +361997,9 @@ int ToStringWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, } t_->append("["); // Heuristic: show class as negated if it contains the - // non-character 0xFFFE. + // non-character 0xFFFE and yet somehow isn't full. CharClass* cc = re->cc(); - if (cc->Contains(0xFFFE)) { + if (cc->Contains(0xFFFE) && !cc->full()) { cc = cc->Negate(); t_->append("^"); } @@ -359618,7 +362019,7 @@ int ToStringWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, // There's no syntax accepted by the parser to generate // this node (it is generated by RE2::Set) so make something // up that is readable but won't compile. - t_->append("(?HaveMatch:%d)", re->match_id()); + t_->append(StringPrintf("(?HaveMatch:%d)", re->match_id())); break; } @@ -359659,10 +362060,10 @@ static void AppendCCChar(std::string* t, Rune r) { } if (r < 0x100) { - StringAppendF(t, "\\x%02x", static_cast(r)); + *t += StringPrintf("\\x%02x", static_cast(r)); return; } - StringAppendF(t, "\\x{%x}", static_cast(r)); + *t += StringPrintf("\\x{%x}", static_cast(r)); } static void AppendCCRange(std::string* t, Rune lo, Rune hi) { @@ -359675,7 +362076,7 @@ static void AppendCCRange(std::string* t, Rune lo, Rune hi) { } } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -359694,7 +362095,7 @@ static void AppendCCRange(std::string* t, Rune lo, Rune hi) { namespace duckdb_re2 { -// 1374 groups, 2778 pairs, 349 ranges +// 1424 groups, 2878 pairs, 367 ranges const CaseFold unicode_casefold[] = { { 65, 90, 32 }, { 97, 106, -32 }, @@ -359809,6 +362210,7 @@ const CaseFold unicode_casefold[] = { { 629, 629, -214 }, { 637, 637, 10727 }, { 640, 640, -218 }, + { 642, 642, 42307 }, { 643, 643, -218 }, { 647, 647, 42282 }, { 648, 648, -218 }, @@ -359915,6 +362317,7 @@ const CaseFold unicode_casefold[] = { { 7357, 7359, -3008 }, { 7545, 7545, 35332 }, { 7549, 7549, 3814 }, + { 7566, 7566, 35384 }, { 7680, 7776, EvenOdd }, { 7777, 7777, 58 }, { 7778, 7829, EvenOdd }, @@ -359984,8 +362387,8 @@ const CaseFold unicode_casefold[] = { { 8579, 8580, OddEven }, { 9398, 9423, 26 }, { 9424, 9449, -26 }, - { 11264, 11310, 48 }, - { 11312, 11358, -48 }, + { 11264, 11311, 48 }, + { 11312, 11359, -48 }, { 11360, 11361, EvenOdd }, { 11362, 11362, -10743 }, { 11363, 11363, -3814 }, @@ -360018,6 +362421,7 @@ const CaseFold unicode_casefold[] = { { 42891, 42892, OddEven }, { 42893, 42893, -42280 }, { 42896, 42899, EvenOdd }, + { 42900, 42900, 48 }, { 42902, 42921, EvenOdd }, { 42922, 42922, -42308 }, { 42923, 42923, -42319 }, @@ -360028,7 +362432,14 @@ const CaseFold unicode_casefold[] = { { 42929, 42929, -42282 }, { 42930, 42930, -42261 }, { 42931, 42931, 928 }, - { 42932, 42937, EvenOdd }, + { 42932, 42947, EvenOdd }, + { 42948, 42948, -48 }, + { 42949, 42949, -42307 }, + { 42950, 42950, -35384 }, + { 42951, 42954, OddEven }, + { 42960, 42961, EvenOdd }, + { 42966, 42969, EvenOdd }, + { 42997, 42998, OddEven }, { 43859, 43859, -928 }, { 43888, 43967, -38864 }, { 65313, 65338, 32 }, @@ -360037,6 +362448,14 @@ const CaseFold unicode_casefold[] = { { 66600, 66639, -40 }, { 66736, 66771, 40 }, { 66776, 66811, -40 }, + { 66928, 66938, 39 }, + { 66940, 66954, 39 }, + { 66956, 66962, 39 }, + { 66964, 66965, 39 }, + { 66967, 66977, -39 }, + { 66979, 66993, -39 }, + { 66995, 67001, -39 }, + { 67003, 67004, -39 }, { 68736, 68786, 64 }, { 68800, 68850, -64 }, { 71840, 71871, 32 }, @@ -360046,9 +362465,9 @@ const CaseFold unicode_casefold[] = { { 125184, 125217, 34 }, { 125218, 125251, -34 }, }; -const int num_unicode_casefold = 349; +const int num_unicode_casefold = 367; -// 1374 groups, 1404 pairs, 194 ranges +// 1424 groups, 1454 pairs, 205 ranges const CaseFold unicode_tolower[] = { { 65, 90, 32 }, { 181, 181, 775 }, @@ -360199,7 +362618,7 @@ const CaseFold unicode_tolower[] = { { 8544, 8559, 16 }, { 8579, 8579, OddEven }, { 9398, 9423, 26 }, - { 11264, 11310, 48 }, + { 11264, 11311, 48 }, { 11360, 11360, EvenOdd }, { 11362, 11362, -10743 }, { 11363, 11363, -3814 }, @@ -360235,21 +362654,32 @@ const CaseFold unicode_tolower[] = { { 42929, 42929, -42282 }, { 42930, 42930, -42261 }, { 42931, 42931, 928 }, - { 42932, 42936, EvenOddSkip }, + { 42932, 42946, EvenOddSkip }, + { 42948, 42948, -48 }, + { 42949, 42949, -42307 }, + { 42950, 42950, -35384 }, + { 42951, 42953, OddEvenSkip }, + { 42960, 42960, EvenOdd }, + { 42966, 42968, EvenOddSkip }, + { 42997, 42997, OddEven }, { 43888, 43967, -38864 }, { 65313, 65338, 32 }, { 66560, 66599, 40 }, { 66736, 66771, 40 }, + { 66928, 66938, 39 }, + { 66940, 66954, 39 }, + { 66956, 66962, 39 }, + { 66964, 66965, 39 }, { 68736, 68786, 64 }, { 71840, 71871, 32 }, { 93760, 93791, 32 }, { 125184, 125217, 34 }, }; -const int num_unicode_tolower = 194; +const int num_unicode_tolower = 205; -} // namespace duckdb_re2 +} // namespace re2 @@ -360270,183 +362700,109 @@ const int num_unicode_tolower = 194; namespace duckdb_re2 { -static const URange16 Ps_range16[] = { - { 40, 40 }, - { 91, 91 }, - { 123, 123 }, - { 3898, 3898 }, - { 3900, 3900 }, - { 5787, 5787 }, - { 8218, 8218 }, - { 8222, 8222 }, - { 8261, 8261 }, - { 8317, 8317 }, - { 8333, 8333 }, - { 8968, 8968 }, - { 8970, 8970 }, - { 9001, 9001 }, - { 10088, 10088 }, - { 10090, 10090 }, - { 10092, 10092 }, - { 10094, 10094 }, - { 10096, 10096 }, - { 10098, 10098 }, - { 10100, 10100 }, - { 10181, 10181 }, - { 10214, 10214 }, - { 10216, 10216 }, - { 10218, 10218 }, - { 10220, 10220 }, - { 10222, 10222 }, - { 10627, 10627 }, - { 10629, 10629 }, - { 10631, 10631 }, - { 10633, 10633 }, - { 10635, 10635 }, - { 10637, 10637 }, - { 10639, 10639 }, - { 10641, 10641 }, - { 10643, 10643 }, - { 10645, 10645 }, - { 10647, 10647 }, - { 10712, 10712 }, - { 10714, 10714 }, - { 10748, 10748 }, - { 11810, 11810 }, - { 11812, 11812 }, - { 11814, 11814 }, - { 11816, 11816 }, - { 11842, 11842 }, - { 12296, 12296 }, - { 12298, 12298 }, - { 12300, 12300 }, - { 12302, 12302 }, - { 12304, 12304 }, - { 12308, 12308 }, - { 12310, 12310 }, - { 12312, 12312 }, - { 12314, 12314 }, - { 12317, 12317 }, - { 64831, 64831 }, - { 65047, 65047 }, - { 65077, 65077 }, - { 65079, 65079 }, - { 65081, 65081 }, - { 65083, 65083 }, - { 65085, 65085 }, - { 65087, 65087 }, - { 65089, 65089 }, - { 65091, 65091 }, - { 65095, 65095 }, - { 65113, 65113 }, - { 65115, 65115 }, - { 65117, 65117 }, - { 65288, 65288 }, - { 65339, 65339 }, - { 65371, 65371 }, - { 65375, 65375 }, - { 65378, 65378 }, +static const URange16 C_range16[] = { + { 0, 31 }, + { 127, 159 }, + { 173, 173 }, + { 1536, 1541 }, + { 1564, 1564 }, + { 1757, 1757 }, + { 1807, 1807 }, + { 2192, 2193 }, + { 2274, 2274 }, + { 6158, 6158 }, + { 8203, 8207 }, + { 8234, 8238 }, + { 8288, 8292 }, + { 8294, 8303 }, + { 55296, 63743 }, + { 65279, 65279 }, + { 65529, 65531 }, }; -static const URange16 Nl_range16[] = { - { 5870, 5872 }, - { 8544, 8578 }, - { 8581, 8584 }, - { 12295, 12295 }, - { 12321, 12329 }, - { 12344, 12346 }, - { 42726, 42735 }, +static const URange32 C_range32[] = { + { 69821, 69821 }, + { 69837, 69837 }, + { 78896, 78911 }, + { 113824, 113827 }, + { 119155, 119162 }, + { 917505, 917505 }, + { 917536, 917631 }, + { 983040, 1048573 }, + { 1048576, 1114109 }, }; -static const URange32 Nl_range32[] = { - { 65856, 65908 }, - { 66369, 66369 }, - { 66378, 66378 }, - { 66513, 66517 }, - { 74752, 74862 }, +static const URange16 Cc_range16[] = { + { 0, 31 }, + { 127, 159 }, }; -static const URange16 No_range16[] = { - { 178, 179 }, - { 185, 185 }, - { 188, 190 }, - { 2548, 2553 }, - { 2930, 2935 }, - { 3056, 3058 }, - { 3192, 3198 }, - { 3416, 3422 }, - { 3440, 3448 }, - { 3882, 3891 }, - { 4969, 4988 }, - { 6128, 6137 }, - { 6618, 6618 }, - { 8304, 8304 }, - { 8308, 8313 }, - { 8320, 8329 }, - { 8528, 8543 }, - { 8585, 8585 }, - { 9312, 9371 }, - { 9450, 9471 }, - { 10102, 10131 }, - { 11517, 11517 }, - { 12690, 12693 }, - { 12832, 12841 }, - { 12872, 12879 }, - { 12881, 12895 }, - { 12928, 12937 }, - { 12977, 12991 }, - { 43056, 43061 }, +static const URange16 Cf_range16[] = { + { 173, 173 }, + { 1536, 1541 }, + { 1564, 1564 }, + { 1757, 1757 }, + { 1807, 1807 }, + { 2192, 2193 }, + { 2274, 2274 }, + { 6158, 6158 }, + { 8203, 8207 }, + { 8234, 8238 }, + { 8288, 8292 }, + { 8294, 8303 }, + { 65279, 65279 }, + { 65529, 65531 }, }; -static const URange32 No_range32[] = { - { 65799, 65843 }, - { 65909, 65912 }, - { 65930, 65931 }, - { 66273, 66299 }, - { 66336, 66339 }, - { 67672, 67679 }, - { 67705, 67711 }, - { 67751, 67759 }, - { 67835, 67839 }, - { 67862, 67867 }, - { 68028, 68029 }, - { 68032, 68047 }, - { 68050, 68095 }, - { 68160, 68168 }, - { 68221, 68222 }, - { 68253, 68255 }, - { 68331, 68335 }, - { 68440, 68447 }, - { 68472, 68479 }, - { 68521, 68527 }, - { 68858, 68863 }, - { 69216, 69246 }, - { 69405, 69414 }, - { 69457, 69460 }, - { 69714, 69733 }, - { 70113, 70132 }, - { 71482, 71483 }, - { 71914, 71922 }, - { 72794, 72812 }, - { 93019, 93025 }, - { 93824, 93846 }, - { 119520, 119539 }, - { 119648, 119672 }, - { 125127, 125135 }, - { 126065, 126123 }, - { 126125, 126127 }, - { 126129, 126132 }, - { 127232, 127244 }, +static const URange32 Cf_range32[] = { + { 69821, 69821 }, + { 69837, 69837 }, + { 78896, 78911 }, + { 113824, 113827 }, + { 119155, 119162 }, + { 917505, 917505 }, + { 917536, 917631 }, }; -static const URange16 Lo_range16[] = { +static const URange16 Co_range16[] = { + { 57344, 63743 }, +}; +static const URange32 Co_range32[] = { + { 983040, 1048573 }, + { 1048576, 1114109 }, +}; +static const URange16 Cs_range16[] = { + { 55296, 57343 }, +}; +static const URange16 L_range16[] = { + { 65, 90 }, + { 97, 122 }, { 170, 170 }, + { 181, 181 }, { 186, 186 }, - { 443, 443 }, - { 448, 451 }, - { 660, 660 }, + { 192, 214 }, + { 216, 246 }, + { 248, 705 }, + { 710, 721 }, + { 736, 740 }, + { 748, 748 }, + { 750, 750 }, + { 880, 884 }, + { 886, 887 }, + { 890, 893 }, + { 895, 895 }, + { 902, 902 }, + { 904, 906 }, + { 908, 908 }, + { 910, 929 }, + { 931, 1013 }, + { 1015, 1153 }, + { 1162, 1327 }, + { 1329, 1366 }, + { 1369, 1369 }, + { 1376, 1416 }, { 1488, 1514 }, { 1519, 1522 }, - { 1568, 1599 }, - { 1601, 1610 }, + { 1568, 1610 }, { 1646, 1647 }, { 1649, 1747 }, { 1749, 1749 }, + { 1765, 1766 }, { 1774, 1775 }, { 1786, 1788 }, { 1791, 1791 }, @@ -360455,16 +362811,22 @@ static const URange16 Lo_range16[] = { { 1869, 1957 }, { 1969, 1969 }, { 1994, 2026 }, + { 2036, 2037 }, + { 2042, 2042 }, { 2048, 2069 }, + { 2074, 2074 }, + { 2084, 2084 }, + { 2088, 2088 }, { 2112, 2136 }, { 2144, 2154 }, - { 2208, 2228 }, - { 2230, 2237 }, + { 2160, 2183 }, + { 2185, 2190 }, + { 2208, 2249 }, { 2308, 2361 }, { 2365, 2365 }, { 2384, 2384 }, { 2392, 2401 }, - { 2418, 2432 }, + { 2417, 2432 }, { 2437, 2444 }, { 2447, 2448 }, { 2451, 2472 }, @@ -360524,6 +362886,7 @@ static const URange16 Lo_range16[] = { { 3114, 3129 }, { 3133, 3133 }, { 3160, 3162 }, + { 3165, 3165 }, { 3168, 3169 }, { 3200, 3200 }, { 3205, 3212 }, @@ -360532,10 +362895,10 @@ static const URange16 Lo_range16[] = { { 3242, 3251 }, { 3253, 3257 }, { 3261, 3261 }, - { 3294, 3294 }, + { 3293, 3294 }, { 3296, 3297 }, { 3313, 3314 }, - { 3333, 3340 }, + { 3332, 3340 }, { 3342, 3344 }, { 3346, 3386 }, { 3389, 3389 }, @@ -360550,22 +362913,17 @@ static const URange16 Lo_range16[] = { { 3520, 3526 }, { 3585, 3632 }, { 3634, 3635 }, - { 3648, 3653 }, + { 3648, 3654 }, { 3713, 3714 }, { 3716, 3716 }, - { 3719, 3720 }, - { 3722, 3722 }, - { 3725, 3725 }, - { 3732, 3735 }, - { 3737, 3743 }, - { 3745, 3747 }, + { 3718, 3722 }, + { 3724, 3747 }, { 3749, 3749 }, - { 3751, 3751 }, - { 3754, 3755 }, - { 3757, 3760 }, + { 3751, 3760 }, { 3762, 3763 }, { 3773, 3773 }, { 3776, 3780 }, + { 3782, 3782 }, { 3804, 3807 }, { 3840, 3840 }, { 3904, 3911 }, @@ -360580,7 +362938,11 @@ static const URange16 Lo_range16[] = { { 4206, 4208 }, { 4213, 4225 }, { 4238, 4238 }, - { 4352, 4680 }, + { 4256, 4293 }, + { 4295, 4295 }, + { 4301, 4301 }, + { 4304, 4346 }, + { 4348, 4680 }, { 4682, 4685 }, { 4688, 4694 }, { 4696, 4696 }, @@ -360597,21 +362959,22 @@ static const URange16 Lo_range16[] = { { 4882, 4885 }, { 4888, 4954 }, { 4992, 5007 }, + { 5024, 5109 }, + { 5112, 5117 }, { 5121, 5740 }, { 5743, 5759 }, { 5761, 5786 }, { 5792, 5866 }, { 5873, 5880 }, - { 5888, 5900 }, - { 5902, 5905 }, - { 5920, 5937 }, + { 5888, 5905 }, + { 5919, 5937 }, { 5952, 5969 }, { 5984, 5996 }, { 5998, 6000 }, { 6016, 6067 }, + { 6103, 6103 }, { 6108, 6108 }, - { 6176, 6210 }, - { 6212, 6264 }, + { 6176, 6264 }, { 6272, 6276 }, { 6279, 6312 }, { 6314, 6314 }, @@ -360623,19 +362986,67 @@ static const URange16 Lo_range16[] = { { 6576, 6601 }, { 6656, 6678 }, { 6688, 6740 }, + { 6823, 6823 }, { 6917, 6963 }, - { 6981, 6987 }, + { 6981, 6988 }, { 7043, 7072 }, { 7086, 7087 }, { 7098, 7141 }, { 7168, 7203 }, { 7245, 7247 }, - { 7258, 7287 }, + { 7258, 7293 }, + { 7296, 7304 }, + { 7312, 7354 }, + { 7357, 7359 }, { 7401, 7404 }, - { 7406, 7409 }, + { 7406, 7411 }, { 7413, 7414 }, - { 8501, 8504 }, + { 7418, 7418 }, + { 7424, 7615 }, + { 7680, 7957 }, + { 7960, 7965 }, + { 7968, 8005 }, + { 8008, 8013 }, + { 8016, 8023 }, + { 8025, 8025 }, + { 8027, 8027 }, + { 8029, 8029 }, + { 8031, 8061 }, + { 8064, 8116 }, + { 8118, 8124 }, + { 8126, 8126 }, + { 8130, 8132 }, + { 8134, 8140 }, + { 8144, 8147 }, + { 8150, 8155 }, + { 8160, 8172 }, + { 8178, 8180 }, + { 8182, 8188 }, + { 8305, 8305 }, + { 8319, 8319 }, + { 8336, 8348 }, + { 8450, 8450 }, + { 8455, 8455 }, + { 8458, 8467 }, + { 8469, 8469 }, + { 8473, 8477 }, + { 8484, 8484 }, + { 8486, 8486 }, + { 8488, 8488 }, + { 8490, 8493 }, + { 8495, 8505 }, + { 8508, 8511 }, + { 8517, 8521 }, + { 8526, 8526 }, + { 8579, 8580 }, + { 11264, 11492 }, + { 11499, 11502 }, + { 11506, 11507 }, + { 11520, 11557 }, + { 11559, 11559 }, + { 11565, 11565 }, { 11568, 11623 }, + { 11631, 11631 }, { 11648, 11670 }, { 11680, 11686 }, { 11688, 11694 }, @@ -360645,29 +363056,34 @@ static const URange16 Lo_range16[] = { { 11720, 11726 }, { 11728, 11734 }, { 11736, 11742 }, - { 12294, 12294 }, - { 12348, 12348 }, + { 11823, 11823 }, + { 12293, 12294 }, + { 12337, 12341 }, + { 12347, 12348 }, { 12353, 12438 }, - { 12447, 12447 }, + { 12445, 12447 }, { 12449, 12538 }, - { 12543, 12543 }, + { 12540, 12543 }, { 12549, 12591 }, { 12593, 12686 }, - { 12704, 12730 }, + { 12704, 12735 }, { 12784, 12799 }, - { 13312, 19893 }, - { 19968, 40943 }, - { 40960, 40980 }, - { 40982, 42124 }, - { 42192, 42231 }, - { 42240, 42507 }, + { 13312, 19903 }, + { 19968, 42124 }, + { 42192, 42237 }, + { 42240, 42508 }, { 42512, 42527 }, { 42538, 42539 }, - { 42606, 42606 }, + { 42560, 42606 }, + { 42623, 42653 }, { 42656, 42725 }, - { 42895, 42895 }, - { 42999, 42999 }, - { 43003, 43009 }, + { 42775, 42783 }, + { 42786, 42888 }, + { 42891, 42954 }, + { 42960, 42961 }, + { 42963, 42963 }, + { 42965, 42969 }, + { 42994, 43009 }, { 43011, 43013 }, { 43015, 43018 }, { 43020, 43042 }, @@ -360680,14 +363096,14 @@ static const URange16 Lo_range16[] = { { 43312, 43334 }, { 43360, 43388 }, { 43396, 43442 }, + { 43471, 43471 }, { 43488, 43492 }, - { 43495, 43503 }, + { 43494, 43503 }, { 43514, 43518 }, { 43520, 43560 }, { 43584, 43586 }, { 43588, 43595 }, - { 43616, 43631 }, - { 43633, 43638 }, + { 43616, 43638 }, { 43642, 43642 }, { 43646, 43695 }, { 43697, 43697 }, @@ -360695,20 +363111,24 @@ static const URange16 Lo_range16[] = { { 43705, 43709 }, { 43712, 43712 }, { 43714, 43714 }, - { 43739, 43740 }, + { 43739, 43741 }, { 43744, 43754 }, - { 43762, 43762 }, + { 43762, 43764 }, { 43777, 43782 }, { 43785, 43790 }, { 43793, 43798 }, { 43808, 43814 }, { 43816, 43822 }, - { 43968, 44002 }, + { 43824, 43866 }, + { 43868, 43881 }, + { 43888, 44002 }, { 44032, 55203 }, { 55216, 55238 }, { 55243, 55291 }, { 63744, 64109 }, { 64112, 64217 }, + { 64256, 64262 }, + { 64275, 64279 }, { 64285, 64285 }, { 64287, 64296 }, { 64298, 64310 }, @@ -360723,15 +363143,15 @@ static const URange16 Lo_range16[] = { { 65008, 65019 }, { 65136, 65140 }, { 65142, 65276 }, - { 65382, 65391 }, - { 65393, 65437 }, - { 65440, 65470 }, + { 65313, 65338 }, + { 65345, 65370 }, + { 65382, 65470 }, { 65474, 65479 }, { 65482, 65487 }, { 65490, 65495 }, { 65498, 65500 }, }; -static const URange32 Lo_range32[] = { +static const URange32 L_range32[] = { { 65536, 65547 }, { 65549, 65574 }, { 65576, 65594 }, @@ -360748,12 +363168,25 @@ static const URange32 Lo_range32[] = { { 66432, 66461 }, { 66464, 66499 }, { 66504, 66511 }, - { 66640, 66717 }, + { 66560, 66717 }, + { 66736, 66771 }, + { 66776, 66811 }, { 66816, 66855 }, { 66864, 66915 }, + { 66928, 66938 }, + { 66940, 66954 }, + { 66956, 66962 }, + { 66964, 66965 }, + { 66967, 66977 }, + { 66979, 66993 }, + { 66995, 67001 }, + { 67003, 67004 }, { 67072, 67382 }, { 67392, 67413 }, { 67424, 67431 }, + { 67456, 67461 }, + { 67463, 67504 }, + { 67506, 67514 }, { 67584, 67589 }, { 67592, 67592 }, { 67594, 67637 }, @@ -360781,15 +363214,25 @@ static const URange32 Lo_range32[] = { { 68448, 68466 }, { 68480, 68497 }, { 68608, 68680 }, + { 68736, 68786 }, + { 68800, 68850 }, { 68864, 68899 }, + { 69248, 69289 }, + { 69296, 69297 }, { 69376, 69404 }, { 69415, 69415 }, { 69424, 69445 }, + { 69488, 69505 }, + { 69552, 69572 }, + { 69600, 69622 }, { 69635, 69687 }, + { 69745, 69746 }, + { 69749, 69749 }, { 69763, 69807 }, { 69840, 69864 }, { 69891, 69926 }, { 69956, 69956 }, + { 69959, 69959 }, { 69968, 70002 }, { 70006, 70006 }, { 70019, 70066 }, @@ -360798,6 +363241,7 @@ static const URange32 Lo_range32[] = { { 70108, 70108 }, { 70144, 70161 }, { 70163, 70187 }, + { 70207, 70208 }, { 70272, 70278 }, { 70280, 70280 }, { 70282, 70285 }, @@ -360815,6 +363259,7 @@ static const URange32 Lo_range32[] = { { 70493, 70497 }, { 70656, 70708 }, { 70727, 70730 }, + { 70751, 70753 }, { 70784, 70831 }, { 70852, 70853 }, { 70855, 70855 }, @@ -360823,17 +363268,29 @@ static const URange32 Lo_range32[] = { { 71168, 71215 }, { 71236, 71236 }, { 71296, 71338 }, + { 71352, 71352 }, { 71424, 71450 }, + { 71488, 71494 }, { 71680, 71723 }, - { 71935, 71935 }, + { 71840, 71903 }, + { 71935, 71942 }, + { 71945, 71945 }, + { 71948, 71955 }, + { 71957, 71958 }, + { 71960, 71983 }, + { 71999, 71999 }, + { 72001, 72001 }, + { 72096, 72103 }, + { 72106, 72144 }, + { 72161, 72161 }, + { 72163, 72163 }, { 72192, 72192 }, { 72203, 72242 }, { 72250, 72250 }, { 72272, 72272 }, - { 72284, 72323 }, - { 72326, 72329 }, + { 72284, 72329 }, { 72349, 72349 }, - { 72384, 72440 }, + { 72368, 72440 }, { 72704, 72712 }, { 72714, 72750 }, { 72768, 72768 }, @@ -360847,27 +363304,92 @@ static const URange32 Lo_range32[] = { { 73066, 73097 }, { 73112, 73112 }, { 73440, 73458 }, + { 73474, 73474 }, + { 73476, 73488 }, + { 73490, 73523 }, + { 73648, 73648 }, { 73728, 74649 }, { 74880, 75075 }, - { 77824, 78894 }, + { 77712, 77808 }, + { 77824, 78895 }, + { 78913, 78918 }, { 82944, 83526 }, { 92160, 92728 }, { 92736, 92766 }, + { 92784, 92862 }, { 92880, 92909 }, { 92928, 92975 }, + { 92992, 92995 }, { 93027, 93047 }, { 93053, 93071 }, - { 93952, 94020 }, + { 93760, 93823 }, + { 93952, 94026 }, { 94032, 94032 }, - { 94208, 100337 }, - { 100352, 101106 }, - { 110592, 110878 }, + { 94099, 94111 }, + { 94176, 94177 }, + { 94179, 94179 }, + { 94208, 100343 }, + { 100352, 101589 }, + { 101632, 101640 }, + { 110576, 110579 }, + { 110581, 110587 }, + { 110589, 110590 }, + { 110592, 110882 }, + { 110898, 110898 }, + { 110928, 110930 }, + { 110933, 110933 }, + { 110948, 110951 }, { 110960, 111355 }, { 113664, 113770 }, { 113776, 113788 }, { 113792, 113800 }, { 113808, 113817 }, + { 119808, 119892 }, + { 119894, 119964 }, + { 119966, 119967 }, + { 119970, 119970 }, + { 119973, 119974 }, + { 119977, 119980 }, + { 119982, 119993 }, + { 119995, 119995 }, + { 119997, 120003 }, + { 120005, 120069 }, + { 120071, 120074 }, + { 120077, 120084 }, + { 120086, 120092 }, + { 120094, 120121 }, + { 120123, 120126 }, + { 120128, 120132 }, + { 120134, 120134 }, + { 120138, 120144 }, + { 120146, 120485 }, + { 120488, 120512 }, + { 120514, 120538 }, + { 120540, 120570 }, + { 120572, 120596 }, + { 120598, 120628 }, + { 120630, 120654 }, + { 120656, 120686 }, + { 120688, 120712 }, + { 120714, 120744 }, + { 120746, 120770 }, + { 120772, 120779 }, + { 122624, 122654 }, + { 122661, 122666 }, + { 122928, 122989 }, + { 123136, 123180 }, + { 123191, 123197 }, + { 123214, 123214 }, + { 123536, 123565 }, + { 123584, 123627 }, + { 124112, 124139 }, + { 124896, 124902 }, + { 124904, 124907 }, + { 124909, 124910 }, + { 124912, 124926 }, { 124928, 125124 }, + { 125184, 125251 }, + { 125259, 125259 }, { 126464, 126467 }, { 126469, 126495 }, { 126497, 126498 }, @@ -360901,12 +363423,14 @@ static const URange32 Lo_range32[] = { { 126625, 126627 }, { 126629, 126633 }, { 126635, 126651 }, - { 131072, 173782 }, - { 173824, 177972 }, + { 131072, 173791 }, + { 173824, 177977 }, { 177984, 178205 }, { 178208, 183969 }, { 183984, 191456 }, { 194560, 195101 }, + { 196608, 201546 }, + { 201552, 205743 }, }; static const URange16 Ll_range16[] = { { 97, 122 }, @@ -361340,7 +363864,7 @@ static const URange16 Ll_range16[] = { { 8518, 8521 }, { 8526, 8526 }, { 8580, 8580 }, - { 11312, 11358 }, + { 11312, 11359 }, { 11361, 11361 }, { 11365, 11366 }, { 11368, 11368 }, @@ -361506,9 +364030,22 @@ static const URange16 Ll_range16[] = { { 42933, 42933 }, { 42935, 42935 }, { 42937, 42937 }, + { 42939, 42939 }, + { 42941, 42941 }, + { 42943, 42943 }, + { 42945, 42945 }, + { 42947, 42947 }, + { 42952, 42952 }, + { 42954, 42954 }, + { 42961, 42961 }, + { 42963, 42963 }, + { 42965, 42965 }, + { 42967, 42967 }, + { 42969, 42969 }, + { 42998, 42998 }, { 43002, 43002 }, { 43824, 43866 }, - { 43872, 43877 }, + { 43872, 43880 }, { 43888, 43967 }, { 64256, 64262 }, { 64275, 64279 }, @@ -361517,6 +364054,10 @@ static const URange16 Ll_range16[] = { static const URange32 Ll_range32[] = { { 66600, 66639 }, { 66776, 66811 }, + { 66967, 66977 }, + { 66979, 66993 }, + { 66995, 67001 }, + { 67003, 67004 }, { 68800, 68850 }, { 71872, 71903 }, { 93792, 93823 }, @@ -361548,6 +364089,9 @@ static const URange32 Ll_range32[] = { { 120746, 120770 }, { 120772, 120777 }, { 120779, 120779 }, + { 122624, 122633 }, + { 122635, 122654 }, + { 122661, 122666 }, { 125218, 125251 }, }; static const URange16 Lm_range16[] = { @@ -361566,6 +364110,7 @@ static const URange16 Lm_range16[] = { { 2074, 2074 }, { 2084, 2084 }, { 2088, 2088 }, + { 2249, 2249 }, { 2417, 2417 }, { 3654, 3654 }, { 3782, 3782 }, @@ -361596,6 +364141,7 @@ static const URange16 Lm_range16[] = { { 42775, 42783 }, { 42864, 42864 }, { 42888, 42888 }, + { 42994, 42996 }, { 43000, 43001 }, { 43471, 43471 }, { 43494, 43494 }, @@ -361603,82 +364149,539 @@ static const URange16 Lm_range16[] = { { 43741, 43741 }, { 43763, 43764 }, { 43868, 43871 }, + { 43881, 43881 }, { 65392, 65392 }, { 65438, 65439 }, }; static const URange32 Lm_range32[] = { + { 67456, 67461 }, + { 67463, 67504 }, + { 67506, 67514 }, { 92992, 92995 }, { 94099, 94111 }, { 94176, 94177 }, + { 94179, 94179 }, + { 110576, 110579 }, + { 110581, 110587 }, + { 110589, 110590 }, + { 122928, 122989 }, + { 123191, 123197 }, + { 124139, 124139 }, + { 125259, 125259 }, }; -static const URange16 Nd_range16[] = { - { 48, 57 }, - { 1632, 1641 }, - { 1776, 1785 }, - { 1984, 1993 }, - { 2406, 2415 }, - { 2534, 2543 }, - { 2662, 2671 }, - { 2790, 2799 }, - { 2918, 2927 }, - { 3046, 3055 }, - { 3174, 3183 }, - { 3302, 3311 }, - { 3430, 3439 }, - { 3558, 3567 }, - { 3664, 3673 }, - { 3792, 3801 }, - { 3872, 3881 }, - { 4160, 4169 }, - { 4240, 4249 }, - { 6112, 6121 }, - { 6160, 6169 }, - { 6470, 6479 }, - { 6608, 6617 }, - { 6784, 6793 }, - { 6800, 6809 }, - { 6992, 7001 }, - { 7088, 7097 }, - { 7232, 7241 }, - { 7248, 7257 }, - { 42528, 42537 }, - { 43216, 43225 }, - { 43264, 43273 }, - { 43472, 43481 }, - { 43504, 43513 }, - { 43600, 43609 }, - { 44016, 44025 }, - { 65296, 65305 }, -}; -static const URange32 Nd_range32[] = { - { 66720, 66729 }, - { 68912, 68921 }, - { 69734, 69743 }, - { 69872, 69881 }, - { 69942, 69951 }, - { 70096, 70105 }, - { 70384, 70393 }, - { 70736, 70745 }, - { 70864, 70873 }, - { 71248, 71257 }, - { 71360, 71369 }, - { 71472, 71481 }, - { 71904, 71913 }, - { 72784, 72793 }, - { 73040, 73049 }, - { 73120, 73129 }, - { 92768, 92777 }, - { 93008, 93017 }, - { 120782, 120831 }, - { 125264, 125273 }, +static const URange16 Lo_range16[] = { + { 170, 170 }, + { 186, 186 }, + { 443, 443 }, + { 448, 451 }, + { 660, 660 }, + { 1488, 1514 }, + { 1519, 1522 }, + { 1568, 1599 }, + { 1601, 1610 }, + { 1646, 1647 }, + { 1649, 1747 }, + { 1749, 1749 }, + { 1774, 1775 }, + { 1786, 1788 }, + { 1791, 1791 }, + { 1808, 1808 }, + { 1810, 1839 }, + { 1869, 1957 }, + { 1969, 1969 }, + { 1994, 2026 }, + { 2048, 2069 }, + { 2112, 2136 }, + { 2144, 2154 }, + { 2160, 2183 }, + { 2185, 2190 }, + { 2208, 2248 }, + { 2308, 2361 }, + { 2365, 2365 }, + { 2384, 2384 }, + { 2392, 2401 }, + { 2418, 2432 }, + { 2437, 2444 }, + { 2447, 2448 }, + { 2451, 2472 }, + { 2474, 2480 }, + { 2482, 2482 }, + { 2486, 2489 }, + { 2493, 2493 }, + { 2510, 2510 }, + { 2524, 2525 }, + { 2527, 2529 }, + { 2544, 2545 }, + { 2556, 2556 }, + { 2565, 2570 }, + { 2575, 2576 }, + { 2579, 2600 }, + { 2602, 2608 }, + { 2610, 2611 }, + { 2613, 2614 }, + { 2616, 2617 }, + { 2649, 2652 }, + { 2654, 2654 }, + { 2674, 2676 }, + { 2693, 2701 }, + { 2703, 2705 }, + { 2707, 2728 }, + { 2730, 2736 }, + { 2738, 2739 }, + { 2741, 2745 }, + { 2749, 2749 }, + { 2768, 2768 }, + { 2784, 2785 }, + { 2809, 2809 }, + { 2821, 2828 }, + { 2831, 2832 }, + { 2835, 2856 }, + { 2858, 2864 }, + { 2866, 2867 }, + { 2869, 2873 }, + { 2877, 2877 }, + { 2908, 2909 }, + { 2911, 2913 }, + { 2929, 2929 }, + { 2947, 2947 }, + { 2949, 2954 }, + { 2958, 2960 }, + { 2962, 2965 }, + { 2969, 2970 }, + { 2972, 2972 }, + { 2974, 2975 }, + { 2979, 2980 }, + { 2984, 2986 }, + { 2990, 3001 }, + { 3024, 3024 }, + { 3077, 3084 }, + { 3086, 3088 }, + { 3090, 3112 }, + { 3114, 3129 }, + { 3133, 3133 }, + { 3160, 3162 }, + { 3165, 3165 }, + { 3168, 3169 }, + { 3200, 3200 }, + { 3205, 3212 }, + { 3214, 3216 }, + { 3218, 3240 }, + { 3242, 3251 }, + { 3253, 3257 }, + { 3261, 3261 }, + { 3293, 3294 }, + { 3296, 3297 }, + { 3313, 3314 }, + { 3332, 3340 }, + { 3342, 3344 }, + { 3346, 3386 }, + { 3389, 3389 }, + { 3406, 3406 }, + { 3412, 3414 }, + { 3423, 3425 }, + { 3450, 3455 }, + { 3461, 3478 }, + { 3482, 3505 }, + { 3507, 3515 }, + { 3517, 3517 }, + { 3520, 3526 }, + { 3585, 3632 }, + { 3634, 3635 }, + { 3648, 3653 }, + { 3713, 3714 }, + { 3716, 3716 }, + { 3718, 3722 }, + { 3724, 3747 }, + { 3749, 3749 }, + { 3751, 3760 }, + { 3762, 3763 }, + { 3773, 3773 }, + { 3776, 3780 }, + { 3804, 3807 }, + { 3840, 3840 }, + { 3904, 3911 }, + { 3913, 3948 }, + { 3976, 3980 }, + { 4096, 4138 }, + { 4159, 4159 }, + { 4176, 4181 }, + { 4186, 4189 }, + { 4193, 4193 }, + { 4197, 4198 }, + { 4206, 4208 }, + { 4213, 4225 }, + { 4238, 4238 }, + { 4352, 4680 }, + { 4682, 4685 }, + { 4688, 4694 }, + { 4696, 4696 }, + { 4698, 4701 }, + { 4704, 4744 }, + { 4746, 4749 }, + { 4752, 4784 }, + { 4786, 4789 }, + { 4792, 4798 }, + { 4800, 4800 }, + { 4802, 4805 }, + { 4808, 4822 }, + { 4824, 4880 }, + { 4882, 4885 }, + { 4888, 4954 }, + { 4992, 5007 }, + { 5121, 5740 }, + { 5743, 5759 }, + { 5761, 5786 }, + { 5792, 5866 }, + { 5873, 5880 }, + { 5888, 5905 }, + { 5919, 5937 }, + { 5952, 5969 }, + { 5984, 5996 }, + { 5998, 6000 }, + { 6016, 6067 }, + { 6108, 6108 }, + { 6176, 6210 }, + { 6212, 6264 }, + { 6272, 6276 }, + { 6279, 6312 }, + { 6314, 6314 }, + { 6320, 6389 }, + { 6400, 6430 }, + { 6480, 6509 }, + { 6512, 6516 }, + { 6528, 6571 }, + { 6576, 6601 }, + { 6656, 6678 }, + { 6688, 6740 }, + { 6917, 6963 }, + { 6981, 6988 }, + { 7043, 7072 }, + { 7086, 7087 }, + { 7098, 7141 }, + { 7168, 7203 }, + { 7245, 7247 }, + { 7258, 7287 }, + { 7401, 7404 }, + { 7406, 7411 }, + { 7413, 7414 }, + { 7418, 7418 }, + { 8501, 8504 }, + { 11568, 11623 }, + { 11648, 11670 }, + { 11680, 11686 }, + { 11688, 11694 }, + { 11696, 11702 }, + { 11704, 11710 }, + { 11712, 11718 }, + { 11720, 11726 }, + { 11728, 11734 }, + { 11736, 11742 }, + { 12294, 12294 }, + { 12348, 12348 }, + { 12353, 12438 }, + { 12447, 12447 }, + { 12449, 12538 }, + { 12543, 12543 }, + { 12549, 12591 }, + { 12593, 12686 }, + { 12704, 12735 }, + { 12784, 12799 }, + { 13312, 19903 }, + { 19968, 40980 }, + { 40982, 42124 }, + { 42192, 42231 }, + { 42240, 42507 }, + { 42512, 42527 }, + { 42538, 42539 }, + { 42606, 42606 }, + { 42656, 42725 }, + { 42895, 42895 }, + { 42999, 42999 }, + { 43003, 43009 }, + { 43011, 43013 }, + { 43015, 43018 }, + { 43020, 43042 }, + { 43072, 43123 }, + { 43138, 43187 }, + { 43250, 43255 }, + { 43259, 43259 }, + { 43261, 43262 }, + { 43274, 43301 }, + { 43312, 43334 }, + { 43360, 43388 }, + { 43396, 43442 }, + { 43488, 43492 }, + { 43495, 43503 }, + { 43514, 43518 }, + { 43520, 43560 }, + { 43584, 43586 }, + { 43588, 43595 }, + { 43616, 43631 }, + { 43633, 43638 }, + { 43642, 43642 }, + { 43646, 43695 }, + { 43697, 43697 }, + { 43701, 43702 }, + { 43705, 43709 }, + { 43712, 43712 }, + { 43714, 43714 }, + { 43739, 43740 }, + { 43744, 43754 }, + { 43762, 43762 }, + { 43777, 43782 }, + { 43785, 43790 }, + { 43793, 43798 }, + { 43808, 43814 }, + { 43816, 43822 }, + { 43968, 44002 }, + { 44032, 55203 }, + { 55216, 55238 }, + { 55243, 55291 }, + { 63744, 64109 }, + { 64112, 64217 }, + { 64285, 64285 }, + { 64287, 64296 }, + { 64298, 64310 }, + { 64312, 64316 }, + { 64318, 64318 }, + { 64320, 64321 }, + { 64323, 64324 }, + { 64326, 64433 }, + { 64467, 64829 }, + { 64848, 64911 }, + { 64914, 64967 }, + { 65008, 65019 }, + { 65136, 65140 }, + { 65142, 65276 }, + { 65382, 65391 }, + { 65393, 65437 }, + { 65440, 65470 }, + { 65474, 65479 }, + { 65482, 65487 }, + { 65490, 65495 }, + { 65498, 65500 }, }; -static const URange16 Pc_range16[] = { - { 95, 95 }, - { 8255, 8256 }, - { 8276, 8276 }, - { 65075, 65076 }, - { 65101, 65103 }, - { 65343, 65343 }, +static const URange32 Lo_range32[] = { + { 65536, 65547 }, + { 65549, 65574 }, + { 65576, 65594 }, + { 65596, 65597 }, + { 65599, 65613 }, + { 65616, 65629 }, + { 65664, 65786 }, + { 66176, 66204 }, + { 66208, 66256 }, + { 66304, 66335 }, + { 66349, 66368 }, + { 66370, 66377 }, + { 66384, 66421 }, + { 66432, 66461 }, + { 66464, 66499 }, + { 66504, 66511 }, + { 66640, 66717 }, + { 66816, 66855 }, + { 66864, 66915 }, + { 67072, 67382 }, + { 67392, 67413 }, + { 67424, 67431 }, + { 67584, 67589 }, + { 67592, 67592 }, + { 67594, 67637 }, + { 67639, 67640 }, + { 67644, 67644 }, + { 67647, 67669 }, + { 67680, 67702 }, + { 67712, 67742 }, + { 67808, 67826 }, + { 67828, 67829 }, + { 67840, 67861 }, + { 67872, 67897 }, + { 67968, 68023 }, + { 68030, 68031 }, + { 68096, 68096 }, + { 68112, 68115 }, + { 68117, 68119 }, + { 68121, 68149 }, + { 68192, 68220 }, + { 68224, 68252 }, + { 68288, 68295 }, + { 68297, 68324 }, + { 68352, 68405 }, + { 68416, 68437 }, + { 68448, 68466 }, + { 68480, 68497 }, + { 68608, 68680 }, + { 68864, 68899 }, + { 69248, 69289 }, + { 69296, 69297 }, + { 69376, 69404 }, + { 69415, 69415 }, + { 69424, 69445 }, + { 69488, 69505 }, + { 69552, 69572 }, + { 69600, 69622 }, + { 69635, 69687 }, + { 69745, 69746 }, + { 69749, 69749 }, + { 69763, 69807 }, + { 69840, 69864 }, + { 69891, 69926 }, + { 69956, 69956 }, + { 69959, 69959 }, + { 69968, 70002 }, + { 70006, 70006 }, + { 70019, 70066 }, + { 70081, 70084 }, + { 70106, 70106 }, + { 70108, 70108 }, + { 70144, 70161 }, + { 70163, 70187 }, + { 70207, 70208 }, + { 70272, 70278 }, + { 70280, 70280 }, + { 70282, 70285 }, + { 70287, 70301 }, + { 70303, 70312 }, + { 70320, 70366 }, + { 70405, 70412 }, + { 70415, 70416 }, + { 70419, 70440 }, + { 70442, 70448 }, + { 70450, 70451 }, + { 70453, 70457 }, + { 70461, 70461 }, + { 70480, 70480 }, + { 70493, 70497 }, + { 70656, 70708 }, + { 70727, 70730 }, + { 70751, 70753 }, + { 70784, 70831 }, + { 70852, 70853 }, + { 70855, 70855 }, + { 71040, 71086 }, + { 71128, 71131 }, + { 71168, 71215 }, + { 71236, 71236 }, + { 71296, 71338 }, + { 71352, 71352 }, + { 71424, 71450 }, + { 71488, 71494 }, + { 71680, 71723 }, + { 71935, 71942 }, + { 71945, 71945 }, + { 71948, 71955 }, + { 71957, 71958 }, + { 71960, 71983 }, + { 71999, 71999 }, + { 72001, 72001 }, + { 72096, 72103 }, + { 72106, 72144 }, + { 72161, 72161 }, + { 72163, 72163 }, + { 72192, 72192 }, + { 72203, 72242 }, + { 72250, 72250 }, + { 72272, 72272 }, + { 72284, 72329 }, + { 72349, 72349 }, + { 72368, 72440 }, + { 72704, 72712 }, + { 72714, 72750 }, + { 72768, 72768 }, + { 72818, 72847 }, + { 72960, 72966 }, + { 72968, 72969 }, + { 72971, 73008 }, + { 73030, 73030 }, + { 73056, 73061 }, + { 73063, 73064 }, + { 73066, 73097 }, + { 73112, 73112 }, + { 73440, 73458 }, + { 73474, 73474 }, + { 73476, 73488 }, + { 73490, 73523 }, + { 73648, 73648 }, + { 73728, 74649 }, + { 74880, 75075 }, + { 77712, 77808 }, + { 77824, 78895 }, + { 78913, 78918 }, + { 82944, 83526 }, + { 92160, 92728 }, + { 92736, 92766 }, + { 92784, 92862 }, + { 92880, 92909 }, + { 92928, 92975 }, + { 93027, 93047 }, + { 93053, 93071 }, + { 93952, 94026 }, + { 94032, 94032 }, + { 94208, 100343 }, + { 100352, 101589 }, + { 101632, 101640 }, + { 110592, 110882 }, + { 110898, 110898 }, + { 110928, 110930 }, + { 110933, 110933 }, + { 110948, 110951 }, + { 110960, 111355 }, + { 113664, 113770 }, + { 113776, 113788 }, + { 113792, 113800 }, + { 113808, 113817 }, + { 122634, 122634 }, + { 123136, 123180 }, + { 123214, 123214 }, + { 123536, 123565 }, + { 123584, 123627 }, + { 124112, 124138 }, + { 124896, 124902 }, + { 124904, 124907 }, + { 124909, 124910 }, + { 124912, 124926 }, + { 124928, 125124 }, + { 126464, 126467 }, + { 126469, 126495 }, + { 126497, 126498 }, + { 126500, 126500 }, + { 126503, 126503 }, + { 126505, 126514 }, + { 126516, 126519 }, + { 126521, 126521 }, + { 126523, 126523 }, + { 126530, 126530 }, + { 126535, 126535 }, + { 126537, 126537 }, + { 126539, 126539 }, + { 126541, 126543 }, + { 126545, 126546 }, + { 126548, 126548 }, + { 126551, 126551 }, + { 126553, 126553 }, + { 126555, 126555 }, + { 126557, 126557 }, + { 126559, 126559 }, + { 126561, 126562 }, + { 126564, 126564 }, + { 126567, 126570 }, + { 126572, 126578 }, + { 126580, 126583 }, + { 126585, 126588 }, + { 126590, 126590 }, + { 126592, 126601 }, + { 126603, 126619 }, + { 126625, 126627 }, + { 126629, 126633 }, + { 126635, 126651 }, + { 131072, 173791 }, + { 173824, 177977 }, + { 177984, 178205 }, + { 178208, 183969 }, + { 183984, 191456 }, + { 194560, 195101 }, + { 196608, 201546 }, + { 201552, 205743 }, }; static const URange16 Lt_range16[] = { { 453, 453 }, @@ -362124,7 +365127,7 @@ static const URange16 Lu_range16[] = { { 8510, 8511 }, { 8517, 8517 }, { 8579, 8579 }, - { 11264, 11310 }, + { 11264, 11311 }, { 11360, 11360 }, { 11362, 11364 }, { 11367, 11367 }, @@ -362286,11 +365289,26 @@ static const URange16 Lu_range16[] = { { 42928, 42932 }, { 42934, 42934 }, { 42936, 42936 }, + { 42938, 42938 }, + { 42940, 42940 }, + { 42942, 42942 }, + { 42944, 42944 }, + { 42946, 42946 }, + { 42948, 42951 }, + { 42953, 42953 }, + { 42960, 42960 }, + { 42966, 42966 }, + { 42968, 42968 }, + { 42997, 42997 }, { 65313, 65338 }, }; static const URange32 Lu_range32[] = { { 66560, 66599 }, { 66736, 66771 }, + { 66928, 66938 }, + { 66940, 66954 }, + { 66956, 66962 }, + { 66964, 66965 }, { 68736, 68786 }, { 71840, 71871 }, { 93760, 93791 }, @@ -362327,337 +365345,319 @@ static const URange32 Lu_range32[] = { { 120778, 120778 }, { 125184, 125217 }, }; -static const URange16 Pf_range16[] = { - { 187, 187 }, - { 8217, 8217 }, - { 8221, 8221 }, - { 8250, 8250 }, - { 11779, 11779 }, - { 11781, 11781 }, - { 11786, 11786 }, - { 11789, 11789 }, - { 11805, 11805 }, - { 11809, 11809 }, -}; -static const URange16 Pd_range16[] = { - { 45, 45 }, - { 1418, 1418 }, - { 1470, 1470 }, - { 5120, 5120 }, - { 6150, 6150 }, - { 8208, 8213 }, - { 11799, 11799 }, - { 11802, 11802 }, - { 11834, 11835 }, - { 11840, 11840 }, - { 12316, 12316 }, - { 12336, 12336 }, - { 12448, 12448 }, - { 65073, 65074 }, - { 65112, 65112 }, - { 65123, 65123 }, - { 65293, 65293 }, -}; -static const URange16 Pe_range16[] = { - { 41, 41 }, - { 93, 93 }, - { 125, 125 }, - { 3899, 3899 }, - { 3901, 3901 }, - { 5788, 5788 }, - { 8262, 8262 }, - { 8318, 8318 }, - { 8334, 8334 }, - { 8969, 8969 }, - { 8971, 8971 }, - { 9002, 9002 }, - { 10089, 10089 }, - { 10091, 10091 }, - { 10093, 10093 }, - { 10095, 10095 }, - { 10097, 10097 }, - { 10099, 10099 }, - { 10101, 10101 }, - { 10182, 10182 }, - { 10215, 10215 }, - { 10217, 10217 }, - { 10219, 10219 }, - { 10221, 10221 }, - { 10223, 10223 }, - { 10628, 10628 }, - { 10630, 10630 }, - { 10632, 10632 }, - { 10634, 10634 }, - { 10636, 10636 }, - { 10638, 10638 }, - { 10640, 10640 }, - { 10642, 10642 }, - { 10644, 10644 }, - { 10646, 10646 }, - { 10648, 10648 }, - { 10713, 10713 }, - { 10715, 10715 }, - { 10749, 10749 }, - { 11811, 11811 }, - { 11813, 11813 }, - { 11815, 11815 }, - { 11817, 11817 }, - { 12297, 12297 }, - { 12299, 12299 }, - { 12301, 12301 }, - { 12303, 12303 }, - { 12305, 12305 }, - { 12309, 12309 }, - { 12311, 12311 }, - { 12313, 12313 }, - { 12315, 12315 }, - { 12318, 12319 }, - { 64830, 64830 }, - { 65048, 65048 }, - { 65078, 65078 }, - { 65080, 65080 }, - { 65082, 65082 }, - { 65084, 65084 }, - { 65086, 65086 }, - { 65088, 65088 }, - { 65090, 65090 }, - { 65092, 65092 }, - { 65096, 65096 }, - { 65114, 65114 }, - { 65116, 65116 }, - { 65118, 65118 }, - { 65289, 65289 }, - { 65341, 65341 }, - { 65373, 65373 }, - { 65376, 65376 }, - { 65379, 65379 }, -}; -static const URange16 Pi_range16[] = { - { 171, 171 }, - { 8216, 8216 }, - { 8219, 8220 }, - { 8223, 8223 }, - { 8249, 8249 }, - { 11778, 11778 }, - { 11780, 11780 }, - { 11785, 11785 }, - { 11788, 11788 }, - { 11804, 11804 }, - { 11808, 11808 }, -}; -static const URange16 Po_range16[] = { - { 33, 35 }, - { 37, 39 }, - { 42, 42 }, - { 44, 44 }, - { 46, 47 }, - { 58, 59 }, - { 63, 64 }, - { 92, 92 }, - { 161, 161 }, - { 167, 167 }, - { 182, 183 }, - { 191, 191 }, - { 894, 894 }, - { 903, 903 }, - { 1370, 1375 }, - { 1417, 1417 }, - { 1472, 1472 }, - { 1475, 1475 }, - { 1478, 1478 }, - { 1523, 1524 }, - { 1545, 1546 }, - { 1548, 1549 }, - { 1563, 1563 }, - { 1566, 1567 }, - { 1642, 1645 }, - { 1748, 1748 }, - { 1792, 1805 }, - { 2039, 2041 }, - { 2096, 2110 }, - { 2142, 2142 }, - { 2404, 2405 }, - { 2416, 2416 }, - { 2557, 2557 }, - { 2678, 2678 }, - { 2800, 2800 }, - { 3204, 3204 }, - { 3572, 3572 }, - { 3663, 3663 }, - { 3674, 3675 }, - { 3844, 3858 }, - { 3860, 3860 }, - { 3973, 3973 }, - { 4048, 4052 }, - { 4057, 4058 }, - { 4170, 4175 }, - { 4347, 4347 }, - { 4960, 4968 }, - { 5741, 5742 }, - { 5867, 5869 }, - { 5941, 5942 }, - { 6100, 6102 }, - { 6104, 6106 }, - { 6144, 6149 }, - { 6151, 6154 }, - { 6468, 6469 }, - { 6686, 6687 }, - { 6816, 6822 }, - { 6824, 6829 }, - { 7002, 7008 }, - { 7164, 7167 }, - { 7227, 7231 }, - { 7294, 7295 }, - { 7360, 7367 }, - { 7379, 7379 }, - { 8214, 8215 }, - { 8224, 8231 }, - { 8240, 8248 }, - { 8251, 8254 }, - { 8257, 8259 }, - { 8263, 8273 }, - { 8275, 8275 }, - { 8277, 8286 }, - { 11513, 11516 }, - { 11518, 11519 }, - { 11632, 11632 }, - { 11776, 11777 }, - { 11782, 11784 }, - { 11787, 11787 }, - { 11790, 11798 }, - { 11800, 11801 }, - { 11803, 11803 }, - { 11806, 11807 }, - { 11818, 11822 }, - { 11824, 11833 }, - { 11836, 11839 }, - { 11841, 11841 }, - { 11843, 11854 }, - { 12289, 12291 }, - { 12349, 12349 }, - { 12539, 12539 }, - { 42238, 42239 }, - { 42509, 42511 }, - { 42611, 42611 }, - { 42622, 42622 }, - { 42738, 42743 }, - { 43124, 43127 }, - { 43214, 43215 }, - { 43256, 43258 }, - { 43260, 43260 }, - { 43310, 43311 }, - { 43359, 43359 }, - { 43457, 43469 }, - { 43486, 43487 }, - { 43612, 43615 }, - { 43742, 43743 }, - { 43760, 43761 }, - { 44011, 44011 }, - { 65040, 65046 }, - { 65049, 65049 }, - { 65072, 65072 }, - { 65093, 65094 }, - { 65097, 65100 }, - { 65104, 65106 }, - { 65108, 65111 }, - { 65119, 65121 }, - { 65128, 65128 }, - { 65130, 65131 }, - { 65281, 65283 }, - { 65285, 65287 }, - { 65290, 65290 }, - { 65292, 65292 }, - { 65294, 65295 }, - { 65306, 65307 }, - { 65311, 65312 }, - { 65340, 65340 }, - { 65377, 65377 }, - { 65380, 65381 }, -}; -static const URange32 Po_range32[] = { - { 65792, 65794 }, - { 66463, 66463 }, - { 66512, 66512 }, - { 66927, 66927 }, - { 67671, 67671 }, - { 67871, 67871 }, - { 67903, 67903 }, - { 68176, 68184 }, - { 68223, 68223 }, - { 68336, 68342 }, - { 68409, 68415 }, - { 68505, 68508 }, - { 69461, 69465 }, - { 69703, 69709 }, - { 69819, 69820 }, - { 69822, 69825 }, - { 69952, 69955 }, - { 70004, 70005 }, - { 70085, 70088 }, - { 70093, 70093 }, - { 70107, 70107 }, - { 70109, 70111 }, - { 70200, 70205 }, - { 70313, 70313 }, - { 70731, 70735 }, - { 70747, 70747 }, - { 70749, 70749 }, - { 70854, 70854 }, - { 71105, 71127 }, - { 71233, 71235 }, - { 71264, 71276 }, - { 71484, 71486 }, - { 71739, 71739 }, - { 72255, 72262 }, - { 72346, 72348 }, - { 72350, 72354 }, - { 72769, 72773 }, - { 72816, 72817 }, - { 73463, 73464 }, - { 74864, 74868 }, - { 92782, 92783 }, - { 92917, 92917 }, - { 92983, 92987 }, - { 92996, 92996 }, - { 93847, 93850 }, - { 113823, 113823 }, - { 121479, 121483 }, - { 125278, 125279 }, -}; -static const URange16 Me_range16[] = { - { 1160, 1161 }, - { 6846, 6846 }, - { 8413, 8416 }, - { 8418, 8420 }, - { 42608, 42610 }, -}; -static const URange16 C_range16[] = { - { 0, 31 }, - { 127, 159 }, - { 173, 173 }, - { 1536, 1541 }, - { 1564, 1564 }, - { 1757, 1757 }, - { 1807, 1807 }, - { 2274, 2274 }, - { 6158, 6158 }, - { 8203, 8207 }, - { 8234, 8238 }, - { 8288, 8292 }, - { 8294, 8303 }, - { 55296, 63743 }, - { 65279, 65279 }, - { 65529, 65531 }, +static const URange16 M_range16[] = { + { 768, 879 }, + { 1155, 1161 }, + { 1425, 1469 }, + { 1471, 1471 }, + { 1473, 1474 }, + { 1476, 1477 }, + { 1479, 1479 }, + { 1552, 1562 }, + { 1611, 1631 }, + { 1648, 1648 }, + { 1750, 1756 }, + { 1759, 1764 }, + { 1767, 1768 }, + { 1770, 1773 }, + { 1809, 1809 }, + { 1840, 1866 }, + { 1958, 1968 }, + { 2027, 2035 }, + { 2045, 2045 }, + { 2070, 2073 }, + { 2075, 2083 }, + { 2085, 2087 }, + { 2089, 2093 }, + { 2137, 2139 }, + { 2200, 2207 }, + { 2250, 2273 }, + { 2275, 2307 }, + { 2362, 2364 }, + { 2366, 2383 }, + { 2385, 2391 }, + { 2402, 2403 }, + { 2433, 2435 }, + { 2492, 2492 }, + { 2494, 2500 }, + { 2503, 2504 }, + { 2507, 2509 }, + { 2519, 2519 }, + { 2530, 2531 }, + { 2558, 2558 }, + { 2561, 2563 }, + { 2620, 2620 }, + { 2622, 2626 }, + { 2631, 2632 }, + { 2635, 2637 }, + { 2641, 2641 }, + { 2672, 2673 }, + { 2677, 2677 }, + { 2689, 2691 }, + { 2748, 2748 }, + { 2750, 2757 }, + { 2759, 2761 }, + { 2763, 2765 }, + { 2786, 2787 }, + { 2810, 2815 }, + { 2817, 2819 }, + { 2876, 2876 }, + { 2878, 2884 }, + { 2887, 2888 }, + { 2891, 2893 }, + { 2901, 2903 }, + { 2914, 2915 }, + { 2946, 2946 }, + { 3006, 3010 }, + { 3014, 3016 }, + { 3018, 3021 }, + { 3031, 3031 }, + { 3072, 3076 }, + { 3132, 3132 }, + { 3134, 3140 }, + { 3142, 3144 }, + { 3146, 3149 }, + { 3157, 3158 }, + { 3170, 3171 }, + { 3201, 3203 }, + { 3260, 3260 }, + { 3262, 3268 }, + { 3270, 3272 }, + { 3274, 3277 }, + { 3285, 3286 }, + { 3298, 3299 }, + { 3315, 3315 }, + { 3328, 3331 }, + { 3387, 3388 }, + { 3390, 3396 }, + { 3398, 3400 }, + { 3402, 3405 }, + { 3415, 3415 }, + { 3426, 3427 }, + { 3457, 3459 }, + { 3530, 3530 }, + { 3535, 3540 }, + { 3542, 3542 }, + { 3544, 3551 }, + { 3570, 3571 }, + { 3633, 3633 }, + { 3636, 3642 }, + { 3655, 3662 }, + { 3761, 3761 }, + { 3764, 3772 }, + { 3784, 3790 }, + { 3864, 3865 }, + { 3893, 3893 }, + { 3895, 3895 }, + { 3897, 3897 }, + { 3902, 3903 }, + { 3953, 3972 }, + { 3974, 3975 }, + { 3981, 3991 }, + { 3993, 4028 }, + { 4038, 4038 }, + { 4139, 4158 }, + { 4182, 4185 }, + { 4190, 4192 }, + { 4194, 4196 }, + { 4199, 4205 }, + { 4209, 4212 }, + { 4226, 4237 }, + { 4239, 4239 }, + { 4250, 4253 }, + { 4957, 4959 }, + { 5906, 5909 }, + { 5938, 5940 }, + { 5970, 5971 }, + { 6002, 6003 }, + { 6068, 6099 }, + { 6109, 6109 }, + { 6155, 6157 }, + { 6159, 6159 }, + { 6277, 6278 }, + { 6313, 6313 }, + { 6432, 6443 }, + { 6448, 6459 }, + { 6679, 6683 }, + { 6741, 6750 }, + { 6752, 6780 }, + { 6783, 6783 }, + { 6832, 6862 }, + { 6912, 6916 }, + { 6964, 6980 }, + { 7019, 7027 }, + { 7040, 7042 }, + { 7073, 7085 }, + { 7142, 7155 }, + { 7204, 7223 }, + { 7376, 7378 }, + { 7380, 7400 }, + { 7405, 7405 }, + { 7412, 7412 }, + { 7415, 7417 }, + { 7616, 7679 }, + { 8400, 8432 }, + { 11503, 11505 }, + { 11647, 11647 }, + { 11744, 11775 }, + { 12330, 12335 }, + { 12441, 12442 }, + { 42607, 42610 }, + { 42612, 42621 }, + { 42654, 42655 }, + { 42736, 42737 }, + { 43010, 43010 }, + { 43014, 43014 }, + { 43019, 43019 }, + { 43043, 43047 }, + { 43052, 43052 }, + { 43136, 43137 }, + { 43188, 43205 }, + { 43232, 43249 }, + { 43263, 43263 }, + { 43302, 43309 }, + { 43335, 43347 }, + { 43392, 43395 }, + { 43443, 43456 }, + { 43493, 43493 }, + { 43561, 43574 }, + { 43587, 43587 }, + { 43596, 43597 }, + { 43643, 43645 }, + { 43696, 43696 }, + { 43698, 43700 }, + { 43703, 43704 }, + { 43710, 43711 }, + { 43713, 43713 }, + { 43755, 43759 }, + { 43765, 43766 }, + { 44003, 44010 }, + { 44012, 44013 }, + { 64286, 64286 }, + { 65024, 65039 }, + { 65056, 65071 }, }; -static const URange32 C_range32[] = { - { 69821, 69821 }, - { 69837, 69837 }, - { 113824, 113827 }, - { 119155, 119162 }, - { 917505, 917505 }, - { 917536, 917631 }, - { 983040, 1048573 }, - { 1048576, 1114109 }, +static const URange32 M_range32[] = { + { 66045, 66045 }, + { 66272, 66272 }, + { 66422, 66426 }, + { 68097, 68099 }, + { 68101, 68102 }, + { 68108, 68111 }, + { 68152, 68154 }, + { 68159, 68159 }, + { 68325, 68326 }, + { 68900, 68903 }, + { 69291, 69292 }, + { 69373, 69375 }, + { 69446, 69456 }, + { 69506, 69509 }, + { 69632, 69634 }, + { 69688, 69702 }, + { 69744, 69744 }, + { 69747, 69748 }, + { 69759, 69762 }, + { 69808, 69818 }, + { 69826, 69826 }, + { 69888, 69890 }, + { 69927, 69940 }, + { 69957, 69958 }, + { 70003, 70003 }, + { 70016, 70018 }, + { 70067, 70080 }, + { 70089, 70092 }, + { 70094, 70095 }, + { 70188, 70199 }, + { 70206, 70206 }, + { 70209, 70209 }, + { 70367, 70378 }, + { 70400, 70403 }, + { 70459, 70460 }, + { 70462, 70468 }, + { 70471, 70472 }, + { 70475, 70477 }, + { 70487, 70487 }, + { 70498, 70499 }, + { 70502, 70508 }, + { 70512, 70516 }, + { 70709, 70726 }, + { 70750, 70750 }, + { 70832, 70851 }, + { 71087, 71093 }, + { 71096, 71104 }, + { 71132, 71133 }, + { 71216, 71232 }, + { 71339, 71351 }, + { 71453, 71467 }, + { 71724, 71738 }, + { 71984, 71989 }, + { 71991, 71992 }, + { 71995, 71998 }, + { 72000, 72000 }, + { 72002, 72003 }, + { 72145, 72151 }, + { 72154, 72160 }, + { 72164, 72164 }, + { 72193, 72202 }, + { 72243, 72249 }, + { 72251, 72254 }, + { 72263, 72263 }, + { 72273, 72283 }, + { 72330, 72345 }, + { 72751, 72758 }, + { 72760, 72767 }, + { 72850, 72871 }, + { 72873, 72886 }, + { 73009, 73014 }, + { 73018, 73018 }, + { 73020, 73021 }, + { 73023, 73029 }, + { 73031, 73031 }, + { 73098, 73102 }, + { 73104, 73105 }, + { 73107, 73111 }, + { 73459, 73462 }, + { 73472, 73473 }, + { 73475, 73475 }, + { 73524, 73530 }, + { 73534, 73538 }, + { 78912, 78912 }, + { 78919, 78933 }, + { 92912, 92916 }, + { 92976, 92982 }, + { 94031, 94031 }, + { 94033, 94087 }, + { 94095, 94098 }, + { 94180, 94180 }, + { 94192, 94193 }, + { 113821, 113822 }, + { 118528, 118573 }, + { 118576, 118598 }, + { 119141, 119145 }, + { 119149, 119154 }, + { 119163, 119170 }, + { 119173, 119179 }, + { 119210, 119213 }, + { 119362, 119364 }, + { 121344, 121398 }, + { 121403, 121452 }, + { 121461, 121461 }, + { 121476, 121476 }, + { 121499, 121503 }, + { 121505, 121519 }, + { 122880, 122886 }, + { 122888, 122904 }, + { 122907, 122913 }, + { 122915, 122916 }, + { 122918, 122922 }, + { 123023, 123023 }, + { 123184, 123190 }, + { 123566, 123566 }, + { 123628, 123631 }, + { 124140, 124143 }, + { 125136, 125142 }, + { 125252, 125258 }, + { 917760, 917999 }, }; static const URange16 Mc_range16[] = { { 2307, 2307 }, @@ -362695,6 +365695,7 @@ static const URange16 Mc_range16[] = { { 3271, 3272 }, { 3274, 3275 }, { 3285, 3286 }, + { 3315, 3315 }, { 3330, 3331 }, { 3390, 3392 }, { 3398, 3400 }, @@ -362717,6 +365718,8 @@ static const URange16 Mc_range16[] = { { 4231, 4236 }, { 4239, 4239 }, { 4250, 4252 }, + { 5909, 5909 }, + { 5940, 5940 }, { 6070, 6070 }, { 6078, 6085 }, { 6087, 6088 }, @@ -362746,7 +365749,6 @@ static const URange16 Mc_range16[] = { { 7204, 7211 }, { 7220, 7221 }, { 7393, 7393 }, - { 7410, 7411 }, { 7415, 7415 }, { 12334, 12335 }, { 43043, 43044 }, @@ -362757,7 +365759,7 @@ static const URange16 Mc_range16[] = { { 43395, 43395 }, { 43444, 43445 }, { 43450, 43451 }, - { 43453, 43456 }, + { 43454, 43456 }, { 43567, 43568 }, { 43571, 43572 }, { 43597, 43597 }, @@ -362782,6 +365784,7 @@ static const URange32 Mc_range32[] = { { 70018, 70018 }, { 70067, 70069 }, { 70079, 70080 }, + { 70094, 70094 }, { 70188, 70190 }, { 70194, 70195 }, { 70197, 70197 }, @@ -362813,6 +365816,14 @@ static const URange32 Mc_range32[] = { { 71462, 71462 }, { 71724, 71726 }, { 71736, 71736 }, + { 71984, 71989 }, + { 71991, 71992 }, + { 71997, 71997 }, + { 72000, 72000 }, + { 72002, 72002 }, + { 72145, 72147 }, + { 72156, 72159 }, + { 72164, 72164 }, { 72249, 72249 }, { 72279, 72280 }, { 72343, 72343 }, @@ -362825,10 +365836,22 @@ static const URange32 Mc_range32[] = { { 73107, 73108 }, { 73110, 73110 }, { 73461, 73462 }, - { 94033, 94078 }, + { 73475, 73475 }, + { 73524, 73525 }, + { 73534, 73535 }, + { 73537, 73537 }, + { 94033, 94087 }, + { 94192, 94193 }, { 119141, 119142 }, { 119149, 119154 }, }; +static const URange16 Me_range16[] = { + { 1160, 1161 }, + { 6846, 6846 }, + { 8413, 8416 }, + { 8418, 8420 }, + { 42608, 42610 }, +}; static const URange16 Mn_range16[] = { { 768, 879 }, { 1155, 1159 }, @@ -362854,7 +365877,8 @@ static const URange16 Mn_range16[] = { { 2085, 2087 }, { 2089, 2093 }, { 2137, 2139 }, - { 2259, 2273 }, + { 2200, 2207 }, + { 2250, 2273 }, { 2275, 2306 }, { 2362, 2362 }, { 2364, 2364 }, @@ -362888,13 +365912,14 @@ static const URange16 Mn_range16[] = { { 2879, 2879 }, { 2881, 2884 }, { 2893, 2893 }, - { 2902, 2902 }, + { 2901, 2902 }, { 2914, 2915 }, { 2946, 2946 }, { 3008, 3008 }, { 3021, 3021 }, { 3072, 3072 }, { 3076, 3076 }, + { 3132, 3132 }, { 3134, 3136 }, { 3142, 3144 }, { 3146, 3149 }, @@ -362911,6 +365936,7 @@ static const URange16 Mn_range16[] = { { 3393, 3396 }, { 3405, 3405 }, { 3426, 3427 }, + { 3457, 3457 }, { 3530, 3530 }, { 3538, 3540 }, { 3542, 3542 }, @@ -362918,9 +365944,8 @@ static const URange16 Mn_range16[] = { { 3636, 3642 }, { 3655, 3662 }, { 3761, 3761 }, - { 3764, 3769 }, - { 3771, 3772 }, - { 3784, 3789 }, + { 3764, 3772 }, + { 3784, 3790 }, { 3864, 3865 }, { 3893, 3893 }, { 3895, 3895 }, @@ -362944,7 +365969,7 @@ static const URange16 Mn_range16[] = { { 4253, 4253 }, { 4957, 4959 }, { 5906, 5908 }, - { 5938, 5940 }, + { 5938, 5939 }, { 5970, 5971 }, { 6002, 6003 }, { 6068, 6069 }, @@ -362953,6 +365978,7 @@ static const URange16 Mn_range16[] = { { 6089, 6099 }, { 6109, 6109 }, { 6155, 6157 }, + { 6159, 6159 }, { 6277, 6278 }, { 6313, 6313 }, { 6432, 6434 }, @@ -362969,6 +365995,7 @@ static const URange16 Mn_range16[] = { { 6771, 6780 }, { 6783, 6783 }, { 6832, 6845 }, + { 6847, 6862 }, { 6912, 6915 }, { 6964, 6964 }, { 6966, 6970 }, @@ -362991,8 +366018,7 @@ static const URange16 Mn_range16[] = { { 7405, 7405 }, { 7412, 7412 }, { 7416, 7417 }, - { 7616, 7673 }, - { 7675, 7679 }, + { 7616, 7679 }, { 8400, 8412 }, { 8417, 8417 }, { 8421, 8432 }, @@ -363009,6 +366035,7 @@ static const URange16 Mn_range16[] = { { 43014, 43014 }, { 43019, 43019 }, { 43045, 43046 }, + { 43052, 43052 }, { 43204, 43205 }, { 43232, 43249 }, { 43263, 43263 }, @@ -363017,7 +366044,7 @@ static const URange16 Mn_range16[] = { { 43392, 43394 }, { 43443, 43443 }, { 43446, 43449 }, - { 43452, 43452 }, + { 43452, 43453 }, { 43493, 43493 }, { 43561, 43566 }, { 43569, 43570 }, @@ -363050,12 +366077,18 @@ static const URange32 Mn_range32[] = { { 68159, 68159 }, { 68325, 68326 }, { 68900, 68903 }, + { 69291, 69292 }, + { 69373, 69375 }, { 69446, 69456 }, + { 69506, 69509 }, { 69633, 69633 }, { 69688, 69702 }, + { 69744, 69744 }, + { 69747, 69748 }, { 69759, 69761 }, { 69811, 69814 }, { 69817, 69818 }, + { 69826, 69826 }, { 69888, 69890 }, { 69927, 69931 }, { 69933, 69940 }, @@ -363063,10 +366096,12 @@ static const URange32 Mn_range32[] = { { 70016, 70017 }, { 70070, 70078 }, { 70089, 70092 }, + { 70095, 70095 }, { 70191, 70193 }, { 70196, 70196 }, { 70198, 70199 }, { 70206, 70206 }, + { 70209, 70209 }, { 70367, 70367 }, { 70371, 70378 }, { 70400, 70401 }, @@ -363098,6 +366133,12 @@ static const URange32 Mn_range32[] = { { 71463, 71467 }, { 71727, 71735 }, { 71737, 71738 }, + { 71995, 71996 }, + { 71998, 71998 }, + { 72003, 72003 }, + { 72148, 72151 }, + { 72154, 72155 }, + { 72160, 72160 }, { 72193, 72202 }, { 72243, 72248 }, { 72251, 72254 }, @@ -363122,10 +366163,20 @@ static const URange32 Mn_range32[] = { { 73109, 73109 }, { 73111, 73111 }, { 73459, 73460 }, + { 73472, 73473 }, + { 73526, 73530 }, + { 73536, 73536 }, + { 73538, 73538 }, + { 78912, 78912 }, + { 78919, 78933 }, { 92912, 92916 }, { 92976, 92982 }, + { 94031, 94031 }, { 94095, 94098 }, + { 94180, 94180 }, { 113821, 113822 }, + { 118528, 118573 }, + { 118576, 118598 }, { 119143, 119145 }, { 119163, 119170 }, { 119173, 119179 }, @@ -363142,971 +366193,277 @@ static const URange32 Mn_range32[] = { { 122907, 122913 }, { 122915, 122916 }, { 122918, 122922 }, + { 123023, 123023 }, + { 123184, 123190 }, + { 123566, 123566 }, + { 123628, 123631 }, + { 124140, 124143 }, { 125136, 125142 }, { 125252, 125258 }, { 917760, 917999 }, }; -static const URange16 M_range16[] = { - { 768, 879 }, - { 1155, 1161 }, - { 1425, 1469 }, - { 1471, 1471 }, - { 1473, 1474 }, - { 1476, 1477 }, - { 1479, 1479 }, - { 1552, 1562 }, - { 1611, 1631 }, - { 1648, 1648 }, - { 1750, 1756 }, - { 1759, 1764 }, - { 1767, 1768 }, - { 1770, 1773 }, - { 1809, 1809 }, - { 1840, 1866 }, - { 1958, 1968 }, - { 2027, 2035 }, - { 2045, 2045 }, - { 2070, 2073 }, - { 2075, 2083 }, - { 2085, 2087 }, - { 2089, 2093 }, - { 2137, 2139 }, - { 2259, 2273 }, - { 2275, 2307 }, - { 2362, 2364 }, - { 2366, 2383 }, - { 2385, 2391 }, - { 2402, 2403 }, - { 2433, 2435 }, - { 2492, 2492 }, - { 2494, 2500 }, - { 2503, 2504 }, - { 2507, 2509 }, - { 2519, 2519 }, - { 2530, 2531 }, - { 2558, 2558 }, - { 2561, 2563 }, - { 2620, 2620 }, - { 2622, 2626 }, - { 2631, 2632 }, - { 2635, 2637 }, - { 2641, 2641 }, - { 2672, 2673 }, - { 2677, 2677 }, - { 2689, 2691 }, - { 2748, 2748 }, - { 2750, 2757 }, - { 2759, 2761 }, - { 2763, 2765 }, - { 2786, 2787 }, - { 2810, 2815 }, - { 2817, 2819 }, - { 2876, 2876 }, - { 2878, 2884 }, - { 2887, 2888 }, - { 2891, 2893 }, - { 2902, 2903 }, - { 2914, 2915 }, - { 2946, 2946 }, - { 3006, 3010 }, - { 3014, 3016 }, - { 3018, 3021 }, - { 3031, 3031 }, - { 3072, 3076 }, - { 3134, 3140 }, - { 3142, 3144 }, - { 3146, 3149 }, - { 3157, 3158 }, - { 3170, 3171 }, - { 3201, 3203 }, - { 3260, 3260 }, - { 3262, 3268 }, - { 3270, 3272 }, - { 3274, 3277 }, - { 3285, 3286 }, - { 3298, 3299 }, - { 3328, 3331 }, - { 3387, 3388 }, - { 3390, 3396 }, - { 3398, 3400 }, - { 3402, 3405 }, - { 3415, 3415 }, - { 3426, 3427 }, - { 3458, 3459 }, - { 3530, 3530 }, - { 3535, 3540 }, - { 3542, 3542 }, - { 3544, 3551 }, - { 3570, 3571 }, - { 3633, 3633 }, - { 3636, 3642 }, - { 3655, 3662 }, - { 3761, 3761 }, - { 3764, 3769 }, - { 3771, 3772 }, - { 3784, 3789 }, - { 3864, 3865 }, - { 3893, 3893 }, - { 3895, 3895 }, - { 3897, 3897 }, - { 3902, 3903 }, - { 3953, 3972 }, - { 3974, 3975 }, - { 3981, 3991 }, - { 3993, 4028 }, - { 4038, 4038 }, - { 4139, 4158 }, - { 4182, 4185 }, - { 4190, 4192 }, - { 4194, 4196 }, - { 4199, 4205 }, - { 4209, 4212 }, - { 4226, 4237 }, - { 4239, 4239 }, - { 4250, 4253 }, - { 4957, 4959 }, - { 5906, 5908 }, - { 5938, 5940 }, - { 5970, 5971 }, - { 6002, 6003 }, - { 6068, 6099 }, - { 6109, 6109 }, - { 6155, 6157 }, - { 6277, 6278 }, - { 6313, 6313 }, - { 6432, 6443 }, - { 6448, 6459 }, - { 6679, 6683 }, - { 6741, 6750 }, - { 6752, 6780 }, - { 6783, 6783 }, - { 6832, 6846 }, - { 6912, 6916 }, - { 6964, 6980 }, - { 7019, 7027 }, - { 7040, 7042 }, - { 7073, 7085 }, - { 7142, 7155 }, - { 7204, 7223 }, - { 7376, 7378 }, - { 7380, 7400 }, - { 7405, 7405 }, - { 7410, 7412 }, - { 7415, 7417 }, - { 7616, 7673 }, - { 7675, 7679 }, - { 8400, 8432 }, - { 11503, 11505 }, - { 11647, 11647 }, - { 11744, 11775 }, - { 12330, 12335 }, - { 12441, 12442 }, - { 42607, 42610 }, - { 42612, 42621 }, - { 42654, 42655 }, - { 42736, 42737 }, - { 43010, 43010 }, - { 43014, 43014 }, - { 43019, 43019 }, - { 43043, 43047 }, - { 43136, 43137 }, - { 43188, 43205 }, - { 43232, 43249 }, - { 43263, 43263 }, - { 43302, 43309 }, - { 43335, 43347 }, - { 43392, 43395 }, - { 43443, 43456 }, - { 43493, 43493 }, - { 43561, 43574 }, - { 43587, 43587 }, - { 43596, 43597 }, - { 43643, 43645 }, - { 43696, 43696 }, - { 43698, 43700 }, - { 43703, 43704 }, - { 43710, 43711 }, - { 43713, 43713 }, - { 43755, 43759 }, - { 43765, 43766 }, - { 44003, 44010 }, - { 44012, 44013 }, - { 64286, 64286 }, - { 65024, 65039 }, - { 65056, 65071 }, +static const URange16 N_range16[] = { + { 48, 57 }, + { 178, 179 }, + { 185, 185 }, + { 188, 190 }, + { 1632, 1641 }, + { 1776, 1785 }, + { 1984, 1993 }, + { 2406, 2415 }, + { 2534, 2543 }, + { 2548, 2553 }, + { 2662, 2671 }, + { 2790, 2799 }, + { 2918, 2927 }, + { 2930, 2935 }, + { 3046, 3058 }, + { 3174, 3183 }, + { 3192, 3198 }, + { 3302, 3311 }, + { 3416, 3422 }, + { 3430, 3448 }, + { 3558, 3567 }, + { 3664, 3673 }, + { 3792, 3801 }, + { 3872, 3891 }, + { 4160, 4169 }, + { 4240, 4249 }, + { 4969, 4988 }, + { 5870, 5872 }, + { 6112, 6121 }, + { 6128, 6137 }, + { 6160, 6169 }, + { 6470, 6479 }, + { 6608, 6618 }, + { 6784, 6793 }, + { 6800, 6809 }, + { 6992, 7001 }, + { 7088, 7097 }, + { 7232, 7241 }, + { 7248, 7257 }, + { 8304, 8304 }, + { 8308, 8313 }, + { 8320, 8329 }, + { 8528, 8578 }, + { 8581, 8585 }, + { 9312, 9371 }, + { 9450, 9471 }, + { 10102, 10131 }, + { 11517, 11517 }, + { 12295, 12295 }, + { 12321, 12329 }, + { 12344, 12346 }, + { 12690, 12693 }, + { 12832, 12841 }, + { 12872, 12879 }, + { 12881, 12895 }, + { 12928, 12937 }, + { 12977, 12991 }, + { 42528, 42537 }, + { 42726, 42735 }, + { 43056, 43061 }, + { 43216, 43225 }, + { 43264, 43273 }, + { 43472, 43481 }, + { 43504, 43513 }, + { 43600, 43609 }, + { 44016, 44025 }, + { 65296, 65305 }, }; -static const URange32 M_range32[] = { - { 66045, 66045 }, - { 66272, 66272 }, - { 66422, 66426 }, - { 68097, 68099 }, - { 68101, 68102 }, - { 68108, 68111 }, - { 68152, 68154 }, - { 68159, 68159 }, - { 68325, 68326 }, - { 68900, 68903 }, - { 69446, 69456 }, - { 69632, 69634 }, - { 69688, 69702 }, - { 69759, 69762 }, - { 69808, 69818 }, - { 69888, 69890 }, - { 69927, 69940 }, - { 69957, 69958 }, - { 70003, 70003 }, - { 70016, 70018 }, - { 70067, 70080 }, - { 70089, 70092 }, - { 70188, 70199 }, - { 70206, 70206 }, - { 70367, 70378 }, - { 70400, 70403 }, - { 70459, 70460 }, - { 70462, 70468 }, - { 70471, 70472 }, - { 70475, 70477 }, - { 70487, 70487 }, - { 70498, 70499 }, - { 70502, 70508 }, - { 70512, 70516 }, - { 70709, 70726 }, - { 70750, 70750 }, - { 70832, 70851 }, - { 71087, 71093 }, - { 71096, 71104 }, - { 71132, 71133 }, - { 71216, 71232 }, - { 71339, 71351 }, - { 71453, 71467 }, - { 71724, 71738 }, - { 72193, 72202 }, - { 72243, 72249 }, - { 72251, 72254 }, - { 72263, 72263 }, - { 72273, 72283 }, - { 72330, 72345 }, - { 72751, 72758 }, - { 72760, 72767 }, - { 72850, 72871 }, - { 72873, 72886 }, - { 73009, 73014 }, - { 73018, 73018 }, - { 73020, 73021 }, - { 73023, 73029 }, - { 73031, 73031 }, - { 73098, 73102 }, - { 73104, 73105 }, - { 73107, 73111 }, - { 73459, 73462 }, - { 92912, 92916 }, - { 92976, 92982 }, - { 94033, 94078 }, - { 94095, 94098 }, - { 113821, 113822 }, - { 119141, 119145 }, - { 119149, 119154 }, - { 119163, 119170 }, - { 119173, 119179 }, - { 119210, 119213 }, - { 119362, 119364 }, - { 121344, 121398 }, - { 121403, 121452 }, - { 121461, 121461 }, - { 121476, 121476 }, - { 121499, 121503 }, - { 121505, 121519 }, - { 122880, 122886 }, - { 122888, 122904 }, - { 122907, 122913 }, - { 122915, 122916 }, - { 122918, 122922 }, - { 125136, 125142 }, - { 125252, 125258 }, - { 917760, 917999 }, +static const URange32 N_range32[] = { + { 65799, 65843 }, + { 65856, 65912 }, + { 65930, 65931 }, + { 66273, 66299 }, + { 66336, 66339 }, + { 66369, 66369 }, + { 66378, 66378 }, + { 66513, 66517 }, + { 66720, 66729 }, + { 67672, 67679 }, + { 67705, 67711 }, + { 67751, 67759 }, + { 67835, 67839 }, + { 67862, 67867 }, + { 68028, 68029 }, + { 68032, 68047 }, + { 68050, 68095 }, + { 68160, 68168 }, + { 68221, 68222 }, + { 68253, 68255 }, + { 68331, 68335 }, + { 68440, 68447 }, + { 68472, 68479 }, + { 68521, 68527 }, + { 68858, 68863 }, + { 68912, 68921 }, + { 69216, 69246 }, + { 69405, 69414 }, + { 69457, 69460 }, + { 69573, 69579 }, + { 69714, 69743 }, + { 69872, 69881 }, + { 69942, 69951 }, + { 70096, 70105 }, + { 70113, 70132 }, + { 70384, 70393 }, + { 70736, 70745 }, + { 70864, 70873 }, + { 71248, 71257 }, + { 71360, 71369 }, + { 71472, 71483 }, + { 71904, 71922 }, + { 72016, 72025 }, + { 72784, 72812 }, + { 73040, 73049 }, + { 73120, 73129 }, + { 73552, 73561 }, + { 73664, 73684 }, + { 74752, 74862 }, + { 92768, 92777 }, + { 92864, 92873 }, + { 93008, 93017 }, + { 93019, 93025 }, + { 93824, 93846 }, + { 119488, 119507 }, + { 119520, 119539 }, + { 119648, 119672 }, + { 120782, 120831 }, + { 123200, 123209 }, + { 123632, 123641 }, + { 124144, 124153 }, + { 125127, 125135 }, + { 125264, 125273 }, + { 126065, 126123 }, + { 126125, 126127 }, + { 126129, 126132 }, + { 126209, 126253 }, + { 126255, 126269 }, + { 127232, 127244 }, + { 130032, 130041 }, }; -static const URange16 L_range16[] = { - { 65, 90 }, - { 97, 122 }, - { 170, 170 }, - { 181, 181 }, - { 186, 186 }, - { 192, 214 }, - { 216, 246 }, - { 248, 705 }, - { 710, 721 }, - { 736, 740 }, - { 748, 748 }, - { 750, 750 }, - { 880, 884 }, - { 886, 887 }, - { 890, 893 }, - { 895, 895 }, - { 902, 902 }, - { 904, 906 }, - { 908, 908 }, - { 910, 929 }, - { 931, 1013 }, - { 1015, 1153 }, - { 1162, 1327 }, - { 1329, 1366 }, - { 1369, 1369 }, - { 1376, 1416 }, - { 1488, 1514 }, - { 1519, 1522 }, - { 1568, 1610 }, - { 1646, 1647 }, - { 1649, 1747 }, - { 1749, 1749 }, - { 1765, 1766 }, - { 1774, 1775 }, - { 1786, 1788 }, - { 1791, 1791 }, - { 1808, 1808 }, - { 1810, 1839 }, - { 1869, 1957 }, - { 1969, 1969 }, - { 1994, 2026 }, - { 2036, 2037 }, - { 2042, 2042 }, - { 2048, 2069 }, - { 2074, 2074 }, - { 2084, 2084 }, - { 2088, 2088 }, - { 2112, 2136 }, - { 2144, 2154 }, - { 2208, 2228 }, - { 2230, 2237 }, - { 2308, 2361 }, - { 2365, 2365 }, - { 2384, 2384 }, - { 2392, 2401 }, - { 2417, 2432 }, - { 2437, 2444 }, - { 2447, 2448 }, - { 2451, 2472 }, - { 2474, 2480 }, - { 2482, 2482 }, - { 2486, 2489 }, - { 2493, 2493 }, - { 2510, 2510 }, - { 2524, 2525 }, - { 2527, 2529 }, - { 2544, 2545 }, - { 2556, 2556 }, - { 2565, 2570 }, - { 2575, 2576 }, - { 2579, 2600 }, - { 2602, 2608 }, - { 2610, 2611 }, - { 2613, 2614 }, - { 2616, 2617 }, - { 2649, 2652 }, - { 2654, 2654 }, - { 2674, 2676 }, - { 2693, 2701 }, - { 2703, 2705 }, - { 2707, 2728 }, - { 2730, 2736 }, - { 2738, 2739 }, - { 2741, 2745 }, - { 2749, 2749 }, - { 2768, 2768 }, - { 2784, 2785 }, - { 2809, 2809 }, - { 2821, 2828 }, - { 2831, 2832 }, - { 2835, 2856 }, - { 2858, 2864 }, - { 2866, 2867 }, - { 2869, 2873 }, - { 2877, 2877 }, - { 2908, 2909 }, - { 2911, 2913 }, - { 2929, 2929 }, - { 2947, 2947 }, - { 2949, 2954 }, - { 2958, 2960 }, - { 2962, 2965 }, - { 2969, 2970 }, - { 2972, 2972 }, - { 2974, 2975 }, - { 2979, 2980 }, - { 2984, 2986 }, - { 2990, 3001 }, - { 3024, 3024 }, - { 3077, 3084 }, - { 3086, 3088 }, - { 3090, 3112 }, - { 3114, 3129 }, - { 3133, 3133 }, - { 3160, 3162 }, - { 3168, 3169 }, - { 3200, 3200 }, - { 3205, 3212 }, - { 3214, 3216 }, - { 3218, 3240 }, - { 3242, 3251 }, - { 3253, 3257 }, - { 3261, 3261 }, - { 3294, 3294 }, - { 3296, 3297 }, - { 3313, 3314 }, - { 3333, 3340 }, - { 3342, 3344 }, - { 3346, 3386 }, - { 3389, 3389 }, - { 3406, 3406 }, - { 3412, 3414 }, - { 3423, 3425 }, - { 3450, 3455 }, - { 3461, 3478 }, - { 3482, 3505 }, - { 3507, 3515 }, - { 3517, 3517 }, - { 3520, 3526 }, - { 3585, 3632 }, - { 3634, 3635 }, - { 3648, 3654 }, - { 3713, 3714 }, - { 3716, 3716 }, - { 3719, 3720 }, - { 3722, 3722 }, - { 3725, 3725 }, - { 3732, 3735 }, - { 3737, 3743 }, - { 3745, 3747 }, - { 3749, 3749 }, - { 3751, 3751 }, - { 3754, 3755 }, - { 3757, 3760 }, - { 3762, 3763 }, - { 3773, 3773 }, - { 3776, 3780 }, - { 3782, 3782 }, - { 3804, 3807 }, - { 3840, 3840 }, - { 3904, 3911 }, - { 3913, 3948 }, - { 3976, 3980 }, - { 4096, 4138 }, - { 4159, 4159 }, - { 4176, 4181 }, - { 4186, 4189 }, - { 4193, 4193 }, - { 4197, 4198 }, - { 4206, 4208 }, - { 4213, 4225 }, - { 4238, 4238 }, - { 4256, 4293 }, - { 4295, 4295 }, - { 4301, 4301 }, - { 4304, 4346 }, - { 4348, 4680 }, - { 4682, 4685 }, - { 4688, 4694 }, - { 4696, 4696 }, - { 4698, 4701 }, - { 4704, 4744 }, - { 4746, 4749 }, - { 4752, 4784 }, - { 4786, 4789 }, - { 4792, 4798 }, - { 4800, 4800 }, - { 4802, 4805 }, - { 4808, 4822 }, - { 4824, 4880 }, - { 4882, 4885 }, - { 4888, 4954 }, - { 4992, 5007 }, - { 5024, 5109 }, - { 5112, 5117 }, - { 5121, 5740 }, - { 5743, 5759 }, - { 5761, 5786 }, - { 5792, 5866 }, - { 5873, 5880 }, - { 5888, 5900 }, - { 5902, 5905 }, - { 5920, 5937 }, - { 5952, 5969 }, - { 5984, 5996 }, - { 5998, 6000 }, - { 6016, 6067 }, - { 6103, 6103 }, - { 6108, 6108 }, - { 6176, 6264 }, - { 6272, 6276 }, - { 6279, 6312 }, - { 6314, 6314 }, - { 6320, 6389 }, - { 6400, 6430 }, - { 6480, 6509 }, - { 6512, 6516 }, - { 6528, 6571 }, - { 6576, 6601 }, - { 6656, 6678 }, - { 6688, 6740 }, - { 6823, 6823 }, - { 6917, 6963 }, - { 6981, 6987 }, - { 7043, 7072 }, - { 7086, 7087 }, - { 7098, 7141 }, - { 7168, 7203 }, - { 7245, 7247 }, - { 7258, 7293 }, - { 7296, 7304 }, - { 7312, 7354 }, - { 7357, 7359 }, - { 7401, 7404 }, - { 7406, 7409 }, - { 7413, 7414 }, - { 7424, 7615 }, - { 7680, 7957 }, - { 7960, 7965 }, - { 7968, 8005 }, - { 8008, 8013 }, - { 8016, 8023 }, - { 8025, 8025 }, - { 8027, 8027 }, - { 8029, 8029 }, - { 8031, 8061 }, - { 8064, 8116 }, - { 8118, 8124 }, - { 8126, 8126 }, - { 8130, 8132 }, - { 8134, 8140 }, - { 8144, 8147 }, - { 8150, 8155 }, - { 8160, 8172 }, - { 8178, 8180 }, - { 8182, 8188 }, - { 8305, 8305 }, - { 8319, 8319 }, - { 8336, 8348 }, - { 8450, 8450 }, - { 8455, 8455 }, - { 8458, 8467 }, - { 8469, 8469 }, - { 8473, 8477 }, - { 8484, 8484 }, - { 8486, 8486 }, - { 8488, 8488 }, - { 8490, 8493 }, - { 8495, 8505 }, - { 8508, 8511 }, - { 8517, 8521 }, - { 8526, 8526 }, - { 8579, 8580 }, - { 11264, 11310 }, - { 11312, 11358 }, - { 11360, 11492 }, - { 11499, 11502 }, - { 11506, 11507 }, - { 11520, 11557 }, - { 11559, 11559 }, - { 11565, 11565 }, - { 11568, 11623 }, - { 11631, 11631 }, - { 11648, 11670 }, - { 11680, 11686 }, - { 11688, 11694 }, - { 11696, 11702 }, - { 11704, 11710 }, - { 11712, 11718 }, - { 11720, 11726 }, - { 11728, 11734 }, - { 11736, 11742 }, - { 11823, 11823 }, - { 12293, 12294 }, - { 12337, 12341 }, - { 12347, 12348 }, - { 12353, 12438 }, - { 12445, 12447 }, - { 12449, 12538 }, - { 12540, 12543 }, - { 12549, 12591 }, - { 12593, 12686 }, - { 12704, 12730 }, - { 12784, 12799 }, - { 13312, 19893 }, - { 19968, 40943 }, - { 40960, 42124 }, - { 42192, 42237 }, - { 42240, 42508 }, - { 42512, 42527 }, - { 42538, 42539 }, - { 42560, 42606 }, - { 42623, 42653 }, - { 42656, 42725 }, - { 42775, 42783 }, - { 42786, 42888 }, - { 42891, 42937 }, - { 42999, 43009 }, - { 43011, 43013 }, - { 43015, 43018 }, - { 43020, 43042 }, - { 43072, 43123 }, - { 43138, 43187 }, - { 43250, 43255 }, - { 43259, 43259 }, - { 43261, 43262 }, - { 43274, 43301 }, - { 43312, 43334 }, - { 43360, 43388 }, - { 43396, 43442 }, - { 43471, 43471 }, - { 43488, 43492 }, - { 43494, 43503 }, - { 43514, 43518 }, - { 43520, 43560 }, - { 43584, 43586 }, - { 43588, 43595 }, - { 43616, 43638 }, - { 43642, 43642 }, - { 43646, 43695 }, - { 43697, 43697 }, - { 43701, 43702 }, - { 43705, 43709 }, - { 43712, 43712 }, - { 43714, 43714 }, - { 43739, 43741 }, - { 43744, 43754 }, - { 43762, 43764 }, - { 43777, 43782 }, - { 43785, 43790 }, - { 43793, 43798 }, - { 43808, 43814 }, - { 43816, 43822 }, - { 43824, 43866 }, - { 43868, 43877 }, - { 43888, 44002 }, - { 44032, 55203 }, - { 55216, 55238 }, - { 55243, 55291 }, - { 63744, 64109 }, - { 64112, 64217 }, - { 64256, 64262 }, - { 64275, 64279 }, - { 64285, 64285 }, - { 64287, 64296 }, - { 64298, 64310 }, - { 64312, 64316 }, - { 64318, 64318 }, - { 64320, 64321 }, - { 64323, 64324 }, - { 64326, 64433 }, - { 64467, 64829 }, - { 64848, 64911 }, - { 64914, 64967 }, - { 65008, 65019 }, - { 65136, 65140 }, - { 65142, 65276 }, - { 65313, 65338 }, - { 65345, 65370 }, - { 65382, 65470 }, - { 65474, 65479 }, - { 65482, 65487 }, - { 65490, 65495 }, - { 65498, 65500 }, -}; -static const URange32 L_range32[] = { - { 65536, 65547 }, - { 65549, 65574 }, - { 65576, 65594 }, - { 65596, 65597 }, - { 65599, 65613 }, - { 65616, 65629 }, - { 65664, 65786 }, - { 66176, 66204 }, - { 66208, 66256 }, - { 66304, 66335 }, - { 66349, 66368 }, - { 66370, 66377 }, - { 66384, 66421 }, - { 66432, 66461 }, - { 66464, 66499 }, - { 66504, 66511 }, - { 66560, 66717 }, - { 66736, 66771 }, - { 66776, 66811 }, - { 66816, 66855 }, - { 66864, 66915 }, - { 67072, 67382 }, - { 67392, 67413 }, - { 67424, 67431 }, - { 67584, 67589 }, - { 67592, 67592 }, - { 67594, 67637 }, - { 67639, 67640 }, - { 67644, 67644 }, - { 67647, 67669 }, - { 67680, 67702 }, - { 67712, 67742 }, - { 67808, 67826 }, - { 67828, 67829 }, - { 67840, 67861 }, - { 67872, 67897 }, - { 67968, 68023 }, - { 68030, 68031 }, - { 68096, 68096 }, - { 68112, 68115 }, - { 68117, 68119 }, - { 68121, 68149 }, - { 68192, 68220 }, - { 68224, 68252 }, - { 68288, 68295 }, - { 68297, 68324 }, - { 68352, 68405 }, - { 68416, 68437 }, - { 68448, 68466 }, - { 68480, 68497 }, - { 68608, 68680 }, - { 68736, 68786 }, - { 68800, 68850 }, - { 68864, 68899 }, - { 69376, 69404 }, - { 69415, 69415 }, - { 69424, 69445 }, - { 69635, 69687 }, - { 69763, 69807 }, - { 69840, 69864 }, - { 69891, 69926 }, - { 69956, 69956 }, - { 69968, 70002 }, - { 70006, 70006 }, - { 70019, 70066 }, - { 70081, 70084 }, - { 70106, 70106 }, - { 70108, 70108 }, - { 70144, 70161 }, - { 70163, 70187 }, - { 70272, 70278 }, - { 70280, 70280 }, - { 70282, 70285 }, - { 70287, 70301 }, - { 70303, 70312 }, - { 70320, 70366 }, - { 70405, 70412 }, - { 70415, 70416 }, - { 70419, 70440 }, - { 70442, 70448 }, - { 70450, 70451 }, - { 70453, 70457 }, - { 70461, 70461 }, - { 70480, 70480 }, - { 70493, 70497 }, - { 70656, 70708 }, - { 70727, 70730 }, - { 70784, 70831 }, - { 70852, 70853 }, - { 70855, 70855 }, - { 71040, 71086 }, - { 71128, 71131 }, - { 71168, 71215 }, - { 71236, 71236 }, - { 71296, 71338 }, - { 71424, 71450 }, - { 71680, 71723 }, - { 71840, 71903 }, - { 71935, 71935 }, - { 72192, 72192 }, - { 72203, 72242 }, - { 72250, 72250 }, - { 72272, 72272 }, - { 72284, 72323 }, - { 72326, 72329 }, - { 72349, 72349 }, - { 72384, 72440 }, - { 72704, 72712 }, - { 72714, 72750 }, - { 72768, 72768 }, - { 72818, 72847 }, - { 72960, 72966 }, - { 72968, 72969 }, - { 72971, 73008 }, - { 73030, 73030 }, - { 73056, 73061 }, - { 73063, 73064 }, - { 73066, 73097 }, - { 73112, 73112 }, - { 73440, 73458 }, - { 73728, 74649 }, - { 74880, 75075 }, - { 77824, 78894 }, - { 82944, 83526 }, - { 92160, 92728 }, - { 92736, 92766 }, - { 92880, 92909 }, - { 92928, 92975 }, - { 92992, 92995 }, - { 93027, 93047 }, - { 93053, 93071 }, - { 93760, 93823 }, - { 93952, 94020 }, - { 94032, 94032 }, - { 94099, 94111 }, - { 94176, 94177 }, - { 94208, 100337 }, - { 100352, 101106 }, - { 110592, 110878 }, - { 110960, 111355 }, - { 113664, 113770 }, - { 113776, 113788 }, - { 113792, 113800 }, - { 113808, 113817 }, - { 119808, 119892 }, - { 119894, 119964 }, - { 119966, 119967 }, - { 119970, 119970 }, - { 119973, 119974 }, - { 119977, 119980 }, - { 119982, 119993 }, - { 119995, 119995 }, - { 119997, 120003 }, - { 120005, 120069 }, - { 120071, 120074 }, - { 120077, 120084 }, - { 120086, 120092 }, - { 120094, 120121 }, - { 120123, 120126 }, - { 120128, 120132 }, - { 120134, 120134 }, - { 120138, 120144 }, - { 120146, 120485 }, - { 120488, 120512 }, - { 120514, 120538 }, - { 120540, 120570 }, - { 120572, 120596 }, - { 120598, 120628 }, - { 120630, 120654 }, - { 120656, 120686 }, - { 120688, 120712 }, - { 120714, 120744 }, - { 120746, 120770 }, - { 120772, 120779 }, - { 124928, 125124 }, - { 125184, 125251 }, - { 126464, 126467 }, - { 126469, 126495 }, - { 126497, 126498 }, - { 126500, 126500 }, - { 126503, 126503 }, - { 126505, 126514 }, - { 126516, 126519 }, - { 126521, 126521 }, - { 126523, 126523 }, - { 126530, 126530 }, - { 126535, 126535 }, - { 126537, 126537 }, - { 126539, 126539 }, - { 126541, 126543 }, - { 126545, 126546 }, - { 126548, 126548 }, - { 126551, 126551 }, - { 126553, 126553 }, - { 126555, 126555 }, - { 126557, 126557 }, - { 126559, 126559 }, - { 126561, 126562 }, - { 126564, 126564 }, - { 126567, 126570 }, - { 126572, 126578 }, - { 126580, 126583 }, - { 126585, 126588 }, - { 126590, 126590 }, - { 126592, 126601 }, - { 126603, 126619 }, - { 126625, 126627 }, - { 126629, 126633 }, - { 126635, 126651 }, - { 131072, 173782 }, - { 173824, 177972 }, - { 177984, 178205 }, - { 178208, 183969 }, - { 183984, 191456 }, - { 194560, 195101 }, -}; -static const URange16 N_range16[] = { +static const URange16 Nd_range16[] = { { 48, 57 }, - { 178, 179 }, - { 185, 185 }, - { 188, 190 }, { 1632, 1641 }, { 1776, 1785 }, { 1984, 1993 }, { 2406, 2415 }, { 2534, 2543 }, - { 2548, 2553 }, { 2662, 2671 }, { 2790, 2799 }, { 2918, 2927 }, - { 2930, 2935 }, - { 3046, 3058 }, + { 3046, 3055 }, { 3174, 3183 }, - { 3192, 3198 }, { 3302, 3311 }, - { 3416, 3422 }, - { 3430, 3448 }, + { 3430, 3439 }, { 3558, 3567 }, { 3664, 3673 }, { 3792, 3801 }, - { 3872, 3891 }, + { 3872, 3881 }, { 4160, 4169 }, { 4240, 4249 }, - { 4969, 4988 }, - { 5870, 5872 }, { 6112, 6121 }, - { 6128, 6137 }, { 6160, 6169 }, { 6470, 6479 }, - { 6608, 6618 }, + { 6608, 6617 }, { 6784, 6793 }, { 6800, 6809 }, { 6992, 7001 }, { 7088, 7097 }, { 7232, 7241 }, { 7248, 7257 }, + { 42528, 42537 }, + { 43216, 43225 }, + { 43264, 43273 }, + { 43472, 43481 }, + { 43504, 43513 }, + { 43600, 43609 }, + { 44016, 44025 }, + { 65296, 65305 }, +}; +static const URange32 Nd_range32[] = { + { 66720, 66729 }, + { 68912, 68921 }, + { 69734, 69743 }, + { 69872, 69881 }, + { 69942, 69951 }, + { 70096, 70105 }, + { 70384, 70393 }, + { 70736, 70745 }, + { 70864, 70873 }, + { 71248, 71257 }, + { 71360, 71369 }, + { 71472, 71481 }, + { 71904, 71913 }, + { 72016, 72025 }, + { 72784, 72793 }, + { 73040, 73049 }, + { 73120, 73129 }, + { 73552, 73561 }, + { 92768, 92777 }, + { 92864, 92873 }, + { 93008, 93017 }, + { 120782, 120831 }, + { 123200, 123209 }, + { 123632, 123641 }, + { 124144, 124153 }, + { 125264, 125273 }, + { 130032, 130041 }, +}; +static const URange16 Nl_range16[] = { + { 5870, 5872 }, + { 8544, 8578 }, + { 8581, 8584 }, + { 12295, 12295 }, + { 12321, 12329 }, + { 12344, 12346 }, + { 42726, 42735 }, +}; +static const URange32 Nl_range32[] = { + { 65856, 65908 }, + { 66369, 66369 }, + { 66378, 66378 }, + { 66513, 66517 }, + { 74752, 74862 }, +}; +static const URange16 No_range16[] = { + { 178, 179 }, + { 185, 185 }, + { 188, 190 }, + { 2548, 2553 }, + { 2930, 2935 }, + { 3056, 3058 }, + { 3192, 3198 }, + { 3416, 3422 }, + { 3440, 3448 }, + { 3882, 3891 }, + { 4969, 4988 }, + { 6128, 6137 }, + { 6618, 6618 }, { 8304, 8304 }, { 8308, 8313 }, { 8320, 8329 }, - { 8528, 8578 }, - { 8581, 8585 }, + { 8528, 8543 }, + { 8585, 8585 }, { 9312, 9371 }, { 9450, 9471 }, { 10102, 10131 }, { 11517, 11517 }, - { 12295, 12295 }, - { 12321, 12329 }, - { 12344, 12346 }, { 12690, 12693 }, { 12832, 12841 }, { 12872, 12879 }, { 12881, 12895 }, { 12928, 12937 }, { 12977, 12991 }, - { 42528, 42537 }, - { 42726, 42735 }, { 43056, 43061 }, - { 43216, 43225 }, - { 43264, 43273 }, - { 43472, 43481 }, - { 43504, 43513 }, - { 43600, 43609 }, - { 44016, 44025 }, - { 65296, 65305 }, }; -static const URange32 N_range32[] = { +static const URange32 No_range32[] = { { 65799, 65843 }, - { 65856, 65912 }, + { 65909, 65912 }, { 65930, 65931 }, { 66273, 66299 }, { 66336, 66339 }, - { 66369, 66369 }, - { 66378, 66378 }, - { 66513, 66517 }, - { 66720, 66729 }, { 67672, 67679 }, { 67705, 67711 }, { 67751, 67759 }, @@ -364123,73 +366480,29 @@ static const URange32 N_range32[] = { { 68472, 68479 }, { 68521, 68527 }, { 68858, 68863 }, - { 68912, 68921 }, { 69216, 69246 }, { 69405, 69414 }, { 69457, 69460 }, - { 69714, 69743 }, - { 69872, 69881 }, - { 69942, 69951 }, - { 70096, 70105 }, + { 69573, 69579 }, + { 69714, 69733 }, { 70113, 70132 }, - { 70384, 70393 }, - { 70736, 70745 }, - { 70864, 70873 }, - { 71248, 71257 }, - { 71360, 71369 }, - { 71472, 71483 }, - { 71904, 71922 }, - { 72784, 72812 }, - { 73040, 73049 }, - { 73120, 73129 }, - { 74752, 74862 }, - { 92768, 92777 }, - { 93008, 93017 }, + { 71482, 71483 }, + { 71914, 71922 }, + { 72794, 72812 }, + { 73664, 73684 }, { 93019, 93025 }, { 93824, 93846 }, + { 119488, 119507 }, { 119520, 119539 }, { 119648, 119672 }, - { 120782, 120831 }, { 125127, 125135 }, - { 125264, 125273 }, { 126065, 126123 }, { 126125, 126127 }, { 126129, 126132 }, + { 126209, 126253 }, + { 126255, 126269 }, { 127232, 127244 }, }; -static const URange16 Sk_range16[] = { - { 94, 94 }, - { 96, 96 }, - { 168, 168 }, - { 175, 175 }, - { 180, 180 }, - { 184, 184 }, - { 706, 709 }, - { 722, 735 }, - { 741, 747 }, - { 749, 749 }, - { 751, 767 }, - { 885, 885 }, - { 900, 901 }, - { 8125, 8125 }, - { 8127, 8129 }, - { 8141, 8143 }, - { 8157, 8159 }, - { 8173, 8175 }, - { 8189, 8190 }, - { 12443, 12444 }, - { 42752, 42774 }, - { 42784, 42785 }, - { 42889, 42890 }, - { 43867, 43867 }, - { 64434, 64449 }, - { 65342, 65342 }, - { 65344, 65344 }, - { 65507, 65507 }, -}; -static const URange32 Sk_range32[] = { - { 127995, 127999 }, -}; static const URange16 P_range16[] = { { 33, 35 }, { 37, 42 }, @@ -364218,7 +366531,7 @@ static const URange16 P_range16[] = { { 1545, 1546 }, { 1548, 1549 }, { 1563, 1563 }, - { 1566, 1567 }, + { 1565, 1567 }, { 1642, 1645 }, { 1748, 1748 }, { 1792, 1805 }, @@ -364230,6 +366543,7 @@ static const URange16 P_range16[] = { { 2557, 2557 }, { 2678, 2678 }, { 2800, 2800 }, + { 3191, 3191 }, { 3204, 3204 }, { 3572, 3572 }, { 3663, 3663 }, @@ -364244,7 +366558,7 @@ static const URange16 P_range16[] = { { 4347, 4347 }, { 4960, 4968 }, { 5120, 5120 }, - { 5741, 5742 }, + { 5742, 5742 }, { 5787, 5788 }, { 5867, 5869 }, { 5941, 5942 }, @@ -364256,6 +366570,7 @@ static const URange16 P_range16[] = { { 6816, 6822 }, { 6824, 6829 }, { 7002, 7008 }, + { 7037, 7038 }, { 7164, 7167 }, { 7227, 7231 }, { 7294, 7295 }, @@ -364279,7 +366594,8 @@ static const URange16 P_range16[] = { { 11518, 11519 }, { 11632, 11632 }, { 11776, 11822 }, - { 11824, 11854 }, + { 11824, 11855 }, + { 11858, 11869 }, { 12289, 12291 }, { 12296, 12305 }, { 12308, 12319 }, @@ -364335,7 +366651,9 @@ static const URange32 P_range32[] = { { 68336, 68342 }, { 68409, 68415 }, { 68505, 68508 }, + { 69293, 69293 }, { 69461, 69465 }, + { 69510, 69513 }, { 69703, 69709 }, { 69819, 69820 }, { 69822, 69825 }, @@ -364348,431 +366666,739 @@ static const URange32 P_range32[] = { { 70200, 70205 }, { 70313, 70313 }, { 70731, 70735 }, - { 70747, 70747 }, + { 70746, 70747 }, { 70749, 70749 }, { 70854, 70854 }, { 71105, 71127 }, { 71233, 71235 }, { 71264, 71276 }, + { 71353, 71353 }, { 71484, 71486 }, { 71739, 71739 }, + { 72004, 72006 }, + { 72162, 72162 }, { 72255, 72262 }, { 72346, 72348 }, { 72350, 72354 }, + { 72448, 72457 }, { 72769, 72773 }, { 72816, 72817 }, { 73463, 73464 }, + { 73539, 73551 }, + { 73727, 73727 }, { 74864, 74868 }, + { 77809, 77810 }, { 92782, 92783 }, { 92917, 92917 }, { 92983, 92987 }, { 92996, 92996 }, { 93847, 93850 }, + { 94178, 94178 }, { 113823, 113823 }, { 121479, 121483 }, { 125278, 125279 }, }; -static const URange16 S_range16[] = { - { 36, 36 }, - { 43, 43 }, - { 60, 62 }, - { 94, 94 }, - { 96, 96 }, - { 124, 124 }, - { 126, 126 }, - { 162, 166 }, - { 168, 169 }, - { 172, 172 }, - { 174, 177 }, - { 180, 180 }, - { 184, 184 }, - { 215, 215 }, - { 247, 247 }, - { 706, 709 }, - { 722, 735 }, - { 741, 747 }, - { 749, 749 }, - { 751, 767 }, - { 885, 885 }, - { 900, 901 }, - { 1014, 1014 }, - { 1154, 1154 }, - { 1421, 1423 }, - { 1542, 1544 }, - { 1547, 1547 }, - { 1550, 1551 }, - { 1758, 1758 }, - { 1769, 1769 }, - { 1789, 1790 }, - { 2038, 2038 }, - { 2046, 2047 }, - { 2546, 2547 }, - { 2554, 2555 }, - { 2801, 2801 }, - { 2928, 2928 }, - { 3059, 3066 }, - { 3199, 3199 }, - { 3407, 3407 }, - { 3449, 3449 }, - { 3647, 3647 }, - { 3841, 3843 }, - { 3859, 3859 }, - { 3861, 3863 }, - { 3866, 3871 }, - { 3892, 3892 }, - { 3894, 3894 }, - { 3896, 3896 }, - { 4030, 4037 }, - { 4039, 4044 }, - { 4046, 4047 }, - { 4053, 4056 }, - { 4254, 4255 }, - { 5008, 5017 }, - { 6107, 6107 }, - { 6464, 6464 }, - { 6622, 6655 }, - { 7009, 7018 }, - { 7028, 7036 }, - { 8125, 8125 }, - { 8127, 8129 }, - { 8141, 8143 }, - { 8157, 8159 }, - { 8173, 8175 }, - { 8189, 8190 }, - { 8260, 8260 }, - { 8274, 8274 }, - { 8314, 8316 }, - { 8330, 8332 }, - { 8352, 8383 }, - { 8448, 8449 }, - { 8451, 8454 }, - { 8456, 8457 }, - { 8468, 8468 }, - { 8470, 8472 }, - { 8478, 8483 }, - { 8485, 8485 }, - { 8487, 8487 }, - { 8489, 8489 }, - { 8494, 8494 }, - { 8506, 8507 }, - { 8512, 8516 }, - { 8522, 8525 }, - { 8527, 8527 }, - { 8586, 8587 }, - { 8592, 8967 }, - { 8972, 9000 }, - { 9003, 9254 }, - { 9280, 9290 }, - { 9372, 9449 }, - { 9472, 10087 }, - { 10132, 10180 }, - { 10183, 10213 }, - { 10224, 10626 }, - { 10649, 10711 }, - { 10716, 10747 }, - { 10750, 11123 }, - { 11126, 11157 }, - { 11160, 11208 }, - { 11210, 11262 }, - { 11493, 11498 }, - { 11904, 11929 }, - { 11931, 12019 }, - { 12032, 12245 }, - { 12272, 12283 }, - { 12292, 12292 }, - { 12306, 12307 }, - { 12320, 12320 }, - { 12342, 12343 }, - { 12350, 12351 }, - { 12443, 12444 }, - { 12688, 12689 }, - { 12694, 12703 }, - { 12736, 12771 }, - { 12800, 12830 }, - { 12842, 12871 }, - { 12880, 12880 }, - { 12896, 12927 }, - { 12938, 12976 }, - { 12992, 13054 }, - { 13056, 13311 }, - { 19904, 19967 }, - { 42128, 42182 }, - { 42752, 42774 }, - { 42784, 42785 }, - { 42889, 42890 }, - { 43048, 43051 }, - { 43062, 43065 }, - { 43639, 43641 }, - { 43867, 43867 }, - { 64297, 64297 }, - { 64434, 64449 }, - { 65020, 65021 }, - { 65122, 65122 }, - { 65124, 65126 }, - { 65129, 65129 }, - { 65284, 65284 }, - { 65291, 65291 }, - { 65308, 65310 }, - { 65342, 65342 }, - { 65344, 65344 }, - { 65372, 65372 }, - { 65374, 65374 }, - { 65504, 65510 }, - { 65512, 65518 }, - { 65532, 65533 }, +static const URange16 Pc_range16[] = { + { 95, 95 }, + { 8255, 8256 }, + { 8276, 8276 }, + { 65075, 65076 }, + { 65101, 65103 }, + { 65343, 65343 }, }; -static const URange32 S_range32[] = { - { 65847, 65855 }, - { 65913, 65929 }, - { 65932, 65934 }, - { 65936, 65947 }, - { 65952, 65952 }, - { 66000, 66044 }, - { 67703, 67704 }, - { 68296, 68296 }, - { 71487, 71487 }, - { 92988, 92991 }, - { 92997, 92997 }, - { 113820, 113820 }, - { 118784, 119029 }, - { 119040, 119078 }, - { 119081, 119140 }, - { 119146, 119148 }, - { 119171, 119172 }, - { 119180, 119209 }, - { 119214, 119272 }, - { 119296, 119361 }, - { 119365, 119365 }, - { 119552, 119638 }, - { 120513, 120513 }, - { 120539, 120539 }, - { 120571, 120571 }, - { 120597, 120597 }, - { 120629, 120629 }, - { 120655, 120655 }, - { 120687, 120687 }, - { 120713, 120713 }, - { 120745, 120745 }, - { 120771, 120771 }, - { 120832, 121343 }, - { 121399, 121402 }, - { 121453, 121460 }, - { 121462, 121475 }, - { 121477, 121478 }, - { 126124, 126124 }, - { 126128, 126128 }, - { 126704, 126705 }, - { 126976, 127019 }, - { 127024, 127123 }, - { 127136, 127150 }, - { 127153, 127167 }, - { 127169, 127183 }, - { 127185, 127221 }, - { 127248, 127339 }, - { 127344, 127404 }, - { 127462, 127490 }, - { 127504, 127547 }, - { 127552, 127560 }, - { 127568, 127569 }, - { 127584, 127589 }, - { 127744, 128724 }, - { 128736, 128748 }, - { 128752, 128761 }, - { 128768, 128883 }, - { 128896, 128984 }, - { 129024, 129035 }, - { 129040, 129095 }, - { 129104, 129113 }, - { 129120, 129159 }, - { 129168, 129197 }, - { 129280, 129291 }, - { 129296, 129342 }, - { 129344, 129392 }, - { 129395, 129398 }, - { 129402, 129402 }, - { 129404, 129442 }, - { 129456, 129465 }, - { 129472, 129474 }, - { 129488, 129535 }, - { 129632, 129645 }, +static const URange16 Pd_range16[] = { + { 45, 45 }, + { 1418, 1418 }, + { 1470, 1470 }, + { 5120, 5120 }, + { 6150, 6150 }, + { 8208, 8213 }, + { 11799, 11799 }, + { 11802, 11802 }, + { 11834, 11835 }, + { 11840, 11840 }, + { 11869, 11869 }, + { 12316, 12316 }, + { 12336, 12336 }, + { 12448, 12448 }, + { 65073, 65074 }, + { 65112, 65112 }, + { 65123, 65123 }, + { 65293, 65293 }, }; -static const URange16 So_range16[] = { - { 166, 166 }, - { 169, 169 }, - { 174, 174 }, - { 176, 176 }, - { 1154, 1154 }, - { 1421, 1422 }, - { 1550, 1551 }, - { 1758, 1758 }, - { 1769, 1769 }, - { 1789, 1790 }, - { 2038, 2038 }, - { 2554, 2554 }, - { 2928, 2928 }, - { 3059, 3064 }, - { 3066, 3066 }, - { 3199, 3199 }, - { 3407, 3407 }, - { 3449, 3449 }, - { 3841, 3843 }, - { 3859, 3859 }, - { 3861, 3863 }, - { 3866, 3871 }, - { 3892, 3892 }, - { 3894, 3894 }, - { 3896, 3896 }, - { 4030, 4037 }, - { 4039, 4044 }, - { 4046, 4047 }, - { 4053, 4056 }, - { 4254, 4255 }, - { 5008, 5017 }, - { 6464, 6464 }, - { 6622, 6655 }, - { 7009, 7018 }, - { 7028, 7036 }, - { 8448, 8449 }, - { 8451, 8454 }, - { 8456, 8457 }, - { 8468, 8468 }, - { 8470, 8471 }, - { 8478, 8483 }, - { 8485, 8485 }, - { 8487, 8487 }, - { 8489, 8489 }, - { 8494, 8494 }, - { 8506, 8507 }, - { 8522, 8522 }, - { 8524, 8525 }, - { 8527, 8527 }, - { 8586, 8587 }, - { 8597, 8601 }, - { 8604, 8607 }, - { 8609, 8610 }, - { 8612, 8613 }, - { 8615, 8621 }, - { 8623, 8653 }, - { 8656, 8657 }, - { 8659, 8659 }, - { 8661, 8691 }, - { 8960, 8967 }, - { 8972, 8991 }, - { 8994, 9000 }, - { 9003, 9083 }, - { 9085, 9114 }, - { 9140, 9179 }, - { 9186, 9254 }, - { 9280, 9290 }, - { 9372, 9449 }, - { 9472, 9654 }, - { 9656, 9664 }, - { 9666, 9719 }, - { 9728, 9838 }, - { 9840, 10087 }, - { 10132, 10175 }, - { 10240, 10495 }, - { 11008, 11055 }, - { 11077, 11078 }, - { 11085, 11123 }, - { 11126, 11157 }, - { 11160, 11208 }, - { 11210, 11262 }, - { 11493, 11498 }, - { 11904, 11929 }, - { 11931, 12019 }, - { 12032, 12245 }, - { 12272, 12283 }, - { 12292, 12292 }, - { 12306, 12307 }, - { 12320, 12320 }, - { 12342, 12343 }, - { 12350, 12351 }, - { 12688, 12689 }, - { 12694, 12703 }, - { 12736, 12771 }, - { 12800, 12830 }, - { 12842, 12871 }, - { 12880, 12880 }, - { 12896, 12927 }, - { 12938, 12976 }, - { 12992, 13054 }, - { 13056, 13311 }, - { 19904, 19967 }, - { 42128, 42182 }, - { 43048, 43051 }, - { 43062, 43063 }, - { 43065, 43065 }, - { 43639, 43641 }, - { 65021, 65021 }, - { 65508, 65508 }, - { 65512, 65512 }, - { 65517, 65518 }, +static const URange32 Pd_range32[] = { + { 69293, 69293 }, +}; +static const URange16 Pe_range16[] = { + { 41, 41 }, + { 93, 93 }, + { 125, 125 }, + { 3899, 3899 }, + { 3901, 3901 }, + { 5788, 5788 }, + { 8262, 8262 }, + { 8318, 8318 }, + { 8334, 8334 }, + { 8969, 8969 }, + { 8971, 8971 }, + { 9002, 9002 }, + { 10089, 10089 }, + { 10091, 10091 }, + { 10093, 10093 }, + { 10095, 10095 }, + { 10097, 10097 }, + { 10099, 10099 }, + { 10101, 10101 }, + { 10182, 10182 }, + { 10215, 10215 }, + { 10217, 10217 }, + { 10219, 10219 }, + { 10221, 10221 }, + { 10223, 10223 }, + { 10628, 10628 }, + { 10630, 10630 }, + { 10632, 10632 }, + { 10634, 10634 }, + { 10636, 10636 }, + { 10638, 10638 }, + { 10640, 10640 }, + { 10642, 10642 }, + { 10644, 10644 }, + { 10646, 10646 }, + { 10648, 10648 }, + { 10713, 10713 }, + { 10715, 10715 }, + { 10749, 10749 }, + { 11811, 11811 }, + { 11813, 11813 }, + { 11815, 11815 }, + { 11817, 11817 }, + { 11862, 11862 }, + { 11864, 11864 }, + { 11866, 11866 }, + { 11868, 11868 }, + { 12297, 12297 }, + { 12299, 12299 }, + { 12301, 12301 }, + { 12303, 12303 }, + { 12305, 12305 }, + { 12309, 12309 }, + { 12311, 12311 }, + { 12313, 12313 }, + { 12315, 12315 }, + { 12318, 12319 }, + { 64830, 64830 }, + { 65048, 65048 }, + { 65078, 65078 }, + { 65080, 65080 }, + { 65082, 65082 }, + { 65084, 65084 }, + { 65086, 65086 }, + { 65088, 65088 }, + { 65090, 65090 }, + { 65092, 65092 }, + { 65096, 65096 }, + { 65114, 65114 }, + { 65116, 65116 }, + { 65118, 65118 }, + { 65289, 65289 }, + { 65341, 65341 }, + { 65373, 65373 }, + { 65376, 65376 }, + { 65379, 65379 }, +}; +static const URange16 Pf_range16[] = { + { 187, 187 }, + { 8217, 8217 }, + { 8221, 8221 }, + { 8250, 8250 }, + { 11779, 11779 }, + { 11781, 11781 }, + { 11786, 11786 }, + { 11789, 11789 }, + { 11805, 11805 }, + { 11809, 11809 }, +}; +static const URange16 Pi_range16[] = { + { 171, 171 }, + { 8216, 8216 }, + { 8219, 8220 }, + { 8223, 8223 }, + { 8249, 8249 }, + { 11778, 11778 }, + { 11780, 11780 }, + { 11785, 11785 }, + { 11788, 11788 }, + { 11804, 11804 }, + { 11808, 11808 }, +}; +static const URange16 Po_range16[] = { + { 33, 35 }, + { 37, 39 }, + { 42, 42 }, + { 44, 44 }, + { 46, 47 }, + { 58, 59 }, + { 63, 64 }, + { 92, 92 }, + { 161, 161 }, + { 167, 167 }, + { 182, 183 }, + { 191, 191 }, + { 894, 894 }, + { 903, 903 }, + { 1370, 1375 }, + { 1417, 1417 }, + { 1472, 1472 }, + { 1475, 1475 }, + { 1478, 1478 }, + { 1523, 1524 }, + { 1545, 1546 }, + { 1548, 1549 }, + { 1563, 1563 }, + { 1565, 1567 }, + { 1642, 1645 }, + { 1748, 1748 }, + { 1792, 1805 }, + { 2039, 2041 }, + { 2096, 2110 }, + { 2142, 2142 }, + { 2404, 2405 }, + { 2416, 2416 }, + { 2557, 2557 }, + { 2678, 2678 }, + { 2800, 2800 }, + { 3191, 3191 }, + { 3204, 3204 }, + { 3572, 3572 }, + { 3663, 3663 }, + { 3674, 3675 }, + { 3844, 3858 }, + { 3860, 3860 }, + { 3973, 3973 }, + { 4048, 4052 }, + { 4057, 4058 }, + { 4170, 4175 }, + { 4347, 4347 }, + { 4960, 4968 }, + { 5742, 5742 }, + { 5867, 5869 }, + { 5941, 5942 }, + { 6100, 6102 }, + { 6104, 6106 }, + { 6144, 6149 }, + { 6151, 6154 }, + { 6468, 6469 }, + { 6686, 6687 }, + { 6816, 6822 }, + { 6824, 6829 }, + { 7002, 7008 }, + { 7037, 7038 }, + { 7164, 7167 }, + { 7227, 7231 }, + { 7294, 7295 }, + { 7360, 7367 }, + { 7379, 7379 }, + { 8214, 8215 }, + { 8224, 8231 }, + { 8240, 8248 }, + { 8251, 8254 }, + { 8257, 8259 }, + { 8263, 8273 }, + { 8275, 8275 }, + { 8277, 8286 }, + { 11513, 11516 }, + { 11518, 11519 }, + { 11632, 11632 }, + { 11776, 11777 }, + { 11782, 11784 }, + { 11787, 11787 }, + { 11790, 11798 }, + { 11800, 11801 }, + { 11803, 11803 }, + { 11806, 11807 }, + { 11818, 11822 }, + { 11824, 11833 }, + { 11836, 11839 }, + { 11841, 11841 }, + { 11843, 11855 }, + { 11858, 11860 }, + { 12289, 12291 }, + { 12349, 12349 }, + { 12539, 12539 }, + { 42238, 42239 }, + { 42509, 42511 }, + { 42611, 42611 }, + { 42622, 42622 }, + { 42738, 42743 }, + { 43124, 43127 }, + { 43214, 43215 }, + { 43256, 43258 }, + { 43260, 43260 }, + { 43310, 43311 }, + { 43359, 43359 }, + { 43457, 43469 }, + { 43486, 43487 }, + { 43612, 43615 }, + { 43742, 43743 }, + { 43760, 43761 }, + { 44011, 44011 }, + { 65040, 65046 }, + { 65049, 65049 }, + { 65072, 65072 }, + { 65093, 65094 }, + { 65097, 65100 }, + { 65104, 65106 }, + { 65108, 65111 }, + { 65119, 65121 }, + { 65128, 65128 }, + { 65130, 65131 }, + { 65281, 65283 }, + { 65285, 65287 }, + { 65290, 65290 }, + { 65292, 65292 }, + { 65294, 65295 }, + { 65306, 65307 }, + { 65311, 65312 }, + { 65340, 65340 }, + { 65377, 65377 }, + { 65380, 65381 }, +}; +static const URange32 Po_range32[] = { + { 65792, 65794 }, + { 66463, 66463 }, + { 66512, 66512 }, + { 66927, 66927 }, + { 67671, 67671 }, + { 67871, 67871 }, + { 67903, 67903 }, + { 68176, 68184 }, + { 68223, 68223 }, + { 68336, 68342 }, + { 68409, 68415 }, + { 68505, 68508 }, + { 69461, 69465 }, + { 69510, 69513 }, + { 69703, 69709 }, + { 69819, 69820 }, + { 69822, 69825 }, + { 69952, 69955 }, + { 70004, 70005 }, + { 70085, 70088 }, + { 70093, 70093 }, + { 70107, 70107 }, + { 70109, 70111 }, + { 70200, 70205 }, + { 70313, 70313 }, + { 70731, 70735 }, + { 70746, 70747 }, + { 70749, 70749 }, + { 70854, 70854 }, + { 71105, 71127 }, + { 71233, 71235 }, + { 71264, 71276 }, + { 71353, 71353 }, + { 71484, 71486 }, + { 71739, 71739 }, + { 72004, 72006 }, + { 72162, 72162 }, + { 72255, 72262 }, + { 72346, 72348 }, + { 72350, 72354 }, + { 72448, 72457 }, + { 72769, 72773 }, + { 72816, 72817 }, + { 73463, 73464 }, + { 73539, 73551 }, + { 73727, 73727 }, + { 74864, 74868 }, + { 77809, 77810 }, + { 92782, 92783 }, + { 92917, 92917 }, + { 92983, 92987 }, + { 92996, 92996 }, + { 93847, 93850 }, + { 94178, 94178 }, + { 113823, 113823 }, + { 121479, 121483 }, + { 125278, 125279 }, +}; +static const URange16 Ps_range16[] = { + { 40, 40 }, + { 91, 91 }, + { 123, 123 }, + { 3898, 3898 }, + { 3900, 3900 }, + { 5787, 5787 }, + { 8218, 8218 }, + { 8222, 8222 }, + { 8261, 8261 }, + { 8317, 8317 }, + { 8333, 8333 }, + { 8968, 8968 }, + { 8970, 8970 }, + { 9001, 9001 }, + { 10088, 10088 }, + { 10090, 10090 }, + { 10092, 10092 }, + { 10094, 10094 }, + { 10096, 10096 }, + { 10098, 10098 }, + { 10100, 10100 }, + { 10181, 10181 }, + { 10214, 10214 }, + { 10216, 10216 }, + { 10218, 10218 }, + { 10220, 10220 }, + { 10222, 10222 }, + { 10627, 10627 }, + { 10629, 10629 }, + { 10631, 10631 }, + { 10633, 10633 }, + { 10635, 10635 }, + { 10637, 10637 }, + { 10639, 10639 }, + { 10641, 10641 }, + { 10643, 10643 }, + { 10645, 10645 }, + { 10647, 10647 }, + { 10712, 10712 }, + { 10714, 10714 }, + { 10748, 10748 }, + { 11810, 11810 }, + { 11812, 11812 }, + { 11814, 11814 }, + { 11816, 11816 }, + { 11842, 11842 }, + { 11861, 11861 }, + { 11863, 11863 }, + { 11865, 11865 }, + { 11867, 11867 }, + { 12296, 12296 }, + { 12298, 12298 }, + { 12300, 12300 }, + { 12302, 12302 }, + { 12304, 12304 }, + { 12308, 12308 }, + { 12310, 12310 }, + { 12312, 12312 }, + { 12314, 12314 }, + { 12317, 12317 }, + { 64831, 64831 }, + { 65047, 65047 }, + { 65077, 65077 }, + { 65079, 65079 }, + { 65081, 65081 }, + { 65083, 65083 }, + { 65085, 65085 }, + { 65087, 65087 }, + { 65089, 65089 }, + { 65091, 65091 }, + { 65095, 65095 }, + { 65113, 65113 }, + { 65115, 65115 }, + { 65117, 65117 }, + { 65288, 65288 }, + { 65339, 65339 }, + { 65371, 65371 }, + { 65375, 65375 }, + { 65378, 65378 }, +}; +static const URange16 S_range16[] = { + { 36, 36 }, + { 43, 43 }, + { 60, 62 }, + { 94, 94 }, + { 96, 96 }, + { 124, 124 }, + { 126, 126 }, + { 162, 166 }, + { 168, 169 }, + { 172, 172 }, + { 174, 177 }, + { 180, 180 }, + { 184, 184 }, + { 215, 215 }, + { 247, 247 }, + { 706, 709 }, + { 722, 735 }, + { 741, 747 }, + { 749, 749 }, + { 751, 767 }, + { 885, 885 }, + { 900, 901 }, + { 1014, 1014 }, + { 1154, 1154 }, + { 1421, 1423 }, + { 1542, 1544 }, + { 1547, 1547 }, + { 1550, 1551 }, + { 1758, 1758 }, + { 1769, 1769 }, + { 1789, 1790 }, + { 2038, 2038 }, + { 2046, 2047 }, + { 2184, 2184 }, + { 2546, 2547 }, + { 2554, 2555 }, + { 2801, 2801 }, + { 2928, 2928 }, + { 3059, 3066 }, + { 3199, 3199 }, + { 3407, 3407 }, + { 3449, 3449 }, + { 3647, 3647 }, + { 3841, 3843 }, + { 3859, 3859 }, + { 3861, 3863 }, + { 3866, 3871 }, + { 3892, 3892 }, + { 3894, 3894 }, + { 3896, 3896 }, + { 4030, 4037 }, + { 4039, 4044 }, + { 4046, 4047 }, + { 4053, 4056 }, + { 4254, 4255 }, + { 5008, 5017 }, + { 5741, 5741 }, + { 6107, 6107 }, + { 6464, 6464 }, + { 6622, 6655 }, + { 7009, 7018 }, + { 7028, 7036 }, + { 8125, 8125 }, + { 8127, 8129 }, + { 8141, 8143 }, + { 8157, 8159 }, + { 8173, 8175 }, + { 8189, 8190 }, + { 8260, 8260 }, + { 8274, 8274 }, + { 8314, 8316 }, + { 8330, 8332 }, + { 8352, 8384 }, + { 8448, 8449 }, + { 8451, 8454 }, + { 8456, 8457 }, + { 8468, 8468 }, + { 8470, 8472 }, + { 8478, 8483 }, + { 8485, 8485 }, + { 8487, 8487 }, + { 8489, 8489 }, + { 8494, 8494 }, + { 8506, 8507 }, + { 8512, 8516 }, + { 8522, 8525 }, + { 8527, 8527 }, + { 8586, 8587 }, + { 8592, 8967 }, + { 8972, 9000 }, + { 9003, 9254 }, + { 9280, 9290 }, + { 9372, 9449 }, + { 9472, 10087 }, + { 10132, 10180 }, + { 10183, 10213 }, + { 10224, 10626 }, + { 10649, 10711 }, + { 10716, 10747 }, + { 10750, 11123 }, + { 11126, 11157 }, + { 11159, 11263 }, + { 11493, 11498 }, + { 11856, 11857 }, + { 11904, 11929 }, + { 11931, 12019 }, + { 12032, 12245 }, + { 12272, 12283 }, + { 12292, 12292 }, + { 12306, 12307 }, + { 12320, 12320 }, + { 12342, 12343 }, + { 12350, 12351 }, + { 12443, 12444 }, + { 12688, 12689 }, + { 12694, 12703 }, + { 12736, 12771 }, + { 12800, 12830 }, + { 12842, 12871 }, + { 12880, 12880 }, + { 12896, 12927 }, + { 12938, 12976 }, + { 12992, 13311 }, + { 19904, 19967 }, + { 42128, 42182 }, + { 42752, 42774 }, + { 42784, 42785 }, + { 42889, 42890 }, + { 43048, 43051 }, + { 43062, 43065 }, + { 43639, 43641 }, + { 43867, 43867 }, + { 43882, 43883 }, + { 64297, 64297 }, + { 64434, 64450 }, + { 64832, 64847 }, + { 64975, 64975 }, + { 65020, 65023 }, + { 65122, 65122 }, + { 65124, 65126 }, + { 65129, 65129 }, + { 65284, 65284 }, + { 65291, 65291 }, + { 65308, 65310 }, + { 65342, 65342 }, + { 65344, 65344 }, + { 65372, 65372 }, + { 65374, 65374 }, + { 65504, 65510 }, + { 65512, 65518 }, { 65532, 65533 }, }; -static const URange32 So_range32[] = { +static const URange32 S_range32[] = { { 65847, 65855 }, { 65913, 65929 }, { 65932, 65934 }, - { 65936, 65947 }, + { 65936, 65948 }, { 65952, 65952 }, { 66000, 66044 }, { 67703, 67704 }, { 68296, 68296 }, { 71487, 71487 }, + { 73685, 73713 }, { 92988, 92991 }, { 92997, 92997 }, { 113820, 113820 }, + { 118608, 118723 }, { 118784, 119029 }, { 119040, 119078 }, { 119081, 119140 }, { 119146, 119148 }, { 119171, 119172 }, { 119180, 119209 }, - { 119214, 119272 }, + { 119214, 119274 }, { 119296, 119361 }, { 119365, 119365 }, { 119552, 119638 }, + { 120513, 120513 }, + { 120539, 120539 }, + { 120571, 120571 }, + { 120597, 120597 }, + { 120629, 120629 }, + { 120655, 120655 }, + { 120687, 120687 }, + { 120713, 120713 }, + { 120745, 120745 }, + { 120771, 120771 }, { 120832, 121343 }, { 121399, 121402 }, { 121453, 121460 }, { 121462, 121475 }, { 121477, 121478 }, + { 123215, 123215 }, + { 123647, 123647 }, { 126124, 126124 }, + { 126128, 126128 }, + { 126254, 126254 }, + { 126704, 126705 }, { 126976, 127019 }, { 127024, 127123 }, { 127136, 127150 }, { 127153, 127167 }, { 127169, 127183 }, { 127185, 127221 }, - { 127248, 127339 }, - { 127344, 127404 }, + { 127245, 127405 }, { 127462, 127490 }, { 127504, 127547 }, { 127552, 127560 }, { 127568, 127569 }, { 127584, 127589 }, - { 127744, 127994 }, - { 128000, 128724 }, - { 128736, 128748 }, - { 128752, 128761 }, - { 128768, 128883 }, - { 128896, 128984 }, + { 127744, 128727 }, + { 128732, 128748 }, + { 128752, 128764 }, + { 128768, 128886 }, + { 128891, 128985 }, + { 128992, 129003 }, + { 129008, 129008 }, { 129024, 129035 }, { 129040, 129095 }, { 129104, 129113 }, { 129120, 129159 }, { 129168, 129197 }, - { 129280, 129291 }, - { 129296, 129342 }, - { 129344, 129392 }, - { 129395, 129398 }, - { 129402, 129402 }, - { 129404, 129442 }, - { 129456, 129465 }, - { 129472, 129474 }, - { 129488, 129535 }, + { 129200, 129201 }, + { 129280, 129619 }, { 129632, 129645 }, + { 129648, 129660 }, + { 129664, 129672 }, + { 129680, 129725 }, + { 129727, 129733 }, + { 129742, 129755 }, + { 129760, 129768 }, + { 129776, 129784 }, + { 129792, 129938 }, + { 129940, 129994 }, +}; +static const URange16 Sc_range16[] = { + { 36, 36 }, + { 162, 165 }, + { 1423, 1423 }, + { 1547, 1547 }, + { 2046, 2047 }, + { 2546, 2547 }, + { 2555, 2555 }, + { 2801, 2801 }, + { 3065, 3065 }, + { 3647, 3647 }, + { 6107, 6107 }, + { 8352, 8384 }, + { 43064, 43064 }, + { 65020, 65020 }, + { 65129, 65129 }, + { 65284, 65284 }, + { 65504, 65505 }, + { 65509, 65510 }, +}; +static const URange32 Sc_range32[] = { + { 73693, 73696 }, + { 123647, 123647 }, + { 126128, 126128 }, +}; +static const URange16 Sk_range16[] = { + { 94, 94 }, + { 96, 96 }, + { 168, 168 }, + { 175, 175 }, + { 180, 180 }, + { 184, 184 }, + { 706, 709 }, + { 722, 735 }, + { 741, 747 }, + { 749, 749 }, + { 751, 767 }, + { 885, 885 }, + { 900, 901 }, + { 2184, 2184 }, + { 8125, 8125 }, + { 8127, 8129 }, + { 8141, 8143 }, + { 8157, 8159 }, + { 8173, 8175 }, + { 8189, 8190 }, + { 12443, 12444 }, + { 42752, 42774 }, + { 42784, 42785 }, + { 42889, 42890 }, + { 43867, 43867 }, + { 43882, 43883 }, + { 64434, 64450 }, + { 65342, 65342 }, + { 65344, 65344 }, + { 65507, 65507 }, +}; +static const URange32 Sk_range32[] = { + { 127995, 127999 }, }; static const URange16 Sm_range16[] = { { 43, 43 }, @@ -364842,28 +367468,193 @@ static const URange32 Sm_range32[] = { { 120771, 120771 }, { 126704, 126705 }, }; -static const URange16 Sc_range16[] = { - { 36, 36 }, - { 162, 165 }, - { 1423, 1423 }, - { 1547, 1547 }, - { 2046, 2047 }, - { 2546, 2547 }, - { 2555, 2555 }, - { 2801, 2801 }, - { 3065, 3065 }, - { 3647, 3647 }, - { 6107, 6107 }, - { 8352, 8383 }, - { 43064, 43064 }, - { 65020, 65020 }, - { 65129, 65129 }, - { 65284, 65284 }, - { 65504, 65505 }, - { 65509, 65510 }, +static const URange16 So_range16[] = { + { 166, 166 }, + { 169, 169 }, + { 174, 174 }, + { 176, 176 }, + { 1154, 1154 }, + { 1421, 1422 }, + { 1550, 1551 }, + { 1758, 1758 }, + { 1769, 1769 }, + { 1789, 1790 }, + { 2038, 2038 }, + { 2554, 2554 }, + { 2928, 2928 }, + { 3059, 3064 }, + { 3066, 3066 }, + { 3199, 3199 }, + { 3407, 3407 }, + { 3449, 3449 }, + { 3841, 3843 }, + { 3859, 3859 }, + { 3861, 3863 }, + { 3866, 3871 }, + { 3892, 3892 }, + { 3894, 3894 }, + { 3896, 3896 }, + { 4030, 4037 }, + { 4039, 4044 }, + { 4046, 4047 }, + { 4053, 4056 }, + { 4254, 4255 }, + { 5008, 5017 }, + { 5741, 5741 }, + { 6464, 6464 }, + { 6622, 6655 }, + { 7009, 7018 }, + { 7028, 7036 }, + { 8448, 8449 }, + { 8451, 8454 }, + { 8456, 8457 }, + { 8468, 8468 }, + { 8470, 8471 }, + { 8478, 8483 }, + { 8485, 8485 }, + { 8487, 8487 }, + { 8489, 8489 }, + { 8494, 8494 }, + { 8506, 8507 }, + { 8522, 8522 }, + { 8524, 8525 }, + { 8527, 8527 }, + { 8586, 8587 }, + { 8597, 8601 }, + { 8604, 8607 }, + { 8609, 8610 }, + { 8612, 8613 }, + { 8615, 8621 }, + { 8623, 8653 }, + { 8656, 8657 }, + { 8659, 8659 }, + { 8661, 8691 }, + { 8960, 8967 }, + { 8972, 8991 }, + { 8994, 9000 }, + { 9003, 9083 }, + { 9085, 9114 }, + { 9140, 9179 }, + { 9186, 9254 }, + { 9280, 9290 }, + { 9372, 9449 }, + { 9472, 9654 }, + { 9656, 9664 }, + { 9666, 9719 }, + { 9728, 9838 }, + { 9840, 10087 }, + { 10132, 10175 }, + { 10240, 10495 }, + { 11008, 11055 }, + { 11077, 11078 }, + { 11085, 11123 }, + { 11126, 11157 }, + { 11159, 11263 }, + { 11493, 11498 }, + { 11856, 11857 }, + { 11904, 11929 }, + { 11931, 12019 }, + { 12032, 12245 }, + { 12272, 12283 }, + { 12292, 12292 }, + { 12306, 12307 }, + { 12320, 12320 }, + { 12342, 12343 }, + { 12350, 12351 }, + { 12688, 12689 }, + { 12694, 12703 }, + { 12736, 12771 }, + { 12800, 12830 }, + { 12842, 12871 }, + { 12880, 12880 }, + { 12896, 12927 }, + { 12938, 12976 }, + { 12992, 13311 }, + { 19904, 19967 }, + { 42128, 42182 }, + { 43048, 43051 }, + { 43062, 43063 }, + { 43065, 43065 }, + { 43639, 43641 }, + { 64832, 64847 }, + { 64975, 64975 }, + { 65021, 65023 }, + { 65508, 65508 }, + { 65512, 65512 }, + { 65517, 65518 }, + { 65532, 65533 }, }; -static const URange32 Sc_range32[] = { - { 126128, 126128 }, +static const URange32 So_range32[] = { + { 65847, 65855 }, + { 65913, 65929 }, + { 65932, 65934 }, + { 65936, 65948 }, + { 65952, 65952 }, + { 66000, 66044 }, + { 67703, 67704 }, + { 68296, 68296 }, + { 71487, 71487 }, + { 73685, 73692 }, + { 73697, 73713 }, + { 92988, 92991 }, + { 92997, 92997 }, + { 113820, 113820 }, + { 118608, 118723 }, + { 118784, 119029 }, + { 119040, 119078 }, + { 119081, 119140 }, + { 119146, 119148 }, + { 119171, 119172 }, + { 119180, 119209 }, + { 119214, 119274 }, + { 119296, 119361 }, + { 119365, 119365 }, + { 119552, 119638 }, + { 120832, 121343 }, + { 121399, 121402 }, + { 121453, 121460 }, + { 121462, 121475 }, + { 121477, 121478 }, + { 123215, 123215 }, + { 126124, 126124 }, + { 126254, 126254 }, + { 126976, 127019 }, + { 127024, 127123 }, + { 127136, 127150 }, + { 127153, 127167 }, + { 127169, 127183 }, + { 127185, 127221 }, + { 127245, 127405 }, + { 127462, 127490 }, + { 127504, 127547 }, + { 127552, 127560 }, + { 127568, 127569 }, + { 127584, 127589 }, + { 127744, 127994 }, + { 128000, 128727 }, + { 128732, 128748 }, + { 128752, 128764 }, + { 128768, 128886 }, + { 128891, 128985 }, + { 128992, 129003 }, + { 129008, 129008 }, + { 129024, 129035 }, + { 129040, 129095 }, + { 129104, 129113 }, + { 129120, 129159 }, + { 129168, 129197 }, + { 129200, 129201 }, + { 129280, 129619 }, + { 129632, 129645 }, + { 129648, 129660 }, + { 129664, 129672 }, + { 129680, 129725 }, + { 129727, 129733 }, + { 129742, 129755 }, + { 129760, 129768 }, + { 129776, 129784 }, + { 129792, 129938 }, + { 129940, 129994 }, }; static const URange16 Z_range16[] = { { 32, 32 }, @@ -364878,43 +367669,6 @@ static const URange16 Z_range16[] = { static const URange16 Zl_range16[] = { { 8232, 8232 }, }; -static const URange16 Co_range16[] = { - { 57344, 63743 }, -}; -static const URange32 Co_range32[] = { - { 983040, 1048573 }, - { 1048576, 1114109 }, -}; -static const URange16 Cc_range16[] = { - { 0, 31 }, - { 127, 159 }, -}; -static const URange16 Cf_range16[] = { - { 173, 173 }, - { 1536, 1541 }, - { 1564, 1564 }, - { 1757, 1757 }, - { 1807, 1807 }, - { 2274, 2274 }, - { 6158, 6158 }, - { 8203, 8207 }, - { 8234, 8238 }, - { 8288, 8292 }, - { 8294, 8303 }, - { 65279, 65279 }, - { 65529, 65531 }, -}; -static const URange32 Cf_range32[] = { - { 69821, 69821 }, - { 69837, 69837 }, - { 113824, 113827 }, - { 119155, 119162 }, - { 917505, 917505 }, - { 917536, 917631 }, -}; -static const URange16 Cs_range16[] = { - { 55296, 57343 }, -}; static const URange16 Zp_range16[] = { { 8233, 8233 }, }; @@ -364927,346 +367681,476 @@ static const URange16 Zs_range16[] = { { 8287, 8287 }, { 12288, 12288 }, }; -static const URange32 Tangut_range32[] = { - { 94176, 94176 }, - { 94208, 100337 }, - { 100352, 101106 }, -}; -static const URange16 Thaana_range16[] = { - { 1920, 1969 }, -}; static const URange32 Adlam_range32[] = { - { 125184, 125258 }, + { 125184, 125259 }, { 125264, 125273 }, { 125278, 125279 }, }; -static const URange16 Telugu_range16[] = { - { 3072, 3084 }, - { 3086, 3088 }, - { 3090, 3112 }, - { 3114, 3129 }, - { 3133, 3140 }, - { 3142, 3144 }, - { 3146, 3149 }, - { 3157, 3158 }, - { 3160, 3162 }, - { 3168, 3171 }, - { 3174, 3183 }, - { 3192, 3199 }, -}; -static const URange16 Cyrillic_range16[] = { - { 1024, 1156 }, - { 1159, 1327 }, - { 7296, 7304 }, - { 7467, 7467 }, - { 7544, 7544 }, - { 11744, 11775 }, - { 42560, 42655 }, - { 65070, 65071 }, -}; -static const URange32 Zanabazar_Square_range32[] = { - { 72192, 72263 }, -}; -static const URange16 Hangul_range16[] = { - { 4352, 4607 }, - { 12334, 12335 }, - { 12593, 12686 }, - { 12800, 12830 }, - { 12896, 12926 }, - { 43360, 43388 }, - { 44032, 55203 }, - { 55216, 55238 }, - { 55243, 55291 }, - { 65440, 65470 }, - { 65474, 65479 }, - { 65482, 65487 }, - { 65490, 65495 }, - { 65498, 65500 }, -}; -static const URange32 Old_South_Arabian_range32[] = { - { 68192, 68223 }, -}; -static const URange16 Ethiopic_range16[] = { - { 4608, 4680 }, - { 4682, 4685 }, - { 4688, 4694 }, - { 4696, 4696 }, - { 4698, 4701 }, - { 4704, 4744 }, - { 4746, 4749 }, - { 4752, 4784 }, - { 4786, 4789 }, - { 4792, 4798 }, - { 4800, 4800 }, - { 4802, 4805 }, - { 4808, 4822 }, - { 4824, 4880 }, - { 4882, 4885 }, - { 4888, 4954 }, - { 4957, 4988 }, - { 4992, 5017 }, - { 11648, 11670 }, - { 11680, 11686 }, - { 11688, 11694 }, - { 11696, 11702 }, - { 11704, 11710 }, - { 11712, 11718 }, - { 11720, 11726 }, - { 11728, 11734 }, - { 11736, 11742 }, - { 43777, 43782 }, - { 43785, 43790 }, - { 43793, 43798 }, - { 43808, 43814 }, - { 43816, 43822 }, -}; -static const URange16 Inherited_range16[] = { - { 768, 879 }, - { 1157, 1158 }, - { 1611, 1621 }, - { 1648, 1648 }, - { 2385, 2386 }, - { 6832, 6846 }, - { 7376, 7378 }, - { 7380, 7392 }, - { 7394, 7400 }, - { 7405, 7405 }, - { 7412, 7412 }, - { 7416, 7417 }, - { 7616, 7673 }, - { 7675, 7679 }, - { 8204, 8205 }, - { 8400, 8432 }, - { 12330, 12333 }, - { 12441, 12442 }, - { 65024, 65039 }, - { 65056, 65069 }, -}; -static const URange32 Inherited_range32[] = { - { 66045, 66045 }, - { 66272, 66272 }, - { 70459, 70459 }, - { 119143, 119145 }, - { 119163, 119170 }, - { 119173, 119179 }, - { 119210, 119213 }, - { 917760, 917999 }, -}; -static const URange32 Meroitic_Cursive_range32[] = { - { 68000, 68023 }, - { 68028, 68047 }, - { 68050, 68095 }, -}; -static const URange32 Bhaiksuki_range32[] = { - { 72704, 72712 }, - { 72714, 72758 }, - { 72760, 72773 }, - { 72784, 72812 }, -}; static const URange32 Ahom_range32[] = { { 71424, 71450 }, { 71453, 71467 }, - { 71472, 71487 }, + { 71472, 71494 }, }; -static const URange16 Han_range16[] = { - { 11904, 11929 }, - { 11931, 12019 }, - { 12032, 12245 }, - { 12293, 12293 }, - { 12295, 12295 }, - { 12321, 12329 }, - { 12344, 12347 }, - { 13312, 19893 }, - { 19968, 40943 }, - { 63744, 64109 }, - { 64112, 64217 }, +static const URange32 Anatolian_Hieroglyphs_range32[] = { + { 82944, 83526 }, }; -static const URange32 Han_range32[] = { - { 131072, 173782 }, - { 173824, 177972 }, - { 177984, 178205 }, - { 178208, 183969 }, - { 183984, 191456 }, - { 194560, 195101 }, +static const URange16 Arabic_range16[] = { + { 1536, 1540 }, + { 1542, 1547 }, + { 1549, 1562 }, + { 1564, 1566 }, + { 1568, 1599 }, + { 1601, 1610 }, + { 1622, 1647 }, + { 1649, 1756 }, + { 1758, 1791 }, + { 1872, 1919 }, + { 2160, 2190 }, + { 2192, 2193 }, + { 2200, 2273 }, + { 2275, 2303 }, + { 64336, 64450 }, + { 64467, 64829 }, + { 64832, 64911 }, + { 64914, 64967 }, + { 64975, 64975 }, + { 65008, 65023 }, + { 65136, 65140 }, + { 65142, 65276 }, }; -static const URange32 Old_North_Arabian_range32[] = { - { 68224, 68255 }, +static const URange32 Arabic_range32[] = { + { 69216, 69246 }, + { 69373, 69375 }, + { 126464, 126467 }, + { 126469, 126495 }, + { 126497, 126498 }, + { 126500, 126500 }, + { 126503, 126503 }, + { 126505, 126514 }, + { 126516, 126519 }, + { 126521, 126521 }, + { 126523, 126523 }, + { 126530, 126530 }, + { 126535, 126535 }, + { 126537, 126537 }, + { 126539, 126539 }, + { 126541, 126543 }, + { 126545, 126546 }, + { 126548, 126548 }, + { 126551, 126551 }, + { 126553, 126553 }, + { 126555, 126555 }, + { 126557, 126557 }, + { 126559, 126559 }, + { 126561, 126562 }, + { 126564, 126564 }, + { 126567, 126570 }, + { 126572, 126578 }, + { 126580, 126583 }, + { 126585, 126588 }, + { 126590, 126590 }, + { 126592, 126601 }, + { 126603, 126619 }, + { 126625, 126627 }, + { 126629, 126633 }, + { 126635, 126651 }, + { 126704, 126705 }, }; static const URange16 Armenian_range16[] = { { 1329, 1366 }, - { 1369, 1416 }, - { 1418, 1418 }, + { 1369, 1418 }, { 1421, 1423 }, { 64275, 64279 }, }; -static const URange16 Tamil_range16[] = { - { 2946, 2947 }, - { 2949, 2954 }, - { 2958, 2960 }, - { 2962, 2965 }, - { 2969, 2970 }, - { 2972, 2972 }, - { 2974, 2975 }, - { 2979, 2980 }, - { 2984, 2986 }, - { 2990, 3001 }, - { 3006, 3010 }, - { 3014, 3016 }, - { 3018, 3021 }, - { 3024, 3024 }, - { 3031, 3031 }, - { 3046, 3066 }, +static const URange32 Avestan_range32[] = { + { 68352, 68405 }, + { 68409, 68415 }, }; -static const URange16 Bopomofo_range16[] = { - { 746, 747 }, - { 12549, 12591 }, - { 12704, 12730 }, +static const URange16 Balinese_range16[] = { + { 6912, 6988 }, + { 6992, 7038 }, +}; +static const URange16 Bamum_range16[] = { + { 42656, 42743 }, +}; +static const URange32 Bamum_range32[] = { + { 92160, 92728 }, }; static const URange32 Bassa_Vah_range32[] = { { 92880, 92909 }, { 92912, 92917 }, }; -static const URange16 Sundanese_range16[] = { - { 7040, 7103 }, - { 7360, 7367 }, +static const URange16 Batak_range16[] = { + { 7104, 7155 }, + { 7164, 7167 }, }; -static const URange32 Osage_range32[] = { - { 66736, 66771 }, - { 66776, 66811 }, +static const URange16 Bengali_range16[] = { + { 2432, 2435 }, + { 2437, 2444 }, + { 2447, 2448 }, + { 2451, 2472 }, + { 2474, 2480 }, + { 2482, 2482 }, + { 2486, 2489 }, + { 2492, 2500 }, + { 2503, 2504 }, + { 2507, 2510 }, + { 2519, 2519 }, + { 2524, 2525 }, + { 2527, 2531 }, + { 2534, 2558 }, }; -static const URange32 Old_Sogdian_range32[] = { - { 69376, 69415 }, +static const URange32 Bhaiksuki_range32[] = { + { 72704, 72712 }, + { 72714, 72758 }, + { 72760, 72773 }, + { 72784, 72812 }, }; -static const URange16 Tagalog_range16[] = { - { 5888, 5900 }, - { 5902, 5908 }, +static const URange16 Bopomofo_range16[] = { + { 746, 747 }, + { 12549, 12591 }, + { 12704, 12735 }, }; -static const URange16 Malayalam_range16[] = { - { 3328, 3331 }, - { 3333, 3340 }, - { 3342, 3344 }, - { 3346, 3396 }, - { 3398, 3400 }, - { 3402, 3407 }, - { 3412, 3427 }, - { 3430, 3455 }, +static const URange32 Brahmi_range32[] = { + { 69632, 69709 }, + { 69714, 69749 }, + { 69759, 69759 }, }; -static const URange32 Marchen_range32[] = { - { 72816, 72847 }, - { 72850, 72871 }, - { 72873, 72886 }, +static const URange16 Braille_range16[] = { + { 10240, 10495 }, +}; +static const URange16 Buginese_range16[] = { + { 6656, 6683 }, + { 6686, 6687 }, +}; +static const URange16 Buhid_range16[] = { + { 5952, 5971 }, +}; +static const URange16 Canadian_Aboriginal_range16[] = { + { 5120, 5759 }, + { 6320, 6389 }, +}; +static const URange32 Canadian_Aboriginal_range32[] = { + { 72368, 72383 }, }; static const URange32 Carian_range32[] = { { 66208, 66256 }, }; -static const URange16 Hiragana_range16[] = { - { 12353, 12438 }, - { 12445, 12447 }, +static const URange32 Caucasian_Albanian_range32[] = { + { 66864, 66915 }, + { 66927, 66927 }, }; -static const URange32 Hiragana_range32[] = { - { 110593, 110878 }, - { 127488, 127488 }, +static const URange32 Chakma_range32[] = { + { 69888, 69940 }, + { 69942, 69959 }, }; -static const URange16 Tagbanwa_range16[] = { - { 5984, 5996 }, - { 5998, 6000 }, - { 6002, 6003 }, +static const URange16 Cham_range16[] = { + { 43520, 43574 }, + { 43584, 43597 }, + { 43600, 43609 }, + { 43612, 43615 }, }; -static const URange16 Meetei_Mayek_range16[] = { - { 43744, 43766 }, - { 43968, 44013 }, - { 44016, 44025 }, +static const URange16 Cherokee_range16[] = { + { 5024, 5109 }, + { 5112, 5117 }, + { 43888, 43967 }, }; -static const URange32 Hanifi_Rohingya_range32[] = { - { 68864, 68903 }, - { 68912, 68921 }, +static const URange32 Chorasmian_range32[] = { + { 69552, 69579 }, }; -static const URange32 Pahawh_Hmong_range32[] = { - { 92928, 92997 }, - { 93008, 93017 }, - { 93019, 93025 }, - { 93027, 93047 }, - { 93053, 93071 }, +static const URange16 Common_range16[] = { + { 0, 64 }, + { 91, 96 }, + { 123, 169 }, + { 171, 185 }, + { 187, 191 }, + { 215, 215 }, + { 247, 247 }, + { 697, 735 }, + { 741, 745 }, + { 748, 767 }, + { 884, 884 }, + { 894, 894 }, + { 901, 901 }, + { 903, 903 }, + { 1541, 1541 }, + { 1548, 1548 }, + { 1563, 1563 }, + { 1567, 1567 }, + { 1600, 1600 }, + { 1757, 1757 }, + { 2274, 2274 }, + { 2404, 2405 }, + { 3647, 3647 }, + { 4053, 4056 }, + { 4347, 4347 }, + { 5867, 5869 }, + { 5941, 5942 }, + { 6146, 6147 }, + { 6149, 6149 }, + { 7379, 7379 }, + { 7393, 7393 }, + { 7401, 7404 }, + { 7406, 7411 }, + { 7413, 7415 }, + { 7418, 7418 }, + { 8192, 8203 }, + { 8206, 8292 }, + { 8294, 8304 }, + { 8308, 8318 }, + { 8320, 8334 }, + { 8352, 8384 }, + { 8448, 8485 }, + { 8487, 8489 }, + { 8492, 8497 }, + { 8499, 8525 }, + { 8527, 8543 }, + { 8585, 8587 }, + { 8592, 9254 }, + { 9280, 9290 }, + { 9312, 10239 }, + { 10496, 11123 }, + { 11126, 11157 }, + { 11159, 11263 }, + { 11776, 11869 }, + { 12272, 12283 }, + { 12288, 12292 }, + { 12294, 12294 }, + { 12296, 12320 }, + { 12336, 12343 }, + { 12348, 12351 }, + { 12443, 12444 }, + { 12448, 12448 }, + { 12539, 12540 }, + { 12688, 12703 }, + { 12736, 12771 }, + { 12832, 12895 }, + { 12927, 13007 }, + { 13055, 13055 }, + { 13144, 13311 }, + { 19904, 19967 }, + { 42752, 42785 }, + { 42888, 42890 }, + { 43056, 43065 }, + { 43310, 43310 }, + { 43471, 43471 }, + { 43867, 43867 }, + { 43882, 43883 }, + { 64830, 64831 }, + { 65040, 65049 }, + { 65072, 65106 }, + { 65108, 65126 }, + { 65128, 65131 }, + { 65279, 65279 }, + { 65281, 65312 }, + { 65339, 65344 }, + { 65371, 65381 }, + { 65392, 65392 }, + { 65438, 65439 }, + { 65504, 65510 }, + { 65512, 65518 }, + { 65529, 65533 }, }; -static const URange16 Tai_Le_range16[] = { - { 6480, 6509 }, - { 6512, 6516 }, +static const URange32 Common_range32[] = { + { 65792, 65794 }, + { 65799, 65843 }, + { 65847, 65855 }, + { 65936, 65948 }, + { 66000, 66044 }, + { 66273, 66299 }, + { 113824, 113827 }, + { 118608, 118723 }, + { 118784, 119029 }, + { 119040, 119078 }, + { 119081, 119142 }, + { 119146, 119162 }, + { 119171, 119172 }, + { 119180, 119209 }, + { 119214, 119274 }, + { 119488, 119507 }, + { 119520, 119539 }, + { 119552, 119638 }, + { 119648, 119672 }, + { 119808, 119892 }, + { 119894, 119964 }, + { 119966, 119967 }, + { 119970, 119970 }, + { 119973, 119974 }, + { 119977, 119980 }, + { 119982, 119993 }, + { 119995, 119995 }, + { 119997, 120003 }, + { 120005, 120069 }, + { 120071, 120074 }, + { 120077, 120084 }, + { 120086, 120092 }, + { 120094, 120121 }, + { 120123, 120126 }, + { 120128, 120132 }, + { 120134, 120134 }, + { 120138, 120144 }, + { 120146, 120485 }, + { 120488, 120779 }, + { 120782, 120831 }, + { 126065, 126132 }, + { 126209, 126269 }, + { 126976, 127019 }, + { 127024, 127123 }, + { 127136, 127150 }, + { 127153, 127167 }, + { 127169, 127183 }, + { 127185, 127221 }, + { 127232, 127405 }, + { 127462, 127487 }, + { 127489, 127490 }, + { 127504, 127547 }, + { 127552, 127560 }, + { 127568, 127569 }, + { 127584, 127589 }, + { 127744, 128727 }, + { 128732, 128748 }, + { 128752, 128764 }, + { 128768, 128886 }, + { 128891, 128985 }, + { 128992, 129003 }, + { 129008, 129008 }, + { 129024, 129035 }, + { 129040, 129095 }, + { 129104, 129113 }, + { 129120, 129159 }, + { 129168, 129197 }, + { 129200, 129201 }, + { 129280, 129619 }, + { 129632, 129645 }, + { 129648, 129660 }, + { 129664, 129672 }, + { 129680, 129725 }, + { 129727, 129733 }, + { 129742, 129755 }, + { 129760, 129768 }, + { 129776, 129784 }, + { 129792, 129938 }, + { 129940, 129994 }, + { 130032, 130041 }, + { 917505, 917505 }, + { 917536, 917631 }, }; -static const URange16 Kayah_Li_range16[] = { - { 43264, 43309 }, - { 43311, 43311 }, +static const URange16 Coptic_range16[] = { + { 994, 1007 }, + { 11392, 11507 }, + { 11513, 11519 }, }; -static const URange16 Buginese_range16[] = { - { 6656, 6683 }, - { 6686, 6687 }, +static const URange32 Cuneiform_range32[] = { + { 73728, 74649 }, + { 74752, 74862 }, + { 74864, 74868 }, + { 74880, 75075 }, }; -static const URange32 Kharoshthi_range32[] = { - { 68096, 68099 }, - { 68101, 68102 }, - { 68108, 68115 }, - { 68117, 68119 }, - { 68121, 68149 }, - { 68152, 68154 }, - { 68159, 68168 }, - { 68176, 68184 }, +static const URange32 Cypriot_range32[] = { + { 67584, 67589 }, + { 67592, 67592 }, + { 67594, 67637 }, + { 67639, 67640 }, + { 67644, 67644 }, + { 67647, 67647 }, }; -static const URange16 Tai_Tham_range16[] = { - { 6688, 6750 }, - { 6752, 6780 }, - { 6783, 6793 }, - { 6800, 6809 }, - { 6816, 6829 }, +static const URange32 Cypro_Minoan_range32[] = { + { 77712, 77810 }, }; -static const URange32 Old_Italic_range32[] = { - { 66304, 66339 }, - { 66349, 66351 }, +static const URange16 Cyrillic_range16[] = { + { 1024, 1156 }, + { 1159, 1327 }, + { 7296, 7304 }, + { 7467, 7467 }, + { 7544, 7544 }, + { 11744, 11775 }, + { 42560, 42655 }, + { 65070, 65071 }, }; -static const URange32 Old_Persian_range32[] = { - { 66464, 66499 }, - { 66504, 66517 }, +static const URange32 Cyrillic_range32[] = { + { 122928, 122989 }, + { 123023, 123023 }, }; -static const URange32 Warang_Citi_range32[] = { - { 71840, 71922 }, - { 71935, 71935 }, +static const URange32 Deseret_range32[] = { + { 66560, 66639 }, }; -static const URange16 Latin_range16[] = { - { 65, 90 }, - { 97, 122 }, - { 170, 170 }, - { 186, 186 }, - { 192, 214 }, - { 216, 246 }, - { 248, 696 }, - { 736, 740 }, - { 7424, 7461 }, - { 7468, 7516 }, - { 7522, 7525 }, - { 7531, 7543 }, - { 7545, 7614 }, - { 7680, 7935 }, - { 8305, 8305 }, - { 8319, 8319 }, - { 8336, 8348 }, - { 8490, 8491 }, - { 8498, 8498 }, - { 8526, 8526 }, - { 8544, 8584 }, - { 11360, 11391 }, - { 42786, 42887 }, - { 42891, 42937 }, - { 42999, 43007 }, - { 43824, 43866 }, - { 43868, 43876 }, - { 64256, 64262 }, - { 65313, 65338 }, - { 65345, 65370 }, +static const URange16 Devanagari_range16[] = { + { 2304, 2384 }, + { 2389, 2403 }, + { 2406, 2431 }, + { 43232, 43263 }, }; -static const URange16 Saurashtra_range16[] = { - { 43136, 43205 }, - { 43214, 43225 }, +static const URange32 Devanagari_range32[] = { + { 72448, 72457 }, }; -static const URange32 Shavian_range32[] = { - { 66640, 66687 }, +static const URange32 Dives_Akuru_range32[] = { + { 71936, 71942 }, + { 71945, 71945 }, + { 71948, 71955 }, + { 71957, 71958 }, + { 71960, 71989 }, + { 71991, 71992 }, + { 71995, 72006 }, + { 72016, 72025 }, +}; +static const URange32 Dogra_range32[] = { + { 71680, 71739 }, +}; +static const URange32 Duployan_range32[] = { + { 113664, 113770 }, + { 113776, 113788 }, + { 113792, 113800 }, + { 113808, 113817 }, + { 113820, 113823 }, +}; +static const URange32 Egyptian_Hieroglyphs_range32[] = { + { 77824, 78933 }, +}; +static const URange32 Elbasan_range32[] = { + { 66816, 66855 }, +}; +static const URange32 Elymaic_range32[] = { + { 69600, 69622 }, +}; +static const URange16 Ethiopic_range16[] = { + { 4608, 4680 }, + { 4682, 4685 }, + { 4688, 4694 }, + { 4696, 4696 }, + { 4698, 4701 }, + { 4704, 4744 }, + { 4746, 4749 }, + { 4752, 4784 }, + { 4786, 4789 }, + { 4792, 4798 }, + { 4800, 4800 }, + { 4802, 4805 }, + { 4808, 4822 }, + { 4824, 4880 }, + { 4882, 4885 }, + { 4888, 4954 }, + { 4957, 4988 }, + { 4992, 5017 }, + { 11648, 11670 }, + { 11680, 11686 }, + { 11688, 11694 }, + { 11696, 11702 }, + { 11704, 11710 }, + { 11712, 11718 }, + { 11720, 11726 }, + { 11728, 11734 }, + { 11736, 11742 }, + { 43777, 43782 }, + { 43785, 43790 }, + { 43793, 43798 }, + { 43808, 43814 }, + { 43816, 43822 }, +}; +static const URange32 Ethiopic_range32[] = { + { 124896, 124902 }, + { 124904, 124907 }, + { 124909, 124910 }, + { 124912, 124926 }, }; static const URange16 Georgian_range16[] = { { 4256, 4293 }, @@ -365280,6 +368164,19 @@ static const URange16 Georgian_range16[] = { { 11559, 11559 }, { 11565, 11565 }, }; +static const URange16 Glagolitic_range16[] = { + { 11264, 11359 }, +}; +static const URange32 Glagolitic_range32[] = { + { 122880, 122886 }, + { 122888, 122904 }, + { 122907, 122913 }, + { 122915, 122916 }, + { 122918, 122922 }, +}; +static const URange32 Gothic_range32[] = { + { 66352, 66378 }, +}; static const URange32 Grantha_range32[] = { { 70400, 70403 }, { 70405, 70412 }, @@ -365297,51 +368194,6 @@ static const URange32 Grantha_range32[] = { { 70502, 70508 }, { 70512, 70516 }, }; -static const URange32 Duployan_range32[] = { - { 113664, 113770 }, - { 113776, 113788 }, - { 113792, 113800 }, - { 113808, 113817 }, - { 113820, 113823 }, -}; -static const URange16 Batak_range16[] = { - { 7104, 7155 }, - { 7164, 7167 }, -}; -static const URange16 Devanagari_range16[] = { - { 2304, 2384 }, - { 2387, 2403 }, - { 2406, 2431 }, - { 43232, 43263 }, -}; -static const URange16 Thai_range16[] = { - { 3585, 3642 }, - { 3648, 3675 }, -}; -static const URange16 Tibetan_range16[] = { - { 3840, 3911 }, - { 3913, 3948 }, - { 3953, 3991 }, - { 3993, 4028 }, - { 4030, 4044 }, - { 4046, 4052 }, - { 4057, 4058 }, -}; -static const URange16 Tifinagh_range16[] = { - { 11568, 11623 }, - { 11631, 11632 }, - { 11647, 11647 }, -}; -static const URange32 Ugaritic_range32[] = { - { 66432, 66461 }, - { 66463, 66463 }, -}; -static const URange16 Braille_range16[] = { - { 10240, 10495 }, -}; -static const URange32 Anatolian_Hieroglyphs_range32[] = { - { 82944, 83526 }, -}; static const URange16 Greek_range16[] = { { 880, 883 }, { 885, 887 }, @@ -365382,122 +368234,6 @@ static const URange32 Greek_range32[] = { { 65952, 65952 }, { 119296, 119365 }, }; -static const URange32 Lycian_range32[] = { - { 66176, 66204 }, -}; -static const URange32 Mende_Kikakui_range32[] = { - { 124928, 125124 }, - { 125127, 125142 }, -}; -static const URange16 Tai_Viet_range16[] = { - { 43648, 43714 }, - { 43739, 43743 }, -}; -static const URange16 Vai_range16[] = { - { 42240, 42539 }, -}; -static const URange16 Ogham_range16[] = { - { 5760, 5788 }, -}; -static const URange32 Inscriptional_Parthian_range32[] = { - { 68416, 68437 }, - { 68440, 68447 }, -}; -static const URange16 Cham_range16[] = { - { 43520, 43574 }, - { 43584, 43597 }, - { 43600, 43609 }, - { 43612, 43615 }, -}; -static const URange16 Syriac_range16[] = { - { 1792, 1805 }, - { 1807, 1866 }, - { 1869, 1871 }, - { 2144, 2154 }, -}; -static const URange16 Runic_range16[] = { - { 5792, 5866 }, - { 5870, 5880 }, -}; -static const URange32 Gothic_range32[] = { - { 66352, 66378 }, -}; -static const URange32 Mahajani_range32[] = { - { 69968, 70006 }, -}; -static const URange16 Katakana_range16[] = { - { 12449, 12538 }, - { 12541, 12543 }, - { 12784, 12799 }, - { 13008, 13054 }, - { 13056, 13143 }, - { 65382, 65391 }, - { 65393, 65437 }, -}; -static const URange32 Katakana_range32[] = { - { 110592, 110592 }, -}; -static const URange32 Osmanya_range32[] = { - { 66688, 66717 }, - { 66720, 66729 }, -}; -static const URange16 New_Tai_Lue_range16[] = { - { 6528, 6571 }, - { 6576, 6601 }, - { 6608, 6618 }, - { 6622, 6623 }, -}; -static const URange16 Ol_Chiki_range16[] = { - { 7248, 7295 }, -}; -static const URange32 Newa_range32[] = { - { 70656, 70745 }, - { 70747, 70747 }, - { 70749, 70750 }, -}; -static const URange16 Limbu_range16[] = { - { 6400, 6430 }, - { 6432, 6443 }, - { 6448, 6459 }, - { 6464, 6464 }, - { 6468, 6479 }, -}; -static const URange32 Pau_Cin_Hau_range32[] = { - { 72384, 72440 }, -}; -static const URange16 Cherokee_range16[] = { - { 5024, 5109 }, - { 5112, 5117 }, - { 43888, 43967 }, -}; -static const URange32 Miao_range32[] = { - { 93952, 94020 }, - { 94032, 94078 }, - { 94095, 94111 }, -}; -static const URange16 Oriya_range16[] = { - { 2817, 2819 }, - { 2821, 2828 }, - { 2831, 2832 }, - { 2835, 2856 }, - { 2858, 2864 }, - { 2866, 2867 }, - { 2869, 2873 }, - { 2876, 2884 }, - { 2887, 2888 }, - { 2891, 2893 }, - { 2902, 2903 }, - { 2908, 2909 }, - { 2911, 2915 }, - { 2918, 2935 }, -}; -static const URange32 Medefaidrin_range32[] = { - { 93760, 93850 }, -}; -static const URange32 Sharada_range32[] = { - { 70016, 70093 }, - { 70096, 70111 }, -}; static const URange16 Gujarati_range16[] = { { 2689, 2691 }, { 2693, 2701 }, @@ -365514,14 +368250,6 @@ static const URange16 Gujarati_range16[] = { { 2790, 2801 }, { 2809, 2815 }, }; -static const URange32 Nushu_range32[] = { - { 94177, 94177 }, - { 110960, 111355 }, -}; -static const URange32 Modi_range32[] = { - { 71168, 71236 }, - { 71248, 71257 }, -}; static const URange32 Gunjala_Gondi_range32[] = { { 73056, 73061 }, { 73063, 73064 }, @@ -365530,136 +368258,151 @@ static const URange32 Gunjala_Gondi_range32[] = { { 73107, 73112 }, { 73120, 73129 }, }; -static const URange32 Inscriptional_Pahlavi_range32[] = { - { 68448, 68466 }, - { 68472, 68479 }, +static const URange16 Gurmukhi_range16[] = { + { 2561, 2563 }, + { 2565, 2570 }, + { 2575, 2576 }, + { 2579, 2600 }, + { 2602, 2608 }, + { 2610, 2611 }, + { 2613, 2614 }, + { 2616, 2617 }, + { 2620, 2620 }, + { 2622, 2626 }, + { 2631, 2632 }, + { 2635, 2637 }, + { 2641, 2641 }, + { 2649, 2652 }, + { 2654, 2654 }, + { 2662, 2678 }, }; -static const URange32 Manichaean_range32[] = { - { 68288, 68326 }, - { 68331, 68342 }, +static const URange16 Han_range16[] = { + { 11904, 11929 }, + { 11931, 12019 }, + { 12032, 12245 }, + { 12293, 12293 }, + { 12295, 12295 }, + { 12321, 12329 }, + { 12344, 12347 }, + { 13312, 19903 }, + { 19968, 40959 }, + { 63744, 64109 }, + { 64112, 64217 }, }; -static const URange16 Khmer_range16[] = { - { 6016, 6109 }, - { 6112, 6121 }, - { 6128, 6137 }, - { 6624, 6655 }, +static const URange32 Han_range32[] = { + { 94178, 94179 }, + { 94192, 94193 }, + { 131072, 173791 }, + { 173824, 177977 }, + { 177984, 178205 }, + { 178208, 183969 }, + { 183984, 191456 }, + { 194560, 195101 }, + { 196608, 201546 }, + { 201552, 205743 }, }; -static const URange32 Cuneiform_range32[] = { - { 73728, 74649 }, - { 74752, 74862 }, - { 74864, 74868 }, - { 74880, 75075 }, +static const URange16 Hangul_range16[] = { + { 4352, 4607 }, + { 12334, 12335 }, + { 12593, 12686 }, + { 12800, 12830 }, + { 12896, 12926 }, + { 43360, 43388 }, + { 44032, 55203 }, + { 55216, 55238 }, + { 55243, 55291 }, + { 65440, 65470 }, + { 65474, 65479 }, + { 65482, 65487 }, + { 65490, 65495 }, + { 65498, 65500 }, }; -static const URange32 Khudawadi_range32[] = { - { 70320, 70378 }, - { 70384, 70393 }, +static const URange32 Hanifi_Rohingya_range32[] = { + { 68864, 68903 }, + { 68912, 68921 }, }; -static const URange16 Mandaic_range16[] = { - { 2112, 2139 }, - { 2142, 2142 }, +static const URange16 Hanunoo_range16[] = { + { 5920, 5940 }, }; static const URange32 Hatran_range32[] = { { 67808, 67826 }, { 67828, 67829 }, { 67835, 67839 }, }; -static const URange16 Syloti_Nagri_range16[] = { - { 43008, 43051 }, -}; -static const URange16 Nko_range16[] = { - { 1984, 2042 }, - { 2045, 2047 }, -}; -static const URange16 Canadian_Aboriginal_range16[] = { - { 5120, 5759 }, - { 6320, 6389 }, -}; -static const URange32 Meroitic_Hieroglyphs_range32[] = { - { 67968, 67999 }, -}; -static const URange32 Phoenician_range32[] = { - { 67840, 67867 }, - { 67871, 67871 }, -}; -static const URange32 Nabataean_range32[] = { - { 67712, 67742 }, - { 67751, 67759 }, -}; -static const URange16 Bengali_range16[] = { - { 2432, 2435 }, - { 2437, 2444 }, - { 2447, 2448 }, - { 2451, 2472 }, - { 2474, 2480 }, - { 2482, 2482 }, - { 2486, 2489 }, - { 2492, 2500 }, - { 2503, 2504 }, - { 2507, 2510 }, - { 2519, 2519 }, - { 2524, 2525 }, - { 2527, 2531 }, - { 2534, 2558 }, -}; -static const URange32 Kaithi_range32[] = { - { 69760, 69825 }, - { 69837, 69837 }, +static const URange16 Hebrew_range16[] = { + { 1425, 1479 }, + { 1488, 1514 }, + { 1519, 1524 }, + { 64285, 64310 }, + { 64312, 64316 }, + { 64318, 64318 }, + { 64320, 64321 }, + { 64323, 64324 }, + { 64326, 64335 }, }; -static const URange16 Glagolitic_range16[] = { - { 11264, 11310 }, - { 11312, 11358 }, +static const URange16 Hiragana_range16[] = { + { 12353, 12438 }, + { 12445, 12447 }, }; -static const URange32 Glagolitic_range32[] = { - { 122880, 122886 }, - { 122888, 122904 }, - { 122907, 122913 }, - { 122915, 122916 }, - { 122918, 122922 }, +static const URange32 Hiragana_range32[] = { + { 110593, 110879 }, + { 110898, 110898 }, + { 110928, 110930 }, + { 127488, 127488 }, }; static const URange32 Imperial_Aramaic_range32[] = { { 67648, 67669 }, { 67671, 67679 }, }; -static const URange32 Sora_Sompeng_range32[] = { - { 69840, 69864 }, - { 69872, 69881 }, +static const URange16 Inherited_range16[] = { + { 768, 879 }, + { 1157, 1158 }, + { 1611, 1621 }, + { 1648, 1648 }, + { 2385, 2388 }, + { 6832, 6862 }, + { 7376, 7378 }, + { 7380, 7392 }, + { 7394, 7400 }, + { 7405, 7405 }, + { 7412, 7412 }, + { 7416, 7417 }, + { 7616, 7679 }, + { 8204, 8205 }, + { 8400, 8432 }, + { 12330, 12333 }, + { 12441, 12442 }, + { 65024, 65039 }, + { 65056, 65069 }, }; -static const URange16 Gurmukhi_range16[] = { - { 2561, 2563 }, - { 2565, 2570 }, - { 2575, 2576 }, - { 2579, 2600 }, - { 2602, 2608 }, - { 2610, 2611 }, - { 2613, 2614 }, - { 2616, 2617 }, - { 2620, 2620 }, - { 2622, 2626 }, - { 2631, 2632 }, - { 2635, 2637 }, - { 2641, 2641 }, - { 2649, 2652 }, - { 2654, 2654 }, - { 2662, 2678 }, +static const URange32 Inherited_range32[] = { + { 66045, 66045 }, + { 66272, 66272 }, + { 70459, 70459 }, + { 118528, 118573 }, + { 118576, 118598 }, + { 119143, 119145 }, + { 119163, 119170 }, + { 119173, 119179 }, + { 119210, 119213 }, + { 917760, 917999 }, +}; +static const URange32 Inscriptional_Pahlavi_range32[] = { + { 68448, 68466 }, + { 68472, 68479 }, +}; +static const URange32 Inscriptional_Parthian_range32[] = { + { 68416, 68437 }, + { 68440, 68447 }, }; static const URange16 Javanese_range16[] = { { 43392, 43469 }, { 43472, 43481 }, { 43486, 43487 }, }; -static const URange32 Old_Permic_range32[] = { - { 66384, 66426 }, -}; -static const URange16 Phags_Pa_range16[] = { - { 43072, 43127 }, -}; -static const URange32 Cypriot_range32[] = { - { 67584, 67589 }, - { 67592, 67592 }, - { 67594, 67637 }, - { 67639, 67640 }, - { 67644, 67644 }, - { 67647, 67647 }, +static const URange32 Kaithi_range32[] = { + { 69760, 69826 }, + { 69837, 69837 }, }; static const URange16 Kannada_range16[] = { { 3200, 3212 }, @@ -365671,109 +368414,138 @@ static const URange16 Kannada_range16[] = { { 3270, 3272 }, { 3274, 3277 }, { 3285, 3286 }, - { 3294, 3294 }, + { 3293, 3294 }, { 3296, 3299 }, { 3302, 3311 }, - { 3313, 3314 }, -}; -static const URange32 Khojki_range32[] = { - { 70144, 70161 }, - { 70163, 70206 }, -}; -static const URange16 Mongolian_range16[] = { - { 6144, 6145 }, - { 6148, 6148 }, - { 6150, 6158 }, - { 6160, 6169 }, - { 6176, 6264 }, - { 6272, 6314 }, -}; -static const URange32 Mongolian_range32[] = { - { 71264, 71276 }, -}; -static const URange16 Sinhala_range16[] = { - { 3458, 3459 }, - { 3461, 3478 }, - { 3482, 3505 }, - { 3507, 3515 }, - { 3517, 3517 }, - { 3520, 3526 }, - { 3530, 3530 }, - { 3535, 3540 }, - { 3542, 3542 }, - { 3544, 3551 }, - { 3558, 3567 }, - { 3570, 3572 }, + { 3313, 3315 }, }; -static const URange32 Sinhala_range32[] = { - { 70113, 70132 }, +static const URange16 Katakana_range16[] = { + { 12449, 12538 }, + { 12541, 12543 }, + { 12784, 12799 }, + { 13008, 13054 }, + { 13056, 13143 }, + { 65382, 65391 }, + { 65393, 65437 }, }; -static const URange32 Brahmi_range32[] = { - { 69632, 69709 }, - { 69714, 69743 }, - { 69759, 69759 }, +static const URange32 Katakana_range32[] = { + { 110576, 110579 }, + { 110581, 110587 }, + { 110589, 110590 }, + { 110592, 110592 }, + { 110880, 110882 }, + { 110933, 110933 }, + { 110948, 110951 }, }; -static const URange32 Elbasan_range32[] = { - { 66816, 66855 }, +static const URange32 Kawi_range32[] = { + { 73472, 73488 }, + { 73490, 73530 }, + { 73534, 73561 }, }; -static const URange32 Deseret_range32[] = { - { 66560, 66639 }, +static const URange16 Kayah_Li_range16[] = { + { 43264, 43309 }, + { 43311, 43311 }, }; -static const URange16 Rejang_range16[] = { - { 43312, 43347 }, - { 43359, 43359 }, +static const URange32 Kharoshthi_range32[] = { + { 68096, 68099 }, + { 68101, 68102 }, + { 68108, 68115 }, + { 68117, 68119 }, + { 68121, 68149 }, + { 68152, 68154 }, + { 68159, 68168 }, + { 68176, 68184 }, }; -static const URange32 SignWriting_range32[] = { - { 120832, 121483 }, - { 121499, 121503 }, - { 121505, 121519 }, +static const URange32 Khitan_Small_Script_range32[] = { + { 94180, 94180 }, + { 101120, 101589 }, }; -static const URange32 Multani_range32[] = { - { 70272, 70278 }, - { 70280, 70280 }, - { 70282, 70285 }, - { 70287, 70301 }, - { 70303, 70313 }, +static const URange16 Khmer_range16[] = { + { 6016, 6109 }, + { 6112, 6121 }, + { 6128, 6137 }, + { 6624, 6655 }, }; -static const URange16 Yi_range16[] = { - { 40960, 42124 }, - { 42128, 42182 }, +static const URange32 Khojki_range32[] = { + { 70144, 70161 }, + { 70163, 70209 }, }; -static const URange16 Balinese_range16[] = { - { 6912, 6987 }, - { 6992, 7036 }, +static const URange32 Khudawadi_range32[] = { + { 70320, 70378 }, + { 70384, 70393 }, }; static const URange16 Lao_range16[] = { { 3713, 3714 }, { 3716, 3716 }, - { 3719, 3720 }, - { 3722, 3722 }, - { 3725, 3725 }, - { 3732, 3735 }, - { 3737, 3743 }, - { 3745, 3747 }, + { 3718, 3722 }, + { 3724, 3747 }, { 3749, 3749 }, - { 3751, 3751 }, - { 3754, 3755 }, - { 3757, 3769 }, - { 3771, 3773 }, + { 3751, 3773 }, { 3776, 3780 }, { 3782, 3782 }, - { 3784, 3789 }, + { 3784, 3790 }, { 3792, 3801 }, { 3804, 3807 }, }; -static const URange16 Hanunoo_range16[] = { - { 5920, 5940 }, +static const URange16 Latin_range16[] = { + { 65, 90 }, + { 97, 122 }, + { 170, 170 }, + { 186, 186 }, + { 192, 214 }, + { 216, 246 }, + { 248, 696 }, + { 736, 740 }, + { 7424, 7461 }, + { 7468, 7516 }, + { 7522, 7525 }, + { 7531, 7543 }, + { 7545, 7614 }, + { 7680, 7935 }, + { 8305, 8305 }, + { 8319, 8319 }, + { 8336, 8348 }, + { 8490, 8491 }, + { 8498, 8498 }, + { 8526, 8526 }, + { 8544, 8584 }, + { 11360, 11391 }, + { 42786, 42887 }, + { 42891, 42954 }, + { 42960, 42961 }, + { 42963, 42963 }, + { 42965, 42969 }, + { 42994, 43007 }, + { 43824, 43866 }, + { 43868, 43876 }, + { 43878, 43881 }, + { 64256, 64262 }, + { 65313, 65338 }, + { 65345, 65370 }, }; -static const URange32 Masaram_Gondi_range32[] = { - { 72960, 72966 }, - { 72968, 72969 }, - { 72971, 73014 }, - { 73018, 73018 }, - { 73020, 73021 }, - { 73023, 73031 }, - { 73040, 73049 }, +static const URange32 Latin_range32[] = { + { 67456, 67461 }, + { 67463, 67504 }, + { 67506, 67514 }, + { 122624, 122654 }, + { 122661, 122666 }, +}; +static const URange16 Lepcha_range16[] = { + { 7168, 7223 }, + { 7227, 7241 }, + { 7245, 7247 }, +}; +static const URange16 Limbu_range16[] = { + { 6400, 6430 }, + { 6432, 6443 }, + { 6448, 6459 }, + { 6464, 6464 }, + { 6468, 6479 }, +}; +static const URange32 Linear_A_range32[] = { + { 67072, 67382 }, + { 67392, 67413 }, + { 67424, 67431 }, }; static const URange32 Linear_B_range32[] = { { 65536, 65547 }, @@ -365784,356 +368556,452 @@ static const URange32 Linear_B_range32[] = { { 65616, 65629 }, { 65664, 65786 }, }; -static const URange32 Linear_A_range32[] = { - { 67072, 67382 }, - { 67392, 67413 }, - { 67424, 67431 }, -}; -static const URange32 Dogra_range32[] = { - { 71680, 71739 }, +static const URange16 Lisu_range16[] = { + { 42192, 42239 }, }; -static const URange32 Old_Turkic_range32[] = { - { 68608, 68680 }, +static const URange32 Lisu_range32[] = { + { 73648, 73648 }, }; -static const URange16 Lepcha_range16[] = { - { 7168, 7223 }, - { 7227, 7241 }, - { 7245, 7247 }, +static const URange32 Lycian_range32[] = { + { 66176, 66204 }, }; static const URange32 Lydian_range32[] = { { 67872, 67897 }, { 67903, 67903 }, }; -static const URange32 Egyptian_Hieroglyphs_range32[] = { - { 77824, 78894 }, -}; -static const URange32 Sogdian_range32[] = { - { 69424, 69465 }, -}; -static const URange32 Caucasian_Albanian_range32[] = { - { 66864, 66915 }, - { 66927, 66927 }, +static const URange32 Mahajani_range32[] = { + { 69968, 70006 }, }; static const URange32 Makasar_range32[] = { { 73440, 73464 }, }; -static const URange32 Old_Hungarian_range32[] = { - { 68736, 68786 }, - { 68800, 68850 }, - { 68858, 68863 }, +static const URange16 Malayalam_range16[] = { + { 3328, 3340 }, + { 3342, 3344 }, + { 3346, 3396 }, + { 3398, 3400 }, + { 3402, 3407 }, + { 3412, 3427 }, + { 3430, 3455 }, }; -static const URange16 Samaritan_range16[] = { - { 2048, 2093 }, - { 2096, 2110 }, +static const URange16 Mandaic_range16[] = { + { 2112, 2139 }, + { 2142, 2142 }, }; -static const URange16 Lisu_range16[] = { - { 42192, 42239 }, +static const URange32 Manichaean_range32[] = { + { 68288, 68326 }, + { 68331, 68342 }, }; -static const URange16 Buhid_range16[] = { - { 5952, 5971 }, +static const URange32 Marchen_range32[] = { + { 72816, 72847 }, + { 72850, 72871 }, + { 72873, 72886 }, }; -static const URange32 Palmyrene_range32[] = { - { 67680, 67711 }, +static const URange32 Masaram_Gondi_range32[] = { + { 72960, 72966 }, + { 72968, 72969 }, + { 72971, 73014 }, + { 73018, 73018 }, + { 73020, 73021 }, + { 73023, 73031 }, + { 73040, 73049 }, }; -static const URange32 Tirhuta_range32[] = { - { 70784, 70855 }, - { 70864, 70873 }, +static const URange32 Medefaidrin_range32[] = { + { 93760, 93850 }, +}; +static const URange16 Meetei_Mayek_range16[] = { + { 43744, 43766 }, + { 43968, 44013 }, + { 44016, 44025 }, +}; +static const URange32 Mende_Kikakui_range32[] = { + { 124928, 125124 }, + { 125127, 125142 }, +}; +static const URange32 Meroitic_Cursive_range32[] = { + { 68000, 68023 }, + { 68028, 68047 }, + { 68050, 68095 }, +}; +static const URange32 Meroitic_Hieroglyphs_range32[] = { + { 67968, 67999 }, +}; +static const URange32 Miao_range32[] = { + { 93952, 94026 }, + { 94031, 94087 }, + { 94095, 94111 }, +}; +static const URange32 Modi_range32[] = { + { 71168, 71236 }, + { 71248, 71257 }, +}; +static const URange16 Mongolian_range16[] = { + { 6144, 6145 }, + { 6148, 6148 }, + { 6150, 6169 }, + { 6176, 6264 }, + { 6272, 6314 }, +}; +static const URange32 Mongolian_range32[] = { + { 71264, 71276 }, }; static const URange32 Mro_range32[] = { { 92736, 92766 }, { 92768, 92777 }, { 92782, 92783 }, }; -static const URange16 Common_range16[] = { - { 0, 64 }, - { 91, 96 }, - { 123, 169 }, - { 171, 185 }, - { 187, 191 }, - { 215, 215 }, - { 247, 247 }, - { 697, 735 }, - { 741, 745 }, - { 748, 767 }, - { 884, 884 }, - { 894, 894 }, - { 901, 901 }, - { 903, 903 }, - { 1417, 1417 }, - { 1541, 1541 }, - { 1548, 1548 }, - { 1563, 1563 }, - { 1567, 1567 }, - { 1600, 1600 }, - { 1757, 1757 }, - { 2274, 2274 }, - { 2404, 2405 }, - { 3647, 3647 }, - { 4053, 4056 }, - { 4347, 4347 }, - { 5867, 5869 }, - { 5941, 5942 }, - { 6146, 6147 }, - { 6149, 6149 }, - { 7379, 7379 }, - { 7393, 7393 }, - { 7401, 7404 }, - { 7406, 7411 }, - { 7413, 7415 }, - { 8192, 8203 }, - { 8206, 8292 }, - { 8294, 8304 }, - { 8308, 8318 }, - { 8320, 8334 }, - { 8352, 8383 }, - { 8448, 8485 }, - { 8487, 8489 }, - { 8492, 8497 }, - { 8499, 8525 }, - { 8527, 8543 }, - { 8585, 8587 }, - { 8592, 9254 }, - { 9280, 9290 }, - { 9312, 10239 }, - { 10496, 11123 }, - { 11126, 11157 }, - { 11160, 11208 }, - { 11210, 11262 }, - { 11776, 11854 }, - { 12272, 12283 }, - { 12288, 12292 }, - { 12294, 12294 }, - { 12296, 12320 }, - { 12336, 12343 }, - { 12348, 12351 }, - { 12443, 12444 }, - { 12448, 12448 }, - { 12539, 12540 }, - { 12688, 12703 }, - { 12736, 12771 }, - { 12832, 12895 }, - { 12927, 13007 }, - { 13144, 13311 }, - { 19904, 19967 }, - { 42752, 42785 }, - { 42888, 42890 }, - { 43056, 43065 }, - { 43310, 43310 }, - { 43471, 43471 }, - { 43867, 43867 }, - { 64830, 64831 }, - { 65040, 65049 }, - { 65072, 65106 }, - { 65108, 65126 }, - { 65128, 65131 }, - { 65279, 65279 }, - { 65281, 65312 }, - { 65339, 65344 }, - { 65371, 65381 }, - { 65392, 65392 }, - { 65438, 65439 }, - { 65504, 65510 }, - { 65512, 65518 }, - { 65529, 65533 }, +static const URange32 Multani_range32[] = { + { 70272, 70278 }, + { 70280, 70280 }, + { 70282, 70285 }, + { 70287, 70301 }, + { 70303, 70313 }, }; -static const URange32 Common_range32[] = { - { 65792, 65794 }, - { 65799, 65843 }, - { 65847, 65855 }, - { 65936, 65947 }, - { 66000, 66044 }, - { 66273, 66299 }, - { 113824, 113827 }, - { 118784, 119029 }, - { 119040, 119078 }, - { 119081, 119142 }, - { 119146, 119162 }, - { 119171, 119172 }, - { 119180, 119209 }, - { 119214, 119272 }, - { 119520, 119539 }, - { 119552, 119638 }, - { 119648, 119672 }, - { 119808, 119892 }, - { 119894, 119964 }, - { 119966, 119967 }, - { 119970, 119970 }, - { 119973, 119974 }, - { 119977, 119980 }, - { 119982, 119993 }, - { 119995, 119995 }, - { 119997, 120003 }, - { 120005, 120069 }, - { 120071, 120074 }, - { 120077, 120084 }, - { 120086, 120092 }, - { 120094, 120121 }, - { 120123, 120126 }, - { 120128, 120132 }, - { 120134, 120134 }, - { 120138, 120144 }, - { 120146, 120485 }, - { 120488, 120779 }, - { 120782, 120831 }, - { 126065, 126132 }, - { 126976, 127019 }, - { 127024, 127123 }, - { 127136, 127150 }, - { 127153, 127167 }, - { 127169, 127183 }, - { 127185, 127221 }, - { 127232, 127244 }, - { 127248, 127339 }, - { 127344, 127404 }, - { 127462, 127487 }, - { 127489, 127490 }, - { 127504, 127547 }, - { 127552, 127560 }, - { 127568, 127569 }, - { 127584, 127589 }, - { 127744, 128724 }, - { 128736, 128748 }, - { 128752, 128761 }, - { 128768, 128883 }, - { 128896, 128984 }, - { 129024, 129035 }, - { 129040, 129095 }, - { 129104, 129113 }, - { 129120, 129159 }, - { 129168, 129197 }, - { 129280, 129291 }, - { 129296, 129342 }, - { 129344, 129392 }, - { 129395, 129398 }, - { 129402, 129402 }, - { 129404, 129442 }, - { 129456, 129465 }, - { 129472, 129474 }, - { 129488, 129535 }, - { 129632, 129645 }, - { 917505, 917505 }, - { 917536, 917631 }, +static const URange16 Myanmar_range16[] = { + { 4096, 4255 }, + { 43488, 43518 }, + { 43616, 43647 }, }; -static const URange16 Coptic_range16[] = { - { 994, 1007 }, - { 11392, 11507 }, - { 11513, 11519 }, +static const URange32 Nabataean_range32[] = { + { 67712, 67742 }, + { 67751, 67759 }, }; -static const URange32 Chakma_range32[] = { - { 69888, 69940 }, - { 69942, 69958 }, +static const URange32 Nag_Mundari_range32[] = { + { 124112, 124153 }, }; -static const URange16 Arabic_range16[] = { - { 1536, 1540 }, - { 1542, 1547 }, - { 1549, 1562 }, - { 1564, 1564 }, - { 1566, 1566 }, - { 1568, 1599 }, - { 1601, 1610 }, - { 1622, 1647 }, - { 1649, 1756 }, - { 1758, 1791 }, - { 1872, 1919 }, - { 2208, 2228 }, - { 2230, 2237 }, - { 2259, 2273 }, - { 2275, 2303 }, - { 64336, 64449 }, - { 64467, 64829 }, - { 64848, 64911 }, - { 64914, 64967 }, - { 65008, 65021 }, - { 65136, 65140 }, - { 65142, 65276 }, +static const URange32 Nandinagari_range32[] = { + { 72096, 72103 }, + { 72106, 72151 }, + { 72154, 72164 }, }; -static const URange32 Arabic_range32[] = { - { 69216, 69246 }, - { 126464, 126467 }, - { 126469, 126495 }, - { 126497, 126498 }, - { 126500, 126500 }, - { 126503, 126503 }, - { 126505, 126514 }, - { 126516, 126519 }, - { 126521, 126521 }, - { 126523, 126523 }, - { 126530, 126530 }, - { 126535, 126535 }, - { 126537, 126537 }, - { 126539, 126539 }, - { 126541, 126543 }, - { 126545, 126546 }, - { 126548, 126548 }, - { 126551, 126551 }, - { 126553, 126553 }, - { 126555, 126555 }, - { 126557, 126557 }, - { 126559, 126559 }, - { 126561, 126562 }, - { 126564, 126564 }, - { 126567, 126570 }, - { 126572, 126578 }, - { 126580, 126583 }, - { 126585, 126588 }, - { 126590, 126590 }, - { 126592, 126601 }, - { 126603, 126619 }, - { 126625, 126627 }, - { 126629, 126633 }, - { 126635, 126651 }, - { 126704, 126705 }, +static const URange16 New_Tai_Lue_range16[] = { + { 6528, 6571 }, + { 6576, 6601 }, + { 6608, 6618 }, + { 6622, 6623 }, }; -static const URange16 Bamum_range16[] = { - { 42656, 42743 }, +static const URange32 Newa_range32[] = { + { 70656, 70747 }, + { 70749, 70753 }, }; -static const URange32 Bamum_range32[] = { - { 92160, 92728 }, +static const URange16 Nko_range16[] = { + { 1984, 2042 }, + { 2045, 2047 }, }; -static const URange16 Myanmar_range16[] = { - { 4096, 4255 }, - { 43488, 43518 }, - { 43616, 43647 }, +static const URange32 Nushu_range32[] = { + { 94177, 94177 }, + { 110960, 111355 }, }; -static const URange32 Siddham_range32[] = { - { 71040, 71093 }, - { 71096, 71133 }, +static const URange32 Nyiakeng_Puachue_Hmong_range32[] = { + { 123136, 123180 }, + { 123184, 123197 }, + { 123200, 123209 }, + { 123214, 123215 }, }; -static const URange32 Soyombo_range32[] = { - { 72272, 72323 }, - { 72326, 72354 }, +static const URange16 Ogham_range16[] = { + { 5760, 5788 }, }; -static const URange32 Avestan_range32[] = { - { 68352, 68405 }, - { 68409, 68415 }, +static const URange16 Ol_Chiki_range16[] = { + { 7248, 7295 }, }; -static const URange16 Hebrew_range16[] = { - { 1425, 1479 }, - { 1488, 1514 }, - { 1519, 1524 }, - { 64285, 64310 }, - { 64312, 64316 }, - { 64318, 64318 }, - { 64320, 64321 }, - { 64323, 64324 }, - { 64326, 64335 }, +static const URange32 Old_Hungarian_range32[] = { + { 68736, 68786 }, + { 68800, 68850 }, + { 68858, 68863 }, +}; +static const URange32 Old_Italic_range32[] = { + { 66304, 66339 }, + { 66349, 66351 }, +}; +static const URange32 Old_North_Arabian_range32[] = { + { 68224, 68255 }, +}; +static const URange32 Old_Permic_range32[] = { + { 66384, 66426 }, +}; +static const URange32 Old_Persian_range32[] = { + { 66464, 66499 }, + { 66504, 66517 }, +}; +static const URange32 Old_Sogdian_range32[] = { + { 69376, 69415 }, +}; +static const URange32 Old_South_Arabian_range32[] = { + { 68192, 68223 }, +}; +static const URange32 Old_Turkic_range32[] = { + { 68608, 68680 }, +}; +static const URange32 Old_Uyghur_range32[] = { + { 69488, 69513 }, +}; +static const URange16 Oriya_range16[] = { + { 2817, 2819 }, + { 2821, 2828 }, + { 2831, 2832 }, + { 2835, 2856 }, + { 2858, 2864 }, + { 2866, 2867 }, + { 2869, 2873 }, + { 2876, 2884 }, + { 2887, 2888 }, + { 2891, 2893 }, + { 2901, 2903 }, + { 2908, 2909 }, + { 2911, 2915 }, + { 2918, 2935 }, +}; +static const URange32 Osage_range32[] = { + { 66736, 66771 }, + { 66776, 66811 }, +}; +static const URange32 Osmanya_range32[] = { + { 66688, 66717 }, + { 66720, 66729 }, +}; +static const URange32 Pahawh_Hmong_range32[] = { + { 92928, 92997 }, + { 93008, 93017 }, + { 93019, 93025 }, + { 93027, 93047 }, + { 93053, 93071 }, +}; +static const URange32 Palmyrene_range32[] = { + { 67680, 67711 }, +}; +static const URange32 Pau_Cin_Hau_range32[] = { + { 72384, 72440 }, +}; +static const URange16 Phags_Pa_range16[] = { + { 43072, 43127 }, +}; +static const URange32 Phoenician_range32[] = { + { 67840, 67867 }, + { 67871, 67871 }, }; static const URange32 Psalter_Pahlavi_range32[] = { { 68480, 68497 }, { 68505, 68508 }, { 68521, 68527 }, }; +static const URange16 Rejang_range16[] = { + { 43312, 43347 }, + { 43359, 43359 }, +}; +static const URange16 Runic_range16[] = { + { 5792, 5866 }, + { 5870, 5880 }, +}; +static const URange16 Samaritan_range16[] = { + { 2048, 2093 }, + { 2096, 2110 }, +}; +static const URange16 Saurashtra_range16[] = { + { 43136, 43205 }, + { 43214, 43225 }, +}; +static const URange32 Sharada_range32[] = { + { 70016, 70111 }, +}; +static const URange32 Shavian_range32[] = { + { 66640, 66687 }, +}; +static const URange32 Siddham_range32[] = { + { 71040, 71093 }, + { 71096, 71133 }, +}; +static const URange32 SignWriting_range32[] = { + { 120832, 121483 }, + { 121499, 121503 }, + { 121505, 121519 }, +}; +static const URange16 Sinhala_range16[] = { + { 3457, 3459 }, + { 3461, 3478 }, + { 3482, 3505 }, + { 3507, 3515 }, + { 3517, 3517 }, + { 3520, 3526 }, + { 3530, 3530 }, + { 3535, 3540 }, + { 3542, 3542 }, + { 3544, 3551 }, + { 3558, 3567 }, + { 3570, 3572 }, +}; +static const URange32 Sinhala_range32[] = { + { 70113, 70132 }, +}; +static const URange32 Sogdian_range32[] = { + { 69424, 69465 }, +}; +static const URange32 Sora_Sompeng_range32[] = { + { 69840, 69864 }, + { 69872, 69881 }, +}; +static const URange32 Soyombo_range32[] = { + { 72272, 72354 }, +}; +static const URange16 Sundanese_range16[] = { + { 7040, 7103 }, + { 7360, 7367 }, +}; +static const URange16 Syloti_Nagri_range16[] = { + { 43008, 43052 }, +}; +static const URange16 Syriac_range16[] = { + { 1792, 1805 }, + { 1807, 1866 }, + { 1869, 1871 }, + { 2144, 2154 }, +}; +static const URange16 Tagalog_range16[] = { + { 5888, 5909 }, + { 5919, 5919 }, +}; +static const URange16 Tagbanwa_range16[] = { + { 5984, 5996 }, + { 5998, 6000 }, + { 6002, 6003 }, +}; +static const URange16 Tai_Le_range16[] = { + { 6480, 6509 }, + { 6512, 6516 }, +}; +static const URange16 Tai_Tham_range16[] = { + { 6688, 6750 }, + { 6752, 6780 }, + { 6783, 6793 }, + { 6800, 6809 }, + { 6816, 6829 }, +}; +static const URange16 Tai_Viet_range16[] = { + { 43648, 43714 }, + { 43739, 43743 }, +}; static const URange32 Takri_range32[] = { - { 71296, 71351 }, + { 71296, 71353 }, { 71360, 71369 }, }; -// 3994 16-bit ranges, 1429 32-bit ranges +static const URange16 Tamil_range16[] = { + { 2946, 2947 }, + { 2949, 2954 }, + { 2958, 2960 }, + { 2962, 2965 }, + { 2969, 2970 }, + { 2972, 2972 }, + { 2974, 2975 }, + { 2979, 2980 }, + { 2984, 2986 }, + { 2990, 3001 }, + { 3006, 3010 }, + { 3014, 3016 }, + { 3018, 3021 }, + { 3024, 3024 }, + { 3031, 3031 }, + { 3046, 3066 }, +}; +static const URange32 Tamil_range32[] = { + { 73664, 73713 }, + { 73727, 73727 }, +}; +static const URange32 Tangsa_range32[] = { + { 92784, 92862 }, + { 92864, 92873 }, +}; +static const URange32 Tangut_range32[] = { + { 94176, 94176 }, + { 94208, 100343 }, + { 100352, 101119 }, + { 101632, 101640 }, +}; +static const URange16 Telugu_range16[] = { + { 3072, 3084 }, + { 3086, 3088 }, + { 3090, 3112 }, + { 3114, 3129 }, + { 3132, 3140 }, + { 3142, 3144 }, + { 3146, 3149 }, + { 3157, 3158 }, + { 3160, 3162 }, + { 3165, 3165 }, + { 3168, 3171 }, + { 3174, 3183 }, + { 3191, 3199 }, +}; +static const URange16 Thaana_range16[] = { + { 1920, 1969 }, +}; +static const URange16 Thai_range16[] = { + { 3585, 3642 }, + { 3648, 3675 }, +}; +static const URange16 Tibetan_range16[] = { + { 3840, 3911 }, + { 3913, 3948 }, + { 3953, 3991 }, + { 3993, 4028 }, + { 4030, 4044 }, + { 4046, 4052 }, + { 4057, 4058 }, +}; +static const URange16 Tifinagh_range16[] = { + { 11568, 11623 }, + { 11631, 11632 }, + { 11647, 11647 }, +}; +static const URange32 Tirhuta_range32[] = { + { 70784, 70855 }, + { 70864, 70873 }, +}; +static const URange32 Toto_range32[] = { + { 123536, 123566 }, +}; +static const URange32 Ugaritic_range32[] = { + { 66432, 66461 }, + { 66463, 66463 }, +}; +static const URange16 Vai_range16[] = { + { 42240, 42539 }, +}; +static const URange32 Vithkuqi_range32[] = { + { 66928, 66938 }, + { 66940, 66954 }, + { 66956, 66962 }, + { 66964, 66965 }, + { 66967, 66977 }, + { 66979, 66993 }, + { 66995, 67001 }, + { 67003, 67004 }, +}; +static const URange32 Wancho_range32[] = { + { 123584, 123641 }, + { 123647, 123647 }, +}; +static const URange32 Warang_Citi_range32[] = { + { 71840, 71922 }, + { 71935, 71935 }, +}; +static const URange32 Yezidi_range32[] = { + { 69248, 69289 }, + { 69291, 69293 }, + { 69296, 69297 }, +}; +static const URange16 Yi_range16[] = { + { 40960, 42124 }, + { 42128, 42182 }, +}; +static const URange32 Zanabazar_Square_range32[] = { + { 72192, 72263 }, +}; +// 4040 16-bit ranges, 1775 32-bit ranges const UGroup unicode_groups[] = { { "Adlam", +1, 0, 0, Adlam_range32, 3 }, { "Ahom", +1, 0, 0, Ahom_range32, 3 }, { "Anatolian_Hieroglyphs", +1, 0, 0, Anatolian_Hieroglyphs_range32, 1 }, - { "Arabic", +1, Arabic_range16, 22, Arabic_range32, 35 }, - { "Armenian", +1, Armenian_range16, 5, 0, 0 }, + { "Arabic", +1, Arabic_range16, 22, Arabic_range32, 36 }, + { "Armenian", +1, Armenian_range16, 4, 0, 0 }, { "Avestan", +1, 0, 0, Avestan_range32, 2 }, { "Balinese", +1, Balinese_range16, 2, 0, 0 }, { "Bamum", +1, Bamum_range16, 1, Bamum_range32, 1 }, @@ -366146,81 +369014,87 @@ const UGroup unicode_groups[] = { { "Braille", +1, Braille_range16, 1, 0, 0 }, { "Buginese", +1, Buginese_range16, 2, 0, 0 }, { "Buhid", +1, Buhid_range16, 1, 0, 0 }, - { "C", +1, C_range16, 16, C_range32, 8 }, - { "Canadian_Aboriginal", +1, Canadian_Aboriginal_range16, 2, 0, 0 }, + { "C", +1, C_range16, 17, C_range32, 9 }, + { "Canadian_Aboriginal", +1, Canadian_Aboriginal_range16, 2, Canadian_Aboriginal_range32, 1 }, { "Carian", +1, 0, 0, Carian_range32, 1 }, { "Caucasian_Albanian", +1, 0, 0, Caucasian_Albanian_range32, 2 }, { "Cc", +1, Cc_range16, 2, 0, 0 }, - { "Cf", +1, Cf_range16, 13, Cf_range32, 6 }, + { "Cf", +1, Cf_range16, 14, Cf_range32, 7 }, { "Chakma", +1, 0, 0, Chakma_range32, 2 }, { "Cham", +1, Cham_range16, 4, 0, 0 }, { "Cherokee", +1, Cherokee_range16, 3, 0, 0 }, + { "Chorasmian", +1, 0, 0, Chorasmian_range32, 1 }, { "Co", +1, Co_range16, 1, Co_range32, 2 }, - { "Common", +1, Common_range16, 90, Common_range32, 76 }, + { "Common", +1, Common_range16, 91, Common_range32, 82 }, { "Coptic", +1, Coptic_range16, 3, 0, 0 }, { "Cs", +1, Cs_range16, 1, 0, 0 }, { "Cuneiform", +1, 0, 0, Cuneiform_range32, 4 }, { "Cypriot", +1, 0, 0, Cypriot_range32, 6 }, - { "Cyrillic", +1, Cyrillic_range16, 8, 0, 0 }, + { "Cypro_Minoan", +1, 0, 0, Cypro_Minoan_range32, 1 }, + { "Cyrillic", +1, Cyrillic_range16, 8, Cyrillic_range32, 2 }, { "Deseret", +1, 0, 0, Deseret_range32, 1 }, - { "Devanagari", +1, Devanagari_range16, 4, 0, 0 }, + { "Devanagari", +1, Devanagari_range16, 4, Devanagari_range32, 1 }, + { "Dives_Akuru", +1, 0, 0, Dives_Akuru_range32, 8 }, { "Dogra", +1, 0, 0, Dogra_range32, 1 }, { "Duployan", +1, 0, 0, Duployan_range32, 5 }, { "Egyptian_Hieroglyphs", +1, 0, 0, Egyptian_Hieroglyphs_range32, 1 }, { "Elbasan", +1, 0, 0, Elbasan_range32, 1 }, - { "Ethiopic", +1, Ethiopic_range16, 32, 0, 0 }, + { "Elymaic", +1, 0, 0, Elymaic_range32, 1 }, + { "Ethiopic", +1, Ethiopic_range16, 32, Ethiopic_range32, 4 }, { "Georgian", +1, Georgian_range16, 10, 0, 0 }, - { "Glagolitic", +1, Glagolitic_range16, 2, Glagolitic_range32, 5 }, + { "Glagolitic", +1, Glagolitic_range16, 1, Glagolitic_range32, 5 }, { "Gothic", +1, 0, 0, Gothic_range32, 1 }, { "Grantha", +1, 0, 0, Grantha_range32, 15 }, { "Greek", +1, Greek_range16, 33, Greek_range32, 3 }, { "Gujarati", +1, Gujarati_range16, 14, 0, 0 }, { "Gunjala_Gondi", +1, 0, 0, Gunjala_Gondi_range32, 6 }, { "Gurmukhi", +1, Gurmukhi_range16, 16, 0, 0 }, - { "Han", +1, Han_range16, 11, Han_range32, 6 }, + { "Han", +1, Han_range16, 11, Han_range32, 10 }, { "Hangul", +1, Hangul_range16, 14, 0, 0 }, { "Hanifi_Rohingya", +1, 0, 0, Hanifi_Rohingya_range32, 2 }, { "Hanunoo", +1, Hanunoo_range16, 1, 0, 0 }, { "Hatran", +1, 0, 0, Hatran_range32, 3 }, { "Hebrew", +1, Hebrew_range16, 9, 0, 0 }, - { "Hiragana", +1, Hiragana_range16, 2, Hiragana_range32, 2 }, + { "Hiragana", +1, Hiragana_range16, 2, Hiragana_range32, 4 }, { "Imperial_Aramaic", +1, 0, 0, Imperial_Aramaic_range32, 2 }, - { "Inherited", +1, Inherited_range16, 20, Inherited_range32, 8 }, + { "Inherited", +1, Inherited_range16, 19, Inherited_range32, 10 }, { "Inscriptional_Pahlavi", +1, 0, 0, Inscriptional_Pahlavi_range32, 2 }, { "Inscriptional_Parthian", +1, 0, 0, Inscriptional_Parthian_range32, 2 }, { "Javanese", +1, Javanese_range16, 3, 0, 0 }, { "Kaithi", +1, 0, 0, Kaithi_range32, 2 }, { "Kannada", +1, Kannada_range16, 13, 0, 0 }, - { "Katakana", +1, Katakana_range16, 7, Katakana_range32, 1 }, + { "Katakana", +1, Katakana_range16, 7, Katakana_range32, 7 }, + { "Kawi", +1, 0, 0, Kawi_range32, 3 }, { "Kayah_Li", +1, Kayah_Li_range16, 2, 0, 0 }, { "Kharoshthi", +1, 0, 0, Kharoshthi_range32, 8 }, + { "Khitan_Small_Script", +1, 0, 0, Khitan_Small_Script_range32, 2 }, { "Khmer", +1, Khmer_range16, 4, 0, 0 }, { "Khojki", +1, 0, 0, Khojki_range32, 2 }, { "Khudawadi", +1, 0, 0, Khudawadi_range32, 2 }, - { "L", +1, L_range16, 384, L_range32, 215 }, - { "Lao", +1, Lao_range16, 18, 0, 0 }, - { "Latin", +1, Latin_range16, 30, 0, 0 }, + { "L", +1, L_range16, 380, L_range32, 279 }, + { "Lao", +1, Lao_range16, 11, 0, 0 }, + { "Latin", +1, Latin_range16, 34, Latin_range32, 5 }, { "Lepcha", +1, Lepcha_range16, 3, 0, 0 }, { "Limbu", +1, Limbu_range16, 5, 0, 0 }, { "Linear_A", +1, 0, 0, Linear_A_range32, 3 }, { "Linear_B", +1, 0, 0, Linear_B_range32, 7 }, - { "Lisu", +1, Lisu_range16, 1, 0, 0 }, - { "Ll", +1, Ll_range16, 604, Ll_range32, 34 }, - { "Lm", +1, Lm_range16, 54, Lm_range32, 3 }, - { "Lo", +1, Lo_range16, 295, Lo_range32, 175 }, + { "Lisu", +1, Lisu_range16, 1, Lisu_range32, 1 }, + { "Ll", +1, Ll_range16, 617, Ll_range32, 41 }, + { "Lm", +1, Lm_range16, 57, Lm_range32, 14 }, + { "Lo", +1, Lo_range16, 290, Lo_range32, 220 }, { "Lt", +1, Lt_range16, 10, 0, 0 }, - { "Lu", +1, Lu_range16, 594, Lu_range32, 37 }, + { "Lu", +1, Lu_range16, 605, Lu_range32, 41 }, { "Lycian", +1, 0, 0, Lycian_range32, 1 }, { "Lydian", +1, 0, 0, Lydian_range32, 2 }, - { "M", +1, M_range16, 187, M_range32, 88 }, + { "M", +1, M_range16, 190, M_range32, 120 }, { "Mahajani", +1, 0, 0, Mahajani_range32, 1 }, { "Makasar", +1, 0, 0, Makasar_range32, 1 }, - { "Malayalam", +1, Malayalam_range16, 8, 0, 0 }, + { "Malayalam", +1, Malayalam_range16, 7, 0, 0 }, { "Mandaic", +1, Mandaic_range16, 2, 0, 0 }, { "Manichaean", +1, 0, 0, Manichaean_range32, 2 }, { "Marchen", +1, 0, 0, Marchen_range32, 3 }, { "Masaram_Gondi", +1, 0, 0, Masaram_Gondi_range32, 7 }, - { "Mc", +1, Mc_range16, 110, Mc_range32, 56 }, + { "Mc", +1, Mc_range16, 112, Mc_range32, 70 }, { "Me", +1, Me_range16, 5, 0, 0 }, { "Medefaidrin", +1, 0, 0, Medefaidrin_range32, 1 }, { "Meetei_Mayek", +1, Meetei_Mayek_range16, 3, 0, 0 }, @@ -366228,21 +369102,24 @@ const UGroup unicode_groups[] = { { "Meroitic_Cursive", +1, 0, 0, Meroitic_Cursive_range32, 3 }, { "Meroitic_Hieroglyphs", +1, 0, 0, Meroitic_Hieroglyphs_range32, 1 }, { "Miao", +1, 0, 0, Miao_range32, 3 }, - { "Mn", +1, Mn_range16, 208, Mn_range32, 105 }, + { "Mn", +1, Mn_range16, 212, Mn_range32, 134 }, { "Modi", +1, 0, 0, Modi_range32, 2 }, - { "Mongolian", +1, Mongolian_range16, 6, Mongolian_range32, 1 }, + { "Mongolian", +1, Mongolian_range16, 5, Mongolian_range32, 1 }, { "Mro", +1, 0, 0, Mro_range32, 3 }, { "Multani", +1, 0, 0, Multani_range32, 5 }, { "Myanmar", +1, Myanmar_range16, 3, 0, 0 }, - { "N", +1, N_range16, 67, N_range32, 58 }, + { "N", +1, N_range16, 67, N_range32, 70 }, { "Nabataean", +1, 0, 0, Nabataean_range32, 2 }, - { "Nd", +1, Nd_range16, 37, Nd_range32, 20 }, + { "Nag_Mundari", +1, 0, 0, Nag_Mundari_range32, 1 }, + { "Nandinagari", +1, 0, 0, Nandinagari_range32, 3 }, + { "Nd", +1, Nd_range16, 37, Nd_range32, 27 }, { "New_Tai_Lue", +1, New_Tai_Lue_range16, 4, 0, 0 }, - { "Newa", +1, 0, 0, Newa_range32, 3 }, + { "Newa", +1, 0, 0, Newa_range32, 2 }, { "Nko", +1, Nko_range16, 2, 0, 0 }, { "Nl", +1, Nl_range16, 7, Nl_range32, 5 }, - { "No", +1, No_range16, 29, No_range32, 38 }, + { "No", +1, No_range16, 29, No_range32, 43 }, { "Nushu", +1, 0, 0, Nushu_range32, 2 }, + { "Nyiakeng_Puachue_Hmong", +1, 0, 0, Nyiakeng_Puachue_Hmong_range32, 4 }, { "Ogham", +1, Ogham_range16, 1, 0, 0 }, { "Ol_Chiki", +1, Ol_Chiki_range16, 1, 0, 0 }, { "Old_Hungarian", +1, 0, 0, Old_Hungarian_range32, 3 }, @@ -366253,40 +369130,41 @@ const UGroup unicode_groups[] = { { "Old_Sogdian", +1, 0, 0, Old_Sogdian_range32, 1 }, { "Old_South_Arabian", +1, 0, 0, Old_South_Arabian_range32, 1 }, { "Old_Turkic", +1, 0, 0, Old_Turkic_range32, 1 }, + { "Old_Uyghur", +1, 0, 0, Old_Uyghur_range32, 1 }, { "Oriya", +1, Oriya_range16, 14, 0, 0 }, { "Osage", +1, 0, 0, Osage_range32, 2 }, { "Osmanya", +1, 0, 0, Osmanya_range32, 2 }, - { "P", +1, P_range16, 130, P_range32, 48 }, + { "P", +1, P_range16, 133, P_range32, 58 }, { "Pahawh_Hmong", +1, 0, 0, Pahawh_Hmong_range32, 5 }, { "Palmyrene", +1, 0, 0, Palmyrene_range32, 1 }, { "Pau_Cin_Hau", +1, 0, 0, Pau_Cin_Hau_range32, 1 }, { "Pc", +1, Pc_range16, 6, 0, 0 }, - { "Pd", +1, Pd_range16, 17, 0, 0 }, - { "Pe", +1, Pe_range16, 72, 0, 0 }, + { "Pd", +1, Pd_range16, 18, Pd_range32, 1 }, + { "Pe", +1, Pe_range16, 76, 0, 0 }, { "Pf", +1, Pf_range16, 10, 0, 0 }, { "Phags_Pa", +1, Phags_Pa_range16, 1, 0, 0 }, { "Phoenician", +1, 0, 0, Phoenician_range32, 2 }, { "Pi", +1, Pi_range16, 11, 0, 0 }, - { "Po", +1, Po_range16, 127, Po_range32, 48 }, - { "Ps", +1, Ps_range16, 75, 0, 0 }, + { "Po", +1, Po_range16, 130, Po_range32, 57 }, + { "Ps", +1, Ps_range16, 79, 0, 0 }, { "Psalter_Pahlavi", +1, 0, 0, Psalter_Pahlavi_range32, 3 }, { "Rejang", +1, Rejang_range16, 2, 0, 0 }, { "Runic", +1, Runic_range16, 2, 0, 0 }, - { "S", +1, S_range16, 147, S_range32, 73 }, + { "S", +1, S_range16, 151, S_range32, 81 }, { "Samaritan", +1, Samaritan_range16, 2, 0, 0 }, { "Saurashtra", +1, Saurashtra_range16, 2, 0, 0 }, - { "Sc", +1, Sc_range16, 18, Sc_range32, 1 }, - { "Sharada", +1, 0, 0, Sharada_range32, 2 }, + { "Sc", +1, Sc_range16, 18, Sc_range32, 3 }, + { "Sharada", +1, 0, 0, Sharada_range32, 1 }, { "Shavian", +1, 0, 0, Shavian_range32, 1 }, { "Siddham", +1, 0, 0, Siddham_range32, 2 }, { "SignWriting", +1, 0, 0, SignWriting_range32, 3 }, { "Sinhala", +1, Sinhala_range16, 12, Sinhala_range32, 1 }, - { "Sk", +1, Sk_range16, 28, Sk_range32, 1 }, + { "Sk", +1, Sk_range16, 30, Sk_range32, 1 }, { "Sm", +1, Sm_range16, 53, Sm_range32, 11 }, - { "So", +1, So_range16, 112, So_range32, 62 }, + { "So", +1, So_range16, 114, So_range32, 70 }, { "Sogdian", +1, 0, 0, Sogdian_range32, 1 }, { "Sora_Sompeng", +1, 0, 0, Sora_Sompeng_range32, 2 }, - { "Soyombo", +1, 0, 0, Soyombo_range32, 2 }, + { "Soyombo", +1, 0, 0, Soyombo_range32, 1 }, { "Sundanese", +1, Sundanese_range16, 2, 0, 0 }, { "Syloti_Nagri", +1, Syloti_Nagri_range16, 1, 0, 0 }, { "Syriac", +1, Syriac_range16, 4, 0, 0 }, @@ -366296,17 +369174,22 @@ const UGroup unicode_groups[] = { { "Tai_Tham", +1, Tai_Tham_range16, 5, 0, 0 }, { "Tai_Viet", +1, Tai_Viet_range16, 2, 0, 0 }, { "Takri", +1, 0, 0, Takri_range32, 2 }, - { "Tamil", +1, Tamil_range16, 16, 0, 0 }, - { "Tangut", +1, 0, 0, Tangut_range32, 3 }, - { "Telugu", +1, Telugu_range16, 12, 0, 0 }, + { "Tamil", +1, Tamil_range16, 16, Tamil_range32, 2 }, + { "Tangsa", +1, 0, 0, Tangsa_range32, 2 }, + { "Tangut", +1, 0, 0, Tangut_range32, 4 }, + { "Telugu", +1, Telugu_range16, 13, 0, 0 }, { "Thaana", +1, Thaana_range16, 1, 0, 0 }, { "Thai", +1, Thai_range16, 2, 0, 0 }, { "Tibetan", +1, Tibetan_range16, 7, 0, 0 }, { "Tifinagh", +1, Tifinagh_range16, 3, 0, 0 }, { "Tirhuta", +1, 0, 0, Tirhuta_range32, 2 }, + { "Toto", +1, 0, 0, Toto_range32, 1 }, { "Ugaritic", +1, 0, 0, Ugaritic_range32, 2 }, { "Vai", +1, Vai_range16, 1, 0, 0 }, + { "Vithkuqi", +1, 0, 0, Vithkuqi_range32, 8 }, + { "Wancho", +1, 0, 0, Wancho_range32, 2 }, { "Warang_Citi", +1, 0, 0, Warang_Citi_range32, 2 }, + { "Yezidi", +1, 0, 0, Yezidi_range32, 3 }, { "Yi", +1, Yi_range16, 2, 0, 0 }, { "Z", +1, Z_range16, 8, 0, 0 }, { "Zanabazar_Square", +1, 0, 0, Zanabazar_Square_range32, 1 }, @@ -366314,10 +369197,10 @@ const UGroup unicode_groups[] = { { "Zp", +1, Zp_range16, 1, 0, 0 }, { "Zs", +1, Zs_range16, 7, 0, 0 }, }; -const int num_unicode_groups = 184; +const int num_unicode_groups = 199; -} // namespace duckdb_re2 +} // namespace re2 @@ -366382,7 +369265,7 @@ int chartorune(Rune *rune, const char *str) { int c, c1, c2, c3; - long l; + Rune l; /* * one character sequence @@ -366458,7 +369341,7 @@ int runetochar(char *str, const Rune *rune) { /* Runes are signed, so convert to unsigned for range check. */ - unsigned long c; + unsigned int c; /* * one character sequence @@ -366543,7 +369426,7 @@ int utflen(const char *s) { int c; - long n; + int n; Rune rune; n = 0; @@ -366563,7 +369446,7 @@ utflen(const char *s) char* utfrune(const char *s, Rune c) { - long c1; + int c1; Rune r; int n; @@ -366588,7 +369471,7 @@ utfrune(const char *s, Rune c) return 0; } -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -366746,22 +369629,7 @@ std::string StringPrintf(const char* format, ...) { return result; } -void SStringPrintf(std::string* dst, const char* format, ...) { - va_list ap; - va_start(ap, format); - dst->clear(); - StringAppendV(dst, format, ap); - va_end(ap); -} - -void StringAppendF(std::string* dst, const char* format, ...) { - va_list ap; - va_start(ap, format); - StringAppendV(dst, format, ap); - va_end(ap); -} - -} // namespace duckdb_re2 +} // namespace re2 // LICENSE_CHANGE_END @@ -386642,6 +389510,41 @@ UnicodeType Utf8Proc::Analyze(const char *s, size_t len, UnicodeInvalidReason *i return type; } +void Utf8Proc::MakeValid(char *s, size_t len, char special_flag){ + D_ASSERT(special_flag <=127); + UnicodeType type = UnicodeType::ASCII; + for (size_t i = 0; i < len; i++) { + int c = (int) s[i]; + if ((c & 0x80) == 0) { + continue; + } + int first_pos_seq = i; + if ((c & 0xE0) == 0xC0) { + /* 2 byte sequence */ + int utf8char = c & 0x1F; + type = UTF8ExtraByteLoop<1, 0x000780>(first_pos_seq, utf8char, i, s, len, nullptr, nullptr); + } else if ((c & 0xF0) == 0xE0) { + /* 3 byte sequence */ + int utf8char = c & 0x0F; + type = UTF8ExtraByteLoop<2, 0x00F800>(first_pos_seq, utf8char, i, s, len, nullptr, nullptr); + } else if ((c & 0xF8) == 0xF0) { + /* 4 byte sequence */ + int utf8char = c & 0x07; + type = UTF8ExtraByteLoop<3, 0x1F0000>(first_pos_seq, utf8char, i, s, len, nullptr, nullptr); + } else { + /* invalid UTF-8 start byte */ + s[i] = special_flag; // Rewrite invalid byte + } + if (type == UnicodeType::INVALID) { + for (size_t j = first_pos_seq; j <= i; j++) { + s[j] = special_flag; // Rewrite each byte of the invalid sequence + } + type = UnicodeType::ASCII; + } + } + D_ASSERT(Utf8Proc::IsValid(s,len)); +} + char* Utf8Proc::Normalize(const char *s, size_t len) { assert(s); assert(Utf8Proc::Analyze(s, len) != UnicodeType::INVALID); @@ -390730,6 +393633,7 @@ typedef union YYSTYPE PGOverridingKind override; PGSortByDir sortorder; PGSortByNulls nullorder; + PGIgnoreNulls ignorenulls; PGConstrType constr; PGLockClauseStrength lockstrength; PGLockWaitPolicy lockwaitpolicy; @@ -390738,7 +393642,7 @@ typedef union YYSTYPE PGInsertColumnOrder bynameorposition; } /* Line 1529 of yacc.c. */ -#line 1101 "third_party/libpg_query/grammar/grammar_out.hpp" +#line 1102 "third_party/libpg_query/grammar/grammar_out.hpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -391242,6 +394146,7 @@ typedef union YYSTYPE PGOverridingKind override; PGSortByDir sortorder; PGSortByNulls nullorder; + PGIgnoreNulls ignorenulls; PGConstrType constr; PGLockClauseStrength lockstrength; PGLockWaitPolicy lockwaitpolicy; @@ -391250,7 +394155,7 @@ typedef union YYSTYPE PGInsertColumnOrder bynameorposition; } /* Line 193 of yacc.c. */ -#line 1321 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 1322 "third_party/libpg_query/grammar/grammar_out.cpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -391275,7 +394180,7 @@ typedef struct YYLTYPE /* Line 216 of yacc.c. */ -#line 1346 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 1347 "third_party/libpg_query/grammar/grammar_out.cpp" #ifdef short # undef short @@ -391492,16 +394397,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 867 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 72581 +#define YYLAST 72739 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 525 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 459 +#define YYNNTS 460 /* YYNRULES -- Number of rules. */ -#define YYNRULES 2118 +#define YYNRULES 2120 /* YYNRULES -- Number of states. */ -#define YYNSTATES 3526 +#define YYNSTATES 3529 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -391643,110 +394548,110 @@ static const yytype_uint16 yyprhs[] = 1539, 1541, 1543, 1552, 1564, 1575, 1583, 1594, 1604, 1606, 1608, 1611, 1615, 1624, 1636, 1646, 1654, 1655, 1659, 1663, 1665, 1667, 1671, 1672, 1674, 1678, 1680, 1681, 1683, 1684, - 1686, 1687, 1689, 1693, 1695, 1697, 1699, 1703, 1705, 1706, - 1709, 1712, 1713, 1716, 1717, 1719, 1720, 1722, 1724, 1726, - 1730, 1734, 1736, 1738, 1742, 1746, 1750, 1754, 1758, 1762, - 1767, 1771, 1774, 1776, 1778, 1780, 1782, 1786, 1788, 1790, - 1794, 1796, 1798, 1802, 1806, 1810, 1812, 1815, 1820, 1825, - 1828, 1832, 1838, 1844, 1846, 1848, 1852, 1853, 1865, 1877, - 1888, 1901, 1903, 1906, 1912, 1917, 1922, 1927, 1932, 1940, - 1946, 1951, 1959, 1966, 1976, 1986, 1991, 1993, 1995, 1997, - 1999, 2001, 2003, 2005, 2011, 2013, 2015, 2019, 2021, 2024, - 2027, 2030, 2034, 2036, 2040, 2048, 2050, 2053, 2054, 2057, - 2058, 2062, 2066, 2071, 2076, 2081, 2086, 2090, 2093, 2095, - 2097, 2098, 2100, 2102, 2103, 2106, 2108, 2114, 2116, 2117, - 2120, 2123, 2124, 2126, 2127, 2131, 2137, 2139, 2143, 2148, - 2152, 2154, 2156, 2157, 2160, 2163, 2164, 2167, 2170, 2172, - 2174, 2176, 2177, 2180, 2185, 2191, 2196, 2199, 2203, 2206, - 2209, 2212, 2215, 2217, 2220, 2224, 2225, 2227, 2228, 2234, - 2236, 2241, 2248, 2251, 2253, 2254, 2259, 2260, 2262, 2264, - 2267, 2270, 2273, 2275, 2277, 2280, 2283, 2285, 2287, 2289, - 2291, 2293, 2295, 2299, 2303, 2304, 2306, 2310, 2312, 2315, - 2317, 2319, 2321, 2323, 2325, 2328, 2333, 2338, 2344, 2346, - 2348, 2351, 2352, 2355, 2356, 2358, 2362, 2364, 2365, 2367, - 2370, 2374, 2377, 2382, 2385, 2389, 2392, 2393, 2395, 2398, - 2399, 2404, 2410, 2412, 2415, 2418, 2419, 2421, 2425, 2427, - 2430, 2434, 2438, 2442, 2446, 2450, 2454, 2456, 2461, 2471, - 2481, 2485, 2486, 2489, 2492, 2493, 2499, 2503, 2504, 2506, - 2508, 2512, 2518, 2522, 2524, 2527, 2529, 2533, 2539, 2541, - 2544, 2548, 2553, 2559, 2564, 2570, 2575, 2582, 2588, 2593, - 2599, 2605, 2611, 2614, 2619, 2621, 2623, 2624, 2626, 2631, - 2637, 2642, 2643, 2646, 2649, 2652, 2654, 2656, 2658, 2660, - 2661, 2666, 2669, 2671, 2674, 2677, 2682, 2685, 2692, 2695, - 2697, 2701, 2706, 2707, 2710, 2711, 2714, 2715, 2717, 2721, - 2725, 2728, 2729, 2732, 2737, 2739, 2741, 2743, 2744, 2747, - 2751, 2757, 2764, 2767, 2771, 2773, 2779, 2785, 2791, 2795, - 2799, 2803, 2808, 2809, 2811, 2813, 2815, 2817, 2819, 2822, - 2827, 2829, 2831, 2833, 2835, 2838, 2842, 2843, 2845, 2847, - 2849, 2851, 2853, 2856, 2859, 2862, 2865, 2868, 2870, 2874, - 2875, 2877, 2879, 2881, 2883, 2889, 2892, 2894, 2896, 2898, - 2900, 2905, 2907, 2910, 2913, 2915, 2919, 2923, 2926, 2928, - 2929, 2935, 2938, 2944, 2947, 2949, 2953, 2957, 2958, 2960, + 1686, 1687, 1689, 1693, 1695, 1697, 1699, 1701, 1705, 1707, + 1708, 1711, 1714, 1715, 1718, 1719, 1721, 1722, 1724, 1726, + 1728, 1732, 1736, 1738, 1740, 1744, 1748, 1752, 1756, 1760, + 1764, 1769, 1773, 1776, 1778, 1780, 1782, 1784, 1788, 1790, + 1792, 1796, 1798, 1800, 1804, 1808, 1812, 1814, 1817, 1822, + 1827, 1830, 1834, 1840, 1846, 1848, 1850, 1854, 1855, 1867, + 1879, 1890, 1903, 1905, 1908, 1914, 1919, 1924, 1929, 1934, + 1942, 1948, 1953, 1961, 1968, 1978, 1988, 1993, 1995, 1997, + 1999, 2001, 2003, 2005, 2007, 2013, 2015, 2017, 2021, 2023, + 2026, 2029, 2032, 2036, 2038, 2042, 2050, 2052, 2055, 2056, + 2059, 2060, 2064, 2068, 2073, 2078, 2083, 2088, 2092, 2095, + 2097, 2099, 2100, 2102, 2104, 2105, 2108, 2110, 2116, 2118, + 2119, 2122, 2125, 2126, 2128, 2129, 2133, 2139, 2141, 2145, + 2150, 2154, 2156, 2158, 2159, 2162, 2165, 2166, 2169, 2172, + 2174, 2176, 2178, 2179, 2182, 2187, 2193, 2198, 2201, 2205, + 2208, 2211, 2214, 2217, 2219, 2222, 2226, 2227, 2229, 2230, + 2236, 2238, 2243, 2250, 2253, 2255, 2256, 2261, 2262, 2264, + 2266, 2269, 2272, 2275, 2277, 2279, 2282, 2285, 2287, 2289, + 2291, 2293, 2295, 2297, 2301, 2305, 2306, 2308, 2312, 2314, + 2317, 2319, 2321, 2323, 2325, 2327, 2330, 2335, 2340, 2346, + 2348, 2350, 2353, 2354, 2357, 2358, 2360, 2364, 2366, 2367, + 2369, 2372, 2376, 2379, 2384, 2387, 2391, 2394, 2395, 2397, + 2400, 2401, 2406, 2412, 2414, 2417, 2420, 2421, 2423, 2427, + 2429, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2458, 2463, + 2473, 2483, 2487, 2488, 2491, 2494, 2495, 2501, 2505, 2506, + 2508, 2510, 2514, 2520, 2524, 2526, 2529, 2531, 2535, 2541, + 2543, 2546, 2550, 2555, 2561, 2566, 2572, 2577, 2584, 2590, + 2595, 2601, 2607, 2613, 2616, 2621, 2623, 2625, 2626, 2628, + 2633, 2639, 2644, 2645, 2648, 2651, 2654, 2656, 2658, 2660, + 2662, 2663, 2668, 2671, 2673, 2676, 2679, 2684, 2687, 2694, + 2697, 2699, 2703, 2708, 2709, 2712, 2713, 2716, 2717, 2719, + 2723, 2727, 2730, 2731, 2734, 2739, 2741, 2743, 2745, 2746, + 2749, 2753, 2759, 2766, 2769, 2773, 2775, 2781, 2787, 2793, + 2797, 2801, 2805, 2810, 2811, 2813, 2815, 2817, 2819, 2821, + 2824, 2829, 2831, 2833, 2835, 2837, 2840, 2844, 2845, 2847, + 2849, 2851, 2853, 2855, 2858, 2861, 2864, 2867, 2870, 2872, + 2876, 2877, 2879, 2881, 2883, 2885, 2891, 2894, 2896, 2898, + 2900, 2902, 2907, 2909, 2912, 2915, 2917, 2921, 2925, 2928, + 2930, 2931, 2937, 2940, 2946, 2949, 2951, 2955, 2959, 2960, 2962, 2964, 2966, 2968, 2970, 2972, 2974, 2976, 2978, 2980, 2982, 2984, 2986, 2988, 2990, 2992, 2994, 2996, 2998, 3000, 3002, 3004, 3006, 3008, 3010, 3012, 3014, 3016, 3018, 3020, - 3022, 3024, 3026, 3028, 3030, 3034, 3038, 3042, 3046, 3050, - 3054, 3058, 3059, 3061, 3065, 3069, 3075, 3078, 3081, 3085, - 3089, 3093, 3097, 3101, 3105, 3109, 3113, 3117, 3121, 3125, - 3129, 3133, 3137, 3141, 3144, 3147, 3151, 3155, 3158, 3161, - 3165, 3169, 3175, 3180, 3187, 3191, 3197, 3202, 3209, 3214, - 3221, 3227, 3235, 3239, 3242, 3247, 3251, 3254, 3258, 3262, - 3266, 3270, 3275, 3279, 3284, 3288, 3293, 3299, 3306, 3313, - 3321, 3328, 3336, 3343, 3351, 3355, 3360, 3365, 3372, 3374, - 3379, 3383, 3389, 3391, 3395, 3398, 3401, 3405, 3409, 3413, - 3417, 3421, 3425, 3429, 3433, 3437, 3441, 3445, 3449, 3453, - 3457, 3461, 3464, 3467, 3473, 3480, 3487, 3495, 3497, 3500, - 3502, 3504, 3506, 3509, 3512, 3517, 3521, 3523, 3525, 3527, - 3529, 3531, 3536, 3538, 3540, 3544, 3546, 3549, 3554, 3557, - 3560, 3564, 3568, 3575, 3583, 3593, 3601, 3609, 3615, 3617, - 3619, 3621, 3627, 3634, 3641, 3646, 3651, 3656, 3661, 3668, - 3674, 3680, 3686, 3691, 3698, 3703, 3711, 3721, 3727, 3728, - 3734, 3739, 3740, 3742, 3743, 3746, 3747, 3749, 3753, 3757, - 3760, 3763, 3764, 3771, 3773, 3774, 3778, 3779, 3783, 3787, - 3791, 3792, 3794, 3799, 3802, 3805, 3808, 3811, 3814, 3818, - 3821, 3824, 3828, 3829, 3834, 3838, 3840, 3846, 3850, 3852, - 3856, 3858, 3861, 3865, 3867, 3871, 3873, 3876, 3878, 3879, - 3881, 3883, 3885, 3887, 3889, 3891, 3893, 3895, 3897, 3899, + 3022, 3024, 3026, 3028, 3030, 3032, 3036, 3040, 3044, 3048, + 3052, 3056, 3060, 3061, 3063, 3067, 3071, 3077, 3080, 3083, + 3087, 3091, 3095, 3099, 3103, 3107, 3111, 3115, 3119, 3123, + 3127, 3131, 3135, 3139, 3143, 3146, 3149, 3153, 3157, 3160, + 3163, 3167, 3171, 3177, 3182, 3189, 3193, 3199, 3204, 3211, + 3216, 3223, 3229, 3237, 3241, 3244, 3249, 3253, 3256, 3260, + 3264, 3268, 3272, 3277, 3281, 3286, 3290, 3295, 3301, 3308, + 3315, 3323, 3330, 3338, 3345, 3353, 3357, 3362, 3367, 3374, + 3376, 3381, 3385, 3391, 3393, 3397, 3400, 3403, 3407, 3411, + 3415, 3419, 3423, 3427, 3431, 3435, 3439, 3443, 3447, 3451, + 3455, 3459, 3463, 3466, 3469, 3475, 3482, 3489, 3497, 3499, + 3502, 3504, 3506, 3508, 3511, 3514, 3519, 3523, 3525, 3527, + 3529, 3531, 3533, 3538, 3540, 3542, 3544, 3546, 3549, 3554, + 3557, 3560, 3564, 3568, 3572, 3579, 3587, 3597, 3605, 3613, + 3619, 3621, 3623, 3625, 3631, 3638, 3645, 3650, 3655, 3660, + 3665, 3672, 3678, 3684, 3690, 3695, 3702, 3707, 3715, 3725, + 3731, 3732, 3738, 3743, 3744, 3746, 3747, 3750, 3751, 3753, + 3757, 3761, 3764, 3767, 3768, 3775, 3777, 3778, 3782, 3783, + 3787, 3791, 3795, 3796, 3798, 3803, 3806, 3809, 3812, 3815, + 3818, 3822, 3825, 3828, 3832, 3833, 3838, 3842, 3844, 3850, + 3854, 3856, 3860, 3862, 3865, 3869, 3871, 3875, 3877, 3880, + 3882, 3883, 3885, 3887, 3889, 3891, 3893, 3895, 3897, 3899, 3901, 3903, 3905, 3907, 3909, 3911, 3913, 3915, 3917, 3919, - 3924, 3926, 3931, 3933, 3938, 3940, 3943, 3945, 3948, 3950, - 3953, 3955, 3959, 3961, 3965, 3967, 3970, 3972, 3976, 3978, - 3981, 3983, 3984, 3986, 3990, 3992, 3996, 4000, 4002, 4006, - 4010, 4011, 4013, 4015, 4017, 4019, 4021, 4023, 4025, 4027, - 4029, 4031, 4033, 4035, 4037, 4039, 4044, 4048, 4051, 4055, - 4056, 4060, 4064, 4067, 4070, 4072, 4073, 4076, 4079, 4083, - 4086, 4088, 4090, 4094, 4100, 4102, 4105, 4110, 4113, 4114, - 4116, 4117, 4119, 4122, 4126, 4132, 4140, 4148, 4150, 4151, - 4152, 4155, 4156, 4159, 4163, 4167, 4171, 4177, 4185, 4193, - 4194, 4197, 4199, 4200, 4202, 4203, 4205, 4209, 4211, 4214, - 4218, 4221, 4223, 4228, 4231, 4233, 4234, 4238, 4240, 4244, - 4246, 4249, 4254, 4257, 4258, 4260, 4264, 4266, 4270, 4272, - 4275, 4277, 4281, 4283, 4285, 4288, 4290, 4292, 4295, 4297, - 4299, 4302, 4310, 4313, 4319, 4323, 4327, 4329, 4331, 4333, + 3921, 3923, 3928, 3930, 3935, 3937, 3942, 3944, 3947, 3949, + 3952, 3954, 3957, 3959, 3963, 3965, 3969, 3971, 3974, 3976, + 3980, 3982, 3985, 3987, 3988, 3990, 3994, 3996, 4000, 4004, + 4006, 4010, 4014, 4015, 4017, 4019, 4021, 4023, 4025, 4027, + 4029, 4031, 4033, 4035, 4037, 4039, 4041, 4043, 4048, 4052, + 4055, 4059, 4060, 4064, 4068, 4071, 4074, 4076, 4077, 4080, + 4083, 4087, 4090, 4092, 4094, 4098, 4104, 4106, 4109, 4114, + 4117, 4118, 4120, 4121, 4123, 4126, 4130, 4136, 4144, 4152, + 4154, 4155, 4156, 4159, 4160, 4163, 4167, 4171, 4175, 4181, + 4189, 4197, 4198, 4201, 4203, 4204, 4206, 4207, 4209, 4213, + 4215, 4218, 4222, 4225, 4227, 4232, 4235, 4237, 4238, 4242, + 4244, 4248, 4250, 4253, 4258, 4261, 4262, 4264, 4268, 4270, + 4274, 4276, 4279, 4281, 4285, 4287, 4289, 4292, 4294, 4296, + 4299, 4301, 4303, 4306, 4314, 4317, 4323, 4327, 4331, 4333, 4335, 4337, 4339, 4341, 4343, 4345, 4347, 4349, 4351, 4353, - 4355, 4358, 4361, 4365, 4369, 4370, 4372, 4374, 4376, 4382, - 4386, 4387, 4389, 4391, 4393, 4395, 4397, 4399, 4404, 4412, - 4419, 4422, 4423, 4425, 4427, 4429, 4431, 4445, 4462, 4464, - 4467, 4468, 4470, 4471, 4473, 4474, 4477, 4478, 4480, 4481, - 4488, 4497, 4504, 4513, 4520, 4529, 4533, 4536, 4538, 4539, - 4546, 4553, 4555, 4557, 4559, 4561, 4563, 4565, 4568, 4570, - 4572, 4574, 4576, 4578, 4583, 4590, 4594, 4597, 4602, 4606, - 4612, 4614, 4615, 4617, 4619, 4620, 4622, 4624, 4626, 4628, + 4355, 4357, 4359, 4362, 4365, 4369, 4373, 4374, 4376, 4378, + 4380, 4386, 4390, 4391, 4393, 4395, 4397, 4399, 4401, 4403, + 4408, 4416, 4423, 4426, 4427, 4429, 4431, 4433, 4435, 4449, + 4466, 4468, 4471, 4472, 4474, 4475, 4477, 4478, 4481, 4482, + 4484, 4485, 4492, 4501, 4508, 4517, 4524, 4533, 4537, 4540, + 4542, 4543, 4550, 4557, 4559, 4561, 4563, 4565, 4567, 4569, + 4572, 4574, 4576, 4578, 4580, 4582, 4587, 4594, 4598, 4601, + 4606, 4610, 4616, 4618, 4619, 4621, 4623, 4624, 4626, 4628, 4630, 4632, 4634, 4636, 4638, 4640, 4642, 4644, 4646, 4648, 4650, 4652, 4654, 4656, 4658, 4660, 4662, 4664, 4666, 4668, 4670, 4672, 4674, 4676, 4678, 4680, 4682, 4684, 4686, 4688, - 4690, 4692, 4696, 4698, 4700, 4702, 4704, 4706, 4708, 4711, - 4713, 4715, 4718, 4722, 4726, 4730, 4732, 4736, 4740, 4743, - 4747, 4751, 4753, 4755, 4757, 4761, 4767, 4769, 4771, 4773, - 4775, 4779, 4782, 4785, 4789, 4794, 4800, 4802, 4804, 4806, - 4808, 4813, 4820, 4826, 4831, 4838, 4840, 4842, 4844, 4846, - 4848, 4850, 4851, 4853, 4857, 4859, 4860, 4868, 4872, 4874, - 4877, 4881, 4884, 4885, 4888, 4889, 4892, 4897, 4903, 4912, - 4915, 4919, 4925, 4927, 4928, 4931, 4932, 4935, 4939, 4943, - 4947, 4949, 4951, 4953, 4956, 4960, 4963, 4966, 4969, 4972, - 4976, 4981, 4985, 4987, 4989, 4991, 4993, 4995, 4997, 4998, - 5000, 5004, 5006, 5010, 5013, 5023, 5036, 5048, 5061, 5076, - 5080, 5085, 5090, 5091, 5099, 5110, 5120, 5123, 5127, 5128, - 5133, 5135, 5137, 5139, 5141, 5143, 5145, 5147, 5149, 5151, + 4690, 4692, 4694, 4696, 4700, 4702, 4704, 4706, 4708, 4710, + 4712, 4715, 4717, 4719, 4722, 4726, 4730, 4734, 4736, 4740, + 4744, 4747, 4751, 4755, 4757, 4759, 4761, 4765, 4771, 4773, + 4775, 4777, 4779, 4783, 4786, 4789, 4793, 4798, 4804, 4806, + 4808, 4810, 4812, 4817, 4824, 4830, 4835, 4842, 4844, 4846, + 4848, 4850, 4852, 4854, 4855, 4857, 4861, 4863, 4864, 4872, + 4876, 4878, 4881, 4885, 4888, 4889, 4892, 4893, 4896, 4901, + 4907, 4916, 4919, 4923, 4929, 4931, 4932, 4935, 4936, 4939, + 4943, 4947, 4951, 4953, 4955, 4957, 4960, 4964, 4967, 4970, + 4973, 4976, 4980, 4985, 4989, 4991, 4993, 4995, 4997, 4999, + 5001, 5002, 5004, 5008, 5010, 5014, 5017, 5027, 5040, 5052, + 5065, 5080, 5084, 5089, 5094, 5095, 5103, 5114, 5124, 5127, + 5131, 5132, 5137, 5139, 5141, 5143, 5145, 5147, 5149, 5151, 5153, 5155, 5157, 5159, 5161, 5163, 5165, 5167, 5169, 5171, 5173, 5175, 5177, 5179, 5181, 5183, 5185, 5187, 5189, 5191, 5193, 5195, 5197, 5199, 5201, 5203, 5205, 5207, 5209, 5211, @@ -391807,21 +394712,22 @@ static const yytype_uint16 yyprhs[] = 6293, 6295, 6297, 6299, 6301, 6303, 6305, 6307, 6309, 6311, 6313, 6315, 6317, 6319, 6321, 6323, 6325, 6327, 6329, 6331, 6333, 6335, 6337, 6339, 6341, 6343, 6345, 6347, 6349, 6351, - 6353, 6355, 6357, 6359, 6361, 6363, 6365, 6367, 6369 + 6353, 6355, 6357, 6359, 6361, 6363, 6365, 6367, 6369, 6371, + 6373 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 526, 0, -1, 527, -1, 527, 517, 528, -1, 528, - -1, 920, -1, 586, -1, 529, -1, 957, -1, 958, - -1, 971, -1, 921, -1, 923, -1, 656, -1, 974, - -1, 652, -1, 910, -1, 578, -1, 576, -1, 598, - -1, 572, -1, 540, -1, 953, -1, 959, -1, 593, - -1, 646, -1, 582, -1, 928, -1, 926, -1, 927, - -1, 913, -1, 551, -1, 945, -1, 575, -1, 907, + -1, 921, -1, 586, -1, 529, -1, 958, -1, 959, + -1, 972, -1, 922, -1, 924, -1, 656, -1, 975, + -1, 652, -1, 911, -1, 578, -1, 576, -1, 598, + -1, 572, -1, 540, -1, 954, -1, 960, -1, 593, + -1, 646, -1, 582, -1, 929, -1, 927, -1, 928, + -1, 914, -1, 551, -1, 946, -1, 575, -1, 908, -1, 549, -1, 674, -1, 595, -1, 655, -1, 597, - -1, 948, -1, 962, -1, 939, -1, 965, -1, 972, + -1, 949, -1, 963, -1, 940, -1, 966, -1, 973, -1, -1, 32, 416, 761, 537, -1, 32, 416, 191, 152, 761, 537, -1, 32, 202, 541, 537, -1, 32, 202, 191, 152, 541, 537, -1, 32, 381, 541, 537, @@ -391842,50 +394748,50 @@ static const yytype_int16 yyrhs[] = 137, 190, 191, 152, -1, 137, 550, 191, 152, 542, 650, -1, 137, 550, 542, 650, -1, 32, 550, 542, 539, 439, 774, 770, 535, -1, 32, 550, 542, 538, - -1, 26, 615, -1, 32, 93, 895, 599, -1, 457, - 93, 895, -1, 137, 93, 191, 152, 895, 650, -1, - 137, 93, 895, 650, -1, 386, 244, -1, 386, 448, + -1, 26, 615, -1, 32, 93, 896, 599, -1, 457, + 93, 896, -1, 137, 93, 191, 152, 896, 650, -1, + 137, 93, 896, 650, -1, 386, 244, -1, 386, 448, -1, 386, 613, -1, 354, 613, -1, 538, -1, 454, 809, -1, -1, 609, -1, 386, 609, -1, 26, 609, -1, 137, 623, -1, 534, -1, 537, 518, 534, -1, 293, 514, 533, 515, -1, 386, 107, -1, 386, -1, - -1, 111, 895, -1, 111, 325, 895, -1, 111, 30, + -1, 111, 896, -1, 111, 325, 896, -1, 111, 30, -1, 111, 325, 30, -1, 543, -1, 542, 545, -1, - 3, -1, 977, -1, 978, -1, 542, -1, 5, -1, + 3, -1, 978, -1, 979, -1, 542, -1, 5, -1, 5, -1, 546, -1, 545, 546, -1, 516, 547, -1, - 548, -1, 3, -1, 981, -1, 977, -1, 983, -1, - 32, 370, 895, 350, 428, 895, -1, 32, 416, 761, - 350, 428, 895, -1, 32, 416, 191, 152, 761, 350, - 428, 895, -1, 32, 381, 541, 350, 428, 895, -1, - 32, 381, 191, 152, 541, 350, 428, 895, -1, 32, - 466, 541, 350, 428, 895, -1, 32, 466, 191, 152, - 541, 350, 428, 895, -1, 32, 202, 541, 350, 428, - 895, -1, 32, 202, 191, 152, 541, 350, 428, 895, - -1, 32, 416, 761, 350, 550, 895, 428, 895, -1, - 32, 416, 191, 152, 761, 350, 550, 895, 428, 895, - -1, 32, 416, 761, 350, 93, 895, 428, 895, -1, - 32, 416, 191, 152, 761, 350, 93, 895, 428, 895, + 548, -1, 3, -1, 982, -1, 978, -1, 984, -1, + 32, 370, 896, 350, 428, 896, -1, 32, 416, 761, + 350, 428, 896, -1, 32, 416, 191, 152, 761, 350, + 428, 896, -1, 32, 381, 541, 350, 428, 896, -1, + 32, 381, 191, 152, 541, 350, 428, 896, -1, 32, + 466, 541, 350, 428, 896, -1, 32, 466, 191, 152, + 541, 350, 428, 896, -1, 32, 202, 541, 350, 428, + 896, -1, 32, 202, 191, 152, 541, 350, 428, 896, + -1, 32, 416, 761, 350, 550, 896, 428, 896, -1, + 32, 416, 191, 152, 761, 350, 550, 896, 428, 896, + -1, 32, 416, 761, 350, 93, 896, 428, 896, -1, + 32, 416, 191, 152, 761, 350, 93, 896, 428, 896, -1, 82, -1, -1, 556, 212, 559, 219, 553, 554, 552, 560, 562, -1, 674, -1, 303, 563, 459, 674, -1, 514, 567, 515, 674, -1, 514, 567, 515, 303, 563, 459, 674, -1, 117, 460, -1, 541, -1, 541, 40, 542, -1, 59, 265, -1, 59, 320, -1, -1, - 514, 570, 515, 767, -1, 289, 93, 895, -1, -1, - 686, -1, -1, 542, 876, -1, 571, 503, 809, -1, + 514, 570, 515, 767, -1, 289, 93, 896, -1, -1, + 686, -1, -1, 542, 877, -1, 571, 503, 809, -1, 514, 564, 515, 503, 809, -1, 294, 352, -1, 294, 192, -1, -1, 289, 91, 555, 133, 451, 386, 569, 767, -1, 289, 91, 555, 133, 275, -1, -1, 542, - 565, 566, 702, 703, -1, 818, 565, 566, 702, 703, + 565, 566, 702, 703, -1, 819, 565, 566, 702, 703, -1, 514, 809, 515, 565, 566, 702, 703, -1, 358, - 882, -1, -1, 453, -1, 415, -1, 571, -1, 564, - 518, 571, -1, 80, 902, -1, -1, 902, -1, -1, + 883, -1, -1, 453, -1, 415, -1, 571, -1, 564, + 518, 571, -1, 80, 903, -1, -1, 903, -1, -1, 557, -1, 567, 518, 557, -1, 558, -1, 568, 518, 558, -1, 568, -1, 568, 518, -1, 561, -1, 570, - 518, 561, -1, 542, 876, -1, 100, 439, 541, 40, + 518, 561, -1, 542, 877, -1, 100, 439, 541, 40, 144, 675, -1, 100, 439, 541, 40, 144, 514, 573, 515, -1, 100, 439, 541, 40, 774, -1, 574, -1, -1, 544, -1, 574, 518, 544, -1, 322, 542, -1, - 322, 542, 503, 944, -1, 322, 542, 514, 856, 515, + 322, 542, 503, 945, -1, 322, 542, 514, 857, 515, -1, 100, 644, 381, 541, 577, -1, 100, 644, 381, 191, 274, 152, 541, 577, -1, 100, 294, 352, 644, 381, 541, 577, -1, 587, -1, -1, 100, 580, 377, @@ -391893,20 +394799,20 @@ static const yytype_int16 yyrhs[] = 274, 152, 579, 581, 514, 673, 515, -1, 100, 294, 352, 580, 377, 579, 581, 514, 673, 515, -1, -1, 542, -1, -1, 422, -1, 313, -1, -1, 198, 3, - -1, 151, 895, 585, -1, 100, 644, 416, 976, 40, - 151, 895, 585, 975, -1, 100, 644, 416, 191, 274, - 152, 976, 40, 151, 895, 585, 975, -1, 809, -1, - 905, 13, 809, -1, 583, -1, 584, 518, 583, -1, + -1, 151, 896, 585, -1, 100, 644, 416, 977, 40, + 151, 896, 585, 976, -1, 100, 644, 416, 191, 274, + 152, 977, 40, 151, 896, 585, 976, -1, 809, -1, + 906, 13, 809, -1, 583, -1, 584, 518, 583, -1, 514, 584, 515, -1, -1, 32, 381, 541, 587, -1, 32, 381, 191, 152, 541, 587, -1, 590, -1, 587, 590, -1, 476, -1, 500, -1, -1, 4, -1, 505, 4, -1, 506, 4, -1, 592, -1, 40, 777, -1, 60, 589, -1, 106, -1, 272, 106, -1, 201, 591, 589, -1, 250, 589, -1, 260, 589, -1, 272, 250, - -1, 272, 260, -1, 304, 59, 902, -1, 381, 265, - 902, -1, 400, 588, 589, -1, 356, -1, 356, 588, - 589, -1, 59, -1, -1, 898, -1, 505, 898, -1, - 506, 898, -1, 137, 580, 377, 542, 594, -1, 137, + -1, 272, 260, -1, 304, 59, 903, -1, 381, 265, + 903, -1, 400, 588, 589, -1, 356, -1, 356, 588, + 589, -1, 59, -1, -1, 899, -1, 505, 899, -1, + 506, 899, -1, 137, 580, 377, 542, 594, -1, 137, 580, 377, 191, 152, 542, 594, -1, -1, 171, 3, -1, 22, 596, -1, 52, 596, -1, 400, 596, -1, 86, 596, -1, 143, 596, -1, 363, 596, -1, 479, @@ -391914,13 +394820,13 @@ static const yytype_int16 yyrhs[] = 541, 514, 631, 515, 620, 612, -1, 100, 644, 416, 191, 274, 152, 541, 514, 631, 515, 620, 612, -1, 100, 294, 352, 644, 416, 541, 514, 631, 515, 620, - 612, -1, -1, 599, 624, -1, 639, -1, 983, -1, - 848, -1, 589, -1, 544, -1, 273, -1, 514, 587, + 612, -1, -1, 599, 624, -1, 639, -1, 984, -1, + 849, -1, 589, -1, 544, -1, 273, -1, 514, 587, 515, -1, -1, 544, -1, 272, 25, -1, 357, -1, - 63, -1, 386, 279, -1, 386, 117, -1, 93, 895, - 605, -1, 605, -1, 619, -1, 80, 902, -1, 274, + 63, -1, 386, 279, -1, 386, 117, -1, 93, 896, + 605, -1, 605, -1, 619, -1, 80, 903, -1, 274, 279, -1, 279, -1, 445, 630, -1, 328, 226, 630, - -1, 74, 514, 809, 515, 614, -1, 454, 88, 895, + -1, 74, 514, 809, 515, 614, -1, 454, 88, 896, -1, 117, 810, -1, 344, 541, 633, 642, 611, -1, 468, -1, 406, -1, 606, -1, -1, 175, 645, 40, 190, 601, -1, 175, 645, 40, 514, 809, 515, 607, @@ -391928,7 +394834,7 @@ static const yytype_int16 yyrhs[] = 289, 451, 603, -1, 610, -1, 635, -1, 610, 635, -1, 635, 610, -1, -1, 289, 86, 137, -1, 289, 86, 122, 366, -1, 289, 86, 327, 366, -1, -1, - 514, 617, 515, -1, 272, 204, -1, -1, 93, 895, + 514, 617, 515, -1, 272, 204, -1, -1, 93, 896, 640, -1, 640, -1, 85, -1, 94, -1, 118, -1, 190, -1, 203, -1, 402, -1, 405, -1, 30, -1, 636, -1, 617, 518, 636, -1, 454, 202, 627, -1, @@ -391945,8 +394851,8 @@ static const yytype_int16 yyrhs[] = 604, -1, -1, 289, 122, 603, -1, 548, 503, 600, -1, 548, -1, 548, 516, 548, 503, 600, -1, 548, 516, 548, -1, 632, -1, 637, 518, 632, -1, 637, - -1, 637, 518, -1, 774, -1, 899, 903, 509, 439, - -1, 387, 899, 903, 509, 439, -1, 74, 514, 809, + -1, 637, 518, -1, 774, -1, 900, 904, 509, 439, + -1, 387, 900, 904, 509, 439, -1, 74, 514, 809, 515, 599, -1, 445, 514, 638, 515, 630, 599, -1, 445, 618, 599, -1, 328, 226, 514, 638, 515, 630, 599, -1, 328, 226, 618, 599, -1, 168, 226, 514, @@ -391956,17 +394862,17 @@ static const yytype_int16 yyrhs[] = -1, 420, -1, 240, 422, -1, 240, 420, -1, 177, 422, -1, 177, 420, -1, 448, -1, -1, 33, -1, 59, 117, -1, 137, 647, 191, 152, 649, 650, -1, - 137, 647, 649, 650, -1, 137, 648, 191, 152, 892, - 650, -1, 137, 648, 892, 650, -1, 137, 651, 895, - 289, 902, 650, -1, 137, 651, 191, 152, 895, 289, - 902, 650, -1, 416, -1, 381, -1, 173, -1, 245, + 137, 647, 649, 650, -1, 137, 648, 191, 152, 893, + 650, -1, 137, 648, 893, 650, -1, 137, 651, 896, + 289, 903, 650, -1, 137, 651, 191, 152, 896, 289, + 903, 650, -1, 416, -1, 381, -1, 173, -1, 245, -1, 245, 416, -1, 466, -1, 249, 466, -1, 202, -1, 168, 416, -1, 81, -1, 97, -1, 370, -1, 402, -1, 423, 374, 307, -1, 423, 374, 129, -1, 423, 374, 421, -1, 423, 374, 90, -1, 439, -1, 24, 251, -1, 146, 433, -1, 156, -1, 168, 107, - 480, -1, 334, -1, 384, -1, 902, -1, 649, 518, - 902, -1, 63, -1, 357, -1, -1, 319, -1, 367, + 480, -1, 334, -1, 384, -1, 903, -1, 649, 518, + 903, -1, 63, -1, 357, -1, -1, 319, -1, 367, -1, 433, -1, 100, 644, 653, 541, 654, 40, 416, 674, -1, 100, 644, 653, 191, 274, 152, 541, 654, 40, 416, 674, -1, 100, 294, 352, 644, 653, 541, @@ -391974,493 +394880,493 @@ static const yytype_int16 yyrhs[] = 40, 809, -1, 100, 644, 653, 191, 274, 152, 541, 654, 40, 809, -1, 100, 294, 352, 644, 653, 541, 654, 40, 809, -1, 173, -1, 245, -1, 514, 515, - -1, 514, 856, 515, -1, 556, 451, 954, 386, 569, - 741, 955, 562, -1, 98, 669, 541, 633, 667, 658, + -1, 514, 857, 515, -1, 556, 451, 955, 386, 569, + 741, 956, 562, -1, 98, 669, 541, 633, 667, 658, 663, 672, 659, 588, 664, -1, 98, 514, 674, 515, 428, 663, 672, 588, 664, -1, 98, 171, 108, 542, 428, 542, 657, -1, -1, 514, 370, 515, -1, 514, 107, 515, -1, 171, -1, 428, -1, 661, 124, 544, -1, -1, 671, -1, 660, 518, 671, -1, 454, -1, -1, 40, -1, -1, 333, -1, -1, 668, -1, 514, - 673, 515, -1, 936, -1, 589, -1, 507, -1, 514, - 660, 515, -1, 815, -1, -1, 548, 665, -1, 476, - 287, -1, -1, 668, 670, -1, -1, 55, -1, -1, - 55, -1, 287, -1, 170, -1, 123, 662, 544, -1, - 279, 662, 544, -1, 102, -1, 186, -1, 336, 662, - 544, -1, 145, 662, 544, -1, 167, 336, 637, -1, - 167, 336, 507, -1, 309, 59, 637, -1, 309, 59, - 507, -1, 167, 274, 279, 637, -1, 167, 279, 637, - -1, 141, 544, -1, 936, -1, 544, -1, 403, -1, - 404, -1, 3, 516, 542, -1, 3, -1, 666, -1, - 673, 518, 666, -1, 676, -1, 675, -1, 514, 676, - 515, -1, 514, 675, 515, -1, 514, 965, 515, -1, - 679, -1, 677, 699, -1, 677, 698, 732, 705, -1, - 677, 698, 704, 733, -1, 686, 677, -1, 686, 677, - 699, -1, 686, 677, 698, 732, 705, -1, 686, 677, - 698, 704, 733, -1, 679, -1, 675, -1, 379, 696, - 881, -1, -1, 379, 696, 881, 690, 741, 767, 721, - 730, 824, 731, 709, -1, 379, 695, 883, 690, 741, - 767, 721, 730, 824, 731, 709, -1, 171, 742, 678, - 690, 767, 721, 730, 824, 731, 709, -1, 171, 742, - 379, 695, 883, 690, 767, 721, 730, 824, 731, 709, - -1, 740, -1, 416, 761, -1, 677, 444, 693, 694, - 677, -1, 677, 444, 693, 677, -1, 677, 217, 693, - 677, -1, 677, 147, 693, 677, -1, 681, 744, 454, - 883, -1, 681, 744, 454, 883, 180, 59, 894, -1, - 681, 744, 180, 59, 894, -1, 681, 744, 289, 685, - -1, 681, 744, 289, 685, 180, 59, 894, -1, 681, - 744, 289, 685, 454, 883, -1, 681, 744, 289, 685, - 454, 883, 180, 59, 894, -1, 682, 744, 289, 883, - 219, 265, 895, 680, 894, -1, 682, 744, 289, 883, - -1, 459, -1, 460, -1, 314, -1, 316, -1, 449, - -1, 315, -1, 810, -1, 810, 198, 514, 676, 515, - -1, 747, -1, 683, -1, 684, 518, 683, -1, 684, - -1, 684, 518, -1, 476, 687, -1, 500, 687, -1, - 476, 342, 687, -1, 688, -1, 687, 518, 688, -1, - 895, 904, 40, 689, 514, 909, 515, -1, 249, -1, - 274, 249, -1, -1, 219, 691, -1, -1, 422, 692, - 541, -1, 420, 692, 541, -1, 240, 422, 692, 541, - -1, 240, 420, 692, 541, -1, 177, 422, 692, 541, - -1, 177, 420, 692, 541, -1, 448, 692, 541, -1, - 416, 541, -1, 541, -1, 416, -1, -1, 30, -1, - 132, -1, -1, 59, 265, -1, 132, -1, 132, 289, - 514, 854, 515, -1, 30, -1, -1, 192, 281, -1, - 355, 281, -1, -1, 699, -1, -1, 295, 59, 700, - -1, 295, 59, 30, 702, 703, -1, 701, -1, 700, - 518, 701, -1, 809, 454, 848, 703, -1, 809, 702, - 703, -1, 41, -1, 126, -1, -1, 499, 163, -1, - 499, 230, -1, -1, 706, 707, -1, 707, 706, -1, - 706, -1, 707, -1, 704, -1, -1, 237, 715, -1, - 237, 715, 518, 716, -1, 161, 720, 717, 719, 290, - -1, 161, 720, 719, 290, -1, 286, 716, -1, 286, - 717, 719, -1, 4, 509, -1, 9, 509, -1, 4, - 312, -1, 9, 312, -1, 9, -1, 9, 366, -1, - 454, 368, 711, -1, -1, 542, -1, -1, 710, 514, - 708, 515, 714, -1, 708, -1, 708, 514, 542, 515, - -1, 708, 514, 542, 518, 9, 515, -1, 418, 711, - -1, 712, -1, -1, 351, 514, 9, 515, -1, -1, - 809, -1, 30, -1, 809, 509, -1, 4, 312, -1, - 9, 312, -1, 809, -1, 811, -1, 505, 718, -1, - 506, 718, -1, 898, -1, 4, -1, 365, -1, 366, - -1, 163, -1, 271, -1, 180, 59, 723, -1, 180, - 59, 30, -1, -1, 724, -1, 722, 518, 724, -1, - 722, -1, 722, 518, -1, 809, -1, 725, -1, 727, - -1, 726, -1, 728, -1, 514, 515, -1, 364, 514, - 854, 515, -1, 103, 514, 854, 515, -1, 181, 388, - 514, 723, 515, -1, 181, -1, 182, -1, 185, 809, - -1, -1, 335, 809, -1, -1, 734, -1, 166, 338, - 290, -1, 732, -1, -1, 735, -1, 734, 735, -1, - 736, 737, 738, -1, 166, 451, -1, 166, 272, 226, - 451, -1, 166, 389, -1, 166, 226, 389, -1, 284, - 891, -1, -1, 278, -1, 393, 243, -1, -1, 460, - 514, 854, 515, -1, 739, 518, 514, 854, 515, -1, - 739, -1, 739, 518, -1, 171, 743, -1, -1, 744, - -1, 742, 518, 744, -1, 742, -1, 742, 518, -1, - 761, 756, 713, -1, 762, 757, 713, -1, 740, 755, - 713, -1, 231, 762, 757, -1, 675, 756, 713, -1, - 231, 675, 756, -1, 754, -1, 514, 754, 515, 755, - -1, 744, 314, 514, 883, 166, 750, 745, 515, 756, - -1, 744, 449, 746, 514, 751, 166, 753, 515, 756, - -1, 180, 59, 893, -1, -1, 199, 281, -1, 148, - 281, -1, -1, 810, 198, 514, 883, 515, -1, 810, - 198, 543, -1, -1, 812, -1, 814, -1, 514, 852, - 515, -1, 748, 198, 514, 883, 515, -1, 748, 198, - 543, -1, 749, -1, 750, 749, -1, 543, -1, 514, - 893, 515, -1, 751, 198, 514, 883, 515, -1, 752, - -1, 753, 752, -1, 514, 754, 515, -1, 744, 101, - 224, 744, -1, 744, 758, 224, 744, 760, -1, 744, - 224, 744, 760, -1, 744, 268, 758, 224, 744, -1, - 744, 268, 224, 744, -1, 744, 42, 758, 224, 744, - 760, -1, 744, 42, 224, 744, 760, -1, 744, 321, - 224, 744, -1, 744, 37, 224, 744, 760, -1, 744, - 380, 224, 744, 760, -1, 40, 543, 514, 893, 515, - -1, 40, 543, -1, 542, 514, 893, 515, -1, 542, - -1, 755, -1, -1, 755, -1, 40, 514, 768, 515, - -1, 40, 543, 514, 768, 515, -1, 542, 514, 768, - 515, -1, -1, 172, 759, -1, 234, 759, -1, 361, - 759, -1, 380, -1, 37, -1, 208, -1, 299, -1, - -1, 454, 514, 893, 515, -1, 289, 809, -1, 541, - -1, 541, 507, -1, 290, 541, -1, 290, 514, 541, - 515, -1, 818, 766, -1, 366, 171, 514, 764, 515, - 766, -1, 818, 765, -1, 763, -1, 764, 518, 763, - -1, 40, 514, 768, 515, -1, -1, 500, 296, -1, - -1, 473, 809, -1, -1, 769, -1, 768, 518, 769, - -1, 543, 774, 770, -1, 80, 902, -1, -1, 542, - 774, -1, 771, 518, 542, 774, -1, 365, -1, 409, - -1, 774, -1, -1, 777, 776, -1, 387, 777, 776, - -1, 777, 39, 512, 898, 513, -1, 387, 777, 39, - 512, 898, 513, -1, 777, 39, -1, 387, 777, 39, - -1, 775, -1, 772, 514, 771, 515, 776, -1, 246, - 514, 858, 515, 776, -1, 444, 514, 771, 515, 776, - -1, 3, 516, 3, -1, 775, 516, 3, -1, 776, - 512, 513, -1, 776, 512, 898, 513, -1, -1, 779, - -1, 781, -1, 783, -1, 787, -1, 793, -1, 794, - 808, -1, 794, 514, 898, 515, -1, 781, -1, 784, - -1, 788, -1, 793, -1, 901, 780, -1, 514, 855, - 515, -1, -1, 215, -1, 216, -1, 394, -1, 54, - -1, 339, -1, 164, 782, -1, 136, 324, -1, 115, - 780, -1, 112, 780, -1, 282, 780, -1, 57, -1, - 514, 898, 515, -1, -1, 785, -1, 786, -1, 785, - -1, 786, -1, 56, 792, 514, 854, 515, -1, 56, - 792, -1, 789, -1, 790, -1, 789, -1, 790, -1, - 791, 514, 898, 515, -1, 791, -1, 72, 792, -1, - 71, 792, -1, 461, -1, 267, 72, 792, -1, 267, - 71, 792, -1, 269, 792, -1, 463, -1, -1, 427, - 514, 898, 515, 795, -1, 427, 795, -1, 426, 514, - 898, 515, 795, -1, 426, 795, -1, 218, -1, 500, - 426, 497, -1, 478, 426, 497, -1, -1, 494, -1, - 495, -1, 262, -1, 263, -1, 109, -1, 110, -1, - 188, -1, 189, -1, 258, -1, 259, -1, 375, -1, - 376, -1, 256, -1, 257, -1, 252, -1, 253, -1, - 470, -1, 471, -1, 113, -1, 114, -1, 69, -1, - 68, -1, 255, -1, 254, -1, 796, -1, 797, -1, - 798, -1, 799, -1, 800, -1, 801, -1, 802, -1, - 803, -1, 804, -1, 805, -1, 806, -1, 807, -1, - 796, 428, 797, -1, 798, 428, 799, -1, 798, 428, - 800, -1, 798, 428, 801, -1, 799, 428, 800, -1, - 799, 428, 801, -1, 800, 428, 801, -1, -1, 811, - -1, 809, 11, 774, -1, 809, 80, 902, -1, 809, - 46, 426, 497, 809, -1, 505, 809, -1, 506, 809, - -1, 809, 505, 809, -1, 809, 506, 809, -1, 809, - 507, 809, -1, 809, 508, 809, -1, 809, 15, 809, - -1, 809, 509, 809, -1, 809, 510, 809, -1, 809, - 16, 809, -1, 809, 501, 809, -1, 809, 502, 809, - -1, 809, 503, 809, -1, 809, 19, 809, -1, 809, - 20, 809, -1, 809, 21, 809, -1, 809, 847, 809, - -1, 847, 809, -1, 809, 847, -1, 809, 36, 809, - -1, 809, 294, 809, -1, 274, 809, -1, 498, 809, - -1, 809, 176, 809, -1, 809, 236, 809, -1, 809, - 236, 809, 145, 809, -1, 809, 498, 236, 809, -1, - 809, 498, 236, 809, 145, 809, -1, 809, 193, 809, - -1, 809, 193, 809, 145, 809, -1, 809, 498, 193, - 809, -1, 809, 498, 193, 809, 145, 809, -1, 809, - 391, 428, 809, -1, 809, 391, 428, 809, 145, 809, - -1, 809, 498, 391, 428, 809, -1, 809, 498, 391, - 428, 809, 145, 809, -1, 809, 221, 279, -1, 809, - 222, -1, 809, 221, 274, 279, -1, 809, 274, 279, - -1, 809, 277, -1, 809, 17, 809, -1, 809, 18, - 809, -1, 836, 301, 836, -1, 809, 221, 435, -1, - 809, 221, 274, 435, -1, 809, 221, 159, -1, 809, - 221, 274, 159, -1, 809, 221, 446, -1, 809, 221, - 274, 446, -1, 809, 221, 132, 171, 809, -1, 809, - 221, 274, 132, 171, 809, -1, 809, 221, 284, 514, - 858, 515, -1, 809, 221, 274, 284, 514, 858, 515, - -1, 809, 53, 880, 810, 36, 809, -1, 809, 498, - 53, 880, 810, 36, 809, -1, 809, 53, 413, 810, - 36, 809, -1, 809, 498, 53, 413, 810, 36, 809, - -1, 809, 198, 868, -1, 809, 498, 198, 868, -1, - 809, 849, 844, 675, -1, 809, 849, 844, 514, 809, - 515, -1, 117, -1, 83, 514, 809, 515, -1, 507, - 886, 890, -1, 542, 516, 507, 886, 890, -1, 811, - -1, 810, 11, 774, -1, 505, 810, -1, 506, 810, - -1, 810, 505, 810, -1, 810, 506, 810, -1, 810, - 507, 810, -1, 810, 508, 810, -1, 810, 15, 810, - -1, 810, 509, 810, -1, 810, 510, 810, -1, 810, - 16, 810, -1, 810, 501, 810, -1, 810, 502, 810, - -1, 810, 503, 810, -1, 810, 19, 810, -1, 810, - 20, 810, -1, 810, 21, 810, -1, 810, 847, 810, - -1, 847, 810, -1, 810, 847, -1, 810, 221, 132, - 171, 810, -1, 810, 221, 274, 132, 171, 810, -1, - 810, 221, 284, 514, 858, 515, -1, 810, 221, 274, - 284, 514, 858, 515, -1, 812, -1, 813, 879, -1, - 874, -1, 897, -1, 675, -1, 675, 545, -1, 152, - 675, -1, 729, 514, 854, 515, -1, 514, 809, 515, - -1, 814, -1, 836, -1, 519, -1, 10, -1, 815, - -1, 246, 520, 843, 521, -1, 817, -1, 869, -1, - 512, 855, 513, -1, 820, -1, 39, 675, -1, 39, - 512, 855, 513, -1, 522, 9, -1, 523, 548, -1, - 520, 839, 521, -1, 896, 514, 515, -1, 896, 514, - 856, 698, 697, 515, -1, 896, 514, 462, 857, 698, - 697, 515, -1, 896, 514, 856, 518, 462, 857, 698, - 697, 515, -1, 896, 514, 30, 856, 698, 697, 515, - -1, 896, 514, 132, 856, 698, 697, 515, -1, 816, - 821, 822, 823, 827, -1, 819, -1, 816, -1, 819, - -1, 81, 166, 514, 809, 515, -1, 66, 514, 809, - 40, 774, 515, -1, 438, 514, 809, 40, 774, 515, - -1, 158, 514, 859, 515, -1, 302, 514, 861, 515, - -1, 320, 514, 863, 515, -1, 411, 514, 864, 515, - -1, 432, 514, 809, 40, 774, 515, -1, 434, 514, - 58, 867, 515, -1, 434, 514, 232, 867, 515, -1, - 434, 514, 429, 867, 515, -1, 434, 514, 867, 515, - -1, 280, 514, 809, 518, 809, 515, -1, 79, 514, - 854, 515, -1, 512, 809, 166, 542, 198, 809, 513, - -1, 512, 809, 166, 542, 198, 811, 191, 809, 513, - -1, 477, 180, 514, 699, 515, -1, -1, 162, 514, - 473, 809, 515, -1, 162, 514, 809, 515, -1, -1, - 155, -1, -1, 475, 825, -1, -1, 826, -1, 825, - 518, 826, -1, 542, 40, 828, -1, 300, 828, -1, - 300, 542, -1, -1, 514, 829, 830, 698, 831, 515, - -1, 542, -1, -1, 309, 59, 853, -1, -1, 337, - 832, 834, -1, 366, 832, 834, -1, 183, 832, 834, - -1, -1, 833, -1, 53, 833, 36, 833, -1, 441, - 323, -1, 441, 165, -1, 104, 365, -1, 809, 323, - -1, 809, 165, -1, 148, 104, 365, -1, 148, 180, - -1, 148, 425, -1, 148, 272, 297, -1, -1, 365, - 514, 854, 515, -1, 365, 514, 515, -1, 835, -1, - 514, 853, 518, 809, 515, -1, 543, 524, 809, -1, - 837, -1, 838, 518, 837, -1, 838, -1, 838, 518, - -1, 809, 524, 809, -1, 840, -1, 841, 518, 840, - -1, 841, -1, 841, 518, -1, 842, -1, -1, 38, - -1, 396, -1, 30, -1, 8, -1, 846, -1, 505, - -1, 506, -1, 507, -1, 508, -1, 15, -1, 509, - -1, 510, -1, 16, -1, 501, -1, 502, -1, 503, - -1, 19, -1, 20, -1, 21, -1, 8, -1, 291, - 514, 850, 515, -1, 845, -1, 291, 514, 850, 515, - -1, 845, -1, 291, 514, 850, 515, -1, 236, -1, - 498, 236, -1, 176, -1, 498, 176, -1, 193, -1, - 498, 193, -1, 845, -1, 542, 516, 850, -1, 811, - -1, 851, 518, 811, -1, 851, -1, 851, 518, -1, - 809, -1, 853, 518, 809, -1, 853, -1, 853, 518, - -1, 854, -1, -1, 857, -1, 856, 518, 857, -1, - 809, -1, 905, 13, 809, -1, 905, 14, 809, -1, - 774, -1, 858, 518, 774, -1, 860, 171, 809, -1, - -1, 3, -1, 796, -1, 797, -1, 798, -1, 799, - -1, 800, -1, 801, -1, 802, -1, 803, -1, 804, - -1, 805, -1, 806, -1, 807, -1, 544, -1, 809, - 862, 865, 866, -1, 809, 862, 865, -1, 317, 809, - -1, 810, 198, 810, -1, -1, 809, 865, 866, -1, - 809, 866, 865, -1, 809, 865, -1, 809, 866, -1, - 853, -1, -1, 171, 809, -1, 166, 809, -1, 809, - 171, 854, -1, 171, 854, -1, 854, -1, 675, -1, - 514, 854, 515, -1, 65, 873, 870, 872, 143, -1, - 871, -1, 870, 871, -1, 472, 809, 424, 809, -1, - 139, 809, -1, -1, 809, -1, -1, 542, -1, 542, - 545, -1, 512, 809, 513, -1, 512, 875, 524, 875, - 513, -1, 512, 875, 524, 875, 524, 875, 513, -1, - 512, 875, 524, 506, 524, 875, 513, -1, 809, -1, - -1, -1, 876, 546, -1, -1, 514, 515, -1, 514, - 856, 515, -1, 516, 547, 877, -1, 512, 809, 513, - -1, 512, 875, 524, 875, 513, -1, 512, 875, 524, - 875, 524, 875, 513, -1, 512, 875, 524, 506, 524, - 875, 513, -1, -1, 879, 878, -1, 45, -1, -1, - 883, -1, -1, 884, -1, 882, 518, 884, -1, 882, - -1, 882, 518, -1, 809, 40, 906, -1, 809, 3, - -1, 809, -1, 148, 514, 893, 515, -1, 148, 542, - -1, 885, -1, -1, 809, 40, 542, -1, 887, -1, - 888, 518, 887, -1, 888, -1, 888, 518, -1, 352, - 514, 889, 515, -1, 352, 887, -1, -1, 541, -1, - 891, 518, 541, -1, 895, -1, 892, 518, 895, -1, - 892, -1, 892, 518, -1, 893, -1, 514, 893, 515, - -1, 543, -1, 900, -1, 542, 545, -1, 898, -1, - 4, -1, 544, 876, -1, 6, -1, 7, -1, 896, - 544, -1, 896, 514, 856, 698, 697, 515, 544, -1, - 778, 544, -1, 794, 514, 809, 515, 808, -1, 794, - 898, 808, -1, 794, 544, 808, -1, 435, -1, 159, - -1, 279, -1, 9, -1, 3, -1, 977, -1, 982, - -1, 3, -1, 977, -1, 979, -1, 3, -1, 977, - -1, 980, -1, 542, -1, 542, 903, -1, 516, 547, - -1, 903, 516, 547, -1, 514, 893, 515, -1, -1, - 899, -1, 548, -1, 5, -1, 325, 895, 908, 40, - 909, -1, 514, 858, 515, -1, -1, 674, -1, 551, - -1, 655, -1, 656, -1, 953, -1, 965, -1, 100, - 370, 541, 911, -1, 100, 370, 191, 274, 152, 541, - 911, -1, 100, 294, 352, 370, 541, 911, -1, 911, - 912, -1, -1, 598, -1, 913, -1, 576, -1, 972, - -1, 100, 919, 202, 916, 917, 289, 541, 915, 514, - 570, 515, 918, 767, -1, 100, 919, 202, 916, 191, - 274, 152, 627, 289, 541, 915, 514, 570, 515, 918, - 767, -1, 542, -1, 454, 914, -1, -1, 89, -1, - -1, 627, -1, -1, 476, 613, -1, -1, 445, -1, - -1, 32, 416, 761, 386, 370, 895, -1, 32, 416, - 191, 152, 761, 386, 370, 895, -1, 32, 381, 541, - 386, 370, 895, -1, 32, 381, 191, 152, 541, 386, - 370, 895, -1, 32, 466, 541, 386, 370, 895, -1, - 32, 466, 191, 152, 541, 386, 370, 895, -1, 167, - 75, 922, -1, 75, 922, -1, 542, -1, -1, 84, - 289, 925, 541, 221, 924, -1, 84, 289, 82, 809, - 221, 924, -1, 544, -1, 279, -1, 416, -1, 381, - -1, 173, -1, 245, -1, 245, 416, -1, 466, -1, - 108, -1, 202, -1, 370, -1, 439, -1, 154, 108, - 544, 664, -1, 154, 108, 542, 428, 544, 664, -1, - 197, 108, 544, -1, 153, 931, -1, 153, 935, 929, - 931, -1, 153, 464, 931, -1, 153, 514, 934, 515, - 931, -1, 464, -1, -1, 936, -1, 589, -1, -1, - 920, -1, 586, -1, 529, -1, 971, -1, 921, -1, - 656, -1, 974, -1, 652, -1, 910, -1, 576, -1, - 598, -1, 572, -1, 540, -1, 953, -1, 646, -1, - 582, -1, 913, -1, 551, -1, 945, -1, 575, -1, - 907, -1, 549, -1, 674, -1, 595, -1, 655, -1, - 948, -1, 962, -1, 939, -1, 965, -1, 972, -1, - 3, -1, 977, -1, 981, -1, 932, -1, 544, -1, - 937, -1, 934, 518, 937, -1, 35, -1, 34, -1, - 435, -1, 159, -1, 289, -1, 933, -1, 938, 930, - -1, 932, -1, 935, -1, 386, 940, -1, 386, 240, - 940, -1, 386, 385, 940, -1, 386, 177, 940, -1, - 941, -1, 969, 171, 104, -1, 426, 497, 943, -1, - 370, 544, -1, 969, 428, 944, -1, 969, 503, 944, - -1, 809, -1, 544, -1, 3, -1, 794, 544, 808, - -1, 794, 514, 898, 515, 544, -1, 589, -1, 117, - -1, 240, -1, 942, -1, 944, 518, 942, -1, 239, - 946, -1, 213, 946, -1, 167, 213, 946, -1, 213, - 946, 171, 947, -1, 167, 213, 946, 171, 947, -1, - 544, -1, 542, -1, 544, -1, 542, -1, 455, 950, - 952, 929, -1, 455, 950, 952, 929, 541, 904, -1, - 455, 950, 952, 929, 957, -1, 455, 514, 951, 515, - -1, 455, 514, 951, 515, 541, 904, -1, 935, -1, - 464, -1, 170, -1, 172, -1, 3, -1, 172, -1, - -1, 949, -1, 951, 518, 949, -1, 170, -1, -1, - 556, 122, 171, 954, 956, 955, 562, -1, 436, 692, - 954, -1, 761, -1, 761, 542, -1, 761, 40, 542, - -1, 473, 809, -1, -1, 454, 743, -1, -1, 935, - 929, -1, 935, 929, 541, 904, -1, 47, 960, 544, - 961, 664, -1, 47, 191, 274, 152, 960, 544, 961, - 664, -1, 128, 548, -1, 128, 108, 548, -1, 128, - 108, 191, 152, 548, -1, 108, -1, -1, 40, 542, - -1, -1, 354, 964, -1, 354, 240, 964, -1, 354, - 385, 964, -1, 354, 177, 964, -1, 969, -1, 30, - -1, 963, -1, 426, 497, -1, 430, 223, 235, -1, - 967, 674, -1, 412, 674, -1, 412, 970, -1, 967, - 970, -1, 967, 426, 497, -1, 967, 430, 223, 235, - -1, 967, 30, 968, -1, 967, -1, 127, -1, 126, - -1, 390, -1, 966, -1, 417, -1, -1, 542, -1, - 969, 516, 542, -1, 542, -1, 970, 516, 542, -1, - 61, 816, -1, 100, 644, 466, 541, 633, 918, 40, - 674, 973, -1, 100, 644, 466, 191, 274, 152, 541, - 633, 918, 40, 674, 973, -1, 100, 294, 352, 644, - 466, 541, 633, 918, 40, 674, 973, -1, 100, 644, - 342, 466, 541, 514, 637, 515, 918, 40, 674, 973, - -1, 100, 294, 352, 644, 342, 466, 541, 514, 637, - 515, 918, 40, 674, 973, -1, 476, 74, 292, -1, - 476, 64, 74, 292, -1, 476, 240, 74, 292, -1, - -1, 100, 644, 416, 976, 40, 674, 975, -1, 100, - 644, 416, 191, 274, 152, 976, 40, 674, 975, -1, - 100, 294, 352, 644, 416, 976, 40, 674, 975, -1, - 476, 107, -1, 476, 272, 107, -1, -1, 541, 633, - 620, 612, -1, 22, -1, 23, -1, 24, -1, 25, - -1, 26, -1, 27, -1, 28, -1, 29, -1, 31, - -1, 32, -1, 33, -1, 43, -1, 44, -1, 46, - -1, 47, -1, 48, -1, 50, -1, 51, -1, 52, - -1, 59, -1, 60, -1, 61, -1, 62, -1, 63, - -1, 64, -1, 67, -1, 68, -1, 69, -1, 70, - -1, 73, -1, 75, -1, 76, -1, 77, -1, 78, - -1, 84, -1, 85, -1, 86, -1, 87, -1, 88, - -1, 90, -1, 91, -1, 92, -1, 94, -1, 95, - -1, 96, -1, 97, -1, 98, -1, 99, -1, 102, - -1, 103, -1, 104, -1, 105, -1, 106, -1, 107, - -1, 108, -1, 109, -1, 110, -1, 111, -1, 113, - -1, 114, -1, 116, -1, 118, -1, 120, -1, 121, - -1, 122, -1, 123, -1, 124, -1, 125, -1, 128, - -1, 129, -1, 130, -1, 131, -1, 134, -1, 135, - -1, 136, -1, 137, -1, 138, -1, 140, -1, 141, - -1, 142, -1, 144, -1, 145, -1, 146, -1, 148, - -1, 149, -1, 150, -1, 151, -1, 153, -1, 154, - -1, 155, -1, 156, -1, 157, -1, 160, -1, 162, - -1, 163, -1, 165, -1, 167, -1, 169, -1, 173, - -1, 174, -1, 177, -1, 179, -1, 183, -1, 184, - -1, 186, -1, 187, -1, 188, -1, 189, -1, 190, - -1, 191, -1, 192, -1, 194, -1, 195, -1, 196, - -1, 197, -1, 199, -1, 200, -1, 201, -1, 202, - -1, 203, -1, 204, -1, 205, -1, 207, -1, 210, - -1, 211, -1, 212, -1, 213, -1, 214, -1, 220, - -1, 223, -1, 225, -1, 226, -1, 227, -1, 228, - -1, 229, -1, 230, -1, 233, -1, 235, -1, 238, - -1, 239, -1, 240, -1, 241, -1, 242, -1, 243, - -1, 244, -1, 245, -1, 247, -1, 248, -1, 249, - -1, 250, -1, 251, -1, 252, -1, 253, -1, 254, - -1, 255, -1, 256, -1, 257, -1, 258, -1, 259, - -1, 260, -1, 261, -1, 262, -1, 263, -1, 264, - -1, 265, -1, 266, -1, 270, -1, 271, -1, 272, - -1, 275, -1, 276, -1, 278, -1, 281, -1, 283, - -1, 284, -1, 285, -1, 287, -1, 288, -1, 291, - -1, 292, -1, 293, -1, 296, -1, 297, -1, 300, - -1, 303, -1, 304, -1, 305, -1, 306, -1, 307, - -1, 308, -1, 309, -1, 310, -1, 311, -1, 312, - -1, 313, -1, 318, -1, 319, -1, 322, -1, 323, - -1, 325, -1, 326, -1, 327, -1, 329, -1, 330, - -1, 331, -1, 332, -1, 333, -1, 334, -1, 336, - -1, 337, -1, 338, -1, 340, -1, 341, -1, 342, - -1, 343, -1, 345, -1, 346, -1, 347, -1, 348, - -1, 349, -1, 350, -1, 351, -1, 352, -1, 353, - -1, 354, -1, 355, -1, 356, -1, 357, -1, 359, - -1, 360, -1, 362, -1, 363, -1, 364, -1, 366, - -1, 367, -1, 368, -1, 369, -1, 370, -1, 371, - -1, 372, -1, 373, -1, 374, -1, 375, -1, 376, - -1, 377, -1, 378, -1, 381, -1, 382, -1, 383, - -1, 384, -1, 385, -1, 386, -1, 388, -1, 389, - -1, 392, -1, 393, -1, 395, -1, 397, -1, 398, - -1, 399, -1, 400, -1, 401, -1, 402, -1, 403, - -1, 404, -1, 405, -1, 406, -1, 407, -1, 408, - -1, 410, -1, 414, -1, 415, -1, 417, -1, 419, - -1, 420, -1, 421, -1, 422, -1, 423, -1, 425, - -1, 430, -1, 431, -1, 433, -1, 436, -1, 437, - -1, 439, -1, 440, -1, 441, -1, 442, -1, 443, - -1, 446, -1, 447, -1, 448, -1, 450, -1, 451, - -1, 452, -1, 453, -1, 455, -1, 456, -1, 457, - -1, 458, -1, 459, -1, 463, -1, 465, -1, 466, - -1, 467, -1, 468, -1, 469, -1, 470, -1, 471, - -1, 474, -1, 477, -1, 478, -1, 479, -1, 480, - -1, 481, -1, 482, -1, 494, -1, 495, -1, 496, - -1, 497, -1, 53, -1, 54, -1, 56, -1, 57, - -1, 71, -1, 72, -1, 79, -1, 83, -1, 112, - -1, 115, -1, 152, -1, 158, -1, 164, -1, 175, - -1, 181, -1, 182, -1, 209, -1, 215, -1, 216, - -1, 218, -1, 246, -1, 267, -1, 269, -1, 273, - -1, 280, -1, 282, -1, 298, -1, 302, -1, 320, - -1, 324, -1, 339, -1, 365, -1, 387, -1, 394, - -1, 409, -1, 411, -1, 426, -1, 427, -1, 432, - -1, 434, -1, 438, -1, 460, -1, 461, -1, 483, + 673, 515, -1, 937, -1, 589, -1, 815, -1, 507, + -1, 514, 660, 515, -1, 816, -1, -1, 548, 665, + -1, 476, 287, -1, -1, 668, 670, -1, -1, 55, + -1, -1, 55, -1, 287, -1, 170, -1, 123, 662, + 544, -1, 279, 662, 544, -1, 102, -1, 186, -1, + 336, 662, 544, -1, 145, 662, 544, -1, 167, 336, + 637, -1, 167, 336, 507, -1, 309, 59, 637, -1, + 309, 59, 507, -1, 167, 274, 279, 637, -1, 167, + 279, 637, -1, 141, 544, -1, 937, -1, 544, -1, + 403, -1, 404, -1, 3, 516, 542, -1, 3, -1, + 666, -1, 673, 518, 666, -1, 676, -1, 675, -1, + 514, 676, 515, -1, 514, 675, 515, -1, 514, 966, + 515, -1, 679, -1, 677, 699, -1, 677, 698, 732, + 705, -1, 677, 698, 704, 733, -1, 686, 677, -1, + 686, 677, 699, -1, 686, 677, 698, 732, 705, -1, + 686, 677, 698, 704, 733, -1, 679, -1, 675, -1, + 379, 696, 882, -1, -1, 379, 696, 882, 690, 741, + 767, 721, 730, 825, 731, 709, -1, 379, 695, 884, + 690, 741, 767, 721, 730, 825, 731, 709, -1, 171, + 742, 678, 690, 767, 721, 730, 825, 731, 709, -1, + 171, 742, 379, 695, 884, 690, 767, 721, 730, 825, + 731, 709, -1, 740, -1, 416, 761, -1, 677, 444, + 693, 694, 677, -1, 677, 444, 693, 677, -1, 677, + 217, 693, 677, -1, 677, 147, 693, 677, -1, 681, + 744, 454, 884, -1, 681, 744, 454, 884, 180, 59, + 895, -1, 681, 744, 180, 59, 895, -1, 681, 744, + 289, 685, -1, 681, 744, 289, 685, 180, 59, 895, + -1, 681, 744, 289, 685, 454, 884, -1, 681, 744, + 289, 685, 454, 884, 180, 59, 895, -1, 682, 744, + 289, 884, 219, 265, 896, 680, 895, -1, 682, 744, + 289, 884, -1, 459, -1, 460, -1, 314, -1, 316, + -1, 449, -1, 315, -1, 810, -1, 810, 198, 514, + 676, 515, -1, 747, -1, 683, -1, 684, 518, 683, + -1, 684, -1, 684, 518, -1, 476, 687, -1, 500, + 687, -1, 476, 342, 687, -1, 688, -1, 687, 518, + 688, -1, 896, 905, 40, 689, 514, 910, 515, -1, + 249, -1, 274, 249, -1, -1, 219, 691, -1, -1, + 422, 692, 541, -1, 420, 692, 541, -1, 240, 422, + 692, 541, -1, 240, 420, 692, 541, -1, 177, 422, + 692, 541, -1, 177, 420, 692, 541, -1, 448, 692, + 541, -1, 416, 541, -1, 541, -1, 416, -1, -1, + 30, -1, 132, -1, -1, 59, 265, -1, 132, -1, + 132, 289, 514, 855, 515, -1, 30, -1, -1, 192, + 281, -1, 355, 281, -1, -1, 699, -1, -1, 295, + 59, 700, -1, 295, 59, 30, 702, 703, -1, 701, + -1, 700, 518, 701, -1, 809, 454, 849, 703, -1, + 809, 702, 703, -1, 41, -1, 126, -1, -1, 499, + 163, -1, 499, 230, -1, -1, 706, 707, -1, 707, + 706, -1, 706, -1, 707, -1, 704, -1, -1, 237, + 715, -1, 237, 715, 518, 716, -1, 161, 720, 717, + 719, 290, -1, 161, 720, 719, 290, -1, 286, 716, + -1, 286, 717, 719, -1, 4, 509, -1, 9, 509, + -1, 4, 312, -1, 9, 312, -1, 9, -1, 9, + 366, -1, 454, 368, 711, -1, -1, 542, -1, -1, + 710, 514, 708, 515, 714, -1, 708, -1, 708, 514, + 542, 515, -1, 708, 514, 542, 518, 9, 515, -1, + 418, 711, -1, 712, -1, -1, 351, 514, 9, 515, + -1, -1, 809, -1, 30, -1, 809, 509, -1, 4, + 312, -1, 9, 312, -1, 809, -1, 811, -1, 505, + 718, -1, 506, 718, -1, 899, -1, 4, -1, 365, + -1, 366, -1, 163, -1, 271, -1, 180, 59, 723, + -1, 180, 59, 30, -1, -1, 724, -1, 722, 518, + 724, -1, 722, -1, 722, 518, -1, 809, -1, 725, + -1, 727, -1, 726, -1, 728, -1, 514, 515, -1, + 364, 514, 855, 515, -1, 103, 514, 855, 515, -1, + 181, 388, 514, 723, 515, -1, 181, -1, 182, -1, + 185, 809, -1, -1, 335, 809, -1, -1, 734, -1, + 166, 338, 290, -1, 732, -1, -1, 735, -1, 734, + 735, -1, 736, 737, 738, -1, 166, 451, -1, 166, + 272, 226, 451, -1, 166, 389, -1, 166, 226, 389, + -1, 284, 892, -1, -1, 278, -1, 393, 243, -1, + -1, 460, 514, 855, 515, -1, 739, 518, 514, 855, + 515, -1, 739, -1, 739, 518, -1, 171, 743, -1, + -1, 744, -1, 742, 518, 744, -1, 742, -1, 742, + 518, -1, 761, 756, 713, -1, 762, 757, 713, -1, + 740, 755, 713, -1, 231, 762, 757, -1, 675, 756, + 713, -1, 231, 675, 756, -1, 754, -1, 514, 754, + 515, 755, -1, 744, 314, 514, 884, 166, 750, 745, + 515, 756, -1, 744, 449, 746, 514, 751, 166, 753, + 515, 756, -1, 180, 59, 894, -1, -1, 199, 281, + -1, 148, 281, -1, -1, 810, 198, 514, 884, 515, + -1, 810, 198, 543, -1, -1, 812, -1, 814, -1, + 514, 853, 515, -1, 748, 198, 514, 884, 515, -1, + 748, 198, 543, -1, 749, -1, 750, 749, -1, 543, + -1, 514, 894, 515, -1, 751, 198, 514, 884, 515, + -1, 752, -1, 753, 752, -1, 514, 754, 515, -1, + 744, 101, 224, 744, -1, 744, 758, 224, 744, 760, + -1, 744, 224, 744, 760, -1, 744, 268, 758, 224, + 744, -1, 744, 268, 224, 744, -1, 744, 42, 758, + 224, 744, 760, -1, 744, 42, 224, 744, 760, -1, + 744, 321, 224, 744, -1, 744, 37, 224, 744, 760, + -1, 744, 380, 224, 744, 760, -1, 40, 543, 514, + 894, 515, -1, 40, 543, -1, 542, 514, 894, 515, + -1, 542, -1, 755, -1, -1, 755, -1, 40, 514, + 768, 515, -1, 40, 543, 514, 768, 515, -1, 542, + 514, 768, 515, -1, -1, 172, 759, -1, 234, 759, + -1, 361, 759, -1, 380, -1, 37, -1, 208, -1, + 299, -1, -1, 454, 514, 894, 515, -1, 289, 809, + -1, 541, -1, 541, 507, -1, 290, 541, -1, 290, + 514, 541, 515, -1, 819, 766, -1, 366, 171, 514, + 764, 515, 766, -1, 819, 765, -1, 763, -1, 764, + 518, 763, -1, 40, 514, 768, 515, -1, -1, 500, + 296, -1, -1, 473, 809, -1, -1, 769, -1, 768, + 518, 769, -1, 543, 774, 770, -1, 80, 903, -1, + -1, 542, 774, -1, 771, 518, 542, 774, -1, 365, + -1, 409, -1, 774, -1, -1, 777, 776, -1, 387, + 777, 776, -1, 777, 39, 512, 899, 513, -1, 387, + 777, 39, 512, 899, 513, -1, 777, 39, -1, 387, + 777, 39, -1, 775, -1, 772, 514, 771, 515, 776, + -1, 246, 514, 859, 515, 776, -1, 444, 514, 771, + 515, 776, -1, 3, 516, 3, -1, 775, 516, 3, + -1, 776, 512, 513, -1, 776, 512, 899, 513, -1, + -1, 779, -1, 781, -1, 783, -1, 787, -1, 793, + -1, 794, 808, -1, 794, 514, 899, 515, -1, 781, + -1, 784, -1, 788, -1, 793, -1, 902, 780, -1, + 514, 856, 515, -1, -1, 215, -1, 216, -1, 394, + -1, 54, -1, 339, -1, 164, 782, -1, 136, 324, + -1, 115, 780, -1, 112, 780, -1, 282, 780, -1, + 57, -1, 514, 899, 515, -1, -1, 785, -1, 786, + -1, 785, -1, 786, -1, 56, 792, 514, 855, 515, + -1, 56, 792, -1, 789, -1, 790, -1, 789, -1, + 790, -1, 791, 514, 899, 515, -1, 791, -1, 72, + 792, -1, 71, 792, -1, 461, -1, 267, 72, 792, + -1, 267, 71, 792, -1, 269, 792, -1, 463, -1, + -1, 427, 514, 899, 515, 795, -1, 427, 795, -1, + 426, 514, 899, 515, 795, -1, 426, 795, -1, 218, + -1, 500, 426, 497, -1, 478, 426, 497, -1, -1, + 494, -1, 495, -1, 262, -1, 263, -1, 109, -1, + 110, -1, 188, -1, 189, -1, 258, -1, 259, -1, + 375, -1, 376, -1, 256, -1, 257, -1, 252, -1, + 253, -1, 470, -1, 471, -1, 113, -1, 114, -1, + 69, -1, 68, -1, 255, -1, 254, -1, 796, -1, + 797, -1, 798, -1, 799, -1, 800, -1, 801, -1, + 802, -1, 803, -1, 804, -1, 805, -1, 806, -1, + 807, -1, 796, 428, 797, -1, 798, 428, 799, -1, + 798, 428, 800, -1, 798, 428, 801, -1, 799, 428, + 800, -1, 799, 428, 801, -1, 800, 428, 801, -1, + -1, 811, -1, 809, 11, 774, -1, 809, 80, 903, + -1, 809, 46, 426, 497, 809, -1, 505, 809, -1, + 506, 809, -1, 809, 505, 809, -1, 809, 506, 809, + -1, 809, 507, 809, -1, 809, 508, 809, -1, 809, + 15, 809, -1, 809, 509, 809, -1, 809, 510, 809, + -1, 809, 16, 809, -1, 809, 501, 809, -1, 809, + 502, 809, -1, 809, 503, 809, -1, 809, 19, 809, + -1, 809, 20, 809, -1, 809, 21, 809, -1, 809, + 848, 809, -1, 848, 809, -1, 809, 848, -1, 809, + 36, 809, -1, 809, 294, 809, -1, 274, 809, -1, + 498, 809, -1, 809, 176, 809, -1, 809, 236, 809, + -1, 809, 236, 809, 145, 809, -1, 809, 498, 236, + 809, -1, 809, 498, 236, 809, 145, 809, -1, 809, + 193, 809, -1, 809, 193, 809, 145, 809, -1, 809, + 498, 193, 809, -1, 809, 498, 193, 809, 145, 809, + -1, 809, 391, 428, 809, -1, 809, 391, 428, 809, + 145, 809, -1, 809, 498, 391, 428, 809, -1, 809, + 498, 391, 428, 809, 145, 809, -1, 809, 221, 279, + -1, 809, 222, -1, 809, 221, 274, 279, -1, 809, + 274, 279, -1, 809, 277, -1, 809, 17, 809, -1, + 809, 18, 809, -1, 837, 301, 837, -1, 809, 221, + 435, -1, 809, 221, 274, 435, -1, 809, 221, 159, + -1, 809, 221, 274, 159, -1, 809, 221, 446, -1, + 809, 221, 274, 446, -1, 809, 221, 132, 171, 809, + -1, 809, 221, 274, 132, 171, 809, -1, 809, 221, + 284, 514, 859, 515, -1, 809, 221, 274, 284, 514, + 859, 515, -1, 809, 53, 881, 810, 36, 809, -1, + 809, 498, 53, 881, 810, 36, 809, -1, 809, 53, + 413, 810, 36, 809, -1, 809, 498, 53, 413, 810, + 36, 809, -1, 809, 198, 869, -1, 809, 498, 198, + 869, -1, 809, 850, 845, 675, -1, 809, 850, 845, + 514, 809, 515, -1, 117, -1, 83, 514, 809, 515, + -1, 507, 887, 891, -1, 542, 516, 507, 887, 891, + -1, 811, -1, 810, 11, 774, -1, 505, 810, -1, + 506, 810, -1, 810, 505, 810, -1, 810, 506, 810, + -1, 810, 507, 810, -1, 810, 508, 810, -1, 810, + 15, 810, -1, 810, 509, 810, -1, 810, 510, 810, + -1, 810, 16, 810, -1, 810, 501, 810, -1, 810, + 502, 810, -1, 810, 503, 810, -1, 810, 19, 810, + -1, 810, 20, 810, -1, 810, 21, 810, -1, 810, + 848, 810, -1, 848, 810, -1, 810, 848, -1, 810, + 221, 132, 171, 810, -1, 810, 221, 274, 132, 171, + 810, -1, 810, 221, 284, 514, 859, 515, -1, 810, + 221, 274, 284, 514, 859, 515, -1, 812, -1, 813, + 880, -1, 875, -1, 898, -1, 675, -1, 675, 545, + -1, 152, 675, -1, 729, 514, 855, 515, -1, 514, + 809, 515, -1, 814, -1, 837, -1, 519, -1, 10, + -1, 816, -1, 246, 520, 844, 521, -1, 818, -1, + 870, -1, 815, -1, 821, -1, 39, 675, -1, 39, + 512, 856, 513, -1, 522, 9, -1, 523, 548, -1, + 512, 856, 513, -1, 520, 840, 521, -1, 897, 514, + 515, -1, 897, 514, 857, 698, 697, 515, -1, 897, + 514, 462, 858, 698, 697, 515, -1, 897, 514, 857, + 518, 462, 858, 698, 697, 515, -1, 897, 514, 30, + 857, 698, 697, 515, -1, 897, 514, 132, 857, 698, + 697, 515, -1, 817, 822, 823, 824, 828, -1, 820, + -1, 817, -1, 820, -1, 81, 166, 514, 809, 515, + -1, 66, 514, 809, 40, 774, 515, -1, 438, 514, + 809, 40, 774, 515, -1, 158, 514, 860, 515, -1, + 302, 514, 862, 515, -1, 320, 514, 864, 515, -1, + 411, 514, 865, 515, -1, 432, 514, 809, 40, 774, + 515, -1, 434, 514, 58, 868, 515, -1, 434, 514, + 232, 868, 515, -1, 434, 514, 429, 868, 515, -1, + 434, 514, 868, 515, -1, 280, 514, 809, 518, 809, + 515, -1, 79, 514, 855, 515, -1, 512, 809, 166, + 542, 198, 809, 513, -1, 512, 809, 166, 542, 198, + 811, 191, 809, 513, -1, 477, 180, 514, 699, 515, + -1, -1, 162, 514, 473, 809, 515, -1, 162, 514, + 809, 515, -1, -1, 155, -1, -1, 475, 826, -1, + -1, 827, -1, 826, 518, 827, -1, 542, 40, 829, + -1, 300, 829, -1, 300, 542, -1, -1, 514, 830, + 831, 698, 832, 515, -1, 542, -1, -1, 309, 59, + 854, -1, -1, 337, 833, 835, -1, 366, 833, 835, + -1, 183, 833, 835, -1, -1, 834, -1, 53, 834, + 36, 834, -1, 441, 323, -1, 441, 165, -1, 104, + 365, -1, 809, 323, -1, 809, 165, -1, 148, 104, + 365, -1, 148, 180, -1, 148, 425, -1, 148, 272, + 297, -1, -1, 365, 514, 855, 515, -1, 365, 514, + 515, -1, 836, -1, 514, 854, 518, 809, 515, -1, + 543, 524, 809, -1, 838, -1, 839, 518, 838, -1, + 839, -1, 839, 518, -1, 809, 524, 809, -1, 841, + -1, 842, 518, 841, -1, 842, -1, 842, 518, -1, + 843, -1, -1, 38, -1, 396, -1, 30, -1, 8, + -1, 847, -1, 505, -1, 506, -1, 507, -1, 508, + -1, 15, -1, 509, -1, 510, -1, 16, -1, 501, + -1, 502, -1, 503, -1, 19, -1, 20, -1, 21, + -1, 8, -1, 291, 514, 851, 515, -1, 846, -1, + 291, 514, 851, 515, -1, 846, -1, 291, 514, 851, + 515, -1, 236, -1, 498, 236, -1, 176, -1, 498, + 176, -1, 193, -1, 498, 193, -1, 846, -1, 542, + 516, 851, -1, 811, -1, 852, 518, 811, -1, 852, + -1, 852, 518, -1, 809, -1, 854, 518, 809, -1, + 854, -1, 854, 518, -1, 855, -1, -1, 858, -1, + 857, 518, 858, -1, 809, -1, 906, 13, 809, -1, + 906, 14, 809, -1, 774, -1, 859, 518, 774, -1, + 861, 171, 809, -1, -1, 3, -1, 796, -1, 797, + -1, 798, -1, 799, -1, 800, -1, 801, -1, 802, + -1, 803, -1, 804, -1, 805, -1, 806, -1, 807, + -1, 544, -1, 809, 863, 866, 867, -1, 809, 863, + 866, -1, 317, 809, -1, 810, 198, 810, -1, -1, + 809, 866, 867, -1, 809, 867, 866, -1, 809, 866, + -1, 809, 867, -1, 854, -1, -1, 171, 809, -1, + 166, 809, -1, 809, 171, 855, -1, 171, 855, -1, + 855, -1, 675, -1, 514, 855, 515, -1, 65, 874, + 871, 873, 143, -1, 872, -1, 871, 872, -1, 472, + 809, 424, 809, -1, 139, 809, -1, -1, 809, -1, + -1, 542, -1, 542, 545, -1, 512, 809, 513, -1, + 512, 876, 524, 876, 513, -1, 512, 876, 524, 876, + 524, 876, 513, -1, 512, 876, 524, 506, 524, 876, + 513, -1, 809, -1, -1, -1, 877, 546, -1, -1, + 514, 515, -1, 514, 857, 515, -1, 516, 547, 878, + -1, 512, 809, 513, -1, 512, 876, 524, 876, 513, + -1, 512, 876, 524, 876, 524, 876, 513, -1, 512, + 876, 524, 506, 524, 876, 513, -1, -1, 880, 879, + -1, 45, -1, -1, 884, -1, -1, 885, -1, 883, + 518, 885, -1, 883, -1, 883, 518, -1, 809, 40, + 907, -1, 809, 3, -1, 809, -1, 148, 514, 894, + 515, -1, 148, 542, -1, 886, -1, -1, 809, 40, + 542, -1, 888, -1, 889, 518, 888, -1, 889, -1, + 889, 518, -1, 352, 514, 890, 515, -1, 352, 888, + -1, -1, 541, -1, 892, 518, 541, -1, 896, -1, + 893, 518, 896, -1, 893, -1, 893, 518, -1, 894, + -1, 514, 894, 515, -1, 543, -1, 901, -1, 542, + 545, -1, 899, -1, 4, -1, 544, 877, -1, 6, + -1, 7, -1, 897, 544, -1, 897, 514, 857, 698, + 697, 515, 544, -1, 778, 544, -1, 794, 514, 809, + 515, 808, -1, 794, 899, 808, -1, 794, 544, 808, + -1, 435, -1, 159, -1, 279, -1, 9, -1, 3, + -1, 978, -1, 983, -1, 3, -1, 978, -1, 980, + -1, 3, -1, 978, -1, 981, -1, 542, -1, 542, + 904, -1, 516, 547, -1, 904, 516, 547, -1, 514, + 894, 515, -1, -1, 900, -1, 548, -1, 5, -1, + 325, 896, 909, 40, 910, -1, 514, 859, 515, -1, + -1, 674, -1, 551, -1, 655, -1, 656, -1, 954, + -1, 966, -1, 100, 370, 541, 912, -1, 100, 370, + 191, 274, 152, 541, 912, -1, 100, 294, 352, 370, + 541, 912, -1, 912, 913, -1, -1, 598, -1, 914, + -1, 576, -1, 973, -1, 100, 920, 202, 917, 918, + 289, 541, 916, 514, 570, 515, 919, 767, -1, 100, + 920, 202, 917, 191, 274, 152, 627, 289, 541, 916, + 514, 570, 515, 919, 767, -1, 542, -1, 454, 915, + -1, -1, 89, -1, -1, 627, -1, -1, 476, 613, + -1, -1, 445, -1, -1, 32, 416, 761, 386, 370, + 896, -1, 32, 416, 191, 152, 761, 386, 370, 896, + -1, 32, 381, 541, 386, 370, 896, -1, 32, 381, + 191, 152, 541, 386, 370, 896, -1, 32, 466, 541, + 386, 370, 896, -1, 32, 466, 191, 152, 541, 386, + 370, 896, -1, 167, 75, 923, -1, 75, 923, -1, + 542, -1, -1, 84, 289, 926, 541, 221, 925, -1, + 84, 289, 82, 809, 221, 925, -1, 544, -1, 279, + -1, 416, -1, 381, -1, 173, -1, 245, -1, 245, + 416, -1, 466, -1, 108, -1, 202, -1, 370, -1, + 439, -1, 154, 108, 544, 664, -1, 154, 108, 542, + 428, 544, 664, -1, 197, 108, 544, -1, 153, 932, + -1, 153, 936, 930, 932, -1, 153, 464, 932, -1, + 153, 514, 935, 515, 932, -1, 464, -1, -1, 937, + -1, 589, -1, -1, 921, -1, 586, -1, 529, -1, + 972, -1, 922, -1, 656, -1, 975, -1, 652, -1, + 911, -1, 576, -1, 598, -1, 572, -1, 540, -1, + 954, -1, 646, -1, 582, -1, 914, -1, 551, -1, + 946, -1, 575, -1, 908, -1, 549, -1, 674, -1, + 595, -1, 655, -1, 949, -1, 963, -1, 940, -1, + 966, -1, 973, -1, 3, -1, 978, -1, 982, -1, + 933, -1, 544, -1, 938, -1, 935, 518, 938, -1, + 35, -1, 34, -1, 435, -1, 159, -1, 289, -1, + 934, -1, 939, 931, -1, 933, -1, 936, -1, 386, + 941, -1, 386, 240, 941, -1, 386, 385, 941, -1, + 386, 177, 941, -1, 942, -1, 970, 171, 104, -1, + 426, 497, 944, -1, 370, 544, -1, 970, 428, 945, + -1, 970, 503, 945, -1, 809, -1, 544, -1, 3, + -1, 794, 544, 808, -1, 794, 514, 899, 515, 544, + -1, 589, -1, 117, -1, 240, -1, 943, -1, 945, + 518, 943, -1, 239, 947, -1, 213, 947, -1, 167, + 213, 947, -1, 213, 947, 171, 948, -1, 167, 213, + 947, 171, 948, -1, 544, -1, 542, -1, 544, -1, + 542, -1, 455, 951, 953, 930, -1, 455, 951, 953, + 930, 541, 905, -1, 455, 951, 953, 930, 958, -1, + 455, 514, 952, 515, -1, 455, 514, 952, 515, 541, + 905, -1, 936, -1, 464, -1, 170, -1, 172, -1, + 3, -1, 172, -1, -1, 950, -1, 952, 518, 950, + -1, 170, -1, -1, 556, 122, 171, 955, 957, 956, + 562, -1, 436, 692, 955, -1, 761, -1, 761, 542, + -1, 761, 40, 542, -1, 473, 809, -1, -1, 454, + 743, -1, -1, 936, 930, -1, 936, 930, 541, 905, + -1, 47, 961, 544, 962, 664, -1, 47, 191, 274, + 152, 961, 544, 962, 664, -1, 128, 548, -1, 128, + 108, 548, -1, 128, 108, 191, 152, 548, -1, 108, + -1, -1, 40, 542, -1, -1, 354, 965, -1, 354, + 240, 965, -1, 354, 385, 965, -1, 354, 177, 965, + -1, 970, -1, 30, -1, 964, -1, 426, 497, -1, + 430, 223, 235, -1, 968, 674, -1, 412, 674, -1, + 412, 971, -1, 968, 971, -1, 968, 426, 497, -1, + 968, 430, 223, 235, -1, 968, 30, 969, -1, 968, + -1, 127, -1, 126, -1, 390, -1, 967, -1, 417, + -1, -1, 542, -1, 970, 516, 542, -1, 542, -1, + 971, 516, 542, -1, 61, 817, -1, 100, 644, 466, + 541, 633, 919, 40, 674, 974, -1, 100, 644, 466, + 191, 274, 152, 541, 633, 919, 40, 674, 974, -1, + 100, 294, 352, 644, 466, 541, 633, 919, 40, 674, + 974, -1, 100, 644, 342, 466, 541, 514, 637, 515, + 919, 40, 674, 974, -1, 100, 294, 352, 644, 342, + 466, 541, 514, 637, 515, 919, 40, 674, 974, -1, + 476, 74, 292, -1, 476, 64, 74, 292, -1, 476, + 240, 74, 292, -1, -1, 100, 644, 416, 977, 40, + 674, 976, -1, 100, 644, 416, 191, 274, 152, 977, + 40, 674, 976, -1, 100, 294, 352, 644, 416, 977, + 40, 674, 976, -1, 476, 107, -1, 476, 272, 107, + -1, -1, 541, 633, 620, 612, -1, 22, -1, 23, + -1, 24, -1, 25, -1, 26, -1, 27, -1, 28, + -1, 29, -1, 31, -1, 32, -1, 33, -1, 43, + -1, 44, -1, 46, -1, 47, -1, 48, -1, 50, + -1, 51, -1, 52, -1, 59, -1, 60, -1, 61, + -1, 62, -1, 63, -1, 64, -1, 67, -1, 68, + -1, 69, -1, 70, -1, 73, -1, 75, -1, 76, + -1, 77, -1, 78, -1, 84, -1, 85, -1, 86, + -1, 87, -1, 88, -1, 90, -1, 91, -1, 92, + -1, 94, -1, 95, -1, 96, -1, 97, -1, 98, + -1, 99, -1, 102, -1, 103, -1, 104, -1, 105, + -1, 106, -1, 107, -1, 108, -1, 109, -1, 110, + -1, 111, -1, 113, -1, 114, -1, 116, -1, 118, + -1, 120, -1, 121, -1, 122, -1, 123, -1, 124, + -1, 125, -1, 128, -1, 129, -1, 130, -1, 131, + -1, 134, -1, 135, -1, 136, -1, 137, -1, 138, + -1, 140, -1, 141, -1, 142, -1, 144, -1, 145, + -1, 146, -1, 148, -1, 149, -1, 150, -1, 151, + -1, 153, -1, 154, -1, 155, -1, 156, -1, 157, + -1, 160, -1, 162, -1, 163, -1, 165, -1, 167, + -1, 169, -1, 173, -1, 174, -1, 177, -1, 179, + -1, 183, -1, 184, -1, 186, -1, 187, -1, 188, + -1, 189, -1, 190, -1, 191, -1, 192, -1, 194, + -1, 195, -1, 196, -1, 197, -1, 199, -1, 200, + -1, 201, -1, 202, -1, 203, -1, 204, -1, 205, + -1, 207, -1, 210, -1, 211, -1, 212, -1, 213, + -1, 214, -1, 220, -1, 223, -1, 225, -1, 226, + -1, 227, -1, 228, -1, 229, -1, 230, -1, 233, + -1, 235, -1, 238, -1, 239, -1, 240, -1, 241, + -1, 242, -1, 243, -1, 244, -1, 245, -1, 247, + -1, 248, -1, 249, -1, 250, -1, 251, -1, 252, + -1, 253, -1, 254, -1, 255, -1, 256, -1, 257, + -1, 258, -1, 259, -1, 260, -1, 261, -1, 262, + -1, 263, -1, 264, -1, 265, -1, 266, -1, 270, + -1, 271, -1, 272, -1, 275, -1, 276, -1, 278, + -1, 281, -1, 283, -1, 284, -1, 285, -1, 287, + -1, 288, -1, 291, -1, 292, -1, 293, -1, 296, + -1, 297, -1, 300, -1, 303, -1, 304, -1, 305, + -1, 306, -1, 307, -1, 308, -1, 309, -1, 310, + -1, 311, -1, 312, -1, 313, -1, 318, -1, 319, + -1, 322, -1, 323, -1, 325, -1, 326, -1, 327, + -1, 329, -1, 330, -1, 331, -1, 332, -1, 333, + -1, 334, -1, 336, -1, 337, -1, 338, -1, 340, + -1, 341, -1, 342, -1, 343, -1, 345, -1, 346, + -1, 347, -1, 348, -1, 349, -1, 350, -1, 351, + -1, 352, -1, 353, -1, 354, -1, 355, -1, 356, + -1, 357, -1, 359, -1, 360, -1, 362, -1, 363, + -1, 364, -1, 366, -1, 367, -1, 368, -1, 369, + -1, 370, -1, 371, -1, 372, -1, 373, -1, 374, + -1, 375, -1, 376, -1, 377, -1, 378, -1, 381, + -1, 382, -1, 383, -1, 384, -1, 385, -1, 386, + -1, 388, -1, 389, -1, 392, -1, 393, -1, 395, + -1, 397, -1, 398, -1, 399, -1, 400, -1, 401, + -1, 402, -1, 403, -1, 404, -1, 405, -1, 406, + -1, 407, -1, 408, -1, 410, -1, 414, -1, 415, + -1, 417, -1, 419, -1, 420, -1, 421, -1, 422, + -1, 423, -1, 425, -1, 430, -1, 431, -1, 433, + -1, 436, -1, 437, -1, 439, -1, 440, -1, 441, + -1, 442, -1, 443, -1, 446, -1, 447, -1, 448, + -1, 450, -1, 451, -1, 452, -1, 453, -1, 455, + -1, 456, -1, 457, -1, 458, -1, 459, -1, 463, + -1, 465, -1, 466, -1, 467, -1, 468, -1, 469, + -1, 470, -1, 471, -1, 474, -1, 477, -1, 478, + -1, 479, -1, 480, -1, 481, -1, 482, -1, 494, + -1, 495, -1, 496, -1, 497, -1, 53, -1, 54, + -1, 56, -1, 57, -1, 71, -1, 72, -1, 79, + -1, 83, -1, 112, -1, 115, -1, 152, -1, 158, + -1, 164, -1, 175, -1, 181, -1, 182, -1, 209, + -1, 215, -1, 216, -1, 218, -1, 246, -1, 267, + -1, 269, -1, 273, -1, 280, -1, 282, -1, 298, + -1, 302, -1, 320, -1, 324, -1, 339, -1, 365, + -1, 387, -1, 394, -1, 409, -1, 411, -1, 426, + -1, 427, -1, 432, -1, 434, -1, 438, -1, 460, + -1, 461, -1, 483, -1, 484, -1, 485, -1, 486, + -1, 487, -1, 488, -1, 489, -1, 490, -1, 491, + -1, 492, -1, 493, -1, 42, -1, 49, -1, 55, + -1, 81, -1, 89, -1, 101, -1, 170, -1, 172, + -1, 175, -1, 176, -1, 193, -1, 208, -1, 221, + -1, 222, -1, 224, -1, 234, -1, 236, -1, 246, + -1, 268, -1, 277, -1, 299, -1, 301, -1, 321, + -1, 361, -1, 391, -1, 409, -1, 418, -1, 464, + -1, 37, -1, 42, -1, 49, -1, 55, -1, 81, + -1, 83, -1, 89, -1, 101, -1, 170, -1, 172, + -1, 176, -1, 193, -1, 208, -1, 221, -1, 222, + -1, 224, -1, 234, -1, 236, -1, 268, -1, 277, + -1, 299, -1, 301, -1, 321, -1, 361, -1, 380, + -1, 391, -1, 418, -1, 438, -1, 464, -1, 37, + -1, 42, -1, 49, -1, 53, -1, 54, -1, 55, + -1, 56, -1, 57, -1, 72, -1, 71, -1, 79, + -1, 81, -1, 83, -1, 89, -1, 101, -1, 112, + -1, 115, -1, 152, -1, 158, -1, 164, -1, 170, + -1, 172, -1, 175, -1, 176, -1, 181, -1, 182, + -1, 193, -1, 208, -1, 209, -1, 216, -1, 218, + -1, 215, -1, 221, -1, 222, -1, 224, -1, 234, + -1, 236, -1, 246, -1, 267, -1, 268, -1, 269, + -1, 273, -1, 277, -1, 280, -1, 282, -1, 299, + -1, 298, -1, 301, -1, 302, -1, 320, -1, 321, + -1, 324, -1, 339, -1, 361, -1, 365, -1, 380, + -1, 387, -1, 391, -1, 394, -1, 409, -1, 411, + -1, 418, -1, 426, -1, 427, -1, 432, -1, 434, + -1, 438, -1, 460, -1, 461, -1, 464, -1, 483, -1, 484, -1, 485, -1, 486, -1, 487, -1, 488, -1, 489, -1, 490, -1, 491, -1, 492, -1, 493, - -1, 42, -1, 49, -1, 55, -1, 81, -1, 89, - -1, 101, -1, 170, -1, 172, -1, 175, -1, 176, - -1, 193, -1, 208, -1, 221, -1, 222, -1, 224, - -1, 234, -1, 236, -1, 246, -1, 268, -1, 277, - -1, 299, -1, 301, -1, 321, -1, 361, -1, 391, - -1, 409, -1, 418, -1, 464, -1, 37, -1, 42, - -1, 49, -1, 55, -1, 81, -1, 83, -1, 89, - -1, 101, -1, 170, -1, 172, -1, 176, -1, 193, - -1, 208, -1, 221, -1, 222, -1, 224, -1, 234, - -1, 236, -1, 268, -1, 277, -1, 299, -1, 301, - -1, 321, -1, 361, -1, 380, -1, 391, -1, 418, - -1, 438, -1, 464, -1, 37, -1, 42, -1, 49, - -1, 53, -1, 54, -1, 55, -1, 56, -1, 57, - -1, 72, -1, 71, -1, 79, -1, 81, -1, 83, - -1, 89, -1, 101, -1, 112, -1, 115, -1, 152, - -1, 158, -1, 164, -1, 170, -1, 172, -1, 175, - -1, 176, -1, 181, -1, 182, -1, 193, -1, 208, - -1, 209, -1, 216, -1, 218, -1, 215, -1, 221, + -1, 37, -1, 42, -1, 49, -1, 55, -1, 81, + -1, 83, -1, 89, -1, 101, -1, 170, -1, 172, + -1, 175, -1, 176, -1, 193, -1, 208, -1, 221, -1, 222, -1, 224, -1, 234, -1, 236, -1, 246, - -1, 267, -1, 268, -1, 269, -1, 273, -1, 277, - -1, 280, -1, 282, -1, 299, -1, 298, -1, 301, - -1, 302, -1, 320, -1, 321, -1, 324, -1, 339, - -1, 361, -1, 365, -1, 380, -1, 387, -1, 391, - -1, 394, -1, 409, -1, 411, -1, 418, -1, 426, - -1, 427, -1, 432, -1, 434, -1, 438, -1, 460, - -1, 461, -1, 464, -1, 483, -1, 484, -1, 485, - -1, 486, -1, 487, -1, 488, -1, 489, -1, 490, - -1, 491, -1, 492, -1, 493, -1, 37, -1, 42, - -1, 49, -1, 55, -1, 81, -1, 83, -1, 89, - -1, 101, -1, 170, -1, 172, -1, 175, -1, 176, - -1, 193, -1, 208, -1, 221, -1, 222, -1, 224, - -1, 234, -1, 236, -1, 246, -1, 268, -1, 277, - -1, 299, -1, 301, -1, 321, -1, 361, -1, 380, - -1, 391, -1, 409, -1, 418, -1, 438, -1, 464, - -1, 30, -1, 34, -1, 35, -1, 36, -1, 38, - -1, 39, -1, 40, -1, 41, -1, 45, -1, 58, - -1, 65, -1, 66, -1, 74, -1, 80, -1, 82, - -1, 93, -1, 100, -1, 117, -1, 119, -1, 126, - -1, 127, -1, 132, -1, 133, -1, 139, -1, 143, - -1, 147, -1, 159, -1, 161, -1, 166, -1, 168, - -1, 171, -1, 178, -1, 180, -1, 185, -1, 198, - -1, 206, -1, 217, -1, 219, -1, 231, -1, 232, - -1, 237, -1, 274, -1, 279, -1, 286, -1, 289, - -1, 290, -1, 294, -1, 295, -1, 314, -1, 315, - -1, 316, -1, 317, -1, 328, -1, 335, -1, 344, - -1, 358, -1, 379, -1, 390, -1, 396, -1, 412, - -1, 413, -1, 416, -1, 424, -1, 428, -1, 429, - -1, 435, -1, 444, -1, 445, -1, 449, -1, 454, - -1, 462, -1, 472, -1, 473, -1, 475, -1, 476, - -1 + -1, 268, -1, 277, -1, 299, -1, 301, -1, 321, + -1, 361, -1, 380, -1, 391, -1, 409, -1, 418, + -1, 438, -1, 464, -1, 30, -1, 34, -1, 35, + -1, 36, -1, 38, -1, 39, -1, 40, -1, 41, + -1, 45, -1, 58, -1, 65, -1, 66, -1, 74, + -1, 80, -1, 82, -1, 93, -1, 100, -1, 117, + -1, 119, -1, 126, -1, 127, -1, 132, -1, 133, + -1, 139, -1, 143, -1, 147, -1, 159, -1, 161, + -1, 166, -1, 168, -1, 171, -1, 178, -1, 180, + -1, 185, -1, 198, -1, 206, -1, 217, -1, 219, + -1, 231, -1, 232, -1, 237, -1, 274, -1, 279, + -1, 286, -1, 289, -1, 290, -1, 294, -1, 295, + -1, 314, -1, 315, -1, 316, -1, 317, -1, 328, + -1, 335, -1, 344, -1, 358, -1, 379, -1, 390, + -1, 396, -1, 412, -1, 413, -1, 416, -1, 424, + -1, 428, -1, 429, -1, 435, -1, 444, -1, 445, + -1, 449, -1, 454, -1, 462, -1, 472, -1, 473, + -1, 475, -1, 476, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 500, 500, 516, 528, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 578, 9, 18, 27, 36, + 0, 502, 502, 518, 530, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 580, 9, 18, 27, 36, 45, 54, 63, 72, 85, 87, 93, 94, 99, 103, 107, 118, 126, 130, 139, 148, 157, 166, 175, 184, 192, 200, 209, 218, 227, 236, 253, 262, 271, 280, @@ -392503,110 +395409,110 @@ static const yytype_uint16 yyrline[] = 119, 120, 8, 20, 33, 46, 58, 70, 86, 87, 91, 95, 7, 1, 30, 49, 61, 62, 63, 67, 68, 73, 77, 82, 86, 94, 95, 99, 100, 105, - 106, 110, 111, 116, 117, 118, 119, 120, 121, 126, - 134, 138, 143, 144, 149, 153, 158, 162, 166, 170, - 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, - 214, 218, 226, 231, 232, 233, 234, 235, 241, 245, - 47, 48, 52, 53, 54, 72, 73, 80, 88, 96, - 104, 112, 120, 131, 132, 159, 164, 172, 188, 205, - 222, 239, 240, 259, 263, 267, 271, 275, 285, 296, - 306, 315, 326, 337, 349, 364, 382, 382, 386, 386, - 390, 390, 394, 400, 407, 411, 412, 416, 417, 431, - 438, 445, 455, 456, 459, 472, 473, 474, 478, 489, - 497, 502, 507, 512, 517, 525, 533, 538, 543, 550, - 551, 555, 556, 557, 561, 568, 569, 573, 574, 578, - 579, 580, 584, 585, 589, 590, 606, 607, 610, 619, - 630, 631, 632, 635, 636, 637, 641, 642, 643, 644, - 648, 649, 653, 655, 671, 673, 678, 681, 689, 693, - 697, 701, 705, 709, 716, 721, 728, 729, 733, 738, - 742, 746, 754, 761, 762, 767, 768, 772, 773, 778, - 780, 782, 787, 807, 808, 810, 815, 816, 820, 821, - 824, 825, 850, 851, 856, 860, 861, 865, 866, 870, - 871, 872, 873, 874, 878, 891, 898, 905, 912, 913, - 917, 918, 922, 923, 927, 928, 932, 933, 937, 938, - 942, 953, 954, 955, 956, 960, 961, 966, 967, 968, - 977, 983, 992, 993, 1006, 1007, 1011, 1012, 1016, 1017, - 1023, 1029, 1037, 1046, 1054, 1063, 1072, 1076, 1081, 1092, - 1106, 1107, 1110, 1111, 1112, 1115, 1123, 1132, 1133, 1134, - 1135, 1138, 1146, 1155, 1159, 1166, 1167, 1171, 1180, 1184, - 1209, 1213, 1226, 1240, 1255, 1267, 1280, 1294, 1308, 1321, - 1336, 1355, 1361, 1366, 1372, 1379, 1380, 1388, 1392, 1396, - 1402, 1409, 1414, 1415, 1416, 1417, 1418, 1419, 1423, 1424, - 1436, 1437, 1442, 1449, 1456, 1463, 1495, 1506, 1519, 1524, - 1525, 1528, 1529, 1532, 1533, 1538, 1539, 1544, 1548, 1554, - 1575, 1583, 1596, 1599, 1603, 1603, 1606, 1607, 1609, 1614, - 1621, 1626, 1632, 1637, 1643, 1647, 1654, 1661, 1671, 1672, - 1676, 1678, 1681, 1685, 1686, 1687, 1688, 1689, 1690, 1695, - 1715, 1716, 1717, 1718, 1729, 1743, 1744, 1750, 1755, 1760, - 1765, 1770, 1775, 1780, 1785, 1791, 1797, 1803, 1810, 1832, - 1841, 1845, 1853, 1857, 1865, 1877, 1898, 1902, 1908, 1912, - 1925, 1933, 1943, 1945, 1947, 1949, 1951, 1953, 1958, 1959, - 1966, 1975, 1983, 1992, 2003, 2011, 2012, 2013, 2017, 2017, - 2020, 2020, 2023, 2023, 2026, 2026, 2029, 2029, 2032, 2032, - 2035, 2035, 2038, 2038, 2041, 2041, 2044, 2044, 2047, 2047, - 2050, 2050, 2053, 2055, 2057, 2059, 2061, 2063, 2065, 2067, - 2069, 2071, 2073, 2075, 2077, 2082, 2087, 2093, 2100, 2105, - 2111, 2117, 2148, 2150, 2152, 2160, 2175, 2177, 2179, 2181, - 2183, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, 2201, - 2203, 2205, 2208, 2210, 2212, 2215, 2217, 2219, 2221, 2223, - 2228, 2233, 2240, 2245, 2252, 2257, 2264, 2269, 2277, 2285, - 2293, 2301, 2319, 2327, 2335, 2343, 2351, 2359, 2367, 2371, - 2387, 2395, 2403, 2411, 2419, 2427, 2435, 2439, 2443, 2447, - 2451, 2459, 2467, 2475, 2483, 2503, 2525, 2536, 2543, 2557, - 2565, 2573, 2593, 2595, 2597, 2599, 2601, 2603, 2605, 2607, - 2609, 2611, 2613, 2615, 2617, 2619, 2621, 2623, 2625, 2627, - 2629, 2631, 2633, 2635, 2639, 2643, 2647, 2661, 2662, 2676, - 2677, 2678, 2689, 2713, 2724, 2734, 2738, 2742, 2749, 2753, - 2760, 2764, 2781, 2785, 2787, 2791, 2794, 2805, 2810, 2817, - 2825, 2834, 2838, 2845, 2853, 2861, 2872, 2892, 2928, 2939, - 2940, 2947, 2953, 2955, 2957, 2961, 2970, 2975, 2982, 2997, - 3004, 3008, 3012, 3016, 3020, 3030, 3039, 3061, 3062, 3066, - 3067, 3068, 3072, 3073, 3080, 3081, 3085, 3086, 3091, 3099, - 3101, 3115, 3118, 3145, 3146, 3149, 3150, 3158, 3166, 3174, - 3183, 3193, 3211, 3257, 3266, 3275, 3284, 3293, 3305, 3306, - 3307, 3308, 3309, 3323, 3324, 3327, 3328, 3332, 3342, 3343, - 3347, 3348, 3352, 3359, 3360, 3365, 3366, 3371, 3372, 3375, - 3376, 3377, 3380, 3381, 3384, 3385, 3386, 3387, 3388, 3389, - 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3400, 3402, - 3407, 3409, 3414, 3416, 3418, 3420, 3422, 3424, 3426, 3428, - 3442, 3444, 3449, 3453, 3460, 3465, 3471, 3475, 3482, 3487, - 3494, 3499, 3507, 3511, 3517, 3521, 3530, 3541, 3542, 3546, - 3550, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, - 3566, 3567, 3568, 3569, 3570, 3580, 3584, 3591, 3598, 3599, - 3615, 3619, 3624, 3628, 3643, 3648, 3652, 3655, 3658, 3659, - 3660, 3663, 3670, 3680, 3694, 3695, 3699, 3710, 3711, 3714, - 3715, 3718, 3722, 3729, 3737, 3745, 3753, 3763, 3764, 3769, - 3770, 3774, 3775, 3776, 3780, 3789, 3797, 3805, 3814, 3829, - 3830, 3835, 3836, 3846, 3847, 3851, 3852, 3856, 3857, 3860, - 3876, 3884, 3894, 3895, 3898, 3899, 3902, 3906, 3907, 3911, - 3912, 3915, 3916, 3917, 3927, 3928, 3932, 3934, 3940, 3941, - 3945, 3946, 3949, 3960, 3963, 3974, 3978, 3982, 3994, 3998, - 4007, 4014, 4052, 4056, 4060, 4064, 4068, 4072, 4076, 4082, - 4099, 4100, 4101, 4104, 4105, 4106, 4109, 4110, 4111, 4114, - 4115, 4118, 4120, 4125, 4126, 4129, 4133, 4134, 7, 18, - 19, 23, 24, 25, 26, 27, 28, 7, 26, 50, - 73, 80, 85, 86, 87, 88, 8, 33, 62, 66, - 67, 72, 73, 78, 79, 83, 84, 89, 90, 7, - 16, 25, 34, 43, 52, 5, 12, 22, 23, 7, - 15, 26, 27, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 7, 19, 33, 9, 16, 26, 33, - 44, 45, 50, 51, 52, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 90, 91, 92, 97, 98, - 103, 107, 115, 116, 121, 122, 123, 129, 134, 142, - 143, 10, 16, 22, 28, 38, 39, 47, 58, 70, - 78, 89, 95, 99, 103, 118, 125, 126, 127, 131, - 132, 7, 15, 22, 29, 36, 45, 46, 48, 49, - 8, 22, 36, 48, 56, 70, 71, 72, 73, 74, - 87, 88, 93, 94, 98, 99, 7, 18, 31, 35, - 42, 53, 54, 60, 61, 9, 19, 7, 16, 28, - 35, 42, 51, 52, 56, 57, 2, 7, 12, 17, - 26, 33, 43, 44, 51, 3, 10, 17, 24, 31, - 38, 45, 52, 61, 61, 63, 63, 65, 65, 67, - 68, 72, 73, 6, 8, 21, 34, 47, 65, 87, - 88, 89, 90, 11, 24, 37, 54, 55, 56, 61, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 106, 110, 111, 116, 117, 118, 119, 120, 121, 122, + 127, 135, 139, 144, 145, 150, 154, 159, 163, 167, + 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, + 211, 215, 219, 227, 232, 233, 234, 235, 236, 242, + 246, 47, 48, 52, 53, 54, 72, 73, 80, 88, + 96, 104, 112, 120, 131, 132, 159, 164, 172, 188, + 205, 222, 239, 240, 259, 263, 267, 271, 275, 285, + 296, 306, 315, 326, 337, 349, 364, 382, 382, 386, + 386, 390, 390, 394, 400, 407, 411, 412, 416, 417, + 431, 438, 445, 455, 456, 459, 472, 473, 474, 478, + 489, 497, 502, 507, 512, 517, 525, 533, 538, 543, + 550, 551, 555, 556, 557, 561, 568, 569, 573, 574, + 578, 579, 580, 584, 585, 589, 590, 606, 607, 610, + 619, 630, 631, 632, 635, 636, 637, 641, 642, 643, + 644, 648, 649, 653, 655, 671, 673, 678, 681, 689, + 693, 697, 701, 705, 709, 716, 721, 728, 729, 733, + 738, 742, 746, 754, 761, 762, 767, 768, 772, 773, + 778, 780, 782, 787, 807, 808, 810, 815, 816, 820, + 821, 824, 825, 850, 851, 856, 860, 861, 865, 866, + 870, 871, 872, 873, 874, 878, 891, 898, 905, 912, + 913, 917, 918, 922, 923, 927, 928, 932, 933, 937, + 938, 942, 953, 954, 955, 956, 960, 961, 966, 967, + 968, 977, 983, 992, 993, 1006, 1007, 1011, 1012, 1016, + 1017, 1023, 1029, 1037, 1046, 1054, 1063, 1072, 1076, 1081, + 1092, 1106, 1107, 1110, 1111, 1112, 1115, 1123, 1132, 1133, + 1134, 1135, 1138, 1146, 1155, 1159, 1166, 1167, 1171, 1180, + 1184, 1209, 1213, 1226, 1240, 1255, 1267, 1280, 1294, 1308, + 1321, 1336, 1355, 1361, 1366, 1372, 1379, 1380, 1388, 1392, + 1396, 1402, 1409, 1414, 1415, 1416, 1417, 1418, 1419, 1423, + 1424, 1436, 1437, 1442, 1449, 1456, 1463, 1495, 1506, 1519, + 1524, 1525, 1528, 1529, 1532, 1533, 1538, 1539, 1544, 1548, + 1554, 1575, 1583, 1596, 1599, 1603, 1603, 1606, 1607, 1609, + 1614, 1621, 1626, 1632, 1637, 1643, 1647, 1654, 1661, 1671, + 1672, 1676, 1678, 1681, 1685, 1686, 1687, 1688, 1689, 1690, + 1695, 1715, 1716, 1717, 1718, 1729, 1743, 1744, 1750, 1755, + 1760, 1765, 1770, 1775, 1780, 1785, 1791, 1797, 1803, 1810, + 1832, 1841, 1845, 1853, 1857, 1865, 1877, 1898, 1902, 1908, + 1912, 1925, 1933, 1943, 1945, 1947, 1949, 1951, 1953, 1958, + 1959, 1966, 1975, 1983, 1992, 2003, 2011, 2012, 2013, 2017, + 2017, 2020, 2020, 2023, 2023, 2026, 2026, 2029, 2029, 2032, + 2032, 2035, 2035, 2038, 2038, 2041, 2041, 2044, 2044, 2047, + 2047, 2050, 2050, 2053, 2055, 2057, 2059, 2061, 2063, 2065, + 2067, 2069, 2071, 2073, 2075, 2077, 2082, 2087, 2093, 2100, + 2105, 2111, 2117, 2148, 2150, 2152, 2160, 2175, 2177, 2179, + 2181, 2183, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, + 2201, 2203, 2205, 2208, 2210, 2212, 2215, 2217, 2219, 2221, + 2223, 2228, 2233, 2240, 2245, 2252, 2257, 2264, 2269, 2277, + 2285, 2293, 2301, 2319, 2327, 2335, 2343, 2351, 2359, 2367, + 2371, 2387, 2395, 2403, 2411, 2419, 2427, 2435, 2439, 2443, + 2447, 2451, 2459, 2467, 2475, 2483, 2503, 2525, 2536, 2543, + 2557, 2565, 2573, 2593, 2595, 2597, 2599, 2601, 2603, 2605, + 2607, 2609, 2611, 2613, 2615, 2617, 2619, 2621, 2623, 2625, + 2627, 2629, 2631, 2633, 2635, 2639, 2643, 2647, 2661, 2662, + 2676, 2677, 2678, 2689, 2713, 2724, 2734, 2738, 2742, 2749, + 2753, 2760, 2764, 2781, 2785, 2787, 2790, 2793, 2804, 2809, + 2816, 2822, 2828, 2837, 2841, 2848, 2856, 2864, 2875, 2895, + 2931, 2942, 2943, 2950, 2956, 2958, 2960, 2964, 2973, 2978, + 2985, 3000, 3007, 3011, 3015, 3019, 3023, 3033, 3042, 3064, + 3065, 3069, 3070, 3071, 3075, 3076, 3083, 3084, 3088, 3089, + 3094, 3102, 3104, 3118, 3121, 3148, 3149, 3152, 3153, 3161, + 3169, 3177, 3186, 3196, 3214, 3260, 3269, 3278, 3287, 3296, + 3308, 3309, 3310, 3311, 3312, 3326, 3327, 3330, 3331, 3335, + 3345, 3346, 3350, 3351, 3355, 3362, 3363, 3368, 3369, 3374, + 3375, 3378, 3379, 3380, 3383, 3384, 3387, 3388, 3389, 3390, + 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, + 3403, 3405, 3410, 3412, 3417, 3419, 3421, 3423, 3425, 3427, + 3429, 3431, 3445, 3447, 3452, 3456, 3463, 3468, 3474, 3478, + 3485, 3490, 3497, 3502, 3510, 3514, 3520, 3524, 3533, 3544, + 3545, 3549, 3553, 3560, 3561, 3562, 3563, 3564, 3565, 3566, + 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3583, 3587, 3594, + 3601, 3602, 3618, 3622, 3627, 3631, 3646, 3651, 3655, 3658, + 3661, 3662, 3663, 3666, 3673, 3683, 3697, 3698, 3702, 3713, + 3714, 3717, 3718, 3721, 3725, 3732, 3740, 3748, 3756, 3766, + 3767, 3772, 3773, 3777, 3778, 3779, 3783, 3792, 3800, 3808, + 3817, 3832, 3833, 3838, 3839, 3849, 3850, 3854, 3855, 3859, + 3860, 3863, 3879, 3887, 3897, 3898, 3901, 3902, 3905, 3909, + 3910, 3914, 3915, 3918, 3919, 3920, 3930, 3931, 3935, 3937, + 3943, 3944, 3948, 3949, 3952, 3963, 3966, 3977, 3981, 3985, + 3997, 4001, 4010, 4017, 4055, 4059, 4063, 4067, 4071, 4075, + 4079, 4085, 4102, 4103, 4104, 4107, 4108, 4109, 4112, 4113, + 4114, 4117, 4118, 4121, 4123, 4128, 4129, 4132, 4136, 4137, + 7, 18, 19, 23, 24, 25, 26, 27, 28, 7, + 26, 50, 73, 80, 85, 86, 87, 88, 8, 33, + 62, 66, 67, 72, 73, 78, 79, 83, 84, 89, + 90, 7, 16, 25, 34, 43, 52, 5, 12, 22, + 23, 7, 15, 26, 27, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 7, 19, 33, 9, 16, + 26, 33, 44, 45, 50, 51, 52, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 90, 91, 92, + 97, 98, 103, 107, 115, 116, 121, 122, 123, 129, + 134, 142, 143, 10, 16, 22, 28, 38, 39, 47, + 58, 70, 78, 89, 95, 99, 103, 118, 125, 126, + 127, 131, 132, 7, 15, 22, 29, 36, 45, 46, + 48, 49, 8, 22, 36, 48, 56, 70, 71, 72, + 73, 74, 87, 88, 93, 94, 98, 99, 7, 18, + 31, 35, 42, 53, 54, 60, 61, 9, 19, 7, + 16, 28, 35, 42, 51, 52, 56, 57, 2, 7, + 12, 17, 26, 33, 43, 44, 51, 3, 10, 17, + 24, 31, 38, 45, 52, 61, 61, 63, 63, 65, + 65, 67, 68, 72, 73, 6, 8, 21, 34, 47, + 65, 87, 88, 89, 90, 11, 24, 37, 54, 55, + 56, 61, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, @@ -392638,18 +395544,18 @@ static const yytype_uint16 yyrline[] = 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, + 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, + 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -392657,17 +395563,18 @@ static const yytype_uint16 yyrline[] = 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, + 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, + 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80 + 80 }; #endif @@ -392838,8 +395745,8 @@ static const char *const yytname[] = "millisecond_keyword", "microsecond_keyword", "week_keyword", "decade_keyword", "century_keyword", "millennium_keyword", "opt_interval", "a_expr", "b_expr", "c_expr", "d_expr", - "indirection_expr_or_a_expr", "indirection_expr", "struct_expr", - "func_application", "func_expr", "func_expr_windowless", + "indirection_expr_or_a_expr", "indirection_expr", "list_expr", + "struct_expr", "func_application", "func_expr", "func_expr_windowless", "func_expr_common_subexpr", "list_comprehension", "within_group_clause", "filter_clause", "export_clause", "window_clause", "window_definition_list", "window_definition", "over_clause", @@ -393001,171 +395908,172 @@ static const yytype_uint16 yyr1[] = 651, 651, 652, 652, 652, 652, 652, 652, 653, 653, 654, 654, 655, 656, 656, 656, 657, 657, 657, 658, 658, 659, 659, 660, 660, 661, 661, 662, 662, 663, - 663, 664, 664, 665, 665, 665, 665, 665, 665, 666, - 667, 667, 668, 668, 669, 669, 670, 670, 670, 670, + 663, 664, 664, 665, 665, 665, 665, 665, 665, 665, + 666, 667, 667, 668, 668, 669, 669, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 671, 672, 672, 672, 672, 672, 673, 673, - 674, 674, 675, 675, 675, 676, 676, 676, 676, 676, - 676, 676, 676, 677, 677, 678, 678, 679, 679, 679, + 670, 670, 670, 671, 672, 672, 672, 672, 672, 673, + 673, 674, 674, 675, 675, 675, 676, 676, 676, 676, + 676, 676, 676, 676, 677, 677, 678, 678, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, - 679, 679, 679, 679, 679, 679, 680, 680, 681, 681, - 682, 682, 683, 683, 683, 684, 684, 685, 685, 686, - 686, 686, 687, 687, 688, 689, 689, 689, 690, 690, - 691, 691, 691, 691, 691, 691, 691, 691, 691, 692, - 692, 693, 693, 693, 694, 695, 695, 696, 696, 697, - 697, 697, 698, 698, 699, 699, 700, 700, 701, 701, - 702, 702, 702, 703, 703, 703, 704, 704, 704, 704, - 705, 705, 706, 706, 706, 706, 707, 707, 708, 708, - 708, 708, 708, 708, 709, 709, 710, 710, 711, 711, - 711, 711, 712, 713, 713, 714, 714, 715, 715, 715, - 715, 715, 716, 717, 717, 717, 718, 718, 719, 719, - 720, 720, 721, 721, 721, 722, 722, 723, 723, 724, - 724, 724, 724, 724, 725, 726, 727, 728, 729, 729, - 730, 730, 731, 731, 732, 732, 733, 733, 734, 734, - 735, 736, 736, 736, 736, 737, 737, 738, 738, 738, - 739, 739, 740, 740, 741, 741, 742, 742, 743, 743, - 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, - 745, 745, 746, 746, 746, 747, 747, 748, 748, 748, - 748, 749, 749, 750, 750, 751, 751, 752, 753, 753, - 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, - 754, 755, 755, 755, 755, 756, 756, 757, 757, 757, - 757, 757, 758, 758, 758, 758, 758, 758, 759, 759, - 760, 760, 761, 761, 761, 761, 762, 762, 763, 764, - 764, 765, 765, 766, 766, 767, 767, 768, 768, 769, - 770, 770, 771, 771, 772, 772, 773, 773, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 775, 775, - 776, 776, 776, 777, 777, 777, 777, 777, 777, 777, - 778, 778, 778, 778, 779, 780, 780, 781, 781, 781, - 781, 781, 781, 781, 781, 781, 781, 781, 782, 782, - 783, 783, 784, 784, 785, 786, 787, 787, 788, 788, - 789, 790, 791, 791, 791, 791, 791, 791, 792, 792, - 793, 793, 793, 793, 794, 795, 795, 795, 796, 796, - 797, 797, 798, 798, 799, 799, 800, 800, 801, 801, - 802, 802, 803, 803, 804, 804, 805, 805, 806, 806, - 807, 807, 808, 808, 808, 808, 808, 808, 808, 808, + 679, 679, 679, 679, 679, 679, 679, 680, 680, 681, + 681, 682, 682, 683, 683, 683, 684, 684, 685, 685, + 686, 686, 686, 687, 687, 688, 689, 689, 689, 690, + 690, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 692, 692, 693, 693, 693, 694, 695, 695, 696, 696, + 697, 697, 697, 698, 698, 699, 699, 700, 700, 701, + 701, 702, 702, 702, 703, 703, 703, 704, 704, 704, + 704, 705, 705, 706, 706, 706, 706, 707, 707, 708, + 708, 708, 708, 708, 708, 709, 709, 710, 710, 711, + 711, 711, 711, 712, 713, 713, 714, 714, 715, 715, + 715, 715, 715, 716, 717, 717, 717, 718, 718, 719, + 719, 720, 720, 721, 721, 721, 722, 722, 723, 723, + 724, 724, 724, 724, 724, 725, 726, 727, 728, 729, + 729, 730, 730, 731, 731, 732, 732, 733, 733, 734, + 734, 735, 736, 736, 736, 736, 737, 737, 738, 738, + 738, 739, 739, 740, 740, 741, 741, 742, 742, 743, + 743, 744, 744, 744, 744, 744, 744, 744, 744, 744, + 744, 745, 745, 746, 746, 746, 747, 747, 748, 748, + 748, 748, 749, 749, 750, 750, 751, 751, 752, 753, + 753, 754, 754, 754, 754, 754, 754, 754, 754, 754, + 754, 754, 755, 755, 755, 755, 756, 756, 757, 757, + 757, 757, 757, 758, 758, 758, 758, 758, 758, 759, + 759, 760, 760, 761, 761, 761, 761, 762, 762, 763, + 764, 764, 765, 765, 766, 766, 767, 767, 768, 768, + 769, 770, 770, 771, 771, 772, 772, 773, 773, 774, + 774, 774, 774, 774, 774, 774, 774, 774, 774, 775, + 775, 776, 776, 776, 777, 777, 777, 777, 777, 777, + 777, 778, 778, 778, 778, 779, 780, 780, 781, 781, + 781, 781, 781, 781, 781, 781, 781, 781, 781, 782, + 782, 783, 783, 784, 784, 785, 786, 787, 787, 788, + 788, 789, 790, 791, 791, 791, 791, 791, 791, 792, + 792, 793, 793, 793, 793, 794, 795, 795, 795, 796, + 796, 797, 797, 798, 798, 799, 799, 800, 800, 801, + 801, 802, 802, 803, 803, 804, 804, 805, 805, 806, + 806, 807, 807, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, - 808, 808, 809, 809, 809, 809, 809, 809, 809, 809, + 808, 808, 808, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, - 809, 809, 810, 810, 810, 810, 810, 810, 810, 810, + 809, 809, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, - 810, 810, 810, 810, 810, 810, 810, 811, 811, 812, - 812, 812, 812, 812, 812, 813, 813, 813, 814, 814, + 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, + 812, 812, 812, 812, 812, 812, 813, 813, 813, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, - 815, 816, 816, 816, 816, 816, 816, 817, 817, 818, - 818, 819, 819, 819, 819, 819, 819, 819, 819, 819, - 819, 819, 819, 819, 819, 820, 820, 821, 821, 822, - 822, 822, 823, 823, 824, 824, 825, 825, 826, 827, - 827, 827, 828, 829, 829, 830, 830, 831, 831, 831, - 831, 832, 832, 833, 833, 833, 833, 833, 834, 834, - 834, 834, 834, 835, 835, 836, 836, 837, 838, 838, - 839, 839, 840, 841, 841, 842, 842, 843, 843, 844, - 844, 844, 845, 845, 846, 846, 846, 846, 846, 846, - 846, 846, 846, 846, 846, 846, 846, 846, 847, 847, - 848, 848, 849, 849, 849, 849, 849, 849, 849, 849, + 814, 815, 816, 817, 817, 817, 817, 817, 817, 818, + 818, 819, 819, 820, 820, 820, 820, 820, 820, 820, + 820, 820, 820, 820, 820, 820, 820, 821, 821, 822, + 822, 823, 823, 823, 824, 824, 825, 825, 826, 826, + 827, 828, 828, 828, 829, 830, 830, 831, 831, 832, + 832, 832, 832, 833, 833, 834, 834, 834, 834, 834, + 835, 835, 835, 835, 835, 836, 836, 837, 837, 838, + 839, 839, 840, 840, 841, 842, 842, 843, 843, 844, + 844, 845, 845, 845, 846, 846, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, + 848, 848, 849, 849, 850, 850, 850, 850, 850, 850, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, - 855, 855, 856, 856, 857, 857, 857, 858, 858, 859, - 859, 860, 860, 860, 860, 860, 860, 860, 860, 860, - 860, 860, 860, 860, 860, 861, 861, 862, 863, 863, - 864, 864, 864, 864, 864, 864, 865, 866, 867, 867, - 867, 868, 868, 869, 870, 870, 871, 872, 872, 873, - 873, 874, 874, 546, 546, 546, 546, 875, 875, 876, - 876, 877, 877, 877, 878, 878, 878, 878, 878, 879, + 855, 855, 856, 856, 857, 857, 858, 858, 858, 859, + 859, 860, 860, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 862, 862, 863, + 864, 864, 865, 865, 865, 865, 865, 865, 866, 867, + 868, 868, 868, 869, 869, 870, 871, 871, 872, 873, + 873, 874, 874, 875, 875, 546, 546, 546, 546, 876, + 876, 877, 877, 878, 878, 878, 879, 879, 879, 879, 879, 880, 880, 881, 881, 882, 882, 883, 883, 884, - 884, 884, 885, 885, 886, 886, 887, 888, 888, 889, - 889, 890, 890, 890, 891, 891, 892, 892, 893, 893, - 894, 894, 895, 896, 896, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, 897, 898, - 899, 899, 899, 900, 900, 900, 901, 901, 901, 902, - 902, 903, 903, 904, 904, 905, 906, 906, 907, 908, - 908, 909, 909, 909, 909, 909, 909, 910, 910, 910, - 911, 911, 912, 912, 912, 912, 913, 913, 914, 915, + 884, 885, 885, 885, 886, 886, 887, 887, 888, 889, + 889, 890, 890, 891, 891, 891, 892, 892, 893, 893, + 894, 894, 895, 895, 896, 897, 897, 898, 898, 898, + 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, + 898, 899, 900, 900, 900, 901, 901, 901, 902, 902, + 902, 903, 903, 904, 904, 905, 905, 906, 907, 907, + 908, 909, 909, 910, 910, 910, 910, 910, 910, 911, + 911, 911, 912, 912, 913, 913, 913, 913, 914, 914, 915, 916, 916, 917, 917, 918, 918, 919, 919, 920, - 920, 920, 920, 920, 920, 921, 921, 922, 922, 923, - 923, 924, 924, 925, 925, 925, 925, 925, 925, 925, - 925, 925, 925, 926, 926, 927, 928, 928, 928, 928, - 929, 929, 930, 930, 930, 931, 931, 931, 931, 931, - 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, - 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, - 931, 931, 931, 931, 931, 932, 932, 932, 933, 933, - 934, 934, 935, 935, 936, 936, 936, 936, 937, 938, - 938, 939, 939, 939, 939, 940, 940, 940, 940, 941, - 941, 942, 943, 943, 943, 943, 943, 943, 943, 944, - 944, 945, 945, 945, 945, 945, 946, 946, 947, 947, - 948, 948, 948, 948, 948, 949, 949, 949, 949, 949, + 920, 921, 921, 921, 921, 921, 921, 922, 922, 923, + 923, 924, 924, 925, 925, 926, 926, 926, 926, 926, + 926, 926, 926, 926, 926, 927, 927, 928, 929, 929, + 929, 929, 930, 930, 931, 931, 931, 932, 932, 932, + 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, + 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, + 932, 932, 932, 932, 932, 932, 932, 933, 933, 933, + 934, 934, 935, 935, 936, 936, 937, 937, 937, 937, + 938, 939, 939, 940, 940, 940, 940, 941, 941, 941, + 941, 942, 942, 943, 944, 944, 944, 944, 944, 944, + 944, 945, 945, 946, 946, 946, 946, 946, 947, 947, + 948, 948, 949, 949, 949, 949, 949, 950, 950, 950, 950, 950, 951, 951, 952, 952, 953, 953, 954, 954, - 954, 955, 955, 956, 956, 957, 957, 958, 958, 959, - 959, 959, 960, 960, 961, 961, 962, 962, 962, 962, - 963, 963, 964, 964, 964, 965, 965, 965, 965, 965, - 965, 965, 965, 966, 966, 967, 967, 968, 968, 969, - 969, 970, 970, 971, 972, 972, 972, 972, 972, 973, - 973, 973, 973, 974, 974, 974, 975, 975, 975, 976, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, + 955, 955, 955, 956, 956, 957, 957, 958, 958, 959, + 959, 960, 960, 960, 961, 961, 962, 962, 963, 963, + 963, 963, 964, 964, 965, 965, 965, 966, 966, 966, + 966, 966, 966, 966, 966, 967, 967, 968, 968, 969, + 969, 970, 970, 971, 971, 972, 973, 973, 973, 973, + 973, 974, 974, 974, 974, 975, 975, 975, 976, 976, + 976, 977, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 979, 979, 979, 979, 979, 979, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 980, 980, 980, 980, 980, 980, 980, 980, + 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, - 980, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, + 980, 980, 980, 980, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 982, 982, 982, 982, 982, 982, 982, 982, + 981, 981, 981, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, - 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, - 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, - 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, - 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, - 983, 983, 983, 983, 983, 983, 983, 983, 983 + 983, 983, 983, 983, 983, 983, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -393218,110 +396126,110 @@ static const yytype_uint8 yyr2[] = 1, 1, 8, 11, 10, 7, 10, 9, 1, 1, 2, 3, 8, 11, 9, 7, 0, 3, 3, 1, 1, 3, 0, 1, 3, 1, 0, 1, 0, 1, - 0, 1, 3, 1, 1, 1, 3, 1, 0, 2, - 2, 0, 2, 0, 1, 0, 1, 1, 1, 3, - 3, 1, 1, 3, 3, 3, 3, 3, 3, 4, - 3, 2, 1, 1, 1, 1, 3, 1, 1, 3, - 1, 1, 3, 3, 3, 1, 2, 4, 4, 2, - 3, 5, 5, 1, 1, 3, 0, 11, 11, 10, - 12, 1, 2, 5, 4, 4, 4, 4, 7, 5, - 4, 7, 6, 9, 9, 4, 1, 1, 1, 1, - 1, 1, 1, 5, 1, 1, 3, 1, 2, 2, - 2, 3, 1, 3, 7, 1, 2, 0, 2, 0, - 3, 3, 4, 4, 4, 4, 3, 2, 1, 1, - 0, 1, 1, 0, 2, 1, 5, 1, 0, 2, - 2, 0, 1, 0, 3, 5, 1, 3, 4, 3, - 1, 1, 0, 2, 2, 0, 2, 2, 1, 1, - 1, 0, 2, 4, 5, 4, 2, 3, 2, 2, - 2, 2, 1, 2, 3, 0, 1, 0, 5, 1, - 4, 6, 2, 1, 0, 4, 0, 1, 1, 2, - 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, - 1, 1, 3, 3, 0, 1, 3, 1, 2, 1, - 1, 1, 1, 1, 2, 4, 4, 5, 1, 1, - 2, 0, 2, 0, 1, 3, 1, 0, 1, 2, - 3, 2, 4, 2, 3, 2, 0, 1, 2, 0, - 4, 5, 1, 2, 2, 0, 1, 3, 1, 2, - 3, 3, 3, 3, 3, 3, 1, 4, 9, 9, - 3, 0, 2, 2, 0, 5, 3, 0, 1, 1, - 3, 5, 3, 1, 2, 1, 3, 5, 1, 2, - 3, 4, 5, 4, 5, 4, 6, 5, 4, 5, - 5, 5, 2, 4, 1, 1, 0, 1, 4, 5, - 4, 0, 2, 2, 2, 1, 1, 1, 1, 0, - 4, 2, 1, 2, 2, 4, 2, 6, 2, 1, - 3, 4, 0, 2, 0, 2, 0, 1, 3, 3, - 2, 0, 2, 4, 1, 1, 1, 0, 2, 3, - 5, 6, 2, 3, 1, 5, 5, 5, 3, 3, - 3, 4, 0, 1, 1, 1, 1, 1, 2, 4, - 1, 1, 1, 1, 2, 3, 0, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 1, 3, 0, - 1, 1, 1, 1, 5, 2, 1, 1, 1, 1, - 4, 1, 2, 2, 1, 3, 3, 2, 1, 0, - 5, 2, 5, 2, 1, 3, 3, 0, 1, 1, + 0, 1, 3, 1, 1, 1, 1, 3, 1, 0, + 2, 2, 0, 2, 0, 1, 0, 1, 1, 1, + 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, + 4, 3, 2, 1, 1, 1, 1, 3, 1, 1, + 3, 1, 1, 3, 3, 3, 1, 2, 4, 4, + 2, 3, 5, 5, 1, 1, 3, 0, 11, 11, + 10, 12, 1, 2, 5, 4, 4, 4, 4, 7, + 5, 4, 7, 6, 9, 9, 4, 1, 1, 1, + 1, 1, 1, 1, 5, 1, 1, 3, 1, 2, + 2, 2, 3, 1, 3, 7, 1, 2, 0, 2, + 0, 3, 3, 4, 4, 4, 4, 3, 2, 1, + 1, 0, 1, 1, 0, 2, 1, 5, 1, 0, + 2, 2, 0, 1, 0, 3, 5, 1, 3, 4, + 3, 1, 1, 0, 2, 2, 0, 2, 2, 1, + 1, 1, 0, 2, 4, 5, 4, 2, 3, 2, + 2, 2, 2, 1, 2, 3, 0, 1, 0, 5, + 1, 4, 6, 2, 1, 0, 4, 0, 1, 1, + 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 3, 3, 0, 1, 3, 1, 2, + 1, 1, 1, 1, 1, 2, 4, 4, 5, 1, + 1, 2, 0, 2, 0, 1, 3, 1, 0, 1, + 2, 3, 2, 4, 2, 3, 2, 0, 1, 2, + 0, 4, 5, 1, 2, 2, 0, 1, 3, 1, + 2, 3, 3, 3, 3, 3, 3, 1, 4, 9, + 9, 3, 0, 2, 2, 0, 5, 3, 0, 1, + 1, 3, 5, 3, 1, 2, 1, 3, 5, 1, + 2, 3, 4, 5, 4, 5, 4, 6, 5, 4, + 5, 5, 5, 2, 4, 1, 1, 0, 1, 4, + 5, 4, 0, 2, 2, 2, 1, 1, 1, 1, + 0, 4, 2, 1, 2, 2, 4, 2, 6, 2, + 1, 3, 4, 0, 2, 0, 2, 0, 1, 3, + 3, 2, 0, 2, 4, 1, 1, 1, 0, 2, + 3, 5, 6, 2, 3, 1, 5, 5, 5, 3, + 3, 3, 4, 0, 1, 1, 1, 1, 1, 2, + 4, 1, 1, 1, 1, 2, 3, 0, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 1, 3, + 0, 1, 1, 1, 1, 5, 2, 1, 1, 1, + 1, 4, 1, 2, 2, 1, 3, 3, 2, 1, + 0, 5, 2, 5, 2, 1, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, - 3, 0, 1, 3, 3, 5, 2, 2, 3, 3, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, + 3, 3, 0, 1, 3, 3, 5, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, - 3, 5, 4, 6, 3, 5, 4, 6, 4, 6, - 5, 7, 3, 2, 4, 3, 2, 3, 3, 3, - 3, 4, 3, 4, 3, 4, 5, 6, 6, 7, - 6, 7, 6, 7, 3, 4, 4, 6, 1, 4, - 3, 5, 1, 3, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 3, 3, 2, 2, + 3, 3, 5, 4, 6, 3, 5, 4, 6, 4, + 6, 5, 7, 3, 2, 4, 3, 2, 3, 3, + 3, 3, 4, 3, 4, 3, 4, 5, 6, 6, + 7, 6, 7, 6, 7, 3, 4, 4, 6, 1, + 4, 3, 5, 1, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 5, 6, 6, 7, 1, 2, 1, - 1, 1, 2, 2, 4, 3, 1, 1, 1, 1, - 1, 4, 1, 1, 3, 1, 2, 4, 2, 2, - 3, 3, 6, 7, 9, 7, 7, 5, 1, 1, - 1, 5, 6, 6, 4, 4, 4, 4, 6, 5, - 5, 5, 4, 6, 4, 7, 9, 5, 0, 5, - 4, 0, 1, 0, 2, 0, 1, 3, 3, 2, - 2, 0, 6, 1, 0, 3, 0, 3, 3, 3, - 0, 1, 4, 2, 2, 2, 2, 2, 3, 2, - 2, 3, 0, 4, 3, 1, 5, 3, 1, 3, - 1, 2, 3, 1, 3, 1, 2, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, - 1, 4, 1, 4, 1, 2, 1, 2, 1, 2, - 1, 3, 1, 3, 1, 2, 1, 3, 1, 2, - 1, 0, 1, 3, 1, 3, 3, 1, 3, 3, + 3, 3, 2, 2, 5, 6, 6, 7, 1, 2, + 1, 1, 1, 2, 2, 4, 3, 1, 1, 1, + 1, 1, 4, 1, 1, 1, 1, 2, 4, 2, + 2, 3, 3, 3, 6, 7, 9, 7, 7, 5, + 1, 1, 1, 5, 6, 6, 4, 4, 4, 4, + 6, 5, 5, 5, 4, 6, 4, 7, 9, 5, + 0, 5, 4, 0, 1, 0, 2, 0, 1, 3, + 3, 2, 2, 0, 6, 1, 0, 3, 0, 3, + 3, 3, 0, 1, 4, 2, 2, 2, 2, 2, + 3, 2, 2, 3, 0, 4, 3, 1, 5, 3, + 1, 3, 1, 2, 3, 1, 3, 1, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 4, 3, 2, 3, 0, - 3, 3, 2, 2, 1, 0, 2, 2, 3, 2, - 1, 1, 3, 5, 1, 2, 4, 2, 0, 1, - 0, 1, 2, 3, 5, 7, 7, 1, 0, 0, - 2, 0, 2, 3, 3, 3, 5, 7, 7, 0, - 2, 1, 0, 1, 0, 1, 3, 1, 2, 3, - 2, 1, 4, 2, 1, 0, 3, 1, 3, 1, - 2, 4, 2, 0, 1, 3, 1, 3, 1, 2, - 1, 3, 1, 1, 2, 1, 1, 2, 1, 1, - 2, 7, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 3, 3, 0, 1, 1, 1, 5, 3, - 0, 1, 1, 1, 1, 1, 1, 4, 7, 6, - 2, 0, 1, 1, 1, 1, 13, 16, 1, 2, - 0, 1, 0, 1, 0, 2, 0, 1, 0, 6, - 8, 6, 8, 6, 8, 3, 2, 1, 0, 6, - 6, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 4, 6, 3, 2, 4, 3, 5, - 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 4, 1, 4, 1, 4, 1, 2, 1, 2, + 1, 2, 1, 3, 1, 3, 1, 2, 1, 3, + 1, 2, 1, 0, 1, 3, 1, 3, 3, 1, + 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, + 3, 0, 3, 3, 2, 2, 1, 0, 2, 2, + 3, 2, 1, 1, 3, 5, 1, 2, 4, 2, + 0, 1, 0, 1, 2, 3, 5, 7, 7, 1, + 0, 0, 2, 0, 2, 3, 3, 3, 5, 7, + 7, 0, 2, 1, 0, 1, 0, 1, 3, 1, + 2, 3, 2, 1, 4, 2, 1, 0, 3, 1, + 3, 1, 2, 4, 2, 0, 1, 3, 1, 3, + 1, 2, 1, 3, 1, 1, 2, 1, 1, 2, + 1, 1, 2, 7, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 3, 3, 0, 1, 1, 1, + 5, 3, 0, 1, 1, 1, 1, 1, 1, 4, + 7, 6, 2, 0, 1, 1, 1, 1, 13, 16, + 1, 2, 0, 1, 0, 1, 0, 2, 0, 1, + 0, 6, 8, 6, 8, 6, 8, 3, 2, 1, + 0, 6, 6, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 4, 6, 3, 2, 4, + 3, 5, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 2, 3, 3, 3, 1, 3, 3, 2, 3, - 3, 1, 1, 1, 3, 5, 1, 1, 1, 1, - 3, 2, 2, 3, 4, 5, 1, 1, 1, 1, - 4, 6, 5, 4, 6, 1, 1, 1, 1, 1, - 1, 0, 1, 3, 1, 0, 7, 3, 1, 2, - 3, 2, 0, 2, 0, 2, 4, 5, 8, 2, - 3, 5, 1, 0, 2, 0, 2, 3, 3, 3, - 1, 1, 1, 2, 3, 2, 2, 2, 2, 3, - 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, - 3, 1, 3, 2, 9, 12, 11, 12, 14, 3, - 4, 4, 0, 7, 10, 9, 2, 3, 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 2, 3, 3, 3, 1, 3, 3, + 2, 3, 3, 1, 1, 1, 3, 5, 1, 1, + 1, 1, 3, 2, 2, 3, 4, 5, 1, 1, + 1, 1, 4, 6, 5, 4, 6, 1, 1, 1, + 1, 1, 1, 0, 1, 3, 1, 0, 7, 3, + 1, 2, 3, 2, 0, 2, 0, 2, 4, 5, + 8, 2, 3, 5, 1, 0, 2, 0, 2, 3, + 3, 3, 1, 1, 1, 2, 3, 2, 2, 2, + 2, 3, 4, 3, 1, 1, 1, 1, 1, 1, + 0, 1, 3, 1, 3, 2, 9, 12, 11, 12, + 14, 3, 4, 4, 0, 7, 10, 9, 2, 3, + 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -393382,7 +396290,8 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -393390,1893 +396299,1848 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 155, 263, 0, 1383, 1382, 1453, 263, 0, 1318, 0, - 263, 485, 401, 0, 1474, 1473, 0, 207, 263, 0, - 155, 0, 0, 0, 0, 0, 0, 548, 551, 549, - 0, 0, 0, 263, 588, 0, 1475, 263, 0, 0, - 580, 550, 0, 1431, 0, 0, 0, 0, 0, 2, + 155, 263, 0, 1385, 1384, 1455, 263, 0, 1320, 0, + 263, 486, 401, 0, 1476, 1475, 0, 207, 263, 0, + 155, 0, 0, 0, 0, 0, 0, 549, 552, 550, + 0, 0, 0, 263, 589, 0, 1477, 263, 0, 0, + 581, 551, 0, 1433, 0, 0, 0, 0, 0, 2, 4, 7, 21, 35, 31, 0, 20, 33, 18, 17, 26, 6, 24, 37, 39, 19, 25, 15, 38, 13, - 36, 524, 510, 593, 523, 0, 0, 154, 692, 531, - 34, 16, 30, 5, 11, 12, 28, 29, 27, 1341, - 42, 32, 40, 22, 8, 9, 23, 41, 43, 1476, - 1472, 10, 44, 14, 262, 261, 255, 0, 0, 0, - 0, 0, 1452, 0, 0, 256, 111, 1500, 1501, 1502, - 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1874, 1511, - 1512, 1513, 1514, 1515, 1875, 1516, 1517, 1518, 1820, 1821, - 1876, 1822, 1823, 1519, 1520, 1521, 1522, 1523, 1524, 1525, - 1526, 1527, 1528, 1824, 1825, 1529, 1530, 1531, 1532, 1533, - 1826, 1877, 1827, 1534, 1535, 1536, 1537, 1538, 1878, 1539, - 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1879, 1548, - 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1828, - 1558, 1559, 1829, 1560, 1561, 1562, 1563, 1564, 1565, 1566, - 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, - 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, - 1830, 1587, 1588, 1589, 1590, 1591, 1831, 1592, 1593, 1594, - 1832, 1595, 1596, 1597, 1880, 1881, 1598, 1599, 1833, 1883, - 1600, 1601, 1834, 1835, 1602, 1603, 1604, 1605, 1606, 1607, - 1608, 1609, 1610, 1884, 1611, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 1619, 1620, 1621, 1622, 1885, 1836, 1623, 1624, - 1625, 1626, 1627, 1837, 1838, 1839, 1628, 1886, 1887, 1629, - 1888, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1889, 1637, - 1890, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1840, - 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, - 1841, 1892, 1842, 1666, 1667, 1668, 1843, 1669, 1670, 1893, - 1671, 1844, 1672, 1845, 1673, 1674, 1675, 1676, 1677, 1678, - 1679, 1680, 1681, 1682, 1846, 1894, 1683, 1895, 1847, 1684, - 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, - 1695, 1696, 1848, 1896, 1697, 1698, 1849, 1699, 1700, 1701, - 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1850, - 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, - 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1897, - 1730, 1731, 1732, 1851, 1733, 1734, 1735, 1736, 1737, 1738, - 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, - 1749, 1750, 1751, 1852, 1752, 1753, 1898, 1754, 1755, 1853, - 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, - 1766, 1767, 1768, 1854, 1769, 1855, 1770, 1771, 1772, 1900, - 1773, 1774, 1775, 1776, 1777, 1778, 1856, 1857, 1779, 1780, - 1858, 1781, 1859, 1782, 1783, 1860, 1784, 1785, 1786, 1787, - 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, - 1798, 1799, 1800, 1861, 1862, 1801, 1901, 1802, 1803, 1804, - 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, - 1815, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, - 1872, 1873, 1816, 1817, 1818, 1819, 0, 1483, 0, 1243, - 112, 113, 1265, 111, 1833, 1840, 1854, 1317, 1316, 112, - 0, 258, 484, 0, 0, 0, 0, 0, 0, 209, - 0, 395, 394, 0, 1307, 400, 0, 0, 0, 115, - 107, 1699, 114, 1242, 105, 121, 2044, 2045, 2046, 2047, - 1931, 2048, 2049, 2050, 2051, 1932, 2052, 1933, 1934, 1935, - 1936, 1937, 1938, 2053, 2054, 2055, 1940, 1939, 2056, 1941, - 2057, 1942, 2058, 1943, 1944, 2059, 2060, 1945, 1554, 1946, - 1947, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, - 1948, 1949, 2070, 2071, 1950, 2072, 2073, 1951, 2074, 1952, - 1953, 1954, 2075, 2076, 1955, 1956, 2077, 1957, 2078, 2079, - 1958, 1959, 1962, 1960, 2080, 1961, 2081, 1963, 1964, 1965, - 2082, 2083, 1966, 1967, 2084, 1968, 1969, 1970, 1971, 1972, - 2085, 1973, 2086, 1974, 1975, 2087, 2088, 2089, 2090, 2091, - 1977, 1976, 1978, 1979, 2092, 2093, 2094, 2095, 1980, 1981, - 1982, 2096, 2097, 1983, 2098, 2099, 1984, 1985, 2100, 1986, - 1987, 2101, 1988, 1989, 2102, 1990, 1991, 2103, 2104, 2105, - 1992, 2106, 1993, 1994, 2107, 2108, 1995, 1996, 2109, 1997, - 2110, 2111, 2112, 2113, 1998, 1999, 2114, 2000, 2115, 2116, - 2117, 2118, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010, 2011, 1449, 123, 122, 124, 0, 419, 420, + 36, 525, 511, 594, 524, 0, 0, 154, 693, 532, + 34, 16, 30, 5, 11, 12, 28, 29, 27, 1343, + 42, 32, 40, 22, 8, 9, 23, 41, 43, 1478, + 1474, 10, 44, 14, 262, 261, 255, 0, 0, 0, + 0, 0, 1454, 0, 0, 256, 111, 1502, 1503, 1504, + 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1876, 1513, + 1514, 1515, 1516, 1517, 1877, 1518, 1519, 1520, 1822, 1823, + 1878, 1824, 1825, 1521, 1522, 1523, 1524, 1525, 1526, 1527, + 1528, 1529, 1530, 1826, 1827, 1531, 1532, 1533, 1534, 1535, + 1828, 1879, 1829, 1536, 1537, 1538, 1539, 1540, 1880, 1541, + 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1881, 1550, + 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1830, + 1560, 1561, 1831, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1832, 1589, 1590, 1591, 1592, 1593, 1833, 1594, 1595, 1596, + 1834, 1597, 1598, 1599, 1882, 1883, 1600, 1601, 1835, 1885, + 1602, 1603, 1836, 1837, 1604, 1605, 1606, 1607, 1608, 1609, + 1610, 1611, 1612, 1886, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 1620, 1621, 1622, 1623, 1624, 1887, 1838, 1625, 1626, + 1627, 1628, 1629, 1839, 1840, 1841, 1630, 1888, 1889, 1631, + 1890, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1891, 1639, + 1892, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1842, + 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, + 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1843, 1894, 1844, 1668, 1669, 1670, 1845, 1671, 1672, 1895, + 1673, 1846, 1674, 1847, 1675, 1676, 1677, 1678, 1679, 1680, + 1681, 1682, 1683, 1684, 1848, 1896, 1685, 1897, 1849, 1686, + 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1698, 1850, 1898, 1699, 1700, 1851, 1701, 1702, 1703, + 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1852, + 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, + 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1899, + 1732, 1733, 1734, 1853, 1735, 1736, 1737, 1738, 1739, 1740, + 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1753, 1854, 1754, 1755, 1900, 1756, 1757, 1855, + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1856, 1771, 1857, 1772, 1773, 1774, 1902, + 1775, 1776, 1777, 1778, 1779, 1780, 1858, 1859, 1781, 1782, + 1860, 1783, 1861, 1784, 1785, 1862, 1786, 1787, 1788, 1789, + 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, + 1800, 1801, 1802, 1863, 1864, 1803, 1903, 1804, 1805, 1806, + 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, + 1817, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, + 1874, 1875, 1818, 1819, 1820, 1821, 0, 1485, 0, 1245, + 112, 113, 1267, 111, 1835, 1842, 1856, 1319, 1318, 112, + 0, 258, 485, 0, 0, 0, 0, 0, 0, 209, + 0, 395, 394, 0, 1309, 400, 0, 0, 0, 115, + 107, 1701, 114, 1244, 105, 121, 2046, 2047, 2048, 2049, + 1933, 2050, 2051, 2052, 2053, 1934, 2054, 1935, 1936, 1937, + 1938, 1939, 1940, 2055, 2056, 2057, 1942, 1941, 2058, 1943, + 2059, 1944, 2060, 1945, 1946, 2061, 2062, 1947, 1556, 1948, + 1949, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, + 1950, 1951, 2072, 2073, 1952, 2074, 2075, 1953, 2076, 1954, + 1955, 1956, 2077, 2078, 1957, 1958, 2079, 1959, 2080, 2081, + 1960, 1961, 1964, 1962, 2082, 1963, 2083, 1965, 1966, 1967, + 2084, 2085, 1968, 1969, 2086, 1970, 1971, 1972, 1973, 1974, + 2087, 1975, 2088, 1976, 1977, 2089, 2090, 2091, 2092, 2093, + 1979, 1978, 1980, 1981, 2094, 2095, 2096, 2097, 1982, 1983, + 1984, 2098, 2099, 1985, 2100, 2101, 1986, 1987, 2102, 1988, + 1989, 2103, 1990, 1991, 2104, 1992, 1993, 2105, 2106, 2107, + 1994, 2108, 1995, 1996, 2109, 2110, 1997, 1998, 2111, 1999, + 2112, 2113, 2114, 2115, 2000, 2001, 2116, 2002, 2117, 2118, + 2119, 2120, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012, 2013, 1451, 123, 122, 124, 0, 419, 420, 0, 430, 0, 412, 417, 413, 0, 439, 432, 440, 421, 411, 433, 422, 410, 208, 0, 441, 427, 415, 0, 0, 0, 0, 259, 220, 401, 0, 155, 0, - 1347, 1357, 1366, 1362, 1356, 1364, 1354, 1360, 1346, 1368, - 1355, 1359, 1352, 1369, 1350, 1367, 1365, 1353, 1361, 1345, - 1349, 1336, 1341, 1372, 1363, 1370, 1358, 1371, 1373, 1348, - 1374, 1351, 0, 1318, 0, 0, 1826, 1877, 1831, 0, - 1844, 0, 1847, 1848, 1733, 1855, 1858, 1859, 1860, 1861, - 0, 762, 114, 109, 746, 0, 526, 696, 706, 746, - 751, 1029, 774, 1030, 0, 116, 1417, 1416, 1412, 1411, - 194, 1280, 1461, 1600, 1640, 1750, 1856, 1779, 1479, 1462, - 1456, 1460, 260, 587, 585, 0, 1214, 1600, 1640, 1737, - 1750, 1856, 1391, 1395, 0, 257, 1481, 1466, 0, 1467, - 114, 532, 579, 0, 264, 1430, 0, 1435, 0, 1713, - 559, 562, 1274, 560, 524, 0, 0, 1, 155, 0, - 161, 0, 583, 583, 0, 583, 0, 516, 0, 0, - 524, 519, 523, 693, 1340, 1445, 1478, 1856, 1779, 1465, - 1468, 1609, 0, 0, 1609, 0, 1609, 0, 1609, 0, - 0, 1455, 1198, 0, 1244, 117, 0, 0, 1329, 1325, - 1330, 1326, 1331, 1324, 1323, 1332, 1328, 0, 0, 0, - 366, 399, 398, 397, 396, 401, 1609, 1291, 0, 205, - 448, 449, 0, 0, 0, 0, 0, 1302, 108, 106, - 1609, 1450, 428, 429, 0, 418, 414, 416, 0, 0, - 1609, 1269, 438, 434, 1609, 438, 1236, 1609, 0, 0, - 212, 0, 394, 1338, 1375, 1998, 1389, 0, 1390, 1380, - 1344, 1376, 1377, 155, 0, 483, 1315, 1413, 0, 0, - 0, 1150, 746, 751, 0, 0, 764, 0, 1169, 0, - 1175, 0, 0, 0, 746, 531, 0, 706, 763, 110, - 0, 744, 745, 634, 634, 588, 0, 569, 756, 0, - 0, 759, 757, 0, 759, 0, 0, 0, 759, 755, - 714, 0, 634, 0, 744, 747, 634, 0, 766, 1335, - 0, 0, 0, 0, 0, 1459, 1457, 1458, 1463, 0, - 0, 0, 1246, 1248, 1249, 1118, 1259, 1009, 0, 1821, - 1822, 1823, 1190, 1824, 1825, 1827, 1828, 1829, 968, 1574, - 1830, 1257, 1832, 1834, 1835, 1837, 1838, 1839, 1840, 1841, - 1842, 0, 1258, 1845, 1678, 1850, 1851, 1853, 1856, 1857, - 1256, 1862, 0, 0, 0, 1225, 1141, 0, 1008, 0, - 0, 0, 1191, 1199, 1001, 0, 0, 810, 811, 832, - 833, 812, 838, 839, 841, 813, 0, 1221, 902, 997, - 1209, 1006, 1010, 1048, 1012, 1028, 1015, 1085, 1007, 0, - 1013, 999, 1217, 569, 1215, 0, 1000, 1245, 569, 1213, - 1394, 1392, 1398, 1393, 0, 0, 0, 0, 0, 110, - 1438, 1437, 1429, 1427, 1428, 1426, 1425, 1432, 0, 1434, - 1341, 1136, 1138, 0, 561, 0, 0, 0, 513, 512, - 514, 3, 0, 0, 0, 0, 581, 582, 0, 0, - 0, 0, 0, 0, 0, 0, 677, 608, 609, 611, - 674, 678, 686, 0, 0, 0, 0, 0, 520, 0, - 1274, 1477, 1471, 1469, 0, 0, 0, 139, 139, 0, - 0, 0, 0, 0, 99, 48, 92, 0, 0, 0, - 0, 234, 247, 0, 0, 0, 0, 0, 244, 0, - 0, 227, 50, 221, 223, 0, 139, 0, 46, 0, - 0, 0, 52, 1453, 0, 483, 1197, 0, 119, 120, - 118, 111, 0, 2012, 1874, 1875, 1876, 1877, 1827, 1878, - 1879, 0, 1880, 1881, 1833, 1883, 1884, 1885, 1886, 1887, - 1888, 1889, 1890, 1840, 1892, 1893, 1894, 1895, 1896, 1897, - 2038, 1898, 1854, 1900, 1860, 0, 1901, 1021, 1144, 593, - 1142, 1275, 0, 112, 1262, 0, 1327, 0, 0, 0, - 0, 481, 0, 0, 0, 0, 1287, 0, 1609, 206, - 210, 0, 1609, 201, 1609, 366, 0, 1609, 366, 1609, - 0, 1301, 1304, 0, 431, 426, 424, 423, 425, 1609, - 253, 0, 0, 1270, 436, 437, 0, 405, 0, 0, - 407, 0, 0, 217, 0, 215, 0, 401, 155, 0, - 228, 1385, 1386, 1384, 0, 0, 1379, 1343, 231, 248, - 1388, 1378, 1387, 1342, 1337, 0, 0, 1333, 471, 0, - 0, 0, 0, 1151, 879, 878, 862, 863, 876, 877, - 864, 865, 872, 873, 881, 880, 870, 871, 866, 867, - 860, 861, 868, 869, 874, 875, 858, 859, 1164, 1152, - 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, - 1163, 0, 0, 705, 703, 0, 0, 0, 0, 0, - 0, 1191, 0, 972, 1007, 0, 0, 0, 1136, 1174, - 0, 0, 0, 0, 0, 0, 1136, 1180, 0, 0, - 730, 742, 0, 627, 633, 704, 702, 0, 1214, 697, - 0, 776, 0, 756, 0, 755, 0, 0, 758, 752, - 0, 753, 0, 0, 0, 0, 754, 0, 0, 0, - 0, 0, 700, 0, 742, 0, 701, 773, 1419, 1418, - 1414, 1401, 1409, 195, 0, 1266, 1902, 1903, 1904, 820, - 1905, 849, 827, 849, 849, 1906, 1907, 1908, 1909, 816, - 816, 829, 1910, 1911, 1912, 1913, 1914, 817, 818, 854, - 1915, 1916, 1917, 1918, 1919, 0, 0, 1920, 849, 1921, - 816, 1922, 1923, 1924, 821, 1925, 784, 1926, 0, 1927, - 819, 785, 1928, 857, 857, 1929, 0, 844, 1930, 0, - 1147, 794, 802, 803, 804, 805, 830, 831, 806, 836, - 837, 807, 901, 0, 816, 1267, 1268, 155, 1464, 1480, - 0, 1141, 1016, 848, 835, 1189, 0, 843, 842, 0, - 1141, 825, 824, 823, 1003, 0, 822, 1098, 849, 849, - 847, 927, 826, 0, 0, 0, 0, 0, 853, 0, - 851, 928, 906, 907, 0, 1224, 1233, 1136, 1140, 0, - 1001, 1136, 0, 0, 1088, 1090, 0, 1018, 1019, 0, - 1192, 1247, 1002, 0, 1252, 0, 0, 901, 901, 1220, - 1118, 0, 1108, 1111, 0, 0, 1115, 1116, 1117, 0, - 0, 0, 1212, 0, 1126, 1128, 0, 0, 943, 1124, - 0, 946, 0, 0, 0, 0, 1112, 1113, 1114, 1104, - 1105, 1106, 1107, 1109, 1110, 1122, 1103, 924, 0, 998, - 0, 1051, 0, 923, 1218, 695, 0, 1250, 695, 1403, - 1407, 1408, 1402, 1406, 0, 1397, 1396, 1399, 1400, 1482, - 0, 1439, 1423, 0, 1420, 1139, 690, 563, 1238, 0, - 567, 1444, 160, 159, 0, 0, 536, 535, 602, 594, - 596, 602, 0, 534, 0, 650, 651, 0, 0, 0, - 0, 683, 681, 1246, 1259, 638, 612, 637, 0, 0, - 616, 0, 642, 902, 676, 518, 606, 607, 610, 517, - 0, 679, 0, 689, 0, 555, 557, 540, 554, 552, - 537, 545, 677, 611, 0, 1446, 1470, 0, 0, 0, - 0, 0, 1609, 0, 0, 787, 83, 64, 318, 138, - 0, 0, 0, 0, 0, 0, 0, 91, 88, 89, - 90, 0, 0, 0, 0, 1266, 232, 233, 246, 0, - 237, 238, 235, 239, 240, 0, 0, 225, 226, 0, - 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1454, 1447, 1193, 1198, 593, 593, 593, - 0, 591, 592, 0, 0, 0, 0, 0, 470, 364, - 374, 0, 0, 0, 1291, 205, 0, 0, 0, 0, - 0, 0, 401, 1294, 1292, 1290, 1293, 1295, 1580, 189, - 0, 0, 0, 0, 0, 197, 200, 0, 363, 337, - 0, 0, 1306, 0, 0, 0, 1609, 353, 1303, 0, - 1451, 0, 0, 251, 438, 1271, 0, 435, 438, 1237, - 0, 438, 219, 0, 0, 1339, 1381, 229, 249, 230, - 250, 483, 478, 508, 0, 486, 491, 468, 0, 468, - 0, 488, 492, 468, 487, 0, 468, 482, 1415, 0, - 1044, 0, 1034, 0, 0, 765, 0, 0, 1035, 974, - 975, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 992, - 991, 1036, 769, 0, 772, 0, 0, 1172, 1173, 0, - 1037, 0, 0, 1179, 0, 0, 0, 1042, 0, 707, - 0, 0, 0, 622, 626, 629, 0, 632, 569, 525, - 1600, 1640, 0, 580, 580, 580, 578, 568, 0, 654, - 0, 0, 0, 731, 0, 0, 733, 735, 0, 0, - 738, 0, 713, 712, 0, 0, 0, 0, 777, 0, - 1242, 0, 0, 196, 0, 0, 0, 802, 0, 0, - 0, 792, 788, 0, 882, 883, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 893, 808, 1279, 0, 814, - 1282, 1283, 1284, 1281, 1278, 1285, 1286, 0, 0, 0, - 0, 1188, 1184, 0, 0, 0, 0, 1093, 1095, 1097, - 0, 846, 845, 1102, 1108, 1111, 1115, 1116, 1117, 1112, - 1113, 1114, 1104, 1105, 1106, 1107, 1109, 1110, 0, 1130, - 0, 1084, 0, 0, 0, 0, 0, 0, 1223, 0, - 970, 0, 1014, 1005, 0, 0, 1091, 1020, 1225, 1200, - 0, 0, 0, 1255, 1254, 903, 912, 915, 947, 948, - 919, 920, 921, 925, 1277, 1276, 1219, 0, 1211, 0, - 0, 904, 929, 934, 0, 1181, 964, 0, 952, 0, - 942, 0, 950, 954, 930, 945, 0, 926, 0, 1212, - 1127, 1129, 0, 1125, 0, 916, 917, 918, 908, 909, - 910, 911, 913, 914, 922, 1101, 1099, 1100, 0, 1198, - 0, 1210, 0, 0, 1053, 0, 0, 949, 1216, 0, - 776, 593, 776, 0, 901, 1440, 1274, 1433, 1274, 1422, - 1137, 1239, 1273, 565, 0, 0, 0, 1442, 146, 150, - 0, 1199, 180, 182, 695, 0, 600, 601, 605, 0, - 0, 605, 584, 533, 1851, 1733, 0, 0, 0, 0, - 643, 684, 0, 675, 640, 641, 0, 639, 1246, 644, - 1245, 645, 648, 649, 617, 1234, 685, 687, 0, 680, - 0, 1240, 539, 558, 0, 0, 0, 0, 0, 522, - 521, 691, 0, 49, 0, 1609, 66, 0, 0, 0, - 0, 0, 0, 268, 0, 368, 268, 104, 1609, 438, - 1609, 438, 1504, 1575, 1751, 0, 62, 342, 95, 0, - 132, 371, 0, 327, 85, 100, 125, 0, 0, 51, - 222, 236, 241, 128, 245, 242, 1311, 243, 139, 0, - 47, 0, 126, 0, 1309, 0, 0, 53, 130, 1313, - 1455, 0, 1197, 0, 591, 591, 591, 0, 1143, 0, - 0, 0, 1145, 1146, 942, 1321, 1320, 1322, 1319, 456, - 469, 0, 365, 0, 480, 459, 460, 470, 1289, 210, - 0, 201, 366, 0, 366, 0, 1291, 0, 0, 191, - 187, 205, 211, 0, 0, 0, 0, 0, 364, 356, - 354, 387, 0, 361, 355, 0, 0, 313, 0, 1498, - 0, 0, 0, 0, 450, 0, 0, 0, 0, 253, - 254, 404, 1272, 406, 0, 408, 218, 216, 1334, 475, - 0, 474, 479, 477, 473, 472, 0, 467, 0, 501, - 0, 0, 0, 0, 0, 0, 0, 0, 1031, 1149, - 0, 1167, 1166, 973, 980, 983, 987, 988, 989, 1168, - 0, 0, 0, 984, 985, 986, 976, 977, 978, 979, - 981, 982, 990, 774, 0, 0, 768, 1177, 1176, 1170, - 1171, 0, 1039, 1040, 1041, 1178, 0, 0, 743, 620, - 618, 621, 623, 619, 0, 0, 776, 580, 580, 580, - 580, 577, 0, 0, 0, 775, 0, 671, 739, 737, - 0, 761, 0, 734, 717, 740, 0, 725, 0, 732, - 781, 748, 0, 0, 750, 1410, 798, 0, 793, 789, - 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, - 0, 1148, 586, 1017, 0, 0, 0, 1185, 0, 969, - 815, 828, 0, 1096, 1011, 0, 1119, 1083, 856, 855, - 857, 857, 0, 0, 0, 1232, 0, 1137, 1087, 1089, - 1233, 1004, 840, 901, 0, 0, 0, 0, 0, 0, - 0, 953, 944, 0, 951, 955, 0, 0, 0, 938, - 0, 0, 936, 965, 932, 0, 0, 966, 1197, 0, - 1201, 0, 0, 1052, 1061, 698, 694, 654, 591, 654, - 0, 1404, 1424, 1421, 566, 155, 1443, 0, 169, 0, - 0, 0, 0, 172, 186, 183, 1442, 0, 0, 595, - 597, 0, 1120, 605, 599, 647, 646, 0, 615, 682, - 613, 0, 688, 0, 556, 0, 542, 0, 716, 0, - 0, 0, 0, 0, 317, 0, 0, 0, 268, 0, - 376, 0, 383, 0, 0, 368, 349, 84, 0, 0, - 0, 58, 103, 76, 68, 54, 82, 0, 0, 87, - 0, 80, 97, 98, 96, 101, 0, 278, 303, 0, - 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 483, 1198, 1194, 1198, 0, 0, 0, - 593, 589, 590, 1022, 0, 455, 507, 504, 505, 503, - 227, 375, 0, 0, 0, 199, 363, 0, 1306, 0, - 1288, 401, 0, 192, 0, 190, 210, 0, 0, 201, - 366, 0, 341, 337, 362, 335, 334, 336, 0, 1499, - 220, 0, 1493, 366, 1305, 0, 0, 451, 0, 445, - 0, 1300, 252, 438, 0, 463, 502, 509, 489, 494, - 0, 500, 496, 495, 490, 498, 497, 493, 1032, 1043, - 1165, 0, 0, 0, 0, 767, 770, 0, 1038, 1033, - 741, 0, 0, 654, 0, 0, 0, 0, 571, 570, - 576, 0, 0, 1055, 736, 0, 0, 0, 723, 711, - 718, 719, 0, 0, 0, 779, 778, 749, 802, 0, - 782, 802, 0, 802, 0, 800, 0, 809, 894, 895, - 896, 897, 898, 899, 900, 834, 0, 1187, 1183, 1092, - 1094, 1131, 852, 850, 1222, 1136, 1227, 1229, 0, 0, - 0, 1086, 971, 1253, 905, 0, 0, 935, 1182, 956, - 0, 0, 0, 931, 1119, 0, 0, 0, 0, 0, - 940, 0, 1205, 1198, 0, 1204, 0, 0, 0, 0, - 1027, 699, 671, 0, 671, 0, 0, 1441, 0, 1436, - 147, 148, 149, 0, 0, 0, 164, 141, 0, 0, - 181, 169, 157, 603, 604, 0, 598, 614, 1235, 1241, - 541, 0, 1001, 0, 0, 538, 0, 133, 268, 0, - 0, 65, 0, 385, 329, 377, 360, 344, 0, 0, - 0, 269, 0, 402, 0, 0, 350, 0, 0, 0, - 0, 330, 0, 0, 289, 0, 0, 360, 0, 367, - 285, 286, 0, 57, 77, 0, 73, 0, 102, 0, - 0, 0, 0, 0, 60, 72, 0, 55, 0, 438, - 438, 63, 1266, 1902, 1903, 1904, 1905, 1906, 1907, 1908, - 1909, 1910, 1911, 2022, 1912, 1913, 1914, 1915, 1916, 1917, - 1918, 1919, 2031, 1920, 275, 1921, 1678, 1922, 1923, 1924, - 1925, 1926, 0, 1927, 785, 1928, 1929, 2110, 1930, 1104, - 1105, 274, 273, 370, 270, 378, 272, 0, 1267, 271, - 373, 328, 129, 1312, 0, 127, 0, 1310, 136, 134, - 131, 1314, 1448, 0, 0, 1025, 1026, 1023, 591, 0, - 0, 0, 483, 462, 0, 0, 0, 1498, 0, 0, - 0, 1609, 0, 188, 0, 0, 202, 1306, 198, 363, - 0, 393, 313, 388, 0, 1498, 1496, 0, 1306, 1492, - 0, 442, 0, 0, 0, 409, 476, 0, 499, 993, - 0, 0, 0, 0, 630, 0, 636, 671, 575, 574, - 573, 572, 653, 1549, 1834, 1732, 0, 657, 652, 655, - 660, 662, 661, 663, 659, 670, 0, 673, 760, 1132, - 1134, 0, 0, 0, 0, 724, 726, 0, 728, 0, - 780, 796, 0, 797, 0, 795, 790, 801, 1186, 1230, - 1231, 1226, 0, 902, 962, 960, 957, 0, 958, 939, - 0, 0, 937, 933, 0, 967, 0, 0, 1202, 0, - 1047, 0, 1050, 1064, 1060, 1059, 1055, 1022, 1055, 1405, - 564, 168, 145, 171, 170, 0, 1199, 178, 0, 0, - 169, 0, 173, 452, 0, 0, 553, 715, 546, 547, - 0, 381, 67, 0, 360, 0, 268, 346, 345, 348, - 343, 347, 0, 403, 0, 0, 287, 0, 294, 332, - 333, 331, 288, 360, 366, 290, 0, 0, 0, 69, - 59, 56, 61, 70, 0, 0, 71, 74, 781, 86, - 79, 1266, 2031, 2040, 0, 0, 0, 0, 0, 1196, - 1195, 0, 458, 457, 506, 454, 465, 227, 0, 0, - 0, 337, 1495, 0, 0, 447, 0, 0, 363, 193, - 0, 0, 0, 0, 1498, 0, 0, 265, 0, 310, - 0, 213, 1497, 0, 0, 1484, 0, 0, 1298, 1299, - 0, 464, 994, 0, 995, 771, 0, 0, 628, 1055, - 0, 0, 0, 664, 658, 0, 1054, 1056, 0, 625, - 1135, 720, 0, 722, 0, 746, 0, 746, 729, 791, - 783, 1228, 1045, 0, 959, 963, 961, 941, 1198, 1206, - 1198, 1203, 1049, 1063, 1066, 673, 1251, 673, 0, 0, - 156, 0, 0, 153, 140, 158, 1121, 543, 544, 0, - 268, 0, 359, 382, 299, 277, 0, 0, 0, 284, - 291, 392, 293, 0, 78, 94, 0, 0, 372, 137, - 135, 1024, 483, 0, 204, 1306, 313, 1492, 444, 0, - 0, 0, 0, 337, 220, 1494, 326, 319, 320, 321, - 322, 323, 324, 325, 340, 339, 311, 312, 0, 0, - 0, 0, 0, 446, 1300, 0, 175, 184, 0, 175, - 996, 631, 0, 673, 0, 0, 0, 656, 0, 0, - 672, 0, 529, 1133, 0, 710, 708, 0, 709, 0, - 0, 0, 0, 593, 625, 625, 142, 0, 143, 179, - 0, 0, 0, 366, 384, 358, 0, 351, 297, 296, - 298, 302, 0, 300, 0, 316, 0, 309, 277, 0, - 81, 0, 379, 453, 461, 0, 267, 1486, 363, 0, - 203, 1492, 313, 1498, 1492, 0, 1489, 0, 443, 0, - 0, 0, 177, 1306, 0, 177, 0, 625, 666, 0, - 665, 1058, 1057, 627, 721, 0, 1046, 1208, 1207, 0, - 1070, 528, 527, 0, 0, 0, 0, 392, 0, 338, - 0, 0, 299, 0, 292, 389, 390, 391, 0, 305, - 295, 306, 75, 93, 380, 0, 363, 1487, 266, 214, - 1485, 1490, 1491, 0, 175, 174, 602, 176, 776, 185, - 602, 635, 530, 667, 624, 727, 1065, 0, 0, 0, - 0, 0, 152, 776, 163, 0, 309, 357, 352, 276, - 301, 315, 0, 0, 0, 307, 0, 308, 1492, 0, - 177, 605, 1296, 605, 1820, 1550, 1786, 0, 1082, 1071, - 1082, 1082, 1062, 144, 151, 0, 268, 281, 0, 280, - 0, 369, 304, 1488, 1306, 602, 165, 166, 0, 1075, - 1074, 1073, 1077, 1076, 0, 1069, 1067, 1068, 776, 386, - 279, 283, 282, 776, 605, 0, 0, 1079, 0, 1080, - 162, 1297, 167, 1072, 1078, 1081 + 1349, 1359, 1368, 1364, 1358, 1366, 1356, 1362, 1348, 1370, + 1357, 1361, 1354, 1371, 1352, 1369, 1367, 1355, 1363, 1347, + 1351, 1338, 1343, 1374, 1365, 1372, 1360, 1373, 1375, 1350, + 1376, 1353, 0, 1320, 0, 0, 1828, 1879, 1833, 0, + 1846, 0, 1849, 1850, 1735, 1857, 1860, 1861, 1862, 1863, + 0, 763, 114, 109, 747, 0, 527, 697, 707, 747, + 752, 1031, 775, 1032, 0, 116, 1419, 1418, 1414, 1413, + 194, 1282, 1463, 1602, 1642, 1752, 1858, 1781, 1481, 1464, + 1458, 1462, 260, 588, 586, 0, 1216, 1602, 1642, 1739, + 1752, 1858, 1393, 1397, 0, 257, 1483, 1468, 0, 1469, + 114, 533, 580, 0, 264, 1432, 0, 1437, 0, 1715, + 560, 563, 1276, 561, 525, 0, 0, 1, 155, 0, + 161, 0, 584, 584, 0, 584, 0, 517, 0, 0, + 525, 520, 524, 694, 1342, 1447, 1480, 1858, 1781, 1467, + 1470, 1611, 0, 0, 1611, 0, 1611, 0, 1611, 0, + 0, 1457, 1200, 0, 1246, 117, 0, 0, 1331, 1327, + 1332, 1328, 1333, 1326, 1325, 1334, 1330, 0, 0, 0, + 366, 399, 398, 397, 396, 401, 1611, 1293, 0, 205, + 448, 449, 0, 0, 0, 0, 0, 1304, 108, 106, + 1611, 1452, 428, 429, 0, 418, 414, 416, 0, 0, + 1611, 1271, 438, 434, 1611, 438, 1238, 1611, 0, 0, + 212, 0, 394, 1340, 1377, 2000, 1391, 0, 1392, 1382, + 1346, 1378, 1379, 155, 0, 484, 1317, 1415, 0, 0, + 0, 1152, 747, 752, 0, 0, 765, 0, 1171, 0, + 1177, 0, 0, 0, 747, 532, 0, 707, 764, 110, + 0, 745, 746, 635, 635, 589, 0, 570, 757, 0, + 0, 760, 758, 0, 760, 0, 0, 0, 760, 756, + 715, 0, 635, 0, 745, 748, 635, 0, 767, 1337, + 0, 0, 0, 0, 0, 1461, 1459, 1460, 1465, 0, + 0, 0, 1248, 1250, 1251, 1120, 1261, 1010, 0, 1823, + 1824, 1825, 1192, 1826, 1827, 1829, 1830, 1831, 969, 1576, + 1832, 1259, 1834, 1836, 1837, 1839, 1840, 1841, 1842, 1843, + 1844, 0, 1260, 1847, 1680, 1852, 1853, 1855, 1858, 1859, + 1258, 1864, 0, 0, 0, 1227, 1143, 0, 1009, 0, + 0, 0, 1193, 1201, 1002, 0, 0, 811, 812, 833, + 834, 813, 839, 840, 842, 814, 0, 1223, 903, 998, + 1211, 1007, 1015, 1011, 1050, 1013, 1030, 1016, 1087, 1008, + 0, 1014, 1000, 1219, 570, 1217, 0, 1001, 1247, 570, + 1215, 1396, 1394, 1400, 1395, 0, 0, 0, 0, 0, + 110, 1440, 1439, 1431, 1429, 1430, 1428, 1427, 1434, 0, + 1436, 1343, 1138, 1140, 0, 562, 0, 0, 0, 514, + 513, 515, 3, 0, 0, 0, 0, 582, 583, 0, + 0, 0, 0, 0, 0, 0, 0, 678, 609, 610, + 612, 675, 679, 687, 0, 0, 0, 0, 0, 521, + 0, 1276, 1479, 1473, 1471, 0, 0, 0, 139, 139, + 0, 0, 0, 0, 0, 99, 48, 92, 0, 0, + 0, 0, 234, 247, 0, 0, 0, 0, 0, 244, + 0, 0, 227, 50, 221, 223, 0, 139, 0, 46, + 0, 0, 0, 52, 1455, 0, 484, 1199, 0, 119, + 120, 118, 111, 0, 2014, 1876, 1877, 1878, 1879, 1829, + 1880, 1881, 0, 1882, 1883, 1835, 1885, 1886, 1887, 1888, + 1889, 1890, 1891, 1892, 1842, 1894, 1895, 1896, 1897, 1898, + 1899, 2040, 1900, 1856, 1902, 1862, 0, 1903, 1023, 1146, + 594, 1144, 1277, 0, 112, 1264, 0, 1329, 0, 0, + 0, 0, 482, 0, 0, 0, 0, 1289, 0, 1611, + 206, 210, 0, 1611, 201, 1611, 366, 0, 1611, 366, + 1611, 0, 1303, 1306, 0, 431, 426, 424, 423, 425, + 1611, 253, 0, 0, 1272, 436, 437, 0, 405, 0, + 0, 407, 0, 0, 217, 0, 215, 0, 401, 155, + 0, 228, 1387, 1388, 1386, 0, 0, 1381, 1345, 231, + 248, 1390, 1380, 1389, 1344, 1339, 0, 0, 1335, 471, + 0, 0, 0, 0, 1153, 880, 879, 863, 864, 877, + 878, 865, 866, 873, 874, 882, 881, 871, 872, 867, + 868, 861, 862, 869, 870, 875, 876, 859, 860, 1166, + 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, + 1164, 1165, 0, 0, 706, 704, 0, 0, 0, 0, + 0, 0, 1193, 0, 973, 1008, 0, 0, 0, 1138, + 1176, 0, 0, 0, 0, 0, 0, 1138, 1182, 0, + 0, 731, 743, 0, 628, 634, 705, 703, 0, 1216, + 698, 0, 777, 0, 757, 0, 756, 0, 0, 759, + 753, 0, 754, 0, 0, 0, 0, 755, 0, 0, + 0, 0, 0, 701, 0, 743, 0, 702, 774, 1421, + 1420, 1416, 1403, 1411, 195, 0, 1268, 1904, 1905, 1906, + 821, 1907, 850, 828, 850, 850, 1908, 1909, 1910, 1911, + 817, 817, 830, 1912, 1913, 1914, 1915, 1916, 818, 819, + 855, 1917, 1918, 1919, 1920, 1921, 0, 0, 1922, 850, + 1923, 817, 1924, 1925, 1926, 822, 1927, 785, 1928, 0, + 1929, 820, 786, 1930, 858, 858, 1931, 0, 845, 1932, + 0, 1149, 795, 803, 804, 805, 806, 831, 832, 807, + 837, 838, 808, 902, 0, 817, 1269, 1270, 155, 1466, + 1482, 0, 1143, 1017, 849, 836, 1191, 0, 844, 843, + 0, 1143, 826, 825, 824, 1004, 0, 823, 1100, 850, + 850, 848, 928, 827, 0, 0, 0, 0, 0, 854, + 0, 852, 929, 907, 908, 0, 1226, 1235, 1138, 1142, + 0, 1002, 1138, 0, 0, 1090, 1092, 0, 1019, 1020, + 0, 1194, 1249, 1003, 0, 1254, 0, 0, 902, 902, + 1222, 1120, 0, 1110, 1113, 0, 0, 1117, 1118, 1119, + 0, 0, 0, 1214, 0, 1128, 1130, 0, 0, 944, + 1126, 0, 947, 0, 0, 0, 0, 1114, 1115, 1116, + 1106, 1107, 1108, 1109, 1111, 1112, 1124, 1105, 925, 0, + 999, 0, 1053, 0, 924, 1220, 696, 0, 1252, 696, + 1405, 1409, 1410, 1404, 1408, 0, 1399, 1398, 1401, 1402, + 1484, 0, 1441, 1425, 0, 1422, 1141, 691, 564, 1240, + 0, 568, 1446, 160, 159, 0, 0, 537, 536, 603, + 595, 597, 603, 0, 535, 0, 651, 652, 0, 0, + 0, 0, 684, 682, 1248, 1261, 639, 613, 638, 0, + 0, 617, 0, 643, 903, 677, 519, 607, 608, 611, + 518, 0, 680, 0, 690, 0, 556, 558, 541, 555, + 553, 538, 546, 678, 612, 0, 1448, 1472, 0, 0, + 0, 0, 0, 1611, 0, 0, 788, 83, 64, 318, + 138, 0, 0, 0, 0, 0, 0, 0, 91, 88, + 89, 90, 0, 0, 0, 0, 1268, 232, 233, 246, + 0, 237, 238, 235, 239, 240, 0, 0, 225, 226, + 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1456, 1449, 1195, 1200, 594, 594, + 594, 0, 592, 593, 0, 0, 0, 0, 0, 470, + 364, 374, 0, 0, 0, 1293, 205, 0, 0, 0, + 0, 0, 0, 401, 1296, 1294, 1292, 1295, 1297, 1582, + 189, 0, 0, 0, 0, 0, 197, 200, 0, 363, + 337, 0, 0, 1308, 0, 0, 0, 1611, 353, 1305, + 0, 1453, 0, 0, 251, 438, 1273, 0, 435, 438, + 1239, 0, 438, 219, 0, 0, 1341, 1383, 229, 249, + 230, 250, 484, 479, 509, 0, 487, 492, 468, 0, + 468, 0, 489, 493, 468, 488, 0, 468, 483, 1417, + 0, 1046, 0, 1036, 0, 0, 766, 0, 0, 1037, + 975, 976, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 993, 992, 1038, 770, 0, 773, 0, 0, 1174, 1175, + 0, 1039, 0, 0, 1181, 0, 0, 0, 1044, 0, + 708, 0, 0, 0, 623, 627, 630, 0, 633, 570, + 526, 1602, 1642, 0, 581, 581, 581, 579, 569, 0, + 655, 0, 0, 0, 732, 0, 0, 734, 736, 0, + 0, 739, 0, 714, 713, 0, 0, 0, 0, 778, + 0, 1244, 0, 0, 196, 0, 0, 0, 803, 0, + 0, 0, 793, 789, 0, 883, 884, 885, 886, 887, + 888, 889, 890, 891, 892, 893, 894, 809, 1281, 0, + 815, 1284, 1285, 1286, 1283, 1280, 1287, 1288, 0, 0, + 0, 0, 1190, 1186, 0, 0, 0, 0, 1095, 1097, + 1099, 0, 847, 846, 1104, 1110, 1113, 1117, 1118, 1119, + 1114, 1115, 1116, 1106, 1107, 1108, 1109, 1111, 1112, 0, + 1132, 0, 1086, 0, 0, 0, 0, 0, 0, 1225, + 0, 971, 0, 1021, 1006, 0, 0, 1093, 1022, 1227, + 1202, 0, 0, 0, 1257, 1256, 904, 913, 916, 948, + 949, 920, 921, 922, 926, 1279, 1278, 1221, 0, 1213, + 0, 0, 905, 930, 935, 0, 1183, 965, 0, 953, + 0, 943, 0, 951, 955, 931, 946, 0, 927, 0, + 1214, 1129, 1131, 0, 1127, 0, 917, 918, 919, 909, + 910, 911, 912, 914, 915, 923, 1103, 1101, 1102, 0, + 1200, 0, 1212, 0, 0, 1055, 0, 0, 950, 1218, + 0, 777, 594, 777, 0, 902, 1442, 1276, 1435, 1276, + 1424, 1139, 1241, 1275, 566, 0, 0, 0, 1444, 146, + 150, 0, 1201, 180, 182, 696, 0, 601, 602, 606, + 0, 0, 606, 585, 534, 1853, 1735, 0, 0, 0, + 0, 644, 685, 0, 676, 641, 642, 0, 640, 1248, + 645, 1247, 646, 649, 650, 618, 1236, 686, 688, 0, + 681, 0, 1242, 540, 559, 0, 0, 0, 0, 0, + 523, 522, 692, 0, 49, 0, 1611, 66, 0, 0, + 0, 0, 0, 0, 268, 0, 368, 268, 104, 1611, + 438, 1611, 438, 1506, 1577, 1753, 0, 62, 342, 95, + 0, 132, 371, 0, 327, 85, 100, 125, 0, 0, + 51, 222, 236, 241, 128, 245, 242, 1313, 243, 139, + 0, 47, 0, 126, 0, 1311, 0, 0, 53, 130, + 1315, 1457, 0, 1199, 0, 592, 592, 592, 0, 1145, + 0, 0, 0, 1147, 1148, 943, 1323, 1322, 1324, 1321, + 456, 469, 0, 365, 0, 481, 459, 460, 470, 1291, + 210, 0, 201, 366, 0, 366, 0, 1293, 0, 0, + 191, 187, 205, 211, 0, 0, 0, 0, 0, 364, + 356, 354, 387, 0, 361, 355, 0, 0, 313, 0, + 1500, 0, 0, 0, 0, 450, 0, 0, 0, 0, + 253, 254, 404, 1274, 406, 0, 408, 218, 216, 1336, + 476, 1143, 0, 474, 480, 475, 478, 473, 472, 0, + 467, 0, 502, 0, 0, 0, 0, 0, 0, 0, + 0, 1033, 1151, 0, 1169, 1168, 974, 981, 984, 988, + 989, 990, 1170, 0, 0, 0, 985, 986, 987, 977, + 978, 979, 980, 982, 983, 991, 775, 0, 0, 769, + 1179, 1178, 1172, 1173, 0, 1041, 1042, 1043, 1180, 0, + 0, 744, 621, 619, 622, 624, 620, 0, 0, 777, + 581, 581, 581, 581, 578, 0, 0, 0, 776, 0, + 672, 740, 738, 0, 762, 0, 735, 718, 741, 0, + 726, 0, 733, 782, 749, 0, 0, 751, 1412, 799, + 0, 794, 790, 0, 0, 0, 800, 0, 0, 0, + 0, 0, 0, 0, 1150, 587, 1018, 0, 0, 0, + 1187, 0, 970, 816, 829, 0, 1098, 1012, 0, 1121, + 1085, 857, 856, 858, 858, 0, 0, 0, 1234, 0, + 1139, 1089, 1091, 1235, 1005, 841, 902, 0, 0, 0, + 0, 0, 0, 0, 954, 945, 0, 952, 956, 0, + 0, 0, 939, 0, 0, 937, 966, 933, 0, 0, + 967, 1199, 0, 1203, 0, 0, 1054, 1063, 699, 695, + 655, 592, 655, 0, 1406, 1426, 1423, 567, 155, 1445, + 0, 169, 0, 0, 0, 0, 172, 186, 183, 1444, + 0, 0, 596, 598, 0, 1122, 606, 600, 648, 647, + 0, 616, 683, 614, 0, 689, 0, 557, 0, 543, + 0, 717, 0, 0, 0, 0, 0, 317, 0, 0, + 0, 268, 0, 376, 0, 383, 0, 0, 368, 349, + 84, 0, 0, 0, 58, 103, 76, 68, 54, 82, + 0, 0, 87, 0, 80, 97, 98, 96, 101, 0, + 278, 303, 0, 0, 314, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 484, 1200, 1196, 1200, + 0, 0, 0, 594, 590, 591, 1024, 0, 455, 508, + 505, 506, 504, 227, 375, 0, 0, 0, 199, 363, + 0, 1308, 0, 1290, 401, 0, 192, 0, 190, 210, + 0, 0, 201, 366, 0, 341, 337, 362, 335, 334, + 336, 0, 1501, 220, 0, 1495, 366, 1307, 0, 0, + 451, 0, 445, 0, 1302, 252, 438, 0, 463, 503, + 510, 490, 495, 0, 501, 497, 496, 491, 499, 498, + 494, 1034, 1045, 1167, 0, 0, 0, 0, 768, 771, + 0, 1040, 1035, 742, 0, 0, 655, 0, 0, 0, + 0, 572, 571, 577, 0, 0, 1057, 737, 0, 0, + 0, 724, 712, 719, 720, 0, 0, 0, 780, 779, + 750, 803, 0, 783, 803, 0, 803, 0, 801, 0, + 810, 895, 896, 897, 898, 899, 900, 901, 835, 0, + 1189, 1185, 1094, 1096, 1133, 853, 851, 1224, 1138, 1229, + 1231, 0, 0, 0, 1088, 972, 1255, 906, 0, 0, + 936, 1184, 957, 0, 0, 0, 932, 1121, 0, 0, + 0, 0, 0, 941, 0, 1207, 1200, 0, 1206, 0, + 0, 0, 0, 1029, 700, 672, 0, 672, 0, 0, + 1443, 0, 1438, 147, 148, 149, 0, 0, 0, 164, + 141, 0, 0, 181, 169, 157, 604, 605, 0, 599, + 615, 1237, 1243, 542, 0, 1002, 0, 0, 539, 0, + 133, 268, 0, 0, 65, 0, 385, 329, 377, 360, + 344, 0, 0, 0, 269, 0, 402, 0, 0, 350, + 0, 0, 0, 0, 330, 0, 0, 289, 0, 0, + 360, 0, 367, 285, 286, 0, 57, 77, 0, 73, + 0, 102, 0, 0, 0, 0, 0, 60, 72, 0, + 55, 0, 438, 438, 63, 1268, 1904, 1905, 1906, 1907, + 1908, 1909, 1910, 1911, 1912, 1913, 2024, 1914, 1915, 1916, + 1917, 1918, 1919, 1920, 1921, 2033, 1922, 275, 1923, 1680, + 1924, 1925, 1926, 1927, 1928, 0, 1929, 786, 1930, 1931, + 2112, 1932, 1106, 1107, 274, 273, 370, 270, 378, 272, + 0, 1269, 271, 373, 328, 129, 1314, 0, 127, 0, + 1312, 136, 134, 131, 1316, 1450, 0, 0, 1027, 1028, + 1025, 592, 0, 0, 0, 484, 462, 0, 0, 0, + 1500, 0, 0, 0, 1611, 0, 188, 0, 0, 202, + 1308, 198, 363, 0, 393, 313, 388, 0, 1500, 1498, + 0, 1308, 1494, 0, 442, 0, 0, 0, 409, 477, + 0, 500, 994, 0, 0, 0, 0, 631, 0, 637, + 672, 576, 575, 574, 573, 654, 1551, 1836, 1734, 0, + 658, 653, 656, 661, 663, 662, 664, 660, 671, 0, + 674, 761, 1134, 1136, 0, 0, 0, 0, 725, 727, + 0, 729, 0, 781, 797, 0, 798, 0, 796, 791, + 802, 1188, 1232, 1233, 1228, 0, 903, 963, 961, 958, + 0, 959, 940, 0, 0, 938, 934, 0, 968, 0, + 0, 1204, 0, 1049, 0, 1052, 1066, 1062, 1061, 1057, + 1024, 1057, 1407, 565, 168, 145, 171, 170, 0, 1201, + 178, 0, 0, 169, 0, 173, 452, 0, 0, 554, + 716, 547, 548, 0, 381, 67, 0, 360, 0, 268, + 346, 345, 348, 343, 347, 0, 403, 0, 0, 287, + 0, 294, 332, 333, 331, 288, 360, 366, 290, 0, + 0, 0, 69, 59, 56, 61, 70, 0, 0, 71, + 74, 782, 86, 79, 1268, 2033, 2042, 0, 0, 0, + 0, 0, 1198, 1197, 0, 458, 457, 507, 454, 465, + 227, 0, 0, 0, 337, 1497, 0, 0, 447, 0, + 0, 363, 193, 0, 0, 0, 0, 1500, 0, 0, + 265, 0, 310, 0, 213, 1499, 0, 0, 1486, 0, + 0, 1300, 1301, 0, 464, 995, 0, 996, 772, 0, + 0, 629, 1057, 0, 0, 0, 665, 659, 0, 1056, + 1058, 0, 626, 1137, 721, 0, 723, 0, 747, 0, + 747, 730, 792, 784, 1230, 1047, 0, 960, 964, 962, + 942, 1200, 1208, 1200, 1205, 1051, 1065, 1068, 674, 1253, + 674, 0, 0, 156, 0, 0, 153, 140, 158, 1123, + 544, 545, 0, 268, 0, 359, 382, 299, 277, 0, + 0, 0, 284, 291, 392, 293, 0, 78, 94, 0, + 0, 372, 137, 135, 1026, 484, 0, 204, 1308, 313, + 1494, 444, 0, 0, 0, 0, 337, 220, 1496, 326, + 319, 320, 321, 322, 323, 324, 325, 340, 339, 311, + 312, 0, 0, 0, 0, 0, 446, 1302, 0, 175, + 184, 0, 175, 997, 632, 0, 674, 0, 0, 0, + 657, 0, 0, 673, 0, 530, 1135, 0, 711, 709, + 0, 710, 0, 0, 0, 0, 594, 626, 626, 142, + 0, 143, 179, 0, 0, 0, 366, 384, 358, 0, + 351, 297, 296, 298, 302, 0, 300, 0, 316, 0, + 309, 277, 0, 81, 0, 379, 453, 461, 0, 267, + 1488, 363, 0, 203, 1494, 313, 1500, 1494, 0, 1491, + 0, 443, 0, 0, 0, 177, 1308, 0, 177, 0, + 626, 667, 0, 666, 1060, 1059, 628, 722, 0, 1048, + 1210, 1209, 0, 1072, 529, 528, 0, 0, 0, 0, + 392, 0, 338, 0, 0, 299, 0, 292, 389, 390, + 391, 0, 305, 295, 306, 75, 93, 380, 0, 363, + 1489, 266, 214, 1487, 1492, 1493, 0, 175, 174, 603, + 176, 777, 185, 603, 636, 531, 668, 625, 728, 1067, + 0, 0, 0, 0, 0, 152, 777, 163, 0, 309, + 357, 352, 276, 301, 315, 0, 0, 0, 307, 0, + 308, 1494, 0, 177, 606, 1298, 606, 1822, 1552, 1788, + 0, 1084, 1073, 1084, 1084, 1064, 144, 151, 0, 268, + 281, 0, 280, 0, 369, 304, 1490, 1308, 603, 165, + 166, 0, 1077, 1076, 1075, 1079, 1078, 0, 1071, 1069, + 1070, 777, 386, 279, 283, 282, 777, 606, 0, 0, + 1081, 0, 1082, 162, 1299, 167, 1074, 1080, 1083 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 48, 49, 50, 750, 2593, 2594, 2595, 2235, 1204, - 3360, 2236, 1205, 1206, 2597, 751, 801, 1092, 803, 1093, - 1602, 905, 1238, 1239, 752, 1751, 753, 2816, 2159, 2541, - 3342, 55, 3087, 2162, 1164, 3090, 3307, 2809, 3085, 2542, - 3382, 3436, 3088, 2163, 2164, 3308, 2165, 754, 2654, 2655, - 755, 756, 1835, 59, 1300, 546, 1832, 757, 1333, 1334, - 960, 758, 1836, 1779, 2932, 1224, 1769, 1348, 62, 1853, - 759, 106, 64, 760, 2582, 2933, 3353, 2608, 3491, 2869, - 2870, 3350, 3351, 2585, 2238, 3419, 3420, 2669, 1760, 3414, - 2319, 3294, 2242, 2223, 2871, 2327, 3252, 2981, 2239, 2851, - 2320, 3346, 1848, 2321, 3347, 3106, 2322, 1810, 1839, 2586, - 3421, 2243, 1811, 2581, 2934, 1748, 2323, 3357, 2324, 547, - 2855, 761, 741, 742, 952, 1327, 743, 762, 936, 1845, - 763, 764, 2635, 2297, 3157, 2684, 3158, 2358, 2291, 1357, - 2352, 1873, 1813, 1358, 535, 1887, 2685, 2640, 1874, 765, - 1094, 72, 73, 1007, 74, 3100, 75, 76, 1725, 1726, - 1727, 848, 860, 861, 2155, 1441, 1957, 853, 1168, 1694, - 835, 836, 2281, 876, 1802, 1689, 1690, 2168, 2549, 1718, - 1719, 1177, 1178, 1945, 3322, 1946, 1947, 1434, 1435, 3198, - 1706, 1710, 1711, 2189, 2179, 1697, 2427, 3017, 3018, 3019, - 3020, 3021, 3022, 3023, 1095, 2723, 3209, 1714, 1715, 1180, - 1181, 1182, 1723, 2199, 78, 79, 2140, 2525, 2526, 807, - 3034, 1460, 1728, 2727, 2728, 2729, 3037, 3038, 3039, 808, - 1002, 1003, 1026, 1021, 1449, 1966, 809, 810, 1922, 1923, - 2396, 1028, 1959, 1977, 1978, 2735, 2451, 1529, 2224, 1530, - 1531, 1992, 1532, 1096, 1533, 1561, 1097, 1566, 1535, 1098, - 1099, 1100, 1538, 1101, 1102, 1103, 1104, 1554, 1105, 1106, - 1578, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 1151, 1729, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 812, 1115, 1116, 1651, 2134, 2524, 3027, - 3206, 3207, 2800, 3075, 3234, 3333, 3450, 3478, 3479, 3505, - 1117, 1118, 1594, 1595, 1596, 2027, 2028, 2029, 2030, 2128, - 1645, 1646, 1119, 2936, 1648, 2050, 3030, 3031, 1152, 1427, - 1589, 1279, 1280, 1543, 1401, 1402, 1408, 1897, 1416, 1420, - 1927, 1928, 1428, 2096, 1120, 2021, 2022, 2468, 1556, 1121, - 1237, 1601, 2795, 2131, 1649, 2090, 1128, 1122, 1129, 1124, - 1585, 1586, 2485, 2767, 2768, 2060, 2196, 1678, 2201, 2202, - 956, 1125, 1126, 1127, 1281, 519, 1544, 3437, 1323, 1157, - 1282, 2086, 766, 1034, 2014, 767, 1296, 1825, 768, 3189, - 2994, 1312, 1849, 2332, 548, 769, 770, 528, 85, 2286, - 917, 86, 87, 88, 885, 1350, 771, 1351, 1352, 967, - 89, 2686, 969, 970, 773, 842, 843, 1472, 1665, 1473, - 774, 818, 1470, 775, 1147, 857, 1148, 1150, 776, 1141, - 2538, 2157, 94, 95, 96, 114, 1235, 777, 829, 830, - 866, 99, 100, 1192, 831, 849, 779, 780, 3185, 781, - 2672, 1306, 529, 521, 522, 1546, 715, 1284, 716 + -1, 48, 49, 50, 750, 2596, 2597, 2598, 2236, 1205, + 3363, 2237, 1206, 1207, 2600, 751, 801, 1092, 803, 1093, + 1603, 905, 1239, 1240, 752, 1752, 753, 2819, 2160, 2544, + 3345, 55, 3090, 2163, 1165, 3093, 3310, 2812, 3088, 2545, + 3385, 3439, 3091, 2164, 2165, 3311, 2166, 754, 2657, 2658, + 755, 756, 1836, 59, 1301, 546, 1833, 757, 1334, 1335, + 960, 758, 1837, 1780, 2935, 1225, 1770, 1349, 62, 1854, + 759, 106, 64, 760, 2585, 2936, 3356, 2611, 3494, 2872, + 2873, 3353, 3354, 2588, 2239, 3422, 3423, 2672, 1761, 3417, + 2320, 3297, 2243, 2224, 2874, 2328, 3255, 2984, 2240, 2854, + 2321, 3349, 1849, 2322, 3350, 3109, 2323, 1811, 1840, 2589, + 3424, 2244, 1812, 2584, 2937, 1749, 2324, 3360, 2325, 547, + 2858, 761, 741, 742, 952, 1328, 743, 762, 936, 1846, + 763, 764, 2638, 2298, 3160, 2687, 3161, 2361, 2292, 1358, + 2354, 1874, 1814, 1359, 535, 1888, 2688, 2643, 1875, 765, + 1094, 72, 73, 1007, 74, 3103, 75, 76, 1726, 1727, + 1728, 848, 860, 861, 2156, 1442, 1958, 853, 1169, 1695, + 835, 836, 2282, 876, 1803, 1690, 1691, 2169, 2552, 1719, + 1720, 1178, 1179, 1946, 3325, 1947, 1948, 1435, 1436, 3201, + 1707, 1711, 1712, 2190, 2180, 1698, 2430, 3020, 3021, 3022, + 3023, 3024, 3025, 3026, 1095, 2726, 3212, 1715, 1716, 1181, + 1182, 1183, 1724, 2200, 78, 79, 2141, 2528, 2529, 807, + 3037, 1461, 1729, 2730, 2731, 2732, 3040, 3041, 3042, 808, + 1002, 1003, 1026, 1021, 1450, 1967, 809, 810, 1923, 1924, + 2399, 1028, 1960, 1978, 1979, 2738, 2454, 1530, 2225, 1531, + 1532, 1993, 1533, 1096, 1534, 1562, 1097, 1567, 1536, 1098, + 1099, 1100, 1539, 1101, 1102, 1103, 1104, 1555, 1105, 1106, + 1579, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 2006, 2007, 1152, 1730, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 812, 1116, 1117, 1652, 2135, 2527, + 3030, 3209, 3210, 2803, 3078, 3237, 3336, 3453, 3481, 3482, + 3508, 1118, 1119, 1595, 1596, 1597, 2028, 2029, 2030, 2031, + 2129, 1646, 1647, 1120, 2939, 1649, 2051, 3033, 3034, 1153, + 1428, 1590, 1280, 1281, 1544, 1402, 1403, 1409, 1898, 1417, + 1421, 1928, 1929, 1429, 2097, 1121, 2022, 2023, 2471, 1557, + 1122, 1238, 1602, 2798, 2132, 1650, 2091, 1129, 1123, 1130, + 1125, 1586, 1587, 2488, 2770, 2771, 2061, 2197, 1679, 2202, + 2203, 956, 1126, 1127, 1128, 1282, 519, 1545, 3440, 1324, + 1158, 1283, 2087, 766, 1034, 2015, 767, 1297, 1826, 768, + 3192, 2997, 1313, 1850, 2333, 548, 769, 770, 528, 85, + 2287, 917, 86, 87, 88, 885, 1351, 771, 1352, 1353, + 967, 89, 2689, 969, 970, 773, 842, 843, 1473, 1666, + 1474, 774, 818, 1471, 775, 1148, 857, 1149, 1151, 776, + 1142, 2541, 2158, 94, 95, 96, 114, 1236, 777, 829, + 830, 866, 99, 100, 1193, 831, 849, 779, 780, 3188, + 781, 2675, 1307, 529, 521, 522, 1547, 715, 1285, 716 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -2987 +#define YYPACT_NINF -3059 static const int yypact[] = { - 6315, -13, 722, -2987, -2987, 285, -13, 49878, 64713, 72, - -13, 172, 4065, 51858, -2987, -2987, 46413, 41312, -13, 54828, - 72049, 349, 300, 31840, 382, 55323, 55323, -2987, -2987, -2987, - 64713, 54828, 55818, -13, 340, 65208, -2987, -13, 34315, 52353, - -27, -2987, 54828, 34, 16, 56313, 54828, 2732, 576, 224, - -2987, -2987, -2987, -2987, -2987, 126, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, 144, -2987, 116, 147, 31840, 31840, 1267, 318, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 311, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - 33820, -2987, -2987, -2987, -2987, -2987, -2987, 56808, 54828, 57303, - 52848, 57798, -2987, 613, 819, -2987, 160, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 181, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 396, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, 188, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, 381, -2987, 402, -2987, - 189, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - 1569, -2987, -2987, 818, 2426, 54828, 20, 695, 580, -2987, - 58293, -2987, 591, 54828, -2987, -2987, 638, 856, 855, -2987, - -2987, 53343, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 46908, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, 815, -2987, -2987, - 594, -2987, 154, -2987, -2987, 605, 625, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, 820, -2987, -2987, -2987, - 835, 65703, 58788, 59283, -2987, 704, 3136, 7105, 72067, 30848, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, 311, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, 55323, 64713, 55323, 717, 729, 1083, 739, 32335, - 756, 34811, 772, 781, 1128, 795, 800, 824, 830, 16, - 31344, 822, 381, -2987, 59778, 59778, -10, 1763, -2987, 59778, - 60273, -2987, 852, -2987, 819, -2987, -2987, -2987, 1185, -2987, - 419, 853, -2987, 60768, 60768, 60768, 877, 1157, -2987, -2987, - -2987, 875, -2987, -2987, 1116, 20517, 20517, 66198, 66198, 819, - 66198, 925, -2987, -2987, 37, -2987, -2987, -2987, 1267, 911, - 381, -2987, -2987, 52353, -2987, -2987, 225, 1287, 20517, 54828, - 943, -2987, 957, 943, 967, 969, 978, -2987, 6315, 1298, - 1209, 52353, 343, 343, 1463, 343, 1056, 1084, 6398, 6686, - -2987, 1859, -2987, 1019, -2987, 54828, 1124, 1049, 1325, -2987, - 911, 1409, 185, 1213, 1419, 4415, 1428, 559, 1443, 985, - 1450, 1576, 20517, 47403, 381, -2987, 11660, 20517, -2987, -2987, - -2987, 1207, -2987, -2987, -2987, -2987, -2987, 54828, 64713, 1112, - 1125, -2987, -2987, -2987, -2987, 1358, 1367, -2987, 1603, 66693, - -2987, -2987, 1179, 61263, 61758, 62253, 62748, 1561, -2987, -2987, - 1504, -2987, -2987, -2987, 1186, -2987, -2987, -2987, 332, 67188, - 1518, 1164, 175, -2987, 1530, 212, -2987, 1533, 1407, 15307, - -2987, 1346, -2987, -2987, -2987, 16, -2987, 284, -2987, -2987, - 43357, -2987, -2987, 72067, 1272, 1195, -2987, 1558, 20517, 20517, - 1223, 7242, 59778, 60273, 20517, 54828, -2987, 20517, 25206, 1227, - 20517, 20517, 12702, 20517, 29858, 59778, 1763, 1231, -2987, 588, - 54828, 1242, -2987, 1334, 1334, 340, 31840, 1540, -2987, 219, - 1568, 1467, -2987, 31840, 1467, 916, 1280, 1580, 1467, -2987, - 598, 1583, 1334, 35306, 1301, -2987, 1334, 1505, -2987, -2987, - 55323, 20517, 15307, 69663, 1779, -2987, -2987, -2987, -2987, 1596, - 64713, 1308, -2987, -2987, -2987, -2987, -2987, -2987, 669, 1827, - 141, 1830, 20517, 141, 141, 1329, 190, 190, -2987, 1524, - 1336, -2987, 195, 1337, 1338, 1849, 1850, 167, 163, 353, - 141, 20517, -2987, 190, 1345, 1855, 1347, 1857, 156, 187, - -2987, 199, 20517, 20517, 20517, 1715, 20517, 10618, -2987, 54828, - 1858, 47403, 692, -2987, 381, 1352, 819, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, 1354, -2987, 180, 6820, -2987, -2987, - -2987, -2987, -2987, 1392, -2987, -2987, -2987, -2987, 1572, 20517, - -2987, -2987, 1356, 1540, -2987, 204, -2987, -2987, 1540, -2987, - -2987, -2987, -2987, -2987, 220, 1766, 20517, 20517, 64713, 381, - 67683, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 441, -2987, - 311, 45045, 1357, 1361, 943, 54828, 54828, 1837, -2987, -2987, - -2987, -2987, 52353, 142, 1660, 1492, -2987, -2987, 1267, 1267, - 15828, 737, 487, 1054, 16349, 21038, 1714, 1597, 227, 218, - 1719, -2987, 1600, 1829, 25206, 20517, 20517, 1056, 1084, 20517, - 957, -2987, -2987, -2987, 1655, 54828, 50373, 937, 941, 1377, - 1464, 1379, 81, 1808, -2987, 1384, -2987, 1485, 54828, 71598, - 192, -2987, 1856, 192, 192, 251, 1864, 1488, 272, 1652, - 362, 257, 1384, 202, -2987, 52353, 197, 761, 1384, 54828, - 1498, 788, 1384, 1820, 64713, 1195, 40944, 1406, -2987, -2987, - -2987, 164, 15307, -2987, 1156, 1311, 1320, 391, 153, 1373, - 1420, 15307, 1478, 1542, 168, 1577, 1587, 1601, 1659, 1665, - 1674, 1679, 1691, 149, 1710, 1712, 1718, 1720, 1726, 1730, - -2987, 1741, 170, 1760, 206, 15307, 1773, -2987, 45045, -1, - -2987, -2987, 1777, 174, -2987, 45134, -2987, 1713, 1508, 1509, - 64713, 1465, 54828, 1570, 865, 1793, 1846, 70143, 1675, -2987, - 1750, 54828, 1678, 202, 1680, 1439, 1916, 1684, 1125, 1685, - 1448, -2987, 68178, 47403, -2987, -2987, -2987, -2987, -2987, 1811, - 1794, 64713, 47403, 1452, -2987, -2987, 64713, -2987, 54828, 54828, - -2987, 54828, 64713, -2987, 526, 45045, 1957, 617, 72067, 48888, - -2987, -2987, -2987, -2987, 1143, 1201, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, 819, 47403, -2987, 3327, 55323, - 43975, 1459, 20517, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, 1461, 1807, -2987, -2987, 6597, 1466, 44015, 1468, 25206, - 25206, 381, 4715, -2987, -2987, 25206, 1469, 49383, 43888, 1462, - 1471, 44363, 16870, 20517, 16870, 16870, 44450, -2987, 1473, 44527, - 59778, 1475, 54828, 53838, -2987, -2987, -2987, 20517, 20517, 1763, - 54333, 1520, 31840, -2987, 31840, -2987, 1758, 31840, -2987, -2987, - 3920, -2987, 31840, 1770, 20517, 31840, -2987, 31840, 1717, 1721, - 1481, 31840, -2987, 54828, 1493, 54828, -2987, -2987, -2987, -2987, - -2987, 45045, -2987, 1491, 633, 1499, -2987, -2987, -2987, -2987, - -2987, 1551, -2987, 1551, 1551, -2987, -2987, -2987, -2987, 1502, - 1502, 1507, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, 1513, 353, -2987, 1551, -2987, - 1502, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 71598, -2987, - -2987, -2987, -2987, 621, 645, -2987, 1514, -2987, -2987, 1515, - -2987, 1503, 1979, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, 8492, 742, 1502, -2987, -2987, 4693, -2987, -2987, - 20517, 20517, -2987, -2987, 1516, 45045, 1550, -2987, -2987, 20517, - 20517, -2987, -2987, -2987, -2987, 2024, -2987, 20517, 1551, 1551, - -2987, 5276, -2987, 39763, 17391, 1610, 1611, 2024, -2987, 2024, - -2987, 5276, 2033, 2033, 37781, -2987, 1695, 44614, -2987, 1536, - 1877, 7400, 1538, 1527, -2987, 1544, 1543, -2987, -2987, 41872, - 137, 381, 381, 20517, -2987, 2024, 20517, 8530, 8530, -2987, - 294, 69663, 20517, 20517, 20517, 20517, 20517, 20517, 20517, 20517, - 45918, 1628, 171, 64713, 20517, 20517, 1549, 881, -2987, 20517, - 1786, -2987, 1553, 20517, 1641, 896, 20517, 20517, 20517, 20517, - 20517, 20517, 20517, 20517, 20517, -2987, -2987, 28853, 347, 740, - 1890, 1909, -26, 1212, 20517, 1901, 11660, -2987, 1901, -2987, - -2987, -2987, -2987, -2987, 205, -2987, -2987, 1491, 1491, -2987, - 64713, -2987, 54828, 225, 51363, 20517, -2987, -2987, 1562, 1563, - 546, 1619, -2987, -2987, 54828, 38276, 1862, -2987, 357, 1567, - -2987, 43849, 1816, 1862, 1267, -2987, -2987, 26248, 1697, 1863, - 1800, -2987, -2987, 1781, 1785, -2987, 1573, 45267, 21559, 21559, - -2987, 1411, 45045, 1433, -2987, -2987, -2987, -2987, -2987, -2987, - 547, -2987, 54828, 78, 35801, -2987, 1581, 102, -2987, 5415, - 1920, 1883, 1714, 218, 1590, -2987, -2987, 996, 1593, 68673, - 54828, 1882, 1835, 1884, -45, 69663, -2987, -2987, -2987, -2987, - 54828, 64713, 63243, 69168, 47898, 54828, 47403, -2987, -2987, -2987, - -2987, 54828, 1102, 54828, 6396, -2987, -2987, -2987, -2987, 192, - -2987, -2987, -2987, -2987, -2987, 64713, 54828, -2987, -2987, 192, - 64713, 54828, 192, -2987, 1082, 54828, 54828, 54828, 54828, 1208, - 54828, 54828, 819, -2987, -2987, -2987, 22080, 8, 8, 1817, - 13223, 131, -2987, 20517, 20517, 901, 273, 64713, 1778, -2987, - -2987, 770, 1826, 200, -2987, 64713, 1649, 54828, 54828, 54828, - 54828, 54828, 1363, -2987, -2987, -2987, -2987, -2987, 1604, -2987, - 1965, 2116, 1606, 1614, 1978, -2987, 202, 1983, 50868, 159, - 2595, 1986, 1663, 1989, 13744, 2091, 1868, -2987, -2987, 1866, - -2987, 64713, 2141, -2987, 175, -2987, 47403, -2987, 212, -2987, - 1869, 241, -2987, 15307, 20517, -2987, -2987, -2987, -2987, -2987, - -2987, 1195, 29359, -2987, 776, -2987, -2987, 2108, 819, 2108, - 672, -2987, -2987, 2108, -2987, 2094, 2108, -2987, -2987, 69663, - -2987, 7699, -2987, 20517, 20517, -2987, 20517, 1994, -2987, 2146, - 2146, 69663, 25206, 25206, 25206, 25206, 25206, 25206, 213, 1345, - 25206, 25206, 25206, 25206, 25206, 25206, 25206, 25206, 25206, 26769, - 230, -2987, -2987, 786, 2119, 20517, 20517, 2001, 1994, 20517, - -2987, 69663, 1645, -2987, 1653, 1654, 20517, -2987, 69663, -2987, - 54828, 1656, -2, 561, -2987, 1664, 1669, -2987, 1540, -2987, - 810, 847, 54828, 2652, 3454, 3760, -2987, -2987, 20517, 1990, - 3920, 3920, 31840, -2987, 20517, 1670, -2987, -2987, 31840, 2007, - -2987, 3920, -2987, -2987, 36296, 3920, 69663, 825, -2987, 54828, - 69663, 833, 20517, -2987, 15307, 2171, 69663, 2138, 64713, 64713, - 2182, 1677, 1681, 2024, 1764, -2987, 1767, 1769, 1772, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 69663, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, 1673, 1688, 20517, - 20517, 138, -2987, 7786, 1690, 1693, 5578, -2987, 1696, -2987, - 1682, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 1702, -2987, - 1694, -2987, 1698, 1709, 1722, 1706, 1707, 54828, -2987, 22601, - -2987, 64713, -2987, -2987, 20517, 20517, 54828, -2987, 1715, -2987, - 1708, 1716, 8076, -2987, -2987, -2987, 239, 769, 8382, 1212, - 2227, 2227, 2227, 5276, -2987, -2987, -2987, 1731, -2987, 25206, - 25206, -2987, 2509, 256, 10618, -2987, -2987, 2058, -2987, 954, - -2987, 1727, -2987, -2987, 1988, -2987, 39763, 45338, 20517, 173, - -2987, 20517, 1549, 20517, 1802, 2227, 2227, 2227, 282, 282, - 239, 239, 239, 769, 1212, -2987, -2987, -2987, 1735, 20517, - 47403, -2987, 1739, 1752, 2077, 1347, 20517, -2987, -2987, 31840, - 1520, -1, 1520, 2024, 8530, -2987, 957, -2987, 957, -2987, - 45045, 54828, -2987, -2987, 1985, 1757, 31840, 1771, 2196, 2181, - 64713, -2987, -2987, 1745, 1901, 1742, -2987, -2987, 1776, 20517, - 1749, 1776, -2987, 1862, 5, 1982, 1202, 1202, 1411, 1987, - -2987, -2987, 1831, -2987, -2987, -2987, 20517, 14265, 1444, -2987, - 1447, -2987, -2987, -2987, -2987, -2987, 1765, -2987, 2035, -2987, - 54828, -2987, -2987, 25206, 2217, 20517, 36791, 2222, 2019, -2987, - -2987, -2987, 1860, 1384, 20517, 2011, -2987, 240, 1775, 2135, - 293, 2089, 64713, -2987, 281, 334, -2987, 755, 2142, 241, - 2144, 241, 47403, 47403, 47403, 843, -2987, -2987, -2987, 819, - -2987, 331, 854, -2987, -2987, -2987, -2987, 1865, 806, 1384, - 202, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 198, 814, - 1384, 1870, -2987, 1872, -2987, 1874, 823, 1384, -2987, -2987, - 1576, 9053, 45045, 522, 131, 131, 131, 15307, -2987, 2016, - 2023, 1795, 45045, 45045, 135, -2987, -2987, -2987, -2987, 1801, - -2987, 210, -2987, 64713, -2987, -2987, -2987, 1778, 1846, 1750, - 54828, 202, 1803, 2268, 1125, 1448, -2987, 1962, 1043, 1676, - -2987, 64713, -2987, 47403, 64713, 54828, 54828, 54828, 63738, -2987, - -2987, -2987, 1804, 1805, -2987, 9, 2031, 2036, 54828, 1844, - 54828, 1379, 2282, 54828, -2987, 858, 17912, 2172, 54828, 1794, - -2987, -2987, -2987, -2987, 64713, -2987, -2987, 45045, -2987, -2987, - 48393, -2987, -2987, -2987, -2987, -2987, 47403, -2987, 819, -2987, - 819, 2057, 64713, 42367, 819, 42862, 819, 1822, -2987, 45045, - 8224, 45045, 2001, -2987, 148, 2146, 1825, 1825, 1825, 4327, - 2167, 215, 1828, 1825, 1825, 1825, 296, 296, 148, 148, - 148, 2146, 230, 852, 49383, 1832, -2987, 45045, 45045, -2987, - -2987, 1824, -2987, -2987, -2987, -2987, 1833, 1836, -2987, -2987, - -2987, -2987, -2987, -2987, 64713, 1238, 1520, -27, -27, -27, - -27, -2987, 54828, 54828, 54828, 45045, 2281, 2159, -2987, -2987, - 3920, 45045, 54828, -2987, 27811, -2987, 54828, -2987, 2179, -2987, - 2267, -2987, 54828, 863, -2987, -2987, -2987, 926, 1838, 1681, - 69663, 931, 955, -2987, 2024, 194, 1843, 1555, 1278, 492, - 1445, -2987, -2987, -2987, 1845, 44749, 20517, -2987, 2209, -2987, - -2987, -2987, 20517, 20517, -2987, 39763, -2987, -2987, -2987, -2987, - -50, -50, 1848, 10618, 44971, -2987, 2155, 8299, 45045, -2987, - 1695, -2987, -2987, 8530, 20517, 1205, 3014, 20517, 1851, 20517, - 2188, -2987, -2987, 1854, -2987, -2987, 69663, 20517, 1861, 2787, - 25206, 25206, 3657, -2987, 6043, 20517, 10618, -2987, 41030, 1840, - 1871, 1817, 18433, -2987, 2061, 1852, -2987, 1990, 131, 1990, - 1867, -2987, -2987, -2987, -2987, 4693, -2987, 20517, 2004, 64713, - 379, 2098, 961, -2987, 381, 38276, 1771, 20517, 247, -2987, - -2987, 1880, -2987, 1776, -2987, -2987, -2987, 2075, -2987, -2987, - -2987, 54828, -2987, 1873, -2987, 35801, 2189, 11139, -2987, 35801, - 54828, 54828, 40266, 2220, -2987, 64713, 64713, 64713, -2987, 64713, - 1878, 1876, 899, 1881, 752, -2987, 1847, 899, 2199, 651, - 1379, 272, 2556, 423, -2987, -2987, -2987, 1938, 54828, -2987, - 64713, -2987, -2987, -2987, -2987, -2987, 47898, -2987, -2987, 39267, - 47403, -2987, 47403, 54828, 54828, 54828, 54828, 54828, 54828, 54828, - 54828, 54828, 54828, 1195, 20517, -2987, 20517, 1887, 1891, 1892, - 1817, -2987, -2987, -2987, 223, -2987, 1889, -2987, -2987, -2987, - 257, -2987, 210, 1885, 1894, -2987, 50868, 2426, 1663, 2338, - 1846, 767, 64218, -2987, 1895, 1879, 1750, 963, 965, 202, - 1897, 2340, -2987, 159, 50868, -2987, -2987, -2987, 2297, -2987, - 704, 209, -2987, 1125, -2987, 2426, 1448, -2987, 2426, 45045, - 64713, 1932, -2987, 241, 971, -2987, -2987, -2987, -2987, -2987, - 64713, 1899, -2987, 1899, -2987, -2987, 1899, -2987, -2987, -2987, - -2987, 25206, 2238, 1905, 69663, -2987, -2987, 54828, -2987, -2987, - -2987, 1000, 1900, 1990, 54828, 54828, 54828, 54828, -2987, -2987, - -2987, 18954, 20517, 1946, -2987, 1907, 12181, 2225, -2987, 27290, - -2987, -2987, 1913, 36296, 64713, -2987, -2987, -2987, -2987, 2024, - -2987, -2987, 64713, -2987, 1922, -2987, 1923, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, 20517, 45045, -2987, 45045, - -2987, -2987, -2987, -2987, -2987, 7353, -2987, 1919, 1925, 64713, - 20517, -2987, -2987, -2987, 773, 20517, 20517, 2509, -2987, 45429, - 20517, 69663, 1002, 2509, 348, 20517, 5175, 5705, 20517, 20517, - 6302, 40305, -2987, 23122, 14786, -2987, 1926, 20517, 40344, 38771, - -2987, 31840, 2159, 1927, 2159, 819, 1931, 45045, 20517, -2987, - -2987, -2987, -2987, 1991, 67, 33325, 2149, -2987, 1944, 64713, - -2987, 2004, 45045, -2987, -2987, 39763, -2987, -2987, -2987, -2987, - -2987, 2389, 2000, 1935, 1937, -2987, 1365, -2987, -2987, 64713, - 1939, -2987, 1940, 899, -2987, 64713, 1980, -2987, 309, 2253, - 95, -2987, 20517, -2987, 2343, 2421, 1847, 1950, 64713, 54828, - 25206, -2987, 414, 246, -2987, 2241, 54828, 1980, 2380, -2987, - -2987, -2987, 752, -2987, 2279, 2194, -2987, 192, -2987, 20517, - 752, 2195, 222, 64713, -2987, -2987, 3395, -2987, 69663, 241, - 241, -2987, 1499, 1963, 1964, 1966, 1967, 1968, 1969, 1972, - 1973, 1975, 1997, -2987, 2003, 2005, 2006, 2010, 2012, 2013, - 2015, 2017, 1513, 2018, -2987, 2020, 1880, 2022, 2025, 2028, - 2030, 2032, 70623, 2034, 2045, 2047, 2048, 1514, 2050, 1143, - 1201, -2987, -2987, -2987, -2987, -2987, -2987, 1164, 2051, -2987, - 1998, -2987, -2987, -2987, 2053, -2987, 2074, -2987, -2987, -2987, - -2987, -2987, -2987, 1993, 2014, -2987, -2987, -2987, 131, 1992, - 1995, 64713, 1195, 113, 47403, 64713, 2055, 1844, 2438, 19475, - 1048, 2258, 2021, -2987, 819, 2037, -2987, 1663, -2987, 50868, - 2948, 245, 2036, -2987, 304, 1844, -2987, 2442, 1663, 2092, - 2533, -2987, 2286, 64713, 2065, -2987, -2987, 48393, 1899, 5624, - 25206, 69663, 1027, 1032, -2987, 2573, 2232, 2159, -2987, -2987, - -2987, -2987, -2987, 2072, -29, 2073, 10097, 2076, -2987, -2987, - -2987, -2987, -2987, -2987, 45045, 45045, 64713, 2255, -2987, -2987, - 2082, 2078, 37286, 2536, 2086, -2987, -2987, 2408, -2987, 30353, - -2987, 1681, 2095, 1681, 69663, 1681, -2987, -2987, 45045, 20517, - -2987, -2987, 41298, 2416, 2509, 2509, 45429, 1057, -2987, 2509, - 20517, 20517, 2509, 2509, 20517, -2987, 9575, 550, -2987, 1059, - -2987, 40391, -2987, 71103, -2987, -2987, 1946, 819, 1946, -2987, - -2987, 2093, -2987, -2987, -2987, 2150, -2987, -2987, 1061, 2519, - 2004, 20517, -2987, -2987, 2099, 35801, -2987, -2987, -2987, -2987, - 35801, 899, -2987, 2269, 1980, 2106, -2987, -2987, -2987, -2987, - -2987, -2987, 40430, -2987, 83, 20517, -2987, 184, 4327, -2987, - -2987, -2987, -2987, 1980, 1125, -2987, 54828, 2583, 2472, -2987, - -2987, 45045, -2987, -2987, 2024, 2024, -2987, -2987, 2267, -2987, - -2987, 2110, -2987, -2987, 1164, 375, 39267, 54828, 54828, -2987, - -2987, 2112, -2987, -2987, -2987, -2987, -2987, 257, 2504, 1069, - 1070, 159, -2987, 2426, 2426, 45045, 54828, 2478, 50868, -2987, - 47403, 2591, 2117, 54828, 1844, 437, 437, -2987, 2271, -2987, - 2273, -2987, -2987, 2593, 356, -2987, 19996, 54828, -2987, -2987, - 32830, -2987, 5624, 1071, -2987, -2987, 2120, 2127, -2987, 1946, - 20517, 2128, 20517, -2987, 23643, 2603, 2126, -2987, 20517, 2191, - 28332, -2987, 20517, -2987, 54828, 59778, 2133, 59778, -2987, -2987, - -2987, -2987, -2987, 20517, -2987, 2509, 2509, 2509, 20517, -2987, - 20517, -2987, -2987, -2987, 2339, 2255, -2987, 2255, 20517, 2426, - 381, 2758, 64713, 0, -2987, 45045, -2987, -2987, -2987, 54828, - -2987, 47403, -2987, 899, 12, 2136, 20517, 40780, 2379, -2987, - -2987, 2411, -2987, 2470, -2987, 2212, 640, 2228, -2987, -2987, - -2987, -2987, 1195, 819, -2987, 1663, 2036, 2092, -2987, 2154, - 54828, 1106, 2426, 159, 704, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 2426, 2596, - 2377, 2597, 2426, 45045, 1932, 20517, 91, -2987, 1110, 2592, - -2987, -2987, 2665, 2255, 2161, 23643, 2163, -2987, 2169, 64713, - 45045, 2313, -2987, -2987, 2173, -2987, -2987, 20517, -2987, 41380, - 2174, 2176, 2625, 1817, 2191, 2191, -2987, 67, -2987, -2987, - 2598, 32830, 2553, 1125, 899, 2187, 1137, -2987, -2987, -2987, - -2987, -2987, 202, -2987, 40866, 2420, 208, 2404, 2136, 20517, - -2987, 2256, -2987, -2987, -2987, 2656, -2987, -2987, 50868, 2184, - -2987, 2092, 2036, 1844, 2092, 2407, -2987, 2409, -2987, 2186, - 40905, 64713, 64713, 1663, 32830, 64713, 2190, 2191, -2987, 2197, - -2987, -2987, -2987, 53838, -2987, 2198, -2987, -2987, -2987, 20517, - 152, -2987, -2987, 2244, 54828, 1145, 40, 2411, 39267, -2987, - 47403, 1058, 12, 2500, -2987, -2987, -2987, -2987, 127, 2417, - -2987, 2422, -2987, 45045, -2987, 2426, 50868, -2987, -2987, -2987, - -2987, -2987, -2987, 32830, 2592, -2987, 357, -2987, 1520, -2987, - 357, -2987, -2987, -2987, -2987, -2987, 1462, 24164, 24164, 24164, - 2201, 2426, -2987, 1520, -2987, 2323, 2404, -2987, -2987, -2987, - -2987, -2987, 176, 176, 2588, -2987, 2266, -2987, 2092, 1146, - 64713, 1776, -2987, 1776, 25727, 2355, 177, 43927, 2575, -2987, - 2575, 2575, -2987, -2987, -2987, 38276, -2987, -2987, 2696, -2987, - 231, -2987, -2987, -2987, 1663, 357, -2987, -2987, 2688, -2987, - -2987, -2987, -2987, -2987, 196, -2987, -2987, -2987, 1520, 899, - -2987, -2987, -2987, 1520, 1776, 24685, 2361, -2987, 2430, -2987, - -2987, -2987, -2987, -2987, -2987, -2987 + 6375, 351, 1052, -3059, -3059, 657, 351, 50036, 64871, 293, + 351, 181, 3103, 52016, -3059, -3059, 46571, 4517, 351, 54986, + 72207, 328, 274, 31911, 355, 55481, 55481, -3059, -3059, -3059, + 64871, 54986, 55976, 351, 358, 65366, -3059, 351, 34386, 52511, + 198, -3059, 54986, 65, 257, 56471, 54986, 4726, 600, 263, + -3059, -3059, -3059, -3059, -3059, 178, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, 150, -3059, 189, 154, 31911, 31911, 1366, 118, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 442, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + 33891, -3059, -3059, -3059, -3059, -3059, -3059, 56966, 54986, 57461, + 53006, 57956, -3059, 645, 965, -3059, 165, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 170, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 481, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, 183, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 376, -3059, 516, -3059, + 195, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + 1178, -3059, -3059, 957, 3143, 54986, 432, 665, 718, -3059, + 58451, -3059, 725, 54986, -3059, -3059, 731, 774, 916, -3059, + -3059, 53501, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 47066, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, 877, -3059, -3059, + 706, -3059, 194, -3059, -3059, 729, 686, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 787, -3059, -3059, -3059, + 789, 65861, 58946, 59441, -3059, 667, 2978, 6731, 72225, 30919, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, 442, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, 55481, 64871, 55481, 709, 723, 1076, 734, 32406, + 737, 34882, 753, 769, 1117, 776, 778, 785, 796, 257, + 31415, 807, 376, -3059, 59936, 59936, -26, 2686, -3059, 59936, + 60431, -3059, 822, -3059, 965, -3059, -3059, -3059, 1157, -3059, + -61, 816, -3059, 60926, 60926, 60926, 842, 1124, -3059, -3059, + -3059, 866, -3059, -3059, 1095, 20588, 20588, 66356, 66356, 965, + 66356, 876, -3059, -3059, 91, -3059, -3059, -3059, 1366, 882, + 376, -3059, -3059, 52511, -3059, -3059, 237, 1219, 20588, 54986, + 884, -3059, 886, 884, 892, 906, 913, -3059, 6375, 1264, + 1145, 52511, 364, 364, 1386, 364, 212, 587, 4710, 2869, + -3059, 887, -3059, 944, -3059, 54986, 1048, 974, 1244, -3059, + 882, 1329, 1242, 1133, 1338, 5360, 1346, 1336, 1375, 1623, + 1382, 1523, 20588, 47561, 376, -3059, 11731, 20588, -3059, -3059, + -3059, 1149, -3059, -3059, -3059, -3059, -3059, 54986, 64871, 1072, + 1075, -3059, -3059, -3059, -3059, 1022, 1317, -3059, 1558, 66851, + -3059, -3059, 1160, 61421, 61916, 62411, 62906, 1514, -3059, -3059, + 1490, -3059, -3059, -3059, 1167, -3059, -3059, -3059, 176, 67346, + 1500, 1154, 110, -3059, 1509, 172, -3059, 1522, 1409, 15378, + -3059, 1353, -3059, -3059, -3059, 257, -3059, 403, -3059, -3059, + 43428, -3059, -3059, 72225, 1281, 1207, -3059, 1556, 20588, 20588, + 1221, 5787, 59936, 60431, 20588, 54986, -3059, 20588, 25277, 1235, + 20588, 20588, 12773, 20588, 29929, 59936, 2686, 1248, -3059, 582, + 54986, 1243, -3059, 1347, 1347, 358, 31911, 1548, -3059, 375, + 1545, 1479, -3059, 31911, 1479, 977, 1269, 1562, 1479, -3059, + 253, 1567, 1347, 35377, 1282, -3059, 1347, 1516, -3059, -3059, + 55481, 20588, 15378, 69821, 1776, -3059, -3059, -3059, -3059, 1585, + 64871, 1308, -3059, -3059, -3059, -3059, -3059, -3059, 615, 1818, + 158, 1819, 20588, 158, 158, 1311, 196, 196, -3059, 1503, + 1314, -3059, 200, 1315, 1316, 1827, 1831, 180, 134, 871, + 158, 20588, -3059, 196, 1326, 1839, 1334, 1846, 138, 173, + -3059, 201, 20588, 20588, 20588, 1704, 20588, 10689, -3059, 54986, + 1844, 47561, 545, -3059, 376, 1341, 965, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, 1356, -3059, 185, 7003, -3059, -3059, + -3059, -3059, -3059, -3059, 1377, -3059, -3059, -3059, -3059, 1559, + 20588, -3059, -3059, 1343, 1548, -3059, 202, -3059, -3059, 1548, + -3059, -3059, -3059, -3059, -3059, 217, 1768, 20588, 20588, 64871, + 376, 67841, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 628, + -3059, 442, 45116, 1355, 1359, 884, 54986, 54986, 1835, -3059, + -3059, -3059, -3059, 52511, 159, 1657, 1491, -3059, -3059, 1366, + 1366, 15899, 1027, 220, 70, 16420, 21109, 1713, 1592, 225, + 586, 1715, -3059, 1598, 1825, 25277, 20588, 20588, 212, 587, + 20588, 886, -3059, -3059, -3059, 1651, 54986, 50531, 482, 553, + 1371, 1461, 1378, 29, 1798, -3059, 1376, -3059, 1465, 54986, + 71756, 244, -3059, 1855, 244, 244, 235, 1856, 1493, 261, + 1659, 630, -32, 1376, 2912, -3059, 52511, 156, 643, 1376, + 54986, 1494, 688, 1376, 1820, 64871, 1207, 41015, 1403, -3059, + -3059, -3059, 147, 15378, -3059, 1292, 1339, 1364, 367, 184, + 1400, 1542, 15378, 1602, 1650, 163, 1652, 1663, 1671, 1679, + 1683, 1687, 1703, 1705, 144, 1710, 1712, 1716, 1718, 1720, + 1724, -3059, 1728, 169, 1730, 199, 15378, 1733, -3059, 45116, + 8, -3059, -3059, 1738, 182, -3059, 45205, -3059, 1708, 1505, + 1506, 64871, 1455, 54986, 1560, 823, 1783, 1836, 70301, 1664, + -3059, 1741, 54986, 1666, 2912, 1667, 1429, 1904, 1672, 1075, + 1674, 1431, -3059, 68336, 47561, -3059, -3059, -3059, -3059, -3059, + 1797, 1780, 64871, 47561, 1437, -3059, -3059, 64871, -3059, 54986, + 54986, -3059, 54986, 64871, -3059, 644, 45116, 1941, 865, 72225, + 49046, -3059, -3059, -3059, -3059, 428, 951, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 965, 47561, -3059, 2564, + 55481, 44046, 1444, 20588, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, 1449, 1801, -3059, -3059, 6587, 1453, 44086, 1454, + 25277, 25277, 376, 530, -3059, -3059, 25277, 1460, 49541, 43959, + 1463, 1467, 44434, 16941, 20588, 16941, 16941, 44521, -3059, 1471, + 44598, 59936, 1473, 54986, 53996, -3059, -3059, -3059, 20588, 20588, + 2686, 54491, 1515, 31911, -3059, 31911, -3059, 1765, 31911, -3059, + -3059, 2074, -3059, 31911, 1766, 20588, 31911, -3059, 31911, 1714, + 1717, 1477, 31911, -3059, 54986, 1482, 54986, -3059, -3059, -3059, + -3059, -3059, 45116, -3059, 1481, 690, 1485, -3059, -3059, -3059, + -3059, -3059, 1534, -3059, 1534, 1534, -3059, -3059, -3059, -3059, + 1492, 1492, 1497, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 1498, 871, -3059, 1534, + -3059, 1492, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 71756, + -3059, -3059, -3059, -3059, -50, 501, -3059, 1501, -3059, -3059, + 1507, -3059, 1489, 1978, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, 5696, 699, 1492, -3059, -3059, 5470, -3059, + -3059, 20588, 20588, -3059, -3059, 1508, 45116, 1547, -3059, -3059, + 20588, 20588, -3059, -3059, -3059, -3059, 2011, -3059, 20588, 1534, + 1534, -3059, 45587, -3059, 39834, 17462, 1597, 1599, 2011, -3059, + 2011, -3059, 45587, 2015, 2015, 37852, -3059, 1675, 44685, -3059, + 1518, 2122, 7670, 1510, 1511, -3059, 1519, 1513, -3059, -3059, + 41943, 166, 376, 376, 20588, -3059, 2011, 20588, 8642, 8642, + -3059, 295, 69821, 20588, 20588, 20588, 20588, 20588, 20588, 20588, + 20588, 46076, 1606, 127, 64871, 20588, 20588, 1524, 858, -3059, + 20588, 1754, -3059, 1525, 20588, 1608, 312, 20588, 20588, 20588, + 20588, 20588, 20588, 20588, 20588, 20588, -3059, -3059, 28924, 344, + 550, 1860, 1879, 46, 291, 20588, 1871, 11731, -3059, 1871, + -3059, -3059, -3059, -3059, -3059, 204, -3059, -3059, 1481, 1481, + -3059, 64871, -3059, 54986, 237, 51521, 20588, -3059, -3059, 1527, + 1531, 485, 1594, -3059, -3059, 54986, 38347, 1833, -3059, 350, + 1533, -3059, 43920, 1790, 1833, 1366, -3059, -3059, 26319, 1673, + 1830, 1770, -3059, -3059, 1749, 1751, -3059, 1546, 45338, 21630, + 21630, -3059, 646, 45116, 1293, -3059, -3059, -3059, -3059, -3059, + -3059, 733, -3059, 54986, 82, 35872, -3059, 1552, 111, -3059, + 3217, 1885, 1847, 1713, 586, 1557, -3059, -3059, 1781, 1563, + 68831, 54986, 1845, 1804, 1859, 308, 69821, -3059, -3059, -3059, + -3059, 54986, 64871, 63401, 69326, 48056, 54986, 47561, -3059, -3059, + -3059, -3059, 54986, 1218, 54986, 8381, -3059, -3059, -3059, -3059, + 244, -3059, -3059, -3059, -3059, -3059, 64871, 54986, -3059, -3059, + 244, 64871, 54986, 244, -3059, 1939, 54986, 54986, 54986, 54986, + 2069, 54986, 54986, 965, -3059, -3059, -3059, 22151, 24, 24, + 1786, 13294, 203, -3059, 20588, 20588, 306, 294, 64871, 1753, + -3059, -3059, 700, 1795, 103, -3059, 64871, 1621, 54986, 54986, + 54986, 54986, 54986, 2076, -3059, -3059, -3059, -3059, -3059, 1575, + -3059, 1940, 2090, 1582, 1586, 1947, -3059, 2912, 1951, 51026, + 698, 2699, 1952, 1630, 1956, 13815, 2072, 1840, -3059, -3059, + 1824, -3059, 64871, 2106, -3059, 110, -3059, 47561, -3059, 172, + -3059, 1829, 205, -3059, 15378, 20588, -3059, -3059, -3059, -3059, + -3059, -3059, 1207, 29430, -3059, 714, -3059, -3059, 2075, 965, + 2075, 565, -3059, -3059, 2075, -3059, 2060, 2075, -3059, -3059, + 69821, -3059, 7960, -3059, 20588, 20588, -3059, 20588, 1949, -3059, + 2110, 2110, 69821, 25277, 25277, 25277, 25277, 25277, 25277, 486, + 1326, 25277, 25277, 25277, 25277, 25277, 25277, 25277, 25277, 25277, + 26840, 301, -3059, -3059, 715, 2085, 20588, 20588, 1960, 1949, + 20588, -3059, 69821, 1613, -3059, 1614, 1617, 20588, -3059, 69821, + -3059, 54986, 1619, 9, -2, -3059, 1622, 1627, -3059, 1548, + -3059, 713, 775, 54986, 2465, 5151, 5636, -3059, -3059, 20588, + 1962, 2074, 2074, 31911, -3059, 20588, 1629, -3059, -3059, 31911, + 1979, -3059, 2074, -3059, -3059, 36367, 2074, 69821, 748, -3059, + 54986, 69821, 758, 20588, -3059, 15378, 2143, 69821, 2108, 64871, + 64871, 2145, 1637, 1639, 2011, 1725, -3059, 1727, 1729, 1731, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 69821, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 1643, 1647, + 20588, 20588, 80, -3059, 8114, 1646, 1653, 6163, -3059, 1644, + -3059, 1649, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 1655, + -3059, 1661, -3059, 1669, 1677, 1682, 1676, 1681, 54986, -3059, + 22672, -3059, 64871, -3059, -3059, 20588, 20588, 54986, -3059, 1704, + -3059, 1685, 1688, 8303, -3059, -3059, -3059, 153, 394, 45444, + 291, 3594, 3594, 3594, 45587, -3059, -3059, -3059, 1692, -3059, + 25277, 25277, -3059, 2523, 2753, 10689, -3059, -3059, 1995, -3059, + 891, -3059, 1658, -3059, -3059, 3090, -3059, 39834, 45547, 20588, + 179, -3059, 20588, 1524, 20588, 1762, 3594, 3594, 3594, 268, + 268, 153, 153, 153, 394, 291, -3059, -3059, -3059, 1668, + 20588, 47561, -3059, 1680, 1684, 2038, 1334, 20588, -3059, -3059, + 31911, 1515, 8, 1515, 2011, 8642, -3059, 886, -3059, 886, + -3059, 45116, 54986, -3059, -3059, 1953, 1690, 31911, 1732, 2167, + 2157, 64871, -3059, -3059, 1693, 1871, 1719, -3059, -3059, 1721, + 20588, 3753, 1721, -3059, 1833, -5, 1929, 998, 998, 646, + 1931, -3059, -3059, 1774, -3059, -3059, -3059, 20588, 14336, 1389, + -3059, 1407, -3059, -3059, -3059, -3059, -3059, 1699, -3059, 1986, + -3059, 54986, -3059, -3059, 25277, 2172, 20588, 36862, 2174, 1974, + -3059, -3059, -3059, 1812, 1376, 20588, 1971, -3059, 187, 1734, + 2097, 371, 2049, 64871, -3059, 318, 353, -3059, 978, 2100, + 205, 2105, 205, 47561, 47561, 47561, 760, -3059, -3059, -3059, + 965, -3059, 271, 762, -3059, -3059, -3059, -3059, 1834, 933, + 1376, 2912, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 222, + 948, 1376, 1842, -3059, 1849, -3059, 1851, 1015, 1376, -3059, + -3059, 1523, 9124, 45116, 336, 203, 203, 203, 15378, -3059, + 1982, 1983, 1758, 45116, 45116, 142, -3059, -3059, -3059, -3059, + 1760, -3059, 236, -3059, 64871, -3059, -3059, -3059, 1753, 1836, + 1741, 54986, 2912, 1767, 2236, 1075, 1431, -3059, 1928, 901, + 1678, -3059, 64871, -3059, 47561, 64871, 54986, 54986, 54986, 63896, + -3059, -3059, -3059, 1769, 1772, -3059, -11, 2004, 2005, 54986, + 1821, 54986, 1378, 2255, 54986, -3059, 766, 17983, 2144, 54986, + 1780, -3059, -3059, -3059, -3059, 64871, -3059, -3059, 45116, -3059, + -3059, 20588, 48551, -3059, -3059, -3059, -3059, -3059, -3059, 47561, + -3059, 965, -3059, 965, 2020, 64871, 42438, 965, 42933, 965, + 1785, -3059, 45116, 8353, 45116, 1960, -3059, 214, 2110, 1848, + 1848, 1848, 4127, 2130, 240, 1788, 1848, 1848, 1848, 282, + 282, 214, 214, 214, 2110, 301, 822, 49541, 1789, -3059, + 45116, 45116, -3059, -3059, 1794, -3059, -3059, -3059, -3059, 1802, + 1803, -3059, -3059, -3059, -3059, -3059, -3059, 64871, 1037, 1515, + 198, 198, 198, 198, -3059, 54986, 54986, 54986, 45116, 2245, + 2120, -3059, -3059, 2074, 45116, 54986, -3059, 27882, -3059, 54986, + -3059, 2153, -3059, 2240, -3059, 54986, 830, -3059, -3059, -3059, + 857, 1809, 1639, 69821, 873, 879, -3059, 2011, 136, 1807, + 1512, 1319, 750, 1413, -3059, -3059, -3059, 1808, 44820, 20588, + -3059, 2181, -3059, -3059, -3059, 20588, 20588, -3059, 39834, -3059, + -3059, -3059, -3059, -45, -45, 1811, 10689, 45042, -3059, 2139, + 8435, 45116, -3059, 1675, -3059, -3059, 8642, 20588, 1205, 1826, + 20588, 1823, 20588, 2169, -3059, -3059, 1832, -3059, -3059, 69821, + 20588, 1850, 5197, 25277, 25277, 6403, -3059, 7322, 20588, 10689, + -3059, 41101, 1817, 1852, 1786, 18504, -3059, 2047, 1843, -3059, + 1962, 203, 1962, 1854, -3059, -3059, -3059, -3059, 5470, -3059, + 20588, 1990, 64871, 518, 1927, 890, -3059, 376, 38347, 1732, + 20588, 252, -3059, -3059, 1857, -3059, 1721, -3059, -3059, -3059, + 2083, -3059, -3059, -3059, 54986, -3059, 1862, -3059, 35872, 2184, + 11210, -3059, 35872, 54986, 54986, 40337, 2223, -3059, 64871, 64871, + 64871, -3059, 64871, 1861, 1863, 653, 1866, 389, -3059, 1021, + 653, 2206, 296, 1378, 261, 1561, 521, -3059, -3059, -3059, + 1943, 54986, -3059, 64871, -3059, -3059, -3059, -3059, -3059, 48056, + -3059, -3059, 39338, 47561, -3059, 47561, 54986, 54986, 54986, 54986, + 54986, 54986, 54986, 54986, 54986, 54986, 1207, 20588, -3059, 20588, + 1868, 1869, 1874, 1786, -3059, -3059, -3059, 206, -3059, 1870, + -3059, -3059, -3059, -32, -3059, 236, 1877, 1878, -3059, 51026, + 3143, 1630, 2353, 1836, 850, 64376, -3059, 1882, 1876, 1741, + 897, 912, 2912, 1884, 2359, -3059, 698, 51026, -3059, -3059, + -3059, 2315, -3059, 667, 232, -3059, 1075, -3059, 3143, 1431, + -3059, 3143, 45116, 64871, 1948, -3059, 205, 922, -3059, -3059, + -3059, -3059, -3059, 64871, 1886, -3059, 1886, -3059, -3059, 1886, + -3059, -3059, -3059, -3059, 25277, 2234, 1892, 69821, -3059, -3059, + 54986, -3059, -3059, -3059, 942, 1894, 1962, 54986, 54986, 54986, + 54986, -3059, -3059, -3059, 19025, 20588, 1932, -3059, 1895, 12252, + 2213, -3059, 27361, -3059, -3059, 1899, 36367, 64871, -3059, -3059, + -3059, -3059, 2011, -3059, -3059, 64871, -3059, 1902, -3059, 1903, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 20588, + 45116, -3059, 45116, -3059, -3059, -3059, -3059, -3059, 7369, -3059, + 1907, 1905, 64871, 20588, -3059, -3059, -3059, 747, 20588, 20588, + 2523, -3059, 6937, 20588, 69821, 962, 2523, 347, 20588, 2239, + 3853, 20588, 20588, 7350, 40376, -3059, 23193, 14857, -3059, 1906, + 20588, 40415, 38842, -3059, 31911, 2120, 1911, 2120, 965, 1913, + 45116, 20588, -3059, -3059, -3059, -3059, 1969, 349, 33396, 2142, + -3059, 1930, 64871, -3059, 1990, 45116, -3059, -3059, 39834, -3059, + -3059, -3059, -3059, -3059, 2373, 2635, 1923, 1924, -3059, 1340, + -3059, -3059, 64871, 1925, -3059, 1935, 653, -3059, 64871, 1968, + -3059, 272, 2241, 113, -3059, 20588, -3059, 2330, 2411, 1021, + 1942, 64871, 54986, 25277, -3059, 625, 243, -3059, 2227, 54986, + 1968, 2369, -3059, -3059, -3059, 389, -3059, 2268, 2185, -3059, + 244, -3059, 20588, 389, 2188, 137, 64871, -3059, -3059, 2738, + -3059, 69821, 205, 205, -3059, 1485, 1954, 1955, 1958, 1959, + 1961, 1965, 1967, 1972, 1973, 1976, -3059, 1988, 1989, 1992, + 1993, 1994, 1997, 1998, 1999, 1498, 2000, -3059, 2001, 1857, + 2006, 2013, 2016, 2019, 2021, 70781, 2026, 2028, 2031, 2033, + 1501, 2034, 428, 951, -3059, -3059, -3059, -3059, -3059, -3059, + 1154, 2035, -3059, 1975, -3059, -3059, -3059, 2044, -3059, 2056, + -3059, -3059, -3059, -3059, -3059, -3059, 1981, 2007, -3059, -3059, + -3059, 203, 1970, 1984, 64871, 1207, 151, 47561, 64871, 2037, + 1821, 2496, 19546, 1159, 2279, 2041, -3059, 965, 2053, -3059, + 1630, -3059, 51026, 3125, 669, 2005, -3059, 208, 1821, -3059, + 2451, 1630, 2094, 2521, -3059, 2282, 64871, 2059, -3059, -3059, + 48551, 1886, 4313, 25277, 69821, 964, 970, -3059, 2568, 2231, + 2120, -3059, -3059, -3059, -3059, -3059, 2064, -25, 2078, 10168, + 2065, -3059, -3059, -3059, -3059, -3059, -3059, 45116, 45116, 64871, + 2251, -3059, -3059, 2071, 2081, 37357, 2531, 2082, -3059, -3059, + 2395, -3059, 30424, -3059, 1639, 2086, 1639, 69821, 1639, -3059, + -3059, 45116, 20588, -3059, -3059, 41369, 2407, 2523, 2523, 6937, + 987, -3059, 2523, 20588, 20588, 2523, 2523, 20588, -3059, 9646, + 409, -3059, 995, -3059, 40462, -3059, 71261, -3059, -3059, 1932, + 965, 1932, -3059, -3059, 2089, -3059, -3059, -3059, 2141, -3059, + -3059, 1049, 2510, 1990, 20588, -3059, -3059, 2096, 35872, -3059, + -3059, -3059, -3059, 35872, 653, -3059, 2260, 1968, 2095, -3059, + -3059, -3059, -3059, -3059, -3059, 40501, -3059, 52, 20588, -3059, + 1046, 4127, -3059, -3059, -3059, -3059, 1968, 1075, -3059, 54986, + 2573, 2463, -3059, -3059, 45116, -3059, -3059, 2011, 2011, -3059, + -3059, 2240, -3059, -3059, 2101, -3059, -3059, 1154, 512, 39338, + 54986, 54986, -3059, -3059, 2103, -3059, -3059, -3059, -3059, -3059, + -32, 2497, 1064, 1065, 698, -3059, 3143, 3143, 45116, 54986, + 2471, 51026, -3059, 47561, 2587, 2113, 54986, 1821, 1137, 1137, + -3059, 2263, -3059, 2266, -3059, -3059, 2595, 276, -3059, 20067, + 54986, -3059, -3059, 32901, -3059, 4313, 1070, -3059, -3059, 2124, + 2126, -3059, 1932, 20588, 2127, 20588, -3059, 23714, 2602, 2125, + -3059, 20588, 2190, 28403, -3059, 20588, -3059, 54986, 59936, 2132, + 59936, -3059, -3059, -3059, -3059, -3059, 20588, -3059, 2523, 2523, + 2523, 20588, -3059, 20588, -3059, -3059, -3059, 2338, 2251, -3059, + 2251, 20588, 3143, 376, 2620, 64871, 20, -3059, 45116, -3059, + -3059, -3059, 54986, -3059, 47561, -3059, 653, 326, 2134, 20588, + 40851, 2372, -3059, -3059, 2405, -3059, 2464, -3059, 2201, 573, + 2222, -3059, -3059, -3059, -3059, 1207, 965, -3059, 1630, 2005, + 2094, -3059, 2148, 54986, 1084, 3143, 698, 667, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, 3143, 2596, 2377, 2597, 3143, 45116, 1948, 20588, 79, + -3059, 1128, 2592, -3059, -3059, 2664, 2251, 2159, 23714, 2160, + -3059, 2162, 64871, 45116, 2309, -3059, -3059, 2166, -3059, -3059, + 20588, -3059, 41451, 2171, 2175, 2626, 1786, 2190, 2190, -3059, + 349, -3059, -3059, 2586, 32901, 2556, 1075, 653, 2187, 1136, + -3059, -3059, -3059, -3059, -3059, 2912, -3059, 40937, 2419, 122, + 2403, 2134, 20588, -3059, 2256, -3059, -3059, -3059, 2654, -3059, + -3059, 51026, 2182, -3059, 2094, 2005, 1821, 2094, 2406, -3059, + 2409, -3059, 2189, 40976, 64871, 64871, 1630, 32901, 64871, 2191, + 2190, -3059, 2192, -3059, -3059, -3059, 53996, -3059, 2193, -3059, + -3059, -3059, 20588, 135, -3059, -3059, 2252, 54986, 1138, 51, + 2405, 39338, -3059, 47561, 174, 326, 2500, -3059, -3059, -3059, + -3059, 209, 2421, -3059, 2423, -3059, 45116, -3059, 3143, 51026, + -3059, -3059, -3059, -3059, -3059, -3059, 32901, 2592, -3059, 350, + -3059, 1515, -3059, 350, -3059, -3059, -3059, -3059, -3059, 1463, + 24235, 24235, 24235, 2198, 3143, -3059, 1515, -3059, 2328, 2403, + -3059, -3059, -3059, -3059, -3059, 457, 457, 2598, -3059, 2273, + -3059, 2094, 1142, 64871, 1721, -3059, 1721, 25798, 2354, 238, + 43998, 2578, -3059, 2578, 2578, -3059, -3059, -3059, 38347, -3059, + -3059, 2702, -3059, 227, -3059, -3059, -3059, 1630, 350, -3059, + -3059, 2693, -3059, -3059, -3059, -3059, -3059, 343, -3059, -3059, + -3059, 1515, 653, -3059, -3059, -3059, 1515, 1721, 24756, 2365, + -3059, 2435, -3059, -3059, -3059, -3059, -3059, -3059, -3059 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -2987, -2987, -2987, 1875, 79, -2987, -2987, 146, -2987, 982, - -2987, 145, -814, 520, -2987, 86, 3842, 2546, 3549, 66, - -510, -886, -1210, 28, 87, -1138, 4, -2987, -2987, -2987, - -2987, -2987, -494, 211, -2987, -2987, -634, -2547, -583, -2987, - -2913, -2986, -2987, -2987, -727, -2954, -2059, 89, -2987, -2987, - 93, 1, -2096, -2987, -1645, 42, -2092, 94, 892, -2987, - -2555, 98, -883, -1185, -944, -1191, -2987, -123, -2987, 421, - 105, 1560, -2987, 11, -2163, -2858, -597, -2987, -701, -2987, - -353, -2987, -647, -2987, -929, -654, -686, -2783, -1130, -2987, - 1579, -400, -2987, 557, -2987, -2560, -2987, -2987, 551, -2987, - -1165, -2987, -2207, 115, -630, -2562, -2509, -2166, -885, 203, - -636, 179, -2079, -1212, -2987, 568, -2987, -615, -2987, -891, - -2026, 108, -2987, -2987, 1472, -947, -2987, 110, 1510, -2103, - 7, 10, -2987, -2987, -2987, -2987, -2987, -687, 500, -1211, - -2987, 451, -2987, -2987, -2987, -2987, -189, 169, -2252, 2, - 306, -44, -32, -2987, -25, -2987, -2987, -2987, 606, -2987, - -2987, 21, 29, 1657, -2987, -1033, -2987, -1587, 590, -2987, - 1809, 1810, -2136, -858, -68, -2987, 641, -1661, -2094, -643, - 1086, 1639, 1643, 406, -2325, -2987, -569, -2987, -62, -2987, - -2987, 639, 1129, -1560, -1556, -2987, -2175, -2987, -488, -375, - -2987, -2987, -2987, -2987, -2987, -2453, -2798, -642, 1099, -2987, - 1658, -2987, -2987, -2987, -2987, 43, -1510, 2811, 679, -48, - -2987, -2987, -2987, -2987, 107, -2987, 869, -200, -2987, 2046, - -696, -784, 1893, -153, 143, -1739, 41, 2059, 455, -2987, - -2987, 457, -2085, -1407, 409, -284, 866, -2987, -2987, -1221, - -2987, -1880, -1160, -2987, -2987, -673, 1107, -2987, -2987, -2987, - 1933, 2214, -2987, -2987, 2951, 3055, -2987, -896, 3102, 993, - -1029, 1896, -934, 1898, -930, -928, -933, 1902, 1903, 1904, - 1906, 1910, 1911, -1511, 4396, 2674, 2508, -2183, -2987, -2180, - 989, 55, -2987, -1374, 242, -2987, -2987, -2987, -2987, -2662, - -2987, -462, -2987, -456, -2987, -2987, -2987, -1622, -2703, -1652, - -2987, 2157, 797, -2987, -2987, 392, -2987, -2987, -2987, -2987, - -1527, -2987, 5650, 694, -2987, -2024, -2987, -2987, -970, -829, - -733, -999, -1208, -1916, -2987, -2987, -2987, -2987, -2987, -2987, - -1114, -1767, -161, 754, -2987, -2987, 849, -2987, -2987, -2987, - -1722, -2097, -2987, -2987, -2987, 759, 1436, 82, -822, -1600, - -2987, 812, -2357, -2987, -2987, 403, -2987, -620, -1119, -2424, - 2029, 77, -2987, -779, -2510, -2987, -2987, -702, -2617, -1134, - -894, -2987, 111, -2987, 360, 120, -1658, -2987, 14, -2987, - -408, -2987, -2987, -2575, -2987, 123, 124, 2114, -2987, 1092, - -2987, -2987, -2987, -2987, -575, -2987, -632, -628, -2987, -2987, - 18, -898, 1565, -2987, 125, 436, -2987, 917, -2987, 702, - 128, 80, 1546, 129, 1228, -2987, -2987, -2987, 17, -603, - 361, -2987, 1232, -2987, -2987, 1683, 643, 133, -2987, 302, - 22, -2987, -2987, -2987, 97, 2808, 134, 15, -2927, 136, - -2755, -1592, -7, -2987, -2987, -2987, -730, -2987, -2505 + -3059, -3059, -3059, 1865, 73, -3059, -3059, 139, -3059, 973, + -3059, 146, -787, 509, -3059, 77, 1252, 2549, 3668, 2713, + -515, -876, -1226, 1, 81, -1140, 3, -3059, -3059, -3059, + -3059, -3059, -502, 210, -3059, -3059, -634, -2561, -584, -3059, + -2881, -3004, -3059, -3059, -731, -2965, -2068, 86, -3059, -3059, + 88, 11, -2084, -3059, -1601, 36, -2072, 89, 898, -3059, + -2570, 90, -889, -1193, -933, -1200, -3059, -122, -3059, 425, + 96, 1228, -3059, 12, -2165, -2872, -594, -3059, -696, -3059, + -347, -3059, -641, -3059, -1047, -645, -679, -2818, -1139, -3059, + 1589, -396, -3059, 567, -3059, -2540, -3059, -3059, 558, -3059, + -1154, -3059, -2186, 140, -618, -2582, -2531, -2156, -912, 215, + -617, 193, -2122, -1331, -3059, 584, -3059, -600, -3059, -893, + -2019, 98, -3059, -3059, 1495, -909, -3059, 99, 1517, -2083, + 10, 22, -3059, -3059, -3059, -3059, -3059, -828, 513, -1206, + -3059, 454, -3059, -3059, -3059, -3059, -185, 171, -2234, 2, + 323, -43, -22, -3059, -16, -3059, -3059, -3059, 614, -3059, + -3059, 21, 32, 1665, -3059, -1020, -3059, -1587, 383, -3059, + 1814, 1841, -2144, -863, -66, -3059, 652, -1659, -2130, -629, + 1090, 1656, 1648, 407, -2525, -3059, -568, -3059, -88, -3059, + -3059, 647, 1132, -1544, -1559, -3059, -2203, -3059, -487, -375, + -3059, -3059, -3059, -3059, -3059, -2483, -2836, -620, 1103, -3059, + 1660, -3059, -3059, -3059, -3059, 61, -1497, 2814, 682, 41, + -3059, -3059, -3059, -3059, 108, -3059, 863, -195, -3059, 2054, + -675, -796, 1880, 34, 93, -1745, 31, 2068, 452, -3059, + -3059, 463, -2087, -1408, 408, -281, 872, -3059, -3059, -1246, + -3059, -1833, -1172, -3059, -3059, -806, 510, -3059, -3059, -3059, + 1645, 2152, -3059, -3059, 2178, 2764, -3059, -862, 2970, -781, + -1031, 1883, -924, 1887, -930, -946, -937, 1888, 1890, 1893, + 1896, 1897, 1898, -1534, 4692, 2325, 2519, -2179, -3059, -2178, + 993, 1003, 16, -3059, -1387, 128, -3059, -3059, -3059, -3059, + -2600, -3059, -442, -3059, -439, -3059, -3059, -3059, -1649, -3058, + -1674, -3059, 2641, 818, -3059, -3059, 410, -3059, -3059, -3059, + -3059, -1509, -3059, 5718, 712, -3059, -2024, -3059, -3059, -965, + -831, -638, -983, -1197, -1921, -3059, -3059, -3059, -3059, -3059, + -3059, -1488, -1772, -326, 777, -3059, -3059, 867, -3059, -3059, + -3059, -1703, -2098, -3059, -3059, -3059, 781, 1448, 84, -830, + -1621, -3059, 819, -2352, -3059, -3059, 399, -3059, -627, -1138, + -2428, 2164, 104, -3059, -925, -2536, -3059, -3059, -721, -2648, + -1131, -888, -3059, 100, -3059, 359, 105, -1650, -3059, 14, + -3059, -411, -3059, -3059, -2566, -3059, 106, 114, 2116, -3059, + 1094, -3059, -3059, -3059, -3059, -588, -3059, -635, -621, -3059, + -3059, 30, -898, 1564, -3059, 119, 372, -3059, 919, -3059, + 681, 120, 69, 1543, 121, 1231, -3059, -3059, -3059, 26, + -626, 363, -3059, 1240, -3059, -3059, 1694, 651, 124, -3059, + 43, 47, -3059, -3059, -3059, 72, 2816, 125, 15, -2904, + 129, -2759, -1672, -7, -3059, -3059, -3059, -713, -3059, -2530 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -2044 +#define YYTABLE_NINF -2046 static const yytype_int16 yytable[] = { - 520, 58, 70, 865, 54, 877, 904, 68, 1330, 714, - 69, 65, 1223, 1123, 82, 102, 520, 93, 1240, 972, - 1419, 77, 98, 1187, 1794, 1022, 1347, 878, 879, 1153, - 2171, 1747, 1783, 1474, 1294, 1291, 1782, 1679, 772, 953, - 847, 77, 778, 1924, 713, 881, 2049, 1390, 1394, 1766, - 1580, 1392, 882, 1393, 2138, 2527, 1735, 2529, 1981, 740, - 1753, 2657, 517, 2587, 2544, 1336, 805, 1799, 520, 520, - 2447, 1757, 1353, 2968, 2273, 863, 1829, 2554, 811, 51, - 851, 1222, 2508, 1228, 518, 1232, 52, 53, 1787, 56, - 1655, 817, 817, 57, 60, 1658, 2073, 2074, 61, 2937, - 518, 2543, 889, 2982, 2939, 63, 819, 2449, 66, 1004, - 67, 80, 1855, 1240, 1025, 2985, 963, 1592, 805, 805, - 81, 966, 955, 83, 84, 90, 2766, 2641, 91, 92, - 811, 811, 844, 97, 101, -1322, 103, 2966, 2627, 2628, - 2629, 2830, -1244, 2580, -511, 2835, -849, -515, 2142, 2191, - 1361, 897, 518, 518, -1891, 2194, 2298, 1557, 1558, 1901, - 2399, -857, -2031, -2031, 1903, -1263, -2017, -2017, -1891, -1263, - 2299, 3381, -854, -1882, 1570, -1899, -854, -1260, -1260, -1264, - 901, -2022, -2022, -2040, -2040, 815, -1882, -1261, -1261, 1046, - 1663, 1349, -857, -1899, -1264, -816, 1340, 973, 1403, 3177, - -829, 1046, 2649, 1046, -844, 2645, 855, 2643, 1135, 815, - 815, 1196, 3162, 2636, 3110, 815, 2088, 1197, 2088, -2042, - -2042, 2428, 2429, 1659, 1340, 815, 2303, 532, 1142, 1046, - 3181, 1046, 2435, 1176, 1179, 2658, 2439, -466, 1324, 3487, - 972, 1901, 1209, 1797, -511, 1902, 1903, -515, 869, 3462, - 1611, 2730, 1798, 1240, 2731, 1613, 1443, 1588, 2857, 3, - 4, 944, 1210, 872, 1610, 813, 1767, 1611, 1165, 1770, - 1771, 1612, 1613, 3255, 3093, 1324, -227, 2466, 815, 1749, - 1749, -227, 2204, 2691, 2693, 1621, 2696, 1025, 3268, 3340, - 1785, 2615, 999, 1611, 874, -648, 2665, 1612, 1613, 1004, - 3516, 2860, 1621, 874, 1324, 3125, 71, 1901, 1211, -2044, - 2409, 1902, 1903, 1941, 1738, 3454, 2986, 813, 813, 1623, - 3145, 2583, 1198, 2279, -1102, 1758, 71, 1608, 1621, 804, - 2959, 2713, -1102, 873, 1682, 3447, 1623, 1660, 870, 2135, - 1139, 1354, 3500, 533, 71, 2380, 1941, 2702, 3511, 3076, - 3367, 3078, 2802, 864, 2804, 1349, 2197, 1772, 1987, 3201, - 1734, 530, 1623, 1730, 1731, 3121, 2422, 2423, 2424, 1005, - 833, 2295, 2844, 1166, -786, 783, 3517, 2125, -1123, 1172, - 3415, 804, 804, 880, 1562, 2126, -1123, 3405, 1172, 852, - 2075, 1011, 2803, 112, 3175, 1143, 3385, 1144, 2166, 3440, - 1572, 2497, 3171, 1212, -2016, -2016, 71, 2519, 1741, 2221, - 2823, 874, 3144, 3183, 3235, 2843, 3237, 104, 3348, 3285, - 3299, 1801, 1315, 1842, 1568, 1569, 3178, 1012, 1575, 3107, - 3300, 1349, -2044, -511, 1349, 1349, -515, 3334, 1499, 3335, - 921, 3179, 922, 1444, 3427, 3176, 1294, 3430, 3488, -2044, - 1576, 2761, 1213, 1014, -2044, 1174, 2584, 782, 3258, 2826, - 1661, 1316, 1214, 2864, 1174, 1136, 105, 3286, 3518, 2222, - 3172, 2198, 834, 2992, 1215, 1167, 113, 2824, 1199, 3469, - 3349, 2987, 3083, 2167, 3495, -668, 2280, 2381, 2136, 3448, - 814, 3455, -2044, 3366, 1683, 1580, 2580, 2382, 2580, 2703, - 3501, 1773, -511, 3108, 1175, -515, 1216, 2410, 1006, -786, - 3512, 1774, 2865, 784, 3341, 3387, 3416, 1800, 3449, 1574, - 3084, 3470, 3287, 1756, 2225, 3122, 1984, 3266, 2866, 1759, - 858, 3288, 1325, 3489, 3119, 1200, 919, 3313, 3007, 1201, - 1137, 3493, 3250, 3244, 1732, 1733, 2730, 1632, 856, 2731, - 3457, 3111, 2287, 1040, 3199, 3289, 2205, 980, 1218, 1681, - 875, 3260, 3490, 2978, 2975, 1868, 1870, 3156, 1743, 1325, - 945, 1202, 2443, 2990, 2216, 1674, 867, 871, 3463, 2049, - 1018, 714, 1600, 1219, 2089, 1196, 2510, 1557, 1558, 3428, - 2782, 1197, 2278, 2960, 1933, 1756, 3301, 3256, 1325, 1445, - 3417, 3276, 1221, 902, 1553, 2700, 1758, 903, 3120, 972, - 2020, 2998, 1570, 2637, 2638, 1948, 941, 2191, 3429, 953, - -511, 3519, 2557, -515, 1857, 1786, 2616, 3290, 2296, 2867, - 1861, 3180, 1969, 2531, 1575, 2325, 2937, 2326, 2868, 1317, - 3291, 2939, 1203, 2552, 2811, 1783, 2342, -2044, 2650, 902, - 1695, -1244, -1322, 903, 2546, -849, 1576, 2141, 1918, -511, - 2348, -511, -515, -1891, -515, 1575, 2656, 1559, 2367, 1567, - 1577, 3247, 2031, 2032, -1263, 3101, 3248, -1891, -1263, 2641, - 2373, -854, -1882, 1567, -1899, 1744, 534, 1576, -1264, 1145, - -1102, 2724, 3221, 1326, 1606, -1882, 1198, 1344, 1345, 2812, - 3365, 1579, -1899, -1264, 1560, 865, 1865, 2745, 1858, 1565, - 2401, 966, 3159, -844, 1240, 2069, 1240, 2406, 1656, 2143, - 993, 2017, 1588, 3372, 2661, 1344, 1345, 3134, 3135, 3373, - 1329, 1588, 1781, 1777, 1939, 1913, 1914, 1915, 1916, 1917, - 1918, 868, 971, 2127, -1123, 2052, 1458, 2221, 1777, 1644, - 1378, 1379, 996, 1318, -2044, 2440, 865, 1778, 1696, 2440, - 3092, 1639, 1640, 1641, 1642, 1643, 1644, 968, 2873, 77, - 778, 3498, 1778, 1698, 2070, 884, 2278, -227, -227, 2591, - 1611, 2588, 520, 2372, 1611, 2853, 2025, 2461, 3002, 1641, - 1642, 1643, 1644, 520, 536, 2153, 1692, 1459, 2055, 1338, - 2056, 3094, 1339, 1915, 1916, 1917, 1918, 2577, 3438, 2886, - 1759, 2854, 3523, 1188, 2400, 1621, 881, 1562, 2018, 1699, - 2154, 2407, 3151, 882, 815, 2251, 2071, 2024, 520, 520, - 2714, 2715, 2716, 2717, 2609, 2254, 883, 1572, 2257, 3292, - 71, 2874, 3293, 995, 811, 2335, 3127, 2610, 975, 1623, - 817, 520, 1199, 1623, 3132, 811, 1446, 537, 3041, 2966, - 2407, 3043, 1453, 3045, 977, 3057, 518, 1382, 1383, 58, - 70, 2009, 54, 2411, 1146, 68, 1756, 518, 69, 65, - 1029, 2250, 82, 102, 3267, 93, 3160, 900, 1154, 77, - 98, 1856, 2589, 902, 1140, 520, 714, 903, 2937, 1283, - 520, 1600, 2953, 2939, 2954, 1132, 815, 2341, 23, 1226, - -1891, 2343, 1140, 1201, 2345, 2416, 906, 3172, 3281, 3513, - 2520, 2091, 1031, 2213, 107, 2875, 918, 2412, 2351, 2190, - 2190, 2308, 925, 1032, 844, 844, 1701, 844, 2482, 2274, - 2275, 2276, 1436, 3253, 536, 1227, 2361, 51, 2049, 2109, - 2249, 2362, 1283, 1443, 52, 53, 1672, 56, 1439, 1673, - 1462, 57, 60, 971, 1466, 1450, 61, 1293, -208, 1336, - 2260, 520, 520, 63, 2354, 2267, 66, 520, 67, 80, - 520, 520, 2773, 520, 520, 520, 520, 1292, 81, 3240, - 1349, 83, 84, 90, 77, 778, 91, 92, 1702, 520, - 1349, 97, 101, 1349, 103, 1758, 520, 537, 2363, 3401, - 3402, 1196, 2532, 2097, 2533, 929, 1203, 1197, 2847, 1749, - 1924, 946, 1196, 1749, 520, 1283, 1545, 943, 1197, 930, - 1750, 813, 1758, 2097, 1752, 2625, 1346, 541, 930, 962, - 2098, 1862, 813, 865, 1863, 520, 2626, 1388, 1199, 805, - 1758, 27, 28, 29, 71, 864, 805, 937, 1758, 1783, - 2098, 811, 3442, 3229, 520, 545, 942, 1758, 811, 2630, - 2413, 3067, 2110, 2252, 3230, 520, 520, 520, 2255, 520, - 520, 2563, 2552, 518, 714, 3193, 2500, 3344, 1011, 2111, - 518, 947, 108, 1349, 2112, 982, 1469, 2225, 1209, 1575, - 902, 931, -1244, 109, 903, 2848, 994, 2405, 1196, 2590, - 931, 2591, 520, 2501, 1197, 923, 34, 924, 1210, 1598, - 2617, 1576, 1198, 1575, 1012, 1035, 1036, 1037, 1196, 520, - 520, 1788, 2113, 1198, 1197, 1577, 1686, 1687, 110, 1693, - 1452, 2592, 972, 882, 882, 1576, 882, 1867, 1983, 3361, - 1014, 1984, 1046, 39, 880, 2099, 1856, 1451, 1791, 1579, - 2100, 1456, 1604, 520, 1211, 2101, 1592, 520, 520, -2013, - -2013, 2849, 1607, 2850, 71, 2099, 2614, 520, 520, 520, - 2284, 1551, 520, 47, 2618, 2101, 41, 541, 111, 962, - 2464, 1657, 2360, 2622, 948, 2666, 2364, 44, 932, 2366, - 1662, 2674, 1545, 1140, 902, 1869, 2555, 1816, 1599, 1759, - 1046, 1046, 949, 1045, 2456, 545, 1901, 1172, 959, 1198, - 1902, 1903, 1173, 1611, 1904, 1905, 1906, 1612, 1613, 2740, - 2417, 978, 2418, 2502, 1196, 1283, 1759, 933, 2503, 1198, - 1197, 2775, 1942, 979, 1283, -592, 1817, 1943, 813, 980, - -592, 47, 2129, 981, 1759, 813, 2130, 2007, 1621, 1212, - 2008, 1932, 1759, 1934, 1935, 2498, 1784, 2419, 1283, 2420, - 984, 1759, 934, 1130, 1131, 1756, 1133, 1018, 1199, 71, - 1698, 1818, 2599, 2528, 2601, 2292, 987, 2114, 2293, 1199, - 1545, 2355, 1623, 1174, 2356, 988, 1445, 1823, 2049, 989, - 3003, 2393, 1756, 2602, 2394, 2604, 714, 1824, 1213, 990, - 1826, 1827, 804, 2725, 991, 714, 2102, 2732, 1214, 804, - 1756, -592, 935, 3509, -2014, -2014, 1699, 2103, 1756, 998, - 1215, 1819, 971, -2015, -2015, 1230, 2102, 1756, 992, 1201, - 2441, 1850, 1175, 2442, 993, 1198, 2212, 2103, 2444, 714, - 1201, 2442, 1027, 3472, 1552, 520, 1030, 968, 2605, 77, - 778, 2606, 1216, 2840, 2530, 2842, 1564, 1033, 3484, 2611, - -592, 1231, 2612, 2677, 1038, 1199, 1984, 3496, 2737, 3497, - 1039, 2442, 1202, 2566, 1872, 932, -2018, -2018, 2935, 2504, - 1816, 1040, 1700, 1590, 1960, 1199, 1961, 2556, 2556, 1963, - 2505, 2884, 520, 520, 1967, 1041, 2877, 1970, 520, 1971, - 520, 2841, 2952, 1975, 1218, 520, 520, 520, 520, 2648, - 3522, 1871, 1134, 3520, 933, 1469, 1908, 1138, 3521, 1817, - 520, 520, 2258, -2019, -2019, 520, 1201, 520, 23, 1219, - 520, 2738, 1203, 1701, 2008, 520, 2741, 520, 520, 2742, - 520, 2762, 2763, 1203, 520, 2962, 1201, 1149, 1221, 2652, - 2876, 1155, 2885, 1169, 3166, 1171, 1370, 1371, 2259, 1162, - 2743, 1156, 811, 2742, 880, 880, 2818, 880, 2976, 2819, - 2977, 2356, 1158, 2293, 1159, 805, 2996, 805, 1202, 2997, - 805, -2020, -2020, 1160, 518, 805, 1909, 811, 805, 811, - 805, 1199, 811, 1163, 805, 1702, 3330, 811, 3331, 935, - 811, 1545, 811, 1592, 1819, 3004, 811, 3058, 3005, 518, - 2008, 518, 1170, 2748, 518, 2751, 2753, 2754, 2749, 518, - 2750, 2752, 518, 1189, 518, 536, 1378, 1379, 518, 1203, - 536, 1191, 3194, 520, 520, 2008, 1193, 3195, 1194, 2013, - 2442, 2010, 520, 520, 2011, -2021, -2021, 2012, 2265, 1203, - 520, 1195, 1201, 1207, 2015, -1308, 115, 520, 77, 2016, - 531, 1208, 3224, 3459, 3231, 2008, 3241, 1984, 744, 3242, - 1225, 27, 28, 29, 3274, 3275, 3310, 2356, 2293, 2008, - -2023, -2023, 714, 832, 2266, 1229, 520, 845, 537, 520, - -2024, -2024, 1233, 537, 1545, 520, 520, 520, 520, 520, - 520, 520, 520, 714, -2025, -2025, 1234, 520, 520, 2552, - 972, 3370, 520, 1286, 2356, 3383, 520, 1289, 3384, 520, - 520, 520, 520, 520, 520, 520, 520, 520, 2138, 1290, - 520, 1295, 2683, 1297, 71, 1301, 34, 520, 2085, 1283, - 1311, 907, 3409, 1382, 1383, 3410, 1313, 2307, 2069, 813, - 3453, 3494, 2173, 3384, 3384, 1203, 1314, 3138, 520, 882, - 1321, 539, -2026, -2026, 3102, 2744, 2746, 908, -2027, -2027, - 1322, 815, 1328, 39, 813, 1331, 813, -2028, -2028, 813, - 520, 1146, -2029, -2029, 813, 2884, 1332, 813, 1337, 813, - 1355, 520, 520, 813, -2030, -2030, 1910, 1911, 1912, 1356, - 1913, 1914, 1915, 1916, 1917, 1918, 41, 1639, 1640, 1641, - 1642, 1643, 1644, -2032, -2032, -2033, -2033, 44, 1292, 1359, - 2144, -2034, -2034, -2035, -2035, -207, 2995, 1362, 1545, -2036, - -2036, 1417, 909, -2037, -2037, 2834, 1430, 714, 804, 714, - 804, 3155, 1433, 804, -2039, -2039, 1432, 2033, 804, 1440, - 2970, 804, 1987, 804, 2034, 2035, 1448, 804, 2036, 2037, - 2038, 910, 2958, -2041, -2041, 3471, 2192, 2193, 541, 3473, - 542, 47, 2237, 541, 2241, 962, -2043, -2043, 2988, 520, - 1803, 1804, 1447, 1283, 1454, 3069, 520, 520, -643, -643, - 1008, 1467, 14, 15, 1455, 1009, 545, 1461, 544, -647, - -647, 545, -646, -646, 911, 1465, 3309, 1380, 1381, 1547, - 1382, 1383, 1550, 3220, 3098, 3099, 3480, 3481, 3506, 3507, - 1349, 1548, -820, 1045, 3514, -827, 1901, 1283, 1667, 1668, - 1902, 1903, 2329, 1559, -2044, -2044, -2044, 23, 1563, 714, - 47, -668, -669, 71, -817, -818, 1283, 520, 2270, 1573, - -821, 1574, -819, 1584, 1010, 971, 1603, 1597, 1605, 1650, - 1666, 2285, 2285, 1652, 1654, 1675, 1676, 1680, 1685, 1684, - 1173, 2552, 1545, 1175, 1722, 1720, 520, 520, 1724, 520, - 1736, 1754, 1755, 1756, 1545, 520, 520, 520, 520, 520, - 520, 1761, 1762, 520, 520, 520, 520, 520, 520, 520, - 520, 520, 520, 1763, 2430, 1768, 1776, 1780, 520, 520, - 2433, 2857, 520, 1775, 1545, 2935, 1790, 2858, 112, 520, - 1796, 1545, 2095, 3130, 1806, 1011, 1807, 1808, 1346, 912, - 2859, 1812, 3139, 3140, 2359, 1821, 1822, 1815, 1831, 1830, - 913, 520, 1834, 1838, 1837, 520, 1840, 520, 1841, 1843, - 3042, 520, 1844, 1851, 2860, 1852, 2861, 3309, 1856, 1545, - 1864, 1012, 3272, 1545, 1890, 520, 1892, 1283, 1893, 1545, - 1929, 1895, 1962, 1898, 1921, 914, 1930, 1013, 1937, 1940, - 27, 28, 29, 1958, 1968, 1974, 1610, 1014, 1972, 1611, - 880, 1545, 1973, 1612, 1613, 805, 872, 1979, 915, 1982, - 3309, 805, 520, 520, 1553, 1985, 1560, 811, 1991, 1990, - -593, 1565, 2020, 811, -524, -593, 1542, 1986, 1988, 1989, - 2019, 1015, 3040, 1046, 1621, 916, 2053, 2054, -524, 518, - 2551, -2044, 554, -524, 1611, 518, 1592, 2059, 745, 2062, - 865, 2065, 520, 2862, 2087, 34, 2064, 520, 520, 3309, - 821, 3363, 2066, 2094, 2067, 2105, 36, 2106, 1623, 2108, - 2132, 2133, 2139, 2156, 862, 862, 873, 1016, 2152, 873, - 2151, 2172, 520, 520, 1017, 2169, 2181, 520, 38, 2182, - 2183, 2186, 39, 2184, -524, 3325, -593, 2185, 1349, 2203, - 2207, 520, 2208, 1349, 520, 2211, 520, 2214, 2218, 2219, - 2220, 2290, 874, 2294, -524, 2300, 1909, 2311, 2309, 2312, - 2313, 2863, 520, 714, 1018, 41, 2864, 1664, 2314, 520, - 2315, 2336, 520, 2507, 2310, 2316, 44, 893, 2330, 2331, - 1534, 2333, 2337, 1019, 2340, -593, 71, -524, 2357, 520, - 1868, 1870, 45, 2365, 874, 2338, 3116, 1901, 2344, 2395, - 2402, -524, 520, -524, -2044, 1926, -524, 1925, 2403, 2404, - 2426, 2408, -524, 2434, 2446, 2865, 46, 2448, 2414, 520, - 520, -2044, 805, 2415, 2432, 2453, -2044, 2935, 2462, 2454, - 47, 2866, 2457, 2455, 811, 2458, 520, 2459, 520, 805, - 2460, 2463, 1542, 2474, 813, 2470, 2478, 520, 2471, 2476, - 813, 811, 1020, 2477, 2473, 2813, 518, -524, 2475, 2479, - 1783, 2480, 2481, 2491, -2044, 714, 714, 714, 2494, 2499, - 2515, 2492, 2523, 518, 2534, 1610, 2539, -524, 1611, 3261, - 2540, 2506, 1612, 1613, 2537, 2547, -2044, -2044, -2044, 2516, - 2039, 2040, 2041, 2521, 2042, 2043, 2044, 2045, 2046, 2047, - 2237, 2237, 2237, 2545, 520, 865, 2522, 972, 804, 23, - 1283, 2535, -649, 1621, 804, 2548, 2565, 2558, 2562, 1632, - 1622, 2569, 2559, 2561, 2570, 2573, -524, 2576, 2571, 2575, - 1542, 2579, 2867, 2613, 2598, -524, 2600, 2631, 2619, 1823, - 2620, 2868, 2621, 875, 2632, 2607, 714, 1623, 2647, 1824, - 2633, 1545, 1826, 1827, 2651, 2634, 1534, 2646, 2667, 2663, - 2671, -524, 2675, 2664, 2680, 2668, -2044, -2044, -2044, 520, - 1913, 1914, 1915, 1916, 1917, 1918, 2690, 2698, 2701, 2708, - 2721, 1872, 2704, 971, 2722, 2733, 2707, 2734, 2709, 714, - 2739, 2710, 2758, 2770, 2069, 1868, 1870, 2639, 2747, 2780, - 2755, 2799, 2808, 2764, 2793, 2827, 2778, 1349, 2781, 2831, - 2801, 3314, 2839, 3316, 2872, 2653, 2784, 2888, 2969, -2044, - 2980, 813, 2805, 2984, 1872, 2794, 2993, 520, 2829, 902, - 3324, 2846, 1158, 903, 2825, 2852, 2845, 2974, 813, 2964, - 1590, 2814, 2955, 1624, 1534, 2961, 2956, 2957, 2965, 3000, - 2973, 2979, 27, 28, 29, 3006, 1346, 2293, 2095, 3001, - 1625, 3026, 3028, 3032, 2688, 1626, 2689, 520, 3036, 3446, - 2694, 3326, 2697, 3328, 2517, 3046, 3047, 3049, 3089, 865, - 3050, 3070, 3077, 1545, -524, 804, 3080, 3091, 3095, 811, - 3096, 3082, 3097, 2796, 3103, 3104, 3105, 3109, 3407, 520, - 3113, 3114, 804, 1629, 3115, 520, 520, 3123, 3126, 3411, - 3128, 518, 865, 3129, 3133, 3400, 520, 34, 3163, -2012, - -2013, 3147, -2014, -2015, -2016, -2017, -2044, 520, -2018, -2019, - 520, -2020, 520, 1639, 1640, 1641, 1642, 1643, 1644, 1545, - 520, 3146, 3148, 520, 520, 3395, 3149, 3152, 520, 520, - 3153, 1542, 902, -2021, 39, 520, 903, 1610, 1632, -2023, - 1611, -2024, -2025, 2833, 1612, 1613, -2026, 3150, -2027, -2028, - 520, -2029, 3167, -2030, -2032, 3168, -2033, 2013, -2034, 2010, - 520, -2035, 2011, 2817, -2036, 2012, -2037, 41, -2038, 3182, - -2039, 3170, 2015, 516, 527, 1621, 77, 2016, 44, 552, - 520, -2040, -2044, -2041, -2042, 552, -2043, -1261, 3184, 802, - 3161, 816, 816, 3186, 45, 3187, 820, 552, 828, 3190, - 939, 828, 3196, 3197, 846, 850, 3200, 3202, 850, 1623, - 3208, 552, 552, 3211, 3204, 3214, 1209, 23, 46, 714, - 3210, 3215, 2938, 714, 1542, 714, 3216, 3223, 3219, 3239, - 3243, 3238, 2815, 3249, 3246, 864, 1210, 520, 1634, 520, - 3251, 802, 802, 3263, 3264, 1534, -1260, 3271, 3273, 1349, - 3280, 3282, 3283, 3298, 2237, 3311, 813, 3296, 2940, 3297, - 2241, 3312, 3315, 3318, 3319, 3321, 846, 3327, 3332, 2967, - 3352, 1823, -1774, 850, 552, 850, 850, 850, 3122, 3356, - 3358, 1824, 1211, 2878, 1826, 1827, 3359, 3362, 3368, 3376, - 3375, 3377, 3381, 2879, 3386, 2931, 3388, 2989, 3390, 3435, - 2991, 3393, 865, 3073, 3399, -2044, 3406, 3397, 3394, 3398, - 3408, 3404, 3413, 3418, 520, 3424, 3425, 1545, 3426, 3431, - 3433, 3432, -2044, 3451, 3461, 3441, 3464, -2044, 2639, 3485, - 3462, 3466, 3443, 3445, 520, 520, 3482, 3463, 1534, 520, - 3499, 3510, 520, 3504, 3515, 1635, 3524, 3525, -2044, -2044, - -2044, 2880, 1639, 1640, 1641, 1642, 1643, 1644, 1542, 2887, - 27, 28, 29, 1161, 2245, -2044, 2328, 2596, 3339, 520, - 3439, 2891, -1774, 1439, 3403, 2346, 2820, 1212, 3508, 3136, - 2682, 3422, 3492, 520, 3259, 3460, 23, 3467, 520, 520, - 3486, 865, 958, 520, 1545, 1746, 3295, 2578, 520, 2983, - 3458, 520, 520, 3465, 2603, 2574, 520, 1283, 2856, 1590, - 520, 2941, 3456, 1854, 520, 1610, 904, 2642, 1611, -1774, - 1632, 520, 1612, 1613, 1820, 34, 1213, 2687, 3191, 2564, - 2550, 2963, 1677, -1774, 1437, 1438, 1214, 1717, -1774, 2210, - 1716, 2712, 1590, -1774, 3444, 2560, 2178, 3389, 1215, 3317, - 2881, 2209, -1774, 1621, 806, 2536, 3035, -1774, 1721, 3218, - -2044, 71, 39, 2438, 805, 520, 997, 71, 983, 2706, - 2705, 2736, 1534, 520, 3265, 2452, 811, 3392, 14, 15, - 1216, 2353, 3391, 2489, 2553, 2760, 2513, 1623, 2511, -1774, - 2467, 3079, 520, 2832, 1949, 41, 1404, 1389, 518, 1391, - 2490, 1545, 1542, 1395, 1396, 1397, 44, 1398, 862, -1774, - 3081, 1399, 1400, 2772, 1542, 2806, 3379, 976, 2288, 2445, - -2044, 2147, 45, 23, 1866, 1888, 2149, 2821, 890, 27, - 28, 29, 1218, 2623, 0, 2938, 1792, 0, 0, 0, - 0, 0, 0, 0, 1542, 0, 46, 0, 0, 23, - 0, 1542, 2785, 0, 0, 0, 0, 1219, -1774, 0, - 47, -1774, 0, 0, 0, 0, 0, -1774, 0, 0, - 0, 0, 0, 71, 0, 0, 1221, 714, 2882, 0, - 0, 2883, 520, -2044, 0, 0, 1536, 0, 0, 1542, - 0, 0, 865, 1542, 34, 0, 0, 0, 0, 1542, - -2044, 71, 3174, 0, 71, -2044, 0, -1774, 0, 0, - 971, 0, 1872, 520, 1545, 0, 1534, 0, 0, 0, - 0, 1542, 0, 0, 0, 0, 0, -2044, 1534, 520, - -1774, 39, 0, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 1045, -2044, 0, 1901, 0, 0, 0, 1902, - 1903, 0, 1590, 1904, 1905, 1906, 0, 1545, 1534, 0, - 3169, 0, 520, 813, 41, 1534, 27, 28, 29, 0, - 2776, 0, 0, 520, 520, 44, 0, 520, 0, 520, - 0, 3337, 0, 1346, 0, 0, 0, 0, 852, 0, - 1756, 45, 27, 28, 29, 0, 0, 0, 1632, 0, - 0, 850, 0, 1534, 520, 0, 850, 1534, 0, 850, - 0, 0, 0, 1534, 0, 46, -1774, 552, 0, 3173, - 0, 0, 0, 0, 0, 0, -1774, 804, 520, 47, - 0, 34, 0, 0, 0, 1534, 0, 0, 0, 23, - 0, 864, 36, 0, 0, -1774, 0, -1774, -1774, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 2938, - 0, 0, 1536, 3236, 38, 1414, 0, 0, 39, 0, + 520, 904, 70, 54, 865, 1124, 1224, 877, 1292, 714, + 68, 58, 65, 1022, 82, 102, 520, 713, 1188, 1680, + 953, 77, 69, 517, 1784, 1420, 93, 1154, 1241, 1783, + 1795, 1925, 1295, 2172, 2139, 1394, 972, 1348, 1767, 811, + 847, 77, 2557, 1748, 1395, 1350, 1331, 98, 1581, 1475, + 772, 1393, 1830, 740, 2530, 881, 2532, 1391, 1982, 1754, + 1736, 882, 2590, 1758, 2547, 2050, 2450, 778, 520, 520, + 851, 1337, 1354, 51, 2074, 2075, 2940, 52, 863, 1800, + 2660, 53, 2942, 2511, 805, 2971, 56, 1788, 57, 60, + 61, 811, 811, 2546, 2274, 819, 63, 1856, 66, 67, + 80, 2583, 889, 2988, 1656, 81, 83, 844, 1223, 1659, + 1229, 518, 1233, 963, 84, 955, 878, 879, 2969, 90, + 91, 92, 1593, 1241, 97, 101, 2985, 518, 966, 103, + 1004, 2630, 2631, 2632, 2769, 1025, 805, 805, 2644, -1893, + 2833, 897, -1324, -858, 2838, 1046, 1046, 2304, 1362, -1893, + -512, 813, -1265, 2195, -516, 2452, 2402, -2033, -2033, 3384, + -1262, -1262, 2143, -850, 1612, 2299, 2192, 3180, -1884, 1614, + -1265, -1246, 2089, 1325, -1901, -1884, -2024, -2024, -858, 518, + 518, 1609, -2042, -2042, 973, -855, 1404, -1266, -1901, -855, + 815, 1558, 1559, 2661, 1046, -1263, -1263, -2019, -2019, 1622, + -1266, -817, 1664, 813, 813, -830, -845, 815, 1571, 815, + 1350, 3165, -2044, -2044, 1210, 2300, 2431, 2432, 2648, 2469, + 1660, 1341, 815, 2652, 2089, 1902, 1046, 2438, 2646, 3184, + 1904, 2442, 3113, 1624, 1211, 1325, 532, 855, 1750, 2639, + 1143, 815, 3258, 2694, 2696, 1166, 2699, 1177, 1341, 1786, + -512, 1563, 1543, 1046, -516, 1589, 1180, 972, 2733, 2734, + 1798, 1739, 1136, 3096, 1241, -227, 1316, 1573, 1325, 1799, + -227, 3, 4, 1759, 2296, -466, 2668, 3271, 1768, 1612, + 1212, 1771, 1772, 1613, 1614, -649, 1350, 999, 3128, 1350, + 1350, 2205, 3148, 1902, 3418, 1942, 1699, 1903, 1904, 815, + 869, 944, 1612, 874, 1750, 1317, 1613, 1614, 1025, 3343, + 2414, 815, 1902, 2962, 1622, 2618, 1903, 1904, 3450, 874, + 1004, 2412, 3079, 71, 3081, -1104, 3457, 2805, 1942, 2807, + 3181, 3465, 2716, -1104, 1661, 1140, 872, 1622, 1355, 2989, + 3302, 1773, 1700, 71, 3514, 3182, 804, 1988, 1624, 783, + 3303, 1683, 533, 1005, 1665, 1742, 1731, 1732, 2586, 1735, + 2198, 71, 3124, 3204, 2415, 2110, 2076, 2425, 2426, 2427, + 864, 1624, 2705, 1173, 2126, 1213, 3370, -1125, 1174, 3408, + -2018, -2018, 2127, 1696, 3443, -1125, 1173, 2806, 833, 3147, + 870, 2167, 3110, -787, 1167, 2280, 2847, 1843, 804, 804, + 880, 1459, 3337, 3503, 3338, 1612, 873, 1144, 1701, 1145, + 2375, 2136, 1444, 2876, 3174, 2826, 2846, 1802, 3288, 3501, + 1869, 1871, 2856, 71, 1214, 3186, 2829, 2522, 1576, 1543, + 3419, 3388, 1868, 1576, 1215, 1500, 782, 1046, 2098, -512, + 1622, 2403, 1031, -516, 1778, 1295, 1216, 3519, 2857, 1175, + 1577, 3175, 1460, 1032, 2764, 1577, 2583, 1662, 2583, 1702, + 3526, 3369, 1175, 814, 1578, 2099, 3111, 1326, 1779, 3498, + 3430, 3472, 3451, 3433, 1624, 2199, 2168, 1760, 1217, 3238, + 3390, 3240, 2827, 1318, 874, 1774, 2877, 784, 2111, -669, + 834, 1697, 1006, 2587, 1581, 1775, 1168, 2995, 1176, 3269, + 2226, 3452, 3458, 1757, 2990, 2112, 3515, 2416, -512, 1575, + 2113, 1684, -516, 3010, 3420, 1744, 3304, 1543, 2413, 1137, + 3490, 1703, 3125, 3520, 2706, 3253, 1801, 3202, -787, 1326, + 1219, 2297, 3247, 980, 3344, 3183, 919, 1682, 1045, 3460, + 2090, 1902, 1985, 1757, 3263, 1903, 1904, 1011, 2114, 1905, + 1906, 1907, 2021, 2733, 2734, 1220, 3473, 3431, 2281, 1733, + 2137, 3504, 1326, 1675, 1750, 2206, 3259, 3496, 1734, 3114, + 2878, 3001, 2446, 2288, 1222, 1751, 2963, 1601, 2981, 856, + 2100, 714, 530, 1012, 1787, 2285, 2217, 2978, 2785, 941, + 2102, 902, 2513, 1934, 1138, 903, 2993, 1319, 2050, 1445, + 867, 953, 3316, 2703, 2279, 3159, 1858, 1040, 1949, 1014, + 945, 2534, 1862, 2940, 852, 3521, 1576, 3432, 2383, 2942, + 2560, 1554, 1558, 1559, 3279, 1970, -512, 972, 1327, 871, + -516, 2343, 1745, 875, 2192, 1750, 883, 1784, 1577, 2640, + 2641, 2026, 3137, 3138, 2370, 2664, 1753, 1571, -1893, 2748, + 2619, 1576, 1578, 2056, 1568, 2057, 2376, 2653, -1893, -1324, + 3466, -1265, 2555, 1645, 1568, -512, 2349, -512, 2549, -516, + 3250, -516, -850, 1577, 2142, 3251, 3104, -1884, 902, -1265, + -1246, 2072, 903, -1901, -1884, 1563, 2404, 1580, 2727, 3462, + 1330, -1104, 2644, 2409, -855, 534, -1266, -1901, 1560, 1607, + 3224, 1146, 1859, 2115, 1866, 1573, 865, 2032, 2033, -1266, + 1561, 2659, 3368, 993, 1566, -845, 1657, 3376, 2144, 966, + 2018, 1589, 1345, 1346, 1919, 1241, 2070, 1241, 1908, 3491, + 1589, 2443, 3351, 3162, 2154, 2443, 1018, 1778, 1543, 2010, + 2128, 2103, 971, -1125, 2053, 3122, 3375, 1173, -593, 1345, + 1346, 1909, 2104, -593, 3095, 1446, 1940, 865, 1612, 2155, + 2384, 1779, 2222, 2464, 3086, 112, -227, -227, 3522, 77, + 2385, 858, 2850, 2071, 2612, 1642, 1643, 1644, 1645, 968, + 868, 104, 520, 2814, 2191, 2191, 3005, 2613, 2279, 1916, + 1917, 1918, 1919, 520, 3352, 778, 1640, 1641, 1642, 1643, + 1644, 1645, 3087, 2410, 3097, 811, 1914, 1915, 1916, 1917, + 1918, 1919, 3404, 3405, 3492, 1189, 811, 3154, 3178, 3123, + 3441, 1910, 2223, 1175, -593, 2222, 881, 1624, 520, 520, + 105, 1543, 882, 2717, 2718, 2719, 2720, 2252, 2815, 2364, + 2969, 996, 2410, 3493, 2365, 1350, 3163, 2255, 113, 2628, + 2258, 520, 921, 977, 922, 1350, 3130, 71, 1350, 2851, + 2629, 995, 2336, 3060, 3135, 3445, 1035, 1036, 1037, 3179, + 70, 54, 1176, -593, 1759, 2940, 2251, 2594, 68, 58, + 65, 2942, 82, 102, 1141, 2580, 1147, 1759, 902, 77, + 69, 1155, 903, 518, 93, 520, 714, 1601, 3175, 1284, + 520, 2366, 1141, 2092, 518, 2523, 884, 2889, 3044, 844, + 844, 3046, 844, 3048, 2019, 98, 1437, 813, 1339, 900, + 2485, 1340, 3232, 2025, 2956, 2852, 2957, 2853, 813, 2419, + 2309, 3516, 1759, 3233, 1463, 2275, 2276, 2277, 1467, 3284, + 2353, 51, 1569, 1570, 3256, 52, 2342, 930, 1350, 53, + 2344, 2214, 1284, 2346, 56, 1870, 57, 60, 61, 1699, + 1046, 1294, 2776, 971, 63, 1543, 66, 67, 80, 2050, + 815, 520, 520, 81, 83, 2357, 1337, 520, 2250, 1576, + 520, 520, 84, 520, 520, 520, 520, 90, 91, 92, + 2098, 3243, 97, 101, 77, -1893, 930, 103, 2261, 520, + 1782, 1577, 2558, 2268, 2591, 1700, 520, 1046, 1379, 1380, + 1925, 2193, 2194, 1789, 1444, 1580, 2535, 2099, 2536, 931, + 778, 3270, 811, 2503, 520, 1284, 1546, 536, 1857, 811, + 906, 1911, 1912, 1913, 872, 1914, 1915, 1916, 1917, 1918, + 1919, 1943, 536, 1447, 865, 520, 1944, 1440, -594, 1454, + 2504, 1784, 2363, -594, 1451, 2253, 2367, 902, 1792, 2369, + 2256, 1600, 2130, 2566, 520, 918, 2131, 805, 931, 2459, + 925, 71, 864, 2226, 805, 520, 520, 520, 1760, 520, + 520, 2633, 3364, 3196, 714, 923, 1693, 924, 3347, 1857, + 537, 1760, 1599, 3070, 902, 2860, -1246, 1933, 903, 1935, + 1936, 2861, -208, 2555, 873, 537, 2408, 1452, 929, 1543, + 518, 1457, 982, 520, 2862, 2592, 932, 518, 937, 2620, + 2860, 1543, 1702, 994, -594, 1383, 1384, 1552, 942, 47, + 520, 520, 2100, 2420, 813, 2421, 1760, 2101, 2863, 943, + 2864, 813, 2102, 1673, 1757, 946, 1674, 1687, 1688, 1011, + 1694, 1543, 947, 882, 882, 933, 882, 1757, 1543, 1863, + 972, 948, 1864, 2863, 520, 1817, 949, 3289, 520, 520, + 2505, 880, 1593, -594, 2326, 2506, 2327, 1759, 520, 520, + 520, 959, 874, 520, 1703, 1012, 2605, 2669, 2607, 2467, + 934, 71, 1759, 2677, 1141, 2422, 1543, 2423, 23, 536, + 1543, 1453, 1757, 1546, 1818, 1984, 1543, 2743, 1985, 1131, + 1132, 1014, 1134, 1045, 2008, 2293, 1902, 2009, 2294, 2533, + 1903, 1904, 3290, 978, 1905, 1906, 1907, 2865, 1543, 2358, + 2396, 3291, 2359, 2397, 115, 1293, 1284, 979, 531, 1819, + 935, 2778, 980, 932, 1197, 1284, 744, 2843, 981, 2845, + 1198, 984, 2559, 2559, 107, 3292, 1170, 1785, 1172, 1759, + 907, 832, 537, 2444, 2501, 845, 2445, 987, 1197, 1284, + 541, 1200, 962, 2447, 1198, 2608, 2445, 2614, 2609, 2531, + 2615, 2680, 933, 988, 1985, 541, 908, 962, 989, 1820, + 990, 1546, 991, 2103, 854, 2866, 71, 2728, 545, 992, + 2867, 2735, 3006, 2617, 2104, -2015, -2015, 714, 1824, 1825, + 993, 1827, 1828, 545, 998, 1851, 714, 2655, 2621, 2050, + 3261, 2602, 1027, 2604, 3512, 2867, 2507, 3293, 1030, 804, + 1033, 875, 2593, 971, 2594, 539, 804, 2508, 1018, 1038, + 3294, 27, 28, 29, 3499, 2740, 3500, 1039, 2445, 2868, + 714, 909, -2016, -2016, 3475, 1199, 520, 1446, 1873, 892, + 77, 895, 1197, 899, 2595, 2869, 2938, 935, 1198, 3487, + 968, 1553, 2741, 1135, 2868, 2009, 2569, -2017, -2017, 1199, + 910, 1760, 1040, 1565, 1041, 2625, 778, 3525, 2744, 1150, + 2869, 2745, 1293, 2651, 2746, 2887, 1760, 2745, 1139, -207, + 1157, 2880, 1156, 520, 520, 2821, 34, 1159, 2822, 520, + 1591, 520, 2979, -2020, -2020, 2359, 520, 520, 520, 520, + 2955, 1160, 108, 911, 3523, 2844, 1909, 2980, 1161, 3524, + 2294, 520, 520, 109, 811, 1163, 520, 2999, 520, 1164, + 3000, 520, 541, 39, 542, 1171, 520, 1757, 520, 520, + 2965, 520, 2765, 2766, 2879, 520, 2888, 3007, 1190, 811, + 3008, 811, 1757, 1760, 811, 1192, 2870, 1195, 110, 811, + 545, 1194, 811, 1199, 811, 2871, 41, 3061, 811, 3197, + 2009, 1196, 2009, 1208, 1961, 3198, 1962, 44, 2445, 1964, + 1209, 2870, 880, 880, 1968, 880, 1910, 1971, 1226, 1972, + 2871, 1817, 3227, 1976, 805, 2009, 805, 1371, 1372, 805, + 3234, 1200, 1546, 1985, 805, 2753, 2755, 805, 111, 805, + 1589, 1593, 518, 805, 2754, 2756, 2757, 1230, 3333, 1757, + 3334, 2752, 2747, 2749, 1234, 1200, 2751, 23, 1543, 3295, + 1818, 47, 3296, 1535, 520, 520, 813, 518, 912, 518, + 2014, 2011, 518, 520, 520, -2021, -2021, 518, 2012, 913, + 518, 520, 518, 1235, 3244, 1287, 518, 3245, 520, 77, + 2013, 813, 1202, 813, 2016, 3169, 813, 1379, 1380, 3277, + 3278, 813, 2359, 2294, 813, 3313, 813, 1290, 2009, 1291, + 813, 1296, 1201, 714, 914, 2017, 1202, 520, 1298, 3373, + 520, 1210, 2359, 1312, 1203, 1546, 520, 520, 520, 520, + 520, 520, 520, 520, 714, -2022, -2022, 915, 520, 520, + 2139, 1211, 2086, 520, 2686, 1820, 1302, 520, 1203, 1200, + 520, 520, 520, 520, 520, 520, 520, 520, 520, 972, + 2555, 520, 1314, 3386, 916, 3141, 3387, 1315, 520, 1197, + 1284, 3412, 1322, 3456, 3413, 1198, 3387, 3497, -644, -644, + 3387, 1329, 71, -2023, -2023, -2025, -2025, 1212, 2881, 520, + 1323, 2070, 1543, 2174, 1332, 1204, -2026, -2026, 2882, 882, + 27, 28, 29, 815, -2027, -2027, 1227, 1350, 3105, 2887, + 1202, 520, -2028, -2028, 1383, 1384, -2029, -2029, 1333, 1204, + -2030, -2030, 520, 520, 1147, 1338, 1911, 1912, 1913, 1356, + 1914, 1915, 1916, 1917, 1918, 1919, -2031, -2031, -2032, -2032, + 1535, 1357, 1228, -2034, -2034, -2035, -2035, 1360, 1543, -2036, + -2036, -2037, -2037, -2038, -2038, 1363, 2883, -2039, -2039, 1546, + 2837, -2041, -2041, -2043, -2043, 34, -2045, -2045, 714, 1418, + 714, 1804, 1805, 1988, -648, -648, 2238, 1433, 2242, 3158, + 1199, 2973, 1213, 1431, 2991, 1434, 804, 1441, 804, 1448, + 2961, 804, -647, -647, 1381, 1382, 804, 2998, 1449, 804, + 3474, 804, 39, 1455, 3476, 804, 1456, 920, 1383, 1384, + 520, 1462, 927, 1204, 1284, 928, 1466, 520, 520, 3101, + 3102, 3223, 3483, 3484, 14, 15, 3312, 1197, 1535, 3509, + 3510, 1214, 1468, 1198, 3072, 41, 1548, 3045, 1668, 1669, + 1549, 1215, 1551, -821, -828, 1560, 44, 1564, 47, -669, + -670, 1543, -818, 1216, 1045, 2884, -819, 1902, 1284, 3517, + 1574, 1903, 1904, 2330, -822, 1905, 1906, 1907, 1575, 23, + 714, -820, 1585, 1598, 1651, 1604, 1045, 1284, 520, 1902, + 1653, 1655, 2779, 1903, 1904, 1217, 971, -2046, -2046, -2046, + 1606, 71, 1667, 1676, 1677, 1681, 1685, 1686, 1176, 1174, + 47, 1721, 1723, 1546, 1725, 1755, 1737, 520, 520, 1756, + 520, 1762, 1757, 1764, 1763, 1546, 520, 520, 520, 520, + 520, 520, 2555, 2938, 520, 520, 520, 520, 520, 520, + 520, 520, 520, 520, 1769, 1776, 1200, 1219, 1199, 520, + 520, 1777, 1791, 520, 1781, 1546, 1543, 1797, 112, 1807, + 520, 1813, 1546, 1808, 1809, 1822, 1823, 1816, 1831, 1832, + 1835, 1838, 1220, 1839, 1841, 1845, 1842, 3133, 1844, 1852, + 2096, 1853, 520, 1857, 1865, 1350, 520, 3312, 520, 1891, + 1350, 1222, 520, 2885, 1893, 1197, 2886, 3275, 1896, 1899, + 1546, 1198, 1894, 1231, 1546, 1922, 520, 1202, 1284, 811, + 1546, 1930, 1931, 3142, 3143, 811, 1938, 1941, 1959, 1963, + 1969, 1975, 27, 28, 29, 1973, 1980, 1554, 1974, 1983, + 3312, 1986, 1546, 1543, 2433, 1991, 1561, 1869, 1871, 1232, + 2436, 1566, 1987, 520, 520, 1989, 3043, 1992, 880, 2021, + 1046, 1990, 2020, 2054, 805, 2055, 1612, 2060, 2065, 1535, + 805, 2063, 2088, 2106, 2068, 2066, 2109, 2067, 2095, 2107, + 2133, 2134, 2140, 986, 2816, 2152, 2153, 1909, 2157, 3312, + 873, 2170, 865, 520, 1593, 2173, 2183, 34, 520, 520, + 2184, 2185, 2182, 2186, 2187, 2208, 2209, 518, 36, 3366, + 2204, 2219, 2212, 518, 1200, 1757, 1199, 2215, 2220, 3328, + 1204, 874, 2295, 520, 520, 2221, 2291, 2301, 520, 2310, + 38, 813, 2312, 2313, 39, 1197, 2314, 813, 23, 2316, + 2315, 1198, 520, 2317, 2331, 520, 2332, 520, 2334, 2341, + 1543, 1008, 2337, 2339, 2338, 2360, 1009, 1910, 2345, 2368, + 1927, 1902, 1535, 520, 714, 2398, 1926, 41, 2405, 2406, + 520, 2213, 2407, 520, 2411, 1202, 2417, 1191, 44, 1910, + 3119, 2418, 2429, 2435, 1543, 2437, 2449, 2451, 2456, 2457, + 520, 2458, 2311, 2460, 45, 2461, 811, 2462, 2465, 2463, + 2466, 2473, 2476, 520, 71, 2938, 2502, 1203, 2474, 1288, + 2477, 2478, 2509, 811, 2481, 1010, 2479, 554, 46, 2482, + 520, 520, 2519, 745, 2480, 1304, 1306, 1309, 1311, 2497, + 2518, 2483, 47, 2526, 2524, 821, 2484, 520, 2525, 520, + 2494, 805, 2537, 2495, 2538, 2540, 1199, 2542, 520, 862, + 862, 2548, 1869, 1871, 1784, 3264, 2543, 2564, 805, -650, + 2551, 2561, 2550, 1543, 1350, 2562, 714, 714, 714, 2565, + 2817, 2568, 1200, 2572, 2238, 2238, 2238, 1407, 1204, 2573, + 2574, 27, 28, 29, 518, 2576, 1011, 1045, 2578, 2579, + 1902, 2582, 2601, 536, 1903, 1904, 1535, 2603, 1905, 1906, + 1907, 518, 2616, 2634, 2635, 520, 1543, 865, 813, -525, + 2622, 1284, 893, 2636, 2637, 3063, 2650, 2623, -1310, 2624, + 2654, 2649, 1012, -525, 2666, 813, 804, 972, -525, 2259, + 2667, 2670, 804, 1202, 2671, 2678, 2683, 2674, 1013, 2693, + 2701, 2704, 2707, 2710, 2724, 2725, 34, 714, 1014, 2711, + 1824, 1825, 1546, 1827, 1828, 1873, 537, 2712, 2713, 2736, + 2737, 2742, 2750, 2758, 2761, 2260, 2767, 1911, 1912, 1913, + 520, 1914, 1915, 1916, 1917, 1918, 1919, 2773, 2781, -525, + 2783, 2796, 1015, 39, 520, 971, 2784, 2802, 2811, -2046, + -2046, -2046, 714, 1914, 1915, 1916, 1917, 1918, 1919, -525, + 1873, 2804, 1200, 1965, 2834, 2787, 2797, 2070, 1543, 2808, + 2308, 2828, 3317, 2830, 3319, 2842, 41, 2832, 2849, 2848, + 2855, 2875, 2891, 2958, 2959, 3327, 2964, 44, 1016, 2960, + 520, 2967, 2968, 2972, 2977, 1017, 1204, 2976, 2982, 2983, + 1535, 2987, 2996, 45, 2294, 3003, 3004, 3029, -525, 3009, + 3031, 3035, 1535, 811, 3039, 3049, 3050, -525, 1591, 2266, + 3053, 3073, 3329, 1202, 3331, 3052, 3080, 46, 3083, 3085, + 520, 3092, 3098, 3094, 3410, 1018, 2096, 3449, 3099, 3100, + 3106, 2818, 1535, 865, 3108, 3112, 1546, 3116, 1738, 1535, + 3107, 3117, 2520, 3126, 1019, 2267, 3118, 3129, 2799, 3131, + 1909, 1765, 520, 804, 3132, -1776, 3414, 3136, 520, 520, + -2014, -2015, 3150, 3403, -2016, -2017, 865, -2018, 3149, 520, + 804, -2019, 1790, -2020, 3151, 3155, 1350, 1535, -2021, -2022, + 520, 1535, -2023, 520, 3152, 520, 541, 1535, 962, 3156, + 3398, 518, 1546, 520, -2025, -2026, 520, 520, -2027, -2028, + -2029, 520, 520, -2030, -2031, -2032, -2034, -2035, 520, 1535, + 3153, 544, -2036, 1020, 545, 813, 1204, 2836, 1966, -2037, + 1910, 1611, -2038, 520, 1612, -2039, 3166, -2040, 1613, 1614, + 2014, 2011, -2041, 520, -2042, 1815, 2820, -2043, 2012, -2044, + -2045, -1263, 3164, 3170, 1834, 3171, 516, 527, 3185, 77, + 2013, 3189, 552, 520, 2016, -1776, -525, 3173, 552, 1622, + 3187, 3190, 802, 3193, 816, 816, -2046, 3199, 3203, 820, + 552, 828, 3200, 3207, 828, 2017, 3211, 846, 850, 3213, + 3217, 850, 3205, 3219, 552, 552, 3214, 3218, 3226, 3222, + 3242, 3246, 714, 1624, 3252, 2941, 714, 3241, 714, 3254, + 2238, 3249, -1776, 3266, 2943, 3267, 2242, -1262, 3274, 1876, + 520, 3276, 520, 3283, 802, 802, -1776, 3285, 3286, 3299, + 1543, -1776, 3300, 864, 902, 3301, -1776, 1159, 903, 3314, + 3315, 3318, 3321, 3322, 3324, -1776, 3330, 3335, 3355, 846, + -1776, 3125, 2970, 3359, 3361, 3362, 850, 552, 850, 850, + 850, 3365, 3371, 3438, 1824, 1825, 1877, 1827, 1828, 3379, + 3378, 3380, 3384, 3389, 3391, 3393, 3076, 3396, 1537, 3407, + 2992, 3397, -1776, 2994, 3400, 3402, 865, 1878, 3401, 3409, + 3411, 3416, 3421, 1957, 3428, 3427, 3429, 520, 3434, -2046, + 1546, 3435, -1776, 3436, 3464, 1879, 3444, 3446, 3448, 1880, + 3467, 3454, 3469, 3485, 3488, 939, -2046, 520, 520, 3502, + 3465, -2046, 520, 1008, 3466, 520, 3507, 3513, 1009, 3518, + 3527, 1881, 3528, 1162, 1882, 2890, 2246, 2599, 817, 817, + 1911, 1912, 1913, 3342, 1914, 1915, 1916, 1917, 1918, 1919, + 1883, -1776, 520, 3442, -1776, 2894, 3406, 3511, 2823, -2046, + -1776, 1611, 2347, 3139, 1612, 2685, 520, 3425, 1613, 1614, + 3495, 520, 520, 3262, 3463, 865, 520, 1546, 1210, 3470, + 3489, 520, -525, 3298, 520, 520, 1747, 1010, 2581, 520, + 1284, 23, 2606, 520, 904, 3461, -525, 520, 1211, 1622, + -1776, -525, 2577, 2859, 520, 3468, -2046, 2986, 2944, 1591, + 3459, 2645, 1821, 2690, 1633, 3194, 2966, 1855, 2567, 1438, + 811, 1678, 2553, -1776, 2211, 2715, 1717, 901, 3447, 1535, + 2179, 3392, 3320, 1624, 2563, 1718, 2210, 806, 2441, 2539, + 3038, 1722, 1591, 1884, 1212, 1440, 1439, 3221, 520, 2709, + 2329, 1885, -525, 2739, 997, 1537, 520, 983, 1011, 2708, + 3268, 71, 2455, 1405, 1390, 805, 2355, 71, 1392, 1396, + 23, 1397, -525, 1886, 1398, 520, 2356, 1399, 1400, 1401, + 3395, 852, 3394, 2556, 1546, 2492, 2763, 1950, 2493, 2470, + 2516, 2514, 2775, 2835, 1012, 3084, 3382, 2809, 2500, 976, + 1887, 2289, 2448, 1889, 1867, 2148, 1008, 958, 518, -1776, + 1013, 1009, 2824, 2883, -2046, 2150, 890, 0, 2941, -1776, + 1014, -525, 2626, 3340, 0, 2147, 0, 2149, 1793, -2046, + -525, 0, 813, 0, 27, 28, 29, 2159, -1776, 1213, + -1776, -1776, 0, 1537, 0, 0, -2046, 0, 0, 0, + 0, -2046, 1210, 0, 1015, 0, 0, 0, 0, 0, + 714, 0, 0, 1535, 0, 520, 0, 0, 1873, 0, + 1010, 0, 1211, 71, 0, 2196, 865, -1776, 0, 0, + -1776, -1776, -1776, 0, 0, 3177, 0, 0, 1214, -2046, + 0, 0, 0, 971, 0, 0, 520, 1546, 1215, 34, + 1016, 71, 0, 0, 71, 0, 0, 1017, 0, 0, + 1216, 0, 520, 27, 28, 29, 0, 0, 1212, 1535, + 0, -2046, 0, 862, 0, 0, 0, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 39, 0, 0, 0, + 1546, 1011, 1217, 0, 1633, 520, 0, 1018, 0, 0, + 0, 0, 1591, 0, 0, 0, 520, 520, 0, 0, + 520, 0, 520, 0, 0, 0, 1019, 0, 0, 41, + 2302, 2303, 2305, 2306, 2307, 0, 0, 1012, 34, -525, + 44, 0, 0, 0, 850, 0, 0, 520, 0, 850, + 0, 0, 850, 1013, 1219, 0, 45, 0, 1611, 0, + 552, 1612, 0, 1014, 0, 1613, 1614, 0, 0, 0, + 0, 520, 0, 1213, 0, 39, 0, 0, 0, 1220, + 46, 0, 1535, 0, 0, 0, 0, 804, 0, 0, + 0, 0, 0, 0, 47, 1020, 1622, 1015, 1222, 0, + 0, 864, 2941, -2046, -2046, 0, 0, 902, 41, 0, + 0, 903, 0, 0, 0, 536, 0, 0, 1187, 44, + 0, 0, 1214, 0, 1537, 0, 714, 0, 3280, 3281, + 1624, 0, 1215, 0, 1873, 45, 0, 0, 0, 0, + -1310, 0, 520, 1016, 1216, 1538, 520, 0, 0, 0, + 1017, 0, 0, 0, 0, 0, 520, 0, 520, 46, + 520, 0, 0, 0, 520, 2424, 520, 0, 520, 811, + 0, 1540, 0, 47, 0, 0, 1217, 1535, 537, 520, + 0, 0, 0, 0, 520, 1045, 520, 0, 1902, 0, + 1018, 0, 1903, 1904, 520, 2510, 1905, 1906, 1907, 0, + 0, 0, 0, 0, 3339, 0, 3341, 714, 0, 1019, + 0, -2046, 520, 0, 0, 3348, 0, 1537, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, -2046, 0, 1219, 0, + 0, 0, 961, 0, 0, 0, 3176, 0, 0, 0, + 536, 0, 0, -2046, 0, 0, 0, 3374, -2046, 0, + 951, 552, 552, 1220, 1535, 0, 23, 518, 0, 0, + 0, 520, 0, 3377, 0, -1310, 71, 3381, 0, 0, + 0, 520, 1222, 1413, 23, 0, 0, 0, 1020, 0, + 862, 813, 0, 520, 0, 0, -2046, 0, 0, 0, + 0, 974, 527, 816, 0, 0, 0, 520, 516, 0, + 850, 0, 1591, 537, 0, 0, 0, 0, 540, 802, + 0, 0, 0, 1001, 1001, 520, 0, 0, 1001, 1024, + 811, 0, 1538, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 828, 828, 828, 0, 0, 0, 0, 0, + 520, 1633, 0, 0, 0, 0, 828, 828, 1540, 828, + 0, 1537, 0, 0, 0, 520, 0, 538, 541, 0, + 962, 1535, 850, 811, 2941, 0, 714, 0, 552, 0, + 0, 0, 0, 0, 3348, 2207, 539, 543, 0, 0, + 850, 0, 0, 544, 0, 0, 545, 0, 0, 520, + 3471, 0, 0, 0, 850, 1535, 0, 0, 1909, 27, + 28, 29, 0, 520, 520, 520, 0, 0, 518, 0, + 1538, 0, 811, 0, 0, 0, 3486, 27, 28, 29, + 0, 0, 0, 0, 0, 0, 850, 1289, 0, 0, + 520, 0, 813, 540, 0, 0, 1540, 0, 1300, 0, + -207, -2046, 850, 850, 850, 850, 0, 0, 0, 71, + 71, 518, 0, 0, 1860, 975, 1861, 817, 1321, 0, + 0, 0, 0, 0, 34, 0, 0, 1414, 1910, 0, + 0, 520, 0, 0, 1535, 813, 0, 0, 0, 0, + 0, 0, 34, 541, 0, 542, 0, 1029, 0, 0, + 0, 1001, 1024, 0, 850, 1537, 0, 1412, 0, 0, + 518, 39, 543, 1001, 1001, 0, 0, 1537, 544, 552, + 0, 545, 1133, 2647, 0, 802, 0, 1535, 0, 39, + 0, 0, 802, 0, 813, 71, 0, 71, 2662, 2663, + 2665, 0, 552, 0, 41, 0, 0, 1537, 0, 1469, + 0, 0, 0, 2676, 1537, 44, 2679, 0, -2046, 1550, + 0, 2684, 41, 0, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 45, 1611, 44, 0, 1612, 0, 0, 71, 1613, + 1614, 0, 0, -2046, -2046, -2046, 0, 0, 0, 45, + 0, 0, 1537, 0, 71, 46, 1537, 0, 71, 1415, + 0, 0, 1537, 0, 0, 0, 0, 0, 552, 47, + 1622, 0, 0, 46, 0, 0, 0, 1623, 0, 0, + 0, 0, 0, 0, 1537, 0, 0, 47, 0, 1535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 714, -1774, 3277, 3278, -1774, -1774, -1774, - 0, 0, 0, 0, 39, 0, 0, 0, -2044, 520, - 0, 41, 0, 520, 862, 0, 0, 0, 0, 0, - 0, 0, 44, 520, 0, 520, 0, 520, 1872, 0, - 0, 520, 0, 520, 0, 520, 0, 41, 45, 0, - 0, 0, 2931, 0, 0, 0, 520, 0, 44, 0, - 0, 520, 0, 520, 0, 0, 0, 0, 0, 0, - 1536, 520, 46, 0, 45, 1908, 0, 0, 0, 0, - 0, 3336, 0, 3338, 714, 811, 47, 1537, 0, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, - 0, 0, 27, 28, 29, 0, 0, 518, 0, 0, - 0, 0, 47, 0, 0, 0, 0, 0, 0, 3345, - 0, 0, 0, 0, 3371, -2044, 71, 951, 552, 552, - 0, 0, 1639, 1640, 1641, 1642, 1643, 1644, 520, 0, - 3374, 0, 0, 0, 3378, 1909, 0, 0, 520, 0, - 0, 1542, 0, 536, 0, 0, 0, 0, 0, 0, - 520, 0, 1590, 0, 0, 0, 0, 34, 974, 527, - 816, 0, 0, 0, 520, 516, 0, 850, -1308, 3364, - 0, 1414, 0, 0, 0, 0, 802, 0, 0, 0, - 1001, 1001, 520, 0, 0, 1001, 1024, 0, 1859, 0, - 1860, 0, 0, 0, 39, 0, 0, 0, 0, 828, - 828, 828, 0, 0, 0, 0, 537, 520, 0, 0, - 0, 0, 1875, 828, 828, 0, 828, 0, 0, 0, - 0, 0, 520, 0, 0, 0, 811, 41, 0, 850, - 0, 2938, 0, 714, 0, 552, 0, 0, 44, 0, - 0, 0, 0, 0, 0, 0, 0, 850, 518, 0, - 0, 0, 0, 1537, 45, 1534, 520, 3468, 0, 1876, - 961, 850, 813, 0, 0, 1209, 0, 0, 3345, 811, - 520, 520, 520, 1542, 0, 0, 0, 0, 46, 0, - 1877, 1536, 0, 3483, -1776, 1210, 0, 0, 0, 0, - 0, 518, 47, 850, 1288, 0, 0, 520, 1878, 71, - 71, 0, 1879, 0, 2931, 1299, 0, 0, 0, 850, - 850, 850, 850, 0, 0, 0, 0, 0, 811, 0, - 0, 0, 0, 0, 1880, 1320, 1413, 1881, 0, 1542, - 0, 1211, 0, 0, 0, 0, 540, 0, 520, 0, - 518, 1537, 0, 1882, 0, 1910, 1911, 1912, 0, 1913, - 1914, 1915, 1916, 1917, 1918, 0, 0, 0, 1001, 1024, - 0, 850, 0, 0, 1411, 0, 0, 0, 0, 0, - 1001, 1001, 0, 0, 1536, 71, 552, 71, 0, 0, - 0, 0, 802, 0, -1776, 0, 541, 1534, 962, 802, - 0, 0, 553, 0, 0, 0, 1414, 1414, 553, 552, - 2880, 0, 1414, 0, 0, 543, 1468, 0, 0, 0, - 553, 544, 0, 813, 545, 0, 1549, 0, 71, 0, - 0, 0, 0, 0, 553, 553, 1212, 0, 0, 0, - 0, -1776, 1542, 0, 71, 0, 1883, 0, 71, 0, - 0, 0, 0, 1534, 1884, -1776, 0, 0, 0, 0, - -1776, 0, 0, 0, 0, -1776, 813, 0, 0, 0, - 0, 0, 0, 0, -1776, 552, 1885, 0, 0, -1776, - 0, 0, 0, 0, 0, 1213, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1214, 0, 553, 0, 0, - 0, 0, 1412, 1886, 0, 1610, 0, 1215, 1611, 0, - 0, -1776, 1612, 1613, 0, 813, 0, 0, 1536, 0, - 0, 0, 0, 1713, 1669, 0, 1671, 0, 0, 0, - 0, -1776, 1413, 0, 0, 0, 0, 1542, 0, 1216, - 0, 552, 552, 1621, 0, 0, 0, 0, 850, 0, - -2044, 0, 0, 0, 0, 0, 1534, 0, 0, 0, + 0, 1538, 0, 0, 1624, 0, 0, 2721, 2722, 2723, + 0, 553, 0, 1347, 0, 0, 0, 553, 1670, 0, + 1672, 0, 0, 0, 1389, 1714, 0, 1540, 0, 553, + 0, 0, 0, 0, 1414, 552, 552, 0, 0, 0, + 0, 0, 850, 553, 553, 0, 0, 0, 1911, 1912, + 1913, 0, 1914, 1915, 1916, 1917, 1918, 1919, 0, 0, + 0, 0, 0, 0, 1412, 1900, 1901, 0, 0, 0, + 0, 1921, 0, 1470, 0, 850, 1746, 0, 0, 0, + 0, 71, 0, 0, 0, 0, 0, 0, 850, 0, + 0, 2034, 0, 0, 1538, 0, 0, 0, 2035, 2036, + 1625, 0, 2037, 2038, 2039, 850, 553, 71, 0, 850, + 0, 0, 0, 0, 1794, 0, 0, 1626, 0, 0, + 1540, 0, 1627, 0, 0, 0, 0, 1541, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1605, + 0, 0, 0, 0, 0, 0, 2831, 0, 0, 1608, + 0, 0, 0, 0, 0, 0, 1415, 0, 0, 0, + 1630, 0, 0, 0, 0, 0, 0, 0, 0, 1658, + 1810, 0, 850, 0, 0, 0, 0, 0, 1663, 0, + 0, 850, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1045, 1848, 0, 1902, 0, 0, 0, 1903, 1904, + 0, 951, 1905, 1906, 1907, 0, 951, 0, 552, 552, + 0, 552, 951, 0, 0, 1633, 0, 0, 0, 3064, + 0, 0, 0, 0, 0, 0, 0, 0, 1538, 0, + 0, 0, 0, 0, 0, 2218, 0, 2975, 0, 1469, + 0, 0, 0, 0, 0, 2227, 0, 2230, 0, 0, + 2241, 1535, 0, 0, 1540, 0, 2245, 0, 2247, 1414, + 1414, 0, 0, 0, 0, 1414, 0, 0, 0, 0, + 0, 2254, 0, 0, 0, 0, 2257, 0, 0, 0, + 2262, 2263, 2264, 2265, 0, 2269, 2270, 0, 0, 1412, + 1412, 0, 0, 0, 1537, 1412, 0, 516, 0, 3011, + 3012, 3013, 3014, 0, 1541, 0, 0, 0, 0, 0, + 1001, 0, 552, 1945, 0, 1635, 0, 0, 0, 0, + 850, 0, 802, 0, 802, 0, 0, 802, 0, 0, + 0, 0, 802, 1542, 0, 802, 0, 802, 0, 0, + 0, 802, 0, 552, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1411, 71, 1537, 0, 0, 0, 0, 1623, 0, 0, - -1776, 850, 1745, -1776, 0, 0, 0, 0, 0, -1776, - 0, 1218, 0, 0, 850, 0, 0, 71, 0, 0, - -1791, 0, 0, 0, 0, 0, 0, 0, 0, 2217, - 0, 850, 0, 0, 1542, 850, 1219, 0, 0, 2226, - 1793, 2229, 0, 0, 2240, 0, 0, 0, 0, -1776, - 2244, 0, 2246, 0, 0, 1221, 0, 0, 0, 0, - 0, 0, 2788, 0, 0, 2253, 0, 0, 0, 2137, - 2256, 1534, -1776, 0, 2261, 2262, 2263, 2264, 0, 2268, - 2269, 0, 1536, 0, 0, 1537, 0, 0, 0, 0, - 0, 0, 0, -2044, 1536, 0, 1809, 0, 850, 0, - 0, 0, 0, 0, 0, 0, 0, 850, 0, 0, - -2044, 0, 0, 0, 1414, -2044, 0, 0, 1847, 0, - -1791, 0, 0, 0, 1536, 0, 0, 951, 0, 0, - 852, 1536, 951, 0, 552, 552, 0, 552, 951, 0, - 0, 1542, 0, 0, 854, 0, 0, 0, 1534, 0, - 0, 0, 0, -2044, 0, 0, 0, 0, -1776, 0, - 0, 0, 0, 0, 0, 1468, 0, -1791, -1776, 1536, - 0, 0, 0, 1536, 0, 1542, 0, 1413, 1413, 1536, - 0, -1791, 0, 1413, 0, 0, -1791, -1776, 0, -1776, - -1776, -1791, 0, 0, 0, 0, 0, 0, 0, 0, - -1791, 1536, 0, 0, 0, -1791, 0, 0, 1632, 892, - 0, 895, 0, 899, 0, 1411, 1411, 1008, 0, 1537, - 0, 1411, 1009, 516, 0, 0, -1776, 0, 0, -1776, - -1776, -1776, 0, 0, 0, 0, 1001, -1791, 552, 1944, - 0, 0, 0, 0, 1539, 0, 850, 0, 802, 0, - 802, 0, 0, 802, 1542, 1534, 0, -1791, 802, 0, - 0, 802, 0, 802, 0, 0, 0, 802, 0, 552, - 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1010, 0, 0, 0, 0, 0, 0, 0, 1534, - 0, 0, 0, 0, 0, 0, 0, 1542, 0, 0, - 0, 0, 0, 0, 0, 0, -1791, 0, -2044, -1791, - 0, 0, 0, 0, 0, -1791, 0, 0, 0, 1414, - 1414, 1414, 1414, 1414, 1414, 0, 0, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 0, 0, 0, - 0, 0, 0, 1899, 1900, 0, 0, 0, 1540, 1920, - 0, 0, 1011, 0, 0, -1791, 0, 0, 0, 0, - 553, 0, 0, 1537, 0, 0, 0, 0, 1534, 0, - 0, 0, 0, 0, 0, 1537, 0, 0, -1791, 2048, - 0, 0, 0, 0, 0, 0, 0, 0, 1012, 0, - 2058, 0, 0, 0, 0, 1541, 0, 0, 0, 1542, - 0, 0, 0, 0, 1013, 1537, 0, 0, 0, 0, - 0, 1534, 1537, 0, 1014, -2044, 0, 0, 0, 0, - 1539, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 951, - 0, 0, 0, 0, 0, 0, 852, 0, 0, 0, - 1859, 0, 0, 0, 0, 0, 0, 0, 1015, 0, - 1537, 0, 0, 0, 1537, 0, 0, 0, 0, 0, - 1537, 0, 0, 0, -1791, 2180, 0, 0, 0, 1964, - 0, 0, 0, 0, -1791, 0, 2145, 0, 850, 0, - 850, 0, 1537, 0, 0, 0, 0, 0, 0, 0, - 850, 2161, 0, -1791, 1016, -1791, -1791, 0, 0, 0, - 0, 1017, 536, 1411, 0, 0, 1414, 1414, 1539, 0, - 0, 1536, 0, 1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1540, 0, 0, -1308, 850, 0, - 552, 0, -1791, 0, 0, -1791, -1791, -1791, 0, 0, - 0, 1018, 0, 0, 0, 1745, 552, 0, 0, 0, - 0, 553, 553, 0, 0, 0, 552, 2227, 552, 2231, - 1019, 552, 0, 0, 0, 537, 0, 552, 0, 552, - 0, 1541, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 951, 552, 0, 0, 0, 951, 552, 0, 0, - 0, 552, 552, 552, 552, 1045, 552, 552, 1901, 0, - 0, 0, 1902, 1903, 0, 0, 1904, 1905, 1906, 0, - 0, 0, 1540, 2289, 0, 0, 0, 2670, 0, 538, - 1414, 1299, 0, 850, 850, 850, 850, 850, 0, 1020, - 0, 0, 0, 0, 1965, 0, 0, 920, 539, 0, - 0, 0, 927, 1536, 2318, 928, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2339, 0, 1541, - 0, 1542, 0, 0, 0, 0, 0, 0, 553, 0, - 1413, 1413, 1413, 1413, 1413, 1413, 0, 0, 1413, 1413, - 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 0, 0, - 0, 0, 0, 0, 0, 540, 0, 0, 0, 1536, - 0, 1196, -207, 0, 0, 0, 0, 1197, 1411, 1411, - 1411, 1411, 1411, 1411, 0, 1209, 1411, 1411, 1411, 1411, - 1411, 1411, 1411, 1411, 1411, 1411, 0, 0, 0, 1539, - 0, 0, 0, 0, 0, 1210, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 541, 552, 542, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 850, 0, - 0, 0, 0, 0, 543, 0, 0, 0, 802, 0, - 544, 0, 0, 545, 802, 1534, 0, 0, 0, 0, - 552, 1211, 0, 0, 0, 552, 0, 0, 0, 0, - 0, 0, 1537, 0, 2450, 2450, 0, 0, 0, 0, - 0, 0, 1536, 0, 0, 0, 0, 0, 1908, 1431, - 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1539, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1464, 1540, 0, 0, 2374, 2375, 2376, 2377, - 2378, 2379, 0, 0, 2383, 2384, 2385, 2386, 2387, 2388, - 2389, 2390, 2391, 2392, 0, 0, 0, 1413, 1413, 2836, - 2837, 0, 0, 552, 0, 0, 0, 2486, 0, 0, - 0, 0, 552, 0, 0, 0, 1212, 0, 1909, 0, - 1541, 0, 0, 0, 0, 0, 0, 2889, 0, 0, - 0, 0, 0, 986, 0, 1411, 1411, 1536, 1593, 0, - 0, 0, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, - 2950, 2951, 2048, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1537, 1213, 1540, 1414, 1414, 0, - 0, 0, 0, 0, 0, 1214, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 802, 0, 1215, 0, 0, - 0, 0, 0, 0, 0, 0, 1539, 552, 0, 0, - 0, 0, 802, 0, 553, 553, 2161, 0, 1199, 0, - 0, 1413, 0, 1541, 1536, 0, 0, 0, 0, 1216, - 1537, 0, 0, 1045, 0, 0, 1901, 1190, 0, 0, - 1902, 1903, 0, 0, 1904, 1905, 1906, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 552, 0, 0, 1411, - 0, 0, 552, 0, 0, 0, 0, 0, 0, 1287, - 0, 0, 0, 2495, 2496, 1217, 0, 0, 1809, 1201, - 0, 1218, 0, 0, 0, 1303, 1305, 1308, 1310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 0, 0, 0, 1219, 0, 0, 0, - 1540, 1220, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1221, 0, 0, 0, 14, - 15, 1536, 0, 1537, 0, 0, 0, 1406, 1910, 1911, - 1912, 0, 1913, 1914, 1915, 1916, 1917, 1918, 0, 1809, - 1539, 0, 0, 0, 0, 0, 850, 1541, 0, 0, - 0, 0, 1539, 0, 0, 1536, 0, 1299, 1414, 0, - 1809, 850, 850, 850, 23, 0, 0, 0, 0, 0, - 0, 0, 1203, 0, 552, 0, 850, 553, 553, 850, - 553, 0, 1539, 1414, 850, 0, 0, 0, 3117, 1539, - 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1809, 1809, - 0, 1809, 0, 1907, 0, 0, 0, 0, 1537, 0, - 0, 0, 0, 0, 0, 0, 0, 1539, 0, 0, - 0, 1539, 0, 0, 1536, 0, 1908, 1539, 0, 0, - 516, 0, 0, 0, 1540, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1540, 0, 0, 1539, - 2711, 0, 0, 0, 0, 0, 0, 0, 850, 850, - 850, 0, 0, 0, 0, 0, 0, 1536, 552, 0, - 1411, 553, 552, 0, 0, 0, 1540, 0, 552, 0, - 0, 1541, 0, 1540, 0, 1537, 0, 0, 0, 0, - 0, 0, 0, 1541, 0, 0, 1909, 27, 28, 29, - 0, 0, 1976, 0, 1980, 0, 0, 1414, 1413, 1413, - 0, 2048, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1540, 0, 1541, 0, 1540, 0, 1737, 0, 0, - 1541, 1540, 0, 0, 0, 0, 0, 0, 0, 0, - 1764, 0, 0, 0, 0, 0, 1411, 1411, 0, 0, - 0, 0, 0, 1540, 0, 0, 0, 0, 0, 0, - 0, 1789, 34, 0, 0, 0, 0, 0, 1541, 1536, - 0, 0, 1541, 36, 0, 2810, 0, 0, 1541, 0, - 0, 2161, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1537, 0, 0, 38, 0, 850, 0, 39, - 1541, 552, 0, 0, 0, 552, 552, 552, 0, 0, - 0, 1809, 1745, 1809, 0, 1847, 0, 0, 0, 40, - 0, 0, 0, 0, 1814, 0, 1537, 0, 0, 0, - 0, 0, 41, 1833, 552, 0, 2890, 0, 0, 0, - 0, 0, 0, 44, 0, 3262, 0, 1414, 0, 552, - 552, 552, 552, 552, 552, 552, 552, 552, 552, 45, - 0, 0, 0, 0, 0, 0, 3269, 3270, 0, 0, - 0, 0, 0, 1045, 2786, 2787, 1901, 0, 0, 0, - 1902, 1903, 2318, 46, 1904, 1905, 1906, 0, 850, 0, - 0, 0, 3284, 0, 0, 0, 0, 47, 0, 1413, - 1745, 3060, 0, 0, 0, 1537, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 1847, 0, 0, 0, - 0, 1107, 1107, 0, 3029, 0, 1809, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1411, 0, 0, - 0, 0, 0, 552, 0, 0, 0, 0, 1537, 0, - 850, 850, 850, 850, 0, 0, 0, 0, 0, 1539, - 0, 0, 1411, 553, 0, 1411, 0, 0, 3053, 552, - 951, 0, 1956, 0, 1610, 0, 0, 1611, 3044, 553, - 0, 1612, 1613, 0, 0, 1616, 1617, 1618, 1236, 553, - 0, 553, 1278, 1285, 553, 0, 0, 0, 0, 0, - 553, 0, 553, 0, 0, 3051, 0, 0, 0, 0, - 0, 0, 1621, 0, 0, 553, 0, 0, 0, 1622, - 553, 0, 0, 0, 553, 553, 553, 553, 0, 553, - 553, 1536, 0, 0, 0, 3074, 0, 802, 0, 0, - 0, 0, 0, 0, 0, 1335, 1623, 0, 0, 0, - 1537, 3086, 0, 0, 0, 2161, 0, 1414, 1413, 0, - 0, 2048, 0, 1540, 1360, 2999, 0, 0, 0, 0, - 1405, 0, 0, 1407, 0, 1745, 1418, 1421, 1426, 1429, - 0, 1809, 0, 0, 0, 0, 1908, 0, 0, 0, - 0, 1539, 0, 0, 951, 552, 1411, 0, 0, 0, - 0, 0, 850, 0, 0, 0, 0, 0, 0, 0, - 1541, 0, 0, 1045, 0, 0, 1901, 1471, 1278, 3137, - 1902, 1903, 0, 3452, 1904, 1905, 1906, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1555, 0, - 0, 0, 1624, 0, 0, 0, 0, 1539, 0, 0, - 0, 0, 0, 0, 0, 0, 1909, 1571, 0, 1625, - 0, 0, 0, 0, 1626, 0, 0, 0, 1581, 1582, - 1583, 0, 1587, 1591, 0, 0, 0, 0, 0, 553, - 0, 0, 0, 0, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 1540, 0, 3154, 1413, 0, - 0, 1809, 1629, 0, 2146, 1653, 2148, 0, 0, 0, - 0, 0, 0, 2437, 0, 2318, 2158, 0, 1980, 0, - 0, 0, 1471, 1471, 3118, 0, 0, 0, 0, 3188, - 0, 0, 0, 0, 0, 0, 1411, 0, 0, 0, - 1630, 0, 1541, 1631, 0, 0, 0, 0, 0, 0, - 1539, 1540, 0, 0, 2195, 0, 1691, 1632, 0, 0, - 1707, 1712, 3205, 0, 0, 0, 0, 0, 552, 0, - 0, 1107, 1107, 0, 0, 552, 1610, 0, 0, 1611, - 0, 0, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 0, 0, 0, 0, 0, 0, 553, 0, 1541, 0, - 0, 0, 0, 2206, 1619, 1593, 0, 0, 0, 3233, - 0, 0, 1537, 0, 1621, 0, 0, 0, 0, 0, - 0, 1622, 1045, 0, 0, 1901, 1908, 0, 1278, 1902, - 1903, 552, 0, 1904, 1905, 1906, 552, 1278, 0, 0, - 0, 0, 0, 0, 0, 1539, 0, 0, 1623, 2301, - 2302, 2304, 2305, 2306, 1540, 0, 0, 1634, 0, 0, - 0, 1278, 552, 0, 3192, 0, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 0, 0, 0, 0, - 0, 0, 0, 552, 552, 0, 0, 0, 0, 0, - 553, 0, 0, 0, 0, 0, 1909, 0, 0, 0, - 0, 1541, 850, 1045, 1745, 0, 1901, 0, 3323, 552, - 1902, 1903, 0, 0, 1904, 1905, 1906, 0, 0, 0, - 0, 0, 1539, 850, 0, 0, 3306, 0, 0, 0, - 0, 3061, 0, 0, 0, 0, 0, 0, 0, 553, - 0, 0, 0, 0, 1624, 2568, 1411, 0, 1891, 1540, - 552, 1001, 0, 1001, 0, 0, 0, 0, 0, 0, - 0, 1625, 0, 0, 1635, 0, 1626, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 3086, 0, - 0, 0, 0, 0, 2421, 850, 0, 0, 0, 1627, - 1628, 0, 0, 0, 0, 0, 1541, 0, 0, 0, - 0, 0, 0, 0, 1629, 0, 0, 0, 1426, 0, - 1426, 1426, 0, 0, 0, 0, 850, 0, 0, 0, - 0, 0, 0, 1107, 1107, 0, 1540, 0, 0, 1539, - 0, 0, 0, 0, 0, -2044, 0, 0, 0, 0, - 1107, 0, 1630, 0, 0, 1631, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3205, 0, 0, 0, 1632, - 0, 0, 1633, 1539, 0, 0, 0, 553, 0, 0, - 0, 0, 0, 1541, 0, 0, 0, 3306, 0, 0, + 0, 0, 1538, 0, 2554, 0, 0, 0, 0, 0, + 0, 1415, 1415, 0, 1538, 0, 0, 1415, 0, 0, + 0, 0, 1541, 0, 0, 0, 0, 0, 1540, 1872, + 0, 0, 0, 1470, 1909, 0, 0, 0, 0, 0, + 1540, 0, 0, 0, 1538, 0, 0, 0, 0, 0, + 0, 1538, 1636, 0, 0, -2046, -2046, -2046, 1537, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, + 1540, 0, 0, 0, 0, 0, 0, 1540, 0, 0, + 0, 3127, 0, 2049, 0, 0, 0, 0, 0, 1538, + 0, 0, 0, 1538, 2059, 1045, 0, 0, 1902, 1538, + 0, 0, 1903, 1904, 1910, 0, 1905, 1906, 1907, 0, + 0, 0, 0, 0, 1537, 1540, 0, 0, 0, 1540, + 0, 1538, 0, 0, 0, 1540, 0, 0, 0, 0, + 0, 0, 0, 951, 0, 0, 0, 0, 0, 0, + 1542, 0, 0, 0, 0, 0, 0, 1540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1745, 1909, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 1908, 951, 951, 0, - 3306, 951, 0, 0, 0, 0, 0, 0, 0, 1944, - 0, 0, 0, 1540, 0, 0, 0, 0, 0, 0, - 552, 0, 1539, 0, 0, 2023, 0, 0, 0, 0, - 0, 0, 0, 2026, 0, 0, 0, 0, 0, 1634, - 0, 0, 1745, 0, 0, 0, 0, 1540, 0, 3306, - 0, 553, 0, 0, 0, 553, 0, 0, 0, 0, - 1541, 1976, 0, 0, 0, 1539, 1909, 0, 0, 0, - 0, 0, 2072, 0, 0, 0, 0, 0, 2076, 2077, - 2078, 2079, 2080, 2081, 2082, 2083, 951, 0, 0, 0, - 2092, 2093, 0, 0, 1541, 2104, 0, 0, 0, 2107, - 0, 2161, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, - 2123, 0, 0, 2124, 0, 0, 0, 0, 0, 0, - 1107, 1610, 1278, 0, 1611, 0, 1540, 0, 1612, 1613, + 0, 0, 0, 0, 0, 0, 0, 2181, 0, 553, + 2146, 0, 850, 0, 850, 0, 0, 0, 2377, 2378, + 2379, 2380, 2381, 2382, 850, 2162, 2386, 2387, 2388, 2389, + 2390, 2391, 2392, 2393, 2394, 2395, 0, 1412, 0, 0, + 0, 0, 0, 0, 2040, 2041, 2042, 1537, 2043, 2044, + 2045, 2046, 2047, 2048, 0, 0, 0, 0, 1542, 0, + 0, 0, 850, 0, 552, 0, 0, 0, 0, 0, + 0, 0, 0, 1541, 0, 0, 0, 0, 0, 1746, + 552, 0, 0, 0, 2138, 0, 0, 0, 0, 0, + 552, 2228, 552, 2232, 0, 552, 0, 0, 0, 0, + 0, 552, 0, 552, 0, 0, 1860, 0, 0, 0, + 0, 1045, 0, 0, 1902, 951, 552, 0, 1903, 1904, + 951, 552, 1905, 1906, 1907, 552, 552, 552, 552, 1415, + 552, 552, 0, 0, 0, 0, 0, 0, 1909, 0, + 0, 0, 1537, 0, 1911, 1912, 1913, 2290, 1914, 1915, + 1916, 1917, 1918, 1919, 0, 1300, 0, 850, 850, 850, + 850, 850, 0, 0, 0, 0, 1541, 0, 2145, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2150, 0, 0, 0, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 1621, - 0, 0, 0, 0, 0, 0, -2044, 1539, 0, 1540, - 0, 0, 2472, 1541, 1582, 1583, 0, 0, 0, 0, - 0, 0, 0, 0, 553, 0, 0, 0, 553, 553, - 553, 0, 0, 1623, 0, 1910, 1911, 1912, 0, 1913, - 1914, 1915, 1916, 1917, 1918, 0, 0, 0, 0, 0, - 0, 0, 2644, 0, 0, 0, 1541, 553, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2659, 2660, 2662, - 0, 0, 553, 553, 553, 553, 553, 553, 553, 553, - 553, 553, 2673, 0, 0, 2676, 0, 0, 0, 0, - 2681, 0, 0, 0, 0, 0, 0, 0, 2789, 0, - 0, 0, 2272, 0, 0, 0, 1278, 0, 0, 2282, - 2283, 1540, 0, 0, 0, 0, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 0, 0, 0, -2044, + 0, 2340, 0, 0, 0, 0, 0, 0, 0, 0, + 553, 553, 0, 0, 0, 2498, 2499, 0, 1910, 0, + 0, 3282, 1414, 1414, 1414, 1414, 1414, 1414, 0, 1537, + 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, + 0, 0, 3307, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1412, 1412, 1412, 1412, 1412, 1412, 0, 0, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1542, + 552, 0, 0, 2673, 0, 0, 0, 1540, 0, 0, + 0, 0, 850, 0, 3346, 0, 2271, 0, 0, 0, + 1541, 0, 802, 0, 0, 0, 0, 0, 802, 2286, + 2286, 0, 0, 0, 552, 0, 0, 553, 0, 552, + 0, 0, 0, 0, -2046, 3372, 1537, 0, 2453, 2453, + 0, 717, 0, 0, 1415, 1415, 1415, 1415, 1415, 1415, + 0, 0, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, + 1415, 1415, 0, 0, 0, 0, 0, 0, 0, 0, + 1537, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1542, 0, 0, 0, 1347, 0, 0, 0, + 0, 0, 2362, 0, 0, 0, 0, 0, 718, 0, + 0, 0, 0, 0, 1910, 1538, 0, 552, 0, 1414, + 1414, 2489, 0, 0, 719, 0, 552, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1911, 1912, + 1913, 1540, 1914, 1915, 1916, 1917, 1918, 1919, 0, 1412, + 1412, 0, 0, 0, 0, 0, 0, 0, 0, 1537, + 0, 0, 0, 0, 1541, 0, 2049, 0, 0, 0, + 0, 1538, 0, 720, 0, 0, 1541, 0, 1432, 0, + 0, 0, 0, 721, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 722, 0, 1540, 0, 802, + 723, 1465, 1537, 0, 0, 0, 1541, 0, 0, 0, + 0, 552, 0, 1541, 0, 0, 802, 0, 0, 0, + 2162, 0, 0, 0, 0, 0, 1542, 0, 0, 724, + 0, 0, 0, 1414, 0, 0, 0, 0, 0, 0, + 0, 1415, 1415, 0, 0, 0, 0, 2839, 2840, 0, + 0, 1541, 0, 0, 0, 1541, 0, 1008, 0, 0, + 552, 1541, 1009, 1412, 0, 0, 552, 1594, 0, 0, + 0, 0, 725, 0, 1538, 2892, 726, 0, 0, 0, + 0, 0, 1810, 1541, 0, 0, 0, 0, 0, 0, + 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, + 1540, 0, 0, 0, 1537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2044, 0, 0, 0, - 1278, -2044, 0, 0, 0, 0, 0, 0, 1541, 0, - 0, 0, 0, 0, 0, 0, 1976, 0, 0, 1335, - 2347, 0, 0, 0, 2718, 2719, 2720, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -2044, - 0, 0, 2437, 0, 0, 0, 0, 0, 0, 2369, - 2370, 0, 2371, 0, 0, 0, 0, 0, 0, 0, + 0, 1010, 0, 0, 1911, 1912, 1913, 0, 1914, 1915, + 1916, 1917, 1918, 1919, 553, 553, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 0, 727, 0, 2789, 2790, + 0, 0, 0, 1810, 0, 1415, 0, 0, 0, 0, + 850, 728, 14, 15, 0, 0, 0, 0, 0, 1538, + 1542, 1300, 0, 0, 1810, 850, 850, 850, 0, 0, + 0, 0, 1542, 0, 0, 0, 0, 0, 552, 0, + 850, 0, 1011, 850, 729, 1540, 0, 730, 850, 0, + 1184, 0, 0, 0, 951, 0, 0, 23, 731, 0, + 0, 732, 1542, 0, 0, 0, 0, 0, 0, 1542, + 0, 0, 0, 0, 1810, 1810, 0, 1810, 1012, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1610, 0, 0, 1611, 0, -45, 0, 1612, 1613, 0, - 0, 2397, 2398, 0, 0, 2150, 0, 0, 0, 0, - 0, 0, 0, 0, 1632, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 1621, 3, - 4, 0, 0, 0, 2425, -2044, 0, 0, 0, 1539, - 2431, 0, 5, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 1471, 0, - 1278, 0, 1623, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 10, 0, 2828, 0, 0, 0, 0, 553, 0, - 0, 0, 0, 11, 0, 12, 2465, 0, 0, 0, - 0, 0, 1196, 0, 0, 0, 13, 0, 1197, 0, - 0, 0, 0, 0, -2044, 1008, 1209, 0, 0, 0, - 1009, 14, 15, 16, 0, 0, 0, 3064, 0, 0, - 0, 0, 17, 0, 0, 2484, 1210, 0, 18, 0, - 2487, 2488, 0, 1540, 0, 0, 19, 0, 20, 21, - 0, 0, 0, 0, 0, 0, 0, 0, -2044, 0, - 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, - 0, 0, 0, 0, 2972, -2044, 0, 0, 0, 1010, - -2044, 0, 1211, 0, 2509, 0, 0, 2512, 0, 2514, - 1541, 0, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2518, 0, 0, 25, 0, - 0, 0, 0, 1198, 0, 0, 0, 0, -2044, 0, - 0, -2044, 0, 0, 0, 0, 0, 0, 1639, 1640, - 1641, 1642, 1643, 1644, 26, 0, 3008, 3009, 3010, 3011, - 0, 0, 0, 0, 0, 1691, 0, 0, 0, 0, - 1011, 0, 0, 0, 0, 0, 0, 0, 1183, 0, - 0, 3213, 1712, 2122, 0, 0, 0, 0, 2437, 0, - 0, 0, 0, 1632, 0, 0, 0, 1212, 0, 0, - 0, 1107, 0, 0, 0, 1610, 1012, 0, 1611, 0, - 2572, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 1013, 0, 0, 0, 0, 0, 0, 27, - 28, 29, 1014, 1619, 0, 0, 0, 30, 1415, 0, - 31, 0, 0, 1621, 553, 0, 1213, 0, 0, 553, - 1622, 0, 0, 0, 0, 0, 1214, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1015, 1583, 1215, 32, - 0, 0, 0, 1278, 0, 553, 0, 1623, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 1184, 0, 1199, - 0, 0, 0, -2044, 34, 0, 553, 553, 0, 0, - 1216, 35, 0, 0, 0, 36, 0, 0, 3124, 0, - 0, 0, 1016, 0, 0, 37, 0, 0, 0, 1017, - 0, 0, 553, 1008, 0, 0, 0, 38, 1009, 0, - 0, 39, 2679, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2247, 0, 0, 0, - 1201, 40, 1218, 0, 0, 0, 0, 1647, 0, 1018, - 0, 0, 0, 553, 41, 0, 0, 42, 0, 0, - 43, 0, 0, 1624, 0, 44, 0, 1219, 1019, 0, - 0, 0, 2248, 0, 0, 0, 0, 1010, 0, 0, - 1625, 45, 0, 0, 0, 1626, 1221, 0, 0, 0, - -2044, 1647, 0, 0, 0, 0, 0, 1639, 1640, 1641, - 1642, 1643, 1644, 0, 0, 46, 0, 0, 1627, 1628, - 0, 0, 0, 1609, 0, 0, 0, 0, 1610, 47, - 0, 1611, -45, 1629, 1415, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 0, 0, 0, 1020, 0, 0, - 0, 0, 1185, 1203, 0, 0, 1619, 0, 1011, 0, - 1620, 0, 2757, 0, 0, 0, 1621, 0, 2759, 2026, - 0, 1630, 0, 1622, 1631, 0, 0, 0, 0, 2765, - 0, 0, 0, 0, 0, 0, 1647, 0, 1632, 0, - 2774, 1633, 0, 2777, 1012, 2779, 0, 0, 0, 0, - 1623, 0, 0, 2783, 0, 0, 0, 0, 0, 0, - 1013, 2790, 2791, 0, 0, 0, 0, 0, 2798, 0, - 1014, 0, 0, 0, 0, 0, 0, 0, 1647, 0, - 0, 0, 0, 2807, 0, 1647, 0, 0, 0, 0, - 0, 0, 0, 2822, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 553, 1015, 0, 0, 0, 0, 0, - 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1186, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1647, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, - 1016, 0, 0, 0, 0, 0, 0, 1017, 3279, 0, - 1647, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 2272, 0, 2272, 0, 0, 0, 0, 0, 0, 3304, + 0, 0, 0, 734, 1013, 0, 1538, 0, 0, 735, + 736, 0, 0, 0, 1014, 0, 516, 1542, 0, 0, + 737, 1542, 0, 2610, 0, 0, 738, 1542, 0, 0, + 0, 0, 1540, 0, 0, 0, 2714, 0, 0, 0, + 0, 0, 0, 0, 850, 850, 850, 0, 1015, 1542, + 0, 0, 0, 739, 552, 0, 1412, 0, 552, 0, + 0, 0, 0, 0, 552, 0, 0, 553, 553, 1185, + 553, 0, 0, 0, 0, 2642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 1018, 0, 0, - 0, 0, 0, 0, 0, 1647, 1629, 1647, 0, 1415, - 1415, 0, 1919, 0, 0, 1415, 1019, 0, 1647, 0, - 0, 1647, 0, 0, 0, 0, 1647, 0, 0, 1647, + 0, 0, 0, 2656, 1016, 0, 3120, 2049, 0, 3002, + 0, 1017, 1414, 1414, 0, 0, 0, 0, 0, 0, + 27, 28, 29, 1538, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1537, 0, 0, 0, + 0, 0, 1412, 1412, 0, 1347, 0, 0, 0, 1540, + 0, 1018, 0, 0, 2691, 0, 2692, 1538, 0, 0, + 2697, 0, 2700, 1541, 0, 0, 0, 0, 0, 0, + 1019, 2813, 0, 0, 0, 0, 0, 2162, 0, 0, + 0, 553, 0, 1540, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 850, 0, 0, 36, 552, 0, 0, + 0, 552, 552, 552, 0, 0, 0, 1810, 1746, 1810, + 0, 1848, 1977, 0, 1981, 0, 0, 0, 38, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 552, -1778, 2893, 0, 1415, 1415, 1538, 0, 0, 1020, + 0, 0, 0, 0, 1186, 552, 552, 552, 552, 552, + 552, 552, 552, 552, 552, 41, 0, 0, 0, 0, + 0, 0, 1540, 0, 0, 0, 44, 0, 3121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2319, 1538, + 0, 0, 45, 0, 850, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 0, 0, 1746, 1541, 0, 0, + 0, 0, 0, 1414, 0, 1540, 46, 0, 0, 0, + 0, 0, 1848, 0, 0, 0, 0, 0, 0, 0, + 47, 0, 1810, 1622, 0, 0, 0, 0, 3032, 0, + -2046, -1778, 0, 1412, 0, 0, 0, 0, 0, 552, + 0, 0, 0, 0, 0, 0, 850, 850, 850, 850, + 0, 0, 0, 1541, 0, 0, 0, 1624, 1412, 0, + 0, 1412, 0, 0, 0, 552, 951, 0, 0, 1542, + 0, 0, 3056, 3265, 3047, 0, 0, 0, -1778, 0, + 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1778, 0, 3272, 3273, 0, -1778, 0, 0, + 0, 3054, -1778, 0, 0, 2934, 0, 1540, 3195, 0, + 0, -1778, 0, 0, 0, 0, -1778, 0, 0, 0, + 3287, 0, 2788, 0, 0, 1415, 0, 0, 0, 0, + 0, 3077, 0, 802, 0, 0, 0, 0, 2642, 0, + 0, 0, 0, 0, 0, 0, 0, 3089, -1778, 0, + 1415, 2162, 0, -2046, 0, 0, 1541, 2049, 0, 0, + 0, 0, 1414, 0, 0, 0, 1197, 0, -1778, 0, + -2046, 1746, 1198, 553, 0, -2046, 0, 1810, 0, 0, + 1210, 0, 0, 0, 0, 0, 0, 0, 0, 553, + 951, 552, 1412, 0, 0, 0, 0, 0, 850, 553, + 1211, 553, 0, 1542, 553, 0, 0, 0, 0, 0, + 553, 0, 553, -2046, 0, 3140, 0, -1778, 0, 0, + -1778, 0, 0, 0, 0, 553, -1778, 0, 0, 0, + 553, 0, 0, 0, 553, 553, 553, 553, 0, 553, + 553, 0, 0, 0, 0, 0, 1212, 0, 0, 0, + 0, 1541, 0, 0, 0, 0, 0, 0, 0, 1542, + 0, 0, 0, 0, 0, 0, -1778, 0, 1633, 0, + 0, 0, 0, 0, 0, 0, 0, 1199, 0, 0, + 0, 0, 0, 0, 1415, 0, 0, 0, 0, -1778, + 0, 0, 0, 3157, 0, 0, 0, 1810, 0, 0, + 0, 3082, 1414, 0, 0, 0, 0, 1107, 1107, 0, + 0, 2319, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3191, 0, 0, 1541, 0, + 0, 0, 1412, 0, 0, 0, 0, 0, 0, 0, + 0, 1213, 0, 1538, 0, 0, 0, 852, 11, 0, + 0, 3455, 0, 0, 0, 0, 0, 0, 3208, 0, + 0, 0, 1542, 0, 552, 0, 0, 0, -2046, 1540, + 0, 552, 0, 0, 1237, -1778, 14, 15, 1279, 1286, + 0, 0, 0, 0, 0, -1778, 0, 0, 0, 553, + 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1215, 0, 0, 0, -1778, 3236, -1778, -1778, 0, 0, + 0, 0, 1216, 0, 0, 0, -1793, 0, 0, 0, + 0, 23, 0, 2440, 1415, 0, 0, 552, 1981, 0, + 0, 1336, 552, 1200, 0, 1541, 0, 0, 0, 0, + 0, 0, 0, -1778, 1217, 0, -1778, -1778, -1778, 0, + 1361, 0, 0, 0, 0, 0, 1406, 1542, 552, 1408, + 0, 0, 1419, 1422, 1427, 1430, 0, 0, 0, 1541, + 3172, 0, 0, 0, 0, -2046, 0, 0, 0, 552, + 552, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, + 1218, 0, 0, 1347, 1202, 0, 1219, 0, 850, 0, + 1746, 0, 0, 1472, 1279, 552, 553, 0, 0, 0, + 0, 0, 3326, 0, 0, 1594, -1793, 0, 0, 850, + 0, 1220, 3309, 0, 1556, 0, 1221, 0, 0, 0, + 0, 0, 0, 0, 1542, 0, 0, 0, 0, 0, + 1222, 0, 1412, 1572, 1365, 1366, 552, 1001, 1541, 1001, + 0, 0, 0, 0, 1582, 1583, 1584, 0, 1588, 1592, + 0, 0, 0, -1793, 27, 28, 29, 0, 0, 0, + 1364, 0, 815, 3239, 3089, 0, 0, -1793, 0, 0, + 0, 850, -1793, 0, 0, 1367, 1368, -1793, 0, 1369, + 1370, 1541, 1654, 0, 0, 0, -1793, 1204, 0, 0, + 553, -1793, 0, 0, 0, 0, 0, 0, 0, 1472, + 1472, 0, 850, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, -1793, 1415, 1365, 1366, 0, 0, 0, + 36, 1542, 2934, 1692, 0, 0, 0, 1708, 1713, 553, + 0, 3208, 0, -1793, 0, 2571, 0, 0, 1107, 1107, + 0, 0, 38, 0, 1371, 1372, 39, 0, 0, 0, + 0, 0, 0, 3309, 0, 1542, 1367, 1368, 0, 0, + 1369, 1370, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 1541, 0, 0, 0, 0, 0, 41, + 1746, 0, -1793, 0, 0, -1793, 0, 0, 0, 0, + 44, -1793, 0, 951, 951, 1279, 3309, 951, 0, 0, + 0, 0, 0, 0, 1279, 1945, 45, 0, 1373, 1374, + 1375, 1376, 1377, 1378, 1379, 1380, 552, 0, 1381, 1382, + 0, 0, 0, 0, 0, 0, 0, 0, 1279, 0, + 46, -1793, 0, 0, 1542, 1371, 1372, 0, 1746, 0, + 0, 0, 0, 0, 47, 3309, 0, 0, 0, 3367, + 0, 0, 0, 0, -1793, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3343, 0, 0, 1630, 1635, 0, 1631, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, - 0, 1632, 0, 0, 1633, 1894, 0, 3024, 3025, 0, - 0, 1647, 3369, 0, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1542, 0, 0, + 0, 0, 951, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2162, 0, 1373, + 1374, 1375, 1376, 1377, 1378, 1379, 1380, 0, 0, 1381, + 1382, 0, 852, 0, 0, 1892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3048, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3052, 0, 0, 0, - 0, 3054, 3055, 0, 0, 0, 3056, 0, 0, 0, - 0, 3059, 0, 0, 3062, 3063, 718, 0, 0, 2272, - 1278, 0, 0, 3071, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 0, 1107, 1647, 0, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1647, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1647, 1647, 1647, 0, 0, 0, 1647, 0, 0, - 0, 1647, 0, 0, 0, 1363, 0, 815, 3112, 0, - 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 721, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 722, 0, 3131, 0, 0, 723, 0, + 0, 1383, 1384, 0, 0, 0, 0, 0, 0, 0, + -1793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 553, 0, 0, 0, 553, 0, -1793, + 0, -1793, -1793, 1977, 0, 1427, 0, 1427, 1427, 1542, + 0, 0, 0, 0, 2934, 0, 0, 0, 0, 0, + 1107, 1107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1107, -1793, 0, + 0, -1793, -1793, -1793, 0, 0, 0, 0, 0, 0, + 0, 0, 1383, 1384, 0, 0, 1385, 1386, 0, 0, + 0, 1611, 0, 0, 1612, 1541, 0, 0, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, + 1387, 1388, 0, 0, 0, 0, 0, 0, 0, 1620, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1622, + 1994, 0, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, + 553, 553, 553, 1624, 0, 0, 0, 0, 0, 0, + 0, 0, 2024, 0, 0, 0, 0, 1385, 1386, 0, + 2027, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 0, 0, 0, 724, 0, 0, - 1364, 1365, 0, 0, 0, 0, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1647, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 1366, 1367, 0, 726, 1368, 1369, 1647, 0, 0, - 0, 1610, 1647, 0, 1611, 3165, 0, 0, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, 1919, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1619, - 0, 0, 0, 2769, 0, 0, 0, 0, 0, 1621, - 0, 0, 0, 0, 0, 0, 1622, 0, 1610, 0, - 0, 1611, 1591, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 727, 0, 0, 0, 0, 0, - 1370, 1371, 0, 1623, 0, 0, 1619, 0, 0, 728, - 0, 0, 0, 0, 0, 2484, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 3225, 3226, 0, 0, - 3227, 0, 1583, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 729, 0, 0, 730, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 0, 731, 3245, 0, 732, - 0, 0, 0, 0, 1372, 1373, 1374, 1375, 1376, 1377, - 1378, 1379, 0, 0, 1380, 1381, 0, 733, 0, 0, - 0, 3257, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 734, 0, 0, 0, 0, 0, 0, 736, 1624, - 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, - 0, 1647, 0, 0, 738, 0, 1625, 0, 0, 1919, - 1919, 1626, 1415, 1415, 1415, 1415, 1415, 1415, 0, 0, - 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, - 1919, 739, 0, 0, 1627, 1628, 1624, 0, 0, 0, - 0, 0, 3303, 0, 0, 0, 0, 0, 0, 1629, - 0, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 3024, 0, 0, 0, 3320, 0, 0, 0, 1107, 0, - 0, 0, 0, 0, 0, 0, 0, 1382, 1383, 3329, - 0, 1627, 1628, 0, 2272, 0, 2272, 1630, 0, 0, - 1631, 0, 0, 0, 1107, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 1632, 0, 0, 1633, 0, 0, - 0, 0, 3354, 0, 0, 0, 0, 0, 0, 0, + 0, 1387, 1388, 0, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 0, 0, 0, 0, 0, 2073, + 0, 0, 0, 0, 0, 2077, 2078, 2079, 2080, 2081, + 2082, 2083, 2084, 0, 0, 0, 0, 2093, 2094, 0, + 0, 0, 2105, 0, 0, 0, 2108, 0, 0, 2116, + 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 0, 1625, + 2125, 0, 0, 0, 0, 0, 0, 1107, 0, 1279, + 0, 0, 0, 0, 0, 0, 1626, 0, 0, 0, + 0, 1627, 0, 0, 0, 0, 0, 0, 2151, 0, + 0, 0, 0, 0, 0, -45, 0, 0, 1977, 0, + 0, 1542, 0, 0, 1628, 1629, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1630, + 0, 1583, 1584, 0, 2440, 0, 0, 2, 0, 3, + 4, 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, + 0, 0, 5, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 1631, 0, 0, + 1632, 0, 0, 0, 0, 0, 0, 0, 0, 1622, + 8, 0, 0, 0, 1633, 0, -2046, 1634, 0, 9, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 1624, 0, 0, 13, 0, 0, 2273, + 0, 0, 0, 1279, 0, 0, 2283, 2284, 0, 0, + 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 20, 21, + 553, 0, 0, 0, 0, 0, 0, 1279, 0, 0, + 0, 0, 22, 0, 0, 0, 23, 0, 2791, 0, + 0, 0, 0, 0, 1635, 0, 1336, 2348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 1630, 0, 1647, 1631, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, -2046, + 0, 0, 0, 0, 0, 0, 2372, 2373, 25, 2374, + 0, 0, 0, 0, 0, 1611, -2046, 0, 1612, 0, + 0, -2046, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 2400, 2401, + 0, 0, 2151, 1620, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 0, 0, 0, 0, 0, -2046, + 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2428, 0, 0, 0, 0, 0, 2434, 0, 0, + 0, 1636, 0, 0, 1637, 1638, 1639, 1624, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 1472, 0, 1279, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2475, 0, 27, + 28, 29, 0, 0, 1633, 0, 0, 30, 0, 0, + 31, 0, 0, 3216, 0, 0, 1416, 0, 0, 0, + 2440, 0, 0, 2468, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 0, - 0, 3380, 0, 0, 0, 0, 0, 1610, 0, 0, - 1611, 3024, 1384, 1385, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 1647, 1107, 0, 0, 1647, 1647, 1647, 1647, - 1647, 1647, 1647, 1647, 0, 1619, 1386, 1387, 0, 1415, - 1415, 0, 1647, 1647, 1634, 1621, 0, 0, 0, 0, - 0, 0, 1622, 0, 1647, 3423, 0, 1647, 0, 0, - 0, 0, 0, 0, 0, 1647, 1647, 1647, 1647, 1647, - 1647, 1647, 1647, 1647, 1647, 0, 0, 0, 0, 1623, + 0, 0, 2487, 0, 34, 717, 0, 2490, 2491, 0, + 0, 35, 0, 1625, 0, 36, 553, 0, 0, 0, + 0, 553, 0, 0, 0, 37, 0, 0, 0, 0, + 1626, 0, 0, 0, 0, 1627, 0, 38, 0, 0, + 0, 39, 0, 0, -2046, 0, 0, 553, 0, 0, + 0, 2512, 0, 0, 2515, 0, 2517, 0, 1628, 1629, + 0, 40, 718, 0, 0, 0, 0, 0, 553, 553, + 0, 0, 2521, 1630, 41, 1648, 0, 42, 719, 0, + 43, 0, 0, 0, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1631, 1692, 0, 1632, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 0, 46, 0, 720, 1633, 1713, + 2123, 1634, 0, 0, 0, 553, 0, 721, 0, 47, + 0, 0, -45, 0, 0, 0, 0, 0, 1107, 722, + 0, -2046, 0, 1416, 723, 0, 0, 2575, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1634, 0, 0, 1610, 0, 0, 1611, 0, 0, - 1647, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, + 0, 0, 0, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 0, 1648, 1617, 1618, 1619, 0, + 0, 0, 0, 0, 1584, 0, 0, 0, 0, 0, + 1279, 0, 0, 0, 0, 0, 725, 0, 1635, 0, + 726, 0, 0, 1622, 0, 0, 0, 0, 0, 0, + 1623, 0, 0, 0, 0, 0, 0, 1648, 0, 0, + 0, 0, 0, 0, 1648, 0, 1610, 0, 0, 0, + 0, 1611, 0, 0, 1612, 0, 0, 1624, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 2682, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1620, + 0, 0, 0, 1621, 0, 0, 0, 0, 0, 1622, + 727, 0, 0, 0, 1648, 0, 1623, 0, 0, 0, + 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 553, 0, 0, 0, 1648, + 0, 0, 0, 1624, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 729, 0, + 0, 730, 0, 0, 0, 1895, 0, 0, 0, 0, + 0, 0, 731, 1625, 0, 732, 0, 0, 0, 0, + 0, 0, 0, 0, 1648, 0, 1648, 0, 1416, 1416, + 1626, 1920, 0, 733, 1416, 1627, 0, 1648, 0, 0, + 1648, 0, 0, 0, 0, 1648, 0, 734, 1648, 0, + 0, 0, 0, 0, 736, 0, 0, 0, -2046, -2046, + 0, 2760, 0, 0, 737, 0, 0, 2762, 2027, 0, + 738, 0, 0, 1630, 0, 0, 0, 0, 2768, 1625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2777, + 1648, 0, 2780, 0, 2782, 0, 1626, 739, 0, 0, + 0, 1627, 2786, 0, 0, 0, 0, 0, 0, 0, + 2793, 2794, 0, 0, -2046, 0, 0, 2801, 0, 0, + 0, 0, 0, 0, 1628, 1629, 0, 0, 1633, 0, + 0, 0, 2810, 0, 0, 0, 0, 0, 0, 1630, + 0, 0, 2825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1619, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1621, 0, 0, 0, 0, 0, 0, 1622, - 0, 0, 0, 3477, 3477, 3477, 0, 0, 0, 0, - 0, 1635, 0, 1415, 1636, 1637, 1638, 0, 1639, 1640, - 1641, 1642, 1643, 1644, 0, 0, 1623, 0, 2063, 0, - 3477, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1648, 0, 0, 1631, 0, 0, + 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 1633, 0, 0, 1634, 0, 0, + 1648, 1648, 1648, 0, 0, 0, 1648, 0, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 0, 0, 2273, + 0, 2273, 0, 0, 0, 0, 0, 0, 1635, 0, + 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 3477, 0, 0, 0, 2063, 0, 0, 0, 0, - 1627, 1628, 1647, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1647, 1647, 0, 1629, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1611, 0, + 0, 1612, 0, 0, 0, 1613, 1614, 0, 1622, 0, + 0, 0, 1648, 0, 0, -2046, 0, 1611, 0, 0, + 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 0, 0, 0, 1635, 0, 1622, 0, 0, 0, + 0, 0, 1624, -2046, 0, 1620, 0, 0, 0, 2772, + 1648, 0, 0, 0, 0, 1622, 3027, 3028, 0, 0, + 0, 0, 1623, 0, 0, 0, 1648, 0, 0, 0, + 1624, 1648, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 1920, 1624, + 0, 3051, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3055, 0, 2792, 0, 0, + 3057, 3058, 0, 0, 0, 3059, 0, 0, 0, 0, + 3062, 0, 0, 3065, 3066, 0, 0, 0, 2273, 1279, + 0, 0, 3074, 0, 0, 3067, 0, 0, -2046, 0, + 0, 1636, 0, 1107, 1637, 1638, 1639, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, -2046, 0, 0, 0, 0, + -2046, 0, 0, 0, 0, 0, -2046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2046, 0, 1625, 0, 3115, -2046, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -2046, 0, + 0, 0, 1626, 0, 0, 0, 0, 1627, 0, 0, + 0, 0, 0, 0, 3134, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2046, 0, 0, 0, + 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1630, 0, 0, 0, 0, + 1648, 0, 0, 1633, 0, 0, 0, 0, 1920, 1920, + 0, 1416, 1416, 1416, 1416, 1416, 1416, 0, 0, 1416, + 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1920, + 0, 1633, 0, 1631, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1630, 0, 0, 1631, 0, 0, 1625, - 0, 0, 0, 0, 1626, 0, 0, 0, 0, 0, - 1632, 0, 0, 1633, 0, 0, 0, 1647, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1647, - 1647, 1647, 1629, 0, 1919, 1919, 1919, 1919, 1919, 1919, - 0, 0, 0, 1919, 1919, 1919, 1919, 1919, 1919, 1919, - 1919, 1919, 1919, 0, 0, 0, 0, 1647, 1647, 0, + 1633, 0, 0, 1634, 3168, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1611, 0, + 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1620, 0, 0, 0, + 0, 1592, 0, -2046, 0, 0, 1622, 0, 0, 0, + 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1630, 0, 0, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1647, 0, 1632, 0, 0, - 1633, 1647, 0, 0, 1610, 0, 0, 1611, 0, 0, - 1634, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, + 0, -2046, 1648, 0, 2487, 1648, 0, 0, 0, 0, + 1624, 0, 0, 0, 0, 3228, 3229, 0, 0, 3230, + 1635, 1584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1619, 0, 0, 1647, 0, 0, 0, 0, - 0, 0, 1621, 0, 0, 0, 0, 0, 0, 1622, - 0, 0, 0, 0, 1647, 0, 0, 1647, 1647, 0, - 0, 0, 0, 0, 0, 1919, 1919, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1623, 0, 0, 1647, - 1415, 1415, 1647, 0, 1647, 0, 0, 0, 1647, 0, - 0, 0, 0, 0, 0, 0, 0, 1634, 0, 0, + 0, 0, 0, 0, 0, 0, 3248, 0, 0, 0, + 0, 1648, 0, 0, 0, 1648, 1648, 1648, 1648, 1648, + 1648, 1648, 1648, 0, 0, 0, 0, 0, 1416, 1416, + 3260, 1648, 1648, 0, 0, 0, 0, 0, 0, 0, + -2046, 0, 0, 1648, 0, 0, 1648, 1640, 1641, 1642, + 1643, 1644, 1645, 0, 1648, 1648, 1648, 1648, 1648, 1648, + 1648, 1648, 1648, 1648, 0, 0, 1625, 0, -2046, 0, + 0, 0, 0, 0, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 0, 0, 1626, 0, 0, 0, 1636, 1627, 1648, + 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, + 0, 3306, 0, 0, 2064, 0, 0, 0, 0, 0, + 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 3027, + 0, 0, 0, 3323, 0, 0, 1630, 1107, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3332, 0, + 0, 0, 1416, 2273, 0, 2273, 0, 0, 0, 0, + 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1631, 0, 0, 1632, 0, 0, + 0, 3357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1633, 0, 0, 1634, 0, 0, 0, 1611, 0, + 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1648, 0, 0, 0, 0, 1620, 0, 0, 0, + 3383, 1648, 1648, 0, 0, 0, 1622, 0, 0, 0, + 3027, 0, 0, 1623, 0, 0, 0, 0, 0, 0, + 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 0, 0, 2368, 0, 0, 0, 0, 0, - 0, 0, 1647, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1610, 0, 0, 1611, 0, 0, 0, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, - 1619, 0, 0, 0, 0, 0, 0, 0, 0, 1625, - 1621, 0, 0, 0, 1626, 0, 0, 1622, 0, 0, - 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 1627, 1628, 0, - 0, 2469, 0, 0, 1623, 0, 0, 1610, 0, 0, - 1611, 0, 1629, 0, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 1647, - 0, 0, 0, 0, 0, 1619, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1621, 0, 0, 0, 0, - 1630, 1415, 1622, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, - 1633, 0, 0, 0, 0, 0, 0, 0, 0, 1623, + 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3426, 0, 0, 0, 0, 0, + 0, 1635, 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1610, 0, 0, 1611, 0, 0, 0, 1612, 1613, 0, - 1624, 1616, 1617, 1618, 0, 0, 0, 1647, 0, 1647, - 0, 0, 0, 0, 0, 1647, 0, 1625, 1619, 0, - 0, 0, 1626, 0, 1647, 0, 0, 1647, 1621, 1647, - 0, 0, 0, 1647, 0, 1622, 1919, 1919, 0, 0, - 1647, 1647, 0, 0, 0, 1627, 1628, 0, 1647, 0, - 0, 0, 0, 0, 0, 0, 0, 1647, 0, 0, - 1629, 0, 1623, 0, 0, 0, 0, 1634, 0, 0, - 0, 0, 1647, 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 1630, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 0, 0, - 1415, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 1627, 1628, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1629, 0, 0, 0, 0, + 1648, 1648, 1648, 0, 0, 1920, 1920, 1920, 1920, 1920, + 1920, 0, 0, 0, 1920, 1920, 1920, 1920, 1920, 1920, + 1920, 1920, 1920, 1920, 0, 0, 0, 0, 1648, 1648, + 0, 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1625, 0, 0, 0, + 0, 0, 3480, 3480, 3480, 0, 1648, 0, 0, 0, + 1620, 0, 1648, 1626, 0, 0, 0, 0, 1627, 0, + 1622, 0, 0, 0, 0, 0, 0, 1623, 1636, 3480, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 1628, 1629, 0, 0, 2064, 1648, 0, 0, 0, + 0, 0, 0, 0, 1624, 0, 1630, 0, 0, 0, + 0, 0, 0, 0, 0, 1648, 0, 0, 1648, 1648, + 3480, 0, 0, 0, 0, 0, 1920, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1624, 0, - 1364, 1365, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1630, 1635, 1625, 1631, 1636, 1637, 1638, - 1626, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 0, - 1632, 2493, 0, 1633, 0, 0, 0, 0, 1364, 1365, - 0, 1366, 1367, 1627, 1628, 1368, 1369, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 0, 1629, 0, + 1648, 1416, 1416, 1648, 1631, 1648, 0, 1632, 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1366, - 1367, 0, 0, 1368, 1369, 0, 0, 0, 0, 1919, - 1415, 0, 0, 0, 0, 0, 1630, 0, 0, 1631, + 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1632, 1647, 1647, 1633, 0, 0, 0, - 1370, 1371, 0, 0, 0, 0, 0, 0, 0, 0, - 1634, 0, 0, 0, 0, 0, 0, 0, 1647, 0, - 0, 0, 1647, 0, 1647, 1647, 1647, 0, 0, 1647, - 0, 0, 1647, 1647, 0, 0, 0, 0, 1370, 1371, - 0, 1647, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, 2699, - 0, 0, 0, 0, 1372, 1373, 1374, 1375, 1376, 1377, - 1378, 1379, 0, 0, 1380, 1381, 0, 0, 0, 0, - 0, 0, 1647, 0, 0, 0, 0, 0, 1919, 0, - 0, 0, 0, 1634, 0, 0, 0, 0, 0, 0, - 0, 1647, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, - 0, 0, 1380, 1381, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 0, 0, 2771, 1647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1919, 0, 0, 0, 0, 0, 0, 0, + 1625, 0, 0, 1648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1626, 0, 0, + 0, 1611, 1627, 0, 1612, 0, 0, 0, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1628, 1629, 0, 0, 1620, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1622, + 1630, 1635, 0, 0, 0, 0, 1623, 0, 0, 0, + 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, + 0, 0, 0, 1624, 0, 0, 0, 0, 1631, 1620, + 0, 1632, 0, 0, 0, 0, 0, 0, 0, 1622, + 1648, 0, 0, 0, 0, 1633, 1623, 1197, 1634, 0, + 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, + 0, 1210, 1416, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1624, 0, 0, 0, 0, 0, 0, + 0, 1211, 0, 1611, 0, 0, 1612, 0, 0, 0, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 1636, 0, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 1620, 0, 0, 0, 2371, 0, 0, 1648, 1625, + 1648, 1622, 0, 0, 0, 0, 1648, 1212, 1623, 0, + 0, 0, 0, 0, 0, 1648, 1626, 0, 1648, 0, + 1648, 1627, 0, 0, 1648, 1635, 0, 1920, 1920, 0, + 0, 1648, 1648, 0, 0, 1624, 0, 0, 1199, 1648, + 0, 0, 0, 0, 1628, 1629, 0, 0, 1648, 1625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, + 0, 0, 0, 1648, 0, 0, 1626, 0, 0, 0, + 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1382, 1383, 0, - 0, 0, 0, 0, 0, 1647, 1647, 1647, 0, 0, - 1635, 0, 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, - 1642, 1643, 1644, 0, 0, 1647, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1382, 1383, 1647, 0, 0, + 0, 0, 0, 0, 1628, 1629, 0, 1631, 0, 0, + 1632, 1416, 1213, 0, 0, 0, 0, 0, 0, 1630, + 0, 0, 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1625, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 1631, 1626, 2472, + 1632, 1214, 0, 1627, 0, 0, 0, 0, 0, 0, + 0, 1215, 0, 0, 1633, 0, 0, 1634, 0, 0, + 0, 0, 0, 1216, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1630, 0, 0, 1200, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1217, 0, 0, 0, 0, + 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 1365, 1366, 1632, 0, 0, 0, 0, 0, 0, 0, + 1920, 1416, 0, 0, 0, 0, 1633, 0, 0, 1634, + 0, 2248, 0, 0, 0, 1202, 0, 1219, 0, 0, + 0, 0, 0, 0, 1635, 1648, 1648, 0, 0, 0, + 0, 1367, 1368, 0, 0, 1369, 1370, 0, 0, 0, + 0, 0, 1220, 0, 0, 0, 0, 2249, 0, 1648, + 0, 0, 0, 1648, 0, 1648, 1648, 1648, 0, 0, + 1648, 1222, 0, 1648, 1648, 0, 0, 0, 0, 0, + 0, 0, 1648, 0, 0, 0, 0, 0, 0, 0, + 0, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 0, 0, 2496, 0, + 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, + 1371, 1372, 0, 1648, 0, 0, 0, 0, 1204, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1636, 1648, 0, 1637, 1638, 1639, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 0, 0, 2702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 0, 0, 0, 0, 0, 0, - 0, 0, 1384, 1385, 0, 0, 0, 0, 0, 0, - 1647, 0, 0, 0, 0, 0, 0, 0, 0, 1647, - 0, 0, 0, 0, 0, 0, 1386, 1387, 0, 0, + 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, + 0, 0, 0, 0, 1373, 1374, 1375, 1376, 1377, 1378, + 1379, 1380, 0, 0, 1381, 1382, 0, 0, 0, 0, + 0, 0, 0, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1384, 1385, 0, 0, 1647, 0, 1993, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 1648, 1648, 1648, 0, + 2774, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1386, 1387, 0, 0, 0, 0, - 1647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 116, 1042, 815, 1043, - 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, - 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, - 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, - 149, 150, 151, 152, 1053, 1054, 155, 1647, 156, 157, - 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, - 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, - 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, - 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, - 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, - 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1069, 321, 1070, 323, 324, 325, 326, 1071, 327, 328, - 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, - 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, - 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, - 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, - 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, - 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, - 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, - 0, 0, 1088, 1089, 0, 1090, 1091, 2624, 116, 1042, - 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, - 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, - 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, - 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, - 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, - 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, - 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, - 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, - 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, - 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, - 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, - 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, - 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, - 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, - 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 1071, - 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, - 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, - 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, - 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, - 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, - 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, - 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, - 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, - 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, - 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, - 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, - 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 3228, - 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, - 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, - 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, - 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, - 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, - 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, - 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, - 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, - 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, - 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, - 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, - 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, - 229, 1062, 231, 0, 232, 0, 233, 234, 23, 235, - 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, - 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, - 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, - 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, - 326, 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, - 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, - 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 27, 28, 29, 0, 360, 361, 793, 363, 364, - 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, - 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, - 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, - 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 34, 0, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 36, 426, 427, - 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 795, 38, - 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, - 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, - 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, - 470, 0, 0, 471, 472, 473, 41, 474, 475, 476, - 477, 0, 478, 479, 480, 481, 482, 799, 1081, 0, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, - 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 1082, 0, 46, 0, 0, - 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, - 0, 1087, 3203, 0, 0, 0, 1088, 1089, 0, 1090, - 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1383, 1384, 0, + 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1648, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1385, 1386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 116, 1042, 815, + 1043, 1044, 1045, 1046, 1047, 0, 1387, 1388, 0, 0, + 0, 0, 0, 0, 1648, 0, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, + 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, + 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, + 785, 149, 150, 151, 152, 1053, 1054, 155, 1648, 156, + 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, + 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, + 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, + 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, + 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, + 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, + 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, + 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 1069, 321, 1070, 323, 324, 325, 326, 1071, 327, + 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, + 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, + 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, + 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, + 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, + 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, + 0, 0, 0, 1088, 1089, 0, 1090, 1091, 2627, 116, + 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, + 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, + 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, + 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, + 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, + 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, + 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, + 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, + 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, + 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, + 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, + 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, + 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, + 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, + 3231, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, @@ -395327,7 +398191,7 @@ static const yytype_int16 yytable[] = 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 46, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, - 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, + 1086, 0, 1087, 3206, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, @@ -395340,7 +398204,7 @@ static const yytype_int16 yytable[] = 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, - 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, + 196, 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, @@ -395366,10 +398230,10 @@ static const yytype_int16 yytable[] = 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 34, 0, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 36, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 795, 0, 0, 446, 447, 39, 448, 449, 450, 451, + 795, 38, 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, @@ -395380,478 +398244,478 @@ static const yytype_int16 yytable[] = 509, 510, 511, 512, 513, 514, 515, 1082, 0, 46, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 1241, 1042, 815, 1043, 1044, 1045, 1046, + 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 1242, 125, 126, 127, 0, 0, 0, 1243, 0, 1048, - 0, 0, 1244, 129, 130, 0, 131, 132, 133, 1245, - 135, 136, 137, 138, 1049, 1246, 1050, 1051, 0, 143, + 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, + 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, + 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, - 0, 1247, 0, 1248, 163, 164, 165, 166, 167, 1249, + 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 1250, 179, 180, 181, 182, 183, 184, 185, 186, + 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 1251, 0, 205, 206, 1059, 208, 209, 0, + 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, - 1252, 0, 1253, 236, 237, 1254, 1255, 240, 0, 241, + 234, 23, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 1256, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 1257, 267, + 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, + 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, - 276, 1258, 1259, 279, 1260, 281, 282, 283, 284, 285, - 286, 0, 0, 287, 1261, 289, 1262, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 1263, 300, 301, 302, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, + 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 1069, 1264, 1070, - 323, 324, 325, 326, 1071, 327, 328, 1265, 330, 1072, + 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, + 323, 324, 325, 326, 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, - 0, 1074, 340, 341, 0, 0, 342, 343, 344, 1266, - 346, 1267, 792, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, - 793, 1268, 364, 365, 366, 367, 368, 369, 0, 370, + 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, + 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, + 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 1269, 400, 401, 402, 1076, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, - 1270, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 1271, 427, 428, 1077, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 1272, - 444, 795, 0, 0, 446, 447, 0, 448, 1273, 450, + 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 34, + 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 795, 0, 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, - 458, 459, 796, 461, 797, 1080, 463, 464, 1274, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, + 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, + 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 483, 1081, 1275, 485, 1276, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, + 799, 1081, 0, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, - 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, - 0, 0, 1086, 0, 1087, 1277, 0, 0, 0, 1088, - 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, + 46, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, + 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, + 1089, 0, 1090, 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, - 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, + 124, 1243, 125, 126, 127, 0, 0, 0, 1244, 0, + 1048, 0, 0, 1245, 129, 130, 0, 131, 132, 133, + 1246, 135, 136, 137, 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, - 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 1056, 190, 191, 1057, 193, 0, 194, - 0, 195, 196, 197, 198, 199, 200, 14, 15, 201, - 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 786, 0, 1248, 0, 1249, 163, 164, 165, 166, 167, + 1250, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 1252, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, - 233, 234, 23, 235, 236, 237, 238, 239, 240, 0, + 233, 1253, 0, 1254, 236, 237, 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, + 249, 250, 251, 252, 1257, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 1258, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, - 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, + 0, 276, 1259, 1260, 279, 1261, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 1262, 289, 1263, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, - 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 312, 313, 314, 315, 316, 317, 318, 319, 1069, 1265, + 1070, 323, 324, 325, 326, 1071, 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 27, 28, 29, 0, 360, - 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, + 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, + 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, + 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 34, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 36, 426, 427, 428, 1077, 430, 0, 431, 432, + 0, 1271, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 795, 38, 0, 446, 447, 39, 448, 449, + 1273, 444, 795, 0, 0, 446, 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, - 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, + 0, 458, 459, 796, 461, 797, 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 41, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 799, 1081, 0, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 1081, 1276, 485, 1277, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, - 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, + 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, + 0, 0, 0, 1086, 0, 1087, 1278, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, - 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, + 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, - 1422, 143, 144, 145, 146, 147, 148, 1052, 785, 149, + 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, - 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, + 159, 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, - 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, - 0, 233, 234, 1423, 235, 236, 237, 238, 239, 240, + 0, 233, 234, 23, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 0, 1424, 287, 288, 289, 290, 0, + 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, - 321, 1070, 323, 324, 325, 326, 1071, 327, 328, 329, + 321, 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, - 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 354, 355, 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, + 416, 34, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 36, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, + 442, 443, 444, 795, 38, 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, - 0, 1425, 458, 459, 796, 461, 797, 1080, 463, 464, + 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, - 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, - 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 473, 41, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 799, 1081, 0, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, - 0, 1088, 1089, 0, 1090, 1091, 1241, 1042, 815, 1043, + 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 1243, 0, 1048, 0, 0, 1244, 129, 130, 0, 131, - 132, 133, 1245, 135, 136, 137, 138, 1049, 1246, 1050, - 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, + 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, + 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, + 1051, 1423, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, - 158, 159, 786, 0, 1247, 0, 1248, 163, 164, 165, - 166, 167, 1249, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 1250, 179, 180, 181, 182, 183, + 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, + 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, - 232, 0, 233, 1252, 0, 1253, 236, 237, 1254, 1255, + 232, 0, 233, 234, 1424, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 1256, 254, 255, 256, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 1257, 267, 268, 269, 270, 271, 272, 1065, 1066, - 0, 1067, 0, 276, 1258, 1259, 279, 1260, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 1261, 289, 1262, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1263, + 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, + 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 0, 1425, 287, 288, 289, 290, + 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1069, 1264, 1070, 323, 324, 325, 326, 1071, 327, 328, - 1265, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, + 1069, 321, 1070, 323, 324, 325, 326, 1071, 327, 328, + 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, - 343, 344, 1266, 346, 1267, 792, 349, 350, 351, 352, + 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 793, 1268, 364, 365, 366, 367, 368, + 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 1269, 400, 401, 402, 1076, 404, + 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 1270, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 1271, 427, 428, 1077, 430, 0, + 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 1272, 444, 795, 0, 0, 446, 447, 0, - 448, 1273, 450, 451, 452, 453, 454, 0, 455, 1078, - 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, - 464, 1274, 466, 467, 468, 469, 470, 0, 0, 471, + 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, + 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, + 1079, 0, 1426, 458, 459, 796, 461, 797, 1080, 463, + 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 1081, 2277, 485, 1276, 487, 488, + 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, - 0, 0, 1088, 1089, 0, 1090, 1091, 1241, 1042, 815, + 0, 0, 1088, 1089, 0, 1090, 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, - 0, 1243, 0, 1048, 0, 0, 1244, 129, 130, 0, - 131, 132, 133, 1245, 135, 136, 137, 138, 1049, 1246, + 0, 1244, 0, 1048, 0, 0, 1245, 129, 130, 0, + 131, 132, 133, 1246, 135, 136, 137, 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, - 157, 158, 159, 786, 0, 1247, 0, 1248, 163, 164, - 165, 166, 167, 1249, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 1250, 179, 180, 181, 182, + 157, 158, 159, 786, 0, 1248, 0, 1249, 163, 164, + 165, 166, 167, 1250, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, - 0, 232, 0, 233, 1252, 0, 1253, 236, 237, 1254, - 1255, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, - 246, 247, 248, 249, 250, 251, 252, 1256, 254, 255, + 0, 232, 0, 233, 1253, 0, 1254, 236, 237, 1255, + 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 1257, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, - 0, 265, 1257, 267, 268, 269, 270, 271, 272, 1065, - 1066, 0, 1067, 0, 276, 1258, 1259, 279, 1260, 281, - 282, 283, 284, 285, 286, 0, 0, 287, 1261, 289, - 1262, 0, 291, 292, 293, 294, 295, 296, 297, 298, - 1263, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 0, 265, 1258, 267, 268, 269, 270, 271, 272, 1065, + 1066, 0, 1067, 0, 276, 1259, 1260, 279, 1261, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 1262, 289, + 1263, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 1069, 1264, 1070, 323, 324, 325, 326, 1071, 327, - 328, 1265, 330, 1072, 790, 332, 1073, 334, 335, 336, + 319, 1069, 1265, 1070, 323, 324, 325, 326, 1071, 327, + 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, - 342, 343, 344, 1266, 346, 1267, 792, 349, 350, 351, + 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, - 0, 0, 360, 361, 793, 1268, 364, 365, 366, 367, + 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 1269, 400, 401, 402, 1076, + 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 0, 1270, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 0, 1271, 427, 428, 1077, 430, + 414, 415, 416, 0, 1271, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 1272, 444, 795, 0, 0, 446, 447, - 0, 448, 1273, 450, 451, 452, 453, 454, 0, 455, + 440, 441, 442, 1273, 444, 795, 0, 0, 446, 447, + 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, - 463, 464, 1274, 466, 467, 468, 469, 470, 0, 0, + 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, - 479, 480, 481, 482, 483, 1081, 0, 485, 1276, 487, + 479, 480, 481, 482, 483, 1081, 2278, 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, - 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 2334, - 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, + 0, 0, 0, 1088, 1089, 0, 1090, 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, -1109, 125, 126, 127, 0, - 0, 0, 0, -1109, 1048, 0, 0, 128, 129, 130, - 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, - 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, + 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, + 0, 0, 1244, 0, 1048, 0, 0, 1245, 129, 130, + 0, 131, 132, 133, 1246, 135, 136, 137, 138, 1049, + 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, - 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, + 156, 157, 158, 159, 786, 0, 1248, 0, 1249, 163, + 164, 165, 166, 167, 1250, 169, 170, 171, 0, 172, + 173, 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, - 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, - 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 231, 0, 232, 0, 233, 1253, 0, 1254, 236, 237, + 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, + 0, 246, 247, 248, 249, 250, 251, 252, 1257, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, - 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, - 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, + 264, 0, 265, 1258, 267, 268, 269, 270, 271, 272, + 1065, 1066, 0, 1067, 0, 276, 1259, 1260, 279, 1261, + 281, 282, 283, 284, 285, 286, 0, 0, 287, 1262, + 289, 1263, 0, 291, 292, 293, 294, 295, 296, 297, + 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 1071, - 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, + 318, 319, 1069, 1265, 1070, 323, 324, 325, 326, 1071, + 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, - 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, + 0, 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, - 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, + 0, 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, + 394, 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, - 430, -1109, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, + 413, 414, 415, 416, 0, 1271, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 0, 1272, 427, 428, 1077, + 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 1273, 444, 795, 0, 0, 446, + 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, - 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, + 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, + 478, 479, 480, 481, 482, 483, 1081, 0, 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, - 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 1241, + 2335, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, - 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 0, 1243, 0, 1048, 0, 0, 1244, 129, - 130, 0, 131, 132, 133, 1245, 135, 136, 137, 138, - 1049, 1246, 1050, 1051, 0, 143, 144, 145, 146, 147, + 119, 120, 121, 122, 123, 124, -1111, 125, 126, 127, + 0, 0, 0, 0, -1111, 1048, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, - 0, 156, 157, 158, 159, 786, 0, 1247, 0, 1248, - 163, 164, 165, 166, 167, 1249, 169, 170, 171, 0, - 172, 173, 174, 175, 176, 177, 0, 1250, 179, 180, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, - 1062, 231, 0, 232, 0, 233, 1252, 0, 1253, 236, - 237, 1254, 1255, 240, 0, 241, 0, 1063, 1064, 244, - 245, 0, 246, 247, 248, 249, 250, 251, 252, 1256, + 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 0, 265, 1257, 267, 268, 269, 270, 271, - 272, 1065, 1066, 0, 1067, 0, 276, 1258, 1259, 279, - 1260, 281, 282, 283, 284, 285, 286, 0, 0, 287, - 1261, 289, 1262, 0, 291, 292, 293, 294, 295, 296, - 297, 298, 1263, 300, 301, 302, 303, 304, 305, 306, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 1069, 1264, 1070, 323, 324, 325, 326, - 1071, 327, 328, 1265, 330, 1072, 790, 332, 1073, 334, + 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, + 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, - 0, 0, 342, 343, 344, 1266, 346, 1267, 792, 349, + 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 793, 1268, 364, 365, + 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 397, 398, 1269, 400, 401, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 1270, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 1271, 427, 428, - 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 1272, 444, 795, 0, 0, - 446, 447, 0, 448, 1273, 450, 451, 452, 453, 454, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, + 1077, 430, -1111, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, - 797, 1080, 463, 464, 1274, 466, 467, 468, 469, 470, + 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, - 1276, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, - 1087, 3068, 0, 0, 0, 1088, 1089, 0, 1090, 1091, - 1241, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, + 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, + 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, - 127, 0, 0, 0, 1243, 0, 1048, 0, 0, 1244, - 129, 130, 0, 131, 132, 133, 1245, 135, 136, 137, - 138, 1049, 1246, 1050, 1051, 0, 143, 144, 145, 146, + 127, 0, 0, 0, 1244, 0, 1048, 0, 0, 1245, + 129, 130, 0, 131, 132, 133, 1246, 135, 136, 137, + 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, - 155, 0, 156, 157, 158, 159, 786, 0, 1247, 0, - 1248, 163, 164, 165, 166, 167, 1249, 169, 170, 171, - 0, 172, 173, 174, 175, 176, 177, 0, 1250, 179, + 155, 0, 156, 157, 158, 159, 786, 0, 1248, 0, + 1249, 163, 164, 165, 166, 167, 1250, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, - 229, 1062, 231, 0, 232, 0, 233, 1252, 0, 1253, - 236, 237, 1254, 1255, 240, 0, 241, 0, 1063, 1064, + 229, 1062, 231, 0, 232, 0, 233, 1253, 0, 1254, + 236, 237, 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - 1256, 254, 255, 256, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 1257, 267, 268, 269, 270, - 271, 272, 1065, 1066, 0, 1067, 0, 276, 1258, 1259, - 279, 1260, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 1261, 289, 1262, 0, 291, 292, 293, 294, 295, - 296, 297, 298, 1263, 300, 301, 302, 303, 304, 305, + 1257, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 1258, 267, 268, 269, 270, + 271, 272, 1065, 1066, 0, 1067, 0, 276, 1259, 1260, + 279, 1261, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 1262, 289, 1263, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 1069, 1264, 1070, 323, 324, 325, - 326, 1071, 327, 328, 1265, 330, 1072, 790, 332, 1073, + 316, 317, 318, 319, 1069, 1265, 1070, 323, 324, 325, + 326, 1071, 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, - 341, 0, 0, 342, 343, 344, 1266, 346, 1267, 792, + 341, 0, 0, 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 0, 0, 0, 0, 360, 361, 793, 1268, 364, + 359, 0, 0, 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 397, 398, 1269, 400, + 392, 393, 394, 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 0, 1270, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 0, 1271, 427, + 411, 412, 413, 414, 415, 416, 0, 1271, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 1272, 444, 795, 0, - 0, 446, 447, 0, 448, 1273, 450, 451, 452, 453, + 437, 438, 439, 440, 441, 442, 1273, 444, 795, 0, + 0, 446, 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, - 461, 797, 1080, 463, 464, 1274, 466, 467, 468, 469, + 461, 797, 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, - 485, 1276, 487, 488, 489, 490, 491, 492, 493, 0, + 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, - 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, - 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, + 0, 1087, 3071, 0, 0, 0, 1088, 1089, 0, 1090, + 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 1688, 125, - 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, - 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, + 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, + 126, 127, 0, 0, 0, 1244, 0, 1048, 0, 0, + 1245, 129, 130, 0, 131, 132, 133, 1246, 135, 136, + 137, 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, - 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, - 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, + 1054, 155, 0, 156, 157, 158, 159, 786, 0, 1248, + 0, 1249, 163, 164, 165, 166, 167, 1250, 169, 170, + 171, 0, 172, 173, 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, - 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, + 228, 229, 1062, 231, 0, 232, 0, 233, 1253, 0, + 1254, 236, 237, 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, + 252, 1257, 254, 255, 256, 257, 0, 258, 259, 260, + 261, 262, 263, 264, 0, 265, 1258, 267, 268, 269, + 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 1259, + 1260, 279, 1261, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 1262, 289, 1263, 0, 291, 292, 293, 294, + 295, 296, 297, 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, - 325, 326, 1071, 327, 328, 329, 330, 1072, 790, 332, + 315, 316, 317, 318, 319, 1069, 1265, 1070, 323, 324, + 325, 326, 1071, 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, - 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, + 340, 341, 0, 0, 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, + 358, 359, 0, 0, 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, + 391, 392, 393, 394, 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, + 410, 411, 412, 413, 414, 415, 416, 0, 1271, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, - 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, + 436, 437, 438, 439, 440, 441, 442, 1273, 444, 795, + 0, 0, 446, 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, - 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, + 796, 461, 797, 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, - 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 0, 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, - 1090, 1091, 116, 1703, 815, 1043, 1044, 1045, 1704, 1047, + 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 124, 1705, + 0, 117, 118, 119, 120, 121, 122, 123, 124, 1689, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, @@ -395901,10 +398765,10 @@ static const yytype_int16 yytable[] = 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, + 0, 1090, 1091, 116, 1704, 815, 1043, 1044, 1045, 1705, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, + 1706, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, @@ -395918,7 +398782,7 @@ static const yytype_int16 yytable[] = 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, - 234, 1423, 235, 236, 237, 238, 239, 240, 0, 241, + 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, @@ -395970,7 +398834,7 @@ static const yytype_int16 yytable[] = 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, - 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, + 233, 234, 1424, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, @@ -396004,7 +398868,7 @@ static const yytype_int16 yytable[] = 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, - 0, 0, 0, 1086, 0, 1087, 2051, 0, 0, 0, + 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, @@ -396046,7 +398910,7 @@ static const yytype_int16 yytable[] = 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 795, 0, 0, 446, 447, 2678, 448, + 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, @@ -396056,7 +398920,7 @@ static const yytype_int16 yytable[] = 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, - 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, + 0, 0, 0, 0, 1086, 0, 1087, 2052, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, @@ -396098,13 +398962,13 @@ static const yytype_int16 yytable[] = 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, + 441, 442, 443, 444, 795, 0, 0, 446, 447, 2681, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 0, 2797, 494, 0, 0, + 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, @@ -396112,14 +398976,14 @@ static const yytype_int16 yytable[] = 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, - 121, 122, 123, 124, 3012, 125, 126, 127, 0, 0, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 178, 179, 3013, 181, 182, + 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, @@ -396127,7 +398991,7 @@ static const yytype_int16 yytable[] = 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, - 239, 240, 0, 241, 0, 3014, 1064, 244, 245, 0, + 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, @@ -396145,7 +399009,7 @@ static const yytype_int16 yytable[] = 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 399, 400, 401, 3015, 1076, + 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, @@ -396156,22 +399020,22 @@ static const yytype_int16 yytable[] = 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 488, 489, 490, 491, 492, 493, 0, 2800, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, - 1084, 1085, 0, 0, 0, 0, 1086, 0, 3016, 0, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, + 120, 121, 122, 123, 124, 3015, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, + 173, 174, 175, 176, 177, 0, 178, 179, 3016, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, @@ -396179,7 +399043,7 @@ static const yytype_int16 yytable[] = 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, - 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, + 238, 239, 240, 0, 241, 0, 3017, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, @@ -396197,13 +399061,13 @@ static const yytype_int16 yytable[] = 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, + 394, 395, 396, 0, 397, 398, 399, 400, 401, 3018, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 3164, 448, 449, 450, 451, 452, 453, 454, 0, + 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, @@ -396212,7 +399076,7 @@ static const yytype_int16 yytable[] = 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, - 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, + 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 3019, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, @@ -396255,7 +399119,7 @@ static const yytype_int16 yytable[] = 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, - 446, 447, 3302, 448, 449, 450, 451, 452, 453, 454, + 446, 447, 3167, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, @@ -396307,7 +399171,7 @@ static const yytype_int16 yytable[] = 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, - 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, + 0, 446, 447, 3305, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, @@ -396368,9 +399232,9 @@ static const yytype_int16 yytable[] = 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, - 0, 0, 0, 1708, 1709, 1085, 0, 0, 0, 0, + 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, - 1090, 1091, 116, 2188, 815, 1043, 1044, 1045, 1046, 1047, + 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, @@ -396420,9 +399284,9 @@ static const yytype_int16 yytable[] = 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, - 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, + 0, 0, 0, 0, 1709, 1710, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, + 0, 1090, 1091, 116, 2189, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, @@ -396472,7 +399336,7 @@ static const yytype_int16 yytable[] = 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, - 0, 0, 0, 0, 0, 1083, 2271, 1085, 0, 0, + 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, @@ -396524,8 +399388,8 @@ static const yytype_int16 yytable[] = 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, - 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, - 0, 0, 0, 1086, 0, 2483, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1083, 2272, 1085, 0, + 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, @@ -396576,8 +399440,8 @@ static const yytype_int16 yytable[] = 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 1082, 0, 0, 0, 0, 0, 0, 1083, 3066, 1085, - 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, + 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, + 0, 0, 0, 0, 1086, 0, 2486, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, @@ -396588,7 +399452,7 @@ static const yytype_int16 yytable[] = 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 178, 179, 3013, 181, 182, 183, + 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, @@ -396596,7 +399460,7 @@ static const yytype_int16 yytable[] = 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, - 240, 0, 241, 0, 3014, 1064, 244, 245, 0, 246, + 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, @@ -396614,7 +399478,7 @@ static const yytype_int16 yytable[] = 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 399, 400, 401, 3015, 1076, 404, + 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, @@ -396628,19 +399492,19 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, - 1085, 0, 0, 0, 0, 1086, 0, 3016, 0, 0, + 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 3069, + 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, - 131, 132, 133, 134, 135, 136, 137, 3474, 1049, 140, + 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 178, 179, 180, 3475, 182, + 174, 175, 176, 177, 0, 178, 179, 3016, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, @@ -396648,7 +399512,7 @@ static const yytype_int16 yytable[] = 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, - 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 239, 240, 0, 241, 0, 3017, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, @@ -396666,7 +399530,7 @@ static const yytype_int16 yytable[] = 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, + 395, 396, 0, 397, 398, 399, 400, 401, 3018, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, @@ -396674,25 +399538,25 @@ static const yytype_int16 yytable[] = 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, - 463, 464, 798, 466, 467, 3476, 469, 470, 0, 0, + 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, - 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 3019, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, - 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, + 0, 131, 132, 133, 134, 135, 136, 137, 3477, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 3475, + 173, 174, 175, 176, 177, 0, 178, 179, 180, 3478, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, @@ -396726,7 +399590,7 @@ static const yytype_int16 yytable[] = 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, - 1080, 463, 464, 798, 466, 467, 3476, 469, 470, 0, + 1080, 463, 464, 798, 466, 467, 3479, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, @@ -396742,11 +399606,11 @@ static const yytype_int16 yytable[] = 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, - 0, 156, 157, 158, 159, 786, 0, 787, 0, 162, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, - 191, 1057, 193, 0, 194, 0, 195, 196, 197, 198, + 3478, 182, 183, 184, 185, 186, 187, 188, 1056, 190, + 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, @@ -396762,7 +399626,7 @@ static const yytype_int16 yytable[] = 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, - 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, + 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, @@ -396778,43 +399642,43 @@ static const yytype_int16 yytable[] = 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, - 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, + 797, 1080, 463, 464, 798, 466, 467, 3479, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 0, 0, 0, 0, 0, 0, - 0, 1409, 1410, 0, 0, 0, 0, 0, 1086, 0, + 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, + 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, - -2044, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, + 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, - 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, - 180, 3475, 182, 183, 184, 185, 186, 187, 188, 1056, - 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, + 190, 191, 1057, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, - 236, 237, 238, -2044, 240, 0, 241, 0, 1063, 1064, + 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - -2044, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, - 271, 272, 1065, 1066, 0, 1067, 0, 276, 0, 0, + 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 288, 289, -2044, 0, 291, 292, 293, 294, 295, + 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, - 326, 0, 327, 328, 0, 330, 1072, 790, 332, 1073, + 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, @@ -396825,49 +399689,49 @@ static const yytype_int16 yytable[] = 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 0, -2044, 427, + 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, - 461, 797, 1080, 463, 464, 798, 466, 467, 3476, 469, + 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, -2044, 0, 0, 0, 0, - 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, + 511, 512, 513, 514, 515, 0, 0, 0, 0, 0, + 0, 0, 1410, 1411, 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, - 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, + 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, + 137, -2046, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, - 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1056, 190, 191, 1057, 193, 0, 194, 0, 195, 196, + 179, 180, 3478, 182, 183, 184, 185, 186, 187, 188, + 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, + 235, 236, 237, 238, -2046, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, + 252, -2046, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, + 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 0, + 0, 279, 280, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 288, 289, -2046, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, - 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, - 1073, 334, 335, 336, 0, 337, 338, 0, 0, 339, + 325, 326, 0, 327, 328, 0, 330, 1072, 790, 332, + 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, @@ -396875,23 +399739,23 @@ static const yytype_int16 yytable[] = 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, - 400, 401, 402, 2174, 2175, 405, 406, 407, 408, 409, + 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, + 418, 419, 420, 421, 422, 423, 424, 425, 0, -2046, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, - 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, + 796, 461, 797, 1080, 463, 464, 798, 466, 467, 3479, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 0, 0, 0, 0, - 0, 0, 0, 2176, 2177, 0, 0, 0, 0, 0, + 510, 511, 512, 513, 514, 515, -2046, 0, 0, 0, + 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, - 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, + 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, @@ -396913,21 +399777,21 @@ static const yytype_int16 yytable[] = 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, - 0, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, - 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, + 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, - 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, + 399, 400, 401, 402, 2175, 2176, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, @@ -396941,9 +399805,9 @@ static const yytype_int16 yytable[] = 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, 0, - 0, 0, 0, 0, 1409, 1410, 0, 0, 0, 0, + 0, 0, 0, 0, 2177, 2178, 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, + 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, @@ -396961,25 +399825,25 @@ static const yytype_int16 yytable[] = 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, - 3033, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, -717, 258, + 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 276, 0, 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, - 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, + 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, @@ -396993,8 +399857,8 @@ static const yytype_int16 yytable[] = 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1086, 0, 2726, 0, 0, 0, 0, 1088, + 0, 0, 0, 0, 0, 1410, 1411, 0, 0, 0, + 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, @@ -397013,8 +399877,8 @@ static const yytype_int16 yytable[] = 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, - 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 241, 3036, 1063, 1064, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, -718, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, @@ -397046,7 +399910,7 @@ static const yytype_int16 yytable[] = 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1086, 0, 2726, 0, 0, 0, 0, + 0, 0, 0, 1086, 0, 2729, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, @@ -397083,7 +399947,7 @@ static const yytype_int16 yytable[] = 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, + 0, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, @@ -397098,37 +399962,37 @@ static const yytype_int16 yytable[] = 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, + 0, 0, 0, 0, 1086, 0, 2729, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, - 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, + 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, - 132, 133, 134, 135, 136, 137, 0, 1049, 140, 1050, + 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, - 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, + 158, 159, 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, - 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, + 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 0, 215, + 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, - 232, 0, 233, 234, 0, 235, 236, 237, 238, 0, + 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, - 0, 1067, 0, 276, 0, 0, 279, 280, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 288, 289, 0, + 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, - 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, + 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, + 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, @@ -397138,7 +400002,7 @@ static const yytype_int16 yytable[] = 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 1077, 430, 0, + 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, @@ -397149,11 +400013,212 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 0, 0, 0, 0, 0, 0, 0, 1083, 1084, - 1085, 0, 964, 1340, 815, 1086, 0, 1087, 1046, 0, - 0, 0, 1088, 1089, 0, 1090, 1091, 0, 0, 0, + 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, + 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, + 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, + 131, 132, 133, 134, 135, 136, 137, 0, 1049, 140, + 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, + 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, + 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, + 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 1059, 208, 209, 0, 210, 211, 212, 0, 213, 0, + 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, + 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, + 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, + 0, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, + 1066, 0, 1067, 0, 276, 0, 0, 279, 280, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, + 0, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, + 328, 0, 330, 1072, 790, 332, 1073, 334, 335, 336, + 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, + 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 0, 427, 428, 1077, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, + 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, + 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, + 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 0, 0, 0, 0, 0, 0, 0, 1083, + 1084, 1085, 0, 964, 1341, 815, 1086, 0, 1087, 1046, + 0, 0, 0, 1088, 1089, 0, 1090, 1091, 0, 0, + 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, + 0, 125, 126, 127, 0, 0, 0, 560, 0, 0, + 0, 0, 565, 129, 130, 0, 131, 132, 133, 567, + 135, 136, 137, 568, 569, 570, 571, 572, 0, 143, + 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, + 152, 576, 577, 155, 0, 156, 157, 158, 159, 579, + 0, 581, 0, 583, 163, 164, 165, 166, 167, 584, + 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, + 0, 587, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 589, 190, 191, 590, 193, 0, 194, 0, + 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, + 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, + 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, + 218, 219, 600, 221, 222, 223, 224, 225, 601, 1342, + 227, 0, 228, 229, 604, 231, 0, 232, 0, 233, + 607, 0, 609, 236, 237, 610, 611, 240, 0, 241, + 0, 614, 615, 244, 245, 0, 246, 247, 248, 249, + 250, 251, 252, 617, 254, 255, 256, 257, 0, 258, + 259, 260, 261, 262, 263, 264, 0, 265, 620, 621, + 268, 269, 270, 271, 272, 622, 623, 0, 625, 0, + 276, 627, 628, 279, 629, 281, 282, 283, 284, 285, + 286, 0, 0, 287, 632, 289, 633, 0, 291, 292, + 293, 294, 295, 296, 297, 298, 635, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 636, 637, 638, + 323, 324, 325, 639, 0, 327, 328, 641, 330, 0, + 643, 332, 644, 334, 335, 336, 0, 337, 338, 1343, + 0, 339, 340, 341, 0, 0, 342, 343, 650, 651, + 346, 652, 653, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, + 658, 659, 364, 365, 660, 367, 368, 369, 0, 370, + 371, 372, 373, 374, 375, 0, 376, 377, 378, 663, + 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, + 398, 666, 400, 401, 402, 667, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, + 669, 417, 418, 419, 420, 421, 422, 670, 424, 425, + 0, 672, 427, 428, 673, 430, 0, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 675, + 444, 676, 0, 0, 446, 447, 0, 448, 680, 450, + 451, 452, 453, 454, 0, 455, 682, 683, 0, 0, + 458, 459, 686, 461, 687, 1344, 463, 464, 689, 466, + 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, + 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, + 694, 695, 0, 485, 697, 487, 488, 489, 490, 491, + 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, + 498, 499, 500, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 512, 513, 514, 515, 0, 0, + 0, 0, 523, 0, 0, 1345, 1346, 2350, 0, 0, + 0, 0, 2351, 0, 2352, 0, 0, 0, 0, 0, + 1089, 117, 118, 119, 120, 121, 122, 123, 124, 0, + 125, 126, 127, 0, 0, 0, 0, 0, 0, 1000, + 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, + 136, 137, 138, 139, 0, 141, 142, 0, 143, 144, + 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, + 153, 154, 155, 0, 156, 157, 158, 159, 160, 0, + 0, 0, 162, 163, 164, 165, 166, 167, 0, 169, + 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, + 0, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, + 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, + 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, + 211, 212, 0, 213, 214, 215, -525, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, + -525, 228, 229, 230, 231, -525, 232, 0, 233, 0, + 0, 0, 236, 237, 524, 0, 240, 0, 241, 0, + 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, + 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, + 260, 261, 262, 263, 264, 0, 265, 0, 267, 268, + 269, 270, 271, 272, 273, 274, -525, 275, 0, 276, + 0, 0, 279, 0, 281, 282, 283, 284, 285, 286, + 0, 0, 287, 0, 289, 0, -525, 291, 292, 293, + 294, 295, 296, 297, 298, 525, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 0, 322, 323, + 324, 325, 326, 0, 327, 328, 0, 330, 0, 331, + 332, 333, 334, 335, 336, -525, 337, 338, 0, 0, + 339, 340, 341, 0, -525, 342, 343, 344, 0, 346, + 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 0, 0, 0, 0, 360, 361, 362, + 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, + 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, + 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, + 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, + 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 526, 444, + 445, 0, 0, 446, 447, 0, 448, 0, 450, 451, + 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, + 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, + 468, 469, 470, -525, 0, 471, 472, 473, 0, 474, + 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, + 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, + 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 523, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, + 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, + 0, 149, 150, 151, 152, 153, 154, 155, 0, 156, + 157, 158, 159, 160, 0, 0, 0, 162, 163, 164, + 165, 166, 167, 0, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 0, 227, 0, 228, 229, 230, 231, + 0, 232, 0, 233, 0, 0, 0, 236, 237, 524, + 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 0, 267, 268, 269, 270, 271, 272, 273, + 274, 0, 275, 0, 276, 0, 0, 279, 0, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 0, 289, + 0, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 0, 322, 323, 324, 325, 326, 0, 327, + 328, 0, 330, 0, 331, 332, 333, 334, 335, 336, + 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, + 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 362, 0, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 526, 444, 445, 0, 0, 446, 447, + 0, 448, 0, 450, 451, 452, 453, 454, 0, 455, + 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, + 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 484, 0, 485, 0, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 964, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2439, 3220, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, - 125, 126, 127, 0, 0, 0, 560, 0, 0, 0, + 125, 126, 127, 3, 4, 0, 560, 0, 0, 0, 0, 565, 129, 130, 0, 131, 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, 572, 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, @@ -397162,12 +400227,12 @@ static const yytype_int16 yytable[] = 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 587, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, 191, 590, 193, 0, 194, 0, 195, - 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, + 196, 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, - 219, 600, 221, 222, 223, 224, 225, 601, 1341, 227, + 219, 600, 221, 222, 223, 224, 225, 601, 0, 227, 0, 228, 229, 604, 231, 0, 232, 0, 233, 607, - 0, 609, 236, 237, 610, 611, 240, 0, 241, 0, + 23, 609, 236, 237, 610, 611, 240, 0, 241, 0, 614, 615, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 617, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 620, 621, 268, @@ -397178,278 +400243,30 @@ static const yytype_int16 yytable[] = 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, 0, 327, 328, 641, 330, 0, 643, - 332, 644, 334, 335, 336, 0, 337, 338, 1342, 0, + 332, 644, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 650, 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 0, 0, 0, 0, 360, 361, 658, + 357, 358, 359, 27, 28, 29, 0, 360, 361, 658, 659, 364, 365, 660, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 663, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 0, 669, - 417, 418, 419, 420, 421, 422, 670, 424, 425, 0, + 409, 410, 411, 412, 413, 414, 415, 416, 34, 669, + 417, 418, 419, 420, 421, 422, 670, 424, 425, 36, 672, 427, 428, 673, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 675, 444, - 676, 0, 0, 446, 447, 0, 448, 680, 450, 451, + 676, 38, 0, 446, 447, 39, 448, 680, 450, 451, 452, 453, 454, 0, 455, 682, 683, 0, 0, 458, - 459, 686, 461, 687, 1343, 463, 464, 689, 466, 467, - 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, - 475, 476, 477, 0, 478, 479, 480, 481, 482, 694, + 459, 686, 461, 687, 0, 463, 464, 689, 466, 467, + 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, + 475, 476, 477, 0, 478, 479, 480, 481, 482, 965, 695, 0, 485, 697, 487, 488, 489, 490, 491, 492, - 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, + 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, 708, 709, - 710, 711, 712, 512, 513, 514, 515, 0, 0, 0, - 0, 523, 0, 0, 1344, 1345, 2349, 0, 0, 0, - 0, 0, 0, 2350, 0, 0, 0, 0, 0, 1089, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 1000, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, -524, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, -524, - 228, 229, 230, 231, -524, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, -524, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, -524, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, -524, 337, 338, 0, 0, 339, - 340, 341, 0, -524, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, -524, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1158, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 964, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2436, 3217, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 3, 4, 0, 560, 0, 0, 0, 0, - 565, 129, 130, 0, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 576, - 577, 155, 0, 156, 157, 158, 159, 579, 0, 581, - 0, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 0, 227, 0, - 228, 229, 604, 231, 0, 232, 0, 233, 607, 23, - 609, 236, 237, 610, 611, 240, 0, 241, 0, 614, - 615, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 0, 625, 0, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 632, 289, 633, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 0, 327, 328, 641, 330, 0, 643, 332, - 644, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 27, 28, 29, 0, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 663, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 34, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 36, 672, - 427, 428, 673, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 38, 0, 446, 447, 39, 448, 680, 450, 451, 452, - 453, 454, 0, 455, 682, 683, 0, 0, 458, 459, - 686, 461, 687, 0, 463, 464, 689, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 965, 695, - 0, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 0, 116, 46, 549, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 47, 0, 0, 0, 117, 118, 119, 120, - 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 129, 130, 0, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, - 785, 149, 150, 151, 152, 153, 154, 155, 0, 156, - 157, 158, 159, 786, 0, 787, 0, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, - 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, - 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, - 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 788, 0, 227, 0, 228, 229, 230, 231, - 0, 232, 0, 233, 234, 23, 235, 236, 237, 238, - 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, - 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 0, 275, 0, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 789, 0, 287, 288, 289, - 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 0, 327, - 328, 329, 330, 0, 790, 332, 333, 334, 335, 336, - 0, 337, 338, 0, 791, 339, 340, 341, 0, 0, - 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 27, 28, - 29, 0, 360, 361, 793, 363, 364, 365, 366, 367, - 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, - 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 399, 400, 401, 402, 403, - 794, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 34, 0, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 36, 426, 427, 428, 429, 430, - 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 795, 38, 0, 446, 447, - 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, - 456, 457, 0, 0, 458, 459, 796, 461, 797, 0, - 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, - 471, 472, 473, 41, 474, 475, 476, 477, 0, 478, - 479, 480, 481, 482, 799, 484, 0, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, - 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 0, 116, 46, 549, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, - 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 0, 143, - 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, - 152, 153, 154, 155, 0, 156, 157, 158, 159, 786, - 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, - 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, - 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, - 227, 0, 228, 229, 230, 231, 0, 232, 0, 233, - 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, - 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 789, 0, 287, 288, 289, 290, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 0, 327, 328, 329, 330, 0, - 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, - 791, 339, 340, 341, 0, 0, 342, 343, 344, 345, - 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, - 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, - 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 399, 400, 401, 402, 403, 794, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, - 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, - 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, - 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, - 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 799, 484, 0, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 800, 0, 0, 117, 118, 119, + 710, 711, 712, 512, 513, 514, 515, 0, 116, 46, + 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 47, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 139, @@ -397460,491 +400277,194 @@ static const yytype_int16 yytable[] = 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, - 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, + 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, 230, - 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, + 231, 0, 232, 0, 233, 234, 23, 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, + 281, 282, 283, 284, 285, 286, 789, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, 0, 790, 332, 333, 334, 335, - 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, + 336, 0, 337, 338, 0, 791, 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, - 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 27, + 28, 29, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 403, 794, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 426, 427, 428, 429, + 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 36, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, + 439, 440, 441, 442, 443, 444, 795, 38, 0, 446, + 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 483, 484, 0, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, - 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 0, 143, - 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, - 152, 153, 154, 155, 0, 156, 157, 158, 159, 786, - 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, - 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, - 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, - 227, 0, 228, 229, 230, 231, 0, 232, 0, 233, - 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, - 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 0, 327, 328, 329, 330, 0, - 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, - 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, - 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, - 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, - 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, - 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, - 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, - 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, - 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 483, 484, 0, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3305, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, - 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, - 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, - 0, 0, 149, 150, 151, 152, 153, 154, 155, 0, - 156, 157, 158, 159, 160, 0, 0, 0, 162, 163, - 164, 165, 166, 167, 0, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, - 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, - 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, - 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 0, 227, 0, 228, 229, 230, - 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, - 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, - 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 0, 267, 268, 269, 270, 271, 272, - 273, 274, 0, 275, 0, 276, 0, 0, 279, 0, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 0, - 289, 0, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 0, 322, 323, 324, 325, 326, 0, - 327, 328, 0, 330, 0, 331, 332, 333, 334, 335, - 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, - 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 27, - 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, - 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, - 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 36, 0, 427, 428, 429, - 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 526, 444, 445, 38, 0, 446, - 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, - 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, - 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, - 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 523, 0, 46, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, - 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 886, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, - 135, 136, 137, 138, 139, 0, 141, 142, 0, 143, - 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, - 152, 153, 154, 155, 0, 156, 157, 158, 159, 160, - 0, 0, 0, 162, 163, 164, 165, 166, 167, 0, - 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 0, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, - 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, - 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, - 227, 0, 228, 229, 230, 231, 0, 232, 0, 233, - 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, - 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 0, 267, - 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, - 276, 0, 0, 279, 0, 281, 282, 283, 284, 285, - 286, 0, 0, 287, 0, 289, 0, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 525, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 0, 322, - 323, 324, 325, 326, 0, 327, 328, 0, 330, 0, - 331, 332, 333, 334, 335, 336, 0, 337, 338, 0, - 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, - 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, - 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, - 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 34, - 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 526, - 444, 445, 0, 0, 446, 447, 39, 448, 0, 450, - 451, 452, 453, 454, 0, 455, 887, 457, 0, 0, - 888, 459, 460, 461, 462, 0, 463, 464, 465, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, - 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 799, 484, 0, 485, 0, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, - 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 47, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, - 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, - 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, - 0, 0, 149, 150, 151, 152, 153, 154, 155, 0, - 156, 157, 158, 159, 160, 0, 0, 0, 162, 163, - 164, 165, 166, 167, 0, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, - 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, - 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, - 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 0, 227, 0, 228, 229, 230, - 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, - 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, - 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 0, 267, 268, 269, 270, 271, 272, - 273, 274, 0, 275, 0, 276, 0, 0, 279, 0, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 0, - 289, 0, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 0, 322, 323, 324, 325, 326, 0, - 327, 328, 0, 330, 0, 331, 332, 333, 334, 335, - 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, - 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 27, - 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, - 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, - 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 0, 427, 428, 429, - 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 526, 444, 445, 0, 0, 446, - 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, - 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, - 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, + 478, 479, 480, 481, 482, 799, 484, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 0, 523, 46, 549, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 513, 514, 515, 0, 116, 46, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 789, 0, 287, 288, 289, 290, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 791, 339, 340, 341, 0, 0, 342, 343, 344, + 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 397, 398, 399, 400, 401, 402, 403, 794, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 482, 799, 484, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 985, 0, 0, 117, 118, - 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, - 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, - 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, - 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, - 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, - 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, - 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, - 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, - 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, - 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, - 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, - 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, - 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, - 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, - 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, - 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, - 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, - 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, - 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, - 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, - 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, - 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, - 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, - 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, - 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, - 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, - 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, - 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, - 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, - 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1463, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, - 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, - 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, - 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, - 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, - 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, - 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, - 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, - 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, - 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, - 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2200, 0, 0, 117, 118, + 0, 0, 0, 0, 0, 800, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, - 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, - 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, - 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, - 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, - 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, - 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 785, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, - 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, - 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, - 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, - 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, - 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, - 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, - 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 0, 327, 328, 329, 330, 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, - 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, + 402, 403, 794, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, - 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, - 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 796, 461, + 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, - 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2436, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 47, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 482, 483, 484, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2567, 0, 0, 117, 118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3308, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, @@ -397955,11 +400475,11 @@ static const yytype_int16 yytable[] = 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, - 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 230, 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, @@ -397974,28 +400494,28 @@ static const yytype_int16 yytable[] = 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 27, 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 412, 413, 414, 415, 416, 34, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 36, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 438, 439, 440, 441, 442, 526, 444, 445, 38, 0, + 446, 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, - 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, - 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, - 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 512, 513, 514, 515, 523, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3212, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 47, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 886, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, @@ -398009,7 +400529,7 @@ static const yytype_int16 yytable[] = 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 233, 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, @@ -398023,27 +400543,27 @@ static const yytype_int16 yytable[] = 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 355, 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 34, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, - 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 526, 444, 445, 0, 0, 446, 447, 39, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 887, 457, 0, + 0, 888, 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 41, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 799, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2057, 0, 0, 117, 118, + 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 47, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, @@ -398058,7 +400578,7 @@ static const yytype_int16 yytable[] = 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 230, 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, @@ -398073,386 +400593,175 @@ static const yytype_int16 yytable[] = 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 27, 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 412, 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 446, 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, - 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, - 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, - 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 512, 513, 514, 515, 0, 523, 46, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2160, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, - 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, - 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, - 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, - 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, - 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, - 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, - 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, - 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, - 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, - 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, - 2892, 1340, 815, 0, 0, 2033, 1046, 0, 0, 0, - 0, 0, 2034, 2035, 0, 3073, 2036, 2037, 2038, 117, - 118, 119, 120, 121, 122, 123, 124, 556, 125, 126, - 127, 557, 558, 559, 2893, 561, 562, 563, 564, 2894, - 129, 130, 566, 131, 132, 133, 2895, 135, 136, 137, - 0, 1479, 2896, 1481, 1482, 573, 143, 144, 145, 146, - 147, 148, 574, 575, 149, 150, 151, 152, 1483, 1484, - 155, 578, 156, 157, 158, 159, 0, 580, 2897, 582, - 2898, 163, 164, 165, 166, 167, 2899, 169, 170, 171, - 585, 172, 173, 174, 175, 176, 177, 586, 2900, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 1489, - 190, 191, 1490, 193, 591, 194, 592, 195, 196, 197, - 198, 199, 200, 593, 594, 201, 202, 203, 204, 595, - 596, 205, 206, 1059, 208, 209, 597, 210, 211, 212, - 598, 213, 214, 215, 599, 216, 217, 218, 219, 0, - 221, 222, 223, 224, 225, 0, 602, 227, 603, 228, - 229, 1491, 231, 605, 232, 606, 233, 2901, 608, 2902, - 236, 237, 2903, 2904, 240, 612, 241, 613, 0, 0, - 244, 245, 616, 246, 247, 248, 249, 250, 251, 252, - 2905, 254, 255, 256, 257, 618, 258, 259, 260, 261, - 262, 263, 264, 619, 265, 2906, 0, 268, 269, 270, - 271, 272, 1497, 1498, 624, 1499, 626, 276, 2907, 2908, - 279, 2909, 281, 282, 283, 284, 285, 286, 630, 631, - 287, 2910, 289, 2911, 634, 291, 292, 293, 294, 295, - 296, 297, 298, 2912, 300, 301, 302, 303, 304, 305, + 47, 0, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 985, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, + 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, + 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, + 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, + 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, + 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, + 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, + 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, + 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, + 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, + 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, + 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 0, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 275, 0, 276, 0, 0, + 279, 0, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 0, 289, 0, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 1506, 2913, 1508, 323, 324, 325, - 2914, 640, 327, 328, 2915, 330, 642, 0, 332, 1510, - 334, 335, 336, 645, 337, 338, 646, 647, 2916, 340, - 341, 648, 649, 342, 343, 0, 2917, 346, 2918, 0, + 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, + 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, + 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, + 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 654, 655, 656, 657, 360, 361, 0, 2919, 364, - 365, 0, 367, 368, 369, 661, 370, 371, 372, 373, - 374, 375, 662, 376, 377, 378, 1514, 380, 381, 382, - 383, 664, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 665, 397, 398, 2920, 400, - 401, 402, 1516, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 668, 2921, 417, 418, - 419, 420, 421, 422, 2922, 424, 425, 671, 2923, 427, - 428, 1520, 430, 674, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 2924, 444, 0, 677, - 678, 446, 447, 679, 448, 2925, 450, 451, 452, 453, - 454, 681, 455, 1523, 1524, 684, 685, 458, 459, 0, - 461, 0, 688, 463, 464, 2926, 466, 467, 468, 469, - 470, 2927, 691, 471, 472, 473, 692, 474, 475, 476, - 477, 693, 478, 479, 480, 481, 482, 0, 1527, 696, - 485, 2928, 487, 488, 489, 490, 491, 492, 493, 698, - 699, 494, 700, 701, 495, 496, 497, 498, 499, 500, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 512, 513, 514, 515, 0, 523, 0, 2039, 2040, - 2041, 2033, 2929, 2930, 2044, 2045, 2046, 2047, 2034, 2035, - 0, 0, 2036, 2037, 2038, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 0, 0, 0, 2039, 2040, 2041, 0, 2042, 2043, - 2044, 2045, 2046, 2047, 1610, 0, 0, 1611, 0, 0, - 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1619, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1621, 1610, 0, 0, 1611, 0, 0, 1622, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1619, 0, 0, 0, 0, 1623, 0, 0, 0, - 0, 1621, 1610, 0, 0, 1611, 0, 0, 1622, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1619, 0, 0, 0, 0, 1623, 0, 0, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 1610, - 0, 0, 1611, 0, 0, 0, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 1619, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1621, 1610, 0, - 0, 1611, 1624, 0, 1622, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 0, 0, 0, 0, 0, 1625, - 0, 0, 0, 0, 1626, 0, 1619, 0, 0, 0, - 0, 1623, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 1624, 0, 1622, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1625, 0, - 0, 0, 1629, 1626, 0, 0, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1624, 0, 0, 0, 0, 0, 1627, 1628, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1625, 0, 0, - 1630, 1629, 1626, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, - 1633, 0, 0, 0, 0, 1627, 1628, 1624, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, - 1629, 0, 1631, 0, 1625, 0, 0, 0, 0, 1626, - 0, 0, 0, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, - 0, 0, 1627, 1628, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 1625, 0, 0, 0, 1629, 1626, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 1634, 0, 0, - 0, 0, 0, 0, 0, 1630, 1629, 0, 1631, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1632, 0, 0, 1633, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, - 0, 0, 0, 0, 1630, 0, 0, 1631, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 0, - 0, 2838, 1634, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 0, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 1635, 0, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 1619, 0, 0, 0, - 3065, 1634, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, 3072, - 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1610, 0, 0, 1611, 0, 0, - 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 1635, - 0, 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, - 1643, 1644, 1619, 0, 0, 0, 3232, 0, 0, 0, - 0, 0, 1621, 1610, 0, 0, 1611, 0, 0, 1622, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 1619, 0, 0, 0, 3254, 1623, 0, 0, 0, - 0, 1621, 1610, 0, 0, 1611, 1624, 0, 1622, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 1619, 0, 0, 0, 0, 1623, 0, 0, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 1624, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 1630, 0, 0, 1631, 0, 1625, - 0, 0, 0, 0, 1626, 0, 1619, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 1621, 0, 0, 0, - 0, 1624, 0, 1622, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1625, 0, - 0, 0, 1629, 1626, 0, 0, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1624, 0, 0, 0, 0, 0, 1627, 1628, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1625, 0, 0, - 1630, 1629, 1626, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, - 1633, 0, 0, 0, 0, 1627, 1628, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 0, 1630, - 1629, 0, 1631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 1625, 0, 0, 0, 0, 1626, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 1634, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 0, 0, 3355, 1634, 0, 0, 0, - 0, 0, 0, 0, 1630, 0, 1610, 1631, 0, 1611, - 0, 0, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1619, 1634, 717, 0, 0, 0, - 0, 0, 0, 0, 1621, 0, 0, 0, 0, 0, - 0, 1622, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 1623, 0, - 0, 3412, 0, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 0, 718, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 1635, 0, 0, 1636, 1637, 1638, 719, - 1639, 1640, 1641, 1642, 1643, 1644, 1619, 0, 0, 0, - 3434, 1634, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 1795, 720, 0, - 1623, 0, 0, 0, 0, 0, 0, 0, 721, 0, - 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, - 722, 0, 0, 0, 0, 723, 0, 0, 0, 0, - 0, 1625, 0, 0, 0, 0, 1626, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 724, 0, 0, 0, 0, 1627, - 1628, 0, 0, 0, 0, 0, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 1629, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 2792, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1624, 725, 0, 0, - 0, 726, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1630, 1625, 0, 1631, 0, 0, 1626, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, - 0, 0, 1633, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, - 0, 0, 0, 0, 1630, 0, 0, 1631, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 729, - 0, 0, 730, 0, 0, 0, 0, 0, 0, 1634, - 0, 0, 0, 731, 0, 0, 732, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 733, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 734, 0, - 0, 0, 0, 0, 735, 736, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 739, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, - 0, 3222, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, + 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, + 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, + 0, 446, 447, 0, 448, 0, 450, 451, 452, 453, + 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, + 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, + 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, + 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, + 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, + 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 555, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 3396, 117, 118, 119, 120, 121, 122, - 123, 124, 556, 125, 126, 127, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 129, 130, 566, 131, 132, - 133, 567, 135, 136, 137, 568, 569, 570, 571, 572, - 573, 143, 144, 145, 146, 147, 148, 574, 575, 149, - 150, 151, 152, 576, 577, 155, 578, 156, 157, 158, - 159, 579, 580, 581, 582, 583, 163, 164, 165, 166, - 167, 584, 169, 170, 171, 585, 172, 173, 174, 175, - 176, 177, 586, 587, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 589, 190, 191, 590, 193, 591, - 194, 592, 195, 196, 197, 198, 199, 200, 593, 594, - 201, 202, 203, 204, 595, 596, 205, 206, 207, 208, - 209, 597, 210, 211, 212, 598, 213, 214, 215, 599, - 216, 217, 218, 219, 600, 221, 222, 223, 224, 225, - 601, 602, 227, 603, 228, 229, 604, 231, 605, 232, - 606, 233, 607, 608, 609, 236, 237, 610, 611, 240, - 612, 241, 613, 614, 615, 244, 245, 616, 246, 247, - 248, 249, 250, 251, 252, 617, 254, 255, 256, 257, - 618, 258, 259, 260, 261, 262, 263, 264, 619, 265, - 620, 621, 268, 269, 270, 271, 272, 622, 623, 624, - 625, 626, 276, 627, 628, 279, 629, 281, 282, 283, - 284, 285, 286, 630, 631, 287, 632, 289, 633, 634, - 291, 292, 293, 294, 295, 296, 297, 298, 635, 300, + 0, 1464, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 636, - 637, 638, 323, 324, 325, 639, 640, 327, 328, 641, - 330, 642, 643, 332, 644, 334, 335, 336, 645, 337, - 338, 646, 647, 339, 340, 341, 648, 649, 342, 343, - 650, 651, 346, 652, 653, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 654, 655, 656, 657, - 360, 361, 658, 659, 364, 365, 660, 367, 368, 369, - 661, 370, 371, 372, 373, 374, 375, 662, 376, 377, - 378, 663, 380, 381, 382, 383, 664, 384, 385, 386, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 665, 397, 398, 666, 400, 401, 402, 667, 404, 405, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 668, 669, 417, 418, 419, 420, 421, 422, 670, - 424, 425, 671, 672, 427, 428, 673, 430, 674, 431, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 675, 444, 676, 677, 678, 446, 447, 679, 448, - 680, 450, 451, 452, 453, 454, 681, 455, 682, 683, - 684, 685, 458, 459, 686, 461, 687, 688, 463, 464, - 689, 466, 467, 468, 469, 470, 690, 691, 471, 472, - 473, 692, 474, 475, 476, 477, 693, 478, 479, 480, - 481, 482, 694, 695, 696, 485, 697, 487, 488, 489, - 490, 491, 492, 493, 698, 699, 494, 700, 701, 495, - 496, 497, 498, 499, 500, 702, 703, 704, 705, 706, - 707, 708, 709, 710, 711, 712, 512, 513, 514, 515, - 523, 0, 0, 0, 0, 0, 0, 0, 0, 2068, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2201, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, @@ -398500,9 +400809,9 @@ static const yytype_int16 yytable[] = 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, - 0, 0, 0, 0, 2692, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, + 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2439, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, @@ -398550,413 +400859,467 @@ static const yytype_int16 yytable[] = 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 964, 1340, 815, 0, 0, 0, 1046, 0, 0, 2695, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2570, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, - 127, 0, 0, 0, 560, 0, 0, 0, 0, 565, - 129, 130, 0, 131, 132, 133, 567, 135, 136, 137, - 568, 569, 570, 571, 572, 0, 143, 144, 145, 146, - 147, 148, 0, 0, 149, 150, 151, 152, 576, 577, - 155, 0, 156, 157, 158, 159, 579, 0, 581, 0, - 583, 163, 164, 165, 166, 167, 584, 169, 170, 171, - 0, 172, 173, 174, 175, 176, 177, 0, 587, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 589, - 190, 191, 590, 193, 0, 194, 0, 195, 196, 197, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, + 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, + 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, + 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, + 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, - 0, 213, 214, 215, 0, 216, 217, 218, 219, 600, - 221, 222, 223, 224, 225, 601, 1341, 227, 0, 228, - 229, 604, 231, 0, 232, 0, 233, 607, 0, 609, - 236, 237, 610, 611, 240, 0, 241, 0, 614, 615, + 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, + 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, + 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - 617, 254, 255, 256, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 620, 621, 268, 269, 270, - 271, 272, 622, 623, 0, 625, 0, 276, 627, 628, - 279, 629, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 632, 289, 633, 0, 291, 292, 293, 294, 295, - 296, 297, 298, 635, 300, 301, 302, 303, 304, 305, + 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 0, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 275, 0, 276, 0, 0, + 279, 0, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 0, 289, 0, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 636, 637, 638, 323, 324, 325, - 639, 0, 327, 328, 641, 330, 0, 643, 332, 644, - 334, 335, 336, 0, 337, 338, 1342, 0, 339, 340, - 341, 0, 0, 342, 343, 650, 651, 346, 652, 653, + 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, + 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, + 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, + 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 0, 0, 0, 0, 360, 361, 658, 659, 364, - 365, 660, 367, 368, 369, 0, 370, 371, 372, 373, - 374, 375, 0, 376, 377, 378, 663, 380, 381, 382, + 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, + 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 397, 398, 666, 400, - 401, 402, 667, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 0, 669, 417, 418, - 419, 420, 421, 422, 670, 424, 425, 0, 672, 427, - 428, 673, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 675, 444, 676, 0, - 0, 446, 447, 0, 448, 680, 450, 451, 452, 453, - 454, 0, 455, 682, 683, 0, 0, 458, 459, 686, - 461, 687, 1343, 463, 464, 689, 466, 467, 468, 469, + 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, + 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, + 0, 446, 447, 0, 448, 0, 450, 451, 452, 453, + 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, + 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, - 477, 0, 478, 479, 480, 481, 482, 694, 695, 0, - 485, 697, 487, 488, 489, 490, 491, 492, 493, 0, + 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, + 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, - 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 512, 513, 514, 515, 0, 0, 1610, 0, 0, - 1611, 0, 1344, 1345, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1619, 0, 0, 0, 0, - 2166, 0, 0, 0, 0, 1621, 1610, 0, 0, 1611, - 0, 0, 1622, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1619, 0, 0, 0, 0, 1623, - 0, 0, 0, 0, 1621, 1610, 0, 0, 1611, 0, - 0, 1622, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1619, 0, 0, 0, 0, 1623, 0, - 0, 0, 0, 1621, 0, 2167, 0, 0, 0, 0, - 1622, 0, 0, 1610, 0, 0, 1611, 0, 0, 0, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1623, 0, 0, - 0, 1619, 0, 0, 0, 1889, 0, 0, 0, 0, - 0, 1621, 0, 1610, 0, 1624, 1611, 0, 1622, 0, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 0, 0, - 0, 1619, 0, 0, 1925, 1623, 0, 0, 0, 1926, - 0, 1621, 0, 0, 1624, 0, 0, 0, 1622, 0, - 1627, 1628, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1625, 0, 0, 0, 1629, 1626, 0, 0, 0, - 0, 0, 3502, 0, 0, 1623, 0, 0, 0, 0, - 0, 0, 0, 1624, 0, 0, 0, 0, 0, 1627, - 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1625, 0, 0, 1630, 1629, 1626, 1631, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1632, 0, 0, 1633, 0, 0, 0, 0, 1627, 1628, - 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1630, 1629, 0, 1631, 0, 0, 1625, 0, - 0, 0, 0, 1626, 0, 0, 0, 0, 0, 1632, - 0, 0, 1633, 0, 0, 0, 0, 0, 0, 0, - 0, 1624, 0, 0, 0, 0, 1627, 1628, 0, 0, - 0, 1630, 0, 0, 1631, 0, 0, 0, 1625, 0, - 0, 1629, 0, 1626, 0, 0, 0, 0, 1632, 0, - 0, 1633, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1627, 1628, 0, 0, - 1634, 0, 0, 0, 0, 0, 0, 0, 0, 1630, - 3503, 1629, 1631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1634, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, - 0, 0, 1631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2170, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1896, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, - 0, 1610, 0, 0, 1611, 0, 0, 0, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 1619, - 0, 0, 0, 1931, 0, 0, 1634, 0, 0, 1621, - 0, 0, 0, 0, 0, 0, 1622, 0, 0, 0, - 0, 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, - 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 0, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 1635, 0, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 1619, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 1610, 0, 0, 1611, 1624, - 0, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 0, 0, 0, 0, 1625, 0, 0, 0, - 0, 1626, 0, 1619, 0, 0, 0, 1938, 0, 0, - 0, 0, 0, 1621, 0, 0, 0, 0, 0, 0, - 1622, 0, 0, 0, 1627, 1628, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1629, - 0, 0, 0, 0, 0, 0, 0, 1623, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1936, 1610, 0, 0, 1611, 1624, 0, 0, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 1630, 0, 0, - 1631, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 1619, 0, 0, 0, 1632, 0, 0, 1633, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, - 0, 0, 0, 1624, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1625, 0, 0, 0, 1630, 1626, 0, 1631, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 1627, 1628, - 0, 0, 0, 0, 1634, 0, 0, 1610, 0, 0, - 1611, 0, 0, 1629, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2061, 0, 0, 0, 0, 1619, 0, 0, 0, 0, - 1624, 0, 0, 0, 0, 1621, 0, 0, 0, 0, - 0, 1630, 1622, 0, 1631, 0, 0, 1625, 0, 0, - 0, 0, 1626, 0, 0, 0, 0, 0, 1632, 0, - 0, 1633, 0, 0, 0, 0, 0, 0, 0, 1623, - 0, 0, 0, 0, 0, 1627, 1628, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, - 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, 1640, - 1641, 1642, 1643, 1644, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1627, 1628, 0, 0, 0, 0, 0, 0, 0, 1610, - 0, 0, 1611, 0, 0, 1629, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 1619, 0, 0, - 0, 2769, 0, 0, 0, 0, 0, 1621, 0, 0, - 0, 0, 0, 1630, 1622, 1635, 1631, 0, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, - 1632, 0, 0, 1633, 0, 0, 0, 0, 0, 0, - 0, 1623, 0, 1610, 0, 0, 1611, 0, 0, 0, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1619, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1621, 0, 0, 0, 0, 0, 0, 1622, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 1623, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1634, 0, 1610, 0, 0, 1611, 0, 1624, 0, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 0, 0, 1625, 0, 0, 0, 0, 1626, - 1619, 0, 0, 2756, 0, 0, 0, 0, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 0, - 0, 0, 1627, 1628, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1629, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, - 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1625, 0, - 0, 0, 0, 1626, 0, 1630, 0, 1635, 1631, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 1632, 0, 0, 1633, 1627, 1628, 0, 0, - 0, 0, 0, 0, 0, 1610, 0, 0, 1611, 0, - 0, 1629, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1619, 0, 0, 0, 0, 0, 0, - 1624, 0, 0, 1621, 0, 0, 0, 0, 0, 1630, - 1622, 0, 1631, 0, 0, 0, 0, 1625, 0, 0, - 0, 0, 1626, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 1610, 1623, 0, 1611, - 0, 0, 0, 1612, 1613, 1805, 1628, 1616, 1617, 1618, - 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, - 1629, 0, 0, 0, 1619, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1621, 0, 0, 0, 0, 0, - 0, 1622, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 1623, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 1634, 1610, 0, 0, - 1611, 0, 0, 1624, 1612, 1613, 0, 0, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1625, 0, 0, 0, 0, 1626, 0, 0, 0, 1635, - 0, 0, 1636, 1637, 1638, 1621, 1639, 1640, 1641, 1642, - 1643, 1644, 1622, 0, 0, 0, 0, 0, 1627, 1628, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1629, 0, 0, 0, 0, 0, 1623, - 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 0, 0, 0, - 0, 1625, 0, 0, 0, 0, 1626, 0, 0, 0, - 0, 1630, 0, 1635, 1631, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 1632, 1627, - 1628, 1633, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1629, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, - 0, 0, 1630, 0, 0, 1631, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 0, 1632, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, 0, - -2044, -2044, 0, 0, 0, 0, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 1629, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2044, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1632, 0, 0, 0, 0, 0, 0, 0, 0, 1634, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 2187, 1644, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 555, 0, 2084, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, - 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 573, 143, 144, 145, - 146, 147, 148, 574, 575, 149, 150, 151, 152, 576, - 577, 155, 578, 156, 157, 158, 159, 579, 580, 581, - 582, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 585, 172, 173, 174, 175, 176, 177, 586, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 591, 194, 592, 195, 196, - 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, - 595, 596, 205, 206, 207, 208, 209, 597, 210, 211, - 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 602, 227, 603, - 228, 229, 604, 231, 605, 232, 606, 233, 607, 608, - 609, 236, 237, 610, 611, 240, 612, 241, 613, 614, - 615, 244, 245, 616, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 618, 258, 259, 260, - 261, 262, 263, 264, 619, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 624, 625, 626, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 630, - 631, 287, 632, 289, 633, 634, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 640, 327, 328, 641, 330, 642, 643, 332, - 644, 334, 335, 336, 645, 337, 338, 646, 647, 339, - 340, 341, 648, 649, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 654, 655, 656, 657, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 661, 370, 371, 372, - 373, 374, 375, 662, 376, 377, 378, 663, 380, 381, - 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 665, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 668, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 671, 672, - 427, 428, 673, 430, 674, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 677, 678, 446, 447, 679, 448, 680, 450, 451, 452, - 453, 454, 681, 455, 682, 683, 684, 685, 458, 459, - 686, 461, 687, 688, 463, 464, 689, 466, 467, 468, - 469, 470, 690, 691, 471, 472, 473, 692, 474, 475, - 476, 477, 693, 478, 479, 480, 481, 482, 694, 695, - 696, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 556, 125, 126, 127, 557, 558, 559, - 560, 561, 562, 563, 564, 565, 129, 130, 566, 131, - 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, - 572, 573, 143, 144, 145, 146, 147, 148, 574, 575, - 149, 150, 151, 152, 576, 577, 155, 578, 156, 157, - 158, 159, 579, 580, 581, 582, 583, 163, 164, 165, - 166, 167, 584, 169, 170, 171, 585, 172, 173, 174, - 175, 176, 177, 586, 587, 179, 180, 181, 182, 183, - 184, 588, 186, 187, 188, 589, 190, 191, 590, 193, - 591, 194, 592, 195, 196, 197, 198, 199, 200, 593, - 594, 201, 202, 203, 204, 595, 596, 205, 206, 207, - 208, 209, 597, 210, 211, 212, 598, 213, 214, 215, - 599, 216, 217, 218, 219, 600, 221, 222, 223, 224, - 225, 601, 602, 227, 603, 228, 229, 604, 231, 605, - 232, 606, 233, 607, 608, 609, 236, 237, 610, 611, - 240, 612, 241, 613, 614, 615, 244, 245, 616, 246, - 247, 248, 249, 250, 251, 252, 617, 254, 255, 256, - 257, 618, 258, 259, 260, 261, 262, 263, 264, 619, - 265, 620, 621, 268, 269, 270, 271, 272, 622, 623, - 624, 625, 626, 276, 627, 628, 279, 629, 281, 282, - 283, 284, 285, 286, 630, 631, 287, 632, 289, 633, - 634, 291, 292, 293, 294, 295, 296, 297, 298, 635, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 636, 637, 638, 323, 324, 325, 639, 640, 327, 328, - 641, 330, 642, 643, 332, 644, 334, 335, 336, 645, - 337, 338, 646, 647, 339, 340, 341, 648, 649, 342, - 343, 650, 651, 346, 652, 653, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 654, 655, 656, - 657, 360, 361, 658, 659, 364, 365, 660, 367, 368, - 369, 661, 370, 371, 372, 373, 374, 375, 662, 376, - 377, 378, 663, 380, 381, 382, 383, 664, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 665, 397, 398, 666, 400, 401, 402, 667, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 668, 669, 417, 418, 419, 420, 421, 422, - 670, 424, 425, 671, 672, 427, 428, 673, 430, 674, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 675, 444, 676, 677, 678, 446, 447, 679, - 448, 680, 450, 451, 452, 453, 454, 681, 455, 682, - 683, 684, 685, 458, 459, 686, 461, 687, 688, 463, - 464, 689, 466, 467, 468, 469, 470, 690, 691, 471, - 472, 473, 692, 474, 475, 476, 477, 693, 478, 479, - 480, 481, 482, 694, 695, 696, 485, 697, 487, 488, - 489, 490, 491, 492, 493, 698, 699, 494, 700, 701, - 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 512, 513, 514, - 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3215, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2058, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, + 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, + 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, + 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, + 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, + 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, + 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, + 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, + 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, + 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, + 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, + 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 0, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 275, 0, 276, 0, 0, + 279, 0, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 0, 289, 0, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, + 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, + 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, + 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, + 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, + 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, + 0, 446, 447, 0, 448, 0, 450, 451, 452, 453, + 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, + 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, + 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, + 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, + 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, + 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2161, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 0, 2895, 1341, 815, 0, 0, 2034, 1046, 0, 0, + 0, 0, 0, 2035, 2036, 0, 3076, 2037, 2038, 2039, 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, - 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 573, 143, 144, 145, - 146, 147, 148, 574, 575, 149, 150, 151, 152, 576, - 577, 155, 578, 156, 157, 158, 159, 579, 580, 581, - 582, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 585, 172, 173, 174, 175, 176, 177, 586, 587, + 126, 127, 557, 558, 559, 2896, 561, 562, 563, 564, + 2897, 129, 130, 566, 131, 132, 133, 2898, 135, 136, + 137, 0, 1480, 2899, 1482, 1483, 573, 143, 144, 145, + 146, 147, 148, 574, 575, 149, 150, 151, 152, 1484, + 1485, 155, 578, 156, 157, 158, 159, 0, 580, 2900, + 582, 2901, 163, 164, 165, 166, 167, 2902, 169, 170, + 171, 585, 172, 173, 174, 175, 176, 177, 586, 2903, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 591, 194, 592, 195, 196, + 1490, 190, 191, 1491, 193, 591, 194, 592, 195, 196, 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, - 595, 596, 205, 206, 207, 208, 209, 597, 210, 211, + 595, 596, 205, 206, 1059, 208, 209, 597, 210, 211, 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 602, 227, 603, - 228, 229, 604, 231, 605, 232, 606, 233, 607, 608, - 609, 236, 237, 610, 611, 240, 612, 241, 613, 614, - 615, 244, 245, 616, 246, 247, 248, 249, 250, 940, - 252, 617, 254, 255, 256, 257, 618, 258, 259, 260, - 261, 262, 263, 264, 619, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 624, 625, 626, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 630, - 631, 287, 632, 289, 633, 634, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, + 0, 221, 222, 223, 224, 225, 0, 602, 227, 603, + 228, 229, 1492, 231, 605, 232, 606, 233, 2904, 608, + 2905, 236, 237, 2906, 2907, 240, 612, 241, 613, 0, + 0, 244, 245, 616, 246, 247, 248, 249, 250, 251, + 252, 2908, 254, 255, 256, 257, 618, 258, 259, 260, + 261, 262, 263, 264, 619, 265, 2909, 0, 268, 269, + 270, 271, 272, 1498, 1499, 624, 1500, 626, 276, 2910, + 2911, 279, 2912, 281, 282, 283, 284, 285, 286, 630, + 631, 287, 2913, 289, 2914, 634, 291, 292, 293, 294, + 295, 296, 297, 298, 2915, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 640, 327, 328, 641, 330, 642, 643, 332, - 644, 334, 335, 336, 645, 337, 338, 646, 647, 339, - 340, 341, 648, 649, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 654, 655, 656, 657, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 661, 370, 371, 372, - 373, 374, 375, 662, 376, 377, 378, 663, 380, 381, + 315, 316, 317, 318, 319, 1507, 2916, 1509, 323, 324, + 325, 2917, 640, 327, 328, 2918, 330, 642, 0, 332, + 1511, 334, 335, 336, 645, 337, 338, 646, 647, 2919, + 340, 341, 648, 649, 342, 343, 0, 2920, 346, 2921, + 0, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 654, 655, 656, 657, 360, 361, 0, 2922, + 364, 365, 0, 367, 368, 369, 661, 370, 371, 372, + 373, 374, 375, 662, 376, 377, 378, 1515, 380, 381, 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 665, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 668, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 671, 672, - 427, 428, 673, 430, 674, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 677, 678, 446, 447, 679, 448, 680, 450, 451, 452, - 453, 454, 681, 455, 682, 683, 684, 685, 458, 459, - 686, 461, 687, 688, 463, 464, 689, 466, 467, 468, - 469, 470, 690, 691, 471, 472, 473, 692, 474, 475, - 476, 477, 693, 478, 479, 480, 481, 482, 694, 695, - 696, 485, 697, 487, 488, 489, 490, 491, 492, 493, + 391, 392, 393, 394, 395, 396, 665, 397, 398, 2923, + 400, 401, 402, 1517, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 668, 2924, 417, + 418, 419, 420, 421, 422, 2925, 424, 425, 671, 2926, + 427, 428, 1521, 430, 674, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 2927, 444, 0, + 677, 678, 446, 447, 679, 448, 2928, 450, 451, 452, + 453, 454, 681, 455, 1524, 1525, 684, 685, 458, 459, + 0, 461, 0, 688, 463, 464, 2929, 466, 467, 468, + 469, 470, 2930, 691, 471, 472, 473, 692, 474, 475, + 476, 477, 693, 478, 479, 480, 481, 482, 0, 1528, + 696, 485, 2931, 487, 488, 489, 490, 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, + 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 512, 513, 514, 515, 0, 523, 0, 2040, + 2041, 2042, 2034, 2932, 2933, 2045, 2046, 2047, 2048, 2035, + 2036, 0, 0, 2037, 2038, 2039, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, + 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, + 0, 149, 150, 151, 152, 153, 154, 155, 0, 156, + 157, 158, 159, 160, 0, 0, 0, 162, 163, 164, + 165, 166, 167, 0, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 0, 227, 0, 228, 229, 230, 231, + 0, 232, 0, 233, 0, 0, 0, 236, 237, 524, + 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 0, 267, 268, 269, 270, 271, 272, 273, + 274, 0, 275, 0, 276, 0, 0, 279, 0, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 0, 289, + 0, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 0, 322, 323, 324, 325, 326, 0, 327, + 328, 0, 330, 0, 331, 332, 333, 334, 335, 336, + 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, + 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 362, 0, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 526, 444, 445, 0, 0, 446, 447, + 0, 448, 0, 450, 451, 452, 453, 454, 0, 455, + 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, + 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 484, 0, 485, 0, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 0, 0, 0, 2040, 2041, 2042, 0, 2043, + 2044, 2045, 2046, 2047, 2048, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 0, 0, 0, 1620, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 1611, 0, 0, 1612, 0, 0, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1620, 0, 0, 0, 0, 1624, 0, 0, + 0, 0, 1622, 1611, 0, 0, 1612, 0, 0, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1620, 0, 0, 0, 0, 1624, 0, 0, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 1620, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1622, 1611, + 0, 0, 1612, 1625, 0, 1623, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, + 1626, 0, 0, 0, 0, 1627, 0, 1620, 0, 0, + 0, 0, 1624, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 1625, 0, 1623, 0, 0, 0, 1628, 1629, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, + 0, 0, 0, 1630, 1627, 0, 0, 0, 0, 0, + 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1625, 0, 0, 0, 0, 0, 1628, 1629, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1626, 0, + 0, 1631, 1630, 1627, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, + 0, 1634, 0, 0, 0, 0, 1628, 1629, 1625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1631, 1630, 0, 1632, 0, 1626, 0, 0, 0, 0, + 1627, 0, 0, 0, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 1625, 0, 0, + 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 1631, + 0, 0, 1632, 0, 1626, 0, 0, 0, 1630, 1627, + 0, 0, 0, 0, 0, 0, 1633, 0, 0, 1634, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 1635, 0, + 0, 0, 0, 0, 0, 0, 1631, 1630, 0, 1632, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1633, 0, 0, 1634, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 0, 0, 0, 1631, 0, 0, 1632, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, + 0, 0, 2841, 1635, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 1620, 0, 0, + 0, 3068, 1635, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, + 3075, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, + 1636, 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, + 1643, 1644, 1645, 1620, 0, 0, 0, 3235, 0, 0, + 0, 0, 0, 1622, 1611, 0, 0, 1612, 0, 0, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 1620, 0, 0, 0, 3257, 1624, 0, 0, + 0, 0, 1622, 1611, 0, 0, 1612, 1625, 0, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, + 0, 0, 0, 0, 1626, 0, 0, 0, 0, 1627, + 0, 1620, 0, 0, 0, 0, 1624, 0, 0, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 1625, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 0, 1631, 0, 0, 1632, 0, + 1626, 0, 0, 0, 0, 1627, 0, 1620, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 1622, 0, 0, + 0, 0, 1625, 0, 1623, 0, 0, 0, 1628, 1629, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, + 0, 0, 0, 1630, 1627, 0, 0, 0, 0, 0, + 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1625, 0, 0, 0, 0, 0, 1628, 1629, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1626, 0, + 0, 1631, 1630, 1627, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, + 0, 1634, 0, 0, 0, 0, 1628, 1629, 0, 0, + 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, + 1631, 1630, 0, 1632, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 1625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 0, 0, 1632, 0, 1626, 0, 0, 0, 0, 1627, + 0, 0, 0, 0, 0, 0, 1633, 0, 0, 1634, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 1635, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 0, 0, 3358, 1635, 0, 0, + 0, 0, 0, 0, 0, 1631, 0, 1611, 1632, 0, + 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1620, 1635, 0, 0, 0, + 0, 0, 0, 0, 0, 1622, 0, 0, 0, 0, + 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 1624, + 0, 0, 3415, 0, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 1620, 0, 0, + 0, 3437, 1635, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 1796, 0, + 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1626, 0, 0, 0, 0, 1627, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 1636, + 0, 0, 1637, 1638, 1639, 1630, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 2795, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1631, 1626, 0, 1632, 0, 0, 1627, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1631, 0, 0, 1632, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1636, 0, 0, + 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, + 0, 0, 3225, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 555, 0, 0, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 3399, 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, @@ -399004,409 +401367,13 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 512, 513, 514, - 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 2232, 122, 123, 124, 556, 125, - 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 573, 143, 144, 145, - 146, 147, 148, 574, 575, 149, 150, 151, 152, 576, - 577, 155, 578, 156, 157, 158, 159, 579, 580, 581, - 582, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 585, 172, 173, 174, 175, 176, 177, 586, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 591, 194, 592, 195, 196, - 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, - 595, 596, 205, 206, 207, 2233, 209, 597, 210, 211, - 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 602, 227, 603, - 228, 229, 604, 231, 605, 232, 606, 233, 607, 608, - 609, 236, 237, 610, 611, 240, 612, 241, 613, 614, - 615, 244, 245, 616, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 618, 258, 259, 260, - 261, 262, 263, 264, 619, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 624, 625, 626, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 630, - 631, 287, 632, 289, 633, 634, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 640, 327, 328, 641, 330, 642, 643, 332, - 644, 334, 335, 336, 645, 337, 338, 646, 647, 339, - 340, 341, 648, 649, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 654, 655, 656, 657, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 661, 370, 371, 372, - 373, 374, 375, 662, 376, 377, 378, 663, 380, 381, - 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 665, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 668, 669, 417, - 418, 419, 420, 421, 2234, 670, 424, 425, 671, 672, - 427, 428, 673, 430, 674, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 677, 678, 446, 447, 679, 448, 680, 450, 451, 452, - 453, 454, 681, 455, 682, 683, 684, 685, 458, 459, - 686, 461, 687, 688, 463, 464, 689, 466, 467, 468, - 469, 470, 690, 691, 471, 472, 473, 692, 474, 475, - 476, 477, 693, 478, 479, 480, 481, 482, 694, 695, - 696, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 964, 0, 815, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 560, 0, 0, 0, 0, 565, 129, 130, 0, 131, - 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, - 572, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 576, 577, 155, 0, 156, 157, - 158, 159, 579, 0, 581, 0, 583, 163, 164, 165, - 166, 167, 584, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 587, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 589, 190, 191, 590, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 600, 221, 222, 223, 224, - 225, 601, 1341, 227, 0, 228, 229, 604, 231, 0, - 232, 0, 233, 607, 0, 609, 236, 237, 610, 611, - 240, 0, 241, 0, 614, 615, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 617, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 620, 621, 268, 269, 270, 271, 272, 622, 623, - 0, 625, 0, 276, 627, 628, 279, 629, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 632, 289, 633, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 635, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 636, 637, 638, 323, 324, 325, 639, 0, 327, 328, - 641, 330, 0, 643, 332, 644, 334, 335, 336, 0, - 337, 338, 1342, 0, 339, 340, 341, 0, 0, 342, - 343, 650, 651, 346, 652, 653, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 658, 659, 364, 365, 660, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 663, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 666, 400, 401, 402, 667, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 669, 417, 418, 419, 420, 421, 422, - 670, 424, 425, 0, 672, 427, 428, 673, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 675, 444, 676, 0, 0, 446, 447, 0, - 448, 680, 450, 451, 452, 453, 454, 0, 455, 682, - 683, 0, 0, 458, 459, 686, 461, 687, 1343, 463, - 464, 689, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 694, 695, 0, 485, 697, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 512, 513, 514, - 515, 964, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 3, 4, 0, 560, 0, 0, 0, 0, - 565, 129, 130, 0, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 576, - 577, 155, 0, 156, 157, 158, 159, 579, 0, 581, - 0, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 0, 227, 0, - 228, 229, 604, 231, 0, 232, 0, 233, 607, 0, - 609, 236, 237, 610, 611, 240, 0, 241, 0, 614, - 615, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 0, 625, 0, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 632, 289, 633, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 0, 327, 328, 641, 330, 0, 643, 332, - 644, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 663, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 0, 672, - 427, 428, 673, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 0, 0, 446, 447, 0, 448, 680, 450, 451, 452, - 453, 454, 0, 455, 682, 683, 0, 0, 458, 459, - 686, 461, 687, 0, 463, 464, 689, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 694, 695, - 0, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 129, 130, 0, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 785, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 786, 0, 787, 0, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 788, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 0, 327, 328, - 329, 330, 0, 790, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 426, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, - 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 796, 461, 797, 0, 463, - 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 161, - 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 234, 0, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 0, 327, 328, 329, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 1738, 156, 157, - 158, 159, 160, 0, 0, 1739, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 1740, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 1741, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1742, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 1743, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 1744, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 1738, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 1740, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 1741, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 2317, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 1743, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 1744, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 3, 4, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 550, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, @@ -399432,7 +401399,7 @@ static const yytype_int16 yytable[] = 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 551, 368, 369, 0, 370, 371, 372, + 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, @@ -399449,8 +401416,8 @@ static const yytype_int16 yytable[] = 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 0, 0, 0, 0, 2695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, @@ -399478,7 +401445,7 @@ static const yytype_int16 yytable[] = 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 791, 339, 340, 341, 0, 0, 342, + 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, @@ -399499,3111 +401466,4023 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 515, 964, 1341, 815, 0, 0, 0, 1046, 0, 0, + 2698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, + 126, 127, 0, 0, 0, 560, 0, 0, 0, 0, + 565, 129, 130, 0, 131, 132, 133, 567, 135, 136, + 137, 568, 569, 570, 571, 572, 0, 143, 144, 145, + 146, 147, 148, 0, 0, 149, 150, 151, 152, 576, + 577, 155, 0, 156, 157, 158, 159, 579, 0, 581, + 0, 583, 163, 164, 165, 166, 167, 584, 169, 170, + 171, 0, 172, 173, 174, 175, 176, 177, 0, 587, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, + 589, 190, 191, 590, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 896, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, + 600, 221, 222, 223, 224, 225, 601, 1342, 227, 0, + 228, 229, 604, 231, 0, 232, 0, 233, 607, 0, + 609, 236, 237, 610, 611, 240, 0, 241, 0, 614, + 615, 244, 245, 0, 246, 247, 248, 249, 250, 251, + 252, 617, 254, 255, 256, 257, 0, 258, 259, 260, + 261, 262, 263, 264, 0, 265, 620, 621, 268, 269, + 270, 271, 272, 622, 623, 0, 625, 0, 276, 627, + 628, 279, 629, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 632, 289, 633, 0, 291, 292, 293, 294, + 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 791, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, + 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, + 325, 639, 0, 327, 328, 641, 330, 0, 643, 332, + 644, 334, 335, 336, 0, 337, 338, 1343, 0, 339, + 340, 341, 0, 0, 342, 343, 650, 651, 346, 652, + 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 0, 0, 0, 0, 360, 361, 658, 659, + 364, 365, 660, 367, 368, 369, 0, 370, 371, 372, + 373, 374, 375, 0, 376, 377, 378, 663, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, + 391, 392, 393, 394, 395, 396, 0, 397, 398, 666, + 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 0, 669, 417, + 418, 419, 420, 421, 422, 670, 424, 425, 0, 672, + 427, 428, 673, 430, 0, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, + 0, 0, 446, 447, 0, 448, 680, 450, 451, 452, + 453, 454, 0, 455, 682, 683, 0, 0, 458, 459, + 686, 461, 687, 1344, 463, 464, 689, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, + 476, 477, 0, 478, 479, 480, 481, 482, 694, 695, + 0, 485, 697, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 512, 513, 514, 515, 0, 0, 1611, 0, + 0, 1612, 0, 1345, 1346, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1620, 0, 0, 0, + 0, 2167, 0, 0, 0, 0, 1622, 1611, 0, 0, + 1612, 0, 0, 1623, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1620, 0, 0, 0, 0, + 1624, 0, 0, 0, 0, 1622, 1611, 0, 0, 1612, + 0, 0, 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 938, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 1942, 0, 0, 0, 0, 1943, 0, 0, + 0, 0, 0, 0, 1620, 0, 0, 0, 0, 1624, + 0, 0, 0, 0, 1622, 0, 2168, 0, 0, 0, + 0, 1623, 0, 0, 1611, 0, 0, 1612, 0, 0, + 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1624, 0, + 0, 0, 1620, 0, 0, 0, 1890, 0, 0, 0, + 0, 0, 1622, 0, 1611, 0, 1625, 1612, 0, 1623, + 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, + 0, 0, 0, 1626, 0, 0, 0, 0, 1627, 0, + 0, 0, 1620, 0, 0, 1926, 1624, 0, 0, 0, + 1927, 0, 1622, 0, 0, 1625, 0, 0, 0, 1623, + 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1626, 0, 0, 0, 1630, 1627, 0, 0, + 0, 0, 0, 3505, 0, 0, 1624, 0, 0, 0, + 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, + 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1626, 0, 0, 1631, 1630, 1627, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 1628, + 1629, 0, 1625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1631, 1630, 0, 1632, 0, 0, 1626, + 0, 0, 0, 0, 1627, 0, 0, 0, 0, 0, + 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, + 0, 0, 1625, 0, 0, 0, 0, 1628, 1629, 0, + 0, 0, 1631, 0, 0, 1632, 0, 0, 0, 1626, + 0, 0, 1630, 0, 1627, 0, 0, 0, 0, 1633, + 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1628, 1629, 0, + 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, + 1631, 3506, 1630, 1632, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1631, 0, 0, 1632, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2171, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 1950, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 1951, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 1952, - 448, 0, 450, 1953, 452, 1954, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 1955, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1897, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1636, 0, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 0, 1636, 0, 0, + 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, + 1620, 0, 0, 0, 1932, 0, 0, 1635, 0, 0, + 1622, 0, 0, 0, 0, 0, 0, 1623, 0, 0, + 0, 0, 0, 0, 0, 0, 1636, 0, 0, 1637, + 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, + 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 1620, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 0, + 0, 1624, 0, 0, 0, 0, 1611, 0, 0, 1612, + 1625, 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 0, 0, 0, 0, 0, 0, 0, 1626, 0, 0, + 0, 0, 1627, 0, 1620, 0, 0, 0, 1939, 0, + 0, 0, 0, 0, 1622, 0, 0, 0, 0, 0, + 0, 1623, 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 815, 0, + 1630, 0, 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1937, 1611, 0, 0, 1612, 1625, 0, 0, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 1631, 0, + 0, 1632, 0, 0, 1626, 0, 0, 0, 0, 1627, + 0, 1620, 0, 0, 0, 1633, 0, 0, 1634, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 822, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 823, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 824, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 825, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 826, 457, 0, 0, 827, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 1626, 0, 0, 0, 1631, 1627, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 859, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 1628, + 1629, 0, 0, 0, 0, 1635, 0, 0, 1611, 0, + 0, 1612, 0, 0, 1630, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2062, 0, 0, 0, 0, 1620, 0, 0, 0, + 0, 1625, 0, 0, 0, 0, 1622, 0, 0, 0, + 0, 0, 1631, 1623, 0, 1632, 0, 0, 1626, 0, + 0, 0, 0, 1627, 0, 0, 0, 0, 0, 1633, + 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, + 1624, 0, 0, 0, 0, 0, 1628, 1629, 0, 0, + 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, + 0, 1630, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1633, 0, 0, 1634, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1635, + 0, 0, 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 891, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 1626, 0, 0, 0, 0, 1627, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, + 1611, 0, 0, 1612, 0, 0, 1630, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1635, 0, 1620, 0, + 0, 0, 2772, 0, 0, 0, 0, 0, 1622, 0, + 0, 0, 0, 0, 1631, 1623, 1636, 1632, 0, 1637, + 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, + 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, + 0, 0, 1624, 0, 1611, 0, 0, 1612, 0, 0, + 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 894, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 1620, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 898, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 926, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 1635, 0, 1611, 0, 0, 1612, 0, 1625, 0, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, + 0, 0, 0, 0, 0, 1626, 0, 0, 0, 0, + 1627, 1620, 0, 0, 2759, 0, 0, 0, 0, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, + 0, 0, 0, 0, 1627, 0, 1631, 0, 1636, 1632, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 0, 0, 1633, 0, 0, 1634, 1628, 1629, 0, + 0, 0, 0, 0, 0, 0, 1611, 0, 0, 1612, + 0, 0, 1630, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 954, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 0, 1620, 0, 0, 0, 0, 0, + 0, 1625, 0, 0, 1622, 0, 0, 0, 0, 0, + 1631, 1623, 0, 1632, 0, 0, 0, 0, 1626, 0, + 0, 0, 0, 1627, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 0, 1624, 0, + 0, 0, 0, 0, 0, 0, 1806, 1629, 0, 0, + 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, + 0, 1630, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, + 1614, 0, 0, 1617, 1618, 1619, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 1620, 0, 1632, 0, 0, 0, 0, 0, 0, 0, + 1622, 0, 0, 0, 0, 0, 1633, 1623, 0, 1634, + 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, + 0, 1626, 0, 0, 0, 0, 1627, 0, 0, 0, + 1636, 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, + 1643, 1644, 1645, 0, 0, 1611, 0, 0, 1612, 1628, + 1629, 0, 1613, 1614, 0, 0, 1617, 1618, 1619, 0, + 0, 0, 0, 0, 1630, 0, 0, 0, 0, 0, + 0, 0, 0, 1620, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 0, 1611, 1635, 0, 1612, 0, + 1623, 0, 1613, 1614, 0, 0, 1617, 1618, 1619, 0, + 0, 0, 1631, 0, 1636, 1632, 0, 1637, 1638, 1639, + 1625, 1640, 1641, 1642, 1643, 1644, 1645, 1624, 0, 1633, + 0, 0, 1634, 1622, 0, 0, 0, 1626, 0, 0, + 1623, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 957, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1628, 1629, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 1000, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 1630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 1023, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 1631, 0, + 0, 1632, 0, 1625, 0, 0, 0, 0, 0, 1635, + 0, 0, 0, 0, 0, 1633, 0, 0, 1634, 0, + 1626, 0, 0, 0, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 822, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 826, 457, 0, 0, 827, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 1625, 0, 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1302, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 1626, 0, 0, 1630, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1304, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1307, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 1631, 0, 1630, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1635, 1636, 0, 1633, 1637, + 1638, 1639, 0, 1640, 1641, 1642, 1643, 2188, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1309, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 1631, 0, 0, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 2228, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 1476, 0, 0, -787, 0, - 1477, 129, 130, 0, 131, 132, 133, 1478, 135, 136, - 137, 0, 1479, 1480, 1481, 1482, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 1483, - 1484, 155, 0, 156, 157, 158, 159, 0, 0, 1485, - 0, 1486, 163, 164, 165, 166, 167, 1487, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 1488, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1489, 190, 191, 1490, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 0, 221, 222, 223, 224, 225, 0, 0, 227, 0, - 228, 229, 1491, 231, 0, 232, 0, 233, 1492, 0, - 1493, 236, 237, -787, 1494, 240, 0, 241, 0, 0, - 0, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 1495, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 1496, 0, 268, 269, - 270, 271, 272, 1497, 1498, 0, 1499, 0, 276, 1500, - 1501, 279, 1502, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 1503, 289, 1504, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 1505, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1506, 1507, 1508, 323, 324, - 325, 0, 0, 327, 328, 1509, 330, 0, 0, 332, - 1510, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 0, 1511, 346, 1512, - 0, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 0, 1513, - 364, 365, 0, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 1514, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 1515, - 400, 401, 402, 1516, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 1517, 417, - 418, 419, 420, 421, 422, 1518, 424, 425, 0, 1519, - 427, 428, 1520, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 1521, 444, 0, - 0, 0, 446, 447, 0, 448, 1522, 450, 451, 452, - 453, 454, 0, 455, 1523, 1524, 0, 0, 458, 459, - 0, 461, 0, 0, 463, 464, 1525, 466, 467, 468, - 469, 470, 1526, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 0, 1527, - 0, 485, 1528, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 523, 0, 549, 0, 0, 0, 0, 0, 0, - 0, 0, 512, 513, 514, 515, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 2971, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 837, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 838, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 839, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 840, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 841, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 950, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, + 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 839, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 841, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1298, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1319, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 1670, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 0, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1846, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 2215, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 2230, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 1475, 0, 0, 0, + 0, 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 1476, 0, 0, 0, 0, 1477, 129, 130, 0, 131, - 132, 133, 1478, 135, 136, 137, 0, 1479, 1480, 1481, - 1482, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 1483, 1484, 155, 0, 156, 157, - 158, 159, 0, 0, 1485, 0, 1486, 163, 164, 165, - 166, 167, 1487, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 1488, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1489, 190, 191, 1490, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 0, 221, 222, 223, 224, - 225, 0, 0, 227, 0, 228, 229, 1491, 231, 0, - 232, 0, 233, 1492, 0, 1493, 236, 237, 0, 1494, - 240, 0, 241, 0, 0, 0, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 1495, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 1496, 0, 268, 269, 270, 271, 272, 1497, 1498, - 0, 1499, 0, 276, 1500, 1501, 279, 1502, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 1503, 289, 1504, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1505, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1506, 1507, 1508, 323, 324, 325, 0, 0, 327, 328, - 1509, 330, 0, 0, 332, 1510, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 0, 1511, 346, 1512, 0, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 0, 1513, 364, 365, 0, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1514, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 1515, 400, 401, 402, 1516, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 1517, 417, 418, 419, 420, 421, 422, - 1518, 424, 425, 0, 1519, 427, 428, 1520, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 1521, 444, 0, 0, 0, 446, 447, 0, - 448, 1522, 450, 451, 452, 453, 454, 0, 455, 1523, - 1524, 0, 0, 458, 459, 0, 461, 0, 0, 463, - 464, 1525, 466, 467, 468, 469, 470, 1526, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 0, 1527, 0, 485, 1528, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 1475, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 1476, 0, 0, 0, 0, 1477, 129, 130, 0, 131, - 132, 133, 1478, 135, 136, 137, 0, 1479, 1480, 1481, - 1482, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 1483, 1484, 155, 0, 156, 157, - 158, 159, 0, 0, 1485, 0, 1486, 163, 164, 165, - 166, 167, 1487, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 1488, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1489, 190, 191, 1490, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 1828, 214, 215, - 0, 216, 217, 218, 219, 0, 221, 222, 223, 224, - 225, 0, 0, 227, 0, 228, 229, 1491, 231, 0, - 232, 0, 233, 1492, 0, 1493, 236, 237, 0, 1494, - 240, 0, 241, 0, 0, 0, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 1495, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 1496, 0, 268, 269, 270, 271, 272, 1497, 1498, - 0, 1499, 0, 276, 1500, 1501, 279, 1502, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 1503, 289, 1504, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1505, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1506, 1507, 1508, 323, 324, 325, 0, 0, 327, 328, - 1509, 330, 0, 0, 332, 1510, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 0, 1511, 346, 1512, 0, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 0, 1513, 364, 365, 0, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1514, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 1515, 400, 401, 402, 1516, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 1517, 417, 418, 419, 420, 421, 422, - 1518, 424, 425, 0, 1519, 427, 428, 1520, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 1521, 444, 0, 0, 0, 446, 447, 0, - 448, 1522, 450, 451, 452, 453, 454, 0, 455, 1523, - 1524, 0, 0, 458, 459, 0, 461, 0, 0, 463, - 464, 1525, 466, 467, 468, 469, 470, 1526, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 0, 1527, 0, 485, 1528, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 3141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 2893, 0, 0, 0, 0, 2894, 129, 130, 0, 131, - 132, 133, 2895, 135, 136, 137, 0, 1479, 2896, 1481, - 1482, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 1483, 1484, 155, 0, 156, 157, - 158, 159, 0, 0, 2897, 0, 2898, 163, 164, 165, - 166, 167, 2899, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 2900, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1489, 190, 191, 1490, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 0, 221, 222, 223, 224, - 225, 0, 0, 227, 0, 228, 229, 1491, 231, 0, - 232, 0, 233, 2901, 0, 2902, 236, 237, 2903, 2904, - 240, 0, 241, 0, 0, 0, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 2905, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 2906, 0, 268, 269, 270, 271, 272, 1497, 1498, - 0, 1499, 0, 276, 2907, 2908, 279, 2909, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 2910, 289, 2911, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 3142, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1506, 2913, 1508, 323, 324, 325, 0, 0, 327, 328, - 2915, 330, 0, 0, 332, 1510, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 0, 2917, 346, 2918, 0, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 0, 2919, 364, 365, 0, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1514, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 2920, 400, 401, 402, 0, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 2921, 417, 418, 419, 420, 421, 422, - 0, 424, 425, 0, 2923, 427, 428, 1520, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 3143, 444, 0, 0, 0, 446, 447, 0, - 448, 2925, 450, 451, 452, 453, 454, 0, 455, 1523, - 1524, 0, 0, 458, 459, 0, 461, 0, 0, 463, - 464, 2926, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 0, 1527, 0, 485, 2928, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 523, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 0, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 0, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 0, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1765, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, + 0, 2085, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 117, 118, + 119, 120, 121, 122, 123, 124, 556, 125, 126, 127, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, + 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 573, 143, 144, 145, 146, 147, + 148, 574, 575, 149, 150, 151, 152, 576, 577, 155, + 578, 156, 157, 158, 159, 579, 580, 581, 582, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 585, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 591, 194, 592, 195, 196, 197, 198, + 199, 200, 593, 594, 201, 202, 203, 204, 595, 596, + 205, 206, 207, 208, 209, 597, 210, 211, 212, 598, + 213, 214, 215, 599, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 602, 227, 603, 228, 229, + 604, 231, 605, 232, 606, 233, 607, 608, 609, 236, + 237, 610, 611, 240, 612, 241, 613, 614, 615, 244, + 245, 616, 246, 247, 248, 249, 250, 251, 252, 617, + 254, 255, 256, 257, 618, 258, 259, 260, 261, 262, + 263, 264, 619, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 624, 625, 626, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 630, 631, 287, + 632, 289, 633, 634, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 640, 327, 328, 641, 330, 642, 643, 332, 644, 334, + 335, 336, 645, 337, 338, 646, 647, 339, 340, 341, + 648, 649, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 654, 655, 656, 657, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 661, 370, 371, 372, 373, 374, + 375, 662, 376, 377, 378, 663, 380, 381, 382, 383, + 664, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 665, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 668, 669, 417, 418, 419, + 420, 421, 422, 670, 424, 425, 671, 672, 427, 428, + 673, 430, 674, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 677, 678, + 446, 447, 679, 448, 680, 450, 451, 452, 453, 454, + 681, 455, 682, 683, 684, 685, 458, 459, 686, 461, + 687, 688, 463, 464, 689, 466, 467, 468, 469, 470, + 690, 691, 471, 472, 473, 692, 474, 475, 476, 477, + 693, 478, 479, 480, 481, 482, 694, 695, 696, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 698, 699, + 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 1476, 0, 0, 0, 0, - 1477, 129, 130, 0, 131, 132, 133, 1478, 135, 136, - 137, 0, 1479, 1480, 1481, 1482, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 1483, - 1484, 155, 0, 156, 157, 158, 159, 0, 0, 1485, - 0, 1486, 163, 164, 165, 166, 167, 1487, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 1488, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1489, 190, 191, 1490, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 0, 221, 222, 223, 224, 225, 0, 0, 227, 0, - 228, 229, 1491, 231, 0, 232, 0, 233, 1492, 0, - 1493, 236, 237, 0, 1494, 240, 0, 241, 0, 0, - 0, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 1495, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 1496, 0, 268, 269, - 270, 271, 272, 1497, 1498, 0, 1499, 0, 276, 1500, - 1501, 279, 1502, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 1503, 289, 1504, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 0, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1506, 1507, 1508, 323, 324, - 325, 0, 0, 327, 328, 1509, 330, 0, 0, 332, - 1510, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 0, 1511, 346, 1512, - 0, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 0, 1513, - 364, 365, 0, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 1514, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 1515, - 400, 401, 402, 0, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 1517, 417, - 418, 419, 420, 421, 422, 0, 424, 425, 0, 1519, - 427, 428, 1520, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 0, 444, 0, - 0, 0, 446, 447, 0, 448, 1522, 450, 451, 452, - 453, 454, 0, 455, 1523, 1524, 0, 0, 458, 459, - 0, 461, 0, 0, 463, 464, 1525, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 0, 1527, - 0, 485, 1528, 487, 488, 489, 490, 491, 492, 493, - 0, 1, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 2, 0, 3, 4, 0, 0, 0, 0, 1, - 0, 0, 512, 513, 514, 515, 0, 0, 0, 2, - 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 8, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 11, 0, 746, - 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 11, 0, 746, 0, 0, - 0, 0, 0, 0, 0, 14, 15, 0, 13, 0, - 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, - 0, 0, 18, 14, 15, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 747, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 22, 0, 19, 0, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 0, 0, 0, 23, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 556, 125, 126, 127, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 129, 130, 566, 131, 132, 133, + 567, 135, 136, 137, 568, 569, 570, 571, 572, 573, + 143, 144, 145, 146, 147, 148, 574, 575, 149, 150, + 151, 152, 576, 577, 155, 578, 156, 157, 158, 159, + 579, 580, 581, 582, 583, 163, 164, 165, 166, 167, + 584, 169, 170, 171, 585, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 180, 181, 182, 183, 184, 588, + 186, 187, 188, 589, 190, 191, 590, 193, 591, 194, + 592, 195, 196, 197, 198, 199, 200, 593, 594, 201, + 202, 203, 204, 595, 596, 205, 206, 207, 208, 209, + 597, 210, 211, 212, 598, 213, 214, 215, 599, 216, + 217, 218, 219, 600, 221, 222, 223, 224, 225, 601, + 602, 227, 603, 228, 229, 604, 231, 605, 232, 606, + 233, 607, 608, 609, 236, 237, 610, 611, 240, 612, + 241, 613, 614, 615, 244, 245, 616, 246, 247, 248, + 249, 250, 251, 252, 617, 254, 255, 256, 257, 618, + 258, 259, 260, 261, 262, 263, 264, 619, 265, 620, + 621, 268, 269, 270, 271, 272, 622, 623, 624, 625, + 626, 276, 627, 628, 279, 629, 281, 282, 283, 284, + 285, 286, 630, 631, 287, 632, 289, 633, 634, 291, + 292, 293, 294, 295, 296, 297, 298, 635, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, + 638, 323, 324, 325, 639, 640, 327, 328, 641, 330, + 642, 643, 332, 644, 334, 335, 336, 645, 337, 338, + 646, 647, 339, 340, 341, 648, 649, 342, 343, 650, + 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 654, 655, 656, 657, 360, + 361, 658, 659, 364, 365, 660, 367, 368, 369, 661, + 370, 371, 372, 373, 374, 375, 662, 376, 377, 378, + 663, 380, 381, 382, 383, 664, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 665, + 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 668, 669, 417, 418, 419, 420, 421, 422, 670, 424, + 425, 671, 672, 427, 428, 673, 430, 674, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 675, 444, 676, 677, 678, 446, 447, 679, 448, 680, + 450, 451, 452, 453, 454, 681, 455, 682, 683, 684, + 685, 458, 459, 686, 461, 687, 688, 463, 464, 689, + 466, 467, 468, 469, 470, 690, 691, 471, 472, 473, + 692, 474, 475, 476, 477, 693, 478, 479, 480, 481, + 482, 694, 695, 696, 485, 697, 487, 488, 489, 490, + 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, + 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 556, 125, 126, 127, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, + 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 573, 143, 144, 145, 146, 147, + 148, 574, 575, 149, 150, 151, 152, 576, 577, 155, + 578, 156, 157, 158, 159, 579, 580, 581, 582, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 585, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 591, 194, 592, 195, 196, 197, 198, + 199, 200, 593, 594, 201, 202, 203, 204, 595, 596, + 205, 206, 207, 208, 209, 597, 210, 211, 212, 598, + 213, 214, 215, 599, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 602, 227, 603, 228, 229, + 604, 231, 605, 232, 606, 233, 607, 608, 609, 236, + 237, 610, 611, 240, 612, 241, 613, 614, 615, 244, + 245, 616, 246, 247, 248, 249, 250, 940, 252, 617, + 254, 255, 256, 257, 618, 258, 259, 260, 261, 262, + 263, 264, 619, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 624, 625, 626, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 630, 631, 287, + 632, 289, 633, 634, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 640, 327, 328, 641, 330, 642, 643, 332, 644, 334, + 335, 336, 645, 337, 338, 646, 647, 339, 340, 341, + 648, 649, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 654, 655, 656, 657, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 661, 370, 371, 372, 373, 374, + 375, 662, 376, 377, 378, 663, 380, 381, 382, 383, + 664, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 665, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 668, 669, 417, 418, 419, + 420, 421, 422, 670, 424, 425, 671, 672, 427, 428, + 673, 430, 674, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 677, 678, + 446, 447, 679, 448, 680, 450, 451, 452, 453, 454, + 681, 455, 682, 683, 684, 685, 458, 459, 686, 461, + 687, 688, 463, 464, 689, 466, 467, 468, 469, 470, + 690, 691, 471, 472, 473, 692, 474, 475, 476, 477, + 693, 478, 479, 480, 481, 482, 694, 695, 696, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 698, 699, + 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 556, 125, 126, 127, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 129, 130, 566, 131, 132, 133, + 567, 135, 136, 137, 568, 569, 570, 571, 572, 573, + 143, 144, 145, 146, 147, 148, 574, 575, 149, 150, + 151, 152, 576, 577, 155, 578, 156, 157, 158, 159, + 579, 580, 581, 582, 583, 163, 164, 165, 166, 167, + 584, 169, 170, 171, 585, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 589, 190, 191, 590, 193, 591, 194, + 592, 195, 196, 197, 198, 199, 200, 593, 594, 201, + 202, 203, 204, 595, 596, 205, 206, 207, 208, 209, + 597, 210, 211, 212, 598, 213, 214, 215, 599, 216, + 217, 218, 219, 600, 221, 222, 223, 224, 225, 601, + 602, 227, 603, 228, 229, 604, 231, 605, 232, 606, + 233, 607, 608, 609, 236, 237, 610, 611, 240, 612, + 241, 613, 614, 615, 244, 245, 616, 246, 247, 248, + 249, 250, 251, 252, 617, 254, 255, 256, 257, 618, + 258, 259, 260, 261, 262, 263, 264, 619, 265, 620, + 621, 268, 269, 270, 271, 272, 622, 623, 624, 625, + 626, 276, 627, 628, 279, 629, 281, 282, 283, 284, + 285, 286, 630, 631, 287, 632, 289, 633, 634, 291, + 292, 293, 294, 295, 296, 297, 298, 635, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, + 638, 323, 324, 325, 639, 640, 327, 328, 641, 330, + 642, 643, 332, 644, 334, 335, 336, 645, 337, 338, + 646, 647, 339, 340, 341, 648, 649, 342, 343, 650, + 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 654, 655, 656, 657, 360, + 361, 658, 659, 364, 365, 660, 367, 368, 369, 661, + 370, 371, 372, 373, 374, 375, 662, 376, 377, 378, + 663, 380, 381, 382, 383, 664, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 665, + 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 668, 669, 417, 418, 419, 420, 421, 422, 670, 424, + 425, 671, 672, 427, 428, 673, 430, 674, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 675, 444, 676, 677, 678, 446, 447, 679, 448, 680, + 450, 451, 452, 453, 454, 681, 455, 682, 683, 684, + 685, 458, 459, 686, 461, 687, 688, 463, 464, 689, + 466, 467, 468, 469, 470, 690, 691, 471, 472, 473, + 692, 474, 475, 476, 477, 693, 478, 479, 480, 481, + 482, 694, 695, 696, 485, 697, 487, 488, 489, 490, + 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, + 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 2233, 122, 123, 124, 556, 125, 126, 127, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, + 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 573, 143, 144, 145, 146, 147, + 148, 574, 575, 149, 150, 151, 152, 576, 577, 155, + 578, 156, 157, 158, 159, 579, 580, 581, 582, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 585, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 591, 194, 592, 195, 196, 197, 198, + 199, 200, 593, 594, 201, 202, 203, 204, 595, 596, + 205, 206, 207, 2234, 209, 597, 210, 211, 212, 598, + 213, 214, 215, 599, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 602, 227, 603, 228, 229, + 604, 231, 605, 232, 606, 233, 607, 608, 609, 236, + 237, 610, 611, 240, 612, 241, 613, 614, 615, 244, + 245, 616, 246, 247, 248, 249, 250, 251, 252, 617, + 254, 255, 256, 257, 618, 258, 259, 260, 261, 262, + 263, 264, 619, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 624, 625, 626, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 630, 631, 287, + 632, 289, 633, 634, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 640, 327, 328, 641, 330, 642, 643, 332, 644, 334, + 335, 336, 645, 337, 338, 646, 647, 339, 340, 341, + 648, 649, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 654, 655, 656, 657, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 661, 370, 371, 372, 373, 374, + 375, 662, 376, 377, 378, 663, 380, 381, 382, 383, + 664, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 665, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 668, 669, 417, 418, 419, + 420, 421, 2235, 670, 424, 425, 671, 672, 427, 428, + 673, 430, 674, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 677, 678, + 446, 447, 679, 448, 680, 450, 451, 452, 453, 454, + 681, 455, 682, 683, 684, 685, 458, 459, 686, 461, + 687, 688, 463, 464, 689, 466, 467, 468, 469, 470, + 690, 691, 471, 472, 473, 692, 474, 475, 476, 477, + 693, 478, 479, 480, 481, 482, 694, 695, 696, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 698, 699, + 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 964, 0, 815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 560, 0, + 0, 0, 0, 565, 129, 130, 0, 131, 132, 133, + 567, 135, 136, 137, 568, 569, 570, 571, 572, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 576, 577, 155, 0, 156, 157, 158, 159, + 579, 0, 581, 0, 583, 163, 164, 165, 166, 167, + 584, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 587, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 589, 190, 191, 590, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 600, 221, 222, 223, 224, 225, 601, + 1342, 227, 0, 228, 229, 604, 231, 0, 232, 0, + 233, 607, 0, 609, 236, 237, 610, 611, 240, 0, + 241, 0, 614, 615, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 617, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 620, + 621, 268, 269, 270, 271, 272, 622, 623, 0, 625, + 0, 276, 627, 628, 279, 629, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 632, 289, 633, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 635, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, + 638, 323, 324, 325, 639, 0, 327, 328, 641, 330, + 0, 643, 332, 644, 334, 335, 336, 0, 337, 338, + 1343, 0, 339, 340, 341, 0, 0, 342, 343, 650, + 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 658, 659, 364, 365, 660, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 663, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 669, 417, 418, 419, 420, 421, 422, 670, 424, + 425, 0, 672, 427, 428, 673, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 675, 444, 676, 0, 0, 446, 447, 0, 448, 680, + 450, 451, 452, 453, 454, 0, 455, 682, 683, 0, + 0, 458, 459, 686, 461, 687, 1344, 463, 464, 689, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 694, 695, 0, 485, 697, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 512, 513, 514, 515, 964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 3, 4, 0, 560, 0, 0, 0, 0, 565, 129, + 130, 0, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 576, 577, 155, + 0, 156, 157, 158, 159, 579, 0, 581, 0, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 0, 227, 0, 228, 229, + 604, 231, 0, 232, 0, 233, 607, 0, 609, 236, + 237, 610, 611, 240, 0, 241, 0, 614, 615, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 617, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 0, 625, 0, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 632, 289, 633, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 0, 327, 328, 641, 330, 0, 643, 332, 644, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 663, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 669, 417, 418, 419, + 420, 421, 422, 670, 424, 425, 0, 672, 427, 428, + 673, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 0, 0, + 446, 447, 0, 448, 680, 450, 451, 452, 453, 454, + 0, 455, 682, 683, 0, 0, 458, 459, 686, 461, + 687, 0, 463, 464, 689, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 694, 695, 0, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 785, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 161, 0, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 0, 327, 328, 329, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 1739, 156, 157, 158, 159, + 160, 0, 0, 1740, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 1741, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 1742, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1743, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 1744, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 1745, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 28, 29, 0, 0, 0, 0, - 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 27, 28, 29, 0, 0, 0, 0, 0, 30, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 34, 0, - 33, 0, 0, 0, 0, 35, 0, 0, 0, 36, - 0, 0, 0, 0, 0, 0, 34, 0, 0, 37, - 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, - 0, 38, 0, 0, 0, 39, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 0, 39, 0, 40, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, - 0, 0, 0, 40, 43, 0, 0, 0, 0, 44, - 0, 0, 0, 748, 0, 0, 41, 0, 0, 0, - 0, 0, 43, 0, 0, 45, 0, 44, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 1739, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 1741, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 1742, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 2318, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 1744, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 1745, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 3, 4, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 550, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 551, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 749, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 791, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 896, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 791, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 47 -}; - -static const yytype_int16 yycheck[] = -{ - 7, 0, 0, 47, 0, 73, 516, 0, 955, 16, - 0, 0, 895, 835, 0, 0, 23, 0, 904, 749, - 990, 0, 0, 881, 1235, 809, 970, 75, 76, 858, - 1691, 1196, 1223, 1032, 925, 920, 1221, 1156, 20, 741, - 38, 20, 20, 1417, 16, 77, 1573, 981, 981, 1209, - 1079, 981, 77, 981, 1654, 2140, 1190, 2142, 1465, 17, - 1198, 2313, 7, 2226, 2161, 959, 23, 1275, 75, 76, - 1986, 1201, 970, 2648, 1796, 46, 1297, 2171, 23, 0, - 39, 895, 2106, 897, 7, 899, 0, 0, 1226, 0, - 1123, 25, 26, 0, 0, 1128, 1607, 1608, 0, 2609, - 23, 2160, 100, 2663, 2609, 0, 26, 1987, 0, 805, - 0, 0, 1322, 999, 810, 2670, 748, 1087, 75, 76, - 0, 749, 742, 0, 0, 0, 2483, 2293, 0, 0, - 75, 76, 35, 0, 0, 0, 0, 2646, 2274, 2275, - 2276, 2565, 5, 2222, 0, 2569, 5, 0, 1658, 1709, - 979, 110, 75, 76, 5, 1711, 1814, 1053, 1054, 11, - 1927, 5, 13, 14, 16, 5, 13, 14, 5, 5, - 1815, 80, 5, 5, 1070, 5, 9, 13, 14, 5, - 114, 13, 14, 13, 14, 5, 5, 13, 14, 9, - 1134, 970, 5, 5, 5, 5, 4, 772, 982, 2982, - 5, 9, 2305, 9, 5, 2301, 172, 2299, 171, 5, - 5, 26, 2967, 3, 119, 5, 45, 32, 45, 13, - 14, 1960, 1961, 3, 4, 5, 1818, 55, 3, 9, - 2985, 9, 1971, 876, 876, 2314, 1975, 124, 63, 63, - 970, 11, 40, 1242, 100, 15, 16, 100, 122, 122, - 11, 2434, 1251, 1139, 2434, 16, 37, 1086, 74, 34, - 35, 107, 60, 147, 8, 23, 1210, 11, 871, 1213, - 1214, 15, 16, 190, 2821, 63, 4, 139, 5, 82, - 82, 9, 180, 2362, 2363, 46, 2365, 983, 3146, 289, - 93, 93, 802, 11, 295, 290, 287, 15, 16, 995, - 104, 117, 46, 295, 63, 2867, 0, 11, 106, 53, - 312, 15, 16, 1432, 74, 275, 107, 75, 76, 80, - 2937, 40, 137, 192, 30, 244, 20, 1106, 46, 23, - 107, 2416, 38, 217, 192, 183, 80, 117, 212, 365, - 850, 973, 165, 171, 38, 132, 1465, 132, 117, 2802, - 3277, 2804, 2527, 47, 2529, 1134, 278, 106, 1518, 388, - 1189, 289, 80, 1185, 1186, 119, 1953, 1954, 1955, 379, - 30, 171, 2579, 30, 40, 75, 180, 30, 30, 161, - 172, 75, 76, 77, 1057, 38, 38, 3341, 161, 416, - 1611, 172, 2528, 108, 149, 170, 3309, 172, 41, 3385, - 1073, 145, 2977, 201, 13, 14, 100, 2129, 168, 454, - 163, 295, 2922, 2988, 3076, 2578, 3078, 430, 406, 3174, - 64, 1279, 90, 1308, 71, 72, 122, 208, 478, 120, - 74, 1210, 176, 289, 1213, 1214, 289, 3235, 218, 3237, - 420, 137, 422, 224, 3371, 200, 1337, 3374, 272, 193, - 500, 2475, 250, 234, 198, 237, 175, 108, 274, 2553, - 240, 129, 260, 279, 237, 428, 479, 30, 272, 514, - 2979, 393, 132, 2680, 272, 132, 191, 230, 293, 3433, - 468, 272, 415, 126, 3470, 514, 355, 274, 514, 337, - 108, 451, 236, 3276, 352, 1524, 2575, 284, 2577, 284, - 323, 250, 358, 194, 286, 358, 304, 509, 518, 175, - 279, 260, 328, 213, 514, 3313, 308, 518, 366, 514, - 453, 3434, 85, 514, 1745, 279, 518, 3144, 344, 448, - 514, 94, 357, 357, 120, 350, 534, 3199, 2713, 354, - 503, 3468, 3104, 3090, 1187, 1187, 2729, 291, 514, 2729, - 3408, 456, 279, 516, 3007, 118, 454, 166, 356, 1162, - 444, 3123, 386, 2659, 2656, 1344, 1345, 454, 328, 357, - 416, 386, 1979, 2676, 1739, 1150, 0, 451, 451, 2106, - 361, 588, 1092, 381, 413, 26, 413, 1483, 1484, 3372, - 2506, 32, 1800, 370, 1423, 514, 240, 514, 357, 380, - 392, 3161, 400, 512, 463, 2372, 244, 516, 194, 1339, - 472, 2690, 1508, 403, 404, 1437, 588, 2177, 3373, 1321, - 476, 425, 2178, 476, 1326, 428, 428, 190, 428, 445, - 1332, 327, 1454, 2144, 478, 476, 3146, 478, 454, 307, - 203, 3146, 457, 2170, 265, 1836, 1856, 391, 2306, 512, - 163, 514, 517, 516, 2164, 514, 500, 1656, 510, 515, - 1871, 517, 515, 514, 517, 478, 2311, 514, 1889, 520, - 514, 3095, 1568, 1569, 514, 2838, 3100, 514, 514, 2845, - 1901, 514, 514, 520, 514, 445, 514, 500, 514, 464, - 396, 2430, 3049, 518, 514, 514, 137, 505, 506, 320, - 3275, 514, 514, 514, 514, 749, 1338, 513, 1328, 514, - 1931, 1339, 2964, 514, 1600, 1601, 1602, 1938, 514, 514, - 514, 1550, 1551, 3283, 2316, 505, 506, 505, 506, 3284, - 518, 1560, 370, 476, 1430, 505, 506, 507, 508, 509, - 510, 517, 749, 396, 396, 1574, 148, 454, 476, 510, - 258, 259, 800, 421, 498, 1976, 800, 500, 271, 1980, - 2819, 505, 506, 507, 508, 509, 510, 749, 117, 748, - 748, 3474, 500, 226, 1603, 464, 1984, 505, 506, 356, - 11, 26, 789, 1897, 11, 33, 1565, 2008, 2704, 507, - 508, 509, 510, 800, 177, 249, 59, 199, 1577, 515, - 1579, 2825, 518, 507, 508, 509, 510, 514, 3383, 386, - 448, 59, 3515, 881, 1928, 46, 848, 1490, 1551, 272, - 274, 1940, 2958, 848, 5, 1769, 1605, 1560, 835, 836, - 2417, 2418, 2419, 2420, 503, 1779, 518, 1510, 1782, 402, - 534, 190, 405, 800, 789, 1844, 2872, 516, 782, 80, - 784, 858, 293, 80, 2880, 800, 1009, 240, 2738, 3368, - 1979, 2741, 1015, 2743, 784, 2781, 789, 375, 376, 868, - 868, 1544, 868, 312, 856, 868, 514, 800, 868, 868, - 814, 1764, 868, 868, 509, 868, 2965, 274, 859, 868, - 868, 516, 137, 512, 853, 902, 903, 516, 3408, 906, - 907, 1411, 2624, 3408, 2626, 839, 5, 1854, 171, 350, - 514, 1858, 871, 354, 1861, 1948, 514, 3426, 3170, 3494, - 2130, 1623, 503, 1737, 202, 274, 108, 366, 1872, 1708, - 1709, 1822, 352, 514, 837, 838, 389, 840, 2057, 1797, - 1798, 1799, 1004, 3106, 177, 386, 274, 868, 2475, 53, - 1764, 279, 959, 37, 868, 868, 515, 868, 1006, 518, - 1022, 868, 868, 970, 1026, 1013, 868, 925, 377, 1863, - 1784, 978, 979, 868, 1872, 1789, 868, 984, 868, 868, - 987, 988, 2493, 990, 991, 992, 993, 370, 868, 3086, - 1769, 868, 868, 868, 973, 973, 868, 868, 451, 1006, - 1779, 868, 868, 1782, 868, 244, 1013, 240, 336, 3334, - 3335, 26, 2146, 132, 2148, 377, 457, 32, 119, 82, - 2394, 416, 26, 82, 1031, 1032, 1033, 433, 32, 173, - 93, 789, 244, 132, 93, 513, 970, 420, 173, 422, - 159, 515, 800, 1087, 518, 1052, 524, 981, 293, 1006, - 244, 314, 315, 316, 748, 749, 1013, 202, 244, 2250, - 159, 1006, 3387, 513, 1071, 448, 251, 244, 1013, 2277, - 509, 2793, 176, 1775, 524, 1082, 1083, 1084, 1780, 1086, - 1087, 2200, 2609, 1006, 1091, 3001, 132, 3250, 172, 193, - 1013, 466, 370, 1872, 198, 789, 1030, 2318, 40, 478, - 512, 245, 514, 381, 516, 206, 800, 1936, 26, 354, - 245, 356, 1119, 159, 32, 420, 379, 422, 60, 1091, - 2258, 500, 137, 478, 208, 823, 824, 825, 26, 1136, - 1137, 370, 236, 137, 32, 514, 1168, 1169, 416, 1171, - 224, 386, 1872, 1168, 1169, 500, 1171, 4, 515, 509, - 234, 518, 9, 416, 848, 274, 516, 1014, 370, 514, - 279, 1018, 1096, 1170, 106, 284, 2136, 1174, 1175, 13, - 14, 272, 1106, 274, 868, 274, 370, 1184, 1185, 1186, - 279, 512, 1189, 514, 370, 284, 449, 420, 466, 422, - 2019, 1125, 1879, 370, 374, 2325, 1883, 460, 342, 1886, - 1134, 2331, 1209, 1162, 512, 4, 4, 342, 516, 448, - 9, 9, 377, 8, 1993, 448, 11, 161, 514, 137, - 15, 16, 166, 11, 19, 20, 21, 15, 16, 2450, - 420, 514, 422, 279, 26, 1242, 448, 381, 284, 137, - 32, 36, 4, 514, 1251, 161, 381, 9, 1006, 166, - 166, 514, 512, 514, 448, 1013, 516, 515, 46, 201, - 518, 1422, 448, 1424, 1425, 2094, 1225, 420, 1275, 422, - 514, 448, 416, 837, 838, 514, 840, 361, 293, 973, - 226, 416, 2229, 2141, 2231, 515, 514, 391, 518, 293, - 1297, 515, 80, 237, 518, 514, 380, 1296, 2825, 171, - 2707, 515, 514, 2232, 518, 2234, 1313, 1296, 250, 514, - 1296, 1296, 1006, 2432, 514, 1322, 435, 2436, 260, 1013, - 514, 237, 466, 3486, 13, 14, 272, 446, 514, 507, - 272, 466, 1339, 13, 14, 350, 435, 514, 514, 354, - 515, 1313, 286, 518, 514, 137, 350, 446, 515, 1356, - 354, 518, 500, 3438, 1048, 1362, 171, 1339, 515, 1338, - 1338, 518, 304, 2575, 2143, 2577, 1060, 514, 3453, 515, - 286, 386, 518, 515, 497, 293, 518, 3471, 515, 3473, - 223, 518, 386, 2205, 1356, 342, 13, 14, 2609, 435, - 342, 516, 338, 1087, 1442, 293, 1444, 2176, 2177, 1447, - 446, 2592, 1409, 1410, 1452, 289, 2591, 1455, 1415, 1457, - 1417, 2576, 2623, 1461, 356, 1422, 1423, 1424, 1425, 2304, - 3514, 1355, 497, 3508, 381, 1359, 221, 516, 3513, 381, - 1437, 1438, 350, 13, 14, 1442, 354, 1444, 171, 381, - 1447, 515, 457, 389, 518, 1452, 515, 1454, 1455, 518, - 1457, 2480, 2481, 457, 1461, 2640, 354, 170, 400, 416, - 2590, 518, 2592, 873, 416, 875, 188, 189, 386, 171, - 515, 514, 1417, 518, 1168, 1169, 515, 1171, 515, 518, - 515, 518, 515, 518, 515, 1442, 515, 1444, 386, 518, - 1447, 13, 14, 515, 1417, 1452, 291, 1442, 1455, 1444, - 1457, 293, 1447, 294, 1461, 451, 3228, 1452, 3230, 466, - 1455, 1518, 1457, 2483, 466, 515, 1461, 515, 518, 1442, - 518, 1444, 59, 2457, 1447, 2458, 2459, 2460, 2458, 1452, - 2458, 2459, 1455, 514, 1457, 177, 258, 259, 1461, 457, - 177, 417, 515, 1550, 1551, 518, 497, 515, 223, 1547, - 518, 1547, 1559, 1560, 1547, 13, 14, 1547, 350, 457, - 1567, 152, 354, 350, 1547, 202, 6, 1574, 1547, 1547, - 10, 152, 515, 515, 515, 518, 515, 518, 18, 518, - 152, 314, 315, 316, 515, 515, 515, 518, 518, 518, - 13, 14, 1599, 33, 386, 152, 1603, 37, 240, 1606, - 13, 14, 152, 240, 1611, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 1619, 1620, 13, 14, 40, 1624, 1625, 3146, - 2350, 515, 1629, 416, 518, 515, 1633, 515, 518, 1636, - 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 3238, 514, - 1647, 274, 2344, 40, 1338, 466, 379, 1654, 1620, 1656, - 89, 82, 515, 375, 376, 518, 152, 294, 2544, 1417, - 515, 515, 1694, 518, 518, 457, 480, 2888, 1675, 1694, - 152, 313, 13, 14, 2839, 2454, 2455, 108, 13, 14, - 516, 5, 152, 416, 1442, 152, 1444, 13, 14, 1447, - 1697, 1673, 13, 14, 1452, 2886, 289, 1455, 352, 1457, - 428, 1708, 1709, 1461, 13, 14, 501, 502, 503, 514, - 505, 506, 507, 508, 509, 510, 449, 505, 506, 507, - 508, 509, 510, 13, 14, 13, 14, 460, 370, 171, - 1664, 13, 14, 13, 14, 377, 2683, 514, 1745, 13, - 14, 514, 173, 13, 14, 2567, 515, 1754, 1442, 1756, - 1444, 2962, 418, 1447, 13, 14, 514, 8, 1452, 219, - 2651, 1455, 2922, 1457, 15, 16, 299, 1461, 19, 20, - 21, 202, 2630, 13, 14, 3436, 365, 366, 420, 3440, - 422, 514, 1754, 420, 1756, 422, 13, 14, 2673, 1796, - 13, 14, 224, 1800, 514, 2794, 1803, 1804, 365, 366, - 37, 296, 126, 127, 224, 42, 448, 224, 445, 365, - 366, 448, 365, 366, 245, 514, 3190, 262, 263, 40, - 375, 376, 514, 3044, 459, 460, 3448, 3449, 3480, 3481, - 2609, 235, 5, 8, 3495, 5, 11, 1844, 1136, 1137, - 15, 16, 1840, 514, 19, 20, 21, 171, 324, 1856, - 514, 514, 514, 1547, 5, 5, 1863, 1864, 1792, 514, - 5, 514, 5, 148, 101, 1872, 514, 9, 514, 477, - 104, 1805, 1806, 301, 518, 518, 515, 40, 386, 219, - 166, 3408, 1889, 286, 284, 166, 1893, 1894, 59, 1896, - 235, 514, 428, 514, 1901, 1902, 1903, 1904, 1905, 1906, - 1907, 93, 518, 1910, 1911, 1912, 1913, 1914, 1915, 1916, - 1917, 1918, 1919, 428, 1962, 59, 428, 265, 1925, 1926, - 1968, 74, 1929, 59, 1931, 3146, 428, 80, 108, 1936, - 524, 1938, 1626, 2877, 221, 172, 428, 428, 1872, 370, - 93, 476, 2889, 2890, 1878, 152, 100, 377, 198, 274, - 381, 1958, 274, 514, 274, 1962, 40, 1964, 274, 274, - 2739, 1968, 514, 152, 117, 171, 119, 3341, 516, 1976, - 13, 208, 3157, 1980, 515, 1982, 515, 1984, 171, 1986, - 518, 515, 224, 515, 515, 416, 515, 224, 515, 514, - 314, 315, 316, 473, 224, 514, 8, 234, 281, 11, - 1694, 2008, 281, 15, 16, 1962, 147, 514, 439, 518, - 3384, 1968, 2019, 2020, 463, 516, 514, 1962, 39, 516, - 161, 514, 472, 1968, 147, 166, 1033, 514, 514, 514, - 514, 268, 2734, 9, 46, 466, 426, 426, 161, 1962, - 291, 53, 13, 166, 11, 1968, 3016, 352, 19, 513, - 2094, 524, 2059, 206, 426, 379, 518, 2064, 2065, 3433, - 31, 3272, 518, 514, 521, 279, 390, 514, 80, 428, - 180, 162, 171, 454, 45, 46, 217, 314, 515, 217, - 518, 265, 2089, 2090, 321, 518, 389, 2094, 412, 226, - 290, 518, 416, 312, 217, 3214, 237, 312, 2877, 518, - 180, 2108, 219, 2882, 2111, 515, 2113, 514, 226, 274, - 226, 333, 295, 287, 237, 466, 291, 152, 514, 3, - 514, 274, 2129, 2130, 361, 449, 279, 1134, 514, 2136, - 152, 40, 2139, 145, 1828, 152, 460, 108, 152, 476, - 1033, 152, 274, 380, 3, 286, 1840, 147, 40, 2156, - 2929, 2930, 476, 59, 295, 289, 2858, 11, 289, 40, - 515, 161, 2169, 286, 176, 171, 166, 166, 515, 515, - 180, 515, 295, 166, 3, 328, 500, 39, 514, 2186, - 2187, 193, 2139, 514, 514, 3, 198, 3408, 515, 512, - 514, 344, 428, 512, 2139, 428, 2203, 428, 2205, 2156, - 428, 513, 1209, 521, 1962, 515, 497, 2214, 515, 515, - 1968, 2156, 449, 515, 518, 117, 2139, 217, 516, 497, - 3411, 515, 515, 515, 236, 2232, 2233, 2234, 497, 171, - 428, 515, 155, 2156, 249, 8, 40, 237, 11, 3124, - 59, 514, 15, 16, 473, 503, 19, 20, 21, 514, - 501, 502, 503, 514, 505, 506, 507, 508, 509, 510, - 2232, 2233, 2234, 518, 2271, 2309, 514, 2997, 1962, 171, - 2277, 514, 290, 46, 1968, 499, 59, 290, 243, 291, - 53, 59, 451, 518, 265, 274, 286, 152, 428, 514, - 1297, 202, 445, 428, 152, 295, 152, 281, 428, 2298, - 428, 454, 428, 444, 281, 2239, 2313, 80, 40, 2298, - 515, 2318, 2298, 2298, 352, 514, 1209, 514, 287, 515, - 476, 444, 40, 518, 152, 289, 501, 502, 503, 2336, - 505, 506, 507, 508, 509, 510, 279, 515, 171, 515, - 59, 2313, 514, 2350, 185, 166, 514, 80, 515, 2356, - 512, 515, 143, 198, 3240, 3134, 3135, 2291, 515, 171, - 515, 300, 358, 515, 524, 290, 515, 3146, 514, 180, - 518, 3200, 152, 3202, 175, 2309, 515, 439, 40, 391, - 40, 2139, 515, 86, 2356, 514, 454, 2394, 515, 512, - 3212, 515, 515, 516, 514, 514, 518, 518, 2156, 514, - 2094, 303, 515, 176, 1297, 516, 515, 515, 514, 171, - 515, 514, 314, 315, 316, 515, 2350, 518, 2112, 514, - 193, 475, 515, 198, 2358, 198, 2360, 2434, 515, 3399, - 2364, 3215, 2366, 3217, 2128, 513, 513, 518, 289, 2483, - 515, 515, 515, 2450, 444, 2139, 515, 503, 59, 2394, - 515, 460, 515, 2521, 515, 515, 476, 204, 3343, 2466, - 117, 40, 2156, 236, 514, 2472, 2473, 226, 88, 3352, - 191, 2394, 2516, 279, 279, 3333, 2483, 379, 40, 516, - 516, 428, 516, 516, 516, 516, 498, 2494, 516, 516, - 2497, 516, 2499, 505, 506, 507, 508, 509, 510, 2506, - 2507, 503, 428, 2510, 2511, 3327, 513, 515, 2515, 2516, - 515, 1518, 512, 516, 416, 2522, 516, 8, 291, 516, - 11, 516, 516, 2567, 15, 16, 516, 513, 516, 516, - 2537, 516, 274, 516, 516, 514, 516, 2535, 516, 2535, - 2547, 516, 2535, 2541, 516, 2535, 516, 449, 516, 107, - 516, 514, 2535, 7, 8, 46, 2535, 2535, 460, 13, - 2567, 516, 53, 516, 516, 19, 516, 516, 476, 23, - 515, 25, 26, 40, 476, 289, 30, 31, 32, 514, - 551, 35, 9, 351, 38, 39, 514, 514, 42, 80, - 335, 45, 46, 515, 518, 59, 40, 171, 500, 2606, - 518, 515, 2609, 2610, 1611, 2612, 198, 191, 513, 459, - 91, 518, 514, 344, 515, 2309, 60, 2624, 391, 2626, - 514, 75, 76, 40, 152, 1518, 516, 515, 124, 3408, - 152, 40, 515, 40, 2606, 515, 2394, 366, 2610, 366, - 2612, 514, 514, 40, 518, 454, 100, 514, 309, 2647, - 514, 2650, 0, 107, 108, 109, 110, 111, 279, 248, - 190, 2650, 106, 107, 2650, 2650, 454, 439, 514, 292, - 74, 74, 80, 117, 9, 2609, 515, 2675, 515, 3381, - 2678, 368, 2726, 514, 59, 176, 133, 513, 515, 513, - 503, 93, 272, 289, 2701, 439, 40, 2704, 514, 292, - 514, 292, 193, 459, 204, 515, 289, 198, 2642, 386, - 122, 289, 515, 515, 2721, 2722, 515, 451, 1611, 2726, - 365, 25, 2729, 148, 36, 498, 365, 297, 501, 502, - 503, 175, 505, 506, 507, 508, 509, 510, 1745, 2593, - 314, 315, 316, 868, 1762, 236, 151, 2227, 3242, 2756, - 3384, 2606, 100, 2801, 3337, 1863, 2545, 201, 3485, 2882, - 2339, 3358, 3463, 2770, 3117, 3412, 171, 3421, 2775, 2776, - 3456, 2815, 743, 2780, 2781, 1196, 3176, 2220, 2785, 2664, - 3410, 2788, 2789, 3419, 2233, 2217, 2793, 2794, 2585, 2483, - 2797, 2612, 3407, 1321, 2801, 8, 3306, 2297, 11, 147, - 291, 2808, 15, 16, 1294, 379, 250, 2356, 2997, 2203, - 2169, 2642, 1155, 161, 1005, 1005, 260, 1178, 166, 1733, - 1177, 2415, 2516, 171, 3393, 2186, 1697, 3315, 272, 3204, - 274, 1732, 180, 46, 23, 2156, 2729, 185, 1180, 3039, - 53, 2535, 416, 1974, 2801, 2852, 800, 2541, 789, 2394, - 2393, 2442, 1745, 2860, 3138, 1989, 2801, 3319, 126, 127, - 304, 1872, 3318, 2066, 2170, 2473, 2112, 80, 2109, 217, - 2021, 2805, 2879, 2567, 1438, 449, 983, 981, 2801, 981, - 2068, 2888, 1889, 981, 981, 981, 460, 981, 859, 237, - 2808, 981, 981, 2490, 1901, 2535, 3304, 783, 1806, 1982, - 391, 1673, 476, 171, 1339, 1359, 1674, 2546, 100, 314, - 315, 316, 356, 2270, -1, 2922, 1233, -1, -1, -1, - -1, -1, -1, -1, 1931, -1, 500, -1, -1, 171, - -1, 1938, 145, -1, -1, -1, -1, 381, 286, -1, - 514, 289, -1, -1, -1, -1, -1, 295, -1, -1, - -1, -1, -1, 2647, -1, -1, 400, 2964, 402, -1, - -1, 405, 2969, 176, -1, -1, 1033, -1, -1, 1976, - -1, -1, 3016, 1980, 379, -1, -1, -1, -1, 1986, - 193, 2675, 2980, -1, 2678, 198, -1, 335, -1, -1, - 2997, -1, 2964, 3000, 3001, -1, 1889, -1, -1, -1, - -1, 2008, -1, -1, -1, -1, -1, 498, 1901, 3016, - 358, 416, -1, -1, 505, 506, 507, 508, 509, 510, - -1, -1, 8, 236, -1, 11, -1, -1, -1, 15, - 16, -1, 2726, 19, 20, 21, -1, 3044, 1931, -1, - 2974, -1, 3049, 2801, 449, 1938, 314, 315, 316, -1, - 36, -1, -1, 3060, 3061, 460, -1, 3064, -1, 3066, - -1, 303, -1, 2997, -1, -1, -1, -1, 416, -1, - 514, 476, 314, 315, 316, -1, -1, -1, 291, -1, - -1, 535, -1, 1976, 3091, -1, 540, 1980, -1, 543, - -1, -1, -1, 1986, -1, 500, 444, 551, -1, 151, - -1, -1, -1, -1, -1, -1, 454, 2801, 3115, 514, - -1, 379, -1, -1, -1, 2008, -1, -1, -1, 171, - -1, 2815, 390, -1, -1, 473, -1, 475, 476, -1, - -1, -1, -1, -1, -1, -1, -1, 379, -1, 3146, - -1, -1, 1209, 3077, 412, 988, -1, -1, 416, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3170, 512, 3163, 3164, 515, 516, 517, - -1, -1, -1, -1, 416, -1, -1, -1, 391, 3186, - -1, 449, -1, 3190, 1155, -1, -1, -1, -1, -1, - -1, -1, 460, 3200, -1, 3202, -1, 3204, 3170, -1, - -1, 3208, -1, 3210, -1, 3212, -1, 449, 476, -1, - -1, -1, 3146, -1, -1, -1, 3223, -1, 460, -1, - -1, 3228, -1, 3230, -1, -1, -1, -1, -1, -1, - 1297, 3238, 500, -1, 476, 221, -1, -1, -1, -1, - -1, 3239, -1, 3241, 3251, 3190, 514, 1033, -1, 3256, - -1, -1, -1, -1, -1, -1, -1, -1, 500, -1, - -1, -1, 314, 315, 316, -1, -1, 3190, -1, -1, - -1, -1, 514, -1, -1, -1, -1, -1, -1, 3251, - -1, -1, -1, -1, 3282, 498, 2980, 741, 742, 743, - -1, -1, 505, 506, 507, 508, 509, 510, 3305, -1, - 3298, -1, -1, -1, 3302, 291, -1, -1, 3315, -1, - -1, 2318, -1, 177, -1, -1, -1, -1, -1, -1, - 3327, -1, 3016, -1, -1, -1, -1, 379, 782, 783, - 784, -1, -1, -1, 3341, 789, -1, 791, 202, 3273, - -1, 1184, -1, -1, -1, -1, 800, -1, -1, -1, - 804, 805, 3359, -1, -1, 809, 810, -1, 1329, -1, - 1331, -1, -1, -1, 416, -1, -1, -1, -1, 823, - 824, 825, -1, -1, -1, -1, 240, 3384, -1, -1, - -1, -1, 55, 837, 838, -1, 840, -1, -1, -1, - -1, -1, 3399, -1, -1, -1, 3341, 449, -1, 853, - -1, 3408, -1, 3410, -1, 859, -1, -1, 460, -1, - -1, -1, -1, -1, -1, -1, -1, 871, 3341, -1, - -1, -1, -1, 1209, 476, 2318, 3433, 3425, -1, 102, - 294, 885, 3190, -1, -1, 40, -1, -1, 3410, 3384, - 3447, 3448, 3449, 2450, -1, -1, -1, -1, 500, -1, - 123, 1518, -1, 3451, 0, 60, -1, -1, -1, -1, - -1, 3384, 514, 917, 918, -1, -1, 3474, 141, 3163, - 3164, -1, 145, -1, 3408, 929, -1, -1, -1, 933, - 934, 935, 936, -1, -1, -1, -1, -1, 3433, -1, - -1, -1, -1, -1, 167, 949, 988, 170, -1, 2506, - -1, 106, -1, -1, -1, -1, 370, -1, 3515, -1, - 3433, 1297, -1, 186, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, 982, 983, - -1, 985, -1, -1, 988, -1, -1, -1, -1, -1, - 994, 995, -1, -1, 1611, 3239, 1000, 3241, -1, -1, - -1, -1, 1006, -1, 100, -1, 420, 2450, 422, 1013, - -1, -1, 13, -1, -1, -1, 1409, 1410, 19, 1023, - 175, -1, 1415, -1, -1, 439, 1030, -1, -1, -1, - 31, 445, -1, 3341, 448, -1, 1040, -1, 3282, -1, - -1, -1, -1, -1, 45, 46, 201, -1, -1, -1, - -1, 147, 2609, -1, 3298, -1, 279, -1, 3302, -1, - -1, -1, -1, 2506, 287, 161, -1, -1, -1, -1, - 166, -1, -1, -1, -1, 171, 3384, -1, -1, -1, - -1, -1, -1, -1, 180, 1089, 309, -1, -1, 185, - -1, -1, -1, -1, -1, 250, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 260, -1, 108, -1, -1, - -1, -1, 988, 336, -1, 8, -1, 272, 11, -1, - -1, 217, 15, 16, -1, 3433, -1, -1, 1745, -1, - -1, -1, -1, 1175, 1138, -1, 1140, -1, -1, -1, - -1, 237, 1184, -1, -1, -1, -1, 2704, -1, 304, - -1, 1155, 1156, 46, -1, -1, -1, -1, 1162, -1, - 53, -1, -1, -1, -1, -1, 2609, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1184, 3425, 1518, -1, -1, -1, -1, 80, -1, -1, - 286, 1195, 1196, 289, -1, -1, -1, -1, -1, 295, - -1, 356, -1, -1, 1208, -1, -1, 3451, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, -1, 1740, - -1, 1225, -1, -1, 2781, 1229, 381, -1, -1, 1750, - 1234, 1752, -1, -1, 1755, -1, -1, -1, -1, 335, - 1761, -1, 1763, -1, -1, 400, -1, -1, -1, -1, - -1, -1, 145, -1, -1, 1776, -1, -1, -1, 1652, - 1781, 2704, 358, -1, 1785, 1786, 1787, 1788, -1, 1790, - 1791, -1, 1889, -1, -1, 1611, -1, -1, -1, -1, - -1, -1, -1, 176, 1901, -1, 1290, -1, 1292, -1, - -1, -1, -1, -1, -1, -1, -1, 1301, -1, -1, - 193, -1, -1, -1, 1697, 198, -1, -1, 1312, -1, - 100, -1, -1, -1, 1931, -1, -1, 1321, -1, -1, - 416, 1938, 1326, -1, 1328, 1329, -1, 1331, 1332, -1, - -1, 2888, -1, -1, 42, -1, -1, -1, 2781, -1, - -1, -1, -1, 236, -1, -1, -1, -1, 444, -1, - -1, -1, -1, -1, -1, 1359, -1, 147, 454, 1976, - -1, -1, -1, 1980, -1, 2922, -1, 1409, 1410, 1986, - -1, 161, -1, 1415, -1, -1, 166, 473, -1, 475, - 476, 171, -1, -1, -1, -1, -1, -1, -1, -1, - 180, 2008, -1, -1, -1, 185, -1, -1, 291, 107, - -1, 109, -1, 111, -1, 1409, 1410, 37, -1, 1745, - -1, 1415, 42, 1417, -1, -1, 512, -1, -1, 515, - 516, 517, -1, -1, -1, -1, 1430, 217, 1432, 1433, - -1, -1, -1, -1, 1033, -1, 1440, -1, 1442, -1, - 1444, -1, -1, 1447, 3001, 2888, -1, 237, 1452, -1, - -1, 1455, -1, 1457, -1, -1, -1, 1461, -1, 1463, - -1, 1465, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 101, -1, -1, -1, -1, -1, -1, -1, 2922, - -1, -1, -1, -1, -1, -1, -1, 3044, -1, -1, - -1, -1, -1, -1, -1, -1, 286, -1, 391, 289, - -1, -1, -1, -1, -1, 295, -1, -1, -1, 1902, - 1903, 1904, 1905, 1906, 1907, -1, -1, 1910, 1911, 1912, - 1913, 1914, 1915, 1916, 1917, 1918, 1919, -1, -1, -1, - -1, -1, -1, 1409, 1410, -1, -1, -1, 1033, 1415, - -1, -1, 172, -1, -1, 335, -1, -1, -1, -1, - 551, -1, -1, 1889, -1, -1, -1, -1, 3001, -1, - -1, -1, -1, -1, -1, 1901, -1, -1, 358, 1573, - -1, -1, -1, -1, -1, -1, -1, -1, 208, -1, - 1584, -1, -1, -1, -1, 1033, -1, -1, -1, 3146, - -1, -1, -1, -1, 224, 1931, -1, -1, -1, -1, - -1, 3044, 1938, -1, 234, 498, -1, -1, -1, -1, - 1209, -1, 505, 506, 507, 508, 509, 510, -1, 1623, - -1, -1, -1, -1, -1, -1, 416, -1, -1, -1, - 2151, -1, -1, -1, -1, -1, -1, -1, 268, -1, - 1976, -1, -1, -1, 1980, -1, -1, -1, -1, -1, - 1986, -1, -1, -1, 444, 1697, -1, -1, -1, 289, - -1, -1, -1, -1, 454, -1, 1670, -1, 1672, -1, - 1674, -1, 2008, -1, -1, -1, -1, -1, -1, -1, - 1684, 1685, -1, 473, 314, 475, 476, -1, -1, -1, - -1, 321, 177, 1697, -1, -1, 2089, 2090, 1297, -1, - -1, 2318, -1, 3146, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1209, -1, -1, 202, 1722, -1, - 1724, -1, 512, -1, -1, 515, 516, 517, -1, -1, - -1, 361, -1, -1, -1, 1739, 1740, -1, -1, -1, - -1, 742, 743, -1, -1, -1, 1750, 1751, 1752, 1753, - 380, 1755, -1, -1, -1, 240, -1, 1761, -1, 1763, - -1, 1209, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1775, 1776, -1, -1, -1, 1780, 1781, -1, -1, - -1, 1785, 1786, 1787, 1788, 8, 1790, 1791, 11, -1, - -1, -1, 15, 16, -1, -1, 19, 20, 21, -1, - -1, -1, 1297, 1807, -1, -1, -1, 2328, -1, 294, - 2203, 1815, -1, 1817, 1818, 1819, 1820, 1821, -1, 449, - -1, -1, -1, -1, 454, -1, -1, 535, 313, -1, - -1, -1, 540, 2450, 1838, 543, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1851, -1, 1297, - -1, 3408, -1, -1, -1, -1, -1, -1, 859, -1, - 1902, 1903, 1904, 1905, 1906, 1907, -1, -1, 1910, 1911, - 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, -1, -1, - -1, -1, -1, -1, -1, 370, -1, -1, -1, 2506, - -1, 26, 377, -1, -1, -1, -1, 32, 1902, 1903, - 1904, 1905, 1906, 1907, -1, 40, 1910, 1911, 1912, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, -1, -1, -1, 1518, - -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 420, 1940, 422, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1952, -1, - -1, -1, -1, -1, 439, -1, -1, -1, 1962, -1, - 445, -1, -1, 448, 1968, 3408, -1, -1, -1, -1, - 1974, 106, -1, -1, -1, 1979, -1, -1, -1, -1, - -1, -1, 2318, -1, 1988, 1989, -1, -1, -1, -1, - -1, -1, 2609, -1, -1, -1, -1, -1, 221, 1000, - -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1611, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1023, 1518, -1, -1, 1902, 1903, 1904, 1905, - 1906, 1907, -1, -1, 1910, 1911, 1912, 1913, 1914, 1915, - 1916, 1917, 1918, 1919, -1, -1, -1, 2089, 2090, 2570, - 2571, -1, -1, 2057, -1, -1, -1, 2061, -1, -1, - -1, -1, 2066, -1, -1, -1, 201, -1, 291, -1, - 1518, -1, -1, -1, -1, -1, -1, 2598, -1, -1, - -1, -1, -1, 791, -1, 2089, 2090, 2704, 1089, -1, - -1, -1, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, - 2621, 2622, 2106, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2450, 250, 1611, 2510, 2511, -1, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2139, -1, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 1745, 2151, -1, -1, - -1, -1, 2156, -1, 1155, 1156, 2160, -1, 293, -1, - -1, 2203, -1, 1611, 2781, -1, -1, -1, -1, 304, - 2506, -1, -1, 8, -1, -1, 11, 885, -1, -1, - 15, 16, -1, -1, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2200, -1, -1, 2203, - -1, -1, 2206, -1, -1, -1, -1, -1, -1, 917, - -1, -1, -1, 2089, 2090, 350, -1, -1, 2222, 354, - -1, 356, -1, -1, -1, 933, 934, 935, 936, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 98, -1, -1, -1, -1, 381, -1, -1, -1, - 1745, 386, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 400, -1, -1, -1, 126, - 127, 2888, -1, 2609, -1, -1, -1, 985, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, 2293, - 1889, -1, -1, -1, -1, -1, 2300, 1745, -1, -1, - -1, -1, 1901, -1, -1, 2922, -1, 2311, 2701, -1, - 2314, 2315, 2316, 2317, 171, -1, -1, -1, -1, -1, - -1, -1, 457, -1, 2328, -1, 2330, 1328, 1329, 2333, - 1331, -1, 1931, 2726, 2338, -1, -1, -1, 2859, 1938, - 2344, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 2362, 2363, - -1, 2365, -1, 198, -1, -1, -1, -1, 2704, -1, - -1, -1, -1, -1, -1, -1, -1, 1976, -1, -1, - -1, 1980, -1, -1, 3001, -1, 221, 1986, -1, -1, - 2394, -1, -1, -1, 1889, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1901, -1, -1, 2008, - 2414, -1, -1, -1, -1, -1, -1, -1, 2422, 2423, - 2424, -1, -1, -1, -1, -1, -1, 3044, 2432, -1, - 2434, 1432, 2436, -1, -1, -1, 1931, -1, 2442, -1, - -1, 1889, -1, 1938, -1, 2781, -1, -1, -1, -1, - -1, -1, -1, 1901, -1, -1, 291, 314, 315, 316, - -1, -1, 1463, -1, 1465, -1, -1, 2860, 2510, 2511, - -1, 2475, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1976, -1, 1931, -1, 1980, -1, 1195, -1, -1, - 1938, 1986, -1, -1, -1, -1, -1, -1, -1, -1, - 1208, -1, -1, -1, -1, -1, 2510, 2511, -1, -1, - -1, -1, -1, 2008, -1, -1, -1, -1, -1, -1, - -1, 1229, 379, -1, -1, -1, -1, -1, 1976, 3146, - -1, -1, 1980, 390, -1, 2539, -1, -1, 1986, -1, - -1, 2545, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2888, -1, -1, 412, -1, 2561, -1, 416, - 2008, 2565, -1, -1, -1, 2569, 2570, 2571, -1, -1, - -1, 2575, 2576, 2577, -1, 2579, -1, -1, -1, 436, - -1, -1, -1, -1, 1292, -1, 2922, -1, -1, -1, - -1, -1, 449, 1301, 2598, -1, 2600, -1, -1, -1, - -1, -1, -1, 460, -1, 3126, -1, 3000, -1, 2613, - 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 476, - -1, -1, -1, -1, -1, -1, 3147, 3148, -1, -1, - -1, -1, -1, 8, 2510, 2511, 11, -1, -1, -1, - 15, 16, 2646, 500, 19, 20, 21, -1, 2652, -1, - -1, -1, 3173, -1, -1, -1, -1, 514, -1, 2701, - 2664, 36, -1, -1, -1, 3001, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 2680, -1, -1, -1, - -1, 835, 836, -1, 2726, -1, 2690, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2701, -1, -1, - -1, -1, -1, 2707, -1, -1, -1, -1, 3044, -1, - 2714, 2715, 2716, 2717, -1, -1, -1, -1, -1, 2318, - -1, -1, 2726, 1724, -1, 2729, -1, -1, 2770, 2733, - 2734, -1, 1440, -1, 8, -1, -1, 11, 2742, 1740, - -1, 15, 16, -1, -1, 19, 20, 21, 902, 1750, - -1, 1752, 906, 907, 1755, -1, -1, -1, -1, -1, - 1761, -1, 1763, -1, -1, 2769, -1, -1, -1, -1, - -1, -1, 46, -1, -1, 1776, -1, -1, -1, 53, - 1781, -1, -1, -1, 1785, 1786, 1787, 1788, -1, 1790, - 1791, 3408, -1, -1, -1, 2799, -1, 2801, -1, -1, - -1, -1, -1, -1, -1, 959, 80, -1, -1, -1, - 3146, 2815, -1, -1, -1, 2819, -1, 3210, 2860, -1, - -1, 2825, -1, 2318, 978, 2701, -1, -1, -1, -1, - 984, -1, -1, 987, -1, 2839, 990, 991, 992, 993, - -1, 2845, -1, -1, -1, -1, 221, -1, -1, -1, - -1, 2450, -1, -1, 2858, 2859, 2860, -1, -1, -1, - -1, -1, 2866, -1, -1, -1, -1, -1, -1, -1, - 2318, -1, -1, 8, -1, -1, 11, 1031, 1032, 2883, - 15, 16, -1, 3404, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1052, -1, - -1, -1, 176, -1, -1, -1, -1, 2506, -1, -1, - -1, -1, -1, -1, -1, -1, 291, 1071, -1, 193, - -1, -1, -1, -1, 198, -1, -1, -1, 1082, 1083, - 1084, -1, 1086, 1087, -1, -1, -1, -1, -1, 1940, - -1, -1, -1, -1, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, 2450, -1, 2961, 3000, -1, - -1, 2965, 236, -1, 1672, 1119, 1674, -1, -1, -1, - -1, -1, -1, 1974, -1, 2979, 1684, -1, 1979, -1, - -1, -1, 1136, 1137, 2860, -1, -1, -1, -1, 2993, - -1, -1, -1, -1, -1, -1, 3000, -1, -1, -1, - 274, -1, 2450, 277, -1, -1, -1, -1, -1, -1, - 2609, 2506, -1, -1, 1722, -1, 1170, 291, -1, -1, - 1174, 1175, 3026, -1, -1, -1, -1, -1, 3032, -1, - -1, 1185, 1186, -1, -1, 3039, 8, -1, -1, 11, - -1, -1, -1, 15, 16, 17, 18, 19, 20, 21, - -1, -1, -1, -1, -1, -1, 2057, -1, 2506, -1, - -1, -1, -1, 198, 36, 2066, -1, -1, -1, 3073, - -1, -1, 3408, -1, 46, -1, -1, -1, -1, -1, - -1, 53, 8, -1, -1, 11, 221, -1, 1242, 15, - 16, 3095, -1, 19, 20, 21, 3100, 1251, -1, -1, - -1, -1, -1, -1, -1, 2704, -1, -1, 80, 1817, - 1818, 1819, 1820, 1821, 2609, -1, -1, 391, -1, -1, - -1, 1275, 3126, -1, 3000, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, - -1, -1, -1, 3147, 3148, -1, -1, -1, -1, -1, - 2151, -1, -1, -1, -1, -1, 291, -1, -1, -1, - -1, 2609, 3166, 8, 3168, -1, 11, -1, 3210, 3173, - 15, 16, -1, -1, 19, 20, 21, -1, -1, -1, - -1, -1, 2781, 3187, -1, -1, 3190, -1, -1, -1, - -1, 36, -1, -1, -1, -1, -1, -1, -1, 2200, - -1, -1, -1, -1, 176, 2206, 3210, -1, 1362, 2704, - 3214, 3215, -1, 3217, -1, -1, -1, -1, -1, -1, - -1, 193, -1, -1, 498, -1, 198, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, -1, 3242, -1, - -1, -1, -1, -1, 1952, 3249, -1, -1, -1, 221, - 222, -1, -1, -1, -1, -1, 2704, -1, -1, -1, - -1, -1, -1, -1, 236, -1, -1, -1, 1422, -1, - 1424, 1425, -1, -1, -1, -1, 3280, -1, -1, -1, - -1, -1, -1, 1437, 1438, -1, 2781, -1, -1, 2888, - -1, -1, -1, -1, -1, 221, -1, -1, -1, -1, - 1454, -1, 274, -1, -1, 277, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3319, -1, -1, -1, 291, - -1, -1, 294, 2922, -1, -1, -1, 2328, -1, -1, - -1, -1, -1, 2781, -1, -1, -1, 3341, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 3368, 291, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 221, 3381, 3382, -1, - 3384, 3385, -1, -1, -1, -1, -1, -1, -1, 3393, - -1, -1, -1, 2888, -1, -1, -1, -1, -1, -1, - 3404, -1, 3001, -1, -1, 1559, -1, -1, -1, -1, - -1, -1, -1, 1567, -1, -1, -1, -1, -1, 391, - -1, -1, 3426, -1, -1, -1, -1, 2922, -1, 3433, - -1, 2432, -1, -1, -1, 2436, -1, -1, -1, -1, - 2888, 2442, -1, -1, -1, 3044, 291, -1, -1, -1, - -1, -1, 1606, -1, -1, -1, -1, -1, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 1619, 3470, -1, -1, -1, - 1624, 1625, -1, -1, 2922, 1629, -1, -1, -1, 1633, - -1, 3485, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, - 1644, -1, -1, 1647, -1, -1, -1, -1, -1, -1, - 1654, 8, 1656, -1, 11, -1, 3001, -1, 15, 16, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1675, -1, -1, -1, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, 46, - -1, -1, -1, -1, -1, -1, 53, 3146, -1, 3044, - -1, -1, 524, 3001, 1708, 1709, -1, -1, -1, -1, - -1, -1, -1, -1, 2565, -1, -1, -1, 2569, 2570, - 2571, -1, -1, 80, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, - -1, -1, 2300, -1, -1, -1, 3044, 2598, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2315, 2316, 2317, - -1, -1, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, - 2621, 2622, 2330, -1, -1, 2333, -1, -1, -1, -1, - 2338, -1, -1, -1, -1, -1, -1, -1, 145, -1, - -1, -1, 1796, -1, -1, -1, 1800, -1, -1, 1803, - 1804, 3146, -1, -1, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, -1, 176, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, - 1844, 198, -1, -1, -1, -1, -1, -1, 3146, -1, - -1, -1, -1, -1, -1, -1, 2707, -1, -1, 1863, - 1864, -1, -1, -1, 2422, 2423, 2424, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, - -1, -1, 2733, -1, -1, -1, -1, -1, -1, 1893, - 1894, -1, 1896, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 8, -1, -1, 11, -1, 0, -1, 15, 16, -1, - -1, 1925, 1926, -1, -1, 1929, -1, -1, -1, -1, - -1, -1, -1, -1, 291, -1, -1, 22, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 32, 46, 34, - 35, -1, -1, -1, 1958, 53, -1, -1, -1, 3408, - 1964, -1, 47, -1, -1, -1, -1, 52, -1, -1, - -1, -1, -1, -1, -1, -1, 61, -1, 1982, -1, - 1984, -1, 80, -1, -1, -1, -1, -1, -1, -1, - 75, -1, -1, -1, -1, -1, -1, -1, -1, 84, - -1, 86, -1, 2561, -1, -1, -1, -1, 2859, -1, - -1, -1, -1, 98, -1, 100, 2020, -1, -1, -1, - -1, -1, 26, -1, -1, -1, 111, -1, 32, -1, - -1, -1, -1, -1, 391, 37, 40, -1, -1, -1, - 42, 126, 127, 128, -1, -1, -1, 145, -1, -1, - -1, -1, 137, -1, -1, 2059, 60, -1, 143, -1, - 2064, 2065, -1, 3408, -1, -1, 151, -1, 153, 154, - -1, -1, -1, -1, -1, -1, -1, -1, 176, -1, - -1, -1, 167, -1, -1, -1, 171, -1, -1, -1, - -1, -1, -1, -1, 2652, 193, -1, -1, -1, 101, - 198, -1, 106, -1, 2108, -1, -1, 2111, -1, 2113, - 3408, -1, 197, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2129, -1, -1, 213, -1, - -1, -1, -1, 137, -1, -1, -1, -1, 236, -1, - -1, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, 508, 509, 510, 239, -1, 2714, 2715, 2716, 2717, - -1, -1, -1, -1, -1, 2169, -1, -1, -1, -1, - 172, -1, -1, -1, -1, -1, -1, -1, 180, -1, - -1, 3032, 2186, 2187, -1, -1, -1, -1, 3039, -1, - -1, -1, -1, 291, -1, -1, -1, 201, -1, -1, - -1, 2205, -1, -1, -1, 8, 208, -1, 11, -1, - 2214, -1, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, 224, -1, -1, -1, -1, -1, -1, 314, - 315, 316, 234, 36, -1, -1, -1, 322, 988, -1, - 325, -1, -1, 46, 3095, -1, 250, -1, -1, 3100, - 53, -1, -1, -1, -1, -1, 260, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 268, 2271, 272, 354, - -1, -1, -1, 2277, -1, 3126, -1, 80, 363, -1, - -1, -1, -1, -1, -1, -1, -1, 289, -1, 293, - -1, -1, -1, 391, 379, -1, 3147, 3148, -1, -1, - 304, 386, -1, -1, -1, 390, -1, -1, 2866, -1, - -1, -1, 314, -1, -1, 400, -1, -1, -1, 321, - -1, -1, 3173, 37, -1, -1, -1, 412, 42, -1, - -1, 416, 2336, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 350, -1, -1, -1, - 354, 436, 356, -1, -1, -1, -1, 1107, -1, 361, - -1, -1, -1, 3214, 449, -1, -1, 452, -1, -1, - 455, -1, -1, 176, -1, 460, -1, 381, 380, -1, - -1, -1, 386, -1, -1, -1, -1, 101, -1, -1, - 193, 476, -1, -1, -1, 198, 400, -1, -1, -1, - 498, 1151, -1, -1, -1, -1, -1, 505, 506, 507, - 508, 509, 510, -1, -1, 500, -1, -1, 221, 222, - -1, -1, -1, 3, -1, -1, -1, -1, 8, 514, - -1, 11, 517, 236, 1184, 15, 16, 17, 18, 19, - 20, 21, -1, -1, -1, -1, -1, 449, -1, -1, - -1, -1, 454, 457, -1, -1, 36, -1, 172, -1, - 40, -1, 2466, -1, -1, -1, 46, -1, 2472, 2473, - -1, 274, -1, 53, 277, -1, -1, -1, -1, 2483, - -1, -1, -1, -1, -1, -1, 1236, -1, 291, -1, - 2494, 294, -1, 2497, 208, 2499, -1, -1, -1, -1, - 80, -1, -1, 2507, -1, -1, -1, -1, -1, -1, - 224, 2515, 2516, -1, -1, -1, -1, -1, 2522, -1, - 234, -1, -1, -1, -1, -1, -1, -1, 1278, -1, - -1, -1, -1, 2537, -1, 1285, -1, -1, -1, -1, - -1, -1, -1, 2547, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3404, 268, -1, -1, -1, -1, -1, - -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 289, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1335, -1, -1, 391, -1, - -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, - 314, -1, -1, -1, -1, -1, -1, 321, 3166, -1, - 1360, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 2624, -1, 2626, -1, -1, -1, -1, -1, -1, 3187, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, 361, -1, -1, - -1, -1, -1, -1, -1, 1405, 236, 1407, -1, 1409, - 1410, -1, 1412, -1, -1, 1415, 380, -1, 1418, -1, - -1, 1421, -1, -1, -1, -1, 1426, -1, -1, 1429, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3249, -1, -1, 274, 498, -1, 277, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - -1, 291, -1, -1, 294, 518, -1, 2721, 2722, -1, - -1, 1471, 3280, -1, -1, -1, -1, -1, -1, 24, - -1, -1, -1, -1, -1, 449, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2756, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2770, -1, -1, -1, - -1, 2775, 2776, -1, -1, -1, 2780, -1, -1, -1, - -1, 2785, -1, -1, 2788, 2789, 81, -1, -1, 2793, - 2794, -1, -1, 2797, -1, -1, -1, -1, -1, -1, - -1, -1, 97, -1, 2808, 1555, -1, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1571, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1581, 1582, 1583, -1, -1, -1, 1587, -1, -1, - -1, 1591, -1, -1, -1, 3, -1, 5, 2852, -1, - -1, 146, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 156, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 168, -1, 2879, -1, -1, 173, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1653, -1, -1, -1, 202, -1, -1, - 68, 69, -1, -1, -1, -1, -1, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1691, -1, -1, -1, -1, -1, -1, -1, -1, - 245, 109, 110, -1, 249, 113, 114, 1707, -1, -1, - -1, 8, 1712, -1, 11, 2969, -1, -1, 15, 16, - 17, 18, 19, 20, 21, -1, -1, -1, -1, 1729, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, -1, -1, 46, - -1, -1, -1, -1, -1, -1, 53, -1, 8, -1, - -1, 11, 3016, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, -1, 319, -1, -1, -1, -1, -1, - 188, 189, -1, 80, -1, -1, 36, -1, -1, 334, - -1, -1, -1, -1, -1, 3049, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, 3060, 3061, -1, -1, - 3064, -1, 3066, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 367, -1, -1, 370, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, 381, 3091, -1, 384, - -1, -1, -1, -1, 252, 253, 254, 255, 256, 257, - 258, 259, -1, -1, 262, 263, -1, 402, -1, -1, - -1, 3115, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 416, -1, -1, -1, -1, -1, -1, 423, 176, - -1, -1, -1, -1, -1, -1, -1, -1, 433, -1, - -1, 1891, -1, -1, 439, -1, 193, -1, -1, 1899, - 1900, 198, 1902, 1903, 1904, 1905, 1906, 1907, -1, -1, - 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, - 1920, 466, -1, -1, 221, 222, 176, -1, -1, -1, - -1, -1, 3186, -1, -1, -1, -1, -1, -1, 236, - -1, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 3204, -1, -1, -1, 3208, -1, -1, -1, 3212, -1, - -1, -1, -1, -1, -1, -1, -1, 375, 376, 3223, - -1, 221, 222, -1, 3228, -1, 3230, 274, -1, -1, - 277, -1, -1, -1, 3238, -1, 236, -1, -1, -1, - -1, -1, -1, -1, 291, -1, -1, 294, -1, -1, - -1, -1, 3256, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2023, 274, -1, 2026, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, - -1, 3305, -1, -1, -1, -1, -1, 8, -1, -1, - 11, 3315, 470, 471, 15, 16, 17, 18, 19, 20, - 21, -1, 2072, 3327, -1, -1, 2076, 2077, 2078, 2079, - 2080, 2081, 2082, 2083, -1, 36, 494, 495, -1, 2089, - 2090, -1, 2092, 2093, 391, 46, -1, -1, -1, -1, - -1, -1, 53, -1, 2104, 3359, -1, 2107, -1, -1, - -1, -1, -1, -1, -1, 2115, 2116, 2117, 2118, 2119, - 2120, 2121, 2122, 2123, 2124, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 391, -1, -1, 8, -1, -1, 11, -1, -1, - 2150, 15, 16, 17, 18, 19, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 46, -1, -1, -1, -1, -1, -1, 53, - -1, -1, -1, 3447, 3448, 3449, -1, -1, -1, -1, - -1, 498, -1, 2203, 501, 502, 503, -1, 505, 506, - 507, 508, 509, 510, -1, -1, 80, -1, 515, -1, - 3474, -1, -1, -1, -1, 176, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, 3515, -1, -1, -1, 515, -1, -1, -1, -1, - 221, 222, 2272, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2282, 2283, -1, 236, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 274, -1, -1, 277, -1, -1, 193, - -1, -1, -1, -1, 198, -1, -1, -1, -1, -1, - 291, -1, -1, 294, -1, -1, -1, 2347, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 2369, - 2370, 2371, 236, -1, 2374, 2375, 2376, 2377, 2378, 2379, - -1, -1, -1, 2383, 2384, 2385, 2386, 2387, 2388, 2389, - 2390, 2391, 2392, -1, -1, -1, -1, 2397, 2398, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 274, -1, -1, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2425, -1, 291, -1, -1, - 294, 2431, -1, -1, 8, -1, -1, 11, -1, -1, - 391, 15, 16, 17, 18, 19, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, 2465, -1, -1, -1, -1, - -1, -1, 46, -1, -1, -1, -1, -1, -1, 53, - -1, -1, -1, -1, 2484, -1, -1, 2487, 2488, -1, - -1, -1, -1, -1, -1, 2495, 2496, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 80, -1, -1, 2509, - 2510, 2511, 2512, -1, 2514, -1, -1, -1, 2518, -1, - -1, -1, -1, -1, -1, -1, -1, 391, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, -1, -1, 515, -1, -1, -1, -1, -1, - -1, -1, 2572, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, -1, -1, -1, -1, -1, 193, - 46, -1, -1, -1, 198, -1, -1, 53, -1, -1, - -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, 221, 222, -1, - -1, 515, -1, -1, 80, -1, -1, 8, -1, -1, - 11, -1, 236, -1, 15, 16, 17, 18, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, 2679, - -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, - 274, 2701, 53, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, - 294, -1, -1, -1, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 8, -1, -1, 11, -1, -1, -1, 15, 16, -1, - 176, 19, 20, 21, -1, -1, -1, 2757, -1, 2759, - -1, -1, -1, -1, -1, 2765, -1, 193, 36, -1, - -1, -1, 198, -1, 2774, -1, -1, 2777, 46, 2779, - -1, -1, -1, 2783, -1, 53, 2786, 2787, -1, -1, - 2790, 2791, -1, -1, -1, 221, 222, -1, 2798, -1, - -1, -1, -1, -1, -1, -1, -1, 2807, -1, -1, - 236, -1, 80, -1, -1, -1, -1, 391, -1, -1, - -1, -1, 2822, -1, -1, 176, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, 274, -1, - -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, - 2860, -1, -1, -1, -1, 291, -1, -1, 294, -1, - 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 176, -1, - 68, 69, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 274, 498, 193, 277, 501, 502, 503, - 198, 505, 506, 507, 508, 509, 510, -1, -1, -1, - 291, 515, -1, 294, -1, -1, -1, -1, 68, 69, - -1, 109, 110, 221, 222, 113, 114, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, -1, 236, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 109, - 110, -1, -1, 113, 114, -1, -1, -1, -1, 2999, - 3000, -1, -1, -1, -1, -1, 274, -1, -1, 277, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 291, 3024, 3025, 294, -1, -1, -1, - 188, 189, -1, -1, -1, -1, -1, -1, -1, -1, - 391, -1, -1, -1, -1, -1, -1, -1, 3048, -1, - -1, -1, 3052, -1, 3054, 3055, 3056, -1, -1, 3059, - -1, -1, 3062, 3063, -1, -1, -1, -1, 188, 189, - -1, 3071, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, 515, - -1, -1, -1, -1, 252, 253, 254, 255, 256, 257, - 258, 259, -1, -1, 262, 263, -1, -1, -1, -1, - -1, -1, 3112, -1, -1, -1, -1, -1, 3118, -1, - -1, -1, -1, 391, -1, -1, -1, -1, -1, -1, - -1, 3131, 252, 253, 254, 255, 256, 257, 258, 259, - -1, -1, 262, 263, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, -1, -1, 515, 3165, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3192, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 375, 376, -1, - -1, -1, -1, -1, -1, 3225, 3226, 3227, -1, -1, - 498, -1, -1, 501, 502, 503, -1, 505, 506, 507, - 508, 509, 510, -1, -1, 3245, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 375, 376, 3257, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3303, -1, -1, -1, -1, -1, -1, - -1, -1, 470, 471, -1, -1, -1, -1, -1, -1, - 3320, -1, -1, -1, -1, -1, -1, -1, -1, 3329, - -1, -1, -1, -1, -1, -1, 494, 495, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 470, 471, -1, -1, 3354, -1, 514, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 494, 495, -1, -1, -1, -1, - 3380, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3423, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 3477, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, - -1, -1, 519, 520, -1, 522, 523, 524, 3, 4, - 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, - 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, - 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, - 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, - -1, -1, -1, -1, 519, 520, -1, 522, 523, 524, - 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, 171, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 938, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, 449, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, -1, 500, -1, -1, - -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, - -1, 514, 515, -1, -1, -1, 519, 520, -1, 522, - 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, 171, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 1943, 0, 0, 0, 0, 1944, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 1951, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 1952, 294, 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 1953, 448, 0, + 450, 1954, 452, 1955, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 1956, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, -1, 500, -1, - -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, - 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, - 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 815, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 822, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 823, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 824, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 825, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 826, 457, 0, 0, 827, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 859, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 891, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 894, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 898, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 926, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 954, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 957, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 1000, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 1023, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 822, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 826, 457, 0, 0, 827, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1303, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1305, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1308, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1310, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 2229, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 1476, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 1477, 0, 0, -788, 0, 1478, 129, + 130, 0, 131, 132, 133, 1479, 135, 136, 137, 0, + 1480, 1481, 1482, 1483, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 1484, 1485, 155, + 0, 156, 157, 158, 159, 0, 0, 1486, 0, 1487, + 163, 164, 165, 166, 167, 1488, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 1489, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 1490, 190, + 191, 1491, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 0, 221, + 222, 223, 224, 225, 0, 0, 227, 0, 228, 229, + 1492, 231, 0, 232, 0, 233, 1493, 0, 1494, 236, + 237, -788, 1495, 240, 0, 241, 0, 0, 0, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 1496, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 1497, 0, 268, 269, 270, 271, + 272, 1498, 1499, 0, 1500, 0, 276, 1501, 1502, 279, + 1503, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 1504, 289, 1505, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 1506, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 1507, 1508, 1509, 323, 324, 325, 0, + 0, 327, 328, 1510, 330, 0, 0, 332, 1511, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 0, 1512, 346, 1513, 0, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 0, 1514, 364, 365, + 0, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 1515, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 1516, 400, 401, + 402, 1517, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 1518, 417, 418, 419, + 420, 421, 422, 1519, 424, 425, 0, 1520, 427, 428, + 1521, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 1522, 444, 0, 0, 0, + 446, 447, 0, 448, 1523, 450, 451, 452, 453, 454, + 0, 455, 1524, 1525, 0, 0, 458, 459, 0, 461, + 0, 0, 463, 464, 1526, 466, 467, 468, 469, 470, + 1527, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 0, 1528, 0, 485, + 1529, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 512, 513, 514, 515, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 2974, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 837, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 838, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 839, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 840, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 841, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 950, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 839, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 841, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1299, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1320, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 1671, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 0, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1847, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 2216, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 2231, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 1476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 1477, 0, + 0, 0, 0, 1478, 129, 130, 0, 131, 132, 133, + 1479, 135, 136, 137, 0, 1480, 1481, 1482, 1483, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 1484, 1485, 155, 0, 156, 157, 158, 159, + 0, 0, 1486, 0, 1487, 163, 164, 165, 166, 167, + 1488, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 1489, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1490, 190, 191, 1491, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 0, 221, 222, 223, 224, 225, 0, + 0, 227, 0, 228, 229, 1492, 231, 0, 232, 0, + 233, 1493, 0, 1494, 236, 237, 0, 1495, 240, 0, + 241, 0, 0, 0, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 1496, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 1497, + 0, 268, 269, 270, 271, 272, 1498, 1499, 0, 1500, + 0, 276, 1501, 1502, 279, 1503, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 1504, 289, 1505, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 1506, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 1507, 1508, + 1509, 323, 324, 325, 0, 0, 327, 328, 1510, 330, + 0, 0, 332, 1511, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 0, + 1512, 346, 1513, 0, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 0, 1514, 364, 365, 0, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 1515, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 1516, 400, 401, 402, 1517, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 1518, 417, 418, 419, 420, 421, 422, 1519, 424, + 425, 0, 1520, 427, 428, 1521, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 1522, 444, 0, 0, 0, 446, 447, 0, 448, 1523, + 450, 451, 452, 453, 454, 0, 455, 1524, 1525, 0, + 0, 458, 459, 0, 461, 0, 0, 463, 464, 1526, + 466, 467, 468, 469, 470, 1527, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 0, 1528, 0, 485, 1529, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 1476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 512, 513, 514, 515, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 1477, 0, + 0, 0, 0, 1478, 129, 130, 0, 131, 132, 133, + 1479, 135, 136, 137, 0, 1480, 1481, 1482, 1483, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 1484, 1485, 155, 0, 156, 157, 158, 159, + 0, 0, 1486, 0, 1487, 163, 164, 165, 166, 167, + 1488, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 1489, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1490, 190, 191, 1491, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 0, 210, 211, 212, 0, 1829, 214, 215, 0, 216, + 217, 218, 219, 0, 221, 222, 223, 224, 225, 0, + 0, 227, 0, 228, 229, 1492, 231, 0, 232, 0, + 233, 1493, 0, 1494, 236, 237, 0, 1495, 240, 0, + 241, 0, 0, 0, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 1496, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 1497, + 0, 268, 269, 270, 271, 272, 1498, 1499, 0, 1500, + 0, 276, 1501, 1502, 279, 1503, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 1504, 289, 1505, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 1506, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 1507, 1508, + 1509, 323, 324, 325, 0, 0, 327, 328, 1510, 330, + 0, 0, 332, 1511, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 0, + 1512, 346, 1513, 0, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 0, 1514, 364, 365, 0, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 1515, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 1516, 400, 401, 402, 1517, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 1518, 417, 418, 419, 420, 421, 422, 1519, 424, + 425, 0, 1520, 427, 428, 1521, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 1522, 444, 0, 0, 0, 446, 447, 0, 448, 1523, + 450, 451, 452, 453, 454, 0, 455, 1524, 1525, 0, + 0, 458, 459, 0, 461, 0, 0, 463, 464, 1526, + 466, 467, 468, 469, 470, 1527, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 0, 1528, 0, 485, 1529, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 3144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 512, 513, 514, 515, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 2896, 0, + 0, 0, 0, 2897, 129, 130, 0, 131, 132, 133, + 2898, 135, 136, 137, 0, 1480, 2899, 1482, 1483, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 1484, 1485, 155, 0, 156, 157, 158, 159, + 0, 0, 2900, 0, 2901, 163, 164, 165, 166, 167, + 2902, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 2903, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1490, 190, 191, 1491, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 0, 221, 222, 223, 224, 225, 0, + 0, 227, 0, 228, 229, 1492, 231, 0, 232, 0, + 233, 2904, 0, 2905, 236, 237, 2906, 2907, 240, 0, + 241, 0, 0, 0, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 2908, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 2909, + 0, 268, 269, 270, 271, 272, 1498, 1499, 0, 1500, + 0, 276, 2910, 2911, 279, 2912, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 2913, 289, 2914, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 3145, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 1507, 2916, + 1509, 323, 324, 325, 0, 0, 327, 328, 2918, 330, + 0, 0, 332, 1511, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 0, + 2920, 346, 2921, 0, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 0, 2922, 364, 365, 0, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 1515, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 2923, 400, 401, 402, 0, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 2924, 417, 418, 419, 420, 421, 422, 0, 424, + 425, 0, 2926, 427, 428, 1521, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 3146, 444, 0, 0, 0, 446, 447, 0, 448, 2928, + 450, 451, 452, 453, 454, 0, 455, 1524, 1525, 0, + 0, 458, 459, 0, 461, 0, 0, 463, 464, 2929, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 0, 1528, 0, 485, 2931, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 512, 513, 514, 515, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 0, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 0, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 0, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 0, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 1766, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 1477, 0, 0, 0, 0, 1478, 129, + 130, 0, 131, 132, 133, 1479, 135, 136, 137, 0, + 1480, 1481, 1482, 1483, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 1484, 1485, 155, + 0, 156, 157, 158, 159, 0, 0, 1486, 0, 1487, + 163, 164, 165, 166, 167, 1488, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 1489, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 1490, 190, + 191, 1491, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 0, 221, + 222, 223, 224, 225, 0, 0, 227, 0, 228, 229, + 1492, 231, 0, 232, 0, 233, 1493, 0, 1494, 236, + 237, 0, 1495, 240, 0, 241, 0, 0, 0, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 1496, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 1497, 0, 268, 269, 270, 271, + 272, 1498, 1499, 0, 1500, 0, 276, 1501, 1502, 279, + 1503, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 1504, 289, 1505, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 0, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 1507, 1508, 1509, 323, 324, 325, 0, + 0, 327, 328, 1510, 330, 0, 0, 332, 1511, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 0, 1512, 346, 1513, 0, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 0, 1514, 364, 365, + 0, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 1515, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 1516, 400, 401, + 402, 0, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 1518, 417, 418, 419, + 420, 421, 422, 0, 424, 425, 0, 1520, 427, 428, + 1521, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 0, 444, 0, 0, 0, + 446, 447, 0, 448, 1523, 450, 451, 452, 453, 454, + 0, 455, 1524, 1525, 0, 0, 458, 459, 0, 461, + 0, 0, 463, 464, 1526, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 0, 1528, 0, 485, + 1529, 487, 488, 489, 490, 491, 492, 493, 0, 1, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 2, + 0, 3, 4, 0, 0, 0, 0, 1, 0, 0, + 512, 513, 514, 515, 0, 0, 0, 2, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 11, 0, 746, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 11, 0, 746, 0, 0, 0, 0, + 0, 0, 0, 14, 15, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 747, 0, 0, 0, 0, 0, + 18, 14, 15, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 747, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 22, 0, 19, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 28, 29, 0, 0, 0, 0, 0, 30, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 27, + 28, 29, 0, 0, 0, 0, 0, 30, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, 34, 0, 33, 0, + 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 37, 0, 0, + 0, 35, 0, 0, 0, 36, 0, 0, 0, 38, + 0, 0, 0, 39, 0, 37, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, + 0, 39, 0, 40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, + 0, 40, 43, 0, 0, 0, 0, 44, 0, 0, + 0, 748, 0, 0, 41, 0, 0, 0, 0, 0, + 43, 0, 0, 45, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 749, 0, 0, 0, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47 +}; + +static const yytype_int16 yycheck[] = +{ + 7, 516, 0, 0, 47, 835, 895, 73, 920, 16, + 0, 0, 0, 809, 0, 0, 23, 16, 881, 1157, + 741, 0, 0, 7, 1224, 990, 0, 858, 904, 1222, + 1236, 1418, 925, 1692, 1655, 981, 749, 970, 1210, 23, + 38, 20, 2172, 1197, 981, 970, 955, 0, 1079, 1032, + 20, 981, 1298, 17, 2141, 77, 2143, 981, 1466, 1199, + 1191, 77, 2227, 1202, 2162, 1574, 1987, 20, 75, 76, + 39, 959, 970, 0, 1608, 1609, 2612, 0, 46, 1276, + 2314, 0, 2612, 2107, 23, 2651, 0, 1227, 0, 0, + 0, 75, 76, 2161, 1797, 26, 0, 1323, 0, 0, + 0, 2223, 100, 2673, 1124, 0, 0, 35, 895, 1129, + 897, 7, 899, 748, 0, 742, 75, 76, 2649, 0, + 0, 0, 1087, 999, 0, 0, 2666, 23, 749, 0, + 805, 2275, 2276, 2277, 2486, 810, 75, 76, 2294, 5, + 2568, 110, 0, 5, 2572, 9, 9, 1819, 979, 5, + 0, 23, 5, 1712, 0, 1988, 1928, 13, 14, 80, + 13, 14, 1659, 5, 11, 1815, 1710, 2985, 5, 16, + 5, 5, 45, 63, 5, 5, 13, 14, 5, 75, + 76, 1106, 13, 14, 772, 5, 982, 5, 5, 9, + 5, 1053, 1054, 2315, 9, 13, 14, 13, 14, 46, + 5, 5, 1135, 75, 76, 5, 5, 5, 1070, 5, + 1135, 2970, 13, 14, 40, 1816, 1961, 1962, 2302, 139, + 3, 4, 5, 2306, 45, 11, 9, 1972, 2300, 2988, + 16, 1976, 119, 80, 60, 63, 55, 172, 82, 3, + 3, 5, 190, 2365, 2366, 871, 2368, 876, 4, 93, + 100, 1057, 1033, 9, 100, 1086, 876, 970, 2437, 2437, + 1243, 74, 171, 2824, 1140, 4, 90, 1073, 63, 1252, + 9, 34, 35, 244, 171, 124, 287, 3149, 1211, 11, + 106, 1214, 1215, 15, 16, 290, 1211, 802, 2870, 1214, + 1215, 180, 2940, 11, 172, 1433, 226, 15, 16, 5, + 122, 107, 11, 295, 82, 129, 15, 16, 983, 289, + 312, 5, 11, 107, 46, 93, 15, 16, 183, 295, + 995, 312, 2805, 0, 2807, 30, 275, 2530, 1466, 2532, + 122, 122, 2419, 38, 117, 850, 147, 46, 973, 107, + 64, 106, 272, 20, 117, 137, 23, 1519, 80, 75, + 74, 192, 171, 379, 1135, 168, 1186, 1187, 40, 1190, + 278, 38, 119, 388, 366, 53, 1612, 1954, 1955, 1956, + 47, 80, 132, 161, 30, 201, 3280, 30, 166, 3344, + 13, 14, 38, 163, 3388, 38, 161, 2531, 30, 2925, + 212, 41, 120, 40, 30, 192, 2582, 1309, 75, 76, + 77, 148, 3238, 165, 3240, 11, 217, 170, 338, 172, + 1898, 365, 37, 117, 2980, 163, 2581, 1280, 3177, 3477, + 1345, 1346, 33, 100, 250, 2991, 2556, 2130, 478, 1210, + 308, 3312, 4, 478, 260, 218, 108, 9, 132, 289, + 46, 1929, 503, 289, 476, 1338, 272, 104, 59, 237, + 500, 2982, 199, 514, 2478, 500, 2578, 240, 2580, 389, + 3518, 3279, 237, 108, 514, 159, 194, 357, 500, 3473, + 3374, 3436, 337, 3377, 80, 393, 126, 448, 304, 3079, + 3316, 3081, 230, 307, 295, 250, 190, 213, 176, 514, + 132, 271, 518, 175, 1525, 260, 132, 2683, 286, 3147, + 1746, 366, 451, 514, 272, 193, 279, 509, 358, 514, + 198, 352, 358, 2716, 392, 328, 240, 1298, 509, 428, + 63, 451, 279, 180, 284, 3107, 518, 3010, 175, 357, + 356, 428, 3093, 166, 514, 327, 534, 1163, 8, 3411, + 413, 11, 518, 514, 3126, 15, 16, 172, 236, 19, + 20, 21, 472, 2732, 2732, 381, 3437, 3375, 355, 1188, + 514, 323, 357, 1151, 82, 454, 514, 3471, 1188, 456, + 274, 2693, 1980, 279, 400, 93, 370, 1092, 2662, 514, + 274, 588, 289, 208, 428, 279, 1740, 2659, 2509, 588, + 284, 512, 413, 1424, 503, 516, 2679, 421, 2107, 224, + 0, 1322, 3202, 2375, 1801, 454, 1327, 516, 1438, 234, + 416, 2145, 1333, 3149, 416, 272, 478, 3376, 132, 3149, + 2179, 463, 1484, 1485, 3164, 1455, 476, 1340, 518, 451, + 476, 1857, 445, 444, 2178, 82, 518, 1837, 500, 403, + 404, 1566, 505, 506, 1890, 2317, 93, 1509, 514, 513, + 428, 478, 514, 1578, 520, 1580, 1902, 2307, 514, 517, + 451, 514, 2171, 510, 520, 515, 1872, 517, 2165, 515, + 3098, 517, 514, 500, 1657, 3103, 2841, 514, 512, 514, + 514, 1606, 516, 514, 514, 1491, 1932, 514, 2433, 515, + 518, 396, 2848, 1939, 514, 514, 514, 514, 514, 514, + 3052, 464, 1329, 391, 1339, 1511, 749, 1569, 1570, 514, + 514, 2312, 3278, 514, 514, 514, 514, 3287, 514, 1340, + 1551, 1552, 505, 506, 510, 1601, 1602, 1603, 198, 272, + 1561, 1977, 406, 2967, 249, 1981, 361, 476, 1519, 1545, + 396, 435, 749, 396, 1575, 120, 3286, 161, 161, 505, + 506, 221, 446, 166, 2822, 380, 1431, 800, 11, 274, + 274, 500, 454, 2009, 415, 108, 505, 506, 425, 748, + 284, 514, 119, 1604, 503, 507, 508, 509, 510, 749, + 517, 430, 789, 265, 1709, 1710, 2707, 516, 1985, 507, + 508, 509, 510, 800, 468, 748, 505, 506, 507, 508, + 509, 510, 453, 1941, 2828, 789, 505, 506, 507, 508, + 509, 510, 3337, 3338, 357, 881, 800, 2961, 149, 194, + 3386, 291, 514, 237, 237, 454, 848, 80, 835, 836, + 479, 1612, 848, 2420, 2421, 2422, 2423, 1770, 320, 274, + 3371, 800, 1980, 386, 279, 1770, 2968, 1780, 191, 513, + 1783, 858, 420, 784, 422, 1780, 2875, 534, 1783, 206, + 524, 800, 1845, 2784, 2883, 3390, 823, 824, 825, 200, + 868, 868, 286, 286, 244, 3411, 1765, 356, 868, 868, + 868, 3411, 868, 868, 853, 514, 856, 244, 512, 868, + 868, 859, 516, 789, 868, 902, 903, 1412, 3429, 906, + 907, 336, 871, 1624, 800, 2131, 464, 386, 2741, 837, + 838, 2744, 840, 2746, 1552, 868, 1004, 789, 515, 274, + 2058, 518, 513, 1561, 2627, 272, 2629, 274, 800, 1949, + 1823, 3497, 244, 524, 1022, 1798, 1799, 1800, 1026, 3173, + 1873, 868, 71, 72, 3109, 868, 1855, 173, 1873, 868, + 1859, 1738, 959, 1862, 868, 4, 868, 868, 868, 226, + 9, 925, 2496, 970, 868, 1746, 868, 868, 868, 2478, + 5, 978, 979, 868, 868, 1873, 1864, 984, 1765, 478, + 987, 988, 868, 990, 991, 992, 993, 868, 868, 868, + 132, 3089, 868, 868, 973, 514, 173, 868, 1785, 1006, + 370, 500, 4, 1790, 26, 272, 1013, 9, 258, 259, + 2397, 365, 366, 370, 37, 514, 2147, 159, 2149, 245, + 973, 509, 1006, 132, 1031, 1032, 1033, 177, 516, 1013, + 514, 501, 502, 503, 147, 505, 506, 507, 508, 509, + 510, 4, 177, 1009, 1087, 1052, 9, 1006, 161, 1015, + 159, 2251, 1880, 166, 1013, 1776, 1884, 512, 370, 1887, + 1781, 516, 512, 2201, 1071, 108, 516, 1006, 245, 1994, + 352, 748, 749, 2319, 1013, 1082, 1083, 1084, 448, 1086, + 1087, 2278, 509, 3004, 1091, 420, 59, 422, 3253, 516, + 240, 448, 1091, 2796, 512, 74, 514, 1423, 516, 1425, + 1426, 80, 377, 2612, 217, 240, 1937, 1014, 377, 1890, + 1006, 1018, 789, 1120, 93, 137, 342, 1013, 202, 2259, + 74, 1902, 389, 800, 237, 375, 376, 512, 251, 514, + 1137, 1138, 274, 420, 1006, 422, 448, 279, 117, 433, + 119, 1013, 284, 515, 514, 416, 518, 1169, 1170, 172, + 1172, 1932, 466, 1169, 1170, 381, 1172, 514, 1939, 515, + 1873, 374, 518, 117, 1171, 342, 377, 30, 1175, 1176, + 279, 848, 2137, 286, 476, 284, 478, 244, 1185, 1186, + 1187, 514, 295, 1190, 451, 208, 2233, 2326, 2235, 2020, + 416, 868, 244, 2332, 1163, 420, 1977, 422, 171, 177, + 1981, 224, 514, 1210, 381, 515, 1987, 2453, 518, 837, + 838, 234, 840, 8, 515, 515, 11, 518, 518, 2144, + 15, 16, 85, 514, 19, 20, 21, 206, 2009, 515, + 515, 94, 518, 518, 6, 370, 1243, 514, 10, 416, + 466, 36, 166, 342, 26, 1252, 18, 2578, 514, 2580, + 32, 514, 2177, 2178, 202, 118, 873, 1226, 875, 244, + 82, 33, 240, 515, 2095, 37, 518, 514, 26, 1276, + 420, 293, 422, 515, 32, 515, 518, 515, 518, 2142, + 518, 515, 381, 514, 518, 420, 108, 422, 171, 466, + 514, 1298, 514, 435, 42, 274, 973, 2435, 448, 514, + 279, 2439, 2710, 370, 446, 13, 14, 1314, 1297, 1297, + 514, 1297, 1297, 448, 507, 1314, 1323, 416, 370, 2828, + 274, 2230, 500, 2232, 3489, 279, 435, 190, 171, 1006, + 514, 444, 354, 1340, 356, 313, 1013, 446, 361, 497, + 203, 314, 315, 316, 3474, 515, 3476, 223, 518, 328, + 1357, 173, 13, 14, 3441, 137, 1363, 380, 1357, 107, + 1339, 109, 26, 111, 386, 344, 2612, 466, 32, 3456, + 1340, 1048, 515, 497, 328, 518, 2206, 13, 14, 137, + 202, 448, 516, 1060, 289, 370, 1339, 3517, 515, 170, + 344, 518, 370, 2305, 515, 2595, 448, 518, 516, 377, + 514, 2594, 518, 1410, 1411, 515, 379, 515, 518, 1416, + 1087, 1418, 515, 13, 14, 518, 1423, 1424, 1425, 1426, + 2626, 515, 370, 245, 3511, 2579, 221, 515, 515, 3516, + 518, 1438, 1439, 381, 1418, 171, 1443, 515, 1445, 294, + 518, 1448, 420, 416, 422, 59, 1453, 514, 1455, 1456, + 2643, 1458, 2483, 2484, 2593, 1462, 2595, 515, 514, 1443, + 518, 1445, 514, 448, 1448, 417, 445, 223, 416, 1453, + 448, 497, 1456, 137, 1458, 454, 449, 515, 1462, 515, + 518, 152, 518, 350, 1443, 515, 1445, 460, 518, 1448, + 152, 445, 1169, 1170, 1453, 1172, 291, 1456, 152, 1458, + 454, 342, 515, 1462, 1443, 518, 1445, 188, 189, 1448, + 515, 293, 1519, 518, 1453, 2461, 2462, 1456, 466, 1458, + 2351, 2486, 1418, 1462, 2461, 2462, 2463, 152, 3231, 514, + 3233, 2461, 2457, 2458, 152, 293, 2460, 171, 2319, 402, + 381, 514, 405, 1033, 1551, 1552, 1418, 1443, 370, 1445, + 1548, 1548, 1448, 1560, 1561, 13, 14, 1453, 1548, 381, + 1456, 1568, 1458, 40, 515, 416, 1462, 518, 1575, 1548, + 1548, 1443, 354, 1445, 1548, 416, 1448, 258, 259, 515, + 515, 1453, 518, 518, 1456, 515, 1458, 515, 518, 514, + 1462, 274, 350, 1600, 416, 1548, 354, 1604, 40, 515, + 1607, 40, 518, 89, 386, 1612, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1620, 1621, 13, 14, 439, 1625, 1626, + 3241, 60, 1621, 1630, 2345, 466, 466, 1634, 386, 293, + 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 2352, + 3149, 1648, 152, 515, 466, 2891, 518, 480, 1655, 26, + 1657, 515, 152, 515, 518, 32, 518, 515, 365, 366, + 518, 152, 1339, 13, 14, 13, 14, 106, 107, 1676, + 516, 2547, 2453, 1695, 152, 457, 13, 14, 117, 1695, + 314, 315, 316, 5, 13, 14, 350, 2612, 2842, 2889, + 354, 1698, 13, 14, 375, 376, 13, 14, 289, 457, + 13, 14, 1709, 1710, 1674, 352, 501, 502, 503, 428, + 505, 506, 507, 508, 509, 510, 13, 14, 13, 14, + 1210, 514, 386, 13, 14, 13, 14, 171, 2509, 13, + 14, 13, 14, 13, 14, 514, 175, 13, 14, 1746, + 2570, 13, 14, 13, 14, 379, 13, 14, 1755, 514, + 1757, 13, 14, 2925, 365, 366, 1755, 514, 1757, 2965, + 137, 2654, 201, 515, 2676, 418, 1443, 219, 1445, 224, + 2633, 1448, 365, 366, 262, 263, 1453, 2686, 299, 1456, + 3439, 1458, 416, 514, 3443, 1462, 224, 535, 375, 376, + 1797, 224, 540, 457, 1801, 543, 514, 1804, 1805, 459, + 460, 3047, 3451, 3452, 126, 127, 3193, 26, 1298, 3483, + 3484, 250, 296, 32, 2797, 449, 40, 2742, 1137, 1138, + 235, 260, 514, 5, 5, 514, 460, 324, 514, 514, + 514, 2612, 5, 272, 8, 274, 5, 11, 1845, 3498, + 514, 15, 16, 1841, 5, 19, 20, 21, 514, 171, + 1857, 5, 148, 9, 477, 514, 8, 1864, 1865, 11, + 301, 518, 36, 15, 16, 304, 1873, 19, 20, 21, + 514, 1548, 104, 518, 515, 40, 219, 386, 286, 166, + 514, 166, 284, 1890, 59, 514, 235, 1894, 1895, 428, + 1897, 93, 514, 428, 518, 1902, 1903, 1904, 1905, 1906, + 1907, 1908, 3411, 3149, 1911, 1912, 1913, 1914, 1915, 1916, + 1917, 1918, 1919, 1920, 59, 59, 293, 356, 137, 1926, + 1927, 428, 428, 1930, 265, 1932, 2707, 524, 108, 221, + 1937, 476, 1939, 428, 428, 152, 100, 377, 274, 198, + 274, 274, 381, 514, 40, 514, 274, 2880, 274, 152, + 1627, 171, 1959, 516, 13, 2880, 1963, 3344, 1965, 515, + 2885, 400, 1969, 402, 515, 26, 405, 3160, 515, 515, + 1977, 32, 171, 350, 1981, 515, 1983, 354, 1985, 1963, + 1987, 518, 515, 2892, 2893, 1969, 515, 514, 473, 224, + 224, 514, 314, 315, 316, 281, 514, 463, 281, 518, + 3387, 516, 2009, 2784, 1963, 516, 514, 2932, 2933, 386, + 1969, 514, 514, 2020, 2021, 514, 2737, 39, 1695, 472, + 9, 514, 514, 426, 1963, 426, 11, 352, 518, 1519, + 1969, 513, 426, 279, 521, 524, 428, 518, 514, 514, + 180, 162, 171, 791, 117, 518, 515, 221, 454, 3436, + 217, 518, 2095, 2060, 3019, 265, 226, 379, 2065, 2066, + 290, 312, 389, 312, 518, 180, 219, 1963, 390, 3275, + 518, 226, 515, 1969, 293, 514, 137, 514, 274, 3217, + 457, 295, 287, 2090, 2091, 226, 333, 466, 2095, 514, + 412, 1963, 152, 3, 416, 26, 514, 1969, 171, 152, + 514, 32, 2109, 152, 152, 2112, 476, 2114, 152, 3, + 2891, 37, 40, 289, 274, 40, 42, 291, 289, 59, + 171, 11, 1612, 2130, 2131, 40, 166, 449, 515, 515, + 2137, 350, 515, 2140, 515, 354, 514, 885, 460, 291, + 2861, 514, 180, 514, 2925, 166, 3, 39, 3, 512, + 2157, 512, 1829, 428, 476, 428, 2140, 428, 515, 428, + 513, 515, 518, 2170, 1841, 3411, 171, 386, 515, 917, + 521, 516, 514, 2157, 497, 101, 515, 13, 500, 497, + 2187, 2188, 514, 19, 515, 933, 934, 935, 936, 497, + 428, 515, 514, 155, 514, 31, 515, 2204, 514, 2206, + 515, 2140, 249, 515, 514, 473, 137, 40, 2215, 45, + 46, 518, 3137, 3138, 3414, 3127, 59, 518, 2157, 290, + 499, 290, 503, 3004, 3149, 451, 2233, 2234, 2235, 243, + 303, 59, 293, 59, 2233, 2234, 2235, 985, 457, 265, + 428, 314, 315, 316, 2140, 274, 172, 8, 514, 152, + 11, 202, 152, 177, 15, 16, 1746, 152, 19, 20, + 21, 2157, 428, 281, 281, 2272, 3047, 2310, 2140, 147, + 428, 2278, 108, 515, 514, 36, 40, 428, 202, 428, + 352, 514, 208, 161, 515, 2157, 1963, 3000, 166, 350, + 518, 287, 1969, 354, 289, 40, 152, 476, 224, 279, + 515, 171, 514, 514, 59, 185, 379, 2314, 234, 515, + 2299, 2299, 2319, 2299, 2299, 2314, 240, 515, 515, 166, + 80, 512, 515, 515, 143, 386, 515, 501, 502, 503, + 2337, 505, 506, 507, 508, 509, 510, 198, 515, 217, + 171, 524, 268, 416, 2351, 2352, 514, 300, 358, 501, + 502, 503, 2359, 505, 506, 507, 508, 509, 510, 237, + 2359, 518, 293, 289, 180, 515, 514, 3243, 3149, 515, + 294, 514, 3203, 290, 3205, 152, 449, 515, 515, 518, + 514, 175, 439, 515, 515, 3215, 516, 460, 314, 515, + 2397, 514, 514, 40, 518, 321, 457, 515, 514, 40, + 1890, 86, 454, 476, 518, 171, 514, 475, 286, 515, + 515, 198, 1902, 2397, 515, 513, 513, 295, 2095, 350, + 515, 515, 3218, 354, 3220, 518, 515, 500, 515, 460, + 2437, 289, 59, 503, 3346, 361, 2113, 3402, 515, 515, + 515, 514, 1932, 2486, 476, 204, 2453, 117, 1196, 1939, + 515, 40, 2129, 226, 380, 386, 514, 88, 2524, 191, + 221, 1209, 2469, 2140, 279, 0, 3355, 279, 2475, 2476, + 516, 516, 428, 3336, 516, 516, 2519, 516, 503, 2486, + 2157, 516, 1230, 516, 428, 515, 3411, 1977, 516, 516, + 2497, 1981, 516, 2500, 513, 2502, 420, 1987, 422, 515, + 3330, 2397, 2509, 2510, 516, 516, 2513, 2514, 516, 516, + 516, 2518, 2519, 516, 516, 516, 516, 516, 2525, 2009, + 513, 445, 516, 449, 448, 2397, 457, 2570, 454, 516, + 291, 8, 516, 2540, 11, 516, 40, 516, 15, 16, + 2538, 2538, 516, 2550, 516, 1293, 2544, 516, 2538, 516, + 516, 516, 515, 274, 1302, 514, 7, 8, 107, 2538, + 2538, 40, 13, 2570, 2538, 100, 444, 514, 19, 46, + 476, 289, 23, 514, 25, 26, 53, 9, 514, 30, + 31, 32, 351, 518, 35, 2538, 335, 38, 39, 518, + 59, 42, 514, 198, 45, 46, 515, 515, 191, 513, + 459, 91, 2609, 80, 344, 2612, 2613, 518, 2615, 514, + 2609, 515, 147, 40, 2613, 152, 2615, 516, 515, 55, + 2627, 124, 2629, 152, 75, 76, 161, 40, 515, 366, + 3411, 166, 366, 2310, 512, 40, 171, 515, 516, 515, + 514, 514, 40, 518, 454, 180, 514, 309, 514, 100, + 185, 279, 2650, 248, 190, 454, 107, 108, 109, 110, + 111, 439, 514, 3384, 2653, 2653, 102, 2653, 2653, 292, + 74, 74, 80, 9, 515, 515, 514, 368, 1033, 93, + 2678, 515, 217, 2681, 513, 59, 2729, 123, 513, 133, + 503, 272, 289, 1441, 40, 439, 514, 2704, 292, 176, + 2707, 292, 237, 514, 204, 141, 515, 515, 515, 145, + 289, 459, 289, 515, 386, 551, 193, 2724, 2725, 365, + 122, 198, 2729, 37, 451, 2732, 148, 25, 42, 36, + 365, 167, 297, 868, 170, 2596, 1763, 2228, 25, 26, + 501, 502, 503, 3245, 505, 506, 507, 508, 509, 510, + 186, 286, 2759, 3387, 289, 2609, 3340, 3488, 2548, 236, + 295, 8, 1864, 2885, 11, 2340, 2773, 3361, 15, 16, + 3466, 2778, 2779, 3120, 3415, 2818, 2783, 2784, 40, 3424, + 3459, 2788, 147, 3179, 2791, 2792, 1197, 101, 2221, 2796, + 2797, 171, 2234, 2800, 3309, 3413, 161, 2804, 60, 46, + 335, 166, 2218, 2588, 2811, 3422, 53, 2667, 2615, 2486, + 3410, 2298, 1295, 2359, 291, 3000, 2645, 1322, 2204, 1005, + 2804, 1156, 2170, 358, 1734, 2418, 1178, 114, 3396, 2319, + 1698, 3318, 3207, 80, 2187, 1179, 1733, 23, 1975, 2157, + 2732, 1181, 2519, 279, 106, 2804, 1005, 3042, 2855, 2397, + 151, 287, 217, 2445, 800, 1210, 2863, 789, 172, 2396, + 3141, 2538, 1990, 983, 981, 2804, 1873, 2544, 981, 981, + 171, 981, 237, 309, 981, 2882, 1873, 981, 981, 981, + 3322, 416, 3321, 2171, 2891, 2067, 2476, 1439, 2069, 2022, + 2113, 2110, 2493, 2570, 208, 2811, 3307, 2538, 145, 783, + 336, 1807, 1983, 1360, 1340, 1674, 37, 743, 2804, 444, + 224, 42, 2549, 175, 391, 1675, 100, -1, 2925, 454, + 234, 286, 2271, 303, -1, 1673, -1, 1675, 1234, 176, + 295, -1, 2804, -1, 314, 315, 316, 1685, 473, 201, + 475, 476, -1, 1298, -1, -1, 193, -1, -1, -1, + -1, 198, 40, -1, 268, -1, -1, -1, -1, -1, + 2967, -1, -1, 2453, -1, 2972, -1, -1, 2967, -1, + 101, -1, 60, 2650, -1, 1723, 3019, 512, -1, -1, + 515, 516, 517, -1, -1, 2983, -1, -1, 250, 236, + -1, -1, -1, 3000, -1, -1, 3003, 3004, 260, 379, + 314, 2678, -1, -1, 2681, -1, -1, 321, -1, -1, + 272, -1, 3019, 314, 315, 316, -1, -1, 106, 2509, + -1, 498, -1, 859, -1, -1, -1, -1, 505, 506, + 507, 508, 509, 510, -1, -1, 416, -1, -1, -1, + 3047, 172, 304, -1, 291, 3052, -1, 361, -1, -1, + -1, -1, 2729, -1, -1, -1, 3063, 3064, -1, -1, + 3067, -1, 3069, -1, -1, -1, 380, -1, -1, 449, + 1818, 1819, 1820, 1821, 1822, -1, -1, 208, 379, 444, + 460, -1, -1, -1, 535, -1, -1, 3094, -1, 540, + -1, -1, 543, 224, 356, -1, 476, -1, 8, -1, + 551, 11, -1, 234, -1, 15, 16, -1, -1, -1, + -1, 3118, -1, 201, -1, 416, -1, -1, -1, 381, + 500, -1, 2612, -1, -1, -1, -1, 2804, -1, -1, + -1, -1, -1, -1, 514, 449, 46, 268, 400, -1, + -1, 2818, 3149, 53, 391, -1, -1, 512, 449, -1, + -1, 516, -1, -1, -1, 177, -1, -1, 289, 460, + -1, -1, 250, -1, 1519, -1, 3173, -1, 3166, 3167, + 80, -1, 260, -1, 3173, 476, -1, -1, -1, -1, + 202, -1, 3189, 314, 272, 1033, 3193, -1, -1, -1, + 321, -1, -1, -1, -1, -1, 3203, -1, 3205, 500, + 3207, -1, -1, -1, 3211, 1953, 3213, -1, 3215, 3193, + -1, 1033, -1, 514, -1, -1, 304, 2707, 240, 3226, + -1, -1, -1, -1, 3231, 8, 3233, -1, 11, -1, + 361, -1, 15, 16, 3241, 145, 19, 20, 21, -1, + -1, -1, -1, -1, 3242, -1, 3244, 3254, -1, 380, + -1, 498, 3259, -1, -1, 3254, -1, 1612, 505, 506, + 507, 508, 509, 510, -1, -1, 176, -1, 356, -1, + -1, -1, 294, -1, -1, -1, 151, -1, -1, -1, + 177, -1, -1, 193, -1, -1, -1, 3285, 198, -1, + 741, 742, 743, 381, 2784, -1, 171, 3193, -1, -1, + -1, 3308, -1, 3301, -1, 202, 2983, 3305, -1, -1, + -1, 3318, 400, 988, 171, -1, -1, -1, 449, -1, + 1156, 3193, -1, 3330, -1, -1, 236, -1, -1, -1, + -1, 782, 783, 784, -1, -1, -1, 3344, 789, -1, + 791, -1, 3019, 240, -1, -1, -1, -1, 370, 800, + -1, -1, -1, 804, 805, 3362, -1, -1, 809, 810, + 3344, -1, 1210, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 823, 824, 825, -1, -1, -1, -1, -1, + 3387, 291, -1, -1, -1, -1, 837, 838, 1210, 840, + -1, 1746, -1, -1, -1, 3402, -1, 294, 420, -1, + 422, 2891, 853, 3387, 3411, -1, 3413, -1, 859, -1, + -1, -1, -1, -1, 3413, 198, 313, 439, -1, -1, + 871, -1, -1, 445, -1, -1, 448, -1, -1, 3436, + 3428, -1, -1, -1, 885, 2925, -1, -1, 221, 314, + 315, 316, -1, 3450, 3451, 3452, -1, -1, 3344, -1, + 1298, -1, 3436, -1, -1, -1, 3454, 314, 315, 316, + -1, -1, -1, -1, -1, -1, 917, 918, -1, -1, + 3477, -1, 3344, 370, -1, -1, 1298, -1, 929, -1, + 377, 391, 933, 934, 935, 936, -1, -1, -1, 3166, + 3167, 3387, -1, -1, 1330, 782, 1332, 784, 949, -1, + -1, -1, -1, -1, 379, -1, -1, 988, 291, -1, + -1, 3518, -1, -1, 3004, 3387, -1, -1, -1, -1, + -1, -1, 379, 420, -1, 422, -1, 814, -1, -1, + -1, 982, 983, -1, 985, 1890, -1, 988, -1, -1, + 3436, 416, 439, 994, 995, -1, -1, 1902, 445, 1000, + -1, 448, 839, 2301, -1, 1006, -1, 3047, -1, 416, + -1, -1, 1013, -1, 3436, 3242, -1, 3244, 2316, 2317, + 2318, -1, 1023, -1, 449, -1, -1, 1932, -1, 1030, + -1, -1, -1, 2331, 1939, 460, 2334, -1, 498, 1040, + -1, 2339, 449, -1, -1, 505, 506, 507, 508, 509, + 510, 476, 8, 460, -1, 11, -1, -1, 3285, 15, + 16, -1, -1, 19, 20, 21, -1, -1, -1, 476, + -1, -1, 1977, -1, 3301, 500, 1981, -1, 3305, 988, + -1, -1, 1987, -1, -1, -1, -1, -1, 1089, 514, + 46, -1, -1, 500, -1, -1, -1, 53, -1, -1, + -1, -1, -1, -1, 2009, -1, -1, 514, -1, 3149, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1519, -1, -1, 80, -1, -1, 2425, 2426, 2427, + -1, 13, -1, 970, -1, -1, -1, 19, 1139, -1, + 1141, -1, -1, -1, 981, 1176, -1, 1519, -1, 31, + -1, -1, -1, -1, 1185, 1156, 1157, -1, -1, -1, + -1, -1, 1163, 45, 46, -1, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, + -1, -1, -1, -1, 1185, 1410, 1411, -1, -1, -1, + -1, 1416, -1, 1030, -1, 1196, 1197, -1, -1, -1, + -1, 3428, -1, -1, -1, -1, -1, -1, 1209, -1, + -1, 8, -1, -1, 1612, -1, -1, -1, 15, 16, + 176, -1, 19, 20, 21, 1226, 108, 3454, -1, 1230, + -1, -1, -1, -1, 1235, -1, -1, 193, -1, -1, + 1612, -1, 198, -1, -1, -1, -1, 1033, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1096, + -1, -1, -1, -1, -1, -1, 2564, -1, -1, 1106, + -1, -1, -1, -1, -1, -1, 1185, -1, -1, -1, + 236, -1, -1, -1, -1, -1, -1, -1, -1, 1126, + 1291, -1, 1293, -1, -1, -1, -1, -1, 1135, -1, + -1, 1302, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8, 1313, -1, 11, -1, -1, -1, 15, 16, + -1, 1322, 19, 20, 21, -1, 1327, -1, 1329, 1330, + -1, 1332, 1333, -1, -1, 291, -1, -1, -1, 36, + -1, -1, -1, -1, -1, -1, -1, -1, 1746, -1, + -1, -1, -1, -1, -1, 1741, -1, 2655, -1, 1360, + -1, -1, -1, -1, -1, 1751, -1, 1753, -1, -1, + 1756, 3411, -1, -1, 1746, -1, 1762, -1, 1764, 1410, + 1411, -1, -1, -1, -1, 1416, -1, -1, -1, -1, + -1, 1777, -1, -1, -1, -1, 1782, -1, -1, -1, + 1786, 1787, 1788, 1789, -1, 1791, 1792, -1, -1, 1410, + 1411, -1, -1, -1, 2319, 1416, -1, 1418, -1, 2717, + 2718, 2719, 2720, -1, 1210, -1, -1, -1, -1, -1, + 1431, -1, 1433, 1434, -1, 391, -1, -1, -1, -1, + 1441, -1, 1443, -1, 1445, -1, -1, 1448, -1, -1, + -1, -1, 1453, 1033, -1, 1456, -1, 1458, -1, -1, + -1, 1462, -1, 1464, -1, 1466, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1890, -1, 291, -1, -1, -1, -1, -1, + -1, 1410, 1411, -1, 1902, -1, -1, 1416, -1, -1, + -1, -1, 1298, -1, -1, -1, -1, -1, 1890, 1356, + -1, -1, -1, 1360, 221, -1, -1, -1, -1, -1, + 1902, -1, -1, -1, 1932, -1, -1, -1, -1, -1, + -1, 1939, 498, -1, -1, 501, 502, 503, 2453, 505, + 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, + 1932, -1, -1, -1, -1, -1, -1, 1939, -1, -1, + -1, 2869, -1, 1574, -1, -1, -1, -1, -1, 1977, + -1, -1, -1, 1981, 1585, 8, -1, -1, 11, 1987, + -1, -1, 15, 16, 291, -1, 19, 20, 21, -1, + -1, -1, -1, -1, 2509, 1977, -1, -1, -1, 1981, + -1, 2009, -1, -1, -1, 1987, -1, -1, -1, -1, + -1, -1, -1, 1624, -1, -1, -1, -1, -1, -1, + 1210, -1, -1, -1, -1, -1, -1, 2009, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1698, -1, 551, + 1671, -1, 1673, -1, 1675, -1, -1, -1, 1903, 1904, + 1905, 1906, 1907, 1908, 1685, 1686, 1911, 1912, 1913, 1914, + 1915, 1916, 1917, 1918, 1919, 1920, -1, 1698, -1, -1, + -1, -1, -1, -1, 501, 502, 503, 2612, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, 1298, -1, + -1, -1, 1723, -1, 1725, -1, -1, -1, -1, -1, + -1, -1, -1, 1519, -1, -1, -1, -1, -1, 1740, + 1741, -1, -1, -1, 1653, -1, -1, -1, -1, -1, + 1751, 1752, 1753, 1754, -1, 1756, -1, -1, -1, -1, + -1, 1762, -1, 1764, -1, -1, 2152, -1, -1, -1, + -1, 8, -1, -1, 11, 1776, 1777, -1, 15, 16, + 1781, 1782, 19, 20, 21, 1786, 1787, 1788, 1789, 1698, + 1791, 1792, -1, -1, -1, -1, -1, -1, 221, -1, + -1, -1, 2707, -1, 501, 502, 503, 1808, 505, 506, + 507, 508, 509, 510, -1, 1816, -1, 1818, 1819, 1820, + 1821, 1822, -1, -1, -1, -1, 1612, -1, 1665, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1839, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1852, -1, -1, -1, -1, -1, -1, -1, -1, + 742, 743, -1, -1, -1, 2090, 2091, -1, 291, -1, + -1, 3169, 1903, 1904, 1905, 1906, 1907, 1908, -1, 2784, + 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, + -1, -1, 3190, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1903, 1904, 1905, 1906, 1907, 1908, -1, -1, + 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, + -1, 2319, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1519, + 1941, -1, -1, 2329, -1, -1, -1, 2319, -1, -1, + -1, -1, 1953, -1, 3252, -1, 1793, -1, -1, -1, + 1746, -1, 1963, -1, -1, -1, -1, -1, 1969, 1806, + 1807, -1, -1, -1, 1975, -1, -1, 859, -1, 1980, + -1, -1, -1, -1, 221, 3283, 2891, -1, 1989, 1990, + -1, 24, -1, -1, 1903, 1904, 1905, 1906, 1907, 1908, + -1, -1, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, + 1919, 1920, -1, -1, -1, -1, -1, -1, -1, -1, + 2925, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1612, -1, -1, -1, 1873, -1, -1, -1, + -1, -1, 1879, -1, -1, -1, -1, -1, 81, -1, + -1, -1, -1, -1, 291, 2453, -1, 2058, -1, 2090, + 2091, 2062, -1, -1, 97, -1, 2067, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 501, 502, + 503, 2453, 505, 506, 507, 508, 509, 510, -1, 2090, + 2091, -1, -1, -1, -1, -1, -1, -1, -1, 3004, + -1, -1, -1, -1, 1890, -1, 2107, -1, -1, -1, + -1, 2509, -1, 146, -1, -1, 1902, -1, 1000, -1, + -1, -1, -1, 156, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 168, -1, 2509, -1, 2140, + 173, 1023, 3047, -1, -1, -1, 1932, -1, -1, -1, + -1, 2152, -1, 1939, -1, -1, 2157, -1, -1, -1, + 2161, -1, -1, -1, -1, -1, 1746, -1, -1, 202, + -1, -1, -1, 2204, -1, -1, -1, -1, -1, -1, + -1, 2090, 2091, -1, -1, -1, -1, 2573, 2574, -1, + -1, 1977, -1, -1, -1, 1981, -1, 37, -1, -1, + 2201, 1987, 42, 2204, -1, -1, 2207, 1089, -1, -1, + -1, -1, 245, -1, 2612, 2601, 249, -1, -1, -1, + -1, -1, 2223, 2009, -1, -1, -1, -1, -1, -1, + 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, + 2612, -1, -1, -1, 3149, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 101, -1, -1, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, 1156, 1157, -1, -1, -1, -1, + 313, -1, -1, -1, -1, -1, 319, -1, 2513, 2514, + -1, -1, -1, 2294, -1, 2204, -1, -1, -1, -1, + 2301, 334, 126, 127, -1, -1, -1, -1, -1, 2707, + 1890, 2312, -1, -1, 2315, 2316, 2317, 2318, -1, -1, + -1, -1, 1902, -1, -1, -1, -1, -1, 2329, -1, + 2331, -1, 172, 2334, 367, 2707, -1, 370, 2339, -1, + 180, -1, -1, -1, 2345, -1, -1, 171, 381, -1, + -1, 384, 1932, -1, -1, -1, -1, -1, -1, 1939, + -1, -1, -1, -1, 2365, 2366, -1, 2368, 208, 402, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 416, 224, -1, 2784, -1, -1, 422, + 423, -1, -1, -1, 234, -1, 2397, 1977, -1, -1, + 433, 1981, -1, 2240, -1, -1, 439, 1987, -1, -1, + -1, -1, 2784, -1, -1, -1, 2417, -1, -1, -1, + -1, -1, -1, -1, 2425, 2426, 2427, -1, 268, 2009, + -1, -1, -1, 466, 2435, -1, 2437, -1, 2439, -1, + -1, -1, -1, -1, 2445, -1, -1, 1329, 1330, 289, + 1332, -1, -1, -1, -1, 2292, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2310, 314, -1, 2862, 2478, -1, 2704, + -1, 321, 2513, 2514, -1, -1, -1, -1, -1, -1, + 314, 315, 316, 2891, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3411, -1, -1, -1, + -1, -1, 2513, 2514, -1, 2352, -1, -1, -1, 2891, + -1, 361, -1, -1, 2361, -1, 2363, 2925, -1, -1, + 2367, -1, 2369, 2319, -1, -1, -1, -1, -1, -1, + 380, 2542, -1, -1, -1, -1, -1, 2548, -1, -1, + -1, 1433, -1, 2925, -1, 379, -1, -1, -1, -1, + -1, -1, -1, 2564, -1, -1, 390, 2568, -1, -1, + -1, 2572, 2573, 2574, -1, -1, -1, 2578, 2579, 2580, + -1, 2582, 1464, -1, 1466, -1, -1, -1, 412, -1, + -1, -1, 416, -1, -1, -1, -1, -1, -1, -1, + 2601, 0, 2603, -1, 2513, 2514, 3004, -1, -1, 449, + -1, -1, -1, -1, 454, 2616, 2617, 2618, 2619, 2620, + 2621, 2622, 2623, 2624, 2625, 449, -1, -1, -1, -1, + -1, -1, 3004, -1, -1, -1, 460, -1, 2863, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2649, 3047, + -1, -1, 476, -1, 2655, 8, -1, -1, 11, -1, + -1, -1, 15, 16, -1, -1, 2667, 2453, -1, -1, + -1, -1, -1, 2704, -1, 3047, 500, -1, -1, -1, + -1, -1, 2683, -1, -1, -1, -1, -1, -1, -1, + 514, -1, 2693, 46, -1, -1, -1, -1, 2729, -1, + 53, 100, -1, 2704, -1, -1, -1, -1, -1, 2710, + -1, -1, -1, -1, -1, -1, 2717, 2718, 2719, 2720, + -1, -1, -1, 2509, -1, -1, -1, 80, 2729, -1, + -1, 2732, -1, -1, -1, 2736, 2737, -1, -1, 2319, + -1, -1, 2773, 3129, 2745, -1, -1, -1, 147, -1, + -1, 3149, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 161, -1, 3150, 3151, -1, 166, -1, -1, + -1, 2772, 171, -1, -1, 2612, -1, 3149, 3003, -1, + -1, 180, -1, -1, -1, -1, 185, -1, -1, -1, + 3176, -1, 145, -1, -1, 2704, -1, -1, -1, -1, + -1, 2802, -1, 2804, -1, -1, -1, -1, 2645, -1, + -1, -1, -1, -1, -1, -1, -1, 2818, 217, -1, + 2729, 2822, -1, 176, -1, -1, 2612, 2828, -1, -1, + -1, -1, 2863, -1, -1, -1, 26, -1, 237, -1, + 193, 2842, 32, 1725, -1, 198, -1, 2848, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, 1741, + 2861, 2862, 2863, -1, -1, -1, -1, -1, 2869, 1751, + 60, 1753, -1, 2453, 1756, -1, -1, -1, -1, -1, + 1762, -1, 1764, 236, -1, 2886, -1, 286, -1, -1, + 289, -1, -1, -1, -1, 1777, 295, -1, -1, -1, + 1782, -1, -1, -1, 1786, 1787, 1788, 1789, -1, 1791, + 1792, -1, -1, -1, -1, -1, 106, -1, -1, -1, + -1, 2707, -1, -1, -1, -1, -1, -1, -1, 2509, + -1, -1, -1, -1, -1, -1, 335, -1, 291, -1, + -1, -1, -1, -1, -1, -1, -1, 137, -1, -1, + -1, -1, -1, -1, 2863, -1, -1, -1, -1, 358, + -1, -1, -1, 2964, -1, -1, -1, 2968, -1, -1, + -1, 2808, 3003, -1, -1, -1, -1, 835, 836, -1, + -1, 2982, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2996, -1, -1, 2784, -1, + -1, -1, 3003, -1, -1, -1, -1, -1, -1, -1, + -1, 201, -1, 3411, -1, -1, -1, 416, 98, -1, + -1, 3407, -1, -1, -1, -1, -1, -1, 3029, -1, + -1, -1, 2612, -1, 3035, -1, -1, -1, 391, 3411, + -1, 3042, -1, -1, 902, 444, 126, 127, 906, 907, + -1, -1, -1, -1, -1, 454, -1, -1, -1, 1941, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 260, -1, -1, -1, 473, 3076, 475, 476, -1, -1, + -1, -1, 272, -1, -1, -1, 0, -1, -1, -1, + -1, 171, -1, 1975, 3003, -1, -1, 3098, 1980, -1, + -1, 959, 3103, 293, -1, 2891, -1, -1, -1, -1, + -1, -1, -1, 512, 304, -1, 515, 516, 517, -1, + 978, -1, -1, -1, -1, -1, 984, 2707, 3129, 987, + -1, -1, 990, 991, 992, 993, -1, -1, -1, 2925, + 2977, -1, -1, -1, -1, 498, -1, -1, -1, 3150, + 3151, -1, 505, 506, 507, 508, 509, 510, -1, -1, + 350, -1, -1, 3000, 354, -1, 356, -1, 3169, -1, + 3171, -1, -1, 1031, 1032, 3176, 2058, -1, -1, -1, + -1, -1, 3213, -1, -1, 2067, 100, -1, -1, 3190, + -1, 381, 3193, -1, 1052, -1, 386, -1, -1, -1, + -1, -1, -1, -1, 2784, -1, -1, -1, -1, -1, + 400, -1, 3213, 1071, 68, 69, 3217, 3218, 3004, 3220, + -1, -1, -1, -1, 1082, 1083, 1084, -1, 1086, 1087, + -1, -1, -1, 147, 314, 315, 316, -1, -1, -1, + 3, -1, 5, 3080, 3245, -1, -1, 161, -1, -1, + -1, 3252, 166, -1, -1, 109, 110, 171, -1, 113, + 114, 3047, 1120, -1, -1, -1, 180, 457, -1, -1, + 2152, 185, -1, -1, -1, -1, -1, -1, -1, 1137, + 1138, -1, 3283, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + -1, -1, -1, 217, 3213, 68, 69, -1, -1, -1, + 390, 2891, 3149, 1171, -1, -1, -1, 1175, 1176, 2201, + -1, 3322, -1, 237, -1, 2207, -1, -1, 1186, 1187, + -1, -1, 412, -1, 188, 189, 416, -1, -1, -1, + -1, -1, -1, 3344, -1, 2925, 109, 110, -1, -1, + 113, 114, -1, -1, -1, -1, 436, -1, -1, -1, + -1, -1, -1, 3149, -1, -1, -1, -1, -1, 449, + 3371, -1, 286, -1, -1, 289, -1, -1, -1, -1, + 460, 295, -1, 3384, 3385, 1243, 3387, 3388, -1, -1, + -1, -1, -1, -1, 1252, 3396, 476, -1, 252, 253, + 254, 255, 256, 257, 258, 259, 3407, -1, 262, 263, + -1, -1, -1, -1, -1, -1, -1, -1, 1276, -1, + 500, 335, -1, -1, 3004, 188, 189, -1, 3429, -1, + -1, -1, -1, -1, 514, 3436, -1, -1, -1, 3276, + -1, -1, -1, -1, 358, -1, -1, 2329, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3047, -1, -1, + -1, -1, 3473, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3488, -1, 252, + 253, 254, 255, 256, 257, 258, 259, -1, -1, 262, + 263, -1, 416, -1, -1, 1363, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 375, 376, -1, -1, -1, -1, -1, -1, -1, + 444, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 454, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2435, -1, -1, -1, 2439, -1, 473, + -1, 475, 476, 2445, -1, 1423, -1, 1425, 1426, 3149, + -1, -1, -1, -1, 3411, -1, -1, -1, -1, -1, + 1438, 1439, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1455, 512, -1, + -1, 515, 516, 517, -1, -1, -1, -1, -1, -1, + -1, -1, 375, 376, -1, -1, 470, 471, -1, -1, + -1, 8, -1, -1, 11, 3411, -1, -1, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + 494, 495, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, + 514, -1, -1, -1, -1, -1, 53, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2568, -1, -1, -1, + 2572, 2573, 2574, 80, -1, -1, -1, -1, -1, -1, + -1, -1, 1560, -1, -1, -1, -1, 470, 471, -1, + 1568, -1, -1, -1, -1, -1, -1, -1, -1, 2601, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 494, 495, -1, 2616, 2617, 2618, 2619, 2620, 2621, + 2622, 2623, 2624, 2625, -1, -1, -1, -1, -1, 1607, + -1, -1, -1, -1, -1, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1620, -1, -1, -1, -1, 1625, 1626, -1, + -1, -1, 1630, -1, -1, -1, 1634, -1, -1, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, -1, 176, + 1648, -1, -1, -1, -1, -1, -1, 1655, -1, 1657, + -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, + -1, 198, -1, -1, -1, -1, -1, -1, 1676, -1, + -1, -1, -1, -1, -1, 0, -1, -1, 2710, -1, + -1, 3411, -1, -1, 221, 222, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 22, -1, 236, + -1, 1709, 1710, -1, 2736, -1, -1, 32, -1, 34, + 35, 8, -1, -1, 11, -1, -1, -1, 15, 16, + -1, -1, 47, -1, -1, -1, -1, 52, -1, -1, + -1, -1, -1, -1, -1, -1, 61, 274, -1, -1, + 277, -1, -1, -1, -1, -1, -1, -1, -1, 46, + 75, -1, -1, -1, 291, -1, 53, 294, -1, 84, + -1, 86, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 98, -1, 100, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, 111, -1, -1, 1797, + -1, -1, -1, 1801, -1, -1, 1804, 1805, -1, -1, + -1, 126, 127, 128, -1, -1, -1, -1, -1, -1, + -1, -1, 137, -1, -1, -1, -1, -1, 143, -1, + -1, -1, -1, -1, -1, -1, 151, -1, 153, 154, + 2862, -1, -1, -1, -1, -1, -1, 1845, -1, -1, + -1, -1, 167, -1, -1, -1, 171, -1, 145, -1, + -1, -1, -1, -1, 391, -1, 1864, 1865, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 197, -1, -1, -1, -1, -1, -1, 176, + -1, -1, -1, -1, -1, -1, 1894, 1895, 213, 1897, + -1, -1, -1, -1, -1, 8, 193, -1, 11, -1, + -1, 198, 15, 16, 17, 18, 19, 20, 21, -1, + -1, -1, -1, -1, 239, -1, -1, -1, 1926, 1927, + -1, -1, 1930, 36, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 46, -1, -1, -1, -1, -1, 236, + 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1959, -1, -1, -1, -1, -1, 1965, -1, -1, + -1, 498, -1, -1, 501, 502, 503, 80, 505, 506, + 507, 508, 509, 510, -1, 1983, -1, 1985, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 524, -1, 314, + 315, 316, -1, -1, 291, -1, -1, 322, -1, -1, + 325, -1, -1, 3035, -1, -1, 988, -1, -1, -1, + 3042, -1, -1, 2021, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, + -1, -1, -1, -1, -1, -1, -1, -1, 363, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2060, -1, 379, 24, -1, 2065, 2066, -1, + -1, 386, -1, 176, -1, 390, 3098, -1, -1, -1, + -1, 3103, -1, -1, -1, 400, -1, -1, -1, -1, + 193, -1, -1, -1, -1, 198, -1, 412, -1, -1, + -1, 416, -1, -1, 391, -1, -1, 3129, -1, -1, + -1, 2109, -1, -1, 2112, -1, 2114, -1, 221, 222, + -1, 436, 81, -1, -1, -1, -1, -1, 3150, 3151, + -1, -1, 2130, 236, 449, 1107, -1, 452, 97, -1, + 455, -1, -1, -1, -1, 460, -1, -1, -1, -1, + -1, -1, -1, -1, 3176, -1, -1, -1, -1, -1, + -1, 476, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 274, 2170, -1, 277, -1, -1, -1, -1, -1, + 1152, -1, -1, -1, -1, 500, -1, 146, 291, 2187, + 2188, 294, -1, -1, -1, 3217, -1, 156, -1, 514, + -1, -1, 517, -1, -1, -1, -1, -1, 2206, 168, + -1, 498, -1, 1185, 173, -1, -1, 2215, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 202, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, -1, 1237, 19, 20, 21, -1, + -1, -1, -1, -1, 2272, -1, -1, -1, -1, -1, + 2278, -1, -1, -1, -1, -1, 245, -1, 391, -1, + 249, -1, -1, 46, -1, -1, -1, -1, -1, -1, + 53, -1, -1, -1, -1, -1, -1, 1279, -1, -1, + -1, -1, -1, -1, 1286, -1, 3, -1, -1, -1, + -1, 8, -1, -1, 11, -1, -1, 80, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, 2337, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, -1, -1, -1, -1, -1, 46, + 319, -1, -1, -1, 1336, -1, 53, -1, -1, -1, + -1, -1, -1, -1, -1, 334, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3407, -1, -1, -1, 1361, + -1, -1, -1, 80, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, 367, -1, + -1, 370, -1, -1, -1, 518, -1, -1, -1, -1, + -1, -1, 381, 176, -1, 384, -1, -1, -1, -1, + -1, -1, -1, -1, 1406, -1, 1408, -1, 1410, 1411, + 193, 1413, -1, 402, 1416, 198, -1, 1419, -1, -1, + 1422, -1, -1, -1, -1, 1427, -1, 416, 1430, -1, + -1, -1, -1, -1, 423, -1, -1, -1, 221, 222, + -1, 2469, -1, -1, 433, -1, -1, 2475, 2476, -1, + 439, -1, -1, 236, -1, -1, -1, -1, 2486, 176, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2497, + 1472, -1, 2500, -1, 2502, -1, 193, 466, -1, -1, + -1, 198, 2510, -1, -1, -1, -1, -1, -1, -1, + 2518, 2519, -1, -1, 277, -1, -1, 2525, -1, -1, + -1, -1, -1, -1, 221, 222, -1, -1, 291, -1, + -1, -1, 2540, -1, -1, -1, -1, -1, -1, 236, + -1, -1, 2550, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2570, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1556, -1, -1, 274, -1, -1, + 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1572, -1, -1, -1, 291, -1, -1, 294, -1, -1, + 1582, 1583, 1584, -1, -1, -1, 1588, -1, -1, -1, + 1592, -1, -1, -1, -1, -1, -1, -1, -1, 2627, + -1, 2629, -1, -1, -1, -1, -1, -1, 391, -1, + 8, -1, -1, 11, -1, -1, -1, 15, 16, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, -1, 46, -1, + -1, -1, 1654, -1, -1, 53, -1, 8, -1, -1, + 11, -1, -1, -1, 15, 16, 17, 18, 19, 20, + 21, -1, -1, -1, 391, -1, 46, -1, -1, -1, + -1, -1, 80, 53, -1, 36, -1, -1, -1, 40, + 1692, -1, -1, -1, -1, 46, 2724, 2725, -1, -1, + -1, -1, 53, -1, -1, -1, 1708, -1, -1, -1, + 80, 1713, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, 1730, 80, + -1, 2759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2773, -1, 145, -1, -1, + 2778, 2779, -1, -1, -1, 2783, -1, -1, -1, -1, + 2788, -1, -1, 2791, 2792, -1, -1, -1, 2796, 2797, + -1, -1, 2800, -1, -1, 145, -1, -1, 176, -1, + -1, 498, -1, 2811, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, -1, 193, -1, -1, -1, -1, + 198, -1, -1, -1, -1, -1, 176, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 193, -1, 176, -1, 2855, 198, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 236, -1, + -1, -1, 193, -1, -1, -1, -1, 198, -1, -1, + -1, -1, -1, -1, 2882, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, + 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, + 1892, -1, -1, 291, -1, -1, -1, -1, 1900, 1901, + -1, 1903, 1904, 1905, 1906, 1907, 1908, -1, -1, 1911, + 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, + -1, 291, -1, 274, -1, -1, 277, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 291, -1, -1, 294, 2972, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + -1, 3019, -1, 391, -1, -1, 46, -1, -1, -1, + -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 391, 2024, -1, 3052, 2027, -1, -1, -1, -1, + 80, -1, -1, -1, -1, 3063, 3064, -1, -1, 3067, + 391, 3069, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3094, -1, -1, -1, + -1, 2073, -1, -1, -1, 2077, 2078, 2079, 2080, 2081, + 2082, 2083, 2084, -1, -1, -1, -1, -1, 2090, 2091, + 3118, 2093, 2094, -1, -1, -1, -1, -1, -1, -1, + 498, -1, -1, 2105, -1, -1, 2108, 505, 506, 507, + 508, 509, 510, -1, 2116, 2117, 2118, 2119, 2120, 2121, + 2122, 2123, 2124, 2125, -1, -1, 176, -1, 498, -1, + -1, -1, -1, -1, -1, 505, 506, 507, 508, 509, + 510, -1, -1, 193, -1, -1, -1, 498, 198, 2151, + 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + -1, 3189, -1, -1, 515, -1, -1, -1, -1, -1, + -1, 221, 222, -1, -1, -1, -1, -1, -1, 3207, + -1, -1, -1, 3211, -1, -1, 236, 3215, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3226, -1, + -1, -1, 2204, 3231, -1, 3233, -1, -1, -1, -1, + -1, -1, -1, 3241, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, + -1, 3259, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 291, -1, -1, 294, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2273, -1, -1, -1, -1, 36, -1, -1, -1, + 3308, 2283, 2284, -1, -1, -1, 46, -1, -1, -1, + 3318, -1, -1, 53, -1, -1, -1, -1, -1, -1, + -1, -1, 3330, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3362, -1, -1, -1, -1, -1, + -1, 391, -1, -1, -1, -1, 2348, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2372, 2373, 2374, -1, -1, 2377, 2378, 2379, 2380, 2381, + 2382, -1, -1, -1, 2386, 2387, 2388, 2389, 2390, 2391, + 2392, 2393, 2394, 2395, -1, -1, -1, -1, 2400, 2401, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, 17, 18, 19, 20, 21, 176, -1, -1, -1, + -1, -1, 3450, 3451, 3452, -1, 2428, -1, -1, -1, + 36, -1, 2434, 193, -1, -1, -1, -1, 198, -1, + 46, -1, -1, -1, -1, -1, -1, 53, 498, 3477, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, 221, 222, -1, -1, 515, 2468, -1, -1, -1, + -1, -1, -1, -1, 80, -1, 236, -1, -1, -1, + -1, -1, -1, -1, -1, 2487, -1, -1, 2490, 2491, + 3518, -1, -1, -1, -1, -1, 2498, 2499, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2512, 2513, 2514, 2515, 274, 2517, -1, 277, -1, 2521, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 176, -1, -1, 2575, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, + -1, 8, 198, -1, 11, -1, -1, -1, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 221, 222, -1, -1, 36, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, + 236, 391, -1, -1, -1, -1, 53, -1, -1, -1, + -1, 8, -1, -1, 11, -1, -1, -1, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, -1, -1, 274, 36, + -1, 277, -1, -1, -1, -1, -1, -1, -1, 46, + 2682, -1, -1, -1, -1, 291, 53, 26, 294, -1, + -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, + -1, 40, 2704, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, + -1, 60, -1, 8, -1, -1, 11, -1, -1, -1, + 15, 16, 17, 18, 19, 20, 21, -1, 498, -1, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, 36, -1, -1, -1, 515, -1, -1, 2760, 176, + 2762, 46, -1, -1, -1, -1, 2768, 106, 53, -1, + -1, -1, -1, -1, -1, 2777, 193, -1, 2780, -1, + 2782, 198, -1, -1, 2786, 391, -1, 2789, 2790, -1, + -1, 2793, 2794, -1, -1, 80, -1, -1, 137, 2801, + -1, -1, -1, -1, 221, 222, -1, -1, 2810, 176, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, + -1, -1, -1, 2825, -1, -1, 193, -1, -1, -1, + -1, 198, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 221, 222, -1, 274, -1, -1, + 277, 2863, 201, -1, -1, -1, -1, -1, -1, 236, + -1, -1, -1, -1, 291, -1, -1, 294, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, 498, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, -1, -1, 274, 193, 515, + 277, 250, -1, 198, -1, -1, -1, -1, -1, -1, + -1, 260, -1, -1, 291, -1, -1, 294, -1, -1, + -1, -1, -1, 272, -1, -1, 221, 222, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 236, -1, -1, 293, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 304, -1, -1, -1, -1, + -1, -1, -1, -1, 391, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + 68, 69, 277, -1, -1, -1, -1, -1, -1, -1, + 3002, 3003, -1, -1, -1, -1, 291, -1, -1, 294, + -1, 350, -1, -1, -1, 354, -1, 356, -1, -1, + -1, -1, -1, -1, 391, 3027, 3028, -1, -1, -1, + -1, 109, 110, -1, -1, 113, 114, -1, -1, -1, + -1, -1, 381, -1, -1, -1, -1, 386, -1, 3051, + -1, -1, -1, 3055, -1, 3057, 3058, 3059, -1, -1, + 3062, 400, -1, 3065, 3066, -1, -1, -1, -1, -1, + -1, -1, 3074, -1, -1, -1, -1, -1, -1, -1, + -1, 498, -1, -1, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, 515, -1, + -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, + 188, 189, -1, 3115, -1, -1, -1, -1, 457, 3121, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 498, 3134, -1, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, 515, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3168, -1, -1, -1, + -1, -1, -1, -1, 252, 253, 254, 255, 256, 257, + 258, 259, -1, -1, 262, 263, -1, -1, -1, -1, + -1, -1, -1, 3195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, 3228, 3229, 3230, -1, + 515, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3248, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3260, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 375, 376, -1, + -1, -1, -1, -1, 3306, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3323, -1, -1, -1, -1, -1, -1, -1, -1, + 3332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3357, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3383, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 470, 471, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, + 6, 7, 8, 9, 10, -1, 494, 495, -1, -1, + -1, -1, -1, -1, 3426, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 3480, 75, + 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, + -1, -1, -1, 519, 520, -1, 522, 523, 524, 3, + 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, + -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, + 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, + 524, 3, 4, 5, 6, 7, 8, 9, 10, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, + 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, + 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, + -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, + 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, + 162, 163, 164, 165, -1, 167, -1, 169, 170, 171, + 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, + 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, + 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, + -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, + 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, -1, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, + 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, + -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, + -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, -1, 500, -1, + -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, + 512, -1, 514, 515, -1, -1, -1, 519, 520, -1, + 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, @@ -402629,10 +405508,10 @@ static const yytype_int16 yycheck[] = 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, -1, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, 416, 417, 418, 419, 420, + 411, 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, @@ -402646,7 +405525,7 @@ static const yytype_int16 yycheck[] = -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, -1, -1, -1, 37, -1, 39, + -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, @@ -402656,11 +405535,11 @@ static const yytype_int16 yycheck[] = -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, 132, -1, 134, 135, 136, 137, 138, -1, + 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, + 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, @@ -402674,31 +405553,31 @@ static const yytype_int16 yycheck[] = 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, + 310, 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, + 410, 411, -1, -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, + 440, 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, + 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, + 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, - -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, - -1, -1, 512, -1, 514, 515, -1, -1, -1, 519, - 520, -1, 522, 523, 3, 4, 5, 6, 7, -1, + 500, -1, -1, -1, -1, 505, 506, 507, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, + 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + 29, 30, 31, 32, 33, -1, -1, -1, 37, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -402706,13 +405585,13 @@ static const yytype_int16 yycheck[] = 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, 132, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, @@ -402722,44 +405601,44 @@ static const yytype_int16 yycheck[] = 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, 318, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, -1, 414, 415, 416, 417, 418, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, 476, 477, 478, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, - -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, + -1, -1, -1, 512, -1, 514, 515, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, - 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, @@ -402770,42 +405649,42 @@ static const yytype_int16 yycheck[] = -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, 232, 233, 234, 235, 236, -1, + 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, + 378, 379, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + 408, 409, 410, 411, 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, - -1, 429, 430, 431, 432, 433, 434, 435, 436, 437, + -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, - 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 448, 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, - 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 468, 469, 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, + -1, -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, 39, -1, -1, 42, 43, 44, -1, 46, + -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, @@ -402816,13 +405695,13 @@ static const yytype_int16 yycheck[] = 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, + 227, 228, 229, 230, -1, 232, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, @@ -402837,15 +405716,15 @@ static const yytype_int16 yycheck[] = 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, + 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, + 427, -1, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, @@ -402897,17 +405776,17 @@ static const yytype_int16 yycheck[] = 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, - 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, - 506, 507, -1, -1, -1, -1, 512, -1, 514, 515, + 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, - -1, -1, -1, 38, 39, -1, -1, 42, 43, 44, + 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, + -1, -1, 37, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, @@ -402941,9 +405820,9 @@ static const yytype_int16 yycheck[] = 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, + 375, 376, 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, @@ -402955,11 +405834,11 @@ static const yytype_int16 yycheck[] = 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, - -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, + 515, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, 37, -1, 39, -1, -1, 42, 43, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, 38, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, @@ -402993,9 +405872,9 @@ static const yytype_int16 yycheck[] = -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, @@ -403007,7 +405886,7 @@ static const yytype_int16 yycheck[] = 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, - 514, 515, -1, -1, -1, 519, 520, -1, 522, 523, + 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, @@ -403059,11 +405938,11 @@ static const yytype_int16 yycheck[] = 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, - -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, + -1, 514, 515, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, + 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, + 32, 33, -1, -1, -1, 37, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, @@ -403097,7 +405976,7 @@ static const yytype_int16 yycheck[] = 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, + 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, @@ -403167,7 +406046,7 @@ static const yytype_int16 yycheck[] = -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, + 30, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, @@ -403181,7 +406060,7 @@ static const yytype_int16 yycheck[] = 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, + 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, @@ -403233,7 +406112,7 @@ static const yytype_int16 yycheck[] = -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, @@ -403267,7 +406146,7 @@ static const yytype_int16 yycheck[] = 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, - -1, -1, -1, 512, -1, 514, 515, -1, -1, -1, + -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, @@ -403309,7 +406188,7 @@ static const yytype_int16 yycheck[] = 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, 416, 417, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, @@ -403319,7 +406198,7 @@ static const yytype_int16 yycheck[] = 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, - -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, + -1, -1, -1, -1, 512, -1, 514, 515, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, @@ -403361,13 +406240,13 @@ static const yytype_int16 yycheck[] = 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, + 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, 473, 474, -1, -1, + 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, @@ -403375,7 +406254,7 @@ static const yytype_int16 yycheck[] = -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, -1, -1, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, @@ -403419,7 +406298,7 @@ static const yytype_int16 yycheck[] = 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, - 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + 466, 467, 468, 469, 470, 471, -1, 473, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, @@ -403427,7 +406306,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, + 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, @@ -403466,7 +406345,7 @@ static const yytype_int16 yycheck[] = 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, + 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, @@ -403570,7 +406449,7 @@ static const yytype_int16 yycheck[] = 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, + -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, @@ -404009,7 +406888,7 @@ static const yytype_int16 yycheck[] = 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, @@ -404025,7 +406904,7 @@ static const yytype_int16 yycheck[] = 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, @@ -404047,8 +406926,8 @@ static const yytype_int16 yycheck[] = 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, -1, -1, -1, -1, -1, -1, - -1, 505, 506, -1, -1, -1, -1, -1, 512, -1, + 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, + -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, @@ -404061,7 +406940,7 @@ static const yytype_int16 yycheck[] = 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, @@ -404071,13 +406950,13 @@ static const yytype_int16 yycheck[] = 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, -1, 275, 276, -1, 278, 279, 280, 281, 282, + 273, -1, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, @@ -404099,10 +406978,10 @@ static const yytype_int16 yycheck[] = 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, - -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, + 493, 494, 495, 496, 497, -1, -1, -1, -1, -1, + -1, -1, 505, 506, -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, - 523, 3, 4, 5, 6, 7, -1, 9, 10, -1, + 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, @@ -404113,7 +406992,7 @@ static const yytype_int16 yycheck[] = -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, + 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, @@ -404123,13 +407002,13 @@ static const yytype_int16 yycheck[] = 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, + 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, + -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, 279, 280, 281, + 272, 273, -1, 275, 276, -1, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, @@ -404151,10 +407030,10 @@ static const yytype_int16 yycheck[] = -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, -1, -1, -1, -1, - -1, -1, -1, 505, 506, -1, -1, -1, -1, -1, + 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, + -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, - 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, + 522, 523, 3, 4, 5, 6, 7, -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, @@ -404176,7 +407055,7 @@ static const yytype_int16 yycheck[] = 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - -1, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, @@ -404206,7 +407085,7 @@ static const yytype_int16 yycheck[] = 491, 492, 493, 494, 495, 496, 497, -1, -1, -1, -1, -1, -1, -1, 505, 506, -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, - -1, 522, 523, 3, 4, 5, 6, 7, -1, 9, + -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, @@ -404224,11 +407103,11 @@ static const yytype_int16 yycheck[] = 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - 180, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 220, -1, 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, @@ -404256,7 +407135,7 @@ static const yytype_int16 yycheck[] = 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 505, 506, -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, @@ -404276,8 +407155,8 @@ static const yytype_int16 yycheck[] = 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 179, 180, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, @@ -404363,311 +407242,115 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, + 7, -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, + -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, -1, 146, + 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, -1, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, -1, + -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, 279, 280, 281, 282, 283, 284, 285, -1, + 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, -1, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, 3, 4, 5, 512, -1, 514, 9, -1, - -1, -1, 519, 520, -1, 522, 523, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 32, 33, -1, -1, -1, 37, -1, -1, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, - 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, - 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, - -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, - 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, - 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, - 281, 282, 283, 284, 285, -1, 287, 288, 289, -1, - 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, -1, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, - 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, - 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, - 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, - 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, -1, -1, -1, - -1, 3, -1, -1, 505, 506, 507, -1, -1, -1, - -1, -1, -1, 514, -1, -1, -1, -1, -1, 520, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, 161, - 162, 163, 164, 165, 166, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, 286, 287, 288, -1, -1, 291, - 292, 293, -1, 295, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, 444, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 515, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, + 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, + 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, + 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, + 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, + 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 514, 515, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, 34, 35, -1, 37, -1, -1, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, 171, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, -1, 3, 500, 5, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 514, -1, -1, -1, 22, 23, 24, 25, + 497, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, + -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, + 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, - -1, -1, -1, -1, -1, -1, 42, 43, 44, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, + -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, -1, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, - 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, -1, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, - -1, 167, -1, 169, 170, 171, 172, 173, 174, 175, - 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, -1, 233, 234, 235, - 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 216, -1, 218, -1, 220, -1, -1, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, - 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, - -1, 287, 288, -1, 290, 291, 292, 293, -1, -1, + 276, -1, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, -1, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, -1, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, - 446, 447, 448, 449, 450, 451, 452, 453, -1, 455, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, - 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, -1, 3, 500, 5, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, + 496, 497, -1, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, 3, 4, 5, 512, -1, 514, 9, + -1, -1, -1, 519, 520, -1, 522, 523, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, + -1, 31, 32, 33, -1, -1, -1, 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, -1, 66, 67, 68, 69, + 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, @@ -404676,7 +407359,7 @@ static const yytype_int16 yycheck[] = 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, @@ -404684,13 +407367,13 @@ static const yytype_int16 yycheck[] = 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, -1, 233, 234, 235, 236, -1, 238, 239, + 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - 290, 291, 292, 293, -1, -1, 296, 297, 298, 299, + 280, 281, 282, 283, 284, 285, -1, 287, 288, 289, + -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, @@ -404699,20 +407382,169 @@ static const yytype_int16 yycheck[] = 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, + 490, 491, 492, 493, 494, 495, 496, 497, -1, -1, + -1, -1, 3, -1, -1, 505, 506, 507, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, -1, + 520, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, -1, -1, -1, -1, -1, -1, 40, + -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, + 51, 52, 53, 54, -1, 56, 57, -1, 59, 60, + 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + -1, -1, 83, 84, 85, 86, 87, 88, -1, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, + 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, + 161, 162, 163, 164, 165, 166, 167, -1, 169, -1, + -1, -1, 173, 174, 175, -1, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, -1, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, -1, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, -1, 220, + -1, -1, 223, -1, 225, 226, 227, 228, 229, 230, + -1, -1, 233, -1, 235, -1, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, -1, 269, 270, + 271, 272, 273, -1, 275, 276, -1, 278, -1, 280, + 281, 282, 283, 284, 285, 286, 287, 288, -1, -1, + 291, 292, 293, -1, 295, 296, 297, 298, -1, 300, + -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, + -1, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, + -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, -1, 414, 415, -1, 417, -1, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, + 441, 442, 443, 444, -1, 446, 447, 448, -1, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, -1, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, + -1, -1, -1, -1, 515, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, + 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, + 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, + -1, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, -1, -1, 83, 84, 85, + 86, 87, 88, -1, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, -1, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, -1, -1, -1, 173, 174, 175, + -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, -1, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, -1, -1, 223, -1, 225, + 226, 227, 228, 229, 230, -1, -1, 233, -1, 235, + -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, -1, 269, 270, 271, 272, 273, -1, 275, + 276, -1, 278, -1, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, -1, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 514, 515, + -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, 34, 35, -1, 37, -1, -1, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, + -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, + 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, + 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, + 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, -1, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, + 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 3, 500, + 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 514, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, @@ -404723,238 +407555,40 @@ static const yytype_int16 yycheck[] = 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, + 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, + 165, -1, 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, + 225, 226, 227, 228, 229, 230, 231, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, + 285, -1, 287, 288, -1, 290, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, -1, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, - -1, 56, 57, -1, 59, 60, 61, 62, 63, 64, - -1, -1, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, -1, -1, 83, 84, - 85, 86, 87, 88, -1, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, -1, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, -1, 171, -1, 173, 174, - 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, -1, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, -1, -1, 223, -1, - 225, 226, 227, 228, 229, 230, -1, -1, 233, -1, - 235, -1, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, -1, 269, 270, 271, 272, 273, -1, - 275, 276, -1, 278, -1, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, + 315, 316, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, + 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, -1, 414, - 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 3, -1, 500, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, - 50, 51, 52, 53, 54, -1, 56, 57, -1, 59, - 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, -1, -1, 83, 84, 85, 86, 87, 88, -1, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, -1, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - -1, 171, -1, 173, 174, 175, -1, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, -1, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, -1, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, -1, -1, 223, -1, 225, 226, 227, 228, 229, - 230, -1, -1, 233, -1, 235, -1, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, -1, 269, - 270, 271, 272, 273, -1, 275, 276, -1, 278, -1, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, -1, - 300, -1, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, 318, 319, - 320, -1, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, -1, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, 416, 417, -1, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, 449, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, -1, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, - 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, - -1, 56, 57, -1, 59, 60, 61, 62, 63, 64, - -1, -1, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, -1, -1, 83, 84, - 85, 86, 87, 88, -1, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, -1, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, -1, 171, -1, 173, 174, - 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, -1, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, -1, -1, 223, -1, - 225, 226, 227, 228, 229, 230, -1, -1, 233, -1, - 235, -1, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, -1, 269, 270, 271, 272, 273, -1, - 275, 276, -1, 278, -1, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, -1, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, + 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, @@ -404962,251 +407596,152 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + -1, 290, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, - 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, - 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, - 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, - 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, - -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, - -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, - 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, - 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, - 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + -1, -1, -1, -1, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, - 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, - -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, - -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, @@ -405218,11 +407753,11 @@ static const yytype_int16 yycheck[] = 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 124, 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 164, 165, -1, 167, -1, 169, -1, 171, -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, @@ -405237,28 +407772,28 @@ static const yytype_int16 yycheck[] = 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 314, 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 374, 375, 376, 377, 378, 379, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + 404, 405, 406, 407, 408, 409, 410, 411, 412, -1, + 414, 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + 494, 495, 496, 497, 3, -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + 29, 30, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, @@ -405272,7 +407807,7 @@ static const yytype_int16 yycheck[] = -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 169, -1, 171, -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, @@ -405286,26 +407821,26 @@ static const yytype_int16 yycheck[] = -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 309, 310, 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 409, 410, 411, -1, -1, 414, 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 469, 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, @@ -405321,7 +407856,7 @@ static const yytype_int16 yycheck[] = 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 164, 165, -1, 167, -1, 169, -1, 171, -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, @@ -405336,386 +407871,373 @@ static const yytype_int16 yycheck[] = 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 314, 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 374, 375, 376, 377, 378, 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + 414, 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + 494, 495, 496, 497, -1, 3, 500, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, - 3, 4, 5, -1, -1, 8, 9, -1, -1, -1, - -1, -1, 15, 16, -1, 514, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - -1, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, -1, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 514, -1, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, -1, - 153, 154, 155, 156, 157, -1, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, -1, -1, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, -1, 299, 300, 301, -1, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, -1, 321, 322, - 323, -1, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, -1, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, -1, - 433, -1, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, -1, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, - 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 494, 495, 496, 497, -1, 3, -1, 501, 502, - 503, 8, 505, 506, 507, 508, 509, 510, 15, 16, - -1, -1, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, -1, -1, -1, 501, 502, 503, -1, 505, 506, - 507, 508, 509, 510, 8, -1, -1, 11, -1, -1, - -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 46, 8, -1, -1, 11, -1, -1, 53, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, -1, 80, -1, -1, -1, - -1, 46, 8, -1, -1, 11, -1, -1, 53, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, -1, 80, -1, -1, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, 36, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 46, 8, -1, - -1, 11, 176, -1, 53, 15, 16, 17, 18, 19, - 20, 21, -1, -1, -1, -1, -1, -1, -1, 193, - -1, -1, -1, -1, 198, -1, 36, -1, -1, -1, - -1, 80, -1, -1, -1, -1, 46, -1, -1, -1, - -1, 176, -1, 53, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, - -1, -1, 236, 198, -1, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 176, -1, -1, -1, -1, -1, 221, 222, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, - 274, 236, 198, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, - 294, -1, -1, -1, -1, 221, 222, 176, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, - 236, -1, 277, -1, 193, -1, -1, -1, -1, 198, - -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, - -1, -1, 221, 222, -1, -1, -1, -1, 274, -1, - -1, 277, -1, 193, -1, -1, -1, 236, 198, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, 391, -1, -1, - -1, -1, -1, -1, -1, 274, 236, -1, 277, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, - -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, -1, -1, -1, - -1, 515, 391, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, 498, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 36, -1, -1, -1, - 515, 391, -1, -1, -1, -1, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, 515, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 8, -1, -1, 11, -1, -1, - -1, 15, 16, 17, 18, 19, 20, 21, -1, 498, - -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, - 509, 510, 36, -1, -1, -1, 515, -1, -1, -1, - -1, -1, 46, 8, -1, -1, 11, -1, -1, 53, - 15, 16, 17, 18, 19, 20, 21, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, 36, -1, -1, -1, 515, 80, -1, -1, -1, - -1, 46, 8, -1, -1, 11, 176, -1, 53, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 36, -1, -1, -1, -1, 80, -1, -1, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, - -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, 176, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, -1, 274, -1, -1, 277, -1, 193, - -1, -1, -1, -1, 198, -1, 36, -1, -1, -1, - -1, 291, -1, -1, 294, -1, 46, -1, -1, -1, - -1, 176, -1, 53, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, - -1, -1, 236, 198, -1, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 176, -1, -1, -1, -1, -1, 221, 222, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, - 274, 236, 198, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, - 294, -1, -1, -1, -1, 221, 222, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, -1, 274, - 236, -1, 277, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 274, -1, - -1, 277, -1, 193, -1, -1, -1, -1, 198, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, 391, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, -1, -1, 515, 391, -1, -1, -1, - -1, -1, -1, -1, 274, -1, 8, 277, -1, 11, - -1, -1, -1, 15, 16, 17, 18, 19, 20, 21, - -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 36, 391, 24, -1, -1, -1, - -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, - -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, -1, 80, -1, - -1, 515, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, 81, -1, 15, 16, 17, 18, 19, - 20, 21, -1, 498, -1, -1, 501, 502, 503, 97, - 505, 506, 507, 508, 509, 510, 36, -1, -1, -1, - 515, 391, -1, -1, -1, -1, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, 513, 146, -1, - 80, -1, -1, -1, -1, -1, -1, -1, 156, -1, - -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, - 168, -1, -1, -1, -1, 173, -1, -1, -1, -1, - -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, -1, -1, -1, -1, 221, - 222, -1, -1, -1, -1, -1, -1, -1, 498, -1, - -1, 501, 502, 503, 236, 505, 506, 507, 508, 509, - 510, -1, -1, 513, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 176, 245, -1, -1, - -1, 249, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 274, 193, -1, 277, -1, -1, 198, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 291, - -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, - -1, 319, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 334, -1, -1, -1, - -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, -1, 367, - -1, -1, 370, -1, -1, -1, -1, -1, -1, 391, - -1, -1, -1, 381, -1, -1, 384, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 402, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 416, -1, - -1, -1, -1, -1, 422, 423, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 433, -1, -1, -1, -1, - -1, 439, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, 466, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, - -1, 513, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, -1, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, 513, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, - 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 3, -1, -1, -1, -1, -1, -1, -1, -1, 507, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, + 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, @@ -405764,8 +408286,8 @@ static const yytype_int16 yycheck[] = -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, - -1, -1, -1, -1, 507, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, @@ -405813,270 +408335,14 @@ static const yytype_int16 yycheck[] = 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 3, 4, 5, -1, -1, -1, 9, -1, -1, 507, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, 37, -1, -1, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, - 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, -1, 275, 276, 277, 278, -1, 280, 281, 282, - 283, 284, 285, -1, 287, 288, 289, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, -1, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, -1, -1, 8, -1, -1, - 11, -1, 505, 506, 15, 16, 17, 18, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, - 41, -1, -1, -1, -1, 46, 8, -1, -1, 11, - -1, -1, 53, 15, 16, 17, 18, 19, 20, 21, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, -1, -1, 80, - -1, -1, -1, -1, 46, 8, -1, -1, 11, -1, - -1, 53, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, -1, -1, 80, -1, - -1, -1, -1, 46, -1, 126, -1, -1, -1, -1, - 53, -1, -1, 8, -1, -1, 11, -1, -1, -1, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, - -1, 36, -1, -1, -1, 40, -1, -1, -1, -1, - -1, 46, -1, 8, -1, 176, 11, -1, 53, -1, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, -1, -1, - -1, 36, -1, -1, 166, 80, -1, -1, -1, 171, - -1, 46, -1, -1, 176, -1, -1, -1, 53, -1, - 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 193, -1, -1, -1, 236, 198, -1, -1, -1, - -1, -1, 165, -1, -1, 80, -1, -1, -1, -1, - -1, -1, -1, 176, -1, -1, -1, -1, -1, 221, - 222, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 193, -1, -1, 274, 236, 198, 277, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 291, -1, -1, 294, -1, -1, -1, -1, 221, 222, - -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 274, 236, -1, 277, -1, -1, 193, -1, - -1, -1, -1, 198, -1, -1, -1, -1, -1, 291, - -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, - -1, 176, -1, -1, -1, -1, 221, 222, -1, -1, - -1, 274, -1, -1, 277, -1, -1, -1, 193, -1, - -1, 236, -1, 198, -1, -1, -1, -1, 291, -1, - -1, 294, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 221, 222, -1, -1, - 391, -1, -1, -1, -1, -1, -1, -1, -1, 274, - 323, 236, 277, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 391, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, - -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 454, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 317, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, - -1, 8, -1, -1, 11, -1, -1, -1, 15, 16, - 17, 18, 19, 20, 21, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, 36, - -1, -1, -1, 40, -1, -1, 391, -1, -1, 46, - -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, - -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, 498, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 36, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, - 80, -1, -1, -1, -1, 8, -1, -1, 11, 176, - -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, - -1, 198, -1, 36, -1, -1, -1, 40, -1, -1, - -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, - 53, -1, -1, -1, 221, 222, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, - -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 171, 8, -1, -1, 11, 176, -1, -1, 15, - 16, 17, 18, 19, 20, 21, -1, 274, -1, -1, - 277, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 36, -1, -1, -1, 291, -1, -1, 294, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, - -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, -1, -1, 176, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 193, -1, -1, -1, 274, 198, -1, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, 221, 222, - -1, -1, -1, -1, 391, -1, -1, 8, -1, -1, - 11, -1, -1, 236, 15, 16, 17, 18, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 166, -1, -1, -1, -1, 36, -1, -1, -1, -1, - 176, -1, -1, -1, -1, 46, -1, -1, -1, -1, - -1, 274, 53, -1, 277, -1, -1, 193, -1, -1, - -1, -1, 198, -1, -1, -1, -1, -1, 291, -1, - -1, 294, -1, -1, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, 221, 222, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, - 236, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 498, -1, -1, 501, 502, 503, -1, 505, 506, - 507, 508, 509, 510, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 274, -1, - -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, - -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 221, 222, -1, -1, -1, -1, -1, -1, -1, 8, - -1, -1, 11, -1, -1, 236, 15, 16, 17, 18, - 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, 36, -1, -1, - -1, 40, -1, -1, -1, -1, -1, 46, -1, -1, - -1, -1, -1, 274, 53, 498, 277, -1, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, - -1, 80, -1, 8, -1, -1, 11, -1, -1, -1, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, 80, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 391, -1, 8, -1, -1, 11, -1, 176, -1, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, -1, -1, 193, -1, -1, -1, -1, 198, - 36, -1, -1, 424, -1, -1, -1, -1, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, - -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, - -1, -1, -1, 198, -1, 274, -1, 498, 277, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, 291, -1, -1, 294, 221, 222, -1, -1, - -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, - -1, 236, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, - 176, -1, -1, 46, -1, -1, -1, -1, -1, 274, - 53, -1, 277, -1, -1, -1, -1, 193, -1, -1, - -1, -1, 198, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, 8, 80, -1, 11, - -1, -1, -1, 15, 16, 221, 222, 19, 20, 21, - -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, - 236, -1, -1, -1, 36, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, - -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 274, -1, - -1, 277, -1, -1, -1, -1, -1, -1, 80, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, 391, 8, -1, -1, - 11, -1, -1, 176, 15, 16, -1, -1, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 193, -1, -1, -1, -1, 198, -1, -1, -1, 498, - -1, -1, 501, 502, 503, 46, 505, 506, 507, 508, - 509, 510, 53, -1, -1, -1, -1, -1, 221, 222, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 236, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, -1, -1, -1, - -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, - -1, 274, -1, 498, 277, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, 291, 221, - 222, 294, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 236, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, - -1, -1, 274, -1, -1, 277, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, -1, 291, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, - 221, 222, -1, -1, -1, -1, -1, -1, 391, -1, - -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 277, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 291, -1, -1, -1, -1, -1, -1, -1, -1, 391, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3, -1, 5, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + -1, 3, 4, 5, -1, -1, 8, 9, -1, -1, + -1, -1, -1, 15, 16, -1, 514, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 52, -1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 72, 73, 74, 75, 76, 77, 78, -1, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, @@ -406084,24 +408350,24 @@ static const yytype_int16 yycheck[] = 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 153, 154, 155, 156, 157, -1, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 172, 173, 174, 175, 176, 177, 178, 179, 180, -1, + -1, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 292, 293, 294, 295, 296, 297, -1, 299, 300, 301, + -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, -1, 321, + 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, @@ -406109,959 +408375,279 @@ static const yytype_int16 yycheck[] = 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + -1, 433, -1, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 452, 453, 454, 455, 456, 457, 458, 459, -1, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + 482, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 494, 495, 496, 497, -1, 3, -1, 501, + 502, 503, 8, 505, 506, 507, 508, 509, 510, 15, + 16, -1, -1, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, + 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, + 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, + -1, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, -1, -1, 83, 84, 85, + 86, 87, 88, -1, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, -1, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, -1, -1, -1, 173, 174, 175, + -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, -1, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, -1, -1, 223, -1, 225, + 226, 227, 228, 229, 230, -1, -1, 233, -1, 235, + -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, -1, 269, 270, 271, 272, 273, -1, 275, + 276, -1, 278, -1, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, -1, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, 8, -1, -1, 11, -1, + -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, - 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, - 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 46, 8, -1, -1, 11, -1, -1, + 53, 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, 36, -1, -1, -1, -1, 80, -1, -1, + -1, -1, 46, 8, -1, -1, 11, -1, -1, 53, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, - 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, - 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 36, -1, -1, -1, -1, 80, -1, -1, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + 8, -1, -1, 11, -1, -1, -1, 15, 16, 17, + 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 80, -1, -1, 36, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 46, 8, + -1, -1, 11, 176, -1, 53, 15, 16, 17, 18, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + 193, -1, -1, -1, -1, 198, -1, 36, -1, -1, + -1, -1, 80, -1, -1, -1, -1, 46, -1, -1, + -1, -1, 176, -1, 53, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 193, + -1, -1, -1, 236, 198, -1, -1, -1, -1, -1, + -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, -1, -1, -1, -1, -1, 221, 222, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, + -1, 274, 236, 198, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, + -1, 294, -1, -1, -1, -1, 221, 222, 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 274, 236, -1, 277, -1, 193, -1, -1, -1, -1, + 198, -1, -1, -1, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, 176, -1, -1, + -1, -1, -1, 221, 222, -1, -1, -1, -1, 274, + -1, -1, 277, -1, 193, -1, -1, -1, 236, 198, + -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, 289, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 221, 222, -1, -1, -1, -1, 391, -1, + -1, -1, -1, -1, -1, -1, 274, 236, -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, 34, 35, -1, 37, -1, -1, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, 291, -1, -1, 294, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 391, -1, -1, + -1, -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, 66, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, -1, -1, 82, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, 168, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, 445, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, + -1, -1, 515, 391, -1, -1, -1, -1, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, 36, -1, -1, + -1, 515, 391, -1, -1, -1, -1, 46, -1, -1, + -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, + 515, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, + 498, -1, -1, 501, 502, 503, -1, 505, 506, 507, + 508, 509, 510, 36, -1, -1, -1, 515, -1, -1, + -1, -1, -1, 46, 8, -1, -1, 11, -1, -1, + 53, 15, 16, 17, 18, 19, 20, 21, -1, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, 36, -1, -1, -1, 515, 80, -1, -1, + -1, -1, 46, 8, -1, -1, 11, 176, -1, 53, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, 193, -1, -1, -1, -1, 198, + -1, 36, -1, -1, -1, -1, 80, -1, -1, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, + -1, -1, 11, 176, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, -1, 274, -1, -1, 277, -1, + 193, -1, -1, -1, -1, 198, -1, 36, -1, -1, + -1, -1, 291, -1, -1, 294, -1, 46, -1, -1, + -1, -1, 176, -1, 53, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 193, + -1, -1, -1, 236, 198, -1, -1, -1, -1, -1, + -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, -1, -1, -1, -1, -1, 221, 222, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, + -1, 274, 236, 198, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, + -1, 294, -1, -1, -1, -1, 221, 222, -1, -1, + -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, + 274, 236, -1, 277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, 176, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + -1, -1, 277, -1, 193, -1, -1, -1, -1, 198, + -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, 168, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, 445, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, 221, 222, -1, -1, -1, -1, 391, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, -1, -1, -1, -1, 515, 391, -1, -1, + -1, -1, -1, -1, -1, 274, -1, 8, 277, -1, + 11, -1, -1, -1, 15, 16, 17, 18, 19, 20, + 21, -1, 291, -1, -1, 294, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, 391, -1, -1, -1, + -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, + -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, 80, + -1, -1, 515, -1, -1, -1, -1, -1, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, 36, -1, -1, + -1, 515, 391, -1, -1, -1, -1, 46, -1, -1, + -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, -1, -1, 513, -1, + -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, 34, 35, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, 290, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + 221, 222, -1, -1, -1, -1, -1, -1, -1, 498, + -1, -1, 501, 502, 503, 236, 505, 506, 507, 508, + 509, 510, -1, -1, 513, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, 290, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 274, 193, -1, 277, -1, -1, 198, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, 4, -1, -1, -1, -1, 9, -1, -1, + 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, + -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, -1, -1, 274, -1, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 498, -1, -1, + 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + -1, -1, 513, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3, -1, -1, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, -1, -1, 513, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, @@ -407108,8 +408694,8 @@ static const yytype_int16 yycheck[] = -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, @@ -407158,1584 +408744,2937 @@ static const yytype_int16 yycheck[] = 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 497, 3, 4, 5, -1, -1, -1, 9, -1, -1, + 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, + 32, 33, -1, -1, -1, 37, -1, -1, -1, -1, + 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, + 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, + -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, + 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, + 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, + 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, + -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, + 282, 283, 284, 285, -1, 287, 288, 289, -1, 291, + 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, + 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, + 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, + 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, + -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, + -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 492, 493, 494, 495, 496, 497, -1, -1, 8, -1, + -1, 11, -1, 505, 506, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + -1, 41, -1, -1, -1, -1, 46, 8, -1, -1, + 11, -1, -1, 53, 15, 16, 17, 18, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, + 80, -1, -1, -1, -1, 46, 8, -1, -1, 11, + -1, -1, 53, 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, -1, -1, 80, + -1, -1, -1, -1, 46, -1, 126, -1, -1, -1, + -1, 53, -1, -1, 8, -1, -1, 11, -1, -1, + -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, + -1, -1, 46, -1, 8, -1, 176, 11, -1, 53, + -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, 193, -1, -1, -1, -1, 198, -1, + -1, -1, 36, -1, -1, 166, 80, -1, -1, -1, + 171, -1, 46, -1, -1, 176, -1, -1, -1, 53, + -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 193, -1, -1, -1, 236, 198, -1, -1, + -1, -1, -1, 165, -1, -1, 80, -1, -1, -1, + -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, + 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 193, -1, -1, 274, 236, 198, 277, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 291, -1, -1, 294, -1, -1, -1, -1, 221, + 222, -1, 176, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 274, 236, -1, 277, -1, -1, 193, + -1, -1, -1, -1, 198, -1, -1, -1, -1, -1, + 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, + -1, -1, 176, -1, -1, -1, -1, 221, 222, -1, + -1, -1, 274, -1, -1, 277, -1, -1, -1, 193, + -1, -1, 236, -1, 198, -1, -1, -1, -1, 291, + -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 221, 222, -1, + -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, + 274, 323, 236, 277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 274, -1, -1, 277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 454, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, -1, -1, 391, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 317, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 498, -1, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, -1, -1, -1, -1, -1, -1, 391, -1, -1, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, 17, 18, 19, 20, 21, -1, 498, -1, -1, + 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + 36, -1, -1, -1, 40, -1, -1, 391, -1, -1, + 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, + -1, -1, -1, -1, -1, -1, 498, -1, -1, 501, + 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, + -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, 36, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, + -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, -1, -1, -1, + -1, 80, -1, -1, -1, -1, 8, -1, -1, 11, + 176, -1, -1, 15, 16, 17, 18, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, + -1, -1, 198, -1, 36, -1, -1, -1, 40, -1, + -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, + -1, 53, -1, -1, -1, 221, 222, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 236, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 171, 8, -1, -1, 11, 176, -1, -1, + 15, 16, 17, 18, 19, 20, 21, -1, 274, -1, + -1, 277, -1, -1, 193, -1, -1, -1, -1, 198, + -1, 36, -1, -1, -1, 291, -1, -1, 294, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, + -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 193, -1, -1, -1, 274, 198, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 291, -1, -1, 294, -1, -1, -1, 221, + 222, -1, -1, -1, -1, 391, -1, -1, 8, -1, + -1, 11, -1, -1, 236, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 166, -1, -1, -1, -1, 36, -1, -1, -1, + -1, 176, -1, -1, -1, -1, 46, -1, -1, -1, + -1, -1, 274, 53, -1, 277, -1, -1, 193, -1, + -1, -1, -1, 198, -1, -1, -1, -1, -1, 291, + -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, + 80, -1, -1, -1, -1, -1, 221, 222, -1, -1, + -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, + -1, 236, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 391, + -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 193, -1, -1, -1, -1, 198, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, + 8, -1, -1, 11, -1, -1, 236, 15, 16, 17, + 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 391, -1, 36, -1, + -1, -1, 40, -1, -1, -1, -1, -1, 46, -1, + -1, -1, -1, -1, 274, 53, 498, 277, -1, 501, + 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, + -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, + -1, -1, 80, -1, 8, -1, -1, 11, -1, -1, + -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 46, -1, -1, -1, -1, -1, -1, 53, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, 80, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 391, -1, 8, -1, -1, 11, -1, 176, -1, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, 193, -1, -1, -1, -1, + 198, 36, -1, -1, 424, -1, -1, -1, -1, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, -1, 221, 222, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 236, -1, + -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, + -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 193, + -1, -1, -1, -1, 198, -1, 274, -1, 498, 277, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, -1, -1, 291, -1, -1, 294, 221, 222, -1, + -1, -1, -1, -1, -1, -1, 8, -1, -1, 11, + -1, -1, 236, 15, 16, 17, 18, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, + -1, 176, -1, -1, 46, -1, -1, -1, -1, -1, + 274, 53, -1, 277, -1, -1, -1, -1, 193, -1, + -1, -1, -1, 198, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, -1, -1, -1, -1, 221, 222, -1, -1, + -1, -1, -1, 391, -1, -1, -1, -1, -1, -1, + -1, 236, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, -1, -1, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + 36, -1, 277, -1, -1, -1, -1, -1, -1, -1, + 46, -1, -1, -1, -1, -1, 291, 53, -1, 294, + -1, -1, -1, -1, -1, -1, -1, 391, -1, -1, + -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, + -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, + 498, -1, -1, 501, 502, 503, -1, 505, 506, 507, + 508, 509, 510, -1, -1, 8, -1, -1, 11, 221, + 222, -1, 15, 16, -1, -1, 19, 20, 21, -1, + -1, -1, -1, -1, 236, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 46, -1, 8, 391, -1, 11, -1, + 53, -1, 15, 16, -1, -1, 19, 20, 21, -1, + -1, -1, 274, -1, 498, 277, -1, 501, 502, 503, + 176, 505, 506, 507, 508, 509, 510, 80, -1, 291, + -1, -1, 294, 46, -1, -1, -1, 193, -1, -1, + 53, -1, 198, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 221, 222, 80, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 236, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, -1, -1, 274, -1, + -1, 277, -1, 176, -1, -1, -1, -1, -1, 391, + -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, + 193, -1, -1, -1, -1, 198, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 176, -1, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 193, -1, -1, 236, -1, 198, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 274, -1, 236, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 391, 498, -1, 291, 501, + 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 274, -1, -1, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, + -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, + -1, 5, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + 289, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + 34, 35, -1, 37, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, -1, -1, 82, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, 168, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, 445, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, 168, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, 445, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, 34, 35, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, 290, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, 290, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + 4, -1, -1, -1, -1, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, 416, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, 40, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, 40, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, 37, -1, -1, 40, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, -1, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, -1, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - -1, 153, 154, 155, 156, 157, -1, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, -1, - -1, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, -1, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, 275, 276, 277, 278, -1, -1, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, -1, 299, 300, 301, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, -1, 321, - 322, 323, -1, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - -1, 433, -1, -1, 436, 437, 438, 439, 440, 441, - 442, 443, 444, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, -1, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 3, -1, 5, -1, -1, -1, -1, -1, -1, - -1, -1, 494, 495, 496, 497, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, 37, -1, -1, 40, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, -1, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, -1, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, -1, 153, + 154, 155, 156, 157, -1, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, -1, -1, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, -1, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, + -1, 275, 276, 277, 278, -1, -1, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, -1, 299, 300, 301, -1, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, -1, 321, 322, 323, + -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, -1, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, -1, 433, + -1, -1, 436, 437, 438, 439, 440, 441, 442, 443, + 444, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, -1, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + 494, 495, 496, 497, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, 40, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, -1, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, -1, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, -1, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, -1, 153, 154, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, -1, 176, - 177, -1, 179, -1, -1, -1, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, -1, 299, 300, 301, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, -1, 321, 322, 323, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, -1, 433, -1, -1, 436, - 437, 438, 439, 440, 441, 442, 443, 444, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, -1, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 494, 495, 496, - 497, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, -1, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, -1, 153, 154, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, -1, 176, - 177, -1, 179, -1, -1, -1, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, -1, 299, 300, 301, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, -1, 321, 322, 323, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, -1, 433, -1, -1, 436, - 437, 438, 439, 440, 441, 442, 443, 444, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, -1, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 494, 495, 496, - 497, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, -1, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, -1, 153, 154, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, -1, -1, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, -1, 299, 300, 301, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, -1, 321, 322, 323, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, -1, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - -1, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, -1, 433, -1, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, -1, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 494, 495, 496, - 497, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, -1, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, -1, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - -1, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, -1, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, -1, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + -1, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, -1, 153, 154, 155, 156, 157, -1, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, -1, 176, 177, -1, + 179, -1, -1, -1, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, 275, 276, 277, 278, + -1, -1, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, -1, + 299, 300, 301, -1, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, -1, 321, 322, 323, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, -1, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, -1, 433, -1, -1, 436, 437, 438, + 439, 440, 441, 442, 443, 444, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, -1, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 494, 495, 496, 497, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, -1, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + -1, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, -1, 153, 154, 155, 156, 157, -1, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, -1, 176, 177, -1, + 179, -1, -1, -1, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, 275, 276, 277, 278, + -1, -1, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, -1, + 299, 300, 301, -1, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, -1, 321, 322, 323, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, -1, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, -1, 433, -1, -1, 436, 437, 438, + 439, 440, 441, 442, 443, 444, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, -1, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 494, 495, 496, 497, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, -1, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + -1, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, -1, 153, 154, 155, 156, 157, -1, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, -1, -1, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, 275, 276, 277, 278, + -1, -1, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, -1, + 299, 300, 301, -1, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, -1, 321, 322, 323, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, -1, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, -1, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, -1, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, -1, 433, -1, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, -1, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 494, 495, 496, 497, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, -1, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + -1, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, -1, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, -1, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, 37, -1, -1, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, -1, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, -1, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - -1, 153, 154, 155, 156, 157, -1, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, -1, 176, 177, -1, 179, -1, -1, - -1, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, -1, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, -1, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, 275, 276, 277, 278, -1, -1, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, -1, 299, 300, 301, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, -1, 321, - 322, 323, -1, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, -1, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, - 382, 383, 384, 385, 386, -1, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, -1, 410, -1, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - -1, 433, -1, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, -1, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, 22, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 32, -1, 34, 35, -1, -1, -1, -1, 22, - -1, -1, 494, 495, 496, 497, -1, -1, -1, 32, - -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, - 61, -1, -1, -1, -1, -1, -1, -1, -1, 52, - -1, -1, -1, -1, 75, -1, -1, -1, 61, -1, - -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, - -1, -1, 75, -1, -1, -1, -1, 98, -1, 100, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, 37, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, -1, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, -1, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, -1, 153, + 154, 155, 156, 157, -1, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, -1, 176, 177, -1, 179, -1, -1, -1, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, -1, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, -1, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, + -1, 275, 276, 277, 278, -1, -1, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, -1, 299, 300, 301, -1, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, -1, 321, 322, 323, + -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, -1, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 384, 385, 386, -1, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, -1, 410, -1, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, -1, 433, + -1, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, -1, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, 22, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 32, + -1, 34, 35, -1, -1, -1, -1, 22, -1, -1, + 494, 495, 496, 497, -1, -1, -1, 32, -1, 52, + -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, + -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, + -1, -1, 75, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, -1, -1, - 111, -1, -1, -1, -1, 98, -1, 100, -1, -1, - -1, -1, -1, -1, -1, 126, 127, -1, 111, -1, - -1, -1, -1, -1, -1, -1, 137, -1, -1, -1, - -1, -1, 143, 126, 127, -1, -1, -1, -1, -1, - 151, -1, -1, -1, 137, -1, -1, -1, -1, -1, - 143, -1, -1, -1, -1, -1, 167, -1, 151, -1, - 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 167, -1, -1, -1, 171, -1, + 75, -1, -1, -1, -1, 98, -1, 100, -1, -1, + -1, 86, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, -1, 98, -1, 100, -1, -1, -1, -1, + -1, -1, -1, 126, 127, -1, 111, -1, -1, -1, + -1, -1, -1, -1, 137, -1, -1, -1, -1, -1, + 143, 126, 127, -1, -1, -1, -1, -1, 151, -1, + -1, -1, 137, -1, -1, -1, -1, -1, 143, -1, + -1, -1, -1, -1, 167, -1, 151, -1, 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 167, -1, -1, -1, 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 213, -1, -1, -1, -1, -1, -1, -1, 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 213, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 239, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 314, 315, 316, -1, -1, -1, -1, - -1, 322, -1, -1, 325, -1, -1, -1, -1, -1, -1, 314, 315, 316, -1, -1, -1, -1, -1, 322, - -1, -1, 325, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 354, -1, -1, -1, -1, -1, -1, - -1, -1, 363, -1, -1, -1, -1, -1, -1, -1, - -1, 354, -1, -1, -1, -1, -1, -1, 379, -1, - 363, -1, -1, -1, -1, 386, -1, -1, -1, 390, - -1, -1, -1, -1, -1, -1, 379, -1, -1, 400, + -1, -1, 325, -1, -1, -1, -1, -1, -1, 314, + 315, 316, -1, -1, -1, -1, -1, 322, -1, -1, + 325, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 354, -1, -1, -1, -1, -1, -1, -1, -1, + 363, -1, -1, -1, -1, -1, -1, -1, -1, 354, + -1, -1, -1, -1, -1, -1, 379, -1, 363, -1, -1, -1, -1, 386, -1, -1, -1, 390, -1, -1, - -1, 412, -1, -1, -1, 416, -1, 400, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 412, - -1, -1, -1, 416, -1, 436, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 449, -1, - -1, -1, -1, 436, 455, -1, -1, -1, -1, 460, - -1, -1, -1, 464, -1, -1, 449, -1, -1, -1, - -1, -1, 455, -1, -1, 476, -1, 460, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 476, -1, -1, -1, -1, -1, 500, + -1, -1, -1, -1, 379, -1, -1, 400, -1, -1, + -1, 386, -1, -1, -1, 390, -1, -1, -1, 412, + -1, -1, -1, 416, -1, 400, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 412, -1, -1, + -1, 416, -1, 436, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 449, -1, -1, -1, + -1, 436, 455, -1, -1, -1, -1, 460, -1, -1, + -1, 464, -1, -1, 449, -1, -1, -1, -1, -1, + 455, -1, -1, 476, -1, 460, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 514, -1, -1, -1, 500, -1, -1, + -1, 476, -1, -1, -1, -1, -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 514 + -1, 514, -1, -1, -1, 500, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 514 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -408750,10 +411689,10 @@ static const yytype_uint16 yystos[] = 528, 529, 540, 549, 551, 556, 572, 575, 576, 578, 582, 586, 593, 595, 597, 598, 646, 652, 655, 656, 674, 675, 676, 677, 679, 681, 682, 686, 739, 740, - 907, 910, 913, 920, 921, 923, 926, 927, 928, 935, - 939, 945, 948, 953, 957, 958, 959, 962, 965, 966, - 967, 971, 972, 974, 430, 479, 596, 202, 370, 381, - 416, 466, 108, 191, 960, 596, 3, 22, 23, 24, + 908, 911, 914, 921, 922, 924, 927, 928, 929, 936, + 940, 946, 949, 954, 958, 959, 960, 963, 966, 967, + 968, 972, 973, 975, 430, 479, 596, 202, 370, 381, + 416, 466, 108, 191, 961, 596, 3, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 67, @@ -408793,11 +411732,11 @@ static const yytype_uint16 yystos[] = 457, 458, 459, 460, 461, 463, 464, 465, 466, 467, 468, 469, 470, 471, 474, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 542, 816, 896, 900, - 977, 978, 979, 3, 175, 246, 409, 542, 922, 977, + 492, 493, 494, 495, 496, 497, 542, 817, 897, 901, + 978, 979, 980, 3, 175, 246, 409, 542, 923, 978, 289, 596, 55, 171, 514, 669, 177, 240, 294, 313, - 370, 420, 422, 439, 445, 448, 580, 644, 919, 5, - 30, 325, 542, 543, 895, 3, 30, 34, 35, 36, + 370, 420, 422, 439, 445, 448, 580, 644, 920, 5, + 30, 325, 542, 543, 896, 3, 30, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 49, 53, 54, 55, 56, 57, 58, 65, 66, 71, 72, 74, 79, 80, 81, 82, 83, 89, 93, 100, 101, 108, 112, @@ -408813,39 +411752,39 @@ static const yytype_uint16 yystos[] = 418, 424, 426, 427, 428, 429, 432, 434, 435, 438, 444, 445, 449, 454, 460, 461, 462, 464, 472, 473, 475, 476, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 548, 977, 981, 983, 24, 81, 97, + 491, 492, 493, 548, 978, 982, 984, 24, 81, 97, 146, 156, 168, 173, 202, 245, 249, 319, 334, 367, 370, 381, 384, 402, 416, 422, 423, 433, 439, 466, - 580, 647, 648, 651, 596, 895, 100, 137, 464, 514, + 580, 647, 648, 651, 596, 896, 100, 137, 464, 514, 529, 540, 549, 551, 572, 575, 576, 582, 586, 595, - 598, 646, 652, 655, 656, 674, 907, 910, 913, 920, - 921, 931, 935, 939, 945, 948, 953, 962, 965, 971, - 972, 974, 108, 75, 213, 66, 79, 81, 158, 231, + 598, 646, 652, 655, 656, 674, 908, 911, 914, 921, + 922, 932, 936, 940, 946, 949, 954, 963, 966, 972, + 973, 975, 108, 75, 213, 66, 79, 81, 158, 231, 280, 290, 302, 320, 366, 411, 432, 434, 438, 460, 514, 541, 542, 543, 675, 740, 742, 744, 754, 761, - 762, 816, 818, 819, 108, 5, 542, 544, 946, 946, - 542, 895, 30, 177, 240, 385, 426, 430, 542, 963, - 964, 969, 596, 30, 132, 695, 696, 177, 240, 370, - 385, 426, 940, 941, 969, 596, 542, 674, 686, 970, - 542, 761, 416, 692, 541, 172, 514, 950, 514, 342, - 687, 688, 895, 687, 675, 676, 965, 0, 517, 122, + 762, 817, 819, 820, 108, 5, 542, 544, 947, 947, + 542, 896, 30, 177, 240, 385, 426, 430, 542, 964, + 965, 970, 596, 30, 132, 695, 696, 177, 240, 370, + 385, 426, 941, 942, 970, 596, 542, 674, 686, 971, + 542, 761, 416, 692, 541, 172, 514, 951, 514, 342, + 687, 688, 896, 687, 675, 676, 966, 0, 517, 122, 212, 451, 147, 217, 295, 444, 698, 699, 744, 744, - 675, 677, 679, 518, 464, 929, 30, 426, 430, 674, - 970, 191, 541, 895, 191, 541, 191, 761, 191, 541, + 675, 677, 679, 518, 464, 930, 30, 426, 430, 674, + 971, 191, 541, 896, 191, 541, 191, 761, 191, 541, 274, 544, 512, 516, 545, 546, 514, 82, 108, 173, - 202, 245, 370, 381, 416, 439, 466, 925, 108, 674, + 202, 245, 370, 381, 416, 439, 466, 926, 108, 674, 541, 420, 422, 420, 422, 352, 191, 541, 541, 377, - 173, 245, 342, 381, 416, 466, 653, 202, 30, 895, + 173, 245, 342, 381, 416, 466, 653, 202, 30, 896, 191, 548, 251, 433, 107, 416, 416, 466, 374, 377, - 191, 542, 649, 902, 191, 892, 895, 191, 895, 514, - 585, 294, 422, 931, 3, 460, 932, 934, 935, 937, - 938, 977, 981, 929, 542, 544, 922, 946, 514, 514, + 191, 542, 649, 903, 191, 893, 896, 191, 896, 514, + 585, 294, 422, 932, 3, 460, 933, 935, 936, 938, + 939, 978, 982, 930, 542, 544, 923, 947, 514, 514, 166, 514, 675, 762, 514, 514, 541, 514, 514, 171, 514, 514, 514, 514, 675, 740, 744, 754, 507, 545, 40, 542, 755, 756, 755, 379, 518, 678, 37, 42, 101, 172, 208, 224, 234, 268, 314, 321, 361, 380, 449, 758, 756, 40, 542, 755, 757, 500, 766, 544, - 171, 503, 514, 514, 908, 964, 964, 964, 497, 223, + 171, 503, 514, 514, 909, 965, 965, 965, 497, 223, 516, 289, 4, 6, 7, 8, 9, 10, 39, 54, 56, 57, 65, 71, 72, 83, 112, 115, 117, 136, 152, 159, 164, 181, 182, 215, 216, 218, 246, 267, @@ -408853,248 +411792,248 @@ static const yytype_uint16 yystos[] = 435, 461, 498, 505, 506, 507, 512, 514, 519, 520, 522, 523, 542, 544, 675, 729, 778, 781, 784, 785, 786, 788, 789, 790, 791, 793, 794, 809, 811, 812, - 813, 814, 815, 816, 817, 819, 820, 835, 836, 847, - 869, 874, 882, 883, 884, 896, 897, 898, 881, 883, - 940, 940, 544, 940, 497, 171, 428, 503, 516, 545, - 761, 954, 3, 170, 172, 464, 935, 949, 951, 170, - 952, 809, 853, 854, 687, 518, 514, 904, 515, 515, - 515, 528, 171, 294, 559, 954, 30, 132, 693, 693, - 59, 693, 161, 166, 237, 286, 704, 706, 707, 732, - 734, 735, 736, 180, 289, 454, 289, 698, 699, 514, - 541, 417, 968, 497, 223, 152, 26, 32, 137, 293, - 350, 354, 386, 457, 534, 537, 538, 350, 152, 40, - 60, 106, 201, 250, 260, 272, 304, 350, 356, 381, - 386, 400, 537, 587, 590, 152, 350, 386, 537, 152, - 350, 386, 537, 152, 40, 961, 809, 875, 547, 548, - 546, 3, 30, 37, 42, 49, 55, 81, 83, 89, - 101, 132, 170, 172, 175, 176, 193, 208, 221, 222, - 224, 234, 236, 246, 268, 277, 299, 301, 321, 361, - 380, 391, 409, 418, 438, 462, 464, 515, 809, 856, - 857, 899, 905, 977, 982, 809, 416, 541, 542, 515, - 514, 633, 370, 580, 644, 274, 911, 40, 191, 542, - 579, 466, 191, 541, 191, 541, 976, 191, 541, 191, - 541, 89, 916, 152, 480, 90, 129, 307, 421, 191, - 542, 152, 516, 903, 63, 357, 518, 650, 152, 518, - 650, 152, 289, 583, 584, 809, 905, 352, 515, 518, - 4, 159, 289, 435, 505, 506, 544, 589, 592, 898, - 930, 932, 933, 936, 931, 428, 514, 664, 668, 171, - 809, 854, 514, 3, 68, 69, 109, 110, 113, 114, - 188, 189, 252, 253, 254, 255, 256, 257, 258, 259, - 262, 263, 375, 376, 470, 471, 494, 495, 544, 796, - 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, - 807, 859, 860, 756, 757, 809, 541, 809, 861, 505, - 506, 542, 810, 811, 836, 847, 863, 514, 809, 853, - 864, 809, 58, 171, 232, 429, 809, 854, 867, 809, - 515, 543, 514, 418, 712, 713, 713, 695, 696, 744, - 219, 690, 224, 37, 224, 380, 758, 224, 299, 759, - 744, 759, 224, 758, 514, 224, 759, 224, 148, 199, - 746, 224, 713, 514, 543, 514, 713, 296, 542, 544, - 947, 809, 942, 944, 856, 3, 37, 42, 49, 54, - 55, 56, 57, 71, 72, 81, 83, 89, 101, 112, - 115, 164, 170, 172, 176, 193, 208, 215, 216, 218, - 221, 222, 224, 234, 236, 246, 267, 268, 269, 277, - 282, 299, 301, 321, 339, 361, 365, 380, 387, 391, - 394, 409, 418, 426, 427, 438, 444, 461, 464, 772, - 774, 775, 777, 779, 781, 783, 785, 786, 787, 789, - 790, 793, 794, 858, 901, 977, 980, 40, 235, 542, - 514, 512, 675, 463, 792, 809, 873, 792, 792, 514, - 514, 780, 780, 324, 675, 514, 782, 520, 71, 72, - 792, 809, 780, 514, 514, 478, 500, 514, 795, 514, - 795, 809, 809, 809, 148, 885, 886, 809, 854, 855, - 675, 809, 853, 543, 837, 838, 839, 9, 548, 516, - 545, 876, 545, 514, 544, 514, 514, 544, 898, 3, - 8, 11, 15, 16, 17, 18, 19, 20, 21, 36, - 40, 46, 53, 80, 176, 193, 198, 221, 222, 236, - 274, 277, 291, 294, 391, 498, 501, 502, 503, 505, - 506, 507, 508, 509, 510, 845, 846, 847, 849, 879, - 477, 821, 301, 809, 518, 690, 514, 544, 690, 3, - 117, 240, 544, 589, 794, 943, 104, 944, 944, 542, - 40, 542, 515, 518, 929, 518, 515, 688, 892, 893, - 40, 954, 192, 352, 219, 386, 677, 677, 30, 700, - 701, 809, 59, 677, 694, 163, 271, 720, 226, 272, - 338, 389, 451, 4, 9, 30, 715, 809, 505, 506, - 716, 717, 809, 811, 732, 733, 707, 706, 704, 705, - 166, 735, 284, 737, 59, 683, 684, 685, 747, 810, - 883, 883, 704, 732, 854, 904, 235, 541, 74, 82, - 93, 168, 191, 328, 445, 542, 615, 625, 640, 82, - 93, 550, 93, 550, 514, 428, 514, 613, 244, 448, - 613, 93, 518, 428, 541, 3, 777, 589, 59, 591, - 589, 589, 106, 250, 260, 59, 428, 476, 500, 588, - 265, 370, 588, 590, 761, 93, 428, 550, 370, 541, - 428, 370, 960, 542, 664, 513, 524, 856, 856, 857, - 518, 698, 699, 13, 14, 221, 221, 428, 428, 542, - 632, 637, 476, 667, 541, 377, 342, 381, 416, 466, - 653, 152, 100, 576, 598, 912, 913, 972, 144, 774, - 274, 198, 581, 541, 274, 577, 587, 274, 514, 633, - 40, 274, 633, 274, 514, 654, 191, 542, 627, 917, - 548, 152, 171, 594, 649, 547, 516, 902, 892, 895, - 895, 902, 515, 518, 13, 931, 937, 4, 898, 4, - 898, 544, 548, 666, 673, 55, 102, 123, 141, 145, - 167, 170, 186, 279, 287, 309, 336, 670, 947, 40, - 515, 809, 515, 171, 518, 515, 317, 862, 515, 810, - 810, 11, 15, 16, 19, 20, 21, 198, 221, 291, - 501, 502, 503, 505, 506, 507, 508, 509, 510, 847, - 810, 515, 763, 764, 818, 166, 171, 865, 866, 518, - 515, 40, 867, 854, 867, 867, 171, 515, 40, 755, - 514, 893, 4, 9, 542, 708, 710, 711, 883, 881, - 177, 240, 416, 420, 422, 448, 541, 691, 473, 767, - 744, 744, 224, 744, 289, 454, 760, 744, 224, 883, - 744, 744, 281, 281, 514, 744, 543, 768, 769, 514, - 543, 768, 518, 515, 518, 516, 514, 777, 514, 514, - 516, 39, 776, 514, 796, 797, 798, 799, 800, 801, - 802, 803, 804, 805, 806, 807, 808, 515, 518, 780, - 551, 655, 656, 674, 909, 953, 965, 854, 855, 514, - 472, 870, 871, 809, 855, 898, 809, 840, 841, 842, - 843, 792, 792, 8, 15, 16, 19, 20, 21, 501, - 502, 503, 505, 506, 507, 508, 509, 510, 542, 845, - 850, 515, 854, 426, 426, 898, 898, 514, 542, 352, - 890, 166, 513, 515, 518, 524, 518, 521, 507, 546, - 854, 898, 809, 808, 808, 774, 809, 809, 809, 809, - 809, 809, 809, 809, 5, 548, 906, 426, 45, 413, - 880, 902, 809, 809, 514, 675, 868, 132, 159, 274, - 279, 284, 435, 446, 809, 279, 514, 809, 428, 53, - 176, 193, 198, 236, 391, 809, 809, 809, 809, 809, - 809, 809, 809, 809, 809, 30, 38, 396, 844, 512, - 516, 878, 180, 162, 822, 365, 514, 836, 884, 171, - 741, 856, 741, 514, 544, 542, 541, 949, 541, 957, - 809, 518, 515, 249, 274, 689, 454, 956, 541, 553, - 514, 542, 558, 568, 569, 571, 41, 126, 702, 518, - 454, 702, 265, 677, 365, 366, 505, 506, 717, 719, - 811, 389, 226, 290, 312, 312, 518, 509, 4, 718, - 898, 718, 365, 366, 719, 541, 891, 278, 393, 738, - 514, 893, 894, 518, 180, 454, 198, 180, 219, 733, - 705, 515, 350, 537, 514, 191, 625, 895, 226, 274, - 226, 454, 514, 618, 773, 774, 895, 542, 191, 895, - 191, 542, 26, 137, 386, 533, 536, 548, 609, 623, - 895, 548, 617, 636, 895, 534, 895, 350, 386, 537, - 587, 589, 902, 895, 589, 902, 895, 589, 350, 386, - 537, 895, 895, 895, 895, 350, 386, 537, 895, 895, - 544, 506, 809, 875, 698, 698, 698, 462, 857, 192, - 355, 697, 809, 809, 279, 544, 924, 279, 924, 542, - 333, 663, 515, 518, 287, 171, 428, 658, 911, 579, - 466, 541, 541, 976, 541, 541, 541, 294, 644, 514, - 675, 152, 3, 514, 514, 152, 152, 236, 542, 615, - 625, 628, 631, 641, 643, 476, 478, 620, 151, 674, - 152, 476, 918, 152, 515, 856, 40, 274, 289, 542, - 3, 650, 547, 650, 289, 650, 583, 809, 664, 507, - 514, 589, 665, 815, 936, 515, 518, 40, 662, 544, - 662, 274, 279, 336, 662, 59, 662, 774, 515, 809, - 809, 809, 865, 774, 810, 810, 810, 810, 810, 810, - 132, 274, 284, 810, 810, 810, 810, 810, 810, 810, - 810, 810, 810, 515, 518, 40, 765, 809, 809, 866, - 865, 774, 515, 515, 515, 854, 774, 893, 515, 312, - 509, 312, 366, 509, 514, 514, 690, 420, 422, 420, - 422, 541, 692, 692, 692, 809, 180, 721, 760, 760, - 744, 809, 514, 744, 166, 760, 514, 543, 751, 760, - 774, 515, 518, 768, 515, 942, 3, 858, 39, 776, - 542, 771, 771, 3, 512, 512, 898, 428, 428, 428, - 428, 774, 515, 513, 854, 809, 139, 871, 872, 515, - 515, 515, 524, 518, 521, 516, 515, 515, 497, 497, - 515, 515, 893, 514, 809, 887, 542, 809, 809, 837, - 886, 515, 515, 515, 497, 810, 810, 145, 854, 171, - 132, 159, 279, 284, 435, 446, 514, 145, 850, 809, - 413, 880, 809, 868, 809, 428, 514, 675, 809, 875, - 547, 514, 514, 155, 823, 742, 743, 767, 698, 767, - 898, 808, 904, 904, 249, 514, 743, 473, 955, 40, - 59, 554, 564, 571, 876, 518, 741, 503, 499, 703, - 701, 291, 845, 848, 703, 4, 898, 719, 290, 451, - 716, 518, 243, 893, 683, 59, 883, 514, 543, 59, - 265, 428, 809, 274, 640, 514, 152, 514, 618, 202, - 637, 638, 599, 40, 175, 608, 634, 599, 26, 137, - 354, 356, 386, 530, 531, 532, 538, 539, 152, 650, - 152, 650, 609, 623, 609, 515, 518, 544, 602, 503, - 516, 515, 518, 428, 370, 93, 428, 550, 370, 428, - 428, 428, 370, 961, 524, 513, 524, 697, 697, 697, - 857, 281, 281, 515, 514, 657, 3, 403, 404, 544, - 672, 632, 663, 581, 541, 577, 514, 40, 633, 654, - 911, 352, 416, 544, 573, 574, 579, 673, 637, 541, - 541, 976, 541, 515, 518, 287, 613, 287, 289, 612, - 895, 476, 975, 541, 613, 40, 541, 515, 416, 809, - 152, 541, 594, 902, 660, 671, 936, 666, 544, 544, - 279, 637, 507, 637, 544, 507, 637, 544, 515, 515, - 866, 171, 132, 284, 514, 766, 763, 514, 515, 515, - 515, 542, 708, 767, 692, 692, 692, 692, 541, 541, - 541, 59, 185, 730, 760, 893, 514, 748, 749, 750, - 812, 814, 893, 166, 80, 770, 769, 515, 515, 512, - 774, 515, 518, 515, 898, 513, 898, 515, 797, 799, - 800, 801, 800, 801, 801, 515, 424, 809, 143, 809, - 840, 850, 795, 795, 515, 809, 887, 888, 889, 40, - 198, 515, 890, 808, 809, 36, 36, 809, 515, 809, - 171, 514, 858, 809, 515, 145, 810, 810, 145, 145, - 809, 809, 513, 524, 514, 877, 699, 473, 809, 300, - 827, 518, 721, 697, 721, 515, 909, 809, 358, 562, - 542, 265, 320, 117, 303, 514, 552, 674, 515, 518, - 558, 955, 809, 163, 230, 514, 703, 290, 541, 515, - 894, 180, 675, 676, 883, 894, 895, 895, 515, 152, - 638, 625, 638, 599, 627, 518, 515, 119, 206, 272, - 274, 624, 514, 33, 59, 645, 634, 74, 80, 93, - 117, 119, 206, 274, 279, 328, 344, 445, 454, 604, - 605, 619, 175, 117, 190, 274, 613, 588, 107, 117, - 175, 274, 402, 405, 590, 613, 386, 532, 439, 895, - 542, 536, 3, 37, 42, 49, 55, 81, 83, 89, - 101, 170, 172, 175, 176, 193, 208, 221, 222, 224, - 234, 236, 246, 268, 273, 277, 291, 299, 301, 321, - 361, 380, 387, 391, 409, 418, 438, 444, 464, 505, - 506, 544, 589, 600, 639, 774, 848, 899, 977, 983, - 548, 636, 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 664, 875, 875, 515, 515, 515, 698, 107, - 370, 516, 588, 672, 514, 514, 631, 674, 918, 40, - 644, 191, 541, 515, 518, 581, 515, 515, 577, 514, - 40, 622, 620, 628, 86, 585, 107, 272, 633, 674, - 654, 674, 627, 454, 915, 650, 515, 518, 637, 810, - 171, 514, 858, 768, 515, 518, 515, 721, 541, 541, - 541, 541, 30, 103, 181, 364, 514, 722, 723, 724, - 725, 726, 727, 728, 809, 809, 475, 824, 515, 811, - 851, 852, 198, 180, 745, 749, 515, 751, 752, 753, - 902, 776, 898, 776, 542, 776, 513, 513, 809, 518, - 515, 542, 809, 811, 809, 809, 809, 858, 515, 809, - 36, 36, 809, 809, 145, 515, 506, 875, 515, 856, - 515, 809, 515, 514, 542, 828, 730, 515, 730, 544, - 515, 882, 460, 415, 453, 563, 542, 557, 567, 289, - 560, 503, 571, 562, 850, 59, 515, 515, 459, 460, - 680, 599, 625, 515, 515, 476, 630, 120, 194, 204, - 119, 456, 809, 117, 40, 514, 902, 895, 810, 120, - 194, 119, 279, 226, 541, 630, 88, 645, 191, 279, - 589, 809, 645, 279, 505, 506, 592, 542, 774, 650, - 650, 3, 246, 409, 899, 903, 503, 428, 428, 513, - 513, 697, 515, 515, 542, 664, 454, 659, 661, 673, - 637, 515, 975, 40, 416, 809, 416, 274, 514, 544, - 514, 918, 631, 151, 674, 149, 200, 612, 122, 137, - 327, 975, 107, 918, 476, 973, 40, 289, 542, 914, - 514, 671, 810, 858, 515, 515, 9, 351, 714, 730, - 514, 388, 514, 515, 518, 542, 825, 826, 335, 731, - 518, 515, 514, 543, 59, 515, 198, 515, 752, 513, - 774, 887, 513, 191, 515, 809, 809, 809, 524, 513, - 524, 515, 515, 542, 829, 824, 544, 824, 518, 459, - 876, 515, 518, 91, 562, 809, 515, 894, 894, 344, - 630, 514, 621, 599, 515, 190, 514, 809, 274, 605, - 630, 633, 895, 40, 152, 770, 903, 509, 600, 895, - 895, 515, 588, 124, 515, 515, 620, 674, 674, 541, - 152, 673, 40, 515, 895, 975, 30, 85, 94, 118, - 190, 203, 402, 405, 616, 616, 366, 366, 40, 64, - 74, 240, 416, 809, 541, 514, 542, 561, 570, 818, - 515, 515, 514, 824, 854, 514, 854, 724, 40, 518, - 809, 454, 709, 811, 883, 893, 756, 514, 756, 809, - 875, 875, 309, 830, 731, 731, 674, 303, 674, 557, - 289, 514, 555, 541, 599, 548, 626, 629, 406, 468, - 606, 607, 514, 601, 809, 515, 248, 642, 190, 454, - 535, 509, 439, 664, 544, 918, 612, 973, 514, 541, - 515, 674, 620, 585, 674, 74, 292, 74, 674, 915, - 809, 80, 565, 515, 518, 565, 9, 731, 515, 723, - 515, 828, 826, 368, 515, 883, 513, 513, 513, 59, - 698, 709, 709, 563, 93, 570, 133, 633, 503, 515, - 518, 587, 515, 272, 614, 172, 308, 392, 289, 610, - 611, 635, 601, 809, 439, 40, 514, 973, 612, 975, - 973, 292, 292, 514, 515, 902, 566, 902, 918, 561, - 566, 515, 709, 515, 711, 515, 853, 183, 337, 366, - 831, 459, 895, 515, 275, 451, 642, 600, 629, 515, - 607, 204, 122, 451, 289, 635, 289, 610, 674, 570, - 565, 702, 767, 702, 53, 104, 441, 809, 832, 833, - 832, 832, 515, 674, 767, 386, 611, 63, 272, 357, - 386, 603, 603, 973, 515, 566, 703, 703, 833, 365, - 165, 323, 165, 323, 148, 834, 834, 834, 569, 599, - 25, 117, 279, 918, 702, 36, 104, 180, 272, 425, - 767, 767, 703, 833, 365, 297 + 813, 814, 815, 816, 817, 818, 820, 821, 836, 837, + 848, 870, 875, 883, 884, 885, 897, 898, 899, 882, + 884, 941, 941, 544, 941, 497, 171, 428, 503, 516, + 545, 761, 955, 3, 170, 172, 464, 936, 950, 952, + 170, 953, 809, 854, 855, 687, 518, 514, 905, 515, + 515, 515, 528, 171, 294, 559, 955, 30, 132, 693, + 693, 59, 693, 161, 166, 237, 286, 704, 706, 707, + 732, 734, 735, 736, 180, 289, 454, 289, 698, 699, + 514, 541, 417, 969, 497, 223, 152, 26, 32, 137, + 293, 350, 354, 386, 457, 534, 537, 538, 350, 152, + 40, 60, 106, 201, 250, 260, 272, 304, 350, 356, + 381, 386, 400, 537, 587, 590, 152, 350, 386, 537, + 152, 350, 386, 537, 152, 40, 962, 809, 876, 547, + 548, 546, 3, 30, 37, 42, 49, 55, 81, 83, + 89, 101, 132, 170, 172, 175, 176, 193, 208, 221, + 222, 224, 234, 236, 246, 268, 277, 299, 301, 321, + 361, 380, 391, 409, 418, 438, 462, 464, 515, 809, + 857, 858, 900, 906, 978, 983, 809, 416, 541, 542, + 515, 514, 633, 370, 580, 644, 274, 912, 40, 191, + 542, 579, 466, 191, 541, 191, 541, 977, 191, 541, + 191, 541, 89, 917, 152, 480, 90, 129, 307, 421, + 191, 542, 152, 516, 904, 63, 357, 518, 650, 152, + 518, 650, 152, 289, 583, 584, 809, 906, 352, 515, + 518, 4, 159, 289, 435, 505, 506, 544, 589, 592, + 899, 931, 933, 934, 937, 932, 428, 514, 664, 668, + 171, 809, 855, 514, 3, 68, 69, 109, 110, 113, + 114, 188, 189, 252, 253, 254, 255, 256, 257, 258, + 259, 262, 263, 375, 376, 470, 471, 494, 495, 544, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 860, 861, 756, 757, 809, 541, 809, 862, + 505, 506, 542, 810, 811, 837, 848, 864, 514, 809, + 854, 865, 809, 58, 171, 232, 429, 809, 855, 868, + 809, 515, 543, 514, 418, 712, 713, 713, 695, 696, + 744, 219, 690, 224, 37, 224, 380, 758, 224, 299, + 759, 744, 759, 224, 758, 514, 224, 759, 224, 148, + 199, 746, 224, 713, 514, 543, 514, 713, 296, 542, + 544, 948, 809, 943, 945, 857, 3, 37, 42, 49, + 54, 55, 56, 57, 71, 72, 81, 83, 89, 101, + 112, 115, 164, 170, 172, 176, 193, 208, 215, 216, + 218, 221, 222, 224, 234, 236, 246, 267, 268, 269, + 277, 282, 299, 301, 321, 339, 361, 365, 380, 387, + 391, 394, 409, 418, 426, 427, 438, 444, 461, 464, + 772, 774, 775, 777, 779, 781, 783, 785, 786, 787, + 789, 790, 793, 794, 859, 902, 978, 981, 40, 235, + 542, 514, 512, 675, 463, 792, 809, 874, 792, 792, + 514, 514, 780, 780, 324, 675, 514, 782, 520, 71, + 72, 792, 809, 780, 514, 514, 478, 500, 514, 795, + 514, 795, 809, 809, 809, 148, 886, 887, 809, 855, + 856, 675, 809, 854, 543, 838, 839, 840, 9, 548, + 516, 545, 877, 545, 514, 544, 514, 514, 544, 899, + 3, 8, 11, 15, 16, 17, 18, 19, 20, 21, + 36, 40, 46, 53, 80, 176, 193, 198, 221, 222, + 236, 274, 277, 291, 294, 391, 498, 501, 502, 503, + 505, 506, 507, 508, 509, 510, 846, 847, 848, 850, + 880, 477, 822, 301, 809, 518, 690, 514, 544, 690, + 3, 117, 240, 544, 589, 794, 944, 104, 945, 945, + 542, 40, 542, 515, 518, 930, 518, 515, 688, 893, + 894, 40, 955, 192, 352, 219, 386, 677, 677, 30, + 700, 701, 809, 59, 677, 694, 163, 271, 720, 226, + 272, 338, 389, 451, 4, 9, 30, 715, 809, 505, + 506, 716, 717, 809, 811, 732, 733, 707, 706, 704, + 705, 166, 735, 284, 737, 59, 683, 684, 685, 747, + 810, 884, 884, 704, 732, 855, 905, 235, 541, 74, + 82, 93, 168, 191, 328, 445, 542, 615, 625, 640, + 82, 93, 550, 93, 550, 514, 428, 514, 613, 244, + 448, 613, 93, 518, 428, 541, 3, 777, 589, 59, + 591, 589, 589, 106, 250, 260, 59, 428, 476, 500, + 588, 265, 370, 588, 590, 761, 93, 428, 550, 370, + 541, 428, 370, 961, 542, 664, 513, 524, 857, 857, + 858, 518, 698, 699, 13, 14, 221, 221, 428, 428, + 542, 632, 637, 476, 667, 541, 377, 342, 381, 416, + 466, 653, 152, 100, 576, 598, 913, 914, 973, 144, + 774, 274, 198, 581, 541, 274, 577, 587, 274, 514, + 633, 40, 274, 633, 274, 514, 654, 191, 542, 627, + 918, 548, 152, 171, 594, 649, 547, 516, 903, 893, + 896, 896, 903, 515, 518, 13, 932, 938, 4, 899, + 4, 899, 544, 548, 666, 673, 55, 102, 123, 141, + 145, 167, 170, 186, 279, 287, 309, 336, 670, 948, + 40, 515, 809, 515, 171, 518, 515, 317, 863, 515, + 810, 810, 11, 15, 16, 19, 20, 21, 198, 221, + 291, 501, 502, 503, 505, 506, 507, 508, 509, 510, + 848, 810, 515, 763, 764, 819, 166, 171, 866, 867, + 518, 515, 40, 868, 855, 868, 868, 171, 515, 40, + 755, 514, 894, 4, 9, 542, 708, 710, 711, 884, + 882, 177, 240, 416, 420, 422, 448, 541, 691, 473, + 767, 744, 744, 224, 744, 289, 454, 760, 744, 224, + 884, 744, 744, 281, 281, 514, 744, 543, 768, 769, + 514, 543, 768, 518, 515, 518, 516, 514, 777, 514, + 514, 516, 39, 776, 514, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 807, 808, 515, 518, + 780, 551, 655, 656, 674, 910, 954, 966, 855, 856, + 514, 472, 871, 872, 809, 856, 899, 809, 841, 842, + 843, 844, 792, 792, 8, 15, 16, 19, 20, 21, + 501, 502, 503, 505, 506, 507, 508, 509, 510, 542, + 846, 851, 515, 855, 426, 426, 899, 899, 514, 542, + 352, 891, 166, 513, 515, 518, 524, 518, 521, 507, + 546, 855, 899, 809, 808, 808, 774, 809, 809, 809, + 809, 809, 809, 809, 809, 5, 548, 907, 426, 45, + 413, 881, 903, 809, 809, 514, 675, 869, 132, 159, + 274, 279, 284, 435, 446, 809, 279, 514, 809, 428, + 53, 176, 193, 198, 236, 391, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 30, 38, 396, 845, + 512, 516, 879, 180, 162, 823, 365, 514, 837, 885, + 171, 741, 857, 741, 514, 544, 542, 541, 950, 541, + 958, 809, 518, 515, 249, 274, 689, 454, 957, 541, + 553, 514, 542, 558, 568, 569, 571, 41, 126, 702, + 518, 454, 702, 265, 677, 365, 366, 505, 506, 717, + 719, 811, 389, 226, 290, 312, 312, 518, 509, 4, + 718, 899, 718, 365, 366, 719, 541, 892, 278, 393, + 738, 514, 894, 895, 518, 180, 454, 198, 180, 219, + 733, 705, 515, 350, 537, 514, 191, 625, 896, 226, + 274, 226, 454, 514, 618, 773, 774, 896, 542, 191, + 896, 191, 542, 26, 137, 386, 533, 536, 548, 609, + 623, 896, 548, 617, 636, 896, 534, 896, 350, 386, + 537, 587, 589, 903, 896, 589, 903, 896, 589, 350, + 386, 537, 896, 896, 896, 896, 350, 386, 537, 896, + 896, 544, 506, 809, 876, 698, 698, 698, 462, 858, + 192, 355, 697, 809, 809, 279, 544, 925, 279, 925, + 542, 333, 663, 515, 518, 287, 171, 428, 658, 912, + 579, 466, 541, 541, 977, 541, 541, 541, 294, 644, + 514, 675, 152, 3, 514, 514, 152, 152, 236, 542, + 615, 625, 628, 631, 641, 643, 476, 478, 620, 151, + 674, 152, 476, 919, 152, 515, 857, 40, 274, 289, + 542, 3, 650, 547, 650, 289, 650, 583, 809, 664, + 507, 512, 514, 589, 665, 815, 816, 937, 515, 518, + 40, 662, 544, 662, 274, 279, 336, 662, 59, 662, + 774, 515, 809, 809, 809, 866, 774, 810, 810, 810, + 810, 810, 810, 132, 274, 284, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 515, 518, 40, 765, + 809, 809, 867, 866, 774, 515, 515, 515, 855, 774, + 894, 515, 312, 509, 312, 366, 509, 514, 514, 690, + 420, 422, 420, 422, 541, 692, 692, 692, 809, 180, + 721, 760, 760, 744, 809, 514, 744, 166, 760, 514, + 543, 751, 760, 774, 515, 518, 768, 515, 943, 3, + 859, 39, 776, 542, 771, 771, 3, 512, 512, 899, + 428, 428, 428, 428, 774, 515, 513, 855, 809, 139, + 872, 873, 515, 515, 515, 524, 518, 521, 516, 515, + 515, 497, 497, 515, 515, 894, 514, 809, 888, 542, + 809, 809, 838, 887, 515, 515, 515, 497, 810, 810, + 145, 855, 171, 132, 159, 279, 284, 435, 446, 514, + 145, 851, 809, 413, 881, 809, 869, 809, 428, 514, + 675, 809, 876, 547, 514, 514, 155, 824, 742, 743, + 767, 698, 767, 899, 808, 905, 905, 249, 514, 743, + 473, 956, 40, 59, 554, 564, 571, 877, 518, 741, + 503, 499, 703, 701, 291, 846, 849, 703, 4, 899, + 719, 290, 451, 716, 518, 243, 894, 683, 59, 884, + 514, 543, 59, 265, 428, 809, 274, 640, 514, 152, + 514, 618, 202, 637, 638, 599, 40, 175, 608, 634, + 599, 26, 137, 354, 356, 386, 530, 531, 532, 538, + 539, 152, 650, 152, 650, 609, 623, 609, 515, 518, + 544, 602, 503, 516, 515, 518, 428, 370, 93, 428, + 550, 370, 428, 428, 428, 370, 962, 524, 513, 524, + 697, 697, 697, 858, 281, 281, 515, 514, 657, 3, + 403, 404, 544, 672, 632, 663, 581, 541, 577, 514, + 40, 633, 654, 912, 352, 416, 544, 573, 574, 579, + 673, 637, 541, 541, 977, 541, 515, 518, 287, 613, + 287, 289, 612, 896, 476, 976, 541, 613, 40, 541, + 515, 416, 809, 152, 541, 594, 903, 660, 671, 937, + 666, 544, 544, 279, 637, 507, 637, 544, 507, 637, + 544, 515, 515, 867, 171, 132, 284, 514, 766, 763, + 514, 515, 515, 515, 542, 708, 767, 692, 692, 692, + 692, 541, 541, 541, 59, 185, 730, 760, 894, 514, + 748, 749, 750, 812, 814, 894, 166, 80, 770, 769, + 515, 515, 512, 774, 515, 518, 515, 899, 513, 899, + 515, 797, 799, 800, 801, 800, 801, 801, 515, 424, + 809, 143, 809, 841, 851, 795, 795, 515, 809, 888, + 889, 890, 40, 198, 515, 891, 808, 809, 36, 36, + 809, 515, 809, 171, 514, 859, 809, 515, 145, 810, + 810, 145, 145, 809, 809, 513, 524, 514, 878, 699, + 473, 809, 300, 828, 518, 721, 697, 721, 515, 910, + 809, 358, 562, 542, 265, 320, 117, 303, 514, 552, + 674, 515, 518, 558, 956, 809, 163, 230, 514, 703, + 290, 541, 515, 895, 180, 675, 676, 884, 895, 896, + 896, 515, 152, 638, 625, 638, 599, 627, 518, 515, + 119, 206, 272, 274, 624, 514, 33, 59, 645, 634, + 74, 80, 93, 117, 119, 206, 274, 279, 328, 344, + 445, 454, 604, 605, 619, 175, 117, 190, 274, 613, + 588, 107, 117, 175, 274, 402, 405, 590, 613, 386, + 532, 439, 896, 542, 536, 3, 37, 42, 49, 55, + 81, 83, 89, 101, 170, 172, 175, 176, 193, 208, + 221, 222, 224, 234, 236, 246, 268, 273, 277, 291, + 299, 301, 321, 361, 380, 387, 391, 409, 418, 438, + 444, 464, 505, 506, 544, 589, 600, 639, 774, 849, + 900, 978, 984, 548, 636, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 664, 876, 876, 515, 515, + 515, 698, 107, 370, 516, 588, 672, 514, 514, 631, + 674, 919, 40, 644, 191, 541, 515, 518, 581, 515, + 515, 577, 514, 40, 622, 620, 628, 86, 585, 107, + 272, 633, 674, 654, 674, 627, 454, 916, 650, 515, + 518, 637, 810, 171, 514, 859, 768, 515, 518, 515, + 721, 541, 541, 541, 541, 30, 103, 181, 364, 514, + 722, 723, 724, 725, 726, 727, 728, 809, 809, 475, + 825, 515, 811, 852, 853, 198, 180, 745, 749, 515, + 751, 752, 753, 903, 776, 899, 776, 542, 776, 513, + 513, 809, 518, 515, 542, 809, 811, 809, 809, 809, + 859, 515, 809, 36, 36, 809, 809, 145, 515, 506, + 876, 515, 857, 515, 809, 515, 514, 542, 829, 730, + 515, 730, 544, 515, 883, 460, 415, 453, 563, 542, + 557, 567, 289, 560, 503, 571, 562, 851, 59, 515, + 515, 459, 460, 680, 599, 625, 515, 515, 476, 630, + 120, 194, 204, 119, 456, 809, 117, 40, 514, 903, + 896, 810, 120, 194, 119, 279, 226, 541, 630, 88, + 645, 191, 279, 589, 809, 645, 279, 505, 506, 592, + 542, 774, 650, 650, 3, 246, 409, 900, 904, 503, + 428, 428, 513, 513, 697, 515, 515, 542, 664, 454, + 659, 661, 673, 637, 515, 976, 40, 416, 809, 416, + 274, 514, 544, 514, 919, 631, 151, 674, 149, 200, + 612, 122, 137, 327, 976, 107, 919, 476, 974, 40, + 289, 542, 915, 514, 671, 810, 859, 515, 515, 9, + 351, 714, 730, 514, 388, 514, 515, 518, 542, 826, + 827, 335, 731, 518, 515, 514, 543, 59, 515, 198, + 515, 752, 513, 774, 888, 513, 191, 515, 809, 809, + 809, 524, 513, 524, 515, 515, 542, 830, 825, 544, + 825, 518, 459, 877, 515, 518, 91, 562, 809, 515, + 895, 895, 344, 630, 514, 621, 599, 515, 190, 514, + 809, 274, 605, 630, 633, 896, 40, 152, 770, 904, + 509, 600, 896, 896, 515, 588, 124, 515, 515, 620, + 674, 674, 541, 152, 673, 40, 515, 896, 976, 30, + 85, 94, 118, 190, 203, 402, 405, 616, 616, 366, + 366, 40, 64, 74, 240, 416, 809, 541, 514, 542, + 561, 570, 819, 515, 515, 514, 825, 855, 514, 855, + 724, 40, 518, 809, 454, 709, 811, 884, 894, 756, + 514, 756, 809, 876, 876, 309, 831, 731, 731, 674, + 303, 674, 557, 289, 514, 555, 541, 599, 548, 626, + 629, 406, 468, 606, 607, 514, 601, 809, 515, 248, + 642, 190, 454, 535, 509, 439, 664, 544, 919, 612, + 974, 514, 541, 515, 674, 620, 585, 674, 74, 292, + 74, 674, 916, 809, 80, 565, 515, 518, 565, 9, + 731, 515, 723, 515, 829, 827, 368, 515, 884, 513, + 513, 513, 59, 698, 709, 709, 563, 93, 570, 133, + 633, 503, 515, 518, 587, 515, 272, 614, 172, 308, + 392, 289, 610, 611, 635, 601, 809, 439, 40, 514, + 974, 612, 976, 974, 292, 292, 514, 515, 903, 566, + 903, 919, 561, 566, 515, 709, 515, 711, 515, 854, + 183, 337, 366, 832, 459, 896, 515, 275, 451, 642, + 600, 629, 515, 607, 204, 122, 451, 289, 635, 289, + 610, 674, 570, 565, 702, 767, 702, 53, 104, 441, + 809, 833, 834, 833, 833, 515, 674, 767, 386, 611, + 63, 272, 357, 386, 603, 603, 974, 515, 566, 703, + 703, 834, 365, 165, 323, 165, 323, 148, 835, 835, + 835, 569, 599, 25, 117, 279, 919, 702, 36, 104, + 180, 272, 425, 767, 767, 703, 834, 365, 297 }; #define yyerrok (yyerrstatus = 0) @@ -409937,14 +412876,14 @@ YYLTYPE yylloc; switch (yyn) { case 2: -#line 501 "third_party/libpg_query/grammar/grammar.y" +#line 503 "third_party/libpg_query/grammar/grammar.y" { pg_yyget_extra(yyscanner)->parsetree = (yyvsp[(1) - (1)].list); ;} break; case 3: -#line 517 "third_party/libpg_query/grammar/grammar.y" +#line 519 "third_party/libpg_query/grammar/grammar.y" { if ((yyvsp[(1) - (3)].list) != NIL) { @@ -409959,7 +412898,7 @@ YYLTYPE yylloc; break; case 4: -#line 529 "third_party/libpg_query/grammar/grammar.y" +#line 531 "third_party/libpg_query/grammar/grammar.y" { if ((yyvsp[(1) - (1)].node) != NULL) (yyval.list) = list_make1(makeRawStmt((yyvsp[(1) - (1)].node), 0)); @@ -409969,7 +412908,7 @@ YYLTYPE yylloc; break; case 45: -#line 578 "third_party/libpg_query/grammar/grammar.y" +#line 580 "third_party/libpg_query/grammar/grammar.y" { (yyval.node) = NULL; ;} break; @@ -413432,190 +416371,190 @@ YYLTYPE yylloc; case 475: #line 118 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) makeNode(PGAStar); ;} + { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} break; case 476: #line 119 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) (yyvsp[(2) - (3)].list); ;} + { (yyval.node) = (PGNode *) makeNode(PGAStar); ;} break; case 477: #line 120 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} + { (yyval.node) = (PGNode *) (yyvsp[(2) - (3)].list); ;} break; case 478: #line 121 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = NULL; ;} + { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} break; case 479: -#line 127 "third_party/libpg_query/grammar/statements/copy.y" +#line 122 "third_party/libpg_query/grammar/statements/copy.y" + { (yyval.node) = NULL; ;} + break; + + case 480: +#line 128 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 480: -#line 135 "third_party/libpg_query/grammar/statements/copy.y" + case 481: +#line 136 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("oids", (PGNode *)makeInteger(true), (yylsp[(1) - (2)])); ;} break; - case 481: -#line 138 "third_party/libpg_query/grammar/statements/copy.y" + case 482: +#line 139 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 482: -#line 143 "third_party/libpg_query/grammar/statements/copy.y" + case 483: +#line 144 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].defelt)); ;} break; - case 483: -#line 144 "third_party/libpg_query/grammar/statements/copy.y" + case 484: +#line 145 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = NIL; ;} break; - case 484: -#line 150 "third_party/libpg_query/grammar/statements/copy.y" + case 485: +#line 151 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeString("binary"), (yylsp[(1) - (1)])); ;} break; - case 485: -#line 153 "third_party/libpg_query/grammar/statements/copy.y" + case 486: +#line 154 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 486: -#line 159 "third_party/libpg_query/grammar/statements/copy.y" + case 487: +#line 160 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeString("binary"), (yylsp[(1) - (1)])); ;} break; - case 487: -#line 163 "third_party/libpg_query/grammar/statements/copy.y" + case 488: +#line 164 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("oids", (PGNode *)makeInteger(true), (yylsp[(1) - (1)])); ;} break; - case 488: -#line 167 "third_party/libpg_query/grammar/statements/copy.y" + case 489: +#line 168 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("freeze", (PGNode *)makeInteger(true), (yylsp[(1) - (1)])); ;} break; - case 489: -#line 171 "third_party/libpg_query/grammar/statements/copy.y" + case 490: +#line 172 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("delimiter", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 490: -#line 175 "third_party/libpg_query/grammar/statements/copy.y" + case 491: +#line 176 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("null", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 491: -#line 179 "third_party/libpg_query/grammar/statements/copy.y" + case 492: +#line 180 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeString("csv"), (yylsp[(1) - (1)])); ;} break; - case 492: -#line 183 "third_party/libpg_query/grammar/statements/copy.y" + case 493: +#line 184 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("header", (PGNode *)makeInteger(true), (yylsp[(1) - (1)])); ;} break; - case 493: -#line 187 "third_party/libpg_query/grammar/statements/copy.y" + case 494: +#line 188 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("quote", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 494: -#line 191 "third_party/libpg_query/grammar/statements/copy.y" + case 495: +#line 192 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("escape", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 495: -#line 195 "third_party/libpg_query/grammar/statements/copy.y" + case 496: +#line 196 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_quote", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 496: -#line 199 "third_party/libpg_query/grammar/statements/copy.y" + case 497: +#line 200 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_quote", (PGNode *)makeNode(PGAStar), (yylsp[(1) - (3)])); ;} break; - case 497: -#line 203 "third_party/libpg_query/grammar/statements/copy.y" + case 498: +#line 204 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("partition_by", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 498: -#line 207 "third_party/libpg_query/grammar/statements/copy.y" + case 499: +#line 208 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("partition_by", (PGNode *)makeNode(PGAStar), (yylsp[(1) - (3)])); ;} break; - case 499: -#line 211 "third_party/libpg_query/grammar/statements/copy.y" + case 500: +#line 212 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_not_null", (PGNode *)(yyvsp[(4) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 500: -#line 215 "third_party/libpg_query/grammar/statements/copy.y" + case 501: +#line 216 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_null", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 501: -#line 219 "third_party/libpg_query/grammar/statements/copy.y" + case 502: +#line 220 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("encoding", (PGNode *)makeString((yyvsp[(2) - (2)].str)), (yylsp[(1) - (2)])); ;} break; - case 502: -#line 226 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} - break; - case 503: -#line 231 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} +#line 227 "third_party/libpg_query/grammar/statements/copy.y" + { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} break; case 504: #line 232 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = NULL; ;} + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; case 505: @@ -413625,51 +416564,56 @@ YYLTYPE yylloc; case 506: #line 234 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} + { (yyval.str) = NULL; ;} break; case 507: #line 235 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; case 508: -#line 242 "third_party/libpg_query/grammar/statements/copy.y" +#line 236 "third_party/libpg_query/grammar/statements/copy.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + break; + + case 509: +#line 243 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].defelt)); ;} break; - case 509: -#line 246 "third_party/libpg_query/grammar/statements/copy.y" + case 510: +#line 247 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].defelt)); ;} break; - case 512: + case 513: #line 52 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 513: + case 514: #line 53 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 514: + case 515: #line 55 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 515: + case 516: #line 72 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 516: + case 517: #line 74 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].list), NIL, @@ -413679,7 +416623,7 @@ YYLTYPE yylloc; ;} break; - case 517: + case 518: #line 81 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].list), (yyvsp[(3) - (4)].list), @@ -413690,7 +416634,7 @@ YYLTYPE yylloc; ;} break; - case 518: + case 519: #line 89 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].list), (yyvsp[(4) - (4)].list), @@ -413701,7 +416645,7 @@ YYLTYPE yylloc; ;} break; - case 519: + case 520: #line 97 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (2)].node), NULL, NIL, @@ -413712,7 +416656,7 @@ YYLTYPE yylloc; ;} break; - case 520: + case 521: #line 105 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].list), NIL, @@ -413723,7 +416667,7 @@ YYLTYPE yylloc; ;} break; - case 521: + case 522: #line 113 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (5)].node), (yyvsp[(3) - (5)].list), (yyvsp[(4) - (5)].list), @@ -413734,7 +416678,7 @@ YYLTYPE yylloc; ;} break; - case 522: + case 523: #line 121 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (5)].node), (yyvsp[(3) - (5)].list), (yyvsp[(5) - (5)].list), @@ -413745,24 +416689,24 @@ YYLTYPE yylloc; ;} break; - case 523: + case 524: #line 131 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 524: + case 525: #line 132 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 525: + case 526: #line 160 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 526: + case 527: #line 164 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -413770,7 +416714,7 @@ YYLTYPE yylloc; ;} break; - case 527: + case 528: #line 175 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -413787,7 +416731,7 @@ YYLTYPE yylloc; ;} break; - case 528: + case 529: #line 191 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -413805,7 +416749,7 @@ YYLTYPE yylloc; ;} break; - case 529: + case 530: #line 208 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -413822,7 +416766,7 @@ YYLTYPE yylloc; ;} break; - case 530: + case 531: #line 225 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -413840,12 +416784,12 @@ YYLTYPE yylloc; ;} break; - case 531: + case 532: #line 239 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 532: + case 533: #line 241 "third_party/libpg_query/grammar/statements/select.y" { /* same as SELECT * FROM relation_expr */ @@ -413867,35 +416811,35 @@ YYLTYPE yylloc; ;} break; - case 533: + case 534: #line 260 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_UNION_BY_NAME, (yyvsp[(3) - (5)].boolean), (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node)); ;} break; - case 534: + case 535: #line 264 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_UNION, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 535: + case 536: #line 268 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_INTERSECT, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 536: + case 537: #line 272 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_EXCEPT, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 537: + case 538: #line 276 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413908,7 +416852,7 @@ YYLTYPE yylloc; ;} break; - case 538: + case 539: #line 286 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413922,7 +416866,7 @@ YYLTYPE yylloc; ;} break; - case 539: + case 540: #line 297 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413935,7 +416879,7 @@ YYLTYPE yylloc; ;} break; - case 540: + case 541: #line 307 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413947,7 +416891,7 @@ YYLTYPE yylloc; ;} break; - case 541: + case 542: #line 316 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413961,7 +416905,7 @@ YYLTYPE yylloc; ;} break; - case 542: + case 543: #line 327 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413975,7 +416919,7 @@ YYLTYPE yylloc; ;} break; - case 543: + case 544: #line 338 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -413990,7 +416934,7 @@ YYLTYPE yylloc; ;} break; - case 544: + case 545: #line 350 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -414008,7 +416952,7 @@ YYLTYPE yylloc; ;} break; - case 545: + case 546: #line 365 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -414026,7 +416970,7 @@ YYLTYPE yylloc; ;} break; - case 552: + case 553: #line 395 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -414035,7 +416979,7 @@ YYLTYPE yylloc; ;} break; - case 553: + case 554: #line 401 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -414045,32 +416989,32 @@ YYLTYPE yylloc; ;} break; - case 554: + case 555: #line 407 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 555: + case 556: #line 411 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 556: + case 557: #line 412 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 557: + case 558: #line 416 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 558: + case 559: #line 417 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 559: + case 560: #line 432 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -414080,7 +417024,7 @@ YYLTYPE yylloc; ;} break; - case 560: + case 561: #line 439 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -414090,7 +417034,7 @@ YYLTYPE yylloc; ;} break; - case 561: + case 562: #line 446 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -414100,17 +417044,17 @@ YYLTYPE yylloc; ;} break; - case 562: + case 563: #line 455 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 563: + case 564: #line 456 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 564: + case 565: #line 460 "third_party/libpg_query/grammar/statements/select.y" { PGCommonTableExpr *n = makeNode(PGCommonTableExpr); @@ -414123,22 +417067,22 @@ YYLTYPE yylloc; ;} break; - case 565: + case 566: #line 472 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeAlways; ;} break; - case 566: + case 567: #line 473 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeNever; ;} break; - case 567: + case 568: #line 474 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeDefault; ;} break; - case 568: + case 569: #line 479 "third_party/libpg_query/grammar/statements/select.y" { (yyval.into) = makeNode(PGIntoClause); @@ -414151,12 +417095,12 @@ YYLTYPE yylloc; ;} break; - case 569: + case 570: #line 489 "third_party/libpg_query/grammar/statements/select.y" { (yyval.into) = NULL; ;} break; - case 570: + case 571: #line 498 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -414164,7 +417108,7 @@ YYLTYPE yylloc; ;} break; - case 571: + case 572: #line 503 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -414172,7 +417116,7 @@ YYLTYPE yylloc; ;} break; - case 572: + case 573: #line 508 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(4) - (4)].range); @@ -414180,7 +417124,7 @@ YYLTYPE yylloc; ;} break; - case 573: + case 574: #line 513 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(4) - (4)].range); @@ -414188,7 +417132,7 @@ YYLTYPE yylloc; ;} break; - case 574: + case 575: #line 518 "third_party/libpg_query/grammar/statements/select.y" { ereport(PGWARNING, @@ -414199,7 +417143,7 @@ YYLTYPE yylloc; ;} break; - case 575: + case 576: #line 526 "third_party/libpg_query/grammar/statements/select.y" { ereport(PGWARNING, @@ -414210,7 +417154,7 @@ YYLTYPE yylloc; ;} break; - case 576: + case 577: #line 534 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -414218,7 +417162,7 @@ YYLTYPE yylloc; ;} break; - case 577: + case 578: #line 539 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(2) - (2)].range); @@ -414226,7 +417170,7 @@ YYLTYPE yylloc; ;} break; - case 578: + case 579: #line 544 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(1) - (1)].range); @@ -414234,87 +417178,87 @@ YYLTYPE yylloc; ;} break; - case 579: + case 580: #line 550 "third_party/libpg_query/grammar/statements/select.y" {;} break; - case 580: + case 581: #line 551 "third_party/libpg_query/grammar/statements/select.y" {;} break; - case 581: + case 582: #line 555 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 582: + case 583: #line 556 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 583: + case 584: #line 557 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 584: + case 585: #line 561 "third_party/libpg_query/grammar/statements/select.y" { ;} break; - case 585: + case 586: #line 568 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NIL); ;} break; - case 586: + case 587: #line 569 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 587: + case 588: #line 573 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL;;} break; - case 588: + case 589: #line 574 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 589: + case 590: #line 578 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.boolean) = true;;} + { (yyval.ignorenulls) = PG_IGNORE_NULLS;;} break; - case 590: + case 591: #line 579 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.boolean) = false;;} + { (yyval.ignorenulls) = PG_RESPECT_NULLS;;} break; - case 591: + case 592: #line 580 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.boolean) = false; ;} + { (yyval.ignorenulls) = PG_DEFAULT_NULLS; ;} break; - case 592: + case 593: #line 584 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list);;} break; - case 593: + case 594: #line 585 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 594: + case 595: #line 589 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 595: + case 596: #line 591 "third_party/libpg_query/grammar/statements/select.y" { PGSortBy *sort = makeNode(PGSortBy); @@ -414330,17 +417274,17 @@ YYLTYPE yylloc; ;} break; - case 596: + case 597: #line 606 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].sortby)); ;} break; - case 597: + case 598: #line 607 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].sortby)); ;} break; - case 598: + case 599: #line 611 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortby) = makeNode(PGSortBy); @@ -414352,7 +417296,7 @@ YYLTYPE yylloc; ;} break; - case 599: + case 600: #line 620 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortby) = makeNode(PGSortBy); @@ -414364,72 +417308,72 @@ YYLTYPE yylloc; ;} break; - case 600: + case 601: #line 630 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_ASC; ;} break; - case 601: + case 602: #line 631 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_DESC; ;} break; - case 602: + case 603: #line 632 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_DEFAULT; ;} break; - case 603: + case 604: #line 635 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_FIRST; ;} break; - case 604: + case 605: #line 636 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_LAST; ;} break; - case 605: + case 606: #line 637 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_DEFAULT; ;} break; - case 606: + case 607: #line 641 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].node)); ;} break; - case 607: + case 608: #line 642 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); ;} break; - case 608: + case 609: #line 643 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, (yyvsp[(1) - (1)].node)); ;} break; - case 609: + case 610: #line 644 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (1)].node), NULL); ;} break; - case 610: + case 611: #line 648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 611: + case 612: #line 649 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL,NULL); ;} break; - case 612: + case 613: #line 654 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 613: + case 614: #line 656 "third_party/libpg_query/grammar/statements/select.y" { /* Disabled because it was too confusing, bjm 2002-02-18 */ @@ -414441,91 +417385,91 @@ YYLTYPE yylloc; ;} break; - case 614: + case 615: #line 672 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (5)].node); ;} break; - case 615: + case 616: #line 674 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst(1, -1); ;} break; - case 616: + case 617: #line 679 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 617: + case 618: #line 682 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 618: + case 619: #line 690 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeFloat((yyvsp[(1) - (2)].str)), true); ;} break; - case 619: + case 620: #line 694 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (2)].ival)), true); ;} break; - case 620: + case 621: #line 698 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeFloat((yyvsp[(1) - (2)].str)), true); ;} break; - case 621: + case 622: #line 702 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (2)].ival)), true); ;} break; - case 622: + case 623: #line 706 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (1)].ival)), false); ;} break; - case 623: + case 624: #line 710 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (2)].ival)), false); ;} break; - case 624: + case 625: #line 717 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (3)].node); ;} break; - case 625: + case 626: #line 721 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 626: + case 627: #line 728 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 627: + case 628: #line 729 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = NULL; ;} break; - case 628: + case 629: #line 734 "third_party/libpg_query/grammar/statements/select.y" { int seed = (yyvsp[(5) - (5)].ival); @@ -414533,21 +417477,21 @@ YYLTYPE yylloc; ;} break; - case 629: + case 630: #line 739 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleOptions((yyvsp[(1) - (1)].node), NULL, NULL, (yylsp[(1) - (1)])); ;} break; - case 630: + case 631: #line 743 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleOptions((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].str), NULL, (yylsp[(1) - (4)])); ;} break; - case 631: + case 632: #line 747 "third_party/libpg_query/grammar/statements/select.y" { int seed = (yyvsp[(5) - (6)].ival); @@ -414555,39 +417499,39 @@ YYLTYPE yylloc; ;} break; - case 632: + case 633: #line 755 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 633: + case 634: #line 761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 634: + case 635: #line 762 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 635: + case 636: #line 767 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = (yyvsp[(3) - (4)].ival); ;} break; - case 636: + case 637: #line 768 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = -1; ;} break; - case 637: + case 638: #line 772 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 638: + case 639: #line 774 "third_party/libpg_query/grammar/statements/select.y" { /* LIMIT ALL is represented as a NULL constant */ @@ -414595,77 +417539,77 @@ YYLTYPE yylloc; ;} break; - case 639: + case 640: #line 779 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent((yyvsp[(1) - (2)].node)); ;} break; - case 640: + case 641: #line 781 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent(makeFloatConst((yyvsp[(1) - (2)].str),(yylsp[(1) - (2)]))); ;} break; - case 641: + case 642: #line 783 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent(makeIntConst((yyvsp[(1) - (2)].ival),(yylsp[(1) - (2)]))); ;} break; - case 642: + case 643: #line 787 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 643: + case 644: #line 807 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 644: + case 645: #line 809 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 645: + case 646: #line 811 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 646: + case 647: #line 815 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival),(yylsp[(1) - (1)])); ;} break; - case 647: + case 648: #line 816 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str),(yylsp[(1) - (1)])); ;} break; - case 648: + case 649: #line 820 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 649: + case 650: #line 821 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 650: + case 651: #line 824 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 651: + case 652: #line 825 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 652: + case 653: #line 850 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 653: + case 654: #line 852 "third_party/libpg_query/grammar/statements/select.y" { PGNode *node = (PGNode *) makeGroupingSet(GROUPING_SET_ALL, NIL, (yylsp[(3) - (3)])); @@ -414673,145 +417617,145 @@ YYLTYPE yylloc; ;} break; - case 654: + case 655: #line 856 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 655: + case 656: #line 860 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 656: + case 657: #line 861 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list),(yyvsp[(3) - (3)].node)); ;} break; - case 657: + case 658: #line 865 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 658: + case 659: #line 866 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 659: + case 660: #line 870 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 660: + case 661: #line 871 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 661: + case 662: #line 872 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 662: + case 663: #line 873 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 663: + case 664: #line 874 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 664: + case 665: #line 879 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_EMPTY, NIL, (yylsp[(1) - (2)])); ;} break; - case 665: + case 666: #line 892 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_ROLLUP, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 666: + case 667: #line 899 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_CUBE, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 667: + case 668: #line 906 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_SETS, (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 668: + case 669: #line 912 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 669: + case 670: #line 913 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 670: + case 671: #line 917 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 671: + case 672: #line 918 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 672: + case 673: #line 922 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 673: + case 674: #line 923 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 674: + case 675: #line 927 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 675: + case 676: #line 928 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 676: + case 677: #line 932 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 677: + case 678: #line 933 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 678: + case 679: #line 937 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 679: + case 680: #line 938 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 680: + case 681: #line 943 "third_party/libpg_query/grammar/statements/select.y" { PGLockingClause *n = makeNode(PGLockingClause); @@ -414822,52 +417766,52 @@ YYLTYPE yylloc; ;} break; - case 681: + case 682: #line 953 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = LCS_FORUPDATE; ;} break; - case 682: + case 683: #line 954 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORNOKEYUPDATE; ;} break; - case 683: + case 684: #line 955 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORSHARE; ;} break; - case 684: + case 685: #line 956 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORKEYSHARE; ;} break; - case 685: + case 686: #line 960 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 686: + case 687: #line 961 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 687: + case 688: #line 966 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = LockWaitError; ;} break; - case 688: + case 689: #line 967 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = PGLockWaitSkip; ;} break; - case 689: + case 690: #line 968 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = PGLockWaitBlock; ;} break; - case 690: + case 691: #line 978 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -414876,7 +417820,7 @@ YYLTYPE yylloc; ;} break; - case 691: + case 692: #line 984 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = (PGSelectStmt *) (yyvsp[(1) - (5)].node); @@ -414885,47 +417829,47 @@ YYLTYPE yylloc; ;} break; - case 692: + case 693: #line 992 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 693: + case 694: #line 993 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (2)].node); ;} break; - case 694: + case 695: #line 1006 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 695: + case 696: #line 1007 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 696: + case 697: #line 1011 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 697: + case 698: #line 1012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 698: + case 699: #line 1016 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 699: + case 700: #line 1017 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 700: + case 701: #line 1024 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(1) - (3)].range)->alias = (yyvsp[(2) - (3)].alias); @@ -414934,7 +417878,7 @@ YYLTYPE yylloc; ;} break; - case 701: + case 702: #line 1030 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(1) - (3)].node); @@ -414945,7 +417889,7 @@ YYLTYPE yylloc; ;} break; - case 702: + case 703: #line 1038 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -414957,7 +417901,7 @@ YYLTYPE yylloc; ;} break; - case 703: + case 704: #line 1047 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(2) - (3)].node); @@ -414968,7 +417912,7 @@ YYLTYPE yylloc; ;} break; - case 704: + case 705: #line 1055 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -414980,7 +417924,7 @@ YYLTYPE yylloc; ;} break; - case 705: + case 706: #line 1064 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -414992,14 +417936,14 @@ YYLTYPE yylloc; ;} break; - case 706: + case 707: #line 1073 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].jexpr); ;} break; - case 707: + case 708: #line 1077 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(2) - (4)].jexpr)->alias = (yyvsp[(4) - (4)].alias); @@ -415007,7 +417951,7 @@ YYLTYPE yylloc; ;} break; - case 708: + case 709: #line 1082 "third_party/libpg_query/grammar/statements/select.y" { PGPivotExpr *n = makeNode(PGPivotExpr); @@ -415021,7 +417965,7 @@ YYLTYPE yylloc; ;} break; - case 709: + case 710: #line 1093 "third_party/libpg_query/grammar/statements/select.y" { PGPivotExpr *n = makeNode(PGPivotExpr); @@ -415035,32 +417979,32 @@ YYLTYPE yylloc; ;} break; - case 710: + case 711: #line 1106 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 711: + case 712: #line 1107 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 712: + case 713: #line 1110 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 713: + case 714: #line 1111 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 714: + case 715: #line 1112 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 715: + case 716: #line 1116 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -415070,7 +418014,7 @@ YYLTYPE yylloc; ;} break; - case 716: + case 717: #line 1124 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -415080,22 +418024,22 @@ YYLTYPE yylloc; ;} break; - case 718: + case 719: #line 1133 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 719: + case 720: #line 1134 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 720: + case 721: #line 1135 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 721: + case 722: #line 1139 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -415105,7 +418049,7 @@ YYLTYPE yylloc; ;} break; - case 722: + case 723: #line 1147 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -415115,31 +418059,31 @@ YYLTYPE yylloc; ;} break; - case 723: + case 724: #line 1156 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 724: + case 725: #line 1160 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 725: + case 726: #line 1166 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 726: + case 727: #line 1167 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 727: + case 728: #line 1172 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -415149,28 +418093,28 @@ YYLTYPE yylloc; ;} break; - case 728: + case 729: #line 1181 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 729: + case 730: #line 1185 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 730: + case 731: #line 1210 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jexpr) = (yyvsp[(2) - (3)].jexpr); ;} break; - case 731: + case 732: #line 1214 "third_party/libpg_query/grammar/statements/select.y" { /* CROSS JOIN is same as unqualified inner join */ @@ -415186,7 +418130,7 @@ YYLTYPE yylloc; ;} break; - case 732: + case 733: #line 1227 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -415203,7 +418147,7 @@ YYLTYPE yylloc; ;} break; - case 733: + case 734: #line 1241 "third_party/libpg_query/grammar/statements/select.y" { /* letting join_type reduce to empty doesn't work */ @@ -415221,7 +418165,7 @@ YYLTYPE yylloc; ;} break; - case 734: + case 735: #line 1256 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -415236,7 +418180,7 @@ YYLTYPE yylloc; ;} break; - case 735: + case 736: #line 1268 "third_party/libpg_query/grammar/statements/select.y" { /* letting join_type reduce to empty doesn't work */ @@ -415252,7 +418196,7 @@ YYLTYPE yylloc; ;} break; - case 736: + case 737: #line 1281 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -415269,7 +418213,7 @@ YYLTYPE yylloc; ;} break; - case 737: + case 738: #line 1295 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -415286,7 +418230,7 @@ YYLTYPE yylloc; ;} break; - case 738: + case 739: #line 1309 "third_party/libpg_query/grammar/statements/select.y" { /* POSITIONAL JOIN is a coordinated scan */ @@ -415302,7 +418246,7 @@ YYLTYPE yylloc; ;} break; - case 739: + case 740: #line 1322 "third_party/libpg_query/grammar/statements/select.y" { /* ANTI JOIN is a filter */ @@ -415320,7 +418264,7 @@ YYLTYPE yylloc; ;} break; - case 740: + case 741: #line 1337 "third_party/libpg_query/grammar/statements/select.y" { /* SEMI JOIN is also a filter */ @@ -415339,7 +418283,7 @@ YYLTYPE yylloc; ;} break; - case 741: + case 742: #line 1356 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -415348,7 +418292,7 @@ YYLTYPE yylloc; ;} break; - case 742: + case 743: #line 1362 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -415356,7 +418300,7 @@ YYLTYPE yylloc; ;} break; - case 743: + case 744: #line 1367 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -415365,7 +418309,7 @@ YYLTYPE yylloc; ;} break; - case 744: + case 745: #line 1373 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -415373,31 +418317,31 @@ YYLTYPE yylloc; ;} break; - case 745: + case 746: #line 1379 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = (yyvsp[(1) - (1)].alias); ;} break; - case 746: + case 747: #line 1380 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = NULL; ;} break; - case 747: + case 748: #line 1389 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (1)].alias), NIL); ;} break; - case 748: + case 749: #line 1393 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, (yyvsp[(3) - (4)].list)); ;} break; - case 749: + case 750: #line 1397 "third_party/libpg_query/grammar/statements/select.y" { PGAlias *a = makeNode(PGAlias); @@ -415406,7 +418350,7 @@ YYLTYPE yylloc; ;} break; - case 750: + case 751: #line 1403 "third_party/libpg_query/grammar/statements/select.y" { PGAlias *a = makeNode(PGAlias); @@ -415415,64 +418359,64 @@ YYLTYPE yylloc; ;} break; - case 751: + case 752: #line 1409 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, NIL); ;} break; - case 752: + case 753: #line 1414 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_FULL; ;} break; - case 753: + case 754: #line 1415 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_LEFT; ;} break; - case 754: + case 755: #line 1416 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_RIGHT; ;} break; - case 755: + case 756: #line 1417 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_SEMI; ;} break; - case 756: + case 757: #line 1418 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_ANTI; ;} break; - case 757: + case 758: #line 1419 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_INNER; ;} break; - case 758: + case 759: #line 1423 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 759: + case 760: #line 1424 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 760: + case 761: #line 1436 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) (yyvsp[(3) - (4)].list); ;} break; - case 761: + case 762: #line 1437 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 762: + case 763: #line 1443 "third_party/libpg_query/grammar/statements/select.y" { /* inheritance query, implicitly */ @@ -415482,7 +418426,7 @@ YYLTYPE yylloc; ;} break; - case 763: + case 764: #line 1450 "third_party/libpg_query/grammar/statements/select.y" { /* inheritance query, explicitly */ @@ -415492,7 +418436,7 @@ YYLTYPE yylloc; ;} break; - case 764: + case 765: #line 1457 "third_party/libpg_query/grammar/statements/select.y" { /* no inheritance */ @@ -415502,7 +418446,7 @@ YYLTYPE yylloc; ;} break; - case 765: + case 766: #line 1464 "third_party/libpg_query/grammar/statements/select.y" { /* no inheritance, SQL99-style syntax */ @@ -415512,7 +418456,7 @@ YYLTYPE yylloc; ;} break; - case 766: + case 767: #line 1496 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = makeNode(PGRangeFunction); @@ -415526,7 +418470,7 @@ YYLTYPE yylloc; ;} break; - case 767: + case 768: #line 1507 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = makeNode(PGRangeFunction); @@ -415540,66 +418484,66 @@ YYLTYPE yylloc; ;} break; - case 768: + case 769: #line 1520 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].list)); ;} break; - case 769: + case 770: #line 1524 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 770: + case 771: #line 1525 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 771: + case 772: #line 1528 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 772: + case 773: #line 1529 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 773: + case 774: #line 1532 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 774: + case 775: #line 1533 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 775: + case 776: #line 1538 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 776: + case 777: #line 1539 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 777: + case 778: #line 1545 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 778: + case 779: #line 1549 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 779: + case 780: #line 1555 "third_party/libpg_query/grammar/statements/select.y" { PGColumnDef *n = makeNode(PGColumnDef); @@ -415620,7 +418564,7 @@ YYLTYPE yylloc; ;} break; - case 780: + case 781: #line 1576 "third_party/libpg_query/grammar/statements/select.y" { PGCollateClause *n = makeNode(PGCollateClause); @@ -415631,36 +418575,36 @@ YYLTYPE yylloc; ;} break; - case 781: + case 782: #line 1583 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 782: + case 783: #line 1596 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(list_make2(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].typnam))); ;} break; - case 783: + case 784: #line 1599 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (4)].list), list_make2(makeString((yyvsp[(3) - (4)].str)), (yyvsp[(4) - (4)].typnam))); ;} break; - case 786: + case 787: #line 1606 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 787: + case 788: #line 1607 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = NULL; ;} break; - case 788: + case 789: #line 1610 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -415668,7 +418612,7 @@ YYLTYPE yylloc; ;} break; - case 789: + case 790: #line 1615 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (3)].typnam); @@ -415677,7 +418621,7 @@ YYLTYPE yylloc; ;} break; - case 790: + case 791: #line 1622 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (5)].typnam); @@ -415685,7 +418629,7 @@ YYLTYPE yylloc; ;} break; - case 791: + case 792: #line 1627 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (6)].typnam); @@ -415694,7 +418638,7 @@ YYLTYPE yylloc; ;} break; - case 792: + case 793: #line 1633 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -415702,7 +418646,7 @@ YYLTYPE yylloc; ;} break; - case 793: + case 794: #line 1638 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (3)].typnam); @@ -415711,14 +418655,14 @@ YYLTYPE yylloc; ;} break; - case 794: + case 795: #line 1644 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = makeTypeNameFromNameList((yyvsp[(1) - (1)].list)); ;} break; - case 795: + case 796: #line 1648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("struct"); @@ -415728,7 +418672,7 @@ YYLTYPE yylloc; ;} break; - case 796: + case 797: #line 1655 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("map"); @@ -415738,7 +418682,7 @@ YYLTYPE yylloc; ;} break; - case 797: + case 798: #line 1662 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("union"); @@ -415748,57 +418692,57 @@ YYLTYPE yylloc; ;} break; - case 798: + case 799: #line 1671 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(makeString((yyvsp[(1) - (3)].str)), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 799: + case 800: #line 1672 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 800: + case 801: #line 1677 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeInteger(-1)); ;} break; - case 801: + case 802: #line 1679 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (4)].list), makeInteger((yyvsp[(3) - (4)].ival))); ;} break; - case 802: + case 803: #line 1681 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 803: + case 804: #line 1685 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 804: + case 805: #line 1686 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 805: + case 806: #line 1687 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 806: + case 807: #line 1688 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 807: + case 808: #line 1689 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 808: + case 809: #line 1691 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -415806,7 +418750,7 @@ YYLTYPE yylloc; ;} break; - case 809: + case 810: #line 1696 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (4)].typnam); @@ -415815,27 +418759,27 @@ YYLTYPE yylloc; ;} break; - case 810: + case 811: #line 1715 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 811: + case 812: #line 1716 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 812: + case 813: #line 1717 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 813: + case 814: #line 1718 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 814: + case 815: #line 1730 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = makeTypeName((yyvsp[(1) - (2)].str)); @@ -415844,17 +418788,17 @@ YYLTYPE yylloc; ;} break; - case 815: + case 816: #line 1743 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 816: + case 817: #line 1744 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 817: + case 818: #line 1751 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int4"); @@ -415862,7 +418806,7 @@ YYLTYPE yylloc; ;} break; - case 818: + case 819: #line 1756 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int4"); @@ -415870,7 +418814,7 @@ YYLTYPE yylloc; ;} break; - case 819: + case 820: #line 1761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int2"); @@ -415878,7 +418822,7 @@ YYLTYPE yylloc; ;} break; - case 820: + case 821: #line 1766 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int8"); @@ -415886,7 +418830,7 @@ YYLTYPE yylloc; ;} break; - case 821: + case 822: #line 1771 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float4"); @@ -415894,7 +418838,7 @@ YYLTYPE yylloc; ;} break; - case 822: + case 823: #line 1776 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (2)].typnam); @@ -415902,7 +418846,7 @@ YYLTYPE yylloc; ;} break; - case 823: + case 824: #line 1781 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float8"); @@ -415910,7 +418854,7 @@ YYLTYPE yylloc; ;} break; - case 824: + case 825: #line 1786 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); @@ -415919,7 +418863,7 @@ YYLTYPE yylloc; ;} break; - case 825: + case 826: #line 1792 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); @@ -415928,7 +418872,7 @@ YYLTYPE yylloc; ;} break; - case 826: + case 827: #line 1798 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); @@ -415937,7 +418881,7 @@ YYLTYPE yylloc; ;} break; - case 827: + case 828: #line 1804 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("bool"); @@ -415945,7 +418889,7 @@ YYLTYPE yylloc; ;} break; - case 828: + case 829: #line 1811 "third_party/libpg_query/grammar/statements/select.y" { /* @@ -415969,35 +418913,35 @@ YYLTYPE yylloc; ;} break; - case 829: + case 830: #line 1832 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float4"); ;} break; - case 830: + case 831: #line 1842 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 831: + case 832: #line 1846 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 832: + case 833: #line 1854 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 833: + case 834: #line 1858 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); @@ -416005,7 +418949,7 @@ YYLTYPE yylloc; ;} break; - case 834: + case 835: #line 1866 "third_party/libpg_query/grammar/statements/select.y" { const char *typname; @@ -416017,7 +418961,7 @@ YYLTYPE yylloc; ;} break; - case 835: + case 836: #line 1878 "third_party/libpg_query/grammar/statements/select.y" { /* bit defaults to bit(1), varbit to no limit */ @@ -416034,28 +418978,28 @@ YYLTYPE yylloc; ;} break; - case 836: + case 837: #line 1899 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 837: + case 838: #line 1903 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 838: + case 839: #line 1909 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 839: + case 840: #line 1913 "third_party/libpg_query/grammar/statements/select.y" { /* Length was not specified so allow to be unrestricted. @@ -416069,7 +419013,7 @@ YYLTYPE yylloc; ;} break; - case 840: + case 841: #line 1926 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName((yyvsp[(1) - (4)].conststr)); @@ -416078,7 +419022,7 @@ YYLTYPE yylloc; ;} break; - case 841: + case 842: #line 1934 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName((yyvsp[(1) - (1)].conststr)); @@ -416089,47 +419033,47 @@ YYLTYPE yylloc; ;} break; - case 842: + case 843: #line 1944 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 843: + case 844: #line 1946 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 844: + case 845: #line 1948 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "varchar"; ;} break; - case 845: + case 846: #line 1950 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(3) - (3)].boolean) ? "varchar": "bpchar"; ;} break; - case 846: + case 847: #line 1952 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(3) - (3)].boolean) ? "varchar": "bpchar"; ;} break; - case 847: + case 848: #line 1954 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 848: + case 849: #line 1958 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 849: + case 850: #line 1959 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 850: + case 851: #line 1967 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(5) - (5)].boolean)) @@ -416141,7 +419085,7 @@ YYLTYPE yylloc; ;} break; - case 851: + case 852: #line 1976 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].boolean)) @@ -416152,7 +419096,7 @@ YYLTYPE yylloc; ;} break; - case 852: + case 853: #line 1984 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(5) - (5)].boolean)) @@ -416164,7 +419108,7 @@ YYLTYPE yylloc; ;} break; - case 853: + case 854: #line 1993 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].boolean)) @@ -416175,7 +419119,7 @@ YYLTYPE yylloc; ;} break; - case 854: + case 855: #line 2004 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("interval"); @@ -416183,82 +419127,82 @@ YYLTYPE yylloc; ;} break; - case 855: + case 856: #line 2011 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 856: + case 857: #line 2012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 857: + case 858: #line 2013 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 882: + case 883: #line 2054 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(YEAR), (yylsp[(1) - (1)]))); ;} break; - case 883: + case 884: #line 2056 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MONTH), (yylsp[(1) - (1)]))); ;} break; - case 884: + case 885: #line 2058 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY), (yylsp[(1) - (1)]))); ;} break; - case 885: + case 886: #line 2060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR), (yylsp[(1) - (1)]))); ;} break; - case 886: + case 887: #line 2062 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), (yylsp[(1) - (1)]))); ;} break; - case 887: + case 888: #line 2064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(SECOND), (yylsp[(1) - (1)]))); ;} break; - case 888: + case 889: #line 2066 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MILLISECOND), (yylsp[(1) - (1)]))); ;} break; - case 889: + case 890: #line 2068 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MICROSECOND), (yylsp[(1) - (1)]))); ;} break; - case 890: + case 891: #line 2070 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(WEEK), (yylsp[(1) - (1)]))); ;} break; - case 891: + case 892: #line 2072 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DECADE), (yylsp[(1) - (1)]))); ;} break; - case 892: + case 893: #line 2074 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(CENTURY), (yylsp[(1) - (1)]))); ;} break; - case 893: + case 894: #line 2076 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MILLENNIUM), (yylsp[(1) - (1)]))); ;} break; - case 894: + case 895: #line 2078 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(YEAR) | @@ -416266,7 +419210,7 @@ YYLTYPE yylloc; ;} break; - case 895: + case 896: #line 2083 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | @@ -416274,7 +419218,7 @@ YYLTYPE yylloc; ;} break; - case 896: + case 897: #line 2088 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | @@ -416283,7 +419227,7 @@ YYLTYPE yylloc; ;} break; - case 897: + case 898: #line 2094 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | @@ -416293,7 +419237,7 @@ YYLTYPE yylloc; ;} break; - case 898: + case 899: #line 2101 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | @@ -416301,7 +419245,7 @@ YYLTYPE yylloc; ;} break; - case 899: + case 900: #line 2106 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | @@ -416310,7 +419254,7 @@ YYLTYPE yylloc; ;} break; - case 900: + case 901: #line 2112 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MINUTE) | @@ -416318,22 +419262,22 @@ YYLTYPE yylloc; ;} break; - case 901: + case 902: #line 2117 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 902: + case 903: #line 2148 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 903: + case 904: #line 2151 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].typnam), 0, (yylsp[(2) - (3)])); ;} break; - case 904: + case 905: #line 2153 "third_party/libpg_query/grammar/statements/select.y" { PGCollateClause *n = makeNode(PGCollateClause); @@ -416344,7 +419288,7 @@ YYLTYPE yylloc; ;} break; - case 905: + case 906: #line 2161 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("timezone"), @@ -416353,122 +419297,122 @@ YYLTYPE yylloc; ;} break; - case 906: + case 907: #line 2176 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 907: + case 908: #line 2178 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 908: + case 909: #line 2180 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 909: + case 910: #line 2182 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "-", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 910: + case 911: #line 2184 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 911: + case 912: #line 2186 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "/", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 912: + case 913: #line 2188 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "//", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 913: + case 914: #line 2190 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "%", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 914: + case 915: #line 2192 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "^", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 915: + case 916: #line 2194 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "**", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 916: + case 917: #line 2196 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 917: + case 918: #line 2198 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 918: + case 919: #line 2200 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 919: + case 920: #line 2202 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 920: + case 921: #line 2204 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 921: + case 922: #line 2206 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 922: + case 923: #line 2209 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (3)].list), (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 923: + case 924: #line 2211 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(1) - (2)].list), NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 924: + case 925: #line 2213 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].node), NULL, (yylsp[(2) - (2)])); ;} break; - case 925: + case 926: #line 2216 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeAndExpr((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 926: + case 927: #line 2218 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeOrExpr((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 927: + case 928: #line 2220 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNotExpr((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 928: + case 929: #line 2222 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNotExpr((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 929: + case 930: #line 2224 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_GLOB, "~~~", @@ -416476,7 +419420,7 @@ YYLTYPE yylloc; ;} break; - case 930: + case 931: #line 2229 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_LIKE, "~~", @@ -416484,7 +419428,7 @@ YYLTYPE yylloc; ;} break; - case 931: + case 932: #line 2234 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("like_escape"), @@ -416494,7 +419438,7 @@ YYLTYPE yylloc; ;} break; - case 932: + case 933: #line 2241 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_LIKE, "!~~", @@ -416502,7 +419446,7 @@ YYLTYPE yylloc; ;} break; - case 933: + case 934: #line 2246 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("not_like_escape"), @@ -416512,7 +419456,7 @@ YYLTYPE yylloc; ;} break; - case 934: + case 935: #line 2253 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_ILIKE, "~~*", @@ -416520,7 +419464,7 @@ YYLTYPE yylloc; ;} break; - case 935: + case 936: #line 2258 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("ilike_escape"), @@ -416530,7 +419474,7 @@ YYLTYPE yylloc; ;} break; - case 936: + case 937: #line 2265 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_ILIKE, "!~~*", @@ -416538,7 +419482,7 @@ YYLTYPE yylloc; ;} break; - case 937: + case 938: #line 2270 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("not_ilike_escape"), @@ -416548,7 +419492,7 @@ YYLTYPE yylloc; ;} break; - case 938: + case 939: #line 2278 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -416559,7 +419503,7 @@ YYLTYPE yylloc; ;} break; - case 939: + case 940: #line 2286 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -416570,7 +419514,7 @@ YYLTYPE yylloc; ;} break; - case 940: + case 941: #line 2294 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -416581,7 +419525,7 @@ YYLTYPE yylloc; ;} break; - case 941: + case 942: #line 2302 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -416592,7 +419536,7 @@ YYLTYPE yylloc; ;} break; - case 942: + case 943: #line 2320 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -416603,7 +419547,7 @@ YYLTYPE yylloc; ;} break; - case 943: + case 944: #line 2328 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -416614,7 +419558,7 @@ YYLTYPE yylloc; ;} break; - case 944: + case 945: #line 2336 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -416625,7 +419569,7 @@ YYLTYPE yylloc; ;} break; - case 945: + case 946: #line 2344 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -416636,7 +419580,7 @@ YYLTYPE yylloc; ;} break; - case 946: + case 947: #line 2352 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -416647,7 +419591,7 @@ YYLTYPE yylloc; ;} break; - case 947: + case 948: #line 2360 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *n = makeNode(PGLambdaFunction); @@ -416658,14 +419602,14 @@ YYLTYPE yylloc; ;} break; - case 948: + case 949: #line 2368 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "->>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 949: + case 950: #line 2372 "third_party/libpg_query/grammar/statements/select.y" { if (list_length((yyvsp[(1) - (3)].list)) != 2) @@ -416684,7 +419628,7 @@ YYLTYPE yylloc; ;} break; - case 950: + case 951: #line 2388 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -416695,7 +419639,7 @@ YYLTYPE yylloc; ;} break; - case 951: + case 952: #line 2396 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -416706,7 +419650,7 @@ YYLTYPE yylloc; ;} break; - case 952: + case 953: #line 2404 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -416717,7 +419661,7 @@ YYLTYPE yylloc; ;} break; - case 953: + case 954: #line 2412 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -416728,7 +419672,7 @@ YYLTYPE yylloc; ;} break; - case 954: + case 955: #line 2420 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -416739,7 +419683,7 @@ YYLTYPE yylloc; ;} break; - case 955: + case 956: #line 2428 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -416750,35 +419694,35 @@ YYLTYPE yylloc; ;} break; - case 956: + case 957: #line 2436 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_DISTINCT, "=", (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node), (yylsp[(2) - (5)])); ;} break; - case 957: + case 958: #line 2440 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_DISTINCT, "=", (yyvsp[(1) - (6)].node), (yyvsp[(6) - (6)].node), (yylsp[(2) - (6)])); ;} break; - case 958: + case 959: #line 2444 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "=", (yyvsp[(1) - (6)].node), (PGNode *) (yyvsp[(5) - (6)].list), (yylsp[(2) - (6)])); ;} break; - case 959: + case 960: #line 2448 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "<>", (yyvsp[(1) - (7)].node), (PGNode *) (yyvsp[(6) - (7)].list), (yylsp[(2) - (7)])); ;} break; - case 960: + case 961: #line 2452 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_BETWEEN, @@ -416789,7 +419733,7 @@ YYLTYPE yylloc; ;} break; - case 961: + case 962: #line 2460 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_BETWEEN, @@ -416800,7 +419744,7 @@ YYLTYPE yylloc; ;} break; - case 962: + case 963: #line 2468 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_BETWEEN_SYM, @@ -416811,7 +419755,7 @@ YYLTYPE yylloc; ;} break; - case 963: + case 964: #line 2476 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_BETWEEN_SYM, @@ -416822,7 +419766,7 @@ YYLTYPE yylloc; ;} break; - case 964: + case 965: #line 2484 "third_party/libpg_query/grammar/statements/select.y" { /* in_expr returns a PGSubLink or a list of a_exprs */ @@ -416845,7 +419789,7 @@ YYLTYPE yylloc; ;} break; - case 965: + case 966: #line 2504 "third_party/libpg_query/grammar/statements/select.y" { /* in_expr returns a PGSubLink or a list of a_exprs */ @@ -416870,7 +419814,7 @@ YYLTYPE yylloc; ;} break; - case 966: + case 967: #line 2526 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); @@ -416884,7 +419828,7 @@ YYLTYPE yylloc; ;} break; - case 967: + case 968: #line 2537 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(3) - (6)].subquerytype) == PG_ANY_SUBLINK) @@ -416894,7 +419838,7 @@ YYLTYPE yylloc; ;} break; - case 968: + case 969: #line 2544 "third_party/libpg_query/grammar/statements/select.y" { /* @@ -416911,7 +419855,7 @@ YYLTYPE yylloc; ;} break; - case 969: + case 970: #line 2558 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -416922,7 +419866,7 @@ YYLTYPE yylloc; ;} break; - case 970: + case 971: #line 2566 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -416933,7 +419877,7 @@ YYLTYPE yylloc; ;} break; - case 971: + case 972: #line 2574 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -416945,140 +419889,140 @@ YYLTYPE yylloc; ;} break; - case 972: + case 973: #line 2594 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 973: + case 974: #line 2596 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].typnam), 0, (yylsp[(2) - (3)])); ;} break; - case 974: + case 975: #line 2598 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 975: + case 976: #line 2600 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 976: + case 977: #line 2602 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 977: + case 978: #line 2604 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "-", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 978: + case 979: #line 2606 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 979: + case 980: #line 2608 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "/", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 980: + case 981: #line 2610 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "//", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 981: + case 982: #line 2612 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "%", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 982: + case 983: #line 2614 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "^", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 983: + case 984: #line 2616 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "**", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 984: + case 985: #line 2618 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 985: + case 986: #line 2620 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 986: + case 987: #line 2622 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 987: + case 988: #line 2624 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 988: + case 989: #line 2626 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 989: + case 990: #line 2628 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 990: + case 991: #line 2630 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (3)].list), (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 991: + case 992: #line 2632 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(1) - (2)].list), NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 992: + case 993: #line 2634 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].node), NULL, (yylsp[(2) - (2)])); ;} break; - case 993: + case 994: #line 2636 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_DISTINCT, "=", (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node), (yylsp[(2) - (5)])); ;} break; - case 994: + case 995: #line 2640 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_DISTINCT, "=", (yyvsp[(1) - (6)].node), (yyvsp[(6) - (6)].node), (yylsp[(2) - (6)])); ;} break; - case 995: + case 996: #line 2644 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "=", (yyvsp[(1) - (6)].node), (PGNode *) (yyvsp[(5) - (6)].list), (yylsp[(2) - (6)])); ;} break; - case 996: + case 997: #line 2648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "<>", (yyvsp[(1) - (7)].node), (PGNode *) (yyvsp[(6) - (7)].list), (yylsp[(2) - (7)])); ;} break; - case 998: + case 999: #line 2663 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].list)) @@ -417093,17 +420037,17 @@ YYLTYPE yylloc; ;} break; - case 999: + case 1000: #line 2676 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1000: + case 1001: #line 2677 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1001: + case 1002: #line 2679 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); @@ -417117,7 +420061,7 @@ YYLTYPE yylloc; ;} break; - case 1002: + case 1003: #line 2690 "third_party/libpg_query/grammar/statements/select.y" { /* @@ -417144,7 +420088,7 @@ YYLTYPE yylloc; ;} break; - case 1003: + case 1004: #line 2714 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); @@ -417158,7 +420102,7 @@ YYLTYPE yylloc; ;} break; - case 1004: + case 1005: #line 2725 "third_party/libpg_query/grammar/statements/select.y" { PGGroupingFunc *g = makeNode(PGGroupingFunc); @@ -417168,21 +420112,21 @@ YYLTYPE yylloc; ;} break; - case 1005: + case 1006: #line 2735 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 1006: + case 1007: #line 2739 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1007: + case 1008: #line 2742 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("row"), (yyvsp[(1) - (1)].list), (yylsp[(1) - (1)])); @@ -417190,14 +420134,14 @@ YYLTYPE yylloc; ;} break; - case 1008: + case 1009: #line 2750 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeParamRef(0, (yylsp[(1) - (1)])); ;} break; - case 1009: + case 1010: #line 2754 "third_party/libpg_query/grammar/statements/select.y" { PGParamRef *p = makeNode(PGParamRef); @@ -417207,14 +420151,14 @@ YYLTYPE yylloc; ;} break; - case 1010: + case 1011: #line 2761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1011: + case 1012: #line 2765 "third_party/libpg_query/grammar/statements/select.y" { PGList *key_list = NULL; @@ -417234,35 +420178,34 @@ YYLTYPE yylloc; ;} break; - case 1012: + case 1013: #line 2782 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1013: + case 1014: #line 2786 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1014: + case 1015: #line 2787 "third_party/libpg_query/grammar/statements/select.y" { - PGFuncCall *n = makeFuncCall(SystemFuncName("list_value"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); - (yyval.node) = (PGNode *) n; + (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1015: -#line 2791 "third_party/libpg_query/grammar/statements/select.y" + case 1016: +#line 2790 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1016: -#line 2795 "third_party/libpg_query/grammar/statements/select.y" + case 1017: +#line 2794 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subLinkType = PG_ARRAY_SUBLINK; @@ -417275,8 +420218,8 @@ YYLTYPE yylloc; ;} break; - case 1017: -#line 2805 "third_party/libpg_query/grammar/statements/select.y" + case 1018: +#line 2804 "third_party/libpg_query/grammar/statements/select.y" { PGList *func_name = list_make1(makeString("construct_array")); PGFuncCall *n = makeFuncCall(func_name, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); @@ -417284,8 +420227,8 @@ YYLTYPE yylloc; ;} break; - case 1018: -#line 2811 "third_party/libpg_query/grammar/statements/select.y" + case 1019: +#line 2810 "third_party/libpg_query/grammar/statements/select.y" { PGPositionalReference *n = makeNode(PGPositionalReference); n->position = (yyvsp[(2) - (2)].ival); @@ -417294,66 +420237,74 @@ YYLTYPE yylloc; ;} break; - case 1019: -#line 2818 "third_party/libpg_query/grammar/statements/select.y" + case 1020: +#line 2817 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNamedParamRef((yyvsp[(2) - (2)].str), (yylsp[(1) - (2)])); ;} break; - case 1020: -#line 2826 "third_party/libpg_query/grammar/statements/select.y" + case 1021: +#line 2822 "third_party/libpg_query/grammar/statements/select.y" + { + PGFuncCall *n = makeFuncCall(SystemFuncName("list_value"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); + (yyval.node) = (PGNode *) n; + ;} + break; + + case 1022: +#line 2829 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *f = makeFuncCall(SystemFuncName("struct_pack"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); (yyval.node) = (PGNode *) f; ;} break; - case 1021: -#line 2835 "third_party/libpg_query/grammar/statements/select.y" + case 1023: +#line 2838 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall((yyvsp[(1) - (3)].list), NIL, (yylsp[(1) - (3)])); ;} break; - case 1022: -#line 2839 "third_party/libpg_query/grammar/statements/select.y" + case 1024: +#line 2842 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (6)].list), (yyvsp[(3) - (6)].list), (yylsp[(1) - (6)])); n->agg_order = (yyvsp[(4) - (6)].list); - n->agg_ignore_nulls = (yyvsp[(5) - (6)].boolean); + n->agg_ignore_nulls = (yyvsp[(5) - (6)].ignorenulls); (yyval.node) = (PGNode *)n; ;} break; - case 1023: -#line 2846 "third_party/libpg_query/grammar/statements/select.y" + case 1025: +#line 2849 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), list_make1((yyvsp[(4) - (7)].node)), (yylsp[(1) - (7)])); n->func_variadic = true; n->agg_order = (yyvsp[(5) - (7)].list); - n->agg_ignore_nulls = (yyvsp[(6) - (7)].boolean); + n->agg_ignore_nulls = (yyvsp[(6) - (7)].ignorenulls); (yyval.node) = (PGNode *)n; ;} break; - case 1024: -#line 2854 "third_party/libpg_query/grammar/statements/select.y" + case 1026: +#line 2857 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (9)].list), lappend((yyvsp[(3) - (9)].list), (yyvsp[(6) - (9)].node)), (yylsp[(1) - (9)])); n->func_variadic = true; n->agg_order = (yyvsp[(7) - (9)].list); - n->agg_ignore_nulls = (yyvsp[(8) - (9)].boolean); + n->agg_ignore_nulls = (yyvsp[(8) - (9)].ignorenulls); (yyval.node) = (PGNode *)n; ;} break; - case 1025: -#line 2862 "third_party/libpg_query/grammar/statements/select.y" + case 1027: +#line 2865 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), (yyvsp[(4) - (7)].list), (yylsp[(1) - (7)])); n->agg_order = (yyvsp[(5) - (7)].list); - n->agg_ignore_nulls = (yyvsp[(6) - (7)].boolean); + n->agg_ignore_nulls = (yyvsp[(6) - (7)].ignorenulls); /* Ideally we'd mark the PGFuncCall node to indicate * "must be an aggregate", but there's no provision * for that in PGFuncCall at the moment. @@ -417362,19 +420313,19 @@ YYLTYPE yylloc; ;} break; - case 1026: -#line 2873 "third_party/libpg_query/grammar/statements/select.y" + case 1028: +#line 2876 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), (yyvsp[(4) - (7)].list), (yylsp[(1) - (7)])); n->agg_order = (yyvsp[(5) - (7)].list); - n->agg_ignore_nulls = (yyvsp[(6) - (7)].boolean); + n->agg_ignore_nulls = (yyvsp[(6) - (7)].ignorenulls); n->agg_distinct = true; (yyval.node) = (PGNode *)n; ;} break; - case 1027: -#line 2893 "third_party/libpg_query/grammar/statements/select.y" + case 1029: +#line 2896 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = (PGFuncCall *) (yyvsp[(1) - (5)].node); /* @@ -417412,23 +420363,23 @@ YYLTYPE yylloc; ;} break; - case 1028: -#line 2929 "third_party/libpg_query/grammar/statements/select.y" + case 1030: +#line 2932 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1029: -#line 2939 "third_party/libpg_query/grammar/statements/select.y" + case 1031: +#line 2942 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1030: -#line 2940 "third_party/libpg_query/grammar/statements/select.y" + case 1032: +#line 2943 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1031: -#line 2948 "third_party/libpg_query/grammar/statements/select.y" + case 1033: +#line 2951 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("pg_collation_for"), list_make1((yyvsp[(4) - (5)].node)), @@ -417436,25 +420387,25 @@ YYLTYPE yylloc; ;} break; - case 1032: -#line 2954 "third_party/libpg_query/grammar/statements/select.y" + case 1034: +#line 2957 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].typnam), 0, (yylsp[(1) - (6)])); ;} break; - case 1033: -#line 2956 "third_party/libpg_query/grammar/statements/select.y" + case 1035: +#line 2959 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].typnam), 1, (yylsp[(1) - (6)])); ;} break; - case 1034: -#line 2958 "third_party/libpg_query/grammar/statements/select.y" + case 1036: +#line 2961 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("date_part"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1035: -#line 2962 "third_party/libpg_query/grammar/statements/select.y" + case 1037: +#line 2965 "third_party/libpg_query/grammar/statements/select.y" { /* overlay(A PLACING B FROM C FOR D) is converted to * overlay(A, B, C, D) @@ -417465,16 +420416,16 @@ YYLTYPE yylloc; ;} break; - case 1036: -#line 2971 "third_party/libpg_query/grammar/statements/select.y" + case 1038: +#line 2974 "third_party/libpg_query/grammar/statements/select.y" { - /* position(A in B) is converted to position(B, A) */ - (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("position"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); + /* position(A in B) is converted to position_inverse(A, B) */ + (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("__internal_position_operator"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1037: -#line 2976 "third_party/libpg_query/grammar/statements/select.y" + case 1039: +#line 2979 "third_party/libpg_query/grammar/statements/select.y" { /* substring(A from B for C) is converted to * substring(A, B, C) - thomas 2000-11-28 @@ -417483,8 +420434,8 @@ YYLTYPE yylloc; ;} break; - case 1038: -#line 2983 "third_party/libpg_query/grammar/statements/select.y" + case 1040: +#line 2986 "third_party/libpg_query/grammar/statements/select.y" { /* TREAT(expr AS target) converts expr of a particular type to target, * which is defined to be a subtype of the original expression. @@ -417501,8 +420452,8 @@ YYLTYPE yylloc; ;} break; - case 1039: -#line 2998 "third_party/libpg_query/grammar/statements/select.y" + case 1041: +#line 3001 "third_party/libpg_query/grammar/statements/select.y" { /* various trim expressions are defined in SQL * - thomas 1997-07-19 @@ -417511,36 +420462,36 @@ YYLTYPE yylloc; ;} break; - case 1040: -#line 3005 "third_party/libpg_query/grammar/statements/select.y" + case 1042: +#line 3008 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("ltrim"), (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 1041: -#line 3009 "third_party/libpg_query/grammar/statements/select.y" + case 1043: +#line 3012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("rtrim"), (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 1042: -#line 3013 "third_party/libpg_query/grammar/statements/select.y" + case 1044: +#line 3016 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("trim"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1043: -#line 3017 "third_party/libpg_query/grammar/statements/select.y" + case 1045: +#line 3020 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NULLIF, "=", (yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].node), (yylsp[(1) - (6)])); ;} break; - case 1044: -#line 3021 "third_party/libpg_query/grammar/statements/select.y" + case 1046: +#line 3024 "third_party/libpg_query/grammar/statements/select.y" { PGCoalesceExpr *c = makeNode(PGCoalesceExpr); c->args = (yyvsp[(3) - (4)].list); @@ -417549,8 +420500,8 @@ YYLTYPE yylloc; ;} break; - case 1045: -#line 3031 "third_party/libpg_query/grammar/statements/select.y" + case 1047: +#line 3034 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *lambda = makeNode(PGLambdaFunction); lambda->lhs = makeColumnRef((yyvsp[(4) - (7)].str), NIL, (yylsp[(4) - (7)]), yyscanner); @@ -417561,8 +420512,8 @@ YYLTYPE yylloc; ;} break; - case 1046: -#line 3040 "third_party/libpg_query/grammar/statements/select.y" + case 1048: +#line 3043 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *lambda = makeNode(PGLambdaFunction); lambda->lhs = makeColumnRef((yyvsp[(4) - (9)].str), NIL, (yylsp[(4) - (9)]), yyscanner); @@ -417579,63 +420530,63 @@ YYLTYPE yylloc; ;} break; - case 1047: -#line 3061 "third_party/libpg_query/grammar/statements/select.y" + case 1049: +#line 3064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 1048: -#line 3062 "third_party/libpg_query/grammar/statements/select.y" + case 1050: +#line 3065 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1049: -#line 3066 "third_party/libpg_query/grammar/statements/select.y" + case 1051: +#line 3069 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(4) - (5)].node); ;} break; - case 1050: -#line 3067 "third_party/libpg_query/grammar/statements/select.y" + case 1052: +#line 3070 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (4)].node); ;} break; - case 1051: -#line 3068 "third_party/libpg_query/grammar/statements/select.y" + case 1053: +#line 3071 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1052: -#line 3072 "third_party/libpg_query/grammar/statements/select.y" + case 1054: +#line 3075 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 1053: -#line 3073 "third_party/libpg_query/grammar/statements/select.y" + case 1055: +#line 3076 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 1054: -#line 3080 "third_party/libpg_query/grammar/statements/select.y" + case 1056: +#line 3083 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1055: -#line 3081 "third_party/libpg_query/grammar/statements/select.y" + case 1057: +#line 3084 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1056: -#line 3085 "third_party/libpg_query/grammar/statements/select.y" + case 1058: +#line 3088 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].windef)); ;} break; - case 1057: -#line 3087 "third_party/libpg_query/grammar/statements/select.y" + case 1059: +#line 3090 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].windef)); ;} break; - case 1058: -#line 3092 "third_party/libpg_query/grammar/statements/select.y" + case 1060: +#line 3095 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(3) - (3)].windef); n->name = (yyvsp[(1) - (3)].str); @@ -417643,13 +420594,13 @@ YYLTYPE yylloc; ;} break; - case 1059: -#line 3100 "third_party/libpg_query/grammar/statements/select.y" + case 1061: +#line 3103 "third_party/libpg_query/grammar/statements/select.y" { (yyval.windef) = (yyvsp[(2) - (2)].windef); ;} break; - case 1060: -#line 3102 "third_party/libpg_query/grammar/statements/select.y" + case 1062: +#line 3105 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); n->name = (yyvsp[(2) - (2)].str); @@ -417664,13 +420615,13 @@ YYLTYPE yylloc; ;} break; - case 1061: -#line 3115 "third_party/libpg_query/grammar/statements/select.y" + case 1063: +#line 3118 "third_party/libpg_query/grammar/statements/select.y" { (yyval.windef) = NULL; ;} break; - case 1062: -#line 3120 "third_party/libpg_query/grammar/statements/select.y" + case 1064: +#line 3123 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); n->name = NULL; @@ -417686,28 +420637,28 @@ YYLTYPE yylloc; ;} break; - case 1063: -#line 3145 "third_party/libpg_query/grammar/statements/select.y" + case 1065: +#line 3148 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1064: -#line 3146 "third_party/libpg_query/grammar/statements/select.y" + case 1066: +#line 3149 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = NULL; ;} break; - case 1065: -#line 3149 "third_party/libpg_query/grammar/statements/select.y" + case 1067: +#line 3152 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 1066: -#line 3150 "third_party/libpg_query/grammar/statements/select.y" + case 1068: +#line 3153 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1067: -#line 3159 "third_party/libpg_query/grammar/statements/select.y" + case 1069: +#line 3162 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -417717,8 +420668,8 @@ YYLTYPE yylloc; ;} break; - case 1068: -#line 3167 "third_party/libpg_query/grammar/statements/select.y" + case 1070: +#line 3170 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -417728,8 +420679,8 @@ YYLTYPE yylloc; ;} break; - case 1069: -#line 3175 "third_party/libpg_query/grammar/statements/select.y" + case 1071: +#line 3178 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -417739,8 +420690,8 @@ YYLTYPE yylloc; ;} break; - case 1070: -#line 3183 "third_party/libpg_query/grammar/statements/select.y" + case 1072: +#line 3186 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -417751,8 +420702,8 @@ YYLTYPE yylloc; ;} break; - case 1071: -#line 3194 "third_party/libpg_query/grammar/statements/select.y" + case 1073: +#line 3197 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(1) - (1)].windef); @@ -417772,8 +420723,8 @@ YYLTYPE yylloc; ;} break; - case 1072: -#line 3212 "third_party/libpg_query/grammar/statements/select.y" + case 1074: +#line 3215 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n1 = (yyvsp[(2) - (4)].windef); PGWindowDef *n2 = (yyvsp[(4) - (4)].windef); @@ -417813,8 +420764,8 @@ YYLTYPE yylloc; ;} break; - case 1073: -#line 3258 "third_party/libpg_query/grammar/statements/select.y" + case 1075: +#line 3261 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -417825,8 +420776,8 @@ YYLTYPE yylloc; ;} break; - case 1074: -#line 3267 "third_party/libpg_query/grammar/statements/select.y" + case 1076: +#line 3270 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -417837,8 +420788,8 @@ YYLTYPE yylloc; ;} break; - case 1075: -#line 3276 "third_party/libpg_query/grammar/statements/select.y" + case 1077: +#line 3279 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -417849,8 +420800,8 @@ YYLTYPE yylloc; ;} break; - case 1076: -#line 3285 "third_party/libpg_query/grammar/statements/select.y" + case 1078: +#line 3288 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -417861,8 +420812,8 @@ YYLTYPE yylloc; ;} break; - case 1077: -#line 3294 "third_party/libpg_query/grammar/statements/select.y" + case 1079: +#line 3297 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -417873,53 +420824,53 @@ YYLTYPE yylloc; ;} break; - case 1078: -#line 3305 "third_party/libpg_query/grammar/statements/select.y" + case 1080: +#line 3308 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_CURRENT_ROW; ;} break; - case 1079: -#line 3306 "third_party/libpg_query/grammar/statements/select.y" + case 1081: +#line 3309 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_GROUP; ;} break; - case 1080: -#line 3307 "third_party/libpg_query/grammar/statements/select.y" + case 1082: +#line 3310 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_TIES; ;} break; - case 1081: -#line 3308 "third_party/libpg_query/grammar/statements/select.y" + case 1083: +#line 3311 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 1082: -#line 3309 "third_party/libpg_query/grammar/statements/select.y" + case 1084: +#line 3312 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 1083: -#line 3323 "third_party/libpg_query/grammar/statements/select.y" + case 1085: +#line 3326 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1084: -#line 3324 "third_party/libpg_query/grammar/statements/select.y" + case 1086: +#line 3327 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1085: -#line 3327 "third_party/libpg_query/grammar/statements/select.y" + case 1087: +#line 3330 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list);;} break; - case 1086: -#line 3328 "third_party/libpg_query/grammar/statements/select.y" + case 1088: +#line 3331 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(2) - (5)].list), (yyvsp[(4) - (5)].node)); ;} break; - case 1087: -#line 3332 "third_party/libpg_query/grammar/statements/select.y" + case 1089: +#line 3335 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -417930,321 +420881,321 @@ YYLTYPE yylloc; ;} break; - case 1088: -#line 3342 "third_party/libpg_query/grammar/statements/select.y" + case 1090: +#line 3345 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1089: -#line 3343 "third_party/libpg_query/grammar/statements/select.y" + case 1091: +#line 3346 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1090: -#line 3347 "third_party/libpg_query/grammar/statements/select.y" + case 1092: +#line 3350 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1091: -#line 3348 "third_party/libpg_query/grammar/statements/select.y" + case 1093: +#line 3351 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1092: -#line 3353 "third_party/libpg_query/grammar/statements/select.y" + case 1094: +#line 3356 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1093: -#line 3359 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} - break; - - case 1094: -#line 3360 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} - break; - case 1095: -#line 3365 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(1) - (1)].list); ;} +#line 3362 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; case 1096: -#line 3366 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(1) - (2)].list); ;} +#line 3363 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; case 1097: -#line 3371 "third_party/libpg_query/grammar/statements/select.y" +#line 3368 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; case 1098: -#line 3372 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = NULL; ;} +#line 3369 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; case 1099: -#line 3375 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} +#line 3374 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; case 1100: -#line 3376 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} +#line 3375 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = NULL; ;} break; case 1101: -#line 3377 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.subquerytype) = PG_ALL_SUBLINK; ;} +#line 3378 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} break; case 1102: -#line 3380 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} +#line 3379 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} break; case 1103: -#line 3381 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.str) = (char*) (yyvsp[(1) - (1)].conststr); ;} +#line 3380 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.subquerytype) = PG_ALL_SUBLINK; ;} break; case 1104: -#line 3384 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "+"; ;} +#line 3383 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; case 1105: -#line 3385 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "-"; ;} +#line 3384 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.str) = (char*) (yyvsp[(1) - (1)].conststr); ;} break; case 1106: -#line 3386 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "*"; ;} +#line 3387 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "+"; ;} break; case 1107: -#line 3387 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "/"; ;} +#line 3388 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "-"; ;} break; case 1108: -#line 3388 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "//"; ;} +#line 3389 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "*"; ;} break; case 1109: -#line 3389 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "%"; ;} +#line 3390 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "/"; ;} break; case 1110: -#line 3390 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "^"; ;} +#line 3391 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "//"; ;} break; case 1111: -#line 3391 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "**"; ;} +#line 3392 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "%"; ;} break; case 1112: -#line 3392 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "<"; ;} +#line 3393 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "^"; ;} break; case 1113: -#line 3393 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = ">"; ;} +#line 3394 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "**"; ;} break; case 1114: -#line 3394 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "="; ;} +#line 3395 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "<"; ;} break; case 1115: -#line 3395 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "<="; ;} +#line 3396 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = ">"; ;} break; case 1116: -#line 3396 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = ">="; ;} +#line 3397 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "="; ;} break; case 1117: -#line 3397 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "<>"; ;} +#line 3398 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "<="; ;} break; case 1118: -#line 3401 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} +#line 3399 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = ">="; ;} break; case 1119: -#line 3403 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(3) - (4)].list); ;} +#line 3400 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "<>"; ;} break; case 1120: -#line 3408 "third_party/libpg_query/grammar/statements/select.y" +#line 3404 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; case 1121: -#line 3410 "third_party/libpg_query/grammar/statements/select.y" +#line 3406 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; case 1122: -#line 3415 "third_party/libpg_query/grammar/statements/select.y" +#line 3411 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; case 1123: -#line 3417 "third_party/libpg_query/grammar/statements/select.y" +#line 3413 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; case 1124: -#line 3419 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("~~")); ;} +#line 3418 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; case 1125: -#line 3421 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("!~~")); ;} +#line 3420 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; case 1126: -#line 3423 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("~~~")); ;} +#line 3422 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("~~")); ;} break; case 1127: -#line 3425 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("!~~~")); ;} +#line 3424 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("!~~")); ;} break; case 1128: -#line 3427 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("~~*")); ;} +#line 3426 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("~~~")); ;} break; case 1129: -#line 3429 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("!~~*")); ;} +#line 3428 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("!~~~")); ;} break; case 1130: -#line 3443 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} +#line 3430 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("~~*")); ;} break; case 1131: -#line 3445 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = lcons(makeString((yyvsp[(1) - (3)].str)), (yyvsp[(3) - (3)].list)); ;} +#line 3432 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("!~~*")); ;} break; case 1132: -#line 3450 "third_party/libpg_query/grammar/statements/select.y" +#line 3446 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} + break; + + case 1133: +#line 3448 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = lcons(makeString((yyvsp[(1) - (3)].str)), (yyvsp[(3) - (3)].list)); ;} + break; + + case 1134: +#line 3453 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1133: -#line 3454 "third_party/libpg_query/grammar/statements/select.y" + case 1135: +#line 3457 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1134: -#line 3461 "third_party/libpg_query/grammar/statements/select.y" + case 1136: +#line 3464 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1135: -#line 3466 "third_party/libpg_query/grammar/statements/select.y" + case 1137: +#line 3469 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1136: -#line 3472 "third_party/libpg_query/grammar/statements/select.y" + case 1138: +#line 3475 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1137: -#line 3476 "third_party/libpg_query/grammar/statements/select.y" + case 1139: +#line 3479 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1138: -#line 3483 "third_party/libpg_query/grammar/statements/select.y" + case 1140: +#line 3486 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1139: -#line 3488 "third_party/libpg_query/grammar/statements/select.y" + case 1141: +#line 3491 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1140: -#line 3495 "third_party/libpg_query/grammar/statements/select.y" + case 1142: +#line 3498 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1141: -#line 3499 "third_party/libpg_query/grammar/statements/select.y" + case 1143: +#line 3502 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1142: -#line 3508 "third_party/libpg_query/grammar/statements/select.y" + case 1144: +#line 3511 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1143: -#line 3512 "third_party/libpg_query/grammar/statements/select.y" + case 1145: +#line 3515 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1144: -#line 3518 "third_party/libpg_query/grammar/statements/select.y" + case 1146: +#line 3521 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1145: -#line 3522 "third_party/libpg_query/grammar/statements/select.y" + case 1147: +#line 3525 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -418255,8 +421206,8 @@ YYLTYPE yylloc; ;} break; - case 1146: -#line 3531 "third_party/libpg_query/grammar/statements/select.y" + case 1148: +#line 3534 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -418267,151 +421218,151 @@ YYLTYPE yylloc; ;} break; - case 1147: -#line 3541 "third_party/libpg_query/grammar/statements/select.y" + case 1149: +#line 3544 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].typnam)); ;} break; - case 1148: -#line 3542 "third_party/libpg_query/grammar/statements/select.y" + case 1150: +#line 3545 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].typnam)); ;} break; - case 1149: -#line 3547 "third_party/libpg_query/grammar/statements/select.y" + case 1151: +#line 3550 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(makeStringConst((yyvsp[(1) - (3)].str), (yylsp[(1) - (3)])), (yyvsp[(3) - (3)].node)); ;} break; - case 1150: -#line 3550 "third_party/libpg_query/grammar/statements/select.y" + case 1152: +#line 3553 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1151: -#line 3557 "third_party/libpg_query/grammar/statements/select.y" + case 1153: +#line 3560 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1152: -#line 3558 "third_party/libpg_query/grammar/statements/select.y" + case 1154: +#line 3561 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "year"; ;} break; - case 1153: -#line 3559 "third_party/libpg_query/grammar/statements/select.y" + case 1155: +#line 3562 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "month"; ;} break; - case 1154: -#line 3560 "third_party/libpg_query/grammar/statements/select.y" + case 1156: +#line 3563 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "day"; ;} break; - case 1155: -#line 3561 "third_party/libpg_query/grammar/statements/select.y" + case 1157: +#line 3564 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "hour"; ;} break; - case 1156: -#line 3562 "third_party/libpg_query/grammar/statements/select.y" + case 1158: +#line 3565 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "minute"; ;} break; - case 1157: -#line 3563 "third_party/libpg_query/grammar/statements/select.y" + case 1159: +#line 3566 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "second"; ;} break; - case 1158: -#line 3564 "third_party/libpg_query/grammar/statements/select.y" + case 1160: +#line 3567 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "millisecond"; ;} break; - case 1159: -#line 3565 "third_party/libpg_query/grammar/statements/select.y" + case 1161: +#line 3568 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "microsecond"; ;} break; - case 1160: -#line 3566 "third_party/libpg_query/grammar/statements/select.y" + case 1162: +#line 3569 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "week"; ;} break; - case 1161: -#line 3567 "third_party/libpg_query/grammar/statements/select.y" + case 1163: +#line 3570 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "decade"; ;} break; - case 1162: -#line 3568 "third_party/libpg_query/grammar/statements/select.y" + case 1164: +#line 3571 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "century"; ;} break; - case 1163: -#line 3569 "third_party/libpg_query/grammar/statements/select.y" + case 1165: +#line 3572 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "millennium"; ;} break; - case 1164: -#line 3570 "third_party/libpg_query/grammar/statements/select.y" + case 1166: +#line 3573 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1165: -#line 3581 "third_party/libpg_query/grammar/statements/select.y" + case 1167: +#line 3584 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make4((yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].node), (yyvsp[(3) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 1166: -#line 3585 "third_party/libpg_query/grammar/statements/select.y" + case 1168: +#line 3588 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1167: -#line 3592 "third_party/libpg_query/grammar/statements/select.y" + case 1169: +#line 3595 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1168: -#line 3598 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make2((yyvsp[(3) - (3)].node), (yyvsp[(1) - (3)].node)); ;} + case 1170: +#line 3601 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1169: -#line 3599 "third_party/libpg_query/grammar/statements/select.y" + case 1171: +#line 3602 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1170: -#line 3616 "third_party/libpg_query/grammar/statements/select.y" + case 1172: +#line 3619 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1171: -#line 3620 "third_party/libpg_query/grammar/statements/select.y" + case 1173: +#line 3623 "third_party/libpg_query/grammar/statements/select.y" { /* not legal per SQL99, but might as well allow it */ (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].node)); ;} break; - case 1172: -#line 3625 "third_party/libpg_query/grammar/statements/select.y" + case 1174: +#line 3628 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); ;} break; - case 1173: -#line 3629 "third_party/libpg_query/grammar/statements/select.y" + case 1175: +#line 3632 "third_party/libpg_query/grammar/statements/select.y" { /* * Since there are no cases where this syntax allows @@ -418428,45 +421379,45 @@ YYLTYPE yylloc; ;} break; - case 1174: -#line 3644 "third_party/libpg_query/grammar/statements/select.y" + case 1176: +#line 3647 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1175: -#line 3648 "third_party/libpg_query/grammar/statements/select.y" + case 1177: +#line 3651 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1176: -#line 3652 "third_party/libpg_query/grammar/statements/select.y" + case 1178: +#line 3655 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1177: -#line 3655 "third_party/libpg_query/grammar/statements/select.y" + case 1179: +#line 3658 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1178: -#line 3658 "third_party/libpg_query/grammar/statements/select.y" + case 1180: +#line 3661 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(3) - (3)].list), (yyvsp[(1) - (3)].node)); ;} break; - case 1179: -#line 3659 "third_party/libpg_query/grammar/statements/select.y" + case 1181: +#line 3662 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1180: -#line 3660 "third_party/libpg_query/grammar/statements/select.y" + case 1182: +#line 3663 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1181: -#line 3664 "third_party/libpg_query/grammar/statements/select.y" + case 1183: +#line 3667 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subselect = (yyvsp[(1) - (1)].node); @@ -418475,13 +421426,13 @@ YYLTYPE yylloc; ;} break; - case 1182: -#line 3670 "third_party/libpg_query/grammar/statements/select.y" + case 1184: +#line 3673 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *)(yyvsp[(2) - (3)].list); ;} break; - case 1183: -#line 3681 "third_party/libpg_query/grammar/statements/select.y" + case 1185: +#line 3684 "third_party/libpg_query/grammar/statements/select.y" { PGCaseExpr *c = makeNode(PGCaseExpr); c->casetype = InvalidOid; /* not analyzed yet */ @@ -418493,18 +421444,18 @@ YYLTYPE yylloc; ;} break; - case 1184: -#line 3694 "third_party/libpg_query/grammar/statements/select.y" + case 1186: +#line 3697 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1185: -#line 3695 "third_party/libpg_query/grammar/statements/select.y" + case 1187: +#line 3698 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1186: -#line 3700 "third_party/libpg_query/grammar/statements/select.y" + case 1188: +#line 3703 "third_party/libpg_query/grammar/statements/select.y" { PGCaseWhen *w = makeNode(PGCaseWhen); w->expr = (PGExpr *) (yyvsp[(2) - (4)].node); @@ -418514,42 +421465,42 @@ YYLTYPE yylloc; ;} break; - case 1187: -#line 3710 "third_party/libpg_query/grammar/statements/select.y" + case 1189: +#line 3713 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1188: -#line 3711 "third_party/libpg_query/grammar/statements/select.y" + case 1190: +#line 3714 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1189: -#line 3714 "third_party/libpg_query/grammar/statements/select.y" + case 1191: +#line 3717 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1190: -#line 3715 "third_party/libpg_query/grammar/statements/select.y" + case 1192: +#line 3718 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1191: -#line 3719 "third_party/libpg_query/grammar/statements/select.y" + case 1193: +#line 3722 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (1)].str), NIL, (yylsp[(1) - (1)]), yyscanner); ;} break; - case 1192: -#line 3723 "third_party/libpg_query/grammar/statements/select.y" + case 1194: +#line 3726 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].list), (yylsp[(1) - (2)]), yyscanner); ;} break; - case 1193: -#line 3730 "third_party/libpg_query/grammar/statements/select.y" + case 1195: +#line 3733 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = false; @@ -418559,8 +421510,8 @@ YYLTYPE yylloc; ;} break; - case 1194: -#line 3738 "third_party/libpg_query/grammar/statements/select.y" + case 1196: +#line 3741 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -418570,8 +421521,8 @@ YYLTYPE yylloc; ;} break; - case 1195: -#line 3745 "third_party/libpg_query/grammar/statements/select.y" + case 1197: +#line 3748 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -418582,8 +421533,8 @@ YYLTYPE yylloc; ;} break; - case 1196: -#line 3753 "third_party/libpg_query/grammar/statements/select.y" + case 1198: +#line 3756 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -418593,43 +421544,43 @@ YYLTYPE yylloc; ;} break; - case 1197: -#line 3763 "third_party/libpg_query/grammar/statements/select.y" + case 1199: +#line 3766 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1198: -#line 3764 "third_party/libpg_query/grammar/statements/select.y" + case 1200: +#line 3767 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1199: -#line 3769 "third_party/libpg_query/grammar/statements/select.y" + case 1201: +#line 3772 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1200: -#line 3770 "third_party/libpg_query/grammar/statements/select.y" + case 1202: +#line 3773 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1201: -#line 3774 "third_party/libpg_query/grammar/statements/select.y" + case 1203: +#line 3777 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1202: -#line 3775 "third_party/libpg_query/grammar/statements/select.y" + case 1204: +#line 3778 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NULL); ;} break; - case 1203: -#line 3776 "third_party/libpg_query/grammar/statements/select.y" + case 1205: +#line 3779 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1204: -#line 3781 "third_party/libpg_query/grammar/statements/select.y" + case 1206: +#line 3784 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(3) - (3)].list)) { PGFuncCall *n = makeFuncCall(list_make1(makeString((yyvsp[(2) - (3)].str))), (yyvsp[(3) - (3)].list)->head->data.ptr_value ? (yyvsp[(3) - (3)].list) : NULL, (yylsp[(2) - (3)])); @@ -418640,8 +421591,8 @@ YYLTYPE yylloc; ;} break; - case 1205: -#line 3790 "third_party/libpg_query/grammar/statements/select.y" + case 1207: +#line 3793 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = false; @@ -418651,8 +421602,8 @@ YYLTYPE yylloc; ;} break; - case 1206: -#line 3798 "third_party/libpg_query/grammar/statements/select.y" + case 1208: +#line 3801 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -418662,8 +421613,8 @@ YYLTYPE yylloc; ;} break; - case 1207: -#line 3805 "third_party/libpg_query/grammar/statements/select.y" + case 1209: +#line 3808 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -418674,8 +421625,8 @@ YYLTYPE yylloc; ;} break; - case 1208: -#line 3814 "third_party/libpg_query/grammar/statements/select.y" + case 1210: +#line 3817 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -418685,48 +421636,48 @@ YYLTYPE yylloc; ;} break; - case 1209: -#line 3829 "third_party/libpg_query/grammar/statements/select.y" + case 1211: +#line 3832 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1210: -#line 3830 "third_party/libpg_query/grammar/statements/select.y" + case 1212: +#line 3833 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1213: -#line 3846 "third_party/libpg_query/grammar/statements/select.y" + case 1215: +#line 3849 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1214: -#line 3847 "third_party/libpg_query/grammar/statements/select.y" + case 1216: +#line 3850 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1215: -#line 3851 "third_party/libpg_query/grammar/statements/select.y" + case 1217: +#line 3854 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].target)); ;} break; - case 1216: -#line 3852 "third_party/libpg_query/grammar/statements/select.y" + case 1218: +#line 3855 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].target)); ;} break; - case 1217: -#line 3856 "third_party/libpg_query/grammar/statements/select.y" + case 1219: +#line 3859 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1218: -#line 3857 "third_party/libpg_query/grammar/statements/select.y" + case 1220: +#line 3860 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1219: -#line 3861 "third_party/libpg_query/grammar/statements/select.y" + case 1221: +#line 3864 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(3) - (3)].str); @@ -418736,8 +421687,8 @@ YYLTYPE yylloc; ;} break; - case 1220: -#line 3877 "third_party/libpg_query/grammar/statements/select.y" + case 1222: +#line 3880 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(2) - (2)].str); @@ -418747,8 +421698,8 @@ YYLTYPE yylloc; ;} break; - case 1221: -#line 3885 "third_party/libpg_query/grammar/statements/select.y" + case 1223: +#line 3888 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = NULL; @@ -418758,140 +421709,140 @@ YYLTYPE yylloc; ;} break; - case 1222: -#line 3894 "third_party/libpg_query/grammar/statements/select.y" + case 1224: +#line 3897 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1223: -#line 3895 "third_party/libpg_query/grammar/statements/select.y" + case 1225: +#line 3898 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(2) - (2)].str))); ;} break; - case 1224: -#line 3898 "third_party/libpg_query/grammar/statements/select.y" + case 1226: +#line 3901 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1225: -#line 3899 "third_party/libpg_query/grammar/statements/select.y" + case 1227: +#line 3902 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1226: -#line 3902 "third_party/libpg_query/grammar/statements/select.y" + case 1228: +#line 3905 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1227: -#line 3906 "third_party/libpg_query/grammar/statements/select.y" + case 1229: +#line 3909 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 1228: -#line 3907 "third_party/libpg_query/grammar/statements/select.y" + case 1230: +#line 3910 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 1229: -#line 3911 "third_party/libpg_query/grammar/statements/select.y" + case 1231: +#line 3914 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1230: -#line 3912 "third_party/libpg_query/grammar/statements/select.y" + case 1232: +#line 3915 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1231: -#line 3915 "third_party/libpg_query/grammar/statements/select.y" + case 1233: +#line 3918 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1232: -#line 3916 "third_party/libpg_query/grammar/statements/select.y" + case 1234: +#line 3919 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(2) - (2)].list)); ;} break; - case 1233: -#line 3917 "third_party/libpg_query/grammar/statements/select.y" + case 1235: +#line 3920 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1234: -#line 3927 "third_party/libpg_query/grammar/statements/select.y" + case 1236: +#line 3930 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].range)); ;} break; - case 1235: -#line 3928 "third_party/libpg_query/grammar/statements/select.y" + case 1237: +#line 3931 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].range)); ;} break; - case 1236: -#line 3933 "third_party/libpg_query/grammar/statements/select.y" + case 1238: +#line 3936 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1237: -#line 3935 "third_party/libpg_query/grammar/statements/select.y" + case 1239: +#line 3938 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1238: -#line 3940 "third_party/libpg_query/grammar/statements/select.y" + case 1240: +#line 3943 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1239: -#line 3941 "third_party/libpg_query/grammar/statements/select.y" + case 1241: +#line 3944 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1240: -#line 3945 "third_party/libpg_query/grammar/statements/select.y" + case 1242: +#line 3948 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1241: -#line 3946 "third_party/libpg_query/grammar/statements/select.y" + case 1243: +#line 3949 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1242: -#line 3949 "third_party/libpg_query/grammar/statements/select.y" + case 1244: +#line 3952 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1243: -#line 3961 "third_party/libpg_query/grammar/statements/select.y" + case 1245: +#line 3964 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1244: -#line 3964 "third_party/libpg_query/grammar/statements/select.y" + case 1246: +#line 3967 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = check_func_name(lcons(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].list)), yyscanner); ;} break; - case 1245: -#line 3975 "third_party/libpg_query/grammar/statements/select.y" + case 1247: +#line 3978 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival), (yylsp[(1) - (1)])); ;} break; - case 1246: -#line 3979 "third_party/libpg_query/grammar/statements/select.y" + case 1248: +#line 3982 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1247: -#line 3983 "third_party/libpg_query/grammar/statements/select.y" + case 1249: +#line 3986 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].list)) { @@ -418905,15 +421856,15 @@ YYLTYPE yylloc; ;} break; - case 1248: -#line 3995 "third_party/libpg_query/grammar/statements/select.y" + case 1250: +#line 3998 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBitStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1249: -#line 3999 "third_party/libpg_query/grammar/statements/select.y" + case 1251: +#line 4002 "third_party/libpg_query/grammar/statements/select.y" { /* This is a bit constant per SQL99: * Without Feature F511, "BIT data type", @@ -418924,8 +421875,8 @@ YYLTYPE yylloc; ;} break; - case 1250: -#line 4008 "third_party/libpg_query/grammar/statements/select.y" + case 1252: +#line 4011 "third_party/libpg_query/grammar/statements/select.y" { /* generic type 'literal' syntax */ PGTypeName *t = makeTypeNameFromNameList((yyvsp[(1) - (2)].list)); @@ -418934,8 +421885,8 @@ YYLTYPE yylloc; ;} break; - case 1251: -#line 4015 "third_party/libpg_query/grammar/statements/select.y" + case 1253: +#line 4018 "third_party/libpg_query/grammar/statements/select.y" { /* generic syntax with a type modifier */ PGTypeName *t = makeTypeNameFromNameList((yyvsp[(1) - (7)].list)); @@ -418962,7 +421913,7 @@ YYLTYPE yylloc; (errcode(PG_ERRCODE_SYNTAX_ERROR), errmsg("type modifier cannot have ORDER BY"), parser_errposition((yylsp[(4) - (7)])))); - if ((yyvsp[(5) - (7)].boolean) != false) + if ((yyvsp[(5) - (7)].ignorenulls) != false) ereport(ERROR, (errcode(PG_ERRCODE_SYNTAX_ERROR), errmsg("type modifier cannot have IGNORE NULLS"), @@ -418975,146 +421926,146 @@ YYLTYPE yylloc; ;} break; - case 1252: -#line 4053 "third_party/libpg_query/grammar/statements/select.y" + case 1254: +#line 4056 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeStringConstCast((yyvsp[(2) - (2)].str), (yylsp[(2) - (2)]), (yyvsp[(1) - (2)].typnam)); ;} break; - case 1253: -#line 4057 "third_party/libpg_query/grammar/statements/select.y" + case 1255: +#line 4060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(3) - (5)].node), (yylsp[(3) - (5)]), (yyvsp[(5) - (5)].list)); ;} break; - case 1254: -#line 4061 "third_party/libpg_query/grammar/statements/select.y" + case 1256: +#line 4064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(2) - (3)].ival), (yylsp[(2) - (3)]), (yyvsp[(3) - (3)].list)); ;} break; - case 1255: -#line 4065 "third_party/libpg_query/grammar/statements/select.y" + case 1257: +#line 4068 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(2) - (3)].str), (yylsp[(2) - (3)]), (yyvsp[(3) - (3)].list)); ;} break; - case 1256: -#line 4069 "third_party/libpg_query/grammar/statements/select.y" + case 1258: +#line 4072 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBoolAConst(true, (yylsp[(1) - (1)])); ;} break; - case 1257: -#line 4073 "third_party/libpg_query/grammar/statements/select.y" + case 1259: +#line 4076 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBoolAConst(false, (yylsp[(1) - (1)])); ;} break; - case 1258: -#line 4077 "third_party/libpg_query/grammar/statements/select.y" + case 1260: +#line 4080 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNullAConst((yylsp[(1) - (1)])); ;} break; - case 1259: -#line 4082 "third_party/libpg_query/grammar/statements/select.y" + case 1261: +#line 4085 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; - case 1260: -#line 4099 "third_party/libpg_query/grammar/statements/select.y" + case 1262: +#line 4102 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1261: -#line 4100 "third_party/libpg_query/grammar/statements/select.y" + case 1263: +#line 4103 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1262: -#line 4101 "third_party/libpg_query/grammar/statements/select.y" + case 1264: +#line 4104 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1263: -#line 4104 "third_party/libpg_query/grammar/statements/select.y" + case 1265: +#line 4107 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1264: -#line 4105 "third_party/libpg_query/grammar/statements/select.y" + case 1266: +#line 4108 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1265: -#line 4106 "third_party/libpg_query/grammar/statements/select.y" + case 1267: +#line 4109 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1266: -#line 4109 "third_party/libpg_query/grammar/statements/select.y" + case 1268: +#line 4112 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1267: -#line 4110 "third_party/libpg_query/grammar/statements/select.y" + case 1269: +#line 4113 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1268: -#line 4111 "third_party/libpg_query/grammar/statements/select.y" + case 1270: +#line 4114 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1269: -#line 4114 "third_party/libpg_query/grammar/statements/select.y" + case 1271: +#line 4117 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1270: -#line 4115 "third_party/libpg_query/grammar/statements/select.y" + case 1272: +#line 4118 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lcons(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].list)); ;} break; - case 1271: -#line 4119 "third_party/libpg_query/grammar/statements/select.y" + case 1273: +#line 4122 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(2) - (2)].str))); ;} break; - case 1272: -#line 4121 "third_party/libpg_query/grammar/statements/select.y" + case 1274: +#line 4124 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1273: -#line 4125 "third_party/libpg_query/grammar/statements/select.y" + case 1275: +#line 4128 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1274: -#line 4126 "third_party/libpg_query/grammar/statements/select.y" + case 1276: +#line 4129 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1276: -#line 4133 "third_party/libpg_query/grammar/statements/select.y" + case 1278: +#line 4136 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1277: -#line 4134 "third_party/libpg_query/grammar/statements/select.y" + case 1279: +#line 4137 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1278: + case 1280: #line 8 "third_party/libpg_query/grammar/statements/prepare.y" { PGPrepareStmt *n = makeNode(PGPrepareStmt); @@ -419125,17 +422076,17 @@ YYLTYPE yylloc; ;} break; - case 1279: + case 1281: #line 18 "third_party/libpg_query/grammar/statements/prepare.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1280: + case 1282: #line 19 "third_party/libpg_query/grammar/statements/prepare.y" { (yyval.list) = NIL; ;} break; - case 1287: + case 1289: #line 8 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -419157,7 +422108,7 @@ YYLTYPE yylloc; ;} break; - case 1288: + case 1290: #line 27 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -419184,7 +422135,7 @@ YYLTYPE yylloc; ;} break; - case 1289: + case 1291: #line 51 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -419206,7 +422157,7 @@ YYLTYPE yylloc; ;} break; - case 1290: + case 1292: #line 74 "third_party/libpg_query/grammar/statements/create_schema.y" { if ((yyloc) < 0) /* see comments for YYLLOC_DEFAULT */ @@ -419215,12 +422166,12 @@ YYLTYPE yylloc; ;} break; - case 1291: + case 1293: #line 80 "third_party/libpg_query/grammar/statements/create_schema.y" { (yyval.list) = NIL; ;} break; - case 1296: + case 1298: #line 11 "third_party/libpg_query/grammar/statements/index.y" { PGIndexStmt *n = makeNode(PGIndexStmt); @@ -419246,7 +422197,7 @@ YYLTYPE yylloc; ;} break; - case 1297: + case 1299: #line 36 "third_party/libpg_query/grammar/statements/index.y" { PGIndexStmt *n = makeNode(PGIndexStmt); @@ -419272,62 +422223,62 @@ YYLTYPE yylloc; ;} break; - case 1298: + case 1300: #line 62 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1299: + case 1301: #line 66 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1300: + case 1302: #line 67 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (char*) DEFAULT_INDEX_TYPE; ;} break; - case 1301: + case 1303: #line 72 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = true; ;} break; - case 1302: + case 1304: #line 73 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = false; ;} break; - case 1303: + case 1305: #line 78 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1304: + case 1306: #line 79 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = NULL; ;} break; - case 1305: + case 1307: #line 83 "third_party/libpg_query/grammar/statements/index.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1306: + case 1308: #line 84 "third_party/libpg_query/grammar/statements/index.y" { (yyval.list) = NIL; ;} break; - case 1307: + case 1309: #line 89 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = true; ;} break; - case 1308: + case 1310: #line 90 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = false; ;} break; - case 1309: + case 1311: #line 8 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -419339,7 +422290,7 @@ YYLTYPE yylloc; ;} break; - case 1310: + case 1312: #line 17 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -419351,7 +422302,7 @@ YYLTYPE yylloc; ;} break; - case 1311: + case 1313: #line 26 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -419363,7 +422314,7 @@ YYLTYPE yylloc; ;} break; - case 1312: + case 1314: #line 35 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -419375,7 +422326,7 @@ YYLTYPE yylloc; ;} break; - case 1313: + case 1315: #line 44 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -419387,7 +422338,7 @@ YYLTYPE yylloc; ;} break; - case 1314: + case 1316: #line 53 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -419399,7 +422350,7 @@ YYLTYPE yylloc; ;} break; - case 1315: + case 1317: #line 6 "third_party/libpg_query/grammar/statements/checkpoint.y" { PGCheckPointStmt *n = makeNode(PGCheckPointStmt); @@ -419409,7 +422360,7 @@ YYLTYPE yylloc; ;} break; - case 1316: + case 1318: #line 13 "third_party/libpg_query/grammar/statements/checkpoint.y" { PGCheckPointStmt *n = makeNode(PGCheckPointStmt); @@ -419419,17 +422370,17 @@ YYLTYPE yylloc; ;} break; - case 1317: + case 1319: #line 22 "third_party/libpg_query/grammar/statements/checkpoint.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1318: + case 1320: #line 23 "third_party/libpg_query/grammar/statements/checkpoint.y" { (yyval.str) = NULL; ;} break; - case 1319: + case 1321: #line 8 "third_party/libpg_query/grammar/statements/comment_on.y" { PGCommentOnStmt *n = makeNode(PGCommentOnStmt); @@ -419440,7 +422391,7 @@ YYLTYPE yylloc; ;} break; - case 1320: + case 1322: #line 16 "third_party/libpg_query/grammar/statements/comment_on.y" { PGCommentOnStmt *n = makeNode(PGCommentOnStmt); @@ -419451,67 +422402,67 @@ YYLTYPE yylloc; ;} break; - case 1321: + case 1323: #line 26 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1322: + case 1324: #line 27 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.node) = makeNullAConst((yylsp[(1) - (1)])); ;} break; - case 1323: + case 1325: #line 30 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TABLE; ;} break; - case 1324: + case 1326: #line 31 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_SEQUENCE; ;} break; - case 1325: + case 1327: #line 32 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_FUNCTION; ;} break; - case 1326: + case 1328: #line 33 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_FUNCTION; ;} break; - case 1327: + case 1329: #line 34 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TABLE_MACRO; ;} break; - case 1328: + case 1330: #line 35 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_VIEW; ;} break; - case 1329: + case 1331: #line 36 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_DATABASE; ;} break; - case 1330: + case 1332: #line 37 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_INDEX; ;} break; - case 1331: + case 1333: #line 38 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_SCHEMA; ;} break; - case 1332: + case 1334: #line 39 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TYPE; ;} break; - case 1333: + case 1335: #line 8 "third_party/libpg_query/grammar/statements/export.y" { PGExportStmt *n = makeNode(PGExportStmt); @@ -419525,7 +422476,7 @@ YYLTYPE yylloc; ;} break; - case 1334: + case 1336: #line 20 "third_party/libpg_query/grammar/statements/export.y" { PGExportStmt *n = makeNode(PGExportStmt); @@ -419539,7 +422490,7 @@ YYLTYPE yylloc; ;} break; - case 1335: + case 1337: #line 34 "third_party/libpg_query/grammar/statements/export.y" { PGImportStmt *n = makeNode(PGImportStmt); @@ -419548,7 +422499,7 @@ YYLTYPE yylloc; ;} break; - case 1336: + case 1338: #line 10 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -419558,7 +422509,7 @@ YYLTYPE yylloc; ;} break; - case 1337: + case 1339: #line 17 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -419571,7 +422522,7 @@ YYLTYPE yylloc; ;} break; - case 1338: + case 1340: #line 27 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -419581,7 +422532,7 @@ YYLTYPE yylloc; ;} break; - case 1339: + case 1341: #line 34 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -419591,118 +422542,118 @@ YYLTYPE yylloc; ;} break; - case 1340: + case 1342: #line 44 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.boolean) = true; ;} break; - case 1341: + case 1343: #line 45 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.boolean) = false; ;} break; - case 1342: + case 1344: #line 50 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} break; - case 1343: + case 1345: #line 51 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].value); ;} break; - case 1344: + case 1346: #line 52 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = NULL; ;} break; - case 1375: + case 1377: #line 90 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1376: + case 1378: #line 91 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1377: + case 1379: #line 92 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1378: + case 1380: #line 97 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1379: + case 1381: #line 98 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1380: + case 1382: #line 104 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].defelt)); ;} break; - case 1381: + case 1383: #line 108 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].defelt)); ;} break; - case 1382: + case 1384: #line 115 "third_party/libpg_query/grammar/statements/explain.y" {;} break; - case 1383: + case 1385: #line 116 "third_party/libpg_query/grammar/statements/explain.y" {;} break; - case 1384: + case 1386: #line 121 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "true"; ;} break; - case 1385: + case 1387: #line 122 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "false"; ;} break; - case 1386: + case 1388: #line 123 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "on"; ;} break; - case 1387: + case 1389: #line 129 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1388: + case 1390: #line 135 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.defelt) = makeDefElem((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1389: + case 1391: #line 142 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1390: + case 1392: #line 143 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "analyze"; ;} break; - case 1391: + case 1393: #line 11 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(2) - (2)].vsetstmt); @@ -419711,7 +422662,7 @@ YYLTYPE yylloc; ;} break; - case 1392: + case 1394: #line 17 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -419720,7 +422671,7 @@ YYLTYPE yylloc; ;} break; - case 1393: + case 1395: #line 23 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -419729,7 +422680,7 @@ YYLTYPE yylloc; ;} break; - case 1394: + case 1396: #line 29 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -419738,12 +422689,12 @@ YYLTYPE yylloc; ;} break; - case 1395: + case 1397: #line 38 "third_party/libpg_query/grammar/statements/variable_set.y" {(yyval.vsetstmt) = (yyvsp[(1) - (1)].vsetstmt);;} break; - case 1396: + case 1398: #line 40 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -419753,7 +422704,7 @@ YYLTYPE yylloc; ;} break; - case 1397: + case 1399: #line 48 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -419767,7 +422718,7 @@ YYLTYPE yylloc; ;} break; - case 1398: + case 1400: #line 59 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -419778,7 +422729,7 @@ YYLTYPE yylloc; ;} break; - case 1399: + case 1401: #line 71 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -419789,7 +422740,7 @@ YYLTYPE yylloc; ;} break; - case 1400: + case 1402: #line 79 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -419800,26 +422751,26 @@ YYLTYPE yylloc; ;} break; - case 1401: + case 1403: #line 90 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1402: + case 1404: #line 96 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1403: + case 1405: #line 100 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1404: + case 1406: #line 104 "third_party/libpg_query/grammar/statements/variable_set.y" { PGTypeName *t = (yyvsp[(1) - (3)].typnam); @@ -419837,7 +422788,7 @@ YYLTYPE yylloc; ;} break; - case 1405: + case 1407: #line 119 "third_party/libpg_query/grammar/statements/variable_set.y" { PGTypeName *t = (yyvsp[(1) - (5)].typnam); @@ -419847,32 +422798,32 @@ YYLTYPE yylloc; ;} break; - case 1406: + case 1408: #line 125 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeAConst((yyvsp[(1) - (1)].value), (yylsp[(1) - (1)])); ;} break; - case 1407: + case 1409: #line 126 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = NULL; ;} break; - case 1408: + case 1410: #line 127 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = NULL; ;} break; - case 1409: + case 1411: #line 131 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1410: + case 1412: #line 132 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1411: + case 1413: #line 8 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -419883,7 +422834,7 @@ YYLTYPE yylloc; ;} break; - case 1412: + case 1414: #line 15 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -419894,7 +422845,7 @@ YYLTYPE yylloc; ;} break; - case 1413: + case 1415: #line 22 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -419905,7 +422856,7 @@ YYLTYPE yylloc; ;} break; - case 1414: + case 1416: #line 29 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -419916,7 +422867,7 @@ YYLTYPE yylloc; ;} break; - case 1415: + case 1417: #line 36 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -419927,27 +422878,27 @@ YYLTYPE yylloc; ;} break; - case 1416: + case 1418: #line 45 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1417: + case 1419: #line 46 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1418: + case 1420: #line 48 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1419: + case 1421: #line 49 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1420: + case 1422: #line 9 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -419964,7 +422915,7 @@ YYLTYPE yylloc; ;} break; - case 1421: + case 1423: #line 23 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -419981,7 +422932,7 @@ YYLTYPE yylloc; ;} break; - case 1422: + case 1424: #line 37 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = (PGVacuumStmt *) (yyvsp[(5) - (5)].node); @@ -419996,7 +422947,7 @@ YYLTYPE yylloc; ;} break; - case 1423: + case 1425: #line 49 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -420007,7 +422958,7 @@ YYLTYPE yylloc; ;} break; - case 1424: + case 1426: #line 57 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -420020,27 +422971,27 @@ YYLTYPE yylloc; ;} break; - case 1425: + case 1427: #line 70 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_ANALYZE; ;} break; - case 1426: + case 1428: #line 71 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_VERBOSE; ;} break; - case 1427: + case 1429: #line 72 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_FREEZE; ;} break; - case 1428: + case 1430: #line 73 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_FULL; ;} break; - case 1429: + case 1431: #line 75 "third_party/libpg_query/grammar/statements/vacuum.y" { if (strcmp((yyvsp[(1) - (1)].str), "disable_page_skipping") == 0) @@ -420053,37 +423004,37 @@ YYLTYPE yylloc; ;} break; - case 1430: + case 1432: #line 87 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = true; ;} break; - case 1431: + case 1433: #line 88 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = false; ;} break; - case 1432: + case 1434: #line 93 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; - case 1433: + case 1435: #line 94 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = (yyvsp[(1) - (3)].ival) | (yyvsp[(3) - (3)].ival); ;} break; - case 1434: + case 1436: #line 98 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = true; ;} break; - case 1435: + case 1437: #line 99 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = false; ;} break; - case 1436: + case 1438: #line 9 "third_party/libpg_query/grammar/statements/delete.y" { PGDeleteStmt *n = makeNode(PGDeleteStmt); @@ -420096,7 +423047,7 @@ YYLTYPE yylloc; ;} break; - case 1437: + case 1439: #line 19 "third_party/libpg_query/grammar/statements/delete.y" { PGDeleteStmt *n = makeNode(PGDeleteStmt); @@ -420109,14 +423060,14 @@ YYLTYPE yylloc; ;} break; - case 1438: + case 1440: #line 32 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.range) = (yyvsp[(1) - (1)].range); ;} break; - case 1439: + case 1441: #line 36 "third_party/libpg_query/grammar/statements/delete.y" { PGAlias *alias = makeNode(PGAlias); @@ -420126,7 +423077,7 @@ YYLTYPE yylloc; ;} break; - case 1440: + case 1442: #line 43 "third_party/libpg_query/grammar/statements/delete.y" { PGAlias *alias = makeNode(PGAlias); @@ -420136,27 +423087,27 @@ YYLTYPE yylloc; ;} break; - case 1441: + case 1443: #line 53 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1442: + case 1444: #line 54 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.node) = NULL; ;} break; - case 1443: + case 1445: #line 60 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1444: + case 1446: #line 61 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.list) = NIL; ;} break; - case 1445: + case 1447: #line 10 "third_party/libpg_query/grammar/statements/analyze.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -420169,7 +423120,7 @@ YYLTYPE yylloc; ;} break; - case 1446: + case 1448: #line 20 "third_party/libpg_query/grammar/statements/analyze.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -420182,7 +423133,7 @@ YYLTYPE yylloc; ;} break; - case 1447: + case 1449: #line 8 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -420194,7 +423145,7 @@ YYLTYPE yylloc; ;} break; - case 1448: + case 1450: #line 17 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -420206,7 +423157,7 @@ YYLTYPE yylloc; ;} break; - case 1449: + case 1451: #line 29 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -420216,7 +423167,7 @@ YYLTYPE yylloc; ;} break; - case 1450: + case 1452: #line 36 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -420226,7 +423177,7 @@ YYLTYPE yylloc; ;} break; - case 1451: + case 1453: #line 43 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -420236,27 +423187,27 @@ YYLTYPE yylloc; ;} break; - case 1452: + case 1454: #line 51 "third_party/libpg_query/grammar/statements/attach.y" {;} break; - case 1453: + case 1455: #line 52 "third_party/libpg_query/grammar/statements/attach.y" {;} break; - case 1454: + case 1456: #line 56 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1455: + case 1457: #line 57 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.str) = NULL; ;} break; - case 1456: + case 1458: #line 3 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(2) - (2)].vsetstmt)->scope = VAR_SET_SCOPE_DEFAULT; @@ -420264,7 +423215,7 @@ YYLTYPE yylloc; ;} break; - case 1457: + case 1459: #line 8 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_LOCAL; @@ -420272,7 +423223,7 @@ YYLTYPE yylloc; ;} break; - case 1458: + case 1460: #line 13 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_SESSION; @@ -420280,7 +423231,7 @@ YYLTYPE yylloc; ;} break; - case 1459: + case 1461: #line 18 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_GLOBAL; @@ -420288,7 +423239,7 @@ YYLTYPE yylloc; ;} break; - case 1460: + case 1462: #line 27 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -420298,7 +423249,7 @@ YYLTYPE yylloc; ;} break; - case 1461: + case 1463: #line 34 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -420307,12 +423258,12 @@ YYLTYPE yylloc; ;} break; - case 1462: + case 1464: #line 43 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyval.vsetstmt) = (yyvsp[(1) - (1)].vsetstmt); ;} break; - case 1463: + case 1465: #line 45 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -420322,7 +423273,7 @@ YYLTYPE yylloc; ;} break; - case 1464: + case 1466: #line 52 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -420332,7 +423283,7 @@ YYLTYPE yylloc; ;} break; - case 1465: + case 1467: #line 3 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowSelectStmt *n = makeNode(PGVariableShowSelectStmt); @@ -420343,7 +423294,7 @@ YYLTYPE yylloc; ;} break; - case 1466: + case 1468: #line 10 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowSelectStmt *n = makeNode(PGVariableShowSelectStmt); @@ -420354,7 +423305,7 @@ YYLTYPE yylloc; ;} break; - case 1467: + case 1469: #line 18 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -420364,7 +423315,7 @@ YYLTYPE yylloc; ;} break; - case 1468: + case 1470: #line 25 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -420374,7 +423325,7 @@ YYLTYPE yylloc; ;} break; - case 1469: + case 1471: #line 32 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -420384,7 +423335,7 @@ YYLTYPE yylloc; ;} break; - case 1470: + case 1472: #line 39 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -420394,7 +423345,7 @@ YYLTYPE yylloc; ;} break; - case 1471: + case 1473: #line 46 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -420404,7 +423355,7 @@ YYLTYPE yylloc; ;} break; - case 1472: + case 1474: #line 53 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -420414,27 +423365,27 @@ YYLTYPE yylloc; ;} break; - case 1479: + case 1481: #line 67 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1480: + case 1482: #line 69 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; - case 1481: + case 1483: #line 72 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("\"%s\"", (yyvsp[(1) - (1)].str)); ;} break; - case 1482: + case 1484: #line 74 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("%s.\"%s\"", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; - case 1483: + case 1485: #line 7 "third_party/libpg_query/grammar/statements/call.y" { PGCallStmt *n = makeNode(PGCallStmt); @@ -420443,7 +423394,7 @@ YYLTYPE yylloc; ;} break; - case 1484: + case 1486: #line 10 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -420458,7 +423409,7 @@ YYLTYPE yylloc; ;} break; - case 1485: + case 1487: #line 23 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -420473,7 +423424,7 @@ YYLTYPE yylloc; ;} break; - case 1486: + case 1488: #line 36 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -420488,7 +423439,7 @@ YYLTYPE yylloc; ;} break; - case 1487: + case 1489: #line 49 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -420508,7 +423459,7 @@ YYLTYPE yylloc; ;} break; - case 1488: + case 1490: #line 67 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -420528,27 +423479,27 @@ YYLTYPE yylloc; ;} break; - case 1489: + case 1491: #line 87 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = CASCADED_CHECK_OPTION; ;} break; - case 1490: + case 1492: #line 88 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = CASCADED_CHECK_OPTION; ;} break; - case 1491: + case 1493: #line 89 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = PG_LOCAL_CHECK_OPTION; ;} break; - case 1492: + case 1494: #line 90 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = PG_NO_CHECK_OPTION; ;} break; - case 1493: + case 1495: #line 12 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -420564,7 +423515,7 @@ YYLTYPE yylloc; ;} break; - case 1494: + case 1496: #line 25 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -420580,7 +423531,7 @@ YYLTYPE yylloc; ;} break; - case 1495: + case 1497: #line 38 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -420596,22 +423547,22 @@ YYLTYPE yylloc; ;} break; - case 1496: + case 1498: #line 54 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = true; ;} break; - case 1497: + case 1499: #line 55 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = false; ;} break; - case 1498: + case 1500: #line 56 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = true; ;} break; - case 1499: + case 1501: #line 62 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.into) = makeNode(PGIntoClause); @@ -420626,7 +423577,7 @@ YYLTYPE yylloc; /* Line 1267 of yacc.c. */ -#line 30697 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 30744 "third_party/libpg_query/grammar/grammar_out.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -422401,7 +425352,8 @@ int base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner) { // The following code up to LICENSE_CHANGE_END is subject to THIRD PARTY LICENSE #15 // See the end of this file for a list -#line 1 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 2 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 2 "third_party/libpg_query/scan.l" /*------------------------------------------------------------------------- * * scan.l @@ -422479,7 +425431,10 @@ typedef unsigned int pg_wchar; #include -#line 43 "third_party/libpg_query/src_backend_parser_scan.cpp" + + + +#line 48 "third_party/libpg_query/src_backend_parser_scan.cpp" #define YY_INT_ALIGNED short int @@ -422487,246 +425442,12 @@ typedef unsigned int pg_wchar; #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif -#ifdef yy_create_buffer -#define core_yy_create_buffer_ALREADY_DEFINED -#else -#define yy_create_buffer core_yy_create_buffer -#endif - -#ifdef yy_delete_buffer -#define core_yy_delete_buffer_ALREADY_DEFINED -#else -#define yy_delete_buffer core_yy_delete_buffer -#endif - -#ifdef yy_scan_buffer -#define core_yy_scan_buffer_ALREADY_DEFINED -#else -#define yy_scan_buffer core_yy_scan_buffer -#endif - -#ifdef yy_scan_string -#define core_yy_scan_string_ALREADY_DEFINED -#else -#define yy_scan_string core_yy_scan_string -#endif - -#ifdef yy_scan_bytes -#define core_yy_scan_bytes_ALREADY_DEFINED -#else -#define yy_scan_bytes core_yy_scan_bytes -#endif - -#ifdef yy_init_buffer -#define core_yy_init_buffer_ALREADY_DEFINED -#else -#define yy_init_buffer core_yy_init_buffer -#endif - -#ifdef yy_flush_buffer -#define core_yy_flush_buffer_ALREADY_DEFINED -#else -#define yy_flush_buffer core_yy_flush_buffer -#endif - -#ifdef yy_load_buffer_state -#define core_yy_load_buffer_state_ALREADY_DEFINED -#else -#define yy_load_buffer_state core_yy_load_buffer_state -#endif - -#ifdef yy_switch_to_buffer -#define core_yy_switch_to_buffer_ALREADY_DEFINED -#else -#define yy_switch_to_buffer core_yy_switch_to_buffer -#endif - -#ifdef yypush_buffer_state -#define core_yypush_buffer_state_ALREADY_DEFINED -#else -#define yypush_buffer_state core_yypush_buffer_state -#endif - -#ifdef yypop_buffer_state -#define core_yypop_buffer_state_ALREADY_DEFINED -#else -#define yypop_buffer_state core_yypop_buffer_state -#endif - -#ifdef yyensure_buffer_stack -#define core_yyensure_buffer_stack_ALREADY_DEFINED -#else -#define yyensure_buffer_stack core_yyensure_buffer_stack -#endif - -#ifdef yylex -#define core_yylex_ALREADY_DEFINED -#else -#define yylex core_yylex -#endif - -#ifdef yyrestart -#define core_yyrestart_ALREADY_DEFINED -#else -#define yyrestart core_yyrestart -#endif - -#ifdef yylex_init -#define core_yylex_init_ALREADY_DEFINED -#else -#define yylex_init core_yylex_init -#endif - -#ifdef yylex_init_extra -#define core_yylex_init_extra_ALREADY_DEFINED -#else -#define yylex_init_extra core_yylex_init_extra -#endif - -#ifdef yylex_destroy -#define core_yylex_destroy_ALREADY_DEFINED -#else -#define yylex_destroy core_yylex_destroy -#endif - -#ifdef yyget_debug -#define core_yyget_debug_ALREADY_DEFINED -#else -#define yyget_debug core_yyget_debug -#endif - -#ifdef yyset_debug -#define core_yyset_debug_ALREADY_DEFINED -#else -#define yyset_debug core_yyset_debug -#endif - -#ifdef yyget_extra -#define core_yyget_extra_ALREADY_DEFINED -#else -#define yyget_extra core_yyget_extra -#endif - -#ifdef yyset_extra -#define core_yyset_extra_ALREADY_DEFINED -#else -#define yyset_extra core_yyset_extra -#endif - -#ifdef yyget_in -#define core_yyget_in_ALREADY_DEFINED -#else -#define yyget_in core_yyget_in -#endif - -#ifdef yyset_in -#define core_yyset_in_ALREADY_DEFINED -#else -#define yyset_in core_yyset_in -#endif - -#ifdef yyget_out -#define core_yyget_out_ALREADY_DEFINED -#else -#define yyget_out core_yyget_out -#endif - -#ifdef yyset_out -#define core_yyset_out_ALREADY_DEFINED -#else -#define yyset_out core_yyset_out -#endif - -#ifdef yyget_leng -#define core_yyget_leng_ALREADY_DEFINED -#else -#define yyget_leng core_yyget_leng -#endif - -#ifdef yyget_text -#define core_yyget_text_ALREADY_DEFINED -#else -#define yyget_text core_yyget_text -#endif - -#ifdef yyget_lineno -#define core_yyget_lineno_ALREADY_DEFINED -#else -#define yyget_lineno core_yyget_lineno -#endif - -#ifdef yyset_lineno -#define core_yyset_lineno_ALREADY_DEFINED -#else -#define yyset_lineno core_yyset_lineno -#endif - -#ifdef yyget_column -#define core_yyget_column_ALREADY_DEFINED -#else -#define yyget_column core_yyget_column -#endif - -#ifdef yyset_column -#define core_yyset_column_ALREADY_DEFINED -#else -#define yyset_column core_yyset_column -#endif - -#ifdef yywrap -#define core_yywrap_ALREADY_DEFINED -#else -#define yywrap core_yywrap -#endif - -#ifdef yyget_lval -#define core_yyget_lval_ALREADY_DEFINED -#else -#define yyget_lval core_yyget_lval -#endif - -#ifdef yyset_lval -#define core_yyset_lval_ALREADY_DEFINED -#else -#define yyset_lval core_yyset_lval -#endif - -#ifdef yyget_lloc -#define core_yyget_lloc_ALREADY_DEFINED -#else -#define yyget_lloc core_yyget_lloc -#endif - -#ifdef yyset_lloc -#define core_yyset_lloc_ALREADY_DEFINED -#else -#define yyset_lloc core_yyset_lloc -#endif - -#ifdef yyalloc -#define core_yyalloc_ALREADY_DEFINED -#else -#define yyalloc core_yyalloc -#endif - -#ifdef yyrealloc -#define core_yyrealloc_ALREADY_DEFINED -#else -#define yyrealloc core_yyrealloc -#endif - -#ifdef yyfree -#define core_yyfree_ALREADY_DEFINED -#else -#define yyfree core_yyfree -#endif - /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ @@ -422769,6 +425490,7 @@ typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -422799,32 +425521,38 @@ typedef unsigned int flex_uint32_t; #define UINT32_MAX (4294967295U) #endif -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif +#endif /* ! FLEXINT_H */ -#endif /* ! C99 */ +#ifdef __cplusplus -#endif /* ! FLEXINT_H */ +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST -/* begin standard C++ headers. */ +#else /* ! __cplusplus */ -/* TODO: this is always defined, so inline it */ -#define yyconst const +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) +#ifdef YY_USE_CONST +#define yyconst const #else -#define yynoreturn +#define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an - * integer in range [0..255] for use as an array index. +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. */ -#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T @@ -422848,29 +425576,25 @@ typedef void* yyscan_t; * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * + /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START + /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin , yyscanner ) +#define YY_NEW_FILE core_yyrestart(yyin ,yyscanner ) + #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -422890,9 +425614,8 @@ typedef size_t yy_size_t; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) - #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -422907,6 +425630,7 @@ typedef size_t yy_size_t; YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) + #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -422949,7 +425673,7 @@ struct yy_buffer_state int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -422966,7 +425690,7 @@ struct yy_buffer_state * possible backing-up. * * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by + * (via core_yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 @@ -422983,67 +425707,73 @@ struct yy_buffer_state #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) + /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -void yypop_buffer_state ( yyscan_t yyscanner ); +void core_yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void core_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void core_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void core_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void core_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void core_yypop_buffer_state (yyscan_t yyscanner ); + +static void core_yyensure_buffer_stack (yyscan_t yyscanner ); +static void core_yy_load_buffer_state (yyscan_t yyscanner ); +static void core_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER core_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) -static void yyensure_buffer_stack ( yyscan_t yyscanner ); -static void yy_load_buffer_state ( yyscan_t yyscanner ); -static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); -#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) +YY_BUFFER_STATE core_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); +void *core_yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *core_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void core_yyfree (void * ,yyscan_t yyscanner ); -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); +#define yy_new_buffer core_yy_create_buffer -#define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (yyscanner); \ + core_yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } + #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (yyscanner); \ + core_yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } + #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ -#define core_yywrap(yyscanner) (/*CONSTCOND*/1) +#define core_yywrap(n) 1 #define YY_SKIP_YYWRAP -typedef flex_uint8_t YY_CHAR; + +typedef unsigned char YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r -static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); -static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); -static int yy_get_next_buffer ( yyscan_t yyscanner ); -static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. @@ -423054,6 +425784,7 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; + #define YY_NUM_RULES 84 #define YY_END_OF_BUFFER 85 /* This struct is not used in this scanner, @@ -423063,7 +425794,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[309] = +static yyconst flex_int16_t yy_accept[309] = { 0, 0, 0, 12, 12, 0, 0, 0, 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, @@ -423101,7 +425832,7 @@ static const flex_int16_t yy_accept[309] = 28, 28, 28, 55, 55, 28, 28, 0 } ; -static const YY_CHAR yy_ec[256] = +static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 2, 4, 1, 1, 1, 1, 1, 1, 1, @@ -423133,7 +425864,7 @@ static const YY_CHAR yy_ec[256] = 30, 30, 30, 30, 30 } ; -static const YY_CHAR yy_meta[40] = +static yyconst flex_int32_t yy_meta[40] = { 0, 1, 1, 2, 2, 3, 4, 5, 3, 3, 6, 1, 7, 3, 3, 1, 7, 8, 8, 1, 3, @@ -423141,7 +425872,7 @@ static const YY_CHAR yy_meta[40] = 10, 10, 10, 10, 10, 11, 10, 10, 10 } ; -static const flex_int16_t yy_base[376] = +static yyconst flex_int16_t yy_base[376] = { 0, 0, 0, 486, 484, 35, 55, 483, 475, 466, 465, 42, 51, 458, 450, 39, 55, 449, 448, 86, 123, @@ -423186,7 +425917,7 @@ static const flex_int16_t yy_base[376] = 1196, 1205, 1216, 1227, 1238 } ; -static const flex_int16_t yy_def[376] = +static yyconst flex_int16_t yy_def[376] = { 0, 308, 1, 309, 309, 310, 310, 311, 311, 312, 312, 313, 313, 314, 314, 315, 315, 311, 311, 316, 316, @@ -423231,7 +425962,7 @@ static const flex_int16_t yy_def[376] = 308, 308, 308, 308, 308 } ; -static const flex_int16_t yy_nxt[1290] = +static yyconst flex_int16_t yy_nxt[1290] = { 0, 28, 29, 30, 29, 31, 32, 33, 34, 35, 36, 37, 38, 34, 39, 40, 41, 42, 42, 43, 44, @@ -423376,7 +426107,7 @@ static const flex_int16_t yy_nxt[1290] = 308, 308, 308, 308, 308, 308, 308, 308, 308 } ; -static const flex_int16_t yy_chk[1290] = +static yyconst flex_int16_t yy_chk[1290] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -423557,7 +426288,7 @@ bool standard_conforming_strings = true; #define YY_EXTRA_TYPE core_yy_extra_type * /* - * Each call to yylex must set yylloc to the location of the found token + * Each call to core_yylex must set yylloc to the location of the found token * (expressed as a byte offset from the start of the input text). * When we parse a token that requires multiple lexer rules to process, * this should be done in the first such rule, else yylloc will point @@ -423599,7 +426330,6 @@ static void check_escape_warning(core_yyscan_t yyscanner); extern int core_yyget_column(yyscan_t yyscanner); extern void core_yyset_column(int column_no, yyscan_t yyscanner); -#line 1162 "third_party/libpg_query/src_backend_parser_scan.cpp" #define YY_NO_INPUT 1 /* * OK, here is a short description of lex/flex rules behavior. @@ -423629,6 +426359,17 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * The default one is probably not the right thing. */ + + + + + + + + + + + /* * In order to make the world safe for Windows and Mac clients as well as * Unix ones, we accept either \n or \r as a newline. A DOS-style \r\n @@ -423753,7 +426494,7 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * Note that xcstart must appear before operator, as explained above! * Also whitespace (comment) must appear before operator. */ -#line 1316 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 1107 "third_party/libpg_query/src_backend_parser_scan.cpp" #define INITIAL 0 #define xb 1 @@ -423811,7 +426552,7 @@ struct yyguts_t }; /* end struct yyguts_t */ -static int yy_init_globals ( yyscan_t yyscanner ); +static int yy_init_globals (yyscan_t yyscanner ); /* This must go here because YYSTYPE and YYLTYPE are included * from bison output in section 1.*/ @@ -423819,50 +426560,46 @@ static int yy_init_globals ( yyscan_t yyscanner ); # define yylloc yyg->yylloc_r -int yylex_init (yyscan_t* scanner); +int core_yylex_init (yyscan_t* scanner); -int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); +int core_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy ( yyscan_t yyscanner ); - -int yyget_debug ( yyscan_t yyscanner ); +int core_yylex_destroy (yyscan_t yyscanner ); -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); +int core_yyget_debug (yyscan_t yyscanner ); -YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); +void core_yyset_debug (int debug_flag ,yyscan_t yyscanner ); -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); +YY_EXTRA_TYPE core_yyget_extra (yyscan_t yyscanner ); -FILE *yyget_in ( yyscan_t yyscanner ); +void core_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); +FILE *core_yyget_in (yyscan_t yyscanner ); -FILE *yyget_out ( yyscan_t yyscanner ); +void core_yyset_in (FILE * in_str ,yyscan_t yyscanner ); -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); +FILE *core_yyget_out (yyscan_t yyscanner ); - yy_size_t yyget_leng ( yyscan_t yyscanner ); +void core_yyset_out (FILE * out_str ,yyscan_t yyscanner ); -char *yyget_text ( yyscan_t yyscanner ); +yy_size_t core_yyget_leng (yyscan_t yyscanner ); -int yyget_lineno ( yyscan_t yyscanner ); +char *core_yyget_text (yyscan_t yyscanner ); -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); +int core_yyget_lineno (yyscan_t yyscanner ); -int yyget_column ( yyscan_t yyscanner ); +void core_yyset_lineno (int line_number ,yyscan_t yyscanner ); -void yyset_column ( int _column_no , yyscan_t yyscanner ); +YYSTYPE * core_yyget_lval (yyscan_t yyscanner ); -YYSTYPE * yyget_lval ( yyscan_t yyscanner ); +void core_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); -void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); - - YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); + YYLTYPE *core_yyget_lloc (yyscan_t yyscanner ); - void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); + void core_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -423870,41 +426607,33 @@ void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap ( yyscan_t yyscanner ); +extern "C" int core_yywrap (yyscan_t yyscanner ); #else -extern int yywrap ( yyscan_t yyscanner ); -#endif +extern int core_yywrap (yyscan_t yyscanner ); #endif - -#ifndef YY_NO_UNPUT - #endif #ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT + #ifdef __cplusplus -static int yyinput ( yyscan_t yyscanner ); +static int yyinput (yyscan_t yyscanner ); #else -static int input ( yyscan_t yyscanner ); +static int input (yyscan_t yyscanner ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -423912,7 +426641,7 @@ static int input ( yyscan_t yyscanner ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -423936,7 +426665,7 @@ static int input ( yyscan_t yyscanner ); else \ { \ errno=0; \ - while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -423977,10 +426706,10 @@ static int input ( yyscan_t yyscanner ); #ifndef YY_DECL #define YY_DECL_IS_OURS 1 -extern int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); +extern int core_yylex \ + (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner); -#define YY_DECL int yylex \ +#define YY_DECL int core_yylex \ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) #endif /* !YY_DECL */ @@ -423993,7 +426722,7 @@ extern int yylex \ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; +#define YY_BREAK break; #endif #define YY_RULE_SETUP \ @@ -424008,6 +426737,11 @@ YY_DECL int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +#line 404 "third_party/libpg_query/scan.l" + + +#line 1353 "third_party/libpg_query/src_backend_parser_scan.cpp" + yylval = yylval_param; yylloc = yylloc_param; @@ -424023,21 +426757,15 @@ YY_DECL if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (yyscanner); + core_yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); } - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); } - { -#line 404 "third_party/libpg_query/scan.l" - - -#line 1605 "third_party/libpg_query/src_backend_parser_scan.cpp" - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; @@ -424053,7 +426781,7 @@ YY_DECL yy_match: do { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; @@ -424063,9 +426791,9 @@ YY_DECL { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 309 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 308 ); @@ -425106,7 +427834,7 @@ YY_RULE_SETUP #line 1089 "third_party/libpg_query/scan.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2676 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 2454 "third_party/libpg_query/src_backend_parser_scan.cpp" case YY_END_OF_BUFFER: { @@ -425122,7 +427850,7 @@ YY_FATAL_ERROR( "flex scanner jammed" ); /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure + * core_yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a @@ -425183,7 +427911,7 @@ YY_FATAL_ERROR( "flex scanner jammed" ); { yyg->yy_did_buffer_switch_on_eof = 0; - if ( yywrap( yyscanner ) ) + if ( core_yywrap(yyscanner ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -425236,8 +427964,7 @@ YY_FATAL_ERROR( "flex scanner jammed" ); "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ +} /* end of core_yylex */ /* yy_get_next_buffer - try to read in a new buffer * @@ -425280,7 +428007,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); + number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -425300,7 +428027,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) (yyg->yy_c_buf_p - b->yy_ch_buf); @@ -425316,12 +428043,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc( (void *) b->yy_ch_buf, - (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + core_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; + b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -425349,7 +428075,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin , yyscanner); + core_yyrestart(yyin ,yyscanner); } else @@ -425363,15 +428089,12 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( - (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) core_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } yyg->yy_n_chars += number_to_move; @@ -425405,9 +428128,9 @@ static int yy_get_next_buffer (yyscan_t yyscanner) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 309 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; @@ -425434,19 +428157,14 @@ static int yy_get_next_buffer (yyscan_t yyscanner) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 309 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 308); - (void)yyg; return yy_is_jam ? 0 : yy_current_state; } -#ifndef YY_NO_UNPUT - -#endif - #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner) @@ -425489,13 +428207,13 @@ static int yy_get_next_buffer (yyscan_t yyscanner) */ /* Reset buffer status. */ - yyrestart( yyin , yyscanner); + core_yyrestart(yyin ,yyscanner); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( yyscanner ) ) + if ( core_yywrap(yyscanner ) ) return 0; if ( ! yyg->yy_did_buffer_switch_on_eof ) @@ -425527,34 +428245,34 @@ static int yy_get_next_buffer (yyscan_t yyscanner) * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ - void yyrestart (FILE * input_file , yyscan_t yyscanner) + void core_yyrestart (FILE * input_file , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (yyscanner); + core_yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); } - yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); - yy_load_buffer_state( yyscanner ); + core_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + core_yy_load_buffer_state(yyscanner ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) + void core_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* TODO. We should be able to replace this entire function body * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); + * core_yypop_buffer_state(); + * core_yypush_buffer_state(new_buffer); */ - yyensure_buffer_stack (yyscanner); + core_yyensure_buffer_stack (yyscanner); if ( YY_CURRENT_BUFFER == new_buffer ) return; @@ -425567,17 +428285,17 @@ static int yy_get_next_buffer (yyscan_t yyscanner) } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe + * EOF (core_yywrap()) processing, but the only time this flag + * is looked at is after core_yywrap() is called, so it's safe * to go ahead and always set it. */ yyg->yy_did_buffer_switch_on_eof = 1; } -static void yy_load_buffer_state (yyscan_t yyscanner) +static void core_yy_load_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; @@ -425592,35 +428310,35 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param yyscanner The scanner object. * @return the allocated buffer state. */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) + YY_BUFFER_STATE core_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + b = (YY_BUFFER_STATE) core_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + b->yy_ch_buf = (char *) core_yyalloc(b->yy_buf_size + 2 ,yyscanner ); if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer( b, file , yyscanner); + core_yy_init_buffer(b,file ,yyscanner); return b; } /** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() + * @param b a buffer created with core_yy_create_buffer() * @param yyscanner The scanner object. */ - void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) + void core_yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; @@ -425631,28 +428349,28 @@ static void yy_load_buffer_state (yyscan_t yyscanner) YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree( (void *) b->yy_ch_buf , yyscanner ); + core_yyfree((void *) b->yy_ch_buf ,yyscanner ); - yyfree( (void *) b , yyscanner ); + core_yyfree((void *) b ,yyscanner ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. + * such as during a core_yyrestart() or at EOF. */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + static void core_yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) { int oerrno = errno; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flush_buffer( b , yyscanner); + core_yy_flush_buffer(b ,yyscanner); b->yy_input_file = file; b->yy_fill_buffer = 1; - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. + /* If b is the current buffer, then core_yy_init_buffer was _probably_ + * called from core_yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ @@ -425669,7 +428387,7 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ - void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) + void core_yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) @@ -425690,7 +428408,7 @@ static void yy_load_buffer_state (yyscan_t yyscanner) b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); } /** Pushes the new state onto the stack. The new state becomes @@ -425699,15 +428417,15 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param new_buffer The new state. * @param yyscanner The scanner object. */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +void core_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (new_buffer == NULL) return; - yyensure_buffer_stack(yyscanner); + core_yyensure_buffer_stack(yyscanner); - /* This block is copied from yy_switch_to_buffer. */ + /* This block is copied from core_yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ @@ -425721,8 +428439,8 @@ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) yyg->yy_buffer_stack_top++; YY_CURRENT_BUFFER_LVALUE = new_buffer; - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( yyscanner ); + /* copied from core_yy_switch_to_buffer. */ + core_yy_load_buffer_state(yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } @@ -425730,19 +428448,19 @@ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) * The next element becomes the new top. * @param yyscanner The scanner object. */ -void yypop_buffer_state (yyscan_t yyscanner) +void core_yypop_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!YY_CURRENT_BUFFER) return; - yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); + core_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); YY_CURRENT_BUFFER_LVALUE = NULL; if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } } @@ -425750,7 +428468,7 @@ void yypop_buffer_state (yyscan_t yyscanner) /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ -static void yyensure_buffer_stack (yyscan_t yyscanner) +static void core_yyensure_buffer_stack (yyscan_t yyscanner) { yy_size_t num_to_alloc; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; @@ -425761,15 +428479,15 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + num_to_alloc = 1; + yyg->yy_buffer_stack = (struct yy_buffer_state**)core_yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + YY_FATAL_ERROR( "out of dynamic memory in core_yyensure_buffer_stack()" ); + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + yyg->yy_buffer_stack_max = num_to_alloc; yyg->yy_buffer_stack_top = 0; return; @@ -425778,15 +428496,15 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; + int grow_size = 8 /* arbitrary grow size */; num_to_alloc = yyg->yy_buffer_stack_max + grow_size; - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + yyg->yy_buffer_stack = (struct yy_buffer_state**)core_yyrealloc (yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); @@ -425798,9 +428516,9 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) * @param base the character buffer * @param size the size in bytes of the character buffer * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +YY_BUFFER_STATE core_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; @@ -425808,69 +428526,68 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return NULL; + return 0; - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + b = (YY_BUFFER_STATE) core_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_scan_buffer()" ); - b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; + b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer( b , yyscanner ); + core_yy_switch_to_buffer(b ,yyscanner ); return b; } -/** Setup the input buffer state to scan a string. The next call to yylex() will +/** Setup the input buffer state to scan a string. The next call to core_yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * @param yyscanner The scanner object. * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. + * core_yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) +YY_BUFFER_STATE core_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) { - return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); + return core_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner); } -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +/** Setup the input buffer state to scan the given bytes. The next call to core_yylex() will * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) +YY_BUFFER_STATE core_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; - yy_size_t n; - yy_size_t i; + yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) yyalloc( n , yyscanner ); + n = _yybytes_len + 2; + buf = (char *) core_yyalloc(n ,yyscanner ); if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer( buf, n , yyscanner); + b = core_yy_scan_buffer(buf,n ,yyscanner); if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + YY_FATAL_ERROR( "bad buffer in core_yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. @@ -425884,11 +428601,9 @@ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , #define YY_EXIT_FAILURE 2 #endif -static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) +static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) { - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - //( stderr, "%s\n", msg ); + //( stderr, "%s\n", msg ); throw std::runtime_error(msg); // YY_EXIT_FAILURE ); } @@ -425899,7 +428614,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) do \ { \ /* Undo effects of setting up yytext. */ \ - yy_size_t yyless_macro_arg = (n); \ + int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ @@ -425914,7 +428629,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ -YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) +YY_EXTRA_TYPE core_yyget_extra (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyextra; @@ -425923,10 +428638,10 @@ YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) /** Get the current line number. * @param yyscanner The scanner object. */ -int yyget_lineno (yyscan_t yyscanner) +int core_yyget_lineno (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - + if (! YY_CURRENT_BUFFER) return 0; @@ -425936,10 +428651,10 @@ int yyget_lineno (yyscan_t yyscanner) /** Get the current column number. * @param yyscanner The scanner object. */ -int yyget_column (yyscan_t yyscanner) +int core_yyget_column (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - + if (! YY_CURRENT_BUFFER) return 0; @@ -425949,7 +428664,7 @@ int yyget_column (yyscan_t yyscanner) /** Get the input stream. * @param yyscanner The scanner object. */ -FILE *yyget_in (yyscan_t yyscanner) +FILE *core_yyget_in (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyin; @@ -425958,7 +428673,7 @@ FILE *yyget_in (yyscan_t yyscanner) /** Get the output stream. * @param yyscanner The scanner object. */ -FILE *yyget_out (yyscan_t yyscanner) +FILE *core_yyget_out (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyout; @@ -425967,7 +428682,7 @@ FILE *yyget_out (yyscan_t yyscanner) /** Get the length of the current token. * @param yyscanner The scanner object. */ -yy_size_t yyget_leng (yyscan_t yyscanner) +yy_size_t core_yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; @@ -425977,7 +428692,7 @@ yy_size_t yyget_leng (yyscan_t yyscanner) * @param yyscanner The scanner object. */ -char *yyget_text (yyscan_t yyscanner) +char *core_yyget_text (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yytext; @@ -425987,93 +428702,93 @@ char *yyget_text (yyscan_t yyscanner) * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ -void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +void core_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyextra = user_defined ; } /** Set the current line number. - * @param _line_number line number + * @param line_number * @param yyscanner The scanner object. */ -void yyset_lineno (int _line_number , yyscan_t yyscanner) +void core_yyset_lineno (int line_number , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + yy_fatal_error( "core_yyset_lineno called with no buffer" , yyscanner); - yylineno = _line_number; + yylineno = line_number; } /** Set the current column. - * @param _column_no column number + * @param line_number * @param yyscanner The scanner object. */ -void yyset_column (int _column_no , yyscan_t yyscanner) +void core_yyset_column (int column_no , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_column called with no buffer" ); + yy_fatal_error( "core_yyset_column called with no buffer" , yyscanner); - yycolumn = _column_no; + yycolumn = column_no; } /** Set the input stream. This does not discard the current * input buffer. - * @param _in_str A readable stream. + * @param in_str A readable stream. * @param yyscanner The scanner object. - * @see yy_switch_to_buffer + * @see core_yy_switch_to_buffer */ -void yyset_in (FILE * _in_str , yyscan_t yyscanner) +void core_yyset_in (FILE * in_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyin = _in_str ; + yyin = in_str ; } -void yyset_out (FILE * _out_str , yyscan_t yyscanner) +void core_yyset_out (FILE * out_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyout = _out_str ; + yyout = out_str ; } -int yyget_debug (yyscan_t yyscanner) +int core_yyget_debug (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yy_flex_debug; } -void yyset_debug (int _bdebug , yyscan_t yyscanner) +void core_yyset_debug (int bdebug , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flex_debug = _bdebug ; + yy_flex_debug = bdebug ; } /* Accessor methods for yylval and yylloc */ -YYSTYPE * yyget_lval (yyscan_t yyscanner) +YYSTYPE * core_yyget_lval (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylval; } -void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +void core_yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; } -YYLTYPE *yyget_lloc (yyscan_t yyscanner) +YYLTYPE *core_yyget_lloc (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylloc; } -void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) +void core_yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylloc = yylloc_param; @@ -426081,18 +428796,20 @@ void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) /* User-visible API */ -/* yylex_init is special because it creates the scanner itself, so it is +/* core_yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ -int yylex_init(yyscan_t* ptr_yy_globals) + +int core_yylex_init(yyscan_t* ptr_yy_globals) + { if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + *ptr_yy_globals = (yyscan_t) core_yyalloc ( sizeof( struct yyguts_t ), NULL ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; @@ -426105,37 +428822,39 @@ int yylex_init(yyscan_t* ptr_yy_globals) return yy_init_globals ( *ptr_yy_globals ); } -/* yylex_init_extra has the same functionality as yylex_init, but follows the +/* core_yylex_init_extra has the same functionality as core_yylex_init, but follows the * convention of taking the scanner as the last argument. Note however, that * this is a *pointer* to a scanner, as it will be allocated by this call (and * is the reason, too, why this function also must handle its own declaration). - * The user defined value in the first argument will be available to yyalloc in + * The user defined value in the first argument will be available to core_yyalloc in * the yyextra field. */ -int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) + +int core_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + { struct yyguts_t dummy_yyguts; - yyset_extra (yy_user_defined, &dummy_yyguts); + core_yyset_extra (yy_user_defined, &dummy_yyguts); if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } - - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); - + + *ptr_yy_globals = (yyscan_t) core_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } - + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); - - yyset_extra (yy_user_defined, *ptr_yy_globals); - + + core_yyset_extra (yy_user_defined, *ptr_yy_globals); + return yy_init_globals ( *ptr_yy_globals ); } @@ -426143,13 +428862,13 @@ static int yy_init_globals (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. + * This function is called from core_yylex_destroy(), so don't allocate here. */ - yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack = 0; yyg->yy_buffer_stack_top = 0; yyg->yy_buffer_stack_max = 0; - yyg->yy_c_buf_p = NULL; + yyg->yy_c_buf_p = (char *) 0; yyg->yy_init = 0; yyg->yy_start = 0; @@ -426158,46 +428877,41 @@ static int yy_init_globals (yyscan_t yyscanner) yyg->yy_start_stack = NULL; /* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = NULL; - yyout = NULL; -#endif + yyin = (FILE *) 0; + yyout = (FILE *) 0; /* For future reference: Set errno on error, since we are called by - * yylex_init() + * core_yylex_init() */ return 0; } -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (yyscan_t yyscanner) +/* core_yylex_destroy is for both reentrant and non-reentrant scanners. */ +int core_yylex_destroy (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); + core_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(yyscanner); + core_yypop_buffer_state(yyscanner); } /* Destroy the stack itself. */ - yyfree(yyg->yy_buffer_stack , yyscanner); + core_yyfree(yyg->yy_buffer_stack ,yyscanner); yyg->yy_buffer_stack = NULL; /* Destroy the start condition stack. */ - yyfree( yyg->yy_start_stack , yyscanner ); + core_yyfree(yyg->yy_start_stack ,yyscanner ); yyg->yy_start_stack = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ + * core_yylex() is called, initialization will occur. */ yy_init_globals( yyscanner); /* Destroy the main struct (reentrant only). */ - yyfree ( yyscanner , yyscanner ); + core_yyfree ( yyscanner , yyscanner ); yyscanner = NULL; return 0; } @@ -426207,11 +428921,8 @@ int yylex_destroy (yyscan_t yyscanner) */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) { - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; @@ -426219,7 +428930,7 @@ static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscann #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (const char * s , yyscan_t yyscanner) +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) { int n; for ( n = 0; s[n]; ++n ) @@ -426234,10 +428945,11 @@ static int yy_flex_strlen (const char * s , yyscan_t yyscanner) #line 1089 "third_party/libpg_query/scan.l" + /* LCOV_EXCL_STOP */ /* - * Arrange access to yyextra for subroutines of the main yylex() function. + * Arrange access to yyextra for subroutines of the main core_yylex() function. * We expect each subroutine to have a yyscanner parameter. Rather than * use the yyget_xxx functions, which might or might not get inlined by the * compiler, we cheat just a bit and cast yyscanner to the right type. @@ -426282,7 +428994,7 @@ scanner_errposition(int location, core_yyscan_t yyscanner) * Report a lexer or grammar error. * * The message's cursor position is whatever YYLLOC was last set to, - * ie, the start of the current token if called within yylex(), or the + * ie, the start of the current token if called within core_yylex(), or the * most recently lexed token if called from the grammar. * This is OK for syntax error messages from the Bison parser, because Bison * parsers report error as soon as the first unparsable token is reached. @@ -426325,8 +429037,8 @@ scanner_init(const char *str, PGSize slen = strlen(str); yyscan_t scanner; - if (yylex_init(&scanner) != 0) - elog(ERROR, "yylex_init() failed: %m"); + if (core_yylex_init(&scanner) != 0) + elog(ERROR, "core_yylex_init() failed: %m"); core_yyset_extra(yyext, scanner); @@ -426344,7 +429056,7 @@ scanner_init(const char *str, yyext->scanbuflen = slen; memcpy(yyext->scanbuf, str, slen); yyext->scanbuf[slen] = yyext->scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR; - yy_scan_buffer(yyext->scanbuf, slen + 2, scanner); + core_yy_scan_buffer(yyext->scanbuf,slen + 2,scanner); /* initialize literal buffer to a reasonable but expansible size */ yyext->literalalloc = 1024; @@ -426362,7 +429074,7 @@ void scanner_finish(core_yyscan_t yyscanner) { /* - * We don't bother to call yylex_destroy(), because all it would do is + * We don't bother to call core_yylex_destroy(), because all it would do is * pfree a small amount of control storage. It's cheaper to leak the * storage until the parsing context is destroyed. The amount of space * involved is usually negligible compared to the output parse tree diff --git a/c_src/duckdb/duckdb.hpp b/c_src/duckdb/duckdb.hpp index 55b9d04..44ea948 100644 --- a/c_src/duckdb/duckdb.hpp +++ b/c_src/duckdb/duckdb.hpp @@ -10,11 +10,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #pragma once #define DUCKDB_AMALGAMATION 1 -#define DUCKDB_SOURCE_ID "4a89d97db8" -#define DUCKDB_VERSION "v0.10.1" +#define DUCKDB_SOURCE_ID "1601d94f94" +#define DUCKDB_VERSION "v0.10.2" #define DUCKDB_MAJOR_VERSION 0 #define DUCKDB_MINOR_VERSION 10 -#define DUCKDB_PATCH_VERSION "1" +#define DUCKDB_PATCH_VERSION "2" //===----------------------------------------------------------------------===// // DuckDB // @@ -203,27 +203,27 @@ typedef idx_t column_t; typedef idx_t storage_t; template -data_ptr_t data_ptr_cast(SRC *src) { +data_ptr_t data_ptr_cast(SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -const_data_ptr_t const_data_ptr_cast(const SRC *src) { +const_data_ptr_t const_data_ptr_cast(const SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -char *char_ptr_cast(SRC *src) { +char *char_ptr_cast(SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -const char *const_char_ptr_cast(const SRC *src) { +const char *const_char_ptr_cast(const SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -const unsigned char *const_uchar_ptr_cast(const SRC *src) { +const unsigned char *const_uchar_ptr_cast(const SRC *src) { // NOLINT: naming return reinterpret_cast(src); } @@ -238,9 +238,9 @@ uintptr_t CastPointerToValue(SRC *src) { namespace duckdb { // Forward declaration to allow conversion between hugeint and uhugeint -struct uhugeint_t; +struct uhugeint_t; // NOLINT: use numeric casing -struct hugeint_t { +struct hugeint_t { // NOLINT: use numeric casing public: uint64_t lower; int64_t upper; @@ -320,7 +320,7 @@ namespace duckdb { // Escaping " and quoting the value with " class SQLIdentifier { public: - SQLIdentifier(const string &raw_string) : raw_string(raw_string) { + explicit SQLIdentifier(const string &raw_string) : raw_string(raw_string) { } public: @@ -331,7 +331,7 @@ class SQLIdentifier { // Escaping ' and quoting the value with ' class SQLString { public: - SQLString(const string &raw_string) : raw_string(raw_string) { + explicit SQLString(const string &raw_string) : raw_string(raw_string) { } public: @@ -442,10 +442,10 @@ class ParsedExpression; class QueryErrorContext; class TableRef; struct hugeint_t; -class optional_idx; +class optional_idx; // NOLINT: matching std style -inline void assert_restrict_function(const void *left_start, const void *left_end, const void *right_start, - const void *right_end, const char *fname, int linenr) { +inline void AssertRestrictFunction(const void *left_start, const void *left_end, const void *right_start, + const void *right_end, const char *fname, int linenr) { // assert that the two pointers do not overlap #ifdef DEBUG if (!(left_end <= right_start || right_end <= left_start)) { @@ -456,13 +456,13 @@ inline void assert_restrict_function(const void *left_start, const void *left_en } #define ASSERT_RESTRICT(left_start, left_end, right_start, right_end) \ - assert_restrict_function(left_start, left_end, right_start, right_end, __FILE__, __LINE__) + AssertRestrictFunction(left_start, left_end, right_start, right_end, __FILE__, __LINE__) //===--------------------------------------------------------------------===// // Exception Types //===--------------------------------------------------------------------===// -enum class ExceptionType { +enum class ExceptionType : uint8_t { INVALID = 0, // invalid type OUT_OF_RANGE = 1, // value out of range error CONVERSION = 2, // conversion/casting error @@ -517,11 +517,12 @@ class Exception : public std::runtime_error { DUCKDB_API static string ExceptionTypeToString(ExceptionType type); DUCKDB_API static ExceptionType StringToExceptionType(const string &type); - template - static string ConstructMessage(const string &msg, Args... params) { - const std::size_t num_args = sizeof...(Args); - if (num_args == 0) + template + static string ConstructMessage(const string &msg, ARGS... params) { + const std::size_t num_args = sizeof...(ARGS); + if (num_args == 0) { return msg; + } std::vector values; return ConstructMessageRecursive(msg, values, params...); } @@ -543,9 +544,9 @@ class Exception : public std::runtime_error { DUCKDB_API static string ConstructMessageRecursive(const string &msg, std::vector &values); - template + template static string ConstructMessageRecursive(const string &msg, std::vector &values, T param, - Args... params) { + ARGS... params) { values.push_back(ExceptionFormatValue::CreateFormatValue(param)); return ConstructMessageRecursive(msg, values, params...); } @@ -553,7 +554,7 @@ class Exception : public std::runtime_error { DUCKDB_API static bool UncaughtException(); DUCKDB_API static string GetStackTrace(int max_depth = 120); - static string FormatStackTrace(string message = "") { + static string FormatStackTrace(const string &message = "") { return (message + "\n" + GetStackTrace()); } @@ -567,8 +568,8 @@ class ConnectionException : public Exception { public: DUCKDB_API explicit ConnectionException(const string &msg); - template - explicit ConnectionException(const string &msg, Args... params) + template + explicit ConnectionException(const string &msg, ARGS... params) : ConnectionException(ConstructMessage(msg, params...)) { } }; @@ -577,8 +578,8 @@ class PermissionException : public Exception { public: DUCKDB_API explicit PermissionException(const string &msg); - template - explicit PermissionException(const string &msg, Args... params) + template + explicit PermissionException(const string &msg, ARGS... params) : PermissionException(ConstructMessage(msg, params...)) { } }; @@ -587,22 +588,22 @@ class OutOfRangeException : public Exception { public: DUCKDB_API explicit OutOfRangeException(const string &msg); - template - explicit OutOfRangeException(const string &msg, Args... params) + template + explicit OutOfRangeException(const string &msg, ARGS... params) : OutOfRangeException(ConstructMessage(msg, params...)) { } - DUCKDB_API OutOfRangeException(const int64_t value, const PhysicalType origType, const PhysicalType newType); - DUCKDB_API OutOfRangeException(const hugeint_t value, const PhysicalType origType, const PhysicalType newType); - DUCKDB_API OutOfRangeException(const double value, const PhysicalType origType, const PhysicalType newType); - DUCKDB_API OutOfRangeException(const PhysicalType varType, const idx_t length); + DUCKDB_API OutOfRangeException(const int64_t value, const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API OutOfRangeException(const hugeint_t value, const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API OutOfRangeException(const double value, const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API OutOfRangeException(const PhysicalType var_type, const idx_t length); }; class OutOfMemoryException : public Exception { public: DUCKDB_API explicit OutOfMemoryException(const string &msg); - template - explicit OutOfMemoryException(const string &msg, Args... params) + template + explicit OutOfMemoryException(const string &msg, ARGS... params) : OutOfMemoryException(ConstructMessage(msg, params...)) { } }; @@ -611,8 +612,8 @@ class SyntaxException : public Exception { public: DUCKDB_API explicit SyntaxException(const string &msg); - template - explicit SyntaxException(const string &msg, Args... params) : SyntaxException(ConstructMessage(msg, params...)) { + template + explicit SyntaxException(const string &msg, ARGS... params) : SyntaxException(ConstructMessage(msg, params...)) { } }; @@ -620,8 +621,8 @@ class ConstraintException : public Exception { public: DUCKDB_API explicit ConstraintException(const string &msg); - template - explicit ConstraintException(const string &msg, Args... params) + template + explicit ConstraintException(const string &msg, ARGS... params) : ConstraintException(ConstructMessage(msg, params...)) { } }; @@ -630,8 +631,8 @@ class DependencyException : public Exception { public: DUCKDB_API explicit DependencyException(const string &msg); - template - explicit DependencyException(const string &msg, Args... params) + template + explicit DependencyException(const string &msg, ARGS... params) : DependencyException(ConstructMessage(msg, params...)) { } }; @@ -643,12 +644,12 @@ class IOException : public Exception { explicit IOException(ExceptionType exception_type, const string &msg) : Exception(exception_type, msg) { } - template - explicit IOException(const string &msg, Args... params) : IOException(ConstructMessage(msg, params...)) { + template + explicit IOException(const string &msg, ARGS... params) : IOException(ConstructMessage(msg, params...)) { } - template - explicit IOException(const string &msg, const unordered_map &extra_info, Args... params) + template + explicit IOException(const string &msg, const unordered_map &extra_info, ARGS... params) : IOException(ConstructMessage(msg, params...), extra_info) { } }; @@ -657,8 +658,8 @@ class MissingExtensionException : public Exception { public: DUCKDB_API explicit MissingExtensionException(const string &msg); - template - explicit MissingExtensionException(const string &msg, Args... params) + template + explicit MissingExtensionException(const string &msg, ARGS... params) : MissingExtensionException(ConstructMessage(msg, params...)) { } }; @@ -667,8 +668,8 @@ class NotImplementedException : public Exception { public: DUCKDB_API explicit NotImplementedException(const string &msg); - template - explicit NotImplementedException(const string &msg, Args... params) + template + explicit NotImplementedException(const string &msg, ARGS... params) : NotImplementedException(ConstructMessage(msg, params...)) { } }; @@ -682,8 +683,8 @@ class SerializationException : public Exception { public: DUCKDB_API explicit SerializationException(const string &msg); - template - explicit SerializationException(const string &msg, Args... params) + template + explicit SerializationException(const string &msg, ARGS... params) : SerializationException(ConstructMessage(msg, params...)) { } }; @@ -692,8 +693,8 @@ class SequenceException : public Exception { public: DUCKDB_API explicit SequenceException(const string &msg); - template - explicit SequenceException(const string &msg, Args... params) + template + explicit SequenceException(const string &msg, ARGS... params) : SequenceException(ConstructMessage(msg, params...)) { } }; @@ -707,14 +708,14 @@ class FatalException : public Exception { public: explicit FatalException(const string &msg) : FatalException(ExceptionType::FATAL, msg) { } - template - explicit FatalException(const string &msg, Args... params) : FatalException(ConstructMessage(msg, params...)) { + template + explicit FatalException(const string &msg, ARGS... params) : FatalException(ConstructMessage(msg, params...)) { } protected: DUCKDB_API explicit FatalException(ExceptionType type, const string &msg); - template - explicit FatalException(ExceptionType type, const string &msg, Args... params) + template + explicit FatalException(ExceptionType type, const string &msg, ARGS... params) : FatalException(type, ConstructMessage(msg, params...)) { } }; @@ -723,8 +724,8 @@ class InternalException : public Exception { public: DUCKDB_API explicit InternalException(const string &msg); - template - explicit InternalException(const string &msg, Args... params) + template + explicit InternalException(const string &msg, ARGS... params) : InternalException(ConstructMessage(msg, params...)) { } }; @@ -734,12 +735,12 @@ class InvalidInputException : public Exception { DUCKDB_API explicit InvalidInputException(const string &msg); DUCKDB_API explicit InvalidInputException(const string &msg, const unordered_map &extra_info); - template - explicit InvalidInputException(const string &msg, Args... params) + template + explicit InvalidInputException(const string &msg, ARGS... params) : InvalidInputException(ConstructMessage(msg, params...)) { } - template - explicit InvalidInputException(Expression &expr, const string &msg, Args... params) + template + explicit InvalidInputException(Expression &expr, const string &msg, ARGS... params) : InvalidInputException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(expr)) { } }; @@ -748,8 +749,7 @@ class InvalidTypeException : public Exception { public: DUCKDB_API InvalidTypeException(PhysicalType type, const string &msg); DUCKDB_API InvalidTypeException(const LogicalType &type, const string &msg); - DUCKDB_API - InvalidTypeException(const string &msg); //! Needed to be able to recreate the exception after it's been serialized + DUCKDB_API explicit InvalidTypeException(const string &msg); }; class TypeMismatchException : public Exception { @@ -758,16 +758,15 @@ class TypeMismatchException : public Exception { DUCKDB_API TypeMismatchException(const LogicalType &type_1, const LogicalType &type_2, const string &msg); DUCKDB_API TypeMismatchException(optional_idx error_location, const LogicalType &type_1, const LogicalType &type_2, const string &msg); - DUCKDB_API - TypeMismatchException(const string &msg); //! Needed to be able to recreate the exception after it's been serialized + DUCKDB_API explicit TypeMismatchException(const string &msg); }; class ParameterNotAllowedException : public Exception { public: DUCKDB_API explicit ParameterNotAllowedException(const string &msg); - template - explicit ParameterNotAllowedException(const string &msg, Args... params) + template + explicit ParameterNotAllowedException(const string &msg, ARGS... params) : ParameterNotAllowedException(ConstructMessage(msg, params...)) { } }; @@ -805,13 +804,13 @@ class ParameterNotResolvedException : public Exception { namespace duckdb { -template +template struct MemorySafety { #ifdef DEBUG // In DEBUG mode safety is always on - static constexpr bool enabled = true; + static constexpr bool ENABLED = true; #else - static constexpr bool enabled = ENABLED; + static constexpr bool ENABLED = IS_ENABLED; #endif }; @@ -823,11 +822,11 @@ struct MemorySafety { namespace duckdb { -template , bool SAFE = true> -class unique_ptr : public std::unique_ptr<_Tp, _Dp> { +template , bool SAFE = true> +class unique_ptr : public std::unique_ptr { // NOLINT: naming public: - using original = std::unique_ptr<_Tp, _Dp>; - using original::original; + using original = std::unique_ptr; + using original::original; // NOLINT private: static inline void AssertNotNull(const bool null) { @@ -841,17 +840,17 @@ class unique_ptr : public std::unique_ptr<_Tp, _Dp> { } public: - typename std::add_lvalue_reference<_Tp>::type operator*() const { + typename std::add_lvalue_reference::type operator*() const { // NOLINT: hiding on purpose const auto ptr = original::get(); - if (MemorySafety::enabled) { + if (MemorySafety::ENABLED) { AssertNotNull(!ptr); } return *ptr; } - typename original::pointer operator->() const { + typename original::pointer operator->() const { // NOLINT: hiding on purpose const auto ptr = original::get(); - if (MemorySafety::enabled) { + if (MemorySafety::ENABLED) { AssertNotNull(!ptr); } return ptr; @@ -862,15 +861,16 @@ class unique_ptr : public std::unique_ptr<_Tp, _Dp> { [[clang::reinitializes]] #endif inline void - reset(typename original::pointer ptr = typename original::pointer()) noexcept { + reset(typename original::pointer ptr = typename original::pointer()) noexcept { // NOLINT: hiding on purpose original::reset(ptr); } }; -template -class unique_ptr<_Tp[], _Dp, SAFE> : public std::unique_ptr<_Tp[], std::default_delete<_Tp[]>> { +template +class unique_ptr + : public std::unique_ptr> { public: - using original = std::unique_ptr<_Tp[], std::default_delete<_Tp[]>>; + using original = std::unique_ptr>; using original::original; private: @@ -885,9 +885,9 @@ class unique_ptr<_Tp[], _Dp, SAFE> : public std::unique_ptr<_Tp[], std::default_ } public: - typename std::add_lvalue_reference<_Tp>::type operator[](size_t __i) const { + typename std::add_lvalue_reference::type operator[](size_t __i) const { // NOLINT: hiding on purpose const auto ptr = original::get(); - if (MemorySafety::enabled) { + if (MemorySafety::ENABLED) { AssertNotNull(!ptr); } return ptr[__i]; @@ -1097,68 +1097,62 @@ namespace duckdb { template struct AlwaysFalse { - static constexpr bool value = false; + static constexpr bool VALUE = false; }; template using reference = std::reference_wrapper; -template -struct __unique_if -{ - typedef unique_ptr<_Tp, std::default_delete<_Tp>, SAFE> __unique_single; -}; - -template -struct __unique_if<_Tp[]> +template +struct TemplatedUniqueIf { - typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; + typedef unique_ptr, SAFE> templated_unique_single_t; }; -template -struct __unique_if<_Tp[_Np]> +template +struct TemplatedUniqueIf { - typedef void __unique_array_known_bound; + typedef void TemplatedUniqueArrayKnownBound; // NOLINT: mimic std style }; -template +template inline -typename __unique_if<_Tp, true>::__unique_single -make_uniq(_Args&&... __args) +typename TemplatedUniqueIf::templated_unique_single_t +make_uniq(ARGS&&... args) // NOLINT: mimic std style { - return unique_ptr<_Tp, std::default_delete<_Tp>, true>(new _Tp(std::forward<_Args>(__args)...)); + return unique_ptr, true>(new DATA_TYPE(std::forward(args)...)); } -template +template inline -typename __unique_if<_Tp, false>::__unique_single -make_unsafe_uniq(_Args&&... __args) +typename TemplatedUniqueIf::templated_unique_single_t +make_unsafe_uniq(ARGS&&... args) // NOLINT: mimic std style { - return unique_ptr<_Tp, std::default_delete<_Tp>, false>(new _Tp(std::forward<_Args>(__args)...)); + return unique_ptr, false>(new DATA_TYPE(std::forward(args)...)); } -template -inline unique_ptr<_Tp[], std::default_delete<_Tp>, true> -make_uniq_array(size_t __n) +template +inline unique_ptr, true> +make_uniq_array(size_t n) // NOLINT: mimic std style { - return unique_ptr<_Tp[], std::default_delete<_Tp>, true>(new _Tp[__n]()); + return unique_ptr, true>(new DATA_TYPE[n]()); } -template -inline unique_ptr<_Tp[], std::default_delete<_Tp>, false> -make_unsafe_uniq_array(size_t __n) +template +inline unique_ptr, false> +make_unsafe_uniq_array(size_t n) // NOLINT: mimic std style { - return unique_ptr<_Tp[], std::default_delete<_Tp>, false>(new _Tp[__n]()); + return unique_ptr, false>(new DATA_TYPE[n]()); } -template - typename __unique_if<_Tp>::__unique_array_known_bound - make_uniq(_Args&&...) = delete; +template + typename TemplatedUniqueIf::TemplatedUniqueArrayKnownBound + make_uniq(ARGS&&...) = delete; // NOLINT: mimic std style -template -unique_ptr make_uniq_base(Args &&... args) { - return unique_ptr(new T(std::forward(args)...)); +template +unique_ptr make_uniq_base(ARGS &&... args) { // NOLINT: mimic std style + return unique_ptr(new T(std::forward(args)...)); } #ifdef DUCKDB_ENABLE_DEPRECATED_API @@ -1169,7 +1163,7 @@ unique_ptr make_unique_base(Args &&... args) { #endif // DUCKDB_ENABLE_DEPRECATED_API template -unique_ptr unique_ptr_cast(unique_ptr src) { +unique_ptr unique_ptr_cast(unique_ptr src) { // NOLINT: mimic std style return unique_ptr(static_cast(src.release())); } @@ -1195,12 +1189,12 @@ typename std::remove_reference::type&& move(T&& t) noexcept { } #endif -template -static duckdb::unique_ptr make_unique(_Args&&... __args) { +template +static duckdb::unique_ptr make_unique(ARGS&&... __args) { // NOLINT: mimic std style #ifndef DUCKDB_ENABLE_DEPRECATED_API static_assert(sizeof(T) == 0, "Use make_uniq instead of make_unique!"); #endif // DUCKDB_ENABLE_DEPRECATED_API - return unique_ptr(new T(std::forward<_Args>(__args)...)); + return unique_ptr(new T(std::forward(__args)...)); } template @@ -1242,13 +1236,13 @@ T SignValue(T a) { template const T Load(const_data_ptr_t ptr) { T ret; - memcpy(&ret, ptr, sizeof(ret)); + memcpy(&ret, ptr, sizeof(ret)); // NOLINT return ret; } template void Store(const T &val, data_ptr_t ptr) { - memcpy(ptr, (void *)&val, sizeof(val)); + memcpy(ptr, (void *)&val, sizeof(val)); // NOLINT } //! This assigns a shared pointer, but ONLY assigns if "target" is not equal to "source" @@ -1269,19 +1263,20 @@ using const_reference = std::reference_wrapper; //! Returns whether or not two reference wrappers refer to the same object template -bool RefersToSameObject(const reference &A, const reference &B) { - return &A.get() == &B.get(); +bool RefersToSameObject(const reference &a, const reference &b) { + return &a.get() == &b.get(); } template -bool RefersToSameObject(const T &A, const T &B) { - return &A == &B; +bool RefersToSameObject(const T &a, const T &b) { + return &a == &b; } template -void DynamicCastCheck(SRC *source) { +void DynamicCastCheck(const SRC *source) { #ifndef __APPLE__ - D_ASSERT(dynamic_cast(source)); + // Actual check is on the fact that dynamic_cast and reinterpret_cast are equivalent + D_ASSERT(reinterpret_cast(source) == dynamic_cast(source)); #endif } @@ -1306,10 +1301,10 @@ void DynamicCastCheck(SRC *source) { namespace duckdb { -template -class vector : public std::vector<_Tp, std::allocator<_Tp>> { +template +class vector : public std::vector> { // NOLINT: matching name of std public: - using original = std::vector<_Tp, std::allocator<_Tp>>; + using original = std::vector>; using original::original; using size_type = typename original::size_type; using const_reference = typename original::const_reference; @@ -1332,59 +1327,59 @@ class vector : public std::vector<_Tp, std::allocator<_Tp>> { [[clang::reinitializes]] #endif inline void - clear() noexcept { + clear() noexcept { // NOLINT: hiding on purpose original::clear(); } // Because we create the other constructor, the implicitly created constructor // gets deleted, so we have to be explicit vector() = default; - vector(original &&other) : original(std::move(other)) { + vector(original &&other) : original(std::move(other)) { // NOLINT: allow implicit conversion } - template - vector(vector<_Tp, _SAFE> &&other) : original(std::move(other)) { + template + vector(vector &&other) : original(std::move(other)) { // NOLINT: allow implicit conversion } - template - inline typename original::reference get(typename original::size_type __n) { - if (MemorySafety<_SAFE>::enabled) { + template + inline typename original::reference get(typename original::size_type __n) { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED) { AssertIndexInBounds(__n, original::size()); } return original::operator[](__n); } - template - inline typename original::const_reference get(typename original::size_type __n) const { - if (MemorySafety<_SAFE>::enabled) { + template + inline typename original::const_reference get(typename original::size_type __n) const { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED) { AssertIndexInBounds(__n, original::size()); } return original::operator[](__n); } - typename original::reference operator[](typename original::size_type __n) { + typename original::reference operator[](typename original::size_type __n) { // NOLINT: hiding on purpose return get(__n); } - typename original::const_reference operator[](typename original::size_type __n) const { + typename original::const_reference operator[](typename original::size_type __n) const { // NOLINT: hiding on purpose return get(__n); } - typename original::reference front() { + typename original::reference front() { // NOLINT: hiding on purpose return get(0); } - typename original::const_reference front() const { + typename original::const_reference front() const { // NOLINT: hiding on purpose return get(0); } - typename original::reference back() { - if (MemorySafety::enabled && original::empty()) { + typename original::reference back() { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED && original::empty()) { throw InternalException("'back' called on an empty vector!"); } return get(original::size() - 1); } - typename original::const_reference back() const { - if (MemorySafety::enabled && original::empty()) { + typename original::const_reference back() const { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED && original::empty()) { throw InternalException("'back' called on an empty vector!"); } return get(original::size() - 1); @@ -1487,7 +1482,7 @@ using std::atomic; namespace duckdb { template -class optional_ptr { +class optional_ptr { // NOLINT: mimic std casing public: optional_ptr() : ptr(nullptr) { } @@ -1502,7 +1497,7 @@ class optional_ptr { } } - operator bool() const { + operator bool() const { // NOLINT: allow implicit conversion to bool return ptr; } T &operator*() { @@ -1521,16 +1516,16 @@ class optional_ptr { CheckValid(); return ptr; } - T *get() { + T *get() { // NOLINT: mimic std casing // CheckValid(); return ptr; } - const T *get() const { + const T *get() const { // NOLINT: mimic std casing // CheckValid(); return ptr; } // this looks dirty - but this is the default behavior of raw pointers - T *get_mutable() const { + T *get_mutable() const { // NOLINT: mimic std casing // CheckValid(); return ptr; } @@ -1630,7 +1625,7 @@ namespace duckdb { class QueryErrorContext { public: - explicit QueryErrorContext(optional_idx query_location_ = optional_idx()) : query_location(query_location_) { + explicit QueryErrorContext(optional_idx query_location_p = optional_idx()) : query_location(query_location_p) { } //! The location in which the error should be thrown @@ -1652,11 +1647,11 @@ class CatalogException : public Exception { DUCKDB_API explicit CatalogException(const string &msg); DUCKDB_API explicit CatalogException(const string &msg, const unordered_map &extra_info); - template - explicit CatalogException(const string &msg, Args... params) : CatalogException(ConstructMessage(msg, params...)) { + template + explicit CatalogException(const string &msg, ARGS... params) : CatalogException(ConstructMessage(msg, params...)) { } - template - explicit CatalogException(QueryErrorContext error_context, const string &msg, Args... params) + template + explicit CatalogException(QueryErrorContext error_context, const string &msg, ARGS... params) : CatalogException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_context)) { } @@ -1708,7 +1703,7 @@ class TypeCatalogEntry; class Vector; class ClientContext; -struct string_t; +struct string_t; // NOLINT: mimic std casing template using child_list_t = vector>; @@ -1716,12 +1711,12 @@ using child_list_t = vector>; template using buffer_ptr = shared_ptr; -template -buffer_ptr make_buffer(Args &&...args) { - return make_shared(std::forward(args)...); +template +buffer_ptr make_buffer(ARGS &&...args) { // NOLINT: mimic std casing + return make_shared(std::forward(args)...); } -struct list_entry_t { +struct list_entry_t { // NOLINT: mimic std casing list_entry_t() = default; list_entry_t(uint64_t offset, uint64_t length) : offset(offset), length(length) { } @@ -1918,7 +1913,7 @@ enum class LogicalTypeId : uint8_t { struct ExtraTypeInfo; -struct aggregate_state_t; +struct aggregate_state_t; // NOLINT: mimic std casing struct LogicalType { DUCKDB_API LogicalType(); @@ -1929,7 +1924,7 @@ struct LogicalType { DUCKDB_API ~LogicalType(); - inline LogicalTypeId id() const { + inline LogicalTypeId id() const { // NOLINT: mimic std casing return id_; } inline PhysicalType InternalType() const { @@ -1963,6 +1958,9 @@ struct LogicalType { // copy assignment inline LogicalType &operator=(const LogicalType &other) { + if (this == &other) { + return *this; + } id_ = other.id_; physical_type_ = other.physical_type_; type_info_ = other.type_info_; @@ -2021,9 +2019,9 @@ struct LogicalType { bool Contains(LogicalTypeId type_id) const; private: - LogicalTypeId id_; - PhysicalType physical_type_; - shared_ptr type_info_; + LogicalTypeId id_; // NOLINT: allow this naming for legacy reasons + PhysicalType physical_type_; // NOLINT: allow this naming for legacy reasons + shared_ptr type_info_; // NOLINT: allow this naming for legacy reasons private: PhysicalType GetInternalType(); @@ -2204,6 +2202,7 @@ bool ApproxEqual(double l, double r); struct aggregate_state_t { aggregate_state_t() { } + // NOLINTNEXTLINE: work around bug in clang-tidy aggregate_state_t(string function_name_p, LogicalType return_type_p, vector bound_argument_types_p) : function_name(std::move(function_name_p)), return_type(std::move(return_type_p)), bound_argument_types(std::move(bound_argument_types_p)) { @@ -2258,9 +2257,9 @@ bool LogicalType::Contains(F &&predicate) const { namespace duckdb { // Forward declaration to allow conversion between hugeint and uhugeint -struct hugeint_t; +struct hugeint_t; // NOLINT -struct uhugeint_t { +struct uhugeint_t { // NOLINT public: uint64_t lower; uint64_t upper; @@ -2632,8 +2631,8 @@ class StringUtil { //! Join multiple items of container with given size, transformed to string //! using function, into one string using the given separator - template - static string Join(const C &input, S count, const string &separator, Func f) { + template + static string Join(const C &input, S count, const string &separator, FUNC f) { // The result std::string result; @@ -2672,8 +2671,8 @@ class StringUtil { DUCKDB_API static bool CILessThan(const string &l1, const string &l2); //! Format a string using printf semantics - template - static string Format(const string fmt_str, Args... params) { + template + static string Format(const string fmt_str, ARGS... params) { return Exception::ConstructMessage(fmt_str, params...); } @@ -2757,9 +2756,9 @@ class StringUtil { namespace duckdb { -struct date_t; -struct dtime_t; -struct dtime_tz_t; +struct date_t; // NOLINT +struct dtime_t; // NOLINT +struct dtime_tz_t; // NOLINT //! Type used to represent timestamps (seconds,microseconds,milliseconds or nanoseconds since 1970-01-01) struct timestamp_t { // NOLINT @@ -3105,6 +3104,7 @@ TO UnsafeNumericCast(float val) { #include +#include namespace duckdb { @@ -3151,13 +3151,11 @@ struct string_t { } } - string_t(const char *data) - : string_t(data, - UnsafeNumericCast(strlen(data))) { // NOLINT: Allow implicit conversion from `const char*` + string_t(const char *data) // NOLINT: Allow implicit conversion from `const char*` + : string_t(data, UnsafeNumericCast(strlen(data))) { } - string_t(const string &value) - : string_t(value.c_str(), - UnsafeNumericCast(value.size())) { // NOLINT: Allow implicit conversion from `const char*` + string_t(const string &value) // NOLINT: Allow implicit conversion from `const char*` + : string_t(value.c_str(), UnsafeNumericCast(value.size())) { } bool IsInlined() const { @@ -3179,8 +3177,8 @@ struct string_t { return value.inlined.inlined; } - char *GetPrefixWriteable() const { - return (char *)value.inlined.inlined; + char *GetPrefixWriteable() { + return value.inlined.inlined; } idx_t GetSize() const { @@ -3233,20 +3231,21 @@ struct string_t { struct StringComparisonOperators { static inline bool Equals(const string_t &a, const string_t &b) { #ifdef DUCKDB_DEBUG_NO_INLINE - if (a.GetSize() != b.GetSize()) + if (a.GetSize() != b.GetSize()) { return false; + } return (memcmp(a.GetData(), b.GetData(), a.GetSize()) == 0); #endif - uint64_t A = Load(const_data_ptr_cast(&a)); - uint64_t B = Load(const_data_ptr_cast(&b)); - if (A != B) { + uint64_t a_bulk_comp = Load(const_data_ptr_cast(&a)); + uint64_t b_bulk_comp = Load(const_data_ptr_cast(&b)); + if (a_bulk_comp != b_bulk_comp) { // Either length or prefix are different -> not equal return false; } // they have the same length and same prefix! - A = Load(const_data_ptr_cast(&a) + 8u); - B = Load(const_data_ptr_cast(&b) + 8u); - if (A == B) { + a_bulk_comp = Load(const_data_ptr_cast(&a) + 8u); + b_bulk_comp = Load(const_data_ptr_cast(&b) + 8u); + if (a_bulk_comp == b_bulk_comp) { // either they are both inlined (so compare equal) or point to the same string (so compare equal) return true; } @@ -3268,11 +3267,11 @@ struct string_t { const uint32_t min_length = std::min(left_length, right_length); #ifndef DUCKDB_DEBUG_NO_INLINE - uint32_t A = Load(const_data_ptr_cast(left.GetPrefix())); - uint32_t B = Load(const_data_ptr_cast(right.GetPrefix())); + uint32_t a_prefix = Load(const_data_ptr_cast(left.GetPrefix())); + uint32_t b_prefix = Load(const_data_ptr_cast(right.GetPrefix())); // Utility to move 0xa1b2c3d4 into 0xd4c3b2a1, basically inverting the order byte-a-byte - auto bswap = [](uint32_t v) -> uint32_t { + auto byte_swap = [](uint32_t v) -> uint32_t { uint32_t t1 = (v >> 16u) | (v << 16u); uint32_t t2 = t1 & 0x00ff00ff; uint32_t t3 = t1 & 0xff00ff00; @@ -3285,8 +3284,9 @@ struct string_t { // if the prefix is smaller(after bswap), it will stay smaller regardless of the extra bytes // if the prefix is equal, the extra bytes are guaranteed to be /0 for the shorter one - if (A != B) - return bswap(A) > bswap(B); + if (a_prefix != b_prefix) { + return byte_swap(a_prefix) > byte_swap(b_prefix); + } #endif auto memcmp_res = memcmp(left.GetData(), right.GetData(), min_length); return memcmp_res > 0 || (memcmp_res == 0 && left_length > right_length); @@ -3326,7 +3326,7 @@ struct string_t { namespace duckdb { -struct timestamp_t; +struct timestamp_t; // NOLINT: primitive case //! Type used to represent dates (days since 1970-01-01) struct date_t { // NOLINT @@ -3704,10 +3704,10 @@ struct hash { namespace duckdb { -struct dtime_t; -struct date_t; -struct dtime_tz_t; -struct timestamp_t; +struct dtime_t; // NOLINT: literal casing +struct date_t; // NOLINT: literal casing +struct dtime_tz_t; // NOLINT: literal casing +struct timestamp_t; // NOLINT: literal casing class Serializer; class Deserializer; @@ -4044,13 +4044,13 @@ class Value { DUCKDB_API static Value BIT(const string &data); //! Creates an aggregate state - DUCKDB_API static Value AGGREGATE_STATE(const LogicalType &type, const_data_ptr_t data, idx_t len); + DUCKDB_API static Value AGGREGATE_STATE(const LogicalType &type, const_data_ptr_t data, idx_t len); // NOLINT template T GetValue() const; template static Value CreateValue(T value) { - static_assert(AlwaysFalse::value, "No specialization exists for this type"); + static_assert(AlwaysFalse::VALUE, "No specialization exists for this type"); return Value(nullptr); } // Returns the internal value. Unlike GetValue(), this method does not perform casting, and assumes T matches the @@ -4497,7 +4497,9 @@ class CatalogEntry { virtual string ToSQL() const; virtual Catalog &ParentCatalog(); + virtual const Catalog &ParentCatalog() const; virtual SchemaCatalogEntry &ParentSchema(); + virtual const SchemaCatalogEntry &ParentSchema() const; virtual void Verify(Catalog &catalog); @@ -4520,7 +4522,7 @@ class CatalogEntry { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -4537,6 +4539,9 @@ class InCatalogEntry : public CatalogEntry { Catalog &ParentCatalog() override { return catalog; } + const Catalog &ParentCatalog() const override { + return catalog; + } void Verify(Catalog &catalog) override; }; @@ -4676,6 +4681,79 @@ enum class OnEntryNotFound : uint8_t { THROW_EXCEPTION = 0, RETURN_NULL = 1 }; } // namespace duckdb +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/common/error_data.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + +namespace duckdb { +class ParsedExpression; +class TableRef; + +class ErrorData { +public: + //! Not initialized, default constructor + DUCKDB_API ErrorData(); + //! From std::exception + DUCKDB_API ErrorData(const std::exception &ex); // NOLINT: allow implicit construction from exception + //! From a raw string and exception type + DUCKDB_API explicit ErrorData(ExceptionType type, const string &raw_message); + //! From a raw string + DUCKDB_API explicit ErrorData(const string &raw_message); + +public: + //! Throw the error + [[noreturn]] DUCKDB_API void Throw(const string &prepended_message = "") const; + //! Get the internal exception type of the error + DUCKDB_API const ExceptionType &Type() const; + //! Used in clients like C-API, creates the final message and returns a reference to it + DUCKDB_API const string &Message(); + DUCKDB_API const string &RawMessage() { + return raw_message; + } + DUCKDB_API bool operator==(const ErrorData &other) const; + + inline bool HasError() const { + return initialized; + } + const unordered_map &ExtraInfo() const { + return extra_info; + } + + DUCKDB_API void AddErrorLocation(const string &query); + DUCKDB_API void ConvertErrorToJSON(); + + DUCKDB_API void AddQueryLocation(optional_idx query_location); + DUCKDB_API void AddQueryLocation(QueryErrorContext error_context); + DUCKDB_API void AddQueryLocation(const ParsedExpression &ref); + DUCKDB_API void AddQueryLocation(const TableRef &ref); + +private: + //! Whether this ErrorData contains an exception or not + bool initialized; + //! The ExceptionType of the preserved exception + ExceptionType type; + //! The message the exception was constructed with (does not contain the Exception Type) + string raw_message; + //! The final message (stored in the preserved error for compatibility reasons with C-API) + string final_message; + //! Extra exception info + unordered_map extra_info; + +private: + DUCKDB_API static string SanitizeErrorMessage(string error); +}; + +} // namespace duckdb + //===----------------------------------------------------------------------===// // DuckDB @@ -4771,6 +4849,7 @@ class Catalog { DUCKDB_API static Catalog &GetCatalog(AttachedDatabase &db); DUCKDB_API AttachedDatabase &GetAttached(); + DUCKDB_API const AttachedDatabase &GetAttached() const; DUCKDB_API DatabaseInstance &GetDatabase(); virtual bool IsDuckCatalog() { @@ -4787,7 +4866,7 @@ class Catalog { DUCKDB_API idx_t ModifyCatalog(); //! Returns the catalog name - based on how the catalog was attached - DUCKDB_API const string &GetName(); + DUCKDB_API const string &GetName() const; DUCKDB_API idx_t GetOid(); DUCKDB_API virtual string GetCatalogType() = 0; @@ -4891,6 +4970,7 @@ class Catalog { QueryErrorContext error_context = QueryErrorContext()); //! Scans all the schemas in the system one-by-one, invoking the callback for each entry DUCKDB_API virtual void ScanSchemas(ClientContext &context, std::function callback) = 0; + //! Gets the "schema.name" entry of the specified type, if entry does not exist behavior depends on OnEntryNotFound DUCKDB_API optional_ptr GetEntry(ClientContext &context, CatalogType type, const string &schema, const string &name, OnEntryNotFound if_not_found, @@ -5005,6 +5085,7 @@ class Catalog { //! Reference to the database AttachedDatabase &db; +public: private: //! Lookup an entry in the schema, returning a lookup with the entry and schema if they exist CatalogEntryLookup TryLookupEntryInternal(CatalogTransaction transaction, CatalogType type, const string &schema, @@ -5045,7 +5126,7 @@ class Catalog { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -5230,6 +5311,142 @@ enum class FileGlobOptions : uint8_t { } // namespace duckdb + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/common/file_open_flags.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + +namespace duckdb { + +enum class FileLockType : uint8_t { NO_LOCK = 0, READ_LOCK = 1, WRITE_LOCK = 2 }; + +class FileOpenFlags { +public: + static constexpr idx_t FILE_FLAGS_READ = idx_t(1 << 0); + static constexpr idx_t FILE_FLAGS_WRITE = idx_t(1 << 1); + static constexpr idx_t FILE_FLAGS_DIRECT_IO = idx_t(1 << 2); + static constexpr idx_t FILE_FLAGS_FILE_CREATE = idx_t(1 << 3); + static constexpr idx_t FILE_FLAGS_FILE_CREATE_NEW = idx_t(1 << 4); + static constexpr idx_t FILE_FLAGS_APPEND = idx_t(1 << 5); + static constexpr idx_t FILE_FLAGS_PRIVATE = idx_t(1 << 6); + static constexpr idx_t FILE_FLAGS_NULL_IF_NOT_EXISTS = idx_t(1 << 7); + static constexpr idx_t FILE_FLAGS_PARALLEL_ACCESS = idx_t(1 << 8); + +public: + FileOpenFlags() = default; + constexpr FileOpenFlags(idx_t flags) : flags(flags) { // NOLINT: allow implicit conversion + } + constexpr FileOpenFlags(FileLockType lock) : lock(lock) { // NOLINT: allow implicit conversion + } + constexpr FileOpenFlags(FileCompressionType compression) // NOLINT: allow implicit conversion + : compression(compression) { + } + constexpr FileOpenFlags(idx_t flags, FileLockType lock, FileCompressionType compression) + : flags(flags), lock(lock), compression(compression) { + } + + static constexpr FileLockType MergeLock(FileLockType a, FileLockType b) { + return a == FileLockType::NO_LOCK ? b : a; + } + + static constexpr FileCompressionType MergeCompression(FileCompressionType a, FileCompressionType b) { + return a == FileCompressionType::UNCOMPRESSED ? b : a; + } + + inline constexpr FileOpenFlags operator|(FileOpenFlags b) const { + return FileOpenFlags(flags | b.flags, MergeLock(lock, b.lock), MergeCompression(compression, b.compression)); + } + inline FileOpenFlags &operator|=(FileOpenFlags b) { + flags |= b.flags; + lock = MergeLock(lock, b.lock); + compression = MergeCompression(compression, b.compression); + return *this; + } + + FileLockType Lock() { + return lock; + } + + FileCompressionType Compression() { + return compression; + } + + void SetCompression(FileCompressionType new_compression) { + compression = new_compression; + } + + void Verify(); + + inline bool OpenForReading() const { + return flags & FILE_FLAGS_READ; + } + inline bool OpenForWriting() const { + return flags & FILE_FLAGS_WRITE; + } + inline bool DirectIO() const { + return flags & FILE_FLAGS_DIRECT_IO; + } + inline bool CreateFileIfNotExists() const { + return flags & FILE_FLAGS_FILE_CREATE; + } + inline bool OverwriteExistingFile() const { + return flags & FILE_FLAGS_FILE_CREATE_NEW; + } + inline bool OpenForAppending() const { + return flags & FILE_FLAGS_APPEND; + } + inline bool CreatePrivateFile() const { + return flags & FILE_FLAGS_PRIVATE; + } + inline bool ReturnNullIfNotExists() const { + return flags & FILE_FLAGS_NULL_IF_NOT_EXISTS; + } + inline bool RequireParallelAccess() const { + return flags & FILE_FLAGS_PARALLEL_ACCESS; + } + +private: + idx_t flags = 0; + FileLockType lock = FileLockType::NO_LOCK; + FileCompressionType compression = FileCompressionType::UNCOMPRESSED; +}; + +class FileFlags { +public: + //! Open file with read access + static constexpr FileOpenFlags FILE_FLAGS_READ = FileOpenFlags(FileOpenFlags::FILE_FLAGS_READ); + //! Open file with write access + static constexpr FileOpenFlags FILE_FLAGS_WRITE = FileOpenFlags(FileOpenFlags::FILE_FLAGS_WRITE); + //! Use direct IO when reading/writing to the file + static constexpr FileOpenFlags FILE_FLAGS_DIRECT_IO = FileOpenFlags(FileOpenFlags::FILE_FLAGS_DIRECT_IO); + //! Create file if not exists, can only be used together with WRITE + static constexpr FileOpenFlags FILE_FLAGS_FILE_CREATE = FileOpenFlags(FileOpenFlags::FILE_FLAGS_FILE_CREATE); + //! Always create a new file. If a file exists, the file is truncated. Cannot be used together with CREATE. + static constexpr FileOpenFlags FILE_FLAGS_FILE_CREATE_NEW = + FileOpenFlags(FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW); + //! Open file in append mode + static constexpr FileOpenFlags FILE_FLAGS_APPEND = FileOpenFlags(FileOpenFlags::FILE_FLAGS_APPEND); + //! Open file with restrictive permissions (600 on linux/mac) can only be used when creating, throws if file exists + static constexpr FileOpenFlags FILE_FLAGS_PRIVATE = FileOpenFlags(FileOpenFlags::FILE_FLAGS_PRIVATE); + //! Return NULL if the file does not exist instead of throwing an error + static constexpr FileOpenFlags FILE_FLAGS_NULL_IF_NOT_EXISTS = + FileOpenFlags(FileOpenFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS); + //! Multiple threads may perform reads and writes in parallel + static constexpr FileOpenFlags FILE_FLAGS_PARALLEL_ACCESS = + FileOpenFlags(FileOpenFlags::FILE_FLAGS_PARALLEL_ACCESS); +}; + +} // namespace duckdb + #include #undef CreateDirectory @@ -5278,6 +5495,7 @@ struct FileHandle { DUCKDB_API void Sync(); DUCKDB_API void Truncate(int64_t new_size); DUCKDB_API string ReadLine(); + DUCKDB_API bool Trim(idx_t offset_bytes, idx_t length_bytes); DUCKDB_API bool CanSeek(); DUCKDB_API bool IsPipe(); @@ -5299,7 +5517,7 @@ struct FileHandle { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -5308,41 +5526,17 @@ struct FileHandle { string path; }; -enum class FileLockType : uint8_t { NO_LOCK = 0, READ_LOCK = 1, WRITE_LOCK = 2 }; - -class FileFlags { -public: - //! Open file with read access - static constexpr uint8_t FILE_FLAGS_READ = 1 << 0; - //! Open file with write access - static constexpr uint8_t FILE_FLAGS_WRITE = 1 << 1; - //! Use direct IO when reading/writing to the file - static constexpr uint8_t FILE_FLAGS_DIRECT_IO = 1 << 2; - //! Create file if not exists, can only be used together with WRITE - static constexpr uint8_t FILE_FLAGS_FILE_CREATE = 1 << 3; - //! Always create a new file. If a file exists, the file is truncated. Cannot be used together with CREATE. - static constexpr uint8_t FILE_FLAGS_FILE_CREATE_NEW = 1 << 4; - //! Open file in append mode - static constexpr uint8_t FILE_FLAGS_APPEND = 1 << 5; - //! Open file with restrictive permissions (600 on linux/mac) can only be used when creating, throws if file exists - static constexpr uint8_t FILE_FLAGS_PRIVATE = 1 << 6; -}; - class FileSystem { public: DUCKDB_API virtual ~FileSystem(); public: - DUCKDB_API static constexpr FileLockType DEFAULT_LOCK = FileLockType::NO_LOCK; - DUCKDB_API static constexpr FileCompressionType DEFAULT_COMPRESSION = FileCompressionType::UNCOMPRESSED; DUCKDB_API static FileSystem &GetFileSystem(ClientContext &context); DUCKDB_API static FileSystem &GetFileSystem(DatabaseInstance &db); DUCKDB_API static FileSystem &Get(AttachedDatabase &db); - DUCKDB_API virtual unique_ptr OpenFile(const string &path, uint8_t flags, - FileLockType lock = DEFAULT_LOCK, - FileCompressionType compression = DEFAULT_COMPRESSION, - FileOpener *opener = nullptr); + DUCKDB_API virtual unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr); //! Read exactly nr_bytes from the specified location in the file. Fails if nr_bytes could not be read. This is //! equivalent to calling SetFilePointer(location) followed by calling Read(). @@ -5355,23 +5549,27 @@ class FileSystem { DUCKDB_API virtual int64_t Read(FileHandle &handle, void *buffer, int64_t nr_bytes); //! Write nr_bytes from the buffer into the file, moving the file pointer forward by nr_bytes. DUCKDB_API virtual int64_t Write(FileHandle &handle, void *buffer, int64_t nr_bytes); + //! Excise a range of the file. The OS can drop pages from the page-cache, and the file-system is free to deallocate + //! this range (sparse file support). Reads to the range will succeed but will return undefined data. + DUCKDB_API virtual bool Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes); //! Returns the file size of a file handle, returns -1 on error DUCKDB_API virtual int64_t GetFileSize(FileHandle &handle); //! Returns the file last modified time of a file handle, returns timespec with zero on all attributes on error DUCKDB_API virtual time_t GetLastModifiedTime(FileHandle &handle); - //! Returns the file last modified time of a file handle, returns timespec with zero on all attributes on error + //! Returns the file type of the attached handle DUCKDB_API virtual FileType GetFileType(FileHandle &handle); //! Truncate a file to a maximum size of new_size, new_size should be smaller than or equal to the current size of //! the file DUCKDB_API virtual void Truncate(FileHandle &handle, int64_t new_size); //! Check if a directory exists - DUCKDB_API virtual bool DirectoryExists(const string &directory); + DUCKDB_API virtual bool DirectoryExists(const string &directory, optional_ptr opener = nullptr); //! Create a directory if it does not exist - DUCKDB_API virtual void CreateDirectory(const string &directory); + DUCKDB_API virtual void CreateDirectory(const string &directory, optional_ptr opener = nullptr); //! Recursively remove a directory and all files in it - DUCKDB_API virtual void RemoveDirectory(const string &directory); + DUCKDB_API virtual void RemoveDirectory(const string &directory, optional_ptr opener = nullptr); + //! List files in a directory, invoking the callback method for each one with (filename, is_dir) DUCKDB_API virtual bool ListFiles(const string &directory, const std::function &callback, @@ -5379,13 +5577,14 @@ class FileSystem { //! Move a file from source path to the target, StorageManager relies on this being an atomic action for ACID //! properties - DUCKDB_API virtual void MoveFile(const string &source, const string &target); + DUCKDB_API virtual void MoveFile(const string &source, const string &target, + optional_ptr opener = nullptr); //! Check if a file exists - DUCKDB_API virtual bool FileExists(const string &filename); + DUCKDB_API virtual bool FileExists(const string &filename, optional_ptr opener = nullptr); //! Check if path is pipe - DUCKDB_API virtual bool IsPipe(const string &filename); + DUCKDB_API virtual bool IsPipe(const string &filename, optional_ptr opener = nullptr); //! Remove a file from disk - DUCKDB_API virtual void RemoveFile(const string &filename); + DUCKDB_API virtual void RemoveFile(const string &filename, optional_ptr opener = nullptr); //! Sync a file handle to disk DUCKDB_API virtual void FileSync(FileHandle &handle); //! Sets the working directory @@ -5401,7 +5600,7 @@ class FileSystem { //! Expands a given path, including e.g. expanding the home directory of the user DUCKDB_API virtual string ExpandPath(const string &path); //! Returns the system-available memory in bytes. Returns DConstants::INVALID_INDEX if the system function fails. - DUCKDB_API static idx_t GetAvailableMemory(); + DUCKDB_API static optional_idx GetAvailableMemory(); //! Path separator for path DUCKDB_API virtual string PathSeparator(const string &path); //! Checks if path is starts with separator (i.e., '/' on UNIX '\\' on Windows) @@ -5447,6 +5646,8 @@ class FileSystem { DUCKDB_API virtual void Reset(FileHandle &handle); DUCKDB_API virtual idx_t SeekPosition(FileHandle &handle); + //! If FS was manually set by the user + DUCKDB_API virtual bool IsManuallySet(); //! Whether or not we can seek into the file DUCKDB_API virtual bool CanSeek(); //! Whether or not the FS handles plain files on disk. This is relevant for certain optimizations, as random reads @@ -5465,6 +5666,19 @@ class FileSystem { DUCKDB_API static bool IsRemoteFile(const string &path); DUCKDB_API virtual void SetDisabledFileSystems(const vector &names); + +public: + template + TARGET &Cast() { + DynamicCastCheck(this); + return reinterpret_cast(*this); + } + + template + const TARGET &Cast() const { + DynamicCastCheck(this); + return reinterpret_cast(*this); + } }; } // namespace duckdb @@ -5476,11 +5690,11 @@ namespace duckdb { class BufferedFileWriter : public WriteStream { public: - static constexpr uint8_t DEFAULT_OPEN_FLAGS = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; + static constexpr FileOpenFlags DEFAULT_OPEN_FLAGS = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; //! Serializes to a buffer allocated by the serializer, will expand when //! writing past the initial threshold - DUCKDB_API BufferedFileWriter(FileSystem &fs, const string &path, uint8_t open_flags = DEFAULT_OPEN_FLAGS); + DUCKDB_API BufferedFileWriter(FileSystem &fs, const string &path, FileOpenFlags open_flags = DEFAULT_OPEN_FLAGS); FileSystem &fs; string path; @@ -5662,7 +5876,7 @@ struct SelectionVector { explicit SelectionVector(buffer_ptr data) { Initialize(std::move(data)); } - SelectionVector &operator=(SelectionVector &&other) { + SelectionVector &operator=(SelectionVector &&other) noexcept { sel_vector = other.sel_vector; other.sel_vector = nullptr; selection_data = std::move(other.selection_data); @@ -5702,24 +5916,24 @@ struct SelectionVector { sel_vector = other.sel_vector; } - inline void set_index(idx_t idx, idx_t loc) { + inline void set_index(idx_t idx, idx_t loc) { // NOLINT: allow casing for legacy reasons sel_vector[idx] = UnsafeNumericCast(loc); } - inline void swap(idx_t i, idx_t j) { + inline void swap(idx_t i, idx_t j) { // NOLINT: allow casing for legacy reasons sel_t tmp = sel_vector[i]; sel_vector[i] = sel_vector[j]; sel_vector[j] = tmp; } - inline idx_t get_index(idx_t idx) const { + inline idx_t get_index(idx_t idx) const { // NOLINT: allow casing for legacy reasons return sel_vector ? sel_vector[idx] : idx; } - sel_t *data() { + sel_t *data() { // NOLINT: allow casing for legacy reasons return sel_vector; } - const sel_t *data() const { + const sel_t *data() const { // NOLINT: allow casing for legacy reasons return sel_vector; } - buffer_ptr sel_data() { + buffer_ptr sel_data() { // NOLINT: allow casing for legacy reasons return selection_data; } buffer_ptr Slice(const SelectionVector &sel, idx_t count) const; @@ -5738,7 +5952,7 @@ struct SelectionVector { class OptionalSelection { public: - explicit inline OptionalSelection(SelectionVector *sel_p) { + explicit OptionalSelection(SelectionVector *sel_p) { Initialize(sel_p); } void Initialize(SelectionVector *sel_p) { @@ -5749,7 +5963,7 @@ class OptionalSelection { } } - inline operator SelectionVector *() { + inline operator SelectionVector *() { // NOLINT: allow implicit conversion to SelectionVector return sel; } @@ -5788,10 +6002,10 @@ class ManagedSelection { bool Initialized() const { return initialized; } - void Initialize(idx_t size) { + void Initialize(idx_t new_size) { D_ASSERT(!initialized); - this->size = size; - sel_vec.Initialize(size); + this->size = new_size; + sel_vec.Initialize(new_size); internal_opt_selvec.Initialize(&sel_vec); initialized = true; } @@ -6267,7 +6481,7 @@ struct PrivateAllocatorData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -6289,10 +6503,10 @@ class AllocatedData { DUCKDB_API AllocatedData(AllocatedData &&other) noexcept; DUCKDB_API AllocatedData &operator=(AllocatedData &&) noexcept; - data_ptr_t get() { + data_ptr_t get() { // NOLINT: matching std style return pointer; } - const_data_ptr_t get() const { + const_data_ptr_t get() const { // NOLINT: matching std style return pointer; } idx_t GetSize() const { @@ -6408,7 +6622,7 @@ class ArenaAllocator { static constexpr const idx_t ARENA_ALLOCATOR_INITIAL_CAPACITY = 2048; public: - DUCKDB_API ArenaAllocator(Allocator &allocator, idx_t initial_capacity = ARENA_ALLOCATOR_INITIAL_CAPACITY); + DUCKDB_API explicit ArenaAllocator(Allocator &allocator, idx_t initial_capacity = ARENA_ALLOCATOR_INITIAL_CAPACITY); DUCKDB_API ~ArenaAllocator(); DUCKDB_API data_ptr_t Allocate(idx_t size); @@ -6417,6 +6631,9 @@ class ArenaAllocator { DUCKDB_API data_ptr_t AllocateAligned(idx_t size); DUCKDB_API data_ptr_t ReallocateAligned(data_ptr_t pointer, idx_t old_size, idx_t size); + //! Increment the internal cursor (if required) so the next allocation is guaranteed to be aligned to 8 bytes + DUCKDB_API void AlignNext(); + //! Resets the current head and destroys all previous arena chunks DUCKDB_API void Reset(); DUCKDB_API void Destroy(); @@ -6457,7 +6674,7 @@ namespace duckdb { //! returned pointer will remain valid until the StringHeap is destroyed class StringHeap { public: - DUCKDB_API StringHeap(Allocator &allocator = Allocator::DefaultAllocator()); + DUCKDB_API explicit StringHeap(Allocator &allocator = Allocator::DefaultAllocator()); DUCKDB_API void Destroy(); DUCKDB_API void Move(StringHeap &other); @@ -6567,10 +6784,10 @@ struct MainHeader { static void CheckMagicBytes(FileHandle &handle); string LibraryGitDesc() { - return string((char *)library_git_desc, 0, MAX_VERSION_SIZE); + return string(char_ptr_cast(library_git_desc), 0, MAX_VERSION_SIZE); } string LibraryGitHash() { - return string((char *)library_git_hash, 0, MAX_VERSION_SIZE); + return string(char_ptr_cast(library_git_hash), 0, MAX_VERSION_SIZE); } void Write(WriteStream &ser); @@ -6788,7 +7005,7 @@ class VectorBuffer { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -7029,9 +7246,9 @@ class Vector { //! Create a vector that references the other vector DUCKDB_API Vector(Vector &other); //! Create a vector that slices another vector - DUCKDB_API explicit Vector(Vector &other, const SelectionVector &sel, idx_t count); + DUCKDB_API explicit Vector(const Vector &other, const SelectionVector &sel, idx_t count); //! Create a vector that slices another vector between a pair of offsets - DUCKDB_API explicit Vector(Vector &other, idx_t offset, idx_t end); + DUCKDB_API explicit Vector(const Vector &other, idx_t offset, idx_t end); //! Create a vector of size one holding the passed on value DUCKDB_API explicit Vector(const Value &value); //! Create a vector of size tuple_count (non-standard) @@ -7237,19 +7454,19 @@ struct ConstantVector { struct DictionaryVector { static inline const SelectionVector &SelVector(const Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((const DictionaryBuffer &)*vector.buffer).GetSelVector(); + return vector.buffer->Cast().GetSelVector(); } static inline SelectionVector &SelVector(Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((DictionaryBuffer &)*vector.buffer).GetSelVector(); + return vector.buffer->Cast().GetSelVector(); } static inline const Vector &Child(const Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((const VectorChildBuffer &)*vector.auxiliary).data; + return vector.auxiliary->Cast().data; } static inline Vector &Child(Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((VectorChildBuffer &)*vector.auxiliary).data; + return vector.auxiliary->Cast().data; } }; @@ -7336,6 +7553,10 @@ struct ListVector { DUCKDB_API static void GetConsecutiveChildSelVector(Vector &list, SelectionVector &sel, idx_t offset, idx_t count); //! Share the entry of the other list vector DUCKDB_API static void ReferenceEntry(Vector &vector, Vector &other); + +private: + template + static T &GetEntryInternal(T &vector); }; struct StringVector { @@ -7439,6 +7660,10 @@ struct ArrayVector { DUCKDB_API static Vector &GetEntry(Vector &vector); //! Gets the total size of the underlying child-vector of an array DUCKDB_API static idx_t GetTotalSize(const Vector &vector); + +private: + template + static T &GetEntryInternal(T &vector); }; enum class UnionInvalidReason : uint8_t { @@ -7498,7 +7723,7 @@ struct UnionVector { struct SequenceVector { static void GetSequence(const Vector &vector, int64_t &start, int64_t &increment, int64_t &sequence_count) { D_ASSERT(vector.GetVectorType() == VectorType::SEQUENCE_VECTOR); - auto data = (int64_t *)vector.buffer->GetData(); + auto data = reinterpret_cast(vector.buffer->GetData()); start = data[0]; increment = data[1]; sequence_count = data[2]; @@ -7652,78 +7877,6 @@ struct ArrowArrayStream { #endif -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/common/error_data.hpp -// -// -//===----------------------------------------------------------------------===// - - - - - - -namespace duckdb { -class ParsedExpression; -class TableRef; - -class ErrorData { -public: - //! Not initialized, default constructor - DUCKDB_API ErrorData(); - //! From std::exception - DUCKDB_API ErrorData(const std::exception &ex); // NOLINT: allow implicit construction from exception - //! From a raw string and exception type - DUCKDB_API explicit ErrorData(ExceptionType type, const string &raw_message); - //! From a raw string - DUCKDB_API explicit ErrorData(const string &raw_message); - -public: - //! Throw the error - [[noreturn]] DUCKDB_API void Throw(const string &prepended_message = "") const; - //! Get the internal exception type of the error - DUCKDB_API const ExceptionType &Type() const; - //! Used in clients like C-API, creates the final message and returns a reference to it - DUCKDB_API const string &Message(); - DUCKDB_API const string &RawMessage() { - return raw_message; - } - DUCKDB_API bool operator==(const ErrorData &other) const; - - inline bool HasError() const { - return initialized; - } - const unordered_map &ExtraInfo() const { - return extra_info; - } - - DUCKDB_API void AddErrorLocation(const string &query); - DUCKDB_API void ConvertErrorToJSON(); - - DUCKDB_API void AddQueryLocation(optional_idx query_location); - DUCKDB_API void AddQueryLocation(QueryErrorContext error_context); - DUCKDB_API void AddQueryLocation(const ParsedExpression &ref); - DUCKDB_API void AddQueryLocation(const TableRef &ref); - -private: - //! Whether this ErrorData contains an exception or not - bool initialized; - //! The ExceptionType of the preserved exception - ExceptionType type; - //! The message the exception was constructed with (does not contain the Exception Type) - string raw_message; - //! The final message (stored in the preserved error for compatibility reasons with C-API) - string final_message; - //! Extra exception info - unordered_map extra_info; - -private: - DUCKDB_API static string SanitizeErrorMessage(string error); -}; - -} // namespace duckdb @@ -7782,7 +7935,8 @@ class ChunkScanState { #include namespace duckdb { -enum ArrowOffsetSize { REGULAR, LARGE }; + +enum class ArrowOffsetSize : uint8_t { REGULAR, LARGE }; //! A set of properties from the client context that can be used to interpret the query result struct ClientProperties { @@ -7818,7 +7972,7 @@ class ArrowArrayWrapper { arrow_array.length = 0; arrow_array.release = nullptr; } - ArrowArrayWrapper(ArrowArrayWrapper &&other) : arrow_array(other.arrow_array) { + ArrowArrayWrapper(ArrowArrayWrapper &&other) noexcept : arrow_array(other.arrow_array) { other.arrow_array.release = nullptr; } ~ArrowArrayWrapper(); @@ -7974,7 +8128,7 @@ class DataChunk { //! Slice all Vectors from other.data[i] to data[i + 'col_offset'] //! Turning all Vectors into Dictionary Vectors, using 'sel' - DUCKDB_API void Slice(DataChunk &other, const SelectionVector &sel, idx_t count, idx_t col_offset = 0); + DUCKDB_API void Slice(const DataChunk &other, const SelectionVector &sel, idx_t count, idx_t col_offset = 0); //! Slice a DataChunk from "offset" to "offset + count" DUCKDB_API void Slice(idx_t offset, idx_t count); @@ -7993,7 +8147,7 @@ class DataChunk { DUCKDB_API void Hash(vector &column_ids, Vector &result); //! Returns a list of types of the vectors of this data chunk - DUCKDB_API vector GetTypes(); + DUCKDB_API vector GetTypes() const; //! Converts this DataChunk to a printable string representation DUCKDB_API string ToString() const; @@ -8092,54 +8246,72 @@ struct VectorOperations { //===--------------------------------------------------------------------===// // Select Comparisons //===--------------------------------------------------------------------===// - static idx_t Equals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel); - static idx_t NotEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t GreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t GreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t LessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t LessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t Equals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t NotEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t GreaterThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t GreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t LessThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t LessThanEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A != B with nulls being equal - static idx_t DistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctFrom(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel); // true := A == B with nulls being equal - static idx_t NotDistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t NotDistinctFrom(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel); // true := A > B with nulls being maximal - static idx_t DistinctGreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctGreaterThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A >= B with nulls being maximal - static idx_t DistinctGreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctGreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A < B with nulls being maximal - static idx_t DistinctLessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctLessThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A <= B with nulls being maximal - static idx_t DistinctLessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctLessThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A > B with nulls being minimal - static idx_t DistinctGreaterThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctGreaterThanNullsFirst(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A < B with nulls being minimal - static idx_t DistinctLessThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctLessThanNullsFirst(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); //===--------------------------------------------------------------------===// // Nested Comparisons //===--------------------------------------------------------------------===// // true := A != B with nulls being equal - static idx_t NestedNotEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t NestedNotEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A == B with nulls being equal - static idx_t NestedEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t NestedEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); //===--------------------------------------------------------------------===// // Hash functions @@ -8959,7 +9131,7 @@ template struct UnaryStringOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto vector = (Vector *)dataptr; + auto vector = reinterpret_cast(dataptr); return OP::template Operation(input, *vector); } }; @@ -9101,7 +9273,8 @@ struct UnaryExecutor { template > static void Execute(Vector &input, Vector &result, idx_t count, FUNC fun) { - ExecuteStandard(input, result, count, (void *)&fun, false); + ExecuteStandard(input, result, count, + reinterpret_cast(&fun), false); } template @@ -9138,95 +9311,6 @@ struct UnaryExecutor { -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/common/cycle_counter.hpp -// -// -//===----------------------------------------------------------------------===// - - - - -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/common/chrono.hpp -// -// -//===----------------------------------------------------------------------===// - - - -#include - -namespace duckdb { -using std::chrono::duration; -using std::chrono::duration_cast; -using std::chrono::high_resolution_clock; -using std::chrono::milliseconds; -using std::chrono::system_clock; -using std::chrono::time_point; -} // namespace duckdb - - -namespace duckdb { - -//! The cycle counter can be used to measure elapsed cycles for a function, expression and ... -//! Optimized by sampling mechanism. Once per 100 times. -//! //Todo Can be optimized further by calling RDTSC once per sample -class CycleCounter { - friend struct ExpressionInfo; - friend struct ExpressionRootInfo; - static constexpr int SAMPLING_RATE = 50; - -public: - CycleCounter() { - } - // Next_sample determines if a sample needs to be taken, if so start the profiler - void BeginSample() { - if (current_count >= next_sample) { - tmp = Tick(); - } - } - - // End the sample - void EndSample(int chunk_size) { - if (current_count >= next_sample) { - time += Tick() - tmp; - } - if (current_count >= next_sample) { - next_sample = SAMPLING_RATE; - ++sample_count; - sample_tuples_count += chunk_size; - current_count = 0; - } else { - ++current_count; - } - tuples_count += chunk_size; - } - -private: - uint64_t Tick() const; - // current number on RDT register - uint64_t tmp; - // Elapsed cycles - uint64_t time = 0; - //! Count the number of time the executor called since last sampling - uint64_t current_count = 0; - //! Show the next sample - uint64_t next_sample = 0; - //! Count the number of samples - uint64_t sample_count = 0; - //! Count the number of tuples sampled - uint64_t sample_tuples_count = 0; - //! Count the number of ALL tuples - uint64_t tuples_count = 0; -}; - -} // namespace duckdb - //===----------------------------------------------------------------------===// // DuckDB // @@ -9333,7 +9417,8 @@ using named_parameter_map_t = case_insensitive_map_t; namespace duckdb { -enum ExternalDependenciesType { PYTHON_DEPENDENCY }; +enum class ExternalDependenciesType : uint8_t { PYTHON_DEPENDENCY }; + class ExternalDependency { public: explicit ExternalDependency(ExternalDependenciesType type_p) : type(type_p) {}; @@ -9523,7 +9608,8 @@ enum class ExpressionType : uint8_t { COLLATE = 230, LAMBDA = 231, POSITIONAL_REFERENCE = 232, - BOUND_LAMBDA_REF = 233 + BOUND_LAMBDA_REF = 233, + BOUND_EXPANDED = 234 }; //===--------------------------------------------------------------------===// @@ -9577,7 +9663,8 @@ enum class ExpressionClass : uint8_t { //===--------------------------------------------------------------------===// // Miscellaneous //===--------------------------------------------------------------------===// - BOUND_EXPRESSION = 50 + BOUND_EXPRESSION = 50, + BOUND_EXPANDED = 51 }; DUCKDB_API string ExpressionTypeToString(ExpressionType type); @@ -9723,11 +9810,11 @@ class ParserException : public Exception { DUCKDB_API explicit ParserException(const string &msg); DUCKDB_API explicit ParserException(const string &msg, const unordered_map &extra_info); - template - explicit ParserException(const string &msg, Args... params) : ParserException(ConstructMessage(msg, params...)) { + template + explicit ParserException(const string &msg, ARGS... params) : ParserException(ConstructMessage(msg, params...)) { } - template - explicit ParserException(optional_idx error_location, const string &msg, Args... params) + template + explicit ParserException(optional_idx error_location, const string &msg, ARGS... params) : ParserException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_location)) { } @@ -10133,13 +10220,13 @@ struct FunctionData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } // FIXME: this function should be removed in the future template TARGET &CastNoConst() const { - return const_cast(reinterpret_cast(*this)); + return const_cast(Cast()); // NOLINT: FIXME } }; @@ -10147,7 +10234,7 @@ struct TableFunctionData : public FunctionData { // used to pass on projections to table functions that support them. NB, can contain COLUMN_IDENTIFIER_ROW_ID vector column_ids; - DUCKDB_API virtual ~TableFunctionData(); + DUCKDB_API ~TableFunctionData() override; DUCKDB_API unique_ptr Copy() const override; DUCKDB_API bool Equals(const FunctionData &other) const override; @@ -10265,7 +10352,6 @@ struct ExpressionState { vector> child_states; vector types; DataChunk intermediate_chunk; - CycleCounter profiler; public: void AddChild(Expression *expr); @@ -10284,14 +10370,14 @@ struct ExpressionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct ExecuteFunctionState : public ExpressionState { ExecuteFunctionState(const Expression &expr, ExpressionExecutorState &root); - ~ExecuteFunctionState(); + ~ExecuteFunctionState() override; unique_ptr local_state; @@ -10306,7 +10392,6 @@ struct ExpressionExecutorState { unique_ptr root_state; ExpressionExecutor *executor = nullptr; - CycleCounter profiler; void Verify(); }; @@ -10902,9 +10987,9 @@ struct NumericValueUnion { uint64_t ubigint; hugeint_t hugeint; uhugeint_t uhugeint; - float float_; - double double_; - } value_; + float float_; // NOLINT + double double_; // NOLINT + } value_; // NOLINT template T &GetReferenceUnsafe(); @@ -11287,14 +11372,14 @@ struct FunctionLocalState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; class Binder; class BoundFunctionExpression; -class DependencyList; +class LogicalDependencyList; class ScalarFunctionCatalogEntry; struct FunctionStatisticsInput { @@ -11319,7 +11404,7 @@ typedef unique_ptr (*init_local_state_t)(ExpressionState &st const BoundFunctionExpression &expr, FunctionData *bind_data); //! The type to add the dependencies of this BoundFunctionExpression to the set of dependencies -typedef void (*dependency_function_t)(BoundFunctionExpression &expr, DependencyList &dependencies); +typedef void (*dependency_function_t)(BoundFunctionExpression &expr, LogicalDependencyList &dependencies); //! The type to propagate statistics for this scalar function typedef unique_ptr (*function_statistics_t)(ClientContext &context, FunctionStatisticsInput &input); //! The type to bind lambda-specific parameter types @@ -11329,7 +11414,7 @@ typedef void (*function_serialize_t)(Serializer &serializer, const optional_ptr< const ScalarFunction &function); typedef unique_ptr (*function_deserialize_t)(Deserializer &deserializer, ScalarFunction &function); -class ScalarFunction : public BaseScalarFunction { +class ScalarFunction : public BaseScalarFunction { // NOLINT: work-around bug in clang-tidy public: DUCKDB_API ScalarFunction(string name, vector arguments, LogicalType return_type, scalar_function_t function, bind_scalar_function_t bind = nullptr, @@ -11393,7 +11478,7 @@ class ScalarFunction : public BaseScalarFunction { public: template - static scalar_function_t GetScalarUnaryFunction(LogicalType type) { + static scalar_function_t GetScalarUnaryFunction(const LogicalType &type) { scalar_function_t function; switch (type.id()) { case LogicalTypeId::TINYINT: @@ -11439,7 +11524,7 @@ class ScalarFunction : public BaseScalarFunction { } template - static scalar_function_t GetScalarUnaryFunctionFixedReturn(LogicalType type) { + static scalar_function_t GetScalarUnaryFunctionFixedReturn(const LogicalType &type) { scalar_function_t function; switch (type.id()) { case LogicalTypeId::TINYINT: @@ -12095,6 +12180,8 @@ class AggregateExecutor { op.Right(i, limit); break; case 0x03: + default: + D_ASSERT(overlap == 0x03); // i ∈ F ∩ P limit = MinValue(right->end, left->end); op.Both(i, limit); @@ -12401,7 +12488,7 @@ class Expression : public BaseExpression { if (!BaseExpression::Equals(other)) { return false; } - return return_type == ((Expression &)other).return_type; + return return_type == reinterpret_cast(other).return_type; } static bool Equals(const Expression &left, const Expression &right) { return left.Equals(right); @@ -12657,7 +12744,7 @@ typedef void (*aggregate_serialize_t)(Serializer &serializer, const optional_ptr const AggregateFunction &function); typedef unique_ptr (*aggregate_deserialize_t)(Deserializer &deserializer, AggregateFunction &function); -class AggregateFunction : public BaseScalarFunction { +class AggregateFunction : public BaseScalarFunction { // NOLINT: work-around bug in clang-tidy public: AggregateFunction(const string &name, const vector &arguments, const LogicalType &return_type, aggregate_size_t state_size, aggregate_initialize_t initialize, aggregate_update_t update, @@ -12879,31 +12966,33 @@ class AggregateFunction : public BaseScalarFunction { namespace duckdb { +// NOLINTBEGIN + struct UDFWrapper { public: - template - inline static scalar_function_t CreateScalarFunction(const string &name, TR (*udf_func)(Args...)) { - const std::size_t num_template_argc = sizeof...(Args); + template + inline static scalar_function_t CreateScalarFunction(const string &name, TR (*udf_func)(ARGS...)) { + const std::size_t num_template_argc = sizeof...(ARGS); switch (num_template_argc) { case 1: - return CreateUnaryFunction(name, udf_func); + return CreateUnaryFunction(name, udf_func); case 2: - return CreateBinaryFunction(name, udf_func); + return CreateBinaryFunction(name, udf_func); case 3: - return CreateTernaryFunction(name, udf_func); + return CreateTernaryFunction(name, udf_func); default: // LCOV_EXCL_START throw std::runtime_error("UDF function only supported until ternary!"); } // LCOV_EXCL_STOP } - template - inline static scalar_function_t CreateScalarFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(Args...)) { + template + inline static scalar_function_t CreateScalarFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(ARGS...)) { if (!TypesMatch(ret_type)) { // LCOV_EXCL_START throw std::runtime_error("Return type doesn't match with the first template type."); } // LCOV_EXCL_STOP - const std::size_t num_template_types = sizeof...(Args); + const std::size_t num_template_types = sizeof...(ARGS); if (num_template_types != args.size()) { // LCOV_EXCL_START throw std::runtime_error( "The number of templated types should be the same quantity of the LogicalType arguments."); @@ -12911,25 +13000,25 @@ struct UDFWrapper { switch (num_template_types) { case 1: - return CreateUnaryFunction(name, args, ret_type, udf_func); + return CreateUnaryFunction(name, args, ret_type, udf_func); case 2: - return CreateBinaryFunction(name, args, ret_type, udf_func); + return CreateBinaryFunction(name, args, ret_type, udf_func); case 3: - return CreateTernaryFunction(name, args, ret_type, udf_func); + return CreateTernaryFunction(name, args, ret_type, udf_func); default: // LCOV_EXCL_START throw std::runtime_error("UDF function only supported until ternary!"); } // LCOV_EXCL_STOP } - template + template inline static void RegisterFunction(const string &name, scalar_function_t udf_function, ClientContext &context, LogicalType varargs = LogicalType(LogicalTypeId::INVALID)) { vector arguments; - GetArgumentTypesRecursive(arguments); + GetArgumentTypesRecursive(arguments); LogicalType ret_type = GetArgumentType(); - RegisterFunction(name, arguments, ret_type, udf_function, context, varargs); + RegisterFunction(name, arguments, ret_type, std::move(udf_function), context, std::move(varargs)); } static void RegisterFunction(string name, vector args, LogicalType ret_type, @@ -12948,8 +13037,8 @@ struct UDFWrapper { } template - inline static AggregateFunction CreateAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_type) { + inline static AggregateFunction CreateAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type) { if (!TypesMatch(ret_type)) { // LCOV_EXCL_START throw std::runtime_error("The return argument don't match!"); } // LCOV_EXCL_STOP @@ -12962,33 +13051,34 @@ struct UDFWrapper { } template - inline static AggregateFunction CreateAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_typeA, LogicalType input_typeB) { + inline static AggregateFunction CreateAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type_a, + const LogicalType &input_type_b) { if (!TypesMatch(ret_type)) { // LCOV_EXCL_START throw std::runtime_error("The return argument don't match!"); } - if (!TypesMatch(input_typeA)) { + if (!TypesMatch(input_type_a)) { throw std::runtime_error("The first input argument don't match!"); } - if (!TypesMatch(input_typeB)) { + if (!TypesMatch(input_type_b)) { throw std::runtime_error("The second input argument don't match!"); } // LCOV_EXCL_STOP - return CreateBinaryAggregateFunction(name, ret_type, input_typeA, input_typeB); + return CreateBinaryAggregateFunction(name, ret_type, input_type_a, input_type_b); } //! A generic CreateAggregateFunction ---------------------------------------------------------------------------// inline static AggregateFunction - CreateAggregateFunction(string name, vector arguments, LogicalType return_type, + CreateAggregateFunction(const string &name, const vector &arguments, const LogicalType &return_type, aggregate_size_t state_size, aggregate_initialize_t initialize, aggregate_update_t update, aggregate_combine_t combine, aggregate_finalize_t finalize, aggregate_simple_update_t simple_update = nullptr, bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr) { - AggregateFunction aggr_function(std::move(name), std::move(arguments), std::move(return_type), state_size, - initialize, update, combine, finalize, simple_update, bind, destructor); + AggregateFunction aggr_function(name, arguments, return_type, state_size, initialize, update, combine, finalize, + simple_update, bind, destructor); aggr_function.null_handling = FunctionNullHandling::SPECIAL_HANDLING; return aggr_function; } @@ -13033,21 +13123,21 @@ struct UDFWrapper { return udf_function; } - template + template inline static scalar_function_t CreateUnaryFunction(const string &name, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for unary function"); } // LCOV_EXCL_STOP - template + template inline static scalar_function_t CreateBinaryFunction(const string &name, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for binary function"); } // LCOV_EXCL_STOP - template + template inline static scalar_function_t CreateTernaryFunction(const string &name, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for ternary function"); } // LCOV_EXCL_STOP @@ -13074,10 +13164,10 @@ struct UDFWrapper { } // LCOV_EXCL_STOP } - template + template inline static void GetArgumentTypesRecursive(vector &arguments) { arguments.push_back(GetArgumentType()); - GetArgumentTypesRecursive(arguments); + GetArgumentTypesRecursive(arguments); } template @@ -13088,16 +13178,16 @@ struct UDFWrapper { private: //-------------------------------- Argumented functions --------------------------------// - template - inline static scalar_function_t CreateUnaryFunction(const string &name, vector args, - LogicalType ret_type, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + template + inline static scalar_function_t CreateUnaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for unary function"); } // LCOV_EXCL_STOP template - inline static scalar_function_t CreateUnaryFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(TA)) { + inline static scalar_function_t CreateUnaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(TA)) { if (args.size() != 1) { // LCOV_EXCL_START throw std::runtime_error("The number of LogicalType arguments (\"args\") should be 1!"); } @@ -13112,16 +13202,16 @@ struct UDFWrapper { return udf_function; } - template - inline static scalar_function_t CreateBinaryFunction(const string &name, vector args, - LogicalType ret_type, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + template + inline static scalar_function_t CreateBinaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for binary function"); } // LCOV_EXCL_STOP template - inline static scalar_function_t CreateBinaryFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(TA, TB)) { + inline static scalar_function_t CreateBinaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(TA, TB)) { if (args.size() != 2) { // LCOV_EXCL_START throw std::runtime_error("The number of LogicalType arguments (\"args\") should be 2!"); } @@ -13138,16 +13228,16 @@ struct UDFWrapper { return udf_function; } - template - inline static scalar_function_t CreateTernaryFunction(const string &name, vector args, - LogicalType ret_type, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + template + inline static scalar_function_t CreateTernaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for ternary function"); } // LCOV_EXCL_STOP template - inline static scalar_function_t CreateTernaryFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(TA, TB, TC)) { + inline static scalar_function_t CreateTernaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(TA, TB, TC)) { if (args.size() != 3) { // LCOV_EXCL_START throw std::runtime_error("The number of LogicalType arguments (\"args\") should be 3!"); } @@ -13216,8 +13306,8 @@ struct UDFWrapper { } template - inline static AggregateFunction CreateUnaryAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_type) { + inline static AggregateFunction CreateUnaryAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type) { AggregateFunction aggr_function = AggregateFunction::UnaryAggregate(input_type, ret_type); aggr_function.name = name; @@ -13227,21 +13317,24 @@ struct UDFWrapper { template inline static AggregateFunction CreateBinaryAggregateFunction(const string &name) { LogicalType return_type = GetArgumentType(); - LogicalType input_typeA = GetArgumentType(); - LogicalType input_typeB = GetArgumentType(); - return CreateBinaryAggregateFunction(name, return_type, input_typeA, input_typeB); + LogicalType input_type_a = GetArgumentType(); + LogicalType input_type_b = GetArgumentType(); + return CreateBinaryAggregateFunction(name, return_type, input_type_a, input_type_b); } template - inline static AggregateFunction CreateBinaryAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_typeA, LogicalType input_typeB) { + inline static AggregateFunction CreateBinaryAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type_a, + const LogicalType &input_type_b) { AggregateFunction aggr_function = - AggregateFunction::BinaryAggregate(input_typeA, input_typeB, ret_type); + AggregateFunction::BinaryAggregate(input_type_a, input_type_b, ret_type); aggr_function.name = name; return aggr_function; } }; // end UDFWrapper +// NOLINTEND + } // namespace duckdb //===----------------------------------------------------------------------===// @@ -13408,17 +13501,17 @@ class ColumnDataChunkIterationHelper { }; public: - ColumnDataChunkIterator begin() { + ColumnDataChunkIterator begin() { // NOLINT: match stl API return ColumnDataChunkIterator(&collection, column_ids); } - ColumnDataChunkIterator end() { + ColumnDataChunkIterator end() { // NOLINT: match stl API return ColumnDataChunkIterator(nullptr, vector()); } }; class ColumnDataRowIterationHelper { public: - DUCKDB_API ColumnDataRowIterationHelper(const ColumnDataCollection &collection); + DUCKDB_API explicit ColumnDataRowIterationHelper(const ColumnDataCollection &collection); private: const ColumnDataCollection &collection; @@ -13444,8 +13537,8 @@ class ColumnDataRowIterationHelper { }; public: - DUCKDB_API ColumnDataRowIterator begin(); - DUCKDB_API ColumnDataRowIterator end(); + DUCKDB_API ColumnDataRowIterator begin(); // NOLINT: match stl API + DUCKDB_API ColumnDataRowIterator end(); // NOLINT: match stl API }; } // namespace duckdb @@ -13468,7 +13561,7 @@ class ColumnDataCollection { //! Constructs an in-memory column data collection from an allocator DUCKDB_API ColumnDataCollection(Allocator &allocator, vector types); //! Constructs an empty (but valid) in-memory column data collection from an allocator - DUCKDB_API ColumnDataCollection(Allocator &allocator); + DUCKDB_API explicit ColumnDataCollection(Allocator &allocator); //! Constructs a buffer-managed column data collection DUCKDB_API ColumnDataCollection(BufferManager &buffer_manager, vector types); //! Constructs either an in-memory or a buffer-managed column data collection @@ -13623,39 +13716,39 @@ class ColumnDataCollection { //! The ColumnDataRowCollection represents a set of materialized rows, as obtained from the ColumnDataCollection class ColumnDataRowCollection { public: - DUCKDB_API ColumnDataRowCollection(const ColumnDataCollection &collection); + DUCKDB_API explicit ColumnDataRowCollection(const ColumnDataCollection &collection); public: DUCKDB_API Value GetValue(idx_t column, idx_t index) const; public: // container API - bool empty() const { + bool empty() const { // NOLINT: match stl API return rows.empty(); } - idx_t size() const { + idx_t size() const { // NOLINT: match stl API return rows.size(); } DUCKDB_API ColumnDataRow &operator[](idx_t i); DUCKDB_API const ColumnDataRow &operator[](idx_t i) const; - vector::iterator begin() { + vector::iterator begin() { // NOLINT: match stl API return rows.begin(); } - vector::iterator end() { + vector::iterator end() { // NOLINT: match stl API return rows.end(); } - vector::const_iterator cbegin() const { + vector::const_iterator cbegin() const { // NOLINT: match stl API return rows.cbegin(); } - vector::const_iterator cend() const { + vector::const_iterator cend() const { // NOLINT: match stl API return rows.cend(); } - vector::const_iterator begin() const { + vector::const_iterator begin() const { // NOLINT: match stl API return rows.begin(); } - vector::const_iterator end() const { + vector::const_iterator end() const { // NOLINT: match stl API return rows.end(); } @@ -13826,7 +13919,7 @@ class QueryResult : public BaseQueryResult { vector types, vector names, ClientProperties client_properties); //! Creates an unsuccessful query result with error condition DUCKDB_API QueryResult(QueryResultType type, ErrorData error); - DUCKDB_API virtual ~QueryResult() override; + DUCKDB_API ~QueryResult() override; //! Properties from the client context ClientProperties client_properties; @@ -13951,10 +14044,10 @@ class QueryResult : public BaseQueryResult { }; public: - QueryResultIterator begin() { + QueryResultIterator begin() { // NOLINT: match stl API return QueryResultIterator(this); } - QueryResultIterator end() { + QueryResultIterator end() { // NOLINT: match stl API return QueryResultIterator(nullptr); } @@ -14511,13 +14604,13 @@ class JoinRelationSetManager { namespace duckdb { struct string_t; -struct interval_t; +struct interval_t; // NOLINT // efficient hash function that maximizes the avalanche effect and minimizes // bias // see: https://nullprogram.com/blog/2018/07/31/ -inline hash_t murmurhash64(uint64_t x) { +inline hash_t MurmurHash64(uint64_t x) { x ^= x >> 32; x *= 0xd6e8feb86659fd93U; x ^= x >> 32; @@ -14526,13 +14619,13 @@ inline hash_t murmurhash64(uint64_t x) { return x; } -inline hash_t murmurhash32(uint32_t x) { - return murmurhash64(x); +inline hash_t MurmurHash32(uint32_t x) { + return MurmurHash64(x); } template hash_t Hash(T value) { - return murmurhash32(value); + return MurmurHash32(value); } //! Combine two hashes by XORing them @@ -14766,20 +14859,17 @@ class TableFilterSet { namespace duckdb { class ConjunctionFilter : public TableFilter { public: - ConjunctionFilter(TableFilterType filter_type_p) : TableFilter(filter_type_p) { + explicit ConjunctionFilter(TableFilterType filter_type_p) : TableFilter(filter_type_p) { } - virtual ~ConjunctionFilter() { + ~ConjunctionFilter() override { } //! The filters of this conjunction vector> child_filters; public: - virtual FilterPropagateResult CheckStatistics(BaseStatistics &stats) = 0; - virtual string ToString(const string &column_name) = 0; - - virtual bool Equals(const TableFilter &other) const { + bool Equals(const TableFilter &other) const override { return TableFilter::Equals(other); } }; @@ -15127,6 +15217,7 @@ class LogicalMaterializedCTE; class LogicalSetOperation; class LogicalSample; class LogicalSimple; +class LogicalVacuum; class LogicalSet; class LogicalReset; class LogicalTopN; @@ -15227,6 +15318,8 @@ class LogicalOperatorVisitor { namespace duckdb_hll { +// NOLINTBEGIN + /* Error codes */ #define HLL_C_OK 0 #define HLL_C_ERR -1 @@ -15254,6 +15347,8 @@ uint64_t get_size(); uint64_t MurmurHash64A(const void *key, int len, unsigned int seed); +// NOLINTEND + } // namespace duckdb_hll namespace duckdb { @@ -15270,7 +15365,7 @@ void AddToSingleLogInternal(UnifiedVectorFormat &vdata, idx_t count, uint64_t in namespace duckdb_hll { -struct robj; +struct robj; // NOLINT } namespace duckdb { @@ -15441,6 +15536,8 @@ class LogicalOperator { public: virtual vector GetColumnBindings(); + static string ColumnBindingsToString(const vector &bindings); + void PrintColumnBindings(); static vector GenerateColumnBindings(idx_t table_idx, idx_t column_count); static vector MapTypes(const vector &types, const vector &projection_map); static vector MapBindings(const vector &types, const vector &projection_map); @@ -15579,7 +15676,7 @@ struct RelationsToTDom { vector filters; vector column_names; - RelationsToTDom(const column_binding_set_t &column_binding_set) + explicit RelationsToTDom(const column_binding_set_t &column_binding_set) : equivalent_relations(column_binding_set), tdom_hll(0), tdom_no_hll(NumericLimits::Maximum()), has_tdom_hll(false) {}; }; @@ -15633,7 +15730,7 @@ class CardinalityEstimator { void PrintRelationToTdomInfo(); private: - bool SingleColumnFilter(FilterInfo &filter_info); + bool SingleRelationFilter(FilterInfo &filter_info); vector DetermineMatchingEquivalentSets(FilterInfo *filter_info); //! Given a filter, add the column bindings to the matching equivalent set at the index //! given in matching equivalent sets. @@ -15664,7 +15761,7 @@ struct SingleJoinRelation { SingleJoinRelation(LogicalOperator &op, optional_ptr parent) : op(op), parent(parent) { } SingleJoinRelation(LogicalOperator &op, optional_ptr parent, RelationStats stats) - : op(op), parent(parent), stats(stats) { + : op(op), parent(parent), stats(std::move(stats)) { } }; @@ -15719,7 +15816,7 @@ namespace duckdb { struct FilterInfo; struct NeighborInfo { - NeighborInfo(optional_ptr neighbor) : neighbor(neighbor) { + explicit NeighborInfo(optional_ptr neighbor) : neighbor(neighbor) { } optional_ptr neighbor; @@ -15791,7 +15888,7 @@ class JoinNode { //! Create a leaf node in the join tree //! set cost to 0 for leaf nodes //! cost will be the cost to *produce* an intermediate table - JoinNode(JoinRelationSet &set); + explicit JoinNode(JoinRelationSet &set); bool operator==(const JoinNode &other) { return other.set.ToString().compare(set.ToString()) == 0; @@ -15860,7 +15957,7 @@ class OperatorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -15877,7 +15974,7 @@ class GlobalOperatorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -15898,7 +15995,7 @@ class GlobalSinkState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -15922,7 +16019,7 @@ class LocalSinkState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -15943,7 +16040,7 @@ class GlobalSourceState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -15960,7 +16057,7 @@ class LocalSourceState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -16298,23 +16395,27 @@ class BinderException : public Exception { DUCKDB_API explicit BinderException(const string &msg, const unordered_map &extra_info); DUCKDB_API explicit BinderException(const string &msg); - template - explicit BinderException(const string &msg, Args... params) : BinderException(ConstructMessage(msg, params...)) { + template + explicit BinderException(const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...)) { } - template - explicit BinderException(const TableRef &ref, const string &msg, Args... params) + template + explicit BinderException(const TableRef &ref, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(ref)) { } - template - explicit BinderException(const ParsedExpression &expr, const string &msg, Args... params) + template + explicit BinderException(const ParsedExpression &expr, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(expr)) { } - template - explicit BinderException(QueryErrorContext error_context, const string &msg, Args... params) + template + explicit BinderException(const Expression &expr, const string &msg, ARGS... params) + : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(expr)) { + } + template + explicit BinderException(QueryErrorContext error_context, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_context)) { } - template - explicit BinderException(optional_idx error_location, const string &msg, Args... params) + template + explicit BinderException(optional_idx error_location, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_location)) { } @@ -16490,7 +16591,7 @@ class BoundExpression : public ParsedExpression { static constexpr const ExpressionClass TYPE = ExpressionClass::BOUND_EXPRESSION; public: - BoundExpression(unique_ptr expr); + explicit BoundExpression(unique_ptr expr); unique_ptr expr; @@ -16778,6 +16879,7 @@ class CatalogEntry; class SimpleFunction; struct DummyBinding; +struct SelectBindState; struct BoundColumnReferenceInfo { string name; @@ -17118,7 +17220,7 @@ struct UsingColumnSet { //! encountered during the binding process. class BindContext { public: - BindContext(Binder &binder); + explicit BindContext(Binder &binder); //! Keep track of recursive CTE references case_insensitive_map_t> cte_references; @@ -17213,7 +17315,7 @@ class BindContext { return cte_bindings; } void SetCTEBindings(case_insensitive_map_t> bindings) { - cte_bindings = bindings; + cte_bindings = std::move(bindings); } //! Alias a set of column names for the specified table, using the original names if there are not enough aliases @@ -17257,7 +17359,7 @@ class BindContext { namespace duckdb { class BaseStatistics; -class DependencyList; +class LogicalDependencyList; class LogicalGet; class TableFilterSet; class TableCatalogEntry; @@ -17272,7 +17374,7 @@ struct TableFunctionInfo { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -17296,7 +17398,7 @@ struct GlobalTableFunctionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -17311,7 +17413,7 @@ struct LocalTableFunctionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -17319,9 +17421,9 @@ struct LocalTableFunctionState { struct TableFunctionBindInput { TableFunctionBindInput(vector &inputs, named_parameter_map_t &named_parameters, vector &input_table_types, vector &input_table_names, - optional_ptr info) + optional_ptr info, optional_ptr binder) : inputs(inputs), named_parameters(named_parameters), input_table_types(input_table_types), - input_table_names(input_table_names), info(info) { + input_table_names(input_table_names), info(info), binder(binder) { } vector &inputs; @@ -17329,6 +17431,7 @@ struct TableFunctionBindInput { vector &input_table_types; vector &input_table_names; optional_ptr info; + optional_ptr binder; }; struct TableFunctionInitInput { @@ -17370,7 +17473,7 @@ struct TableFunctionInput { optional_ptr global_state; }; -enum ScanType { TABLE, PARQUET }; +enum class ScanType : uint8_t { TABLE, PARQUET }; struct BindInfo { public: @@ -17381,11 +17484,11 @@ struct BindInfo { ScanType type; optional_ptr table; - void InsertOption(const string &name, Value value) { + void InsertOption(const string &name, Value value) { // NOLINT: work-around bug in clang-tidy if (options.find(name) != options.end()) { throw InternalException("This option already exists"); } - options[name] = std::move(value); + options.emplace(name, std::move(value)); } template T GetOption(const string &name) { @@ -17435,7 +17538,7 @@ typedef BindInfo (*table_function_get_bind_info_t)(const optional_ptr (*table_function_cardinality_t)(ClientContext &context, const FunctionData *bind_data); typedef void (*table_function_pushdown_complex_filter_t)(ClientContext &context, LogicalGet &get, @@ -17447,7 +17550,7 @@ typedef void (*table_function_serialize_t)(Serializer &serializer, const optiona const TableFunction &function); typedef unique_ptr (*table_function_deserialize_t)(Deserializer &deserializer, TableFunction &function); -class TableFunction : public SimpleNamedParameterFunction { +class TableFunction : public SimpleNamedParameterFunction { // NOLINT: work-around bug in clang-tidy public: DUCKDB_API TableFunction(string name, vector arguments, table_function_t function, @@ -17754,7 +17857,7 @@ class Event : public std::enable_shared_from_this { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -17791,7 +17894,7 @@ class ExecutorTask : public Task { public: ExecutorTask(Executor &executor, shared_ptr event); ExecutorTask(ClientContext &context, shared_ptr event); - virtual ~ExecutorTask(); + ~ExecutorTask() override; public: void Deschedule() override; @@ -18227,8 +18330,8 @@ class PreparedStatement { DUCKDB_API case_insensitive_map_t GetExpectedParameterTypes() const; //! Create a pending query result of the prepared statement with the given set of arguments - template - unique_ptr PendingQuery(Args... args) { + template + unique_ptr PendingQuery(ARGS... args) { vector values; return PendingQueryRecursive(values, args...); } @@ -18248,8 +18351,8 @@ class PreparedStatement { bool allow_stream_result = true); //! Execute the prepared statement with the given set of arguments - template - unique_ptr Execute(Args... args) { + template + unique_ptr Execute(ARGS... args) { vector values; return ExecuteRecursive(values, args...); } @@ -18319,8 +18422,8 @@ class PreparedStatement { return PendingQuery(values); } - template - unique_ptr PendingQueryRecursive(vector &values, T value, Args... args) { + template + unique_ptr PendingQueryRecursive(vector &values, T value, ARGS... args) { values.push_back(Value::CreateValue(value)); return PendingQueryRecursive(values, args...); } @@ -18329,8 +18432,8 @@ class PreparedStatement { return Execute(values); } - template - unique_ptr ExecuteRecursive(vector &values, T value, Args... args) { + template + unique_ptr ExecuteRecursive(vector &values, T value, ARGS... args) { values.push_back(Value::CreateValue(value)); return ExecuteRecursive(values, args...); } @@ -18520,77 +18623,364 @@ const char *ToString(JoinRefType value); -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/catalog/default/default_generator.hpp -// -// -//===----------------------------------------------------------------------===// +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/catalog/default/default_generator.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + +namespace duckdb { +class ClientContext; + +class DefaultGenerator { +public: + explicit DefaultGenerator(Catalog &catalog) : catalog(catalog), created_all_entries(false) { + } + virtual ~DefaultGenerator() { + } + + Catalog &catalog; + atomic created_all_entries; + +public: + //! Creates a default entry with the specified name, or returns nullptr if no such entry can be generated + virtual unique_ptr CreateDefaultEntry(ClientContext &context, const string &entry_name) = 0; + //! Get a list of all default entries in the generator + virtual vector GetDefaultEntries() = 0; +}; + +} // namespace duckdb + + + + + + + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/transaction/transaction.hpp +// +// +//===----------------------------------------------------------------------===// + + + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp +// +// +//===----------------------------------------------------------------------===// + + + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/catalog/standard_entry.hpp +// +// +//===----------------------------------------------------------------------===// + + + + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/catalog/dependency_list.hpp +// +// +//===----------------------------------------------------------------------===// + + + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/catalog/catalog_entry_map.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + + +namespace duckdb { +class CatalogEntry; + +struct CatalogEntryHashFunction { + uint64_t operator()(const reference &a) const { + std::hash hash_func; + return hash_func((void *)&a.get()); + } +}; + +struct CatalogEntryEquality { + bool operator()(const reference &a, const reference &b) const { + return RefersToSameObject(a, b); + } +}; + +using catalog_entry_set_t = unordered_set, CatalogEntryHashFunction, CatalogEntryEquality>; + +template +using catalog_entry_map_t = unordered_map, T, CatalogEntryHashFunction, CatalogEntryEquality>; + +using catalog_entry_vector_t = vector>; + +} // namespace duckdb + + + +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/catalog/dependency.hpp +// +// +//===----------------------------------------------------------------------===// + + + + + + + +namespace duckdb { +class CatalogEntry; + +struct DependencyFlags { +public: + DependencyFlags() : value(0) { + } + DependencyFlags(const DependencyFlags &other) : value(other.value) { + } + virtual ~DependencyFlags() = default; + DependencyFlags &operator=(const DependencyFlags &other) { + value = other.value; + return *this; + } + bool operator==(const DependencyFlags &other) const { + return other.value == value; + } + bool operator!=(const DependencyFlags &other) const { + return !(*this == other); + } + +public: + virtual string ToString() const = 0; + +protected: + template + bool IsSet() const { + static const uint8_t FLAG = (1 << BIT); + return (value & FLAG) == FLAG; + } + template + void Set() { + static const uint8_t FLAG = (1 << BIT); + value |= FLAG; + } + void Merge(uint8_t other) { + value |= other; + } + uint8_t Value() { + return value; + } + +private: + uint8_t value; +}; + +struct DependencySubjectFlags : public DependencyFlags { +private: + static constexpr uint8_t OWNERSHIP = 0; +public: + DependencySubjectFlags &Apply(DependencySubjectFlags other) { + Merge(other.Value()); + return *this; + } +public: + bool IsOwnership() const { + return IsSet(); + } +public: + DependencySubjectFlags &SetOwnership() { + Set(); + return *this; + } +public: + string ToString() const override { + string result; + if (IsOwnership()) { + result += "OWNS"; + } + return result; + } +}; +struct DependencyDependentFlags : public DependencyFlags { +private: + static constexpr uint8_t BLOCKING = 0; + static constexpr uint8_t OWNED_BY = 1; -namespace duckdb { -class ClientContext; +public: + DependencyDependentFlags &Apply(DependencyDependentFlags other) { + Merge(other.Value()); + return *this; + } -class DefaultGenerator { public: - explicit DefaultGenerator(Catalog &catalog) : catalog(catalog), created_all_entries(false) { + bool IsBlocking() const { + return IsSet(); } - virtual ~DefaultGenerator() { + bool IsOwnedBy() const { + return IsSet(); } - Catalog &catalog; - atomic created_all_entries; +public: + DependencyDependentFlags &SetBlocking() { + Set(); + return *this; + } + DependencyDependentFlags &SetOwnedBy() { + Set(); + return *this; + } public: - //! Creates a default entry with the specified name, or returns nullptr if no such entry can be generated - virtual unique_ptr CreateDefaultEntry(ClientContext &context, const string &entry_name) = 0; - //! Get a list of all default entries in the generator - virtual vector GetDefaultEntries() = 0; + string ToString() const override { + string result; + if (IsBlocking()) { + result += "REGULAR"; + } else { + result += "AUTOMATIC"; + } + result += " | "; + if (IsOwnedBy()) { + result += "OWNED BY"; + } + return result; + } }; -} // namespace duckdb +struct CatalogEntryInfo { +public: + CatalogType type; + string schema; + string name; + +public: + bool operator==(const CatalogEntryInfo &other) const { + if (other.type != type) { + return false; + } + if (!StringUtil::CIEquals(other.schema, schema)) { + return false; + } + if (!StringUtil::CIEquals(other.name, name)) { + return false; + } + return true; + } +}; +struct Dependency { + Dependency(CatalogEntry &entry, // NOLINT: Allow implicit conversion from `CatalogEntry` + DependencyDependentFlags flags = DependencyDependentFlags().SetBlocking()) + : entry(entry), flags(std::move(flags)) { + } + //! The catalog entry this depends on + reference entry; + //! The type of dependency + DependencyDependentFlags flags; +}; +struct DependencyHashFunction { + uint64_t operator()(const Dependency &a) const { + std::hash hash_func; + return hash_func((void *)&a.entry.get()); + } +}; +struct DependencyEquality { + bool operator()(const Dependency &a, const Dependency &b) const { + return RefersToSameObject(a.entry, b.entry); + } +}; +using dependency_set_t = unordered_set; +} // namespace duckdb -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/transaction/transaction.hpp -// -// -//===----------------------------------------------------------------------===// +namespace duckdb { +class Catalog; +class CatalogEntry; +struct CreateInfo; +class SchemaCatalogEntry; +struct CatalogTransaction; +class LogicalDependencyList; +//! A minimal representation of a CreateInfo / CatalogEntry +//! enough to look up the entry inside SchemaCatalogEntry::GetEntry +struct LogicalDependency { +public: + CatalogEntryInfo entry; + string catalog; +public: + explicit LogicalDependency(CatalogEntry &entry); + LogicalDependency(); + bool operator==(const LogicalDependency &other) const; +}; -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp -// -// -//===----------------------------------------------------------------------===// +struct LogicalDependencyHashFunction { + uint64_t operator()(const LogicalDependency &a) const; +}; +struct LogicalDependencyEquality { + bool operator()(const LogicalDependency &a, const LogicalDependency &b) const; +}; +//! The DependencyList containing LogicalDependency objects, not looked up in the catalog yet +class LogicalDependencyList { + using create_info_set_t = + unordered_set; -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/catalog/standard_entry.hpp -// -// -//===----------------------------------------------------------------------===// +public: + DUCKDB_API void AddDependency(CatalogEntry &entry); + DUCKDB_API void AddDependency(const LogicalDependency &entry); + DUCKDB_API bool Contains(CatalogEntry &entry); +public: + DUCKDB_API void VerifyDependencies(Catalog &catalog, const string &name); + bool operator==(const LogicalDependencyList &other) const; + const create_info_set_t &Set() const; +private: + create_info_set_t set; +}; +} // namespace duckdb namespace duckdb { @@ -18612,6 +19002,9 @@ class StandardEntry : public InCatalogEntry { SchemaCatalogEntry &ParentSchema() override { return schema; } + const SchemaCatalogEntry &ParentSchema() const override { + return schema; + } }; } // namespace duckdb @@ -18667,7 +19060,8 @@ enum class ParseInfoType : uint8_t { TRANSACTION_INFO, VACUUM_INFO, COMMENT_ON_INFO, - COMMENT_ON_COLUMN_INFO + COMMENT_ON_COLUMN_INFO, + COPY_DATABASE_INFO }; struct ParseInfo { @@ -18687,7 +19081,7 @@ struct ParseInfo { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -18757,6 +19151,8 @@ enum class AppenderType : uint8_t; enum class ArrowDateTimeType : uint8_t; +enum class ArrowOffsetSize : uint8_t; + enum class ArrowVariableSizeType : uint8_t; enum class BindingMode : uint8_t; @@ -18811,6 +19207,8 @@ enum class ErrorType : uint16_t; enum class ExceptionFormatValueType : uint8_t; +enum class ExceptionType : uint8_t; + enum class ExplainOutputType : uint8_t; enum class ExplainType : uint8_t; @@ -18821,6 +19219,8 @@ enum class ExpressionType : uint8_t; enum class ExtensionLoadResult : uint8_t; +enum class ExternalDependenciesType : uint8_t; + enum class ExtraDropInfoType : uint8_t; enum class ExtraTypeInfoType : uint8_t; @@ -18935,6 +19335,8 @@ enum class ResultModifierType : uint8_t; enum class SampleMethod : uint8_t; +enum class ScanType : uint8_t; + enum class SecretDisplayType : uint8_t; enum class SecretPersistType : uint8_t; @@ -19055,6 +19457,9 @@ const char* EnumUtil::ToChars(AppenderType value); template<> const char* EnumUtil::ToChars(ArrowDateTimeType value); +template<> +const char* EnumUtil::ToChars(ArrowOffsetSize value); + template<> const char* EnumUtil::ToChars(ArrowVariableSizeType value); @@ -19136,6 +19541,9 @@ const char* EnumUtil::ToChars(ErrorType value); template<> const char* EnumUtil::ToChars(ExceptionFormatValueType value); +template<> +const char* EnumUtil::ToChars(ExceptionType value); + template<> const char* EnumUtil::ToChars(ExplainOutputType value); @@ -19151,6 +19559,9 @@ const char* EnumUtil::ToChars(ExpressionType value); template<> const char* EnumUtil::ToChars(ExtensionLoadResult value); +template<> +const char* EnumUtil::ToChars(ExternalDependenciesType value); + template<> const char* EnumUtil::ToChars(ExtraDropInfoType value); @@ -19322,6 +19733,9 @@ const char* EnumUtil::ToChars(ResultModifierType value); template<> const char* EnumUtil::ToChars(SampleMethod value); +template<> +const char* EnumUtil::ToChars(ScanType value); + template<> const char* EnumUtil::ToChars(SecretDisplayType value); @@ -19482,6 +19896,9 @@ AppenderType EnumUtil::FromString(const char *value); template<> ArrowDateTimeType EnumUtil::FromString(const char *value); +template<> +ArrowOffsetSize EnumUtil::FromString(const char *value); + template<> ArrowVariableSizeType EnumUtil::FromString(const char *value); @@ -19563,6 +19980,9 @@ ErrorType EnumUtil::FromString(const char *value); template<> ExceptionFormatValueType EnumUtil::FromString(const char *value); +template<> +ExceptionType EnumUtil::FromString(const char *value); + template<> ExplainOutputType EnumUtil::FromString(const char *value); @@ -19578,6 +19998,9 @@ ExpressionType EnumUtil::FromString(const char *value); template<> ExtensionLoadResult EnumUtil::FromString(const char *value); +template<> +ExternalDependenciesType EnumUtil::FromString(const char *value); + template<> ExtraDropInfoType EnumUtil::FromString(const char *value); @@ -19749,6 +20172,9 @@ ResultModifierType EnumUtil::FromString(const char *value); template<> SampleMethod EnumUtil::FromString(const char *value); +template<> +ScanType EnumUtil::FromString(const char *value); + template<> SecretDisplayType EnumUtil::FromString(const char *value); @@ -19901,6 +20327,7 @@ enum class OnCreateConflict : uint8_t { + namespace duckdb { struct AlterInfo; @@ -19910,7 +20337,7 @@ struct CreateInfo : public ParseInfo { public: explicit CreateInfo(CatalogType type, string schema = DEFAULT_SCHEMA, string catalog_p = INVALID_CATALOG) - : ParseInfo(TYPE), type(type), catalog(std::move(catalog_p)), schema(schema), + : ParseInfo(TYPE), type(type), catalog(std::move(catalog_p)), schema(std::move(schema)), on_conflict(OnCreateConflict::ERROR_ON_CONFLICT), temporary(false), internal(false) { } ~CreateInfo() override { @@ -20471,7 +20898,7 @@ struct AlterViewInfo : public AlterInfo { static unique_ptr Deserialize(Deserializer &deserializer); protected: - AlterViewInfo(AlterViewType type); + explicit AlterViewInfo(AlterViewType type); }; //===--------------------------------------------------------------------===// @@ -20541,7 +20968,7 @@ class SequenceCatalogEntry : public StandardEntry { SequenceCatalogEntry(Catalog &catalog, SchemaCatalogEntry &schema, CreateSequenceInfo &info); public: - virtual unique_ptr Copy(ClientContext &context) const override; + unique_ptr Copy(ClientContext &context) const override; unique_ptr GetInfo() const override; SequenceData GetData() const; @@ -20613,7 +21040,7 @@ class UndoBuffer { }; public: - UndoBuffer(ClientContext &context); + explicit UndoBuffer(ClientContext &context); //! Reserve space for an entry of the specified type and length in the undo //! buffer @@ -20665,7 +21092,7 @@ class DuckTransaction; class Transaction; struct TransactionData { - TransactionData(DuckTransaction &transaction_p); + TransactionData(DuckTransaction &transaction_p); // NOLINT: allow implicit conversion TransactionData(transaction_t transaction_id_p, transaction_t start_time_p); optional_ptr transaction; @@ -20728,7 +21155,7 @@ class Transaction { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -20777,7 +21204,7 @@ namespace duckdb { struct AlterInfo; class ClientContext; -class DependencyList; +class LogicalDependencyList; class DuckCatalog; class TableCatalogEntry; @@ -20816,9 +21243,9 @@ class CatalogSet { //! Create an entry in the catalog set. Returns whether or not it was //! successful. DUCKDB_API bool CreateEntry(CatalogTransaction transaction, const string &name, unique_ptr value, - const DependencyList &dependencies); + const LogicalDependencyList &dependencies); DUCKDB_API bool CreateEntry(ClientContext &context, const string &name, unique_ptr value, - const DependencyList &dependencies); + const LogicalDependencyList &dependencies); DUCKDB_API bool AlterEntry(CatalogTransaction transaction, const string &name, AlterInfo &alter_info); @@ -21078,9 +21505,9 @@ class InterruptState { //! Default interrupt state will be set to InterruptMode::NO_INTERRUPTS and throw an error on use of Callback() InterruptState(); //! Register the task to be interrupted and set mode to InterruptMode::TASK, the preferred way to handle interrupts - InterruptState(weak_ptr task); + explicit InterruptState(weak_ptr task); //! Register signal state and set mode to InterruptMode::BLOCKING, used for code paths without Task. - InterruptState(weak_ptr done_signal); + explicit InterruptState(weak_ptr done_signal); //! Perform the callback to indicate the Interrupt is over DUCKDB_API void Callback() const; @@ -21147,7 +21574,7 @@ class ClientContextLock; struct BlockedSink { public: - BlockedSink(InterruptState state, idx_t chunk_size) : state(state), chunk_size(chunk_size) { + BlockedSink(InterruptState state, idx_t chunk_size) : state(std::move(state)), chunk_size(chunk_size) { } public: @@ -21162,7 +21589,7 @@ class BufferedData { enum class Type { SIMPLE }; public: - BufferedData(Type type, weak_ptr context) : type(type), context(context) { + BufferedData(Type type, weak_ptr context) : type(type), context(std::move(context)) { } virtual ~BufferedData() { } @@ -21231,7 +21658,7 @@ class SimpleBufferedData : public BufferedData { static constexpr idx_t BUFFER_SIZE = 100000; public: - SimpleBufferedData(weak_ptr context); + explicit SimpleBufferedData(weak_ptr context); ~SimpleBufferedData() override; public: @@ -24448,6 +24875,26 @@ DUCKDB_API duckdb_data_chunk duckdb_stream_fetch_chunk(duckdb_result result); +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/common/chrono.hpp +// +// +//===----------------------------------------------------------------------===// + + + +#include + +namespace duckdb { +using std::chrono::duration; +using std::chrono::duration_cast; +using std::chrono::high_resolution_clock; +using std::chrono::milliseconds; +using std::chrono::system_clock; +using std::chrono::time_point; +} // namespace duckdb @@ -24472,8 +24919,8 @@ class BaseProfiler { //! the total elapsed time. Otherwise returns how far along the timer is //! right now. double Elapsed() const { - auto _end = finished ? end : Tick(); - return std::chrono::duration_cast>(_end - start).count(); + auto measured_end = finished ? end : Tick(); + return std::chrono::duration_cast>(measured_end - start).count(); } private: @@ -24797,12 +25244,12 @@ struct SettingLookupResult { public: SettingLookupResult() : scope(SettingScope::INVALID) { } - SettingLookupResult(SettingScope scope) : scope(scope) { + explicit SettingLookupResult(SettingScope scope) : scope(scope) { D_ASSERT(scope != SettingScope::INVALID); } public: - operator bool() { + operator bool() { // NOLINT: allow implicit conversion to bool return scope != SettingScope::INVALID; } @@ -24822,7 +25269,7 @@ struct AccessModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AllowPersistentSecrets { @@ -24832,7 +25279,7 @@ struct AllowPersistentSecrets { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct CheckpointThresholdSetting { @@ -24842,7 +25289,7 @@ struct CheckpointThresholdSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugCheckpointAbort { @@ -24852,7 +25299,7 @@ struct DebugCheckpointAbort { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugForceExternal { @@ -24862,7 +25309,7 @@ struct DebugForceExternal { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugForceNoCrossProduct { @@ -24872,7 +25319,7 @@ struct DebugForceNoCrossProduct { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct OrderedAggregateThreshold { @@ -24882,7 +25329,7 @@ struct OrderedAggregateThreshold { static constexpr const LogicalTypeId InputType = LogicalTypeId::UBIGINT; // NOLINT static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugAsOfIEJoin { @@ -24891,7 +25338,7 @@ struct DebugAsOfIEJoin { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; // NOLINT static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PreferRangeJoins { @@ -24900,7 +25347,7 @@ struct PreferRangeJoins { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; // NOLINT static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugWindowMode { @@ -24909,7 +25356,7 @@ struct DebugWindowMode { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultCollationSetting { @@ -24920,7 +25367,7 @@ struct DefaultCollationSetting { static void ResetGlobal(DatabaseInstance *db, DBConfig &config); static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultOrderSetting { @@ -24929,7 +25376,7 @@ struct DefaultOrderSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultNullOrderSetting { @@ -24938,7 +25385,7 @@ struct DefaultNullOrderSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultSecretStorage { @@ -24947,7 +25394,7 @@ struct DefaultSecretStorage { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DisabledFileSystemsSetting { @@ -24956,7 +25403,7 @@ struct DisabledFileSystemsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DisabledOptimizersSetting { @@ -24965,7 +25412,7 @@ struct DisabledOptimizersSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableExternalAccessSetting { @@ -24976,7 +25423,7 @@ struct EnableExternalAccessSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableFSSTVectors { @@ -24986,7 +25433,7 @@ struct EnableFSSTVectors { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AllowUnsignedExtensionsSetting { @@ -24995,7 +25442,16 @@ struct AllowUnsignedExtensionsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); +}; + +struct AllowExtensionsMetadataMismatchSetting { + static constexpr const char *Name = "allow_extensions_metadata_mismatch"; + static constexpr const char *Description = "Allow to load extensions with not compatible metadata"; + static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; + static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); + static void ResetGlobal(DatabaseInstance *db, DBConfig &config); + static Value GetSetting(const ClientContext &context); }; struct AllowUnredactedSecretsSetting { @@ -25004,7 +25460,7 @@ struct AllowUnredactedSecretsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct CustomExtensionRepository { @@ -25013,7 +25469,7 @@ struct CustomExtensionRepository { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AutoloadExtensionRepository { @@ -25023,7 +25479,7 @@ struct AutoloadExtensionRepository { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AutoinstallKnownExtensions { @@ -25033,7 +25489,7 @@ struct AutoinstallKnownExtensions { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AutoloadKnownExtensions { @@ -25043,7 +25499,7 @@ struct AutoloadKnownExtensions { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableObjectCacheSetting { @@ -25052,7 +25508,7 @@ struct EnableObjectCacheSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableHTTPMetadataCacheSetting { @@ -25061,7 +25517,7 @@ struct EnableHTTPMetadataCacheSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void ResetGlobal(DatabaseInstance *db, DBConfig &config); static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableProfilingSetting { @@ -25071,7 +25527,7 @@ struct EnableProfilingSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableProgressBarSetting { @@ -25081,7 +25537,7 @@ struct EnableProgressBarSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableProgressBarPrintSetting { @@ -25091,7 +25547,7 @@ struct EnableProgressBarPrintSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ErrorsAsJsonSetting { @@ -25100,7 +25556,7 @@ struct ErrorsAsJsonSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExplainOutputSetting { @@ -25109,7 +25565,7 @@ struct ExplainOutputSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExportLargeBufferArrow { @@ -25119,7 +25575,7 @@ struct ExportLargeBufferArrow { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExtensionDirectorySetting { @@ -25128,7 +25584,7 @@ struct ExtensionDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExternalThreadsSetting { @@ -25137,7 +25593,7 @@ struct ExternalThreadsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct FileSearchPathSetting { @@ -25146,7 +25602,7 @@ struct FileSearchPathSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ForceCompressionSetting { @@ -25155,7 +25611,7 @@ struct ForceCompressionSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ForceBitpackingModeSetting { @@ -25164,7 +25620,7 @@ struct ForceBitpackingModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct HomeDirectorySetting { @@ -25173,7 +25629,7 @@ struct HomeDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct IntegerDivisionSetting { @@ -25183,17 +25639,17 @@ struct IntegerDivisionSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct LogQueryPathSetting { static constexpr const char *Name = "log_query_path"; static constexpr const char *Description = - "Specifies the path to which queries should be logged (default: empty string, queries are not logged)"; + "Specifies the path to which queries should be logged (default: NULL, queries are not logged)"; static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct LockConfigurationSetting { @@ -25202,7 +25658,7 @@ struct LockConfigurationSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ImmediateTransactionModeSetting { @@ -25212,7 +25668,7 @@ struct ImmediateTransactionModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct MaximumExpressionDepthSetting { @@ -25223,7 +25679,7 @@ struct MaximumExpressionDepthSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::UBIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct MaximumMemorySetting { @@ -25232,7 +25688,7 @@ struct MaximumMemorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct OldImplicitCasting { @@ -25241,7 +25697,7 @@ struct OldImplicitCasting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PartitionedWriteFlushThreshold { @@ -25251,7 +25707,7 @@ struct PartitionedWriteFlushThreshold { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PasswordSetting { @@ -25260,16 +25716,16 @@ struct PasswordSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PerfectHashThresholdSetting { static constexpr const char *Name = "perfect_ht_threshold"; - static constexpr const char *Description = "Threshold in bytes for when to use a perfect hash table (default: 12)"; + static constexpr const char *Description = "Threshold in bytes for when to use a perfect hash table"; static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PivotFilterThreshold { @@ -25279,17 +25735,16 @@ struct PivotFilterThreshold { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PivotLimitSetting { static constexpr const char *Name = "pivot_limit"; - static constexpr const char *Description = - "The maximum number of pivot columns in a pivot statement (default: 100000)"; + static constexpr const char *Description = "The maximum number of pivot columns in a pivot statement"; static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PreserveIdentifierCase { @@ -25299,7 +25754,7 @@ struct PreserveIdentifierCase { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PreserveInsertionOrder { @@ -25310,7 +25765,7 @@ struct PreserveInsertionOrder { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ProfileOutputSetting { @@ -25320,7 +25775,7 @@ struct ProfileOutputSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ProfilingModeSetting { @@ -25329,7 +25784,7 @@ struct ProfilingModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ProgressBarTimeSetting { @@ -25339,7 +25794,7 @@ struct ProgressBarTimeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct SchemaSetting { @@ -25349,7 +25804,7 @@ struct SchemaSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct SearchPathSetting { @@ -25359,7 +25814,7 @@ struct SearchPathSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct SecretDirectorySetting { @@ -25368,7 +25823,7 @@ struct SecretDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct TempDirectorySetting { @@ -25377,7 +25832,7 @@ struct TempDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ThreadsSetting { @@ -25386,7 +25841,7 @@ struct ThreadsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct UsernameSetting { @@ -25395,7 +25850,7 @@ struct UsernameSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct FlushAllocatorSetting { @@ -25405,7 +25860,7 @@ struct FlushAllocatorSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DuckDBApiSetting { @@ -25414,7 +25869,7 @@ struct DuckDBApiSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct CustomUserAgentSetting { @@ -25423,7 +25878,7 @@ struct CustomUserAgentSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; } // namespace duckdb @@ -25567,7 +26022,7 @@ class ClientContext : public std::enable_shared_from_this { bool requires_valid_transaction = true); //! Equivalent to CURRENT_SETTING(key) SQL function. - DUCKDB_API SettingLookupResult TryGetCurrentSetting(const std::string &key, Value &result); + DUCKDB_API SettingLookupResult TryGetCurrentSetting(const std::string &key, Value &result) const; //! Returns the parser options for this client context DUCKDB_API ParserOptions GetParserOptions() const; @@ -25759,14 +26214,14 @@ class Printer { //! Print the object to stderr DUCKDB_API static void Print(const string &str); //! Print the formatted object to the stream - template - static void PrintF(OutputStream stream, const string &str, Args... params) { + template + static void PrintF(OutputStream stream, const string &str, ARGS... params) { Printer::Print(stream, StringUtil::Format(str, params...)); } //! Print the formatted object to stderr - template - static void PrintF(const string &str, Args... params) { - Printer::PrintF(OutputStream::STREAM_STDERR, str, std::forward(params)...); + template + static void PrintF(const string &str, ARGS... params) { + Printer::PrintF(OutputStream::STREAM_STDERR, str, std::forward(params)...); } //! Directly prints the string to stdout without a newline DUCKDB_API static void RawPrint(OutputStream stream, const string &str); @@ -26028,7 +26483,7 @@ class Relation : public std::enable_shared_from_this { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -26050,7 +26505,7 @@ class LogicalOperator; class SelectStatement; struct CSVReaderOptions; -typedef void (*warning_callback)(std::string); +typedef void (*warning_callback_t)(std::string); //! A connection to a database. This represents a (client) connection that can //! be used to query the database. @@ -26067,7 +26522,7 @@ class Connection { DUCKDB_API ~Connection(); shared_ptr context; - warning_callback warning_cb; + warning_callback_t warning_cb; public: //! Returns query profiling information for the current query @@ -26081,8 +26536,6 @@ class Connection { //! Disable query profiling DUCKDB_API void DisableProfiling(); - DUCKDB_API void SetWarningCallback(warning_callback); - //! Enable aggressive verification/testing of queries, should only be used in testing DUCKDB_API void EnableQueryVerification(); DUCKDB_API void DisableQueryVerification(); @@ -26101,8 +26554,8 @@ class Connection { //! MaterializedQueryResult. DUCKDB_API unique_ptr Query(unique_ptr statement); // prepared statements - template - unique_ptr Query(const string &query, Args... args) { + template + unique_ptr Query(const string &query, ARGS... args) { vector values; return QueryParamsRecursive(query, values, args...); } @@ -26185,28 +26638,29 @@ class Connection { //! Fetch a list of table names that are required for a given query DUCKDB_API unordered_set GetTableNames(const string &query); - template - void CreateScalarFunction(const string &name, TR (*udf_func)(Args...)) { - scalar_function_t function = UDFWrapper::CreateScalarFunction(name, udf_func); - UDFWrapper::RegisterFunction(name, function, *context); + // NOLINTBEGIN + template + void CreateScalarFunction(const string &name, TR (*udf_func)(ARGS...)) { + scalar_function_t function = UDFWrapper::CreateScalarFunction(name, udf_func); + UDFWrapper::RegisterFunction(name, function, *context); } - template + template void CreateScalarFunction(const string &name, vector args, LogicalType ret_type, - TR (*udf_func)(Args...)) { - scalar_function_t function = UDFWrapper::CreateScalarFunction(name, args, ret_type, udf_func); + TR (*udf_func)(ARGS...)) { + scalar_function_t function = UDFWrapper::CreateScalarFunction(name, args, ret_type, udf_func); UDFWrapper::RegisterFunction(name, args, ret_type, function, *context); } - template + template void CreateVectorizedFunction(const string &name, scalar_function_t udf_func, LogicalType varargs = LogicalType::INVALID) { - UDFWrapper::RegisterFunction(name, udf_func, *context, std::move(varargs)); + UDFWrapper::RegisterFunction(name, udf_func, *context, std::move(varargs)); } void CreateVectorizedFunction(const string &name, vector args, LogicalType ret_type, scalar_function_t udf_func, LogicalType varargs = LogicalType::INVALID) { - UDFWrapper::RegisterFunction(name, std::move(args), std::move(ret_type), udf_func, *context, + UDFWrapper::RegisterFunction(name, std::move(args), std::move(ret_type), std::move(udf_func), *context, std::move(varargs)); } @@ -26224,23 +26678,24 @@ class Connection { } template - void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_typeA) { + void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_type_a) { AggregateFunction function = - UDFWrapper::CreateAggregateFunction(name, ret_type, input_typeA); + UDFWrapper::CreateAggregateFunction(name, ret_type, input_type_a); UDFWrapper::RegisterAggrFunction(function, *context); } template - void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_typeA, - LogicalType input_typeB) { + void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_type_a, + LogicalType input_type_b) { AggregateFunction function = - UDFWrapper::CreateAggregateFunction(name, ret_type, input_typeA, input_typeB); + UDFWrapper::CreateAggregateFunction(name, ret_type, input_type_a, input_type_b); UDFWrapper::RegisterAggrFunction(function, *context); } - void CreateAggregateFunction(const string &name, vector arguments, LogicalType return_type, - aggregate_size_t state_size, aggregate_initialize_t initialize, - aggregate_update_t update, aggregate_combine_t combine, aggregate_finalize_t finalize, + void CreateAggregateFunction(const string &name, const vector &arguments, + const LogicalType &return_type, aggregate_size_t state_size, + aggregate_initialize_t initialize, aggregate_update_t update, + aggregate_combine_t combine, aggregate_finalize_t finalize, aggregate_simple_update_t simple_update = nullptr, bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr) { @@ -26249,12 +26704,13 @@ class Connection { finalize, simple_update, bind, destructor); UDFWrapper::RegisterAggrFunction(function, *context); } + // NOLINTEND private: unique_ptr QueryParamsRecursive(const string &query, vector &values); - template - unique_ptr QueryParamsRecursive(const string &query, vector &values, T value, Args... args) { + template + unique_ptr QueryParamsRecursive(const string &query, vector &values, T value, ARGS... args) { values.push_back(Value::CreateValue(value)); return QueryParamsRecursive(query, values, args...); } @@ -26433,7 +26889,7 @@ struct BindCastInfo { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -26451,7 +26907,7 @@ struct BoundCastData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -26507,9 +26963,9 @@ typedef unique_ptr (*init_cast_local_state_t)(CastLocalState struct BoundCastInfo { DUCKDB_API - BoundCastInfo( + BoundCastInfo( // NOLINT: allow explicit cast from cast_function_t cast_function_t function, unique_ptr cast_data = nullptr, - init_cast_local_state_t init_local_state = nullptr); // NOLINT: allow explicit cast from cast_function_t + init_cast_local_state_t init_local_state = nullptr); cast_function_t function; init_cast_local_state_t init_local_state; unique_ptr cast_data; @@ -26709,10 +27165,10 @@ struct ParserExtensionParseData { struct ParserExtensionParseResult { ParserExtensionParseResult() : type(ParserExtensionResultType::DISPLAY_ORIGINAL_ERROR) { } - ParserExtensionParseResult(string error_p) + explicit ParserExtensionParseResult(string error_p) : type(ParserExtensionResultType::DISPLAY_EXTENSION_ERROR), error(std::move(error_p)) { } - ParserExtensionParseResult(unique_ptr parse_data_p) + explicit ParserExtensionParseResult(unique_ptr parse_data_p) : type(ParserExtensionResultType::PARSE_SUCCESSFUL), parse_data(std::move(parse_data_p)) { } @@ -26730,7 +27186,7 @@ typedef ParserExtensionParseResult (*parse_function_t)(ParserExtensionInfo *info //===--------------------------------------------------------------------===// // Plan //===--------------------------------------------------------------------===// -struct ParserExtensionPlanResult { +struct ParserExtensionPlanResult { // NOLINT: work-around bug in clang-tidy //! The table function to execute TableFunction function; //! Parameters to the function @@ -26854,75 +27310,6 @@ class JoinSide { } // namespace duckdb -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/catalog/dependency_list.hpp -// -// -//===----------------------------------------------------------------------===// - - - -//===----------------------------------------------------------------------===// -// DuckDB -// -// duckdb/catalog/catalog_entry_map.hpp -// -// -//===----------------------------------------------------------------------===// - - - - - - - -namespace duckdb { -class CatalogEntry; - -struct CatalogEntryHashFunction { - uint64_t operator()(const reference &a) const { - std::hash hash_func; - return hash_func((void *)&a.get()); - } -}; - -struct CatalogEntryEquality { - bool operator()(const reference &a, const reference &b) const { - return RefersToSameObject(a, b); - } -}; - -using catalog_entry_set_t = unordered_set, CatalogEntryHashFunction, CatalogEntryEquality>; - -template -using catalog_entry_map_t = unordered_map, T, CatalogEntryHashFunction, CatalogEntryEquality>; - -using catalog_entry_vector_t = vector>; - -} // namespace duckdb - - -namespace duckdb { -class Catalog; -class CatalogEntry; -class DependencySetCatalogEntry; - -//! The DependencyList -class DependencyList { - friend class DependencyManager; - friend class DependencySetCatalogEntry; - -public: - DUCKDB_API void AddDependency(CatalogEntry &entry); - - DUCKDB_API void VerifyDependencies(Catalog &catalog, const string &name); - -private: - catalog_entry_set_t set; -}; -} // namespace duckdb @@ -26938,7 +27325,7 @@ class PhysicalPlanGenerator { explicit PhysicalPlanGenerator(ClientContext &context); ~PhysicalPlanGenerator(); - DependencyList dependencies; + LogicalDependencyList dependencies; //! Recursive CTEs require at least one ChunkScan, referencing the working_table. //! This data structure is used to establish it. unordered_map> recursive_cte_tables; @@ -26997,6 +27384,7 @@ class PhysicalPlanGenerator { unique_ptr CreatePlan(LogicalSet &op); unique_ptr CreatePlan(LogicalReset &op); unique_ptr CreatePlan(LogicalSimple &op); + unique_ptr CreatePlan(LogicalVacuum &op); unique_ptr CreatePlan(LogicalUnnest &op); unique_ptr CreatePlan(LogicalRecursiveCTE &op); unique_ptr CreatePlan(LogicalMaterializedCTE &op); @@ -27449,6 +27837,7 @@ class ViewCatalogEntry; class TableMacroCatalogEntry; class UpdateSetInfo; class LogicalProjection; +class LogicalVacuum; class ColumnList; class ExternalDependency; @@ -27473,6 +27862,7 @@ struct CorrelatedColumnInfo { string name; idx_t depth; + // NOLINTNEXTLINE - work-around bug in clang-tidy CorrelatedColumnInfo(ColumnBinding binding, LogicalType type_p, string name_p, idx_t depth) : binding(binding), type(std::move(type_p)), name(std::move(name_p)), depth(depth) { } @@ -27547,8 +27937,8 @@ class Binder : public std::enable_shared_from_this { //! Add a common table expression to the binder void AddCTE(const string &name, CommonTableExpressionInfo &cte); - //! Find a common table expression by name; returns nullptr if none exists - optional_ptr FindCTE(const string &name, bool skip = false); + //! Find all candidate common table expression by name; returns empty vector if none exists + vector> FindCTE(const string &name, bool skip = false); bool CTEIsAlreadyBound(CommonTableExpressionInfo &cte); @@ -27574,6 +27964,8 @@ class Binder : public std::enable_shared_from_this { TableCatalogEntry &table, TableStorageInfo &storage_info); void BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &table, InsertStatement &stmt); + void BindVacuumTable(LogicalVacuum &vacuum, unique_ptr &root); + static void BindSchemaOrCatalog(ClientContext &context, string &catalog, string &schema); static void BindLogicalType(ClientContext &context, LogicalType &type, optional_ptr catalog = nullptr, const string &schema = INVALID_SCHEMA); @@ -27641,6 +28033,8 @@ class Binder : public std::enable_shared_from_this { unique_ptr BindWithReplacementScan(ClientContext &context, const string &table_name, BaseTableRef &ref); + template + BoundStatement BindWithCTE(T &statement); BoundStatement Bind(SelectStatement &stmt); BoundStatement Bind(InsertStatement &stmt); BoundStatement Bind(CopyStatement &stmt); @@ -27674,6 +28068,8 @@ class Binder : public std::enable_shared_from_this { unique_ptr BindTableMacro(FunctionExpression &function, TableMacroCatalogEntry ¯o_func, idx_t depth); + unique_ptr BindMaterializedCTE(CommonTableExpressionMap &cte_map); + unique_ptr BindCTE(CTENode &statement); unique_ptr BindNode(SelectNode &node); unique_ptr BindNode(SetOperationNode &node); unique_ptr BindNode(RecursiveCTENode &node); @@ -27683,6 +28079,7 @@ class Binder : public std::enable_shared_from_this { unique_ptr VisitQueryNode(BoundQueryNode &node, unique_ptr root); unique_ptr CreatePlan(BoundRecursiveCTENode &node); unique_ptr CreatePlan(BoundCTENode &node); + unique_ptr CreatePlan(BoundCTENode &node, unique_ptr base); unique_ptr CreatePlan(BoundSelectNode &statement); unique_ptr CreatePlan(BoundSetOperationNode &node); unique_ptr CreatePlan(BoundQueryNode &node); @@ -27730,9 +28127,9 @@ class Binder : public std::enable_shared_from_this { BoundStatement BindCopyTo(CopyStatement &stmt); BoundStatement BindCopyFrom(CopyStatement &stmt); - void BindModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result); - void BindModifierTypes(BoundQueryNode &result, const vector &sql_types, idx_t projection_index, - const vector &expansion_count = {}); + void PrepareModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result); + void BindModifiers(BoundQueryNode &result, idx_t table_index, const vector &names, + const vector &sql_types, const SelectBindState &bind_state); unique_ptr BindLimit(OrderBinder &order_binder, LimitModifier &limit_mod); unique_ptr BindLimitPercent(OrderBinder &order_binder, LimitPercentModifier &limit_mod); @@ -27774,10 +28171,8 @@ class Binder : public std::enable_shared_from_this { unique_ptr BindSelectNode(SelectNode &statement, unique_ptr from_table); - unique_ptr BindCopyDatabaseSchema(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database); - unique_ptr BindCopyDatabaseData(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database); + unique_ptr BindCopyDatabaseSchema(Catalog &source_catalog, const string &target_database_name); + unique_ptr BindCopyDatabaseData(Catalog &source_catalog, const string &target_database_name); unique_ptr BindShowQuery(ShowRef &ref); unique_ptr BindShowTable(ShowRef &ref); @@ -27808,7 +28203,7 @@ struct LogicalExtensionOperator; class OperatorExtension { public: - bind_function_t Bind; + bind_function_t Bind; // NOLINT: backwards compatibility //! Additional info passed to the CreatePlan & Bind functions shared_ptr operator_info; @@ -27934,6 +28329,7 @@ class IndexTypeSet { namespace duckdb { +class BufferManager; class BufferPool; class CastFunctionSet; class ClientContext; @@ -27959,7 +28355,7 @@ typedef void (*set_global_function_t)(DatabaseInstance *db, DBConfig &config, co typedef void (*set_local_function_t)(ClientContext &context, const Value ¶meter); typedef void (*reset_global_function_t)(DatabaseInstance *db, DBConfig &config); typedef void (*reset_local_function_t)(ClientContext &context); -typedef Value (*get_setting_function_t)(ClientContext &context); +typedef Value (*get_setting_function_t)(const ClientContext &context); struct ConfigurationOption { const char *name; @@ -27975,6 +28371,7 @@ struct ConfigurationOption { typedef void (*set_option_callback_t)(ClientContext &context, SetScope scope, Value ¶meter); struct ExtensionOption { + // NOLINTNEXTLINE: work around bug in clang-tidy ExtensionOption(string description_p, LogicalType type_p, set_option_callback_t set_function_p, Value default_value_p) : description(std::move(description_p)), type(std::move(type_p)), set_function(set_function_p), @@ -28027,6 +28424,9 @@ struct DBConfigOptions { bool use_temporary_directory = true; //! Directory to store temporary structures that do not fit in memory string temporary_directory; + //! Whether or not to invoke filesystem trim on free blocks after checkpoint. This will reclaim + //! space for sparse files, on platforms that support it. + bool trim_free_blocks = false; //! Whether or not to allow printing unredacted secrets bool allow_unredacted_secrets = false; //! The collation type of the database @@ -28070,6 +28470,8 @@ struct DBConfigOptions { string extension_directory; //! Whether unsigned extensions should be loaded bool allow_unsigned_extensions = false; + //! Whether extensions with missing metadata should be loaded + bool allow_extensions_metadata_mismatch = false; //! Enable emitting FSST Vectors bool enable_fsst_vectors = false; //! Start transactions immediately in all attached databases - instead of lazily when a database is referenced @@ -28081,7 +28483,7 @@ struct DBConfigOptions { //! Whether or not the configuration settings can be altered bool lock_configuration = false; //! Whether to print bindings when printing the plan (debug mode only) - static bool debug_print_bindings; + static bool debug_print_bindings; // NOLINT: debug setting //! The peak allocation threshold at which to flush the allocator after completing a task (1 << 27, ~128MB) idx_t allocator_flush_threshold = 134217728; //! DuckDB API surface @@ -28100,7 +28502,7 @@ struct DBConfig { public: DUCKDB_API DBConfig(); - DUCKDB_API DBConfig(bool read_only); + explicit DUCKDB_API DBConfig(bool read_only); DUCKDB_API DBConfig(const case_insensitive_map_t &config_dict, bool read_only); DUCKDB_API ~DBConfig(); @@ -28133,6 +28535,8 @@ struct DBConfig { case_insensitive_map_t> storage_extensions; //! A buffer pool can be shared across multiple databases (if desired). shared_ptr buffer_pool; + //! Provide a custom buffer manager implementation (if desired). + shared_ptr buffer_manager; //! Set of callbacks that can be installed by extensions vector> extension_callbacks; @@ -28149,9 +28553,9 @@ struct DBConfig { DUCKDB_API void AddExtensionOption(const string &name, string description, LogicalType parameter, const Value &default_value = Value(), set_option_callback_t function = nullptr); //! Fetch an option by index. Returns a pointer to the option, or nullptr if out of range - DUCKDB_API static ConfigurationOption *GetOptionByIndex(idx_t index); + DUCKDB_API static optional_ptr GetOptionByIndex(idx_t index); //! Fetch an option by name. Returns a pointer to the option, or nullptr if none exists. - DUCKDB_API static ConfigurationOption *GetOptionByName(const string &name); + DUCKDB_API static optional_ptr GetOptionByName(const string &name); DUCKDB_API void SetOption(const ConfigurationOption &option, const Value &value); DUCKDB_API void SetOption(DatabaseInstance *db, const ConfigurationOption &option, const Value &value); DUCKDB_API void SetOptionByName(const string &name, const Value &value); @@ -28282,6 +28686,17 @@ class FileSystem; class TaskScheduler; class ObjectCache; struct AttachInfo; +class DatabaseFileSystem; + +struct ExtensionInfo { + explicit ExtensionInfo(const std::string &version) : extension_version(version) { + } + ExtensionInfo() : ExtensionInfo("defaultme") { + } + ExtensionInfo(const ExtensionInfo &x) : ExtensionInfo(x.extension_version) { + } + std::string extension_version; +}; class DatabaseInstance : public std::enable_shared_from_this { friend class DuckDB; @@ -28296,22 +28711,25 @@ class DatabaseInstance : public std::enable_shared_from_this { BufferPool &GetBufferPool() const; DUCKDB_API SecretManager &GetSecretManager(); DUCKDB_API BufferManager &GetBufferManager(); + DUCKDB_API const BufferManager &GetBufferManager() const; DUCKDB_API DatabaseManager &GetDatabaseManager(); DUCKDB_API FileSystem &GetFileSystem(); DUCKDB_API TaskScheduler &GetScheduler(); DUCKDB_API ObjectCache &GetObjectCache(); DUCKDB_API ConnectionManager &GetConnectionManager(); DUCKDB_API ValidChecker &GetValidChecker(); - DUCKDB_API void SetExtensionLoaded(const std::string &extension_name); + DUCKDB_API void SetExtensionLoaded(const std::string &extension_name, const std::string &extension_version = ""); idx_t NumberOfThreads(); DUCKDB_API static DatabaseInstance &GetDatabase(ClientContext &context); + DUCKDB_API static const DatabaseInstance &GetDatabase(const ClientContext &context); DUCKDB_API const unordered_set &LoadedExtensions(); + DUCKDB_API const unordered_map &LoadedExtensionsData(); DUCKDB_API bool ExtensionIsLoaded(const string &name); - DUCKDB_API SettingLookupResult TryGetCurrentSetting(const string &key, Value &result); + DUCKDB_API SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) const; unique_ptr CreateAttachedDatabase(ClientContext &context, const AttachInfo &info, const string &type, AccessMode access_mode); @@ -28323,13 +28741,15 @@ class DatabaseInstance : public std::enable_shared_from_this { void Configure(DBConfig &config); private: - unique_ptr buffer_manager; + shared_ptr buffer_manager; unique_ptr db_manager; unique_ptr scheduler; unique_ptr object_cache; unique_ptr connection_manager; unordered_set loaded_extensions; + unordered_map loaded_extensions_data; ValidChecker db_validity; + unique_ptr db_file_system; }; //! The database object. This object holds the catalog and all the @@ -28400,7 +28820,7 @@ enum class AppenderType : uint8_t { class BaseAppender { protected: //! The amount of tuples that will be gathered in the column data collection before flushing - static constexpr const idx_t FLUSH_COUNT = STANDARD_VECTOR_SIZE * 100; + static constexpr const idx_t FLUSH_COUNT = STANDARD_VECTOR_SIZE * 100ULL; Allocator &allocator; //! The append types @@ -28437,8 +28857,8 @@ class BaseAppender { DUCKDB_API void Append(const char *value, uint32_t length); // prepared statements - template - void AppendRow(Args... args) { + template + void AppendRow(ARGS... args) { BeginRow(); AppendRowRecursive(args...); } @@ -28451,7 +28871,7 @@ class BaseAppender { vector &GetTypes() { return types; } - idx_t CurrentColumn() { + idx_t CurrentColumn() const { return column; } DUCKDB_API void AppendDataChunk(DataChunk &value); @@ -28473,8 +28893,8 @@ class BaseAppender { EndRow(); } - template - void AppendRowRecursive(T value, Args... args) { + template + void AppendRowRecursive(T value, ARGS... args) { Append(value); AppendRowRecursive(args...); } @@ -31253,7 +31673,7 @@ class UUID { public: constexpr static const uint8_t STRING_SIZE = 36; //! Convert a uuid string to a hugeint object - static bool FromString(string str, hugeint_t &result); + static bool FromString(const string &str, hugeint_t &result); //! Convert a uuid string to a hugeint object static bool FromCString(const char *str, idx_t len, hugeint_t &result) { return FromString(string(str, 0, len), result); @@ -31275,7 +31695,7 @@ class UUID { return string(buff, STRING_SIZE); } - static hugeint_t FromString(string str) { + static hugeint_t FromString(const string &str) { hugeint_t result; FromString(str, result); return result; @@ -31299,8 +31719,8 @@ class UUID { namespace duckdb { -struct dtime_t; -struct dtime_tz_t; +struct dtime_t; // NOLINT +struct dtime_tz_t; // NOLINT //! The Time class is a static class that holds helper functions for the Time //! type. @@ -31469,7 +31889,8 @@ class MemoryStream : public WriteStream, public ReadStream { namespace duckdb { struct CreateFunctionInfo : public CreateInfo { - explicit CreateFunctionInfo(CatalogType type, string schema = DEFAULT_SCHEMA) : CreateInfo(type, schema) { + explicit CreateFunctionInfo(CatalogType type, string schema = DEFAULT_SCHEMA) + : CreateInfo(type, std::move(schema)) { D_ASSERT(type == CatalogType::SCALAR_FUNCTION_ENTRY || type == CatalogType::AGGREGATE_FUNCTION_ENTRY || type == CatalogType::TABLE_FUNCTION_ENTRY || type == CatalogType::PRAGMA_FUNCTION_ENTRY || type == CatalogType::MACRO_ENTRY || type == CatalogType::TABLE_MACRO_ENTRY); @@ -31582,7 +32003,7 @@ typedef void (*pragma_function_t)(ClientContext &context, const FunctionParamete //! -> this is similar to a call pragma but without parameters //! Pragma functions can either return a new query to execute (pragma_query_t) //! or they can -class PragmaFunction : public SimpleNamedParameterFunction { +class PragmaFunction : public SimpleNamedParameterFunction { // NOLINT: work-around bug in clang-tidy public: // Call DUCKDB_API static PragmaFunction PragmaCall(const string &name, pragma_query_t query, vector arguments, @@ -31616,7 +32037,7 @@ namespace duckdb { template class FunctionSet { public: - explicit FunctionSet(string name) : name(name) { + explicit FunctionSet(string name) : name(std::move(name)) { } //! The name of the function set @@ -31843,8 +32264,7 @@ class ColumnDataCollection; class ExecutionContext; struct LocalFunctionData { - virtual ~LocalFunctionData() { - } + virtual ~LocalFunctionData() = default; template TARGET &Cast() { @@ -31853,14 +32273,13 @@ struct LocalFunctionData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct GlobalFunctionData { - virtual ~GlobalFunctionData() { - } + virtual ~GlobalFunctionData() = default; template TARGET &Cast() { @@ -31869,14 +32288,13 @@ struct GlobalFunctionData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct PreparedBatchData { - virtual ~PreparedBatchData() { - } + virtual ~PreparedBatchData() = default; template TARGET &Cast() { @@ -31885,18 +32303,18 @@ struct PreparedBatchData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct CopyFunctionBindInput { + explicit CopyFunctionBindInput(const CopyInfo &info_p) : info(info_p) { + } + const CopyInfo &info; string file_extension; - - CopyFunctionBindInput(const CopyInfo &info_p) : info(info_p) { - } }; enum class CopyFunctionExecutionMode { REGULAR_COPY_TO_FILE, PARALLEL_COPY_TO_FILE, BATCH_COPY_TO_FILE }; @@ -31936,7 +32354,7 @@ enum class CopyTypeSupport { SUPPORTED, LOSSY, UNSUPPORTED }; typedef CopyTypeSupport (*copy_supports_type_t)(const LogicalType &type); -class CopyFunction : public Function { +class CopyFunction : public Function { // NOLINT: work-around bug in clang-tidy public: explicit CopyFunction(const string &name) : Function(name), plan(nullptr), copy_to_bind(nullptr), copy_to_initialize_local(nullptr), diff --git a/mix.exs b/mix.exs index bda3ded..8868fe6 100644 --- a/mix.exs +++ b/mix.exs @@ -1,8 +1,8 @@ defmodule Duckdbex.MixProject do use Mix.Project - @version "0.2.9" - @duckdb_version "0.10.1" + @version "0.2.10" + @duckdb_version "0.10.2" def project do [ diff --git a/mix.lock b/mix.lock index 28e5d58..7f38f64 100644 --- a/mix.lock +++ b/mix.lock @@ -1,10 +1,10 @@ %{ - "cc_precompiler": {:hex, :cc_precompiler, "0.1.8", "933a5f4da3b19ee56539a076076ce4d7716d64efc8db46fd066996a7e46e2bfd", [:mix], [{:elixir_make, "~> 0.7.3", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "176bdf4366956e456bf761b54ad70bc4103d0269ca9558fd7cee93d1b3f116db"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.37", "2ad73550e27c8946648b06905a57e4d454e4d7229c2dafa72a0348c99d8be5f7", [:mix], [], "hexpm", "6b19783f2802f039806f375610faa22da130b8edc21209d0bff47918bb48360e"}, - "elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"}, - "ex_doc": {:hex, :ex_doc, "0.30.7", "dc7247091aec738ab781f71cbebfc07979d1040c98c7ee67dbde99b7829b743d", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "868ff1c7a44c462741853840d1e7ef19a07906e7467cb8da070c158ea6a42a51"}, - "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"}, + "cc_precompiler": {:hex, :cc_precompiler, "0.1.10", "47c9c08d8869cf09b41da36538f62bc1abd3e19e41701c2cea2675b53c704258", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f6e046254e53cd6b41c6bacd70ae728011aa82b2742a80d6e2214855c6e06b22"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, + "elixir_make": {:hex, :elixir_make, "0.8.3", "d38d7ee1578d722d89b4d452a3e36bcfdc644c618f0d063b874661876e708683", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "5c99a18571a756d4af7a4d89ca75c28ac899e6103af6f223982f09ce44942cc9"}, + "ex_doc": {:hex, :ex_doc, "0.32.1", "21e40f939515373bcdc9cffe65f3b3543f05015ac6c3d01d991874129d173420", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5142c9db521f106d61ff33250f779807ed2a88620e472ac95dc7d59c380113da"}, + "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, }