#include<bits/stdc++.h>
#define maxn 1000009
#define ll long long
#define mod 1000000007
using namespace std;

int main()
{
    //freopen("d:\\in.txt","r",stdin);
    ll ans=0;
    ll cn[209];
    cn[0]=1;
    int cnt;
    for(int i=1;; i++)
    {
        if(cn[i-1]*2>1e18)
        {
            cnt=i-1;
            break;
        }
        cn[i]=cn[i-1]*2;
    }
    ll n;
    scanf("%lld",&n);
    ans=((n%mod)*(n%mod))%mod;
    ll dp[209][209][2][2];//计算到第i位，j个位置可变，0：a可变 0：b可变并且A大于B情况数
    dp[cnt+1][0][1][1]=1;
    for(int i=cnt; i>=0; i--)
    {
        for(int j=0; j<=cnt+2; j++)
        {
            if(n&(1<<i))
            {
                if(j>0)
                {
                    dp[i][j][0][0]=(dp[i+1][j-1][1][1]+dp[i+1][j-1][0][0]+dp[i+1][j-1][1][0]+dp[i+1][j-1][0][1])%mod;
                }
                dp[i][j][0][1]=dp[i+1][j][0][1];
                dp[i][j][1][0]=dp[i+1][j][1][0];
                dp[i][j][1][1]=dp[i][j][1][1];
            }
            else
            {
                if(j>0)
                {
                    dp[i][j][0][0]=dp[i+1][j-1][0][0]%mod;
                }
                dp[i][j][0][1]=dp[i+1][j][0][1];
                dp[i][j][1][0]=dp[i+1][j][1][0];
                dp[i][j][1][1]=dp[i][j][1][1];
            }
        }
    }
    for(int i=1;i<=cnt;i++)
    {
        ans=(ans-dp[0][i][0][0]*cn[i]/2)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}
