LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDogCiAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAogKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJsb2N0ZXN0LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjc3RyaW5nLmg+CgojaW5jbHVkZSAidW5pY29kZS9kZWNpbWZtdC5oIgovLyNpbmNsdWRlICJ1bmljb2RlL2RhdGVmbXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvc21wZHRmbXQuaCIKCmNoYXIqIHJhd0RhdGFbMjddWzddID0gewoKICAgICAgICAvLyBsYW5ndWFnZSBjb2RlCiAgICAgICAgeyAgICJlbiIsICAgImZyIiwgICAiaHIiLCAgICJlbCIsICAgIm5vIiwgICAiaXQiLCAgICJ4eCIgICAgfSwKICAgICAgICAvLyBjb3VudHJ5IGNvZGUKICAgICAgICB7ICAgIlVTIiwgICAiRlIiLCAgICJIUiIsICAgIkdSIiwgICAiTk8iLCAgICIiLCAgICAgIllZIiAgICB9LAogICAgICAgIC8vIHZhcmlhbnQgY29kZQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIiAgICB9LAogICAgICAgIC8vIGZ1bGwgbmFtZQogICAgICAgIHsgICAiZW5fVVMiLCAgICAiZnJfRlIiLCAgICAiaHJfSFIiLCAgICAiZWxfR1IiLCAgICAibm9fTk9fTlkiLCAiaXQiLCAgICJ4eF9ZWSIgIH0sCiAgICAgICAgLy8gSVNPLTMgbGFuZ3VhZ2UKICAgICAgICB7ICAgImVuZyIsICAiZnJhIiwgICJocnYiLCAgImVsbCIsICAibm9yIiwgICJpdGEiLCAgIiIgICB9LAogICAgICAgIC8vIElTTy0zIGNvdW50cnkKICAgICAgICB7ICAgIlVTQSIsICAiRlJBIiwgICJIUlYiLCAgIkdSQyIsICAiTk9SIiwgICIiLCAgICAgIiIgICB9LAogICAgICAgIC8vIExDSUQgKG5vdCBjdXJyZW50bHkgcHVibGljKQogICAgICAgIHsgICAiNDA5IiwgIjQwYyIsICI0MWEiLCAiNDA4IiwgIjgxNCIsICIiLCAgICAgIiIgIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoRW5nbGlzaCkKICAgICAgICB7ICAgIkVuZ2xpc2giLCAgIkZyZW5jaCIsICAgIkNyb2F0aWFuIiwgIkdyZWVrIiwgICAgIk5vcndlZ2lhbiIsICAgICJJdGFsaWFuIiwgICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKEVuZ2xpc2gpCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChFbmdsaXNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIifSwKICAgICAgICAvL3sgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChFbmdsaXNoKQogICAgICAgIC8vIFVwZGF0ZWQgbm9fTk9fTlkgRW5nbGlzaCBkaXNwbGF5IG5hbWUgZm9yIG5ldyBwYXR0ZXJuLWJhc2VkIGFsZ29yaXRobQogICAgICAgIC8vIChwYXJ0IG9mIEV1cm8gc3VwcG9ydCkuCiAgICAgICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCiAgICAgICAgLy97ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChGcmVuY2gpCiAgICAgICAgeyAgICJhbmdsYWlzIiwgICJmcmFuXFx1MDBFN2FpcyIsICAgIiIsICJncmVjIiwgICAgIm5vcnZcXHUwMEU5Z2llbiIsICAgICJpdGFsaWVuIiwgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoRnJlbmNoKQogICAgICAgIHsgICAiXFx1MDBDOXRhdHMtVW5pcyIsICAgICJGcmFuY2UiLCAgICIiLCAgIkdyXFx1MDBFOGNlIiwgICAiTm9ydlxcdTAwRThnZSIsICIiLCAgICAgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoRnJlbmNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAgICIiLCAgICAgIiIgfSwKICAgICAgICAvLyBkaXNwbGF5IG5hbWUgKEZyZW5jaCkKICAgICAgICAvL3sgICAiYW5nbGFpcyAoyXRhdHMtVW5pcykiLCAiZnJhbudhaXMgKEZyYW5jZSkiLCAiIiwgImdyZWMgKEdy6GNlKSIsICJub3J26WdpZW4gKE5vcnboZ2UsTnlub3JzaykiLCAiaXRhbGllbiIsICJ4eCAoWVkpIiB9LAogICAgICAgIHsgICAiYW5nbGFpcyAoXFx1MDBDOXRhdHMtVW5pcykiLCAiZnJhblxcdTAwRTdhaXMgKEZyYW5jZSkiLCAiIiwgImdyZWMgKEdyXFx1MDBFOGNlKSIsICJub3J2XFx1MDBFOWdpZW4gKE5vcnZcXHUwMEU4Z2UsIE55bm9yc2spIiwgIml0YWxpZW4iLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChDcm9hdGlhbikKICAgICAgICB7ICAgIiIsICAiIiwgImhydmF0c2tpIiwgIiIsICAgICIiLCAiIiwgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgICAiIiwgICAiSHJ2YXRza2EiLCAgIiIsICAgIiIsICIiLCAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChDcm9hdGlhbikKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgIiIsICIifSwKICAgICAgICAvLyBkaXNwbGF5IG5hbWUgKENyb2F0aWFuKQogICAgICAgIHsgICAiIiwgIiIsICJocnZhdHNraSAoSHJ2YXRza2EpIiwgIiIsICIiLCAgIiIsICJ4eCAoWVkpIiB9LAoKICAgICAgICAvLyBkaXNwbGF5IGxhbmdhZ2UgKEdyZWVrKVthY3R1YWwgdmFsdWVzIGxpc3RlZCBiZWxvd10KICAgIHsgICAiIiwgICIiLCAiIiwgIiIsICAgICIiLCAiIiwgIiIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKEdyZWVrKVthY3R1YWwgdmFsdWVzIGxpc3RlZCBiZWxvd10KICAgIHsgICAiIiwgICIiLCAiIiwgIiIsICAgICIiLCAiIiwgIiIgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEdyZWVrKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAiIiwgIiIgfSwKICAgICAgICAvLyBkaXNwbGF5IG5hbWUgKEdyZWVrKVthY3R1YWwgdmFsdWVzIGxpc3RlZCBiZWxvd10KICAgIHsgICAiIiwgICIiLCAiIiwgIiIsICAgICIiLCAiIiwgIiIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlICg8cm9vdD4pCiAgICAgICAgeyAgICJFbmdsaXNoIiwgICJGcmVuY2giLCAgICJDcm9hdGlhbiIsICJHcmVlayIsICAgICJOb3J3ZWdpYW4iLCAgICAiSXRhbGlhbiIsICAieHgiIH0sCiAgICAgICAgLy8gZGlzcGxheSBjb3VudHJ5ICg8cm9vdD4pCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50ICg8cm9vdD4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIk55bm9yc2siLCAgICIiLCAgICAgIiJ9LAogICAgICAgIC8vIGRpc3BsYXkgbmFtZSAoPHJvb3Q+KQogICAgICAgIC8veyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LE55bm9yc2spIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKICAgICAgICB7ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfQp9OwoKLy8gKiB0ZXN0IG1hY3JvcwovKgogVXNhZ2U6CiAgICB0ZXN0X2NvbXBhcmUoICAgIEZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCwKICAgICAgICAgICAgICAgICAgICAgICBUZXN0IG9mIHRoZSBmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCByZXN1bHQgb2YgdGhlIHRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRhYmxlIHJlc3VsdAogICAgICAgICAgICAgICAgICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9jb21wYXJlKGk9MyxpLDMsIHNvbWVOdW1iZXJGb3JtYXR0ZXIoaSkpOwogICAgICAgdGVzdF9jb21wYXJlKDAsMSsxLDIsc29tZU51bWJlckZvcm1hdHRlcigxKzEpKTsgCgogICBOb3RlIHRoYXQgaW4gdGhlIHNlY29uZCBleGFtcGxlIHRoZSBleHByZXNzaW9uIGlzIDAsIGJlY2F1c2UgdGhlIGZjbiBwcm9kdWNlcyBpdCdzIG93biByZXN1bHQuCgogICBNYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2NvbXBhcmUoZXhwcmVzc2lvbix0ZXN0LGV4cGVjdGVkLHByaW50YWJsZVJlc3VsdCkgXAogICAgeyBcCiAgICAgICAgZXhwcmVzc2lvbjsgXAogICAgICAgIFwKICAgICAgICBpZigodGVzdCkgIT0gKGV4cGVjdGVkKSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI2V4cHJlc3Npb24pICsgIjsgLT4gIiArIHByaW50YWJsZVJlc3VsdCArICJcbiIgKyBcCiAgICAgICAgICAgICAgICAgICAgIiAgICgiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiICE9ICIgKyBVbmljb2RlU3RyaW5nKCNleHBlY3RlZCkgKyAiKSIgKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCNleHByZXNzaW9uKSArICIgLT4gIiArIHByaW50YWJsZVJlc3VsdCArICIgKCIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICIpIik7IFwKICAgIH0KCgoKCi8qCiBVc2FnZToKICAgIHRlc3RfYXNzZXJ0X3ByaW50KCAgICBUZXN0IChzaG91bGQgYmUgVFJVRSksICBwcmludGFibGUgICkKCiAgIEV4YW1wbGU6CiAgICAgICB0ZXN0X2Fzc2VydChpPT0zLCB0b1N0cmluZyhpKSk7CgogICB0aGUgbWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9hc3NlcnRfcHJpbnQodGVzdCxwcmludCkgXAogICAgeyBcCiAgICAgICAgaWYoISh0ZXN0KSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiB3YXMgbm90IHRydWUuIiArICItPiAiICsgVW5pY29kZVN0cmluZyhwcmludCkgKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbigiUEFTUzogYXNzZXJ0ZWQgIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIi0+ICIgKyBVbmljb2RlU3RyaW5nKHByaW50KSk7IFwKICAgIH0KCgojZGVmaW5lIHRlc3RfZHVtcExvY2FsZShsKSB7IFVuaWNvZGVTdHJpbmcgcyhsLmdldE5hbWUoKSwiIik7IGxvZ2xuKCNsICsgVW5pY29kZVN0cmluZygiID0gIikgKyBzKTsgfQoKTG9jYWxlVGVzdDo6TG9jYWxlVGVzdCgpCnsKICAgIHNldFVwRGF0YVRhYmxlKCk7Cn0KCkxvY2FsZVRlc3Q6On5Mb2NhbGVUZXN0KCkKewp9CgojZGVmaW5lIENBU0UoaWQsdGVzdCkgY2FzZSBpZDogbmFtZSA9ICN0ZXN0OyBpZiAoZXhlYykgeyBsb2dsbigjdGVzdCAiLS0tIik7IGxvZ2xuKChVbmljb2RlU3RyaW5nKSIiKTsgdGVzdCgpOyB9IGJyZWFrOwoKdm9pZCBMb2NhbGVUZXN0OjpydW5JbmRleGVkVGVzdCggaW50MzJfdCBpbmRleCwgVUJvb2wgZXhlYywgY2hhciogJm5hbWUsIGNoYXIqIHBhciApCnsKICAgIGlmIChleGVjKSBsb2dsbigiVGVzdFN1aXRlIExvY2FsZVRlc3Q6ICIpOwogICAgc3dpdGNoIChpbmRleCkgewogICAgICAgIGNhc2UgMDogbmFtZSA9ICJUZXN0QmFzaWNHZXR0ZXJzIjsgaWYgKGV4ZWMpIFRlc3RCYXNpY0dldHRlcnMoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAxOiBuYW1lID0gIlRlc3RTaW1wbGVSZXNvdXJjZUluZm8iOyBpZiAoZXhlYykgVGVzdFNpbXBsZVJlc291cmNlSW5mbygpOyBicmVhazsKICAgICAgICBjYXNlIDI6IG5hbWUgPSAiVGVzdERpc3BsYXlOYW1lcyI7IGlmIChleGVjKSBUZXN0RGlzcGxheU5hbWVzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMzogbmFtZSA9ICJUZXN0U2ltcGxlT2JqZWN0U3R1ZmYiOyBpZiAoZXhlYykgVGVzdFNpbXBsZU9iamVjdFN0dWZmKCk7IGJyZWFrOwogICAgICAgIGNhc2UgNDogbmFtZSA9ICJUZXN0UE9TSVhQYXJzaW5nIjsgaWYgKGV4ZWMpIFRlc3RQT1NJWFBhcnNpbmcoKTsgYnJlYWs7CiAgICAgICAgY2FzZSA1OiBuYW1lID0gIlRlc3RHZXRBdmFpbGFibGVMb2NhbGVzIjsgaWYgKGV4ZWMpIFRlc3RHZXRBdmFpbGFibGVMb2NhbGVzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgNjogbmFtZSA9ICJUZXN0RGF0YURpcmVjdG9yeSI7IGlmIChleGVjKSBUZXN0RGF0YURpcmVjdG9yeSgpOyBicmVhazsKCiAgICAgICAgQ0FTRSg3LCBUZXN0SVNPM0ZhbGxiYWNrKQogICAgICAgIENBU0UoOCwgVGVzdEdldExhbmdzQW5kQ291bnRyaWVzKQogICAgICAgIENBU0UoOSwgVGVzdDQxMjY4ODApCiAgICAgICAgQ0FTRSgxMCwgVGVzdEJ1ZzQxMzUzMTYpCiAgICAgICAgQ0FTRSgxMSwgVGVzdFNpbXBsZURpc3BsYXlOYW1lcykKICAgICAgICBDQVNFKDEyLCBUZXN0VW5pbnN0YWxsZWRJU08zTmFtZXMpCiAgICAgICAgQ0FTRSgxMywgVGVzdEF0eXBpY2FsTG9jYWxlcykKICAgICAgICBDQVNFKDE0LCBUZXN0VGhhaUN1cnJlbmN5Rm9ybWF0KQogICAgICAgIENBU0UoMTUsIFRlc3RFdXJvU3VwcG9ydCkKICAgICAgICBDQVNFKDE2LCBUZXN0VG9TdHJpbmcpCiAgICAgICAgQ0FTRSgxNywgVGVzdDQxMzk5NDApCiAgICAgICAgQ0FTRSgxOCwgVGVzdDQxNDM5NTEpCiAgICAgICAgQ0FTRSgxOSwgVGVzdDQxNDczMTUpCiAgICAgICAgQ0FTRSgyMCwgVGVzdDQxNDczMTcpCiAgICAgICAgQ0FTRSgyMSwgVGVzdDQxNDc1NTIpCiAgICAgICAgQ0FTRSgyMiwgVGVzdFZhcmlhbnRQYXJzaW5nKQogICAgICAgIENBU0UoMjMsIFRlc3Q0MTA1ODI4KQoKICAgICAgICBkZWZhdWx0OiBuYW1lID0gIiI7IGJyZWFrOyAvL25lZWRlZCB0byBlbmQgbG9vcAogICAgfQp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RCYXNpY0dldHRlcnMoKSB7CiAgICBVbmljb2RlU3RyaW5nICAgdGVtcDsKCiAgICBpbnQzMl90IGk7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyAoVW5pY29kZVN0cmluZyl0ZXN0TG9jYWxlLmdldE5hbWUoKSArICIuLi4iKTsKCiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldExhbmd1YWdlKCkpICE9IChkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRDb3VudHJ5KCkpICE9IChkYXRhVGFibGVbQ1RSWV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtDVFJZXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldFZhcmlhbnQoKSkgIT0gKGRhdGFUYWJsZVtWQVJdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbVkFSXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgIT0gKGRhdGFUYWJsZVtOQU1FXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExvY2FsZSBuYW1lIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTkFNRV1baV0pOwogICAgfQoKICAgIGxvZ2xuKCJTYW1lIHRoaW5nIHdpdGhvdXQgdmFyaWFudCBjb2Rlcy4uLiIpOwogICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSk7CiAgICAgICAgbG9nbG4oIlRlc3RpbmcgIiArICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TmFtZSgpKSArICIuLi4iKTsKCiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldExhbmd1YWdlKCkpICE9IChkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRDb3VudHJ5KCkpICE9IChkYXRhVGFibGVbQ1RSWV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtDVFJZXVtpXSk7CiAgICAgICAgaWYgKHRlc3RMb2NhbGUuZ2V0VmFyaWFudCgpWzBdICE9IDApCiAgICAgICAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogc29tZXRoaW5nIHZlcnN1cyBcIlwiIik7CiAgICB9CiAgICAKICAgIC8qdGVzdHMgZm9yIHRoZSBkZXByYWN0ZWQgQVBJKi8KICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKChVbmljb2RlU3RyaW5nKXJhd0RhdGFbTEFOR11baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbQ1RSWV1baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbVkFSXVtpXSk7CiAgICAgICAgbG9nbG4oIlRlc3RpbmcgIiArIChVbmljb2RlU3RyaW5nKXRlc3RMb2NhbGUuZ2V0TmFtZSgpICsgIi4uLiIpOwoKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldENvdW50cnkodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0VmFyaWFudCh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW1ZBUl1baV0pKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtWQVJdW2ldKTsKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0TmFtZSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW05BTUVdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTG9jYWxlIG5hbWUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtOQU1FXVtpXSk7CiAgICB9CiAgICBsb2dsbigiU2FtZSB0aGluZyB3aXRob3V0IHZhcmlhbnQgY29kZXMuLi4iKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKChVbmljb2RlU3RyaW5nKXJhd0RhdGFbTEFOR11baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbQ1RSWV1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyAodGVzdExvY2FsZS5nZXROYW1lKHRlbXApKSArICIuLi4iKTsKCiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldExhbmd1YWdlKHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXRDb3VudHJ5KHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbQ1RSWV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtDVFJZXVtpXSk7CiAgICAgICAgaWYgKHRlc3RMb2NhbGUuZ2V0VmFyaWFudCh0ZW1wKS5sZW5ndGgoKSAhPSAwICkKICAgICAgICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiBzb21ldGhpbmcgdmVyc3VzIFwiXCIiKTsKICAgIH0KICAgIC8qLS0tLS0tLS0tLSovCiAgICAvLyBOT1RFOiBUaGVyZSB1c2VkIHRvIGJlIGEgc3BlY2lhbCB0ZXN0IGZvciBsb2NhbGUgbmFtZXMgdGhhdCBoYWQgbGFuZ3VhZ2Ugb3IKICAgIC8vIGNvdW50cnkgY29kZXMgdGhhdCB3ZXJlIGxvbmdlciB0aGFuIHR3byBsZXR0ZXJzLiAgVGhlIG5ldyB2ZXJzaW9uIG9mIExvY2FsZQogICAgLy8gZG9lc24ndCBzdXBwb3J0IGFueXRoaW5nIHRoYXQgaXNuJ3QgYW4gb2ZmaWNpYWxseSByZWNvZ25pemVkIGxhbmd1YWdlIG9yCiAgICAvLyBjb3VudHJ5IGNvZGUsIHNvIHdlIG5vIGxvbmdlciBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0U2ltcGxlUmVzb3VyY2VJbmZvKCkgewogIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwogIGNoYXIgICAgICAgICAgICB0ZW1wMlsyMF07CiAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgaW50MzJfdCBpID0gMDsKCiAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICBMb2NhbGUgdGVzdExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgbG9nbG4oIlRlc3RpbmcgIiArICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TmFtZSgpKSArICIuLi4iKTsKICAgIAogICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldElTTzNMYW5ndWFnZSgpKSAhPSAoZGF0YVRhYmxlW0xBTkczXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGxhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0xBTkczXVtpXSk7CiAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0SVNPM0NvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZM11baV0pKQogICAgICBlcnJsbigiICBJU08tMyBjb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0NUUlkzXVtpXSk7CiAgICAKICAgIHNwcmludGYodGVtcDIsICIleCIsIHRlc3RMb2NhbGUuZ2V0TENJRCgpKTsKICAgIGlmIChVbmljb2RlU3RyaW5nKHRlbXAyKSAhPSBkYXRhVGFibGVbTENJRF1baV0pCiAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSIgIExDSUQgbWlzbWF0Y2g6ICIgKyAoaW50MzJfdCl0ZXN0TG9jYWxlLmdldExDSUQoKSArICIgdmVyc3VzICIKICAgICAgICArIGRhdGFUYWJsZVtMQ0lEXVtpXSk7CgogICAgaWYoVV9GQUlMVVJFKGVycikpCiAgICAgIHsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiU29tZSBlcnJvciBvbiBudW1iZXIgIiArIGkgKyB1X2Vycm9yTmFtZShlcnIpKTsKICAgICAgfQogICAgZXJyID0gVV9aRVJPX0VSUk9SOwogIH0KCiAgLyp0ZXN0cyBmb3IgdGhlIGRlcHJlY2F0ZWQgQVBJKi8KICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgIExvY2FsZSB0ZXN0TG9jYWxlKChVbmljb2RlU3RyaW5nKXJhd0RhdGFbTEFOR11baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbQ1RSWV1baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbVkFSXVtpXSk7CiAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlc3RMb2NhbGUuZ2V0TmFtZSh0ZW1wKSkgKyAiLi4uIik7CiAgICAKICAgIGlmICggdGVzdExvY2FsZS5nZXRJU08zTGFuZ3VhZ2UodGVtcCwgZXJyKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0xBTkczXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGxhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0xBTkczXVtpXSk7CiAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0SVNPM0NvdW50cnkodGVtcCwgZXJyKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0NUUlkzXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGNvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbQ1RSWTNdW2ldKTsKICAgIAogICAgaWYoVV9GQUlMVVJFKGVycikpCiAgICAgIHsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiU29tZSBlcnJvciBvbiBudW1iZXIgIiArIGkgKyB1X2Vycm9yTmFtZShlcnIpKTsKICAgICAgfQogICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICB9CgogICBMb2NhbGUgbG9jYWxlKChVbmljb2RlU3RyaW5nKSJlbiIpOwogICBpZihsb2NhbGUuZ2V0TmFtZSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykiZW4iIHx8CiAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpImVuIil7CiAgICAgICBlcnJsbigiY29uc3RydWN0aW9uIG9mIExvY2FsZShlbikgZmFpbGVkXG4iKTsKICAgfQogICAvKi0tLS0tKi8KCn0KCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3REaXNwbGF5TmFtZXMoKSAKewogICAgTG9jYWxlICBzYXZlRGVmYXVsdCA9IExvY2FsZTo6Z2V0RGVmYXVsdCgpOwogICAgTG9jYWxlICBlbXB0eSgiIiwgIiIpOwogICAgTG9jYWxlICBlbmdsaXNoKCJlbiIsICJVUyIpOwogICAgTG9jYWxlICBmcmVuY2goImZyIiwgIkZSIik7CiAgICBMb2NhbGUgIGNyb2F0aWFuKCJociIsICJIUiIpOwogICAgTG9jYWxlICBncmVlaygiZWwiLCAiR1IiKTsKICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgIExvY2FsZTo6c2V0RGVmYXVsdChlbmdsaXNoLCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgZXJybG4oIkxvY2FsZTo6c2V0RGVmYXVsdCByZXR1cm5lZCBlcnJvciBjb2RlICIgKyAoaW50KWVycik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxvZ2xuKCJXaXRoIGRlZmF1bHQgPSBlbl9VUy4uLiIpOwogICAgbG9nbG4oIiAgSW4gZGVmYXVsdCBsb2NhbGUuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhlbXB0eSwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGZyX0ZSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZnJlbmNoLCBETEFOR19GUiwgRkFMU0UpOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gaHJfSFIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhjcm9hdGlhbiwgRExBTkdfSFIsIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMLCBGQUxTRSk7CgogICAgTG9jYWxlOjpzZXREZWZhdWx0KGZyZW5jaCwgZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGVycmxuKCJMb2NhbGU6OnNldERlZmF1bHQgcmV0dXJuZWQgZXJyb3IgY29kZSAiICsgKGludCllcnIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsb2dsbigiV2l0aCBkZWZhdWx0ID0gZnJfRlIuLi4iKTsKICAgIGxvZ2xuKCIgIEluIGRlZmF1bHQgbG9jYWxlLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW1wdHksIERMQU5HX0ZSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4sIFRSVUUpOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gZnJfRlIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhmcmVuY2gsIERMQU5HX0ZSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGhyX0hSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoY3JvYXRpYW4sIERMQU5HX0hSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMLCBUUlVFKTsKCiAgICBMb2NhbGU6OnNldERlZmF1bHQoc2F2ZURlZmF1bHQsIGVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBlcnJsbigiTG9jYWxlOjpzZXREZWZhdWx0IHJldHVybmVkIGVycm9yIGNvZGUgIiArIChpbnQpZXJyKTsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCi8qCiBVc2FnZToKICAgIHRlc3RfYXNzZXJ0KCAgICBUZXN0IChzaG91bGQgYmUgVFJVRSkgICkKCiAgIEV4YW1wbGU6CiAgICAgICB0ZXN0X2Fzc2VydChpPT0zKTsKCiAgIHRoZSBtYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2Fzc2VydCh0ZXN0KSBcCiAgICB7IFwKICAgICAgICBpZighKHRlc3QpKSBcCiAgICAgICAgICAgIGVycmxuKCJGQUlMOiAiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiIHdhcyBub3QgdHJ1ZS4gIiArIFVuaWNvZGVTdHJpbmcoX19GSUxFX18gIiBsaW5lICIpICsgX19MSU5FX18gKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbigiUEFTUzogYXNzZXJ0ZWQgIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICk7IFwKICAgIH0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdFNpbXBsZU9iamVjdFN0dWZmKCkgewogICAgTG9jYWxlICB0ZXN0MSgiYWEiLCAiQUEiKTsKICAgIExvY2FsZSAgdGVzdDIoImFhIiwgIkFBIik7CiAgICBMb2NhbGUgIHRlc3QzKHRlc3QxKTsKICAgIExvY2FsZSAgdGVzdDQoInp6IiwgIlpaIik7CiAgICBMb2NhbGUgIHRlc3Q1KCJhYSIsICJBQSIsICIiKTsgCiAgICBMb2NhbGUgIHRlc3Q2KCJhYSIsICJBQSIsICJBbnRhcmVzIik7IAogICAgTG9jYWxlICB0ZXN0NygiYWEiLCAiQUEiLCAiSnVwaXRlciIpOwoKICAgIC8vIG5vdyBsaXN0IHRoZW0gYWxsIGZvciBkZWJ1Z2dpbmcgdXNhZ2UuCiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDEpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QyKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Myk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDQpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q1KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDcpCgogICAgLy8gTWFrZSBzdXJlIHRoaW5ncyBjb21wYXJlIHRvIHRoZW1zZWx2ZXMhCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MiA9PSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MyA9PSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NCA9PSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSA9PSB0ZXN0NSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nyk7CgogICAgLy8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QxKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QyKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q0ICE9IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q1ICE9IHRlc3Q1KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q2ICE9IHRlc3Q2KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q3ICE9IHRlc3Q3KSk7CgogICAgLy8gbWFrZSBzdXJlIHRoaW5ncyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGRvbid0IHNob3cgdXAgYXMgdW5lcXVhbC4KICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDIpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDEpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3QxKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3QyKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3Q1KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CgogICAgLy8gdGVzdCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkbid0IGNvbXBhcmUgZXF1YWwuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxID09IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyID09IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzID09IHRlc3Q0KSk7CgogICAgLy8gdGVzdCBmb3IgaGFzaCBjb2RlcyB0byBiZSB0aGUgc2FtZS4KICAgIGludDMyX3QgaGFzaDEgPSB0ZXN0MS5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMiA9IHRlc3QyLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gzID0gdGVzdDMuaGFzaENvZGUoKTsKCiAgICB0ZXN0X2Fzc2VydChoYXNoMSA9PSBoYXNoMik7CiAgICB0ZXN0X2Fzc2VydChoYXNoMSA9PSBoYXNoMyk7CiAgICB0ZXN0X2Fzc2VydChoYXNoMiA9PSBoYXNoMyk7CgogICAgLy8gdGVzdCB0aGF0IHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIHdvcmtzLgogICAgdGVzdDQgPSB0ZXN0MTsKICAgIGxvZ2xuKCJ0ZXN0ND10ZXN0MTsiKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NCA9PSB0ZXN0NCk7CgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MyAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDEpOwogICAgCiAgICAvLyB0ZXN0IGFzc2lnbm1lbnRzIHdpdGggYSB2YXJpYW50CiAgICBsb2dsbigidGVzdDcgPSB0ZXN0NiIpOwogICAgdGVzdDcgPSB0ZXN0NjsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyAhPSB0ZXN0NSk7CgogICAgbG9nbG4oInRlc3Q2ID0gdGVzdDEiKTsKICAgIHRlc3Q2PXRlc3QxOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3Q3KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3QxKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q2KTsKfQoKLy8gQSBjbGFzcyB3aGljaCBleHBvc2VzIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgUE9TSVggcGFyc2luZyBjb2RlLgpjbGFzcyBQT1NJWExvY2FsZSA6IHB1YmxpYyBMb2NhbGUKewpwdWJsaWM6CiAgICBQT1NJWExvY2FsZShjb25zdCBVbmljb2RlU3RyaW5nJiBsKQogICAgICAgIDpMb2NhbGUoKQogICAgewogICAgICBjaGFyICpjaDsKICAgICAgY2ggPSBuZXcgY2hhcltsLnNpemUoKSArIDFdOwogICAgICBjaFtsLmV4dHJhY3QoMCwgMHg3ZmZmZmZmZiwgY2gsICIiKV0gPSAwOwogICAgICBzZXRGcm9tUE9TSVhJRChjaCk7CiAgICAgIGRlbGV0ZSBbXSBjaDsKICAgIH0KICAgIFBPU0lYTG9jYWxlKGNvbnN0IGNoYXIgKmwpCiAgICAgICAgOkxvY2FsZSgpCiAgICB7CiAgICAgICAgc2V0RnJvbVBPU0lYSUQobCk7CiAgICB9Cn07Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RQT1NJWFBhcnNpbmcoKQp7CiAgICBQT1NJWExvY2FsZSAgdGVzdDEoImFiX0FCIik7CiAgICBQT1NJWExvY2FsZSAgdGVzdDIoVW5pY29kZVN0cmluZygiYWJfQUIiKSk7CiAgICBMb2NhbGUgIHRlc3QzKCJhYiIsIkFCIik7CgogICAgUE9TSVhMb2NhbGUgdGVzdDQoImFiX0FCX0FudGFyZXMiKTsKICAgIFBPU0lYTG9jYWxlIHRlc3Q1KFVuaWNvZGVTdHJpbmcoImFiX0FCX0FudGFyZXMiKSk7CiAgICBMb2NhbGUgIHRlc3Q2KCJhYiIsICJBQiIsICJBbnRhcmVzIik7IAoKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0MSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDIpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QzKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDUpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDIgPT0gdGVzdDMpOwogICAgdGVzdF9hc3NlcnQodGVzdDMgPT0gdGVzdDEpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3Q1KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q0KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSAhPSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Mik7CgogICAgaW50MzJfdCBoYXNoMSA9IHRlc3QxLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gyID0gdGVzdDIuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDMgPSB0ZXN0My5oYXNoQ29kZSgpOwoKICAgIHRlc3RfYXNzZXJ0KGhhc2gxID09IGhhc2gyKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gyID09IGhhc2gzKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gzID09IGhhc2gxKTsKfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcygpCnsKICAgIGludDMyX3QgbG9jQ291bnQgPSAwOwogICAgY29uc3QgTG9jYWxlKiBsb2NMaXN0ID0gTG9jYWxlOjpnZXRBdmFpbGFibGVMb2NhbGVzKGxvY0NvdW50KTsKCiAgICBpZiAobG9jQ291bnQgPT0gMCkKICAgICAgICBlcnJsbigiZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHJldHVybmVkIGFuIGVtcHR5IGxpc3QhIik7CiAgICBlbHNlIHsKICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJOdW1iZXIgb2YgbG9jYWxlcyByZXR1cm5lZCA9ICIpICsgbG9jQ291bnQpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGxvY0NvdW50OyArK2kpCiAgICAgICAgICAgIGxvZ2xuKGxvY0xpc3RbaV0uZ2V0TmFtZSgpKTsKICAgIH0KICAgIC8vIEkgaGF2ZSBubyBpZGVhIGhvdyB0byB0ZXN0IHRoaXMgZnVuY3Rpb24uLi4KfQoKLy8gVGhpcyB0ZXN0IGlzbid0IGFwcGxpY2FibGUgYW55bW9yZSAtIGdldElTTzNMYW5ndWFnZSBpcwovLyBpbmRlcGVuZGVudCBvZiB0aGUgZGF0YSBkaXJlY3RvcnkKdm9pZCBMb2NhbGVUZXN0OjpUZXN0RGF0YURpcmVjdG9yeSgpCnsKLyoKICAgIGNoYXIgICAgICAgICAgICBvbGREaXJlY3RvcnlbODBdOwogICAgY29uc3QgY2hhciogICAgIHRlbXA7CiAgICBVRXJyb3JDb2RlICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0VmFsdWU7CgogICAgdGVtcCA9IExvY2FsZTo6Z2V0RGF0YURpcmVjdG9yeSgpOwogICAgc3RyY3B5KG9sZERpcmVjdG9yeSwgdGVtcCk7CiAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJvbGREaXJlY3RvcnkgPSAiKSArIG9sZERpcmVjdG9yeSk7CgogICAgTG9jYWxlICB0ZXN0KExvY2FsZTo6VVMpOwogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJmaXJzdCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgIiArIHRlc3RWYWx1ZSk7CiAgICBpZiAodGVzdFZhbHVlICE9ICJlbmciKQogICAgICAgIGVycmxuKCJJbml0aWFsIGNoZWNrIG9mIElTTzMgbGFuZ3VhZ2UgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CgogICAgewogICAgICAgIGNoYXIgKnBhdGg7CiAgICAgICAgcGF0aD1JbnRsVGVzdDo6Z2V0VGVzdERpcmVjdG9yeSgpOwogICAgICAgIExvY2FsZTo6c2V0RGF0YURpcmVjdG9yeSggcGF0aCApOwogICAgfQoKICAgIHRlc3QuZ2V0SVNPM0xhbmd1YWdlKHRlc3RWYWx1ZSk7CiAgICBsb2dsbigic2Vjb25kIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gInh4eCIpCiAgICAgICAgZXJybG4oInNldERhdGFEaXJlY3RvcnkoKSBmYWlsZWQ6IGV4cGVjdGVkIFwieHh4XCIsIGdvdCBcIiIgKyB0ZXN0VmFsdWUgKyAiXCIiKTsKICAgIAogICAgTG9jYWxlOjpzZXREYXRhRGlyZWN0b3J5KG9sZERpcmVjdG9yeSk7CiAgICB0ZXN0LmdldElTTzNMYW5ndWFnZSh0ZXN0VmFsdWUpOwogICAgbG9nbG4oInRoaXJkIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gImVuZyIpCiAgICAgICAgZXJybG4oImdldC9zZXREYXRhRGlyZWN0b3J5KCkgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CiovCn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgTG9jYWxlVGVzdDo6ZG9UZXN0RGlzcGxheU5hbWVzKExvY2FsZSYgaW5Mb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29tcGFyZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCBkZWZhdWx0SXNGcmVuY2gpIHsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwogICAgCiAgICBpZiAoZGVmYXVsdElzRnJlbmNoICYmICh0ZW1wPUxvY2FsZTo6Z2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpICE9ICJmciIpCiAgICAgICAgZXJybG4oIkRlZmF1bHQgbG9jYWxlIHNob3VsZCBiZSBGcmVuY2gsIGJ1dCBpdCdzIHJlYWxseSAiICsgdGVtcCk7CiAgICBlbHNlIGlmICghZGVmYXVsdElzRnJlbmNoICYmICh0ZW1wPUxvY2FsZTo6Z2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpICE9ICJlbiIpCiAgICAgICAgZXJybG4oIkRlZmF1bHQgbG9jYWxlIHNob3VsZCBiZSBFbmdsaXNoLCBidXQgaXQncyByZWFsbHkgIiArIHRlbXApOwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSwgcmF3RGF0YVtWQVJdW2ldKTsKICAgICAgICBsb2dsbigiICBUZXN0aW5nICIgKyAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiLi4uIik7CgogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RMYW5nOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RWYXI7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdE5hbWU7CgogICAgICAgIGlmIChpbkxvY2FsZSA9PSBMb2NhbGUoIiIsICIiLCAiIikpIHsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TGFuZ3VhZ2UodGVzdExhbmcpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KHRlc3RDdHJ5KTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5VmFyaWFudCh0ZXN0VmFyKTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TmFtZSh0ZXN0TmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZShpbkxvY2FsZSwgdGVzdExhbmcpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KGluTG9jYWxlLCB0ZXN0Q3RyeSk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheVZhcmlhbnQoaW5Mb2NhbGUsIHRlc3RWYXIpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlOYW1lKGluTG9jYWxlLCB0ZXN0TmFtZSk7CiAgICAgICAgfQoKICAgICAgICBVbmljb2RlU3RyaW5nICBleHBlY3RlZExhbmc7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkVmFyOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkTmFtZTsKCiAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleF1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTGFuZy5sZW5ndGgoKSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW0RMQU5HX0ZSXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRMYW5nLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkTGFuZyA9IGRhdGFUYWJsZVtETEFOR19FTl1baV07CgogICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAxXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRDdHJ5Lmxlbmd0aCgpID09IDAgJiYgZGVmYXVsdElzRnJlbmNoKQogICAgICAgICAgICBleHBlY3RlZEN0cnkgPSBkYXRhVGFibGVbRENUUllfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZEN0cnkubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWRDdHJ5ID0gZGF0YVRhYmxlW0RDVFJZX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWRWYXIgPSBkYXRhVGFibGVbY29tcGFyZUluZGV4ICsgMl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkVmFyLmxlbmd0aCgpID09IDAgJiYgZGVmYXVsdElzRnJlbmNoKQogICAgICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtEVkFSX0ZSXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRWYXIubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWRWYXIgPSBkYXRhVGFibGVbRFZBUl9FTl1baV07CgogICAgICAgIGV4cGVjdGVkTmFtZSA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAzXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWROYW1lLmxlbmd0aCgpID09IDAgJiYgZGVmYXVsdElzRnJlbmNoKQogICAgICAgICAgICBleHBlY3RlZE5hbWUgPSBkYXRhVGFibGVbRE5BTUVfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZE5hbWUubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW0ROQU1FX0VOXVtpXTsKCiAgICAgICAgaWYgKHRlc3RMYW5nICE9IGV4cGVjdGVkTGFuZykKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgbGFuZ3VhZ2UgbWlzbWF0Y2g6ICIgKyB0ZXN0TGFuZyArICIgdmVyc3VzICIgKyBleHBlY3RlZExhbmcpOwogICAgICAgIGlmICh0ZXN0Q3RyeSAhPSBleHBlY3RlZEN0cnkpCiAgICAgICAgICAgIGVycmxuKCJEaXNwbGF5IGNvdW50cnkgbWlzbWF0Y2g6ICIgKyB0ZXN0Q3RyeSArICIgdmVyc3VzICIgKyBleHBlY3RlZEN0cnkpOwogICAgICAgIGlmICh0ZXN0VmFyICE9IGV4cGVjdGVkVmFyKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSB2YXJpYW50IG1pc21hdGNoOiAiICsgdGVzdFZhciArICIgdmVyc3VzICIgKyBleHBlY3RlZFZhcik7CiAgICAgICAgaWYgKHRlc3ROYW1lICE9IGV4cGVjdGVkTmFtZSkKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgbmFtZSBtaXNtYXRjaDogIiArIHRlc3ROYW1lICsgIiB2ZXJzdXMgIiArIGV4cGVjdGVkTmFtZSk7CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRhYmxlIG9mIHZhbGlkIGRhdGEKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClVuaWNvZGVTdHJpbmcqKiBMb2NhbGVUZXN0OjpkYXRhVGFibGUgPSAwOwoKClVDaGFyIGdyZWVrRGlzcGxheUxhbmd1YWdlW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwgMHgwM2FjLCAwIH07ClVDaGFyIGdyZWVrRGlzcGxheUNvdW50cnlbXSA9IHsgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMCB9OwpVQ2hhciBncmVla0Rpc3BsYXlOYW1lW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwKICAgIDB4MDNhYywgMHgyMCwgMHgyOCwgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMHgyOSwgMCB9OwogICAgCnZvaWQgTG9jYWxlVGVzdDo6c2V0VXBEYXRhVGFibGUoKQp7CiAgICBpZiAoZGF0YVRhYmxlID09IDApIHsKICAgICAgICBkYXRhVGFibGUgPSBuZXcgVW5pY29kZVN0cmluZypbMjddOwoKICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNzsgaSsrKSB7CiAgICAgICAgICAgIGRhdGFUYWJsZVtpXSA9IG5ldyBVbmljb2RlU3RyaW5nWzddOwogICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsKICAgICAgICAgICAgICAgIGRhdGFUYWJsZVtpXVtqXSA9IENoYXJzVG9Vbmljb2RlU3RyaW5nKHJhd0RhdGFbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRhdGFUYWJsZVtETEFOR19FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TGFuZ3VhZ2U7CiAgICAgICAgZGF0YVRhYmxlW0RDVFJZX0VMXVtHUkVFS10gPSBncmVla0Rpc3BsYXlDb3VudHJ5OwogICAgICAgIGRhdGFUYWJsZVtETkFNRV9FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TmFtZTsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT0KCgovKioKICogQGJ1ZyA0MDExNzU2IDQwMTEzODAKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RJU08zRmFsbGJhY2soKSAKewogICAgTG9jYWxlIHRlc3QoInh4IiwgIllZIik7CgogICAgY29uc3QgY2hhciAqIHJlc3VsdDsKCiAgICByZXN1bHQgPSB0ZXN0LmdldElTTzNMYW5ndWFnZSgpOwoKICAgIC8vIENvbmZvcm0gdG8gQyBBUEkgdXNhZ2UgCgogICAgaWYgKCFyZXN1bHQgfHwgKHJlc3VsdFswXSAhPSAwKSkKICAgICAgICBlcnJsbigiZ2V0SVNPM0xhbmd1YWdlKCkgb24geHhfWVkgcmV0dXJuZWQgIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0KSArICIgaW5zdGVhZCBvZiBcIlwiIik7CgogICAgcmVzdWx0ID0gdGVzdC5nZXRJU08zQ291bnRyeSgpOwoKICAgIGlmICghcmVzdWx0IHx8IChyZXN1bHRbMF0gIT0gMCkpCiAgICAgICAgZXJybG4oImdldElTTzNDb3VudHJ5KCkgb24geHhfWVkgcmV0dXJuZWQgIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0KSArICIgaW5zdGVhZCBvZiBcIlwiIik7Cn0KCi8qKgogKiBAYnVnIDQxMDYxNTUgNDExODU4NwogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEdldExhbmdzQW5kQ291bnRyaWVzKCkgCnsKICAgIC8vIEl0IGRpZG4ndCBzZWVtIHJpZ2h0IHRvIGp1c3QgZG8gYW4gZXhoYXVzdGl2ZSB0ZXN0IG9mIGV2ZXJ5dGhpbmcgaGVyZSwgc28gSSBjaGVjawogICAgLy8gZm9yIHRoZSBmb2xsb3dpbmcgdGhpbmdzOgogICAgLy8gMSkgRG9lcyBlYWNoIGxpc3QgaGF2ZSB0aGUgcmlnaHQgdG90YWwgbnVtYmVyIG9mIGVudHJpZXM/CiAgICAvLyAyKSBEb2VzIGVhY2ggbGlzdCBjb250YWluIGNlcnRhaW4gbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29kZXMgd2UgdGhpbmsgYXJlIGltcG9ydGFudAogICAgLy8gICAgICh0aGUgRzcgY291bnRyaWVzLCBwbHVzIGEgY291cGxlIG90aGVycyk/CiAgICAvLyAzKSBEb2VzIGVhY2ggbGlzdCBoYXZlIGV2ZXJ5IGVudHJ5IGZvcm1hdHRlZCBjb3JyZWN0bHk/IChpLmUuLCB0d28gY2hhcmFjdGVycywKICAgIC8vICAgICBhbGwgbG93ZXIgY2FzZSBmb3IgdGhlIGxhbmd1YWdlIGNvZGVzLCBhbGwgdXBwZXIgY2FzZSBmb3IgdGhlIGNvdW50cnkgY29kZXMpCiAgICAvLyA0KSBJcyBlYWNoIGxpc3QgaW4gc29ydGVkIG9yZGVyPwogICAgaW50MzJfdCB0ZXN0Q291bnQgPSAwOwogICAgY29uc3QgY2hhciAqIGNvbnN0ICogdGVzdCA9IExvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKCk7CiAgICBjb25zdCBjaGFyIHNwb3RDaGVjazFbIF1bNF0gPSB7ICJlbiIsICJlcyIsICJmciIsICJkZSIsICJpdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamEiLCAia28iLCAiemgiLCAidGgiLCAiaGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIiwgIml1IiwgInVnIiwgInlpIiwgInphIiB9OwogICAgaW50MzJfdCBzcG90TGVuID0gMTU7CgogICAgaW50MzJfdCBpOwogICAgCiAgICBmb3IodGVzdENvdW50ID0gMDt0ZXN0W3Rlc3RDb3VudF07dGVzdENvdW50KyspCiAgICAgIDsKCiAgICBpZiAodGVzdENvdW50ICE9IDE0MikKICAgICAgICBlcnJsbigiRXhwZWN0ZWQgZ2V0SVNPTGFuZ3VhZ2VzKCkgdG8gcmV0dXJuIDE0MiBsYW5ndWFnZXM7IGl0IHJldHVybmVkIiArIHRlc3RDb3VudCk7CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgewogICAgICAgICAgICBpbnQzMl90IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0ZXN0Q291bnQ7IGorKykKICAgICAgICAgICAgICBpZiAodXBydl9zdHJjbXAodGVzdFtqXSxzcG90Q2hlY2sxW2ldKT09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChqID09IHRlc3RDb3VudCB8fCAodXBydl9zdHJjbXAodGVzdFtqXSxzcG90Q2hlY2sxW2ldKSE9MCkpCiAgICAgICAgICAgICAgICBlcnJsbigiQ291bGRuJ3QgZmluZCAiICsgKFVuaWNvZGVTdHJpbmcpc3BvdENoZWNrMVtpXSArICIgaW4gbGFuZ3VhZ2UgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2ldLCIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIGxjKHRlc3RbaV0sIiIpOwogICAgICAgIGlmICh0ZXN0ZWUgIT0gbGMudG9Mb3dlcigpKQogICAgICAgICAgICBlcnJsbihsYyArICIgaXMgbm90IGFsbCBsb3dlciBjYXNlLiIpOwogICAgICAgIGlmICh0ZXN0ZWUubGVuZ3RoKCkgIT0gMikKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBpcyBub3QgdHdvIGNoYXJhY3RlcnMgbG9uZy4iKTsKICAgICAgICBpZiAoaSA+IDAgJiYgdGVzdGVlLmNvbXBhcmUodGVzdFtpIC0gMV0pIDw9IDApCiAgICAgICAgICAgIGVycmxuKHRlc3RlZSArICIgYXBwZWFycyBpbiBhbiBvdXQtb2Ytb3JkZXIgcG9zaXRpb24gaW4gdGhlIGxpc3QuIik7CiAgICB9CgogICAgdGVzdCA9IExvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKCk7CiAgICBVbmljb2RlU3RyaW5nIHNwb3RDaGVjazIgW10gPSB7ICJVUyIsICJDQSIsICJHQiIsICJGUiIsICJERSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVQiLCAiSlAiLCAiS1IiLCAiQ04iLCAiVFciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIIiB9OwogICAgaW50MzJfdCBzcG90MkxlbiA9IDExOwogICAgZm9yKHRlc3RDb3VudD0wO3Rlc3RbdGVzdENvdW50XTt0ZXN0Q291bnQrKykKICAgICAgOwoKICAgIGlmICh0ZXN0Q291bnQgIT0gMjM5KQogICAgICAgIGVycmxuKCJFeHBlY3RlZCBnZXRJU09MYW5ndWFnZXMgdG8gcmV0dXJuIDIzOCBsYW5ndWFnZXM7IGl0IHJldHVybmVkIiArIHRlc3RDb3VudCk7CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BvdDJMZW47IGkrKykgewogICAgICAgICAgICBpbnQzMl90IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0ZXN0Q291bnQ7IGorKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2pdLCIiKTsKCiAgICAgICAgICAgICAgICBpZiAodGVzdGVlID09IHNwb3RDaGVjazJbaV0pCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0ZWUodGVzdFtqXSwiIik7CiAgICAgICAgICAgIGlmIChqID09IHRlc3RDb3VudCB8fCB0ZXN0ZWUgIT0gc3BvdENoZWNrMltpXSkKICAgICAgICAgICAgICAgIGVycmxuKCJDb3VsZG4ndCBmaW5kICIgKyBzcG90Q2hlY2syW2ldICsgIiBpbiBjb3VudHJ5IGxpc3QuIik7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHRlc3RDb3VudDsgaSsrKSB7CiAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3RbaV0sIiIpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdWModGVzdFtpXSwiIik7CiAgICAgICAgaWYgKHRlc3RlZSAhPSB1Yy50b1VwcGVyKCkpCiAgICAgICAgICAgIGVycmxuKHRlc3RlZSArICIgaXMgbm90IGFsbCB1cHBlciBjYXNlLiIpOwogICAgICAgIGlmICh0ZXN0ZWUubGVuZ3RoKCkgIT0gMikKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBpcyBub3QgdHdvIGNoYXJhY3RlcnMgbG9uZy4iKTsKICAgICAgICBpZiAoaSA+IDAgJiYgdGVzdGVlLmNvbXBhcmUodGVzdFtpIC0gMV0pIDw9IDApCiAgICAgICAgICAgIGVycmxuKHRlc3RlZSArICIgYXBwZWFycyBpbiBhbiBvdXQtb2Ytb3JkZXIgcG9zaXRpb24gaW4gdGhlIGxpc3QuIik7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMjY4ODAKICovCi8vIHNpbmNlIHRoaXMgcmV0dXJucyBjb25zdCBVbmljb2RlU3RyaW5nKiBpbiBDKyssIGlzIHRoaXMgdGVzdCBhcHBsaWNhYmxlPwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDEyNjg4MCgpIAp7CiAgICAKICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcgKnRlc3Q7CiAgICBpbnQzMl90IHRlc3RDb3VudD0wOwoKICAgIC8qdGVzdCA9IExvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICB0ZXN0WzBdID0gIlNVQ0tFUiEhISI7CiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09Db3VudHJpZXModGVzdENvdW50KTsKICAgIGlmICh0ZXN0WzBdID09ICJTVUNLRVIhISEiKQogICAgICAgIGVycmxuKCJDaGFuZ2VkIGludGVybmFsIGNvdW50cnkgY29kZSBsaXN0ISIpOwoKICAgIHRlc3QgPSBMb2NhbGU6OmdldElTT0xhbmd1YWdlcyh0ZXN0Q291bnQpOwogICAgdGVzdFswXSA9ICJIQUhBSEFIQSEhISI7CiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXModGVzdENvdW50KTsKICAgIGlmICh0ZXN0WzBdID09ICJIQUhBSEFIQSEhISIpIC8vIEZpeGVkIHR5cG8KICAgICAgICBlcnJsbigiQ2hhbmdlcyBpbnRlcm5hbCBsYW5ndWFnZSBjb2RlIGxpc3QhIik7CiAgICAgKi8gICAKICAgIC8qdGVzdHMgZm9yIGRlcHJlY2F0ZWQgQVBJKi8KICAgIHRlc3Q9TG9jYWxlOjpnZXRJU09Db3VudHJpZXModGVzdENvdW50KTsKICAgIGlmKHRlc3RDb3VudCAhPSAyMzkpewogICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSJUaGVyZSBpcyBhbiBlcnJvciBpbiBnZXRJU09Db3VudHJpZXMgIiArIHRlc3RDb3VudCk7CiAgICB9CiAgICB0ZXN0PUxvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKHRlc3RDb3VudCk7CiAgICBpZih0ZXN0Q291bnQgIT0gMTQyKXsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiVGhlcmUgaXMgYW4gZXJyb3IgaW4gZ2V0SVNPTGFuZ3VhZ2VzICIgKyB0ZXN0Q291bnQpOwogICAgfQogICAgLyotLS0tLS0tLS0tKi8KICAgICAgICAKfQoKLyoqCiAqIEBidWcgNDEzNTMxNgogKi8KLy8gbm90IGFwcGxpY2FibGUgaW4gQysrIC0gY29uc3QgTG9jYWxlKgp2b2lkIApMb2NhbGVUZXN0OjpUZXN0QnVnNDEzNTMxNigpIAp7Ci8qCiAgICBMb2NhbGVbXSBsb2NhbGVzMSA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICBMb2NhbGVbXSBsb2NhbGVzMiA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICBpZiAobG9jYWxlczEgPT0gbG9jYWxlczIpCiAgICAgICAgZXJybG4oIkxvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCkgZG9lc24ndCBjbG9uZSBpdHMgaW50ZXJuYWwgc3RvcmFnZSEiKTsKKi8KfQoKLyoqCiAqIEBidWcgNDEwNzk1MwogKi8KLyoKdGVzdCBjb21tZW50ZWQgb3V0IHBlbmRpbmcgQVBJLWNoYW5nZSBhcHByb3ZhbApwdWJsaWMgdm9pZCBUZXN0R2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgpIHsKICAgIFVuaWNvZGVTdHJpbmdbXSBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiVVMiKTsKCiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJlbiIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgZW4gYXMgYSBsYW5ndWFnZSBmb3IgVVMiKTsKCiAgICBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiRlIiKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImZyIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBmciBhcyBhIGxhbmd1YWdlIGZvciBGUiIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJDSCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiZnIiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGZyIGFzIGEgbGFuZ3VhZ2UgZm9yIENIIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJpdCIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgaXQgYXMgYSBsYW5ndWFnZSBmb3IgQ0giKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImRlIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBkZSBhcyBhIGxhbmd1YWdlIGZvciBDSCIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJKUCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiamEiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGphIGFzIGEgbGFuZ3VhZ2UgZm9yIEpQIik7Cn0KKi8KCi8qCnByaXZhdGUgVUJvb2wgc2VhcmNoU3RyaW5nQXJyYXlGb3IoVW5pY29kZVN0cmluZyBzLCBVbmljb2RlU3RyaW5nW10gYXJyYXkpIHsKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChzLmVxdWFscyhhcnJheVtpXSkpCiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgcmV0dXJuIEZBTFNFOwp9CiovCgovKioKICogQGJ1ZyA0MTEwNjEzCiAqLwovLyBub3QgYXBwbGljYWJsZSBpbiBDKysKIC8qCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uLCBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24KewogICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9zdHJlYW07CiAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb2JzdHJlYW07CiAgICBieXRlW10gYnl0ZXMgPSBudWxsOwoKICAgIG9ic3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgb3N0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob2JzdHJlYW0pOwoKICAgIExvY2FsZSB0ZXN0MSA9IG5ldyBMb2NhbGUoInpoIiwgIlRXIiwgIiIpOwogICAgaW50MzJfdCBkdW1teSA9IHRlc3QxLmhhc2hDb2RlKCk7ICAgLy8gZmlsbCBpbiB0aGUgY2FjaGVkIGhhc2gtY29kZSB2YWx1ZQogICAgb3N0cmVhbS53cml0ZU9iamVjdCh0ZXN0MSk7CgogICAgYnl0ZXMgPSBvYnN0cmVhbS50b0J5dGVBcnJheSgpOwoKICAgIE9iamVjdElucHV0U3RyZWFtIGlzdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSk7CgogICAgTG9jYWxlIHRlc3QyID0gKExvY2FsZSkoaXN0cmVhbS5yZWFkT2JqZWN0KCkpOwoKICAgIGlmICghdGVzdDEuZXF1YWxzKHRlc3QyKSB8fCB0ZXN0MS5oYXNoQ29kZSgpICE9IHRlc3QyLmhhc2hDb2RlKCkpCiAgICAgICAgZXJybG4oIkxvY2FsZSBmYWlsZWQgdG8gZGVzZXJpYWxpemUgY29ycmVjdGx5LiIpOwp9CiovCgovKioKICogQGJ1ZyA0MTE4NTg3CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0U2ltcGxlRGlzcGxheU5hbWVzKCkgCnsKICAgIC8vIFRoaXMgdGVzdCBpcyBkaWZmZXJlbnQgZnJvbSBUZXN0RGlzcGxheU5hbWVzIGJlY2F1c2UgVGVzdERpc3BsYXlOYW1lcyBjaGVja3MKICAgIC8vIGZhbGxiYWNrIGJlaGF2aW9yLCBjb21iaW5hdGlvbiBvZiBsYW5ndWFnZSBhbmQgY291bnRyeSBuYW1lcyB0byBmb3JtIGxvY2FsZQogICAgLy8gbmFtZXMsIGFuZCBvdGhlciBzdHVmZiBsaWtlIHRoYXQuICBUaGlzIHRlc3QganVzdCBjaGVja3Mgc3BlY2lmaWMgbGFuZ3VhZ2UKICAgIC8vIGFuZCBjb3VudHJ5IGNvZGVzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IG5hbWVzIGZvciB0aGVtLgogICAgY2hhciBsYW5ndWFnZUNvZGVzW10gWzRdID0geyAiaGUiLCAiaWQiLCAiaXUiLCAidWciLCAieWkiLCAiemEiIH07CiAgICBVbmljb2RlU3RyaW5nIGxhbmd1YWdlTmFtZXMgW10gPSB7ICJIZWJyZXciLCAiSW5kb25lc2lhbiIsICJJbnVraXR1dCIsICJVaWdodXIiLCAiWWlkZGlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmh1YW5nIiB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdDsKICAgICAgICBMb2NhbGUgbChsYW5ndWFnZUNvZGVzW2ldLCAiIiwgIiIpOwogICAgICAgIGwuZ2V0RGlzcGxheUxhbmd1YWdlKExvY2FsZTo6VVMsIHRlc3QpOwogICAgICAgIGlmICh0ZXN0ICE9IGxhbmd1YWdlTmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJHb3Qgd3JvbmcgZGlzcGxheSBuYW1lIGZvciAiICsgVW5pY29kZVN0cmluZyhsYW5ndWFnZUNvZGVzW2ldKSArICI6IEV4cGVjdGVkIFwiIiArCiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlTmFtZXNbaV0gKyAiXCIsIGdvdCBcIiIgKyB0ZXN0ICsgIlwiLiIpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTE4NTk1CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VW5pbnN0YWxsZWRJU08zTmFtZXMoKSAKewogICAgLy8gVGhpcyB0ZXN0IGNoZWNrcyB0byBtYWtlIHN1cmUgZ2V0SVNPM0xhbmd1YWdlIGFuZCBnZXRJU08zQ291bnRyeSB3b3JrIHJpZ2h0CiAgICAvLyBldmVuIGZvciBsb2NhbGVzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQuCiAgICBjb25zdCBjaGFyIGlzbzJMYW5ndWFnZXMgW11bNF0gPSB7ICAgICAiYW0iLCAiYmEiLCAiZnkiLCAibXIiLCAicm4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcyIsICJ0dyIsICJ6dSIgfTsKICAgIGNvbnN0IGNoYXIgaXNvM0xhbmd1YWdlcyBbXVs1XSA9IHsgICAgICJhbWgiLCAiYmFrIiwgImZyeSIsICJtYXIiLCAicnVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3N3IiwgInR3aSIsICJ6dWwiIH07CgogICAgaW50MzJfdCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CgogICAgICBVbmljb2RlU3RyaW5nIHRlc3Q7CiAgICAgICAgTG9jYWxlIGwoaXNvMkxhbmd1YWdlc1tpXSwgIiIsICIiKTsKICAgICAgICB0ZXN0ID0gbC5nZXRJU08zTGFuZ3VhZ2UoKTsKICAgICAgICBpZigodGVzdCAhPSBpc28zTGFuZ3VhZ2VzW2ldKSB8fCBVX0ZBSUxVUkUoZXJyKSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGlzbzJMYW5ndWFnZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBpc28zTGFuZ3VhZ2VzW2ldICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iICsgVW5pY29kZVN0cmluZyh1X2Vycm9yTmFtZShlcnIpKSk7CiAgICB9CgogICAgY2hhciBpc28yQ291bnRyaWVzIFtdWzRdID0geyAgICAgIkFGIiwgIkJXIiwgIktaIiwgIk1PIiwgIk1OIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0IiLCAiVEMiLCAiWlciIH07CiAgICBjaGFyIGlzbzNDb3VudHJpZXMgW11bNF0gPSB7ICAgICAiQUZHIiwgIkJXQSIsICJLQVoiLCAiTUFDIiwgIk1ORyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNMQiIsICJUQ0EiLCAiWldFIiB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgTG9jYWxlIGwoIiIsIGlzbzJDb3VudHJpZXNbaV0sICIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3QobC5nZXRJU08zQ291bnRyeSgpLCAiIik7CiAgICAgICAgaWYgKHRlc3QgIT0gaXNvM0NvdW50cmllc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGlzbzJDb3VudHJpZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nKGlzbzNDb3VudHJpZXNbaV0pICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iICsgdV9lcnJvck5hbWUoZXJyKSk7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQwOTI0NzUKICogSSBjb3VsZCBub3QgcmVwcm9kdWNlIHRoaXMgYnVnLiAgSSdtIHByZXR0eSBjb252aW5jZWQgaXQgd2FzIGZpeGVkIHdpdGggdGhlCiAqIGJpZyBsb2NhbGUtZGF0YSByZW9yZyBvZiAxMC8yOC85Ny4gIFRoZSBsb29rdXAgbG9naWMgZm9yIGxhbmd1YWdlIGFuZCBjb3VudHJ5CiAqIGRpc3BsYXkgbmFtZXMgd2FzIGFsc28gY2hhbmdlZCBhdCB0aGF0IHRpbWUgaW4gdGhhdCBjaGVjay1pbi4gICAgLS1ydGcgMy8yMC85OAogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEF0eXBpY2FsTG9jYWxlcygpIAp7CiAgICBMb2NhbGUgbG9jYWxlc1RvVGVzdCBbXSA9IHsgTG9jYWxlKCJkZSIsICJDQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJqYSIsICJaQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgicnUiLCAiTVgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoImVuIiwgIkZSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJlcyIsICJERSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkhSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiU0UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJETyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkJFIikgfTsKCiAgICBVbmljb2RlU3RyaW5nIGVuZ2xpc2hEaXNwbGF5TmFtZXMgW10gPSB7ICJHZXJtYW4gKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuZXNlIChTb3V0aCBBZnJpY2EpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdXNzaWFuIChNZXhpY28pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGFuaXNoIChHZXJtYW55KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dlZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpdW0iIH07CiAgICBVbmljb2RlU3RyaW5nIGZyZW5jaERpc3BsYXlOYW1lcyBbXT0geyAiYWxsZW1hbmQgKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFwb25haXMgKFNvdXRoIEFmcmljYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVzc2lhbiAoTWV4aWNvKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5nbGFpcyAoRnJhbmNlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNwYWdub2wgKEFsbGVtYWduZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJTdVxcdTAwRThkZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9taW5pY2FuIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpcXVlIiB9OwogICAgVW5pY29kZVN0cmluZyBydXMoIlJ1c3NpYW4gKE0iKTsKICAgIHJ1cyArPSAoVUNoYXIzMikweDAwZTk7CiAgICBydXMgKz0gInhpY28pIjsKCiAgICBVbmljb2RlU3RyaW5nIGVzcCgiZXNwYSIpOwogICAgZXNwICs9IChVQ2hhcjMyKTB4MDBmMTsKICAgIGVzcCArPSAib2wgKEdlcm1hbnkpIjsKCiAgICBVbmljb2RlU3RyaW5nIGRyKCJSZXAiKTsKICAgIGRyICs9IChVQ2hhcjMyKTB4MDBmYTsKICAgIGRyICs9ICJibGljYSBEb21pbmljYW5hIjsKCiAgICBVbmljb2RlU3RyaW5nIHNwYW5pc2hEaXNwbGF5TmFtZXMgW10gPSB7ICJHZXJtYW4gKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuZXNlIChTb3V0aCBBZnJpY2EpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTd2VkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsZ2l1bSIgfTsKCiAgICBpbnQzMl90IGk7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIExvY2FsZTo6c2V0RGVmYXVsdChMb2NhbGU6OlVTLCBzdGF0dXMpOwogICAgZm9yIChpID0gMDsgaSA8IDk7ICsraSkgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZTo6VVMsIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgewogICAgICAgICAgICBlcnJsbigiTG9va3VwIGluIEVuZ2xpc2ggZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBlbmdsaXNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgICAgICAgICBsb2dsbigiTG9jYWxlIG5hbWUgd2FzLT4gIiArIChuYW1lPWxvY2FsZXNUb1Rlc3RbaV0uZ2V0TmFtZSgpKSk7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImVzIiwgIkVTIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IHNwYW5pc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gU3BhbmlzaCBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIHNwYW5pc2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZTo6RlJBTkNFLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lKTsKICAgICAgICBpZiAobmFtZSAhPSBmcmVuY2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gRnJlbmNoIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZnJlbmNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTI2MzcxCiAqLwovLyBub3QgYXBwbGljYWJsZSBpbiBDKyssIHNldERlZmF1bHQoKSB0YWtlcyBhIHJlZmVyZW5jZQp2b2lkIApMb2NhbGVUZXN0OjpUZXN0TnVsbERlZmF1bHQoKSAKewovKgogICAgLy8gd2h5IG9uIGVhcnRoIGFueW9uZSB3b3VsZCBldmVyIHRyeSB0byBkbyB0aGlzIGlzIGJleW9uZCBtZSwgYnV0IHdlIHNob3VsZAogICAgLy8gZGVmaW5pdGVseSBtYWtlIHN1cmUgd2UgZG9uJ3QgbGV0IHRoZW0KICAgIFVCb29sIGdvdEV4Y2VwdGlvbiA9IEZBTFNFOwogICAgdHJ5IHsKICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChudWxsKTsKICAgIH0KICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgLy8gYWxsIG90aGVyIGV4Y2VwdGlvbiB0eXBlcyBwcm9wYWdhdGUgdGhyb3VnaCBoZXJlIGJhY2sgdG8gdGhlIHRlc3QgaGFybmVzcwogICAgICAgIGdvdEV4Y2VwdGlvbiA9IFRSVUU7CiAgICB9CiAgICBpZiAoTG9jYWxlLmdldERlZmF1bHQoKSA9PSBudWxsKQogICAgICAgIGVycmxuKCJMb2NhbGUuZ2V0RGVmYXVsdCgpIGFsbG93ZWQgdXMgdG8gc2V0IGRlZmF1bHQgdG8gTlVMTCEiKTsKICAgIGlmICghZ290RXhjZXB0aW9uKQogICAgICAgIGVycmxuKCJUcnlpbmcgdG8gc2V0IGRlZmF1bHQgbG9jYWxlIHRvIE5VTEwgZGlkbid0IHRocm93IGV4Y2VwdGlvbiEiKTsKKi8KfQoKLyoqCiAqIEBidWcgNDEzNTc1MgogKiBUaGlzIHdvdWxkIGJlIGJldHRlciB0ZXN0ZWQgYnkgdGhlIExvY2FsZURhdGFUZXN0LiAgV2lsbCBtb3ZlIGl0IHdoZW4gSQogKiBnZXQgdGhlIExvY2FsZURhdGFUZXN0IHdvcmtpbmcgYWdhaW4uCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VGhhaUN1cnJlbmN5Rm9ybWF0KCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgRGVjaW1hbEZvcm1hdCAqdGhhaUN1cnJlbmN5ID0gKERlY2ltYWxGb3JtYXQqKU51bWJlckZvcm1hdDo6Y3JlYXRlQ3VycmVuY3lJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICBMb2NhbGUoInRoIiwgIlRIIiksIHN0YXR1cyk7CiAgICBVQ2hhciBwb3NQcmVmaXggPSAweDBlM2Y7CiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgaWYoVV9GQUlMVVJFKHN0YXR1cykgfHwgIXRoYWlDdXJyZW5jeSkKICAgIHsKICAgICAgICBlcnJsbigiQ291bGRuJ3QgZ2V0IHRoX1RIIGN1cnJlbmN5IC0+ICIgKyBVbmljb2RlU3RyaW5nKHVfZXJyb3JOYW1lKHN0YXR1cykpKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVByZWZpeCh0ZW1wKSAhPSBVbmljb2RlU3RyaW5nKCZwb3NQcmVmaXgsIDEsIDEpKQogICAgICAgIGVycmxuKCJUaGFpIGN1cnJlbmN5IHByZWZpeCB3cm9uZzogZXhwZWN0ZWQgMHgwZTNmLCBnb3QgXCIiICsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVByZWZpeCh0ZW1wKSArICJcIiIpOwogICAgaWYgKHRoYWlDdXJyZW5jeS0+Z2V0UG9zaXRpdmVTdWZmaXgodGVtcCkgIT0gIiIpCiAgICAgICAgZXJybG4oIlRoYWkgY3VycmVuY3kgc3VmZml4IHdyb25nOiBleHBlY3RlZCBcIlwiLCBnb3QgXCIiICsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVN1ZmZpeCh0ZW1wKSArICJcIiIpOwoKICAgIGRlbGV0ZSB0aGFpQ3VycmVuY3k7Cn0KCi8qKgogKiBAYnVnIDQxMjIzNzEKICogQ29uZmlybSB0aGF0IEV1cm8gc3VwcG9ydCB3b3Jrcy4gIFRoaXMgdGVzdCBpcyBwcmV0dHkgcnVkaW1lbnRhcnk7IGFsbCBpdCBkb2VzCiAqIGlzIGNoZWNrIHRoYXQgYW55IGxvY2FsZXMgd2l0aCB0aGUgRVVSTyB2YXJpYW50IGZvcm1hdCBhIG51bWJlciB1c2luZyB0aGUKICogRXVybyBjdXJyZW5jeSBzeW1ib2wuCiAqCiAqIEFTU1VNRTogQWxsIGxvY2FsZXMgZW5jb2RlIHRoZSBFdXJvIGNoYXJhY3RlciAiXHUyMEFDIi4KICogSWYgdGhpcyBpcyBjaGFuZ2VkIHRvIHVzZSB0aGUgc2luZ2xlLWNoYXJhY3RlciBFdXJvIHN5bWJvbCwgdGhpcwogKiB0ZXN0IG11c3QgYmUgdXBkYXRlZC4KICoKICogRE9OJ1QgQVNTVU1FOiBBbnkgc3BlY2lmaWMgY291bnRyaWVzIHN1cHBvcnQgdGhlIEV1cm8uICBJbnN0ZWFkLAogKiBpdGVyYXRlIHRocm91Z2ggYWxsIGxvY2FsZXMuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0RXVyb1N1cHBvcnQoKSAKewogICAgY29uc3QgVW5pY29kZVN0cmluZyBFVVJPX1ZBUklBTlQoIkVVUk8iKTsKICAgIFVDaGFyIGV1cm8gPSAweDIwYWM7CiAgICBjb25zdCBVbmljb2RlU3RyaW5nIEVVUk9fQ1VSUkVOQ1koJmV1cm8sIDEsIDEpOyAvLyBMb29rIGZvciB0aGlzIFVuaWNvZGVTdHJpbmcgaW4gZm9ybWF0dGVkIEV1cm8gY3VycmVuY3kKCiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgaW50MzJfdCBsb2NDb3VudCA9IDA7CiAgICBjb25zdCBMb2NhbGUgKmxvY2FsZXMgPSBOdW1iZXJGb3JtYXQ6OmdldEF2YWlsYWJsZUxvY2FsZXMobG9jQ291bnQpOyAgICAgIAogICAgZm9yIChpbnQzMl90IGk9MDsgaSA8IGxvY0NvdW50OyArK2kpIHsKICAgICAgICBMb2NhbGUgbG9jID0gbG9jYWxlc1tpXTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAgICAgaWYgKCAgKHRlbXA9bG9jLmdldFZhcmlhbnQoKSkuaW5kZXhPZihFVVJPX1ZBUklBTlQpID49IDApIHsKICAgICAgICAgICAgTnVtYmVyRm9ybWF0ICpuZiA9IE51bWJlckZvcm1hdDo6Y3JlYXRlQ3VycmVuY3lJbnN0YW5jZShsb2MsIHN0YXR1cyk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgcG9zOwogICAgICAgICAgICBuZi0+Zm9ybWF0KDI3MTgyOC4xODI4NDUsIHBvcyk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgbmVnOwogICAgICAgICAgICBuZi0+Zm9ybWF0KC0yNzE4MjguMTgyODQ1LCBuZWcpOwogICAgICAgICAgICBpZiAocG9zLmluZGV4T2YoRVVST19DVVJSRU5DWSkgPj0gMCAmJgogICAgICAgICAgICAgICAgbmVnLmluZGV4T2YoRVVST19DVVJSRU5DWSkgPj0gMCkgewogICAgICAgICAgICAgICAgbG9nbG4oIk9rOiAiICsgKHRlbXA9bG9jLmdldE5hbWUoKSkgKwogICAgICAgICAgICAgICAgICAgICAgIjogIiArIHBvcyArICIgLyAiICsgbmVnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVycmxuKCJGYWlsOiAiICsgKHRlbXA9bG9jLmdldE5hbWUoKSkgKwogICAgICAgICAgICAgICAgICAgICAgIiBmb3JtYXRzIHdpdGhvdXQgIiArIEVVUk9fQ1VSUkVOQ1kgKwogICAgICAgICAgICAgICAgICAgICAgIjogIiArIHBvcyArICIgLyAiICsgbmVnICsKICAgICAgICAgICAgICAgICAgICAgICJcbioqKiBUSElTIEZBSUxVUkUgTUFZIE9OTFkgTUVBTiBUSEFUIExPQ0FMRSBEQVRBIEhBUyBDSEFOR0VEICoqKiIpOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIGRlbGV0ZSBuZjsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMzk1MDQKICogdG9TdHJpbmcoKSBkb2Vzbid0IHdvcmsgd2l0aCBsYW5ndWFnZV9WQVJJQU5ULgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdFRvU3RyaW5nKCkgewogICAgTG9jYWxlIERBVEEgW10gPSB7CiAgICAgICAgTG9jYWxlKCJ4eCIsICIiLCAiIiksCiAgICAgICAgTG9jYWxlKCIiLCAiWVkiLCAiIiksCiAgICAgICAgTG9jYWxlKCIiLCAiIiwgIlpaIiksCiAgICAgICAgTG9jYWxlKCJ4eCIsICJZWSIsICIiKSwKICAgICAgICBMb2NhbGUoInh4IiwgIiIsICJaWiIpLAogICAgICAgIExvY2FsZSgiIiwgIllZIiwgIlpaIiksCiAgICAgICAgTG9jYWxlKCJ4eCIsICJZWSIsICJaWiIpLAogICAgfTsKCiAgICBjb25zdCBjaGFyIERBVEFfUyBbXVsyMF0gPSB7CiAgICAgICAgInh4IiwKICAgICAgICAiX1lZIiwKICAgICAgICAiX19aWiIsCiAgICAgICAgInh4X1lZIiwKICAgICAgICAieHhfX1paIiwKICAgICAgICAiX1lZX1paIiwKICAgICAgICAieHhfWVlfWloiLAogICAgfTsKICAgIAogICAgZm9yIChpbnQzMl90IGk9MDsgaSA8IDc7ICsraSkgewogICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgICBuYW1lID0gREFUQVtpXS5nZXROYW1lKCk7CgogICAgICBpZiAoc3RyY21wKG5hbWUsIERBVEFfU1tpXSkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGVycmxuKCJGYWlsOiBMb2NhbGUuZ2V0TmFtZSgpLCBnb3Q6IiArIFVuaWNvZGVTdHJpbmcobmFtZSkgKyAiLCBleHBlY3RlZDogIiArIERBVEFfU1tpXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9nbG4oIlBhc3M6IExvY2FsZS5nZXROYW1lKCksIGdvdDoiICsgVW5pY29kZVN0cmluZyhuYW1lKSApOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTM5OTQwCiAqIENvdWxkbid0IHJlcHJvZHVjZSB0aGlzIGJ1ZyAtLSBwcm9iYWJseSB3YXMgZml4ZWQgZWFybGllci4KICoKICogT1JJR0lOQUwgQlVHIFJFUE9SVDoKICogLS0gYmFzaWNhbGx5LCBodW5nYXJpYW4gZm9yIG1vbmRheSBzaG91bGRuJ3QgaGF2ZSBhbiBcdTAwZjQgCiAqIChvIGNpcmN1bWZsZXgpaW4gaXQgaW5zdGVhZCBpdCBzaG91bGQgYmUgYW4gbyB3aXRoIDIgaW5jbGluZWQgCiAqIChyaWdodCkgbGluZXMgb3ZlciBpdC4uCiAqCiAqIFlvdSBtYXkgd29uZGVyIC0tIHdoeSBkbyBhbGwgdGhpcyAtLSB3aHkgbm90IGp1c3QgYWRkIGEgbGluZSB0bwogKiBMb2NhbGVEYXRhPyAgV2VsbCwgSSBjb3VsZCBzZWUgYnkgaW5zcGVjdGlvbiB0aGF0IHRoZSBsb2NhbGUgZmlsZSBoYWQgdGhlCiAqIHJpZ2h0IGNoYXJhY3RlciBpbiBpdCwgc28gSSB3YW50ZWQgdG8gY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIC0tIGEKICogdmVyeSByZW1vdGUgcG9zc2liaWxpdHksIGJ1dCBJIHdhbnRlZCB0byBiZSBzdXJlLiAgVGhlIG90aGVyIHBvc3NpYmlsaXR5CiAqIGlzIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIGZvbnQgbWFwcGluZyBzdWJzeXN0ZW0sIGJ1dCB3ZSBjYW4ndAogKiB0ZXN0IHRoYXQgaGVyZS4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTM5OTQwKCkgCnsKICAgIExvY2FsZSBteWxvY2FsZSgiaHUiLCAiIiwgIiIpOyAgICAgICAKICAgIFVEYXRlIG15ZGF0ZSA9IGRhdGUoOTgsMywxMyk7IC8vIEEgTW9uZGF5CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIFNpbXBsZURhdGVGb3JtYXQgZGZfZnVsbCgiRUVFRSIsIG15bG9jYWxlLCBzdGF0dXMpOwogICAgVW5pY29kZVN0cmluZyBzdHI7CiAgICBGaWVsZFBvc2l0aW9uIHBvcyhGaWVsZFBvc2l0aW9uOjpET05UX0NBUkUpOwogICAgZGZfZnVsbC5mb3JtYXQobXlkYXRlLCBzdHIsIHBvcyk7CiAgICAvLyBNYWtlIHN1cmUgdGhhdCBvIGNpcmN1bWZsZXggKFx1MDBGNCkgaXMgTk9UIHRoZXJlLCBhbmQKICAgIC8vIG8gZG91YmxlIGFjdXRlIChcdTAxNTEpIElTLgogICAgVUNoYXIgb2NmID0gMHgwMGY0OwogICAgVUNoYXIgb2RhID0gMHgwMTUxOwogICAgaWYgKHN0ci5pbmRleE9mKG9kYSkgPCAwIHx8IHN0ci5pbmRleE9mKG9jZikgPj0gMCkKICAgICAgICBlcnJsbigiRmFpbDogTW9uZGF5IGluIEh1bmdhcmlhbiBpcyB3cm9uZyIpOwp9CgpVRGF0ZQpMb2NhbGVUZXN0OjpkYXRlKGludDMyX3QgeSwgaW50MzJfdCBtLCBpbnQzMl90IGQsIGludDMyX3QgaHIsIGludDMyX3QgbWluLCBpbnQzMl90IHNlYykKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBDYWxlbmRhciAqY2FsID0gQ2FsZW5kYXI6OmNyZWF0ZUluc3RhbmNlKHN0YXR1cyk7CiAgICBpZiAoY2FsID09IDApIAogICAgICAgIHJldHVybiAwLjA7CiAgICBjYWwtPmNsZWFyKCk7CiAgICBjYWwtPnNldCgxOTAwICsgeSwgbSwgZCwgaHIsIG1pbiwgc2VjKTsgLy8gQWRkIDE5MDAgdG8gZm9sbG93IGphdmEudXRpbC5EYXRlIHByb3RvY29sCiAgICBVRGF0ZSBkdCA9IGNhbC0+Z2V0VGltZShzdGF0dXMpOwogICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogICAgICAgIHJldHVybiAwLjA7CiAgICAKICAgIGRlbGV0ZSBjYWw7CiAgICByZXR1cm4gZHQ7Cn0KCi8qKgogKiBAYnVnIDQxNDM5NTEKICogUnVzc2lhbiBmaXJzdCBkYXkgb2Ygd2VlayBzaG91bGQgYmUgTW9uZGF5LiBDb25maXJtZWQuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDE0Mzk1MSgpIAp7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIENhbGVuZGFyICpjYWwgPSBDYWxlbmRhcjo6Y3JlYXRlSW5zdGFuY2UoTG9jYWxlKCJydSIsICIiLCAiIiksIHN0YXR1cyk7CiAgICBpZiAoY2FsLT5nZXRGaXJzdERheU9mV2VlaygpICE9IENhbGVuZGFyOjpNT05EQVkpIHsKICAgICAgICBlcnJsbigiRmFpbDogRmlyc3QgZGF5IG9mIHdlZWsgaW4gUnVzc2lhIHNob3VsZCBiZSBNb25kYXkiKTsKICAgIH0KICAgIGRlbGV0ZSBjYWw7Cn0KCi8qKgogKiBAYnVnIDQxNDczMTUKICogamF2YS51dGlsLkxvY2FsZS5nZXRJU08zQ291bnRyeSgpIHdvcmtzIHdyb25nIGZvciBub24gSVNPLTMxNjYgY29kZXMuCiAqIFNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHVua25vd24gbG9jYWxlcwogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxNDczMTUoKSAKewogIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgIC8vIFRyeSB3aXRoIGNvZGVzIHRoYXQgYXJlIHRoZSB3cm9uZyBsZW5ndGggYnV0IGhhcHBlbiB0byBtYXRjaCB0ZXh0CiAgICAvLyBhdCBhIHZhbGlkIG9mZnNldCBpbiB0aGUgbWFwcGluZyB0YWJsZQogICAgTG9jYWxlIGxvY2FsZSgiYWFhIiwgIkNDQyIpOwogICAgCiAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBsb2NhbGUuZ2V0SVNPM0NvdW50cnkoKTsKCiAgICAvLyBDaGFuZ2UgdG8gY29uZm9ybSB0byBDIGFwaSB1c2FnZQogICAgaWYoKHJlc3VsdD09TlVMTCl8fChyZXN1bHRbMF0gIT0gMCkpCiAgICAgIGVycmxuKCJFUlJPUjogZ2V0SVNPM0NvdW50cnkoKSByZXR1cm5zOiAiICsgVW5pY29kZVN0cmluZyhyZXN1bHQsIiIpICsgCiAgICAgICAgICAgICAgICAiIGZvciBsb2NhbGUgJyIgKyAodGVtcD1sb2NhbGUuZ2V0TmFtZSgpKSArICInIHJhdGhlciB0aGFuIGV4Y2VwdGlvbiIgKTsKfQoKLyoqCiAqIEBidWcgNDE0NzMxNwogKiBqYXZhLnV0aWwuTG9jYWxlLmdldElTTzNMYW5ndWFnZSgpIHdvcmtzIHdyb25nIGZvciBub24gSVNPLTMxNjYgY29kZXMuCiAqIFNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHVua25vd24gbG9jYWxlcwogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxNDczMTcoKSAKewogICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgLy8gVHJ5IHdpdGggY29kZXMgdGhhdCBhcmUgdGhlIHdyb25nIGxlbmd0aCBidXQgaGFwcGVuIHRvIG1hdGNoIHRleHQKICAgIC8vIGF0IGEgdmFsaWQgb2Zmc2V0IGluIHRoZSBtYXBwaW5nIHRhYmxlCiAgICBMb2NhbGUgbG9jYWxlKCJhYWEiLCAiQ0NDIik7CiAgICAKICAgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKTsKCiAgICAvLyBDaGFuZ2UgdG8gY29uZm9ybSB0byBDIGFwaSB1c2FnZQogICAgaWYoKHJlc3VsdD09TlVMTCl8fChyZXN1bHRbMF0gIT0gMCkpCiAgICAgIGVycmxuKCJFUlJPUjogZ2V0SVNPM0xhbmd1YWdlKCkgcmV0dXJuczogIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0LCIiKSArIAogICAgICAgICAgICAgICAgIiBmb3IgbG9jYWxlICciICsgKHRlbXA9bG9jYWxlLmdldE5hbWUoKSkgKyAiJyByYXRoZXIgdGhhbiBleGNlcHRpb24iICk7Cn0KCi8qCiAqIEBidWcgNDE0NzU1MgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxNDc1NTIoKSAKewogICAgTG9jYWxlIGxvY2FsZXMgW10gPSB7ICAgICBMb2NhbGUoIm5vIiwgIk5PIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJubyIsICJOTyIsICJCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJubyIsICJOTyIsICJOWSIpIAogICAgfTsKICAgIAogICAgVW5pY29kZVN0cmluZyBlZG4oIk5vcndlZ2lhbiAoTm9yd2F5LCBCb2ttIik7CiAgICBlZG4gKz0gKFVDaGFyMzIpMHgwMGU1OwogICAgZWRuICs9ICJsKSI7CiAgICBVbmljb2RlU3RyaW5nIGVuZ2xpc2hEaXNwbGF5TmFtZXMgW10gPSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9yd2VnaWFuIChOb3J3YXkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJOb3J3ZWdpYW4gKE5vcndheSxCKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyJOb3J3ZWdpYW4gKE5vcndheSxOWSkiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIgCiAgICB9OwogICAgVW5pY29kZVN0cmluZyBuZG4oIm5vcnNrIChOb3JnZSwgQm9rbSIpOwogICAgbmRuICs9IChVQ2hhcjMyKTB4MDBlNTsKICAgIG5kbiArPSAibCkiOwogICAgVW5pY29kZVN0cmluZyBub3J3ZWdpYW5EaXNwbGF5TmFtZXMgW10gPSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9yc2sgKE5vcmdlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIm5vcnNrIChOb3JnZSxCKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ibm9yc2sgKE5vcmdlLE5ZKSIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9yc2sgKE5vcmdlLCBOeW5vcnNrKSIgCiAgICB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgIExvY2FsZSBsb2MgPSBsb2NhbGVzW2ldOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBpZiAobG9jLmdldERpc3BsYXlOYW1lKHRlbXApICE9IGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgZXJybG4oIkVuZ2xpc2ggZGlzcGxheS1uYW1lIG1pc21hdGNoOiBleHBlY3RlZCAiICsKICAgICAgICAgICAgICAgICAgIGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0gKyAiLCBnb3QgIiArIGxvYy5nZXREaXNwbGF5TmFtZSh0ZW1wKSk7CiAgICAgICAgaWYgKGxvYy5nZXREaXNwbGF5TmFtZShsb2MsIHRlbXApICE9IG5vcndlZ2lhbkRpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIk5vcndlZ2lhbiBkaXNwbGF5LW5hbWUgbWlzbWF0Y2g6IGV4cGVjdGVkICIgKwogICAgICAgICAgICAgICAgICAgbm9yd2VnaWFuRGlzcGxheU5hbWVzW2ldICsgIiwgZ290ICIgKwogICAgICAgICAgICAgICAgICAgbG9jLmdldERpc3BsYXlOYW1lKGxvYywgdGVtcCkpOwogICAgfQp9Cgp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RWYXJpYW50UGFyc2luZygpCnsKICAgIExvY2FsZSBlbl9VU19jdXN0b20oImVuIiwgIlVTIiwgIkRlIEFuemFfQ3VwZXJ0aW5vX0NhbGlmb3JuaWFfVW5pdGVkIFN0YXRlc19FYXJ0aCIpOwoKICAgIFVuaWNvZGVTdHJpbmcgZGlzcE5hbWUoIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMsIERFIEFOWkFfQ1VQRVJUSU5PX0NBTElGT1JOSUFfVU5JVEVEIFNUQVRFU19FQVJUSCkiKTsKICAgIFVuaWNvZGVTdHJpbmcgZGlzcFZhcigiREUgQU5aQV9DVVBFUlRJTk9fQ0FMSUZPUk5JQV9VTklURUQgU1RBVEVTX0VBUlRIIik7CiAgICAKICAgIFVuaWNvZGVTdHJpbmcgZ290OwogICAgCiAgICBlbl9VU19jdXN0b20uZ2V0RGlzcGxheVZhcmlhbnQoTG9jYWxlOjpVUywgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwVmFyKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiAiICsgZGlzcFZhcik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlOYW1lKExvY2FsZTo6VVMsIGdvdCk7CiAgICBpZihnb3QgIT0gZGlzcE5hbWUpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheU5hbWUoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6ICIgKyBkaXNwTmFtZSk7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIHNob3J0VmFyaWFudCgiZnIiLCAiRlIiLCAiZm9vIik7CiAgICBzaG9ydFZhcmlhbnQuZ2V0RGlzcGxheVZhcmlhbnQoZ290KTsKICAgIAogICAgaWYoZ290ICE9ICJGT08iKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiBmb28iKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgYm9ndXNWYXJpYW50KCJmciIsICJGUiIsICJfZm9vIik7CiAgICBib2d1c1ZhcmlhbnQuZ2V0RGlzcGxheVZhcmlhbnQoZ290KTsKICAgIAogICAgaWYoZ290ICE9ICJGT08iKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiBmb28iKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgYm9ndXNWYXJpYW50MigiZnIiLCAiRlIiLCAiZm9vXyIpOwogICAgYm9ndXNWYXJpYW50Mi5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQzKCJmciIsICJGUiIsICJfZm9vXyIpOwogICAgYm9ndXNWYXJpYW50My5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTA1ODI4CiAqIEN1cnJlbmN5IHN5bWJvbCBpbiB6aCBpcyB3cm9uZy4gIFdlIHdpbGwgdGVzdCB0aGlzIGF0IHRoZSBOdW1iZXJGb3JtYXQKICogZW5kIHRvIHRlc3QgdGhlIHdob2xlIHBpcGUuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDEwNTgyOCgpIAp7CiAgICBMb2NhbGUgTE9DIFtdID0geyBMb2NhbGU6OkNISU5FU0UsICBMb2NhbGUoInpoIiwgIkNOIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICBMb2NhbGUoInpoIiwgIlRXIiwgIiIpLCBMb2NhbGUoInpoIiwgIkhLIiwgIiIpIH07CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIE51bWJlckZvcm1hdCAqZm10ID0gTnVtYmVyRm9ybWF0OjpjcmVhdGVQZXJjZW50SW5zdGFuY2UoTE9DW2ldLCBzdGF0dXMpOwogICAgICAgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICAgICAgICAgIGVycmxuKCJDb3VsZG4ndCBjcmVhdGUgTnVtYmVyRm9ybWF0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgVW5pY29kZVN0cmluZyByZXN1bHQ7CiAgICAgICAgRmllbGRQb3NpdGlvbiBwb3MoMCk7CiAgICAgICAgZm10LT5mb3JtYXQoKGludDMyX3QpMSwgcmVzdWx0LCBwb3MpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBpZihyZXN1bHQgIT0gIjEwMCUiKSB7CiAgICAgICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoIlBlcmNlbnQgZm9yICIpICsgTE9DW2ldLmdldERpc3BsYXlOYW1lKHRlbXApICsgIiBzaG91bGQgYmUgMTAwJSwgZ290ICIgKyByZXN1bHQpOwogICAgICAgIH0KICAgICAgICBkZWxldGUgZm10OwogICAgfQp9Cg==