You have a string s of length n consisting of only characters > and <. You may do some operations with this string, for each operation you have to choose some character that still remains in the string. If you choose a character >, the character that comes right after it is deleted (if the character you chose was the last one, nothing happens). If you choose a character <, the character that comes right before it is deleted (if the character you chose was the first one, nothing happens).

For example, if we choose character > in string > > < >, the string will become to > > >. And if we choose character < in string > <, the string will become to <.

The string is good if there is a sequence of operations such that after performing it only one character will remain in the string. For example, the strings >, > > are good. 

Before applying the operations, you may remove any number of characters from the given string (possibly none, possibly up to n - 1, but not the whole string). You need to calculate the minimum number of characters to be deleted from string s so that it becomes good.

Input

The first line contains one integer t (1 ≤ t ≤ 100) – the number of test cases. Each test case is represented by two lines.

The first line of i-th test case contains one integer n (1 ≤ n ≤ 100) – the length of string s.

The second line of i-th test case contains string s, consisting of only characters > and <.

Output

For each test case print one line.

For i-th test case print the minimum number of characters to be deleted from string s so that it becomes good.

Example

Input


3
2
&lt;&gt;
3
&gt;&lt;&lt;
1
&gt;


Output


1
0
0

Note

In the first test case we can delete any character in string <>.

In the second test case we don't need to delete any characters. The string > < < is good, because we can perform the following sequence of operations: > < < → < < → <.
#include <bits/stdc++.h>
using namespace std;
long long ceile(long long &a, long long &b) { return (a / b) + ((a % b) != 0); }
class Graph {
 public:
  long long V;
  vector<vector<long long>> adj;
  Graph(long long V) {
    this->V = V;
    adj.resize(V, vector<long long>(0));
  }
  void addEdge(long long u, long long v) { adj[u].push_back(v); }
  bool DFS(long long s, long long V) {
    vector<bool> vis(V, 0);
    stack<long long> stack;
    stack.push(s);
    long long ans = 0;
    while (!stack.empty()) {
      s = stack.top();
      stack.pop();
      if (!vis[s]) {
        ans++;
        vis[s] = true;
      }
      for (auto i = adj[s].begin(); i != adj[s].end(); ++i)
        if (!vis[*i]) stack.push(*i);
    }
    return ans == V;
  }
};
class numpy {
 public:
  vector<long long> argsort(vector<long long> &vec) {
    vector<pair<long long, long long>> v;
    long long n = vec.size();
    for (long long(i) = (0); (i) < (n); ++(i)) v.push_back({vec[i], i});
    sort(v.begin(), v.end());
    vector<long long> ans;
    for (long long(i) = (0); (i) < (n); ++(i)) ans.push_back(v[i].second);
    return ans;
  }
  long long argmax(vector<long long> &vec) {
    return (max_element(vec.begin(), vec.end()) - vec.begin());
  }
};
int32_t main() {
  long long te;
  cin >> te;
  numpy np;
tester:
  while (te--) {
    long long n;
    cin >> n;
    string s;
    cin >> s;
    long long i = 0;
    for (; i < n; i++)
      if (s[i] == '>') break;
    long long j = 0;
    for (; j < n; j++)
      if (s[n - j - 1] == '<') break;
    cout << min(i, j);
    cout << '\n';
  }
}
