LyogdjNfcGNpLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KLyogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0CiAqIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykKICovCi8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgojaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgojaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KCgpzdGF0aWMgaW50IGkycl9wY2koWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqZXh0LAoJQklPICpvdXQsIGludCBpbmRlbnQpOwpzdGF0aWMgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcjJpX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAoJWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpOwoKY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfcGNpID0KCXsgTklEX3Byb3h5Q2VydEluZm8sIDAsIEFTTjFfSVRFTV9yZWYoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiksCgkgIDAsMCwwLDAsCgkgIDAsMCwKCSAgTlVMTCwgTlVMTCwKCSAgKFg1MDlWM19FWFRfSTJSKWkycl9wY2ksCgkgIChYNTA5VjNfRVhUX1IySSlyMmlfcGNpLAoJICBOVUxMLAoJfTsKCnN0YXRpYyBpbnQgaTJyX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpwY2ksCglCSU8gKm91dCwgaW50IGluZGVudCkKCXsKCUJJT19wcmludGYob3V0LCAiJSpzUGF0aCBMZW5ndGggQ29uc3RyYWludDogIiwgaW5kZW50LCAiIik7CglpZiAocGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KQoJICBpMmFfQVNOMV9JTlRFR0VSKG91dCwgcGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KTsKCWVsc2UKCSAgQklPX3ByaW50ZihvdXQsICJpbmZpbml0ZSIpOwoJQklPX3B1dHMob3V0LCAiXG4iKTsKCUJJT19wcmludGYob3V0LCAiJSpzUG9saWN5IExhbmd1YWdlOiAiLCBpbmRlbnQsICIiKTsKCWkyYV9BU04xX09CSkVDVChvdXQsIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeUxhbmd1YWdlKTsKCUJJT19wdXRzKG91dCwgIlxuIik7CglpZiAocGNpLT5wcm94eVBvbGljeS0+cG9saWN5ICYmIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeS0+ZGF0YSkKCSAgQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgVGV4dDogJXNcbiIsIGluZGVudCwgIiIsCgkJICAgICBwY2ktPnByb3h5UG9saWN5LT5wb2xpY3ktPmRhdGEpOwoJcmV0dXJuIDE7Cgl9CgpzdGF0aWMgaW50IHByb2Nlc3NfcGNpX3ZhbHVlKENPTkZfVkFMVUUgKnZhbCwKCUFTTjFfT0JKRUNUICoqbGFuZ3VhZ2UsIEFTTjFfSU5URUdFUiAqKnBhdGhsZW4sCglBU04xX09DVEVUX1NUUklORyAqKnBvbGljeSkKCXsKCWludCBmcmVlX3BvbGljeSA9IDA7CgoJaWYgKHN0cmNtcCh2YWwtPm5hbWUsICJsYW5ndWFnZSIpID09IDApCgkJewoJCWlmICgqbGFuZ3VhZ2UpCgkJCXsKCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRCk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlyZXR1cm4gMDsKCQkJfQoJCWlmICghKCpsYW5ndWFnZSA9IE9CSl90eHQyb2JqKHZhbC0+dmFsdWUsIDApKSkKCQkJewoJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCXJldHVybiAwOwoJCQl9CgkJfQoJZWxzZSBpZiAoc3RyY21wKHZhbC0+bmFtZSwgInBhdGhsZW4iKSA9PSAwKQoJCXsKCQlpZiAoKnBhdGhsZW4pCgkJCXsKCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRCk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlyZXR1cm4gMDsKCQkJfQoJCWlmICghWDUwOVYzX2dldF92YWx1ZV9pbnQodmFsLCBwYXRobGVuKSkKCQkJewoJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEgpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQl9CgllbHNlIGlmIChzdHJjbXAodmFsLT5uYW1lLCAicG9saWN5IikgPT0gMCkKCQl7CgkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEgPSBOVUxMOwoJCWxvbmcgdmFsX2xlbjsKCQlpZiAoISpwb2xpY3kpCgkJCXsKCQkJKnBvbGljeSA9IEFTTjFfT0NURVRfU1RSSU5HX25ldygpOwoJCQlpZiAoISpwb2xpY3kpCgkJCQl7CgkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCXJldHVybiAwOwoJCQkJfQoJCQlmcmVlX3BvbGljeSA9IDE7CgkJCX0KCQlpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAiaGV4OiIsIDQpID09IDApCgkJCXsKCQkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEyID0KCQkJCXN0cmluZ190b19oZXgodmFsLT52YWx1ZSArIDQsICZ2YWxfbGVuKTsKCgkJCWlmICghdG1wX2RhdGEyKSAKCQkJCXsKCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgoJCQl0bXBfZGF0YSA9IE9QRU5TU0xfcmVhbGxvYygoKnBvbGljeSktPmRhdGEsCgkJCQkoKnBvbGljeSktPmxlbmd0aCArIHZhbF9sZW4gKyAxKTsKCQkJaWYgKHRtcF9kYXRhKQoJCQkJewoJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CgkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCgkJCQkJdG1wX2RhdGEyLCB2YWxfbGVuKTsKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IHZhbF9sZW47CgkJCQkoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdID0gJ1wwJzsKCQkJCX0KCQkJZWxzZQoJCQkJewoJCQkJT1BFTlNTTF9mcmVlKHRtcF9kYXRhMik7CgkJCQkvKiByZWFsbG9jIGZhaWx1cmUgaW1wbGllcyB0aGUgb3JpZ2luYWwgZGF0YSBzcGFjZSBpcyBiMHJrZWQgdG9vISAqLwoJCQkJKCpwb2xpY3kpLT5kYXRhID0gTlVMTDsKCQkJCSgqcG9saWN5KS0+bGVuZ3RoID0gMDsKCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCU9QRU5TU0xfZnJlZSh0bXBfZGF0YTIpOwoJCQl9CgkJZWxzZSBpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAiZmlsZToiLCA1KSA9PSAwKQoJCQl7CgkJCXVuc2lnbmVkIGNoYXIgYnVmWzIwNDhdOwoJCQlpbnQgbjsKCQkJQklPICpiID0gQklPX25ld19maWxlKHZhbC0+dmFsdWUgKyA1LCAiciIpOwoJCQlpZiAoIWIpCgkJCQl7CgkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9CSU9fTElCKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCXdoaWxlKChuID0gQklPX3JlYWQoYiwgYnVmLCBzaXplb2YoYnVmKSkpID4gMAoJCQkJfHwgKG4gPT0gMCAmJiBCSU9fc2hvdWxkX3JldHJ5KGIpKSkKCQkJCXsKCQkJCWlmICghbikgY29udGludWU7CgoJCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAoJCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgbiArIDEpOwoKCQkJCWlmICghdG1wX2RhdGEpCgkJCQkJYnJlYWs7CgoJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CgkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCgkJCQkJYnVmLCBuKTsKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IG47CgkJCQkoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdID0gJ1wwJzsKCQkJCX0KCQkJQklPX2ZyZWVfYWxsKGIpOwoKCQkJaWYgKG4gPCAwKQoJCQkJewoJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfQklPX0xJQik7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoJCQl9CgkJZWxzZSBpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAidGV4dDoiLCA1KSA9PSAwKQoJCQl7CgkJCXZhbF9sZW4gPSBzdHJsZW4odmFsLT52YWx1ZSArIDUpOwoJCQl0bXBfZGF0YSA9IE9QRU5TU0xfcmVhbGxvYygoKnBvbGljeSktPmRhdGEsCgkJCQkoKnBvbGljeSktPmxlbmd0aCArIHZhbF9sZW4gKyAxKTsKCQkJaWYgKHRtcF9kYXRhKQoJCQkJewoJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CgkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCgkJCQkJdmFsLT52YWx1ZSArIDUsIHZhbF9sZW4pOwoJCQkJKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKCQkJCSgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOwoJCQkJfQoJCQllbHNlCgkJCQl7CgkJCQkvKiByZWFsbG9jIGZhaWx1cmUgaW1wbGllcyB0aGUgb3JpZ2luYWwgZGF0YSBzcGFjZSBpcyBiMHJrZWQgdG9vISAqLwoJCQkJKCpwb2xpY3kpLT5kYXRhID0gTlVMTDsKCQkJCSgqcG9saWN5KS0+bGVuZ3RoID0gMDsKCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCX0KCQllbHNlCgkJCXsKCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHKTsKCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCWdvdG8gZXJyOwoJCQl9CgkJaWYgKCF0bXBfZGF0YSkKCQkJewoJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlnb3RvIGVycjsKCQkJfQoJCX0KCXJldHVybiAxOwplcnI6CglpZiAoZnJlZV9wb2xpY3kpCgkJewoJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUoKnBvbGljeSk7CgkJKnBvbGljeSA9IE5VTEw7CgkJfQoJcmV0dXJuIDA7Cgl9CgpzdGF0aWMgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcjJpX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAoJWDUwOVYzX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSkKCXsKCVBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSA9IE5VTEw7CglTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsczsKCUFTTjFfT0JKRUNUICpsYW5ndWFnZSA9IE5VTEw7CglBU04xX0lOVEVHRVIgKnBhdGhsZW4gPSBOVUxMOwoJQVNOMV9PQ1RFVF9TVFJJTkcgKnBvbGljeSA9IE5VTEw7CglzaXplX3QgaSwgajsKCWludCBuaWQ7CgoJdmFscyA9IFg1MDlWM19wYXJzZV9saXN0KHZhbHVlKTsKCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWxzKTsgaSsrKQoJCXsKCQlDT05GX1ZBTFVFICpjbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwoJCWlmICghY25mLT5uYW1lIHx8ICgqY25mLT5uYW1lICE9ICdAJyAmJiAhY25mLT52YWx1ZSkpCgkJCXsKCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CgkJCWdvdG8gZXJyOwoJCQl9CgkJaWYgKCpjbmYtPm5hbWUgPT0gJ0AnKQoJCQl7CgkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0OwoJCQlpbnQgc3VjY2Vzc19wID0gMTsKCgkJCXNlY3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPm5hbWUgKyAxKTsKCQkJaWYgKCFzZWN0KQoJCQkJewoJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOwoJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJZm9yIChqID0gMDsgc3VjY2Vzc19wICYmIGogPCBza19DT05GX1ZBTFVFX251bShzZWN0KTsgaisrKQoJCQkJewoJCQkJc3VjY2Vzc19wID0KCQkJCQlwcm9jZXNzX3BjaV92YWx1ZShza19DT05GX1ZBTFVFX3ZhbHVlKHNlY3QsIGopLAoJCQkJCQkmbGFuZ3VhZ2UsICZwYXRobGVuLCAmcG9saWN5KTsKCQkJCX0KCQkJWDUwOVYzX3NlY3Rpb25fZnJlZShjdHgsIHNlY3QpOwoJCQlpZiAoIXN1Y2Nlc3NfcCkKCQkJCWdvdG8gZXJyOwoJCQl9CgkJZWxzZQoJCQl7CgkJCWlmICghcHJvY2Vzc19wY2lfdmFsdWUoY25mLAoJCQkJCSZsYW5ndWFnZSwgJnBhdGhsZW4sICZwb2xpY3kpKQoJCQkJewoJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJfQoJCX0KCgkvKiBMYW5ndWFnZSBpcyBtYW5kYXRvcnkgKi8KCWlmICghbGFuZ3VhZ2UpCgkJewoJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CgkJZ290byBlcnI7CgkJfQoJbmlkID0gT0JKX29iajJuaWQobGFuZ3VhZ2UpOwoJaWYgKChuaWQgPT0gTklEX0luZGVwZW5kZW50IHx8IG5pZCA9PSBOSURfaWRfcHBsX2luaGVyaXRBbGwpICYmIHBvbGljeSkKCQl7CgkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kpOwoJCWdvdG8gZXJyOwoJCX0KCglwY2kgPSBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX25ldygpOwoJaWYgKCFwY2kpCgkJewoJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwoJCWdvdG8gZXJyOwoJCX0KCglwY2ktPnByb3h5UG9saWN5LT5wb2xpY3lMYW5ndWFnZSA9IGxhbmd1YWdlOyBsYW5ndWFnZSA9IE5VTEw7CglwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgPSBwb2xpY3k7IHBvbGljeSA9IE5VTEw7CglwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQgPSBwYXRobGVuOyBwYXRobGVuID0gTlVMTDsKCWdvdG8gZW5kOwplcnI6CglpZiAobGFuZ3VhZ2UpIHsgQVNOMV9PQkpFQ1RfZnJlZShsYW5ndWFnZSk7IGxhbmd1YWdlID0gTlVMTDsgfQoJaWYgKHBhdGhsZW4pIHsgQVNOMV9JTlRFR0VSX2ZyZWUocGF0aGxlbik7IHBhdGhsZW4gPSBOVUxMOyB9CglpZiAocG9saWN5KSB7IEFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocG9saWN5KTsgcG9saWN5ID0gTlVMTDsgfQoJaWYgKHBjaSkgeyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX2ZyZWUocGNpKTsgcGNpID0gTlVMTDsgfQplbmQ6Cglza19DT05GX1ZBTFVFX3BvcF9mcmVlKHZhbHMsIFg1MDlWM19jb25mX2ZyZWUpOwoJcmV0dXJuIHBjaTsKCX0K