LyogdjNfcGNpLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KLyogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0CiAqIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykKICovCi8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSAiY3J5cHRsaWIuaCIKI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgojaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KCnN0YXRpYyBpbnQgaTJyX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpleHQsCglCSU8gKm91dCwgaW50IGluZGVudCk7CnN0YXRpYyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpyMmlfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCglYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Cgpjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wY2kgPQoJeyBOSURfcHJveHlDZXJ0SW5mbywgMCwgQVNOMV9JVEVNX3JlZihQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKSwKCSAgMCwwLDAsMCwKCSAgMCwwLAoJICBOVUxMLCBOVUxMLAoJICAoWDUwOVYzX0VYVF9JMlIpaTJyX3BjaSwKCSAgKFg1MDlWM19FWFRfUjJJKXIyaV9wY2ksCgkgIE5VTEwsCgl9OwoKc3RhdGljIGludCBpMnJfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSwKCUJJTyAqb3V0LCBpbnQgaW5kZW50KQoJewoJQklPX3ByaW50ZihvdXQsICIlKnNQYXRoIExlbmd0aCBDb25zdHJhaW50OiAiLCBpbmRlbnQsICIiKTsKCWlmIChwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpCgkgIGkyYV9BU04xX0lOVEVHRVIob3V0LCBwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpOwoJZWxzZQoJICBCSU9fcHJpbnRmKG91dCwgImluZmluaXRlIik7CglCSU9fcHV0cyhvdXQsICJcbiIpOwoJQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgTGFuZ3VhZ2U6ICIsIGluZGVudCwgIiIpOwoJaTJhX0FTTjFfT0JKRUNUKG91dCwgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpOwoJQklPX3B1dHMob3V0LCAiXG4iKTsKCWlmIChwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgJiYgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKQoJICBCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeSBUZXh0OiAlc1xuIiwgaW5kZW50LCAiIiwKCQkgICAgIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeS0+ZGF0YSk7CglyZXR1cm4gMTsKCX0KCnN0YXRpYyBpbnQgcHJvY2Vzc19wY2lfdmFsdWUoQ09ORl9WQUxVRSAqdmFsLAoJQVNOMV9PQkpFQ1QgKipsYW5ndWFnZSwgQVNOMV9JTlRFR0VSICoqcGF0aGxlbiwKCUFTTjFfT0NURVRfU1RSSU5HICoqcG9saWN5KQoJewoJaW50IGZyZWVfcG9saWN5ID0gMDsKCglpZiAoc3RyY21wKHZhbC0+bmFtZSwgImxhbmd1YWdlIikgPT0gMCkKCQl7CgkJaWYgKCpsYW5ndWFnZSkKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFRZX0RFRklORUQpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQlpZiAoISgqbGFuZ3VhZ2UgPSBPQkpfdHh0Mm9iaih2YWwtPnZhbHVlLCAwKSkpCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQl9CgllbHNlIGlmIChzdHJjbXAodmFsLT5uYW1lLCAicGF0aGxlbiIpID09IDApCgkJewoJCWlmICgqcGF0aGxlbikKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFRZX0RFRklORUQpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQlpZiAoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgcGF0aGxlbikpCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSCk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlyZXR1cm4gMDsKCQkJfQoJCX0KCWVsc2UgaWYgKHN0cmNtcCh2YWwtPm5hbWUsICJwb2xpY3kiKSA9PSAwKQoJCXsKCQl1bnNpZ25lZCBjaGFyICp0bXBfZGF0YSA9IE5VTEw7CgkJbG9uZyB2YWxfbGVuOwoJCWlmICghKnBvbGljeSkKCQkJewoJCQkqcG9saWN5ID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7CgkJCWlmICghKnBvbGljeSkKCQkJCXsKCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCXJldHVybiAwOwoJCQkJfQoJCQlmcmVlX3BvbGljeSA9IDE7CgkJCX0KCQlpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAiaGV4OiIsIDQpID09IDApCgkJCXsKCQkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEyID0KCQkJCXN0cmluZ190b19oZXgodmFsLT52YWx1ZSArIDQsICZ2YWxfbGVuKTsKCgkJCWlmICghdG1wX2RhdGEyKSAKCQkJCXsKCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxYNTA5VjNfUl9JTExFR0FMX0hFWF9ESUdJVCk7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoKCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAoJCQkJKCpwb2xpY3kpLT5sZW5ndGggKyB2YWxfbGVuICsgMSk7CgkJCWlmICh0bXBfZGF0YSkKCQkJCXsKCQkJCSgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOwoJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAoJCQkJCXRtcF9kYXRhMiwgdmFsX2xlbik7CgkJCQkoKnBvbGljeSktPmxlbmd0aCArPSB2YWxfbGVuOwoJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CgkJCQl9CgkJCWVsc2UKCQkJCXsKCQkJCU9QRU5TU0xfZnJlZSh0bXBfZGF0YTIpOwoJCQkJLyogcmVhbGxvYyBmYWlsdXJlIGltcGxpZXMgdGhlIG9yaWdpbmFsIGRhdGEgc3BhY2UgaXMgYjBya2VkIHRvbyEgKi8KCQkJCSgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CgkJCQkoKnBvbGljeSktPmxlbmd0aCA9IDA7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwoJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJT1BFTlNTTF9mcmVlKHRtcF9kYXRhMik7CgkJCX0KCQllbHNlIGlmIChzdHJuY21wKHZhbC0+dmFsdWUsICJmaWxlOiIsIDUpID09IDApCgkJCXsKCQkJdW5zaWduZWQgY2hhciBidWZbMjA0OF07CgkJCWludCBuOwoJCQlCSU8gKmIgPSBCSU9fbmV3X2ZpbGUodmFsLT52YWx1ZSArIDUsICJyIik7CgkJCWlmICghYikKCQkJCXsKCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9CSU9fTElCKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCXdoaWxlKChuID0gQklPX3JlYWQoYiwgYnVmLCBzaXplb2YoYnVmKSkpID4gMAoJCQkJfHwgKG4gPT0gMCAmJiBCSU9fc2hvdWxkX3JldHJ5KGIpKSkKCQkJCXsKCQkJCWlmICghbikgY29udGludWU7CgoJCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAoJCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgbiArIDEpOwoKCQkJCWlmICghdG1wX2RhdGEpCgkJCQkJYnJlYWs7CgoJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CgkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCgkJCQkJYnVmLCBuKTsKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IG47CgkJCQkoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdID0gJ1wwJzsKCQkJCX0KCQkJQklPX2ZyZWVfYWxsKGIpOwoKCQkJaWYgKG4gPCAwKQoJCQkJewoJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLEVSUl9SX0JJT19MSUIpOwoJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJfQoJCWVsc2UgaWYgKHN0cm5jbXAodmFsLT52YWx1ZSwgInRleHQ6IiwgNSkgPT0gMCkKCQkJewoJCQl2YWxfbGVuID0gc3RybGVuKHZhbC0+dmFsdWUgKyA1KTsKCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAoJCQkJKCpwb2xpY3kpLT5sZW5ndGggKyB2YWxfbGVuICsgMSk7CgkJCWlmICh0bXBfZGF0YSkKCQkJCXsKCQkJCSgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOwoJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAoJCQkJCXZhbC0+dmFsdWUgKyA1LCB2YWxfbGVuKTsKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IHZhbF9sZW47CgkJCQkoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdID0gJ1wwJzsKCQkJCX0KCQkJZWxzZQoJCQkJewoJCQkJLyogcmVhbGxvYyBmYWlsdXJlIGltcGxpZXMgdGhlIG9yaWdpbmFsIGRhdGEgc3BhY2UgaXMgYjBya2VkIHRvbyEgKi8KCQkJCSgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CgkJCQkoKnBvbGljeSktPmxlbmd0aCA9IDA7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwoJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJfQoJCWVsc2UKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHKTsKCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCWdvdG8gZXJyOwoJCQl9CgkJaWYgKCF0bXBfZGF0YSkKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJZ290byBlcnI7CgkJCX0KCQl9CglyZXR1cm4gMTsKZXJyOgoJaWYgKGZyZWVfcG9saWN5KQoJCXsKCQlBU04xX09DVEVUX1NUUklOR19mcmVlKCpwb2xpY3kpOwoJCSpwb2xpY3kgPSBOVUxMOwoJCX0KCXJldHVybiAwOwoJfQoKc3RhdGljIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnIyaV9wY2koWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKCVg1MDlWM19DVFggKmN0eCwgY2hhciAqdmFsdWUpCgl7CglQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpwY2kgPSBOVUxMOwoJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHM7CglBU04xX09CSkVDVCAqbGFuZ3VhZ2UgPSBOVUxMOwoJQVNOMV9JTlRFR0VSICpwYXRobGVuID0gTlVMTDsKCUFTTjFfT0NURVRfU1RSSU5HICpwb2xpY3kgPSBOVUxMOwoJaW50IGksIGo7CgoJdmFscyA9IFg1MDlWM19wYXJzZV9saXN0KHZhbHVlKTsKCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWxzKTsgaSsrKQoJCXsKCQlDT05GX1ZBTFVFICpjbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwoJCWlmICghY25mLT5uYW1lIHx8ICgqY25mLT5uYW1lICE9ICdAJyAmJiAhY25mLT52YWx1ZSkpCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORyk7CgkJCVg1MDlWM19jb25mX2VycihjbmYpOwoJCQlnb3RvIGVycjsKCQkJfQoJCWlmICgqY25mLT5uYW1lID09ICdAJykKCQkJewoJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqc2VjdDsKCQkJaW50IHN1Y2Nlc3NfcCA9IDE7CgoJCQlzZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgY25mLT5uYW1lICsgMSk7CgkJCWlmICghc2VjdCkKCQkJCXsKCQkJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CgkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoJCQlmb3IgKGogPSAwOyBzdWNjZXNzX3AgJiYgaiA8IHNrX0NPTkZfVkFMVUVfbnVtKHNlY3QpOyBqKyspCgkJCQl7CgkJCQlzdWNjZXNzX3AgPQoJCQkJCXByb2Nlc3NfcGNpX3ZhbHVlKHNrX0NPTkZfVkFMVUVfdmFsdWUoc2VjdCwgaiksCgkJCQkJCSZsYW5ndWFnZSwgJnBhdGhsZW4sICZwb2xpY3kpOwoJCQkJfQoJCQlYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgc2VjdCk7CgkJCWlmICghc3VjY2Vzc19wKQoJCQkJZ290byBlcnI7CgkJCX0KCQllbHNlCgkJCXsKCQkJaWYgKCFwcm9jZXNzX3BjaV92YWx1ZShjbmYsCgkJCQkJJmxhbmd1YWdlLCAmcGF0aGxlbiwgJnBvbGljeSkpCgkJCQl7CgkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoJCQl9CgkJfQoKCS8qIExhbmd1YWdlIGlzIG1hbmRhdG9yeSAqLwoJaWYgKCFsYW5ndWFnZSkKCQl7CgkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CgkJZ290byBlcnI7CgkJfQoJaSA9IE9CSl9vYmoybmlkKGxhbmd1YWdlKTsKCWlmICgoaSA9PSBOSURfSW5kZXBlbmRlbnQgfHwgaSA9PSBOSURfaWRfcHBsX2luaGVyaXRBbGwpICYmIHBvbGljeSkKCQl7CgkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZKTsKCQlnb3RvIGVycjsKCQl9CgoJcGNpID0gUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTl9uZXcoKTsKCWlmICghcGNpKQoJCXsKCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CgkJZ290byBlcnI7CgkJfQoKCXBjaS0+cHJveHlQb2xpY3ktPnBvbGljeUxhbmd1YWdlID0gbGFuZ3VhZ2U7IGxhbmd1YWdlID0gTlVMTDsKCXBjaS0+cHJveHlQb2xpY3ktPnBvbGljeSA9IHBvbGljeTsgcG9saWN5ID0gTlVMTDsKCXBjaS0+cGNQYXRoTGVuZ3RoQ29uc3RyYWludCA9IHBhdGhsZW47IHBhdGhsZW4gPSBOVUxMOwoJZ290byBlbmQ7CmVycjoKCWlmIChsYW5ndWFnZSkgeyBBU04xX09CSkVDVF9mcmVlKGxhbmd1YWdlKTsgbGFuZ3VhZ2UgPSBOVUxMOyB9CglpZiAocGF0aGxlbikgeyBBU04xX0lOVEVHRVJfZnJlZShwYXRobGVuKTsgcGF0aGxlbiA9IE5VTEw7IH0KCWlmIChwb2xpY3kpIHsgQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShwb2xpY3kpOyBwb2xpY3kgPSBOVUxMOyB9CglpZiAocGNpKSB7IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fZnJlZShwY2kpOyBwY2kgPSBOVUxMOyB9CmVuZDoKCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUodmFscywgWDUwOVYzX2NvbmZfZnJlZSk7CglyZXR1cm4gcGNpOwoJfQo=