use crate::crypto::md5;
use anyhow::{ensure, Result};
pub fn from_md5_hex(hex: &str) -> Result<u32> {
ensure!(
hex.len() == 32
&& hex
.bytes()
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b)),
"Invalid notice digest"
);
let hex = hex.as_bytes();
let mut slots = [0u64; 900];
slots[0] = (hex[1] as u64) << 8;
slots[1] = slots[0] | (hex[2] as u64);
slots[2] = (hex[5] as u64) << 8;
slots[3] = slots[2] | (hex[6] as u64);
slots[4] = (hex[0] as u64) << 16;
slots[5] = slots[1] | slots[4];
slots[6] = (hex[3] as u64) << 24;
slots[7] = slots[5] | slots[6];
slots[8] = (hex[4] as u64) << 16;
slots[9] = slots[3] | slots[8];
slots[10] = (hex[9] as u64) << 8;
slots[11] = slots[10] | (hex[10] as u64);
slots[12] = (hex[7] as u64) << 24;
slots[13] = slots[9] | slots[12];
slots[14] = (hex[13] as u64) << 8;
slots[15] = slots[14] | (hex[14] as u64);
slots[16] = (hex[8] as u64) << 16;
slots[17] = slots[11] | slots[16];
slots[18] = (hex[11] as u64) << 24;
slots[19] = slots[17] | slots[18];
slots[20] = (hex[12] as u64) << 16;
slots[21] = slots[15] | slots[20];
slots[22] = (hex[17] as u64) << 8;
slots[23] = slots[22] | (hex[18] as u64);
slots[24] = (hex[15] as u64) << 24;
slots[25] = slots[21] | slots[24];
slots[26] = (hex[21] as u64) << 8;
slots[27] = slots[26] | (hex[22] as u64);
slots[28] = (hex[16] as u64) << 16;
slots[29] = slots[23] | slots[28];
slots[30] = (hex[19] as u64) << 24;
slots[31] = slots[29] | slots[30];
slots[32] = (hex[20] as u64) << 16;
slots[33] = slots[27] | slots[32];
slots[34] = (hex[25] as u64) << 8;
slots[35] = slots[34] | (hex[26] as u64);
slots[36] = (hex[23] as u64) << 24;
slots[37] = slots[33] | slots[36];
slots[38] = (hex[29] as u64) << 8;
slots[39] = slots[38] | (hex[30] as u64);
slots[40] = (hex[24] as u64) << 16;
slots[41] = slots[35] | slots[40];
slots[42] = (hex[27] as u64) << 24;
slots[43] = slots[41] | slots[42];
slots[44] = (hex[28] as u64) << 16;
slots[45] = slots[39] | slots[44];
slots[46] = (hex[31] as u64) << 24;
slots[47] = slots[45] | slots[46];
slots[48] = (slots[7]).wrapping_add(0x9c4d7d6u64);
slots[49] = (slots[48]).wrapping_add(0xffffffffadb314a8u64);
slots[50] = (slots[49]).wrapping_add(0xffffffffd6b0ea07u64);
slots[51] = slots[50] << 25;
slots[52] = slots[50] & 0xffffff80u64;
slots[53] = slots[52] >> 7;
slots[54] = slots[53] | slots[51];
slots[55] = (slots[54]).wrapping_add(0x32d88f3fu64);
slots[56] = slots[55] ^ 0x4150891du64;
slots[57] = (slots[13]).wrapping_add(0xffffffffece39db5u64);
slots[58] = (slots[57]).wrapping_add(slots[56]);
slots[59] = (slots[58]).wrapping_add(0xffffffffb7b87915u64);
slots[60] = slots[59] << 20;
slots[61] = slots[59] & 0xfffff000u64;
slots[62] = slots[61] >> 12;
slots[63] = slots[62] | slots[60];
slots[64] = (slots[63]).wrapping_add(slots[55]);
slots[65] = (slots[19]).wrapping_add(0x73880622u64);
slots[66] = slots[64] ^ slots[55];
slots[67] = slots[66] ^ 0x32d88f3fu64;
slots[68] = (slots[65]).wrapping_add(slots[67]);
slots[69] = (slots[68]).wrapping_add(0x6b329dedu64);
slots[70] = slots[69] << 15;
slots[71] = slots[69] & 0xfffe0000u64;
slots[72] = slots[71] >> 17;
slots[73] = slots[72] | slots[70];
slots[74] = (slots[73]).wrapping_add(slots[64]);
slots[75] = slots[74] ^ slots[66];
slots[76] = (slots[25]).wrapping_add(0x32d88f3fu64);
slots[77] = (slots[76]).wrapping_add(slots[75]);
slots[78] = (slots[77]).wrapping_add(0x2ef0cd9eu64);
slots[79] = slots[78] << 10;
slots[80] = slots[78] & 0xffc00000u64;
slots[81] = slots[80] >> 22;
slots[82] = slots[81] | slots[79];
slots[83] = (slots[31]).wrapping_add(slots[55]);
slots[84] = (slots[82]).wrapping_add(slots[74]);
slots[85] = slots[84] ^ slots[74];
slots[86] = slots[85] ^ slots[64];
slots[87] = (slots[83]).wrapping_add(slots[86]);
slots[88] = (slots[87]).wrapping_add(0x263a2d57u64);
slots[89] = slots[88] << 25;
slots[90] = slots[88] & 0xffffff80u64;
slots[91] = slots[90] >> 7;
slots[92] = slots[91] | slots[89];
slots[93] = (slots[37]).wrapping_add(slots[64]);
slots[94] = (slots[92]).wrapping_add(slots[84]);
slots[95] = slots[94] ^ slots[85];
slots[96] = (slots[93]).wrapping_add(slots[95]);
slots[97] = (slots[96]).wrapping_add(0x7a6d5f96u64);
slots[98] = slots[97] << 20;
slots[99] = slots[97] & 0xfffff000u64;
slots[100] = slots[99] >> 12;
slots[101] = slots[100] | slots[98];
slots[102] = (slots[43]).wrapping_add(slots[74]);
slots[103] = (slots[101]).wrapping_add(slots[94]);
slots[104] = slots[103] ^ slots[94];
slots[105] = slots[104] ^ slots[84];
slots[106] = (slots[102]).wrapping_add(slots[105]);
slots[107] = (slots[106]).wrapping_add(0x77fa5373u64);
slots[108] = slots[107] << 15;
slots[109] = slots[107] & 0xfffe0000u64;
slots[110] = slots[109] >> 17;
slots[111] = slots[110] | slots[108];
slots[112] = (slots[47]).wrapping_add(slots[84]);
slots[113] = (slots[111]).wrapping_add(slots[103]);
slots[114] = slots[104] ^ slots[113];
slots[115] = (slots[112]).wrapping_add(slots[114]);
slots[116] = (slots[115]).wrapping_add(0x1ac8dd6du64);
slots[117] = slots[116] << 10;
slots[118] = slots[116] & 0xffc00000u64;
slots[119] = slots[118] >> 22;
slots[120] = slots[119] | slots[117];
slots[121] = (slots[94]).wrapping_add(0xffffffff9803a6e9u64);
slots[122] = (slots[120]).wrapping_add(slots[113]);
slots[123] = slots[113] ^ slots[103];
slots[124] = slots[123] ^ slots[122];
slots[125] = (slots[121]).wrapping_add(slots[124]);
slots[126] = (slots[125]).wrapping_add(0x5dbb7dc7u64);
slots[127] = slots[126] << 25;
slots[128] = slots[126] & 0xffffff80u64;
slots[129] = slots[128] >> 7;
slots[130] = slots[129] | slots[127];
slots[131] = (slots[103]).wrapping_add(0x6ce1c012u64);
slots[132] = (slots[130]).wrapping_add(slots[122]);
slots[133] = slots[122] ^ slots[113];
slots[134] = slots[133] ^ slots[132];
slots[135] = (slots[131]).wrapping_add(slots[134]);
slots[136] = (slots[135]).wrapping_add(0xffffffffc7a1e8fbu64);
slots[137] = slots[136] << 20;
slots[138] = slots[136] & 0xfffff000u64;
slots[139] = slots[138] >> 12;
slots[140] = slots[139] | slots[137];
slots[141] = (slots[113]).wrapping_add(0xfffffffff2621cb8u64);
slots[142] = (slots[140]).wrapping_add(slots[132]);
slots[143] = slots[132] ^ slots[122];
slots[144] = slots[143] ^ slots[142];
slots[145] = (slots[141]).wrapping_add(slots[144]);
slots[146] = (slots[145]).wrapping_add(0xffffffff930d5c29u64);
slots[147] = slots[146] << 15;
slots[148] = slots[146] & 0xfffe0000u64;
slots[149] = slots[148] >> 17;
slots[150] = slots[149] | slots[147];
slots[151] = (slots[122]).wrapping_add(0x1c43ecf9u64);
slots[152] = (slots[150]).wrapping_add(slots[142]);
slots[153] = slots[142] ^ slots[132];
slots[154] = slots[153] ^ slots[152];
slots[155] = (slots[151]).wrapping_add(slots[154]);
slots[156] = (slots[155]).wrapping_add(0x15336c85u64);
slots[157] = slots[156] << 10;
slots[158] = slots[156] & 0xffc00000u64;
slots[159] = slots[158] >> 22;
slots[160] = slots[159] | slots[157];
slots[161] = (slots[132]).wrapping_add(0xda0000u64);
slots[162] = (slots[160]).wrapping_add(slots[152]);
slots[163] = slots[152] ^ slots[142];
slots[164] = slots[163] ^ slots[162];
slots[165] = (slots[161]).wrapping_add(slots[164]);
slots[166] = (slots[165]).wrapping_add(0xffffffffdcd4b032u64);
slots[167] = slots[166] & 0xffffff80u64;
slots[168] = slots[166] << 25;
slots[169] = slots[167] >> 7;
slots[170] = slots[169] | slots[168];
slots[171] = (slots[170]).wrapping_add(slots[162]);
slots[172] = slots[162] ^ slots[152];
slots[173] = slots[172] ^ slots[171];
slots[174] = (slots[142]).wrapping_add(slots[173]);
slots[175] = (slots[174]).wrapping_add(0xffffffff8babda93u64);
slots[176] = slots[175] & 0xfffff000u64;
slots[177] = slots[175] << 20;
slots[178] = slots[176] >> 12;
slots[179] = slots[178] | slots[177];
slots[180] = (slots[152]).wrapping_add(0x647b0f13u64);
slots[181] = (slots[179]).wrapping_add(slots[171]);
slots[182] = slots[171] ^ slots[162];
slots[183] = slots[182] ^ slots[181];
slots[184] = (slots[180]).wrapping_add(slots[183]);
slots[185] = (slots[184]).wrapping_add(0xffffffff86c0472fu64);
slots[186] = slots[185] & 0xfffe0000u64;
slots[187] = slots[185] << 15;
slots[188] = slots[186] >> 17;
slots[189] = slots[188] | slots[187];
slots[190] = (slots[189]).wrapping_add(slots[181]);
slots[191] = slots[181] ^ slots[171];
slots[192] = slots[191] ^ slots[190];
slots[193] = (slots[162]).wrapping_add(slots[192]);
slots[194] = (slots[193]).wrapping_add(0x65e0c427u64);
slots[195] = slots[194] & 0xffc00000u64;
slots[196] = slots[194] << 10;
slots[197] = slots[195] >> 22;
slots[198] = slots[197] | slots[196];
slots[199] = (slots[198]).wrapping_add(slots[190]);
slots[200] = slots[199] ^ 0xffffffffffffffffu64;
slots[201] = slots[190] & slots[200];
slots[202] = slots[199] & slots[181];
slots[203] = slots[202] | slots[201];
slots[204] = (slots[13]).wrapping_add(slots[171]);
slots[205] = (slots[204]).wrapping_add(slots[203]);
slots[206] = (slots[205]).wrapping_add(0xffffffffbb46ff0du64);
slots[207] = slots[206] << 27;
slots[208] = slots[206] & 0xffffffe0u64;
slots[209] = slots[208] >> 5;
slots[210] = slots[209] | slots[207];
slots[211] = (slots[210]).wrapping_add(slots[199]);
slots[212] = slots[211] ^ 0xffffffffffffffffu64;
slots[213] = slots[199] & slots[212];
slots[214] = slots[211] & slots[190];
slots[215] = slots[214] | slots[213];
slots[216] = (slots[43]).wrapping_add(slots[181]);
slots[217] = (slots[216]).wrapping_add(slots[215]);
slots[218] = (slots[217]).wrapping_add(0x28e6c7d3u64);
slots[219] = slots[218] << 23;
slots[220] = slots[218] & 0xfffffe00u64;
slots[221] = slots[220] >> 9;
slots[222] = slots[221] | slots[219];
slots[223] = (slots[222]).wrapping_add(slots[211]);
slots[224] = slots[223] ^ 0xffffffffffffffffu64;
slots[225] = slots[211] & slots[224];
slots[226] = slots[223] & slots[199];
slots[227] = slots[226] | slots[225];
slots[228] = (slots[190]).wrapping_add(0x1c43ecf9u64);
slots[229] = (slots[228]).wrapping_add(slots[227]);
slots[230] = (slots[229]).wrapping_add(0xffffffffb473e7d4u64);
slots[231] = slots[230] << 18;
slots[232] = slots[230] & 0xffffc000u64;
slots[233] = slots[232] >> 14;
slots[234] = slots[233] | slots[231];
slots[235] = (slots[234]).wrapping_add(slots[223]);
slots[236] = slots[235] ^ 0xffffffffffffffffu64;
slots[237] = slots[223] & slots[236];
slots[238] = slots[235] & slots[211];
slots[239] = slots[238] | slots[237];
slots[240] = (slots[7]).wrapping_add(slots[199]);
slots[241] = (slots[240]).wrapping_add(slots[239]);
slots[242] = (slots[241]).wrapping_add(0xfffffffffc37a219u64);
slots[243] = slots[242] << 12;
slots[244] = slots[242] & 0xfff00000u64;
slots[245] = slots[244] >> 20;
slots[246] = slots[245] | slots[243];
slots[247] = (slots[246]).wrapping_add(slots[235]);
slots[248] = slots[247] ^ 0xffffffffffffffffu64;
slots[249] = slots[235] & slots[248];
slots[250] = slots[247] & slots[223];
slots[251] = slots[250] | slots[249];
slots[252] = (slots[37]).wrapping_add(slots[211]);
slots[253] = (slots[252]).wrapping_add(slots[251]);
slots[254] = (slots[253]).wrapping_add(0xffffffffaf1a0718u64);
slots[255] = slots[254] << 27;
slots[256] = slots[254] & 0xffffffe0u64;
slots[257] = slots[256] >> 5;
slots[258] = slots[257] | slots[255];
slots[259] = (slots[258]).wrapping_add(slots[247]);
slots[260] = slots[259] ^ 0xffffffffffffffffu64;
slots[261] = slots[247] & slots[260];
slots[262] = slots[259] & slots[235];
slots[263] = slots[262] | slots[261];
slots[264] = (slots[223]).wrapping_add(0xfffffffff2621cb8u64);
slots[265] = (slots[264]).wrapping_add(slots[263]);
slots[266] = (slots[265]).wrapping_add(0x755849e0u64);
slots[267] = slots[266] << 23;
slots[268] = slots[266] & 0xfffffe00u64;
slots[269] = slots[268] >> 9;
slots[270] = slots[269] | slots[267];
slots[271] = (slots[270]).wrapping_add(slots[259]);
slots[272] = slots[271] ^ 0xffffffffffffffffu64;
slots[273] = slots[259] & slots[272];
slots[274] = slots[271] & slots[247];
slots[275] = slots[274] | slots[273];
slots[276] = (slots[235]).wrapping_add(slots[275]);
slots[277] = (slots[276]).wrapping_add(0xffffffffb3a6ec26u64);
slots[278] = slots[277] << 18;
slots[279] = slots[277] & 0xffffc000u64;
slots[280] = slots[279] >> 14;
slots[281] = slots[280] | slots[278];
slots[282] = (slots[281]).wrapping_add(slots[271]);
slots[283] = slots[282] ^ 0xffffffffffffffffu64;
slots[284] = slots[271] & slots[283];
slots[285] = slots[282] & slots[259];
slots[286] = slots[285] | slots[284];
slots[287] = (slots[31]).wrapping_add(slots[247]);
slots[288] = (slots[287]).wrapping_add(slots[286]);
slots[289] = (slots[288]).wrapping_add(0xffffffffda810598u64);
slots[290] = slots[289] << 12;
slots[291] = slots[289] & 0xfff00000u64;
slots[292] = slots[291] >> 20;
slots[293] = slots[292] | slots[290];
slots[294] = (slots[293]).wrapping_add(slots[282]);
slots[295] = slots[294] ^ 0xffffffffffffffffu64;
slots[296] = slots[282] & slots[295];
slots[297] = slots[294] & slots[271];
slots[298] = slots[297] | slots[296];
slots[299] = (slots[259]).wrapping_add(0x6ce1c012u64);
slots[300] = (slots[299]).wrapping_add(slots[298]);
slots[301] = (slots[300]).wrapping_add(0xffffffffa658fc47u64);
slots[302] = slots[301] << 27;
slots[303] = slots[301] & 0xffffffe0u64;
slots[304] = slots[303] >> 5;
slots[305] = slots[304] | slots[302];
slots[306] = (slots[305]).wrapping_add(slots[294]);
slots[307] = slots[306] ^ 0xffffffffffffffffu64;
slots[308] = slots[294] & slots[307];
slots[309] = slots[306] & slots[282];
slots[310] = slots[309] | slots[308];
slots[311] = (slots[271]).wrapping_add(0x647b0f13u64);
slots[312] = (slots[311]).wrapping_add(slots[310]);
slots[313] = (slots[312]).wrapping_add(0xffffffffc7d5c425u64);
slots[314] = slots[313] << 23;
slots[315] = slots[313] & 0xfffffe00u64;
slots[316] = slots[315] >> 9;
slots[317] = slots[316] | slots[314];
slots[318] = (slots[317]).wrapping_add(slots[306]);
slots[319] = slots[318] ^ 0xffffffffffffffffu64;
slots[320] = slots[306] & slots[319];
slots[321] = slots[318] & slots[294];
slots[322] = slots[321] | slots[320];
slots[323] = (slots[25]).wrapping_add(slots[282]);
slots[324] = (slots[323]).wrapping_add(slots[322]);
slots[325] = (slots[324]).wrapping_add(0x572d04b3u64);
slots[326] = slots[325] << 18;
slots[327] = slots[325] & 0xffffc000u64;
slots[328] = slots[327] >> 14;
slots[329] = slots[328] | slots[326];
slots[330] = (slots[329]).wrapping_add(slots[318]);
slots[331] = slots[330] ^ 0xffffffffffffffffu64;
slots[332] = slots[318] & slots[331];
slots[333] = slots[330] & slots[306];
slots[334] = slots[333] | slots[332];
slots[335] = (slots[294]).wrapping_add(0xffffffff9803a6e9u64);
slots[336] = (slots[335]).wrapping_add(slots[334]);
slots[337] = (slots[336]).wrapping_add(0x5ead8d1au64);
slots[338] = slots[337] << 12;
slots[339] = slots[337] & 0xfff00000u64;
slots[340] = slots[339] >> 20;
slots[341] = slots[340] | slots[338];
slots[342] = (slots[341]).wrapping_add(slots[330]);
slots[343] = slots[342] ^ 0xffffffffffffffffu64;
slots[344] = slots[330] & slots[343];
slots[345] = slots[342] & slots[318];
slots[346] = slots[345] | slots[344];
slots[347] = (slots[306]).wrapping_add(slots[346]);
slots[348] = (slots[347]).wrapping_add(0xffffffffcd2d1a9cu64);
slots[349] = slots[348] & 0xffffffe0u64;
slots[350] = slots[348] << 27;
slots[351] = slots[349] >> 5;
slots[352] = slots[351] | slots[350];
slots[353] = (slots[352]).wrapping_add(slots[342]);
slots[354] = slots[353] ^ 0xffffffffffffffffu64;
slots[355] = slots[342] & slots[354];
slots[356] = slots[353] & slots[330];
slots[357] = slots[356] | slots[355];
slots[358] = (slots[19]).wrapping_add(slots[318]);
slots[359] = (slots[358]).wrapping_add(slots[357]);
slots[360] = (slots[359]).wrapping_add(0xffffffff957db7e4u64);
slots[361] = slots[360] & 0xfffffe00u64;
slots[362] = slots[360] << 23;
slots[363] = slots[361] >> 9;
slots[364] = slots[363] | slots[362];
slots[365] = (slots[364]).wrapping_add(slots[353]);
slots[366] = slots[365] & slots[342];
slots[367] = slots[365] ^ 0xffffffffffffffffu64;
slots[368] = slots[353] & slots[367];
slots[369] = slots[366] | slots[368];
slots[370] = (slots[47]).wrapping_add(slots[330]);
slots[371] = (slots[370]).wrapping_add(slots[369]);
slots[372] = (slots[371]).wrapping_add(0xffffffffa4d7e6f1u64);
slots[373] = slots[372] & 0xffffc000u64;
slots[374] = slots[372] << 18;
slots[375] = slots[373] >> 14;
slots[376] = slots[375] | slots[374];
slots[377] = (slots[376]).wrapping_add(slots[365]);
slots[378] = slots[377] & slots[353];
slots[379] = slots[377] ^ 0xffffffffffffffffu64;
slots[380] = slots[365] & slots[379];
slots[381] = slots[378] | slots[380];
slots[382] = (slots[342]).wrapping_add(0xda0000u64);
slots[383] = (slots[382]).wrapping_add(slots[381]);
slots[384] = (slots[383]).wrapping_add(0xfffffffff211ebafu64);
slots[385] = slots[384] & 0xfff00000u64;
slots[386] = slots[384] << 12;
slots[387] = slots[385] >> 20;
slots[388] = slots[387] | slots[386];
slots[389] = (slots[388]).wrapping_add(slots[377]);
slots[390] = slots[389] & slots[367];
slots[391] = slots[377] & slots[365];
slots[392] = slots[390] | slots[391];
slots[393] = (slots[37]).wrapping_add(slots[353]);
slots[394] = (slots[393]).wrapping_add(slots[392]);
slots[395] = (slots[394]).wrapping_add(0x27b7def7u64);
slots[396] = slots[395] << 28;
slots[397] = slots[395] & 0xfffffff0u64;
slots[398] = slots[397] >> 4;
slots[399] = slots[398] | slots[396];
slots[400] = (slots[399]).wrapping_add(slots[389]);
slots[401] = slots[400] & slots[379];
slots[402] = slots[389] & slots[377];
slots[403] = slots[401] | slots[402];
slots[404] = (slots[365]).wrapping_add(0xffffffff9803a6e9u64);
slots[405] = (slots[404]).wrapping_add(slots[403]);
slots[406] = (slots[405]).wrapping_add(0x37ee92deu64);
slots[407] = slots[406] << 21;
slots[408] = slots[406] & 0xfffff800u64;
slots[409] = slots[408] >> 11;
slots[410] = slots[409] | slots[407];
slots[411] = (slots[410]).wrapping_add(slots[400]);
slots[412] = slots[389] ^ 0xffffffffffffffffu64;
slots[413] = slots[411] & slots[412];
slots[414] = slots[400] & slots[389];
slots[415] = slots[413] | slots[414];
slots[416] = (slots[377]).wrapping_add(0x1c43ecf9u64);
slots[417] = (slots[416]).wrapping_add(slots[415]);
slots[418] = (slots[417]).wrapping_add(0xffffffff9c660adau64);
slots[419] = slots[418] << 16;
slots[420] = slots[418] & 0xffff0000u64;
slots[421] = slots[420] >> 16;
slots[422] = slots[421] | slots[419];
slots[423] = (slots[422]).wrapping_add(slots[411]);
slots[424] = slots[400] ^ 0xffffffffffffffffu64;
slots[425] = slots[423] & slots[424];
slots[426] = slots[411] & slots[400];
slots[427] = slots[425] | slots[426];
slots[428] = (slots[389]).wrapping_add(0x647b0f13u64);
slots[429] = (slots[428]).wrapping_add(slots[427]);
slots[430] = (slots[429]).wrapping_add(0x7a555619u64);
slots[431] = slots[430] << 9;
slots[432] = slots[430] & 0xff800000u64;
slots[433] = slots[432] >> 23;
slots[434] = slots[433] | slots[431];
slots[435] = (slots[434]).wrapping_add(slots[423]);
slots[436] = slots[411] ^ 0xffffffffffffffffu64;
slots[437] = slots[435] & slots[436];
slots[438] = slots[423] & slots[411];
slots[439] = slots[437] | slots[438];
slots[440] = (slots[13]).wrapping_add(slots[400]);
slots[441] = (slots[440]).wrapping_add(slots[439]);
slots[442] = (slots[441]).wrapping_add(0x113a799au64);
slots[443] = slots[442] << 28;
slots[444] = slots[442] & 0xfffffff0u64;
slots[445] = slots[444] >> 4;
slots[446] = slots[445] | slots[443];
slots[447] = (slots[446]).wrapping_add(slots[435]);
slots[448] = slots[423] ^ 0xffffffffffffffffu64;
slots[449] = slots[447] & slots[448];
slots[450] = slots[435] & slots[423];
slots[451] = slots[449] | slots[450];
slots[452] = (slots[31]).wrapping_add(slots[411]);
slots[453] = (slots[452]).wrapping_add(slots[451]);
slots[454] = (slots[453]).wrapping_add(0xffffffffecf22c38u64);
slots[455] = slots[454] << 21;
slots[456] = slots[454] & 0xfffff800u64;
slots[457] = slots[456] >> 11;
slots[458] = slots[457] | slots[455];
slots[459] = (slots[458]).wrapping_add(slots[447]);
slots[460] = slots[435] ^ 0xffffffffffffffffu64;
slots[461] = slots[459] & slots[460];
slots[462] = slots[447] & slots[435];
slots[463] = slots[461] | slots[462];
slots[464] = (slots[47]).wrapping_add(slots[423]);
slots[465] = (slots[464]).wrapping_add(slots[463]);
slots[466] = (slots[465]).wrapping_add(0x76f2ae9eu64);
slots[467] = slots[466] << 16;
slots[468] = slots[466] & 0xffff0000u64;
slots[469] = slots[468] >> 16;
slots[470] = slots[469] | slots[467];
slots[471] = (slots[470]).wrapping_add(slots[459]);
slots[472] = slots[447] ^ 0xffffffffffffffffu64;
slots[473] = slots[471] & slots[472];
slots[474] = slots[459] & slots[447];
slots[475] = slots[473] | slots[474];
slots[476] = (slots[435]).wrapping_add(0xfffffffff2621cb8u64);
slots[477] = (slots[476]).wrapping_add(slots[475]);
slots[478] = (slots[477]).wrapping_add(0xffffffffb5e735e7u64);
slots[479] = slots[478] << 9;
slots[480] = slots[478] & 0xff800000u64;
slots[481] = slots[480] >> 23;
slots[482] = slots[481] | slots[479];
slots[483] = (slots[482]).wrapping_add(slots[471]);
slots[484] = slots[459] ^ 0xffffffffffffffffu64;
slots[485] = slots[483] & slots[484];
slots[486] = slots[471] & slots[459];
slots[487] = slots[485] | slots[486];
slots[488] = (slots[447]).wrapping_add(slots[487]);
slots[489] = (slots[488]).wrapping_add(0x25dd8b50u64);
slots[490] = slots[489] << 28;
slots[491] = slots[489] & 0xfffffff0u64;
slots[492] = slots[491] >> 4;
slots[493] = slots[492] | slots[490];
slots[494] = (slots[493]).wrapping_add(slots[483]);
slots[495] = slots[471] ^ 0xffffffffffffffffu64;
slots[496] = slots[494] & slots[495];
slots[497] = slots[483] & slots[471];
slots[498] = slots[496] | slots[497];
slots[499] = (slots[7]).wrapping_add(slots[459]);
slots[500] = (slots[499]).wrapping_add(slots[498]);
slots[501] = (slots[500]).wrapping_add(0x13b7c77bu64);
slots[502] = slots[501] << 21;
slots[503] = slots[501] & 0xfffff800u64;
slots[504] = slots[503] >> 11;
slots[505] = slots[504] | slots[502];
slots[506] = (slots[505]).wrapping_add(slots[494]);
slots[507] = slots[483] ^ 0xffffffffffffffffu64;
slots[508] = slots[506] & slots[507];
slots[509] = slots[494] & slots[483];
slots[510] = slots[508] | slots[509];
slots[511] = (slots[25]).wrapping_add(slots[471]);
slots[512] = (slots[511]).wrapping_add(slots[510]);
slots[513] = (slots[512]).wrapping_add(0xffffffffeb8bdcb9u64);
slots[514] = slots[513] << 16;
slots[515] = slots[513] & 0xffff0000u64;
slots[516] = slots[515] >> 16;
slots[517] = slots[516] | slots[514];
slots[518] = (slots[517]).wrapping_add(slots[506]);
slots[519] = slots[494] ^ 0xffffffffffffffffu64;
slots[520] = slots[518] & slots[519];
slots[521] = slots[506] & slots[494];
slots[522] = slots[520] | slots[521];
slots[523] = (slots[43]).wrapping_add(slots[483]);
slots[524] = (slots[523]).wrapping_add(slots[522]);
slots[525] = (slots[524]).wrapping_add(0x49c05c20u64);
slots[526] = slots[525] << 9;
slots[527] = slots[525] & 0xff800000u64;
slots[528] = slots[527] >> 23;
slots[529] = slots[528] | slots[526];
slots[530] = (slots[529]).wrapping_add(slots[518]);
slots[531] = slots[506] ^ 0xffffffffffffffffu64;
slots[532] = slots[530] & slots[531];
slots[533] = slots[518] & slots[506];
slots[534] = slots[532] | slots[533];
slots[535] = (slots[494]).wrapping_add(0x6ce1c012u64);
slots[536] = (slots[535]).wrapping_add(slots[534]);
slots[537] = (slots[536]).wrapping_add(0xffffffff8f5cc2e6u64);
slots[538] = slots[537] & 0xfffffff0u64;
slots[539] = slots[537] << 28;
slots[540] = slots[538] >> 4;
slots[541] = slots[540] | slots[539];
slots[542] = (slots[541]).wrapping_add(slots[530]);
slots[543] = slots[518] ^ 0xffffffffffffffffu64;
slots[544] = slots[542] & slots[543];
slots[545] = slots[530] & slots[518];
slots[546] = slots[544] | slots[545];
slots[547] = (slots[506]).wrapping_add(0xda0000u64);
slots[548] = (slots[547]).wrapping_add(slots[546]);
slots[549] = (slots[548]).wrapping_add(0x40ffcb39u64);
slots[550] = slots[549] & 0xfffff800u64;
slots[551] = slots[549] << 21;
slots[552] = slots[550] >> 11;
slots[553] = slots[552] | slots[551];
slots[554] = (slots[553]).wrapping_add(slots[542]);
slots[555] = slots[530] ^ 0xffffffffffffffffu64;
slots[556] = slots[554] & slots[555];
slots[557] = slots[542] & slots[530];
slots[558] = slots[556] | slots[557];
slots[559] = (slots[518]).wrapping_add(slots[558]);
slots[560] = (slots[559]).wrapping_add(0xffffffffa518a162u64);
slots[561] = slots[560] & 0xffff0000u64;
slots[562] = slots[560] << 16;
slots[563] = slots[561] >> 16;
slots[564] = slots[563] | slots[562];
slots[565] = (slots[7]).wrapping_add(slots[542]);
slots[566] = slots[542] ^ 0xffffffffffffffffu64;
slots[567] = slots[554] & slots[542];
slots[568] = (slots[564]).wrapping_add(slots[554]);
slots[569] = slots[568] & slots[566];
slots[570] = slots[569] | slots[567];
slots[571] = (slots[19]).wrapping_add(slots[530]);
slots[572] = (slots[571]).wrapping_add(slots[570]);
slots[573] = (slots[572]).wrapping_add(0x28d948a2u64);
slots[574] = slots[573] & 0xff800000u64;
slots[575] = slots[573] << 9;
slots[576] = slots[574] >> 23;
slots[577] = slots[576] | slots[575];
slots[578] = (slots[47]).wrapping_add(slots[554]);
slots[579] = (slots[577]).wrapping_add(slots[568]);
slots[580] = slots[579] ^ 0xffffffffffffffffu64;
slots[581] = slots[554] | slots[580];
slots[582] = slots[581] ^ slots[568];
slots[583] = (slots[565]).wrapping_add(slots[582]);
slots[584] = (slots[583]).wrapping_add(0xffffffffd994af4eu64);
slots[585] = slots[584] << 26;
slots[586] = slots[584] & 0xffffffc0u64;
slots[587] = slots[586] >> 6;
slots[588] = slots[587] | slots[585];
slots[589] = (slots[568]).wrapping_add(0x647b0f13u64);
slots[590] = (slots[588]).wrapping_add(slots[579]);
slots[591] = slots[590] ^ 0xffffffffffffffffu64;
slots[592] = slots[568] | slots[591];
slots[593] = slots[592] ^ slots[579];
slots[594] = (slots[578]).wrapping_add(slots[593]);
slots[595] = (slots[594]).wrapping_add(0x17e7ba4du64);
slots[596] = slots[595] << 22;
slots[597] = slots[595] & 0xfffffc00u64;
slots[598] = slots[597] >> 10;
slots[599] = slots[598] | slots[596];
slots[600] = (slots[37]).wrapping_add(slots[579]);
slots[601] = (slots[599]).wrapping_add(slots[590]);
slots[602] = slots[601] ^ 0xffffffffffffffffu64;
slots[603] = slots[579] | slots[602];
slots[604] = slots[603] ^ slots[590];
slots[605] = (slots[589]).wrapping_add(slots[604]);
slots[606] = (slots[605]).wrapping_add(0x1b9063e2u64);
slots[607] = slots[606] << 17;
slots[608] = slots[606] & 0xffff8000u64;
slots[609] = slots[608] >> 15;
slots[610] = slots[609] | slots[607];
slots[611] = (slots[590]).wrapping_add(0xda0000u64);
slots[612] = (slots[610]).wrapping_add(slots[601]);
slots[613] = slots[612] ^ 0xffffffffffffffffu64;
slots[614] = slots[590] | slots[613];
slots[615] = slots[614] ^ slots[601];
slots[616] = (slots[600]).wrapping_add(slots[615]);
slots[617] = (slots[616]).wrapping_add(0x255131f9u64);
slots[618] = slots[617] << 11;
slots[619] = slots[617] & 0xffe00000u64;
slots[620] = slots[619] >> 21;
slots[621] = slots[620] | slots[618];
slots[622] = (slots[25]).wrapping_add(slots[601]);
slots[623] = (slots[621]).wrapping_add(slots[612]);
slots[624] = slots[623] ^ 0xffffffffffffffffu64;
slots[625] = slots[601] | slots[624];
slots[626] = slots[625] ^ slots[612];
slots[627] = (slots[611]).wrapping_add(slots[626]);
slots[628] = (slots[627]).wrapping_add(0x57de67fcu64);
slots[629] = slots[628] << 26;
slots[630] = slots[628] & 0xffffffc0u64;
slots[631] = slots[630] >> 6;
slots[632] = slots[631] | slots[629];
slots[633] = (slots[612]).wrapping_add(0xfffffffff2621cb8u64);
slots[634] = (slots[632]).wrapping_add(slots[623]);
slots[635] = slots[634] ^ 0xffffffffffffffffu64;
slots[636] = slots[612] | slots[635];
slots[637] = slots[636] ^ slots[623];
slots[638] = (slots[622]).wrapping_add(slots[637]);
slots[639] = (slots[638]).wrapping_add(0x25899b58u64);
slots[640] = slots[639] << 22;
slots[641] = slots[639] & 0xfffffc00u64;
slots[642] = slots[641] >> 10;
slots[643] = slots[642] | slots[640];
slots[644] = (slots[13]).wrapping_add(slots[623]);
slots[645] = (slots[643]).wrapping_add(slots[634]);
slots[646] = slots[645] ^ 0xffffffffffffffffu64;
slots[647] = slots[623] | slots[646];
slots[648] = slots[647] ^ slots[634];
slots[649] = (slots[633]).wrapping_add(slots[648]);
slots[650] = (slots[649]).wrapping_add(0xffffffff9126c3a0u64);
slots[651] = slots[650] << 17;
slots[652] = slots[650] & 0xffff8000u64;
slots[653] = slots[652] >> 15;
slots[654] = slots[653] | slots[651];
slots[655] = (slots[634]).wrapping_add(0xffffffff9803a6e9u64);
slots[656] = (slots[654]).wrapping_add(slots[645]);
slots[657] = slots[656] ^ 0xffffffffffffffffu64;
slots[658] = slots[634] | slots[657];
slots[659] = slots[658] ^ slots[645];
slots[660] = (slots[644]).wrapping_add(slots[659]);
slots[661] = (slots[660]).wrapping_add(0xffffffffb596c523u64);
slots[662] = slots[661] << 11;
slots[663] = slots[661] & 0xffe00000u64;
slots[664] = slots[663] >> 21;
slots[665] = slots[664] | slots[662];
slots[666] = (slots[665]).wrapping_add(slots[656]);
slots[667] = slots[666] ^ 0xffffffffffffffffu64;
slots[668] = slots[645] | slots[667];
slots[669] = slots[668] ^ slots[656];
slots[670] = (slots[655]).wrapping_add(slots[669]);
slots[671] = (slots[670]).wrapping_add(0xffffffffb1fd28efu64);
slots[672] = slots[671] << 26;
slots[673] = slots[671] & 0xffffffc0u64;
slots[674] = slots[673] >> 6;
slots[675] = slots[674] | slots[672];
slots[676] = (slots[43]).wrapping_add(slots[656]);
slots[677] = (slots[675]).wrapping_add(slots[666]);
slots[678] = slots[677] ^ 0xffffffffffffffffu64;
slots[679] = slots[656] | slots[678];
slots[680] = slots[679] ^ slots[666];
slots[681] = (slots[645]).wrapping_add(slots[680]);
slots[682] = (slots[681]).wrapping_add(0x4b78b265u64);
slots[683] = slots[682] << 22;
slots[684] = slots[682] & 0xfffffc00u64;
slots[685] = slots[684] >> 10;
slots[686] = slots[685] | slots[683];
slots[687] = (slots[686]).wrapping_add(slots[677]);
slots[688] = slots[687] ^ 0xffffffffffffffffu64;
slots[689] = slots[666] | slots[688];
slots[690] = slots[689] ^ slots[677];
slots[691] = (slots[676]).wrapping_add(slots[690]);
slots[692] = (slots[691]).wrapping_add(0x5c0b8b53u64);
slots[693] = slots[692] << 17;
slots[694] = slots[692] & 0xffff8000u64;
slots[695] = slots[694] >> 15;
slots[696] = slots[695] | slots[693];
slots[697] = (slots[31]).wrapping_add(slots[677]);
slots[698] = (slots[696]).wrapping_add(slots[687]);
slots[699] = slots[698] ^ 0xffffffffffffffffu64;
slots[700] = slots[677] | slots[699];
slots[701] = slots[700] ^ slots[687];
slots[702] = (slots[666]).wrapping_add(slots[701]);
slots[703] = (slots[702]).wrapping_add(0xffffffffa26ab404u64);
slots[704] = slots[703] << 11;
slots[705] = slots[703] & 0xffe00000u64;
slots[706] = slots[705] >> 21;
slots[707] = slots[706] | slots[704];
slots[708] = (slots[687]).wrapping_add(0x1c43ecf9u64);
slots[709] = (slots[707]).wrapping_add(slots[698]);
slots[710] = slots[709] ^ 0xffffffffffffffffu64;
slots[711] = slots[687] | slots[710];
slots[712] = slots[711] ^ slots[698];
slots[713] = (slots[697]).wrapping_add(slots[712]);
slots[714] = (slots[713]).wrapping_add(0x38b6ca86u64);
slots[715] = slots[714] & 0xffffffc0u64;
slots[716] = slots[714] << 26;
slots[717] = slots[715] >> 6;
slots[718] = slots[717] | slots[716];
slots[719] = (slots[19]).wrapping_add(slots[698]);
slots[720] = (slots[718]).wrapping_add(slots[709]);
slots[721] = slots[720] ^ 0xffffffffffffffffu64;
slots[722] = slots[698] | slots[721];
slots[723] = slots[722] ^ slots[709];
slots[724] = (slots[708]).wrapping_add(slots[723]);
slots[725] = (slots[724]).wrapping_add(0xffffffff8d17d94au64);
slots[726] = slots[725] & 0xfffffc00u64;
slots[727] = slots[725] << 22;
slots[728] = slots[726] >> 10;
slots[729] = slots[728] | slots[727];
slots[730] = (slots[709]).wrapping_add(0x6ce1c012u64);
slots[731] = (slots[729]).wrapping_add(slots[720]);
slots[732] = slots[731] ^ 0xffffffffffffffffu64;
slots[733] = slots[709] | slots[732];
slots[734] = slots[733] ^ slots[720];
slots[735] = (slots[719]).wrapping_add(slots[734]);
slots[736] = (slots[731]).wrapping_add(0x9c4d7d6u64);
slots[737] = (slots[735]).wrapping_add(0xffffffffbcee287eu64);
slots[738] = slots[737] & 0xffff8000u64;
slots[739] = slots[737] << 17;
slots[740] = slots[738] >> 15;
slots[741] = slots[740] | slots[739];
slots[742] = (slots[720]).wrapping_add(0xffffffffece39db5u64);
slots[743] = slots[742] >> 16;
slots[744] = slots[742] >> 8;
slots[745] = slots[742] >> 24;
slots[746] = (slots[736]).wrapping_mul(0x85u64);
slots[747] = slots[736] & 0xffffffffu64;
slots[748] = slots[747] >> 8;
slots[749] = (slots[746]).wrapping_add(slots[748]);
slots[750] = slots[749] & 0xffu64;
slots[751] = (slots[750]).wrapping_mul(0x85u64);
slots[752] = (slots[748]).wrapping_mul(0x85u64);
slots[753] = slots[747] >> 16;
slots[754] = (slots[752]).wrapping_add(slots[753]);
slots[755] = (slots[754]).wrapping_mul(0x85u64);
slots[756] = (slots[751]).wrapping_add(slots[753]);
slots[757] = (slots[756]).wrapping_mul(0x85u64);
slots[758] = slots[747] >> 24;
slots[759] = (slots[753]).wrapping_mul(0x85u64);
slots[760] = (slots[759]).wrapping_add(slots[758]);
slots[761] = (slots[757]).wrapping_add(slots[758]);
slots[762] = (slots[755]).wrapping_add(slots[758]);
slots[763] = (slots[741]).wrapping_add(slots[731]);
slots[764] = (slots[763]).wrapping_add(0x73880622u64);
slots[765] = (slots[763]).wrapping_add(0x32d88f3fu64);
slots[766] = slots[763] ^ 0xffffffffffffffffu64;
slots[767] = slots[720] | slots[766];
slots[768] = slots[767] ^ slots[731];
slots[769] = (slots[730]).wrapping_add(slots[768]);
slots[770] = (slots[769]).wrapping_add(0x7b3d4c4au64);
slots[771] = slots[770] & 0xffe00000u64;
slots[772] = slots[770] << 11;
slots[773] = slots[771] >> 21;
slots[774] = slots[773] | slots[772];
slots[775] = (slots[765]).wrapping_add(slots[774]);
slots[776] = slots[764] >> 8;
slots[777] = slots[764] >> 16;
slots[778] = slots[764] >> 24;
slots[779] = slots[762] & 0xffu64;
slots[780] = (slots[779]).wrapping_mul(0x85u64);
slots[781] = (slots[761]).wrapping_mul(0x85u64);
slots[782] = (slots[760]).wrapping_mul(0x85u64);
slots[783] = (slots[782]).wrapping_add(slots[775]);
slots[784] = (slots[781]).wrapping_add(slots[775]);
slots[785] = (slots[780]).wrapping_add(slots[775]);
slots[786] = slots[775] & 0xffffffffu64;
slots[787] = slots[784] & 0xffu64;
slots[788] = (slots[787]).wrapping_mul(0x85u64);
slots[789] = slots[783] & 0xffu64;
slots[790] = (slots[789]).wrapping_mul(0x85u64);
slots[791] = slots[786] >> 8;
slots[792] = (slots[790]).wrapping_add(slots[791]);
slots[793] = (slots[788]).wrapping_add(slots[791]);
slots[794] = (slots[785]).wrapping_mul(0x85u64);
slots[795] = (slots[794]).wrapping_add(slots[791]);
slots[796] = (slots[795]).wrapping_mul(0x85u64);
slots[797] = (slots[793]).wrapping_mul(0x85u64);
slots[798] = slots[786] >> 16;
slots[799] = (slots[797]).wrapping_add(slots[798]);
slots[800] = (slots[796]).wrapping_add(slots[798]);
slots[801] = (slots[792]).wrapping_mul(0x85u64);
slots[802] = (slots[801]).wrapping_add(slots[798]);
slots[803] = (slots[802]).wrapping_mul(0x85u64);
slots[804] = slots[800] & 0xffu64;
slots[805] = (slots[804]).wrapping_mul(0x85u64);
slots[806] = slots[786] >> 24;
slots[807] = (slots[805]).wrapping_add(slots[806]);
slots[808] = (slots[803]).wrapping_add(slots[806]);
slots[809] = (slots[799]).wrapping_mul(0x85u64);
slots[810] = (slots[809]).wrapping_add(slots[806]);
slots[811] = slots[764] & 0xffu64;
slots[812] = slots[811] << 56;
slots[813] = ((slots[812] as i64) >> 56) as u64;
slots[814] = slots[813] & 0xffu64;
slots[815] = slots[810] & 0xffu64;
slots[816] = (slots[815]).wrapping_mul(0x85u64);
slots[817] = slots[808] & 0xffu64;
slots[818] = (slots[817]).wrapping_mul(0x85u64);
slots[819] = (slots[818]).wrapping_add(slots[814]);
slots[820] = (slots[816]).wrapping_add(slots[814]);
slots[821] = (slots[807]).wrapping_mul(0x85u64);
slots[822] = (slots[821]).wrapping_add(slots[814]);
slots[823] = slots[776] & 0xffu64;
slots[824] = slots[823] << 56;
slots[825] = ((slots[824] as i64) >> 56) as u64;
slots[826] = slots[825] & 0xffu64;
slots[827] = (slots[822]).wrapping_mul(0x85u64);
slots[828] = (slots[820]).wrapping_mul(0x85u64);
slots[829] = (slots[828]).wrapping_add(slots[826]);
slots[830] = (slots[827]).wrapping_add(slots[826]);
slots[831] = (slots[819]).wrapping_mul(0x85u64);
slots[832] = (slots[831]).wrapping_add(slots[826]);
slots[833] = slots[777] & 0xffu64;
slots[834] = slots[833] << 56;
slots[835] = ((slots[834] as i64) >> 56) as u64;
slots[836] = slots[835] & 0xffu64;
slots[837] = (slots[832]).wrapping_mul(0x85u64);
slots[838] = slots[830] & 0xffu64;
slots[839] = (slots[838]).wrapping_mul(0x85u64);
slots[840] = (slots[839]).wrapping_add(slots[836]);
slots[841] = (slots[837]).wrapping_add(slots[836]);
slots[842] = (slots[829]).wrapping_mul(0x85u64);
slots[843] = (slots[842]).wrapping_add(slots[836]);
slots[844] = slots[778] & 0xffu64;
slots[845] = slots[844] << 56;
slots[846] = ((slots[845] as i64) >> 56) as u64;
slots[847] = slots[846] & 0xffu64;
slots[848] = slots[843] & 0xffu64;
slots[849] = (slots[848]).wrapping_mul(0x85u64);
slots[850] = slots[841] & 0xffu64;
slots[851] = (slots[850]).wrapping_mul(0x85u64);
slots[852] = (slots[840]).wrapping_mul(0x85u64);
slots[853] = (slots[852]).wrapping_add(slots[847]);
slots[854] = (slots[851]).wrapping_add(slots[847]);
slots[855] = (slots[849]).wrapping_add(slots[847]);
slots[856] = slots[743] & 0xffu64;
slots[857] = slots[856] << 56;
slots[858] = ((slots[857] as i64) >> 56) as u64;
slots[859] = slots[858] & 0xffu64;
slots[860] = slots[744] & 0xffu64;
slots[861] = slots[860] << 56;
slots[862] = ((slots[861] as i64) >> 56) as u64;
slots[863] = slots[862] & 0xffu64;
slots[864] = slots[742] & 0xffu64;
slots[865] = slots[864] << 56;
slots[866] = ((slots[865] as i64) >> 56) as u64;
slots[867] = slots[866] & 0xffu64;
slots[868] = (slots[853]).wrapping_mul(0x85u64);
slots[869] = (slots[868]).wrapping_add(slots[867]);
slots[870] = slots[869] & 0xffu64;
slots[871] = (slots[870]).wrapping_mul(0x85u64);
slots[872] = (slots[871]).wrapping_add(slots[863]);
slots[873] = (slots[872]).wrapping_mul(0x85u64);
slots[874] = (slots[873]).wrapping_add(slots[859]);
slots[875] = slots[874] << 8;
slots[876] = slots[875] & 0x6f00u64;
slots[877] = (slots[855]).wrapping_mul(0x85u64);
slots[878] = (slots[877]).wrapping_add(slots[867]);
slots[879] = (slots[854]).wrapping_mul(0x85u64);
slots[880] = (slots[879]).wrapping_add(slots[867]);
slots[881] = (slots[880]).wrapping_mul(0x85u64);
slots[882] = (slots[881]).wrapping_add(slots[863]);
slots[883] = (slots[878]).wrapping_mul(0x85u64);
slots[884] = (slots[883]).wrapping_add(slots[863]);
slots[885] = slots[884] & 0x3fu64;
slots[886] = slots[885] | slots[876];
slots[887] = slots[882] & 0xffu64;
slots[888] = (slots[887]).wrapping_mul(0x85u64);
slots[889] = (slots[888]).wrapping_add(slots[859]);
slots[890] = (slots[889]).wrapping_mul(0x85u64);
slots[891] = slots[745] & 0xffu64;
slots[892] = slots[891] << 56;
slots[893] = ((slots[892] as i64) >> 56) as u64;
slots[894] = (slots[890]).wrapping_add(slots[893]);
slots[895] = slots[894] << 16;
slots[896] = slots[895] & 0x7b0000u64;
slots[897] = slots[886] | slots[896];
slots[898] = slots[897] | 0x63000000u64;
slots[899] = slots[898] & 0xffffffffu64;
Ok((slots[899] & 0xffffffff) as u32)
}
pub fn notice_id(bytes: &[u8]) -> Result<u32> {
from_md5_hex(&hex::encode(md5(bytes)))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn independent_arithmetic_vectors() {
for (input, expected) in [
("00000000000000000000000000000000", 1661168143),
("ffffffffffffffffffffffffffffffff", 1667433512),
("0123456789abcdef0123456789abcdef", 1663058469),
] {
assert_eq!(from_md5_hex(input).unwrap(), expected);
}
for (input, expected) in [
("", 1661159480),
("a", 1665223448),
("abc", 1668286726),
("synthetic notice checksum", 1662085121),
] {
assert_eq!(notice_id(input.as_bytes()).unwrap(), expected);
}
}
#[test]
fn input_domain_restricted() {
for s in [
"",
"0123",
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"0000000000000000000000000000000g",
] {
assert!(from_md5_hex(s).is_err());
}
}
}