#include <bits/stdc++.h>   using namespace std;   const int N = 1000010;   string s;   long long ans;   long long mem[N][5];   int n;   long long dp(int i, int last) {     if (i == n) {       if (last == 2 || last == 4) return 0;       return 1;     }     if (mem[i][last] != -1) return mem[i][last];     long long p = 0;     if (last == 0) {       if (s[i] ==  2  || s[i] ==  * ) return 0;       if (s[i] ==  1 )         p += dp(i + 1, 4);       else if (s[i] ==  0 )         p += dp(i + 1, 0);       else {         p += dp(i + 1, 4);         p += dp(i + 1, 0);       }     } else if (last == 1) {       if (s[i] ==  2  || s[i] ==  * ) return 0;       if (s[i] ==  1 )         p += dp(i + 1, 4);       else if (s[i] ==  0 )         p += dp(i + 1, 0);       else {         p += dp(i + 1, 4);         p += dp(i + 1, 0);       }     } else if (last == 4) {       if (s[i] ==  *  || s[i] ==  ? )         p += dp(i + 1, 3);       else         return 0;     } else if (last == 3) {       if (s[i] ==  0 )         return 0;       else if (s[i] ==  * )         p += dp(i + 1, 3);       else if (s[i] ==  1 )         p += dp(i + 1, 1);       else if (s[i] ==  2 )         p += dp(i + 1, 2);       else {         p += dp(i + 1, 3);         p += dp(i + 1, 1);         p += dp(i + 1, 2);       }     } else {       if (s[i] ==  *  || s[i] ==  ? )         p += dp(i + 1, 3);       else         return 0;     }     return mem[i][last] = p % 1000000007;   }   int main() {     cin >> s;     n = s.length();     memset(mem, -1, sizeof mem);     if (s[0] ==  ? ) {       ans += dp(1, 0);       ans += dp(1, 4);       ans += dp(1, 3);     } else {       if (s[0] ==  1 )         ans += dp(1, 4);       else if (s[0] ==  0 )         ans += dp(1, 0);       else if (s[0] ==  * )         ans += dp(1, 3);       else         ans = 0;     }     cout << ans % 1000000007;   }   