#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

string alp = "01+-*()";
void search(int cnt, string &curr, vector<string> &res){
    if(cnt == 0){
        res.push_back(curr);
        return;
    }
    for(char c: alp){
        curr += c;
        search(cnt-1, curr, res);
        curr.pop_back();
    }
}

bool is_operator(char c){
    return c=='+' or c=='-' or c=='*';
}

int parse(int b, int e, string &s){
    vector<int> nums;
    vector<char> opes;
    enum type{num, ope, brac};
    type prevtype = ope;
    int currnum = 0;
    for(int p=b; p<e; p++){
        if(prevtype == ope and is_operator(s[p])) return -1;
        if(prevtype == brac and !is_operator(s[p])) return -1;
        if(s[p] == ')') return -1;
        if(prevtype != ope and s[p] == '(') return -1;
        
        if(is_operator(s[p])){
            nums.push_back(currnum);
            opes.push_back(s[p]);
            currnum = 0;
            prevtype = ope;
        }else if(s[p] == '('){
            int depth = 1;
            int beginpos = ++p;
            while(p < e){
                if(s[p]=='(') depth++;
                if(s[p]==')') depth--;
                if(depth==0) break;
                p++;
            }
            if(p==e and depth>0) return -1;
            currnum = parse(beginpos, p, s);
            if(currnum == -1) return -1;
            prevtype = brac;
        }else{
            currnum *= 2;
            currnum += s[p]-'0';
            if(currnum >= 1024) return -1;
            prevtype = num;
        }
    }
    if(prevtype == ope) return -1;
    nums.push_back(currnum);

    if(b == e) return -1;
    if((b!=0 or e!=(int)s.length()) and opes.empty()) return -1;
    vector<int> newnums;
    vector<int> newopes;
    newnums.push_back(nums[0]);
    for(int i=0; i<(int)opes.size(); i++){
        if(opes[i] == '*'){
            newnums.back() *= nums[i+1];
            if(newnums.back() >= 1024) return -1;
        }else{
            newopes.push_back(opes[i]);
            newnums.push_back(nums[i+1]);
        }
    }
    int res = newnums[0];
    for(int i=0; i<(int)newopes.size(); i++){
        if(newopes[i] == '+'){
            res += newnums[i+1];
        }else{
            res -= newnums[i+1];
        }
        if(res<0 or 1024<=res) return -1;
    }
    return res;
}

int main(){
    string s;
    cin >> s;
    vector<int> dots_idx;
    for(int i=0; i<(int)s.length(); i++){
        if(s[i] == '.') dots_idx.push_back(i);
    }

    vector<string> filling;
    string tmp = "";
    search(dots_idx.size(), tmp, filling);
    int ans = -1;
    for(string fil: filling){
        for(int i=0; i<(int)dots_idx.size(); i++){
            s[dots_idx[i]] = fil[i];
        }
        ans = max(ans, parse(0, s.length(), s));
    }
    cout << ans << endl;
    return 0;
}

