LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogKgogKi8KCiNwcmFnbWEgcGFjaygxKQpzdHJ1Y3QgaTJvX2hlYWRlciB7Cgl1OAl2ZXJzaW9uOwoJdTgJbWVzc2FnZV9mbGFnczsKCXUxNgltZXNzYWdlX3NpemU7Cgl1OAl0YXJnZXQ7Cgl1OAlpbml0aWF0b3JfYW5kX3RhcmdldDsKCXU4CWluaXRpYXRvcjsKCXU4CWZ1bmN0aW9uOwoJdTMyCWluaXRpYXRvcl9jb250ZXh0Owp9OwojcHJhZ21hIHBhY2soKQoKI2RlZmluZSBJMk9fSEVBREVSX1RFTVBMQVRFIFwKICAgICAgeyAudmVyc2lvbiAgICAgICAgICAgICAgPSAweDAxLCBcCgkubWVzc2FnZV9mbGFncyAgICAgICAgPSAweDAwLCBcCgkuZnVuY3Rpb24gICAgICAgICAgICAgPSAweEZGLCBcCgkuaW5pdGlhdG9yICAgICAgICAgICAgPSAweDAwLCBcCgkuaW5pdGlhdG9yX2FuZF90YXJnZXQgPSAweDQwLCBcCgkudGFyZ2V0ICAgICAgICAgICAgICAgPSAweDAwLCBcCgkuaW5pdGlhdG9yX2NvbnRleHQgICAgPSAweDAgfQoKI2RlZmluZSBJMk9fTUVTU0FHRV9TSVpFCTB4MTAwMAojZGVmaW5lIEkyT19DT01NQU5EX1NJWkUJKEkyT19NRVNTQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGkyb19oZWFkZXIpKQoKI3ByYWdtYSBwYWNrKDEpCnN0cnVjdCBpMm9fbWVzc2FnZSB7CglzdHJ1Y3QgaTJvX2hlYWRlcgloZWFkZXI7Cgl2b2lkCQkJKmRhdGE7Cn07CiNwcmFnbWEgcGFjaygpCgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IG91dGdvaW5nX21lc3NhZ2Vfc2l6ZSh1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQp7Cgl1bnNpZ25lZCBpbnQgc2l6ZTsKCXVuc2lnbmVkIHNob3J0IGkyb19zaXplOwoKCWlmIChkYXRhX3NpemUgPiBJMk9fQ09NTUFORF9TSVpFKQoJCWRhdGFfc2l6ZSA9IEkyT19DT01NQU5EX1NJWkU7CgoJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaTJvX2hlYWRlcikgKyBkYXRhX3NpemU7CgoJaTJvX3NpemUgPSBzaXplIC8gc2l6ZW9mKHUzMik7CgoJaWYgKHNpemUgJSBzaXplb2YodTMyKSkKCSAgICAgICBpMm9fc2l6ZSsrOwoKCXJldHVybiBpMm9fc2l6ZTsKfQoKc3RhdGljIGlubGluZSB1MzIgaW5jb21pbmdfZGF0YV9zaXplKHN0cnVjdCBpMm9fbWVzc2FnZSAqaTJvX21lc3NhZ2UpCnsKCXJldHVybiAoc2l6ZW9mKHUzMikgKiBpMm9fbWVzc2FnZS0+aGVhZGVyLm1lc3NhZ2Vfc2l6ZSk7Cn0K