We have a grid with (2^N - 1) rows and (2^M-1) columns. You are asked to write 0 or 1 in each of these squares. Let a_{i,j} be the number written in the square at the i-th row from the top and the j-th column from the left.

For a quadruple of integers (i_1, i_2, j_1, j_2) such that 1\leq i_1 \leq i_2\leq 2^N-1, 1\leq j_1 \leq j_2\leq 2^M-1, let S(i_1, i_2, j_1, j_2) = \displaystyle \sum_{r=i_1}^{i_2}\sum_{c=j_1}^{j_2}a_{r,c}. Then, let the oddness of the grid be the number of quadruples (i_1, i_2, j_1, j_2) such that S(i_1, i_2, j_1, j_2) is odd.

Find a way to fill in the grid that maximizes its oddness.

Constraints

* N and M are integers between 1 and 10 (inclusive).

Input

Input is given from Standard Input in the following format:


N M


Output

Print numbers to write in the grid so that its oddness is maximized, in the following format:


a_{1,1}a_{1,2}\cdots a_{1,2^M-1}
a_{2,1}a_{2,2}\cdots a_{2,2^M-1}
\vdots
a_{2^N-1,1}a_{2^N-1,2}\cdots a_{2^N-1,2^M-1}


If there are multiple solutions, you can print any of them.

Example

Input

1 2


Output

111
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

int h,w;

int a[1023][1023];
int row[1023],col[1023];

int dfs(int i,int j){
	if(i==h){
		int sum[32][32]={};
		rep(y,h) rep(x,w) sum[y+1][x+1]=sum[y+1][x]+sum[y][x+1]-sum[y][x]+a[y][x];

		int res=0;
		rep(y2,h+1) rep(y1,y2) rep(x2,w+1) rep(x1,x2) {
			res+=(sum[y2][x2]-sum[y2][x1]-sum[y1][x2]+sum[y1][x1])%2;
		}
if(res>=420){
printf("res = %d\n",res);
	rep(y,h){ rep(x,w) printf("%d",a[y][x]); puts(""); } puts("--");
}
		return res;
	}

	if(j==w) return dfs(i+1,0);

	int res=0;
	if(row[i]<=1 && col[j]<=1){
		a[i][j]=1;
		row[i]++;
		col[j]++;
		res=max(res,dfs(i,j+1));
		row[i]--;
		col[j]--;
	}
	a[i][j]=0;
	res=max(res,dfs(i,j+1));
	return res;
}

int main(){
	int m,n; scanf("%d%d",&m,&n);

	h=(1<<m)-1;
	w=(1<<n)-1;

if(0){
//	rep(i,h) rep(j,w) a[i][j]=(i==h/2&&j==w/2?1:0);
	rep(i,3) rep(j,3) a[i  ][j  ]=(i==1&&j==1?0:1);
	rep(i,3) rep(j,3) a[i+4][j  ]=a[i][j];
	rep(i,3) rep(j,3) a[i  ][j+4]=a[i][j];
	rep(i,3) rep(j,3) a[i+4][j+4]=a[i][j];
	rep(i,h) a[i][w/2]=1;
	rep(j,w) a[h/2][j]=1;
	a[h/2][w/2]=0;

	int sum[32][32]={};
	rep(y,h) rep(x,w) sum[y+1][x+1]=sum[y+1][x]+sum[y][x+1]-sum[y][x]+a[y][x];

	int res=0;
	rep(y2,h+1) rep(y1,y2) rep(x2,w+1) rep(x1,x2) {
		res+=(sum[y2][x2]-sum[y2][x1]-sum[y1][x2]+sum[y1][x1])%2;
	}
	printf("res = %d\n",res);
	rep(y,h){ rep(x,w) printf("%d",a[y][x]); puts(""); } puts("--");
	return 0;
}

//	printf("%d\n",dfs(0,0));

	if(m==1 && n==1) return puts("1"),0;

//	rep(i,h) rep(j,w) printf("%d%s",i==h/2&&j==w/2?0:1,j<w-1?"":"\n");

	int k=min(m,n);
	int a[1023][1023];
	rep(i,(1<<k)-1) rep(j,(1<<k)-1) a[i][j]=1;
	for(int t=1;t<k;t++){
		rep(i,(1<<t)-1) rep(j,(1<<t)-1) {
			a[(1<<t)+i][j]=a[i][j];
			a[i][(1<<t)+j]=a[i][j];
			a[(1<<t)+i][(1<<t)+j]=a[i][j];
		}
		a[(1<<t)-1][(1<<t)-1]=0;
	}

	if(m<=n){
		rep(i,(1<<k)-1){
			rep(_,(1<<(n-m))-1) putchar('0');
			rep(j,(1<<k)-1){
				printf("%d",a[i][j]);
				rep(_,(1<<(n-m))-1) putchar('0');
			}
			puts("");
		}
	}
	else{
		rep(i,(1<<k)-1){
			rep(_,(1<<(m-n))-1){
				rep(j,w) putchar('0');
				puts("");
			}
			rep(j,(1<<k)-1){
				printf("%d",a[i][j]);
			}
			puts("");
		}
		rep(_,(1<<(m-n))-1){
			rep(j,w) putchar('0');
			puts("");
		}
	}

	return 0;
}
