input<-read_lines("Day4Sample.txt")
### put the wordsearch in a matrix
wordsearch<-matrix(nrow=length(input),ncol=nchar(input[1]))
for(i in 1:length(input)){wordsearch[i,]<-unlist(str_split(input[i],""))}
Part 1
I feel like this is a horrible idea. But, just looking in all 8
directions around an X works.
lookingforxmas<-function(wsm){
xmascounter<-0
for(x in 1:ncol(wsm)){
for(y in 1:nrow(wsm)){
## Check to see if it's an "X" otherwise move on
if(wsm[y,x]!="X"){
next}else{
### check up
if(y>=4){
if(wsm[y-1,x]=="M"&&wsm[y-2,x]=="A"&&wsm[y-3,x]=="S"){xmascounter<-xmascounter+1}}
### check up right
if(y>=4&&x<=(ncol(wsm)-3)){
if(wsm[y-1,x+1]=="M"&&wsm[y-2,x+2]=="A"&&wsm[y-3,x+3]=="S"){xmascounter<-xmascounter+1}}
### check right
if(x<=(ncol(wsm)-3)){
if(wsm[y,x+1]=="M"&&wsm[y,x+2]=="A"&&wsm[y,x+3]=="S"){xmascounter<-xmascounter+1}}
### check down right
if(x<=(ncol(wsm)-3)&&y<=(nrow(wsm)-3)){
if(wsm[y+1,x+1]=="M"&&wsm[y+2,x+2]=="A"&&wsm[y+3,x+3]=="S"){xmascounter<-xmascounter+1}}
### check down
if(y<=(nrow(wsm)-3)){
if(wsm[y+1,x]=="M"&&wsm[y+2,x]=="A"&&wsm[y+3,x]=="S"){xmascounter<-xmascounter+1}}
### check down left
if(y<=(nrow(wsm)-3)&&x>=4){
if(wsm[y+1,x-1]=="M"&&wsm[y+2,x-2]=="A"&&wsm[y+3,x-3]=="S"){xmascounter<-xmascounter+1}}
### check left
if(x>=4){
if(wsm[y,x-1]=="M"&&wsm[y,x-2]=="A"&&wsm[y,x-3]=="S"){xmascounter<-xmascounter+1}}
### check up left
if(x>=4&&y>=4){
if(wsm[y-1,x-1]=="M"&&wsm[y-2,x-2]=="A"&&wsm[y-3,x-3]=="S"){xmascounter<-xmascounter+1}}
}
}
}
xmascounter}
part1<-lookingforxmas(wordsearch)
part1
[1] 18
Part 1 - real data
Part 2
Same thing, but look for M’s on the top, right, bottom, left of an
A.
lookingforcrossedmas<-function(wsm){
mascounter<-0
### only check for A's that aren't on the edges
for(x in 2:(ncol(wsm)-1)){
for(y in 2:(nrow(wsm)-1)){
## Check to see if it's an "X" otherwise move on
if(wsm[y,x]!="A"){
next}else{
### Clockwise MMSS
if(wsm[y-1,x-1]=="M"&&wsm[y-1,x+1]=="M"&&wsm[y+1,x+1]=="S"&&wsm[y+1,x-1]=="S"){mascounter<-mascounter+1}
### Clockwise SMMS
if(wsm[y-1,x-1]=="S"&&wsm[y-1,x+1]=="M"&&wsm[y+1,x+1]=="M"&&wsm[y+1,x-1]=="S"){mascounter<-mascounter+1}
### Clockwise SSMM
if(wsm[y-1,x-1]=="S"&&wsm[y-1,x+1]=="S"&&wsm[y+1,x+1]=="M"&&wsm[y+1,x-1]=="M"){mascounter<-mascounter+1}
### Clockwise MSSM
if(wsm[y-1,x-1]=="M"&&wsm[y-1,x+1]=="S"&&wsm[y+1,x+1]=="S"&&wsm[y+1,x-1]=="M"){mascounter<-mascounter+1}
}}}
mascounter}
part2<-lookingforcrossedmas(wordsearch)
part2
[1] 9
Part 2 - real data
LS0tDQp0aXRsZTogIkRheSA0IE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoY29sbGVjdGlvbnMpDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCmBgYA0KDQpgYGB7cn0NCmlucHV0PC1yZWFkX2xpbmVzKCJEYXk0U2FtcGxlLnR4dCIpDQoNCiMjIyBwdXQgdGhlIHdvcmRzZWFyY2ggaW4gYSBtYXRyaXgNCndvcmRzZWFyY2g8LW1hdHJpeChucm93PWxlbmd0aChpbnB1dCksbmNvbD1uY2hhcihpbnB1dFsxXSkpDQpmb3IoaSBpbiAxOmxlbmd0aChpbnB1dCkpe3dvcmRzZWFyY2hbaSxdPC11bmxpc3Qoc3RyX3NwbGl0KGlucHV0W2ldLCIiKSl9DQoNCmBgYA0KDQojIyBQYXJ0IDENCkkgZmVlbCBsaWtlIHRoaXMgaXMgYSBob3JyaWJsZSBpZGVhLiAgQnV0LCBqdXN0IGxvb2tpbmcgaW4gYWxsIDggZGlyZWN0aW9ucyBhcm91bmQgYW4gWCB3b3Jrcy4NCg0KYGBge3J9DQpsb29raW5nZm9yeG1hczwtZnVuY3Rpb24od3NtKXsNCiAgeG1hc2NvdW50ZXI8LTANCiAgZm9yKHggaW4gMTpuY29sKHdzbSkpew0KICAgIGZvcih5IGluIDE6bnJvdyh3c20pKXsNCiAgICAgICMjIENoZWNrIHRvIHNlZSBpZiBpdCdzIGFuICJYIiBvdGhlcndpc2UgbW92ZSBvbg0KICAgICAgaWYod3NtW3kseF0hPSJYIil7DQogICAgICAgIG5leHR9ZWxzZXsNCiAgICAgICAgICAjIyMgY2hlY2sgdXANCiAgICAgICAgICBpZih5Pj00KXsNCiAgICAgICAgICAgIGlmKHdzbVt5LTEseF09PSJNIiYmd3NtW3ktMix4XT09IkEiJiZ3c21beS0zLHhdPT0iUyIpe3htYXNjb3VudGVyPC14bWFzY291bnRlcisxfX0NCiAgICAgICAgICAjIyMgY2hlY2sgdXAgcmlnaHQNCiAgICAgICAgICBpZih5Pj00JiZ4PD0obmNvbCh3c20pLTMpKXsNCiAgICAgICAgICAgIGlmKHdzbVt5LTEseCsxXT09Ik0iJiZ3c21beS0yLHgrMl09PSJBIiYmd3NtW3ktMyx4KzNdPT0iUyIpe3htYXNjb3VudGVyPC14bWFzY291bnRlcisxfX0NCiAgICAgICAgICAjIyMgY2hlY2sgcmlnaHQNCiAgICAgICAgICBpZih4PD0obmNvbCh3c20pLTMpKXsNCiAgICAgICAgICAgIGlmKHdzbVt5LHgrMV09PSJNIiYmd3NtW3kseCsyXT09IkEiJiZ3c21beSx4KzNdPT0iUyIpe3htYXNjb3VudGVyPC14bWFzY291bnRlcisxfX0NCiAgICAgICAgICAjIyMgY2hlY2sgZG93biByaWdodA0KICAgICAgICAgIGlmKHg8PShuY29sKHdzbSktMykmJnk8PShucm93KHdzbSktMykpew0KICAgICAgICAgICAgaWYod3NtW3krMSx4KzFdPT0iTSImJndzbVt5KzIseCsyXT09IkEiJiZ3c21beSszLHgrM109PSJTIil7eG1hc2NvdW50ZXI8LXhtYXNjb3VudGVyKzF9fQ0KICAgICAgICAgICMjIyBjaGVjayBkb3duDQogICAgICAgICAgaWYoeTw9KG5yb3cod3NtKS0zKSl7DQogICAgICAgICAgICBpZih3c21beSsxLHhdPT0iTSImJndzbVt5KzIseF09PSJBIiYmd3NtW3krMyx4XT09IlMiKXt4bWFzY291bnRlcjwteG1hc2NvdW50ZXIrMX19DQogICAgICAgICAgIyMjIGNoZWNrIGRvd24gbGVmdA0KICAgICAgICAgIGlmKHk8PShucm93KHdzbSktMykmJng+PTQpew0KICAgICAgICAgICAgaWYod3NtW3krMSx4LTFdPT0iTSImJndzbVt5KzIseC0yXT09IkEiJiZ3c21beSszLHgtM109PSJTIil7eG1hc2NvdW50ZXI8LXhtYXNjb3VudGVyKzF9fQ0KICAgICAgICAgICMjIyBjaGVjayBsZWZ0DQogICAgICAgICAgaWYoeD49NCl7DQogICAgICAgICAgICBpZih3c21beSx4LTFdPT0iTSImJndzbVt5LHgtMl09PSJBIiYmd3NtW3kseC0zXT09IlMiKXt4bWFzY291bnRlcjwteG1hc2NvdW50ZXIrMX19DQogICAgICAgICAgIyMjIGNoZWNrIHVwIGxlZnQNCiAgICAgICAgICBpZih4Pj00JiZ5Pj00KXsNCiAgICAgICAgICAgIGlmKHdzbVt5LTEseC0xXT09Ik0iJiZ3c21beS0yLHgtMl09PSJBIiYmd3NtW3ktMyx4LTNdPT0iUyIpe3htYXNjb3VudGVyPC14bWFzY291bnRlcisxfX0NCiAgICAgICAgfQ0KICAgIH0NCiAgfQ0KICANCnhtYXNjb3VudGVyfQ0KYGBgDQoNCmBgYHtyfQ0KcGFydDE8LWxvb2tpbmdmb3J4bWFzKHdvcmRzZWFyY2gpDQpwYXJ0MQ0KYGBgDQohW1BhcnQgMSAtIHJlYWwgZGF0YV0oeG1hc2Fycm93cy5naWYpDQoNCiMjIFBhcnQgMg0KU2FtZSB0aGluZywgYnV0IGxvb2sgZm9yIE0ncyBvbiB0aGUgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0IG9mIGFuIEEuDQoNCmBgYHtyfQ0KbG9va2luZ2ZvcmNyb3NzZWRtYXM8LWZ1bmN0aW9uKHdzbSl7DQogIG1hc2NvdW50ZXI8LTANCiAgIyMjIG9ubHkgY2hlY2sgZm9yIEEncyB0aGF0IGFyZW4ndCBvbiB0aGUgZWRnZXMNCiAgZm9yKHggaW4gMjoobmNvbCh3c20pLTEpKXsNCiAgICBmb3IoeSBpbiAyOihucm93KHdzbSktMSkpew0KICAgICAgIyMgQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYW4gIlgiIG90aGVyd2lzZSBtb3ZlIG9uDQogICAgICBpZih3c21beSx4XSE9IkEiKXsNCiAgICAgICAgbmV4dH1lbHNlew0KICAgICAgICAgICMjIyBDbG9ja3dpc2UgTU1TUw0KICAgICAgICAgIGlmKHdzbVt5LTEseC0xXT09Ik0iJiZ3c21beS0xLHgrMV09PSJNIiYmd3NtW3krMSx4KzFdPT0iUyImJndzbVt5KzEseC0xXT09IlMiKXttYXNjb3VudGVyPC1tYXNjb3VudGVyKzF9DQogICAgICAgICAgIyMjIENsb2Nrd2lzZSBTTU1TDQogICAgICAgICAgaWYod3NtW3ktMSx4LTFdPT0iUyImJndzbVt5LTEseCsxXT09Ik0iJiZ3c21beSsxLHgrMV09PSJNIiYmd3NtW3krMSx4LTFdPT0iUyIpe21hc2NvdW50ZXI8LW1hc2NvdW50ZXIrMX0NCiAgICAgICAgICAjIyMgQ2xvY2t3aXNlIFNTTU0NCiAgICAgICAgICBpZih3c21beS0xLHgtMV09PSJTIiYmd3NtW3ktMSx4KzFdPT0iUyImJndzbVt5KzEseCsxXT09Ik0iJiZ3c21beSsxLHgtMV09PSJNIil7bWFzY291bnRlcjwtbWFzY291bnRlcisxfQ0KICAgICAgICAgICMjIyBDbG9ja3dpc2UgTVNTTQ0KICAgICAgICAgIGlmKHdzbVt5LTEseC0xXT09Ik0iJiZ3c21beS0xLHgrMV09PSJTIiYmd3NtW3krMSx4KzFdPT0iUyImJndzbVt5KzEseC0xXT09Ik0iKXttYXNjb3VudGVyPC1tYXNjb3VudGVyKzF9DQogICAgICAgICAgDQogICAgICAgIH19fQ0KICBtYXNjb3VudGVyfQ0KDQpgYGANCg0KYGBge3J9DQpwYXJ0MjwtbG9va2luZ2ZvcmNyb3NzZWRtYXMod29yZHNlYXJjaCkNCnBhcnQyDQpgYGANCiFbUGFydCAyIC0gcmVhbCBkYXRhXShjcm9zc2VkbWFzYXJyb3dzLmdpZikNCg0KDQoNCmBgYHtyLGluY2x1ZGU9RkFMU0UsZXZhbD1GQUxTRX0NCiMjIyMgQWxsIG9mIHRoaXMgaXMgZm9yIHRoZSBHSUZzDQppbnB1dDwtcmVhZF9saW5lcygiLi4vLi4vQW9DRGF0YS9BT0MyMDI0L0RheTQudHh0IikNCg0KIyMjIHB1dCB0aGUgd29yZHNlYXJjaCBpbiBhIG1hdHJpeA0Kd29yZHNlYXJjaDwtbWF0cml4KG5yb3c9bGVuZ3RoKGlucHV0KSxuY29sPW5jaGFyKGlucHV0WzFdKSkNCmZvcihpIGluIDE6bGVuZ3RoKGlucHV0KSl7d29yZHNlYXJjaFtpLF08LXVubGlzdChzdHJfc3BsaXQoaW5wdXRbaV0sIiIpKX0NCg0KDQpsb29raW5nZm9yeG1hc2cxPC1mdW5jdGlvbih3c20pew0KICB4bWFzY291bnRlcjwtMA0KICB3c2RmPC1kYXRhLmZyYW1lKG1hdHJpeChucm93PTAsbmNvbD01KSkNCiAgZm9yKHggaW4gMTpuY29sKHdzbSkpew0KICAgIGZvcih5IGluIDE6bnJvdyh3c20pKXsNCiAgICAgICMjIENoZWNrIHRvIHNlZSBpZiBpdCdzIGFuICJYIiBvdGhlcndpc2UgbW92ZSBvbg0KICAgICAgaWYod3NtW3kseF0hPSJYIil7DQogICAgICAgIG5leHR9ZWxzZXsNCiAgICAgICAgICAjIyMgY2hlY2sgdXANCiAgICAgICAgICBpZih5Pj00KXsNCiAgICAgICAgICAgIGlmKHdzbVt5LTEseF09PSJNIiYmd3NtW3ktMix4XT09IkEiJiZ3c21beS0zLHhdPT0iUyIpe3htYXNjb3VudGVyPC14bWFzY291bnRlcisxDQogICAgICAgICAgICB3c2RmPC1yYmluZCh3c2RmLGMoeCx5LHgseS0zLHhtYXNjb3VudGVyKSl9fQ0KICAgICAgICAgICMjIyBjaGVjayB1cCByaWdodA0KICAgICAgICAgIGlmKHk+PTQmJng8PShuY29sKHdzbSktMykpew0KICAgICAgICAgICAgaWYod3NtW3ktMSx4KzFdPT0iTSImJndzbVt5LTIseCsyXT09IkEiJiZ3c21beS0zLHgrM109PSJTIil7eG1hc2NvdW50ZXI8LXhtYXNjb3VudGVyKzENCiAgICAgICAgICAgIHdzZGY8LXJiaW5kKHdzZGYsYyh4LHkseCszLHktMyx4bWFzY291bnRlcikpfX0NCiAgICAgICAgICAjIyMgY2hlY2sgcmlnaHQNCiAgICAgICAgICBpZih4PD0obmNvbCh3c20pLTMpKXsNCiAgICAgICAgICAgIGlmKHdzbVt5LHgrMV09PSJNIiYmd3NtW3kseCsyXT09IkEiJiZ3c21beSx4KzNdPT0iUyIpe3htYXNjb3VudGVyPC14bWFzY291bnRlcisxDQogICAgICAgICAgICB3c2RmPC1yYmluZCh3c2RmLGMoeCx5LHgrMyx5LHhtYXNjb3VudGVyKSl9fQ0KICAgICAgICAgICMjIyBjaGVjayBkb3duIHJpZ2h0DQogICAgICAgICAgaWYoeDw9KG5jb2wod3NtKS0zKSYmeTw9KG5yb3cod3NtKS0zKSl7DQogICAgICAgICAgICBpZih3c21beSsxLHgrMV09PSJNIiYmd3NtW3krMix4KzJdPT0iQSImJndzbVt5KzMseCszXT09IlMiKXt4bWFzY291bnRlcjwteG1hc2NvdW50ZXIrMQ0KICAgICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgseSx4KzMseSszLHhtYXNjb3VudGVyKSl9fQ0KICAgICAgICAgICMjIyBjaGVjayBkb3duDQogICAgICAgICAgaWYoeTw9KG5yb3cod3NtKS0zKSl7DQogICAgICAgICAgICBpZih3c21beSsxLHhdPT0iTSImJndzbVt5KzIseF09PSJBIiYmd3NtW3krMyx4XT09IlMiKXt4bWFzY291bnRlcjwteG1hc2NvdW50ZXIrMQ0KICAgICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgseSx4LHkrMyx4bWFzY291bnRlcikpfX0NCiAgICAgICAgICAjIyMgY2hlY2sgZG93biBsZWZ0DQogICAgICAgICAgaWYoeTw9KG5yb3cod3NtKS0zKSYmeD49NCl7DQogICAgICAgICAgICBpZih3c21beSsxLHgtMV09PSJNIiYmd3NtW3krMix4LTJdPT0iQSImJndzbVt5KzMseC0zXT09IlMiKXt4bWFzY291bnRlcjwteG1hc2NvdW50ZXIrMQ0KICAgICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgseSx4LTMseSszLHhtYXNjb3VudGVyKSl9fQ0KICAgICAgICAgICMjIyBjaGVjayBsZWZ0DQogICAgICAgICAgaWYoeD49NCl7DQogICAgICAgICAgICBpZih3c21beSx4LTFdPT0iTSImJndzbVt5LHgtMl09PSJBIiYmd3NtW3kseC0zXT09IlMiKXt4bWFzY291bnRlcjwteG1hc2NvdW50ZXIrMQ0KICAgICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgseSx4LTMseSx4bWFzY291bnRlcikpfX0NCiAgICAgICAgICAjIyMgY2hlY2sgdXAgbGVmdA0KICAgICAgICAgIGlmKHg+PTQmJnk+PTQpew0KICAgICAgICAgICAgaWYod3NtW3ktMSx4LTFdPT0iTSImJndzbVt5LTIseC0yXT09IkEiJiZ3c21beS0zLHgtM109PSJTIil7eG1hc2NvdW50ZXI8LXhtYXNjb3VudGVyKzENCiAgICAgICAgICAgIHdzZGY8LXJiaW5kKHdzZGYsYyh4LHkseC0zLHktMyx4bWFzY291bnRlcikpfX0NCiAgICAgICAgfQ0KICAgIH0NCiAgfQ0KICANCndzZGZ9DQoNCnAxZGY8LWxvb2tpbmdmb3J4bWFzZzEod29yZHNlYXJjaCkNCmNvbG5hbWVzKHAxZGYpPC1jKCJ4MSIsInkxIiwieDIiLCJ5MiIsInQiKQ0KDQoNCnAxZzwtZ2dwbG90KGRhdGE9cDFkZikrDQogIGdlb21fc2VnbWVudChhZXMoeD14MSx5PXkxLHhlbmQ9eDIseWVuZD15Mixjb2xvdXI9IiNGRjAwMDAiKSxhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMC4wNSwgImluY2hlcyIpKSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgc2NhbGVfeV9yZXZlcnNlKCkrDQogIGNvb3JkX2ZpeGVkKCkrDQogIHRyYW5zaXRpb25fbWFudWFsKHQsY3VtdWxhdGl2ZSA9IFRSVUUpKw0KICBzaGFkb3dfbWFyaygpDQoNCnAxYW5pbSA8LSBhbmltYXRlKHAxZyxlbmRfcGF1c2UgPSA1KQ0KcDFhbmltDQojYW5pbV9zYXZlKCJ4bWFzYXJyb3dzLmdpZiIscDFhbmltKQ0KYGBgDQoNCg0KDQpgYGB7cixpbmNsdWRlPUZBTFNFLGV2YWw9RkFMU0V9DQpsb29raW5nZm9yY3Jvc3NlZG1hc2cyPC1mdW5jdGlvbih3c20pew0KICBtYXNjb3VudGVyPC0wDQogIHdzZGY8LWRhdGEuZnJhbWUobWF0cml4KG5yb3c9MCxuY29sPTUpKQ0KICAjIyMgb25seSBjaGVjayBmb3IgQSdzIHRoYXQgYXJlbid0IG9uIHRoZSBlZGdlcw0KICBmb3IoeCBpbiAyOihuY29sKHdzbSktMSkpew0KICAgIGZvcih5IGluIDI6KG5yb3cod3NtKS0xKSl7DQogICAgICAjIyBDaGVjayB0byBzZWUgaWYgaXQncyBhbiAiWCIgb3RoZXJ3aXNlIG1vdmUgb24NCiAgICAgIGlmKHdzbVt5LHhdIT0iQSIpew0KICAgICAgICBuZXh0fWVsc2V7DQogICAgICAgICAgIyMjIENsb2Nrd2lzZSBNTVNTDQogICAgICAgICAgaWYod3NtW3ktMSx4LTFdPT0iTSImJndzbVt5LTEseCsxXT09Ik0iJiZ3c21beSsxLHgrMV09PSJTIiYmd3NtW3krMSx4LTFdPT0iUyIpe21hc2NvdW50ZXI8LW1hc2NvdW50ZXIrMQ0KICAgICAgICAgIHdzZGY8LXJiaW5kKHdzZGYsYyh4KzEseS0xLHgtMSx5KzEsbWFzY291bnRlcikpDQogICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgrMSx5KzEseC0xLHktMSxtYXNjb3VudGVyKSl9DQogICAgICAgICAgIyMjIENsb2Nrd2lzZSBTTU1TDQogICAgICAgICAgaWYod3NtW3ktMSx4LTFdPT0iUyImJndzbVt5LTEseCsxXT09Ik0iJiZ3c21beSsxLHgrMV09PSJNIiYmd3NtW3krMSx4LTFdPT0iUyIpe21hc2NvdW50ZXI8LW1hc2NvdW50ZXIrMQ0KICAgICAgICAgIHdzZGY8LXJiaW5kKHdzZGYsYyh4KzEseSsxLHgtMSx5LTEsbWFzY291bnRlcikpDQogICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgtMSx5KzEseCsxLHktMSxtYXNjb3VudGVyKSl9DQogICAgICAgICAgIyMjIENsb2Nrd2lzZSBTU01NDQogICAgICAgICAgaWYod3NtW3ktMSx4LTFdPT0iUyImJndzbVt5LTEseCsxXT09IlMiJiZ3c21beSsxLHgrMV09PSJNIiYmd3NtW3krMSx4LTFdPT0iTSIpe21hc2NvdW50ZXI8LW1hc2NvdW50ZXIrMQ0KICAgICAgICAgIHdzZGY8LXJiaW5kKHdzZGYsYyh4KzEseSsxLHgtMSx5LTEsbWFzY291bnRlcikpDQogICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgtMSx5KzEseCsxLHktMSxtYXNjb3VudGVyKSl9DQogICAgICAgICAgIyMjIENsb2Nrd2lzZSBNU1NNDQogICAgICAgICAgaWYod3NtW3ktMSx4LTFdPT0iTSImJndzbVt5LTEseCsxXT09IlMiJiZ3c21beSsxLHgrMV09PSJTIiYmd3NtW3krMSx4LTFdPT0iTSIpe21hc2NvdW50ZXI8LW1hc2NvdW50ZXIrMQ0KICAgICAgICAgIHdzZGY8LXJiaW5kKHdzZGYsYyh4LTEseS0xLHgrMSx5KzEsbWFzY291bnRlcikpDQogICAgICAgICAgd3NkZjwtcmJpbmQod3NkZixjKHgtMSx5KzEseCsxLHktMSxtYXNjb3VudGVyKSl9DQogICAgICAgIH19fQ0KICB3c2RmfQ0KDQpwMmRmPC1sb29raW5nZm9yY3Jvc3NlZG1hc2cyKHdvcmRzZWFyY2gpDQpjb2xuYW1lcyhwMmRmKTwtYygieDEiLCJ5MSIsIngyIiwieTIiLCJ0IikNCg0KcDJnPC1nZ3Bsb3QoZGF0YT1wMmRmKSsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSxjb2xvdXI9IiMwMDY2MDAiLGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjAzLCAiaW5jaGVzIikpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBzY2FsZV95X3JldmVyc2UoKSsNCiAgY29vcmRfZml4ZWQoKSsNCiAgdHJhbnNpdGlvbl9tYW51YWwodCxjdW11bGF0aXZlID0gVFJVRSkrDQogIHNoYWRvd19tYXJrKCkNCg0KcDJhbmltIDwtIGFuaW1hdGUocDJnLGVuZF9wYXVzZSA9IDUpDQpwMmFuaW0NCiNhbmltX3NhdmUoImNyb3NzZWRtYXNhcnJvd3MuZ2lmIixwMmFuaW0pDQpgYGANCg0K