#(#(#((##((()))(((#)(#()#(((()()(()#(##(((()(((()))#(((((()(((((((()#((#((()(#(((()(()##(()(((()((#(
 (#((((()
 (#((
 ((#)((#)((#)((#)((#)((#)((#)((#)((#)((#)((#)((#)((#)((#)((#)((##
 (())((((#)
 (#(
 (#))(#(#)((((#(##((#(#((((#(##((((((#((()(()(())((()#((((#((()((((#(((((#(##)(##()((((()())(((((#(((
 ##((((((()
 #((#
 #))))
 (((((#(#(#(#()
 ((#(()#(##
 (((((((((((((((((((###################
 )((##((###
 (((()#(#)(
 ((#)(
 )(((())#
 ()((#((#(#()
 ((#(
 ()#(#())()()#)(#)()##)#((()#)((#)()#())((#((((((((#)()()(()()(((((#)#(#((((#((##()(##(((#(()(#((#))#

-1
 -1
 -1
 1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
 3
 -1
 -1
 -1
 -1
 -1
 1
1
1
5
 1
1
1
1
 1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
 -1
 -1
 -1
 -1
 1
1
3
 -1
 -1

#include <bits/stdc++.h>
using namespace std;
long long M = 1e9 + 7;
const long long INF = LLONG_MAX;
long long power_2(long long p1, long long p2) {
  if (p2 == 0) {
    return 1;
  }
  if (p2 == 1) {
    return p1 % M;
  }
  long long y = power_2(p1, p2 / 2);
  y = ((((y * y) % M) * power_2(p1, p2 % 2)) % M);
  return y;
}
void comps(long long st, vector<set<long long> > *edges, long long *visited,
           long long *cats, long long *cnt, long long curr_cnt,
           long long max_cnt, long long m) {
  visited[st] = 1;
  set<long long>::iterator it;
  set<long long> x1 = (*edges)[st];
  if (cats[st] == 1) {
    curr_cnt = curr_cnt + 1;
  } else {
    curr_cnt = 0;
  }
  max_cnt = max(max_cnt, curr_cnt);
  long long lf = 0;
  for (it = x1.begin(); it != x1.end(); ++it) {
    if (visited[(*it)] == -1) {
      ++lf;
      comps((*it), edges, visited, cats, cnt, curr_cnt, max_cnt, m);
    }
  }
  if (lf == 0) {
    if ((max_cnt) <= m) {
      (*cnt) = (*cnt) + 1;
    }
  }
}
long long popcount1(long long i) {
  long long cnt = 0;
  while (i > 0) {
    if (i % 2 == 1) {
      ++cnt;
    }
    i = i / 2;
  }
  return cnt;
}
long long lf_cnt = 0;
void recurse(long long st, vector<set<pair<long long, long long> > > *edges,
             long long *arr, long long n, int *dp) {
  arr[st] = 1;
  long long i, j;
  fill(dp, dp + 2 * n + 2, 0);
  set<pair<long long, long long> >::iterator it;
  set<pair<long long, long long> > x1 = (*edges)[st];
  long long lf = 0;
  int *bp = new int[2 * n + 2];
  int *cp = new int[2 * n + 2];
  for (it = x1.begin(); it != x1.end(); ++it) {
    if (arr[(*it).first] == -1) {
      recurse((*it).first, edges, arr, n, bp);
      ++lf;
      if (lf == 1) {
        for (i = 0; i <= n; ++i) {
          dp[i] = min(bp[i], bp[n + 1 + i] + 1);
        }
        for (i = i; i <= 2 * n + 1; ++i) {
          dp[i] = min(bp[i - n - 1] + 1, bp[i]);
        }
      } else {
        for (i = 0; i <= n; ++i) {
          cp[i] = dp[0] + min(bp[i], bp[n + i + 1] + 1);
          for (j = 0; j <= i; ++j) {
            cp[i] = dp[j] + min(bp[i - j], bp[n + (i - j) + 1] + 1);
          }
        }
        for (i = i; i <= 2 * n + 1; ++i) {
          cp[i] = dp[i] + min(bp[0] + 1, bp[n + 1]);
          for (j = 0; j <= i - n - 1; ++j) {
            cp[i] = dp[j] + min(bp[i - j - n - 1] + 1, bp[i - j]);
          }
        }
        for (i = 0; i <= 2 * n + 1; ++i) {
          dp[i] = cp[i];
        }
      }
    }
    delete (cp);
    delete (bp);
  }
  if (lf == 0) {
    dp[0] = 0;
    dp[1] = 0;
    ++lf_cnt;
  }
}
void eql(long long **a, long long **b, long long n) {
  long long i, j;
  for (i = 1; i <= n; ++i) {
    for (j = 1; j <= n; ++j) {
      a[i - 1][j - 1] = b[i - 1][j - 1];
    }
  }
}
bool cheql(long long **a, long long **b, long long n) {
  bool ans = true;
  long long i, j;
  for (i = 1; i <= n; ++i) {
    for (j = 1; j <= n; ++j) {
      ans = ans & (a[i - 1][j - 1] == b[i - 1][j - 1]);
      if (!(a[i - 1][j - 1] == b[i - 1][j - 1])) {
      }
    }
  }
  return ans;
}
void init1(long long ***a, long long n) {
  *a = new long long *[n];
  long long i;
  for (i = 1; i <= n; ++i) {
    (*a)[i - 1] = new long long[n];
    fill((*a)[i - 1], (*a)[i - 1] + n, 0);
  }
}
long long gcd(long long a, long long b) {
  if (a > b) {
    return gcd(b, a);
  }
  if (a == b || a == 0) {
    return b;
  }
  return gcd(b % a, a);
}
int main() {
  vector<pair<long long, long long> > xx;
  long long n, m, d, p, l, r, t1, q, x, y, z, a, b, c, sum = 0, mult = 1, t = 0;
  long long i, j, k;
  string s, s1;
  t = 1;
  while (t-- > 0) {
    cin >> s;
    long long cnt0;
    long long cnt1;
    cnt0 = cnt1 = 0;
    vector<long long> ans;
    bool pos = true;
    for (i = 1; i <= s.length(); ++i) {
      if (s[i - 1] == '(') {
        ++cnt0;
      }
      if (s[i - 1] == ')') {
        ++cnt1;
      }
      if (s[i - 1] == '#') {
        ++cnt1;
        ans.push_back(1);
      }
      if (cnt1 > cnt0) {
        pos = false;
        break;
      }
    }
    if (!pos) {
      cout << -1;
      continue;
    }
    ans[ans.size() - 1] += cnt0 - cnt1;
    cnt0 = cnt1 = 0;
    j = 0;
    pos = true;
    for (i = 1; i <= s.length(); ++i) {
      if (s[i - 1] == '(') {
        ++cnt0;
      }
      if (s[i - 1] == ')') {
        ++cnt1;
      }
      if (s[i - 1] == '#') {
        cnt1 = cnt1 + ans[j];
        ++j;
      }
      if (cnt1 > cnt0) {
        pos = false;
        break;
      }
    }
    if (!pos) {
      cout << -1;
      continue;
    }
    for (i = 1; i <= ans.size(); ++i) {
      cout << ans[i - 1] << endl;
    }
  }
  return 0;
}
