Files
tsnet-proxy/vendor/github.com/gaissmai/bart/base_index.go
2024-11-01 17:43:06 +00:00

622 lines
23 KiB
Go

// Copyright (c) 2024 Karl Gaissmaier
// SPDX-License-Identifier: MIT
package bart
import "cmp"
// Please read the ART paper ./doc/artlookup.pdf
// to understand the baseIndex algorithm.
// hostMasks as lookup table
var hostMasks = []uint8{
0b1111_1111, // bits == 0
0b0111_1111, // bits == 1
0b0011_1111, // bits == 2
0b0001_1111, // bits == 3
0b0000_1111, // bits == 4
0b0000_0111, // bits == 5
0b0000_0011, // bits == 6
0b0000_0001, // bits == 7
0b0000_0000, // bits == 8
}
func netMask(mask int) uint8 {
return ^hostMasks[uint8(mask)]
}
const (
// baseIndex of the first host route: prefixToBaseIndex(0,8)
firstHostIndex = 0b1_0000_0000 // 256
// baseIndex of the last host route: prefixToBaseIndex(255,8)
//nolint:unused
lastHostIndex = 0b1_1111_1111 // 511
)
// prefixToBaseIndex, maps a prefix table as a 'complete binary tree'.
// This is the so-called baseIndex a.k.a heapFunc:
func prefixToBaseIndex(octet byte, prefixLen int) uint {
return uint(octet>>(strideLen-prefixLen)) + (1 << prefixLen)
}
// octetToBaseIndex, just prefixToBaseIndex(octet, 8), a.k.a host routes
// but faster, use it for host routes in Lookup.
func octetToBaseIndex(octet byte) uint {
return uint(octet) + firstHostIndex // just: octet + 256
}
// baseIndexToPrefixLen, calc the bits from baseIndex and octect depth
func baseIndexToPrefixLen(baseIdx uint, depth int) int {
_, pfxLen := baseIndexToPrefix(baseIdx)
return depth*strideLen + pfxLen
}
// hostRoutesByIndex, get range of host routes for this idx.
//
// idx: 72
// prefix: 32/6
// lower: 256 + 32 = 288
// upper: 256 + (32 | 0b0000_0011) = 291
//
// Use the pre computed lookup table.
//
// func hostRoutesByIndex(idx uint) (uint, uint) {
// octet, bits := baseIndexToPrefix(idx)
// return octetToBaseIndex(octet), octetToBaseIndex(octet | hostMasks[bits])
// }
func hostRoutesByIndex(idx uint) (uint, uint) {
item := baseIdxLookupTbl[idx]
return uint(item.lower), uint(item.upper)
}
// baseIndexToPrefix returns the octet and prefix len of baseIdx.
// It's the inverse to prefixToBaseIndex.
//
// Use the pre computed lookup table, bits.LeadingZeros is too slow.
//
// func baseIndexToPrefix(baseIdx uint) (octet byte, pfxLen int) {
// nlz := bits.LeadingZeros(baseIdx)
// pfxLen = strconv.IntSize - nlz - 1
// octet = (baseIdx & (0xFF >> (8 - pfxLen))) << (8 - pfxLen)
// return octet, pfxLen
// }
func baseIndexToPrefix(baseIdx uint) (octet byte, pfxLen int) {
item := baseIdxLookupTbl[baseIdx]
return item.octet, int(item.bits)
}
// cmpIndexRank, compare SortFunc to sort indexes in prefix sort order.
func cmpIndexRank(a, b uint) int {
return cmp.Compare(baseIdxLookupTbl[a].rank, baseIdxLookupTbl[b].rank)
}
// baseIdxLookupTbl
//
// octet, bits,
// host route boundaries,
// prefix sort rank
//
// as lookup table.
var baseIdxLookupTbl = [512]struct {
octet byte
bits int8
lower uint16 // host route lower bound
upper uint16 // host route upper bound
rank uint16 // prefix sort rank
}{
{0, -1, 0, 0, 0}, // idx == 0 invalid!
{0, 0, 256, 511, 1}, // idx == 1
{0, 1, 256, 383, 2}, // idx == 2
{128, 1, 384, 511, 257}, // idx == 3
{0, 2, 256, 319, 3}, // idx == 4
{64, 2, 320, 383, 130}, // idx == 5
{128, 2, 384, 447, 258}, // idx == 6
{192, 2, 448, 511, 385}, // idx == 7
{0, 3, 256, 287, 4}, // idx == 8
{32, 3, 288, 319, 67}, // idx == 9
{64, 3, 320, 351, 131}, // idx == 10
{96, 3, 352, 383, 194}, // idx == 11
{128, 3, 384, 415, 259}, // idx == 12
{160, 3, 416, 447, 322}, // idx == 13
{192, 3, 448, 479, 386}, // idx == 14
{224, 3, 480, 511, 449}, // idx == 15
{0, 4, 256, 271, 5}, // idx == 16
{16, 4, 272, 287, 36}, // idx == 17
{32, 4, 288, 303, 68}, // idx == 18
{48, 4, 304, 319, 99}, // idx == 19
{64, 4, 320, 335, 132}, // idx == 20
{80, 4, 336, 351, 163}, // idx == 21
{96, 4, 352, 367, 195}, // idx == 22
{112, 4, 368, 383, 226}, // idx == 23
{128, 4, 384, 399, 260}, // idx == 24
{144, 4, 400, 415, 291}, // idx == 25
{160, 4, 416, 431, 323}, // idx == 26
{176, 4, 432, 447, 354}, // idx == 27
{192, 4, 448, 463, 387}, // idx == 28
{208, 4, 464, 479, 418}, // idx == 29
{224, 4, 480, 495, 450}, // idx == 30
{240, 4, 496, 511, 481}, // idx == 31
{0, 5, 256, 263, 6}, // idx == 32
{8, 5, 264, 271, 21}, // idx == 33
{16, 5, 272, 279, 37}, // idx == 34
{24, 5, 280, 287, 52}, // idx == 35
{32, 5, 288, 295, 69}, // idx == 36
{40, 5, 296, 303, 84}, // idx == 37
{48, 5, 304, 311, 100}, // idx == 38
{56, 5, 312, 319, 115}, // idx == 39
{64, 5, 320, 327, 133}, // idx == 40
{72, 5, 328, 335, 148}, // idx == 41
{80, 5, 336, 343, 164}, // idx == 42
{88, 5, 344, 351, 179}, // idx == 43
{96, 5, 352, 359, 196}, // idx == 44
{104, 5, 360, 367, 211}, // idx == 45
{112, 5, 368, 375, 227}, // idx == 46
{120, 5, 376, 383, 242}, // idx == 47
{128, 5, 384, 391, 261}, // idx == 48
{136, 5, 392, 399, 276}, // idx == 49
{144, 5, 400, 407, 292}, // idx == 50
{152, 5, 408, 415, 307}, // idx == 51
{160, 5, 416, 423, 324}, // idx == 52
{168, 5, 424, 431, 339}, // idx == 53
{176, 5, 432, 439, 355}, // idx == 54
{184, 5, 440, 447, 370}, // idx == 55
{192, 5, 448, 455, 388}, // idx == 56
{200, 5, 456, 463, 403}, // idx == 57
{208, 5, 464, 471, 419}, // idx == 58
{216, 5, 472, 479, 434}, // idx == 59
{224, 5, 480, 487, 451}, // idx == 60
{232, 5, 488, 495, 466}, // idx == 61
{240, 5, 496, 503, 482}, // idx == 62
{248, 5, 504, 511, 497}, // idx == 63
{0, 6, 256, 259, 7}, // idx == 64
{4, 6, 260, 263, 14}, // idx == 65
{8, 6, 264, 267, 22}, // idx == 66
{12, 6, 268, 271, 29}, // idx == 67
{16, 6, 272, 275, 38}, // idx == 68
{20, 6, 276, 279, 45}, // idx == 69
{24, 6, 280, 283, 53}, // idx == 70
{28, 6, 284, 287, 60}, // idx == 71
{32, 6, 288, 291, 70}, // idx == 72
{36, 6, 292, 295, 77}, // idx == 73
{40, 6, 296, 299, 85}, // idx == 74
{44, 6, 300, 303, 92}, // idx == 75
{48, 6, 304, 307, 101}, // idx == 76
{52, 6, 308, 311, 108}, // idx == 77
{56, 6, 312, 315, 116}, // idx == 78
{60, 6, 316, 319, 123}, // idx == 79
{64, 6, 320, 323, 134}, // idx == 80
{68, 6, 324, 327, 141}, // idx == 81
{72, 6, 328, 331, 149}, // idx == 82
{76, 6, 332, 335, 156}, // idx == 83
{80, 6, 336, 339, 165}, // idx == 84
{84, 6, 340, 343, 172}, // idx == 85
{88, 6, 344, 347, 180}, // idx == 86
{92, 6, 348, 351, 187}, // idx == 87
{96, 6, 352, 355, 197}, // idx == 88
{100, 6, 356, 359, 204}, // idx == 89
{104, 6, 360, 363, 212}, // idx == 90
{108, 6, 364, 367, 219}, // idx == 91
{112, 6, 368, 371, 228}, // idx == 92
{116, 6, 372, 375, 235}, // idx == 93
{120, 6, 376, 379, 243}, // idx == 94
{124, 6, 380, 383, 250}, // idx == 95
{128, 6, 384, 387, 262}, // idx == 96
{132, 6, 388, 391, 269}, // idx == 97
{136, 6, 392, 395, 277}, // idx == 98
{140, 6, 396, 399, 284}, // idx == 99
{144, 6, 400, 403, 293}, // idx == 100
{148, 6, 404, 407, 300}, // idx == 101
{152, 6, 408, 411, 308}, // idx == 102
{156, 6, 412, 415, 315}, // idx == 103
{160, 6, 416, 419, 325}, // idx == 104
{164, 6, 420, 423, 332}, // idx == 105
{168, 6, 424, 427, 340}, // idx == 106
{172, 6, 428, 431, 347}, // idx == 107
{176, 6, 432, 435, 356}, // idx == 108
{180, 6, 436, 439, 363}, // idx == 109
{184, 6, 440, 443, 371}, // idx == 110
{188, 6, 444, 447, 378}, // idx == 111
{192, 6, 448, 451, 389}, // idx == 112
{196, 6, 452, 455, 396}, // idx == 113
{200, 6, 456, 459, 404}, // idx == 114
{204, 6, 460, 463, 411}, // idx == 115
{208, 6, 464, 467, 420}, // idx == 116
{212, 6, 468, 471, 427}, // idx == 117
{216, 6, 472, 475, 435}, // idx == 118
{220, 6, 476, 479, 442}, // idx == 119
{224, 6, 480, 483, 452}, // idx == 120
{228, 6, 484, 487, 459}, // idx == 121
{232, 6, 488, 491, 467}, // idx == 122
{236, 6, 492, 495, 474}, // idx == 123
{240, 6, 496, 499, 483}, // idx == 124
{244, 6, 500, 503, 490}, // idx == 125
{248, 6, 504, 507, 498}, // idx == 126
{252, 6, 508, 511, 505}, // idx == 127
{0, 7, 256, 257, 8}, // idx == 128
{2, 7, 258, 259, 11}, // idx == 129
{4, 7, 260, 261, 15}, // idx == 130
{6, 7, 262, 263, 18}, // idx == 131
{8, 7, 264, 265, 23}, // idx == 132
{10, 7, 266, 267, 26}, // idx == 133
{12, 7, 268, 269, 30}, // idx == 134
{14, 7, 270, 271, 33}, // idx == 135
{16, 7, 272, 273, 39}, // idx == 136
{18, 7, 274, 275, 42}, // idx == 137
{20, 7, 276, 277, 46}, // idx == 138
{22, 7, 278, 279, 49}, // idx == 139
{24, 7, 280, 281, 54}, // idx == 140
{26, 7, 282, 283, 57}, // idx == 141
{28, 7, 284, 285, 61}, // idx == 142
{30, 7, 286, 287, 64}, // idx == 143
{32, 7, 288, 289, 71}, // idx == 144
{34, 7, 290, 291, 74}, // idx == 145
{36, 7, 292, 293, 78}, // idx == 146
{38, 7, 294, 295, 81}, // idx == 147
{40, 7, 296, 297, 86}, // idx == 148
{42, 7, 298, 299, 89}, // idx == 149
{44, 7, 300, 301, 93}, // idx == 150
{46, 7, 302, 303, 96}, // idx == 151
{48, 7, 304, 305, 102}, // idx == 152
{50, 7, 306, 307, 105}, // idx == 153
{52, 7, 308, 309, 109}, // idx == 154
{54, 7, 310, 311, 112}, // idx == 155
{56, 7, 312, 313, 117}, // idx == 156
{58, 7, 314, 315, 120}, // idx == 157
{60, 7, 316, 317, 124}, // idx == 158
{62, 7, 318, 319, 127}, // idx == 159
{64, 7, 320, 321, 135}, // idx == 160
{66, 7, 322, 323, 138}, // idx == 161
{68, 7, 324, 325, 142}, // idx == 162
{70, 7, 326, 327, 145}, // idx == 163
{72, 7, 328, 329, 150}, // idx == 164
{74, 7, 330, 331, 153}, // idx == 165
{76, 7, 332, 333, 157}, // idx == 166
{78, 7, 334, 335, 160}, // idx == 167
{80, 7, 336, 337, 166}, // idx == 168
{82, 7, 338, 339, 169}, // idx == 169
{84, 7, 340, 341, 173}, // idx == 170
{86, 7, 342, 343, 176}, // idx == 171
{88, 7, 344, 345, 181}, // idx == 172
{90, 7, 346, 347, 184}, // idx == 173
{92, 7, 348, 349, 188}, // idx == 174
{94, 7, 350, 351, 191}, // idx == 175
{96, 7, 352, 353, 198}, // idx == 176
{98, 7, 354, 355, 201}, // idx == 177
{100, 7, 356, 357, 205}, // idx == 178
{102, 7, 358, 359, 208}, // idx == 179
{104, 7, 360, 361, 213}, // idx == 180
{106, 7, 362, 363, 216}, // idx == 181
{108, 7, 364, 365, 220}, // idx == 182
{110, 7, 366, 367, 223}, // idx == 183
{112, 7, 368, 369, 229}, // idx == 184
{114, 7, 370, 371, 232}, // idx == 185
{116, 7, 372, 373, 236}, // idx == 186
{118, 7, 374, 375, 239}, // idx == 187
{120, 7, 376, 377, 244}, // idx == 188
{122, 7, 378, 379, 247}, // idx == 189
{124, 7, 380, 381, 251}, // idx == 190
{126, 7, 382, 383, 254}, // idx == 191
{128, 7, 384, 385, 263}, // idx == 192
{130, 7, 386, 387, 266}, // idx == 193
{132, 7, 388, 389, 270}, // idx == 194
{134, 7, 390, 391, 273}, // idx == 195
{136, 7, 392, 393, 278}, // idx == 196
{138, 7, 394, 395, 281}, // idx == 197
{140, 7, 396, 397, 285}, // idx == 198
{142, 7, 398, 399, 288}, // idx == 199
{144, 7, 400, 401, 294}, // idx == 200
{146, 7, 402, 403, 297}, // idx == 201
{148, 7, 404, 405, 301}, // idx == 202
{150, 7, 406, 407, 304}, // idx == 203
{152, 7, 408, 409, 309}, // idx == 204
{154, 7, 410, 411, 312}, // idx == 205
{156, 7, 412, 413, 316}, // idx == 206
{158, 7, 414, 415, 319}, // idx == 207
{160, 7, 416, 417, 326}, // idx == 208
{162, 7, 418, 419, 329}, // idx == 209
{164, 7, 420, 421, 333}, // idx == 210
{166, 7, 422, 423, 336}, // idx == 211
{168, 7, 424, 425, 341}, // idx == 212
{170, 7, 426, 427, 344}, // idx == 213
{172, 7, 428, 429, 348}, // idx == 214
{174, 7, 430, 431, 351}, // idx == 215
{176, 7, 432, 433, 357}, // idx == 216
{178, 7, 434, 435, 360}, // idx == 217
{180, 7, 436, 437, 364}, // idx == 218
{182, 7, 438, 439, 367}, // idx == 219
{184, 7, 440, 441, 372}, // idx == 220
{186, 7, 442, 443, 375}, // idx == 221
{188, 7, 444, 445, 379}, // idx == 222
{190, 7, 446, 447, 382}, // idx == 223
{192, 7, 448, 449, 390}, // idx == 224
{194, 7, 450, 451, 393}, // idx == 225
{196, 7, 452, 453, 397}, // idx == 226
{198, 7, 454, 455, 400}, // idx == 227
{200, 7, 456, 457, 405}, // idx == 228
{202, 7, 458, 459, 408}, // idx == 229
{204, 7, 460, 461, 412}, // idx == 230
{206, 7, 462, 463, 415}, // idx == 231
{208, 7, 464, 465, 421}, // idx == 232
{210, 7, 466, 467, 424}, // idx == 233
{212, 7, 468, 469, 428}, // idx == 234
{214, 7, 470, 471, 431}, // idx == 235
{216, 7, 472, 473, 436}, // idx == 236
{218, 7, 474, 475, 439}, // idx == 237
{220, 7, 476, 477, 443}, // idx == 238
{222, 7, 478, 479, 446}, // idx == 239
{224, 7, 480, 481, 453}, // idx == 240
{226, 7, 482, 483, 456}, // idx == 241
{228, 7, 484, 485, 460}, // idx == 242
{230, 7, 486, 487, 463}, // idx == 243
{232, 7, 488, 489, 468}, // idx == 244
{234, 7, 490, 491, 471}, // idx == 245
{236, 7, 492, 493, 475}, // idx == 246
{238, 7, 494, 495, 478}, // idx == 247
{240, 7, 496, 497, 484}, // idx == 248
{242, 7, 498, 499, 487}, // idx == 249
{244, 7, 500, 501, 491}, // idx == 250
{246, 7, 502, 503, 494}, // idx == 251
{248, 7, 504, 505, 499}, // idx == 252
{250, 7, 506, 507, 502}, // idx == 253
{252, 7, 508, 509, 506}, // idx == 254
{254, 7, 510, 511, 509}, // idx == 255
{0, 8, 256, 256, 9}, // idx == 256 -- first host route
{1, 8, 257, 257, 10}, // idx == 257
{2, 8, 258, 258, 12}, // idx == 258
{3, 8, 259, 259, 13}, // idx == 259
{4, 8, 260, 260, 16}, // idx == 260
{5, 8, 261, 261, 17}, // idx == 261
{6, 8, 262, 262, 19}, // idx == 262
{7, 8, 263, 263, 20}, // idx == 263
{8, 8, 264, 264, 24}, // idx == 264
{9, 8, 265, 265, 25}, // idx == 265
{10, 8, 266, 266, 27}, // idx == 266
{11, 8, 267, 267, 28}, // idx == 267
{12, 8, 268, 268, 31}, // idx == 268
{13, 8, 269, 269, 32}, // idx == 269
{14, 8, 270, 270, 34}, // idx == 270
{15, 8, 271, 271, 35}, // idx == 271
{16, 8, 272, 272, 40}, // idx == 272
{17, 8, 273, 273, 41}, // idx == 273
{18, 8, 274, 274, 43}, // idx == 274
{19, 8, 275, 275, 44}, // idx == 275
{20, 8, 276, 276, 47}, // idx == 276
{21, 8, 277, 277, 48}, // idx == 277
{22, 8, 278, 278, 50}, // idx == 278
{23, 8, 279, 279, 51}, // idx == 279
{24, 8, 280, 280, 55}, // idx == 280
{25, 8, 281, 281, 56}, // idx == 281
{26, 8, 282, 282, 58}, // idx == 282
{27, 8, 283, 283, 59}, // idx == 283
{28, 8, 284, 284, 62}, // idx == 284
{29, 8, 285, 285, 63}, // idx == 285
{30, 8, 286, 286, 65}, // idx == 286
{31, 8, 287, 287, 66}, // idx == 287
{32, 8, 288, 288, 72}, // idx == 288
{33, 8, 289, 289, 73}, // idx == 289
{34, 8, 290, 290, 75}, // idx == 290
{35, 8, 291, 291, 76}, // idx == 291
{36, 8, 292, 292, 79}, // idx == 292
{37, 8, 293, 293, 80}, // idx == 293
{38, 8, 294, 294, 82}, // idx == 294
{39, 8, 295, 295, 83}, // idx == 295
{40, 8, 296, 296, 87}, // idx == 296
{41, 8, 297, 297, 88}, // idx == 297
{42, 8, 298, 298, 90}, // idx == 298
{43, 8, 299, 299, 91}, // idx == 299
{44, 8, 300, 300, 94}, // idx == 300
{45, 8, 301, 301, 95}, // idx == 301
{46, 8, 302, 302, 97}, // idx == 302
{47, 8, 303, 303, 98}, // idx == 303
{48, 8, 304, 304, 103}, // idx == 304
{49, 8, 305, 305, 104}, // idx == 305
{50, 8, 306, 306, 106}, // idx == 306
{51, 8, 307, 307, 107}, // idx == 307
{52, 8, 308, 308, 110}, // idx == 308
{53, 8, 309, 309, 111}, // idx == 309
{54, 8, 310, 310, 113}, // idx == 310
{55, 8, 311, 311, 114}, // idx == 311
{56, 8, 312, 312, 118}, // idx == 312
{57, 8, 313, 313, 119}, // idx == 313
{58, 8, 314, 314, 121}, // idx == 314
{59, 8, 315, 315, 122}, // idx == 315
{60, 8, 316, 316, 125}, // idx == 316
{61, 8, 317, 317, 126}, // idx == 317
{62, 8, 318, 318, 128}, // idx == 318
{63, 8, 319, 319, 129}, // idx == 319
{64, 8, 320, 320, 136}, // idx == 320
{65, 8, 321, 321, 137}, // idx == 321
{66, 8, 322, 322, 139}, // idx == 322
{67, 8, 323, 323, 140}, // idx == 323
{68, 8, 324, 324, 143}, // idx == 324
{69, 8, 325, 325, 144}, // idx == 325
{70, 8, 326, 326, 146}, // idx == 326
{71, 8, 327, 327, 147}, // idx == 327
{72, 8, 328, 328, 151}, // idx == 328
{73, 8, 329, 329, 152}, // idx == 329
{74, 8, 330, 330, 154}, // idx == 330
{75, 8, 331, 331, 155}, // idx == 331
{76, 8, 332, 332, 158}, // idx == 332
{77, 8, 333, 333, 159}, // idx == 333
{78, 8, 334, 334, 161}, // idx == 334
{79, 8, 335, 335, 162}, // idx == 335
{80, 8, 336, 336, 167}, // idx == 336
{81, 8, 337, 337, 168}, // idx == 337
{82, 8, 338, 338, 170}, // idx == 338
{83, 8, 339, 339, 171}, // idx == 339
{84, 8, 340, 340, 174}, // idx == 340
{85, 8, 341, 341, 175}, // idx == 341
{86, 8, 342, 342, 177}, // idx == 342
{87, 8, 343, 343, 178}, // idx == 343
{88, 8, 344, 344, 182}, // idx == 344
{89, 8, 345, 345, 183}, // idx == 345
{90, 8, 346, 346, 185}, // idx == 346
{91, 8, 347, 347, 186}, // idx == 347
{92, 8, 348, 348, 189}, // idx == 348
{93, 8, 349, 349, 190}, // idx == 349
{94, 8, 350, 350, 192}, // idx == 350
{95, 8, 351, 351, 193}, // idx == 351
{96, 8, 352, 352, 199}, // idx == 352
{97, 8, 353, 353, 200}, // idx == 353
{98, 8, 354, 354, 202}, // idx == 354
{99, 8, 355, 355, 203}, // idx == 355
{100, 8, 356, 356, 206}, // idx == 356
{101, 8, 357, 357, 207}, // idx == 357
{102, 8, 358, 358, 209}, // idx == 358
{103, 8, 359, 359, 210}, // idx == 359
{104, 8, 360, 360, 214}, // idx == 360
{105, 8, 361, 361, 215}, // idx == 361
{106, 8, 362, 362, 217}, // idx == 362
{107, 8, 363, 363, 218}, // idx == 363
{108, 8, 364, 364, 221}, // idx == 364
{109, 8, 365, 365, 222}, // idx == 365
{110, 8, 366, 366, 224}, // idx == 366
{111, 8, 367, 367, 225}, // idx == 367
{112, 8, 368, 368, 230}, // idx == 368
{113, 8, 369, 369, 231}, // idx == 369
{114, 8, 370, 370, 233}, // idx == 370
{115, 8, 371, 371, 234}, // idx == 371
{116, 8, 372, 372, 237}, // idx == 372
{117, 8, 373, 373, 238}, // idx == 373
{118, 8, 374, 374, 240}, // idx == 374
{119, 8, 375, 375, 241}, // idx == 375
{120, 8, 376, 376, 245}, // idx == 376
{121, 8, 377, 377, 246}, // idx == 377
{122, 8, 378, 378, 248}, // idx == 378
{123, 8, 379, 379, 249}, // idx == 379
{124, 8, 380, 380, 252}, // idx == 380
{125, 8, 381, 381, 253}, // idx == 381
{126, 8, 382, 382, 255}, // idx == 382
{127, 8, 383, 383, 256}, // idx == 383
{128, 8, 384, 384, 264}, // idx == 384
{129, 8, 385, 385, 265}, // idx == 385
{130, 8, 386, 386, 267}, // idx == 386
{131, 8, 387, 387, 268}, // idx == 387
{132, 8, 388, 388, 271}, // idx == 388
{133, 8, 389, 389, 272}, // idx == 389
{134, 8, 390, 390, 274}, // idx == 390
{135, 8, 391, 391, 275}, // idx == 391
{136, 8, 392, 392, 279}, // idx == 392
{137, 8, 393, 393, 280}, // idx == 393
{138, 8, 394, 394, 282}, // idx == 394
{139, 8, 395, 395, 283}, // idx == 395
{140, 8, 396, 396, 286}, // idx == 396
{141, 8, 397, 397, 287}, // idx == 397
{142, 8, 398, 398, 289}, // idx == 398
{143, 8, 399, 399, 290}, // idx == 399
{144, 8, 400, 400, 295}, // idx == 400
{145, 8, 401, 401, 296}, // idx == 401
{146, 8, 402, 402, 298}, // idx == 402
{147, 8, 403, 403, 299}, // idx == 403
{148, 8, 404, 404, 302}, // idx == 404
{149, 8, 405, 405, 303}, // idx == 405
{150, 8, 406, 406, 305}, // idx == 406
{151, 8, 407, 407, 306}, // idx == 407
{152, 8, 408, 408, 310}, // idx == 408
{153, 8, 409, 409, 311}, // idx == 409
{154, 8, 410, 410, 313}, // idx == 410
{155, 8, 411, 411, 314}, // idx == 411
{156, 8, 412, 412, 317}, // idx == 412
{157, 8, 413, 413, 318}, // idx == 413
{158, 8, 414, 414, 320}, // idx == 414
{159, 8, 415, 415, 321}, // idx == 415
{160, 8, 416, 416, 327}, // idx == 416
{161, 8, 417, 417, 328}, // idx == 417
{162, 8, 418, 418, 330}, // idx == 418
{163, 8, 419, 419, 331}, // idx == 419
{164, 8, 420, 420, 334}, // idx == 420
{165, 8, 421, 421, 335}, // idx == 421
{166, 8, 422, 422, 337}, // idx == 422
{167, 8, 423, 423, 338}, // idx == 423
{168, 8, 424, 424, 342}, // idx == 424
{169, 8, 425, 425, 343}, // idx == 425
{170, 8, 426, 426, 345}, // idx == 426
{171, 8, 427, 427, 346}, // idx == 427
{172, 8, 428, 428, 349}, // idx == 428
{173, 8, 429, 429, 350}, // idx == 429
{174, 8, 430, 430, 352}, // idx == 430
{175, 8, 431, 431, 353}, // idx == 431
{176, 8, 432, 432, 358}, // idx == 432
{177, 8, 433, 433, 359}, // idx == 433
{178, 8, 434, 434, 361}, // idx == 434
{179, 8, 435, 435, 362}, // idx == 435
{180, 8, 436, 436, 365}, // idx == 436
{181, 8, 437, 437, 366}, // idx == 437
{182, 8, 438, 438, 368}, // idx == 438
{183, 8, 439, 439, 369}, // idx == 439
{184, 8, 440, 440, 373}, // idx == 440
{185, 8, 441, 441, 374}, // idx == 441
{186, 8, 442, 442, 376}, // idx == 442
{187, 8, 443, 443, 377}, // idx == 443
{188, 8, 444, 444, 380}, // idx == 444
{189, 8, 445, 445, 381}, // idx == 445
{190, 8, 446, 446, 383}, // idx == 446
{191, 8, 447, 447, 384}, // idx == 447
{192, 8, 448, 448, 391}, // idx == 448
{193, 8, 449, 449, 392}, // idx == 449
{194, 8, 450, 450, 394}, // idx == 450
{195, 8, 451, 451, 395}, // idx == 451
{196, 8, 452, 452, 398}, // idx == 452
{197, 8, 453, 453, 399}, // idx == 453
{198, 8, 454, 454, 401}, // idx == 454
{199, 8, 455, 455, 402}, // idx == 455
{200, 8, 456, 456, 406}, // idx == 456
{201, 8, 457, 457, 407}, // idx == 457
{202, 8, 458, 458, 409}, // idx == 458
{203, 8, 459, 459, 410}, // idx == 459
{204, 8, 460, 460, 413}, // idx == 460
{205, 8, 461, 461, 414}, // idx == 461
{206, 8, 462, 462, 416}, // idx == 462
{207, 8, 463, 463, 417}, // idx == 463
{208, 8, 464, 464, 422}, // idx == 464
{209, 8, 465, 465, 423}, // idx == 465
{210, 8, 466, 466, 425}, // idx == 466
{211, 8, 467, 467, 426}, // idx == 467
{212, 8, 468, 468, 429}, // idx == 468
{213, 8, 469, 469, 430}, // idx == 469
{214, 8, 470, 470, 432}, // idx == 470
{215, 8, 471, 471, 433}, // idx == 471
{216, 8, 472, 472, 437}, // idx == 472
{217, 8, 473, 473, 438}, // idx == 473
{218, 8, 474, 474, 440}, // idx == 474
{219, 8, 475, 475, 441}, // idx == 475
{220, 8, 476, 476, 444}, // idx == 476
{221, 8, 477, 477, 445}, // idx == 477
{222, 8, 478, 478, 447}, // idx == 478
{223, 8, 479, 479, 448}, // idx == 479
{224, 8, 480, 480, 454}, // idx == 480
{225, 8, 481, 481, 455}, // idx == 481
{226, 8, 482, 482, 457}, // idx == 482
{227, 8, 483, 483, 458}, // idx == 483
{228, 8, 484, 484, 461}, // idx == 484
{229, 8, 485, 485, 462}, // idx == 485
{230, 8, 486, 486, 464}, // idx == 486
{231, 8, 487, 487, 465}, // idx == 487
{232, 8, 488, 488, 469}, // idx == 488
{233, 8, 489, 489, 470}, // idx == 489
{234, 8, 490, 490, 472}, // idx == 490
{235, 8, 491, 491, 473}, // idx == 491
{236, 8, 492, 492, 476}, // idx == 492
{237, 8, 493, 493, 477}, // idx == 493
{238, 8, 494, 494, 479}, // idx == 494
{239, 8, 495, 495, 480}, // idx == 495
{240, 8, 496, 496, 485}, // idx == 496
{241, 8, 497, 497, 486}, // idx == 497
{242, 8, 498, 498, 488}, // idx == 498
{243, 8, 499, 499, 489}, // idx == 499
{244, 8, 500, 500, 492}, // idx == 500
{245, 8, 501, 501, 493}, // idx == 501
{246, 8, 502, 502, 495}, // idx == 502
{247, 8, 503, 503, 496}, // idx == 503
{248, 8, 504, 504, 500}, // idx == 504
{249, 8, 505, 505, 501}, // idx == 505
{250, 8, 506, 506, 503}, // idx == 506
{251, 8, 507, 507, 504}, // idx == 507
{252, 8, 508, 508, 507}, // idx == 508
{253, 8, 509, 509, 508}, // idx == 509
{254, 8, 510, 510, 510}, // idx == 510
{255, 8, 511, 511, 511}, // idx == 511
}