LyogdjNfcGNpLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KLyoKICogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0IGJ5IFJpY2hhcmQgTGV2aXR0ZQogKiAocmljaGFyZEBsZXZpdHRlLm9yZykKICovCi8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CiNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19TVEFSQk9BUkQpCiNpbmNsdWRlIDxzdGRpby5oPgojZW5kaWYgIC8vICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NUQVJCT0FSRCkKI2luY2x1ZGUgImNyeXB0bGliLmgiCiNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CgpzdGF0aWMgaW50IGkycl9wY2koWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqZXh0LAogICAgICAgICAgICAgICAgICAgQklPICpvdXQsIGludCBpbmRlbnQpOwpzdGF0aWMgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcjJpX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Cgpjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wY2kgPQogICAgeyBOSURfcHJveHlDZXJ0SW5mbywgMCwgQVNOMV9JVEVNX3JlZihQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKSwKICAgIDAsIDAsIDAsIDAsCiAgICAwLCAwLAogICAgTlVMTCwgTlVMTCwKICAgIChYNTA5VjNfRVhUX0kyUilpMnJfcGNpLAogICAgKFg1MDlWM19FWFRfUjJJKXIyaV9wY2ksCiAgICBOVUxMLAp9OwoKc3RhdGljIGludCBpMnJfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSwKICAgICAgICAgICAgICAgICAgIEJJTyAqb3V0LCBpbnQgaW5kZW50KQp7CiAgICBCSU9fcHJpbnRmKG91dCwgIiUqc1BhdGggTGVuZ3RoIENvbnN0cmFpbnQ6ICIsIGluZGVudCwgIiIpOwogICAgaWYgKHBjaS0+cGNQYXRoTGVuZ3RoQ29uc3RyYWludCkKICAgICAgICBpMmFfQVNOMV9JTlRFR0VSKG91dCwgcGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KTsKICAgIGVsc2UKICAgICAgICBCSU9fcHJpbnRmKG91dCwgImluZmluaXRlIik7CiAgICBCSU9fcHV0cyhvdXQsICJcbiIpOwogICAgQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgTGFuZ3VhZ2U6ICIsIGluZGVudCwgIiIpOwogICAgaTJhX0FTTjFfT0JKRUNUKG91dCwgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpOwogICAgQklPX3B1dHMob3V0LCAiXG4iKTsKICAgIGlmIChwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgJiYgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKQogICAgICAgIEJJT19wcmludGYob3V0LCAiJSpzUG9saWN5IFRleHQ6ICVzXG4iLCBpbmRlbnQsICIiLAogICAgICAgICAgICAgICAgICAgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKTsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50IHByb2Nlc3NfcGNpX3ZhbHVlKENPTkZfVkFMVUUgKnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX09CSkVDVCAqKmxhbmd1YWdlLCBBU04xX0lOVEVHRVIgKipwYXRobGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFfT0NURVRfU1RSSU5HICoqcG9saWN5KQp7CiAgICBpbnQgZnJlZV9wb2xpY3kgPSAwOwoKICAgIGlmIChPUEVOU1NMX3BvcnRfc3RyY21wKHZhbC0+bmFtZSwgImxhbmd1YWdlIikgPT0gMCkgewogICAgICAgIGlmICgqbGFuZ3VhZ2UpIHsKICAgICAgICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLAogICAgICAgICAgICAgICAgICAgICAgWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRCk7CiAgICAgICAgICAgIFg1MDlWM19jb25mX2Vycih2YWwpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCEoKmxhbmd1YWdlID0gT0JKX3R4dDJvYmoodmFsLT52YWx1ZSwgMCkpKSB7CiAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSwKICAgICAgICAgICAgICAgICAgICAgIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChPUEVOU1NMX3BvcnRfc3RyY21wKHZhbC0+bmFtZSwgInBhdGhsZW4iKSA9PSAwKSB7CiAgICAgICAgaWYgKCpwYXRobGVuKSB7CiAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSwKICAgICAgICAgICAgICAgICAgICAgIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQpOwogICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghWDUwOVYzX2dldF92YWx1ZV9pbnQodmFsLCBwYXRobGVuKSkgewogICAgICAgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsCiAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEgpOwogICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChPUEVOU1NMX3BvcnRfc3RyY21wKHZhbC0+bmFtZSwgInBvbGljeSIpID09IDApIHsKICAgICAgICB1bnNpZ25lZCBjaGFyICp0bXBfZGF0YSA9IE5VTEw7CiAgICAgICAgbG9uZyB2YWxfbGVuOwogICAgICAgIGlmICghKnBvbGljeSkgewogICAgICAgICAgICAqcG9saWN5ID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7CiAgICAgICAgICAgIGlmICghKnBvbGljeSkgewogICAgICAgICAgICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWVfcG9saWN5ID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKE9QRU5TU0xfcG9ydF9zdHJuY21wKHZhbC0+dmFsdWUsICJoZXg6IiwgNCkgPT0gMCkgewogICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0bXBfZGF0YTIgPQogICAgICAgICAgICAgICAgc3RyaW5nX3RvX2hleCh2YWwtPnZhbHVlICsgNCwgJnZhbF9sZW4pOwoKICAgICAgICAgICAgaWYgKCF0bXBfZGF0YTIpIHsKICAgICAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfUl9JTExFR0FMX0hFWF9ESUdJVCk7CiAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0bXBfZGF0YSA9IE9QRU5TU0xfcmVhbGxvYygoKnBvbGljeSktPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcG9saWN5KS0+bGVuZ3RoICsgdmFsX2xlbiArIDEpOwogICAgICAgICAgICBpZiAodG1wX2RhdGEpIHsKICAgICAgICAgICAgICAgICgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOwogICAgICAgICAgICAgICAgT1BFTlNTTF9wb3J0X21lbWNweSgmKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSwKICAgICAgICAgICAgICAgICAgICAgICB0bXBfZGF0YTIsIHZhbF9sZW4pOwogICAgICAgICAgICAgICAgKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKICAgICAgICAgICAgICAgICgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF9kYXRhMik7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcmVhbGxvYyBmYWlsdXJlIGltcGxpZXMgdGhlIG9yaWdpbmFsIGRhdGEgc3BhY2UgaXMgYjBya2VkCiAgICAgICAgICAgICAgICAgKiB0b28hCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAgICAoKnBvbGljeSktPmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgICAgICAgIFg1MDlWM19jb25mX2Vycih2YWwpOwogICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF9kYXRhMik7CiAgICAgICAgfSBlbHNlIGlmIChPUEVOU1NMX3BvcnRfc3RybmNtcCh2YWwtPnZhbHVlLCAiZmlsZToiLCA1KSA9PSAwKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzIwNDhdOwogICAgICAgICAgICBpbnQgbjsKICAgICAgICAgICAgQklPICpiID0gQklPX25ld19maWxlKHZhbC0+dmFsdWUgKyA1LCAiciIpOwogICAgICAgICAgICBpZiAoIWIpIHsKICAgICAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSwgRVJSX1JfQklPX0xJQik7CiAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgobiA9IEJJT19yZWFkKGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDAKICAgICAgICAgICAgICAgICAgIHx8IChuID09IDAgJiYgQklPX3Nob3VsZF9yZXRyeShiKSkpIHsKICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICB0bXBfZGF0YSA9IE9QRU5TU0xfcmVhbGxvYygoKnBvbGljeSktPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBvbGljeSktPmxlbmd0aCArIG4gKyAxKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRtcF9kYXRhKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOwogICAgICAgICAgICAgICAgT1BFTlNTTF9wb3J0X21lbWNweSgmKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSwgYnVmLCBuKTsKICAgICAgICAgICAgICAgICgqcG9saWN5KS0+bGVuZ3RoICs9IG47CiAgICAgICAgICAgICAgICAoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdID0gJ1wwJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBCSU9fZnJlZV9hbGwoYik7CgogICAgICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSwgRVJSX1JfQklPX0xJQik7CiAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChPUEVOU1NMX3BvcnRfc3RybmNtcCh2YWwtPnZhbHVlLCAidGV4dDoiLCA1KSA9PSAwKSB7CiAgICAgICAgICAgIHZhbF9sZW4gPSBPUEVOU1NMX3BvcnRfc3RybGVuKHZhbC0+dmFsdWUgKyA1KTsKICAgICAgICAgICAgdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBvbGljeSktPmxlbmd0aCArIHZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgaWYgKHRtcF9kYXRhKSB7CiAgICAgICAgICAgICAgICAoKnBvbGljeSktPmRhdGEgPSB0bXBfZGF0YTsKICAgICAgICAgICAgICAgIE9QRU5TU0xfcG9ydF9tZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCiAgICAgICAgICAgICAgICAgICAgICAgdmFsLT52YWx1ZSArIDUsIHZhbF9sZW4pOwogICAgICAgICAgICAgICAgKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKICAgICAgICAgICAgICAgICgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHJlYWxsb2MgZmFpbHVyZSBpbXBsaWVzIHRoZSBvcmlnaW5hbCBkYXRhIHNwYWNlIGlzIGIwcmtlZAogICAgICAgICAgICAgICAgICogdG9vIQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKnBvbGljeSktPmRhdGEgPSBOVUxMOwogICAgICAgICAgICAgICAgKCpwb2xpY3kpLT5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLAogICAgICAgICAgICAgICAgICAgICAgWDUwOVYzX1JfSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHKTsKICAgICAgICAgICAgWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgIH0KICAgICAgICBpZiAoIXRtcF9kYXRhKSB7CiAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIodmFsKTsKICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7CiBlcnI6CiAgICBpZiAoZnJlZV9wb2xpY3kpIHsKICAgICAgICBBU04xX09DVEVUX1NUUklOR19mcmVlKCpwb2xpY3kpOwogICAgICAgICpwb2xpY3kgPSBOVUxMOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpyMmlfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlWM19DVFggKmN0eCwgY2hhciAqdmFsdWUpCnsKICAgIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSA9IE5VTEw7CiAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsczsKICAgIEFTTjFfT0JKRUNUICpsYW5ndWFnZSA9IE5VTEw7CiAgICBBU04xX0lOVEVHRVIgKnBhdGhsZW4gPSBOVUxMOwogICAgQVNOMV9PQ1RFVF9TVFJJTkcgKnBvbGljeSA9IE5VTEw7CiAgICBpbnQgaSwgajsKCiAgICB2YWxzID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOwogICAgZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHMpOyBpKyspIHsKICAgICAgICBDT05GX1ZBTFVFICpjbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwogICAgICAgIGlmICghY25mLT5uYW1lIHx8ICgqY25mLT5uYW1lICE9ICdAJyAmJiAhY25mLT52YWx1ZSkpIHsKICAgICAgICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksCiAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKICAgICAgICAgICAgWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgIH0KICAgICAgICBpZiAoKmNuZi0+bmFtZSA9PSAnQCcpIHsKICAgICAgICAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNlY3Q7CiAgICAgICAgICAgIGludCBzdWNjZXNzX3AgPSAxOwoKICAgICAgICAgICAgc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIGNuZi0+bmFtZSArIDEpOwogICAgICAgICAgICBpZiAoIXNlY3QpIHsKICAgICAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOwogICAgICAgICAgICAgICAgWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGogPSAwOyBzdWNjZXNzX3AgJiYgaiA8IHNrX0NPTkZfVkFMVUVfbnVtKHNlY3QpOyBqKyspIHsKICAgICAgICAgICAgICAgIHN1Y2Nlc3NfcCA9CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19wY2lfdmFsdWUoc2tfQ09ORl9WQUxVRV92YWx1ZShzZWN0LCBqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UsICZwYXRobGVuLCAmcG9saWN5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgc2VjdCk7CiAgICAgICAgICAgIGlmICghc3VjY2Vzc19wKQogICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFwcm9jZXNzX3BjaV92YWx1ZShjbmYsICZsYW5ndWFnZSwgJnBhdGhsZW4sICZwb2xpY3kpKSB7CiAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIoY25mKTsKICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIExhbmd1YWdlIGlzIG1hbmRhdG9yeSAqLwogICAgaWYgKCFsYW5ndWFnZSkgewogICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLAogICAgICAgICAgICAgICAgICBYNTA5VjNfUl9OT19QUk9YWV9DRVJUX1BPTElDWV9MQU5HVUFHRV9ERUZJTkVEKTsKICAgICAgICBnb3RvIGVycjsKICAgIH0KICAgIGkgPSBPQkpfb2JqMm5pZChsYW5ndWFnZSk7CiAgICBpZiAoKGkgPT0gTklEX0luZGVwZW5kZW50IHx8IGkgPT0gTklEX2lkX3BwbF9pbmhlcml0QWxsKSAmJiBwb2xpY3kpIHsKICAgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSwKICAgICAgICAgICAgICAgICAgWDUwOVYzX1JfUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZKTsKICAgICAgICBnb3RvIGVycjsKICAgIH0KCiAgICBwY2kgPSBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX25ldygpOwogICAgaWYgKCFwY2kpIHsKICAgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgIGdvdG8gZXJyOwogICAgfQoKICAgIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeUxhbmd1YWdlID0gbGFuZ3VhZ2U7CiAgICBsYW5ndWFnZSA9IE5VTEw7CiAgICBwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgPSBwb2xpY3k7CiAgICBwb2xpY3kgPSBOVUxMOwogICAgcGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50ID0gcGF0aGxlbjsKICAgIHBhdGhsZW4gPSBOVUxMOwogICAgZ290byBlbmQ7CiBlcnI6CiAgICBpZiAobGFuZ3VhZ2UpIHsKICAgICAgICBBU04xX09CSkVDVF9mcmVlKGxhbmd1YWdlKTsKICAgICAgICBsYW5ndWFnZSA9IE5VTEw7CiAgICB9CiAgICBpZiAocGF0aGxlbikgewogICAgICAgIEFTTjFfSU5URUdFUl9mcmVlKHBhdGhsZW4pOwogICAgICAgIHBhdGhsZW4gPSBOVUxMOwogICAgfQogICAgaWYgKHBvbGljeSkgewogICAgICAgIEFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocG9saWN5KTsKICAgICAgICBwb2xpY3kgPSBOVUxMOwogICAgfQogICAgaWYgKHBjaSkgewogICAgICAgIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fZnJlZShwY2kpOwogICAgICAgIHBjaSA9IE5VTEw7CiAgICB9CiBlbmQ6CiAgICBza19DT05GX1ZBTFVFX3BvcF9mcmVlKHZhbHMsIFg1MDlWM19jb25mX2ZyZWUpOwogICAgcmV0dXJuIHBjaTsKfQo=