Problem Statement

The Animal School is a primary school for animal children. You are a fox attending this school.

One day, you are given a problem called "Arithmetical Restorations" from the rabbit teacher, Hanako. Arithmetical Restorations are the problems like the following:

* You are given three positive integers, $A$, $B$ and $C$.

* Several digits in these numbers have been erased.

* You should assign a digit in each blank position so that the numbers satisfy the formula $A+B=C$.

* The first digit of each number must not be zero. It is also the same for single-digit numbers.




You are clever in mathematics, so you immediately solved this problem. Furthermore, you decided to think of a more difficult problem, to calculate the number of possible assignments to the given Arithmetical Restorations problem. If you can solve this difficult problem, you will get a good grade.

Shortly after beginning the new task, you noticed that there may be too many possible assignments to enumerate by hand. So, being the best programmer in the school as well, you are now trying to write a program to count the number of possible assignments to Arithmetical Restoration problems.

Input

The input is a sequence of datasets. The number of datasets is less than 100. Each dataset is formatted as follows.

> $A$
> $B$
> $C$

Each dataset consists of three strings, $A$, $B$ and $C$. They indicate that the sum of $A$ and $B$ should be $C$. Each string consists of digits (`0`-`9`) and/or question mark (`?`). A question mark (`?`) indicates an erased digit. You may assume that the first character of each string is not `0` and each dataset has at least one `?`.

It is guaranteed that each string contains between 1 and 50 characters, inclusive. You can also assume that the lengths of three strings are equal.

The end of input is indicated by a line with a single zero.

Output

For each dataset, output the number of possible assignments to the given problem modulo 1,000,000,007. Note that there may be no way to solve the given problems because Ms. Hanako is a careless rabbit.

Sample Input


3?4
12?
5?6
?2?4
5?7?
?9?2
?????
?????
?????
0

Output for the Sample Input


2
40
200039979

Note

The answer of the first dataset is 2. They are shown below.

* 384 + 122 = 506

* 394 + 122 = 516





Example

Input

3?4
12?
5?6
?2?4
5?7?
?9?2
?????
?????
?????
0


Output

2
40
200039979
//http://logfiles.hatenablog.com/entry/20160520/1463764819
//勉強させて頂いた記事

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll LongINF=1e13+7;
const int INF=1e9+7;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};

template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}
template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}
template <class T, class Y>T GCD(T a, Y b){if(a<b){int c=a;a=b;b=c;}if (a % b == 0){return b;}return GCD(b, a % b);}
void clear(queue<pair<int, int>> &q){queue<pair<int, int>> empty;swap(q, empty);} //queueの中身の型は適時変更を忘れない

#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define rep(i,n) REP(i,0,n)
#define pb push_back
#define rv reverse

/*
数え上げの問題
dp[i]はi桁目までの、?の通りだが、可能かどうかがわからない。
なので、[j]を付け足し、1~9の数を識別可能にする？
要旨としてはi桁目までで?入れ替えで作れる数字を記録し、結果的に足してできる数を出力？

A,B,Cのどれなのか区別がつかないため、dp[i][o][j]とした。

A+B=Cの判定法は、最終的にできた、A,B,Cを用いれば良い

ある桁が出来るかどうかは、一通りでは？
つまりdpの中身にはtrue,falseが出来る
dpの中身がt,fの時は大体無駄が多いので、別のものを持たせられないか考える。
例えば、出来た値とか

dpテーブルは通りを格納する。理由は下述の通り。

そもそもdpというのは、ある時点での計算結果を元に次の結果を出すというものである。
そのため、ある計算結果がそれまでの結果に影響を及ぼさないのはどこかを考える
この時、A+B=Cの過程で、下桁から計算していくと結果を確定させながら答えを求めることができる。
末桁が、A+B=Cとすればもとまっていく？
この時考慮しなければいけないのが繰り上がりだが、繰り上がりは別途管理？
繰り上がりは1だけである。

桁DPを用いて行いたい。でもN以下とかではない

粘ったが、場合分けをうまくできずギブ

*/

int main(){
    vector<string> S(3);

    while(cin>>S[0]){
        if(S[0]=="0")break;
        cin>>S[1]>>S[2];

        rep(i,3)reverse(S[i].begin(),S[i].end());//リバースして、反対側から考える。

        int L=S[0].size();

        vector<vector<int> > va(L),vb(L),vc(L);//条件を満たす数を羅列するための配列？
        //記事内でも場合分けに使うとされているのできっとそう
        //場合分けをある桁のときに使うであろう数をA,B,Cごとに配列を用いて管理するという知見を得た。
        //配列を用いて管理することで、面倒な場合分けを縮こめることができる。楽ができる
        string a=S[0],b=S[1],c=S[2];

        rep(i,L){
            if(a[i]=='?')REP(k,i==L-1,10)va[i].pb(k);
            else va[i].pb(a[i]-'0');

            if(b[i]=='?')REP(k,i==L-1,10)vb[i].pb(k);
            else vb[i].pb(b[i]-'0');

            if(c[i]=='?')REP(k,i==L-1,10)vc[i].pb(k);
            else vc[i].pb(c[i]-'0');
        }

        vector<vector<ll> >dp(52,vector<ll>(3,0));
        dp[0][0]=1;

        rep(i,L)rep(carry,2){//carryは繰り上がり考慮
            for(auto& da:va[i])for(auto& db: vb[i])for(auto& dc: vc[i]){
                int num=(da+db+carry)%10;//ありうる数の下桁を取り出している。
                int ncr=(da+db+carry)/10;//桁上がりの数を取り出している。最大値18+1だと思うので、carryは1上限にしても通る気がするが果たして

                if(num==dc){
                    dp[i+1][ncr]+=dp[i][carry];
                    dp[i+1][ncr]%=INF;
                }
            }
        }
        cout<<dp[L][0]<<endl;
    }
    return 0;
}

//a=97,z=122
