LyoqCiAqIEBmaWxlIGRlYnVnX2xpbmUuYwogKiBEV0FSRiAyIGRlYnVnIGxpbmUgaW5mbyBjcmVhdGlvbiBoZWxwZXIKICoKICogQHJlbWFyayBDb3B5cmlnaHQgMjAwNyBPUHJvZmlsZSBhdXRob3JzCiAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCiAqCiAqIEBhdXRob3IgUGhpbGlwcGUgRWxpZQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGJmZC5oPgojaW5jbHVkZSA8bGltaXRzLmg+CgojaW5jbHVkZSAib3BqaXRjb252LmgiCiNpbmNsdWRlICJqaXRkdW1wLmgiCiNpbmNsdWRlICJvcGFnZW50LmgiCiNpbmNsdWRlICJvcF9saWJpYmVydHkuaCIKI2luY2x1ZGUgIm9wX2dyb3dhYmxlX2J1ZmZlci5oIgoKLyoKICogVGVybWlub2xvZ3kgY29tZXMgZnJvbSB0aGUgVElTIERXQVJGIERlYnVnZ2luZyBJbmZvcm1hdGlvbiBGb3JtYXQKICogdmVyc2lvbiAyLjAKICovCgp0eXBlZGVmIHVpbnQzMl90IHV3b3JkOwp0eXBlZGVmIHVpbnQxNl90IHVoYWxmOwp0eXBlZGVmIGludDMyX3QgIHN3b3JkOwp0eXBlZGVmIGludDE2X3QgIHNoYWxmOwp0eXBlZGVmIHVpbnQ4X3QgIHVieXRlOwp0eXBlZGVmIGludDhfdCAgIHNieXRlOwoKLyoKICogTWFueSBvZiB0aGUgZm9sbG93aW5nIGVudW0gYXJlIGluY29tcGxldGUgYW5kIGRlZmluZSBvbmx5IHRoZSBzdWJzZXQKICogb2YgRFdBUkYgd2UgdXNlLgogKi8KZW51bSBsbnNfb3Bjb2RlIHsKCURXX0xOU19jb3B5PTEsCglEV19MTlNfYWR2YW5jZV9wYywKCURXX0xOU19hZHZhbmNlX2xpbmUsCglEV19MTlNfc2V0X2ZpbGUsCglEV19MTlNfc2V0X2NvbHVtbiwKCURXX0xOU19uZWdhdGVfc3RtdCwKCURXX0xOU19zZXRfYmFzaWNfYmxvY2ssCglEV19MTlNfY29uc3RfYWRkX3BjLAoJRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMsCgoJLyogQWRkaW5nIG5ldyBvcGNvZGUgbmVlZHMgYW4gdXBkYXRlIG9mIHRoZSBzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoCgkgKiBhcnJheSAqLwoKCURXX0xOU19tYXhfb3Bjb2RlLAp9OwoKZW51bSBsbmVfb3Bjb2RlIHsKCURXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAoJRFdfTE5FX3NldF9hZGRyZXNzLAoJRFdfTE5FX2RlZmluZV9maWxlCn07CgplbnVtIGR3X3RhZyB7CglEV19UQUdfY29tcGlsZV91bml0ID0gMHgxMSwKfTsKCmVudW0gZHdfYXQgewoJRFdfQVRfbmFtZSA9IDB4MDMsCglEV19BVF9zdG10X2xpc3QgPSAweDEwLAoJRFdfQVRfbG93X3BjLAoJRFdfQVRfaGlnaF9wYywKCURXX0FUX2xhbmd1YWdlLAoJRFdfQVRfY29tcGRpciA9IDB4MWIsCglEV19BVF9wcm9kdWNlciA9IDB4MjUsCn07CgplbnVtIGR3X2NoaWxkcmVuIHsKCURXX0NISUxEUkVOX25vLAoJRFdfQ0hJTERSRU5feWVzCn07CgplbnVtIGR3X2Zvcm0gewoJRFdfRk9STV9kYXRhNCA9IDB4MDYsCn07CgpzdHJ1Y3QgZGVidWdfbGluZV9oZWFkZXIgewoJLy8gTm90IGNvdW50aW5nIHRoaXMgZmllbGQKCXV3b3JkIHRvdGFsX2xlbmd0aDsKCS8vIHZlcnNpb24gbnVtYmVyICgyIGN1cnJlbnRseSkKCXVoYWxmIHZlcnNpb247CgkvLyByZWxhdGl2ZSBvZmZzZXQgZnJvbSBuZXh0IGZpZWxkIHRvCgkvLyBwcm9ncmFtIHN0YXRlbWVudAoJdXdvcmQgcHJvbG9nX2xlbmd0aDsKCXVieXRlIG1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOwoJdWJ5dGUgZGVmYXVsdF9pc19zdG10OwoJLy8gbGluZV9iYXNlIC0gc2VlIERXQVJGIDIgc3BlY3MKCXNieXRlIGxpbmVfYmFzZTsKCS8vIGxpbmVfcmFuZ2UgLSBzZWUgRFdBUkYgMiBzcGVjcwoJdWJ5dGUgbGluZV9yYW5nZTsKCS8vIG51bWJlciBvZiBvcGNvZGUgKyAxCgl1Ynl0ZSBvcGNvZGVfYmFzZTsKCS8qIGZvbGxvdyB0aGUgYXJyYXkgb2Ygb3Bjb2RlIGFyZ3MgbnI6IHVieXRlcyBbbnJfb3Bjb2RlX2Jhc2VdICovCgkvKiBmb2xsb3cgdGhlIHNlYXJjaCBkaXJlY3RvcmllcyBpbmRleCwgemVybyB0ZXJtaW5hdGVkIHN0cmluZwoJICogdGVybWluYXRlZCBieSBhbiBlbXB0eSBzdHJpbmcuCgkgKi8KCS8qIGZvbGxvdyBhbiBhcnJheSBvZiB7IGZpbGVuYW1lLCBMRUIxMjgsIExFQjEyOCwgTEVCMTI4IH0sIGZpcnN0IGlzCgkgKiB0aGUgZGlyZWN0b3J5IGluZGV4IGVudHJ5LCAwIG1lYW5zIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIG10aW1lCgkgKiBhbmQgZmlsZXNpemUsIGxhc3QgZW50cnkgaXMgZm9sbG93ZWQgYnkgZW4gZW1wdHkgc3RyaW5nLgoJICovCgkvKiBmb2xsb3cgdGhlIGZpcnN0IHByb2dyYW0gc3RhdGVtZW50ICovCn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgovKiBEV0FSRiAyIHNwZWMgdGFsayBvbmx5IGFib3V0IG9uZSBwb3NzaWJsZSBjb21waWxhdGlvbiB1bml0IGhlYWRlciB3aGlsZQogKiBiaW51dGlscyBjYW4gaGFuZGxlIHR3byBmbGF2b3VycyBvZiBkd2FyZiAyLCAzMiBhbmQgNjQgYml0cywgdGhpcyBpcyBub3QKICogcmVsYXRlZCB0byB0aGUgdXNlZCBhcmNoLCBhbiBFTEYgMzIgY2FuIGhvbGQgbW9yZSB0aGFuIDQgR28gb2YgZGVidWcKICogaW5mb3JtYXRpb24uIEZvciBub3cgd2UgaGFuZGxlIG9ubHkgRFdBUkYgMiAzMiBiaXRzIGNvbXAgdW5pdC4gSXQnbGwgb25seQogKiBiZWNvbWUgYSBwcm9ibGVtIGlmIHdlIGdlbmVyYXRlIG1vcmUgdGhhbiA0R0Igb2YgZGVidWcgaW5mb3JtYXRpb24uCiAqLwpzdHJ1Y3QgY29tcGlsYXRpb25fdW5pdF9oZWFkZXIgewoJdXdvcmQgdG90YWxfbGVuZ3RoOwoJdWhhbGYgdmVyc2lvbjsKCXV3b3JkIGRlYnVnX2FiYnJldl9vZmZzZXQ7Cgl1Ynl0ZSBwb2ludGVyX3NpemU7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgovKiBmaWVsZCBmaWxsZWQgYXQgcnVuIHRpbWUgYXJlIG1hcmtlZCB3aXRoIC0xICovCnN0YXRpYyBzdHJ1Y3QgZGVidWdfbGluZV9oZWFkZXIgY29uc3QgZGVmYXVsdF9kZWJ1Z19saW5lX2hlYWRlciA9IHsKCS0xLAoJMiwKCS0xLAoJMSwJLyogY291bGQgYmUgYmV0dGVyIHdoZW4gbWluIGluc3RydWN0aW9uIHNpemUgIT0gMSAqLwoJMSwJLyogd2UgZG9uJ3QgdGFrZSBjYXJlIGFib3V0IGJhc2ljIGJsb2NrICovCgktNSwJLyogc2Vuc2libGUgdmFsdWUgZm9yIGxpbmUgYmFzZSAuLi4gKi8KCTE0LCAgICAgLyogLi4uIGFuZCBsaW5lIHJhbmdlIGFyZSBndWVzc2VkIHN0YXRpY2FsbHkgKi8KCURXX0xOU19tYXhfb3Bjb2RlCn07CgpzdGF0aWMgdWJ5dGUgY29uc3Qgc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aFtEV19MTlNfbWF4X29wY29kZSAtIDFdID0KewoJMCwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMQp9OwoKLyogZmllbGQgZmlsbGVkIGF0IHJ1biB0aW1lIGFyZSBtYXJrZWQgd2l0aCAtMSAqLwpzdGF0aWMgc3RydWN0IGNvbXBpbGF0aW9uX3VuaXRfaGVhZGVyIGNvbnN0IGRlZmF1bHRfY29tcF91bml0X2hlYWRlciA9IHsKCS0xLAoJMiwKCTAsICAgICAvKiB3ZSByZXVzZSB0aGUgc2FtZSBhYmJyZXYgZW50cmllcyBmb3IgYWxsIGNvbXAgdW5pdCAqLwoJLTEKfTsKCgpzdGF0aWMgdm9pZCBlbWl0X3V3b3JkKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLCB1d29yZCBkYXRhKQp7CglhZGRfZGF0YShiLCAmZGF0YSwgc2l6ZW9mKHV3b3JkKSk7Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X3N0cmluZyhzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgY2hhciBjb25zdCAqIHMpCnsKCWFkZF9kYXRhKGIsIHMsIHN0cmxlbihzKSArIDEpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF91bnNpZ25lZF9MRUIxMjgoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsCgkJCQkgdW5zaWduZWQgbG9uZyBkYXRhKQp7CglkbyB7CgkJdWJ5dGUgY3VyID0gZGF0YSAmIDB4N0Y7CgkJZGF0YSA+Pj0gNzsKCQlpZiAoZGF0YSkKCQkJY3VyIHw9IDB4ODA7CgkJYWRkX2RhdGEoYiwgJmN1ciwgMSk7Cgl9IHdoaWxlIChkYXRhKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfc2lnbmVkX0xFQjEyOChzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgbG9uZyBkYXRhKQp7CglpbnQgbW9yZSA9IDE7CglpbnQgbmVnYXRpdmUgPSBkYXRhIDwgMDsKCWludCBzaXplID0gc2l6ZW9mKGxvbmcpICogQ0hBUl9CSVQ7Cgl3aGlsZSAobW9yZSkgewoJCXVieXRlIGN1ciA9IGRhdGEgJiAweDdGOwoJCWRhdGEgPj49IDc7CgkJaWYgKG5lZ2F0aXZlKQoJCQlkYXRhIHw9IC0gKDEgPDwgKHNpemUgLSA3KSk7CgkJaWYgKChkYXRhID09IDAgJiYgIShjdXIgJiAweDQwKSkgfHwKCQkgICAgKGRhdGEgPT0gLTFsICYmIChjdXIgJiAweDQwKSkpCgkJCW1vcmUgPSAwOwoJCWVsc2UKCQkJY3VyIHw9IDB4ODA7CgkJYWRkX2RhdGEoYiwgJmN1ciwgMSk7Cgl9Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X2V4dGVuZGVkX29wY29kZShzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgdWJ5dGUgb3Bjb2RlLAoJCQkJIHZvaWQgKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4pCnsKCWFkZF9kYXRhKGIsICIiLCAxKTsKCWVtaXRfdW5zaWduZWRfTEVCMTI4KGIsIGRhdGFfbGVuICsgMSk7CglhZGRfZGF0YShiLCAmb3Bjb2RlLCAxKTsKCWFkZF9kYXRhKGIsIGRhdGEsIGRhdGFfbGVuKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfb3Bjb2RlKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLCB1Ynl0ZSBvcGNvZGUpCnsKCWFkZF9kYXRhKGIsICZvcGNvZGUsIDEpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9vcGNvZGVfc2lnbmVkKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJCQkgICAgICAgdWJ5dGUgb3Bjb2RlLCBsb25nIGRhdGEpCnsKCWFkZF9kYXRhKGIsICZvcGNvZGUsIDEpOwoJZW1pdF9zaWduZWRfTEVCMTI4KGIsIGRhdGEpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9vcGNvZGVfdW5zaWduZWQoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsIHVieXRlIG9wY29kZSwgCgkJCQkgdW5zaWduZWQgbG9uZyBkYXRhKQp7CglhZGRfZGF0YShiLCAmb3Bjb2RlLCAxKTsKCWVtaXRfdW5zaWduZWRfTEVCMTI4KGIsIGRhdGEpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9hZHZhbmNlX3BjKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLCB1bnNpZ25lZCBsb25nIGRlbHRhX3BjKQp7CgllbWl0X29wY29kZV91bnNpZ25lZChiLCBEV19MTlNfYWR2YW5jZV9wYywgZGVsdGFfcGMpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9hZHZhbmNlX2xpbmVubyhzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgbG9uZyBkZWx0YV9saW5lbm8pCnsKCWVtaXRfb3Bjb2RlX3NpZ25lZChiLCBEV19MTlNfYWR2YW5jZV9saW5lLCBkZWx0YV9saW5lbm8pOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9sbmVfZW5kX29mX3NlcXVlbmNlKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiKQp7CgllbWl0X2V4dGVuZGVkX29wY29kZShiLCBEV19MTkVfZW5kX3NlcXVlbmNlLCBOVUxMLCAwKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfc2V0X2ZpbGUoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCnsKCWVtaXRfb3Bjb2RlX3Vuc2lnbmVkKGIsIERXX0xOU19zZXRfZmlsZSwgaW5kZXgpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9sbmVfZGVmaW5lX2ZpbGVuYW1lKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJCQkJICAgICBjaGFyIGNvbnN0ICogZmlsZW5hbWUpCnsKCS8qIGVtaXRfZXh0ZW5kZWRfb3Bjb2RlKCkgY2FuJ3QgYmUgdXNlZCBoZXJlLCB3ZSBoYXZlIGFkZGl0aW9uYWwKCSAqIGRhdGEgdG8gb3V0cHV0IGFuZCB0aGUgbGVuIGZpZWxkIHdpbGwgYmUgbWlzY2FsY3VsYXRlZC4gKi8KCWFkZF9kYXRhKGIsICIiLCAxKTsKCS8qIHN0cmxlbihmaWxlbmFtZSkgKyB6ZXJvIHRlcm1pbmF0b3IgKyBsZW4gZmllbGQgKyAzIGJ5dGVzIGZvciB0aGUgZGlyCgkgKiBlbnRyeSwgdGltZXN0YW1wIGFuZCBmaWxlc2l6ZSAqLwoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgc3RybGVuKGZpbGVuYW1lKSArIDUpOwoJZW1pdF9vcGNvZGUoYiwgRFdfTE5FX2RlZmluZV9maWxlKTsKCWVtaXRfc3RyaW5nKGIsIGZpbGVuYW1lKTsKCWFkZF9kYXRhKGIsICJcMFwwXDAiLCAzKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfbG5lX3NldF9hZGRyZXNzKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJCQkJIHZvaWQgY29uc3QgKiBhZGRyZXNzKQp7CgllbWl0X2V4dGVuZGVkX29wY29kZShiLCBEV19MTkVfc2V0X2FkZHJlc3MsICZhZGRyZXNzLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwp9CgoKc3RhdGljIHVieXRlIGdldF9zcGVjaWFsX29wY29kZShzdHJ1Y3QgZGVidWdfbGluZV9pbmZvIGNvbnN0ICogbGluZSwKCXVuc2lnbmVkIGludCBsYXN0X2xpbmVubywgdW5zaWduZWQgbG9uZyBsYXN0X3ZtYSkKewoJdW5zaWduZWQgaW50IHRlbXA7Cgl1bnNpZ25lZCBsb25nIGRlbHRhX2FkZHI7CgoJLyogU2VlIFRJUyBEV0FSRiBEZWJ1Z2dpbmcgSW5mb3JtYXRpb24gRm9ybWF0IHZlcnNpb24gMi4wIKcgNi4yLjUuMSAqLwoKCXRlbXAgPSAobGluZS0+bGluZW5vIC0gbGFzdF9saW5lbm8pIC0KCQlkZWZhdWx0X2RlYnVnX2xpbmVfaGVhZGVyLmxpbmVfYmFzZTsKCWlmICh0ZW1wID49IGRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIubGluZV9yYW5nZSkKCQlyZXR1cm4gMDsKCglkZWx0YV9hZGRyID0gKGxpbmUtPnZtYSAtIGxhc3Rfdm1hKSAvCgkJZGVmYXVsdF9kZWJ1Z19saW5lX2hlYWRlci5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKCS8qIFRoaXMgaXMgbm90IHN1ZmZpY2llbnQgdG8gZW5zdXJlIG9wY29kZSB3aWxsIGJlIGluIFswLTI1Nl0gYnV0CgkgKiBzdWZmaWNpZW50IHRvIGVuc3VyZSB3aGVuIHN1bW1pbmcgd2l0aCB0aGUgZGVsdGEgbGluZW5vIHdlIHdpbGwKCSAqIG5vdCBvdmVyZmxvdyB0aGUgdW5zaWduZWQgbG9uZyBvcGNvZGUgKi8KCWlmIChkZWx0YV9hZGRyIDw9IDI1NiAvIGRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIubGluZV9yYW5nZSkgewoJCXVuc2lnbmVkIGxvbmcgb3Bjb2RlID0gdGVtcCArCgkJCShkZWx0YV9hZGRyICogZGVmYXVsdF9kZWJ1Z19saW5lX2hlYWRlci5saW5lX3JhbmdlKSArCgkJCWRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIub3Bjb2RlX2Jhc2U7CgoJCXJldHVybiBvcGNvZGUgPD0gMjU1ID8gb3Bjb2RlIDogMDsKCX0KCglyZXR1cm4gMDsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfbGluZW5vX2luZm8oc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsCglzdHJ1Y3QgZGVidWdfbGluZV9pbmZvIGNvbnN0ICogbGluZSwgc2l6ZV90IG5yX2VudHJ5LAoJdW5zaWduZWQgbG9uZyBjb2RlX2FkZHIpCnsKCXNpemVfdCBpOwoKCS8qCgkgKiBNYWNoaW5lIHN0YXRlIGF0IHN0YXJ0IG9mIGEgc3RhdGVtZW50IHByb2dyYW0KCSAqIGFkZHJlc3MgPSAwCgkgKiBmaWxlICAgID0gMQoJICogbGluZSAgICA9IDEKCSAqIGNvbHVtbiAgPSAwCgkgKiBpc19zdG10ID0gZGVmYXVsdF9pc19zdG10IGFzIGdpdmVuIGluIHRoZSBkZWJ1Z19saW5lX2hlYWRlcgoJICogYmFzaWMgYmxvY2sgPSAwCgkgKiBlbmQgc2VxdWVuY2UgPSAwCgkgKi8KCgkvKiBzdGFydCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZSB3ZSB0YWtlIGNhcmUgb2YgKi8KCXVuc2lnbmVkIGxvbmcgbGFzdF92bWEgPSBjb2RlX2FkZHI7Cgl1bnNpZ25lZCBpbnQgbGFzdF9saW5lbm8gPSAxOwoJY2hhciBjb25zdCAgKiBjdXJfZmlsZW5hbWUgPSBOVUxMOwoJdW5zaWduZWQgbG9uZyBjdXJfZmlsZV9pbmRleCA9IDA7CgoJLyogRklYTUU6IHJlbG9jYXRhYmxlIGFkZHJlc3M/ICovCgllbWl0X2xuZV9zZXRfYWRkcmVzcyhiLCAodm9pZCBjb25zdCAqKWNvZGVfYWRkcik7CgllbWl0X2FkdmFuY2VfbGluZW5vKGIsIGxpbmVbMF0ubGluZW5vIC0gbGFzdF9saW5lbm8pOwoJbGFzdF9saW5lbm8gPSBsaW5lWzBdLmxpbmVubzsKCWVtaXRfbG5lX2RlZmluZV9maWxlbmFtZShiLCBsaW5lWzBdLmZpbGVuYW1lKTsKCWN1cl9maWxlbmFtZSA9IGxpbmVbMF0uZmlsZW5hbWU7CgllbWl0X3NldF9maWxlKGIsICsrY3VyX2ZpbGVfaW5kZXgpOwoJZW1pdF9vcGNvZGUoYiwgRFdfTE5TX2NvcHkpOwoJCgoJZm9yIChpID0gMDsgaSA8IG5yX2VudHJ5OyBpKyspIHsKCQlpbnQgbmVlZF9jb3B5ID0gMDsKCQl1Ynl0ZSBzcGVjaWFsX29wY29kZTsKCgkJaWYgKCFjdXJfZmlsZW5hbWUgfHwgc3RyY21wKGN1cl9maWxlbmFtZSwgbGluZVtpXS5maWxlbmFtZSkpIHsKCQkJZW1pdF9sbmVfZGVmaW5lX2ZpbGVuYW1lKGIsIGxpbmVbaV0uZmlsZW5hbWUpOwoJCQljdXJfZmlsZW5hbWUgPSBsaW5lW2ldLmZpbGVuYW1lOwoJCQllbWl0X3NldF9maWxlKGIsICsrY3VyX2ZpbGVfaW5kZXgpOwoJCQluZWVkX2NvcHkgPSAxOwoJCX0KCQlpZiAoKHNwZWNpYWxfb3Bjb2RlID0gZ2V0X3NwZWNpYWxfb3Bjb2RlKCZsaW5lW2ldLAoJCQkJbGFzdF9saW5lbm8sIGxhc3Rfdm1hKSkgIT0gMCkgewoJCQlsYXN0X2xpbmVubyA9IGxpbmVbaV0ubGluZW5vOwoJCQlsYXN0X3ZtYSA9IGxpbmVbaV0udm1hOwoJCQllbWl0X29wY29kZShiLCBzcGVjaWFsX29wY29kZSk7CgkJfSBlbHNlIHsKCQkJaWYgKGxhc3RfbGluZW5vICE9IGxpbmVbaV0ubGluZW5vKSB7CgkJCQllbWl0X2FkdmFuY2VfbGluZW5vKGIsCgkJCQkJbGluZVtpXS5saW5lbm8gLSBsYXN0X2xpbmVubyk7CgkJCQlsYXN0X2xpbmVubyA9IGxpbmVbaV0ubGluZW5vOwoJCQkJbmVlZF9jb3B5ID0gMTsKCQkJfQoJCQlpZiAobGFzdF92bWEgIT0gbGluZVtpXS52bWEpIHsKCQkJCWVtaXRfYWR2YW5jZV9wYyhiLCBsaW5lW2ldLnZtYSAtIGxhc3Rfdm1hKTsKCQkJCWxhc3Rfdm1hID0gbGluZVtpXS52bWE7CgkJCQluZWVkX2NvcHkgPSAxOwoJCQl9CgkJCWlmIChuZWVkX2NvcHkpCgkJCQllbWl0X29wY29kZShiLCBEV19MTlNfY29weSk7CgkJfQoJfQp9CgoKc3RhdGljIHZvaWQgYWRkX2RlYnVnX2xpbmUoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsCglzdHJ1Y3QgZGVidWdfbGluZV9pbmZvIGNvbnN0ICogbGluZSwgc2l6ZV90IG5yX2VudHJ5LAoJdW5zaWduZWQgbG9uZyBjb2RlX2FkZHIpCnsKCXN0cnVjdCBkZWJ1Z19saW5lX2hlYWRlciAqIGRiZ19oZWFkZXI7CglzaXplX3Qgb2xkX3NpemU7CgoJb2xkX3NpemUgPSBiLT5zaXplOwoKCWFkZF9kYXRhKGIsICZkZWZhdWx0X2RlYnVnX2xpbmVfaGVhZGVyLAoJCSBzaXplb2YoZGVmYXVsdF9kZWJ1Z19saW5lX2hlYWRlcikpOwoJYWRkX2RhdGEoYiwgJnN0YW5kYXJkX29wY29kZV9sZW5ndGgsICBzaXplb2Yoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aCkpOwoKCS8vIGVtcHR5IGRpcmVjdG9yeSBlbnRyeQoJYWRkX2RhdGEoYiwgIiIsIDEpOwoKCS8vIGVtcHR5IGZpbGVuYW1lIGRpcmVjdG9yeQoJYWRkX2RhdGEoYiwgIiIsIDEpOwoKCWRiZ19oZWFkZXIgPSBiLT5wICsgb2xkX3NpemU7CglkYmdfaGVhZGVyLT5wcm9sb2dfbGVuZ3RoID0gKGItPnNpemUgLSBvbGRfc2l6ZSkgLQoJCW9mZnNldG9mKHN0cnVjdCBkZWJ1Z19saW5lX2hlYWRlciwgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgpOwoKCWVtaXRfbGluZW5vX2luZm8oYiwgbGluZSwgbnJfZW50cnksIGNvZGVfYWRkcik7CgoJZW1pdF9sbmVfZW5kX29mX3NlcXVlbmNlKGIpOwoKCWRiZ19oZWFkZXIgPSBiLT5wICsgb2xkX3NpemU7CglkYmdfaGVhZGVyLT50b3RhbF9sZW5ndGggPSAoYi0+c2l6ZSAtIG9sZF9zaXplKSAtCgkJb2Zmc2V0b2Yoc3RydWN0IGRlYnVnX2xpbmVfaGVhZGVyLCB2ZXJzaW9uKTsKfQoKCnN0YXRpYyB2b2lkIGFkZF9jb21waWxhdGlvbl91bml0KHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJCQkJIHNpemVfdCBvZmZzZXRfZGVidWdfbGluZSkKewoJc3RydWN0IGNvbXBpbGF0aW9uX3VuaXRfaGVhZGVyICogY29tcF91bml0X2hlYWRlcjsKCglzaXplX3Qgb2xkX3NpemUgPSBiLT5zaXplOwoKCWFkZF9kYXRhKGIsICZkZWZhdWx0X2NvbXBfdW5pdF9oZWFkZXIsCgkJIHNpemVvZihkZWZhdWx0X2NvbXBfdW5pdF9oZWFkZXIpKTsKCgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCAxKTsKCWVtaXRfdXdvcmQoYiwgb2Zmc2V0X2RlYnVnX2xpbmUpOwoKCWNvbXBfdW5pdF9oZWFkZXIgPSBiLT5wICsgb2xkX3NpemU7Cgljb21wX3VuaXRfaGVhZGVyLT50b3RhbF9sZW5ndGggPSAoYi0+c2l6ZSAtIG9sZF9zaXplKSAtCgkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBpbGF0aW9uX3VuaXRfaGVhZGVyLCB2ZXJzaW9uKTsKCWNvbXBfdW5pdF9oZWFkZXItPnBvaW50ZXJfc2l6ZSA9IHNpemVvZih2b2lkICopOwp9CgoKc3RhdGljIHZvaWQgY3JlYXRlX2RlYnVnX2FiYnJldihzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYikKewoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgMSk7CgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCBEV19UQUdfY29tcGlsZV91bml0KTsKCWVtaXRfdW5zaWduZWRfTEVCMTI4KGIsIERXX0NISUxEUkVOX3llcyk7CgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCBEV19BVF9zdG10X2xpc3QpOwoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgRFdfRk9STV9kYXRhNCk7CgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCAwKTsKfQoKc3RhdGljIHN0cnVjdCBncm93YWJsZV9idWZmZXIgYl9saW5lOwpzdGF0aWMgc3RydWN0IGdyb3dhYmxlX2J1ZmZlciBiX2RlYnVnX2luZm87CnN0YXRpYyBzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyIGJfZGVidWdfYWJicmV2OwoKaW50IGluaXRfZGVidWdfbGluZV9pbmZvKGJmZCAqIGFiZmQpCnsKCWFzZWN0aW9uICogbGluZV9zZWN0aW9uLCAqIGRlYnVnX2luZm8sICogZGVidWdfYWJicmV2OwoJc3RydWN0IGppdGVudHJ5X2RlYnVnX2xpbmUgKiBkZWJ1Z19saW5lOwoKCWluaXRfYnVmZmVyKCZiX2xpbmUpOwoJaW5pdF9idWZmZXIoJmJfZGVidWdfaW5mbyk7Cglpbml0X2J1ZmZlcigmYl9kZWJ1Z19hYmJyZXYpOwoKCWZvciAoZGVidWdfbGluZSA9IGppdGVudHJ5X2RlYnVnX2xpbmVfbGlzdDsKCSAgICAgZGVidWdfbGluZTsKCSAgICAgZGVidWdfbGluZSA9IGRlYnVnX2xpbmUtPm5leHQpIHsKCQlzdHJ1Y3QganJfY29kZV9kZWJ1Z19pbmZvIGNvbnN0ICogcmVjID0gZGVidWdfbGluZS0+ZGF0YTsKCQlpZiAocmVjLT5ucl9lbnRyeSkgewoJCQlzaXplX3QgaTsKCQkJdm9pZCBjb25zdCAqIGRhdGEgPSByZWMgKyAxOwoJCQlzdHJ1Y3QgZGVidWdfbGluZV9pbmZvICogZGJnX2xpbmUgPQoJCQkJeG1hbGxvYyhyZWMtPm5yX2VudHJ5ICoKCQkJCQlzaXplb2Yoc3RydWN0IGRlYnVnX2xpbmVfaW5mbykpOwoJCQlmb3IgKGkgPSAwOyBpIDwgcmVjLT5ucl9lbnRyeTsgKytpKSB7CgkJCQlkYmdfbGluZVtpXS52bWEgPSAqKHVuc2lnbmVkIGxvbmcgKilkYXRhOwoJCQkJZGF0YSArPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CgkJCQlkYmdfbGluZVtpXS5saW5lbm8gPSAqKHVuc2lnbmVkIGludCAqKWRhdGE7CgkJCQlkYXRhICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOwoJCQkJZGJnX2xpbmVbaV0uZmlsZW5hbWUgPSBkYXRhOwoJCQkJZGF0YSArPSBzdHJsZW4oZGF0YSkgKyAxOwoJCQl9CgoJCQlhZGRfY29tcGlsYXRpb25fdW5pdCgmYl9kZWJ1Z19pbmZvLCBiX2xpbmUuc2l6ZSk7CgkJCWFkZF9kZWJ1Z19saW5lKCZiX2xpbmUsIGRiZ19saW5lLAoJCQkJICAgICAgIHJlYy0+bnJfZW50cnksIHJlYy0+Y29kZV9hZGRyKTsKCQkJY3JlYXRlX2RlYnVnX2FiYnJldigmYl9kZWJ1Z19hYmJyZXYpOwoKCQkJZnJlZShkYmdfbGluZSk7CgkJfQoJfQoJCglsaW5lX3NlY3Rpb24gPSBjcmVhdGVfc2VjdGlvbihhYmZkLCAiLmRlYnVnX2xpbmUiLCBiX2xpbmUuc2l6ZSwgMCwKCQlTRUNfSEFTX0NPTlRFTlRTfFNFQ19SRUFET05MWXxTRUNfREVCVUdHSU5HKTsKCWlmICghbGluZV9zZWN0aW9uKQoJCXJldHVybiAtMTsKCglkZWJ1Z19pbmZvID0gY3JlYXRlX3NlY3Rpb24oYWJmZCwgIi5kZWJ1Z19pbmZvIiwgYl9kZWJ1Z19pbmZvLnNpemUsIDAsCgkJU0VDX0hBU19DT05URU5UU3xTRUNfUkVBRE9OTFl8U0VDX0RFQlVHR0lORyk7CiAJaWYgKCFkZWJ1Z19pbmZvKQoJCXJldHVybiAtMTsKCglkZWJ1Z19hYmJyZXYgPSBjcmVhdGVfc2VjdGlvbihhYmZkLCAiLmRlYnVnX2FiYnJldiIsCgkJYl9kZWJ1Z19hYmJyZXYuc2l6ZSwgMCwKCQlTRUNfSEFTX0NPTlRFTlRTfFNFQ19SRUFET05MWXxTRUNfREVCVUdHSU5HKTsKCWlmICghZGVidWdfYWJicmV2KQoJCXJldHVybiAtMTsKCglyZXR1cm4gMDsKfQoKCmludCBmaW5hbGl6ZV9kZWJ1Z19saW5lX2luZm8oYmZkICogYWJmZCkKewoJYXNlY3Rpb24gKiBsaW5lX3NlY3Rpb24sICogZGVidWdfaW5mbywgKiBkZWJ1Z19hYmJyZXY7CgoJbGluZV9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoYWJmZCwgIi5kZWJ1Z19saW5lIik7CglpZiAoIWxpbmVfc2VjdGlvbikKCQlyZXR1cm4gLTE7CgoJZGVidWdfaW5mbyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGFiZmQsICIuZGVidWdfaW5mbyIpOwogCWlmICghZGVidWdfaW5mbykKCQlyZXR1cm4gLTE7CgoKCWRlYnVnX2FiYnJldiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGFiZmQsICIuZGVidWdfYWJicmV2Iik7CglpZiAoIWRlYnVnX2FiYnJldikKCQlyZXR1cm4gLTE7CgoJZmlsbF9zZWN0aW9uX2NvbnRlbnQoYWJmZCwgbGluZV9zZWN0aW9uLCBiX2xpbmUucCwgMCwgYl9saW5lLnNpemUpOwoJZmlsbF9zZWN0aW9uX2NvbnRlbnQoYWJmZCwgZGVidWdfaW5mbywgYl9kZWJ1Z19pbmZvLnAsCgkJCSAgICAgMCwgYl9kZWJ1Z19pbmZvLnNpemUpOwoJZmlsbF9zZWN0aW9uX2NvbnRlbnQoYWJmZCwgZGVidWdfYWJicmV2LCBiX2RlYnVnX2FiYnJldi5wLCAwLAoJCQkgICAgIGJfZGVidWdfYWJicmV2LnNpemUpOwoKCglmcmVlX2J1ZmZlcigmYl9saW5lKTsKCWZyZWVfYnVmZmVyKCZiX2RlYnVnX2luZm8pOwoJZnJlZV9idWZmZXIoJmJfZGVidWdfYWJicmV2KTsKCglyZXR1cm4gMDsKfQo=