You are given two sequences a_1, a_2, ..., a_n and b_1, b_2, ..., b_n. Each element of both sequences is either 0, 1 or 2. The number of elements 0, 1, 2 in the sequence a is x_1, y_1, z_1 respectively, and the number of elements 0, 1, 2 in the sequence b is x_2, y_2, z_2 respectively.

You can rearrange the elements in both sequences a and b however you like. After that, let's define a sequence c as follows:

c_i = \begin{cases} a_i b_i & \mbox{if }a_i > b_i \\\ 0 & \mbox{if }a_i = b_i \\\ -a_i b_i & \mbox{if }a_i < b_i \end{cases}

You'd like to make ∑_{i=1}^n c_i (the sum of all elements of the sequence c) as large as possible. What is the maximum possible sum?

Input

The first line contains one integer t (1 ≤ t ≤ 10^4) — the number of test cases.

Each test case consists of two lines. The first line of each test case contains three integers x_1, y_1, z_1 (0 ≤ x_1, y_1, z_1 ≤ 10^8) — the number of 0-s, 1-s and 2-s in the sequence a.

The second line of each test case also contains three integers x_2, y_2, z_2 (0 ≤ x_2, y_2, z_2 ≤ 10^8; x_1 + y_1 + z_1 = x_2 + y_2 + z_2 > 0) — the number of 0-s, 1-s and 2-s in the sequence b.

Output

For each test case, print the maximum possible sum of the sequence c.

Example

Input


3
2 3 2
3 3 1
4 0 1
2 3 0
0 0 1
0 0 1


Output


4
2
0

Note

In the first sample, one of the optimal solutions is:

a = \{2, 0, 1, 1, 0, 2, 1\}

b = \{1, 0, 1, 0, 2, 1, 0\}

c = \{2, 0, 0, 0, 0, 2, 0\}

In the second sample, one of the optimal solutions is:

a = \{0, 2, 0, 0, 0\}

b = \{1, 1, 0, 1, 0\}

c = \{0, 2, 0, 0, 0\}

In the third sample, the only possible solution is:

a = \{2\}

b = \{2\}

c = \{0\}

import java.io.*;

import java.lang.annotation.Native;
import java.math.BigInteger;
import java.util.*;

import java.util.ArrayList;

import java.util.Scanner;


public class main {
    static class pair {
        long first;
        int second;

        pair(long a, int b) {
            first = a;
            second = b;
        }
    }

    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new
                    InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }

    static final int mod = 1000000007;
    static final int mod1 = 1073741824;

    public static int gcd(int a, int b) {
        if (a == 0)
            return b;
        return gcd(b % a, a);
    }

    static boolean prime[] = new boolean[1000001];
    public static void merge(long arr[][], int l, int m, int r)
    {
        // Find sizes of two subarrays to be merged
        int n1 = m - l + 1;
        int n2 = r - m;

        /* Create temp arrays */
        long L[][] = new long[n1][2];
        long R[][] = new long[n2][2];

        /*Copy data to temp arrays*/
        for (int i = 0; i < n1; ++i)
        {
            L[i][0] = arr[l + i][0];
            L[i][1] = arr[l + i][1];


        }

        for (int j = 0; j < n2; ++j) {
            R[j][0] = arr[m + 1 + j][0];
            R[j][1] = arr[m + 1 + j][1];
        }

        /* Merge the temp arrays */

        // Initial indexes of first and second subarrays
        int i = 0, j = 0;

        // Initial index of merged subarry array
        int k = l;
        while (i < n1 && j < n2) {
            if (L[i][0] <= R[j][0]) {
                arr[k][0] = L[i][0];
                arr[k][1] = L[i][1];

                i++;
            }
            else {
                arr[k][0] = R[j][0];
                arr[k][1] = R[j][1];
                j++;
            }
            k++;
        }

        /* Copy remaining elements of L[] if any */
        while (i < n1) {
            arr[k][0] = L[i][0];
            arr[k][1] = L[i][1];
            i++;
            k++;
        }

        /* Copy remaining elements of R[] if any */
        while (j < n2) {
            arr[k][0] = R[j][0];
            arr[k][1] = R[j][1];

            j++;
            k++;
        }
    }

    public static long[][] sort2elementarray(long arr[][], int l, int r)
    {
        if (l < r) {
            // Find the middle point
            int m = (l + r) / 2;

            // Sort first and second halves
            sort2elementarray(arr, l, m);
            sort2elementarray(arr, m + 1, r);

            // Merge the sorted halves
            merge(arr, l, m, r);
        }
        return arr;
    }


    static int f=1;
    static int vertices=0;
    static int edges=0;
    public static void dfs(ArrayList<Integer>[]li,int v,HashMap<Integer,Integer>hm)
    {
        hm.put(v,1);

        //System.out.print(v+" ");
        //System.out.println(a[v]+" "+cost);


        vertices++;
        edges+=li[v].size();
        for (int j = 0; j < li[v].size(); j++)
        {

            if (hm.get(li[v].get(j)) == null)
            {

                dfs(li, li[v].get(j), hm);

            }
        }
    }




    public static void dfsutil(ArrayList<Integer>[]li,int n,int v)
    {
        HashMap<Integer,Integer>hm=new HashMap<>();
        int c=0;

        for(int j=1;j<=n;j++)
        {

            if(hm.get(j)==null)
            {
                vertices=0;
                edges=0;
                dfs(li,j,hm);
                if(edges!=vertices*(vertices-1)) {
                    System.out.println("NO");
                    System.exit(0);
                }
            }
        }
        System.out.println("YES");


    }
    public static void bipartite(ArrayList<Integer>[]li,int n) {
        int f = 1;
        int col[] = new int[n + 1];
        int fl = 1;
        Arrays.fill(col, -1);
        for (int i = 1; i <= n; i++) {
            if (col[i] == -1) {
                col[i] = 1;
                Queue<Integer> q = new LinkedList<>();
                q.add(i);
                while (!q.isEmpty()) {
                    int x = q.peek();
                    q.remove();
                    for (int j = 0; j < li[x].size(); j++) {
                        if (col[li[x].get(j)] == -1) {
                            col[li[x].get(j)] = 1 - col[x];
                            q.add(li[x].get(j));
                        } else if (col[li[x].get(j)] == col[x]) {
                            f = 0;
                            break;
                        }

                    }

                }
                if (f == 0) {
                    fl = 0;
                    break;
                }


            }

        }
        /*if(fl==0)
          //  System.out.println(-1);
        //else
        {*/

        long l1 = 0;
        long l2 = 0;
        for (int j = 1; j <= n; j++) {
            if (col[j] == 1) {
                l1++;
                //sb.append(j+" ");
            } else {
                l2++;
                //sb1.append(j+" ");
            }
        }
        long ans=(l1*l2)-(n-1);
        System.out.println(ans);
        //}

    }


    public static void isPossibleTriangle(int []arr,
                                      int N)
    {

        // If number of elements are
        // less than 3, then no
        // triangle is possible

        if (N < 3)
            System.out.println(-1);
        else
            {
                int f=0;


            // first sort the array

            // loop for all 3
            // consecutive triplets
            for (int i = 0; i < N - 2; i++) {
                // If triplet satisfies
                // triangle condition, break
                if (arr[i] + arr[i + 1] < arr[i + 2]) {
                    //System.out.println(arr[i]+" "+arr[i+1]+" "+arr[i+2]);
                    System.out.println(i + " " + (i + 1) + " " + (i + 2));
                    f = 1;
                    break;
                }
            }
            if(f==0)
                System.out.println(-1);

        }
    }
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);

        int t=sc.nextInt();

        for(int i=0;i<t;i++)
        {
            int x1=sc.nextInt();
            int y1=sc.nextInt();
            int z1=sc.nextInt();
            int x2=sc.nextInt();
            int y2=sc.nextInt();
            int z2=sc.nextInt();
            long ans=0;
            ans=2*Math.min(z1,y2);
            int temp=y2;
            y2=Math.max(y2-z1,0);
            z1=Math.max(z1-temp,0);
            z2-=z1;
            if(z2>0)
            {
                temp=z2;
                z2-=Math.min(z2,x1);
                if(z2>0)
                {
                    ans-=z2*2;
                }
                else
                {
                    x1-=temp;
                }
            }
            System.out.println(ans);




        }


    }
}