I2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJyZWZzLmgiCiNpbmNsdWRlICJwa3QtbGluZS5oIgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KCnN0YXRpYyBjb25zdCBjaGFyIGZldGNoX3BhY2tfdXNhZ2VbXSA9ICJnaXQtZmV0Y2gtcGFjayBbaG9zdDpdZGlyZWN0b3J5IFtoZWFkc10qIDwgbXljb21taXRsaXN0IjsKc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWMgPSAiZ2l0LXVwbG9hZC1wYWNrIjsKCnN0YXRpYyBpbnQgZmluZF9jb21tb24oaW50IGZkWzJdLCB1bnNpZ25lZCBjaGFyICpyZXN1bHRfc2hhMSwgdW5zaWduZWQgY2hhciAqcmVtb3RlKQp7CglzdGF0aWMgY2hhciBsaW5lWzEwMDBdOwoJaW50IGNvdW50ID0gMCwgZmx1c2hlcyA9IDAsIHJldHZhbDsKCUZJTEUgKnJldnM7CgoJcmV2cyA9IHBvcGVuKCJnaXQtcmV2LWxpc3QgJChnaXQtcmV2LXBhcnNlIC0tYWxsKSIsICJyIik7CglpZiAoIXJldnMpCgkJZGllKCJ1bmFibGUgdG8gcnVuICdnaXQtcmV2LWxpc3QnIik7CglwYWNrZXRfd3JpdGUoZmRbMV0sICJ3YW50ICVzXG4iLCBzaGExX3RvX2hleChyZW1vdGUpKTsKCXBhY2tldF9mbHVzaChmZFsxXSk7CglmbHVzaGVzID0gMTsKCXJldHZhbCA9IC0xOwoJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgcmV2cykgIT0gTlVMTCkgewoJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CgkJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkKCQkJZGllKCJnaXQtZmV0Y2gtcGFjazogZXhwZWN0ZWQgb2JqZWN0IG5hbWUsIGdvdCBjcnVkIik7CgkJcGFja2V0X3dyaXRlKGZkWzFdLCAiaGF2ZSAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOwoJCWlmICghKDMxICYgKytjb3VudCkpIHsKCQkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKCQkJZmx1c2hlcysrOwoKCQkJLyoKCQkJICogV2Uga2VlcCBvbmUgd2luZG93ICJhaGVhZCIgb2YgdGhlIG90aGVyIHNpZGUsIGFuZAoJCQkgKiB3aWxsIHdhaXQgZm9yIGFuIEFDSyBvbmx5IG9uIHRoZSBuZXh0IG9uZQoJCQkgKi8KCQkJaWYgKGNvdW50ID09IDMyKQoJCQkJY29udGludWU7CgkJCWlmIChnZXRfYWNrKGZkWzBdLCByZXN1bHRfc2hhMSkpIHsKCQkJCWZsdXNoZXMgPSAwOwoJCQkJcmV0dmFsID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJCWZsdXNoZXMtLTsKCQl9Cgl9CglwY2xvc2UocmV2cyk7CglwYWNrZXRfd3JpdGUoZmRbMV0sICJkb25lXG4iKTsKCXdoaWxlIChmbHVzaGVzKSB7CgkJZmx1c2hlcy0tOwoJCWlmIChnZXRfYWNrKGZkWzBdLCByZXN1bHRfc2hhMSkpCgkJCXJldHVybiAwOwoJfQoJcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIGludCBnZXRfcmVtb3RlX2hlYWRzKGludCBmZCwgaW50IG5yX21hdGNoLCBjaGFyICoqbWF0Y2gsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCkKewoJaW50IGNvdW50ID0gMDsKCglmb3IgKDs7KSB7CgkJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOwoJCWNoYXIgKnJlZm5hbWU7CgkJaW50IGxlbjsKCgkJbGVuID0gcGFja2V0X3JlYWRfbGluZShmZCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKCQlpZiAoIWxlbikKCQkJYnJlYWs7CgkJaWYgKGxpbmVbbGVuLTFdID09ICdcbicpCgkJCWxpbmVbLS1sZW5dID0gMDsKCQlpZiAobGVuIDwgNDIgfHwgZ2V0X3NoYTFfaGV4KGxpbmUsIHNoYTEpKQoJCQlkaWUoImdpdC1mZXRjaC1wYWNrOiBwcm90b2NvbCBlcnJvciAtIGV4cGVjdGVkIHJlZiBkZXNjcmlwdG9yLCBnb3QgJyVzpCciLCBsaW5lKTsKCQlyZWZuYW1lID0gbGluZSs0MTsKCQlpZiAobnJfbWF0Y2ggJiYgIXBhdGhfbWF0Y2gocmVmbmFtZSwgbnJfbWF0Y2gsIG1hdGNoKSkKCQkJY29udGludWU7CgkJY291bnQrKzsKCQltZW1jcHkocmVzdWx0LCBzaGExLCAyMCk7Cgl9CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBpbnQgZmV0Y2hfcGFjayhpbnQgZmRbMl0sIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoKQp7Cgl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCByZW1vdGVbMjBdOwoJaW50IGhlYWRzLCBzdGF0dXM7CglwaWRfdCBwaWQ7CgoJaGVhZHMgPSBnZXRfcmVtb3RlX2hlYWRzKGZkWzBdLCBucl9tYXRjaCwgbWF0Y2gsIHJlbW90ZSk7CglpZiAoaGVhZHMgIT0gMSkgewoJCXBhY2tldF9mbHVzaChmZFsxXSk7CgkJZGllKGhlYWRzID8gIm11bHRpcGxlIHJlbW90ZSBoZWFkcyIgOiAibm8gbWF0Y2hpbmcgcmVtb3RlIGhlYWQiKTsKCX0KCWlmIChmaW5kX2NvbW1vbihmZCwgc2hhMSwgcmVtb3RlKSA8IDApCgkJZGllKCJnaXQtZmV0Y2gtcGFjazogbm8gY29tbW9uIGNvbW1pdHMiKTsKCXBpZCA9IGZvcmsoKTsKCWlmIChwaWQgPCAwKQoJCWRpZSgiZ2l0LWZldGNoLXBhY2s6IHVuYWJsZSB0byBmb3JrIG9mZiBnaXQtdW5wYWNrLW9iamVjdHMiKTsKCWlmICghcGlkKSB7CgkJY2xvc2UoZmRbMV0pOwoJCWR1cDIoZmRbMF0sIDApOwoJCWNsb3NlKGZkWzBdKTsKCQlleGVjbHAoImdpdC11bnBhY2stb2JqZWN0cyIsICJnaXQtdW5wYWNrLW9iamVjdHMiLCBOVUxMKTsKCQlkaWUoImdpdC11bnBhY2stb2JqZWN0cyBleGVjIGZhaWxlZCIpOwoJfQoJY2xvc2UoZmRbMF0pOwoJY2xvc2UoZmRbMV0pOwoJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDApIHsKCQlpZiAoZXJybm8gIT0gRUlOVFIpCgkJCWRpZSgid2FpdGluZyBmb3IgZ2l0LXVucGFjay1vYmplY3RzOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Cgl9CglpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKCQlpbnQgY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CgkJaWYgKGNvZGUpCgkJCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGRpZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgY29kZSk7CgkJcHV0cyhzaGExX3RvX2hleChyZW1vdGUpKTsKCQlyZXR1cm4gMDsKCX0KCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CgkJaW50IHNpZyA9IFdURVJNU0lHKHN0YXR1cyk7CgkJZGllKCJnaXQtdW5wYWNrLW9iamVjdHMgZGllZCBvZiBzaWduYWwgJWQiLCBzaWcpOwoJfQoJZGllKCJTaGVybG9jayBIb2xtZXMhIGdpdC11bnBhY2stb2JqZWN0cyBkaWVkIG9mIHVubmF0dXJhbCBjYXVzZXMgJWQhIiwgc3RhdHVzKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglpbnQgaSwgcmV0LCBucl9oZWFkczsKCWNoYXIgKmRlc3QgPSBOVUxMLCAqKmhlYWRzOwoJaW50IGZkWzJdOwoJcGlkX3QgcGlkOwoKCW5yX2hlYWRzID0gMDsKCWhlYWRzID0gTlVMTDsKCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKCQljaGFyICphcmcgPSBhcmd2W2ldOwoKCQlpZiAoKmFyZyA9PSAnLScpIHsKCQkJLyogQXJndW1lbnRzIGdvIGhlcmUgKi8KCQkJdXNhZ2UoZmV0Y2hfcGFja191c2FnZSk7CgkJfQoJCWRlc3QgPSBhcmc7CgkJaGVhZHMgPSBhcmd2ICsgaSArIDE7CgkJbnJfaGVhZHMgPSBhcmdjIC0gaSAtIDE7CgkJYnJlYWs7Cgl9CglpZiAoIWRlc3QpCgkJdXNhZ2UoZmV0Y2hfcGFja191c2FnZSk7CglwaWQgPSBnaXRfY29ubmVjdChmZCwgZGVzdCwgZXhlYyk7CglpZiAocGlkIDwgMCkKCQlyZXR1cm4gMTsKCXJldCA9IGZldGNoX3BhY2soZmQsIG5yX2hlYWRzLCBoZWFkcyk7CgljbG9zZShmZFswXSk7CgljbG9zZShmZFsxXSk7CglmaW5pc2hfY29ubmVjdChwaWQpOwoJcmV0dXJuIHJldDsKfQo=