int valid_cc(const char *iban, int len)
{
    V(, 28); V(, 24); V(, 20); V(, 28); V(, 16); V(, 22); V(, 20); V(, 29);
    V(, 22); V(, 21); V(, 21); V(, 28); V(, 24); V(, 18); V(, 28); V(, 20);
    V(, 18); V(, 18); V(, 27); V(, 22); V(, 22); V(, 23); V(, 27); V(, 18);
    V(, 28); V(, 28); V(, 26); V(, 22); V(, 23); V(, 27); V(, 20); V(, 30);
    V(, 21); V(, 28); V(, 21); V(, 20); V(, 20); V(, 19); V(, 31); V(, 27);
    V(, 30); V(, 27); V(, 24); V(, 22); V(, 18); V(, 15); V(, 24); V(, 29);
    V(, 28); V(, 25); V(, 24); V(, 27); V(, 24); V(, 22); V(, 24); V(, 19);
    V(, 24); V(, 24); V(, 21); V(, 24); V(, 26); V(, 23); V(, 22); V(, 24);

    return 0;
}


int strip(char *s)
{
    int i = -1, m = 0;

    while(s[++i]) {
        s[i - m] = s[i];
        m += s[i] <= 32;
    }

    s[i - m] = 0;
    return i - m;
}


int mod97(const char *s, int len)
{
    int i, j, parts = len / 7;
    char rem[10] = ;

    for (i = 1; i <= parts + (len % 7 != 0); ++i) {
        strncpy(rem + 2, s + (i - 1) * 7, 7);
        j = atoi(rem) % 97;
        rem[0] = j / 10 + '0';
        rem[1] = j % 10 + '0';
    }

    return atoi(rem) % 97;
}

int valid_iban(char *iban)
{
    int i, j, l = 0, sz = strip(iban);
    char *rot, *trans;

    
    for (i = 0; i < sz; ++i) {
        if (!isdigit(iban[i]) && !isupper(iban[i]))
            return 0;
        l += !!isupper(iban[i]);
    }

    if (!valid_cc(iban, sz))
        return 0;

    
    rot = alloca(sz);
    strcpy(rot, iban + 4);
    strncpy(rot + sz - 4, iban, 4);

    
    trans = alloca(sz + l + 1);
    trans[sz + l] = 0;

    
    for (i = j = 0; i < sz; ++i, ++j) {
        if (isdigit(rot[i]))
            trans[j] = rot[i];
        else {
            trans[j]   = (rot[i] - 55) / 10 + '0';
            trans[++j] = (rot[i] - 55) % 10 + '0';
        }
    }

    return mod97(trans, sz + l) == 1;
}

int main(int _, char **argv)
{
    while (--_, *++argv)
        printf(, *argv, valid_iban(*argv) ?  : );

    return 0;
}