There is a binary string a of length n. In one operation, you can select any prefix of a with an equal number of 0 and 1 symbols. Then all symbols in the prefix are inverted: each 0 becomes 1 and each 1 becomes 0.

For example, suppose a=0111010000. 

  * In the first operation, we can select the prefix of length 8 since it has four 0's and four 1's: [01110100]00→ [10001011]00. 
  * In the second operation, we can select the prefix of length 2 since it has one 0 and one 1: [10]00101100→ [01]00101100. 
  * It is illegal to select the prefix of length 4 for the third operation, because it has three 0's and one 1. 



Can you transform the string a into the string b using some finite number of operations (possibly, none)?

Input

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

The first line of each test case contains a single integer n (1≤ n≤ 3⋅ 10^5) — the length of the strings a and b.

The following two lines contain strings a and b of length n, consisting of symbols 0 and 1.

The sum of n across all test cases does not exceed 3⋅ 10^5.

Output

For each test case, output "YES" if it is possible to transform a into b, or "NO" if it is impossible. You can print each letter in any case (upper or lower).

Example

Input


5
10
0111010000
0100101100
4
0000
0000
3
001
000
12
010101010101
100110011010
6
000111
110100


Output


YES
YES
NO
YES
NO

Note

The first test case is shown in the statement.

In the second test case, we transform a into b by using zero operations.

In the third test case, there is no legal operation, so it is impossible to transform a into b.

In the fourth test case, here is one such transformation: 

  * Select the length 2 prefix to get 100101010101. 
  * Select the length 12 prefix to get 011010101010. 
  * Select the length 8 prefix to get 100101011010. 
  * Select the length 4 prefix to get 011001011010. 
  * Select the length 6 prefix to get 100110011010. 



In the fifth test case, the only legal operation is to transform a into 111000. From there, the only legal operation is to return to the string we started with, so we cannot transform a into b.
import java.io.BufferedReader;
import java.lang.*;
import java.math.BigInteger;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.StringTokenizer;
 
public class Practice{
	
	
	 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 int  gcd(int a, int b) {


	    if (b == 0) {
	        return a;}
	    else {
	        return gcd(b, a % b);}}
	 
	 //for prime no
	  static boolean isPrime(int n) {
	        return BigInteger.valueOf(n).isProbablePrime(1);
	    }
	 
	    static boolean isPrime(long n) {
	        return BigInteger.valueOf(n).isProbablePrime(1);
	    }

	 static boolean[] seiveOfEratoSthenes(int n) {
		 boolean isPrime[]=new boolean[n+1];
		 Arrays.fill(isPrime, true);
		 isPrime[0]=false;
		 isPrime[1]=false;
		 for(int i=2;i<=Math.sqrt(n);i++) {
			 for(int j=2*i;j<=n;j+=i) {
				 isPrime[j]=false;
			 }
		 }
		 
		 return isPrime;
		 
	 }
	 
	 static long modulo(long a,long b,int n) {
		 long res=1;
		 
		 while(b>0) {
			 if((b&1)==1) {
				 res=(res*(a%n))%n;
			 }
			 a=((a%n)*(a%n))%n;
			 b=b>>1;
			 
		 }
		 return res;
	 }
	 
	 static class Pair  implements Comparable<Pair>{
		 int index;
		
		 int time;
		 
		 Pair(int index,int time){  
			 this.index=index;
			  
			 this.time=time;  
			 }  
		 public int compareTo(Pair st){  
			 if(time==st.time)  
			 return index-st.index;  
			 else if(time>st.time)  
			 return 1;  
			 else  
			 return -1;  
			 }  
	 } 
	 
	 static boolean isPalindrome(String s) {
	        int length = s.length();
	        for (int i = 0; i < length / 2; i++) {
	            if (s.charAt(i) != s.charAt(length - 1 - i)) {
	                return false;
	            }
	        }
	        return true;
	    }
	 
	 	static void reverseArray(int[] arr) {
	        for (int i = 0; i < arr.length / 2; i++) {
	            int temp = arr[i];
	            arr[i] = arr[arr.length - 1 - i];
	            arr[arr.length - 1 - i] = temp;
	        }
	    }
	 
	    static void reverseArray(String[] arr) {
	        for (int i = 0; i < arr.length / 2; i++) {
	            String temp = arr[i];
	            arr[i] = arr[arr.length - 1 - i];
	            arr[arr.length - 1 - i] = temp;
	        }
	    }
	 
	    static void reverseArray(char[] arr) {
	        for (int i = 0; i < arr.length / 2; i++) {
	            char temp = arr[i];
	            arr[i] = arr[arr.length - 1 - i];
	            arr[arr.length - 1 - i] = temp;
	        }
	    }

	    public static void main(String[] args)
	    {
	        FastReader sc = new FastReader();
	        int t=sc.nextInt();
	        
	        	while(t-->0) {
	        	int a=sc.nextInt();
	        	
	        	String as=sc.nextLine();
	        	String bs=sc.nextLine();
	        	char arr[]=as.toCharArray();
	        	char brr[]=bs.toCharArray();
	        	if(as.equals(bs)) {
	        		System.out.println("YES");
	        	}
	        	else {
	        		boolean br=true;
	        		boolean vis[]=new boolean[a];
	        		count(vis,arr);
	        		boolean inv=true;
	        		for(int i=a-1;i>0;i--) {
	        			if(inv) {
	        			if(arr[i]!=brr[i]) {
	        				if(!vis[i]) {
	        					System.out.println("NO");
	        					br=false;
	        					break;
	        				}
	        				else {
	        					inv=false;
	        				}
	        			}
	        		}
	        			
	        			else {
		        			if(arr[i]==brr[i]) {
		        				if(!vis[i]) {
		        					System.out.println("NO");
		        					br=false;
		        					break;
		        				}
		        				else {
		        					inv=true;
		        				}
		        			}
		        		}}
	        		
	        		if(!inv) {
        				if(arr[0]=='1') {
        					arr[0]='0';
        				}
        				else {
        					arr[0]='1';
        				}
        			}
	        		if(br) {
	        			if(arr[0]==brr[0]) {
	        				System.out.println("YES");
	        			}
	        			else {System.out.println("NO");}
	        		}
	        	}
	        		
	        	}
	       
	        
	    }
	
	    static void count(boolean[] vis,char[]arr) {
	    	int c0=0;
	    	int c1=0;
	    	for(int i=0;i<arr.length;i++) {
	    		if(arr[i]=='1') {
	    			c1++;
	    		}
	    		else {
	    			c0++;
	    		}
	    		vis[i]=(c0==c1);
	    	}
	    	
	    }
	 
	 	static int binary(int start,int end,int arr[],int v ) {
	 		int Q=0;
	 	    if (end <= start) 
	 	        { Q=(v >= arr[start])?  start : (start-1); }
	 	    else{
	 	  
	 	    int mid = (start + end)/2; 
	 	  
	 	    if(v == arr[mid]) 
	 	       return mid; 
	 	  
	 	    if(v >arr[mid]) {
	 	        Q= binary( mid+1, end,arr, v); }
	 	    else if(v <arr[mid]){
	 	    Q= binary( start, mid-1,arr, v); }}
	 	    return Q;
	 	}
	        	 

	    }


	    
	     
	 
	
	
	    