|
| 1 | +/** |
| 2 | + * @file sc-52975.cc |
| 3 | + * |
| 4 | + * @section LICENSE |
| 5 | + * |
| 6 | + * The MIT License |
| 7 | + * |
| 8 | + * @copyright Copyright (c) 2024 TileDB, Inc. |
| 9 | + * |
| 10 | + * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 11 | + * of this software and associated documentation files (the "Software"), to deal |
| 12 | + * in the Software without restriction, including without limitation the rights |
| 13 | + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 14 | + * copies of the Software, and to permit persons to whom the Software is |
| 15 | + * furnished to do so, subject to the following conditions: |
| 16 | + * |
| 17 | + * The above copyright notice and this permission notice shall be included in |
| 18 | + * all copies or substantial portions of the Software. |
| 19 | + * |
| 20 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 21 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 22 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 23 | + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 24 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 25 | + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 26 | + * THE SOFTWARE. |
| 27 | + */ |
| 28 | + |
| 29 | +#include <chrono> |
| 30 | +#include <climits> |
| 31 | +#include <numeric> |
| 32 | +#include <thread> |
| 33 | + |
| 34 | +#include <tiledb/tiledb> |
| 35 | +#include <tiledb/tiledb_experimental> |
| 36 | + |
| 37 | +#include <test/support/tdb_catch.h> |
| 38 | + |
| 39 | +using namespace tiledb; |
| 40 | + |
| 41 | +static void create_array(const std::string& array_uri); |
| 42 | +static void write_array(const std::string& array_uri, int8_t min, int8_t max); |
| 43 | +static bool read_array(const std::string& array_uri, int8_t min, int8_t max); |
| 44 | + |
| 45 | +std::vector<uint64_t> get_attr_data(); |
| 46 | +std::vector<uint8_t> get_attr_validity(); |
| 47 | +std::vector<std::pair<int8_t, int8_t>> get_subarrays(); |
| 48 | + |
| 49 | +TEST_CASE( |
| 50 | + "PJD: Attempt to reproduce bug", |
| 51 | + "[reproducer][bug][scXXXXX][!shouldfail]") { |
| 52 | + std::string array_uri = "test_reproducer"; |
| 53 | + |
| 54 | + std::size_t successes = 0; |
| 55 | + std::size_t failures = 0; |
| 56 | + |
| 57 | + auto subarrays = get_subarrays(); |
| 58 | + std::size_t num_cases = subarrays.size(); |
| 59 | + |
| 60 | + for (auto subarray : subarrays) { |
| 61 | + create_array(array_uri); |
| 62 | + write_array(array_uri, subarray.first, subarray.second); |
| 63 | + if (read_array(array_uri, subarray.first, subarray.second)) { |
| 64 | + successes += 1; |
| 65 | + } else { |
| 66 | + failures += 1; |
| 67 | + } |
| 68 | + } |
| 69 | + |
| 70 | + REQUIRE(((successes == num_cases) && (failures == 0))); |
| 71 | +} |
| 72 | + |
| 73 | +void create_array(const std::string& array_uri) { |
| 74 | + Context ctx; |
| 75 | + |
| 76 | + auto obj = Object::object(ctx, array_uri); |
| 77 | + if (obj.type() != Object::Type::Invalid) { |
| 78 | + Object::remove(ctx, array_uri); |
| 79 | + } |
| 80 | + |
| 81 | + auto dim = Dimension::create<int8_t>(ctx, "dim", {{-91, 90}}, 1); |
| 82 | + |
| 83 | + Domain dom(ctx); |
| 84 | + dom.add_dimension(dim); |
| 85 | + |
| 86 | + uint64_t fill_value = 15110407019492443053llu; |
| 87 | + |
| 88 | + auto attr = Attribute::create<uint64_t>(ctx, "attr"); |
| 89 | + attr.set_nullable(true); |
| 90 | + attr.set_fill_value(&fill_value, sizeof(uint64_t), 0); |
| 91 | + // Maybe: FilterList [BitShuffle, ByteShuffle] |
| 92 | + |
| 93 | + ArraySchema schema(ctx, TILEDB_DENSE); |
| 94 | + schema.set_capacity(340418807209297907) |
| 95 | + .set_allows_dups(false) |
| 96 | + .set_cell_order(TILEDB_ROW_MAJOR) |
| 97 | + .set_tile_order(TILEDB_ROW_MAJOR) |
| 98 | + .set_domain(dom) |
| 99 | + .add_attribute(attr); |
| 100 | + |
| 101 | + Array::create(array_uri, schema); |
| 102 | +} |
| 103 | + |
| 104 | +void write_array(const std::string& array_uri, int8_t min, int8_t max) { |
| 105 | + Context ctx; |
| 106 | + Array array(ctx, array_uri, TILEDB_WRITE); |
| 107 | + Query query(ctx, array, TILEDB_WRITE); |
| 108 | + |
| 109 | + Subarray subarray(ctx, array); |
| 110 | + subarray.add_range(0, min, max); |
| 111 | + |
| 112 | + auto attr_data = get_attr_data(); |
| 113 | + auto attr_validity = get_attr_validity(); |
| 114 | + |
| 115 | + attr_data.resize(max - min + 1); |
| 116 | + attr_validity.resize(max - min + 1); |
| 117 | + |
| 118 | + query.set_layout(TILEDB_ROW_MAJOR) |
| 119 | + .set_subarray(subarray) |
| 120 | + .set_data_buffer("attr", attr_data) |
| 121 | + .set_validity_buffer("attr", attr_validity); |
| 122 | + |
| 123 | + REQUIRE(query.submit() == Query::Status::COMPLETE); |
| 124 | + |
| 125 | + array.close(); |
| 126 | +} |
| 127 | + |
| 128 | +bool read_array(const std::string& array_uri, int8_t min, int8_t max) { |
| 129 | + Context ctx; |
| 130 | + Array array(ctx, array_uri, TILEDB_READ); |
| 131 | + |
| 132 | + Subarray subarray(ctx, array); |
| 133 | + subarray.add_range(0, min, max); |
| 134 | + |
| 135 | + std::vector<int8_t> dim(1024); |
| 136 | + std::vector<uint64_t> data(1024); |
| 137 | + std::vector<uint8_t> validity(1024); |
| 138 | + |
| 139 | + Query query(ctx, array, TILEDB_READ); |
| 140 | + query.set_layout(TILEDB_ROW_MAJOR) |
| 141 | + .set_subarray(subarray) |
| 142 | + .set_data_buffer("dim", dim) |
| 143 | + .set_data_buffer("attr", data) |
| 144 | + .set_validity_buffer("attr", validity); |
| 145 | + REQUIRE(query.submit() == Query::Status::COMPLETE); |
| 146 | + |
| 147 | + dim.resize(max - min + 1); |
| 148 | + data.resize(max - min + 1); |
| 149 | + validity.resize(max - min + 1); |
| 150 | + |
| 151 | + uint64_t fill_value = 15110407019492443053llu; |
| 152 | + for (auto d : data) { |
| 153 | + if (d == fill_value) { |
| 154 | + return false; |
| 155 | + } |
| 156 | + } |
| 157 | + for (auto v : validity) { |
| 158 | + if (v == 0) { |
| 159 | + return false; |
| 160 | + } |
| 161 | + } |
| 162 | + |
| 163 | + return true; |
| 164 | +} |
| 165 | + |
| 166 | +std::vector<uint64_t> get_attr_data() { |
| 167 | + std::vector<uint64_t> data(1024); |
| 168 | + std::iota(data.begin(), data.end(), 0); |
| 169 | + return data; |
| 170 | +} |
| 171 | + |
| 172 | +std::vector<uint8_t> get_attr_validity() { |
| 173 | + std::vector<uint8_t> validity(1024, 1); |
| 174 | + return validity; |
| 175 | +} |
| 176 | + |
| 177 | +// Any value past 37 will cause issues here as 37 - (-91) = 128. Some of our |
| 178 | +// computations will interpret 128 as an int8 when they shouldn't and use a |
| 179 | +// negative number. This will require a full revision of the dense code to fix |
| 180 | +// all erroneous int8 conversions, which is a lot of code to correct. |
| 181 | +std::vector<std::pair<int8_t, int8_t>> get_subarrays() { |
| 182 | + return { |
| 183 | + {-77, -77}, {-72, -72}, {-71, -60}, {-70, -31}, {-67, -34}, {-67, -57}, |
| 184 | + {-66, -63}, {-58, -43}, {-58, -48}, {-57, -56}, {-56, -48}, {-53, 34}, |
| 185 | + {-52, -52}, {-50, -39}, {-47, 15}, {-44, -21}, {-43, -32}, {-42, -15}, |
| 186 | + {-42, -34}, {-41, -33}, {-40, -20}, {-38, -3}, {-37, -23}, {-36, -28}, |
| 187 | + {-36, -34}, {-34, -33}, {-29, -25}, {-29, -26}, {-29, -27}, {-29, 12}, |
| 188 | + {-28, -25}, {-28, 12}, {-26, -15}, {-25, 1}, {-25, 26}, {-23, 6}, |
| 189 | + {-22, -20}, {-22, 29}, {-22, 33}, {-22, 35}, {-22, 36}, {-22, 37}, |
| 190 | + {-22, 37}, {-22, 44}, {-22, 58}, {-18, -15}, {-17, -17}, {-17, 19}, |
| 191 | + {-17, 29}, {-17, 34}, {-17, 36}, {-17, 37}, {-17, 38}, {-16, -1}, |
| 192 | + {-15, 27}, {-14, -10}, {-14, -5}, {-14, -7}, {-14, -8}, {-14, 12}, |
| 193 | + {-11, -10}, {-11, 21}, {-11, 29}, {-11, 32}, {-11, 35}, {-11, 36}, |
| 194 | + {-11, 37}, {-11, 37}, {-11, 38}, {-11, 43}, {-11, 6}, {-10, 10}, |
| 195 | + {-10, 7}, {-8, -2}, {-8, -2}, {-8, 23}, {-8, 23}, {-8, 35}, |
| 196 | + {-8, 36}, {-8, 37}, {-8, 37}, {-8, 38}, {-8, 4}, {-8, 41}, |
| 197 | + {-8, 47}, {-7, -4}, {-7, 0}, {-5, 14}, {-5, 24}, {-5, 31}, |
| 198 | + {-5, 34}, {-5, 36}, {-5, 37}, {-5, 37}, {-5, 49}, {-4, -4}, |
| 199 | + {-4, 10}, {-4, 14}, {-4, 20}, {-4, 31}, {-4, 34}, {-4, 36}, |
| 200 | + {-4, 36}, {-4, 37}, {-4, 37}, {-4, 37}, {-4, 38}, {-4, 39}, |
| 201 | + {-4, 39}, {-4, 41}, {-4, 43}, {-4, 51}, {-4, 68}, {-4, 9}, |
| 202 | + {-2, -2}, {-2, 1}, {-2, 10}, {-2, 16}, {-2, 20}, {-2, 22}, |
| 203 | + {-2, 22}, {-2, 3}, {-2, 30}, {-2, 31}, {-2, 34}, {-2, 34}, |
| 204 | + {-2, 36}, {-2, 36}, {-2, 36}, {-2, 37}, {-2, 37}, {-2, 37}, |
| 205 | + {-2, 37}, {-2, 37}, {-2, 38}, {-2, 39}, {-2, 40}, {-2, 40}, |
| 206 | + {-2, 41}, {-2, 45}, {-2, 45}, {-1, 18}, {-1, 24}, {-1, 27}, |
| 207 | + {-1, 27}, {-1, 28}, {-1, 31}, {-1, 33}, {-1, 34}, {-1, 34}, |
| 208 | + {-1, 35}, {-1, 36}, {-1, 36}, {-1, 36}, {-1, 37}, {-1, 37}, |
| 209 | + {-1, 37}, {-1, 37}, {-1, 37}, {-1, 38}, {-1, 41}, {-1, 49}, |
| 210 | + {-1, 5}, {-1, 55}, {0, 0}, {0, 11}, {0, 14}, {0, 18}, |
| 211 | + {0, 19}, {0, 19}, {0, 20}, {0, 21}, {0, 22}, {0, 23}, |
| 212 | + {0, 24}, {0, 25}, {0, 25}, {0, 26}, {0, 26}, {0, 27}, |
| 213 | + {0, 27}, {0, 28}, {0, 28}, {0, 28}, {0, 29}, {0, 29}, |
| 214 | + {0, 31}, {0, 31}, {0, 32}, {0, 32}, {0, 33}, {0, 33}, |
| 215 | + {0, 33}, {0, 33}, {0, 34}, {0, 34}, {0, 34}, {0, 34}, |
| 216 | + {0, 35}, {0, 35}, {0, 35}, {0, 35}, {0, 35}, {0, 35}, |
| 217 | + {0, 35}, {0, 36}, {0, 36}, {0, 36}, {0, 36}, {0, 36}, |
| 218 | + {0, 36}, {0, 36}, {0, 36}, {0, 36}, {0, 36}, {0, 36}, |
| 219 | + {0, 36}, {0, 36}, {0, 37}, {0, 37}, {0, 37}, {0, 37}, |
| 220 | + {0, 37}, {0, 37}, {0, 37}, {0, 37}, {0, 37}, {0, 37}, |
| 221 | + {0, 37}, {0, 37}, {0, 37}, {0, 37}, {0, 37}, {0, 37}, |
| 222 | + {0, 37}, {0, 37}, {0, 37}, {0, 37}, {0, 38}, {0, 38}, |
| 223 | + {0, 38}, {0, 38}, {0, 38}, {0, 38}, {0, 39}, {0, 39}, |
| 224 | + {0, 39}, {0, 39}, {0, 39}, {0, 4}, {0, 40}, {0, 41}, |
| 225 | + {0, 41}, {0, 41}, {0, 42}, {0, 42}, {0, 46}, {0, 47}, |
| 226 | + {0, 5}, {0, 50}, {0, 52}, {0, 53}, {0, 55}, {0, 56}, |
| 227 | + {0, 62}, {0, 75}, {0, 8}, {1, 1}, {1, 13}, {1, 13}, |
| 228 | + {1, 13}, {1, 15}, {1, 16}, {1, 18}, {1, 19}, {1, 19}, |
| 229 | + {1, 19}, {1, 2}, {1, 20}, {1, 20}, {1, 21}, {1, 21}, |
| 230 | + {1, 21}, {1, 21}, {1, 21}, {1, 22}, {1, 23}, {1, 25}, |
| 231 | + {1, 26}, {1, 27}, {1, 29}, {1, 29}, {1, 3}, {1, 30}, |
| 232 | + {1, 30}, {1, 31}, {1, 31}, {1, 31}, {1, 32}, {1, 34}, |
| 233 | + {1, 34}, {1, 34}, {1, 34}, {1, 34}, {1, 35}, {1, 35}, |
| 234 | + {1, 35}, {1, 35}, {1, 36}, {1, 36}, {1, 36}, {1, 36}, |
| 235 | + {1, 36}, {1, 36}, {1, 36}, {1, 36}, {1, 36}, {1, 37}, |
| 236 | + {1, 37}, {1, 37}, {1, 37}, {1, 37}, {1, 37}, {1, 37}, |
| 237 | + {1, 37}, {1, 37}, {1, 37}, {1, 37}, {1, 37}, {1, 38}, |
| 238 | + {1, 38}, {1, 38}, {1, 38}, {1, 38}, {1, 38}, {1, 38}, |
| 239 | + {1, 39}, {1, 39}, {1, 39}, {1, 39}, {1, 41}, {1, 41}, |
| 240 | + {1, 41}, {1, 41}, {1, 41}, {1, 42}, {1, 45}, {1, 46}, |
| 241 | + {1, 54}, {1, 59}, {1, 6}, {1, 75}, {1, 9}, {1, 9}, |
| 242 | + {2, 17}, {2, 19}, {2, 19}, {2, 2}, {2, 21}, {2, 22}, |
| 243 | + {2, 23}, {2, 27}, {2, 28}, {2, 28}, {2, 28}, {2, 31}, |
| 244 | + {2, 33}, {2, 33}, {2, 33}, {2, 34}, {2, 35}, {2, 35}, |
| 245 | + {2, 35}, {2, 36}, {2, 36}, {2, 36}, {2, 36}, {2, 36}, |
| 246 | + {2, 36}, {2, 37}, {2, 37}, {2, 37}, {2, 37}, {2, 37}, |
| 247 | + {2, 37}, {2, 37}, {2, 37}, {2, 37}, {2, 37}, {2, 38}, |
| 248 | + {2, 38}, {2, 38}, {2, 40}, {2, 40}, {2, 41}, {2, 43}, |
| 249 | + {2, 45}, {2, 54}, {2, 72}, {2, 79}, {3, 10}, {3, 20}, |
| 250 | + {3, 23}, {3, 28}, {3, 29}, {3, 33}, {3, 34}, {3, 35}, |
| 251 | + {3, 36}, {3, 36}, {3, 36}, {3, 37}, {3, 37}, {3, 37}, |
| 252 | + {3, 37}, {3, 38}, {3, 38}, {3, 38}, {3, 41}, {3, 43}, |
| 253 | + {3, 54}, {3, 9}, {4, 14}, {4, 16}, {4, 22}, {4, 23}, |
| 254 | + {4, 23}, {4, 23}, {4, 23}, {4, 32}, {4, 33}, {4, 33}, |
| 255 | + {4, 33}, {4, 35}, {4, 36}, {4, 36}, {4, 36}, {4, 36}, |
| 256 | + {4, 37}, {4, 37}, {4, 37}, {4, 37}, {4, 37}, {4, 38}, |
| 257 | + {4, 38}, {4, 38}, {4, 41}, {4, 42}, {4, 42}, {4, 43}, |
| 258 | + {4, 5}, {4, 8}, {4, 9}, {5, 10}, {5, 12}, {5, 13}, |
| 259 | + {5, 21}, {5, 22}, {5, 24}, {5, 24}, {5, 26}, {5, 30}, |
| 260 | + {5, 31}, {5, 31}, {5, 32}, {5, 34}, {5, 34}, {5, 35}, |
| 261 | + {5, 35}, {5, 35}, {5, 36}, {5, 36}, {5, 36}, {5, 36}, |
| 262 | + {5, 36}, {5, 37}, {5, 37}, {5, 37}, {5, 37}, {5, 37}, |
| 263 | + {5, 37}, {5, 37}, {5, 37}, {5, 37}, {5, 38}, {5, 38}, |
| 264 | + {5, 39}, {5, 39}, {5, 44}, {5, 44}, {5, 44}, {5, 45}, |
| 265 | + {5, 47}, {5, 57}, {5, 58}, {6, 11}, {6, 12}, {6, 15}, |
| 266 | + {6, 15}, {6, 15}, {6, 16}, {6, 18}, {6, 22}, {6, 22}, |
| 267 | + {6, 22}, {6, 24}, {6, 26}, {6, 29}, {6, 29}, {6, 30}, |
| 268 | + {6, 31}, {6, 31}, {6, 32}, {6, 32}, {6, 34}, {6, 34}, |
| 269 | + {6, 35}, {6, 35}, {6, 35}, {6, 36}, {6, 36}, {6, 36}, |
| 270 | + {6, 36}, {6, 37}, {6, 37}, {6, 37}, {6, 37}, {6, 37}, |
| 271 | + {6, 37}, {6, 37}, {6, 38}, {6, 38}, {6, 39}, {6, 41}, |
| 272 | + {6, 47}, {6, 53}, {6, 7}, {6, 9}, {6, 9}, {7, 12}, |
| 273 | + {7, 21}, {7, 22}, {7, 22}, {7, 23}, {7, 30}, {7, 31}, |
| 274 | + {7, 31}, {7, 32}, {7, 34}, {7, 34}, {7, 35}, {7, 36}, |
| 275 | + {7, 36}, {7, 36}, {7, 36}, {7, 37}, {7, 37}, {7, 37}, |
| 276 | + {7, 37}, {7, 37}, {7, 37}, {7, 37}, {7, 38}, {7, 39}, |
| 277 | + {7, 39}, {7, 43}, {7, 45}, {7, 55}, {7, 57}, {7, 67}, |
| 278 | + {8, 10}, {8, 12}, {8, 13}, {8, 16}, {8, 19}, {8, 23}, |
| 279 | + {8, 24}, {8, 24}, {8, 26}, {8, 27}, {8, 28}, {8, 32}, |
| 280 | + {8, 32}, {8, 33}, {8, 33}, {8, 34}, {8, 35}, {8, 35}, |
| 281 | + {8, 35}, {8, 36}, {8, 36}, {8, 36}, {8, 36}, {8, 36}, |
| 282 | + {8, 37}, {8, 37}, {8, 37}, {8, 37}, {8, 37}, {8, 37}, |
| 283 | + {8, 37}, {8, 37}, {8, 37}, {8, 38}, {8, 39}, {8, 40}, |
| 284 | + {8, 40}, {8, 41}, {8, 46}, {8, 47}, {8, 49}, {8, 59}, |
| 285 | + {8, 9}, {9, 10}, {9, 23}, {9, 27}, {9, 28}, {9, 30}, |
| 286 | + {9, 30}, {9, 32}, {9, 34}, {9, 35}, {9, 35}, {9, 36}, |
| 287 | + {9, 36}, {9, 36}, {9, 37}, {9, 37}, {9, 37}, {9, 37}, |
| 288 | + {9, 37}, {9, 38}, {9, 39}, {9, 41}, {9, 46}, {9, 52}, |
| 289 | + {9, 65}, {10, 16}, {10, 19}, {10, 24}, {10, 24}, {10, 29}, |
| 290 | + {10, 31}, {10, 32}, {10, 34}, {10, 35}, {10, 36}, {10, 36}, |
| 291 | + {10, 36}, {10, 36}, {10, 37}, {10, 37}, {10, 37}, {10, 37}, |
| 292 | + {10, 37}, {10, 37}, {10, 38}, {10, 38}, {10, 38}, {10, 39}, |
| 293 | + {10, 39}, {10, 40}, {10, 43}, {10, 48}, {10, 49}, {10, 62}, |
| 294 | + {10, 67}, {10, 69}, {11, 28}, {11, 31}, {11, 33}, {11, 35}, |
| 295 | + {11, 36}, {11, 36}, {11, 36}, {11, 37}, {11, 37}, {11, 37}, |
| 296 | + {11, 37}, {11, 38}, {11, 38}, {11, 39}, {11, 40}, {11, 41}, |
| 297 | + {11, 43}, {11, 46}, {11, 49}, {11, 51}, {11, 62}, {12, 27}, |
| 298 | + {12, 33}, {12, 35}, {12, 36}, {12, 36}, {12, 37}, {12, 37}, |
| 299 | + {12, 37}, {12, 38}, {12, 39}, {12, 39}, {12, 43}, {12, 44}, |
| 300 | + {12, 54}, {12, 74}, {13, 13}, {13, 13}, {13, 16}, {13, 17}, |
| 301 | + {13, 26}, {13, 28}, {13, 29}, {13, 29}, {13, 31}, {13, 33}, |
| 302 | + {13, 33}, {13, 35}, {13, 36}, {13, 36}, {13, 36}, {13, 36}, |
| 303 | + {13, 37}, {13, 37}, {13, 37}, {13, 37}, {13, 37}, {13, 38}, |
| 304 | + {13, 38}, {13, 38}, {13, 39}, {13, 39}, {13, 39}, {13, 41}, |
| 305 | + {13, 42}, {13, 45}, {13, 48}, {13, 50}, {13, 60}, {14, 25}, |
| 306 | + {14, 26}, {14, 28}, {14, 28}, {14, 32}, {14, 35}, {14, 35}, |
| 307 | + {14, 35}, {14, 36}, {14, 36}, {14, 36}, {14, 37}, {14, 37}, |
| 308 | + {14, 37}, {14, 37}, {14, 37}, {14, 37}, {14, 38}, {14, 39}, |
| 309 | + {14, 39}, {14, 42}, {14, 42}, {14, 63}, {14, 70}, {15, 24}, |
| 310 | + {15, 24}, {15, 26}, {15, 29}, {15, 30}, {15, 32}, {15, 35}, |
| 311 | + {15, 36}, {15, 36}, {15, 37}, {15, 37}, {15, 37}, {15, 38}, |
| 312 | + {15, 40}, {15, 43}, {16, 28}, {16, 31}, {16, 33}, {16, 34}, |
| 313 | + {16, 35}, {16, 36}, {16, 36}, {16, 37}, {16, 37}, {16, 37}, |
| 314 | + {16, 37}, {16, 38}, {16, 40}, {16, 40}, {16, 45}, {16, 55}, |
| 315 | + {17, 21}, {17, 23}, {17, 30}, {17, 33}, {17, 35}, {17, 36}, |
| 316 | + {17, 36}, {17, 37}, {17, 37}, {17, 37}, {17, 38}, {17, 38}, |
| 317 | + {17, 40}, {17, 42}, {17, 45}, {17, 50}, {17, 54}, {18, 32}, |
| 318 | + {18, 34}, {18, 36}, {18, 37}, {18, 38}, {18, 39}, {18, 46}, |
| 319 | + {18, 75}, {19, 20}, {19, 21}, {19, 34}, {20, 29}, {20, 30}, |
| 320 | + {20, 30}, {20, 32}, {20, 33}, {20, 34}, {20, 35}, {20, 35}, |
| 321 | + {20, 36}, {20, 36}, {20, 36}, {20, 36}, {20, 37}, {20, 37}, |
| 322 | + {20, 37}, {20, 37}, {20, 37}, {20, 37}, {20, 38}, {20, 38}, |
| 323 | + {20, 38}, {20, 39}, {20, 40}, {20, 40}, {20, 45}, {20, 47}, |
| 324 | + {20, 57}, {20, 70}, {21, 29}, {21, 33}, {21, 35}, {21, 36}, |
| 325 | + {21, 37}, {21, 37}, {21, 54}, {22, 22}, {22, 25}, {23, 33}, |
| 326 | + {23, 36}, {23, 37}, {23, 38}, {23, 43}, {24, 25}, {24, 25}, |
| 327 | + {24, 36}, {24, 37}, {24, 38}, {24, 40}, {24, 43}, {24, 49}, |
| 328 | + {25, 31}, {25, 32}, {25, 35}, {25, 36}, {25, 36}, {25, 36}, |
| 329 | + {25, 37}, {25, 37}, {25, 37}, {25, 37}, {25, 38}, {25, 38}, |
| 330 | + {25, 38}, {25, 39}, {25, 40}, {25, 42}, {25, 47}, {25, 51}, |
| 331 | + {25, 55}, {26, 27}, {26, 34}, {26, 36}, {26, 37}, {26, 38}, |
| 332 | + {26, 42}, {26, 59}, {27, 32}, {27, 32}, {27, 33}, {27, 35}, |
| 333 | + {27, 35}, {27, 36}, {27, 36}, {27, 37}, {27, 37}, {27, 37}, |
| 334 | + {27, 37}, {27, 38}, {27, 48}, {27, 49}, {27, 69}, {28, 30}, |
| 335 | + {28, 33}, {28, 34}, {28, 36}, {28, 36}, {28, 37}, {28, 37}, |
| 336 | + {28, 37}, {28, 38}, {28, 40}, {28, 49}, {28, 53}, {28, 71}, |
| 337 | + {28, 79}, {30, 36}, {31, 34}, {31, 36}, {31, 37}, {31, 38}, |
| 338 | + {31, 46}, {31, 61}, {32, 35}, {32, 36}, {32, 37}, {32, 37}, |
| 339 | + {32, 38}, {32, 44}, {34, 36}, {34, 37}, {34, 38}, {34, 43}, |
| 340 | + {34, 52}, {34, 71}, {35, 36}, {35, 36}, {35, 36}, {35, 37}, |
| 341 | + {35, 37}, {35, 37}, {35, 38}, {35, 39}, {35, 42}, {35, 44}, |
| 342 | + {35, 54}, {37, 42}, {37, 65}, {38, 46}, {39, 52}, {40, 40}, |
| 343 | + {41, 44}, {42, 43}, {42, 45}, {43, 44}, {44, 48}, {44, 62}, |
| 344 | + {46, 76}, {51, 55}, {51, 74}, {52, 56}, {52, 60}, {52, 63}, |
| 345 | + {54, 55}, {55, 58}, {55, 63}, {58, 60}, {61, 63}, {61, 63}, |
| 346 | + {61, 75}, {62, 63}, {63, 63}, {64, 65}, {66, 66}, {66, 69}, |
| 347 | + {68, 68}, {68, 68}, {68, 68}, {69, 69}, {69, 79}, {70, 70}, |
| 348 | + {70, 80}, {71, 73}, {73, 75}, {74, 74}, {74, 77}, {74, 78}, |
| 349 | + {74, 82}, {75, 76}, {75, 79}, {76, 80}, {77, 78}, {77, 78}, |
| 350 | + {77, 81}, {77, 83}, {79, 79}, {79, 81}, {79, 83}, {80, 80}, |
| 351 | + {80, 87}, {81, 81}, {81, 81}, {81, 82}, {82, 82}, {83, 83}, |
| 352 | + {83, 84}, {84, 86}, {87, 88}, {88, 88}, {88, 88}, {88, 89}, |
| 353 | + {89, 89}, {89, 89}, {89, 89}, {89, 89}, {90, 90}}; |
| 354 | +} |
0 commit comments