You have a string s — a sequence of commands for your toy robot. The robot is placed in some cell of a rectangular grid. He can perform four commands:

  * 'W' — move one cell up; 
  * 'S' — move one cell down; 
  * 'A' — move one cell left; 
  * 'D' — move one cell right. 



Let Grid(s) be the grid of minimum possible area such that there is a position in the grid where you can place the robot in such a way that it will not fall from the grid while running the sequence of commands s. For example, if s = DSAWWAW then Grid(s) is the 4 × 3 grid:

  1. you can place the robot in the cell (3, 2); 
  2. the robot performs the command 'D' and moves to (3, 3); 
  3. the robot performs the command 'S' and moves to (4, 3); 
  4. the robot performs the command 'A' and moves to (4, 2); 
  5. the robot performs the command 'W' and moves to (3, 2); 
  6. the robot performs the command 'W' and moves to (2, 2); 
  7. the robot performs the command 'A' and moves to (2, 1); 
  8. the robot performs the command 'W' and moves to (1, 1). 

<image>

You have 4 extra letters: one 'W', one 'A', one 'S', one 'D'. You'd like to insert at most one of these letters in any position of sequence s to minimize the area of Grid(s).

What is the minimum area of Grid(s) you can achieve?

Input

The first line contains one integer T (1 ≤ T ≤ 1000) — the number of queries.

Next T lines contain queries: one per line. This line contains single string s (1 ≤ |s| ≤ 2 ⋅ 10^5, s_i ∈ \{W, A, S, D\}) — the sequence of commands.

It's guaranteed that the total length of s over all queries doesn't exceed 2 ⋅ 10^5.

Output

Print T integers: one per query. For each query print the minimum area of Grid(s) you can achieve.

Example

Input


3
DSAWWAW
D
WA


Output


8
2
4

Note

In the first query you have to get string DSAWW\underline{D}AW.

In second and third queries you can not decrease the area of Grid(s).
import java.io.*;
import java.util.*;
import java.text.*;
import java.lang.*;
import java.math.*;
 
public class Main{
    
    static int f(int i,int j) {
    	if(i==0) {   //up
    		if(j==0 || j==1) {
    			return 1;
    		}
    	}
    	else if(i==1) {
    		if(j==0 || j==1) {
    			return -1;
    		}
    	}
    	else if(i==3) {
    		if(j==2 || j==3) {
    			return 1;
    		}
    	}
    	else {
    		if(j==2 || j==3) {
    			return -1;
    		}
    	}
       return 0;
    }
       public void solve () {
        InputReader in = new InputReader(System.in);
        PrintWriter pw = new PrintWriter(System.out); 
        int t=in.nextInt();
        while(t-->0) {
        	char s[]=in.nextLine().toCharArray();
        	int n=s.length;
        	int a[][]=new  int [n+1][2];
        	int x = 0,y = 0;
        	for(int i=0;i<n;i++) {
        		if(s[i]=='W') x--;
        		else if(s[i]=='S') x++;
        		else if(s[i]=='A') y--;
        		else y++;
        		a[i+1][0]=x;
        		a[i+1][1]=y;
        		
        	}
        	long suf[][]=new long [n+5][4];
        	suf[n][0]=suf[n][1]=a[n][0];
        	suf[n][2]=suf[n][3]=a[n][1];
        	for(int i=n-1;i>=0;i--) {
        		suf[i][0]=Math.min(a[i][0], suf[i+1][0]);
        		suf[i][1]=Math.max(a[i][0], suf[i+1][1]);
        		suf[i][2]=Math.min(a[i][1], suf[i+1][2]);
        		suf[i][3]=Math.max(a[i][1], suf[i+1][3]);
        	}
        	long ans=(suf[0][1]-suf[0][0]+1)*(suf[0][3]-suf[0][2]+1);
        	long maxi[]=new long [4];
        	for(int i=1;i<=n;i++) {
        		long val[]=new long [4];
        		for(int j=0;j<4;j++) {
	        		val[0]=Math.min(Math.min(a[i-1][0]-f(j,0),maxi[0]), suf[i][0]-f(j,0));
	        		val[1]=Math.max(Math.max(maxi[1], a[i-1][0]-f(j,1)), suf[i][1]-f(j,1));
	        		val[2]=Math.min(Math.min(maxi[2], a[i-1][1]-f(j,2)), suf[i][2]-f(j,2));
	        		val[3]=Math.max(Math.max(maxi[3], a[i-1][1]-f(j,3)), suf[i][3]-f(j,3));
	        		ans=Math.min(ans,(val[1]-val[0]+1)*(val[3]-val[2]+1));
        		}
        		
        		maxi[0]=Math.min(a[i][0],maxi[0]);
        		maxi[1]=Math.max(a[i][0], maxi[1]);
        		maxi[2]=Math.min(a[i][1], maxi[2]);
        		maxi[3]=Math.max(a[i][1], maxi[3]);
        	}
        	pw.println(ans);
        }
        
        pw.flush();
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        
        
        new Thread(null,new Runnable() {
            public void run() {
                new Main().solve();
            }
        },"1",1<<26).start();
        
        
    }
    static class trie{
        trie x,y;
        Integer z;
        trie(int z){
            x=null;
            y=null;
            this.z=z;
        }
        public String toSring() {
        	return (z+" ");
        }
    }
    static void debug(Object... o) {
        System.out.println(Arrays.deepToString(o));
        }
        
        static class InputReader 
        {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) 
        {
            this.stream = stream;
        }
        public int snext() 
        {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) 
            {
                curChar = 0;
                try 
                {
                    snumChars = stream.read(buf);
                } 
                catch (IOException e) 
                {
                    throw new InputMismatchException();
                }
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
 
        public int nextInt() 
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-')
            {
                sgn = -1;
                c = snext();
            }
            int res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public long nextLong()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-') 
            {
                sgn = -1;
                c = snext();
            }
            long res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) 
        {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) 
            {
                a[i] = nextInt();
            }
            return a;
        }
 
        public String readString()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public String nextLine() 
        {
            int c = snext();
            while (isSpaceChar(c))
                c = snext();
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public boolean isSpaceChar(int c) 
        {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) 
        {
            return c == '\n' || c == '\r' || c == -1;
        }
 
        public interface SpaceCharFilter
        {
            public boolean isSpaceChar(int ch);
        }
    }
        public static long mod = 1000000007;
        public static int d;
        public static int p;
        public static int q;
        public void extended(int a,int b) {
            if(b==0) {
                d=a;
                p=1;
                q=0;
            }
            else
            {
                extended(b,a%b);
                int temp=p;
                p=q;
                q=temp-(a/b)*q;
            }
        }
        public static int binaryExponentiation(int x,int n)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static long binaryExponentiation(long x,long n)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static int modularExponentiation(int x,int n,int M)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result * x)%M;
                x=(x%M*x)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modularExponentiation(long x,long n,long M)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result%M * x%M)%M;
                x=(x%M * x%M)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modInverse(int A,int M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
        public static long modInverse(long A,long M)
        {
            return modularExponentiation(A,M-2,M);
        }
        public static long[] shuffle(long[] a,Random gen)
        {
            int n = a.length;
            for(int i=0;i<n;i++)
            {
                int ind = gen.nextInt(n-i)+i;
                long temp = a[ind];
                a[ind] = a[i];
                a[i] = temp;
            }
            return a;
        }
        
        public static void swap(int a, int b){
            int temp = a;
            a = b;
            b = temp;
        }
        
        public static HashSet<Integer> primeFactorization(int n)
        {
            HashSet<Integer> a =new HashSet<Integer>();
            for(int i=2;i*i<=n;i++)
            {
                while(n%i==0)
                {
                    a.add(i);
                    n/=i;
                }
            }
            if(n!=1)
                a.add(n);
            return a;
        }
        
        public static void sieve(boolean[] isPrime,int n)
        {
            for(int i=1;i<n;i++)
                isPrime[i] = true;
            
            isPrime[0] = false;
            isPrime[1] = false;
            
            for(int i=2;i*i<n;i++)
            {
                if(isPrime[i] == true)
                {
                    for(int j=(2*i);j<n;j+=i)
                        isPrime[j] = false;
                }
            }
        }
        
        public static int GCD(int a,int b)
        {
            if(b==0)
                return a;
            else
                return GCD(b,a%b);
        }
        
        static class pair implements Comparable<pair>
        {
            Integer x;
            Integer y,z;
            Long val;
            pair(int x,int y,int z,long val)
            {
                this.x=x;
                this.y=y;
                this.z=z;
                this.val=val;
            }

            public int compareTo(pair o) {
                int result = x.compareTo(o.x);
                if(result==0)
                    result = y.compareTo(o.y);
                
                return result;
            }  
            
            public String toString()
            {
                return x+" "+y;
            }
            
            public boolean equals(Object o)
            {
                if (o instanceof pair)
                {
                    pair p = (pair)o;
                    return p.x == x && p.y == y ;
                }
                return false;
            }
            
            public int hashCode()
            {
                return new Double(x).hashCode()*31 + new Long(y).hashCode();
            }
        }
        
    
}

class dsu{
    int parent[];
    dsu(int n){
        parent=new int[n+1];
        for(int i=0;i<=n;i++)
        {
            parent[i]=i;
        }
    }
    int root(int n) {
        while(parent[n]!=n)
        { 
            parent[n]=parent[parent[n]];
            n=parent[n];
        }
        return n;
    }
    void union(int _a,int _b) {
        int p_a=root(_a);
        int p_b=root(_b);
        
            parent[p_a]=p_b;
        
            
    }
    boolean find(int a,int b) {
        if(root(a)==root(b))
            return true;
        else
            return  false;
    }
    
    
}
class Segment{ 
    int seg[]; 
    int a[];
    int lazy[];
    Segment (int n,int b[]){
        seg=new int[4*n];
        lazy=new int[4*n];
        a=new int[b.length];
        a=b.clone();
    }
    public void build(int node,int start,int end) {
        if(start==end) {
            seg[node]=a[start];
            return ;
        }
        int mid=(start+end)/2;
        build(2*node+1,start,mid);
        build(2*node+2,mid+1,end);
        seg[node]=seg[2*node+1]+seg[2*node+2];
    }
    public void update(int node,int start,int end,int id,int val) {
        if(start==end) {
            seg[node]=a[start]=val;
            return;
        }
        int mid=(start+end)/2;
        if(id>=start && id<=mid) {
            update(2*node+1,start,mid,id,val);
        }
        else
            update(2*node+2,mid+1,end,id,val);
        seg[node]=seg[2*node+1]+seg[2*node+2];
    }
    public int query(int node,int start,int end,int l,int r) {
        if(l>end || r<start)
            return 0;
        if(start>=l && end<=r)
            return seg[node];
        
        int  mid=(start+end)/2;
        return (query(2*node+1,start,mid,l,r)+query(2*node+2,mid+1,end,l,r));
    }
    public void updateRange(int node,int start,int end,int l,int r,int val) {
        if(lazy[node]!=0) {
            if(start!=end) {
                lazy[2*node+1]+=lazy[node];
                lazy[2*node+2]+=lazy[node];
            }
            lazy[node]=0;
        }
        if(l>end || r<start)
            return ;
        if(start>=l && end<=r) {
            seg[node]=(end-start+1)*val;
            if(start!=end) {
                lazy[2*node+1]+=val;
                lazy[2*node+2]+=val;
            }
            lazy[node]=0;
            return ;
        }
        int mid=(start+end)/2;
        updateRange(2*node+1,start,mid,l,r,val);
        updateRange(2*node+2,mid+1,end,l,r,val);
        seg[node]=seg[2*node+1]+seg[2*node+2];
    }
    public int queryRange(int node,int start,int end,int l,int r) {
        if(l>end || r<start)
            return 0;
        if(lazy[node]!=0) {
            seg[node]=(end-start+1)*lazy[node];
            if(start!=end) {
                lazy[2*node+1]+=lazy[node];
                lazy[2*node+2]+=lazy[node];
            }
            lazy[node]=0;
        }
        if(start>=l && end<=r)
            return seg[node];
        
        int  mid=(start+end)/2;
        return (query(2*node+1,start,mid,l,r)+query(2*node+2,mid+1,end,l,r));
    }
    
}
