LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDT1BZUklHSFQ6IAoqIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMTk5OAoqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvZ3JhbS1Qcm9wZXJ0eSBvZiBJQk0gLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiwgb3IgZGlzY2xvc3VyZSAKKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KIAojaW5jbHVkZSAibXNmbXJndHMuaCIKCiNpbmNsdWRlICJmb3JtYXQuaCIKI2luY2x1ZGUgImRlY2ltZm10LmgiCiNpbmNsdWRlICJsb2NpZC5oIgojaW5jbHVkZSAibXNnZm10LmgiCiNpbmNsdWRlICJudW1mbXQuaCIKI2luY2x1ZGUgImNob2ljZm10LmgiCiNpbmNsdWRlICJncmVnb2NhbC5oIgoKLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gY2xhc3MgTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0Ci8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojZGVmaW5lIENBU0UoaWQsdGVzdCkgY2FzZSBpZDogbmFtZSA9ICN0ZXN0OyBpZiAoZXhlYykgeyBsb2dsbigjdGVzdCAiLS0tIik7IGxvZ2xuKChVbmljb2RlU3RyaW5nKSIiKTsgdGVzdCgpOyB9IGJyZWFrOwoKdm9pZCAKTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0OjpydW5JbmRleGVkVGVzdCggaW50MzJfdCBpbmRleCwgYm9vbF90IGV4ZWMsIGNoYXIqICZuYW1lLCBjaGFyKiBwYXIgKQp7CiAgICAvLyBpZiAoZXhlYykgbG9nbG4oKFVuaWNvZGVTdHJpbmcpIlRlc3RTdWl0ZSBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3QiKTsKICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICBDQVNFKDAsVGVzdDQwNzQ3NjQpCiAgICAgICAgQ0FTRSgxLFRlc3Q0MDU4OTczKQogICAgICAgIENBU0UoMixUZXN0NDAzMTQzOCkKICAgICAgICBDQVNFKDMsVGVzdDQwNTIyMjMpCiAgICAgICAgQ0FTRSg0LFRlc3Q0MTA0OTc2KQogICAgICAgIENBU0UoNSxUZXN0NDEwNjY1OSkKICAgICAgICBDQVNFKDYsVGVzdDQxMDY2NjApCiAgICAgICAgQ0FTRSg3LFRlc3Q0MTExNzM5KQogICAgICAgIENBU0UoOCxUZXN0NDExNDc0MykKICAgICAgICBDQVNFKDksVGVzdDQxMTY0NDQpCiAgICAgICAgQ0FTRSgxMCxUZXN0NDExNDczOSkKICAgICAgICBDQVNFKDExLFRlc3Q0MTEzMDE4KQogICAgICAgIENBU0UoMTIsVGVzdDQxMDY2NjEpCiAgICAgICAgQ0FTRSgxMyxUZXN0NDA5NDkwNikKICAgICAgICBDQVNFKDE0LFRlc3Q0MTE4NTkyKQogICAgICAgIENBU0UoMTUsVGVzdDQxMTg1OTQpCiAgICAgICAgQ0FTRSgxNixUZXN0NDEwNTM4MCkKICAgICAgICBDQVNFKDE3LFRlc3Q0MTIwNTUyKQogICAgICAgIENBU0UoMTgsVGVzdDQxNDI5MzgpCiAgICAgICAgQ0FTRSgxOSxUZXN0Q2hvaWNlUGF0dGVyblF1b3RlKQogICAgICAgIENBU0UoMjAsVGVzdDQxMTIxMDQpOwoKICAgICAgICBkZWZhdWx0OiBuYW1lID0gIiI7IGJyZWFrOwogICAgfQp9Cgpjb25zdCBjaGFyKiAKTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0OjplcnJvck5hbWUoVUVycm9yQ29kZSBjb2RlKQp7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICBjYXNlIFpFUk9fRVJST1I6ICAgICAgICAgICAgICAgIHJldHVybiAiWkVST19FUlJPUiI7CiAgICAgICAgY2FzZSBJTExFR0FMX0FSR1VNRU5UX0VSUk9SOiAgICByZXR1cm4gIklMTEVHQUxfQVJHVU1FTlRfRVJST1IiOwogICAgICAgIGNhc2UgTUlTU0lOR19SRVNPVVJDRV9FUlJPUjogICAgcmV0dXJuICJNSVNTSU5HX1JFU09VUkNFX0VSUk9SIjsKICAgICAgICBjYXNlIElOVkFMSURfRk9STUFUX0VSUk9SOiAgICAgIHJldHVybiAiSU5WQUxJRF9GT1JNQVRfRVJST1IiOwogICAgICAgIGNhc2UgRklMRV9BQ0NFU1NfRVJST1I6ICAgICAgICAgcmV0dXJuICJGSUxFX0FDQ0VTU19FUlJPUiI7CiAgICAgICAgY2FzZSBJTlRFUk5BTF9QUk9HUkFNX0VSUk9SOiAgICByZXR1cm4gIklOVEVSTkFMX1BST0dSQU1fRVJST1IiOwogICAgICAgIGNhc2UgTUVTU0FHRV9QQVJTRV9FUlJPUjogICAgICAgcmV0dXJuICJNRVNTQUdFX1BBUlNFX0VSUk9SIjsKICAgICAgICBjYXNlIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SOiAgIHJldHVybiAiTUVNT1JZX0FMTE9DQVRJT05fRVJST1IiOwogICAgICAgIGNhc2UgVVNJTkdfRkFMTEJBQ0tfRVJST1I6ICAgICAgcmV0dXJuICJVU0lOR19GQUxMQkFDS19FUlJPUiI7CiAgICAgICAgY2FzZSBVU0lOR19ERUZBVUxUX0VSUk9SOiAgICAgICByZXR1cm4gIlVTSU5HX0RFRkFVTFRfRVJST1IiOwogICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJbQk9HVVMgVUVycm9yQ29kZV0iOwogICAgfQp9Cgpib29sX3QgCk1lc3NhZ2VGb3JtYXRSZWdyZXNzaW9uVGVzdDo6ZmFpbHVyZShVRXJyb3JDb2RlIHN0YXR1cywgY29uc3QgY2hhciogbXNnKQp7CiAgICBpZihGQUlMVVJFKHN0YXR1cykpIHsKICAgICAgICBlcnJsbihVbmljb2RlU3RyaW5nKCJGQUlMOiAiKSArIG1zZyArICIgZmFpbGVkLCBlcnJvciAiICsgZXJyb3JOYW1lKHN0YXR1cykpOwogICAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICAgIHJldHVybiBGQUxTRTsKfQoKLyogQGJ1ZyA0MDc0NzY0CiAqIE51bGwgZXhjZXB0aW9uIHdoZW4gZm9ybWF0dGluZyBwYXR0ZXJuIHdpdGggTWVzc2FnZUZvcm1hdAogKiB3aXRoIG5vIHBhcmFtZXRlcnMuCiAqLwp2b2lkIE1lc3NhZ2VGb3JtYXRSZWdyZXNzaW9uVGVzdDo6VGVzdDQwNzQ3NjQoKSB7CiAgICBVbmljb2RlU3RyaW5nIHBhdHRlcm4gW10gPSB7CiAgICAgICAgIk1lc3NhZ2Ugd2l0aG91dCBwYXJhbSIsCiAgICAgICAgIk1lc3NhZ2Ugd2l0aCBwYXJhbTp7MH0iLAogICAgICAgICJMb25nZXIgTWVzc2FnZSB3aXRoIHBhcmFtIHswfSIKICAgIH07CiAgICAvL2RpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHBhcmFtIHN0cmluZ3MgYXJlIHRoYXQKICAgIC8vaW4gdGhlIGZpcnN0IG9uZSwgdGhlIHBhcmFtIHBvc2l0aW9uIGlzIHdpdGhpbiB0aGUKICAgIC8vbGVuZ3RoIG9mIHRoZSBzdHJpbmcgd2l0aG91dCBwYXJhbSB3aGlsZSBpdCBpcyBub3Qgc28KICAgIC8vaW4gdGhlIG90aGVyIGNhc2UuCgogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgTWVzc2FnZUZvcm1hdCAqbWVzc2FnZUZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KCIiLCBzdGF0dXMpOwoKICAgIGZhaWx1cmUoc3RhdHVzLCAiY291bGRuJ3QgY3JlYXRlIE1lc3NhZ2VGb3JtYXQiKTsKCiAgICAvL3RyeSB7CiAgICAgICAgLy9BcHBseSBwYXR0ZXJuIHdpdGggcGFyYW0gYW5kIHByaW50IHRoZSByZXN1bHQKICAgICAgICBtZXNzYWdlRm9ybWF0dGVyLT5hcHBseVBhdHRlcm4ocGF0dGVyblsxXSwgc3RhdHVzKTsKICAgICAgICBmYWlsdXJlKHN0YXR1cywgIm1lc3NhZ2VGb3JtYXQtPmFwcGx5UGF0dGVybiIpOwogICAgICAgIC8vT2JqZWN0W10gcGFyYW1zID0ge25ldyBVbmljb2RlU3RyaW5nKCJCVUciKSwgbmV3IERhdGUoKX07CiAgICAgICAgRm9ybWF0dGFibGUgcGFyYW1zIFtdID0gewogICAgICAgICAgICBGb3JtYXR0YWJsZShVbmljb2RlU3RyaW5nKCJCVUciKSksIAogICAgICAgICAgICBGb3JtYXR0YWJsZSgwLCBGb3JtYXR0YWJsZTo6a0lzRGF0ZSkKICAgICAgICB9OwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcEJ1ZmZlcjsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgICAgIHRlbXBCdWZmZXIgPSBtZXNzYWdlRm9ybWF0dGVyLT5mb3JtYXQocGFyYW1zLCAyLCB0ZW1wQnVmZmVyLCBwb3MsIHN0YXR1cyk7CiAgICAgICAgaWYoIHRlbXBCdWZmZXIgIT0gIk1lc3NhZ2Ugd2l0aCBwYXJhbTpCVUciIHx8IGZhaWx1cmUoc3RhdHVzLCAibWVzc2FnZUZvcm1hdC0+Zm9ybWF0IikpCiAgICAgICAgICAgIGVycmxuKCJNZXNzYWdlRm9ybWF0IHdpdGggb25lIHBhcmFtIHRlc3QgZmFpbGVkLiIpOwogICAgICAgIGxvZ2xuKCJGb3JtYXR0ZWQgd2l0aCBvbmUgZXh0cmEgcGFyYW0gOiAiICsgdGVtcEJ1ZmZlcik7CgogICAgICAgIC8vQXBwbHkgcGF0dGVybiB3aXRob3V0IHBhcmFtIGFuZCBwcmludCB0aGUgcmVzdWx0CiAgICAgICAgbWVzc2FnZUZvcm1hdHRlci0+YXBwbHlQYXR0ZXJuKHBhdHRlcm5bMF0sIHN0YXR1cyk7CiAgICAgICAgZmFpbHVyZShzdGF0dXMsICJtZXNzYWdlRm9ybWF0dGVyLT5hcHBseVBhdHRlcm4iKTsKICAgICAgICAKICAgICAgICAvLyB7c2ZifSBob3cgbXVjaCBkb2VzIHRoaXMgYXBwbHkgaW4gQysrPwogICAgICAgIC8vIGRvIHdlIHdhbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIEZvcm1hdHRhYmxlKiBhcnJheSBpcyBub3QgTlVMTCwKICAgICAgICAvLyBvciBpcyB0aGF0IHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHk/CiAgICAgICAgLy8gYWRkaXRpb25hbGx5LCB3aGF0IHNob3VsZCBiZSB0aGUgaXRlbSBjb3VudD8KICAgICAgICAvLyBmb3IgYnVnIHRlc3RpbmcgcHVycG9zZXMsIGFzc3VtZSB0aGF0IHNvbWV0aGluZyB3YXMgc2V0IHRvCiAgICAgICAgLy8gTlVMTCBieSBtaXN0YWtlLCBhbmQgdGhhdCB0aGUgbGVuZ3RoIHNob3VsZCBiZSBub24temVybwogICAgICAgIAogICAgICAgIC8vdGVtcEJ1ZmZlciA9IG1lc3NhZ2VGb3JtYXR0ZXItPmZvcm1hdChOVUxMLCAxLCB0ZW1wQnVmZmVyLCBGaWVsZFBvc2l0aW9uKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSksIHN0YXR1cyk7CiAgICAgICAgdGVtcEJ1ZmZlci5yZW1vdmUoKTsKICAgICAgICB0ZW1wQnVmZmVyID0gbWVzc2FnZUZvcm1hdHRlci0+Zm9ybWF0KE5VTEwsIDAsIHRlbXBCdWZmZXIsIHBvcywgc3RhdHVzKTsKCiAgICAgICAgaWYoIHRlbXBCdWZmZXIgIT0gIk1lc3NhZ2Ugd2l0aG91dCBwYXJhbSIgfHwgZmFpbHVyZShzdGF0dXMsICJtZXNzYWdlRm9ybWF0LT5mb3JtYXQiKSkKICAgICAgICAgICAgZXJybG4oIk1lc3NhZ2VGb3JtYXQgd2l0aCBubyBwYXJhbSB0ZXN0IGZhaWxlZC4iKTsKICAgICAgICBsb2dsbigiRm9ybWF0dGVkIHdpdGggbm8gcGFyYW1zIDogIiArIHRlbXBCdWZmZXIpOwoKICAgICAgICB0ZW1wQnVmZmVyLnJlbW92ZSgpOwogICAgICAgIHRlbXBCdWZmZXIgPSBtZXNzYWdlRm9ybWF0dGVyLT5mb3JtYXQocGFyYW1zLCAyLCB0ZW1wQnVmZmVyLCBwb3MsIHN0YXR1cyk7CiAgICAgICAgIGlmICh0ZW1wQnVmZmVyICE9ICJNZXNzYWdlIHdpdGhvdXQgcGFyYW0iIHx8IGZhaWx1cmUoc3RhdHVzLCAibWVzc2FnZUZvcm1hdC0+Zm9ybWF0IikpCiAgICAgICAgICAgIGVycmxuKCJGb3JtYXR0ZWQgd2l0aCBhcmd1bWVudHMgPiBzdWJzaXR1dGlvbiBmYWlsZWQuIHJlc3VsdCA9ICIgKyB0ZW1wQnVmZmVyKTsKICAgICAgICAgbG9nbG4oIkZvcm1hdHRlZCB3aXRoIGV4dHJhIHBhcmFtcyA6ICIgKyB0ZW1wQnVmZmVyKTsKICAgICAgICAvL1RoaXMgc3RhdGVtZW50IGdpdmVzIGFuIGV4Y2VwdGlvbiB3aGlsZSBmb3JtYXR0aW5nLi4uCiAgICAgICAgLy9JZiB3ZSB1c2UgcGF0dGVyblsxXSBmb3IgdGhlIG1lc3NhZ2Ugd2l0aCBwYXJhbSwKICAgICAgICAvL3dlIGdldCBhbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBNZXNzYWdlRm9ybWF0LmphdmEoNjE3KQogICAgICAgIC8vSWYgd2UgdXNlIHBhdHRlcm5bMl0gZm9yIHRoZSBtZXNzYWdlIHdpdGggcGFyYW0sCiAgICAgICAgLy93ZSBnZXQgYW4gU3RyaW5nQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIE1lc3NhZ2VGb3JtYXQuamF2YSg2MTQpCiAgICAgICAgLy9Cb3RoIGFyZSBkdWUgdG8gbWF4T2Zmc2V0IG5vdCBiZWluZyByZXNldCB0byAtMQogICAgICAgIC8vaW4gYXBwbHlQYXR0ZXJuKCkgd2hlbiB0aGUgcGF0dGVybiBkb2VzIG5vdAogICAgICAgIC8vY29udGFpbiBhbnkgcGFyYW0uCiAgICAvKn0gY2F0Y2ggKEV4Y2VwdGlvbiBmb28pIHsKICAgICAgICBlcnJsbigiRXhjZXB0aW9uIHdoZW4gZm9ybWF0dGluZyB3aXRoIG5vIHBhcmFtcy4iKTsKICAgIH0qLwoKICAgIGRlbGV0ZSBtZXNzYWdlRm9ybWF0dGVyOwp9CgovKiBAYnVnIDQwNTg5NzMKICogTWVzc2FnZUZvcm1hdC50b1BhdHRlcm4gaGFzIHdlaXJkIHJvdW5kaW5nIGJlaGF2aW9yLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MDU4OTczKCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICAgIE1lc3NhZ2VGb3JtYXQgKmZtdCA9IG5ldyBNZXNzYWdlRm9ybWF0KCJ7MCxjaG9pY2UsMCNubyBmaWxlc3wxI29uZSBmaWxlfDE8IHswLG51bWJlcixpbnRlZ2VyfSBmaWxlc30iLCBzdGF0dXMpOwogICAgZmFpbHVyZShzdGF0dXMsICJuZXcgTWVzc2FnZUZvcm1hdCIpOwoKICAgIFVuaWNvZGVTdHJpbmcgcGF0OwogICAgcGF0ID0gZm10LT50b1BhdHRlcm4ocGF0KTsKICAgIFVuaWNvZGVTdHJpbmcgZXhwKCJ7MCxjaG9pY2UsMC4wI25vIGZpbGVzfDEuMCNvbmUgZmlsZXwxLjA8IHswLG51bWJlcixpbnRlZ2VyfSBmaWxlc30iKTsKICAgIGlmIChwYXQgIT0gZXhwKSB7CiAgICAgICAgZXJybG4oIk1lc3NhZ2VGb3JtYXQudG9QYXR0ZXJuIGZhaWxlZCIpOwogICAgICAgIGVycmxuKCJFeHA6ICIgKyBleHApOwogICAgICAgIGVycmxuKCJHb3Q6ICIgKyBwYXQpOwogICAgfQoKICAgIGRlbGV0ZSBmbXQ7Cn0KLyogQGJ1ZyA0MDMxNDM4CiAqIE1vcmUgcm9idXN0IG1lc3NhZ2UgZm9ybWF0cy4KICovCnZvaWQgTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0OjpUZXN0NDAzMTQzOCgpIAp7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAgICAKICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjEoIkltcG9zc2libGUgezF9IGhhcyBvY2N1cnJlZCAtLSBzdGF0dXMgY29kZSBpcyB7MH0gYW5kIG1lc3NhZ2UgaXMgezJ9LiIpOwogICAgVW5pY29kZVN0cmluZyBwYXR0ZXJuMigiRG91YmxlICcnIFF1b3RlcyB7MH0gdGVzdCBhbmQgcXVvdGVkICd7MX0nIHRlc3QgcGx1cyAnb3RoZXIgezJ9IHN0dWZmJy4iKTsKCiAgICBNZXNzYWdlRm9ybWF0ICptZXNzYWdlRm9ybWF0dGVyID0gbmV3IE1lc3NhZ2VGb3JtYXQoIiIsIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBNZXNzYWdlRm9ybWF0Iik7CgogICAgLy90cnkgewogICAgICAgIGxvZ2xuKCJBcHBseSB3aXRoIHBhdHRlcm4gOiAiICsgcGF0dGVybjEpOwogICAgICAgIG1lc3NhZ2VGb3JtYXR0ZXItPmFwcGx5UGF0dGVybihwYXR0ZXJuMSwgc3RhdHVzKTsKICAgICAgICBmYWlsdXJlKHN0YXR1cywgIm1lc3NhZ2VGb3JtYXQtPmFwcGx5UGF0dGVybiIpOwogICAgICAgIC8vT2JqZWN0W10gcGFyYW1zID0ge25ldyBJbnRlZ2VyKDcpfTsKICAgICAgICBGb3JtYXR0YWJsZSBwYXJhbXMgW109IHsKICAgICAgICAgICAgRm9ybWF0dGFibGUoKGludDMyX3QpNykKICAgICAgICB9OwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcEJ1ZmZlcjsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgICAgIHRlbXBCdWZmZXIgPSBtZXNzYWdlRm9ybWF0dGVyLT5mb3JtYXQocGFyYW1zLCAxLCB0ZW1wQnVmZmVyLCBwb3MsIHN0YXR1cyk7CiAgICAgICAgaWYodGVtcEJ1ZmZlciAhPSAiSW1wb3NzaWJsZSB7MX0gaGFzIG9jY3VycmVkIC0tIHN0YXR1cyBjb2RlIGlzIDcgYW5kIG1lc3NhZ2UgaXMgezJ9LiIgfHwgZmFpbHVyZShzdGF0dXMsICJNZXNzYWdlRm9ybWF0Ojpmb3JtYXQiKSkKICAgICAgICAgICAgZXJybG4oIlRlc3RzIGFyZ3VtZW50cyA8IHN1YnN0aXR1dGlvbiBmYWlsZWQiKTsKICAgICAgICBsb2dsbigiRm9ybWF0dGVkIHdpdGggNyA6ICIgKyB0ZW1wQnVmZmVyKTsKICAgICAgICBQYXJzZVBvc2l0aW9uIHBwKDApOwogICAgICAgIGludDMyX3QgY291bnQgPSAwOwogICAgICAgIEZvcm1hdHRhYmxlICpvYmpzID0gbWVzc2FnZUZvcm1hdHRlci0+cGFyc2UodGVtcEJ1ZmZlciwgcHAsIGNvdW50KTsKICAgICAgICAvL2lmKG9ianNbNy8qcGFyYW1zLmxlbmd0aCovXSAhPSBOVUxMKQogICAgICAgIC8vICAgIGVycmxuKCJQYXJzZSBmYWlsZWQgd2l0aCBtb3JlIHRoYW4gZXhwZWN0ZWQgYXJndW1lbnRzIik7CgogICAgICAgIE51bWJlckZvcm1hdCAqZm10ID0gMDsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXAsIHRlbXAxOwogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAKICAgICAgICAgICAgLy8gY29udmVydCB0byBzdHJpbmcgaWYgbm90IGFscmVhZHkKICAgICAgICAgICAgRm9ybWF0dGFibGUgb2JqID0gb2Jqc1tpXTsKICAgICAgICAgICAgdGVtcC5yZW1vdmUoKTsKICAgICAgICAgICAgaWYob2JqLmdldFR5cGUoKSA9PSBGb3JtYXR0YWJsZTo6a1N0cmluZykKICAgICAgICAgICAgICAgIHRlbXAgPSBvYmouZ2V0U3RyaW5nKHRlbXApOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZtdCA9IE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2Uoc3RhdHVzKTsKICAgICAgICAgICAgICAgIGZtdC0+Zm9ybWF0KG9iai5nZXRUeXBlKCkgPT0gRm9ybWF0dGFibGU6OmtMb25nID8gb2JqLmdldExvbmcoKSA6IG9iai5nZXREb3VibGUoKSwgdGVtcCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIGlmIG5vdCBhbHJlYWR5CiAgICAgICAgICAgIEZvcm1hdHRhYmxlIG9iajEgPSBwYXJhbXNbaV07CiAgICAgICAgICAgIHRlbXAxLnJlbW92ZSgpOwogICAgICAgICAgICBpZihvYmoxLmdldFR5cGUoKSA9PSBGb3JtYXR0YWJsZTo6a0RvdWJsZSB8fCBvYmoxLmdldFR5cGUoKSA9PSBGb3JtYXR0YWJsZTo6a0xvbmcpIHsKICAgICAgICAgICAgICAgIGZtdCA9IE51bWJlckZvcm1hdDo6Y3JlYXRlSW5zdGFuY2Uoc3RhdHVzKTsKICAgICAgICAgICAgICAgIGZtdC0+Zm9ybWF0KG9iajEuZ2V0VHlwZSgpID09IEZvcm1hdHRhYmxlOjprTG9uZyA/IG9iajEuZ2V0TG9uZygpIDogb2JqMS5nZXREb3VibGUoKSwgdGVtcDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRlbXAxID0gb2JqMS5nZXRTdHJpbmcodGVtcDEpOwoKICAgICAgICAgICAgLy9pZiAob2Jqc1tpXSAhPSBOVUxMICYmIG9ianNbaV0uZ2V0U3RyaW5nKHRlbXAxKSAhPSBwYXJhbXNbaV0uZ2V0U3RyaW5nKHRlbXAyKSkgewogICAgICAgICAgICBpZiAodGVtcCAhPSB0ZW1wMSkgewogICAgICAgICAgICAgICAgZXJybG4oIlBhcnNlIGZhaWxlZCBvbiBvYmplY3QgIiArIG9ianNbaV0uZ2V0U3RyaW5nKHRlbXAxKSArICIgYXQgaW5kZXggOiAiICsgaSk7CiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICB9CgogICAgICAgIGRlbGV0ZSBmbXQ7CiAgICAgICAgZGVsZXRlIFtdIG9ianM7CgogICAgICAgIC8vIHtzZmJ9IGRvZXMgdGhpcyBhcHBseT8gIG5vIHdheSB0byByZWFsbHkgcGFzcyBhIG51bGwgRm9ybWF0dGFibGUsIAogICAgICAgIC8vIG9ubHkgYSBudWxsIGFycmF5CgogICAgICAgIC8qdGVtcEJ1ZmZlciA9IG1lc3NhZ2VGb3JtYXR0ZXItPmZvcm1hdChudWxsLCB0ZW1wQnVmZmVyLCBGaWVsZFBvc2l0aW9uKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSksIHN0YXR1cyk7CiAgICAgICAgaWYgKHRlbXBCdWZmZXIgIT0gIkltcG9zc2libGUgezF9IGhhcyBvY2N1cnJlZCAtLSBzdGF0dXMgY29kZSBpcyB7MH0gYW5kIG1lc3NhZ2UgaXMgezJ9LiIgfHwgZmFpbHVyZShzdGF0dXMsICJtZXNzYWdlRm9ybWF0LT5mb3JtYXQiKSkKICAgICAgICAgICAgZXJybG4oIlRlc3RzIHdpdGggbm8gYXJndW1lbnRzIGZhaWxlZCIpOwogICAgICAgIGxvZ2xuKCJGb3JtYXR0ZWQgd2l0aCBudWxsIDogIiArIHRlbXBCdWZmZXIpOyovCiAgICAgICAgbG9nbG4oIkFwcGx5IHdpdGggcGF0dGVybiA6ICIgKyBwYXR0ZXJuMik7CiAgICAgICAgbWVzc2FnZUZvcm1hdHRlci0+YXBwbHlQYXR0ZXJuKHBhdHRlcm4yLCBzdGF0dXMpOwogICAgICAgIGZhaWx1cmUoc3RhdHVzLCAibWVzc2FnZUZvcm1hdHRlci0+YXBwbHlQYXR0ZXJuIik7CiAgICAgICAgdGVtcEJ1ZmZlci5yZW1vdmUoKTsKICAgICAgICB0ZW1wQnVmZmVyID0gbWVzc2FnZUZvcm1hdHRlci0+Zm9ybWF0KHBhcmFtcywgMSwgdGVtcEJ1ZmZlciwgcG9zLCBzdGF0dXMpOwogICAgICAgIGlmICh0ZW1wQnVmZmVyICE9ICJEb3VibGUgJyBRdW90ZXMgNyB0ZXN0IGFuZCBxdW90ZWQgezF9IHRlc3QgcGx1cyBvdGhlciB7Mn0gc3R1ZmYuIikKICAgICAgICAgICAgZXJybG4oInF1b3RlIGZvcm1hdCB0ZXN0ICh3LyBwYXJhbXMpIGZhaWxlZC4iKTsKICAgICAgICBsb2dsbigiRm9ybWF0dGVkIHdpdGggcGFyYW1zIDogIiArIHRlbXBCdWZmZXIpOwogICAgICAgIAogICAgICAgIC8qdGVtcEJ1ZmZlciA9IG1lc3NhZ2VGb3JtYXR0ZXItPmZvcm1hdChudWxsKTsKICAgICAgICBpZiAoIXRlbXBCdWZmZXIuZXF1YWxzKCJEb3VibGUgJyBRdW90ZXMgezB9IHRlc3QgYW5kIHF1b3RlZCB7MX0gdGVzdCBwbHVzIG90aGVyIHsyfSBzdHVmZi4iKSkKICAgICAgICAgICAgZXJybG4oInF1b3RlIGZvcm1hdCB0ZXN0ICh3LyBudWxsKSBmYWlsZWQuIik7CiAgICAgICAgbG9nbG4oIkZvcm1hdHRlZCB3aXRoIG51bGwgOiAiICsgdGVtcEJ1ZmZlcik7CiAgICAgICAgbG9nbG4oInRvUGF0dGVybiA6ICIgKyBtZXNzYWdlRm9ybWF0dGVyLnRvUGF0dGVybigpKTsqLwogICAgLyp9IGNhdGNoIChFeGNlcHRpb24gZm9vKSB7CiAgICAgICAgZXJybG4oIkV4Y2VwdGlvbiB3aGVuIGZvcm1hdHRpbmcgaW4gYnVnIDQwMzE0MzguICIrZm9vLmdldE1lc3NhZ2UoKSk7CiAgICB9Ki8KfQoKdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MDUyMjIzKCkKewoKICAgIFBhcnNlUG9zaXRpb24gcG9zKDApOwogICAgaWYgKHBvcy5nZXRFcnJvckluZGV4KCkgIT0gLTEpIHsKICAgICAgICBlcnJsbigiUGFyc2VQb3NpdGlvbi5nZXRFcnJvckluZGV4IGluaXRpYWxpemF0aW9uIGZhaWxlZC4iKTsKICAgIH0KCiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAgICBNZXNzYWdlRm9ybWF0ICpmbXQgPSBuZXcgTWVzc2FnZUZvcm1hdCgiVGhlcmUgYXJlIHswfSBhcHBsZXMgZ3Jvd2luZyBvbiB0aGUgezF9IHRyZWUuIiwgc3RhdHVzKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibmV3IE1lc3NhZ2VGb3JtYXQiKTsKICAgIFVuaWNvZGVTdHJpbmcgc3RyKCJUaGVyZSBpcyBvbmUgYXBwbGUgZ3Jvd2luZyBvbiB0aGUgcGVhY2ggdHJlZS4iKTsKICAgIAogICAgaW50MzJfdCBjb3VudCA9IDA7CiAgICBGb3JtYXR0YWJsZSAqb2JqcyA9IGZtdC0+cGFyc2Uoc3RyLCBwb3MsIGNvdW50KTsKCiAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJ1bnBhcnNhYmxlIHN0cmluZyAsIHNob3VsZCBmYWlsIGF0ICIpICsgcG9zLmdldEVycm9ySW5kZXgoKSk7CiAgICBpZiAocG9zLmdldEVycm9ySW5kZXgoKSA9PSAtMSkKICAgICAgICBlcnJsbigiQnVnIDQwNTIyMjMgZmFpbGVkIDogcGFyc2luZyBzdHJpbmcgIiArIHN0cik7CiAgICBwb3Muc2V0RXJyb3JJbmRleCg0KTsKICAgIGlmIChwb3MuZ2V0RXJyb3JJbmRleCgpICE9IDQpCiAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygic2V0RXJyb3JJbmRleCBmYWlsZWQsIGdvdCAiKSArIHBvcy5nZXRFcnJvckluZGV4KCkgKyAiIGluc3RlYWQgb2YgNCIpOwogICAgCiAgICBDaG9pY2VGb3JtYXQgKmYgPSBuZXcgQ2hvaWNlRm9ybWF0KAogICAgICAgICItMSNhcmUgbmVnYXRpdmV8MCNhcmUgbm8gb3IgZnJhY3Rpb258MSNpcyBvbmV8MS4wPGlzIDErfDIjYXJlIHR3b3wyPGFyZSBtb3JlIHRoYW4gMi4iLCBzdGF0dXMpOwogICAgZmFpbHVyZShzdGF0dXMsICJuZXcgQ2hvaWNlRm9ybWF0Iik7CiAgICBwb3Muc2V0SW5kZXgoMCk7IAogICAgcG9zLnNldEVycm9ySW5kZXgoLTEpOwogICAgRm9ybWF0dGFibGUgb2JqOwogICAgZi0+cGFyc2UoImFyZSBuZWdhdGl2ZSIsIG9iaiwgcG9zKTsKICAgIGlmIChwb3MuZ2V0RXJyb3JJbmRleCgpICE9IC0xICYmIG9iai5nZXREb3VibGUoKSA9PSAtMS4wKQogICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoIlBhcnNlIHdpdGggXCJhcmUgbmVnYXRpdmVcIiBmYWlsZWQsIGF0ICIpICsgcG9zLmdldEVycm9ySW5kZXgoKSk7CiAgICBwb3Muc2V0SW5kZXgoMCk7IAogICAgcG9zLnNldEVycm9ySW5kZXgoLTEpOwogICAgZi0+cGFyc2UoImFyZSBubyBvciBmcmFjdGlvbiAiLCBvYmosIHBvcyk7CiAgICBpZiAocG9zLmdldEVycm9ySW5kZXgoKSAhPSAtMSAmJiBvYmouZ2V0RG91YmxlKCkgPT0gMC4wKQogICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoIlBhcnNlIHdpdGggXCJhcmUgbm8gb3IgZnJhY3Rpb25cIiBmYWlsZWQsIGF0ICIpICsgcG9zLmdldEVycm9ySW5kZXgoKSk7CiAgICBwb3Muc2V0SW5kZXgoMCk7IAogICAgcG9zLnNldEVycm9ySW5kZXgoLTEpOwogICAgZi0+cGFyc2UoImdvIHBvc3RhbCIsIG9iaiwgcG9zKTsKICAgIGlmIChwb3MuZ2V0RXJyb3JJbmRleCgpID09IC0xICYmICEgaWN1X2lzTmFOKG9iai5nZXREb3VibGUoKSkpCiAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygiUGFyc2Ugd2l0aCBcImdvIHBvc3RhbFwiIGZhaWxlZCwgYXQgIikgKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKICAgIAogICAgZGVsZXRlIGZtdDsKICAgIGRlbGV0ZSBmOwp9Ci8qIEBidWcgNDEwNDk3NgogKiBDaG9pY2VGb3JtYXQuZXF1YWxzKG51bGwpIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgogKi8KCi8vIHtzZmJ9IG5vdCByZWFsbHkgYXBwbGljYWJsZSBpbiBDKys/PyAoa2luZCBvZiBzaWxseSkKCnZvaWQgTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0OjpUZXN0NDEwNDk3NigpCnsKICAgIGRvdWJsZSBsaW1pdHMgW10gPSB7MSwgMjB9OwogICAgVW5pY29kZVN0cmluZyBmb3JtYXRzIFtdID0gewogICAgICAgIFVuaWNvZGVTdHJpbmcoInh5eiIpLCAKICAgICAgICBVbmljb2RlU3RyaW5nKCJhYmMiKQogICAgfTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICAgIENob2ljZUZvcm1hdCAqY2YgPSBuZXcgQ2hvaWNlRm9ybWF0KGxpbWl0cywgZm9ybWF0cywgc3RhdHVzKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibmV3IENob2ljZUZvcm1hdCIpOwogICAgLy90cnkgewogICAgICAgIGxvZygiQ29tcGFyZXMgdG8gbnVsbCBpcyBhbHdheXMgZmFsc2UsIHJldHVybmVkIDogIik7CiAgICAgICAgbG9nbG4oY2YgPT0gTlVMTCA/ICJUUlVFIiA6ICJGQUxTRSIpOwogICAgLyp9IGNhdGNoIChFeGNlcHRpb24gZm9vKSB7CiAgICAgICAgZXJybG4oIkNob2ljZUZvcm1hdC5lcXVhbHMobnVsbCkgdGhyb3dzIGV4Y2VwdGlvbi4iKTsKICAgIH0qLwoKICAgIGRlbGV0ZSBjZjsKfQoKLyogQGJ1ZyA0MTA2NjU5CiAqIENob2ljZUZvcm1hdC5jdG9yKGRvdWJsZVtdLCBTdHJpbmdbXSkgZG9lc24ndCBjaGVjawogKiB3aGV0aGVyIGxlbmd0aHMgb2YgaW5wdXQgYXJyYXlzIGFyZSBlcXVhbC4KICovCgovLyB7c2ZifSBhZ2Fpbiwgbm90IHJlYWxseSBhcHBsaWNhYmxlIGluIEMrKwoKdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTA2NjU5KCkKewogICAgLyoKICAgIGRvdWJsZSBsaW1pdHMgW10gPSB7CiAgICAgICAgMSwgMiwgMwogICAgfTsKICAgIFVuaWNvZGVTdHJpbmcgZm9ybWF0cyBbXSA9IHsKICAgICAgICAib25lIiwgInR3byIKICAgIH07CiAgICBDaG9pY2VGb3JtYXQgKmNmID0gTlVMTDsKICAgIC8vdHJ5IHsKICAgIC8vICAgIGNmID0gbmV3IENob2ljZUZvcm1hdChsaW1pdHMsIGZvcm1hdHMsIDMpOwogICAgLy99IGNhdGNoIChFeGNlcHRpb24gZm9vKSB7CiAgICAvLyAgICBsb2dsbigiQ2hvaWNlRm9ybWF0IGNvbnN0cnVjdG9yIHNob3VsZCBjaGVjayBmb3IgdGhlIGFycmF5IGxlbmd0aHMiKTsKICAgIC8vICAgIGNmID0gbnVsbDsKICAgIC8vfQogICAgLy9pZiAoY2YgIT0gbnVsbCkgCiAgICAvLyAgICBlcnJsbihjZi0+Zm9ybWF0KDUpKTsKICAgIC8vCiAgICBkZWxldGUgY2Y7CiAgICAqLwp9CgovKiBAYnVnIDQxMDY2NjAKICogQ2hvaWNlRm9ybWF0LmN0b3IoZG91YmxlW10sIFN0cmluZ1tdKSBhbGxvd3MgdW5vcmRlcmVkIGRvdWJsZSBhcnJheS4KICogVGhpcyBpcyBub3QgYSBidWcsIGFkZGVkIGphdmFkb2MgdG8gZW1waGFzaXplIHRoZSB1c2Ugb2YgbGltaXQKICogYXJyYXkgbXVzdCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIuCiAqLwp2b2lkIE1lc3NhZ2VGb3JtYXRSZWdyZXNzaW9uVGVzdDo6VGVzdDQxMDY2NjAoKQp7CiAgICBkb3VibGUgbGltaXRzIFtdID0gezMsIDEsIDJ9OwogICAgVW5pY29kZVN0cmluZyBmb3JtYXRzIFtdID0gewogICAgICAgIFVuaWNvZGVTdHJpbmcoIlRocmVlIiksIAogICAgICAgICAgICBVbmljb2RlU3RyaW5nKCJPbmUiKSwgCiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcoIlR3byIpCiAgICB9OwogICAgQ2hvaWNlRm9ybWF0ICpjZiA9IG5ldyBDaG9pY2VGb3JtYXQobGltaXRzLCBmb3JtYXRzLCAzKTsKICAgIGRvdWJsZSBkID0gNS4wOwogICAgVW5pY29kZVN0cmluZyBzdHI7CiAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgc3RyID0gY2YtPmZvcm1hdChkLCBzdHIsIHBvcyk7CiAgICBpZiAoc3RyICE9ICJUd28iKQogICAgICAgIGVycmxuKCAoVW5pY29kZVN0cmluZykgImZvcm1hdCgiICsgZCArICIpID0gIiArIHN0cik7CgogICAgZGVsZXRlIGNmOwp9CgovKiBAYnVnIDQxMTE3MzkKICogTWVzc2FnZUZvcm1hdCBpcyBpbmNvcnJlY3RseSBzZXJpYWxpemVkL2Rlc2VyaWFsaXplZC4KICovCgovLyB7c2ZifSBkb2Vzbid0IGFwcGx5IGluIEMrKwoKdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTExNzM5KCkKewogICAgLypNZXNzYWdlRm9ybWF0IGZvcm1hdDEgPSBudWxsOwogICAgTWVzc2FnZUZvcm1hdCBmb3JtYXQyID0gbnVsbDsKICAgIE9iamVjdE91dHB1dFN0cmVhbSBvc3RyZWFtID0gbnVsbDsKICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbnVsbDsKICAgIE9iamVjdElucHV0U3RyZWFtIGlzdHJlYW0gPSBudWxsOwoKICAgIHRyeSB7CiAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICBvc3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewogICAgICAgIGVycmxuKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRyeSB7CiAgICAgICAgZm9ybWF0MSA9IG5ldyBNZXNzYWdlRm9ybWF0KCJwYXR0ZXJuezB9Iik7CiAgICAgICAgb3N0cmVhbS53cml0ZU9iamVjdChmb3JtYXQxKTsKICAgICAgICBvc3RyZWFtLmZsdXNoKCk7CgogICAgICAgIGJ5dGUgYnl0ZXNbXSA9IGJhb3MudG9CeXRlQXJyYXkoKTsKCiAgICAgICAgaXN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKICAgICAgICBmb3JtYXQyID0gKE1lc3NhZ2VGb3JtYXQpaXN0cmVhbS5yZWFkT2JqZWN0KCk7CiAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgZXJybG4oIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgIH0KCiAgICBpZiAoIWZvcm1hdDEuZXF1YWxzKGZvcm1hdDIpKSB7CiAgICAgICAgZXJybG4oIk1lc3NhZ2VGb3JtYXRzIGJlZm9yZSBhbmQgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhcmUgbm90IiArCiAgICAgICAgICAgICIgZXF1YWxcbmZvcm1hdDEgPSAiICsgZm9ybWF0MSArICIoIiArIGZvcm1hdDEudG9QYXR0ZXJuKCkgKyAiKVxuZm9ybWF0MiA9ICIgKwogICAgICAgICAgICBmb3JtYXQyICsgIigiICsgZm9ybWF0Mi50b1BhdHRlcm4oKSArICIpIik7CiAgICB9IGVsc2UgewogICAgICAgIGxvZ2xuKCJTZXJpYWxpemF0aW9uIGZvciBNZXNzYWdlRm9ybWF0IGlzIE9LLiIpOwogICAgfSovCn0KLyogQGJ1ZyA0MTE0NzQzCiAqIE1lc3NhZ2VGb3JtYXQuYXBwbHlQYXR0ZXJuIGFsbG93cyBpbGxlZ2FsIHBhdHRlcm5zLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTE0NzQzKCkKewogICAgVW5pY29kZVN0cmluZyBvcmlnaW5hbFBhdHRlcm4oImluaXRpYWwgcGF0dGVybiIpOwogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgTWVzc2FnZUZvcm1hdCAqbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChvcmlnaW5hbFBhdHRlcm4sIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBNZXNzYWdlRm9ybWF0Iik7CiAgICAvL3RyeSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBpbGxlZ2FsUGF0dGVybigiYWIgeyAnfScgZGUiKTsKICAgICAgICBtZi0+YXBwbHlQYXR0ZXJuKGlsbGVnYWxQYXR0ZXJuLCBzdGF0dXMpOwogICAgICAgIGlmKCAhIEZBSUxVUkUoc3RhdHVzKSkKICAgICAgICAgICAgZXJybG4oImlsbGVnYWwgcGF0dGVybjogXCIiICsgaWxsZWdhbFBhdHRlcm4gKyAiXCIiKTsKICAgIC8qfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvbykgewogICAgICAgIGlmICghb3JpZ2luYWxQYXR0ZXJuLmVxdWFscyhtZi50b1BhdHRlcm4oKSkpCiAgICAgICAgICAgIGVycmxuKCJwYXR0ZXJuIGFmdGVyOiBcIiIgKyBtZi50b1BhdHRlcm4oKSArICJcIiIpOwogICAgfSovCn0KCi8qIEBidWcgNDExNjQ0NAogKiBNZXNzYWdlRm9ybWF0LnBhcnNlIGhhcyBkaWZmZXJlbnQgYmVoYXZpb3IgaW4gY2FzZSBvZiBudWxsLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTE2NDQ0KCkKewogICAgVW5pY29kZVN0cmluZyBwYXR0ZXJucyBbXSA9IHsKICAgICAgICAoVW5pY29kZVN0cmluZykiIiwgCiAgICAgICAgKFVuaWNvZGVTdHJpbmcpIm9uZSIsIAogICAgICAgIChVbmljb2RlU3RyaW5nKSAiezAsZGF0ZSxzaG9ydH0iCiAgICB9OwogICAgCiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7ICAgIAogICAgTWVzc2FnZUZvcm1hdCAqbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgiIiwgc3RhdHVzKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibmV3IE1lc3NhZ2VGb3JtYXQiKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybiA9IHBhdHRlcm5zW2ldOwogICAgICAgIG1mLT5hcHBseVBhdHRlcm4ocGF0dGVybiwgc3RhdHVzKTsKICAgICAgICBmYWlsdXJlKHN0YXR1cywgIm1mLT5hcHBseVBhdHRlcm4iKTsKCiAgICAgICAgLy90cnkgewogICAgICAgIGludDMyX3QgY291bnQgPSAwOyAgICAKICAgICAgICBQYXJzZVBvc2l0aW9uIHBwKDApOwogICAgICAgIEZvcm1hdHRhYmxlICphcnJheSA9IG1mLT5wYXJzZShVbmljb2RlU3RyaW5nKCIiKSwgcHAsIGNvdW50KTsKICAgICAgICAgICAgbG9nbG4oInBhdHRlcm46IFwiIiArIHBhdHRlcm4gKyAiXCIiKTsKICAgICAgICAgICAgbG9nKCIgcGFyc2VkT2JqZWN0czogIik7CiAgICAgICAgICAgIGlmIChhcnJheSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBsb2coInsiKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8vaWYgKGFycmF5W2pdICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBkdW1teTsKICAgICAgICAgICAgICAgICAgICBlcnIoIlwiIiArIGFycmF5W2pdLmdldFN0cmluZyhkdW1teSkgKyAiXCIiKTsKICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKICAgICAgICAgICAgICAgICAgICAgLy8gICBsb2coIm51bGwiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGNvdW50LSAxKSAKICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsb2coIn0iKSA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb2coIm51bGwiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2dsbigiIik7CiAgICAgICAgLyp9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlcnJsbigicGF0dGVybjogXCIiICsgcGF0dGVybiArICJcIiIpOwogICAgICAgICAgICBlcnJsbigiICBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfSovCiAgICB9CgogICAgZGVsZXRlIG1mOwp9Ci8qIEBidWcgNDExNDczOSAoRklYIGFuZCBhZGQgamF2YWRvYykKICogTWVzc2FnZUZvcm1hdC5mb3JtYXQgaGFzIHVuZG9jdW1lbnRlZCBiZWhhdmlvciBhYm91dCBlbXB0eSBmb3JtYXQgb2JqZWN0cy4KICovCgovLyB7c2ZifSBkb2Vzbid0IGFwcGx5IGluIEMrKz8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTE0NzM5KCkKewoKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsgICAgCiAgICBNZXNzYWdlRm9ybWF0ICptZiA9IG5ldyBNZXNzYWdlRm9ybWF0KCI8ezB9PiIsIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBNZXNzYWdlRm9ybWF0Iik7CgogICAgRm9ybWF0dGFibGUgKm9ianMxID0gTlVMTDsKICAgIC8vRm9ybWF0dGFibGUgb2JqczIgW10gPSB7fTsKICAgIC8vRm9ybWF0dGFibGUgKm9ianMzIFtdID0ge05VTEx9OwogICAgLy90cnkgewogICAgVW5pY29kZVN0cmluZyBwYXQ7CiAgICBVbmljb2RlU3RyaW5nIHJlczsKICAgICAgICBsb2dsbigicGF0dGVybjogXCIiICsgbWYtPnRvUGF0dGVybihwYXQpICsgIlwiIik7CiAgICAgICAgbG9nKCJmb3JtYXQobnVsbCkgOiAiKTsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgICAgIGxvZ2xuKCJcIiIgKyBtZi0+Zm9ybWF0KG9ianMxLCAwLCByZXMsIHBvcywgc3RhdHVzKSArICJcIiIpOwogICAgICAgIGZhaWx1cmUoc3RhdHVzLCAibWYtPmZvcm1hdCIpOwogICAgICAgIC8qbG9nKCJmb3JtYXQoe30pICAgOiAiKTsKICAgICAgICBsb2dsbigiXCIiICsgbWYtPmZvcm1hdChvYmpzMiwgMCwgcmVzLCBGaWVsZFBvc2l0aW9uKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSksIHN0YXR1cykgKyAiXCIiKTsKICAgICAgICBmYWlsdXJlKHN0YXR1cywgIm1mLT5mb3JtYXQiKTsKICAgICAgICBsb2coImZvcm1hdCh7bnVsbH0pIDoiKTsKICAgICAgICBsb2dsbigiXCIiICsgbWYtPmZvcm1hdChvYmpzMywgMCwgcmVzLCBGaWVsZFBvc2l0aW9uKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSksIHN0YXR1cykgKyAiXCIiKTsKICAgICAgICBmYWlsdXJlKHN0YXR1cywgIm1mLT5mb3JtYXQiKTsqLwogICAgLyp9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgIGVycmxuKCJFeGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50IHRlc3RzLiIpOwogICAgfSovCgogICAgZGVsZXRlIG1mOwp9CgovKiBAYnVnIDQxMTMwMTgKICogTWVzc2FnZUZvcm1hdC5hcHBseVBhdHRlcm4gd29ya3Mgd3Jvbmcgd2l0aCBpbGxlZ2FsIHBhdHRlcm5zLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTEzMDE4KCkKewogICAgVW5pY29kZVN0cmluZyBvcmlnaW5hbFBhdHRlcm4oImluaXRpYWwgcGF0dGVybiIpOwogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgTWVzc2FnZUZvcm1hdCAqbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChvcmlnaW5hbFBhdHRlcm4sIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBtZXNzYWdlRm9ybWF0Iik7CiAgICBVbmljb2RlU3RyaW5nIGlsbGVnYWxQYXR0ZXJuKCJmb3JtYXQ6IHswLCB4eHhZWVl9Iik7CiAgICBVbmljb2RlU3RyaW5nIHBhdDsKICAgIGxvZ2xuKCJwYXR0ZXJuIGJlZm9yZTogXCIiICsgbWYtPnRvUGF0dGVybihwYXQpICsgIlwiIik7CiAgICBsb2dsbigiaWxsZWdhbCBwYXR0ZXJuOiBcIiIgKyBpbGxlZ2FsUGF0dGVybiArICJcIiIpOwogICAgLy90cnkgewogICAgICAgIG1mLT5hcHBseVBhdHRlcm4oaWxsZWdhbFBhdHRlcm4sIHN0YXR1cyk7CiAgICAgICAgaWYoICEgRkFJTFVSRShzdGF0dXMpKQogICAgICAgICAgICBlcnJsbigiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3IgcGF0dGVybiA6ICIgKyBpbGxlZ2FsUGF0dGVybik7CiAgICAvKn0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgaWYgKCFvcmlnaW5hbFBhdHRlcm4uZXF1YWxzKG1mLnRvUGF0dGVybigpKSkKICAgICAgICAgICAgZXJybG4oInBhdHRlcm4gYWZ0ZXI6IFwiIiArIG1mLnRvUGF0dGVybigpICsgIlwiIik7CiAgICB9Ki8KICAgIGRlbGV0ZSBtZjsKfQoKLyogQGJ1ZyA0MTA2NjYxCiAqIENob2ljZUZvcm1hdCBpcyBzaWxlbnQgYWJvdXQgdGhlIHBhdHRlcm4gdXNhZ2UgaW4gamF2YWRvYy4KICovCnZvaWQgTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0OjpUZXN0NDEwNjY2MSgpCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICAgIENob2ljZUZvcm1hdCAqZm10ID0gbmV3IENob2ljZUZvcm1hdCgKICAgICAgIi0xI2FyZSBuZWdhdGl2ZXwgMCNhcmUgbm8gb3IgZnJhY3Rpb24gfCAxI2lzIG9uZSB8MS4wPGlzIDErIHwyI2FyZSB0d28gfDI8YXJlIG1vcmUgdGhhbiAyLiIsIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBDaG9pY2VGb3JtYXQiKTsKICAgIFVuaWNvZGVTdHJpbmcgcGF0OwogICAgbG9nbG4oIkZvcm1hdHRlciBQYXR0ZXJuIDogIiArIGZtdC0+dG9QYXR0ZXJuKHBhdCkpOwoKICAgIEZpZWxkUG9zaXRpb24gYm9ndXMoRmllbGRQb3NpdGlvbjo6RE9OVF9DQVJFKTsKICAgIFVuaWNvZGVTdHJpbmcgc3RyOwoKICAgIC8vIFdpbGwgdGhpcyB3b3JrIGZvciAtaW5mPwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIC1JTkYgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoLWljdV9nZXRJbmZpbml0eSgpKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggLTEuMCA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgtMS4wKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggLTEuMCA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgtMS4wKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggMCA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgoaW50MzJfdCkwKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggMC45IDogIiArIGZtdC0+Zm9ybWF0KEZvcm1hdHRhYmxlKDAuOSksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIDEuMCA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgxLjApLCBzdHIsIGJvZ3VzLCBzdGF0dXMpKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAiZm10LT5mb3JtYXQiKTsKICAgIHN0ci5yZW1vdmUoKTsKICAgIGxvZ2xuKCJGb3JtYXQgd2l0aCAxLjUgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoMS41KSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggMiA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgoaW50MzJfdCkyKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggMi4xIDogIiArIGZtdC0+Zm9ybWF0KEZvcm1hdHRhYmxlKDIuMSksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIE5hTiA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZShpY3VfZ2V0TmFOKCkpLCBzdHIsIGJvZ3VzLCBzdGF0dXMpKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAiZm10LT5mb3JtYXQiKTsKICAgIHN0ci5yZW1vdmUoKTsKICAgIGxvZ2xuKCJGb3JtYXQgd2l0aCArSU5GIDogIiArIGZtdC0+Zm9ybWF0KEZvcm1hdHRhYmxlKGljdV9nZXRJbmZpbml0eSgpKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CgogICAgZGVsZXRlIGZtdDsKfQoKLyogQGJ1ZyA0MDk0OTA2CiAqIENob2ljZUZvcm1hdCBzaG91bGQgYWNjZXB0IFx1MjIxRSBhcyBlcS4gdG8gSU5GLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MDk0OTA2KCkKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgVW5pY29kZVN0cmluZyBwYXR0ZXJuKCItIik7CiAgICBwYXR0ZXJuICs9IChVQ2hhcikgMHgyMjFFOwogICAgcGF0dGVybiArPSAiPGFyZSBuZWdhdGl2ZXwwLjA8YXJlIG5vIG9yIGZyYWN0aW9ufDEuMCNpcyBvbmV8MS4wPGlzIDErfCI7CiAgICBwYXR0ZXJuICs9IChVQ2hhcikgMHgyMjFFOwogICAgcGF0dGVybiArPSAiPGFyZSBtYW55LiI7CgogICAgQ2hvaWNlRm9ybWF0ICpmbXQgPSBuZXcgQ2hvaWNlRm9ybWF0KHBhdHRlcm4sIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBDaG9pY2VGb3JtYXQiKTsKICAgIFVuaWNvZGVTdHJpbmcgcGF0OwogICAgaWYgKGZtdC0+dG9QYXR0ZXJuKHBhdCkgIT0gcGF0dGVybikgewogICAgICAgIGVycmxuKCAoVW5pY29kZVN0cmluZykgIkZvcm1hdHRlciBQYXR0ZXJuIDogIiArIHBhdCk7CiAgICAgICAgZXJybG4oIChVbmljb2RlU3RyaW5nKSAiRXhwZWN0ZWQgUGF0dGVybiAgOiAiICsgcGF0dGVybik7CiAgICB9CiAgICBGaWVsZFBvc2l0aW9uIGJvZ3VzKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSk7CiAgICBVbmljb2RlU3RyaW5nIHN0cjsKCiAgICAvLyBXaWxsIHRoaXMgd29yayBmb3IgLWluZj8KICAgIGxvZ2xuKCJGb3JtYXQgd2l0aCAtSU5GIDogIiArIGZtdC0+Zm9ybWF0KEZvcm1hdHRhYmxlKC1pY3VfZ2V0SW5maW5pdHkoKSksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIC0xLjAgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoLTEuMCksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIC0xLjAgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoLTEuMCksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIDAgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoKGludDMyX3QpMCksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIDAuOSA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgwLjkpLCBzdHIsIGJvZ3VzLCBzdGF0dXMpKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAiZm10LT5mb3JtYXQiKTsKICAgIHN0ci5yZW1vdmUoKTsKICAgIGxvZ2xuKCJGb3JtYXQgd2l0aCAxLjAgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoMS4wKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggMS41IDogIiArIGZtdC0+Zm9ybWF0KEZvcm1hdHRhYmxlKDEuNSksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIDIgOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoKGludDMyX3QpMiksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwogICAgc3RyLnJlbW92ZSgpOwogICAgbG9nbG4oIkZvcm1hdCB3aXRoIDIuMSA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZSgyLjEpLCBzdHIsIGJvZ3VzLCBzdGF0dXMpKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAiZm10LT5mb3JtYXQiKTsKICAgIHN0ci5yZW1vdmUoKTsKICAgIGxvZ2xuKCJGb3JtYXQgd2l0aCBOYU4gOiAiICsgZm10LT5mb3JtYXQoRm9ybWF0dGFibGUoaWN1X2dldE5hTigpKSwgc3RyLCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZtdC0+Zm9ybWF0Iik7CiAgICBzdHIucmVtb3ZlKCk7CiAgICBsb2dsbigiRm9ybWF0IHdpdGggK0lORiA6ICIgKyBmbXQtPmZvcm1hdChGb3JtYXR0YWJsZShpY3VfZ2V0SW5maW5pdHkoKSksIHN0ciwgYm9ndXMsIHN0YXR1cykpOwogICAgZmFpbHVyZShzdGF0dXMsICJmbXQtPmZvcm1hdCIpOwoKICAgIGRlbGV0ZSBmbXQ7Cn0KCi8qIEBidWcgNDExODU5MgogKiBNZXNzYWdlRm9ybWF0LnBhcnNlIGZhaWxzIHdpdGggQ2hvaWNlRm9ybWF0LgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTE4NTkyKCkKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgTWVzc2FnZUZvcm1hdCAqbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgiIiwgc3RhdHVzKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibmV3IG1lc3NhZ2VGb3JtYXQiKTsKICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybigiezAsY2hvaWNlLDEjWUVTfDIjTk99Iik7CiAgICBVbmljb2RlU3RyaW5nIHByZWZpeCgiIik7CiAgICBGb3JtYXR0YWJsZSAqb2JqcyA9IDA7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIGZvcm1hdHRlZDsKICAgICAgICBmb3JtYXR0ZWQgPSBwcmVmaXggKyAiWUVTIjsKICAgICAgICBtZi0+YXBwbHlQYXR0ZXJuKHByZWZpeCArIHBhdHRlcm4sIHN0YXR1cyk7CiAgICAgICAgZmFpbHVyZShzdGF0dXMsICJtZi0+YXBwbHlQYXR0ZXJuIik7CiAgICAgICAgcHJlZml4ICs9ICJ4IjsKICAgICAgICAvL09iamVjdFtdIG9ianMgPSBtZi5wYXJzZShmb3JtYXR0ZWQsIG5ldyBQYXJzZVBvc2l0aW9uKDApKTsKICAgICAgICBpbnQzMl90IGNvdW50ID0gMDsKICAgICAgICBQYXJzZVBvc2l0aW9uIHBwKDApOwogICAgICAgIG9ianMgPSBtZi0+cGFyc2UoZm9ybWF0dGVkLCBwcCwgY291bnQpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgcGF0OwogICAgICAgIGxvZ2xuKFVuaWNvZGVTdHJpbmcoIiIpICsgaSArICIuIHBhdHRlcm4gOlwiIiArIG1mLT50b1BhdHRlcm4ocGF0KSArICJcIiIpOwogICAgICAgIGxvZygiIFwiIiArIGZvcm1hdHRlZCArICJcIiBwYXJzZWQgYXMgIik7CiAgICAgICAgaWYgKG9ianMgPT0gTlVMTCkgCiAgICAgICAgICAgIGxvZ2xuKCIgIG51bGwiKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgICAgICBpZihvYmpzWzBdLmdldFR5cGUoKSA9PSBGb3JtYXR0YWJsZTo6a1N0cmluZykKICAgICAgICAgICAgICAgIGxvZ2xuKChVbmljb2RlU3RyaW5nKSIgICIgKyBvYmpzWzBdLmdldFN0cmluZyh0ZW1wKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxvZ2xuKChVbmljb2RlU3RyaW5nKSIgICIgKyAob2Jqc1swXS5nZXRUeXBlKCkgPT0gRm9ybWF0dGFibGU6OmtMb25nID8gb2Jqc1swXS5nZXRMb25nKCkgOiBvYmpzWzBdLmdldERvdWJsZSgpKSk7CgogICAgICAgIH0KICAgIH0KCiAgICBkZWxldGUgW10gb2JqczsKICAgIGRlbGV0ZSBtZjsKfQovKiBAYnVnIDQxMTg1OTQKICogTWVzc2FnZUZvcm1hdC5wYXJzZSBmYWlscyBmb3Igc29tZSBwYXR0ZXJucy4KICovCnZvaWQgTWVzc2FnZUZvcm1hdFJlZ3Jlc3Npb25UZXN0OjpUZXN0NDExODU5NCgpCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICAgIE1lc3NhZ2VGb3JtYXQgKm1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoInswfSwgezB9LCB7MH0iLCBzdGF0dXMpOwogICAgZmFpbHVyZShzdGF0dXMsICJuZXcgTWVzc2FnZUZvcm1hdCIpOwogICAgVW5pY29kZVN0cmluZyBmb3JQYXJzaW5nKCJ4LCB5LCB6Iik7CiAgICAvL09iamVjdFtdIG9ianMgPSBtZi5wYXJzZShmb3JQYXJzaW5nLCBuZXcgUGFyc2VQb3NpdGlvbigwKSk7CiAgICBpbnQzMl90IGNvdW50ID0gMDsKICAgIFBhcnNlUG9zaXRpb24gcHAoMCk7CiAgICBGb3JtYXR0YWJsZSAqb2JqcyA9IG1mLT5wYXJzZShmb3JQYXJzaW5nLCBwcCwgY291bnQpOwogICAgVW5pY29kZVN0cmluZyBwYXQ7CiAgICBsb2dsbigicGF0dGVybjogXCIiICsgbWYtPnRvUGF0dGVybihwYXQpICsgIlwiIik7CiAgICBsb2dsbigidGV4dCBmb3IgcGFyc2luZzogXCIiICsgZm9yUGFyc2luZyArICJcIiIpOwogICAgVW5pY29kZVN0cmluZyBzdHI7CiAgICBpZiAob2Jqc1swXS5nZXRTdHJpbmcoc3RyKSAhPSAieiIpCiAgICAgICAgZXJybG4oImFyZ3VtZW50MDogXCIiICsgb2Jqc1swXS5nZXRTdHJpbmcoc3RyKSArICJcIiIpOwogICAgbWYtPmFwcGx5UGF0dGVybigiezAsbnVtYmVyLCMuIyN9LCB7MCxudW1iZXIsIy4jfSIsIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm1mLT5hcHBseVBhdHRlcm4iKTsKICAgIC8vT2JqZWN0W10gb2xkb2JqcyA9IHtuZXcgRG91YmxlKDMuMTQxNSl9OwogICAgRm9ybWF0dGFibGUgb2xkb2JqcyBbXSA9IHtGb3JtYXR0YWJsZSgzLjE0MTUpfTsKICAgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OwogICAgRmllbGRQb3NpdGlvbiBwb3MoRmllbGRQb3NpdGlvbjo6RE9OVF9DQVJFKTsKICAgIHJlc3VsdCA9IG1mLT5mb3JtYXQoIG9sZG9ianMsIDEsIHJlc3VsdCwgcG9zLCBzdGF0dXMgKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibWYtPmZvcm1hdCIpOwogICAgcGF0LnJlbW92ZSgpOwogICAgbG9nbG4oInBhdHRlcm46IFwiIiArIG1mLT50b1BhdHRlcm4ocGF0KSArICJcIiIpOwogICAgbG9nbG4oInRleHQgZm9yIHBhcnNpbmc6IFwiIiArIHJlc3VsdCArICJcIiIpOwogICAgLy8gcmVzdWx0IG5vdyBlcXVhbHMgIjMuMTQsIDMuMSIKICAgIGlmIChyZXN1bHQgIT0gIjMuMTQsIDMuMSIpCiAgICAgICAgZXJybG4oInJlc3VsdCA9ICIgKyByZXN1bHQpOwogICAgLy9PYmplY3RbXSBuZXdvYmpzID0gbWYucGFyc2UocmVzdWx0LCBuZXcgUGFyc2VQb3NpdGlvbigwKSk7CiAgICBpbnQzMl90IGNvdW50MSA9IDA7CiAgICBwcC5zZXRJbmRleCgwKTsKICAgIEZvcm1hdHRhYmxlICpuZXdvYmpzID0gbWYtPnBhcnNlKHJlc3VsdCwgcHAsIGNvdW50MSk7CiAgICAvLyBuZXdvYmpzIG5vdyBlcXVhbHMge25ldyBEb3VibGUoMy4xKX0KICAgIGlmIChuZXdvYmpzWzBdLmdldERvdWJsZSgpICE9IDMuMSkKICAgICAgICBlcnJsbiggVW5pY29kZVN0cmluZygibmV3b2Jqc1swXSA9ICIpICsgbmV3b2Jqc1swXS5nZXREb3VibGUoKSk7CgogICAgZGVsZXRlIFtdIG9ianM7CiAgICBkZWxldGUgW10gbmV3b2JqczsKICAgIGRlbGV0ZSBtZjsKfQovKiBAYnVnIDQxMDUzODAKICogV2hlbiB1c2luZyBDaG9pY2VGb3JtYXQsIE1lc3NhZ2VGb3JtYXQgaXMgbm90IGdvb2QgZm9yIEkxOG4uCiAqLwp2b2lkIE1lc3NhZ2VGb3JtYXRSZWdyZXNzaW9uVGVzdDo6VGVzdDQxMDUzODAoKQp7CiAgICBVbmljb2RlU3RyaW5nIHBhdHRlcm5UZXh0MSgiVGhlIGRpc2sgXCJ7MX1cIiBjb250YWlucyB7MH0uIik7CiAgICBVbmljb2RlU3RyaW5nIHBhdHRlcm5UZXh0MigiVGhlcmUgYXJlIHswfSBvbiB0aGUgZGlzayBcInsxfVwiIik7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAgICBNZXNzYWdlRm9ybWF0ICpmb3JtMSA9IG5ldyBNZXNzYWdlRm9ybWF0KHBhdHRlcm5UZXh0MSwgc3RhdHVzKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibmV3IE1lc3NhZ2VGb3JtYXQiKTsKICAgIE1lc3NhZ2VGb3JtYXQgKmZvcm0yID0gbmV3IE1lc3NhZ2VGb3JtYXQocGF0dGVyblRleHQyLCBzdGF0dXMpOwogICAgZmFpbHVyZShzdGF0dXMsICJuZXcgTWVzc2FnZUZvcm1hdCIpOwogICAgZG91YmxlIGZpbGVsaW1pdHMgW10gPSB7MCwxLDJ9OwogICAgVW5pY29kZVN0cmluZyBmaWxlcGFydCBbXSA9IHsKICAgICAgICAoVW5pY29kZVN0cmluZykibm8gZmlsZXMiLAogICAgICAgICAgICAoVW5pY29kZVN0cmluZykib25lIGZpbGUiLAogICAgICAgICAgICAoVW5pY29kZVN0cmluZykiezAsbnVtYmVyfSBmaWxlcyIKICAgIH07CiAgICBDaG9pY2VGb3JtYXQgKmZpbGVmb3JtID0gbmV3IENob2ljZUZvcm1hdChmaWxlbGltaXRzLCBmaWxlcGFydCwgMyk7CiAgICBmb3JtMS0+c2V0Rm9ybWF0KDEsICpmaWxlZm9ybSk7CiAgICBmb3JtMi0+c2V0Rm9ybWF0KDAsICpmaWxlZm9ybSk7CiAgICAvL09iamVjdFtdIHRlc3RBcmdzID0ge25ldyBMb25nKDEyMzczKSwgIk15RGlzayJ9OwogICAgRm9ybWF0dGFibGUgdGVzdEFyZ3MgW10gPSB7CiAgICAgICAgRm9ybWF0dGFibGUoKGludDMyX3QpMTIzNzMpLCAKICAgICAgICAgICAgRm9ybWF0dGFibGUoKFVuaWNvZGVTdHJpbmcpIk15RGlzayIpCiAgICB9OwogICAgCiAgICBGaWVsZFBvc2l0aW9uIGJvZ3VzKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSk7CgogICAgVW5pY29kZVN0cmluZyByZXN1bHQ7CiAgICBsb2dsbihmb3JtMS0+Zm9ybWF0KHRlc3RBcmdzLCAyLCByZXN1bHQsIGJvZ3VzLCBzdGF0dXMpKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAiZm9ybTEtPmZvcm1hdCIpOwogICAgcmVzdWx0LnJlbW92ZSgpOwogICAgbG9nbG4oZm9ybTItPmZvcm1hdCh0ZXN0QXJncywgMiwgcmVzdWx0LCBib2d1cywgc3RhdHVzKSk7CiAgICBmYWlsdXJlKHN0YXR1cywgImZvcm0xLT5mb3JtYXQiKTsKCiAgICBkZWxldGUgZm9ybTE7CiAgICBkZWxldGUgZm9ybTI7CiAgICBkZWxldGUgZmlsZWZvcm07Cn0KLyogQGJ1ZyA0MTIwNTUyCiAqIE1lc3NhZ2VGb3JtYXQucGFyc2UgaW5jb3JyZWN0bHkgc2V0cyBlcnJvckluZGV4LgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTIwNTUyKCkKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgTWVzc2FnZUZvcm1hdCAqbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgicGF0dGVybiIsIHN0YXR1cyk7CiAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBNZXNzYWdlRm9ybWF0Iik7CiAgICBVbmljb2RlU3RyaW5nIHRleHRzW10gPSB7CiAgICAgICAgKFVuaWNvZGVTdHJpbmcpInBhdHRlcm4iLCAKICAgICAgICAgICAgKFVuaWNvZGVTdHJpbmcpInBhdCIsIAogICAgICAgICAgICAoVW5pY29kZVN0cmluZykiMTIzNCIKICAgIH07CiAgICBVbmljb2RlU3RyaW5nIHBhdDsKICAgIGxvZ2xuKCJwYXR0ZXJuOiBcIiIgKyBtZi0+dG9QYXR0ZXJuKHBhdCkgKyAiXCIiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgUGFyc2VQb3NpdGlvbiBwcCgwKTsKICAgICAgICAvL09iamVjdFtdIG9ianMgPSBtZi5wYXJzZSh0ZXh0c1tpXSwgcHApOwogICAgICAgIGludDMyX3QgY291bnQgPSAwOwogICAgICAgIEZvcm1hdHRhYmxlICpvYmpzID0gbWYtPnBhcnNlKHRleHRzW2ldLCBwcCwgY291bnQpOwogICAgICAgIGxvZygiICB0ZXh0IGZvciBwYXJzaW5nOiBcIiIgKyB0ZXh0c1tpXSArICJcIiIpOwogICAgICAgIGlmIChvYmpzID09IE5VTEwpIHsKICAgICAgICAgICAgbG9nbG4oIiAgKGluY29ycmVjdGx5IGZvcm1hdHRlZCBzdHJpbmcpIik7CiAgICAgICAgICAgIGlmIChwcC5nZXRFcnJvckluZGV4KCkgPT0gLTEpCiAgICAgICAgICAgICAgICBlcnJsbihVbmljb2RlU3RyaW5nKCJJbmNvcnJlY3QgZXJyb3IgaW5kZXg6ICIpICsgcHAuZ2V0RXJyb3JJbmRleCgpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb2dsbigiICAoY29ycmVjdGx5IGZvcm1hdHRlZCBzdHJpbmcpIik7CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGJ1ZyA0MTQyOTM4CiAqIE1lc3NhZ2VGb3JtYXQgaGFuZGxlcyBzaW5nbGUgcXVvdGVzIGluIHBhdHRlcm4gd3JvbmcuCiAqIFRoaXMgaXMgYWN0dWFsbHkgYSBwcm9ibGVtIGluIENob2ljZUZvcm1hdDsgaXQgZG9lc24ndAogKiB1bmRlcnN0YW5kIHNpbmdsZSBxdW90ZXMuCiAqLwp2b2lkIE1lc3NhZ2VGb3JtYXRSZWdyZXNzaW9uVGVzdDo6VGVzdDQxNDI5MzgoKSAKewogICAgVW5pY29kZVN0cmluZyBwYXQoIChVbmljb2RlU3RyaW5nKSInJ1ZvdXMnJyB7MCxjaG9pY2UsMCNuJyd8MSN9YXZleiBz6WxlY3Rpb25u6SAiICsgCiAgICAgICAgInswLGNob2ljZSwwI2F1Y3VufDEjezB9fSBjbGllbnR7MCxjaG9pY2UsMCNzfDEjfDIjc30gIiArIAogICAgICAgICJwZXJzb25uZWx7MCxjaG9pY2UsMCNzfDEjfDIjc30uIik7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAgICBNZXNzYWdlRm9ybWF0ICptZiA9IG5ldyBNZXNzYWdlRm9ybWF0KHBhdCwgc3RhdHVzKTsKICAgIGZhaWx1cmUoc3RhdHVzLCAibmV3IE1lc3NhZ2VGb3JtYXQiKTsKCiAgICBVbmljb2RlU3RyaW5nIFBSRUZJWCBbXSA9IHsKICAgICAgICAoVW5pY29kZVN0cmluZykgIidWb3VzJyBuJ2F2ZXogc+lsZWN0aW9ubukgYXVjdW4gY2xpZW50cyBwZXJzb25uZWxzLiIsCiAgICAgICAgKFVuaWNvZGVTdHJpbmcpICInVm91cycgYXZleiBz6WxlY3Rpb25u6SAiLAogICAgICAgIChVbmljb2RlU3RyaW5nKSAiJ1ZvdXMnIGF2ZXogc+lsZWN0aW9ubukgIgogICAgfTsgIAogICAgVW5pY29kZVN0cmluZyBTVUZGSVggW10gPSB7CiAgICAgICAgKFVuaWNvZGVTdHJpbmcpICIiLAogICAgICAgIChVbmljb2RlU3RyaW5nKSAiIGNsaWVudCBwZXJzb25uZWwuIiwKICAgICAgICAoVW5pY29kZVN0cmluZykgIiBjbGllbnRzIHBlcnNvbm5lbHMuIgogICAgfTsKCiAgICBmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBvdXQ7CiAgICAgICAgLy9vdXQgPSBtZi0+Zm9ybWF0KG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihpKX0pOwogICAgICAgIEZvcm1hdHRhYmxlIG9ianMgW10gPSB7CiAgICAgICAgICAgIEZvcm1hdHRhYmxlKChpbnQzMl90KWkpCiAgICAgICAgfTsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgICAgIG91dCA9IG1mLT5mb3JtYXQob2JqcywgMSwgb3V0LCBwb3MsIHN0YXR1cyk7CiAgICAgICAgZmFpbHVyZShzdGF0dXMsICJtZi0+Zm9ybWF0Iik7CiAgICAgICAgaWYgKFNVRkZJWFtpXSA9PSAiIikgewogICAgICAgICAgICBpZiAob3V0ICE9IFBSRUZJWFtpXSkKICAgICAgICAgICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSIiICsgaSArICI6IEdvdCBcIiIgKyBvdXQgKyAiXCI7IFdhbnQgXCIiICsgUFJFRklYW2ldICsgIlwiIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoIW91dC5zdGFydHNXaXRoKFBSRUZJWFtpXSkgfHwKICAgICAgICAgICAgICAgICFvdXQuZW5kc1dpdGgoU1VGRklYW2ldKSkKICAgICAgICAgICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSIiICsgaSArICI6IEdvdCBcIiIgKyBvdXQgKyAiXCI7IFdhbnQgXCIiICsgUFJFRklYW2ldICsgIlwiLi4uXCIiICsKICAgICAgICAgICAgICAgICAgICAgIFNVRkZJWFtpXSArICJcIiIpOwogICAgICAgIH0KICAgIH0KCiAgICBkZWxldGUgbWY7Cn0KCi8qKgogKiBAYnVnIDQxNDI5MzgKICogVGVzdCB0aGUgYXBwbHlQYXR0ZXJuIGFuZCB0b1BhdHRlcm4gaGFuZGxpbmcgb2Ygc2luZ2xlIHF1b3RlcwogKiBieSBDaG9pY2VGb3JtYXQuICAoVGhpcyBpcyBpbiBoZXJlIGJlY2F1c2UgdGhpcyB3YXMgYSBidWcgcmVwb3J0ZWQKICogYWdhaW5zdCBNZXNzYWdlRm9ybWF0LikgIFRoZSBzaW5nbGUgcXVvdGUgaXMgdXNlZCB0byBxdW90ZSB0aGUKICogcGF0dGVybiBjaGFyYWN0ZXJzICd8JywgJyMnLCAnPCcsIGFuZCAnXHUyMjY0Jy4gIFR3byBxdW90ZXMgaW4gYSByb3cKICogaXMgYSBxdW90ZSBsaXRlcmFsLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3RDaG9pY2VQYXR0ZXJuUXVvdGUoKSAKewogICAgVW5pY29kZVN0cmluZyBEQVRBIFtdID0gewogICAgICAgIC8vIFBhdHRlcm4gICAgICAgICAgICAgICAgICAwIHZhbHVlICAgICAgICAgICAxIHZhbHVlCiAgICAgICAgLy8ge3NmYn0gaGFja2VkIC0gY2hhbmdlZCBcdTIyNjQgdG8gPSAoY29waWVkIGZyb20gQ2hhcmFjdGVyIE1hcCkKICAgICAgICAoVW5pY29kZVN0cmluZykiMCNjYW4nJ3R8MSNjYW4iLCAgICAgICAgICAgKFVuaWNvZGVTdHJpbmcpImNhbid0IiwgICAgICAgICAgKFVuaWNvZGVTdHJpbmcpImNhbiIsCiAgICAgICAgKFVuaWNvZGVTdHJpbmcpIjAjJ3BvdW5kKCMpPScnIycnJ3wxI3h5eiIsIChVbmljb2RlU3RyaW5nKSJwb3VuZCgjKT0nIyciLCAgIChVbmljb2RlU3RyaW5nKSJ4eXoiLAogICAgICAgIChVbmljb2RlU3RyaW5nKSIwIycxPDIgfCAxPTEnfDEjJyciLCAgKFVuaWNvZGVTdHJpbmcpIjE8MiB8IDE9MSIsIChVbmljb2RlU3RyaW5nKSInIiwKICAgIH07CiAgICBmb3IgKGludCBpPTA7IGk8OTsgaSs9MykgewogICAgICAgIC8vdHJ5IHsKICAgICAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgICAgICAgICBDaG9pY2VGb3JtYXQgKmNmID0gbmV3IENob2ljZUZvcm1hdChEQVRBW2ldLCBzdGF0dXMpOwogICAgICAgICAgICBmYWlsdXJlKHN0YXR1cywgIm5ldyBDaG9pY2VGb3JtYXQiKTsKICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPD0xOyArK2opIHsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgb3V0OwogICAgICAgICAgICAgICAgRmllbGRQb3NpdGlvbiBwb3MoRmllbGRQb3NpdGlvbjo6RE9OVF9DQVJFKTsKICAgICAgICAgICAgICAgIG91dCA9IGNmLT5mb3JtYXQoKGRvdWJsZSlqLCBvdXQsIHBvcyk7CiAgICAgICAgICAgICAgICBpZiAob3V0ICE9IERBVEFbaSsxK2pdKQogICAgICAgICAgICAgICAgICAgIGVycmxuKCJGYWlsOiBQYXR0ZXJuIFwiIiArIERBVEFbaV0gKyAiXCIgeCAiK2orIiAtPiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKyAiOyB3YW50IFwiIiArIERBVEFbaSsxK2pdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHBhdDsKICAgICAgICAgICAgcGF0ID0gY2YtPnRvUGF0dGVybihwYXQpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHBhdDI7CiAgICAgICAgICAgIENob2ljZUZvcm1hdCAqY2YyID0gbmV3IENob2ljZUZvcm1hdChwYXQsIHN0YXR1cyk7CiAgICAgICAgICAgIHBhdDIgPSBjZjItPnRvUGF0dGVybihwYXQyKTsKICAgICAgICAgICAgaWYgKHBhdCAhPSBwYXQyKQogICAgICAgICAgICAgICAgZXJybG4oIkZhaWw6IFBhdHRlcm4gXCIiICsgREFUQVtpXSArICJcIiB4IHRvUGF0dGVybiAtPiBcIiIgKyBwYXQgKyAnIicpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsb2dsbigiT2s6IFBhdHRlcm4gXCIiICsgREFUQVtpXSArICJcIiB4IHRvUGF0dGVybiAtPiBcIiIgKyBwYXQgKyAnIicpOwogICAgICAgIC8qfQogICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlcnJsbigiRmFpbDogUGF0dGVybiBcIiIgKyBEQVRBW2ldICsgIlwiIC0+ICIgKyBlKTsKICAgICAgICB9Ki8KICAgIAogICAgICAgIGRlbGV0ZSBjZjsKICAgICAgICBkZWxldGUgY2YyOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTEyMTA0CiAqIE1lc3NhZ2VGb3JtYXQuZXF1YWxzKG51bGwpIHRocm93cyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiAgVGhlIEpMUyBzdGF0ZXMKICogdGhhdCBpdCBzaG91bGQgcmV0dXJuIGZhbHNlLgogKi8Kdm9pZCBNZXNzYWdlRm9ybWF0UmVncmVzc2lvblRlc3Q6OlRlc3Q0MTEyMTA0KCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICAgIE1lc3NhZ2VGb3JtYXQgKmZvcm1hdCA9IG5ldyBNZXNzYWdlRm9ybWF0KCIiLCBzdGF0dXMpOwogICAgZmFpbHVyZShzdGF0dXMsICJuZXcgTWVzc2FnZUZvcm1hdCIpOwogICAgLy90cnkgewogICAgICAgIC8vIFRoaXMgc2hvdWxkIE5PVCB0aHJvdyBhbiBleGNlcHRpb24KICAgICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgICAgLy8gSXQgYWxzbyBzaG91bGQgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIGVycmxuKCJNZXNzYWdlRm9ybWF0LmVxdWFscyhudWxsKSByZXR1cm5zIGZhbHNlIik7CiAgICAgICAgfQogICAgLyp9CiAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewogICAgICAgIGVycmxuKCJNZXNzYWdlRm9ybWF0LmVxdWFscyhudWxsKSB0aHJvd3MgIiArIGUpOwogICAgfSovCn0KCg==