#include<stdio.h>
#include<GL/glut.h>
#include<string.h>
int maxy=600, count=0, maxx=500, n=3, m=3,r,q;
int count1=0,count2=0,count3=0,count4=0,count5=0,count6=0,count7=0,count8=0,count9=0,count10=0;
int x=25,y=50;
char str[10];
void id1();
void id();
void draw_target();
void redraw();
/*to display bitmap char*/
void bitmap_output(int x,int y,char *string,void *font)
{
int len,i;
glRasterPos2f(x,y);
for(i=0;i<len;i++)
{
glutBitmapCharacter(font,string[i]);
}
return;
}
/*based on count display no of arrows and result of game*/
void counting()
{
sprintf(str
,"No of arrows:%d",count
); bitmap_output(400,40,str,GLUT_BITMAP_HELVETICA_18);
if(count1==1 && count2==1 && count3==1 && count4==1 && count5==1 && count6==1 && count7==1 && count8==1 && count9==1 && count10==1)
{
bitmap_output(5,300,"CONGRATULATIONS YOU WON",GLUT_BITMAP_TIMES_ROMAN_24);
glutIdleFunc(NULL);
}
else if(count>=15)
{
sprintf(str
,"NO of arrows:%d,NO OF ARROWS OVER GAME LOST",count
); bitmap_output(5,300,str,GLUT_BITMAP_TIMES_ROMAN_24);
glutIdleFunc(NULL);
}
}
//TO CHECK WHETHER ARROW HITS TARGET
void disa()
{
if((x+110==300) && (y>=435 && y<=465) && (!count1))
{
count1=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110 == 375)&&(y>=385&&y<=415) && (!count2))
{
count2=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==399)&&(y>=465 &&y<=495)&&(!count3))
{
count3=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==249)&&(y>=355&&y<=385)&&(!count4))
{
count4=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==351)&&(y>=315&&y<=345)&&(!count5))
{
count5=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==450)&&(y>=275&&y<=305)&&(!count6))
{
count6=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==330)&&(y>=230&&y<=260)&&(!count7))
{
count7=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==201)&&(y>=185&&y<=215)&&(!count8))
{
count8=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==339)&&(y>=135&&y<=165)&&(!count9))
{
count9=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
else if((x+110==300)&&(y>=85&&y<=115)&&(!count10))
{
count10=1;
x=25;
y=0;
count++;
glutIdleFunc(id);
}
}
/*to move arrow up*/
void id()
{
y+=n;
disa();
if(y>maxy)
{
y=0;
count++;
}
glutPostRedisplay();
}
//to draw arrow
void disp()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor3f(1,1,0);
bitmap_output(150,450,"BLOCKSHOOTING",GLUT_BITMAP_TIMES_ROMAN_24);
counting();
//Drawing of arrow
glColor3f(0,1,1);
glBegin(GL_LINES);
glVertex2d(x,y);
glVertex2d(x+100,y);
glEnd();
glLineWidth(2);
glBegin(GL_LINES);
glVertex2d(x,y+2);
glVertex2d(x+100,y-2);
glEnd();
glBegin(GL_LINES);
glVertex2d(x,y-2);
glVertex2d(x+100,y-2);
glEnd();
glBegin(GL_TRIANGLES);
glVertex2d (x+100,y+3);
glVertex2d(x+110,y);
glVertex2d(x+100,y-3);
glEnd();
glBegin(GL_QUADS);
glVertex2d(x,y+3);
glVertex2d(x,y-3);
glVertex2d(x-10,y-5);
glVertex2d(x-10,y+5);
glEnd();
draw_target();
glFlush();
glutSwapBuffers();
}
void init()
{
glClearColor(0,0,0,1);
glColor3f(1,0,0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,500,0,500);
glMatrixMode(GL_MODELVIEW);
}
//to draw the target inside the loop
void draw_target()
{
if(count1==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(300,450);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(285,465);
glVertex2d(315,465);
glVertex2d(315,435);
glVertex2d(285,435);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(300,450);
glEnd();
}
if(count2==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(375,400);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(360,415);
glVertex2d(390,415);
glVertex2d(390,385);
glVertex2d(360,385);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(375,400);
glEnd();
}
if(count3==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(400,480);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(385,495);
glVertex2d(415,495);
glVertex2d(415,465);
glVertex2d(385,465);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(400,480);
glEnd();
}
if(count4==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(250,370);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(235,385);
glVertex2d(265,385);
glVertex2d(265,355);
glVertex2d(235,355);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(250,370);
glEnd();
}
if(count5==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(350,330);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(335,345);
glVertex2d(365,345);
glVertex2d(365,315);
glVertex2d(335,315);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(350,330);
glEnd();
}
if(count6==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(450,290);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(435,305);
glVertex2d(465,305);
glVertex2d(465,275);
glVertex2d(435,275);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(450,290);
glEnd();
}
if(count7==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(330,245);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(315,260);
glVertex2d(345,260);
glVertex2d(345,230);
glVertex2d(315,230);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(330,245);
glEnd();
}
if(count8==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(200,200);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(185,215);
glVertex2d(215,215);
glVertex2d(215,185);
glVertex2d(185,185);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(200,200);
glEnd();
}
if(count9==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(400,150);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(385,165);
glVertex2d(415,165);
glVertex2d(415,135);
glVertex2d(385,135);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(400,150);
glEnd();
}
if(count10==0)
{
glColor3f(1,0,1);
glPointSize(30);
glBegin(GL_POINTS);
glVertex2d(300,100);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2d(285,115);
glVertex2d(315,115);
glVertex2d(315,85);
glVertex2d(285,85);
glEnd();
}
else
{
glColor3f(1,1,1);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2d(300,100);
glEnd();
}
glFlush();
}
//to move the arrow left when ‘r’ pressed
void id1()
{
x+=m;
disa();
if(x+110>maxx)
{
x=25;
y=0;
count++;
glutIdleFunc(id);
}
glutPostRedisplay();
}
//set key to perform desired operation
void keys(unsigned char k,int r,int q)
{
if(k=='r')
glutIdleFunc(id1);
if(k=='q')
}
//sub menu to display instructions
void demo_menu(int i)
{
switch(i)
{
case 5:
case 6:
case 7:
case 8:break;
}
}
//sub menu to display designer names
void demo(int i)
{
switch(i)
{
case 9:
case 10:
case 11:break;
}
}
void game(int id)
{
switch(id);
{
}
}
int main(int argc,char **argv)
{
int sub_menu;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(900,900);
glutCreateWindow("BLOCK SHOOTING GAME ARCHERY");
sub_menu=glutCreateMenu(demo_menu);
glutAddMenuEntry(" r to move right",5);
glutAddMenuEntry("A total of i5 arrows and 10 blocks are present",6);
glutAddMenuEntry("You loose the game if the arrow count exceeds the blocks count",7);
glutAddMenuEntry("or else you win",8);
glutCreateMenu(game);
glutAddSubMenu("INSTRUCTIONS",sub_menu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(disp);
glutIdleFunc(id);
glutKeyboardFunc(keys);
init();
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}
CiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPEdML2dsdXQuaD4KI2luY2x1ZGU8c3RyaW5nLmg+CmludCBtYXh5PTYwMCwgY291bnQ9MCwgbWF4eD01MDAsIG49MywgbT0zLHIscTsKaW50IGNvdW50MT0wLGNvdW50Mj0wLGNvdW50Mz0wLGNvdW50ND0wLGNvdW50NT0wLGNvdW50Nj0wLGNvdW50Nz0wLGNvdW50OD0wLGNvdW50OT0wLGNvdW50MTA9MDsKaW50IHg9MjUseT01MDsKY2hhciBzdHJbMTBdOwp2b2lkIGlkMSgpOwp2b2lkIGlkKCk7CnZvaWQgZHJhd190YXJnZXQoKTsKdm9pZCByZWRyYXcoKTsKCi8qdG8gZGlzcGxheSBiaXRtYXAgY2hhciovCnZvaWQgYml0bWFwX291dHB1dChpbnQgeCxpbnQgeSxjaGFyICpzdHJpbmcsdm9pZCAqZm9udCkKewppbnQgbGVuLGk7CmdsUmFzdGVyUG9zMmYoeCx5KTsKbGVuPShpbnQpc3RybGVuKHN0cmluZyk7CmZvcihpPTA7aTxsZW47aSsrKQp7CmdsdXRCaXRtYXBDaGFyYWN0ZXIoZm9udCxzdHJpbmdbaV0pOwp9CnJldHVybjsKfQoKLypiYXNlZCBvbiBjb3VudCBkaXNwbGF5IG5vIG9mIGFycm93cyBhbmQgcmVzdWx0IG9mIGdhbWUqLwp2b2lkIGNvdW50aW5nKCkKewpzcHJpbnRmKHN0ciwiTm8gb2YgYXJyb3dzOiVkIixjb3VudCk7CmJpdG1hcF9vdXRwdXQoNDAwLDQwLHN0cixHTFVUX0JJVE1BUF9IRUxWRVRJQ0FfMTgpOwppZihjb3VudDE9PTEgJiYgY291bnQyPT0xICYmIGNvdW50Mz09MSAmJiBjb3VudDQ9PTEgJiYgY291bnQ1PT0xICYmIGNvdW50Nj09MSAmJiBjb3VudDc9PTEgJiYgY291bnQ4PT0xICYmIGNvdW50OT09MSAmJiBjb3VudDEwPT0xKQp7CmJpdG1hcF9vdXRwdXQoNSwzMDAsIkNPTkdSQVRVTEFUSU9OUyBZT1UgV09OIixHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCk7CmdsdXRJZGxlRnVuYyhOVUxMKTsKfQplbHNlIGlmKGNvdW50Pj0xNSkKewpzcHJpbnRmKHN0ciwiTk8gb2YgYXJyb3dzOiVkLE5PIE9GIEFSUk9XUyBPVkVSIEdBTUUgTE9TVCIsY291bnQpOwpiaXRtYXBfb3V0cHV0KDUsMzAwLHN0cixHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCk7CmdsdXRJZGxlRnVuYyhOVUxMKTsKfQp9CgovL1RPIENIRUNLIFdIRVRIRVIgQVJST1cgSElUUyBUQVJHRVQKdm9pZCBkaXNhKCkKewppZigoeCsxMTA9PTMwMCkgJiYgKHk+PTQzNSAmJiB5PD00NjUpICYmICghY291bnQxKSkKewpjb3VudDE9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9CmVsc2UgaWYoKHgrMTEwID09IDM3NSkmJih5Pj0zODUmJnk8PTQxNSkgJiYgKCFjb3VudDIpKQp7CmNvdW50Mj0xOwp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZWxzZSBpZigoeCsxMTA9PTM5OSkmJih5Pj00NjUgJiZ5PD00OTUpJiYoIWNvdW50MykpCnsKY291bnQzPTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQplbHNlIGlmKCh4KzExMD09MjQ5KSYmKHk+PTM1NSYmeTw9Mzg1KSYmKCFjb3VudDQpKQoKewpjb3VudDQ9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9CmVsc2UgaWYoKHgrMTEwPT0zNTEpJiYoeT49MzE1JiZ5PD0zNDUpJiYoIWNvdW50NSkpCnsKY291bnQ1PTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQplbHNlIGlmKCh4KzExMD09NDUwKSYmKHk+PTI3NSYmeTw9MzA1KSYmKCFjb3VudDYpKQp7CmNvdW50Nj0xOwp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZWxzZSBpZigoeCsxMTA9PTMzMCkmJih5Pj0yMzAmJnk8PTI2MCkmJighY291bnQ3KSkKewpjb3VudDc9MTsKeD0yNTsKeT0wOwpjb3VudCsrOwpnbHV0SWRsZUZ1bmMoaWQpOwp9CmVsc2UgaWYoKHgrMTEwPT0yMDEpJiYoeT49MTg1JiZ5PD0yMTUpJiYoIWNvdW50OCkpCnsKY291bnQ4PTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQplbHNlIGlmKCh4KzExMD09MzM5KSYmKHk+PTEzNSYmeTw9MTY1KSYmKCFjb3VudDkpKQp7CmNvdW50OT0xOwp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZWxzZSBpZigoeCsxMTA9PTMwMCkmJih5Pj04NSYmeTw9MTE1KSYmKCFjb3VudDEwKSkKewpjb3VudDEwPTE7Cng9MjU7Cnk9MDsKY291bnQrKzsKZ2x1dElkbGVGdW5jKGlkKTsKfQp9CgovKnRvIG1vdmUgYXJyb3cgdXAqLwp2b2lkIGlkKCkKewp5Kz1uOwpkaXNhKCk7CmlmKHk+bWF4eSkKewp5PTA7CmNvdW50Kys7Cn0KZ2x1dFBvc3RSZWRpc3BsYXkoKTsKfQovL3RvIGRyYXcgYXJyb3cKdm9pZCBkaXNwKCkKewpnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVR8R0xfREVQVEhfQlVGRkVSX0JJVCk7CmdsTG9hZElkZW50aXR5KCk7CmdsQ29sb3IzZigxLDEsMCk7CmJpdG1hcF9vdXRwdXQoMTUwLDQ1MCwiQkxPQ0tTSE9PVElORyIsR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQpOwpjb3VudGluZygpOwovL0RyYXdpbmcgIG9mIGFycm93CmdsQ29sb3IzZigwLDEsMSk7CmdsQmVnaW4oR0xfTElORVMpOwpnbFZlcnRleDJkKHgseSk7CmdsVmVydGV4MmQoeCsxMDAseSk7CmdsRW5kKCk7CmdsTGluZVdpZHRoKDIpOwpnbEJlZ2luKEdMX0xJTkVTKTsKZ2xWZXJ0ZXgyZCh4LHkrMik7CmdsVmVydGV4MmQoeCsxMDAseS0yKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FUyk7CmdsVmVydGV4MmQoeCx5LTIpOwpnbFZlcnRleDJkKHgrMTAwLHktMik7CmdsRW5kKCk7CmdsQmVnaW4oR0xfVFJJQU5HTEVTKTsKZ2xWZXJ0ZXgyZCAoeCsxMDAseSszKTsKZ2xWZXJ0ZXgyZCh4KzExMCx5KTsKZ2xWZXJ0ZXgyZCh4KzEwMCx5LTMpOwpnbEVuZCgpOwpnbEJlZ2luKEdMX1FVQURTKTsKZ2xWZXJ0ZXgyZCh4LHkrMyk7CmdsVmVydGV4MmQoeCx5LTMpOwpnbFZlcnRleDJkKHgtMTAseS01KTsKZ2xWZXJ0ZXgyZCh4LTEwLHkrNSk7CmdsRW5kKCk7CmRyYXdfdGFyZ2V0KCk7CmdsRmx1c2goKTsKZ2x1dFN3YXBCdWZmZXJzKCk7Cn0KCnZvaWQgaW5pdCgpCnsKZ2xDbGVhckNvbG9yKDAsMCwwLDEpOwpnbENvbG9yM2YoMSwwLDApOwpnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CmdsTG9hZElkZW50aXR5KCk7CmdsdU9ydGhvMkQoMCw1MDAsMCw1MDApOwpnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKfQoKLy90byBkcmF3IHRoZSB0YXJnZXQgaW5zaWRlIHRoZSBsb29wCgp2b2lkIGRyYXdfdGFyZ2V0KCkKewppZihjb3VudDE9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMzAwLDQ1MCk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCgyODUsNDY1KTsKZ2xWZXJ0ZXgyZCgzMTUsNDY1KTsKZ2xWZXJ0ZXgyZCgzMTUsNDM1KTsKZ2xWZXJ0ZXgyZCgyODUsNDM1KTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMzAwLDQ1MCk7CmdsRW5kKCk7Cn0KaWYoY291bnQyPT0wKQp7CmdsQ29sb3IzZigxLDAsMSk7CmdsUG9pbnRTaXplKDMwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDM3NSw0MDApOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVfTE9PUCk7CmdsVmVydGV4MmQoMzYwLDQxNSk7CmdsVmVydGV4MmQoMzkwLDQxNSk7CmdsVmVydGV4MmQoMzkwLDM4NSk7CmdsVmVydGV4MmQoMzYwLDM4NSk7CmdsRW5kKCk7Cn0KZWxzZQp7CglnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzNzUsNDAwKTsKZ2xFbmQoKTsKfQppZihjb3VudDM9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoNDAwLDQ4MCk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCgzODUsNDk1KTsKZ2xWZXJ0ZXgyZCg0MTUsNDk1KTsKZ2xWZXJ0ZXgyZCg0MTUsNDY1KTsKZ2xWZXJ0ZXgyZCgzODUsNDY1KTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoNDAwLDQ4MCk7CmdsRW5kKCk7Cn0KaWYoY291bnQ0PT0wKQp7CmdsQ29sb3IzZigxLDAsMSk7CmdsUG9pbnRTaXplKDMwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDI1MCwzNzApOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVfTE9PUCk7CmdsVmVydGV4MmQoMjM1LDM4NSk7CmdsVmVydGV4MmQoMjY1LDM4NSk7CmdsVmVydGV4MmQoMjY1LDM1NSk7CmdsVmVydGV4MmQoMjM1LDM1NSk7CmdsRW5kKCk7Cn0KZWxzZQp7CmdsQ29sb3IzZigxLDEsMSk7CmdsUG9pbnRTaXplKDIwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDI1MCwzNzApOwpnbEVuZCgpOwp9CmlmKGNvdW50NT09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzNTAsMzMwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDMzNSwzNDUpOwpnbFZlcnRleDJkKDM2NSwzNDUpOwpnbFZlcnRleDJkKDM2NSwzMTUpOwpnbFZlcnRleDJkKDMzNSwzMTUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzNTAsMzMwKTsKZ2xFbmQoKTsKfQppZihjb3VudDY9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoNDUwLDI5MCk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCg0MzUsMzA1KTsKZ2xWZXJ0ZXgyZCg0NjUsMzA1KTsKZ2xWZXJ0ZXgyZCg0NjUsMjc1KTsKZ2xWZXJ0ZXgyZCg0MzUsMjc1KTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoNDUwLDI5MCk7CmdsRW5kKCk7Cn0KaWYoY291bnQ3PT0wKQp7CmdsQ29sb3IzZigxLDAsMSk7CmdsUG9pbnRTaXplKDMwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDMzMCwyNDUpOwpnbEVuZCgpOwpnbEJlZ2luKEdMX0xJTkVfTE9PUCk7CmdsVmVydGV4MmQoMzE1LDI2MCk7CmdsVmVydGV4MmQoMzQ1LDI2MCk7CmdsVmVydGV4MmQoMzQ1LDIzMCk7CmdsVmVydGV4MmQoMzE1LDIzMCk7CmdsRW5kKCk7Cn0KZWxzZQp7CmdsQ29sb3IzZigxLDEsMSk7CmdsUG9pbnRTaXplKDIwKTsKZ2xCZWdpbihHTF9QT0lOVFMpOwpnbFZlcnRleDJkKDMzMCwyNDUpOwpnbEVuZCgpOwp9CmlmKGNvdW50OD09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgyMDAsMjAwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDE4NSwyMTUpOwpnbFZlcnRleDJkKDIxNSwyMTUpOwpnbFZlcnRleDJkKDIxNSwxODUpOwpnbFZlcnRleDJkKDE4NSwxODUpOwpnbEVuZCgpOwp9CmVsc2UKewpnbENvbG9yM2YoMSwxLDEpOwpnbFBvaW50U2l6ZSgyMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgyMDAsMjAwKTsKZ2xFbmQoKTsKfQppZihjb3VudDk9PTApCnsKZ2xDb2xvcjNmKDEsMCwxKTsKZ2xQb2ludFNpemUoMzApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoNDAwLDE1MCk7CmdsRW5kKCk7CmdsQmVnaW4oR0xfTElORV9MT09QKTsKZ2xWZXJ0ZXgyZCgzODUsMTY1KTsKZ2xWZXJ0ZXgyZCg0MTUsMTY1KTsKZ2xWZXJ0ZXgyZCg0MTUsMTM1KTsKZ2xWZXJ0ZXgyZCgzODUsMTM1KTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoNDAwLDE1MCk7CmdsRW5kKCk7Cn0KaWYoY291bnQxMD09MCkKewpnbENvbG9yM2YoMSwwLDEpOwpnbFBvaW50U2l6ZSgzMCk7CmdsQmVnaW4oR0xfUE9JTlRTKTsKZ2xWZXJ0ZXgyZCgzMDAsMTAwKTsKZ2xFbmQoKTsKZ2xCZWdpbihHTF9MSU5FX0xPT1ApOwpnbFZlcnRleDJkKDI4NSwxMTUpOwpnbFZlcnRleDJkKDMxNSwxMTUpOwpnbFZlcnRleDJkKDMxNSw4NSk7CmdsVmVydGV4MmQoMjg1LDg1KTsKZ2xFbmQoKTsKfQplbHNlCnsKZ2xDb2xvcjNmKDEsMSwxKTsKZ2xQb2ludFNpemUoMjApOwpnbEJlZ2luKEdMX1BPSU5UUyk7CmdsVmVydGV4MmQoMzAwLDEwMCk7CmdsRW5kKCk7Cn0KZ2xGbHVzaCgpOwp9CgovL3RvIG1vdmUgdGhlIGFycm93IGxlZnQgd2hlbiDigJhy4oCZIHByZXNzZWQKdm9pZCBpZDEoKQp7CngrPW07CmRpc2EoKTsKaWYoeCsxMTA+bWF4eCkKewp4PTI1Owp5PTA7CmNvdW50Kys7CmdsdXRJZGxlRnVuYyhpZCk7Cn0KZ2x1dFBvc3RSZWRpc3BsYXkoKTsKfQoKLy9zZXQga2V5IHRvIHBlcmZvcm0gZGVzaXJlZCBvcGVyYXRpb24Kdm9pZCBrZXlzKHVuc2lnbmVkIGNoYXIgayxpbnQgcixpbnQgcSkKewppZihrPT0ncicpCmdsdXRJZGxlRnVuYyhpZDEpOwppZihrPT0ncScpCmV4aXQoMCk7Cn0KCi8vc3ViIG1lbnUgdG8gZGlzcGxheSBpbnN0cnVjdGlvbnMKdm9pZCBkZW1vX21lbnUoaW50IGkpCnsKc3dpdGNoKGkpCnsKY2FzZSA1OgpjYXNlIDY6CmNhc2UgNzoKY2FzZSA4OmJyZWFrOwp9Cn0KCi8vc3ViIG1lbnUgdG8gZGlzcGxheSBkZXNpZ25lciBuYW1lcwp2b2lkIGRlbW8oaW50IGkpCnsKc3dpdGNoKGkpCnsKY2FzZSA5OgpjYXNlIDEwOgpjYXNlIDExOmJyZWFrOwp9Cn0Kdm9pZCBnYW1lKGludCBpZCkKewpzd2l0Y2goaWQpOwp7Cn0KfQppbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKewppbnQgc3ViX21lbnU7CmdsdXRJbml0KCZhcmdjLGFyZ3YpOwpnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfRE9VQkxFfEdMVVRfUkdCfEdMVVRfREVQVEgpOwpnbHV0SW5pdFdpbmRvd1NpemUoOTAwLDkwMCk7CmdsdXRDcmVhdGVXaW5kb3coIkJMT0NLIFNIT09USU5HIEdBTUUgQVJDSEVSWSIpOwpzdWJfbWVudT1nbHV0Q3JlYXRlTWVudShkZW1vX21lbnUpOwpnbHV0QWRkTWVudUVudHJ5KCIgciAgdG8gbW92ZSByaWdodCIsNSk7CmdsdXRBZGRNZW51RW50cnkoIkEgdG90YWwgb2YgaTUgYXJyb3dzIGFuZCAxMCBibG9ja3MgYXJlIHByZXNlbnQiLDYpOwpnbHV0QWRkTWVudUVudHJ5KCJZb3UgbG9vc2UgdGhlIGdhbWUgaWYgdGhlIGFycm93IGNvdW50IGV4Y2VlZHMgdGhlIGJsb2NrcyBjb3VudCIsNyk7CmdsdXRBZGRNZW51RW50cnkoIm9yIGVsc2UgeW91IHdpbiIsOCk7CmdsdXRDcmVhdGVNZW51KGdhbWUpOwpnbHV0QWRkU3ViTWVudSgiSU5TVFJVQ1RJT05TIixzdWJfbWVudSk7CmdsdXRBdHRhY2hNZW51KEdMVVRfUklHSFRfQlVUVE9OKTsKZ2x1dERpc3BsYXlGdW5jKGRpc3ApOwpnbHV0SWRsZUZ1bmMoaWQpOwpnbHV0S2V5Ym9hcmRGdW5jKGtleXMpOwppbml0KCk7CmdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwpnbHV0TWFpbkxvb3AoKTsKcmV0dXJuIDA7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgo=