#include<stdio.h>
#include<string.h>
char s[524288];
int dp[4],dp2[4];
int main()
{
	scanf("%s",s);
	int n=strlen(s);
	s[n]='1';
	n++;
	dp[2]=1;
	int ans=1;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<4;j++)
		{
			dp2[j]=dp[j];
			dp[j]=0;
		}
		for(int j=0;j<4;j++)
		{
			dp[j&1]+=dp2[j];
			if(dp[j&1]>=1000000007)
			{
				dp[j&1]-=1000000007;
			}
		}
		for(int j=0;j<4;j++)
		{
			if(i&1)
			{
				if(j==3)
				{
					continue;
				}
				dp[j|2]+=dp2[j];
				if(dp[j|2]>=1000000007)
				{
					dp[j|2]-=1000000007;
				}
			}
			else
			{
				dp[2+(j!=0)]+=dp2[j];
				if(dp[2+(j!=0)]>=1000000007)
				{
					dp[2+(j!=0)]-=1000000007;
				}
			}
		}
		if(s[i]=='1')
		{
			dp[0]=0;
			dp[1]=0;
		}
		else if(s[i]=='0')
		{
			dp[2]=0;
			dp[3]=0;
		}
		else
		{
			ans<<=1;
			if(ans>=1000000007)
			{
				ans-=1000000007;
			}
		}
	}
	ans-=dp[2];
	if(ans<0)
	{
		ans+=1000000007;
	}
	ans-=dp[3];
	if(ans<0)
	{
		ans+=1000000007;
	}
	printf("%d\n",ans);
	return 0;
}
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
const int N=300005,P=1e9+7;
int n,f[N][3][3];
char s[N];
void addx(int&k1,int k2){
	(k1+=k2)>=P&&(k1-=P);
}
int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	if(n==1){
		puts(s[1]=='0'?"0":"1");
		return 0;
	}
	f[0][0][0]=1;
	rep(i,1,n){
		if(s[i]!='1'){
			rep(j,0,2)rep(k,0,2)addx(f[i][j][k?3-k:1],f[i-1][j][k]);
		}
		if(s[i]!='0'){
			rep(j,0,2)rep(k,0,2)addx(f[i][min(2,j+(k==0))][max(k-1,0)],f[i-1][j][k]);
		}
	}
	int ans=0;
	rep(i,0,2)rep(j,0,2)if(i>=2||j==0)addx(ans,f[n][i][j]);
	printf("%d\n",ans);
	return 0;
}