/*
The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
Michaël Peeters and Gilles Van Assche. For more information, feedback or
questions, please refer to our website: http://keccak.noekeon.org/

Implementation by Ronny Van Keer,
hereby denoted as "the implementer".

To the extent possible under law, the implementer has waived all copyright
and related or neighboring rights to the source code in this file.
http://creativecommons.org/publicdomain/zero/1.0/
*/

static const UINT32 KeccakF1600RoundConstants_int2[2*24] =
{
    0x00000001UL,    0x00000000UL,
    0x00000000UL,    0x00000089UL,
    0x00000000UL,    0x8000008bUL,
    0x00000000UL,    0x80008080UL,
    0x00000001UL,    0x0000008bUL,
    0x00000001UL,    0x00008000UL,
    0x00000001UL,    0x80008088UL,
    0x00000001UL,    0x80000082UL,
    0x00000000UL,    0x0000000bUL,
    0x00000000UL,    0x0000000aUL,
    0x00000001UL,    0x00008082UL,
    0x00000000UL,    0x00008003UL,
    0x00000001UL,    0x0000808bUL,
    0x00000001UL,    0x8000000bUL,
    0x00000001UL,    0x8000008aUL,
    0x00000001UL,    0x80000081UL,
    0x00000000UL,    0x80000081UL,
    0x00000000UL,    0x80000008UL,
    0x00000000UL,    0x00000083UL,
    0x00000000UL,    0x80008003UL,
    0x00000001UL,    0x80008088UL,
    0x00000000UL,    0x80000088UL,
    0x00000001UL,    0x00008000UL,
    0x00000000UL,    0x80008082UL
};

#undef rounds

#define rounds(round) \
{ \
    UINT32 Da0, De0, Di0, Do0, Du0; \
    UINT32 Da1, De1, Di1, Do1, Du1; \
    UINT32 Ba, Be, Bi, Bo, Bu; \
    UINT32 Aba0, Abe0, Abi0, Abo0, Abu0; \
    UINT32 Aba1, Abe1, Abi1, Abo1, Abu1; \
    UINT32 Aga0, Age0, Agi0, Ago0, Agu0; \
    UINT32 Aga1, Age1, Agi1, Ago1, Agu1; \
    UINT32 Aka0, Ake0, Aki0, Ako0, Aku0; \
    UINT32 Aka1, Ake1, Aki1, Ako1, Aku1; \
    UINT32 Ama0, Ame0, Ami0, Amo0, Amu0; \
    UINT32 Ama1, Ame1, Ami1, Amo1, Amu1; \
    UINT32 Asa0, Ase0, Asi0, Aso0, Asu0; \
    UINT32 Asa1, Ase1, Asi1, Aso1, Asu1; \
    UINT32 Cw, Cx, Cy, Cz; \
    UINT32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; \
    UINT32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; \
    UINT32 Ega0, Ege0, Egi0, Ego0, Egu0; \
    UINT32 Ega1, Ege1, Egi1, Ego1, Egu1; \
    UINT32 Eka0, Eke0, Eki0, Eko0, Eku0; \
    UINT32 Eka1, Eke1, Eki1, Eko1, Eku1; \
    UINT32 Ema0, Eme0, Emi0, Emo0, Emu0; \
    UINT32 Ema1, Eme1, Emi1, Emo1, Emu1; \
    UINT32 Esa0, Ese0, Esi0, Eso0, Esu0; \
    UINT32 Esa1, Ese1, Esi1, Eso1, Esu1; \
	const UINT32 * pRoundConstants = KeccakF1600RoundConstants_int2; \
    UINT32 i; \
\
    copyFromState(A, state) \
\
    for( i = round/2; i != 0; --i ) { \
	    Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
	    Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
	    Da0 = Cx^ROL32(Du1, 1); \
	    Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
	    Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
	    Da1 = Cz^Du0; \
\
	    Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
	    Do0 = Cw^ROL32(Cz, 1); \
	    Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
	    Do1 = Cy^Cx; \
\
	    Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
	    De0 = Cx^ROL32(Cy, 1); \
	    Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
	    De1 = Cz^Cw; \
\
	    Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
	    Di0 = Du0^ROL32(Cy, 1); \
	    Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
	    Di1 = Du1^Cw; \
\
	    Du0 = Cw^ROL32(Cz, 1); \
	    Du1 = Cy^Cx; \
\
	    Aba0 ^= Da0; \
	    Ba = Aba0; \
	    Age0 ^= De0; \
	    Be = ROL32(Age0, 22); \
	    Aki1 ^= Di1; \
	    Bi = ROL32(Aki1, 22); \
	    Amo1 ^= Do1; \
	    Bo = ROL32(Amo1, 11); \
	    Asu0 ^= Du0; \
	    Bu = ROL32(Asu0, 7); \
	    Eba0 =   Ba ^((~Be)&  Bi ) ^ *(pRoundConstants++); \
	    Ebe0 =   Be ^((~Bi)&  Bo ); \
	    Ebi0 =   Bi ^((~Bo)&  Bu ); \
	    Ebo0 =   Bo ^((~Bu)&  Ba ); \
	    Ebu0 =   Bu ^((~Ba)&  Be ); \
\
	    Abo0 ^= Do0; \
	    Ba = ROL32(Abo0, 14); \
	    Agu0 ^= Du0; \
	    Be = ROL32(Agu0, 10); \
	    Aka1 ^= Da1; \
	    Bi = ROL32(Aka1, 2); \
	    Ame1 ^= De1; \
	    Bo = ROL32(Ame1, 23); \
	    Asi1 ^= Di1; \
	    Bu = ROL32(Asi1, 31); \
	    Ega0 =   Ba ^((~Be)&  Bi ); \
	    Ege0 =   Be ^((~Bi)&  Bo ); \
	    Egi0 =   Bi ^((~Bo)&  Bu ); \
	    Ego0 =   Bo ^((~Bu)&  Ba ); \
	    Egu0 =   Bu ^((~Ba)&  Be ); \
\
	    Abe1 ^= De1; \
	    Ba = ROL32(Abe1, 1); \
	    Agi0 ^= Di0; \
	    Be = ROL32(Agi0, 3); \
	    Ako1 ^= Do1; \
	    Bi = ROL32(Ako1, 13); \
	    Amu0 ^= Du0; \
	    Bo = ROL32(Amu0, 4); \
	    Asa0 ^= Da0; \
	    Bu = ROL32(Asa0, 9); \
	    Eka0 =   Ba ^((~Be)&  Bi ); \
	    Eke0 =   Be ^((~Bi)&  Bo ); \
	    Eki0 =   Bi ^((~Bo)&  Bu ); \
	    Eko0 =   Bo ^((~Bu)&  Ba ); \
	    Eku0 =   Bu ^((~Ba)&  Be ); \
\
	    Abu1 ^= Du1; \
	    Ba = ROL32(Abu1, 14); \
	    Aga0 ^= Da0; \
	    Be = ROL32(Aga0, 18); \
	    Ake0 ^= De0; \
	    Bi = ROL32(Ake0, 5); \
	    Ami1 ^= Di1; \
	    Bo = ROL32(Ami1, 8); \
	    Aso0 ^= Do0; \
	    Bu = ROL32(Aso0, 28); \
	    Ema0 =   Ba ^((~Be)&  Bi ); \
	    Eme0 =   Be ^((~Bi)&  Bo ); \
	    Emi0 =   Bi ^((~Bo)&  Bu ); \
	    Emo0 =   Bo ^((~Bu)&  Ba ); \
	    Emu0 =   Bu ^((~Ba)&  Be ); \
\
	    Abi0 ^= Di0; \
	    Ba = ROL32(Abi0, 31); \
	    Ago1 ^= Do1; \
	    Be = ROL32(Ago1, 28); \
	    Aku1 ^= Du1; \
	    Bi = ROL32(Aku1, 20); \
	    Ama1 ^= Da1; \
	    Bo = ROL32(Ama1, 21); \
	    Ase0 ^= De0; \
	    Bu = ROL32(Ase0, 1); \
	    Esa0 =   Ba ^((~Be)&  Bi ); \
	    Ese0 =   Be ^((~Bi)&  Bo ); \
	    Esi0 =   Bi ^((~Bo)&  Bu ); \
	    Eso0 =   Bo ^((~Bu)&  Ba ); \
	    Esu0 =   Bu ^((~Ba)&  Be ); \
\
	    Aba1 ^= Da1; \
	    Ba = Aba1; \
	    Age1 ^= De1; \
	    Be = ROL32(Age1, 22); \
	    Aki0 ^= Di0; \
	    Bi = ROL32(Aki0, 21); \
	    Amo0 ^= Do0; \
	    Bo = ROL32(Amo0, 10); \
	    Asu1 ^= Du1; \
	    Bu = ROL32(Asu1, 7); \
	    Eba1 =   Ba ^((~Be)&  Bi ); \
	    Eba1 ^= *(pRoundConstants++); \
	    Ebe1 =   Be ^((~Bi)&  Bo ); \
	    Ebi1 =   Bi ^((~Bo)&  Bu ); \
	    Ebo1 =   Bo ^((~Bu)&  Ba ); \
	    Ebu1 =   Bu ^((~Ba)&  Be ); \
\
	    Abo1 ^= Do1; \
	    Ba = ROL32(Abo1, 14); \
	    Agu1 ^= Du1; \
	    Be = ROL32(Agu1, 10); \
	    Aka0 ^= Da0; \
	    Bi = ROL32(Aka0, 1); \
	    Ame0 ^= De0; \
	    Bo = ROL32(Ame0, 22); \
	    Asi0 ^= Di0; \
	    Bu = ROL32(Asi0, 30); \
	    Ega1 =   Ba ^((~Be)&  Bi ); \
	    Ege1 =   Be ^((~Bi)&  Bo ); \
	    Egi1 =   Bi ^((~Bo)&  Bu ); \
	    Ego1 =   Bo ^((~Bu)&  Ba ); \
	    Egu1 =   Bu ^((~Ba)&  Be ); \
\
	    Abe0 ^= De0; \
	    Ba = Abe0; \
	    Agi1 ^= Di1; \
	    Be = ROL32(Agi1, 3); \
	    Ako0 ^= Do0; \
	    Bi = ROL32(Ako0, 12); \
	    Amu1 ^= Du1; \
	    Bo = ROL32(Amu1, 4); \
	    Asa1 ^= Da1; \
	    Bu = ROL32(Asa1, 9); \
	    Eka1 =   Ba ^((~Be)&  Bi ); \
	    Eke1 =   Be ^((~Bi)&  Bo ); \
	    Eki1 =   Bi ^((~Bo)&  Bu ); \
	    Eko1 =   Bo ^((~Bu)&  Ba ); \
	    Eku1 =   Bu ^((~Ba)&  Be ); \
\
	    Abu0 ^= Du0; \
	    Ba = ROL32(Abu0, 13); \
	    Aga1 ^= Da1; \
	    Be = ROL32(Aga1, 18); \
	    Ake1 ^= De1; \
	    Bi = ROL32(Ake1, 5); \
	    Ami0 ^= Di0; \
	    Bo = ROL32(Ami0, 7); \
	    Aso1 ^= Do1; \
	    Bu = ROL32(Aso1, 28); \
	    Ema1 =   Ba ^((~Be)&  Bi ); \
	    Eme1 =   Be ^((~Bi)&  Bo ); \
	    Emi1 =   Bi ^((~Bo)&  Bu ); \
	    Emo1 =   Bo ^((~Bu)&  Ba ); \
	    Emu1 =   Bu ^((~Ba)&  Be ); \
\
	    Abi1 ^= Di1; \
	    Ba = ROL32(Abi1, 31); \
	    Ago0 ^= Do0; \
	    Be = ROL32(Ago0, 27); \
	    Aku0 ^= Du0; \
	    Bi = ROL32(Aku0, 19); \
	    Ama0 ^= Da0; \
	    Bo = ROL32(Ama0, 20); \
	    Ase1 ^= De1; \
	    Bu = ROL32(Ase1, 1); \
	    Esa1 =   Ba ^((~Be)&  Bi ); \
	    Ese1 =   Be ^((~Bi)&  Bo ); \
	    Esi1 =   Bi ^((~Bo)&  Bu ); \
	    Eso1 =   Bo ^((~Bu)&  Ba ); \
	    Esu1 =   Bu ^((~Ba)&  Be ); \
\
	    Cx = Ebu0^Egu0^Eku0^Emu0^Esu0; \
	    Du1 = Ebe1^Ege1^Eke1^Eme1^Ese1; \
	    Da0 = Cx^ROL32(Du1, 1); \
	    Cz = Ebu1^Egu1^Eku1^Emu1^Esu1; \
	    Du0 = Ebe0^Ege0^Eke0^Eme0^Ese0; \
	    Da1 = Cz^Du0; \
\
	    Cw = Ebi0^Egi0^Eki0^Emi0^Esi0; \
	    Do0 = Cw^ROL32(Cz, 1); \
	    Cy = Ebi1^Egi1^Eki1^Emi1^Esi1; \
	    Do1 = Cy^Cx; \
\
	    Cx = Eba0^Ega0^Eka0^Ema0^Esa0; \
	    De0 = Cx^ROL32(Cy, 1); \
	    Cz = Eba1^Ega1^Eka1^Ema1^Esa1; \
	    De1 = Cz^Cw; \
\
	    Cy = Ebo1^Ego1^Eko1^Emo1^Eso1; \
	    Di0 = Du0^ROL32(Cy, 1); \
	    Cw = Ebo0^Ego0^Eko0^Emo0^Eso0; \
	    Di1 = Du1^Cw; \
\
	    Du0 = Cw^ROL32(Cz, 1); \
	    Du1 = Cy^Cx; \
\
	    Eba0 ^= Da0; \
	    Ba = Eba0; \
	    Ege0 ^= De0; \
	    Be = ROL32(Ege0, 22); \
	    Eki1 ^= Di1; \
	    Bi = ROL32(Eki1, 22); \
	    Emo1 ^= Do1; \
	    Bo = ROL32(Emo1, 11); \
	    Esu0 ^= Du0; \
	    Bu = ROL32(Esu0, 7); \
	    Aba0 =   Ba ^((~Be)&  Bi ); \
	    Aba0 ^= *(pRoundConstants++); \
	    Abe0 =   Be ^((~Bi)&  Bo ); \
	    Abi0 =   Bi ^((~Bo)&  Bu ); \
	    Abo0 =   Bo ^((~Bu)&  Ba ); \
	    Abu0 =   Bu ^((~Ba)&  Be ); \
\
	    Ebo0 ^= Do0; \
	    Ba = ROL32(Ebo0, 14); \
	    Egu0 ^= Du0; \
	    Be = ROL32(Egu0, 10); \
	    Eka1 ^= Da1; \
	    Bi = ROL32(Eka1, 2); \
	    Eme1 ^= De1; \
	    Bo = ROL32(Eme1, 23); \
	    Esi1 ^= Di1; \
	    Bu = ROL32(Esi1, 31); \
	    Aga0 =   Ba ^((~Be)&  Bi ); \
	    Age0 =   Be ^((~Bi)&  Bo ); \
	    Agi0 =   Bi ^((~Bo)&  Bu ); \
	    Ago0 =   Bo ^((~Bu)&  Ba ); \
	    Agu0 =   Bu ^((~Ba)&  Be ); \
\
	    Ebe1 ^= De1; \
	    Ba = ROL32(Ebe1, 1); \
	    Egi0 ^= Di0; \
	    Be = ROL32(Egi0, 3); \
	    Eko1 ^= Do1; \
	    Bi = ROL32(Eko1, 13); \
	    Emu0 ^= Du0; \
	    Bo = ROL32(Emu0, 4); \
	    Esa0 ^= Da0; \
	    Bu = ROL32(Esa0, 9); \
	    Aka0 =   Ba ^((~Be)&  Bi ); \
	    Ake0 =   Be ^((~Bi)&  Bo ); \
	    Aki0 =   Bi ^((~Bo)&  Bu ); \
	    Ako0 =   Bo ^((~Bu)&  Ba ); \
	    Aku0 =   Bu ^((~Ba)&  Be ); \
\
	    Ebu1 ^= Du1; \
	    Ba = ROL32(Ebu1, 14); \
	    Ega0 ^= Da0; \
	    Be = ROL32(Ega0, 18); \
	    Eke0 ^= De0; \
	    Bi = ROL32(Eke0, 5); \
	    Emi1 ^= Di1; \
	    Bo = ROL32(Emi1, 8); \
	    Eso0 ^= Do0; \
	    Bu = ROL32(Eso0, 28); \
	    Ama0 =   Ba ^((~Be)&  Bi ); \
	    Ame0 =   Be ^((~Bi)&  Bo ); \
	    Ami0 =   Bi ^((~Bo)&  Bu ); \
	    Amo0 =   Bo ^((~Bu)&  Ba ); \
	    Amu0 =   Bu ^((~Ba)&  Be ); \
\
	    Ebi0 ^= Di0; \
	    Ba = ROL32(Ebi0, 31); \
	    Ego1 ^= Do1; \
	    Be = ROL32(Ego1, 28); \
	    Eku1 ^= Du1; \
	    Bi = ROL32(Eku1, 20); \
	    Ema1 ^= Da1; \
	    Bo = ROL32(Ema1, 21); \
	    Ese0 ^= De0; \
	    Bu = ROL32(Ese0, 1); \
	    Asa0 =   Ba ^((~Be)&  Bi ); \
	    Ase0 =   Be ^((~Bi)&  Bo ); \
	    Asi0 =   Bi ^((~Bo)&  Bu ); \
	    Aso0 =   Bo ^((~Bu)&  Ba ); \
	    Asu0 =   Bu ^((~Ba)&  Be ); \
\
	    Eba1 ^= Da1; \
	    Ba = Eba1; \
	    Ege1 ^= De1; \
	    Be = ROL32(Ege1, 22); \
	    Eki0 ^= Di0; \
	    Bi = ROL32(Eki0, 21); \
	    Emo0 ^= Do0; \
	    Bo = ROL32(Emo0, 10); \
	    Esu1 ^= Du1; \
	    Bu = ROL32(Esu1, 7); \
	    Aba1 =   Ba ^((~Be)&  Bi ); \
	    Aba1 ^= *(pRoundConstants++); \
	    Abe1 =   Be ^((~Bi)&  Bo ); \
	    Abi1 =   Bi ^((~Bo)&  Bu ); \
	    Abo1 =   Bo ^((~Bu)&  Ba ); \
	    Abu1 =   Bu ^((~Ba)&  Be ); \
\
	    Ebo1 ^= Do1; \
	    Ba = ROL32(Ebo1, 14); \
	    Egu1 ^= Du1; \
	    Be = ROL32(Egu1, 10); \
	    Eka0 ^= Da0; \
	    Bi = ROL32(Eka0, 1); \
	    Eme0 ^= De0; \
	    Bo = ROL32(Eme0, 22); \
	    Esi0 ^= Di0; \
	    Bu = ROL32(Esi0, 30); \
	    Aga1 =   Ba ^((~Be)&  Bi ); \
	    Age1 =   Be ^((~Bi)&  Bo ); \
	    Agi1 =   Bi ^((~Bo)&  Bu ); \
	    Ago1 =   Bo ^((~Bu)&  Ba ); \
	    Agu1 =   Bu ^((~Ba)&  Be ); \
\
	    Ebe0 ^= De0; \
	    Ba = Ebe0; \
	    Egi1 ^= Di1; \
	    Be = ROL32(Egi1, 3); \
	    Eko0 ^= Do0; \
	    Bi = ROL32(Eko0, 12); \
	    Emu1 ^= Du1; \
	    Bo = ROL32(Emu1, 4); \
	    Esa1 ^= Da1; \
	    Bu = ROL32(Esa1, 9); \
	    Aka1 =   Ba ^((~Be)&  Bi ); \
	    Ake1 =   Be ^((~Bi)&  Bo ); \
	    Aki1 =   Bi ^((~Bo)&  Bu ); \
	    Ako1 =   Bo ^((~Bu)&  Ba ); \
	    Aku1 =   Bu ^((~Ba)&  Be ); \
\
	    Ebu0 ^= Du0; \
	    Ba = ROL32(Ebu0, 13); \
	    Ega1 ^= Da1; \
	    Be = ROL32(Ega1, 18); \
	    Eke1 ^= De1; \
	    Bi = ROL32(Eke1, 5); \
	    Emi0 ^= Di0; \
	    Bo = ROL32(Emi0, 7); \
	    Eso1 ^= Do1; \
	    Bu = ROL32(Eso1, 28); \
	    Ama1 =   Ba ^((~Be)&  Bi ); \
	    Ame1 =   Be ^((~Bi)&  Bo ); \
	    Ami1 =   Bi ^((~Bo)&  Bu ); \
	    Amo1 =   Bo ^((~Bu)&  Ba ); \
	    Amu1 =   Bu ^((~Ba)&  Be ); \
\
	    Ebi1 ^= Di1; \
	    Ba = ROL32(Ebi1, 31); \
	    Ego0 ^= Do0; \
	    Be = ROL32(Ego0, 27); \
	    Eku0 ^= Du0; \
	    Bi = ROL32(Eku0, 19); \
	    Ema0 ^= Da0; \
	    Bo = ROL32(Ema0, 20); \
	    Ese1 ^= De1; \
	    Bu = ROL32(Ese1, 1); \
	    Asa1 =   Ba ^((~Be)&  Bi ); \
	    Ase1 =   Be ^((~Bi)&  Bo ); \
	    Asi1 =   Bi ^((~Bo)&  Bu ); \
	    Aso1 =   Bo ^((~Bu)&  Ba ); \
	    Asu1 =   Bu ^((~Ba)&  Be ); \
    } \
    copyToState(state, A) \
}

#define copyFromState(X, state) \
    X##ba0 = state[ 0]; \
    X##ba1 = state[ 1]; \
    X##be0 = state[ 2]; \
    X##be1 = state[ 3]; \
    X##bi0 = state[ 4]; \
    X##bi1 = state[ 5]; \
    X##bo0 = state[ 6]; \
    X##bo1 = state[ 7]; \
    X##bu0 = state[ 8]; \
    X##bu1 = state[ 9]; \
    X##ga0 = state[10]; \
    X##ga1 = state[11]; \
    X##ge0 = state[12]; \
    X##ge1 = state[13]; \
    X##gi0 = state[14]; \
    X##gi1 = state[15]; \
    X##go0 = state[16]; \
    X##go1 = state[17]; \
    X##gu0 = state[18]; \
    X##gu1 = state[19]; \
    X##ka0 = state[20]; \
    X##ka1 = state[21]; \
    X##ke0 = state[22]; \
    X##ke1 = state[23]; \
    X##ki0 = state[24]; \
    X##ki1 = state[25]; \
    X##ko0 = state[26]; \
    X##ko1 = state[27]; \
    X##ku0 = state[28]; \
    X##ku1 = state[29]; \
    X##ma0 = state[30]; \
    X##ma1 = state[31]; \
    X##me0 = state[32]; \
    X##me1 = state[33]; \
    X##mi0 = state[34]; \
    X##mi1 = state[35]; \
    X##mo0 = state[36]; \
    X##mo1 = state[37]; \
    X##mu0 = state[38]; \
    X##mu1 = state[39]; \
    X##sa0 = state[40]; \
    X##sa1 = state[41]; \
    X##se0 = state[42]; \
    X##se1 = state[43]; \
    X##si0 = state[44]; \
    X##si1 = state[45]; \
    X##so0 = state[46]; \
    X##so1 = state[47]; \
    X##su0 = state[48]; \
    X##su1 = state[49]; \

#define copyToState(state, X) \
    state[ 0] = X##ba0; \
    state[ 1] = X##ba1; \
    state[ 2] = X##be0; \
    state[ 3] = X##be1; \
    state[ 4] = X##bi0; \
    state[ 5] = X##bi1; \
    state[ 6] = X##bo0; \
    state[ 7] = X##bo1; \
    state[ 8] = X##bu0; \
    state[ 9] = X##bu1; \
    state[10] = X##ga0; \
    state[11] = X##ga1; \
    state[12] = X##ge0; \
    state[13] = X##ge1; \
    state[14] = X##gi0; \
    state[15] = X##gi1; \
    state[16] = X##go0; \
    state[17] = X##go1; \
    state[18] = X##gu0; \
    state[19] = X##gu1; \
    state[20] = X##ka0; \
    state[21] = X##ka1; \
    state[22] = X##ke0; \
    state[23] = X##ke1; \
    state[24] = X##ki0; \
    state[25] = X##ki1; \
    state[26] = X##ko0; \
    state[27] = X##ko1; \
    state[28] = X##ku0; \
    state[29] = X##ku1; \
    state[30] = X##ma0; \
    state[31] = X##ma1; \
    state[32] = X##me0; \
    state[33] = X##me1; \
    state[34] = X##mi0; \
    state[35] = X##mi1; \
    state[36] = X##mo0; \
    state[37] = X##mo1; \
    state[38] = X##mu0; \
    state[39] = X##mu1; \
    state[40] = X##sa0; \
    state[41] = X##sa1; \
    state[42] = X##se0; \
    state[43] = X##se1; \
    state[44] = X##si0; \
    state[45] = X##si1; \
    state[46] = X##so0; \
    state[47] = X##so1; \
    state[48] = X##su0; \
    state[49] = X##su1; \

