LyogZmRmb3JtYXQuYyAgLSAgTG93LWxldmVsIGZvcm1hdHMgYSBmbG9wcHkgZGlzayAtIFdlcm5lciBBbG1lc2JlcmdlciAqLwoKLyogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wMy0yMCBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KICogLSBtb3JlIGkxOG4vbmxzIHRyYW5zbGF0YWJsZSBzdHJpbmdzIG1hcmtlZAogKgogKiA1IEp1bHkgMjAwMyAtLSBtb2RpZmllZCBmb3IgQnVzeWJveCBieSBFcmlrIEFuZGVyc2VuCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgImJ1c3lib3guaCIKCgovKiBTdHVmZiBleHRyYWN0ZWQgZnJvbSBsaW51eC9mZC5oICovCnN0cnVjdCBmbG9wcHlfc3RydWN0IHsKCXVuc2lnbmVkIGludAlzaXplLAkJLyogbnIgb2Ygc2VjdG9ycyB0b3RhbCAqLwoJCQlzZWN0LAkJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KCQkJaGVhZCwJCS8qIG5yIG9mIGhlYWRzICovCgkJCXRyYWNrLAkJLyogbnIgb2YgdHJhY2tzICovCgkJCXN0cmV0Y2g7CS8qICE9MCBtZWFucyBkb3VibGUgdHJhY2sgc3RlcHMgKi8KI2RlZmluZSBGRF9TVFJFVENIIDEKI2RlZmluZSBGRF9TV0FQU0lERVMgMgoKCXVuc2lnbmVkIGNoYXIJZ2FwLAkJLyogZ2FwMSBzaXplICovCgoJCQlyYXRlLAkJLyogZGF0YSByYXRlLiB8PSAweDQwIGZvciBwZXJwZW5kaWN1bGFyICovCiNkZWZpbmUgRkRfMk0gMHg0CiNkZWZpbmUgRkRfU0laRUNPREVNQVNLIDB4MzgKI2RlZmluZSBGRF9TSVpFQ09ERShmbG9wcHkpICgoKCgoZmxvcHB5KS0+cmF0ZSZGRF9TSVpFQ09ERU1BU0spPj4gMykrIDIpICU4KQojZGVmaW5lIEZEX1NFQ1RTSVpFKGZsb3BweSkgKCAoZmxvcHB5KS0+cmF0ZSAmIEZEXzJNID8gXAoJCQkgICAgIDUxMiA6IDEyOCA8PCBGRF9TSVpFQ09ERShmbG9wcHkpICkKI2RlZmluZSBGRF9QRVJQIDB4NDAKCgkJCXNwZWMxLAkJLyogc3RlcHBpbmcgcmF0ZSwgaGVhZCB1bmxvYWQgdGltZSAqLwoJCQlmbXRfZ2FwOwkvKiBnYXAyIHNpemUgKi8KCWNvbnN0IGNoYXIJKiBuYW1lOyAvKiB1c2VkIG9ubHkgZm9yIHByZWRlZmluZWQgZm9ybWF0cyAqLwp9OwpzdHJ1Y3QgZm9ybWF0X2Rlc2NyIHsKCXVuc2lnbmVkIGludCBkZXZpY2UsaGVhZCx0cmFjazsKfTsKI2RlZmluZSBGREZNVEJFRyBfSU8oMiwweDQ3KQojZGVmaW5lCUZERk1UVFJLIF9JT1coMiwweDQ4LCBzdHJ1Y3QgZm9ybWF0X2Rlc2NyKQojZGVmaW5lIEZERk1URU5EIF9JTygyLDB4NDkpCiNkZWZpbmUgRkRHRVRQUk0gX0lPUigyLCAweDA0LCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkKI2RlZmluZSBGRF9GSUxMX0JZVEUgMHhGNiAvKiBmb3JtYXQgZmlsbCBieXRlLiAqLwoKCgpzdGF0aWMgdm9pZCBmb3JtYXRfZGlzayhpbnQgY3RybCwgY2hhciAqbmFtZSwgc3RydWN0IGZsb3BweV9zdHJ1Y3QgKnBhcmFtKQp7CiAgICBzdHJ1Y3QgZm9ybWF0X2Rlc2NyIGRlc2NyOwogICAgaW50IHRyYWNrOwoKICAgIHByaW50ZigiRm9ybWF0dGluZyAuLi4gIik7CiAgICBmZmx1c2goc3Rkb3V0KTsKICAgIGlmIChpb2N0bChjdHJsLEZERk1UQkVHLE5VTEwpIDwgMCkgewoJYmJfcGVycm9yX21zZ19hbmRfZGllKCJGREZNVEJFRyIpOwogICAgfQogICAgZm9yICh0cmFjayA9IDA7IHRyYWNrIDwgcGFyYW0tPnRyYWNrOyB0cmFjaysrKSAKICAgIHsKCWRlc2NyLnRyYWNrID0gdHJhY2s7CglkZXNjci5oZWFkID0gMDsKCWlmIChpb2N0bChjdHJsLEZERk1UVFJLLChsb25nKSAmZGVzY3IpIDwgMCkgewoJICAgIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiRkRGTVRUUksiKTsKCX0KCglwcmludGYoIiUzZFxiXGJcYiIsdHJhY2spOwoJZmZsdXNoKHN0ZG91dCk7CglpZiAocGFyYW0tPmhlYWQgPT0gMikgewoJICAgIGRlc2NyLmhlYWQgPSAxOwoJICAgIGlmIChpb2N0bChjdHJsLEZERk1UVFJLLChsb25nKSAmZGVzY3IpIDwgMCkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiRkRGTVRUUksiKTsKCSAgICB9Cgl9CiAgICB9CiAgICBpZiAoaW9jdGwoY3RybCxGREZNVEVORCxOVUxMKSA8IDApIHsKCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiRkRGTVRFTkQiKTsKICAgIH0KICAgIHByaW50ZigiZG9uZVxuIik7Cn0KCnN0YXRpYyB2b2lkIHZlcmlmeV9kaXNrKGNoYXIgKm5hbWUsIHN0cnVjdCBmbG9wcHlfc3RydWN0ICpwYXJhbSkKewogICAgdW5zaWduZWQgY2hhciAqZGF0YTsKICAgIGludCBmZCxjeWxfc2l6ZSxjeWwsY291bnQscmVhZF9ieXRlczsKCiAgICBjeWxfc2l6ZSA9IHBhcmFtLT5zZWN0KnBhcmFtLT5oZWFkKjUxMjsKICAgIGRhdGEgPSB4bWFsbG9jKGN5bF9zaXplKTsKICAgIHByaW50ZigiVmVyaWZ5aW5nIC4uLiAiKTsKICAgIGZmbHVzaChzdGRvdXQpOwogICAgZmQgPSBiYl94b3BlbihuYW1lLE9fUkRPTkxZKTsKICAgIGZvciAoY3lsID0gMDsgY3lsIDwgcGFyYW0tPnRyYWNrOyBjeWwrKykgCiAgICB7CglwcmludGYoIiUzZFxiXGJcYiIsY3lsKTsKCWZmbHVzaChzdGRvdXQpOwoJcmVhZF9ieXRlcyA9IHNhZmVfcmVhZChmZCxkYXRhLGN5bF9zaXplKTsKCWlmKHJlYWRfYnl0ZXMgIT0gY3lsX3NpemUpIHsKCSAgICBpZihyZWFkX2J5dGVzIDwgMCkgewoJCWJiX3BlcnJvcl9tc2coIlJlYWQ6ICIpOwoJICAgIH0KCSAgICBiYl9lcnJvcl9tc2dfYW5kX2RpZSgiUHJvYmxlbSByZWFkaW5nIGN5bGluZGVyICVkLCAiCgkJICAgICJleHBlY3RlZCAlZCwgcmVhZCAlZCIsIGN5bCwgY3lsX3NpemUsIHJlYWRfYnl0ZXMpOwoJfQoJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgY3lsX3NpemU7IGNvdW50KyspCgkgICAgaWYgKGRhdGFbY291bnRdICE9IEZEX0ZJTExfQllURSkgewoJCXByaW50ZigiYmFkIGRhdGEgaW4gY3lsICVkXG5Db250aW51aW5nIC4uLiAiLGN5bCk7CgkJZmZsdXNoKHN0ZG91dCk7CgkJYnJlYWs7CgkgICAgfQogICAgfQogICAgcHJpbnRmKCJkb25lXG4iKTsKICAgIGNsb3NlKGZkKTsKfQoKaW50IGZkZm9ybWF0X21haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCnsKICAgIGludCBjdHJsOwogICAgaW50IHZlcmlmeTsKICAgIHN0cnVjdCBzdGF0IHN0OwogICAgc3RydWN0IGZsb3BweV9zdHJ1Y3QgcGFyYW07CgogICAgaWYgKGFyZ2MgPCAyKSB7CgliYl9zaG93X3VzYWdlKCk7CiAgICB9CiAgICB2ZXJpZnkgPSAhYmJfZ2V0b3B0X3VsZmxhZ3MoYXJnYywgYXJndiwgIm4iKTsKICAgIGFyZ3YgKz0gb3B0aW5kOwoKICAgIGlmIChzdGF0KCphcmd2LCZzdCkgPCAwIHx8IGFjY2VzcygqYXJndixXX09LKSA8IDApIHsKCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgqYXJndik7CiAgICB9CiAgICBpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgYmxvY2sgZGV2aWNlIiwqYXJndik7CgkvKiBkbyBub3QgdGVzdCBtYWpvciAtIHBlcmhhcHMgdGhpcyB3YXMgYW4gVVNCIGZsb3BweSAqLwogICAgfQoKICAgIGN0cmwgPSBiYl94b3BlbigqYXJndixPX1dST05MWSk7CiAgICBpZiAoaW9jdGwoY3RybCxGREdFVFBSTSwobG9uZykgJnBhcmFtKSA8IDApIHsgCgliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCBmb3JtYXQgdHlwZSIpOwogICAgfQogICAgcHJpbnRmKCIlcy1zaWRlZCwgJWQgdHJhY2tzLCAlZCBzZWMvdHJhY2suIFRvdGFsIGNhcGFjaXR5ICVkIGtCLlxuIiwKCSAgICAocGFyYW0uaGVhZCA9PSAyKSA/ICJEb3VibGUiIDogIlNpbmdsZSIsCgkgICAgcGFyYW0udHJhY2ssIHBhcmFtLnNlY3QscGFyYW0uc2l6ZSA+PiAxKTsKICAgIGZvcm1hdF9kaXNrKGN0cmwsICphcmd2LCAmcGFyYW0pOwogICAgY2xvc2UoY3RybCk7CgogICAgaWYgKHZlcmlmeSkgewoJdmVyaWZ5X2Rpc2soKmFyZ3YsICZwYXJhbSk7CiAgICB9CiAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==