Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not hash leading zero bytes of i64 numbers in Sip128 hasher #92103

Merged
merged 1 commit into from
Jan 5, 2022

Conversation

Kobzol
Copy link
Contributor

@Kobzol Kobzol commented Dec 19, 2021

I was poking into the stable hasher, trying to improve its performance by compressing the number of hashed bytes. First I was experimenting with LEB128, but it was painful to implement because of the many assumptions that the SipHasher makes, so I tried something simpler - just ignoring leading zero bytes. For example, if an 8-byte integer can fit into a 4-byte integer, I will just hash the four bytes.

I wonder if this could produce any hashing ambiguity. Originally I thought so, but then I struggled to find any counter-example where this could cause different values to have the same hash. I'd be glad for any examples that could be broken by this (there are some ways of mitigating it if that would be the case). It could happen if you had e.g. 2x u8 vs 1x u16 hashed after one another in two different runs, but that can also happen now, without this "trick". And with collections, it should be fine, because the length is included in their hash.

I gathered some statistics for common values used in the clap benchmark. I observed that especially i64 often had very low values, so I started with that type, let's see what perf does on CI.

There are some tradeoffs that we can try:

  1. What types to use this optimization for? u64, u32, u16? Locally it was a slight loss for u64, I noticed that its values are often quite large.
  2. What byte sizes to check? E.g. we can only distinguish between u64/u32 or u64/u8 instead of u64/u32/u16/u8 to reduce branching (with i64 it seemed to be better to go all the way down to u8 locally though).

(The macro was introduced because I expect that I will be trying out this "trick" for different types).

Can you please schedule a perf. run? Thanks.

r? @the8472

@rustbot rustbot added the T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. label Dec 19, 2021
@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 19, 2021
@rust-log-analyzer

This comment has been minimized.

@the8472
Copy link
Member

the8472 commented Dec 19, 2021

@bors try @rust-timer queue

@rust-timer
Copy link
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rustbot rustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Dec 19, 2021
@bors
Copy link
Contributor

bors commented Dec 19, 2021

⌛ Trying commit 26e11a65ff6301065305883c083c82e5d2fc9ad1 with merge 41ab8755356cf3e4f52487f9ee223909c551c1ac...

@Kobzol
Copy link
Contributor Author

Kobzol commented Dec 20, 2021

@the8472 I forgot to format the code, so I force-pushed to fix CI tests. Did it cancel the perf. build?

@the8472
Copy link
Member

the8472 commented Dec 20, 2021

@bors try-

@the8472
Copy link
Member

the8472 commented Dec 20, 2021

@bors try

@bors
Copy link
Contributor

bors commented Dec 20, 2021

⌛ Trying commit 58ddd5b3502d8ace6dc249f3970c0459ff81abd2 with merge 00912d4c7610ecf99395e9146a0df5c231bbd3c3...

@bors
Copy link
Contributor

bors commented Dec 20, 2021

☀️ Try build successful - checks-actions
Build commit: 00912d4c7610ecf99395e9146a0df5c231bbd3c3 (00912d4c7610ecf99395e9146a0df5c231bbd3c3)

@rust-timer
Copy link
Collaborator

Queued 00912d4c7610ecf99395e9146a0df5c231bbd3c3 with parent 60f3bd7, future comparison URL.

@rust-timer
Copy link
Collaborator

Finished benchmarking commit (00912d4c7610ecf99395e9146a0df5c231bbd3c3): comparison url.

Summary: This change led to very large relevant improvements 🎉 in compiler performance.

  • Very large improvement in instruction counts (up to -6.4% on incr-full builds of clap-rs)

If you disagree with this performance assessment, please file an issue in rust-lang/rustc-perf.

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR led to changes in compiler perf.

@bors rollup=never
@rustbot label: +S-waiting-on-review -S-waiting-on-perf -perf-regression

@rustbot rustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Dec 20, 2021
@@ -409,6 +409,18 @@ impl SipHasher128 {
}
}

macro_rules! dispatch_u64 {
($target: expr, $value:expr) => {
let value = $value as u64;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This turns negative numbers of small magnitude into unsigned ones of large magnitude. Are they uncommon enough that it doesn't matter (perf results do look good after all)?

Copy link
Contributor Author

@Kobzol Kobzol Dec 20, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a very good point. I suppose so, for example in clap there was not a single negative i64 number.

clap counts larger than 10
val: ('i64', '0'), count: 69716
val: ('i64', '1'), count: 51123
val: ('u64', '1'), count: 46405
val: ('u64', '4123556366180851409'), count: 40030
val: ('i64', '7'), count: 27610
val: ('i64', '3'), count: 26883
val: ('u64', '0'), count: 24688
val: ('u64', '3553076525994023152'), count: 19811
val: ('i64', '8'), count: 17967
val: ('i64', '5'), count: 16594
val: ('u64', '4'), count: 15662
val: ('u64', '10397717518009349142'), count: 14374
val: ('u64', '4675565100481621351'), count: 14332
val: ('u64', '9359258411201595610'), count: 14280
val: ('u64', '3'), count: 12971
val: ('u64', '2'), count: 11811
val: ('u64', '3424409560933081818'), count: 10390
val: ('i64', '22'), count: 10002
val: ('u64', '5'), count: 9893
val: ('i64', '2'), count: 9013
val: ('u64', '4175576119844674727'), count: 7956
val: ('u64', '2254901369232247007'), count: 7101
val: ('u64', '6'), count: 6694
val: ('u64', '17263232017173089937'), count: 6393
val: ('i64', '10'), count: 6303
val: ('u64', '15077819631841426575'), count: 6225
val: ('i64', '15'), count: 5927
val: ('i64', '4'), count: 5876
val: ('u64', '9313708463642812613'), count: 5563
val: ('u64', '8'), count: 5143
val: ('u64', '9'), count: 5098
val: ('u64', '12436741956529633511'), count: 4588
val: ('u64', '14829434783666926937'), count: 4238
val: ('u64', '8516250509783203598'), count: 4091
val: ('u64', '10'), count: 3586
val: ('i64', '32'), count: 3234
val: ('u64', '7'), count: 2904
val: ('u64', '3731342926491762417'), count: 2688
val: ('u64', '12325118110711103087'), count: 2564
val: ('i64', '9'), count: 2326
val: ('i64', '6'), count: 2197
val: ('u64', '11'), count: 1807
val: ('i64', '17'), count: 1446
val: ('u64', '14343764279712422270'), count: 1352
val: ('u64', '12'), count: 1321
val: ('i64', '20'), count: 1211
val: ('u64', '16991242760273525868'), count: 1208
val: ('u64', '14'), count: 1137
val: ('i64', '11'), count: 1130
val: ('i64', '26'), count: 1047
val: ('u64', '15422541054788436452'), count: 967
val: ('u64', '9785122672296426403'), count: 916
val: ('u64', '8173264106939382879'), count: 916
val: ('u64', '12460766867709644225'), count: 883
val: ('u64', '13954507008523372228'), count: 876
val: ('u64', '13'), count: 870
val: ('u64', '4953516894469726062'), count: 869
val: ('u64', '5351840378456149447'), count: 850
val: ('u64', '17508521953601273679'), count: 846
val: ('u64', '16959706381154203451'), count: 783
val: ('u64', '15'), count: 755
val: ('u64', '16'), count: 711
val: ('u64', '3198978688118858546'), count: 709
val: ('u64', '4926031611796201074'), count: 666
val: ('u64', '3084221938898261862'), count: 663
val: ('u64', '14512168144743378613'), count: 663
val: ('i64', '16'), count: 662
val: ('u64', '8373749061233914219'), count: 651
val: ('u64', '12900240287980658989'), count: 647
val: ('u64', '10857270988090866464'), count: 615
val: ('i64', '18'), count: 594
val: ('u64', '1276928100247864700'), count: 557
val: ('u64', '12212807588254450492'), count: 553
val: ('u64', '7293410763509788858'), count: 553
val: ('u64', '17414487241002693485'), count: 553
val: ('u64', '4730615519180414076'), count: 553
val: ('u64', '18'), count: 521
val: ('u64', '15029720767272404231'), count: 520
val: ('u64', '10531361067455361614'), count: 504
val: ('u64', '1697728074762586862'), count: 498
val: ('i64', '21'), count: 497
val: ('u64', '19'), count: 476
val: ('u64', '12888257279961233561'), count: 472
val: ('u64', '230115293571335744'), count: 460
val: ('u64', '7851447997805013263'), count: 423
val: ('u64', '18268550671202360175'), count: 421
val: ('u64', '10882931222121242394'), count: 409
val: ('u64', '24'), count: 404
val: ('i64', '13'), count: 403
val: ('u64', '14261018313741893166'), count: 402
val: ('u64', '11146145969246257400'), count: 401
val: ('i64', '12'), count: 397
val: ('u64', '16091424419180589980'), count: 383
val: ('u64', '3785016577619009572'), count: 377
val: ('u64', '7178288797994868914'), count: 377
val: ('u64', '17'), count: 371
val: ('u64', '14473835987706218422'), count: 354
val: ('u64', '583056068119256633'), count: 347
val: ('i64', '19'), count: 313
val: ('u64', '14801347897698107457'), count: 299
val: ('u64', '11611876753637737151'), count: 294
val: ('u64', '2817596162749060606'), count: 267
val: ('i64', '14'), count: 249
val: ('u64', '15836525964262797668'), count: 238
val: ('u64', '9004495922043804146'), count: 235
val: ('u64', '1693045649438289385'), count: 235
val: ('u64', '11548663128351014502'), count: 235
val: ('u64', '7231066428900354790'), count: 235
val: ('i64', '23'), count: 234
val: ('u64', '1151066230828838050'), count: 224
val: ('i64', '25'), count: 217
val: ('u64', '22'), count: 209
val: ('u64', '21'), count: 209
val: ('u64', '1786430848153721534'), count: 198
val: ('u64', '717224964392386724'), count: 192
val: ('i64', '35'), count: 188
val: ('u64', '17347150040457716767'), count: 183
val: ('u64', '1260755616316668822'), count: 166
val: ('u64', '7102902181303090067'), count: 163
val: ('u64', '20'), count: 160
val: ('i64', '29'), count: 160
val: ('u64', '10630686983033810931'), count: 160
val: ('u64', '3872312265541436359'), count: 152
val: ('u64', '4744484766366675976'), count: 150
val: ('u64', '14373709078601336969'), count: 145
val: ('u64', '18141027783828633404'), count: 140
val: ('u64', '11842206891812292464'), count: 139
val: ('i64', '24'), count: 139
val: ('u64', '15926829660047426411'), count: 137
val: ('u64', '6828511400896982793'), count: 133
val: ('u64', '16223337370864402989'), count: 118
val: ('u64', '1527221651336471'), count: 106
val: ('u64', '5934290079416697393'), count: 104
val: ('i64', '31'), count: 102
val: ('u64', '7914393758597035038'), count: 99
val: ('u64', '7242557889658258395'), count: 99
val: ('u32', '64'), count: 95
val: ('u64', '1521724093196311'), count: 94
val: ('u64', '9880219152616748179'), count: 93
val: ('u64', '3225968046817975941'), count: 92
val: ('u64', '13801988359420914882'), count: 91
val: ('u64', '16442543459689550152'), count: 87
val: ('u64', '11373167891584403890'), count: 87
val: ('u64', '1525022628080408'), count: 82
val: ('u64', '1529420674592536'), count: 82
val: ('u64', '1533818721104660'), count: 82
val: ('u64', '1536017744360724'), count: 82
val: ('u64', '15128606027534119622'), count: 81
val: ('u64', '7843173363127459213'), count: 79
val: ('u64', '1099511628032'), count: 78
val: ('u64', '15271518302699163385'), count: 76
val: ('u64', '1066033829928962345'), count: 73
val: ('u64', '18079401088936675055'), count: 72
val: ('u64', '10928653513314141561'), count: 72
val: ('u64', '3271229113085632895'), count: 72
val: ('u64', '10158639335571275732'), count: 71
val: ('u64', '23'), count: 71
val: ('u64', '1702638239974621460'), count: 70
val: ('u64', '13560770513350654490'), count: 70
val: ('u64', '6142549601549617973'), count: 69
val: ('u64', '7638960698149238382'), count: 68
val: ('u64', '14755978951955257389'), count: 68
val: ('u64', '1522823604824344'), count: 66
val: ('u64', '1523923116452376'), count: 66
val: ('u64', '1528321162964504'), count: 66
val: ('u64', '1532719209476628'), count: 66
val: ('u64', '1534918232732692'), count: 66
val: ('u64', '5381316971740057954'), count: 63
val: ('u64', '5353856357126547964'), count: 63
val: ('u64', '16263231830787805301'), count: 63
val: ('u64', '620166437783249184'), count: 60
val: ('u64', '18049469517547229757'), count: 60
val: ('u64', '13515071814850372670'), count: 60
val: ('u64', '13392129397242746422'), count: 60
val: ('u64', '2447783078148060494'), count: 59
val: ('u64', '12945362438948794844'), count: 59
val: ('u64', '8049583221647460045'), count: 57
val: ('u64', '2761689045897535380'), count: 57
val: ('u64', '9635222291745467359'), count: 57
val: ('u64', '13699322521062916524'), count: 56
val: ('u64', '8763731815232377981'), count: 55
val: ('u64', '15191366368004621059'), count: 54
val: ('u64', '15006274097834017715'), count: 54
val: ('u64', '17086401524900658843'), count: 53
val: ('u64', '16007729339347891935'), count: 52
val: ('u64', '43980465121296'), count: 51
val: ('u64', '10342647868919187185'), count: 50
val: ('u64', '38508830197340670'), count: 50
val: ('u64', '1525022628080417'), count: 50
val: ('u64', '1529420674592545'), count: 50
val: ('u64', '1533818721104669'), count: 50
val: ('u64', '1540415790872868'), count: 50
val: ('u64', '17106452343823006614'), count: 49
val: ('u64', '62672162797836'), count: 48
val: ('u64', '16307052434980877189'), count: 48
val: ('u64', '14918085701180073661'), count: 48
val: ('u64', '4529902387450120135'), count: 48
val: ('u64', '17342651063982746802'), count: 48
val: ('u64', '1651891799928311894'), count: 48
val: ('u64', '61572651169804'), count: 47
val: ('u64', '8762714086121276567'), count: 47
val: ('u64', '141837000016144'), count: 47
val: ('u64', '15767530671390576453'), count: 47
val: ('u64', '1512928000172054'), count: 47
val: ('u64', '282574488404236'), count: 47
val: ('u64', '4537538442993397567'), count: 47
val: ('u64', '14634070445650946595'), count: 46
val: ('u64', '12197500975648538900'), count: 46
val: ('u64', '62672162797857'), count: 46
val: ('u64', '14720773644038394912'), count: 46
val: ('u64', '2201897908438769206'), count: 44
val: ('u64', '8796093024256'), count: 42
val: ('u64', '25'), count: 42
val: ('u64', '1512928000172048'), count: 42
val: ('u64', '1539316279244816'), count: 42
val: ('u64', '1540415790872871'), count: 42
val: ('i64', '117'), count: 41
val: ('i64', '129'), count: 41
val: ('i64', '115'), count: 41
val: ('i64', '128'), count: 41
val: ('u64', '2199023256064'), count: 40
val: ('u64', '4270366873766265000'), count: 40
val: ('u64', '12590346959137693231'), count: 40
val: ('i64', '27'), count: 40
val: ('u64', '8362475310504463964'), count: 40
val: ('u64', '16492416629859869210'), count: 40
val: ('u64', '8302801358701319482'), count: 40
val: ('u64', '9581521860471055601'), count: 40
val: ('u64', '6339717300715212282'), count: 40
val: ('u64', '17739081170718606370'), count: 39
val: ('u64', '6463199092588012537'), count: 39
val: ('u64', '13450942318825287371'), count: 38
val: ('u64', '9922429832822829289'), count: 38
val: ('u64', '9986950373769682739'), count: 38
val: ('u64', '1517326046684184'), count: 38
val: ('u64', '1517326046684188'), count: 38
val: ('u64', '1521724093196317'), count: 38
val: ('u64', '14340879039198234161'), count: 38
val: ('u64', '13230579363344290205'), count: 37
val: ('u64', '1099511628036'), count: 36
val: ('u64', '27'), count: 36
val: ('u64', '13301032994335913104'), count: 36
val: ('u64', '17530691709057607205'), count: 36
val: ('u64', '1495335814123539'), count: 36
val: ('u64', '1517326046684208'), count: 36
val: ('u64', '1525022628080412'), count: 36
val: ('u64', '9069876638151160781'), count: 36
val: ('u64', '8528342034391903371'), count: 36
val: ('u64', '3298534884096'), count: 35
val: ('u64', '5497558140160'), count: 35
val: ('u64', '134140418619921'), count: 35
val: ('i64', '131'), count: 35
val: ('i64', '132'), count: 35
val: ('i64', '125'), count: 35
val: ('i64', '124'), count: 35
val: ('u64', '1527221651336482'), count: 35
val: ('u64', '13663715589581664588'), count: 34
val: ('u64', '10270741611847202945'), count: 34
val: ('u64', '62672162797840'), count: 34
val: ('u64', '62672162797861'), count: 34
val: ('u64', '1485440209471251'), count: 34
val: ('u64', '1516226535056152'), count: 34
val: ('u64', '1516226535056156'), count: 34
val: ('u64', '1516226535056161'), count: 34
val: ('u64', '1516226535056170'), count: 34
val: ('u64', '1516226535056177'), count: 34
val: ('u64', '1516226535056148'), count: 34
val: ('u64', '1517326046684193'), count: 34
val: ('u64', '1517326046684202'), count: 34
val: ('u64', '1517326046684180'), count: 34
val: ('u64', '1518425558312216'), count: 34
val: ('u64', '1518425558312220'), count: 34
val: ('u64', '1518425558312233'), count: 34
val: ('u64', '1518425558312212'), count: 34
val: ('u64', '1519525069940262'), count: 34
val: ('u64', '1519525069940244'), count: 34
val: ('u64', '1522823604824354'), count: 34
val: ('u64', '1523923116452381'), count: 34
val: ('u64', '1525022628080424'), count: 34
val: ('u64', '1527221651336477'), count: 34
val: ('u64', '1528321162964509'), count: 34
val: ('u64', '1529420674592540'), count: 34
val: ('u64', '1529420674592552'), count: 34
val: ('u64', '1532719209476633'), count: 34
val: ('u64', '1533818721104664'), count: 34
val: ('u64', '1533818721104676'), count: 34
val: ('u64', '1534918232732697'), count: 34
val: ('u64', '1536017744360728'), count: 34
val: ('u64', '1536017744360733'), count: 34
val: ('u64', '387028093067277'), count: 33
val: ('u64', '9337178021383192437'), count: 33
val: ('u64', '2095018513981585783'), count: 33
val: ('u64', '12094627908352'), count: 32
val: ('u64', '12588985021058100380'), count: 32
val: ('u64', '3647572784919789523'), count: 32
val: ('u64', '10995116280320'), count: 32
val: ('u64', '7770622571928249020'), count: 32
val: ('u64', '9745191140687621072'), count: 32
val: ('u64', '61572651169807'), count: 32
val: ('u64', '61572651169817'), count: 32
val: ('u64', '1526122139707412'), count: 32
val: ('u64', '1526122139707423'), count: 32
val: ('u64', '1530520186219796'), count: 32
val: ('u64', '1530520186219818'), count: 32
val: ('u64', '2225879557606095988'), count: 31
val: ('u64', '1496435325751587'), count: 31
val: ('u64', '1466691260593873445'), count: 31
val: ('u64', '37383395353105'), count: 30
val: ('u64', '11450092452267337001'), count: 30
val: ('u64', '11651898187838050413'), count: 30
val: ('u64', '12578021191460339684'), count: 30
val: ('u64', '8118305654842463098'), count: 30
val: ('u64', '14293651164416'), count: 29
val: ('u64', '15774093456027462068'), count: 29
val: ('u64', '7878982020546070894'), count: 29
val: ('u64', '8018269418161357853'), count: 29
val: ('u64', '7117829710136320230'), count: 29
val: ('u64', '10407228153110251052'), count: 29
val: ('u64', '18387249550974887491'), count: 29
val: ('u64', '673841591222401859'), count: 29
val: ('u64', '18300018891997473830'), count: 28
val: ('u64', '36283883725072'), count: 28
val: ('u64', '5467061697817418266'), count: 28
val: ('u64', '8833330914075347083'), count: 28
val: ('u64', '6597069768192'), count: 28
val: ('u64', '17729798039165116625'), count: 28
val: ('u64', '7371109685452221717'), count: 28
val: ('u64', '763061069854220'), count: 28
val: ('u64', '523778365952915859'), count: 28
val: ('u64', '17904992296327311236'), count: 28
val: ('u64', '404032157549208787'), count: 28
val: ('u64', '43980465121284'), count: 27
val: ('u32', '164'), count: 27
val: ('u64', '1446957302490124'), count: 27
val: ('u64', '1488738744355348'), count: 27
val: ('u64', '1840582465325590'), count: 27
val: ('u64', '12625836528494103352'), count: 26
val: ('u64', '6787551394714920148'), count: 26
val: ('u64', '38482906981138'), count: 26
val: ('u64', '135239930247954'), count: 26
val: ('u64', '1510728976915984'), count: 26
val: ('u64', '5081529687788729793'), count: 26
val: ('u64', '13084594167268299740'), count: 26
val: ('u64', '102254581406999'), count: 26
val: ('u64', '1532719209476630'), count: 26
val: ('u64', '703687441940495'), count: 26
val: ('u64', '787250325670927'), count: 26
val: ('u64', '1486539721099284'), count: 26
val: ('u64', '1514027511800092'), count: 26
val: ('u64', '1540415790872848'), count: 26
val: ('u64', '1540415790872864'), count: 26
val: ('u64', '1496435325751572'), count: 26
val: ('u64', '1498634349007636'), count: 26
val: ('u64', '2278188093282326'), count: 26
val: ('u64', '4476752172246491386'), count: 25
val: ('u64', '21990232560644'), count: 25
val: ('u64', '6584121183518706064'), count: 25
val: ('u64', '10649720286075230081'), count: 25
val: ('u64', '28'), count: 25
val: ('u64', '2433282028043031556'), count: 25
val: ('u64', '516770465175058'), count: 25
val: ('u64', '1078620907099408'), count: 25
val: ('u64', '1079720418727440'), count: 25
val: ('u64', '1433763162953740'), count: 25
val: ('u64', '1437061697837836'), count: 25
val: ('u64', '1440360232721932'), count: 25
val: ('u64', '1443658767606028'), count: 25
val: ('u64', '1450255837374220'), count: 25
val: ('u64', '1453554372258316'), count: 25
val: ('u64', '129742372107794'), count: 25
val: ('u64', '230897441886743'), count: 25
val: ('u64', '1301821767589908'), count: 25
val: ('u64', '1304020790845981'), count: 25
val: ('u64', '2346357814220311'), count: 25
val: ('u64', '1741626418802709'), count: 25
val: ('u64', '1781208837411862'), count: 25
val: ('u64', '14434378200233050206'), count: 24
val: ('u64', '42880953493248'), count: 24
val: ('u64', '9895604652288'), count: 24
val: ('u64', '5825763329062248101'), count: 24
val: ('u64', '6597069768196'), count: 24
val: ('u64', '8796093024260'), count: 24
val: ('u64', '17495364231153397948'), count: 24
val: ('u64', '16590396324043187078'), count: 24
val: ('u64', '8159332221075124997'), count: 24
val: ('u64', '16381146064150494751'), count: 24
val: ('u64', '11372431948001542340'), count: 24
val: ('u64', '12873598980330494200'), count: 24
val: ('u64', '133040906991888'), count: 24
val: ('u64', '8601647483485445669'), count: 24
val: ('u64', '17266919570775477750'), count: 24
val: ('u64', '17922039121703462186'), count: 24
val: ('u64', '13319157584847015273'), count: 24
val: ('u64', '2361070733454535769'), count: 24
val: ('u64', '17008334879502004956'), count: 24
val: ('u64', '2615234817342320622'), count: 24
val: ('u64', '9360619933158943794'), count: 24
val: ('u64', '12253662224792054513'), count: 24
val: ('u64', '7563436345536822254'), count: 24
val: ('u64', '8844445591934582311'), count: 24
val: ('u64', '63'), count: 24
val: ('u64', '10215511313851778562'), count: 24
val: ('u64', '51'), count: 24
val: ('u64', '1084118465239595'), count: 24
val: ('u64', '1085217976867624'), count: 24
val: ('u64', '236337436375242527'), count: 24
val: ('u64', '15925809545985139787'), count: 24
val: ('u64', '283674000032274'), count: 24
val: ('u64', '16222908092068349960'), count: 24
val: ('u64', '17300751243169971508'), count: 24
val: ('u64', '4074422149263508015'), count: 24
val: ('u64', '232735924896336374'), count: 24
val: ('u64', '14938656152367091148'), count: 24
val: ('u64', '11231423843769099888'), count: 24
val: ('u64', '10614125541832435012'), count: 24
val: ('u64', '14181708883219753832'), count: 24
val: ('u64', '18021725256364069089'), count: 24
val: ('u64', '1697146955343849257'), count: 24
val: ('u64', '8242583125433086362'), count: 24
val: ('u64', '2899608543514338824'), count: 24
val: ('u64', '10389208831618503424'), count: 24
val: ('u64', '13673058309665597875'), count: 24
val: ('u64', '53876069773576'), count: 23
val: ('u64', '2060016322158445485'), count: 23
val: ('u64', '36283883725060'), count: 23
val: ('u64', '10793583675805217472'), count: 23
val: ('u64', '4568563953489989740'), count: 23
val: ('u64', '8407803167579751399'), count: 23
val: ('u64', '6035233162407455602'), count: 23
val: ('u64', '139637976760072'), count: 23
val: ('u64', '12874973979857942802'), count: 23
val: ('u64', '5521315951478198545'), count: 23
val: ('u64', '17062143351369946852'), count: 23
val: ('u64', '9820246901184615860'), count: 23
val: ('u64', '11966596477788974868'), count: 23
val: ('u64', '12097158775235289077'), count: 22
val: ('u64', '24189255816712'), count: 22
val: ('u64', '31885837212932'), count: 22
val: ('u64', '14539856435240590400'), count: 22
val: ('u64', '16856647274143003998'), count: 22
val: ('u64', '10460364303053882946'), count: 22
val: ('u64', '16689685159187768074'), count: 22
val: ('u64', '9211445081593382334'), count: 22
val: ('u64', '2725440259312477593'), count: 22
val: ('u64', '2048562602178479272'), count: 22
val: ('u64', '120343201483834698'), count: 22
val: ('u64', '11873469830571137135'), count: 22
val: ('u64', '16425390972942458594'), count: 22
val: ('u64', '8428281289297094902'), count: 22
val: ('u64', '102254581406992'), count: 22
val: ('u64', '141837000016136'), count: 22
val: ('u64', '175921860485140'), count: 22
val: ('i64', '138'), count: 22
val: ('u64', '175921860485139'), count: 22
val: ('u64', '17040068721347235650'), count: 22
val: ('u64', '14540192323883882898'), count: 22
val: ('u64', '1534918232732694'), count: 22
val: ('u64', '1521724093196314'), count: 22
val: ('u64', '500277790753299'), count: 22
val: ('u64', '520069000057875'), count: 22
val: ('u64', '867514674517008'), count: 22
val: ('u64', '2078076976979736'), count: 22
val: ('u64', '1540415790871580'), count: 22
val: ('u64', '14973183094282036544'), count: 22
val: ('u64', '11429806020050747157'), count: 21
val: ('u64', '7001988334154764505'), count: 21
val: ('u64', '26388279072772'), count: 21
val: ('u64', '13194139536384'), count: 21
val: ('u64', '7627954360765671034'), count: 21
val: ('u64', '6027146316751225433'), count: 21
val: ('u64', '4392643963219895754'), count: 21
val: ('u64', '6671596510193214366'), count: 21
val: ('u64', '102254581407007'), count: 21
val: ('u64', '148434069784340'), count: 21
val: ('u64', '62672162797850'), count: 21
val: ('u64', '109951162803204'), count: 21
val: ('u64', '16796476644601923016'), count: 21
val: ('u64', '12995976728580809009'), count: 21
val: ('u64', '2199023256068'), count: 20
val: ('u64', '390326627951377'), count: 20
val: ('u64', '5497558140164'), count: 20
val: ('u64', '18691697676544'), count: 20
val: ('u64', '12094627908356'), count: 20
val: ('u64', '34084860469004'), count: 20
val: ('u64', '39582418609164'), count: 20
val: ('u64', '2230619916444788390'), count: 20
val: ('u64', '12400486014995929589'), count: 20
val: ('u64', '10995116280324'), count: 20
val: ('u64', '7696581396224'), count: 20
val: ('u64', '1486539721099299'), count: 20
val: ('u64', '76965813962240'), count: 20
val: ('u64', '1498634349007651'), count: 20
val: ('u64', '16696833344260503642'), count: 20
val: ('u64', '12834772897077537023'), count: 20
val: ('u64', '994739235223631525'), count: 20
val: ('u64', '101155069778960'), count: 20
val: ('u64', '16776544916791110729'), count: 20
val: ('u64', '2059170146012788148'), count: 20
val: ('u64', '17483193752926515248'), count: 20
val: ('u64', '38'), count: 20
val: ('u64', '15551398757186370577'), count: 20
val: ('u64', '62'), count: 20
val: ('u64', '10825642441266935255'), count: 20
val: ('u64', '4772254417877066457'), count: 20
val: ('u64', '1519525069940252'), count: 20
val: ('u64', '1533818721104674'), count: 20
val: ('u64', '481417650246029890'), count: 20
val: ('u64', '10204395005049140037'), count: 20
val: ('u64', '17009339381642948161'), count: 20
val: ('u64', '5554103258360113733'), count: 20
val: ('u64', '15623969011952665914'), count: 20
val: ('u64', '15089062524500007171'), count: 20
val: ('u64', '27487790700804'), count: 19
val: ('u64', '43980465121323'), count: 19
val: ('u64', '17488724351511742793'), count: 19
val: ('u64', '39582418609156'), count: 19
val: ('u64', '9190978810673496851'), count: 19
val: ('u64', '71468255822106'), count: 19
val: ('u64', '17756895554821204302'), count: 19
val: ('u64', '3971959454689863651'), count: 19
val: ('u64', '3845899007154490022'), count: 19
val: ('u64', '476088534937882'), count: 19
val: ('u64', '5917697101411491378'), count: 19
val: ('u64', '131941395363844'), count: 19
val: ('u64', '15542171270079706936'), count: 19
val: ('u64', '10285376222477888174'), count: 19
val: ('u64', '61572651169809'), count: 19
val: ('u64', '877305747422240528'), count: 19
val: ('u64', '4292234320994743381'), count: 19
val: ('i64', '140'), count: 19
val: ('u64', '4837238526296111186'), count: 19
val: ('u64', '6453498886998389100'), count: 19
val: ('u64', '2187111740239077683'), count: 19
val: ('u64', '727876697757204'), count: 19
val: ('u64', '17039470379272705283'), count: 19
val: ('u64', '8013210429559930811'), count: 19
val: ('u64', '17829434712787171627'), count: 19
val: ('u64', '13609844635355704462'), count: 19
val: ('u64', '10723693178006902193'), count: 19
val: ('u64', '13898529479314358904'), count: 19
val: ('u64', '16164155664028402816'), count: 19
val: ('u64', '394724674463500'), count: 19
val: ('u64', '1540415790872853'), count: 19
val: ('u64', '417814418652177'), count: 19
val: ('u64', '10993848997574897548'), count: 19
val: ('u64', '47279000005380'), count: 18
val: ('u64', '14411274106407275011'), count: 18
val: ('u64', '57174604657672'), count: 18
val: ('u64', '23089744188676'), count: 18
val: ('u64', '3248394460770503028'), count: 18
val: ('u64', '1488738744355363'), count: 18
val: ('u64', '61572651169796'), count: 18
val: ('u64', '2696421360316639161'), count: 18
val: ('u64', '2812678025819075250'), count: 18
val: ('u64', '93458488382733'), count: 18
val: ('u64', '487083651218194'), count: 18
val: ('u64', '18431869087064001423'), count: 18
val: ('u64', '12783853161284751233'), count: 18
val: ('u64', '15155052192518490539'), count: 18
val: ('u64', '308962767477005'), count: 18
val: ('u64', '315559837245207'), count: 18
val: ('u64', '724578162873096'), count: 18
val: ('u64', '373833953530893'), count: 18
val: ('u64', '379331511671053'), count: 18
val: ('u64', '390326627951389'), count: 18
val: ('u64', '1486539721099289'), count: 18
val: ('u64', '1488738744355353'), count: 18
val: ('u64', '1509629465287956'), count: 18
val: ('u64', '1509629465287971'), count: 18
val: ('u64', '1509629465287952'), count: 18
val: ('u64', '1511828488544031'), count: 18
val: ('u64', '1511828488544036'), count: 18
val: ('u64', '1511828488544016'), count: 18
val: ('u64', '1512928000172063'), count: 18
val: ('u64', '1512928000172052'), count: 18
val: ('u64', '1514027511800102'), count: 18
val: ('u64', '1514027511800080'), count: 18
val: ('u64', '1516226535056175'), count: 18
val: ('u64', '1516226535056168'), count: 18
val: ('u64', '1517326046684206'), count: 18
val: ('u64', '1517326046684200'), count: 18
val: ('u64', '1518425558312225'), count: 18
val: ('u64', '1518425558312231'), count: 18
val: ('u64', '1519525069940248'), count: 18
val: ('u64', '1522823604824352'), count: 18
val: ('u64', '1523923116452378'), count: 18
val: ('u64', '1525022628080422'), count: 18
val: ('u64', '1525022628080415'), count: 18
val: ('u64', '1527221651336479'), count: 18
val: ('u64', '1527221651336474'), count: 18
val: ('u64', '1528321162964506'), count: 18
val: ('u64', '1529420674592550'), count: 18
val: ('u64', '1529420674592543'), count: 18
val: ('u64', '1533818721104667'), count: 18
val: ('u64', '1536017744360731'), count: 18
val: ('u64', '1539316279244820'), count: 18
val: ('u64', '1539316279244825'), count: 18
val: ('u64', '1540415790872873'), count: 18
val: ('u64', '1496435325751577'), count: 18
val: ('u64', '1498634349007641'), count: 18
val: ('u64', '786150814042909'), count: 18
val: ('u64', '801543976835357'), count: 18
val: ('u64', '3634687952827901359'), count: 18
val: ('u64', '14218250542193269654'), count: 18
val: ('u64', '10701789009426519427'), count: 18
val: ('u64', '17450573329112963510'), count: 17
val: ('u64', '7696581396228'), count: 17
val: ('u64', '5424100724188568282'), count: 17
val: ('u64', '8184391836281476160'), count: 17
val: ('u64', '14700707472326475153'), count: 17
val: ('u64', '417814418652164'), count: 17
val: ('u64', '2867475439091971494'), count: 17
val: ('u64', '20890720932608'), count: 17
val: ('u64', '47279000005383'), count: 17
val: ('u64', '8191305369603297891'), count: 17
val: ('u64', '12957822557762148515'), count: 17
val: ('u64', '27487790700808'), count: 17
val: ('u64', '11007066070298860069'), count: 17
val: ('u64', '149533581412360'), count: 17
val: ('u64', '928058122184191911'), count: 17
val: ('u64', '15082851388354036231'), count: 17
val: ('u64', '9759949690866816583'), count: 17
val: ('u64', '140737488388100'), count: 17
val: ('u64', '146235046528273'), count: 17
val: ('u64', '148434069784339'), count: 17
val: ('u64', '108851651175184'), count: 17
val: ('u64', '3022483323762603190'), count: 17
val: ('u64', '210006720954134'), count: 17
val: ('u64', '3170724349574686996'), count: 17
val: ('u64', '7613820641803228537'), count: 17
val: ('u64', '26388279072786'), count: 17
val: ('u64', '293569604684568'), count: 17
val: ('u64', '90159953498639'), count: 17
val: ('u64', '1012650209417498'), count: 17
val: ('u64', '299067162824735'), count: 17
val: ('u64', '656408441935128'), count: 17
val: ('u64', '1735029349034521'), count: 17
val: ('u64', '16125297545420784736'), count: 17
val: ('u64', '1386484162948370'), count: 17
val: ('u64', '199011604673821'), count: 17
val: ('u64', '72567767450120'), count: 16
val: ('u64', '76965813962248'), count: 16
val: ('u64', '102254581406984'), count: 16
val: ('u64', '1803664824281338935'), count: 16
val: ('u64', '5279332388172811762'), count: 16
val: ('u64', '129742372107798'), count: 16
val: ('u64', '6365100989899901984'), count: 16
val: ('u64', '15610532100416347476'), count: 16
val: ('u64', '13023302294063180985'), count: 16
val: ('u64', '65970697680128'), count: 16
val: ('u64', '10587827272312612760'), count: 16
val: ('u64', '3062881391065216153'), count: 16
val: ('u64', '6366296982245697355'), count: 16
val: ('u64', '24189255816708'), count: 16
val: ('u64', '8001890998537028479'), count: 16
val: ('u64', '46179488377352'), count: 16
val: ('u64', '101155069778971'), count: 16
val: ('u64', '69269232566020'), count: 16
val: ('u64', '32985348840968'), count: 16
val: ('u64', '72567767450112'), count: 16
val: ('u64', '141837000016157'), count: 16
val: ('u64', '3962535509605348054'), count: 16
val: ('u64', '43980465121297'), count: 16
val: ('u64', '82463372102400'), count: 16
val: ('u64', '50577534889484'), count: 16
val: ('u64', '39582418609169'), count: 16
val: ('u64', '130841883735816'), count: 16
val: ('u64', '74766790706193'), count: 16
val: ('u64', '477188046565900'), count: 16
val: ('u64', '118747255827483'), count: 16
val: ('u64', '146235046528256'), count: 16
val: ('u64', '156130651180548'), count: 16
val: ('u64', '75866302334208'), count: 16
val: ('u64', '8004323621108293509'), count: 16
val: ('u64', '136339441875985'), count: 16
val: ('u64', '62672162797835'), count: 16
val: ('u64', '205608674441988'), count: 16
val: ('u64', '63771674425096'), count: 16
val: ('u64', '677299162867732'), count: 16
val: ('u64', '233096465142807'), count: 16
val: ('u64', '237494511654939'), count: 16
val: ('u64', '728976209385229'), count: 16
val: ('u64', '123145302339602'), count: 16
val: ('u64', '318858372129307'), count: 16
val: ('u64', '102254581406994'), count: 16
val: ('u64', '138538465132050'), count: 16
val: ('u64', '858718581493000'), count: 16
val: ('u64', '46'), count: 16
val: ('u64', '1487639232726806'), count: 16
val: ('u64', '1489838255982871'), count: 16
val: ('u64', '1541515302492205'), count: 16
val: ('u64', '1497534837379094'), count: 16
val: ('u64', '1499733860635159'), count: 16
val: ('u64', '1871368790910485'), count: 16
val: ('u64', '6481674067216154038'), count: 16
val: ('u64', '6509663261803311881'), count: 16
val: ('u64', '4674807930557227822'), count: 16
val: ('u64', '2086270601703419948'), count: 16
val: ('u64', '6761438423610176670'), count: 16
val: ('u64', '16777113381245149658'), count: 16
val: ('u64', '781752767530776'), count: 16
val: ('u64', '8173411933912958581'), count: 16
val: ('u64', '11108110998242258813'), count: 16
val: ('u64', '8988027627290221778'), count: 16
val: ('u64', '11913884427921192055'), count: 16
val: ('u64', '4433178997300477684'), count: 16
val: ('u64', '10340120308351377116'), count: 16
val: ('u64', '9572700583032802285'), count: 16
val: ('u64', '396741283813451738'), count: 16
val: ('u64', '11724230237239570890'), count: 16
val: ('u64', '1663556415827805301'), count: 16
val: ('u64', '14855620591367359132'), count: 16
val: ('u64', '14672461920353068759'), count: 16
val: ('u64', '2775094484072873721'), count: 16
val: ('u64', '16291592883037191672'), count: 16
val: ('u64', '2820275387395126199'), count: 16
val: ('u64', '4516171189582183448'), count: 16
val: ('u64', '225399883746586'), count: 16
val: ('u64', '3876091767365045200'), count: 16
val: ('u64', '5729728227359075643'), count: 16
val: ('u64', '11462690582903731624'), count: 16
val: ('u64', '10303992314892173913'), count: 16
val: ('u64', '2746488176456641767'), count: 16
val: ('u64', '4710516627113035484'), count: 16
val: ('u64', '14772452292228586223'), count: 16
val: ('u64', '11400539333733961433'), count: 16
val: ('u64', '8177386716495267202'), count: 16
val: ('u64', '3080242251690284804'), count: 16
val: ('u64', '17830221332277793721'), count: 16
val: ('u64', '15643013742892927884'), count: 16
val: ('u64', '16086794021148435408'), count: 15
val: ('u64', '25288767444740'), count: 15
val: ('u64', '7135137603522209902'), count: 15
val: ('u64', '2847366339243529927'), count: 15
val: ('u64', '9692854017002441492'), count: 15
val: ('u64', '4398046512128'), count: 15
val: ('u64', '8311124266976595148'), count: 15
val: ('u64', '8249629852490847464'), count: 15
val: ('u64', '10479079407628131442'), count: 15
val: ('u64', '1275967192187507155'), count: 15
val: ('u64', '9176478570052424504'), count: 15
val: ('u64', '16492674420487'), count: 15
val: ('u64', '15824745009649522918'), count: 15
val: ('u64', '4945973918583958092'), count: 15
val: ('u64', '36283883725068'), count: 15
val: ('u64', '15790765708795183900'), count: 15
val: ('u64', '9294675500910437449'), count: 15
val: ('u64', '11092481723449020900'), count: 15
val: ('u64', '3441602257183268649'), count: 15
val: ('u64', '15272785551440768833'), count: 15
val: ('u64', '94558000010760'), count: 15
val: ('u64', '15151198705754877758'), count: 15
val: ('u64', '16809291353205113459'), count: 15
val: ('u64', '11783770316539660641'), count: 15
val: ('u64', '11449109331115840825'), count: 15
val: ('u64', '5964104885366139599'), count: 15
val: ('u64', '93458488382740'), count: 15
val: ('u64', '37383395353111'), count: 15
val: ('u64', '41781441865245'), count: 15
val: ('u64', '46179488377362'), count: 15
val: ('u64', '153931627924488'), count: 15
val: ('u64', '70368744194060'), count: 15
val: ('u64', '11331214967710625838'), count: 15
val: ('u64', '184717953509385'), count: 15
val: ('u64', '92358976754692'), count: 15
val: ('u64', '31885837212939'), count: 15
val: ('u64', '299067162824725'), count: 15
val: ('u64', '146235046528281'), count: 15
val: ('u64', '146235046528282'), count: 15
val: ('u64', '153931627924502'), count: 15
val: ('u64', '61572651169808'), count: 15
val: ('u64', '390326627951368'), count: 15
val: ('u64', '27487790700829'), count: 15
val: ('u64', '197912093045781'), count: 15
val: ('u64', '40'), count: 15
val: ('u64', '106652627919122'), count: 15
val: ('u64', '44'), count: 15
val: ('u64', '775155697762582'), count: 15
val: ('u64', '195713069789712'), count: 15
val: ('u64', '740628533561957438'), count: 15
val: ('u64', '1041237511746325'), count: 15
val: ('u64', '507974372150802'), count: 15
val: ('u64', '514571441918994'), count: 15
val: ('u64', '483785116334103'), count: 15
val: ('u32', '264'), count: 15
val: ('u64', '775155697762581'), count: 15
val: ('u64', '775155697762583'), count: 15
val: ('u64', '1310617860614166'), count: 15
val: ('u64', '1426066581557512'), count: 15
val: ('u64', '1426066581557526'), count: 15
val: ('u64', '1465649000166678'), count: 15
val: ('u64', '355142255854354'), count: 15
val: ('u64', '627821139606296'), count: 15
val: ('u64', '870813209401368'), count: 15
val: ('u64', '1758119093223182'), count: 15
val: ('u64', '1784507372295952'), count: 15
val: ('u64', '1792203953692180'), count: 15
val: ('u64', '2169336442107164'), count: 15
val: ('u64', '2234207628161046'), count: 15
val: ('u64', '1560207000177435'), count: 15
val: ('u64', '1749323000198932'), count: 15
val: ('u64', '1788905418808092'), count: 15
val: ('u64', '1841681976953612'), count: 15
val: ('u64', '2009907256042513'), count: 15
val: ('u64', '1199567186182944'), count: 15
val: ('u64', '1803199069972491'), count: 15
val: ('u64', '127543348851741'), count: 15
val: ('u64', '1225637791070846096'), count: 14
val: ('u64', '3298534884100'), count: 14
val: ('u64', '5133902845492319358'), count: 14
val: ('u64', '387028093067272'), count: 14
val: ('u64', '18691697676572'), count: 14
val: ('u64', '11716881615264026246'), count: 14
val: ('u64', '1345271515661785468'), count: 14
val: ('u64', '11413532002269996633'), count: 14
val: ('u64', '20890720932619'), count: 14
val: ('u64', '13216236219785016657'), count: 14
val: ('u64', '14748642964864597937'), count: 14
val: ('u64', '45079976749316'), count: 14
val: ('u64', '60473139541768'), count: 14
val: ('u64', '9142468193664705415'), count: 14
val: ('u64', '21990232560648'), count: 14
val: ('u64', '9895604652292'), count: 14
val: ('u64', '2677299014954721716'), count: 14
val: ('u64', '78065325590276'), count: 14
val: ('u64', '16492674420484'), count: 14
val: ('u64', '606436877455874907'), count: 14
val: ('u64', '929263289420251089'), count: 14
val: ('u64', '47279000005388'), count: 14
val: ('u64', '5497558140179'), count: 14
val: ('u64', '7535976790584596415'), count: 14
val: ('u64', '101155069778965'), count: 14
val: ('u64', '7113633460826314552'), count: 14
val: ('u64', '17567148905121068024'), count: 14
val: ('u64', '83562883730432'), count: 14
val: ('u64', '13220558627109366807'), count: 14
val: ('u64', '65970697681924'), count: 14
val: ('u64', '175921860485128'), count: 14
val: ('u64', '2283742128855646029'), count: 14
val: ('u64', '179220395369224'), count: 14
val: ('u64', '71468255822080'), count: 14
val: ('u64', '129742372107780'), count: 14
val: ('u64', '188016488393480'), count: 14
val: ('u64', '140737488388113'), count: 14
val: ('u64', '148434069784324'), count: 14
val: ('u64', '244091581423124'), count: 14
val: ('u64', '188016488393476'), count: 14
val: ('u64', '52776558145540'), count: 14
val: ('u64', '234195976770837'), count: 14
val: ('u64', '213305255838243'), count: 14
val: ('u64', '49478023261460'), count: 14
val: ('u64', '128642860479756'), count: 14
val: ('u64', '710284511708685'), count: 14
val: ('u64', '365037860506628'), count: 14
val: ('u64', '421112953536268'), count: 14
val: ('u64', '741070837293576'), count: 14
val: ('u64', '462894395401488'), count: 14
val: ('u64', '8929467853982238041'), count: 14
val: ('u64', '12052290535018165407'), count: 14
val: ('u64', '305664232592926'), count: 14
val: ('u64', '428809534932507'), count: 14
val: ('u64', '330953000037649'), count: 14
val: ('u64', '686095255891985'), count: 14
val: ('u64', '1083018953611528'), count: 14
val: ('u64', '775155697762564'), count: 14
val: ('u64', '1477743628075016'), count: 14
val: ('u64', '1503032395519752'), count: 14
val: ('u64', '1549211883897129'), count: 14
val: ('u64', '654209418679068'), count: 14
val: ('u64', '2073678930468376'), count: 14
val: ('u64', '1373290023411985'), count: 14
val: ('u64', '1964827279293188'), count: 14
val: ('u64', '1972523860689425'), count: 14
val: ('u64', '2171535465363224'), count: 14
val: ('u64', '805114402173937513'), count: 14
val: ('u64', '13487732336764186762'), count: 14
val: ('u64', '4280001328370020367'), count: 14
val: ('u64', '17769936429014634005'), count: 14
val: ('u64', '11459277574695946541'), count: 14
val: ('u64', '2866107521534286248'), count: 14
val: ('u64', '1740526907174664'), count: 14
val: ('u64', '13655581639867720576'), count: 14
val: ('u64', '17450044268509394602'), count: 14
val: ('u64', '90159953498632'), count: 13
val: ('u64', '776799016710660939'), count: 13
val: ('u64', '9286772987678573310'), count: 13
val: ('u64', '8485205323870965883'), count: 13
val: ('u64', '30786325584907'), count: 13
val: ('u64', '2845575871855831341'), count: 13
val: ('u64', '208907209326088'), count: 13
val: ('u64', '43980465121309'), count: 13
val: ('u64', '388127604695313'), count: 13
val: ('u64', '36283883725064'), count: 13
val: ('u64', '390326627951403'), count: 13
val: ('u64', '398023209347597'), count: 13
val: ('u64', '118747255827460'), count: 13
val: ('u64', '399122720975659'), count: 13
val: ('u64', '64871186053888'), count: 13
val: ('u64', '9027982489778093240'), count: 13
val: ('u64', '1515240334076986329'), count: 13
val: ('u64', '46179488377348'), count: 13
val: ('u64', '29'), count: 13
val: ('u64', '69269232566036'), count: 13
val: ('u64', '127543348851716'), count: 13
val: ('u64', '75866302334216'), count: 13
val: ('u64', '83562883730452'), count: 13
val: ('u64', '12432407276130822819'), count: 13
val: ('u64', '96757023266836'), count: 13
val: ('u64', '139637976760084'), count: 13
val: ('u64', '11719199570092610840'), count: 13
val: ('u64', '137438953504004'), count: 13
val: ('u64', '7216812116415048387'), count: 13
val: ('u64', '148434069784352'), count: 13
val: ('u64', '148434069784328'), count: 13
val: ('u64', '6537932804690615392'), count: 13
val: ('u64', '16240763310221722341'), count: 13
val: ('u64', '476088534937877'), count: 13
val: ('u64', '177021372113160'), count: 13
val: ('u64', '177021372113163'), count: 13
val: ('u64', '70368744194052'), count: 13
val: ('u64', '118747255827468'), count: 13
val: ('u64', '73667279078144'), count: 13
val: ('u64', '201210627929864'), count: 13
val: ('i64', '134'), count: 13
val: ('u64', '233096465142792'), count: 13
val: ('u64', '4147472362124766531'), count: 13
val: ('u64', '150633093040401'), count: 13
val: ('u64', '19791209304589'), count: 13
val: ('u64', '13764297334843790753'), count: 13
val: ('u64', '535462162851604'), count: 13
val: ('u64', '7995852325303511722'), count: 13
val: ('u64', '546457279131931'), count: 13
val: ('u64', '311161790733064'), count: 13
val: ('u64', '5879461502748870859'), count: 13
val: ('u64', '10240676418040906023'), count: 13
val: ('u64', '15387105477788167043'), count: 13
val: ('u64', '3582898449924056622'), count: 13
val: ('u64', '12609287046972513905'), count: 13
val: ('u64', '14293651164435'), count: 13
val: ('u64', '2067127006936237744'), count: 13
val: ('u64', '8440668246243817679'), count: 13
val: ('u64', '15147621271319098156'), count: 13
val: ('u64', '352943232598293'), count: 13
val: ('u64', '360639813994517'), count: 13
val: ('u64', '56'), count: 13
val: ('u64', '365037860506645'), count: 13
val: ('u64', '61572651169818'), count: 13
val: ('u64', '203409651185942'), count: 13
val: ('u64', '109951162803229'), count: 13
val: ('u64', '656408441935129'), count: 13
val: ('u64', '216603790722317'), count: 13
val: ('u64', '219902325606422'), count: 13
val: ('u64', '56075093029644'), count: 13
val: ('u64', '337550069805835'), count: 13
val: ('u64', '507974372150792'), count: 13
val: ('u64', '747667907061773'), count: 13
val: ('u64', '31885837212942'), count: 13
val: ('u64', '769658139622413'), count: 13
val: ('u64', '365037860506636'), count: 13
val: ('u64', '390326627951372'), count: 13
val: ('u64', '26'), count: 13
val: ('u64', '613527488441878'), count: 13
val: ('u64', '680597697751830'), count: 13
val: ('u64', '697090372172310'), count: 13
val: ('u64', '717981093104918'), count: 13
val: ('u64', '734473767525398'), count: 13
val: ('u64', '755364488458006'), count: 13
val: ('u64', '805942023347478'), count: 13
val: ('u64', '989560465228817'), count: 13
val: ('u64', '251788162819357'), count: 13
val: ('u64', '844424930328598'), count: 13
val: ('u64', '267181325611792'), count: 13
val: ('u64', '1010451186161424'), count: 13
val: ('u64', '587139209369100'), count: 13
val: ('u64', '400222232603673'), count: 13
val: ('u64', '1033540930350088'), count: 13
val: ('u64', '350744209342231'), count: 13
val: ('u64', '1105009186172168'), count: 13
val: ('u64', '382630046555158'), count: 13
val: ('u64', '1188572069902600'), count: 13
val: ('u64', '454098302377233'), count: 13
val: ('u64', '1360095883875606'), count: 13
val: ('u64', '1376588558296086'), count: 13
val: ('u64', '1463449976910600'), count: 13
val: ('u64', '1526122139708424'), count: 13
val: ('u64', '1540415790872841'), count: 13
val: ('u64', '703687441940531'), count: 13
val: ('u64', '1187472558274580'), count: 13
val: ('u64', '28587302328845'), count: 13
val: ('u64', '1229254000139796'), count: 13
val: ('u64', '1253443255956493'), count: 13
val: ('u64', '1277632511773206'), count: 13
val: ('u64', '1471146558306839'), count: 13
val: ('u64', '131941395363853'), count: 13
val: ('u64', '332052511665700'), count: 13
val: ('u64', '264982302355716'), count: 13
val: ('u64', '1518425558312218'), count: 13
val: ('u64', '931286348943134'), count: 13
val: ('u64', '1739427395546636'), count: 13
val: ('u64', '1775711279271698'), count: 13
val: ('u64', '1905453651379475'), count: 13
val: ('u64', '1393081232716568'), count: 13
val: ('u64', '1575600162969877'), count: 13
val: ('u64', '1695446930425361'), count: 13
val: ('u64', '1840582465325580'), count: 13
val: ('u64', '1139094046641181'), count: 13
val: ('u64', '849922488468753'), count: 13
val: ('u64', '13658302702032323475'), count: 13
val: ('u64', '138538465132049'), count: 13
val: ('u64', '56075093029640'), count: 12
val: ('u64', '63771674425864'), count: 12
val: ('u64', '68169720937992'), count: 12
val: ('u64', '24189255816711'), count: 12
val: ('u64', '17999921399090086941'), count: 12
val: ('u64', '8954906340537193604'), count: 12
val: ('u64', '16966580297247448238'), count: 12
val: ('u64', '894031539582597525'), count: 12
val: ('u64', '109951162803218'), count: 12
val: ('u64', '29686813956879'), count: 12
val: ('u64', '43980465121300'), count: 12
val: ('u64', '9615632160547607980'), count: 12
val: ('u64', '52776558145544'), count: 12
val: ('u64', '37383395353096'), count: 12
val: ('u64', '71468255822087'), count: 12
val: ('u64', '13194139536388'), count: 12
val: ('u64', '14293651164420'), count: 12
val: ('u64', '51677046517512'), count: 12
val: ('u64', '65970697681920'), count: 12
val: ('u64', '68169720937984'), count: 12
val: ('u64', '20890720932650'), count: 12
val: ('u64', '11947421069903910358'), count: 12
val: ('u64', '14775899548974021021'), count: 12
val: ('u64', '9118557071994277285'), count: 12
val: ('u64', '1532187329583188249'), count: 12
val: ('u64', '24189255816716'), count: 12
val: ('u64', '47279000005385'), count: 12
val: ('u64', '30786325584916'), count: 12
val: ('u64', '54975581401608'), count: 12
val: ('u64', '46179488377371'), count: 12
val: ('u64', '1990723494324315395'), count: 12
val: ('u64', '4281316336405434388'), count: 12
val: ('u64', '65970697681940'), count: 12
val: ('u64', '942729038461747028'), count: 12
val: ('u64', '14362552894507667204'), count: 12
val: ('u64', '436506116328712'), count: 12
val: ('u64', '3926778354114988977'), count: 12
val: ('u64', '11779756130812310783'), count: 12
val: ('u64', '35'), count: 12
val: ('u64', '454098302377224'), count: 12
val: ('u64', '118747255827465'), count: 12
val: ('u64', '136339441875976'), count: 12
val: ('u64', '8404237374461061733'), count: 12
val: ('u64', '129742372107784'), count: 12
val: ('u64', '13981132825993736909'), count: 12
val: ('u64', '14169620064722848439'), count: 12
val: ('u32', '2641'), count: 12
val: ('u64', '52919071584095115'), count: 12
val: ('u64', '76965813960968'), count: 12
val: ('u64', '12287127119175554758'), count: 12
val: ('u64', '111050674431236'), count: 12
val: ('u64', '16139176164455508226'), count: 12
val: ('u64', '155031139552520'), count: 12
val: ('u64', '95657511638276'), count: 12
val: ('u64', '184717953507332'), count: 12
val: ('u64', '134140418612484'), count: 12
val: ('u64', '184717953509384'), count: 12
val: ('u64', '96757023266820'), count: 12
val: ('u64', '8257562096857072886'), count: 12
val: ('u64', '7853358598643073540'), count: 12
val: ('u64', '6950580220513806017'), count: 12
val: ('u64', '2834877361686172778'), count: 12
val: ('u64', '11759669134883036209'), count: 12
val: ('u64', '1205857905794501823'), count: 12
val: ('u64', '13504542906581339604'), count: 12
val: ('u64', '10493429018525932629'), count: 12
val: ('u64', '96757023266828'), count: 12
val: ('u64', '253987186075400'), count: 12
val: ('u64', '112150186059276'), count: 12
val: ('u64', '275977418636040'), count: 12
val: ('u64', '279275953520136'), count: 12
val: ('u64', '289171558172424'), count: 12
val: ('u64', '10070494053858673585'), count: 12
val: ('u64', '17375186009987835362'), count: 12
val: ('u64', '16336244331170372538'), count: 12
val: ('u64', '211106232582155'), count: 12
val: ('u64', '6018497304626683430'), count: 12
val: ('u64', '316659348873224'), count: 12
val: ('u64', '218802813978379'), count: 12
val: ('u64', '11126553716731062593'), count: 12
val: ('u64', '139637976760064'), count: 12
val: ('u64', '195713069789700'), count: 12
val: ('u64', '195713069789707'), count: 12
val: ('u64', '156130651180566'), count: 12
val: ('u64', '34084860469016'), count: 12
val: ('u64', '61572651169827'), count: 12
val: ('u64', '61572651169834'), count: 12
val: ('u64', '200111116301837'), count: 12
val: ('u64', '45'), count: 12
val: ('u64', '57'), count: 12
val: ('u64', '69'), count: 12
val: ('u64', '213305255838212'), count: 12
val: ('u64', '153931627924501'), count: 12
val: ('u64', '246290604679172'), count: 12
val: ('u64', '465093418657544'), count: 12
val: ('u64', '245191093048324'), count: 12
val: ('u64', '65'), count: 12
val: ('u64', '6597069768208'), count: 12
val: ('u64', '133040906991884'), count: 12
val: ('u64', '64'), count: 12
val: ('u64', '584940186113032'), count: 12
val: ('u64', '313360813988100'), count: 12
val: ('u64', '337550069800708'), count: 12
val: ('u64', '332052511662600'), count: 12
val: ('u64', '418913930280205'), count: 12
val: ('u64', '427710023304461'), count: 12
val: ('u64', '123145302336260'), count: 12
val: ('u64', '118747255827473'), count: 12
val: ('u64', '4648898228701728946'), count: 12
val: ('u64', '377132488414212'), count: 12
val: ('u64', '382630046554372'), count: 12
val: ('u64', '414515883761668'), count: 12
val: ('u64', '411217348879112'), count: 12
val: ('u64', '857619069864964'), count: 12
val: ('u64', '10182948763846033204'), count: 12
val: ('u64', '319957883757334'), count: 12
val: ('u64', '360639813994522'), count: 12
val: ('u64', '368336395390746'), count: 12
val: ('u64', '510173395406340'), count: 12
val: ('u64', '522268023313412'), count: 12
val: ('u64', '723478651245073'), count: 12
val: ('u64', '1254542767584520'), count: 12
val: ('u64', '494780232612616'), count: 12
val: ('u64', '815837627999761'), count: 12
val: ('u64', '529964604708360'), count: 12
val: ('u64', '506874860522772'), count: 12
val: ('u64', '304564720964892'), count: 12
val: ('u64', '104453604663044'), count: 12
val: ('u64', '891703930333969'), count: 12
val: ('u64', '1078620907099429'), count: 12
val: ('u64', '15675312621750161029'), count: 12
val: ('u64', '12046250634422107500'), count: 12
val: ('u64', '47279000005376'), count: 12
val: ('u64', '6217545565904188787'), count: 12
val: ('u64', '10995116280343'), count: 12
val: ('u64', '1423867558301444'), count: 12
val: ('u64', '9553726153947099746'), count: 12
val: ('u64', '40681930237192'), count: 12
val: ('u64', '188016488393493'), count: 12
val: ('u64', '1573401139713843'), count: 12
val: ('u64', '1574500651341877'), count: 12
val: ('u64', '1574500651341880'), count: 12
val: ('u64', '1574500651341883'), count: 12
val: ('u64', '1588794302506291'), count: 12
val: ('u64', '1589893814134325'), count: 12
val: ('u64', '1589893814134328'), count: 12
val: ('u64', '1589893814134331'), count: 12
val: ('u64', '847723465201932'), count: 12
val: ('u64', '881808325679116'), count: 12
val: ('u64', '962072674528026'), count: 12
val: ('u64', '1018147767556364'), count: 12
val: ('u64', '1871368790910468'), count: 12
val: ('u64', '1872468302538504'), count: 12
val: ('u64', '1885662442074899'), count: 12
val: ('u64', '1972523860689412'), count: 12
val: ('u64', '1981319953713672'), count: 12
val: ('u64', '2080276000235020'), count: 12
val: ('u64', '2078076976980498'), count: 12
val: ('u64', '11803761747969481407'), count: 12
val: ('u64', '1377688069923080'), count: 12
val: ('u64', '2230909093276941'), count: 12
val: ('u64', '1575600162969860'), count: 12
val: ('u64', '1757019581593352'), count: 12
val: ('u64', '1838383442069508'), count: 12
val: ('u64', '13928704840151612708'), count: 12
val: ('u64', '15810729701965604402'), count: 12
val: ('u64', '10095299580369680169'), count: 12
val: ('u64', '14234074704174571561'), count: 12
val: ('u64', '16548880349276071764'), count: 12
val: ('u64', '10295785148918615141'), count: 12
val: ('u64', '4783568636088809240'), count: 12
val: ('u64', '5771995559389741749'), count: 12
val: ('u64', '10323359556389130384'), count: 12
val: ('u64', '5122062870952364236'), count: 12
val: ('u64', '2708474982438960163'), count: 12
val: ('u64', '3627852477246295951'), count: 12
val: ('u64', '8144702854823364613'), count: 12
val: ('u64', '14040911570082410700'), count: 12
val: ('u64', '10043991166337750817'), count: 12
val: ('u64', '11656309917549401745'), count: 12
val: ('u64', '5940612501910617763'), count: 12
val: ('u64', '15882676249482585551'), count: 12
val: ('u64', '17580095559134229065'), count: 12
val: ('u64', '31930215478245063'), count: 12
val: ('u64', '9746055599712566997'), count: 12
val: ('u64', '2738048607232640023'), count: 12
val: ('u64', '1576699674597892'), count: 12
val: ('u64', '1614083069950980'), count: 12
val: ('u64', '1627277209487368'), count: 12
val: ('u64', '14370628999745966943'), count: 12
val: ('u64', '8804282593811330148'), count: 12
val: ('u64', '3608348738724650689'), count: 12
val: ('u64', '1866970744398340'), count: 12
val: ('u64', '10034807039410817090'), count: 12
val: ('u64', '15044740857603137572'), count: 12
val: ('u64', '1308353159349108388'), count: 12
val: ('u64', '2408830999033671928'), count: 12
val: ('u64', '5136511905589353800'), count: 12
val: ('u64', '5580990577475290504'), count: 12
val: ('u64', '7096979896533235727'), count: 12
val: ('u64', '6913908574129116441'), count: 12
val: ('u64', '7789826481799205866'), count: 12
val: ('u64', '12957086615148490231'), count: 12
val: ('u64', '11003014060321530048'), count: 12
val: ('u64', '16774962752918647333'), count: 12
val: ('u64', '10659334186050034561'), count: 12
val: ('u64', '9457026777339179755'), count: 12
val: ('u64', '4544228965915456135'), count: 12
val: ('u64', '1067608133802981410'), count: 12
val: ('u64', '8595274124016006608'), count: 12
val: ('u64', '16841244036851436105'), count: 12
val: ('u64', '3917300483192699793'), count: 12
val: ('u64', '3496056143852118910'), count: 12
val: ('u64', '10593001795407527673'), count: 12
val: ('u64', '15686500987659824503'), count: 12
val: ('u64', '5283973767895568689'), count: 12
val: ('u64', '1547888608723548863'), count: 12
val: ('u64', '2367726410583117758'), count: 12
val: ('u64', '4878129135742568893'), count: 12
val: ('u64', '15161189574842561247'), count: 12
val: ('u64', '3062332959642491603'), count: 12
val: ('u64', '12759911037599728509'), count: 12
val: ('u64', '13694241670108992127'), count: 12
val: ('u64', '6631359877958758554'), count: 12
val: ('u64', '4252406643031623735'), count: 12
val: ('u64', '5272496431883259033'), count: 12
val: ('u64', '8922222587701540318'), count: 12
val: ('u64', '423311976746248'), count: 12
val: ('u64', '8971782258949919868'), count: 12
val: ('u64', '12380491130370076479'), count: 12
val: ('u64', '739528546264320629'), count: 12
val: ('u64', '15726501497275725113'), count: 12
val: ('u64', '13855678365807108592'), count: 12
val: ('u64', '6223517298224156588'), count: 12
val: ('u64', '7296557177527271368'), count: 12
val: ('u64', '681697209331976'), count: 12
val: ('u64', '3182368148608914045'), count: 12
val: ('u64', '12891875477337248884'), count: 12
val: ('u64', '15197581915783709532'), count: 12
val: ('u64', '5910653151611911209'), count: 12
val: ('u64', '275977418618124'), count: 12
val: ('u64', '9253785137309817228'), count: 12
val: ('u64', '98956046522884'), count: 11
val: ('u64', '3904568959873169727'), count: 11
val: ('u64', '30786325584900'), count: 11
val: ('u64', '64871186053892'), count: 11
val: ('u64', '36283883725092'), count: 11
val: ('u64', '37383395353155'), count: 11
val: ('u64', '221001837234440'), count: 11
val: ('u64', '38482906981173'), count: 11
val: ('u64', '35184372097046'), count: 11
val: ('u64', '42880953493252'), count: 11
val: ('u64', '18691697676594'), count: 11
val: ('u64', '12939261690712404682'), count: 11
val: ('u64', '37383395353092'), count: 11
val: ('u64', '3734646146380294037'), count: 11
val: ('u64', '41781441865224'), count: 11
val: ('u64', '1492037279237384'), count: 11
val: ('u64', '198151955403679112'), count: 11
val: ('u64', '93458488382724'), count: 11
val: ('u64', '43980465121314'), count: 11
val: ('u64', '1542614814119688'), count: 11
val: ('u64', '15259206906005091644'), count: 11
val: ('u64', '1501932883889672'), count: 11
val: ('u64', '14668279444924745405'), count: 11
val: ('u64', '109951162803224'), count: 11
val: ('u64', '2272228798949461470'), count: 11
val: ('u64', '64871186053908'), count: 11
val: ('u64', '70368744194056'), count: 11
val: ('u64', '71468255822100'), count: 11
val: ('u64', '73667279078152'), count: 11
val: ('u64', '13589019882632885103'), count: 11
val: ('u64', '5120889382422864651'), count: 11
val: ('u64', '133040906991908'), count: 11
val: ('u64', '134140418619971'), count: 11
val: ('u64', '135239930247989'), count: 11
val: ('u64', '34084860469000'), count: 11
val: ('u64', '141837000016171'), count: 11
val: ('u64', '36283883725069'), count: 11
val: ('u64', '90159953498633'), count: 11
val: ('u64', '134140418619912'), count: 11
val: ('u64', '23089744188684'), count: 11
val: ('u64', '60473139541788'), count: 11
val: ('u64', '104453604663048'), count: 11
val: ('u64', '134140418619908'), count: 11
val: ('u64', '11661597402512465815'), count: 11
val: ('u64', '115448720943380'), count: 11
val: ('u64', '122045790711560'), count: 11
val: ('u64', '124244813967624'), count: 11
val: ('u64', '128642860479752'), count: 11
val: ('u64', '142936511644168'), count: 11
val: ('u64', '146235046528275'), count: 11
val: ('u64', '160528697692680'), count: 11
val: ('u64', '62672162797841'), count: 11
val: ('u64', '151732604668424'), count: 11
val: ('u64', '3113212648447101016'), count: 11
val: ('u64', '158329674436616'), count: 11
val: ('u64', '14847365207056229396'), count: 11
val: ('u64', '175921860485141'), count: 11
val: ('u64', '133040906988552'), count: 11
val: ('u64', '157230162808580'), count: 11
val: ('u64', '72567767450116'), count: 11
val: ('u64', '96757023266855'), count: 11
val: ('u64', '200111116301832'), count: 11
val: ('u64', '114349209315346'), count: 11
val: ('u64', '17301708415306768961'), count: 11
val: ('u64', '214404767466248'), count: 11
val: ('u64', '216603790722312'), count: 11
val: ('u64', '11775030186217895913'), count: 11
val: ('u64', '17953238150780935354'), count: 11
val: ('u64', '517869976803088'), count: 11
val: ('u64', '2759432214809508044'), count: 11
val: ('u64', '7700966758263132712'), count: 11
val: ('u64', '518969488431120'), count: 11
val: ('u64', '231996953514760'), count: 11
val: ('u64', '178120883741209'), count: 11
val: ('u64', '15393162792467'), count: 11
val: ('u64', '6804665284764175116'), count: 11
val: ('u64', '13067586092562941174'), count: 11
val: ('u64', '175921860485124'), count: 11
val: ('u64', '6436203240476285557'), count: 11
val: ('u64', '267181325611784'), count: 11
val: ('u64', '15917786231568379776'), count: 11
val: ('u64', '4572053123462473845'), count: 11
val: ('u64', '134140418619937'), count: 11
val: ('u64', '277076930264072'), count: 11
val: ('u64', '202310139557907'), count: 11
val: ('u64', '31885837212949'), count: 11
val: ('u64', '284773511660296'), count: 11
val: ('u64', '294669116312584'), count: 11
val: ('u64', '300166674452744'), count: 11
val: ('u64', '1322349904441341975'), count: 11
val: ('u64', '455106429049962661'), count: 11
val: ('u64', '308962767477000'), count: 11
val: ('u64', '191315023277572'), count: 11
val: ('u64', '11354255387520332023'), count: 11
val: ('u64', '16682157842818573566'), count: 11
val: ('u64', '1313653482104680718'), count: 11
val: ('u64', '14759690919221511210'), count: 11
val: ('u64', '186916976765462'), count: 11
val: ('u64', '193514046533654'), count: 11
val: ('u64', '196812581417745'), count: 11
val: ('u64', '78065325590286'), count: 11
val: ('u64', '213305255838225'), count: 11
val: ('u64', '131941395363858'), count: 11
val: ('u64', '207807697698052'), count: 11
val: ('u64', '451899279121161'), count: 11
val: ('u64', '246290604679196'), count: 11
val: ('u64', '207807697698059'), count: 11
val: ('u64', '244091581421576'), count: 11
val: ('u64', '257285720959512'), count: 11
val: ('u64', '483785116334101'), count: 11
val: ('u64', '509073883778824'), count: 11
val: ('u64', '133040906991917'), count: 11
val: ('u64', '9542729502321375797'), count: 11
val: ('u64', '13190454054929954930'), count: 11
val: ('u64', '749866930317846'), count: 11
val: ('u64', '536561674479624'), count: 11
val: ('u64', '14295149886361830733'), count: 11
val: ('u64', '15686151923202741318'), count: 11
val: ('u64', '809240558231573'), count: 11
val: ('u64', '69269232566033'), count: 11
val: ('u64', '129742372107793'), count: 11
val: ('u64', '85761906986500'), count: 11
val: ('u64', '85761906986509'), count: 11
val: ('u64', '120946279083539'), count: 11
val: ('u64', '846623953584648'), count: 11
val: ('u64', '157230162808587'), count: 11
val: ('u64', '116548232571409'), count: 11
val: ('u64', '7669501477375030319'), count: 11
val: ('u64', '16522619243180527227'), count: 11
val: ('u64', '123145302339596'), count: 11
val: ('u64', '5098636699629875015'), count: 11
val: ('u64', '10027360935117301840'), count: 11
val: ('u64', '429909046560524'), count: 11
val: ('u64', '14136480270949104280'), count: 11
val: ('u64', '7420857291749897525'), count: 11
val: ('u64', '14649699547114877838'), count: 11
val: ('u64', '4350638003848931720'), count: 11
val: ('u64', '463993907029516'), count: 11
val: ('u64', '238594023282975'), count: 11
val: ('u64', '245191093051166'), count: 11
val: ('u64', '988460953600776'), count: 11
val: ('u64', '369435907018756'), count: 11
val: ('u64', '17773097072077411399'), count: 11
val: ('u64', '17124028428310328454'), count: 11
val: ('u64', '531064116339472'), count: 11
val: ('u64', '11099712614952903469'), count: 11
val: ('u64', '5737996033656420516'), count: 11
val: ('u64', '7176679705016537445'), count: 11
val: ('u64', '5622524012353255871'), count: 11
val: ('u64', '6639297281330675778'), count: 11
val: ('u64', '11350779023964972482'), count: 11
val: ('u64', '667403558215437'), count: 11
val: ('u64', '672901116355597'), count: 11
val: ('u64', '328753976781593'), count: 11
val: ('u64', '336450558177817'), count: 11
val: ('u64', '691592814032141'), count: 11
val: ('u64', '456297325633303'), count: 11
val: ('u64', '704786953568525'), count: 11
val: ('u64', '327654465153561'), count: 11
val: ('u64', '392525651207449'), count: 11
val: ('u64', '371634930274838'), count: 11
val: ('u64', '414515883768092'), count: 11
val: ('u64', '1170979883854088'), count: 11
val: ('u64', '6973033394859767973'), count: 11
val: ('u64', '14596817001086251076'), count: 11
val: ('u64', '742170348921613'), count: 11
val: ('u64', '421112953536287'), count: 11
val: ('u64', '838091385807022'), count: 11
val: ('u64', '11368553906447456733'), count: 11
val: ('u64', '403520767487766'), count: 11
val: ('u64', '435406604700698'), count: 11
val: ('u64', '763061069854236'), count: 11
val: ('u64', '1201766209438984'), count: 11
val: ('u64', '760862046598161'), count: 11
val: ('u64', '442003674468893'), count: 11
val: ('u64', '1230353511767816'), count: 11
val: ('u64', '782852279158797'), count: 11
val: ('u64', '452998790749198'), count: 11
val: ('u64', '793847395439117'), count: 11
val: ('u64', '469491465169690'), count: 11
val: ('u64', '7685540072504532916'), count: 11
val: ('u64', '474074270092031825'), count: 11
val: ('u64', '830131279164173'), count: 11
val: ('u64', '1960788162479839561'), count: 11
val: ('u64', '14250610978135412134'), count: 11
val: ('u64', '856519558236941'), count: 11
val: ('u64', '566248488436503'), count: 11
val: ('u64', '867514674517261'), count: 11
val: ('u64', '1462350465282568'), count: 11
val: ('u64', '880708814053654'), count: 11
val: ('u64', '135239930247949'), count: 11
val: ('u64', '905997581498381'), count: 11
val: ('u64', '921390744290838'), count: 11
val: ('u64', '666304046587417'), count: 11
val: ('u64', '61572651169792'), count: 11
val: ('u64', '1051133116398610'), count: 11
val: ('u64', '753165465201931'), count: 11
val: ('u64', '787250325670963'), count: 11
val: ('u64', '748767418689817'), count: 11
val: ('u64', '1079720418727463'), count: 11
val: ('u64', '1084118465239617'), count: 11
val: ('u64', '1085217976867646'), count: 11
val: ('u64', '1070924325703185'), count: 11
val: ('u64', '1192970116414735'), count: 11
val: ('u64', '34084860468996'), count: 11
val: ('u64', '1203965232695057'), count: 11
val: ('u64', '1240249116420120'), count: 11
val: ('u64', '1264438372236813'), count: 11
val: ('u64', '1288627628053521'), count: 11
val: ('u64', '1299622744333837'), count: 11
val: ('u64', '1333707604802835'), count: 11
val: ('u64', '1339205162942995'), count: 11
val: ('u64', '1346901744339213'), count: 11
val: ('u64', '1352399302479373'), count: 11
val: ('u64', '1365593442015761'), count: 11
val: ('u64', '1371091000155917'), count: 11
val: ('u64', '1399678302484755'), count: 11
val: ('u64', '1405175860624915'), count: 11
val: ('u64', '1412872442021133'), count: 11
val: ('u64', '1418370000161293'), count: 11
val: ('u64', '127543348851734'), count: 11
val: ('u64', '1433763162953752'), count: 11
val: ('u64', '1437061697837861'), count: 11
val: ('u64', '1440360232721957'), count: 11
val: ('u64', '1443658767606053'), count: 11
val: ('u64', '1446957302490149'), count: 11
val: ('u64', '1450255837374259'), count: 11
val: ('u64', '1453554372258356'), count: 11
val: ('u64', '1431564139697681'), count: 11
val: ('u64', '1460151442026509'), count: 11
val: ('u64', '53876069773597'), count: 11
val: ('u64', '1472246069934865'), count: 11
val: ('u64', '1514027511800084'), count: 11
val: ('u64', '129742372107817'), count: 11
val: ('u64', '191315023277585'), count: 11
val: ('u64', '230897441886761'), count: 11
val: ('u64', '282574488404290'), count: 11
val: ('u64', '282574488404261'), count: 11
val: ('u64', '283674000032321'), count: 11
val: ('u64', '325455441897485'), count: 11
val: ('u64', '346346162830108'), count: 11
val: ('u64', '377132488414999'), count: 11
val: ('u64', '381530534927127'), count: 11
val: ('u64', '385928581439256'), count: 11
val: ('u64', '394724674463517'), count: 11
val: ('u64', '500277790754573'), count: 11
val: ('u64', '520069000059149'), count: 11
val: ('u64', '553054348900123'), count: 11
val: ('u64', '567348000064543'), count: 11
val: ('u64', '573945069832729'), count: 11
val: ('u64', '583840674485024'), count: 11
val: ('u64', '593736279137304'), count: 11
val: ('u64', '604731395417623'), count: 11
val: ('u64', '620124558210073'), count: 11
val: ('u64', '638816255886617'), count: 11
val: ('u64', '645413325654801'), count: 11
val: ('u64', '658607465190668'), count: 11
val: ('u64', '2304371360480502491'), count: 11
val: ('u64', '722716227041302546'), count: 11
val: ('u64', '665204534959381'), count: 11
val: ('u64', '706985976824595'), count: 11
val: ('u64', '792747883809556'), count: 11
val: ('u64', '10439084330319281010'), count: 11
val: ('u64', '14797831143506864906'), count: 11
val: ('u64', '12116452167459897331'), count: 11
val: ('u64', '3647579081048198563'), count: 11
val: ('u64', '867514674517331'), count: 11
val: ('u64', '18432473681965218284'), count: 11
val: ('u64', '11476002094001787074'), count: 11
val: ('u64', '899400511730194'), count: 11
val: ('u64', '949978046619672'), count: 11
val: ('u64', '986261930344745'), count: 11
val: ('u64', '1743825442058772'), count: 11
val: ('u64', '5989526558940951548'), count: 11
val: ('u64', '9662982313591684793'), count: 11
val: ('u64', '1025844348953871'), count: 11
val: ('u64', '1763616651363346'), count: 11
val: ('u64', '1770213721131534'), count: 11
val: ('u64', '1036839465234195'), count: 11
val: ('u64', '1114904790824468'), count: 11
val: ('u64', '1801000046716434'), count: 11
val: ('u64', '1121501860592655'), count: 11
val: ('u64', '1808696628112662'), count: 11
val: ('u64', '1128098930360851'), count: 11
val: ('u64', '1817492721136914'), count: 11
val: ('u64', '1137994535013143'), count: 11
val: ('u64', '1825189302533142'), count: 11
val: ('u64', '1833985395557397'), count: 11
val: ('u64', '1155586721061660'), count: 11
val: ('u64', '1841681976953625'), count: 11
val: ('u64', '1163283302457873'), count: 11
val: ('u64', '1854876116490001'), count: 11
val: ('u64', '1179775976878370'), count: 11
val: ('u64', '1898856581611287'), count: 11
val: ('u64', '1917548279287825'), count: 11
val: ('u64', '1923045837427976'), count: 11
val: ('u64', '4435754066555936944'), count: 11
val: ('u64', '14994209300710378476'), count: 11
val: ('u64', '1301821767589984'), count: 11
val: ('u64', '1304020790846047'), count: 11
val: ('u64', '2117659395589651'), count: 11
val: ('u64', '2124256465357843'), count: 11
val: ('u64', '2136351093266187'), count: 11
val: ('u64', '1318314442010402'), count: 11
val: ('u64', '1331508581546776'), count: 11
val: ('u64', '1368891976899878'), count: 11
val: ('u64', '15256762164899289007'), count: 11
val: ('u64', '3692587886597676918'), count: 11
val: ('u64', '2207819349088282'), count: 11
val: ('u64', '2217714953740559'), count: 11
val: ('u64', '1400777814112794'), count: 11
val: ('u64', '1411772930393105'), count: 11
val: ('u64', '2224312023508758'), count: 11
val: ('u64', '2227610558392849'), count: 11
val: ('u64', '1423867558301477'), count: 11
val: ('u64', '1437061697837860'), count: 11
val: ('u64', '2241904209557261'), count: 11
val: ('u64', '1444758279234072'), count: 11
val: ('u64', '2256197860721677'), count: 11
val: ('u64', '1455753395514394'), count: 11
val: ('u64', '1461250953654558'), count: 11
val: ('u64', '1500833372263699'), count: 11
val: ('u64', '1507430442031887'), count: 11
val: ('u64', '1530520186220596'), count: 11
val: ('u64', '1587694790878228'), count: 11
val: ('u64', '1616282093207053'), count: 11
val: ('u64', '1647068418791954'), count: 11
val: ('u64', '1694347418797346'), count: 11
val: ('u64', '1739427395545616'), count: 11
val: ('u64', '1721835209498142'), count: 11
val: ('u64', '16023333284210682817'), count: 11
val: ('u64', '1657853972532797026'), count: 11
val: ('u64', '6298312855511244985'), count: 11
val: ('u64', '6035132143115250594'), count: 11
val: ('u64', '1801000046713616'), count: 11
val: ('u64', '1769114209503522'), count: 11
val: ('u64', '13704181789732057767'), count: 11
val: ('u64', '16945906229708942649'), count: 11
val: ('u64', '1967026302549261'), count: 11
val: ('u64', '1982419465341708'), count: 11
val: ('u64', '2003310186274335'), count: 11
val: ('u64', '2050589186279706'), count: 11
val: ('u64', '2065982349072154'), count: 11
val: ('u64', '2067081860700168'), count: 11
val: ('u64', '2072579418840347'), count: 11
val: ('u64', '2173734488618764'), count: 11
val: ('u64', '14047247172246716139'), count: 11
val: ('u64', '4953961972480585876'), count: 11
val: ('u64', '2181431070015501'), count: 11
val: ('u64', '2194625209551884'), count: 11
val: ('u64', '2210018372344337'), count: 11
val: ('u64', '2229809581648912'), count: 11
val: ('u64', '11867072553745741250'), count: 11
val: ('u64', '2258396883977740'), count: 11
val: ('u64', '2278188093282342'), count: 11
val: ('u64', '2277088581654284'), count: 11
val: ('u64', '2282586139794449'), count: 11
val: ('u64', '2310073930495248'), count: 11
val: ('u64', '2321069046775564'), count: 11
val: ('u64', '2346357814220327'), count: 11
val: ('u64', '2344158790964236'), count: 11
val: ('u64', '2352954883988497'), count: 11
val: ('u64', '2422224116554508'), count: 11
val: ('u64', '2436517767718924'), count: 11
val: ('u64', '217703302350349'), count: 11
val: ('u64', '225399883746578'), count: 11
val: ('u64', '237494511654971'), count: 11
val: ('u64', '250688651191333'), count: 11
val: ('u64', '262783279099678'), count: 11
val: ('u64', '559651418668304'), count: 11
val: ('u64', '583840674485010'), count: 11
val: ('u64', '639915767514640'), count: 11
val: ('u64', '709185000080655'), count: 11
val: ('u64', '754264976829969'), count: 11
val: ('u64', '787250325669644'), count: 11
val: ('u64', '5642806682319149218'), count: 11
val: ('u64', '2953898968394986710'), count: 11
val: ('u64', '820235674511899'), count: 11
val: ('u64', '881808325681683'), count: 11
val: ('u64', '905997581498391'), count: 11
val: ('u64', '930186837315097'), count: 11
val: ('u64', '962072674528021'), count: 11
val: ('u64', '1031341907094042'), count: 11
val: ('u64', '1066526279191076'), count: 11
val: ('u64', '1080819930355484'), count: 11
val: ('u64', '1117103814080552'), count: 11
val: ('u64', '1152288186177571'), count: 11
val: ('u64', '1185273535018526'), count: 11
val: ('u64', '1386484162948390'), count: 11
val: ('u64', '1460151442026525'), count: 11
val: ('u64', '1543714325756953'), count: 11
val: ('u64', '1565704558317589'), count: 11
val: ('u64', '1578898697853962'), count: 11
val: ('u64', '1606386488554763'), count: 11
val: ('u64', '1641570860651789'), count: 11
val: ('u64', '1663561093212429'), count: 11
val: ('u64', '1673456697864715'), count: 11
val: ('u64', '1702044000193559'), count: 11
val: ('u64', '1718536674614036'), count: 11
val: ('u64', '1726233256010263'), count: 11
val: ('u64', '1750422511826957'), count: 11
val: ('u64', '1759218604851211'), count: 11
val: ('u64', '1780109325783821'), count: 11
val: ('u64', '1788905418808075'), count: 11
val: ('u64', '1809796139740695'), count: 11
val: ('u64', '1855975628118028'), count: 11
val: ('u64', '1870269279282444'), count: 11
val: ('u64', '1875766837422609'), count: 11
val: ('u64', '1892259511843098'), count: 11
val: ('u64', '2328765628171791'), count: 11
val: ('u64', '2335362697939987'), count: 11
val: ('u64', '2349656349104399'), count: 11
val: ('u64', '2363950000268819'), count: 11
val: ('u64', '2370547070037017'), count: 11
val: ('u64', '2380442674689309'), count: 11
val: ('u64', '2401333395621906'), count: 11
val: ('u64', '2407930465390102'), count: 11
val: ('u64', '2531075767729675'), count: 11
val: ('u64', '2537672837497867'), count: 11
val: ('u64', '2547568442150155'), count: 11
val: ('u64', '2557464046802443'), count: 11
val: ('u64', '2564061116570635'), count: 11
val: ('u64', '2589349884015371'), count: 11
val: ('u64', '2630031814252555'), count: 11
val: ('u64', '2650922535185163'), count: 11
val: ('u64', '2668514721233675'), count: 11
val: ('u64', '2681708860770059'), count: 11
val: ('u64', '2752077604964108'), count: 11
val: ('u64', '2764172232872465'), count: 11
val: ('u64', '2770769302640651'), count: 11
val: ('u64', '2782863930549004'), count: 11
val: ('u64', '2794958558457361'), count: 11
val: ('u64', '2801555628225547'), count: 11
val: ('u64', '2813650256133899'), count: 11
val: ('u64', '2823545860786188'), count: 11
val: ('u64', '2827943907298321'), count: 11
val: ('u64', '2834540977066507'), count: 11
val: ('u64', '2842237558462731'), count: 11
val: ('u64', '2852133163115020'), count: 11
val: ('u64', '2860929256139281'), count: 11
val: ('u64', '2867526325907467'), count: 11
val: ('u64', '2878521442187788'), count: 11
val: ('u64', '2887317535212049'), count: 11
val: ('u64', '2893914604980235'), count: 11
val: ('u64', '2904909721260556'), count: 11
val: ('u64', '2913705814284817'), count: 11
val: ('u64', '2920302884053003'), count: 11
val: ('u64', '2932397511961355'), count: 11
val: ('u64', '2942293116613644'), count: 11
val: ('u64', '2946691163125777'), count: 11
val: ('u64', '2953288232893963'), count: 11
val: ('u64', '2966482372430347'), count: 11
val: ('u64', '3111617907330575'), count: 11
val: ('u64', '3273246116651279'), count: 11
val: ('u64', '3320525116656655'), count: 11
val: ('u64', '3355709488753683'), count: 11
val: ('u64', '3410685070155282'), count: 11
val: ('u64', '3618492767853327'), count: 11
val: ('u64', '3729543442284590'), count: 11
val: ('u64', '3781220488802102'), count: 11
val: ('u64', '288072046544399'), count: 11
val: ('u64', '306763744220948'), count: 11
val: ('u64', '389227116323355'), count: 11
val: ('u64', '579442627972882'), count: 11
val: ('u64', '610228953557779'), count: 11
val: ('u64', '633318697746455'), count: 11
val: ('u64', '684995744263957'), count: 11
val: ('u64', '844424930328607'), count: 11
val: ('u64', '874111744285466'), count: 11
val: ('u64', '903798558242329'), count: 11
val: ('u64', '935684395455274'), count: 11
val: ('u64', '971968279180332'), count: 11
val: ('u64', '1007152651277335'), count: 11
val: ('u64', '1030242395466005'), count: 11
val: ('u64', '199011604673809'), count: 11
val: ('u64', '1057730186166807'), count: 11
val: ('u64', '1081919441983506'), count: 11
val: ('u64', '205608674441996'), count: 11
val: ('u64', '1103909674544147'), count: 11
val: ('u64', '4299430296350620244'), count: 11
val: ('u64', '13101175995894793878'), count: 11
val: ('u64', '1168780860598043'), count: 11
val: ('u64', '1189671581530634'), count: 11
val: ('u64', '1214960348975371'), count: 11
val: ('u64', '1253443255956521'), count: 11
val: ('u64', '16825495667627210476'), count: 11
val: ('u64', '2281856370131766747'), count: 11
val: ('u64', '1279831535029293'), count: 11
val: ('u64', '727876697757202'), count: 11
val: ('u64', '733374255897364'), count: 11
val: ('u64', '746568395433748'), count: 11
val: ('u64', '11552238224964240365'), count: 11
val: ('u64', '1612983558322957'), count: 11
val: ('u64', '1623978674603276'), count: 11
val: ('u64', '1628376721115409'), count: 11
val: ('u64', '1634973790883595'), count: 11
val: ('u64', '138538465129484'), count: 11
val: ('u64', '3606651220741549233'), count: 11
val: ('u64', '11639991681463942019'), count: 11
val: ('u64', '1642670372279819'), count: 11
val: ('u64', '1652565976932108'), count: 11
val: ('u64', '1661362069956369'), count: 11
val: ('u64', '1667959139724555'), count: 11
val: ('u64', '1675655721120779'), count: 11
val: ('u64', '8257886432440943814'), count: 11
val: ('u64', '1114096868148586161'), count: 11
val: ('u64', '1686650837401100'), count: 11
val: ('u64', '1702044000193547'), count: 11
val: ('u64', '1709740581589771'), count: 11
val: ('u64', '1721835209498124'), count: 11
val: ('u64', '1741626418802742'), count: 11
val: ('u64', '380431023299084'), count: 11
val: ('u64', '1747123976942865'), count: 11
val: ('u64', '426610511676433'), count: 11
val: ('u64', '1760318116479245'), count: 11
val: ('u64', '1781208837411878'), count: 11
val: ('u64', '1779009814155788'), count: 11
val: ('u64', '288072046544401'), count: 11
val: ('u64', '310062279105049'), count: 11
val: ('u64', '1790004930436113'), count: 11
val: ('u64', '315559837245216'), count: 11
val: ('u64', '321057395385369'), count: 11
val: ('u64', '326554953525533'), count: 11
val: ('u64', '1819691744392973'), count: 11
val: ('u64', '1840582465325606'), count: 11
val: ('u64', '1838383442069516'), count: 11
val: ('u64', '1849378558349841'), count: 11
val: ('u64', '1871368790910475'), count: 11
val: ('u64', '1879065372306701'), count: 11
val: ('u64', '1896657558355212'), count: 11
val: ('u64', '1901055604867345'), count: 11
val: ('u64', '1921946325799947'), count: 11
val: ('u64', '1929642907196173'), count: 11
val: ('u64', '1952732651384843'), count: 11
val: ('u64', '1968125814177292'), count: 11
val: ('u64', '25288767444744'), count: 10
val: ('u64', '123145302339588'), count: 10
val: ('u64', '81363860474376'), count: 10
val: ('u64', '10041081509663128001'), count: 10
val: ('u64', '12968620188419884836'), count: 10
val: ('u64', '129742372107792'), count: 10
val: ('u64', '4482972917095000032'), count: 10
val: ('u64', '42880953493256'), count: 10
val: ('u64', '17290476147260971154'), count: 10
val: ('u64', '51677046517504'), count: 10
val: ('u64', '41781441865216'), count: 10
val: ('u64', '17530321025153968714'), count: 10
val: ('u64', '42880953493273'), count: 10
val: ('u64', '54975581401600'), count: 10
val: ('u64', '4398046512132'), count: 10
val: ('u64', '390326627951407'), count: 10
val: ('u64', '75866302334215'), count: 10
val: ('u64', '8200252652928346298'), count: 10
val: ('u64', '34'), count: 10
val: ('u32', '1564'), count: 10
val: ('u64', '37383395353129'), count: 10
val: ('u64', '5202136776330774571'), count: 10
val: ('u64', '23089744188680'), count: 10
val: ('u64', '15393162792448'), count: 10
val: ('u64', '54975581401623'), count: 10
val: ('u64', '13479781351462036046'), count: 10
val: ('u64', '47279000005384'), count: 10
val: ('u64', '12016361416431012332'), count: 10
val: ('u64', '20890720932633'), count: 10
val: ('u64', '3228061480509567917'), count: 10
val: ('u64', '1397131547879314568'), count: 10
val: ('u64', '60473139541796'), count: 10
val: ('u64', '93458488382728'), count: 10
val: ('u64', '16088011003500778166'), count: 10
val: ('u64', '45079976749331'), count: 10
val: ('u64', '6335191599069187561'), count: 10
val: ('u64', '30786325584904'), count: 10
val: ('u64', '8078756480773032433'), count: 10
val: ('u64', '6172151650523609720'), count: 10
val: ('u64', '18403610489236183660'), count: 10
val: ('u64', '58274116285705'), count: 10
val: ('u64', '14387553200081779475'), count: 10
val: ('u64', '67070209309960'), count: 10
val: ('u64', '3709219899441931880'), count: 10
val: ('u64', '5449856924893621148'), count: 10
val: ('u64', '6178097643820839173'), count: 10
val: ('u64', '128642860479748'), count: 10
val: ('u64', '126443837223699'), count: 10
val: ('u64', '74766790706184'), count: 10
val: ('u64', '12074391557214621107'), count: 10
val: ('u64', '16977781991081489189'), count: 10
val: ('u64', '131941395363840'), count: 10
val: ('u64', '53876069773598'), count: 10
val: ('u64', '14808742969980607109'), count: 10
val: ('u64', '16626959594269779739'), count: 10
val: ('u64', '91259465126665'), count: 10
val: ('u64', '94558000010772'), count: 10
val: ('u64', '15322083508895687504'), count: 10
val: ('u64', '457396837261321'), count: 10
val: ('u64', '30786325584896'), count: 10
val: ('u64', '108851651175176'), count: 10
val: ('u64', '109951162803208'), count: 10
val: ('u64', '86861418614528'), count: 10
val: ('u64', '642086668258877340'), count: 10
val: ('u64', '1718536674614020'), count: 10
val: ('u64', '3346937568878096673'), count: 10
val: ('u64', '48378511633420'), count: 10
val: ('u64', '137438953504008'), count: 10
val: ('u64', '140737488387588'), count: 10
val: ('u64', '142936511644180'), count: 10
val: ('u64', '144036023272197'), count: 10
val: ('u64', '146235046528285'), count: 10
val: ('u64', '14674977751528627164'), count: 10
val: ('u64', '152832116296465'), count: 10
val: ('u64', '147334558156296'), count: 10
val: ('u64', '15709365742457081123'), count: 10
val: ('u64', '153931627924513'), count: 10
val: ('u64', '18049827298084851559'), count: 10
val: ('u64', '161628209320717'), count: 10
val: ('u64', '153931627924500'), count: 10
val: ('i64', '30'), count: 10
val: ('u64', '64871186053906'), count: 10
val: ('u64', '170424302344980'), count: 10
val: ('u64', '65970697681942'), count: 10
val: ('u64', '129742372107804'), count: 10
val: ('u64', '146235046528293'), count: 10
val: ('u64', '8000881024033081781'), count: 10
val: ('u64', '182518930253321'), count: 10
val: ('u64', '5259981543624522256'), count: 10
val: ('u64', '80264348846377'), count: 10
val: ('u64', '153931627924484'), count: 10
val: ('u64', '13211991205477640816'), count: 10
val: ('u64', '2827341892335658222'), count: 10
val: ('u64', '2136470742283483585'), count: 10
val: ('u64', '489282674474261'), count: 10
val: ('u64', '10037431286518837954'), count: 10
val: ('u64', '105553116291076'), count: 10
val: ('u64', '2944594445831501783'), count: 10
val: ('u64', '70368744194082'), count: 10
val: ('u64', '199011604673800'), count: 10
val: ('u64', '10535965388150789543'), count: 10
val: ('u64', '97856534894852'), count: 10
val: ('u64', '14424547638679987297'), count: 10
val: ('u64', '11559199670603703921'), count: 10
val: ('u64', '207807697698056'), count: 10
val: ('u64', '114349209315345'), count: 10
val: ('u64', '217703302350356'), count: 10
val: ('u64', '117647744199436'), count: 10
val: ('u64', '226499395374600'), count: 10
val: ('u64', '229797930258696'), count: 10
val: ('u64', '146235046528306'), count: 10
val: ('u64', '146235046528260'), count: 10
val: ('u64', '150633093040388'), count: 10
val: ('u64', '11175239359108500426'), count: 10
val: ('u64', '150633093040402'), count: 10
val: ('u64', '9869172863506807154'), count: 10
val: ('u64', '266081813983752'), count: 10
val: ('u64', '4621027300013649501'), count: 10
val: ('u64', '1782914785764496607'), count: 10
val: ('u64', '315559837245192'), count: 10
val: ('u64', '7589393667250276000'), count: 10
val: ('u64', '18018867544060914680'), count: 10
val: ('u64', '16492674420485'), count: 10
val: ('u64', '172623325601037'), count: 10
val: ('u64', '109951162803234'), count: 10
val: ('u64', '129742372107776'), count: 10
val: ('u64', '18691697676548'), count: 10
val: ('u64', '175921860485131'), count: 10
val: ('u64', '175921860485153'), count: 10
val: ('u64', '213305255838236'), count: 10
val: ('u64', '434307093072661'), count: 10
val: ('u64', '670702093099549'), count: 10
val: ('u64', '40681930237219'), count: 10
val: ('u64', '122045790711575'), count: 10
val: ('u64', '465093418657545'), count: 10
val: ('u64', '478287558193929'), count: 10
val: ('u64', '328753976781572'), count: 10
val: ('u32', '64318'), count: 10
val: ('u64', '339749093061907'), count: 10
val: ('u64', '95657511638788'), count: 10
val: ('u64', '58274116285700'), count: 10
val: ('u32', '67644'), count: 10
val: ('u64', '786150814042892'), count: 10
val: ('u64', '384829069811204'), count: 10
val: ('u64', '86861418614532'), count: 10
val: ('u64', '120946279083524'), count: 10
val: ('u64', '416714907024175'), count: 10
val: ('u64', '416714907024172'), count: 10
val: ('u64', '877410279169544'), count: 10
val: ('u64', '87960930242560'), count: 10
val: ('u64', '305664232592900'), count: 10
val: ('u64', '92358976754711'), count: 10
val: ('u32', '73648'), count: 10
val: ('u64', '101155069778957'), count: 10
val: ('u64', '743269860549640'), count: 10
val: ('u64', '451899279121156'), count: 10
val: ('u64', '938982930339336'), count: 10
val: ('u64', '346346162830121'), count: 10
val: ('u32', '126564'), count: 10
val: ('u64', '190215511649540'), count: 10
val: ('u64', '398023209347600'), count: 10
val: ('u64', '409018325627916'), count: 10
val: ('u64', '279275953520132'), count: 10
val: ('u64', '1125899907104777'), count: 10
val: ('u64', '516770465175056'), count: 10
val: ('u64', '1199567186182933'), count: 10
val: ('u64', '18134745493060530058'), count: 10
val: ('u64', '476088534937868'), count: 10
val: ('u64', '1317214930382358'), count: 10
val: ('u64', '1328210046662678'), count: 10
val: ('u64', '1394180744344598'), count: 10
val: ('u64', '584940186113035'), count: 10
val: ('u64', '1542614814128904'), count: 10
val: ('u64', '17166658939937080815'), count: 10
val: ('u64', '777354721018650'), count: 10
val: ('u64', '16960402678583030774'), count: 10
val: ('u64', '17982601828018297084'), count: 10
val: ('u64', '4651576414765050335'), count: 10
val: ('u64', '12862034972193571134'), count: 10
val: ('u64', '6343528002852651096'), count: 10
val: ('u64', '26388279072783'), count: 10
val: ('u64', '1187472558274564'), count: 10
val: ('u64', '20890720932625'), count: 10
val: ('u64', '1203965232695044'), count: 10
val: ('u64', '74766790706180'), count: 10
val: ('u64', '82463372102422'), count: 10
val: ('u64', '1352399302479364'), count: 10
val: ('u64', '1388683186204420'), count: 10
val: ('u64', '137438953504056'), count: 10
val: ('u64', '94558000010764'), count: 10
val: ('u64', '16286064883664354746'), count: 10
val: ('u64', '6457372073357275685'), count: 10
val: ('u64', '8826660682729554157'), count: 10
val: ('u64', '4985394474099711899'), count: 10
val: ('u64', '7328575488562512128'), count: 10
val: ('u64', '14734440402342280515'), count: 10
val: ('u64', '13984420610670538665'), count: 10
val: ('u64', '1545913349013011'), count: 10
val: ('u64', '1554709442037267'), count: 10
val: ('u64', '12645299837753382590'), count: 10
val: ('u64', '1509629465287966'), count: 10
val: ('u64', '1547012860641065'), count: 10
val: ('u64', '1511828488544024'), count: 10
val: ('u64', '1511828488544020'), count: 10
val: ('u64', '1511828488544030'), count: 10
val: ('u64', '1514027511800088'), count: 10
val: ('u64', '1514027511800100'), count: 10
val: ('u64', '1245751933682392836'), count: 10
val: ('u64', '1539316279244823'), count: 10
val: ('u64', '1540415790872863'), count: 10
val: ('u64', '1540415790872872'), count: 10
val: ('u64', '9014080183672020897'), count: 10
val: ('u64', '1555808953665321'), count: 10
val: ('u64', '2212480936615862282'), count: 10
val: ('u64', '250688651191320'), count: 10
val: ('u64', '266081813983748'), count: 10
val: ('u64', '275977418636036'), count: 10
val: ('u64', '10040369821954663219'), count: 10
val: ('u64', '1621558239661680073'), count: 10
val: ('u64', '9040998628966140003'), count: 10
val: ('u64', '1558007976921385'), count: 10
val: ('u64', '405719790743828'), count: 10
val: ('u64', '377132488414980'), count: 10
val: ('u64', '10364921527702537513'), count: 10
val: ('u64', '9315288062072470779'), count: 10
val: ('u64', '627821139606322'), count: 10
val: ('u64', '775155697762602'), count: 10
val: ('u64', '775155697762588'), count: 10
val: ('u64', '1351081445038724743'), count: 10
val: ('u64', '1722934721126158'), count: 10
val: ('u64', '1735029349034516'), count: 10
val: ('u64', '1775711279271684'), count: 10
val: ('u64', '1801000046716420'), count: 10
val: ('u64', '1885662442074884'), count: 10
val: ('u64', '1917548279287812'), count: 10
val: ('u64', '3449690208765566194'), count: 10
val: ('u64', '735668021727081550'), count: 10
val: ('u64', '17400020056424899449'), count: 10
val: ('u64', '1318314442010372'), count: 10
val: ('u64', '2195724721179912'), count: 10
val: ('u64', '17752065575018716171'), count: 10
val: ('u64', '1648167930419979'), count: 10
val: ('u64', '14946165065995716130'), count: 10
val: ('u64', '1891160000215044'), count: 10
val: ('u64', '1967026302549252'), count: 10
val: ('u64', '7319618841074374820'), count: 10
val: ('u64', '16207540389375303993'), count: 10
val: ('u64', '2236406651417099'), count: 10
val: ('u64', '6796909116748323627'), count: 10
val: ('u64', '15653668021539312722'), count: 10
val: ('u64', '6983695088482452362'), count: 10
val: ('u64', '436506116328740'), count: 10
val: ('u64', '1565704558317572'), count: 10
val: ('u64', '1603087953670660'), count: 10
val: ('u64', '1628376721115396'), count: 10
val: ('u64', '1641570860651796'), count: 10
val: ('u64', '1649267442048004'), count: 10
val: ('u64', '1672357186236680'), count: 10
val: ('u64', '1674556209492744'), count: 10
val: ('u64', '1773512256015620'), count: 10
val: ('u64', '1830686860673284'), count: 10
val: ('u64', '1831786372301316'), count: 10
val: ('u64', '1918647790915844'), count: 10
val: ('u64', '2003310186274324'), count: 10
val: ('u64', '2006608721158408'), count: 10
val: ('u64', '8369333018572388660'), count: 10
val: ('u64', '2161639860710933'), count: 10
val: ('u64', '2343059279336212'), count: 10
val: ('u64', '2429920697950753'), count: 10
val: ('u64', '2491493349120520'), count: 10
val: ('u64', '12492439746405493336'), count: 10
val: ('u64', '543329342795383710'), count: 10
val: ('u64', '2889707338148721547'), count: 10
val: ('u64', '188016488393504'), count: 10
val: ('u64', '14119449856068327817'), count: 10
val: ('u64', '12816517190678400861'), count: 10
val: ('u64', '12042341833584081276'), count: 10

@Kobzol
Copy link
Contributor Author

Kobzol commented Dec 20, 2021

I tried to test other types, but apart from u32 either nothing changed (u16, i32) or it was a bit worse (u64). I realized that isize/usize will pretty much never appear in the hash, because such values are converted to i64/u64 little-endian values to preserve cross-compilation compatibility (stable_hasher.rs:100).

The problem with that is that once we are inside the stable hasher, we can't really tell where the input value came from (was it a 8-byte number? a pointer? size of some data structure?). I conjecture that it could be quite useful to compress the bytes of data structures sizes, as these would rarely need all 8 bytes. But we need a way to distinguish them from pointers, which are usually very large and checking their value slows everything down.

@Kobzol
Copy link
Contributor Author

Kobzol commented Dec 20, 2021

I tried to create a SizeWrapper struct that uses the compressed usize hashing, but only for data structure sizes. It seemed to have a small, but positive effect. I'll send a follow-up PR after this one.

@joshtriplett
Copy link
Member

This seems like a clear win. Do you have further changes you want to make before it gets merged?

@Kobzol
Copy link
Contributor Author

Kobzol commented Jan 1, 2022

Maybe another perf. run to check that the second commit (which added this "trick" for u32) didn't regress anything?

@joshtriplett
Copy link
Member

@bors try @rust-timer queue

@rust-timer
Copy link
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rustbot rustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Jan 1, 2022
@bors
Copy link
Contributor

bors commented Jan 1, 2022

⌛ Trying commit 7c53440e68b07747b2b0188aaa023d452d4a6029 with merge a9bc89758a59e9db658dac1e75c2149024628ae5...

@bors
Copy link
Contributor

bors commented Jan 2, 2022

☀️ Try build successful - checks-actions
Build commit: a9bc89758a59e9db658dac1e75c2149024628ae5 (a9bc89758a59e9db658dac1e75c2149024628ae5)

@Kobzol
Copy link
Contributor Author

Kobzol commented Jan 4, 2022

Hopefully this should fix it, the test now passes locally.

@the8472
Copy link
Member

the8472 commented Jan 4, 2022

@bors r+

@bors
Copy link
Contributor

bors commented Jan 4, 2022

📌 Commit 65a3279 has been approved by the8472

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jan 4, 2022
@bors
Copy link
Contributor

bors commented Jan 5, 2022

⌛ Testing commit 65a3279 with merge 936ce3d...

@bors
Copy link
Contributor

bors commented Jan 5, 2022

☀️ Test successful - checks-actions
Approved by: the8472
Pushing 936ce3d to master...

@bors bors added the merged-by-bors This PR was explicitly merged by bors. label Jan 5, 2022
@bors bors merged commit 936ce3d into rust-lang:master Jan 5, 2022
@rustbot rustbot added this to the 1.59.0 milestone Jan 5, 2022
@Kobzol Kobzol deleted the stable-hash-skip-zero-bytes branch January 5, 2022 12:33
@rust-timer
Copy link
Collaborator

Finished benchmarking commit (936ce3d): comparison url.

Summary: This change led to very large relevant improvements 🎉 in compiler performance.

  • Very large improvement in instruction counts (up to -6.9% on incr-full builds of clap-rs)

If you disagree with this performance assessment, please file an issue in rust-lang/rustc-perf.

@rustbot label: -perf-regression

@cpud36
Copy link

cpud36 commented Jan 17, 2022

Not sure how relevant it is(and maybe it should be move to an issue), but:

I wonder if this could produce any hashing ambiguity.

I suppose this could lead to hashing ambiguity if 2xi64 are hashed one after another.
E.g.

#[derive(Hash)]
struct X {
  u: i64,
  v: i64,
}

Then (0xff, 0xff_ff), and (0xff_ff, 0xff) would be indistinguishable from hasher perspective.

This could be made worse when using something like Vec<i64>, as there is a combinatorial explosion.

@Kobzol
Copy link
Contributor Author

Kobzol commented Jan 17, 2022

Heh, I was worried thinking about cases where one of the values would be zero or the "adjacent" hashed types would be different that I missed this blatantly obvious error. I thought that the hashing order of the two hashed values would differentiate them, but that is not the case, since the stable hasher accumulates bytes and hashes values in batches. Thank you very much for noticing!

@the8472 I suggest to solve this problem by hashing the number of bytes hashed, i.e. making something like

macro_rules! dispatch_value {
    ($target: expr, $value:expr) => {
        let value = $value;
        #[allow(unreachable_patterns)]
        #[allow(overflowing_literals)]
        match value {
            0..=0xFF => { $target.short_write(value as u8); $target.short_write(1); }
            0x100..=0xFFFF => { $target.short_write(value as u16); $target.short_write(2); }
            ...
        }
    };
}

It will probably undo a lot of the performance gained here, but it might still be a win.

@the8472
Copy link
Member

the8472 commented Jan 17, 2022

We'll also need a baseline for that change, which would be reverting this PR.

@pnkfelix
Copy link
Member

from triage meeting today: the examples that are provided on PR #92103 of where the change introduces hash-collisions, can those be adapted into concrete tests of some form?

@pnkfelix pnkfelix added beta-accepted Accepted for backporting to the compiler in the beta channel. and removed beta-accepted Accepted for backporting to the compiler in the beta channel. labels Jan 20, 2022
@Kobzol
Copy link
Contributor Author

Kobzol commented Jan 20, 2022

Well, for the current implementation of this PR, we would need to find a data structure in Rustc that uses two adjacent (or "near") i64 fields (or a Vec thereof). I tried searching for such situations, but without much success (these fields can be behind type defs or some special types that only hash to i64). And then the test would need to simulate a situation where some code changes, and the order of these two fields is swapped (but pretty much everything else stays the same).

To be honest, I'm not sure how to do that (I'm also quite new to rustc). Any ideas?

@the8472
Copy link
Member

the8472 commented Jan 20, 2022

@Kobzol

And then the test would need to simulate a situation where some code changes, and the order of these two fields is swapped (but pretty much everything else stays the same).

It doesn't need to be anything fancy like testing multiple runs with code changes. It's enough to exercise the hasher directly and do a bunch of writes that do the (0xff, 0xff_ff) vs. (0xff_ff, 0xff) thing and check that this results in different hashes.
The test can then be executed locally with and without the revert to check whether it catches the incorrect behavior and the fix. Then in the future if someone else has the same idea it'll be caught.

I have already been asked if I can add a test and answered affirmatively, but if you want to use it as an opportunity to learn you can claim it instead.

@Kobzol
Copy link
Contributor Author

Kobzol commented Jan 20, 2022

Ah, ok, we can do it in a unit test way like this. But to make it future-proof, we would have to do such tests for various data types, right? (what if the next PR tried something like this, but for u64?). In any case, I'd like to try to add such test.

bors added a commit to rust-lang-ci/rust that referenced this pull request Jan 24, 2022
…zero-bytes, r=the8472

Revert "Do not hash leading zero bytes of i64 numbers in Sip128 hasher"

Reverts rust-lang#92103. It had a (in retrospect, obvious) correctness problem where changing the order of two adjacent values would produce identical hashes, which is problematic in stable hashing (see [this comment](rust-lang#92103 (comment))).

I'll try to send the PR again with a fix for this issue.

r? `@the8472`
ehuss pushed a commit to ehuss/rust that referenced this pull request Jan 25, 2022
…zero-bytes, r=the8472

Revert "Do not hash leading zero bytes of i64 numbers in Sip128 hasher"

Reverts rust-lang#92103. It had a (in retrospect, obvious) correctness problem where changing the order of two adjacent values would produce identical hashes, which is problematic in stable hashing (see [this comment](rust-lang#92103 (comment))).

I'll try to send the PR again with a fix for this issue.

r? `@the8472`
@Kobzol
Copy link
Contributor Author

Kobzol commented Jan 26, 2022

@the8472 I added the test in #93193.

By the way, I tried to analyze why clap is hit by this optimization so much. The vast majority of stable-hashing i64 actually comes from hashing isize (which is converted to i64 in the stable hasher). This data type is used on very few places in the compiler if I'm not mistaken. One place that seemed to occur a lot is rustc_span::FileName::DocTest (actually I didn't find any other place), which encodes the position of the doctest - maybe clap has a lot of doctests?

Anyway, the performance gain comes from the fact that clap hashes about 8.5 million isizes, and ALL of them fit into a single byte.

bors added a commit to rust-lang-ci/rust that referenced this pull request Feb 3, 2022
…sion, r=the8472

Compress amount of hashed bytes for `isize` values in StableHasher

This is another attempt to land rust-lang#92103, this time hopefully with a correct implementation w.r.t. stable hashing guarantees. The previous PR was [reverted](rust-lang#93014) because it could produce the [same hash](rust-lang#92103 (comment)) for different values even in quite simple situations. I have since added a basic [test](rust-lang#93193) that should guard against that situation, I also added a new test in this PR, specialised for this optimization.

## Why this optimization helps
Since the original PR, I have tried to analyze why this optimization even helps (and why it especially helps for `clap`). I found that the vast majority of stable-hashing `i64` actually comes from hashing `isize` (which is converted to `i64` in the stable hasher). I only found a single place where is this datatype used directly in the compiler, and this place has also been showing up in traces that I used to find out when is `isize` being hashed. This place is `rustc_span::FileName::DocTest`, however, I suppose that isizes also come from other places, but they might not be so easy to find (there were some other entries in the trace). `clap` hashes about 8.5 million `isize`s, and all of them fit into a single byte, which is why this optimization has helped it [quite a lot](rust-lang#92103 (comment)).

Now, I'm not sure if special casing `isize` is the correct solution here, maybe something could be done with that `isize` inside `DocTest` or in other places, but that's for another discussion I suppose. In this PR, instead of hardcoding a special case inside `SipHasher128`, I instead put it into `StableHasher`, and only used it for `isize` (I tested that for `i64` it doesn't help, or at least not for `clap` and other few benchmarks that I was testing).

## New approach
Since the most common case is a single byte, I added a fast path for hashing `isize` values which positive value fits within a single byte, and a cold path for the rest of the values.

To avoid the previous correctness problem, we need to make sure that each unique `isize` value will produce a unique hash stream to the hasher. By hash stream I mean a sequence of bytes that will be hashed (a different sequence should produce a different hash, but that is of course not guaranteed).

We have to distinguish different values that produce the same bit pattern when we combine them. For example, if we just simply skipped the leading zero bytes for values that fit within a single byte, `(0xFF, 0xFFFFFFFFFFFFFFFF)` and `(0xFFFFFFFFFFFFFFFF, 0xFF)` would send the same hash stream to the hasher, which must not happen.

To avoid this situation, values `[0, 0xFE]` are hashed as a single byte. When we hash a larger (treating `isize` as `u64`) value, we first hash an additional byte `0xFF`. Since `0xFF` cannot occur when we apply the single byte optimization, we guarantee that the hash streams will be unique when hashing two values `(a, b)` and `(b, a)` if `a != b`:
1) When both `a` and `b` are within `[0, 0xFE]`, their hash streams will be different.
2) When neither `a` and `b` are within `[0, 0xFE]`, their hash streams will be different.
3) When `a` is within `[0, 0xFE]` and `b` isn't, when we hash `(a, b)`, the hash stream will definitely not begin with `0xFF`. When we hash `(b, a)`, the hash stream will definitely begin with `0xFF`. Therefore the hash streams will be different.

r? `@the8472`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
merged-by-bors This PR was explicitly merged by bors. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants