Francisco Santos
/
SRA_VFF
pepe
Robot.cpp@2:06b7789c7da0, 2019-11-24 (annotated)
- Committer:
- FJMS
- Date:
- Sun Nov 24 18:37:46 2019 +0000
- Revision:
- 2:06b7789c7da0
- Parent:
- 1:2716ea33958b
pepe;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PedroMartins96 | 0:a7324f51348d | 1 | #include "Robot.h" |
PedroMartins96 | 0:a7324f51348d | 2 | #include "mbed.h" |
PedroMartins96 | 1:2716ea33958b | 3 | #include "Matrix.h" |
PedroMartins96 | 0:a7324f51348d | 4 | |
PedroMartins96 | 0:a7324f51348d | 5 | Serial PC(SERIAL_TX, SERIAL_RX); |
PedroMartins96 | 0:a7324f51348d | 6 | I2C i2c(I2C_SDA, I2C_SCL ); |
PedroMartins96 | 0:a7324f51348d | 7 | const int addr8bit = 20 << 1; // 7bit I2C address is 20; 8bit I2C address is 40 (decimal). |
PedroMartins96 | 1:2716ea33958b | 8 | Matrix map(80,80); |
PedroMartins96 | 0:a7324f51348d | 9 | int16_t countsLeft = 0; |
PedroMartins96 | 0:a7324f51348d | 10 | int16_t countsRight = 0; |
PedroMartins96 | 1:2716ea33958b | 11 | int i, j; |
PedroMartins96 | 1:2716ea33958b | 12 | |
FJMS | 2:06b7789c7da0 | 13 | float De=0, Dd=0, pi=3.141529, Ldis=14.2, r=6.95/2, theta=0, teta=0, teta_=0, x=20, y=20, D=0, Wee=0, Wdd=0, v=0, w=0; |
PedroMartins96 | 1:2716ea33958b | 14 | float xc, yc; // coordenadas da célula |
PedroMartins96 | 1:2716ea33958b | 15 | float x_obj = 0, y_obj = 0; |
FJMS | 2:06b7789c7da0 | 16 | float xf = 100, yf = 20; // coordenadas finais |
PedroMartins96 | 1:2716ea33958b | 17 | |
FJMS | 2:06b7789c7da0 | 18 | float fcr = 500; // Força Constante Repulsiva |
FJMS | 2:06b7789c7da0 | 19 | float fca = 30; // Força Constante Atrativa |
PedroMartins96 | 1:2716ea33958b | 20 | float fre_x = 0, fre_y = 0, fa_x = 0, fa_y = 0, Fr_x = 0, Fr_y = 0; |
PedroMartins96 | 0:a7324f51348d | 21 | |
PedroMartins96 | 0:a7324f51348d | 22 | |
PedroMartins96 | 1:2716ea33958b | 23 | float d = 0, dt = 0; |
PedroMartins96 | 1:2716ea33958b | 24 | float P = 0, I = 0; |
PedroMartins96 | 1:2716ea33958b | 25 | float phi1=0,aux=0; |
FJMS | 2:06b7789c7da0 | 26 | float Kv=5, Ks=10, Ki = 0.01; |
PedroMartins96 | 1:2716ea33958b | 27 | float erro = 0; |
PedroMartins96 | 1:2716ea33958b | 28 | int aux_x = 0, aux_y = 0; |
PedroMartins96 | 1:2716ea33958b | 29 | |
FJMS | 2:06b7789c7da0 | 30 | |
PedroMartins96 | 1:2716ea33958b | 31 | //PC.baud(9600); |
PedroMartins96 | 1:2716ea33958b | 32 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 33 | // Seguimento de um percurso // |
PedroMartins96 | 1:2716ea33958b | 34 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 35 | void VFF() |
PedroMartins96 | 0:a7324f51348d | 36 | { |
PedroMartins96 | 1:2716ea33958b | 37 | while((abs(x)<abs(xf)-2)||(abs(y)<abs(yf)-2)||(abs(x)>abs(xf)+2)||(abs(y)>abs(yf)+2)) { |
PedroMartins96 | 1:2716ea33958b | 38 | motion(); |
PedroMartins96 | 1:2716ea33958b | 39 | f_repulsiva(); |
PedroMartins96 | 1:2716ea33958b | 40 | f_atrativa(); |
PedroMartins96 | 1:2716ea33958b | 41 | Fr_x = fre_x + fa_x; |
PedroMartins96 | 1:2716ea33958b | 42 | Fr_y = fre_y + fa_y; |
FJMS | 2:06b7789c7da0 | 43 | //PC.printf("Fr_x=%f Fr_y=%f\n",Fr_x,Fr_y); |
FJMS | 2:06b7789c7da0 | 44 | //if(Fr_x<8) Fr_x=8; |
FJMS | 2:06b7789c7da0 | 45 | //if(Fr_y<8) Fr_y=8; |
PedroMartins96 | 1:2716ea33958b | 46 | x_obj = x + Fr_x; |
PedroMartins96 | 1:2716ea33958b | 47 | y_obj = y + Fr_y; |
PedroMartins96 | 1:2716ea33958b | 48 | |
PedroMartins96 | 1:2716ea33958b | 49 | erro = sqrt((x_obj-x)*(x_obj-x)+(y_obj-y)*(y_obj-y)) - 9; |
PedroMartins96 | 1:2716ea33958b | 50 | |
PedroMartins96 | 1:2716ea33958b | 51 | P = Kv*erro; |
PedroMartins96 | 1:2716ea33958b | 52 | I += erro; |
PedroMartins96 | 1:2716ea33958b | 53 | v = P + Ki*I; |
FJMS | 2:06b7789c7da0 | 54 | if(v>25) v = 25; |
FJMS | 2:06b7789c7da0 | 55 | else if(v < -25) v=-25; |
PedroMartins96 | 1:2716ea33958b | 56 | |
PedroMartins96 | 1:2716ea33958b | 57 | phi1=atan2((y_obj-y),(x_obj-x)); // Ângulo entre a posição final e a posição atual |
PedroMartins96 | 1:2716ea33958b | 58 | aux = phi1-teta; |
PedroMartins96 | 1:2716ea33958b | 59 | //Verifica se a diferença dos angulos pertence ao limite entre [-pi;pi] |
PedroMartins96 | 1:2716ea33958b | 60 | if(aux<-pi) { |
PedroMartins96 | 1:2716ea33958b | 61 | aux=aux+2*pi; |
PedroMartins96 | 1:2716ea33958b | 62 | } else if(aux>pi) { |
PedroMartins96 | 1:2716ea33958b | 63 | aux=aux-2*pi; |
PedroMartins96 | 0:a7324f51348d | 64 | } |
PedroMartins96 | 0:a7324f51348d | 65 | |
PedroMartins96 | 1:2716ea33958b | 66 | //Controlo proporcional |
PedroMartins96 | 1:2716ea33958b | 67 | w=Ks*(aux); |
PedroMartins96 | 1:2716ea33958b | 68 | if(w>5) w = 5; |
PedroMartins96 | 1:2716ea33958b | 69 | else if(w<-5) w = -5; |
FJMS | 2:06b7789c7da0 | 70 | motion(); |
PedroMartins96 | 0:a7324f51348d | 71 | |
PedroMartins96 | 1:2716ea33958b | 72 | //PC.printf("fre_x=%f fre_y=%f fa_x=%f fa_y=%f erro=%f P=%f I=%f v=%f w=%f x=%f y=%f\n", fre_x,fre_y,fa_x,fa_y,erro,P,I,v,w,x,y); |
FJMS | 2:06b7789c7da0 | 73 | //PC.printf("%f %f %f\n",erro, x,y); |
PedroMartins96 | 1:2716ea33958b | 74 | setSpeeds(Wee+33*abs(v)/v,Wdd+30*abs(v)/v); |
PedroMartins96 | 0:a7324f51348d | 75 | } |
PedroMartins96 | 1:2716ea33958b | 76 | setSpeeds(0,0); |
PedroMartins96 | 0:a7324f51348d | 77 | } |
PedroMartins96 | 0:a7324f51348d | 78 | |
PedroMartins96 | 0:a7324f51348d | 79 | |
PedroMartins96 | 1:2716ea33958b | 80 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 81 | // Cria Mapa // |
PedroMartins96 | 1:2716ea33958b | 82 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 83 | void mapa(int x3,int y3) |
PedroMartins96 | 0:a7324f51348d | 84 | { |
PedroMartins96 | 1:2716ea33958b | 85 | for(i=1; i<=x3; i++) { |
PedroMartins96 | 1:2716ea33958b | 86 | for(j=1; j<=y3; j++) { |
PedroMartins96 | 1:2716ea33958b | 87 | if(i==1 || i==80 || j==1 || j==80) map.add(i,j,1); |
PedroMartins96 | 1:2716ea33958b | 88 | else map.add(i,j,0); |
PedroMartins96 | 1:2716ea33958b | 89 | //PC.printf("%d ", int(map.getNumber(i,j))); |
PedroMartins96 | 1:2716ea33958b | 90 | } |
PedroMartins96 | 1:2716ea33958b | 91 | //printf("\n"); |
PedroMartins96 | 1:2716ea33958b | 92 | //PC.printf("%d ", map.getNumber(i,-5)); |
PedroMartins96 | 1:2716ea33958b | 93 | } |
PedroMartins96 | 1:2716ea33958b | 94 | PC.printf("I'm Ready\n"); |
PedroMartins96 | 1:2716ea33958b | 95 | } |
PedroMartins96 | 0:a7324f51348d | 96 | |
PedroMartins96 | 1:2716ea33958b | 97 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 98 | // Cria objeto // |
PedroMartins96 | 1:2716ea33958b | 99 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 100 | void cria_obj(int c, int l, int p[]) |
PedroMartins96 | 1:2716ea33958b | 101 | { |
PedroMartins96 | 1:2716ea33958b | 102 | int k = p[0]/5; |
PedroMartins96 | 1:2716ea33958b | 103 | int m = p[1]/5; |
PedroMartins96 | 1:2716ea33958b | 104 | c = (c/5)/2; |
PedroMartins96 | 1:2716ea33958b | 105 | l = (l/5)/2; |
PedroMartins96 | 1:2716ea33958b | 106 | for(i=k-c+1; i<=k+c; i++) |
PedroMartins96 | 1:2716ea33958b | 107 | { |
PedroMartins96 | 1:2716ea33958b | 108 | for(j=m-l+1; j<=m+l; j++) { |
PedroMartins96 | 1:2716ea33958b | 109 | if((i==(k-c+1)) || (i==(k+c)) || (j==(m-l+1)) || (j==(m+l))) map.add(i,j,1); |
PedroMartins96 | 1:2716ea33958b | 110 | else map.add(i,j, 0); |
PedroMartins96 | 0:a7324f51348d | 111 | } |
PedroMartins96 | 0:a7324f51348d | 112 | } |
PedroMartins96 | 0:a7324f51348d | 113 | } |
PedroMartins96 | 0:a7324f51348d | 114 | |
PedroMartins96 | 1:2716ea33958b | 115 | void print_map(int x3, int y3) |
PedroMartins96 | 0:a7324f51348d | 116 | { |
PedroMartins96 | 1:2716ea33958b | 117 | //map.add(8, 16, 4); |
PedroMartins96 | 1:2716ea33958b | 118 | for(i=1; i<=x3; i++) { |
PedroMartins96 | 1:2716ea33958b | 119 | for(j=1; j<=y3; j++) { |
FJMS | 2:06b7789c7da0 | 120 | //PC.printf("%d ", int(map.getNumber(i,j))); |
PedroMartins96 | 0:a7324f51348d | 121 | } |
PedroMartins96 | 1:2716ea33958b | 122 | printf("\n"); |
PedroMartins96 | 0:a7324f51348d | 123 | } |
PedroMartins96 | 0:a7324f51348d | 124 | } |
PedroMartins96 | 0:a7324f51348d | 125 | |
PedroMartins96 | 1:2716ea33958b | 126 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 127 | // Força Repulsiva // |
PedroMartins96 | 1:2716ea33958b | 128 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 129 | void f_repulsiva() |
PedroMartins96 | 1:2716ea33958b | 130 | { |
PedroMartins96 | 1:2716ea33958b | 131 | fre_x = 0; |
PedroMartins96 | 1:2716ea33958b | 132 | fre_y = 0; |
FJMS | 2:06b7789c7da0 | 133 | aux_x = x/5 + 1; |
FJMS | 2:06b7789c7da0 | 134 | aux_y = y/5 + 1; |
PedroMartins96 | 1:2716ea33958b | 135 | for(i=aux_x-5; i<=aux_x+5; i++) { |
PedroMartins96 | 1:2716ea33958b | 136 | for(j=aux_y-5; j<=aux_y+5; j++) { |
PedroMartins96 | 1:2716ea33958b | 137 | if(i<=0 || i>80 || j<=0 || j>80 || (i == aux_x && j == aux_y)) { |
PedroMartins96 | 1:2716ea33958b | 138 | // do nothing |
PedroMartins96 | 1:2716ea33958b | 139 | } else { |
FJMS | 2:06b7789c7da0 | 140 | xc = i*5 - 2.5; |
FJMS | 2:06b7789c7da0 | 141 | yc = j*5 - 2.5; |
FJMS | 2:06b7789c7da0 | 142 | d = sqrt((x-xc)*(x-xc)+(y-yc)*(y-yc)); |
FJMS | 2:06b7789c7da0 | 143 | |
FJMS | 2:06b7789c7da0 | 144 | fre_x = fre_x + ((fcr*map.getNumber(i,j)*(x-xc))/(d*d*d)); |
FJMS | 2:06b7789c7da0 | 145 | fre_y = fre_y + ((fcr*map.getNumber(i,j)*(y-yc))/(d*d*d)); |
FJMS | 2:06b7789c7da0 | 146 | //PC.printf("fre_x=%f fre_y=%f \n", fre_x,fre_y); |
PedroMartins96 | 1:2716ea33958b | 147 | } |
PedroMartins96 | 1:2716ea33958b | 148 | } |
PedroMartins96 | 1:2716ea33958b | 149 | } |
PedroMartins96 | 1:2716ea33958b | 150 | } |
PedroMartins96 | 1:2716ea33958b | 151 | |
PedroMartins96 | 1:2716ea33958b | 152 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 153 | // Força Atrativa // |
PedroMartins96 | 1:2716ea33958b | 154 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 155 | void f_atrativa() |
PedroMartins96 | 1:2716ea33958b | 156 | { |
PedroMartins96 | 1:2716ea33958b | 157 | dt = sqrt((xf-x)*(xf-x)+(yf-y)*(yf-y)); |
PedroMartins96 | 1:2716ea33958b | 158 | fa_x = fca*((xf-x)/dt); |
PedroMartins96 | 1:2716ea33958b | 159 | fa_y = fca*((yf-y)/dt); |
PedroMartins96 | 1:2716ea33958b | 160 | } |
PedroMartins96 | 1:2716ea33958b | 161 | |
PedroMartins96 | 1:2716ea33958b | 162 | //////////////////////////////////////////////////// |
PedroMartins96 | 1:2716ea33958b | 163 | // Odometria // |
PedroMartins96 | 1:2716ea33958b | 164 | //////////////////////////////////////////////////// |
PedroMartins96 | 0:a7324f51348d | 165 | void motion() |
PedroMartins96 | 0:a7324f51348d | 166 | { |
PedroMartins96 | 0:a7324f51348d | 167 | getCountsAndReset(); |
PedroMartins96 | 0:a7324f51348d | 168 | De=((2*pi*r)*countsLeft)/1440; |
PedroMartins96 | 0:a7324f51348d | 169 | Dd=((2*pi*r)*countsRight)/1440; |
PedroMartins96 | 0:a7324f51348d | 170 | theta=(Dd-De)/Ldis; |
PedroMartins96 | 1:2716ea33958b | 171 | |
PedroMartins96 | 0:a7324f51348d | 172 | D=(De+Dd)/2; |
PedroMartins96 | 1:2716ea33958b | 173 | |
PedroMartins96 | 0:a7324f51348d | 174 | if(theta==0) { |
PedroMartins96 | 0:a7324f51348d | 175 | x=x+D*cos(teta); |
PedroMartins96 | 0:a7324f51348d | 176 | y=y+D*sin(teta); |
PedroMartins96 | 0:a7324f51348d | 177 | teta=teta; |
PedroMartins96 | 0:a7324f51348d | 178 | } else { |
PedroMartins96 | 0:a7324f51348d | 179 | x = x + D*((sin(theta/2)/(theta/2))*cos(teta+theta/2)); |
PedroMartins96 | 0:a7324f51348d | 180 | y = y + D*((sin(theta/2)/(theta/2))*sin(teta+theta/2)); |
PedroMartins96 | 0:a7324f51348d | 181 | teta=teta+theta; |
PedroMartins96 | 0:a7324f51348d | 182 | } |
PedroMartins96 | 1:2716ea33958b | 183 | |
FJMS | 2:06b7789c7da0 | 184 | teta=atan2(sin(teta),cos(teta)); |
PedroMartins96 | 0:a7324f51348d | 185 | //Limite entre [-2pi; 2pi] |
FJMS | 2:06b7789c7da0 | 186 | //if (teta>=(pi)) { |
FJMS | 2:06b7789c7da0 | 187 | // teta=teta-2*pi; |
FJMS | 2:06b7789c7da0 | 188 | //} |
FJMS | 2:06b7789c7da0 | 189 | //if (teta<=(-pi)) { |
FJMS | 2:06b7789c7da0 | 190 | // teta=teta+2*pi; |
FJMS | 2:06b7789c7da0 | 191 | //} |
PedroMartins96 | 0:a7324f51348d | 192 | |
PedroMartins96 | 0:a7324f51348d | 193 | Wee=(v-(Ldis/2)*w); |
PedroMartins96 | 0:a7324f51348d | 194 | Wdd=(v+(Ldis/2)*w); |
FJMS | 2:06b7789c7da0 | 195 | PC.printf("De=%f Dd=%f x=%f y=%f teta=%f\n", De,Dd,x,y,teta); |
PedroMartins96 | 0:a7324f51348d | 196 | } |
PedroMartins96 | 0:a7324f51348d | 197 | |
PedroMartins96 | 0:a7324f51348d | 198 | void setSpeeds(int16_t leftSpeed, int16_t rightSpeed) |
PedroMartins96 | 0:a7324f51348d | 199 | { |
PedroMartins96 | 0:a7324f51348d | 200 | char buffer[5]; |
PedroMartins96 | 0:a7324f51348d | 201 | |
PedroMartins96 | 0:a7324f51348d | 202 | buffer[0] = 0xA1; |
PedroMartins96 | 0:a7324f51348d | 203 | memcpy(&buffer[1], &leftSpeed, sizeof(leftSpeed)); |
PedroMartins96 | 0:a7324f51348d | 204 | memcpy(&buffer[3], &rightSpeed, sizeof(rightSpeed)); |
PedroMartins96 | 0:a7324f51348d | 205 | |
PedroMartins96 | 0:a7324f51348d | 206 | i2c.write(addr8bit, buffer, 5); // 5 bytes |
PedroMartins96 | 0:a7324f51348d | 207 | } |
PedroMartins96 | 0:a7324f51348d | 208 | |
PedroMartins96 | 0:a7324f51348d | 209 | void setLeftSpeed(int16_t speed) |
PedroMartins96 | 0:a7324f51348d | 210 | { |
PedroMartins96 | 0:a7324f51348d | 211 | char buffer[3]; |
PedroMartins96 | 0:a7324f51348d | 212 | |
PedroMartins96 | 0:a7324f51348d | 213 | buffer[0] = 0xA2; |
PedroMartins96 | 0:a7324f51348d | 214 | memcpy(&buffer[1], &speed, sizeof(speed)); |
PedroMartins96 | 0:a7324f51348d | 215 | |
PedroMartins96 | 0:a7324f51348d | 216 | i2c.write(addr8bit, buffer, 3); // 3 bytes |
PedroMartins96 | 0:a7324f51348d | 217 | } |
PedroMartins96 | 0:a7324f51348d | 218 | |
PedroMartins96 | 0:a7324f51348d | 219 | void setRightSpeed(int16_t speed) |
PedroMartins96 | 0:a7324f51348d | 220 | { |
PedroMartins96 | 0:a7324f51348d | 221 | char buffer[3]; |
PedroMartins96 | 0:a7324f51348d | 222 | |
PedroMartins96 | 0:a7324f51348d | 223 | buffer[0] = 0xA3; |
PedroMartins96 | 0:a7324f51348d | 224 | memcpy(&buffer[1], &speed, sizeof(speed)); |
PedroMartins96 | 0:a7324f51348d | 225 | |
PedroMartins96 | 0:a7324f51348d | 226 | i2c.write(addr8bit, buffer, 3); // 3 bytes |
PedroMartins96 | 0:a7324f51348d | 227 | } |
PedroMartins96 | 0:a7324f51348d | 228 | |
PedroMartins96 | 0:a7324f51348d | 229 | void getCounts() |
PedroMartins96 | 0:a7324f51348d | 230 | { |
PedroMartins96 | 0:a7324f51348d | 231 | char write_buffer[2]; |
PedroMartins96 | 0:a7324f51348d | 232 | char read_buffer[4]; |
PedroMartins96 | 0:a7324f51348d | 233 | |
PedroMartins96 | 0:a7324f51348d | 234 | write_buffer[0] = 0xA0; |
PedroMartins96 | 0:a7324f51348d | 235 | i2c.write(addr8bit, write_buffer, 1); |
PedroMartins96 | 0:a7324f51348d | 236 | wait_us(100); |
PedroMartins96 | 0:a7324f51348d | 237 | i2c.read( addr8bit, read_buffer, 4); |
PedroMartins96 | 0:a7324f51348d | 238 | countsLeft = (int16_t((read_buffer[0]<<8)|read_buffer[1])); |
PedroMartins96 | 0:a7324f51348d | 239 | countsRight = (int16_t((read_buffer[2]<<8)|read_buffer[3])); |
PedroMartins96 | 0:a7324f51348d | 240 | } |
PedroMartins96 | 0:a7324f51348d | 241 | |
PedroMartins96 | 0:a7324f51348d | 242 | void getCountsAndReset() |
PedroMartins96 | 0:a7324f51348d | 243 | { |
PedroMartins96 | 0:a7324f51348d | 244 | char write_buffer[2]; |
PedroMartins96 | 0:a7324f51348d | 245 | char read_buffer[4]; |
PedroMartins96 | 0:a7324f51348d | 246 | |
PedroMartins96 | 0:a7324f51348d | 247 | write_buffer[0] = 0xA4; |
PedroMartins96 | 0:a7324f51348d | 248 | i2c.write(addr8bit, write_buffer, 1); |
PedroMartins96 | 0:a7324f51348d | 249 | wait_us(100); |
PedroMartins96 | 0:a7324f51348d | 250 | i2c.read( addr8bit, read_buffer, 4); |
PedroMartins96 | 0:a7324f51348d | 251 | countsLeft = (int16_t((read_buffer[0]<<8)|read_buffer[1])); |
PedroMartins96 | 0:a7324f51348d | 252 | countsRight = (int16_t((read_buffer[2]<<8)|read_buffer[3])); |
PedroMartins96 | 1:2716ea33958b | 253 | } |
PedroMartins96 | 1:2716ea33958b | 254 | |
PedroMartins96 | 1:2716ea33958b | 255 | //int mapa[80][80] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; |