#include #define forn(i, n) for (int i = 0; i < (int)(n); i++) #define for1(i, n) for (int i = 1; i < (int)(n); i++) #define fore(i, l, r) for (int i = (int)(l); i <= (int)(r); i++) #define ford(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define pb push_back #define eb emplace_back #define fi first #define se second #define mp make_pair #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector vi; typedef vector vll; typedef vector vvi; typedef vector vvll; typedef set si; typedef pair pii; typedef set spii; int M = 1e9 + 7; ll ans = 0; vi pos; int mo, dong; string s; int n; int check() { int cnt = 0; for (char ch: s) { if (ch == '(') ++cnt; else --cnt; if (cnt < 0) return 0; } return cnt == 0; } void Try(int i) { if (mo > n/2 || dong > n/2) return; int j = pos[i]; s[j] = '('; ++mo; if (i == pos.size() - 1) { if (check()) ++ans; } else Try(i + 1); --mo; s[j] = ')'; ++dong; if (i == pos.size() - 1) { if (check()) ++ans; } else Try(i + 1); --dong; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); getline(cin, s); n = s.length(); mo = dong = 0; if (s[0] == '?') s[0] = '('; if (s.back() == '?') s.back() = ')'; forn(i, n) { if (s[i] == '?') pos.pb(i); else if (s[i] == '(') ++mo; else ++dong; } if (pos.size() == 0) cout << 1; else { Try(0); cout << (ans%M); } return 0; }