#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0;i < (n);i++)
using ll = long long;
const ll MOD=1000000007;
const long long INF = 1LL << 60;
const double pi=acos(-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; }

string A,B,C;
vector<ll> table0;
vector<ll> table1;
ll N;

ll dp0(ll);
ll dp1(ll);

ll dp0(ll n)
{
  if(n<0) return 1;
  if(table0.at(n)>0) return table0.at(n);
  int a=A.at(n)-'0',b=B.at(n)-'0',c=C.at(n)-'0';
  if(c!='?'-'0')
  {
    if(a!='?'-'0')
    {
      if(b!='?'-'0')
      {
        if(a+b==c)
        {
          table0.at(n)+=dp0(n-1);
        }
        if(a+b+1==c)
        {
          table0.at(n)+=dp1(n-1);
        }
      }
      else
      {
        if(a<=c) table0.at(n)+=dp0(n-1);
        if(a<c) table0.at(n)+=dp1(n-1);
      }
    }
    else
    {
      if(b!='?'-'0')
      {
        if(b<=c) table0.at(n)+=dp0(n-1);
        if(b<c) table0.at(n)+=dp1(n-1);
      }
      else
      {
        if(n==N-1) c-=2;
        table0.at(n)+=(c+1)*dp0(n-1);
        table0.at(n)+=c*dp1(n-1);
        if(c<0) table0.at(n)=0;
      }
    }
  }
  else
  {
    if(a!='?'-'0')
    {
      if(b!='?'-'0')
      {
        if(a+b<10) table0.at(n)+=dp0(n-1);
        if(a+b+1<10) table0.at(n)+=dp1(n-1);
      }
      else
      {
        if(n==N-1) a++;
        table0.at(n)+=(10-a)*dp0(n-1);
        table0.at(n)+=(10-1-a)*dp1(n-1);
        if(a>=10) table0.at(n)=0;
      }
    }
    else
    {
      if(b!='?'-'0')
      {
        if(n==N-1) b++;
        table0.at(n)+=(10-b)*dp0(n-1);
        table0.at(n)+=(10-1-b)*dp1(n-1);
        if(b>=10) table0.at(n)=0;
      }
      else
      {
        if(n==N-1)
        {
          table0.at(n)+=36*dp0(n-1);
          table0.at(n)+=28*dp1(n-1);
        }  
        else
        {
          table0.at(n)+=55*dp0(n-1);
          table0.at(n)+=45*dp1(n-1);
        }
      }
    }
  }
  table0.at(n)%=MOD;
  return table0.at(n);
}

ll dp1(ll n)
{
  if(n<0) return 0;
  if(table1.at(n)>0) return table1.at(n);
  int a=A.at(n)-'0',b=B.at(n)-'0',c=C.at(n)-'0';
  if(c!='?'-'0')
  {
    if(a!='?'-'0')
    {
      if(b!='?'-'0')
      {
        if(a+b==10+c) table1.at(n)+=dp0(n-1);
        if(a+b+1==10+c) table1.at(n)+=dp1(n-1);
      }
      else
      {
        if(a>c) table1.at(n)+=dp0(n-1);
        if(a>=c) table1.at(n)+=dp1(n-1);
      }
    }
    else
    {
      if(b!='?'-'0')
      {
        if(b>c) table1.at(n)+=dp0(n-1);
        if(b>=c) table1.at(n)+=dp1(n-1);
      }
      else
      {
        table1.at(n)+=(10-1-c)*dp0(n-1);
        table1.at(n)+=(10-c)*dp1(n-1);
      }
    }
  }
  else
  {
    if(a!='?'-'0')
    {
      if(b!='?'-'0')
      {
        if(a+b>=10) table1.at(n)+=dp0(n-1);
        if(a+b+1>=10) table1.at(n)+=dp1(n-1);
      }
      else
      {
        table1.at(n)+=a*dp0(n-1);
        table1.at(n)+=(a+1)*dp1(n-1);
      }
    }
    else
    {
      if(b!='?'-'0')
      {
        table1.at(n)+=b*dp0(n-1);
        table1.at(n)+=(b+1)*dp1(n-1);
      }
      else
      {
        table1.at(n)+=45*dp0(n-1);
        table1.at(n)+=55*dp1(n-1);
      }
    }
  }
  table1.at(n)%=MOD;
  return table1.at(n);
}  
      
        

int main() 
{
  while(true)
  {
    cin>>A;
    if(A=="0") break;
    cin>>B>>C;
    N=A.size();
    reverse(A.begin(),A.end());
    reverse(B.begin(),B.end());
    reverse(C.begin(),C.end());
    table0=vector<ll>(N,0);
    table1=vector<ll>(N,0);
    
    cout<<dp0(N-1)<<endl;
  }  
  return 0;
}



Measured memory_bytes: 3164