LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKICoKICovCgojaW5jbHVkZSAiaWJtYXNtLmgiCiNpbmNsdWRlICJsb3dsZXZlbC5oIgojaW5jbHVkZSAiaTJvLmgiCiNpbmNsdWRlICJkb3RfY29tbWFuZC5oIgojaW5jbHVkZSAicmVtb3RlLmgiCgpzdGF0aWMgc3RydWN0IGkyb19oZWFkZXIgaGVhZGVyID0gSTJPX0hFQURFUl9URU1QTEFURTsKCgppbnQgaWJtYXNtX3NlbmRfaTJvX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJdTMyIG1mYTsKCXVuc2lnbmVkIGludCBjb21tYW5kX3NpemU7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1lc3NhZ2U7CglzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9IHNwLT5jdXJyZW50X2NvbW1hbmQ7CgoJbWZhID0gZ2V0X21mYV9pbmJvdW5kKHNwLT5iYXNlX2FkZHJlc3MpOwoJaWYgKCFtZmEpCgkJcmV0dXJuIDE7CgoJY29tbWFuZF9zaXplID0gZ2V0X2RvdF9jb21tYW5kX3NpemUoY29tbWFuZC0+YnVmZmVyKTsKCWhlYWRlci5tZXNzYWdlX3NpemUgPSBvdXRnb2luZ19tZXNzYWdlX3NpemUoY29tbWFuZF9zaXplKTsKCgltZXNzYWdlID0gZ2V0X2kyb19tZXNzYWdlKHNwLT5iYXNlX2FkZHJlc3MsIG1mYSk7CgoJbWVtY3B5KCZtZXNzYWdlLT5oZWFkZXIsICZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgaTJvX2hlYWRlcikpOwoJbWVtY3B5KCZtZXNzYWdlLT5kYXRhLCBjb21tYW5kLT5idWZmZXIsIGNvbW1hbmRfc2l6ZSk7CgoJc2V0X21mYV9pbmJvdW5kKHNwLT5iYXNlX2FkZHJlc3MsIG1mYSk7CgoJcmV0dXJuIDA7Cn0KCmlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdTMyCW1mYTsKCXN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AgPSAoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICopZGV2X2lkOwoJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MgPSBzcC0+YmFzZV9hZGRyZXNzOwoKCWlmICghc3BfaW50ZXJydXB0X3BlbmRpbmcoYmFzZV9hZGRyZXNzKSkKCQlyZXR1cm4gSVJRX05PTkU7CgoJaWYgKG1vdXNlX2ludGVycnVwdF9wZW5kaW5nKHNwKSkgewoJCWlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHNwKTsKCQltZmEgPSBnZXRfbWZhX291dGJvdW5kKGJhc2VfYWRkcmVzcyk7CgkJY2xlYXJfbW91c2VfaW50ZXJydXB0KHNwKTsKCQlzZXRfbWZhX291dGJvdW5kKGJhc2VfYWRkcmVzcywgbWZhKTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJbWZhID0gZ2V0X21mYV9vdXRib3VuZChiYXNlX2FkZHJlc3MpOwoJaWYgKHZhbGlkX21mYShtZmEpKSB7CgkJc3RydWN0IGkyb19tZXNzYWdlICptc2cgPSBnZXRfaTJvX21lc3NhZ2UoYmFzZV9hZGRyZXNzLCBtZmEpOwoJCWlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3AsICZtc2ctPmRhdGEsIGluY29taW5nX2RhdGFfc2l6ZShtc2cpKTsKCX0KCXNldF9tZmFfb3V0Ym91bmQoYmFzZV9hZGRyZXNzLCBtZmEpOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9Cg==