github.com/SmartMeshFoundation/Spectrum@v0.0.0-20220621030607-452a266fee1e/consensus/ethash/algorithm.go (about) 1 // Copyright 2017 The Spectrum Authors 2 // This file is part of the Spectrum library. 3 // 4 // The Spectrum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The Spectrum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the Spectrum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package ethash 18 19 import ( 20 "encoding/binary" 21 "hash" 22 "reflect" 23 "runtime" 24 "sync" 25 "sync/atomic" 26 "time" 27 "unsafe" 28 29 "github.com/SmartMeshFoundation/Spectrum/common" 30 "github.com/SmartMeshFoundation/Spectrum/common/bitutil" 31 "github.com/SmartMeshFoundation/Spectrum/crypto" 32 "github.com/SmartMeshFoundation/Spectrum/crypto/sha3" 33 "github.com/SmartMeshFoundation/Spectrum/log" 34 ) 35 36 const ( 37 datasetInitBytes = 1 << 30 // Bytes in dataset at genesis 38 datasetGrowthBytes = 1 << 23 // Dataset growth per epoch 39 cacheInitBytes = 1 << 24 // Bytes in cache at genesis 40 cacheGrowthBytes = 1 << 17 // Cache growth per epoch 41 epochLength = 30000 // Blocks per epoch 42 mixBytes = 128 // Width of mix 43 hashBytes = 64 // Hash length in bytes 44 hashWords = 16 // Number of 32 bit ints in a hash 45 datasetParents = 256 // Number of parents of each dataset element 46 cacheRounds = 3 // Number of rounds in cache production 47 loopAccesses = 64 // Number of accesses in hashimoto loop 48 ) 49 50 // hasher is a repetitive hasher allowing the same hash data structures to be 51 // reused between hash runs instead of requiring new ones to be created. 52 type hasher func(dest []byte, data []byte) 53 54 // makeHasher creates a repetitive hasher, allowing the same hash data structures 55 // to be reused between hash runs instead of requiring new ones to be created. 56 // The returned function is not thread safe! 57 func makeHasher(h hash.Hash) hasher { 58 return func(dest []byte, data []byte) { 59 h.Write(data) 60 h.Sum(dest[:0]) 61 h.Reset() 62 } 63 } 64 65 // seedHash is the seed to use for generating a verification cache and the mining 66 // dataset. 67 func seedHash(block uint64) []byte { 68 seed := make([]byte, 32) 69 if block < epochLength { 70 return seed 71 } 72 keccak256 := makeHasher(sha3.NewKeccak256()) 73 for i := 0; i < int(block/epochLength); i++ { 74 keccak256(seed, seed) 75 } 76 return seed 77 } 78 79 // generateCache creates a verification cache of a given size for an input seed. 80 // The cache production process involves first sequentially filling up 32 MB of 81 // memory, then performing two passes of Sergio Demian Lerner's RandMemoHash 82 // algorithm from Strict Memory Hard Hashing Functions (2014). The output is a 83 // set of 524288 64-byte values. 84 // This method places the result into dest in machine byte order. 85 func generateCache(dest []uint32, epoch uint64, seed []byte) { 86 // Print some debug logs to allow analysis on low end devices 87 logger := log.New("epoch", epoch) 88 89 start := time.Now() 90 defer func() { 91 elapsed := time.Since(start) 92 93 logFn := logger.Debug 94 if elapsed > 3*time.Second { 95 logFn = logger.Info 96 } 97 logFn("Generated ethash verification cache", "elapsed", common.PrettyDuration(elapsed)) 98 }() 99 // Convert our destination slice to a byte buffer 100 header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) 101 header.Len *= 4 102 header.Cap *= 4 103 cache := *(*[]byte)(unsafe.Pointer(&header)) 104 105 // Calculate the number of theoretical rows (we'll store in one buffer nonetheless) 106 size := uint64(len(cache)) 107 rows := int(size) / hashBytes 108 109 // Start a monitoring goroutine to report progress on low end devices 110 var progress uint32 111 112 done := make(chan struct{}) 113 defer close(done) 114 115 go func() { 116 for { 117 select { 118 case <-done: 119 return 120 case <-time.After(3 * time.Second): 121 logger.Info("Generating ethash verification cache", "percentage", atomic.LoadUint32(&progress)*100/uint32(rows)/4, "elapsed", common.PrettyDuration(time.Since(start))) 122 } 123 } 124 }() 125 // Create a hasher to reuse between invocations 126 keccak512 := makeHasher(sha3.NewKeccak512()) 127 128 // Sequentially produce the initial dataset 129 keccak512(cache, seed) 130 for offset := uint64(hashBytes); offset < size; offset += hashBytes { 131 keccak512(cache[offset:], cache[offset-hashBytes:offset]) 132 atomic.AddUint32(&progress, 1) 133 } 134 // Use a low-round version of randmemohash 135 temp := make([]byte, hashBytes) 136 137 for i := 0; i < cacheRounds; i++ { 138 for j := 0; j < rows; j++ { 139 var ( 140 srcOff = ((j - 1 + rows) % rows) * hashBytes 141 dstOff = j * hashBytes 142 xorOff = (binary.LittleEndian.Uint32(cache[dstOff:]) % uint32(rows)) * hashBytes 143 ) 144 bitutil.XORBytes(temp, cache[srcOff:srcOff+hashBytes], cache[xorOff:xorOff+hashBytes]) 145 keccak512(cache[dstOff:], temp) 146 147 atomic.AddUint32(&progress, 1) 148 } 149 } 150 // Swap the byte order on big endian systems and return 151 if !isLittleEndian() { 152 swap(cache) 153 } 154 } 155 156 // swap changes the byte order of the buffer assuming a uint32 representation. 157 func swap(buffer []byte) { 158 for i := 0; i < len(buffer); i += 4 { 159 binary.BigEndian.PutUint32(buffer[i:], binary.LittleEndian.Uint32(buffer[i:])) 160 } 161 } 162 163 // prepare converts an ethash cache or dataset from a byte stream into the internal 164 // int representation. All ethash methods work with ints to avoid constant byte to 165 // int conversions as well as to handle both little and big endian systems. 166 func prepare(dest []uint32, src []byte) { 167 for i := 0; i < len(dest); i++ { 168 dest[i] = binary.LittleEndian.Uint32(src[i*4:]) 169 } 170 } 171 172 // fnv is an algorithm inspired by the FNV hash, which in some cases is used as 173 // a non-associative substitute for XOR. Note that we multiply the prime with 174 // the full 32-bit input, in contrast with the FNV-1 spec which multiplies the 175 // prime with one byte (octet) in turn. 176 func fnv(a, b uint32) uint32 { 177 return a*0x01000193 ^ b 178 } 179 180 // fnvHash mixes in data into mix using the ethash fnv method. 181 func fnvHash(mix []uint32, data []uint32) { 182 for i := 0; i < len(mix); i++ { 183 mix[i] = mix[i]*0x01000193 ^ data[i] 184 } 185 } 186 187 // generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, 188 // and hashes that to compute a single dataset node. 189 func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte { 190 // Calculate the number of theoretical rows (we use one buffer nonetheless) 191 rows := uint32(len(cache) / hashWords) 192 193 // Initialize the mix 194 mix := make([]byte, hashBytes) 195 196 binary.LittleEndian.PutUint32(mix, cache[(index%rows)*hashWords]^index) 197 for i := 1; i < hashWords; i++ { 198 binary.LittleEndian.PutUint32(mix[i*4:], cache[(index%rows)*hashWords+uint32(i)]) 199 } 200 keccak512(mix, mix) 201 202 // Convert the mix to uint32s to avoid constant bit shifting 203 intMix := make([]uint32, hashWords) 204 for i := 0; i < len(intMix); i++ { 205 intMix[i] = binary.LittleEndian.Uint32(mix[i*4:]) 206 } 207 // fnv it with a lot of random cache nodes based on index 208 for i := uint32(0); i < datasetParents; i++ { 209 parent := fnv(index^i, intMix[i%16]) % rows 210 fnvHash(intMix, cache[parent*hashWords:]) 211 } 212 // Flatten the uint32 mix into a binary one and return 213 for i, val := range intMix { 214 binary.LittleEndian.PutUint32(mix[i*4:], val) 215 } 216 keccak512(mix, mix) 217 return mix 218 } 219 220 // generateDataset generates the entire ethash dataset for mining. 221 // This method places the result into dest in machine byte order. 222 func generateDataset(dest []uint32, epoch uint64, cache []uint32) { 223 // Print some debug logs to allow analysis on low end devices 224 logger := log.New("epoch", epoch) 225 226 start := time.Now() 227 defer func() { 228 elapsed := time.Since(start) 229 230 logFn := logger.Debug 231 if elapsed > 3*time.Second { 232 logFn = logger.Info 233 } 234 logFn("Generated ethash verification cache", "elapsed", common.PrettyDuration(elapsed)) 235 }() 236 237 // Figure out whether the bytes need to be swapped for the machine 238 swapped := !isLittleEndian() 239 240 // Convert our destination slice to a byte buffer 241 header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) 242 header.Len *= 4 243 header.Cap *= 4 244 dataset := *(*[]byte)(unsafe.Pointer(&header)) 245 246 // Generate the dataset on many goroutines since it takes a while 247 threads := runtime.NumCPU() 248 size := uint64(len(dataset)) 249 250 var pend sync.WaitGroup 251 pend.Add(threads) 252 253 var progress uint32 254 for i := 0; i < threads; i++ { 255 go func(id int) { 256 defer pend.Done() 257 258 // Create a hasher to reuse between invocations 259 keccak512 := makeHasher(sha3.NewKeccak512()) 260 261 // Calculate the data segment this thread should generate 262 batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) 263 first := uint32(id) * batch 264 limit := first + batch 265 if limit > uint32(size/hashBytes) { 266 limit = uint32(size / hashBytes) 267 } 268 // Calculate the dataset segment 269 percent := uint32(size / hashBytes / 100) 270 for index := first; index < limit; index++ { 271 item := generateDatasetItem(cache, index, keccak512) 272 if swapped { 273 swap(item) 274 } 275 copy(dataset[index*hashBytes:], item) 276 277 if status := atomic.AddUint32(&progress, 1); status%percent == 0 { 278 logger.Info("Generating DAG in progress", "percentage", uint64(status*100)/(size/hashBytes), "elapsed", common.PrettyDuration(time.Since(start))) 279 } 280 } 281 }(i) 282 } 283 // Wait for all the generators to finish and return 284 pend.Wait() 285 } 286 287 // hashimoto aggregates data from the full dataset in order to produce our final 288 // value for a particular header hash and nonce. 289 func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte) { 290 // Calculate the number of theoretical rows (we use one buffer nonetheless) 291 rows := uint32(size / mixBytes) 292 293 // Combine header+nonce into a 64 byte seed 294 seed := make([]byte, 40) 295 copy(seed, hash) 296 binary.LittleEndian.PutUint64(seed[32:], nonce) 297 298 seed = crypto.Keccak512(seed) 299 seedHead := binary.LittleEndian.Uint32(seed) 300 301 // Start the mix with replicated seed 302 mix := make([]uint32, mixBytes/4) 303 for i := 0; i < len(mix); i++ { 304 mix[i] = binary.LittleEndian.Uint32(seed[i%16*4:]) 305 } 306 // Mix in random dataset nodes 307 temp := make([]uint32, len(mix)) 308 309 for i := 0; i < loopAccesses; i++ { 310 parent := fnv(uint32(i)^seedHead, mix[i%len(mix)]) % rows 311 for j := uint32(0); j < mixBytes/hashBytes; j++ { 312 copy(temp[j*hashWords:], lookup(2*parent+j)) 313 } 314 fnvHash(mix, temp) 315 } 316 // Compress mix 317 for i := 0; i < len(mix); i += 4 { 318 mix[i/4] = fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3]) 319 } 320 mix = mix[:len(mix)/4] 321 322 digest := make([]byte, common.HashLength) 323 for i, val := range mix { 324 binary.LittleEndian.PutUint32(digest[i*4:], val) 325 } 326 return digest, crypto.Keccak256(append(seed, digest...)) 327 } 328 329 // hashimotoLight aggregates data from the full dataset (using only a small 330 // in-memory cache) in order to produce our final value for a particular header 331 // hash and nonce. 332 func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte) { 333 keccak512 := makeHasher(sha3.NewKeccak512()) 334 335 lookup := func(index uint32) []uint32 { 336 rawData := generateDatasetItem(cache, index, keccak512) 337 338 data := make([]uint32, len(rawData)/4) 339 for i := 0; i < len(data); i++ { 340 data[i] = binary.LittleEndian.Uint32(rawData[i*4:]) 341 } 342 return data 343 } 344 return hashimoto(hash, nonce, size, lookup) 345 } 346 347 // hashimotoFull aggregates data from the full dataset (using the full in-memory 348 // dataset) in order to produce our final value for a particular header hash and 349 // nonce. 350 func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte) { 351 lookup := func(index uint32) []uint32 { 352 offset := index * hashWords 353 return dataset[offset : offset+hashWords] 354 } 355 return hashimoto(hash, nonce, uint64(len(dataset))*4, lookup) 356 } 357 358 // datasetSizes is a lookup table for the ethash dataset size for the first 2048 359 // epochs (i.e. 61440000 blocks). 360 var datasetSizes = []uint64{ 361 1073739904, 1082130304, 1090514816, 1098906752, 1107293056, 362 1115684224, 1124070016, 1132461952, 1140849536, 1149232768, 363 1157627776, 1166013824, 1174404736, 1182786944, 1191180416, 364 1199568512, 1207958912, 1216345216, 1224732032, 1233124736, 365 1241513344, 1249902464, 1258290304, 1266673792, 1275067264, 366 1283453312, 1291844992, 1300234112, 1308619904, 1317010048, 367 1325397376, 1333787776, 1342176128, 1350561664, 1358954368, 368 1367339392, 1375731584, 1384118144, 1392507008, 1400897408, 369 1409284736, 1417673344, 1426062464, 1434451072, 1442839168, 370 1451229056, 1459615616, 1468006016, 1476394112, 1484782976, 371 1493171584, 1501559168, 1509948032, 1518337664, 1526726528, 372 1535114624, 1543503488, 1551892096, 1560278656, 1568669056, 373 1577056384, 1585446272, 1593831296, 1602219392, 1610610304, 374 1619000192, 1627386752, 1635773824, 1644164224, 1652555648, 375 1660943488, 1669332608, 1677721216, 1686109312, 1694497664, 376 1702886272, 1711274624, 1719661184, 1728047744, 1736434816, 377 1744829056, 1753218944, 1761606272, 1769995904, 1778382464, 378 1786772864, 1795157888, 1803550592, 1811937664, 1820327552, 379 1828711552, 1837102976, 1845488768, 1853879936, 1862269312, 380 1870656896, 1879048064, 1887431552, 1895825024, 1904212096, 381 1912601216, 1920988544, 1929379456, 1937765504, 1946156672, 382 1954543232, 1962932096, 1971321728, 1979707264, 1988093056, 383 1996487552, 2004874624, 2013262208, 2021653888, 2030039936, 384 2038430848, 2046819968, 2055208576, 2063596672, 2071981952, 385 2080373632, 2088762752, 2097149056, 2105539712, 2113928576, 386 2122315136, 2130700672, 2139092608, 2147483264, 2155872128, 387 2164257664, 2172642176, 2181035392, 2189426048, 2197814912, 388 2206203008, 2214587264, 2222979712, 2231367808, 2239758208, 389 2248145024, 2256527744, 2264922752, 2273312128, 2281701248, 390 2290086272, 2298476672, 2306867072, 2315251072, 2323639168, 391 2332032128, 2340420224, 2348808064, 2357196416, 2365580416, 392 2373966976, 2382363008, 2390748544, 2399139968, 2407530368, 393 2415918976, 2424307328, 2432695424, 2441084288, 2449472384, 394 2457861248, 2466247808, 2474637184, 2483026816, 2491414144, 395 2499803776, 2508191872, 2516582272, 2524970368, 2533359232, 396 2541743488, 2550134144, 2558525056, 2566913408, 2575301504, 397 2583686528, 2592073856, 2600467328, 2608856192, 2617240448, 398 2625631616, 2634022016, 2642407552, 2650796416, 2659188352, 399 2667574912, 2675965312, 2684352896, 2692738688, 2701130624, 400 2709518464, 2717907328, 2726293376, 2734685056, 2743073152, 401 2751462016, 2759851648, 2768232832, 2776625536, 2785017728, 402 2793401984, 2801794432, 2810182016, 2818571648, 2826959488, 403 2835349376, 2843734144, 2852121472, 2860514432, 2868900992, 404 2877286784, 2885676928, 2894069632, 2902451584, 2910843008, 405 2919234688, 2927622784, 2936011648, 2944400768, 2952789376, 406 2961177728, 2969565568, 2977951616, 2986338944, 2994731392, 407 3003120256, 3011508352, 3019895936, 3028287104, 3036675968, 408 3045063808, 3053452928, 3061837696, 3070228352, 3078615424, 409 3087003776, 3095394944, 3103782272, 3112173184, 3120562048, 410 3128944768, 3137339264, 3145725056, 3154109312, 3162505088, 411 3170893184, 3179280256, 3187669376, 3196056704, 3204445568, 412 3212836736, 3221224064, 3229612928, 3238002304, 3246391168, 413 3254778496, 3263165824, 3271556224, 3279944576, 3288332416, 414 3296719232, 3305110912, 3313500032, 3321887104, 3330273152, 415 3338658944, 3347053184, 3355440512, 3363827072, 3372220288, 416 3380608384, 3388997504, 3397384576, 3405774208, 3414163072, 417 3422551936, 3430937984, 3439328384, 3447714176, 3456104576, 418 3464493952, 3472883584, 3481268864, 3489655168, 3498048896, 419 3506434432, 3514826368, 3523213952, 3531603584, 3539987072, 420 3548380288, 3556763264, 3565157248, 3573545344, 3581934464, 421 3590324096, 3598712704, 3607098752, 3615488384, 3623877248, 422 3632265856, 3640646528, 3649043584, 3657430144, 3665821568, 423 3674207872, 3682597504, 3690984832, 3699367808, 3707764352, 424 3716152448, 3724541056, 3732925568, 3741318016, 3749706368, 425 3758091136, 3766481536, 3774872704, 3783260032, 3791650432, 426 3800036224, 3808427648, 3816815488, 3825204608, 3833592704, 427 3841981568, 3850370432, 3858755968, 3867147904, 3875536256, 428 3883920512, 3892313728, 3900702592, 3909087872, 3917478784, 429 3925868416, 3934256512, 3942645376, 3951032192, 3959422336, 430 3967809152, 3976200064, 3984588416, 3992974976, 4001363584, 431 4009751168, 4018141312, 4026530432, 4034911616, 4043308928, 432 4051695488, 4060084352, 4068472448, 4076862848, 4085249408, 433 4093640576, 4102028416, 4110413696, 4118805632, 4127194496, 434 4135583104, 4143971968, 4152360832, 4160746112, 4169135744, 435 4177525888, 4185912704, 4194303616, 4202691968, 4211076736, 436 4219463552, 4227855488, 4236246656, 4244633728, 4253022848, 437 4261412224, 4269799808, 4278184832, 4286578048, 4294962304, 438 4303349632, 4311743104, 4320130432, 4328521088, 4336909184, 439 4345295488, 4353687424, 4362073472, 4370458496, 4378852736, 440 4387238528, 4395630208, 4404019072, 4412407424, 4420790656, 441 4429182848, 4437571456, 4445962112, 4454344064, 4462738048, 442 4471119232, 4479516544, 4487904128, 4496289664, 4504682368, 443 4513068416, 4521459584, 4529846144, 4538232704, 4546619776, 444 4555010176, 4563402112, 4571790208, 4580174464, 4588567936, 445 4596957056, 4605344896, 4613734016, 4622119808, 4630511488, 446 4638898816, 4647287936, 4655675264, 4664065664, 4672451968, 447 4680842624, 4689231488, 4697620352, 4706007424, 4714397056, 448 4722786176, 4731173248, 4739562368, 4747951744, 4756340608, 449 4764727936, 4773114496, 4781504384, 4789894784, 4798283648, 450 4806667648, 4815059584, 4823449472, 4831835776, 4840226176, 451 4848612224, 4857003392, 4865391488, 4873780096, 4882169728, 452 4890557312, 4898946944, 4907333248, 4915722368, 4924110976, 453 4932499328, 4940889728, 4949276032, 4957666432, 4966054784, 454 4974438016, 4982831488, 4991221376, 4999607168, 5007998848, 455 5016386432, 5024763776, 5033164672, 5041544576, 5049941888, 456 5058329728, 5066717056, 5075107456, 5083494272, 5091883904, 457 5100273536, 5108662144, 5117048192, 5125436032, 5133827456, 458 5142215296, 5150605184, 5158993024, 5167382144, 5175769472, 459 5184157568, 5192543872, 5200936064, 5209324928, 5217711232, 460 5226102656, 5234490496, 5242877312, 5251263872, 5259654016, 461 5268040832, 5276434304, 5284819328, 5293209728, 5301598592, 462 5309986688, 5318374784, 5326764416, 5335151488, 5343542144, 463 5351929472, 5360319872, 5368706944, 5377096576, 5385484928, 464 5393871232, 5402263424, 5410650496, 5419040384, 5427426944, 465 5435816576, 5444205952, 5452594816, 5460981376, 5469367936, 466 5477760896, 5486148736, 5494536832, 5502925952, 5511315328, 467 5519703424, 5528089984, 5536481152, 5544869504, 5553256064, 468 5561645696, 5570032768, 5578423936, 5586811264, 5595193216, 469 5603585408, 5611972736, 5620366208, 5628750464, 5637143936, 470 5645528192, 5653921408, 5662310272, 5670694784, 5679082624, 471 5687474048, 5695864448, 5704251008, 5712641408, 5721030272, 472 5729416832, 5737806208, 5746194304, 5754583936, 5762969984, 473 5771358592, 5779748224, 5788137856, 5796527488, 5804911232, 474 5813300608, 5821692544, 5830082176, 5838468992, 5846855552, 475 5855247488, 5863636096, 5872024448, 5880411008, 5888799872, 476 5897186432, 5905576832, 5913966976, 5922352768, 5930744704, 477 5939132288, 5947522432, 5955911296, 5964299392, 5972688256, 478 5981074304, 5989465472, 5997851008, 6006241408, 6014627968, 479 6023015552, 6031408256, 6039796096, 6048185216, 6056574848, 480 6064963456, 6073351808, 6081736064, 6090128768, 6098517632, 481 6106906496, 6115289216, 6123680896, 6132070016, 6140459648, 482 6148849024, 6157237376, 6165624704, 6174009728, 6182403712, 483 6190792064, 6199176064, 6207569792, 6215952256, 6224345216, 484 6232732544, 6241124224, 6249510272, 6257899136, 6266287744, 485 6274676864, 6283065728, 6291454336, 6299843456, 6308232064, 486 6316620928, 6325006208, 6333395584, 6341784704, 6350174848, 487 6358562176, 6366951296, 6375337856, 6383729536, 6392119168, 488 6400504192, 6408895616, 6417283456, 6425673344, 6434059136, 489 6442444672, 6450837376, 6459223424, 6467613056, 6476004224, 490 6484393088, 6492781952, 6501170048, 6509555072, 6517947008, 491 6526336384, 6534725504, 6543112832, 6551500672, 6559888768, 492 6568278656, 6576662912, 6585055616, 6593443456, 6601834112, 493 6610219648, 6618610304, 6626999168, 6635385472, 6643777408, 494 6652164224, 6660552832, 6668941952, 6677330048, 6685719424, 495 6694107776, 6702493568, 6710882176, 6719274112, 6727662976, 496 6736052096, 6744437632, 6752825984, 6761213824, 6769604224, 497 6777993856, 6786383488, 6794770816, 6803158144, 6811549312, 498 6819937664, 6828326528, 6836706176, 6845101696, 6853491328, 499 6861880448, 6870269312, 6878655104, 6887046272, 6895433344, 500 6903822208, 6912212864, 6920596864, 6928988288, 6937377152, 501 6945764992, 6954149248, 6962544256, 6970928768, 6979317376, 502 6987709312, 6996093824, 7004487296, 7012875392, 7021258624, 503 7029652352, 7038038912, 7046427776, 7054818944, 7063207808, 504 7071595136, 7079980928, 7088372608, 7096759424, 7105149824, 505 7113536896, 7121928064, 7130315392, 7138699648, 7147092352, 506 7155479168, 7163865728, 7172249984, 7180648064, 7189036672, 507 7197424768, 7205810816, 7214196608, 7222589824, 7230975104, 508 7239367552, 7247755904, 7256145536, 7264533376, 7272921472, 509 7281308032, 7289694848, 7298088832, 7306471808, 7314864512, 510 7323253888, 7331643008, 7340029568, 7348419712, 7356808832, 511 7365196672, 7373585792, 7381973888, 7390362752, 7398750592, 512 7407138944, 7415528576, 7423915648, 7432302208, 7440690304, 513 7449080192, 7457472128, 7465860992, 7474249088, 7482635648, 514 7491023744, 7499412608, 7507803008, 7516192384, 7524579968, 515 7532967296, 7541358464, 7549745792, 7558134656, 7566524032, 516 7574912896, 7583300992, 7591690112, 7600075136, 7608466816, 517 7616854912, 7625244544, 7633629824, 7642020992, 7650410368, 518 7658794112, 7667187328, 7675574912, 7683961984, 7692349568, 519 7700739712, 7709130368, 7717519232, 7725905536, 7734295424, 520 7742683264, 7751069056, 7759457408, 7767849088, 7776238208, 521 7784626816, 7793014912, 7801405312, 7809792128, 7818179968, 522 7826571136, 7834957184, 7843347328, 7851732352, 7860124544, 523 7868512384, 7876902016, 7885287808, 7893679744, 7902067072, 524 7910455936, 7918844288, 7927230848, 7935622784, 7944009344, 525 7952400256, 7960786048, 7969176704, 7977565312, 7985953408, 526 7994339968, 8002730368, 8011119488, 8019508096, 8027896192, 527 8036285056, 8044674688, 8053062272, 8061448832, 8069838464, 528 8078227328, 8086616704, 8095006592, 8103393664, 8111783552, 529 8120171392, 8128560256, 8136949376, 8145336704, 8153726848, 530 8162114944, 8170503296, 8178891904, 8187280768, 8195669632, 531 8204058496, 8212444544, 8220834176, 8229222272, 8237612672, 532 8246000768, 8254389376, 8262775168, 8271167104, 8279553664, 533 8287944064, 8296333184, 8304715136, 8313108352, 8321497984, 534 8329885568, 8338274432, 8346663296, 8355052928, 8363441536, 535 8371828352, 8380217984, 8388606592, 8396996224, 8405384576, 536 8413772672, 8422161536, 8430549376, 8438939008, 8447326592, 537 8455715456, 8464104832, 8472492928, 8480882048, 8489270656, 538 8497659776, 8506045312, 8514434944, 8522823808, 8531208832, 539 8539602304, 8547990656, 8556378752, 8564768384, 8573154176, 540 8581542784, 8589933952, 8598322816, 8606705024, 8615099264, 541 8623487872, 8631876992, 8640264064, 8648653952, 8657040256, 542 8665430656, 8673820544, 8682209152, 8690592128, 8698977152, 543 8707374464, 8715763328, 8724151424, 8732540032, 8740928384, 544 8749315712, 8757704576, 8766089344, 8774480768, 8782871936, 545 8791260032, 8799645824, 8808034432, 8816426368, 8824812928, 546 8833199488, 8841591424, 8849976448, 8858366336, 8866757248, 547 8875147136, 8883532928, 8891923328, 8900306816, 8908700288, 548 8917088384, 8925478784, 8933867392, 8942250368, 8950644608, 549 8959032704, 8967420544, 8975809664, 8984197504, 8992584064, 550 9000976256, 9009362048, 9017752448, 9026141312, 9034530688, 551 9042917504, 9051307904, 9059694208, 9068084864, 9076471424, 552 9084861824, 9093250688, 9101638528, 9110027648, 9118416512, 553 9126803584, 9135188096, 9143581312, 9151969664, 9160356224, 554 9168747136, 9177134464, 9185525632, 9193910144, 9202302848, 555 9210690688, 9219079552, 9227465344, 9235854464, 9244244864, 556 9252633472, 9261021824, 9269411456, 9277799296, 9286188928, 557 9294574208, 9302965888, 9311351936, 9319740032, 9328131968, 558 9336516736, 9344907392, 9353296768, 9361685888, 9370074752, 559 9378463616, 9386849408, 9395239808, 9403629184, 9412016512, 560 9420405376, 9428795008, 9437181568, 9445570688, 9453960832, 561 9462346624, 9470738048, 9479121536, 9487515008, 9495903616, 562 9504289664, 9512678528, 9521067904, 9529456256, 9537843584, 563 9546233728, 9554621312, 9563011456, 9571398784, 9579788672, 564 9588178304, 9596567168, 9604954496, 9613343104, 9621732992, 565 9630121856, 9638508416, 9646898816, 9655283584, 9663675776, 566 9672061312, 9680449664, 9688840064, 9697230464, 9705617536, 567 9714003584, 9722393984, 9730772608, 9739172224, 9747561088, 568 9755945344, 9764338816, 9772726144, 9781116544, 9789503872, 569 9797892992, 9806282624, 9814670464, 9823056512, 9831439232, 570 9839833984, 9848224384, 9856613504, 9865000576, 9873391232, 571 9881772416, 9890162816, 9898556288, 9906940544, 9915333248, 572 9923721088, 9932108672, 9940496512, 9948888448, 9957276544, 573 9965666176, 9974048384, 9982441088, 9990830464, 9999219584, 574 10007602816, 10015996544, 10024385152, 10032774016, 10041163648, 575 10049548928, 10057940096, 10066329472, 10074717824, 10083105152, 576 10091495296, 10099878784, 10108272256, 10116660608, 10125049216, 577 10133437312, 10141825664, 10150213504, 10158601088, 10166991232, 578 10175378816, 10183766144, 10192157312, 10200545408, 10208935552, 579 10217322112, 10225712768, 10234099328, 10242489472, 10250876032, 580 10259264896, 10267656064, 10276042624, 10284429184, 10292820352, 581 10301209472, 10309598848, 10317987712, 10326375296, 10334763392, 582 10343153536, 10351541632, 10359930752, 10368318592, 10376707456, 583 10385096576, 10393484672, 10401867136, 10410262144, 10418647424, 584 10427039104, 10435425664, 10443810176, 10452203648, 10460589952, 585 10468982144, 10477369472, 10485759104, 10494147712, 10502533504, 586 10510923392, 10519313536, 10527702656, 10536091264, 10544478592, 587 10552867712, 10561255808, 10569642368, 10578032768, 10586423168, 588 10594805632, 10603200128, 10611588992, 10619976064, 10628361344, 589 10636754048, 10645143424, 10653531776, 10661920384, 10670307968, 590 10678696832, 10687086464, 10695475072, 10703863168, 10712246144, 591 10720639616, 10729026688, 10737414784, 10745806208, 10754190976, 592 10762581376, 10770971264, 10779356288, 10787747456, 10796135552, 593 10804525184, 10812915584, 10821301888, 10829692288, 10838078336, 594 10846469248, 10854858368, 10863247232, 10871631488, 10880023424, 595 10888412032, 10896799616, 10905188992, 10913574016, 10921964672, 596 10930352768, 10938742912, 10947132544, 10955518592, 10963909504, 597 10972298368, 10980687488, 10989074816, 10997462912, 11005851776, 598 11014241152, 11022627712, 11031017344, 11039403904, 11047793024, 599 11056184704, 11064570752, 11072960896, 11081343872, 11089737856, 600 11098128256, 11106514816, 11114904448, 11123293568, 11131680128, 601 11140065152, 11148458368, 11156845696, 11165236864, 11173624192, 602 11182013824, 11190402688, 11198790784, 11207179136, 11215568768, 603 11223957376, 11232345728, 11240734592, 11249122688, 11257511296, 604 11265899648, 11274285952, 11282675584, 11291065472, 11299452544, 605 11307842432, 11316231296, 11324616832, 11333009024, 11341395584, 606 11349782656, 11358172288, 11366560384, 11374950016, 11383339648, 607 11391721856, 11400117376, 11408504192, 11416893568, 11425283456, 608 11433671552, 11442061184, 11450444672, 11458837888, 11467226752, 609 11475611776, 11484003968, 11492392064, 11500780672, 11509169024, 610 11517550976, 11525944448, 11534335616, 11542724224, 11551111808, 611 11559500672, 11567890304, 11576277376, 11584667008, 11593056128, 612 11601443456, 11609830016, 11618221952, 11626607488, 11634995072, 613 11643387776, 11651775104, 11660161664, 11668552576, 11676940928, 614 11685330304, 11693718656, 11702106496, 11710496128, 11718882688, 615 11727273088, 11735660416, 11744050048, 11752437376, 11760824704, 616 11769216128, 11777604736, 11785991296, 11794381952, 11802770048, 617 11811157888, 11819548544, 11827932544, 11836324736, 11844713344, 618 11853100928, 11861486464, 11869879936, 11878268032, 11886656896, 619 11895044992, 11903433088, 11911822976, 11920210816, 11928600448, 620 11936987264, 11945375872, 11953761152, 11962151296, 11970543488, 621 11978928512, 11987320448, 11995708288, 12004095104, 12012486272, 622 12020875136, 12029255552, 12037652096, 12046039168, 12054429568, 623 12062813824, 12071206528, 12079594624, 12087983744, 12096371072, 624 12104759936, 12113147264, 12121534592, 12129924992, 12138314624, 625 12146703232, 12155091584, 12163481216, 12171864704, 12180255872, 626 12188643968, 12197034112, 12205424512, 12213811328, 12222199424, 627 12230590336, 12238977664, 12247365248, 12255755392, 12264143488, 628 12272531584, 12280920448, 12289309568, 12297694592, 12306086528, 629 12314475392, 12322865024, 12331253632, 12339640448, 12348029312, 630 12356418944, 12364805248, 12373196672, 12381580928, 12389969024, 631 12398357632, 12406750592, 12415138432, 12423527552, 12431916416, 632 12440304512, 12448692352, 12457081216, 12465467776, 12473859968, 633 12482245504, 12490636672, 12499025536, 12507411584, 12515801728, 634 12524190592, 12532577152, 12540966272, 12549354368, 12557743232, 635 12566129536, 12574523264, 12582911872, 12591299456, 12599688064, 636 12608074624, 12616463488, 12624845696, 12633239936, 12641631616, 637 12650019968, 12658407296, 12666795136, 12675183232, 12683574656, 638 12691960192, 12700350592, 12708740224, 12717128576, 12725515904, 639 12733906816, 12742295168, 12750680192, 12759071872, 12767460736, 640 12775848832, 12784236928, 12792626816, 12801014656, 12809404288, 641 12817789312, 12826181504, 12834568832, 12842954624, 12851345792, 642 12859732352, 12868122496, 12876512128, 12884901248, 12893289088, 643 12901672832, 12910067584, 12918455168, 12926842496, 12935232896, 644 12943620736, 12952009856, 12960396928, 12968786816, 12977176192, 645 12985563776, 12993951104, 13002341504, 13010730368, 13019115392, 646 13027506304, 13035895168, 13044272512, 13052673152, 13061062528, 647 13069446272, 13077838976, 13086227072, 13094613632, 13103000192, 648 13111393664, 13119782528, 13128157568, 13136559232, 13144945024, 649 13153329536, 13161724288, 13170111872, 13178502784, 13186884736, 650 13195279744, 13203667072, 13212057472, 13220445824, 13228832128, 651 13237221248, 13245610624, 13254000512, 13262388352, 13270777472, 652 13279166336, 13287553408, 13295943296, 13304331904, 13312719488, 653 13321108096, 13329494656, 13337885824, 13346274944, 13354663808, 654 13363051136, 13371439232, 13379825024, 13388210816, 13396605056, 655 13404995456, 13413380224, 13421771392, 13430159744, 13438546048, 656 13446937216, 13455326848, 13463708288, 13472103808, 13480492672, 657 13488875648, 13497269888, 13505657728, 13514045312, 13522435712, 658 13530824576, 13539210112, 13547599232, 13555989376, 13564379008, 659 13572766336, 13581154432, 13589544832, 13597932928, 13606320512, 660 13614710656, 13623097472, 13631477632, 13639874944, 13648264064, 661 13656652928, 13665041792, 13673430656, 13681818496, 13690207616, 662 13698595712, 13706982272, 13715373184, 13723762048, 13732150144, 663 13740536704, 13748926592, 13757316224, 13765700992, 13774090112, 664 13782477952, 13790869376, 13799259008, 13807647872, 13816036736, 665 13824425344, 13832814208, 13841202304, 13849591424, 13857978752, 666 13866368896, 13874754688, 13883145344, 13891533184, 13899919232, 667 13908311168, 13916692096, 13925085056, 13933473152, 13941866368, 668 13950253696, 13958643584, 13967032192, 13975417216, 13983807616, 669 13992197504, 14000582272, 14008973696, 14017363072, 14025752192, 670 14034137984, 14042528384, 14050918016, 14059301504, 14067691648, 671 14076083584, 14084470144, 14092852352, 14101249664, 14109635968, 672 14118024832, 14126407552, 14134804352, 14143188608, 14151577984, 673 14159968384, 14168357248, 14176741504, 14185127296, 14193521024, 674 14201911424, 14210301824, 14218685056, 14227067264, 14235467392, 675 14243855488, 14252243072, 14260630144, 14269021568, 14277409408, 676 14285799296, 14294187904, 14302571392, 14310961792, 14319353728, 677 14327738752, 14336130944, 14344518784, 14352906368, 14361296512, 678 14369685376, 14378071424, 14386462592, 14394848128, 14403230848, 679 14411627392, 14420013952, 14428402304, 14436793472, 14445181568, 680 14453569664, 14461959808, 14470347904, 14478737024, 14487122816, 681 14495511424, 14503901824, 14512291712, 14520677504, 14529064832, 682 14537456768, 14545845632, 14554234496, 14562618496, 14571011456, 683 14579398784, 14587789184, 14596172672, 14604564608, 14612953984, 684 14621341312, 14629724288, 14638120832, 14646503296, 14654897536, 685 14663284864, 14671675264, 14680061056, 14688447616, 14696835968, 686 14705228416, 14713616768, 14722003328, 14730392192, 14738784128, 687 14747172736, 14755561088, 14763947648, 14772336512, 14780725376, 688 14789110144, 14797499776, 14805892736, 14814276992, 14822670208, 689 14831056256, 14839444352, 14847836032, 14856222848, 14864612992, 690 14872997504, 14881388672, 14889775744, 14898165376, 14906553472, 691 14914944896, 14923329664, 14931721856, 14940109696, 14948497024, 692 14956887424, 14965276544, 14973663616, 14982053248, 14990439808, 693 14998830976, 15007216768, 15015605888, 15023995264, 15032385152, 694 15040768384, 15049154944, 15057549184, 15065939072, 15074328448, 695 15082715008, 15091104128, 15099493504, 15107879296, 15116269184, 696 15124659584, 15133042304, 15141431936, 15149824384, 15158214272, 697 15166602368, 15174991232, 15183378304, 15191760512, 15200154496, 698 15208542592, 15216931712, 15225323392, 15233708416, 15242098048, 699 15250489216, 15258875264, 15267265408, 15275654528, 15284043136, 700 15292431488, 15300819584, 15309208192, 15317596544, 15325986176, 701 15334374784, 15342763648, 15351151744, 15359540608, 15367929728, 702 15376318336, 15384706432, 15393092992, 15401481856, 15409869952, 703 15418258816, 15426649984, 15435037568, 15443425664, 15451815296, 704 15460203392, 15468589184, 15476979328, 15485369216, 15493755776, 705 15502146944, 15510534272, 15518924416, 15527311232, 15535699072, 706 15544089472, 15552478336, 15560866688, 15569254528, 15577642624, 707 15586031488, 15594419072, 15602809472, 15611199104, 15619586432, 708 15627975296, 15636364928, 15644753792, 15653141888, 15661529216, 709 15669918848, 15678305152, 15686696576, 15695083136, 15703474048, 710 15711861632, 15720251264, 15728636288, 15737027456, 15745417088, 711 15753804928, 15762194048, 15770582656, 15778971008, 15787358336, 712 15795747712, 15804132224, 15812523392, 15820909696, 15829300096, 713 15837691264, 15846071936, 15854466944, 15862855808, 15871244672, 714 15879634816, 15888020608, 15896409728, 15904799104, 15913185152, 715 15921577088, 15929966464, 15938354816, 15946743424, 15955129472, 716 15963519872, 15971907968, 15980296064, 15988684928, 15997073024, 717 16005460864, 16013851264, 16022241152, 16030629248, 16039012736, 718 16047406976, 16055794816, 16064181376, 16072571264, 16080957824, 719 16089346688, 16097737856, 16106125184, 16114514816, 16122904192, 720 16131292544, 16139678848, 16148066944, 16156453504, 16164839552, 721 16173236096, 16181623424, 16190012032, 16198401152, 16206790528, 722 16215177344, 16223567744, 16231956352, 16240344704, 16248731008, 723 16257117824, 16265504384, 16273898624, 16282281856, 16290668672, 724 16299064192, 16307449216, 16315842176, 16324230016, 16332613504, 725 16341006464, 16349394304, 16357783168, 16366172288, 16374561664, 726 16382951296, 16391337856, 16399726208, 16408116352, 16416505472, 727 16424892032, 16433282176, 16441668224, 16450058624, 16458448768, 728 16466836864, 16475224448, 16483613056, 16492001408, 16500391808, 729 16508779648, 16517166976, 16525555328, 16533944192, 16542330752, 730 16550719616, 16559110528, 16567497088, 16575888512, 16584274816, 731 16592665472, 16601051008, 16609442944, 16617832064, 16626218624, 732 16634607488, 16642996096, 16651385728, 16659773824, 16668163712, 733 16676552576, 16684938112, 16693328768, 16701718144, 16710095488, 734 16718492288, 16726883968, 16735272832, 16743661184, 16752049792, 735 16760436608, 16768827008, 16777214336, 16785599104, 16793992832, 736 16802381696, 16810768768, 16819151744, 16827542656, 16835934848, 737 16844323712, 16852711552, 16861101952, 16869489536, 16877876864, 738 16886265728, 16894653056, 16903044736, 16911431296, 16919821696, 739 16928207488, 16936592768, 16944987776, 16953375616, 16961763968, 740 16970152832, 16978540928, 16986929536, 16995319168, 17003704448, 741 17012096896, 17020481152, 17028870784, 17037262208, 17045649536, 742 17054039936, 17062426496, 17070814336, 17079205504, 17087592064, 743 17095978112, 17104369024, 17112759424, 17121147776, 17129536384, 744 17137926016, 17146314368, 17154700928, 17163089792, 17171480192, 745 17179864192, 17188256896, 17196644992, 17205033856, 17213423488, 746 17221811072, 17230198912, 17238588032, 17246976896, 17255360384, 747 17263754624, 17272143232, 17280530048, 17288918912, 17297309312, 748 17305696384, 17314085504, 17322475136, 17330863744, 17339252096, 749 17347640192, 17356026496, 17364413824, 17372796544, 17381190016, 750 17389583488, 17397972608, 17406360704, 17414748544, 17423135872, 751 17431527296, 17439915904, 17448303232, 17456691584, 17465081728, 752 17473468288, 17481857408, 17490247552, 17498635904, 17507022464, 753 17515409024, 17523801728, 17532189824, 17540577664, 17548966016, 754 17557353344, 17565741184, 17574131584, 17582519168, 17590907008, 755 17599296128, 17607687808, 17616076672, 17624455808, 17632852352, 756 17641238656, 17649630848, 17658018944, 17666403968, 17674794112, 757 17683178368, 17691573376, 17699962496, 17708350592, 17716739968, 758 17725126528, 17733517184, 17741898112, 17750293888, 17758673024, 759 17767070336, 17775458432, 17783848832, 17792236928, 17800625536, 760 17809012352, 17817402752, 17825785984, 17834178944, 17842563968, 761 17850955648, 17859344512, 17867732864, 17876119424, 17884511872, 762 17892900224, 17901287296, 17909677696, 17918058112, 17926451072, 763 17934843776, 17943230848, 17951609216, 17960008576, 17968397696, 764 17976784256, 17985175424, 17993564032, 18001952128, 18010339712, 765 18018728576, 18027116672, 18035503232, 18043894144, 18052283264, 766 18060672128, 18069056384, 18077449856, 18085837184, 18094225792, 767 18102613376, 18111004544, 18119388544, 18127781248, 18136170368, 768 18144558976, 18152947328, 18161336192, 18169724288, 18178108544, 769 18186498944, 18194886784, 18203275648, 18211666048, 18220048768, 770 18228444544, 18236833408, 18245220736} 771 772 // cacheSizes is a lookup table for the ethash verification cache size for the 773 // first 2048 epochs (i.e. 61440000 blocks). 774 var cacheSizes = []uint64{ 775 16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, 776 17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, 777 18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, 778 19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, 779 20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, 780 21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, 781 22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, 782 23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, 783 24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, 784 25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, 785 25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, 786 26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, 787 27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, 788 28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, 789 29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, 790 30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, 791 31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, 792 32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, 793 33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, 794 34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, 795 35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, 796 36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, 797 36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, 798 37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, 799 38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, 800 39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, 801 40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, 802 41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, 803 42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, 804 43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, 805 44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, 806 45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, 807 46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, 808 47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, 809 47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, 810 48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, 811 49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, 812 50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, 813 51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, 814 52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, 815 53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, 816 54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, 817 55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, 818 56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, 819 57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, 820 58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, 821 58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, 822 59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, 823 60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, 824 61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, 825 62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, 826 63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, 827 64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, 828 65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, 829 66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, 830 67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, 831 68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, 832 69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, 833 69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, 834 70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168, 835 71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568, 836 72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944, 837 73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832, 838 74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544, 839 75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072, 840 76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832, 841 77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336, 842 78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664, 843 79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472, 844 80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848, 845 81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304, 846 81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984, 847 82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464, 848 83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608, 849 84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496, 850 85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112, 851 86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632, 852 87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264, 853 88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384, 854 89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376, 855 90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776, 856 91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384, 857 92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912, 858 92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136, 859 93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896, 860 94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016, 861 95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544, 862 96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536, 863 97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168, 864 98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928, 865 99352384, 99482816, 99614272, 99745472, 99876416, 100007104, 866 100138048, 100267072, 100401088, 100529984, 100662592, 100791872, 867 100925248, 101056064, 101187392, 101317952, 101449408, 101580608, 868 101711296, 101841728, 101973824, 102104896, 102235712, 102366016, 869 102498112, 102628672, 102760384, 102890432, 103021888, 103153472, 870 103284032, 103415744, 103545152, 103677248, 103808576, 103939648, 871 104070976, 104201792, 104332736, 104462528, 104594752, 104725952, 872 104854592, 104988608, 105118912, 105247808, 105381184, 105511232, 873 105643072, 105774784, 105903296, 106037056, 106167872, 106298944, 874 106429504, 106561472, 106691392, 106822592, 106954304, 107085376, 875 107216576, 107346368, 107478464, 107609792, 107739712, 107872192, 876 108003136, 108131392, 108265408, 108396224, 108527168, 108657344, 877 108789568, 108920384, 109049792, 109182272, 109312576, 109444928, 878 109572928, 109706944, 109837888, 109969088, 110099648, 110230976, 879 110362432, 110492992, 110624704, 110755264, 110886208, 111017408, 880 111148864, 111279296, 111410752, 111541952, 111673024, 111803456, 881 111933632, 112066496, 112196416, 112328512, 112457792, 112590784, 882 112715968, 112852672, 112983616, 113114944, 113244224, 113376448, 883 113505472, 113639104, 113770304, 113901376, 114031552, 114163264, 884 114294592, 114425536, 114556864, 114687424, 114818624, 114948544, 885 115080512, 115212224, 115343296, 115473472, 115605184, 115736128, 886 115867072, 115997248, 116128576, 116260288, 116391488, 116522944, 887 116652992, 116784704, 116915648, 117046208, 117178304, 117308608, 888 117440192, 117569728, 117701824, 117833024, 117964096, 118094656, 889 118225984, 118357312, 118489024, 118617536, 118749632, 118882112, 890 119012416, 119144384, 119275328, 119406016, 119537344, 119668672, 891 119798464, 119928896, 120061376, 120192832, 120321728, 120454336, 892 120584512, 120716608, 120848192, 120979136, 121109056, 121241408, 893 121372352, 121502912, 121634752, 121764416, 121895744, 122027072, 894 122157632, 122289088, 122421184, 122550592, 122682944, 122813888, 895 122945344, 123075776, 123207488, 123338048, 123468736, 123600704, 896 123731264, 123861952, 123993664, 124124608, 124256192, 124386368, 897 124518208, 124649024, 124778048, 124911296, 125041088, 125173696, 898 125303744, 125432896, 125566912, 125696576, 125829056, 125958592, 899 126090304, 126221248, 126352832, 126483776, 126615232, 126746432, 900 126876608, 127008704, 127139392, 127270336, 127401152, 127532224, 901 127663552, 127794752, 127925696, 128055232, 128188096, 128319424, 902 128449856, 128581312, 128712256, 128843584, 128973632, 129103808, 903 129236288, 129365696, 129498944, 129629888, 129760832, 129892288, 904 130023104, 130154048, 130283968, 130416448, 130547008, 130678336, 905 130807616, 130939456, 131071552, 131202112, 131331776, 131464384, 906 131594048, 131727296, 131858368, 131987392, 132120256, 132250816, 907 132382528, 132513728, 132644672, 132774976, 132905792, 133038016, 908 133168832, 133299392, 133429312, 133562048, 133692992, 133823296, 909 133954624, 134086336, 134217152, 134348608, 134479808, 134607296, 910 134741056, 134872384, 135002944, 135134144, 135265472, 135396544, 911 135527872, 135659072, 135787712, 135921472, 136052416, 136182848, 912 136313792, 136444864, 136576448, 136707904, 136837952, 136970048, 913 137099584, 137232064, 137363392, 137494208, 137625536, 137755712, 914 137887424, 138018368, 138149824, 138280256, 138411584, 138539584, 915 138672832, 138804928, 138936128, 139066688, 139196864, 139328704, 916 139460032, 139590208, 139721024, 139852864, 139984576, 140115776, 917 140245696, 140376512, 140508352, 140640064, 140769856, 140902336, 918 141032768, 141162688, 141294016, 141426496, 141556544, 141687488, 919 141819584, 141949888, 142080448, 142212544, 142342336, 142474432, 920 142606144, 142736192, 142868288, 142997824, 143129408, 143258944, 921 143392448, 143523136, 143653696, 143785024, 143916992, 144045632, 922 144177856, 144309184, 144440768, 144570688, 144701888, 144832448, 923 144965056, 145096384, 145227584, 145358656, 145489856, 145620928, 924 145751488, 145883072, 146011456, 146144704, 146275264, 146407232, 925 146538176, 146668736, 146800448, 146931392, 147062336, 147193664, 926 147324224, 147455936, 147586624, 147717056, 147848768, 147979456, 927 148110784, 148242368, 148373312, 148503232, 148635584, 148766144, 928 148897088, 149028416, 149159488, 149290688, 149420224, 149551552, 929 149683136, 149814976, 149943616, 150076352, 150208064, 150338624, 930 150470464, 150600256, 150732224, 150862784, 150993088, 151125952, 931 151254976, 151388096, 151519168, 151649728, 151778752, 151911104, 932 152042944, 152174144, 152304704, 152435648, 152567488, 152698816, 933 152828992, 152960576, 153091648, 153222976, 153353792, 153484096, 934 153616192, 153747008, 153878336, 154008256, 154139968, 154270912, 935 154402624, 154533824, 154663616, 154795712, 154926272, 155057984, 936 155188928, 155319872, 155450816, 155580608, 155712064, 155843392, 937 155971136, 156106688, 156237376, 156367424, 156499264, 156630976, 938 156761536, 156892352, 157024064, 157155008, 157284416, 157415872, 939 157545536, 157677248, 157810496, 157938112, 158071744, 158203328, 940 158334656, 158464832, 158596288, 158727616, 158858048, 158988992, 941 159121216, 159252416, 159381568, 159513152, 159645632, 159776192, 942 159906496, 160038464, 160169536, 160300352, 160430656, 160563008, 943 160693952, 160822208, 160956352, 161086784, 161217344, 161349184, 944 161480512, 161611456, 161742272, 161873216, 162002752, 162135872, 945 162266432, 162397888, 162529216, 162660032, 162790976, 162922048, 946 163052096, 163184576, 163314752, 163446592, 163577408, 163707968, 947 163839296, 163969984, 164100928, 164233024, 164364224, 164494912, 948 164625856, 164756672, 164887616, 165019072, 165150016, 165280064, 949 165412672, 165543104, 165674944, 165805888, 165936832, 166067648, 950 166198336, 166330048, 166461248, 166591552, 166722496, 166854208, 951 166985408, 167116736, 167246656, 167378368, 167508416, 167641024, 952 167771584, 167903168, 168034112, 168164032, 168295744, 168427456, 953 168557632, 168688448, 168819136, 168951616, 169082176, 169213504, 954 169344832, 169475648, 169605952, 169738048, 169866304, 169999552, 955 170131264, 170262464, 170393536, 170524352, 170655424, 170782016, 956 170917696, 171048896, 171179072, 171310784, 171439936, 171573184, 957 171702976, 171835072, 171966272, 172097216, 172228288, 172359232, 958 172489664, 172621376, 172747712, 172883264, 173014208, 173144512, 959 173275072, 173407424, 173539136, 173669696, 173800768, 173931712, 960 174063424, 174193472, 174325696, 174455744, 174586816, 174718912, 961 174849728, 174977728, 175109696, 175242688, 175374272, 175504832, 962 175636288, 175765696, 175898432, 176028992, 176159936, 176291264, 963 176422592, 176552512, 176684864, 176815424, 176946496, 177076544, 964 177209152, 177340096, 177470528, 177600704, 177731648, 177864256, 965 177994816, 178126528, 178257472, 178387648, 178518464, 178650176, 966 178781888, 178912064, 179044288, 179174848, 179305024, 179436736, 967 179568448, 179698496, 179830208, 179960512, 180092608, 180223808, 968 180354752, 180485696, 180617152, 180748096, 180877504, 181009984, 969 181139264, 181272512, 181402688, 181532608, 181663168, 181795136, 970 181926592, 182057536, 182190016, 182320192, 182451904, 182582336, 971 182713792, 182843072, 182976064, 183107264, 183237056, 183368384, 972 183494848, 183631424, 183762752, 183893824, 184024768, 184154816, 973 184286656, 184417984, 184548928, 184680128, 184810816, 184941248, 974 185072704, 185203904, 185335616, 185465408, 185596352, 185727296, 975 185859904, 185989696, 186121664, 186252992, 186383552, 186514112, 976 186645952, 186777152, 186907328, 187037504, 187170112, 187301824, 977 187429184, 187562048, 187693504, 187825472, 187957184, 188087104, 978 188218304, 188349376, 188481344, 188609728, 188743616, 188874304, 979 189005248, 189136448, 189265088, 189396544, 189528128, 189660992, 980 189791936, 189923264, 190054208, 190182848, 190315072, 190447424, 981 190577984, 190709312, 190840768, 190971328, 191102656, 191233472, 982 191364032, 191495872, 191626816, 191758016, 191888192, 192020288, 983 192148928, 192282176, 192413504, 192542528, 192674752, 192805952, 984 192937792, 193068608, 193198912, 193330496, 193462208, 193592384, 985 193723456, 193854272, 193985984, 194116672, 194247232, 194379712, 986 194508352, 194641856, 194772544, 194900672, 195035072, 195166016, 987 195296704, 195428032, 195558592, 195690304, 195818176, 195952576, 988 196083392, 196214336, 196345792, 196476736, 196607552, 196739008, 989 196869952, 197000768, 197130688, 197262784, 197394368, 197523904, 990 197656384, 197787584, 197916608, 198049472, 198180544, 198310208, 991 198442432, 198573632, 198705088, 198834368, 198967232, 199097792, 992 199228352, 199360192, 199491392, 199621696, 199751744, 199883968, 993 200014016, 200146624, 200276672, 200408128, 200540096, 200671168, 994 200801984, 200933312, 201062464, 201194944, 201326144, 201457472, 995 201588544, 201719744, 201850816, 201981632, 202111552, 202244032, 996 202374464, 202505152, 202636352, 202767808, 202898368, 203030336, 997 203159872, 203292608, 203423296, 203553472, 203685824, 203816896, 998 203947712, 204078272, 204208192, 204341056, 204472256, 204603328, 999 204733888, 204864448, 204996544, 205125568, 205258304, 205388864, 1000 205517632, 205650112, 205782208, 205913536, 206044736, 206176192, 1001 206307008, 206434496, 206569024, 206700224, 206831168, 206961856, 1002 207093056, 207223616, 207355328, 207486784, 207616832, 207749056, 1003 207879104, 208010048, 208141888, 208273216, 208404032, 208534336, 1004 208666048, 208796864, 208927424, 209059264, 209189824, 209321792, 1005 209451584, 209582656, 209715136, 209845568, 209976896, 210106432, 1006 210239296, 210370112, 210501568, 210630976, 210763712, 210894272, 1007 211024832, 211156672, 211287616, 211418176, 211549376, 211679296, 1008 211812032, 211942592, 212074432, 212204864, 212334016, 212467648, 1009 212597824, 212727616, 212860352, 212991424, 213120832, 213253952, 1010 213385024, 213515584, 213645632, 213777728, 213909184, 214040128, 1011 214170688, 214302656, 214433728, 214564544, 214695232, 214826048, 1012 214956992, 215089088, 215219776, 215350592, 215482304, 215613248, 1013 215743552, 215874752, 216005312, 216137024, 216267328, 216399296, 1014 216530752, 216661696, 216790592, 216923968, 217054528, 217183168, 1015 217316672, 217448128, 217579072, 217709504, 217838912, 217972672, 1016 218102848, 218233024, 218364736, 218496832, 218627776, 218759104, 1017 218888896, 219021248, 219151936, 219281728, 219413056, 219545024, 1018 219675968, 219807296, 219938624, 220069312, 220200128, 220331456, 1019 220461632, 220592704, 220725184, 220855744, 220987072, 221117888, 1020 221249216, 221378368, 221510336, 221642048, 221772736, 221904832, 1021 222031808, 222166976, 222297536, 222428992, 222559936, 222690368, 1022 222820672, 222953152, 223083968, 223213376, 223345984, 223476928, 1023 223608512, 223738688, 223869376, 224001472, 224132672, 224262848, 1024 224394944, 224524864, 224657344, 224788288, 224919488, 225050432, 1025 225181504, 225312704, 225443776, 225574592, 225704768, 225834176, 1026 225966784, 226097216, 226229824, 226360384, 226491712, 226623424, 1027 226754368, 226885312, 227015104, 227147456, 227278528, 227409472, 1028 227539904, 227669696, 227802944, 227932352, 228065216, 228196288, 1029 228326464, 228457792, 228588736, 228720064, 228850112, 228981056, 1030 229113152, 229243328, 229375936, 229505344, 229636928, 229769152, 1031 229894976, 230030272, 230162368, 230292416, 230424512, 230553152, 1032 230684864, 230816704, 230948416, 231079616, 231210944, 231342016, 1033 231472448, 231603776, 231733952, 231866176, 231996736, 232127296, 1034 232259392, 232388672, 232521664, 232652608, 232782272, 232914496, 1035 233043904, 233175616, 233306816, 233438528, 233569984, 233699776, 1036 233830592, 233962688, 234092224, 234221888, 234353984, 234485312, 1037 234618304, 234749888, 234880832, 235011776, 235142464, 235274048, 1038 235403456, 235535936, 235667392, 235797568, 235928768, 236057152, 1039 236190272, 236322752, 236453312, 236583616, 236715712, 236846528, 1040 236976448, 237108544, 237239104, 237371072, 237501632, 237630784, 1041 237764416, 237895232, 238026688, 238157632, 238286912, 238419392, 1042 238548032, 238681024, 238812608, 238941632, 239075008, 239206336, 1043 239335232, 239466944, 239599168, 239730496, 239861312, 239992384, 1044 240122816, 240254656, 240385856, 240516928, 240647872, 240779072, 1045 240909632, 241040704, 241171904, 241302848, 241433408, 241565248, 1046 241696192, 241825984, 241958848, 242088256, 242220224, 242352064, 1047 242481856, 242611648, 242744896, 242876224, 243005632, 243138496, 1048 243268672, 243400384, 243531712, 243662656, 243793856, 243924544, 1049 244054592, 244187072, 244316608, 244448704, 244580032, 244710976, 1050 244841536, 244972864, 245104448, 245233984, 245365312, 245497792, 1051 245628736, 245759936, 245889856, 246021056, 246152512, 246284224, 1052 246415168, 246545344, 246675904, 246808384, 246939584, 247070144, 1053 247199552, 247331648, 247463872, 247593536, 247726016, 247857088, 1054 247987648, 248116928, 248249536, 248380736, 248512064, 248643008, 1055 248773312, 248901056, 249036608, 249167552, 249298624, 249429184, 1056 249560512, 249692096, 249822784, 249954112, 250085312, 250215488, 1057 250345792, 250478528, 250608704, 250739264, 250870976, 251002816, 1058 251133632, 251263552, 251395136, 251523904, 251657792, 251789248, 1059 251919424, 252051392, 252182464, 252313408, 252444224, 252575552, 1060 252706624, 252836032, 252968512, 253099712, 253227584, 253361728, 1061 253493056, 253623488, 253754432, 253885504, 254017216, 254148032, 1062 254279488, 254410432, 254541376, 254672576, 254803264, 254933824, 1063 255065792, 255196736, 255326528, 255458752, 255589952, 255721408, 1064 255851072, 255983296, 256114624, 256244416, 256374208, 256507712, 1065 256636096, 256768832, 256900544, 257031616, 257162176, 257294272, 1066 257424448, 257555776, 257686976, 257818432, 257949632, 258079552, 1067 258211136, 258342464, 258473408, 258603712, 258734656, 258867008, 1068 258996544, 259127744, 259260224, 259391296, 259522112, 259651904, 1069 259784384, 259915328, 260045888, 260175424, 260308544, 260438336, 1070 260570944, 260700992, 260832448, 260963776, 261092672, 261226304, 1071 261356864, 261487936, 261619648, 261750592, 261879872, 262011968, 1072 262143424, 262274752, 262404416, 262537024, 262667968, 262799296, 1073 262928704, 263061184, 263191744, 263322944, 263454656, 263585216, 1074 263716672, 263847872, 263978944, 264108608, 264241088, 264371648, 1075 264501184, 264632768, 264764096, 264895936, 265024576, 265158464, 1076 265287488, 265418432, 265550528, 265681216, 265813312, 265943488, 1077 266075968, 266206144, 266337728, 266468032, 266600384, 266731072, 1078 266862272, 266993344, 267124288, 267255616, 267386432, 267516992, 1079 267648704, 267777728, 267910592, 268040512, 268172096, 268302784, 1080 268435264, 268566208, 268696256, 268828096, 268959296, 269090368, 1081 269221312, 269352256, 269482688, 269614784, 269745856, 269876416, 1082 270007616, 270139328, 270270272, 270401216, 270531904, 270663616, 1083 270791744, 270924736, 271056832, 271186112, 271317184, 271449536, 1084 271580992, 271711936, 271843136, 271973056, 272105408, 272236352, 1085 272367296, 272498368, 272629568, 272759488, 272891456, 273022784, 1086 273153856, 273284672, 273415616, 273547072, 273677632, 273808448, 1087 273937088, 274071488, 274200896, 274332992, 274463296, 274595392, 1088 274726208, 274857536, 274988992, 275118656, 275250496, 275382208, 1089 275513024, 275643968, 275775296, 275906368, 276037184, 276167872, 1090 276297664, 276429376, 276560576, 276692672, 276822976, 276955072, 1091 277085632, 277216832, 277347008, 277478848, 277609664, 277740992, 1092 277868608, 278002624, 278134336, 278265536, 278395328, 278526784, 1093 278657728, 278789824, 278921152, 279052096, 279182912, 279313088, 1094 279443776, 279576256, 279706048, 279838528, 279969728, 280099648, 1095 280230976, 280361408, 280493632, 280622528, 280755392, 280887104, 1096 281018176, 281147968, 281278912, 281411392, 281542592, 281673152, 1097 281803712, 281935552, 282066496, 282197312, 282329024, 282458816, 1098 282590272, 282720832, 282853184, 282983744, 283115072, 283246144, 1099 283377344, 283508416, 283639744, 283770304, 283901504, 284032576, 1100 284163136, 284294848, 284426176, 284556992, 284687296, 284819264, 1101 284950208, 285081536}