#include <vector>
#include <list>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <utility>
#include <functional>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <climits>
#include <cassert>
using namespace std;
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef long long ll;
#define ALL(a) (a).begin(),(a).end()
#define RALL(a) (a).rbegin(),(a).rend()
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define EACH(t,i,c) for(t::iterator i=(c).begin(); i!=(c).end(); ++i)
const double EPS = 1e-10;
const double PI  = acos(-1.0);
	vs lattices(10);


int dfs(int n,vi &used,vi &bottom,vi &lr){
	if(n==5){
		vs matrix(5);
		REP(i,5){
			string s=lattices[bottom[i]];
			if(lr[i]){
				s=string(s.rbegin(),s.rend());
			}
			REP(j,5){
				s[j]=s[j]=='1'?'0':'1';
			}
			matrix[i]=s;
		}
		REP(j,10){
			if(!used[j]){
				REP(k,5){
					REP(d,2){
						REP(l,5){
							if(d==0&&lattices[j][l]!=matrix[l][k]){
								goto a;
							}else if(d==1&&lattices[j][4-l]!=matrix[l][k]){
								goto a;
							}
						}
						goto b;
a:;
					}
				}
				return 0;
			}
			b:;
		}
		return 1;
	}

	int res=0;
	REP(i,10){
		if(used[i])continue;
		vi nused(used); 
		nused[i]=1;
		vi nbottom(bottom);
		nbottom[n]=i;
		int ss=2;
		if(lattices[i][0]==lattices[i][4]&&lattices[i][1]==lattices[i][3]){
			ss=1;
		}
		REP(j,ss){
			vi nlr(lr);
			nlr[n]=j;
			res+=dfs(n+1,nused,nbottom,nlr);
		}
	}
	return res;
}

int main(){
	while(cin>>lattices[0],lattices[0]!="END"){
		REP(i,9){
			cin>>lattices[i+1];
		}

		int ans=dfs(0,vi(10,0),vi(5),vi(5));
		cout<<ans/8<<endl;
	}
}