LyogQ29weXJpZ2h0IChjKSAyMDAwIFRvcmQgSGFuc3NvbiAqLwoKI2RlZmluZSBCRU5DSE1BUksKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+Cgp0eXBlZGVmIHN0cnVjdCB7IGludCBhLGIsYyxkLGJpLGFyLGcxLGcyLGczOyB9IHBfdHlwZTsKCnN0YXRpYyBwX3R5cGUgbTB1KHBfdHlwZSBwKSB7CiAgaW50IG1bXT17MCwKCSAgIDgsCgkgICAxLAoJICAgMiwKCSAgIDE2LAoJICAgNSwKCSAgIDEzLAoJICAgNywKCSAgIDE0LAoJICAgOSwKCSAgIDMsCgkgICA0LAoJICAgMTEsCgkgICAxMiwKCSAgIDE1LAoJICAgMTAsCgkgICAxNywKCSAgIDZ9OwogIHBfdHlwZSBwdTsKCiAgcHUuYSA9IG1bcC5hXTsKICBwdS5iID0gbVtwLmJdOwogIHB1LmMgPSBtW3AuY107CiAgcHUuZCA9IG1bcC5kXTsKICBwdS5iaSA9IG1bcC5iaV07CiAgcHUuYXIgPSBtW3AuYXJdOwogIHB1LmcxID0gbVtwLmcxXTsKICBwdS5nMiA9IG1bcC5nMl07CiAgcHUuZzMgPSBtW3AuZzNdOwogIHJldHVybiBwdTsKfQoKc3RhdGljIHBfdHlwZSBtMXUocF90eXBlIHApIHsKICByZXR1cm4gcDsKfQoKc3RhdGljIHBfdHlwZSBtMnUocF90eXBlIHApIHsKICBpbnQgbVtdPXsxLAoJICAgMiwKCSAgIDksCgkgICAxMCwKCSAgIDQsCgkgICAxNywKCSAgIDYsCgkgICAwLAoJICAgOCwKCSAgIDE1LAoJICAgMTEsCgkgICAxMiwKCSAgIDUsCgkgICAxMywKCSAgIDcsCgkgICAxNCwKCSAgIDMsCgkgICAxNn07CiAgcF90eXBlIHB1OwoKICBwdS5hID0gbVtwLmFdOwogIHB1LmIgPSBtW3AuYl07CiAgcHUuYyA9IG1bcC5jXTsKICBwdS5kID0gbVtwLmRdOwogIHB1LmJpID0gbVtwLmJpXTsKICBwdS5hciA9IG1bcC5hcl07CiAgcHUuZzEgPSBtW3AuZzFdOwogIHB1LmcyID0gbVtwLmcyXTsKICBwdS5nMyA9IG1bcC5nM107CiAgcmV0dXJuIHB1OwoKfQoKc3RhdGljIHBfdHlwZSBtMGQocF90eXBlIHApIHsKICBpbnQgbVtdPXswLAoJICAgMiwKCSAgIDMsCgkgICAxMCwKCSAgIDExLAoJICAgNSwKCSAgIDE3LAoJICAgNywKCSAgIDEsCgkgICA5LAoJICAgMTUsCgkgICAxMiwKCSAgIDEzLAoJICAgNiwKCSAgIDgsCgkgICAxNCwKCSAgIDQsCgkgICAxNn07CiAgcF90eXBlIHB1OwoKICBwdS5hID0gbVtwLmFdOwogIHB1LmIgPSBtW3AuYl07CiAgcHUuYyA9IG1bcC5jXTsKICBwdS5kID0gbVtwLmRdOwogIHB1LmJpID0gbVtwLmJpXTsKICBwdS5hciA9IG1bcC5hcl07CiAgcHUuZzEgPSBtW3AuZzFdOwogIHB1LmcyID0gbVtwLmcyXTsKICBwdS5nMyA9IG1bcC5nM107CiAgcmV0dXJuIHB1OwoKfQoKc3RhdGljIHBfdHlwZSBtMWQocF90eXBlIHApIHsKICByZXR1cm4gcDsKfQoKc3RhdGljIHBfdHlwZSBtMmQocF90eXBlIHApIHsKICBpbnQgbVtdPXs3LAoJICAgMCwKCSAgIDEsCgkgICAxNiwKCSAgIDQsCgkgICAxMiwKCSAgIDYsCgkgICAxNCwKCSAgIDgsCgkgICAyLAoJICAgMywKCSAgIDEwLAoJICAgMTEsCgkgICAxMywKCSAgIDE1LAoJICAgOSwKCSAgIDE3LAoJICAgNX07CiAgcF90eXBlIHB1OwoKICBwdS5hID0gbVtwLmFdOwogIHB1LmIgPSBtW3AuYl07CiAgcHUuYyA9IG1bcC5jXTsKICBwdS5kID0gbVtwLmRdOwogIHB1LmJpID0gbVtwLmJpXTsKICBwdS5hciA9IG1bcC5hcl07CiAgcHUuZzEgPSBtW3AuZzFdOwogIHB1LmcyID0gbVtwLmcyXTsKICBwdS5nMyA9IG1bcC5nM107CiAgcmV0dXJuIHB1Owp9CgojZGVmaW5lIEEgMHgxCiNkZWZpbmUgQiAweDIKI2RlZmluZSBDIDB4NAojZGVmaW5lIEQgMHg4CiNkZWZpbmUgQkkgMHgxMAojZGVmaW5lIEFSIDB4MjAKI2RlZmluZSBHIDB4NDAKCnN0YXRpYyBpbnQgbWQocF90eXBlIHAsaW50IG1heGRlcCxpbnQgZGVwLGludCBsYXN0KTsKc3RhdGljIGludCBtdShwX3R5cGUgcCxpbnQgbWF4ZGVwLGludCBkZXAsaW50IGxhc3QpIHsKICBzdGF0aWMgaW50IG5lYXJbXSA9IHsweDUwLDB4NzAsMHg3MCwweDc1LDB4ZiwweGYsMHhmLDB4NzAsMHg3MCwweDcwLDB4N2QsMHgyYiwweDJmLDB4ZiwweDUwLDB4NjQsMHg2NywweGZ9OwojZGVmaW5lIEtLSyA0CiAgLyogMiA6IHsweDQwLDB4NDAsMHg0MCwweDYwLDB4MCwweDUsMHhhLDB4NTAsMHg3MCwweDcwLDB4MjQsMHhjLDB4OSwweGUsMHgyMCwweDEwLDB4MSwweDN9OyAqLwogIC8qIHswLDAsMCwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMCwwLDAsMX07Ki8KICAKICBpbnQgd2luOwogIGlmKCBkZXAgPT0gbWF4ZGVwIC0gS0tLICkgewogICAgaWYoKCBCICYgbmVhcltwLmJdKSA9PSAwKSByZXR1cm4gMDsKICAgIGlmKCggRCAmIG5lYXJbcC5kXSkgPT0gMCkgcmV0dXJuIDA7CiAgICBpZigoIEJJICYgbmVhcltwLmJpXSkgPT0gMCkgcmV0dXJuIDA7CiAgICBpZigoIEFSICYgbmVhcltwLmFyXSkgPT0gMCkgcmV0dXJuIDA7CiAgICBpZigoIEEgJiBuZWFyW3AuYV0pID09IDApIHJldHVybiAwOwogICAgaWYoKCBDICYgbmVhcltwLmNdKSA9PSAwKSByZXR1cm4gMDsKICAgIGlmKCggRyAmIG5lYXJbcC5nMV0pID09IDApIHJldHVybiAwOwogICAgaWYoKCBHICYgbmVhcltwLmcyXSkgPT0gMCkgcmV0dXJuIDA7CiAgICBpZigoIEcgJiBuZWFyW3AuZzNdKSA9PSAwKSByZXR1cm4gMDsKICB9CiAgaWYoKHAuYSA9PSA1KSAmJiAocC5iID09IDYpICYmIChwLmMgPT0gMTIpICYmIChwLmQgPT0gMTMpICYmIChwLmJpID09IDE0KSAmJiAocC5hciA9PSAxNSkgICYmICgocC5nMStwLmcyK3AuZzMpID09IDMpICkgewogICAgcHJpbnRmKCJHdWw6ICVkICVkICVkXG4iLHAuZzEscC5nMixwLmczKTsKICAgIHByaW50ZigiYmluK2FydDogJWQgJWRcbiIscC5iaSxwLmFyKTsKICAgIHJldHVybiAxOwogIH0gZWxzZSB7CiAgICBpZihtYXhkZXAgPD0gZGVwKSByZXR1cm4gMDsKCiAgICB3aW4gPSAobGFzdCA9PSAwID8gMCA6IG1kKG0wdShwKSxtYXhkZXAsZGVwKzEsMCkpOwogICAgaWYod2luID09IDEpIHsKICAgICAgcHV0Y2hhcignMCcpOwogICAgICBpZigoZGVwICUgNCkgPT0gMClwdXRjaGFyKCcgJyk7CiAgICAgIHJldHVybiB3aW47CiAgICB9IGVsc2UgewogICAgICB3aW4gPSAobGFzdCA9PSAxID8gMCA6IG1kKG0xdShwKSxtYXhkZXAsZGVwKzEsMSkpOwogICAgICBpZih3aW4gPT0gMSkgewoJcHV0Y2hhcignMScpOwoJaWYoKGRlcCAlIDQpID09IDApcHV0Y2hhcignICcpOwoJcmV0dXJuIHdpbjsKICAgICAgfSBlbHNlIHsKCXdpbiA9IChsYXN0ID09IDIgPyAwIDogbWQobTJ1KHApLG1heGRlcCxkZXArMSwyKSk7CglpZih3aW4gPT0gMSkgewoJICBwdXRjaGFyKCcyJyk7CgkgIGlmKChkZXAgJSA0KSA9PSAwKXB1dGNoYXIoJyAnKTsKCX0KCXJldHVybiB3aW47CiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdGF0aWMgaW50IG1kKHBfdHlwZSBwLGludCBtYXhkZXAsaW50IGRlcCxpbnQgbGFzdCkgewogIGludCB3aW47CgogIGlmKG1heGRlcCA8PSBkZXApIHJldHVybiAwOwoKICB3aW4gPSAobGFzdCA9PSAwID8gMCA6IG11KG0wZChwKSxtYXhkZXAsZGVwKzEsMCkpOwogIGlmKHdpbiA9PSAxKSB7CiAgICBwdXRjaGFyKCcwJyk7CiAgICBpZigoZGVwICUgNCkgPT0gMClwdXRjaGFyKCcgJyk7CiAgICByZXR1cm4gd2luOwogIH0gZWxzZSB7CiAgICB3aW4gPSAobGFzdCA9PSAxID8gMCA6IG11KG0xZChwKSxtYXhkZXAsZGVwKzEsMSkpOwogICAgaWYod2luID09IDEpIHsKICAgICAgcHV0Y2hhcignMScpOwogICAgICBpZigoZGVwICUgNCkgPT0gMClwdXRjaGFyKCcgJyk7CiAgICAgIHJldHVybiB3aW47CiAgICB9IGVsc2UgewogICAgICB3aW4gPSAobGFzdCA9PSAyID8gMCA6IG11KG0yZChwKSxtYXhkZXAsZGVwKzEsMikpOwogICAgICBpZih3aW4gPT0gMSkgewoJcHV0Y2hhcignMicpOwoJaWYoKGRlcCAlIDQpID09IDApcHV0Y2hhcignICcpOwogICAgICB9CiAgICAgIHJldHVybiB3aW47CiAgICB9CiAgfQp9CgojaWZuZGVmIEJFTkNITUFSSwpzdGF0aWMgdm9pZCBwcm5lYXIoaW50IGspOwojZW5kaWYKCmludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkgewogIGludCBrOwogIHBfdHlwZSBwOwojaWZkZWYgQkVOQ0hNQVJLCiAgRklMRSAqZnA7CiNlbmRpZgoKICBmcHJpbnRmKHN0ZGVyciwiQ29tcGlsZSBkYXRlOiAlc1xuIiwgQ09NUERBVEUpOwogIGZwcmludGYoc3RkZXJyLCJDb21waWxlciBzd2l0Y2hlczogJXNcbiIsIENGTEFHUyk7CgojaWZuZGVmIEJFTkNITUFSSwogIGlmKGFyZ2MgPCAxMCkgewogICAgaWYoYXJnYyA9PSAyKSB7CiAgICAgIHBybmVhcihhdG9pKGFyZ3ZbMV0pKTsKICAgIH0gZWxzZSB7CiAgICAgIHByaW50ZigiICAgICAgICAgICAxNiAxN1xuIik7CiAgICAgIHByaW50ZigiMCAgMSAgMiAgMyAgNCAgNSAgNlxuIik7CiAgICAgIHByaW50ZigiNyAgOCAgOSAxMCAxMSAxMiAxM1xuIik7CiAgICAgIHByaW50ZigiICAxNCAxNVxuXG5FbnRlciBBIEIgQyBEIGUgZiBHIEcgRyA6XG4iKTsKICAgICAgcHJpbnRmKCJHIEcgRyAgIEEgQlxuIik7CiAgICAgIHByaW50ZigiZSBmICAgICBDIERcbiIpOwogICAgfQogIH0gZWxzZSB7CiAgICBwLmEgPSBhdG9pKGFyZ3ZbMV0pOwogICAgcC5iID0gYXRvaShhcmd2WzJdKTsKICAgIHAuYyA9IGF0b2koYXJndlszXSk7CiAgICBwLmQgPSBhdG9pKGFyZ3ZbNF0pOwogICAgcC5iaSA9IGF0b2koYXJndls1XSk7CiAgICBwLmFyID0gYXRvaShhcmd2WzZdKTsKICAgIHAuZzEgPSBhdG9pKGFyZ3ZbN10pOwogICAgcC5nMiA9IGF0b2koYXJndls4XSk7CiAgICBwLmczID0gYXRvaShhcmd2WzldKTsKCiAgICBmb3Ioaz0yOztrKz0yKSB7CiAgICAgIHByaW50ZigiVHJ5aW5nICVkXG4iLGspOwogICAgICBpZihtdShwLGssMCwtMSkgPT0gMSkgewoJcHV0Y2hhcignXG4nKTsKCWV4aXQoMCk7CiAgICAgIH0KICAgIH0KICB9CiNlbHNlIC8qIFJ1biBpdCBhcyBhIGJlbmNobWFyayAqLwogIGZwPWZvcGVuKGFyZ3ZbMV0sInIiKTsKICBpZiAoZnA9PU5VTEwpIHsKICAgIGZwcmludGYoc3RkZXJyLCJFUlJPUiBpbiAlczogQ291bGQgbm90IG9wZW4gZGF0YWZpbGUgJXNcbiIsYXJndlswXSxhcmd2WzFdKTsKICAgIGV4aXQoMSk7CiAgfQogIAogIGZzY2FuZihmcCwiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQiLCAKCSAmcC5hLCAmcC5iLCAmcC5jLCAmcC5kLCAmcC5iaSwgJnAuYXIsICZwLmcxLCAmcC5nMiwgJnAuZzMpOwogIAogIGZvcihrPTI7O2srPTIpIHsKICAgIHByaW50ZigiVHJ5aW5nICVkXG4iLGspOwogICAgaWYobXUocCxrLDAsLTEpID09IDEpIHsKICAgICAgcHV0Y2hhcignXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQojZW5kaWYKICAKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBuZWFyZChwX3R5cGUgcCxpbnQgbWF4ZGVwLGludCBkZXAsaW50IGxhc3QsaW50IG5lYXJbXSk7CnN0YXRpYyBpbnQgbmVhcnUocF90eXBlIHAsaW50IG1heGRlcCxpbnQgZGVwLGludCBsYXN0LGludCBuZWFyW10pIHsKICBpZihtYXhkZXAgPT0gZGVwKSB7IAogICAgbmVhcltwLmFdIHw9IEE7CiAgICBuZWFyW3AuYl0gfD0gQjsKICAgIG5lYXJbcC5jXSB8PSBDOwogICAgbmVhcltwLmRdIHw9IEQ7CiAgICBuZWFyW3AuYmldIHw9IEJJOwogICAgbmVhcltwLmFyXSB8PSBBUjsKICAgIG5lYXJbcC5nMV0gfD0gRzsKICAgIG5lYXJbcC5nMl0gfD0gRzsKICAgIG5lYXJbcC5nM10gfD0gRzsKICAgIHJldHVybiAwOwogIH0KCiAgaWYobGFzdCAhPSAwICkgbmVhcmQobTB1KHApLG1heGRlcCxkZXArMSwwLG5lYXIpOwogIGlmKGxhc3QgIT0gMSApIG5lYXJkKG0xdShwKSxtYXhkZXAsZGVwKzEsMSxuZWFyKTsKICBpZihsYXN0ICE9IDIgKSBuZWFyZChtMnUocCksbWF4ZGVwLGRlcCsxLDIsbmVhcik7CgogIHJldHVybiAwOyAvKiBUbyBxdWlldCB0aGUgY29tcGlsZXIuLi4gKi8KfQoKc3RhdGljIGludCBuZWFyZChwX3R5cGUgcCxpbnQgbWF4ZGVwLGludCBkZXAsaW50IGxhc3QsaW50IG5lYXJbXSkgewogIGlmKGxhc3QgIT0gMCApIG5lYXJ1KG0wZChwKSxtYXhkZXAsZGVwKzEsMCxuZWFyKTsKICBpZihsYXN0ICE9IDEgKSBuZWFydShtMWQocCksbWF4ZGVwLGRlcCsxLDEsbmVhcik7CiAgaWYobGFzdCAhPSAyICkgbmVhcnUobTJkKHApLG1heGRlcCxkZXArMSwyLG5lYXIpOwogIHJldHVybiAwOwp9CgojaWZuZGVmIEJFTkNITUFSSwpzdGF0aWMgdm9pZCBwcm5lYXIoaW50IGspIHsKICBpbnQgaTsKICBpbnQgbmVhclsxOF07CiAgcF90eXBlIGNvcnJlY3QgPSB7NSw2LDEyLDEzLDE0LDE1LDAsMSwyfTsKCiAgZm9yKGk9MDtpPDE4O2krKykgbmVhcltpXSA9IDA7CiAgbmVhcnUoY29ycmVjdCxrLDAsLTEsbmVhcik7CiAgcHJpbnRmKCJ7MHgleCIsbmVhclswXSk7CiAgZm9yKGk9MTtpPDE4O2krKykgcHJpbnRmKCIsMHgleCIsbmVhcltpXSk7CiAgcHJpbnRmKCJ9XG4iKTsKfQojZW5kaWYKCi8qCiAgbm9ybWFsbORnZSA6IHNraWRhbiBpIG1pdHRlbiArIHbkbnN0ZXJmbGVwcCBuZWTldAogIG51bXJlcmluZyA6IGL2cmphIHDlIDA7IHNraWRhbiBm9nJzdCByYWR2aXMsIHNlZGFuIHZmbGVwcCArIGhmbGVwcAoKICAxNiAxNwogIDAwIDAxIDAyIDAzIDA0IDA1IDA2CiAgMDcgMDggMDkgMTAgMTEgMTIgMTMKICAxNCAxNQoKCiAgVmluc3QgOiAKICBHIEcgRyAgIEEgQiAKICBFIEYgICAgIEMgRAoKICBWaW5zdGVyOgogIDAgMSA3IDggCiAgMSAyIDggOQogIDIgMyA5IDEwCiAgMyA0IDEwIDExCiAgNCA1IDExIDEyCiAgNSA2IDEyIDEzCgogIDAxIDAyCiAgMDAgMDggMDkgMDMgMTYgMTcgMDYKICAwNyAxNCAxNSAxMCAwNCAwNSAxMwogIDExIDEyCgogIFZpbnN0ZXI6CiAgMCA4IDcgMTQKICA4IDkgMTQgMTUKICA5IDMgMTUgMTAKICAzIDE2IDEwIDQKICAxNiAxNyA0IDUKICAxNyA2IDUgMTMKCiovCgoKCg==