77   constexpr uint32_t MAGIC2 = 0x5A827999;
 
   78   constexpr uint32_t MAGIC3 = 0x6ED9EBA1;
 
   79   constexpr uint32_t MAGIC4 = 0x8F1BBCDC;
 
   80   constexpr uint32_t MAGIC5 = 0xA953FD4E;
 
   81   constexpr uint32_t MAGIC6 = 0x50A28BE6;
 
   82   constexpr uint32_t MAGIC7 = 0x5C4DD124;
 
   83   constexpr uint32_t MAGIC8 = 0x6D703EF3;
 
   84   constexpr uint32_t MAGIC9 = 0x7A6D76E9;
 
   86   std::array<uint32_t, 16> M{};
 
   90   for(
size_t i = 0; i != blocks; ++i) {
 
   93      uint32_t A1 = digest[0];
 
   94      uint32_t B1 = digest[1];
 
   95      uint32_t C1 = digest[2];
 
   96      uint32_t D1 = digest[3];
 
   97      uint32_t E1 = digest[4];
 
  107      F1<11>(A1, B1, C1, D1, E1, M[ 0]);
 
  108      F5< 8>(A2, B2, C2, D2, E2, M[ 5] + MAGIC6);
 
  109      F1<14>(E1, A1, B1, C1, D1, M[ 1]);
 
  110      F5< 9>(E2, A2, B2, C2, D2, M[14] + MAGIC6);
 
  111      F1<15>(D1, E1, A1, B1, C1, M[ 2]);
 
  112      F5< 9>(D2, E2, A2, B2, C2, M[ 7] + MAGIC6);
 
  113      F1<12>(C1, D1, E1, A1, B1, M[ 3]);
 
  114      F5<11>(C2, D2, E2, A2, B2, M[ 0] + MAGIC6);
 
  115      F1< 5>(B1, C1, D1, E1, A1, M[ 4]);
 
  116      F5<13>(B2, C2, D2, E2, A2, M[ 9] + MAGIC6);
 
  117      F1< 8>(A1, B1, C1, D1, E1, M[ 5]);
 
  118      F5<15>(A2, B2, C2, D2, E2, M[ 2] + MAGIC6);
 
  119      F1< 7>(E1, A1, B1, C1, D1, M[ 6]);
 
  120      F5<15>(E2, A2, B2, C2, D2, M[11] + MAGIC6);
 
  121      F1< 9>(D1, E1, A1, B1, C1, M[ 7]);
 
  122      F5< 5>(D2, E2, A2, B2, C2, M[ 4] + MAGIC6);
 
  123      F1<11>(C1, D1, E1, A1, B1, M[ 8]);
 
  124      F5< 7>(C2, D2, E2, A2, B2, M[13] + MAGIC6);
 
  125      F1<13>(B1, C1, D1, E1, A1, M[ 9]);
 
  126      F5< 7>(B2, C2, D2, E2, A2, M[ 6] + MAGIC6);
 
  127      F1<14>(A1, B1, C1, D1, E1, M[10]);
 
  128      F5< 8>(A2, B2, C2, D2, E2, M[15] + MAGIC6);
 
  129      F1<15>(E1, A1, B1, C1, D1, M[11]);
 
  130      F5<11>(E2, A2, B2, C2, D2, M[ 8] + MAGIC6);
 
  131      F1< 6>(D1, E1, A1, B1, C1, M[12]);
 
  132      F5<14>(D2, E2, A2, B2, C2, M[ 1] + MAGIC6);
 
  133      F1< 7>(C1, D1, E1, A1, B1, M[13]);
 
  134      F5<14>(C2, D2, E2, A2, B2, M[10] + MAGIC6);
 
  135      F1< 9>(B1, C1, D1, E1, A1, M[14]);
 
  136      F5<12>(B2, C2, D2, E2, A2, M[ 3] + MAGIC6);
 
  137      F1< 8>(A1, B1, C1, D1, E1, M[15]);
 
  138      F5< 6>(A2, B2, C2, D2, E2, M[12] + MAGIC6);
 
  140      F2< 7>(E1, A1, B1, C1, D1, M[ 7] + MAGIC2);
 
  141      F4< 9>(E2, A2, B2, C2, D2, M[ 6] + MAGIC7);
 
  142      F2< 6>(D1, E1, A1, B1, C1, M[ 4] + MAGIC2);
 
  143      F4<13>(D2, E2, A2, B2, C2, M[11] + MAGIC7);
 
  144      F2< 8>(C1, D1, E1, A1, B1, M[13] + MAGIC2);
 
  145      F4<15>(C2, D2, E2, A2, B2, M[ 3] + MAGIC7);
 
  146      F2<13>(B1, C1, D1, E1, A1, M[ 1] + MAGIC2);
 
  147      F4< 7>(B2, C2, D2, E2, A2, M[ 7] + MAGIC7);
 
  148      F2<11>(A1, B1, C1, D1, E1, M[10] + MAGIC2);
 
  149      F4<12>(A2, B2, C2, D2, E2, M[ 0] + MAGIC7);
 
  150      F2< 9>(E1, A1, B1, C1, D1, M[ 6] + MAGIC2);
 
  151      F4< 8>(E2, A2, B2, C2, D2, M[13] + MAGIC7);
 
  152      F2< 7>(D1, E1, A1, B1, C1, M[15] + MAGIC2);
 
  153      F4< 9>(D2, E2, A2, B2, C2, M[ 5] + MAGIC7);
 
  154      F2<15>(C1, D1, E1, A1, B1, M[ 3] + MAGIC2);
 
  155      F4<11>(C2, D2, E2, A2, B2, M[10] + MAGIC7);
 
  156      F2< 7>(B1, C1, D1, E1, A1, M[12] + MAGIC2);
 
  157      F4< 7>(B2, C2, D2, E2, A2, M[14] + MAGIC7);
 
  158      F2<12>(A1, B1, C1, D1, E1, M[ 0] + MAGIC2);
 
  159      F4< 7>(A2, B2, C2, D2, E2, M[15] + MAGIC7);
 
  160      F2<15>(E1, A1, B1, C1, D1, M[ 9] + MAGIC2);
 
  161      F4<12>(E2, A2, B2, C2, D2, M[ 8] + MAGIC7);
 
  162      F2< 9>(D1, E1, A1, B1, C1, M[ 5] + MAGIC2);
 
  163      F4< 7>(D2, E2, A2, B2, C2, M[12] + MAGIC7);
 
  164      F2<11>(C1, D1, E1, A1, B1, M[ 2] + MAGIC2);
 
  165      F4< 6>(C2, D2, E2, A2, B2, M[ 4] + MAGIC7);
 
  166      F2< 7>(B1, C1, D1, E1, A1, M[14] + MAGIC2);
 
  167      F4<15>(B2, C2, D2, E2, A2, M[ 9] + MAGIC7);
 
  168      F2<13>(A1, B1, C1, D1, E1, M[11] + MAGIC2);
 
  169      F4<13>(A2, B2, C2, D2, E2, M[ 1] + MAGIC7);
 
  170      F2<12>(E1, A1, B1, C1, D1, M[ 8] + MAGIC2);
 
  171      F4<11>(E2, A2, B2, C2, D2, M[ 2] + MAGIC7);
 
  173      F3<11>(D1, E1, A1, B1, C1, M[ 3] + MAGIC3);
 
  174      F3< 9>(D2, E2, A2, B2, C2, M[15] + MAGIC8);
 
  175      F3<13>(C1, D1, E1, A1, B1, M[10] + MAGIC3);
 
  176      F3< 7>(C2, D2, E2, A2, B2, M[ 5] + MAGIC8);
 
  177      F3< 6>(B1, C1, D1, E1, A1, M[14] + MAGIC3);
 
  178      F3<15>(B2, C2, D2, E2, A2, M[ 1] + MAGIC8);
 
  179      F3< 7>(A1, B1, C1, D1, E1, M[ 4] + MAGIC3);
 
  180      F3<11>(A2, B2, C2, D2, E2, M[ 3] + MAGIC8);
 
  181      F3<14>(E1, A1, B1, C1, D1, M[ 9] + MAGIC3);
 
  182      F3< 8>(E2, A2, B2, C2, D2, M[ 7] + MAGIC8);
 
  183      F3< 9>(D1, E1, A1, B1, C1, M[15] + MAGIC3);
 
  184      F3< 6>(D2, E2, A2, B2, C2, M[14] + MAGIC8);
 
  185      F3<13>(C1, D1, E1, A1, B1, M[ 8] + MAGIC3);
 
  186      F3< 6>(C2, D2, E2, A2, B2, M[ 6] + MAGIC8);
 
  187      F3<15>(B1, C1, D1, E1, A1, M[ 1] + MAGIC3);
 
  188      F3<14>(B2, C2, D2, E2, A2, M[ 9] + MAGIC8);
 
  189      F3<14>(A1, B1, C1, D1, E1, M[ 2] + MAGIC3);
 
  190      F3<12>(A2, B2, C2, D2, E2, M[11] + MAGIC8);
 
  191      F3< 8>(E1, A1, B1, C1, D1, M[ 7] + MAGIC3);
 
  192      F3<13>(E2, A2, B2, C2, D2, M[ 8] + MAGIC8);
 
  193      F3<13>(D1, E1, A1, B1, C1, M[ 0] + MAGIC3);
 
  194      F3< 5>(D2, E2, A2, B2, C2, M[12] + MAGIC8);
 
  195      F3< 6>(C1, D1, E1, A1, B1, M[ 6] + MAGIC3);
 
  196      F3<14>(C2, D2, E2, A2, B2, M[ 2] + MAGIC8);
 
  197      F3< 5>(B1, C1, D1, E1, A1, M[13] + MAGIC3);
 
  198      F3<13>(B2, C2, D2, E2, A2, M[10] + MAGIC8);
 
  199      F3<12>(A1, B1, C1, D1, E1, M[11] + MAGIC3);
 
  200      F3<13>(A2, B2, C2, D2, E2, M[ 0] + MAGIC8);
 
  201      F3< 7>(E1, A1, B1, C1, D1, M[ 5] + MAGIC3);
 
  202      F3< 7>(E2, A2, B2, C2, D2, M[ 4] + MAGIC8);
 
  203      F3< 5>(D1, E1, A1, B1, C1, M[12] + MAGIC3);
 
  204      F3< 5>(D2, E2, A2, B2, C2, M[13] + MAGIC8);
 
  206      F4<11>(C1, D1, E1, A1, B1, M[ 1] + MAGIC4);
 
  207      F2<15>(C2, D2, E2, A2, B2, M[ 8] + MAGIC9);
 
  208      F4<12>(B1, C1, D1, E1, A1, M[ 9] + MAGIC4);
 
  209      F2< 5>(B2, C2, D2, E2, A2, M[ 6] + MAGIC9);
 
  210      F4<14>(A1, B1, C1, D1, E1, M[11] + MAGIC4);
 
  211      F2< 8>(A2, B2, C2, D2, E2, M[ 4] + MAGIC9);
 
  212      F4<15>(E1, A1, B1, C1, D1, M[10] + MAGIC4);
 
  213      F2<11>(E2, A2, B2, C2, D2, M[ 1] + MAGIC9);
 
  214      F4<14>(D1, E1, A1, B1, C1, M[ 0] + MAGIC4);
 
  215      F2<14>(D2, E2, A2, B2, C2, M[ 3] + MAGIC9);
 
  216      F4<15>(C1, D1, E1, A1, B1, M[ 8] + MAGIC4);
 
  217      F2<14>(C2, D2, E2, A2, B2, M[11] + MAGIC9);
 
  218      F4< 9>(B1, C1, D1, E1, A1, M[12] + MAGIC4);
 
  219      F2< 6>(B2, C2, D2, E2, A2, M[15] + MAGIC9);
 
  220      F4< 8>(A1, B1, C1, D1, E1, M[ 4] + MAGIC4);
 
  221      F2<14>(A2, B2, C2, D2, E2, M[ 0] + MAGIC9);
 
  222      F4< 9>(E1, A1, B1, C1, D1, M[13] + MAGIC4);
 
  223      F2< 6>(E2, A2, B2, C2, D2, M[ 5] + MAGIC9);
 
  224      F4<14>(D1, E1, A1, B1, C1, M[ 3] + MAGIC4);
 
  225      F2< 9>(D2, E2, A2, B2, C2, M[12] + MAGIC9);
 
  226      F4< 5>(C1, D1, E1, A1, B1, M[ 7] + MAGIC4);
 
  227      F2<12>(C2, D2, E2, A2, B2, M[ 2] + MAGIC9);
 
  228      F4< 6>(B1, C1, D1, E1, A1, M[15] + MAGIC4);
 
  229      F2< 9>(B2, C2, D2, E2, A2, M[13] + MAGIC9);
 
  230      F4< 8>(A1, B1, C1, D1, E1, M[14] + MAGIC4);
 
  231      F2<12>(A2, B2, C2, D2, E2, M[ 9] + MAGIC9);
 
  232      F4< 6>(E1, A1, B1, C1, D1, M[ 5] + MAGIC4);
 
  233      F2< 5>(E2, A2, B2, C2, D2, M[ 7] + MAGIC9);
 
  234      F4< 5>(D1, E1, A1, B1, C1, M[ 6] + MAGIC4);
 
  235      F2<15>(D2, E2, A2, B2, C2, M[10] + MAGIC9);
 
  236      F4<12>(C1, D1, E1, A1, B1, M[ 2] + MAGIC4);
 
  237      F2< 8>(C2, D2, E2, A2, B2, M[14] + MAGIC9);
 
  239      F5< 9>(B1, C1, D1, E1, A1, M[ 4] + MAGIC5);
 
  240      F1< 8>(B2, C2, D2, E2, A2, M[12]);
 
  241      F5<15>(A1, B1, C1, D1, E1, M[ 0] + MAGIC5);
 
  242      F1< 5>(A2, B2, C2, D2, E2, M[15]);
 
  243      F5< 5>(E1, A1, B1, C1, D1, M[ 5] + MAGIC5);
 
  244      F1<12>(E2, A2, B2, C2, D2, M[10]);
 
  245      F5<11>(D1, E1, A1, B1, C1, M[ 9] + MAGIC5);
 
  246      F1< 9>(D2, E2, A2, B2, C2, M[ 4]);
 
  247      F5< 6>(C1, D1, E1, A1, B1, M[ 7] + MAGIC5);
 
  248      F1<12>(C2, D2, E2, A2, B2, M[ 1]);
 
  249      F5< 8>(B1, C1, D1, E1, A1, M[12] + MAGIC5);
 
  250      F1< 5>(B2, C2, D2, E2, A2, M[ 5]);
 
  251      F5<13>(A1, B1, C1, D1, E1, M[ 2] + MAGIC5);
 
  252      F1<14>(A2, B2, C2, D2, E2, M[ 8]);
 
  253      F5<12>(E1, A1, B1, C1, D1, M[10] + MAGIC5);
 
  254      F1< 6>(E2, A2, B2, C2, D2, M[ 7]);
 
  255      F5< 5>(D1, E1, A1, B1, C1, M[14] + MAGIC5);
 
  256      F1< 8>(D2, E2, A2, B2, C2, M[ 6]);
 
  257      F5<12>(C1, D1, E1, A1, B1, M[ 1] + MAGIC5);
 
  258      F1<13>(C2, D2, E2, A2, B2, M[ 2]);
 
  259      F5<13>(B1, C1, D1, E1, A1, M[ 3] + MAGIC5);
 
  260      F1< 6>(B2, C2, D2, E2, A2, M[13]);
 
  261      F5<14>(A1, B1, C1, D1, E1, M[ 8] + MAGIC5);
 
  262      F1< 5>(A2, B2, C2, D2, E2, M[14]);
 
  263      F5<11>(E1, A1, B1, C1, D1, M[11] + MAGIC5);
 
  264      F1<15>(E2, A2, B2, C2, D2, M[ 0]);
 
  265      F5< 8>(D1, E1, A1, B1, C1, M[ 6] + MAGIC5);
 
  266      F1<13>(D2, E2, A2, B2, C2, M[ 3]);
 
  267      F5< 5>(C1, D1, E1, A1, B1, M[15] + MAGIC5);
 
  268      F1<11>(C2, D2, E2, A2, B2, M[ 9]);
 
  269      F5< 6>(B1, C1, D1, E1, A1, M[13] + MAGIC5);
 
  270      F1<11>(B2, C2, D2, E2, A2, M[11]);
 
  274      C1 = digest[1] + C1 + D2;
 
  275      digest[1] = digest[2] + D1 + E2;
 
  276      digest[2] = digest[3] + E1 + A2;
 
  277      digest[3] = digest[4] + A1 + B2;
 
  278      digest[4] = digest[0] + B1 + C2;