#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<sstream>
using namespace std;
const int N = 10;
#define REP(i, j) for(int i = 0; i < j; ++i)
#define FOR(i, j, k) for(int i = j; i < k; ++i)

vector< vector<string> > ans;
vector<string> vec;

void make_boards(string str){
  vec = vector<string>();
  stringstream ss(str);
  string tmp;
  while(getline(ss, tmp, ' ')) vec.push_back(tmp);
}

bool is_exist(string str, vector<bool> &used){
  REP(i, vec.size()){
    if(used[i]) continue;
    if(vec[i] == str){
      used[i] = true;
      return true;
    }
    reverse(str.begin(), str.end());
    if(vec[i] == str){
      used[i] = true;
      return true;
    }
  }
  return false;
}

string reverse_str(string str){
  string ret = "";
  REP(i, str.length()) ret += (str[i] == '0'? '1' : '0');
  return ret;
}

//bool check_same(vector<string> use){
//  //debug
//  cout <<ans.size() <<endl;
//  REP(i, use.size()) cout <<use[i] <<" "; cout <<endl <<endl;
//
//  REP(a, (int)(ans.size())){
//    REP(i, use.size()) reverse(use[i].begin(), use[i].end());
//    if(use == ans[a]) return true;
//    reverse(use.begin(), use.end());
//    if(use == ans[a]) return true;
//    vector<string> tmp;
//    REP(i, 5){
//      string str = "";
//      REP(j, use.size()) str += use[j][i];
//      tmp.push_back(str);
//    }
//    REP(i, tmp.size()) reverse(tmp[i].begin(), tmp[i].end());
//    reverse(tmp.begin(), tmp.end());
//    REP(i, tmp.size()) tmp[i] = reverse_str(tmp[i]);
//    if(use == ans[a]) return true;
//  }
//  return false;
//}

void check(vector<bool> used, vector<string> use){
  //debug
  //cout <<"check in" <<endl;
  //cout <<ans.size() <<endl;
  //REP(i, use.size()) cout <<use[i] <<" "; cout <<endl <<endl;

  //if(check_same(use)) return ;
  REP(i, 5){
    string str = "";
    REP(j, use.size()) str += use[j][i];
    str = reverse_str(str);
    //debug
    //cout <<str <<endl;

    if(!is_exist(str, used)) return ;
  }
  ans.push_back(use);
}
void dfs(int cnt, int now, vector<bool> used, vector<string> use){
  //debug
  //cout <<"cnt = " <<cnt <<", now = " <<now <<endl;
  //REP(i, used.size()) cout <<used[i] <<" "; cout <<endl;
  //REP(i, use.size()) cout <<use[i] <<" "; cout <<endl <<endl;

  if(cnt > (N / 2) || now >= N) return ;
  else if(cnt == (N / 2)) check(used, use);
  else{
    REP(i, N){
      if(used[i]) continue;
      used[i] = true;
      use.push_back(vec[i]);
      dfs(cnt + 1, now + 1, used, use);
      string tmp = use[use.size() - 1];
      reverse(use[use.size() - 1].begin(), use[use.size() - 1].end());
      if(tmp != use[use.size() - 1]) dfs(cnt + 1, now + 1, used, use);
      use.pop_back();
      used[i] = false;
    }
  }
}

void deb(){
  REP(i, ans.size()){
    vector<string> tmp = ans[i];
    //REP(j, ans[i].size()) cout <<ans[i][j] <<" ";
    //cout <<endl;
    REP(j, 5){
      string tmpstr;
      REP(k, ans[i].size()) tmpstr += ans[i][k][j];
      tmpstr = reverse_str(tmpstr);
      tmp.push_back(tmpstr);
      //cout <<tmp <<" ";
    }
    //cout <<endl <<endl;
    vector<bool> used(N, false);
    REP(i, tmp.size()){
      REP(j, vec.size()){
        if(used[j]) continue;
        string now = vec[j];
        if(tmp[i] == now){
          used[j] = true;
          break;
        }
        reverse(now.begin(), now.end());
        if(tmp[i] == now){
          used[j] = true;
          break;
        }
      }
    }
    REP(i, used.size()) cout <<used[i] <<" "; cout <<endl;
  }
}

int main(){
  string str;
  while(getline(cin, str) && str != "END"){
    ans = vector< vector<string> >();
    make_boards(str);
    //debug
    //cout <<str <<endl;
    //REP(i, vec.size()) cout <<vec[i] <<" "; cout <<endl;

    vector<bool> used(N, false);
    vector<string> use;
    dfs(0, 0, used, use);

    //debug
    //deb();

    cout <<ans.size() / 8 <<endl;
  }
  return 0;
}

Measured memory_bytes: 1284