Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
151A2C48C3352146D6E17A568064A96EB225C1CF6551B5CEAB294D83C301D23E
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
142,725,754
Requested gas limit
GAS USED
71,362,927
Gas consumed
FEE
142726ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1ftls0ctrrj0y96sr9dq906j7gdqhg9exgcvaey
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CsKSAwoML3ZtLm1fYWRkcGtnErCSAwooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRKCkgMKBWFkbWluEh1nbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbhryGQoJYWRtaW4uZ25vEuQZcGFja2FnZSBhZG1pbgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKKQoKY29uc3QgKAoJVHJhbnNmZXJBZG1pbkV2ZW50ICA9ICJUcmFuc2ZlckFkbWluIgoJQWNjZXB0QWRtaW5FdmVudCAgICA9ICJBY2NlcHRBZG1pbiIKCUNhbmNlbEFkbWluRXZlbnQgICAgPSAiQ2FuY2VsQWRtaW4iCglTZXRFeHBsb3JlclVSTEV2ZW50ID0gIlNldEV4cGxvcmVyVVJMIgopCgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MKCXBlbmRpbmdBZG1pbiBhZGRyZXNzCglleHBsb3JlclVSTCAgc3RyaW5nID0gImh0dHBzOi8vYXBwLmJldGEuYWtrYWRpYS5sYW5kIgopCgpmdW5jIGluaXQoKSB7CgljYWxsZXIgOj0gdW5zYWZlLk9yaWdpbkNhbGxlcigpCglhZG1pbiA9IGNhbGxlcgp9CgpmdW5jIEdldEFkbWluKCkgYWRkcmVzcyB7CglyZXR1cm4gYWRtaW4KfQoKZnVuYyBHZXRQZW5kaW5nQWRtaW4oKSBhZGRyZXNzIHsKCXJldHVybiBwZW5kaW5nQWRtaW4KfQoKZnVuYyBUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgbmV3QWRtaW4gYWRkcmVzcykgewoJYXNzZXJ0VHJhbnNmZXJBZG1pbkNhbGxlcigwLCBjdXIpCglhc3NlcnRWYWxpZEFkZHJlc3MobmV3QWRtaW4pCglpZiBwZW5kaW5nQWRtaW4uSXNWYWxpZCgpIHsKCQlwYW5pYygicGVuZGluZyBhZG1pbiB0cmFuc2ZlciBhbHJlYWR5IGV4aXN0cyIpCgl9CgoJcGVuZGluZ0FkbWluID0gbmV3QWRtaW4KCgljaGFpbi5FbWl0KAoJCVRyYW5zZmVyQWRtaW5FdmVudCwKCQkiZnJvbSIsIGFkbWluLlN0cmluZygpLAoJCSJ0byIsIG5ld0FkbWluLlN0cmluZygpLAoJKQp9CgpmdW5jIGFzc2VydFRyYW5zZmVyQWRtaW5DYWxsZXIoXyBpbnQsIHJsbSByZWFsbSkgewoJaWYgIWFkbWluLklzVmFsaWQoKSB7CgkJLy8gVGhlIGFkbWluIHJlYWxtIG5vcm1hbGx5IGluaXRpYWxpemVzIGFkbWluIGZyb20gT3JpZ2luQ2FsbGVyIGR1cmluZwoJCS8vIHBhY2thZ2UgZGVwbG95bWVudCwgc28gYSBsaXZlIG9uLWNoYWluIGFkbWluIHNob3VsZCBiZSBhIHZhbGlkIGFkZHJlc3MuCgkJLy8gQW4gZW1wdHkgYWRtaW4gaXMgYSBib290c3RyYXAtb25seSBzdGF0ZSBvYnNlcnZlZCBieSBjcm9zcy1wYWNrYWdlIHRlc3RzOgoJCS8vIGRlcGVuZGVudCByZWFsbSB0ZXN0cyBjYW4gaW1wb3J0IGFkbWluIGJlZm9yZSBhIHJlYWwgZGVwbG95IHNpZ25lciBleGlzdHMsCgkJLy8gbGVhdmluZyBhZG1pbiBhcyBhZGRyZXNzKCIiKS4gSW4gdGhhdCBzdGF0ZSB0aGVyZSBpcyBubyB2YWxpZCB1c2VyIGFkZHJlc3MKCQkvLyB0aGF0IGNhbiBzYXRpc2Z5IGRpcmVjdCBjYWxsZXIgYXV0aG9yaXphdGlvbiwgc28gcmVxdWlyaW5nIEFzc2VydElzQWRtaW4KCQkvLyB3b3VsZCBtYWtlIHRob3NlIHRlc3RzIHVuYWJsZSB0byBwcm9tb3RlIGEgcmVhbCB0ZXN0IGFkbWluIGF0IGFsbC4KCQkvLwoJCS8vIEtlZXAgdGhlIGxlZ2FjeSBPcmlnaW5DYWxsZXIgY2hlY2sgb25seSBmb3IgdGhpcyBpbnZhbGlkLWFkbWluIGJvb3RzdHJhcAoJCS8vIHN0YXRlLiBUaGlzIHByZXNlcnZlcyB0aGUgbmFycm93IHRlc3QvYm9vdHN0cmFwIHBhdGggd2hlcmUgdGhlIGN1cnJlbnQKCQkvLyBwbGFjZWhvbGRlciBhZG1pbiBpcyBhZGRyZXNzKCIiKSwgd2hpbGUgZW5zdXJpbmcgdGhhdCBvbmNlIGEgcmVhbCBhZG1pbiBpcwoJCS8vIGFjY2VwdGVkIGV2ZXJ5IHN1YnNlcXVlbnQgYWRtaW4gdHJhbnNmZXIgaXMgZGlyZWN0LWNhbGxlci1vbmx5LiBJbiBvdGhlcgoJCS8vIHdvcmRzLCBjb2RlLXJlYWxtIHJlbGF5cyBjYW5ub3QgYm9ycm93IGEgdmFsaWQgYWRtaW4gc2lnbmVyJ3MgYXV0aG9yaXR5IHRvCgkJLy8gY2hhbmdlIHBlbmRpbmdBZG1pbjsgdGhlIGV4Y2VwdGlvbiBleGlzdHMgc29sZWx5IHRvIGVzY2FwZSB0aGUgZW1wdHkKCQkvLyBpbXBvcnRlZC10ZXN0IGluaXRpYWxpemF0aW9uIHN0YXRlLgoJCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0Q3VycmVudFJlYWxtKDAsIHJsbSkKCQlhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW5PcmlnaW4oSXNBZG1pbikKCQlyZXR1cm4KCX0KCglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgcmxtLCBJc0FkbWluKQp9CgpmdW5jIEFjY2VwdEFkbWluKGN1ciByZWFsbSkgewoJaWYgIXBlbmRpbmdBZG1pbi5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHBlbmRpbmcgYWRtaW4gYWRkcmVzcyIpCgl9CgljYWxsZXIgOj0gbXVzdEdldFBlbmRpbmdBZG1pblVzZXJDYWxsZXIoMCwgY3VyKQoKCXByZXZBZG1pbiA6PSBhZG1pbgoJYWRtaW4gPSBjYWxsZXIKCXBlbmRpbmdBZG1pbiA9IGFkZHJlc3MoIiIpCgoJY2hhaW4uRW1pdCgKCQlBY2NlcHRBZG1pbkV2ZW50LAoJCSJmcm9tIiwgcHJldkFkbWluLlN0cmluZygpLAoJCSJ0byIsIGFkbWluLlN0cmluZygpLAoJKQp9CgpmdW5jIENhbmNlbEFkbWluVHJhbnNmZXIoY3VyIHJlYWxtKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBJc0FkbWluKQoJaWYgIXBlbmRpbmdBZG1pbi5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHBlbmRpbmcgYWRtaW4gYWRkcmVzcyIpCgl9CgoJY2FuY2VsZWRBZG1pbiA6PSBwZW5kaW5nQWRtaW4KCXBlbmRpbmdBZG1pbiA9IGFkZHJlc3MoIiIpCgoJY2hhaW4uRW1pdCgKCQlDYW5jZWxBZG1pbkV2ZW50LAoJCSJhZG1pbiIsIGFkbWluLlN0cmluZygpLAoJCSJwZW5kaW5nQWRtaW4iLCBjYW5jZWxlZEFkbWluLlN0cmluZygpLAoJKQp9CgpmdW5jIElzQWRtaW4oYWRkcmVzcyBhZGRyZXNzKSBib29sIHsKCXJldHVybiBhZGRyZXNzID09IGFkbWluCn0KCi8vIFNldEV4cGxvcmVyVVJMIHNldHMgdGhlIGV4cGxvcmVyIGJhc2UgVVJMIChhZG1pbiBvbmx5KQpmdW5jIFNldEV4cGxvcmVyVVJMKGN1ciByZWFsbSwgdXJsIHN0cmluZykgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgSXNBZG1pbikKCglub3JtYWxpemVkVVJMIDo9IG5vcm1hbGl6ZUV4cGxvcmVyVVJMKHVybCkKCW9sZFVSTCA6PSBleHBsb3JlclVSTAoJZXhwbG9yZXJVUkwgPSBub3JtYWxpemVkVVJMCgoJY2hhaW4uRW1pdCgKCQlTZXRFeHBsb3JlclVSTEV2ZW50LAoJCSJhZG1pbiIsIGFkbWluLlN0cmluZygpLAoJCSJvbGRVUkwiLCBvbGRVUkwsCgkJIm5ld1VSTCIsIG5vcm1hbGl6ZWRVUkwsCgkpCn0KCi8vIEdldEV4cGxvcmVyVVJMIHJldHVybnMgdGhlIGV4cGxvcmVyIGJhc2UgVVJMCmZ1bmMgR2V0RXhwbG9yZXJVUkwoKSBzdHJpbmcgewoJcmV0dXJuIGV4cGxvcmVyVVJMCn0KGqSlAQoOYWRtaW5fdGVzdC5nbm8SkKUBcGFja2FnZSBhZG1pbgoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCi8vID09PT09PT09PT09PT09PT09PT09IEFkbWluIFRlc3RzID09PT09PT09PT09PT09PT09PT09CgpmdW5jIFRlc3RUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0cyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgICAgIHN0cmluZwoJCW9yaWdpbkNhbGxlciBhZGRyZXNzCgkJcmVhbG0gICAgICAgIHJ1bnRpbWUuUmVhbG0KCQluZXdBZG1pbiAgICAgYWRkcmVzcwoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJfXsKCQl7ImFkbWluIHRyYW5zZmVycyIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgdGVzdFVzZXIsIGZhbHNlLCAiIn0sCgkJeyJ1bmF1dGhvcml6ZWQiLCB1bmF1dGhvcml6ZWRVc2VyLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh1bmF1dGhvcml6ZWRVc2VyKSwgdGVzdFVzZXIsIHRydWUsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQifSwKCQl7ImludmFsaWQgYWRkcmVzcyIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgYWRkcmVzcygiIiksIHRydWUsICJpbnZhbGlkIGFkZHJlc3MifSwKCX0KCglmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewoJCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodHQub3JpZ2luQ2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odHQucmVhbG0pCgoJCWlmIHR0LnNob3VsZFBhbmljIHsKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQkJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0dC5uZXdBZG1pbikKCQkJfSkKCQl9IGVsc2UgewoJCQlUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHR0Lm5ld0FkbWluKQoJCQl1YXNzZXJ0LkVxdWFsKHQsIHRlc3RBZG1pbi5TdHJpbmcoKSwgR2V0QWRtaW4oKS5TdHJpbmcoKSkKCQkJdWFzc2VydC5FcXVhbCh0LCB0dC5uZXdBZG1pbi5TdHJpbmcoKSwgR2V0UGVuZGluZ0FkbWluKCkuU3RyaW5nKCkpCgkJCXVhc3NlcnQuVHJ1ZSh0LCBJc0FkbWluKHRlc3RBZG1pbikpCgkJCXVhc3NlcnQuRmFsc2UodCwgSXNBZG1pbih0dC5uZXdBZG1pbikpCgkJfQoJfQp9CgpmdW5jIFRlc3RBY2NlcHRBZG1pbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdHMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgICAgICAgICBzdHJpbmcKCQlzZXR1cCAgICAgICAgZnVuYygpCgkJb3JpZ2luQ2FsbGVyIGFkZHJlc3MKCQlyZWFsbSAgICAgICAgcnVudGltZS5SZWFsbQoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJfXsKCQl7CgkJCW5hbWU6ICJwZW5kaW5nIGFkbWluIGFjY2VwdHMiLAoJCQlzZXR1cDogZnVuYygpIHsKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgdGVzdFVzZXIpCgkJCX0sCgkJCW9yaWdpbkNhbGxlcjogdGVzdFVzZXIsCgkJCXJlYWxtOiAgICAgICAgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdFVzZXIpLAoJCX0sCgkJewoJCQluYW1lOiAidW5hdXRob3JpemVkIHVzZXIgY2Fubm90IGFjY2VwdCIsCgkJCXNldHVwOiBmdW5jKCkgewoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCQkJfSwKCQkJb3JpZ2luQ2FsbGVyOiB1bmF1dGhvcml6ZWRVc2VyLAoJCQlyZWFsbTogICAgICAgIHRlc3RpbmcuTmV3VXNlclJlYWxtKHVuYXV0aG9yaXplZFVzZXIpLAoJCQlzaG91bGRQYW5pYzogIHRydWUsCgkJCXBhbmljTXNnOiAgICAgInBlbmRpbmcgYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogICAgICAgICAibWlzc2luZyBwZW5kaW5nIGFkbWluIiwKCQkJb3JpZ2luQ2FsbGVyOiB0ZXN0QWRtaW4sCgkJCXJlYWxtOiAgICAgICAgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwKCQkJc2hvdWxkUGFuaWM6ICB0cnVlLAoJCQlwYW5pY01zZzogICAgICJpbnZhbGlkIHBlbmRpbmcgYWRtaW4gYWRkcmVzcyIsCgkJfSwKCX0KCglmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewoJCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCgkJaWYgdHQuc2V0dXAgIT0gbmlsIHsKCQkJdHQuc2V0dXAoKQoJCX0KCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodHQub3JpZ2luQ2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odHQucmVhbG0pCgoJCWlmIHR0LnNob3VsZFBhbmljIHsKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQkJQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCQkJfSkKCQkJY29udGludWUKCQl9CgoJCUFjY2VwdEFkbWluKGNyb3NzKGN1cikpCgkJdWFzc2VydC5FcXVhbCh0LCB0dC5vcmlnaW5DYWxsZXIuU3RyaW5nKCksIEdldEFkbWluKCkuU3RyaW5nKCkpCgkJdWFzc2VydC5FcXVhbCh0LCAiIiwgR2V0UGVuZGluZ0FkbWluKCkuU3RyaW5nKCkpCgl9Cn0KCmZ1bmMgVGVzdFRyYW5zZmVyQWRtaW5fUmVqZWN0c1BlbmRpbmdPdmVyd3JpdGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCXVhc3NlcnQuRXF1YWwodCwgdGVzdFVzZXIuU3RyaW5nKCksIEdldFBlbmRpbmdBZG1pbigpLlN0cmluZygpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicGVuZGluZyBhZG1pbiB0cmFuc2ZlciBhbHJlYWR5IGV4aXN0cyIsIGZ1bmMoKSB7CgkJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0VXNlcjIpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCB0ZXN0QWRtaW4uU3RyaW5nKCksIEdldEFkbWluKCkuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIHRlc3RVc2VyLlN0cmluZygpLCBHZXRQZW5kaW5nQWRtaW4oKS5TdHJpbmcoKSkKfQoKZnVuYyBUZXN0VHJhbnNmZXJBZG1pbl9BbGxvd3NPcmlnaW5Pbmx5Rm9yRW1wdHlCb290c3RyYXBBZG1pbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDb21tb25BZG1pblRlc3RzKGN1ciwgdCkKCWFkbWluID0gYWRkcmVzcygiIikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhZGRyZXNzKCIiKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX2Jvb3RzdHJhcF9yZWxheSIpKQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIEdldEFkbWluKCkuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIHRlc3RVc2VyLlN0cmluZygpLCBHZXRQZW5kaW5nQWRtaW4oKS5TdHJpbmcoKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0VXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdFVzZXIpKQoJQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCXVhc3NlcnQuRXF1YWwodCwgdGVzdFVzZXIuU3RyaW5nKCksIEdldEFkbWluKCkuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBHZXRQZW5kaW5nQWRtaW4oKS5TdHJpbmcoKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0VXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5X2FmdGVyX2Jvb3RzdHJhcCIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgdGVzdFVzZXIyKQoJfSkKfQoKZnVuYyBUZXN0QWRtaW5JbnRlcnJlYWxtU2VjdXJpdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICAgICBzdHJpbmcKCQlzZXR1cCAgICAgICBmdW5jKHJlYWxtKSByZWFsbQoJCWNhbGwgICAgICAgIGZ1bmMocmVhbG0sIHJlYWxtKQoJCXNob3VsZFBhbmljIGJvb2wKCQlwYW5pY01zZyAgICBzdHJpbmcKCQl2ZXJpZnkgICAgICBmdW5jKHQgKnRlc3RpbmcuVCkKCX17CgkJewoJCQluYW1lOiAiYWNjZXB0IGFkbWluIHJlamVjdHMgY29kZSByZWFsbSBjYWxsZXIiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgdGVzdFVzZXIpCgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0VXNlcikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWRtaW4vcmVsYXkiKSkKCQkJCXJldHVybiBuaWwKCQkJfSwKCQkJY2FsbDogZnVuYyhjdXIgcmVhbG0sIHN0YWxlIHJlYWxtKSB7CgkJCQlBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJCQl9LAoJCQlwYW5pY01zZzogImNvbnRyYWN0IGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyIiwKCQl9LAoJCXsKCQkJbmFtZTogInRyYW5zZmVyIGFkbWluIHJlamVjdHMgdmFsaWQgYWRtaW4gb3JpZ2luIHRocm91Z2ggY29kZSByZWFsbSIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgcmVhbG0gewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW5fcmVsYXkiKSkKCQkJCXJldHVybiBuaWwKCQkJfSwKCQkJY2FsbDogZnVuYyhjdXIgcmVhbG0sIHN0YWxlIHJlYWxtKSB7CgkJCQlUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoJCQl9LAoJCQlwYW5pY01zZzogImFkbWluIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJ0cmFuc2ZlciBhZG1pbiByZWplY3RzIG5vbi1hZG1pbiBvcmlnaW4gdGhyb3VnaCBjb2RlIHJlYWxtIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSByZWFsbSB7CgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih1bmF1dGhvcml6ZWRVc2VyKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW5fcmVsYXkiKSkKCQkJCXJldHVybiBuaWwKCQkJfSwKCQkJY2FsbDogZnVuYyhjdXIgcmVhbG0sIHN0YWxlIHJlYWxtKSB7CgkJCQlUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoJCQl9LAoJCQlwYW5pY01zZzogImFkbWluIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJjYW5jZWwgYWRtaW4gdHJhbnNmZXIiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgdGVzdFVzZXIpCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbl9yZWxheSIpKQoJCQkJcmV0dXJuIG5pbAoJCQl9LAoJCQljYWxsOiBmdW5jKGN1ciByZWFsbSwgc3RhbGUgcmVhbG0pIHsKCQkJCUNhbmNlbEFkbWluVHJhbnNmZXIoY3Jvc3MoY3VyKSkKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLAoJCX0sCgkJewoJCQluYW1lOiAic2V0IGV4cGxvcmVyIHVybCIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgcmVhbG0gewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW5fcmVsYXkiKSkKCQkJCXJldHVybiBuaWwKCQkJfSwKCQkJY2FsbDogZnVuYyhjdXIgcmVhbG0sIHN0YWxlIHJlYWxtKSB7CgkJCQlTZXRFeHBsb3JlclVSTChjcm9zcyhjdXIpLCAiaHR0cHM6Ly9yZWxheS5ha2thZGlhLmxhbmQiKQoJCQl9LAoJCQlwYW5pY01zZzogImFkbWluIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJzZXQgb3BlcmF0b3IiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdFVzZXIpCgkJCX0sCgkJCXBhbmljTXNnOiAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogInVuc2V0IG9wZXJhdG9yIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSByZWFsbSB7CgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJCQlTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJVW5zZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLAoJCX0sCgkJewoJCQluYW1lOiAic2V0IGZlZSBjb2xsZWN0b3IiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJU2V0RmVlQ29sbGVjdG9yKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoJCQl9LAoJCQlwYW5pY01zZzogImFkbWluIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJzZXQgcHJvdG9jb2wiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJU2V0UHJvdG9jb2woY3Jvc3MoY3VyKSwgdGVzdFByb3RvY29sKQoJCQl9LAoJCQlwYW5pY01zZzogImFkbWluIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJzZXQgZmF1Y2V0IHRhcmdldCBhbW91bnQiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIDEwMDAwMDApCgkJCX0sCgkJCXBhbmljTXNnOiAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogInJlcXVlc3QgZmF1Y2V0IHJlamVjdHMgb3BlcmF0b3Igb3JpZ2luIHRocm91Z2ggY29kZSByZWFsbSIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgcmVhbG0gewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIDEwMDAwMDApCgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbl9vcGVyYXRvcl9mYXVjZXRfcmVsYXkiKSkKCQkJCXJldHVybiBuaWwKCQkJfSwKCQkJY2FsbDogZnVuYyhjdXIgcmVhbG0sIHN0YWxlIHJlYWxtKSB7CgkJCQlSZXF1ZXN0RmF1Y2V0KGNyb3NzKGN1cikpCgkJCX0sCgkJCXBhbmljTXNnOiAiY29udHJhY3QgY2FsbHMgbm90IGFsbG93ZWQ6IGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHVzZXIiLAoJCX0sCgkJewoJCQluYW1lOiAicmVxdWVzdCBmYXVjZXQgZm9yIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSByZWFsbSB7CgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbl9yZWxheSIpKQoJCQkJcmV0dXJuIG5pbAoJCQl9LAoJCQljYWxsOiBmdW5jKGN1ciByZWFsbSwgc3RhbGUgcmVhbG0pIHsKCQkJCVJlcXVlc3RGYXVjZXRGb3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQl9LAoJCQlwYW5pY01zZzogImFkbWluIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJyZXF1ZXN0IGZhdWNldHMiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJUmVxdWVzdEZhdWNldHMoY3Jvc3MoY3VyKSkKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLAoJCX0sCgkJewoJCQluYW1lOiAid2l0aGRyYXciLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3JlbGF5IikpCgkJCQlyZXR1cm4gbmlsCgkJCX0sCgkJCWNhbGw6IGZ1bmMoY3VyIHJlYWxtLCBzdGFsZSByZWFsbSkgewoJCQkJV2l0aGRyYXcoY3Jvc3MoY3VyKSwgdGVzdFVzZXIsIDEpCgkJCX0sCgkJCXBhbmljTXNnOiAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogImFzc2VydCBjdXJyZW50IHJlYWxtIHJlamVjdHMgc3RhbGUgcmVhbG0iLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIHJlYWxtIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluX3N0YWxlX3Byb2JlIikpCgkJCQlyZXR1cm4gY3VyLlByZXZpb3VzKCkKCQkJfSwKCQkJY2FsbDogZnVuYyhjdXIgcmVhbG0sIHN0YWxlIHJlYWxtKSB7CgkJCQlhY2Nlc3Njb250cm9sLkFzc2VydEN1cnJlbnRSZWFsbSgwLCBzdGFsZSkKCQkJfSwKCQkJc2hvdWxkUGFuaWM6IHRydWUsCgkJCXBhbmljTXNnOiAgICAic3Bvb2ZlZCByZWFsbSIsCgkJfSwKCQl7CgkJCW5hbWU6ICJhc3NlcnQgYWRtaW4gcmVqZWN0cyBzdGFsZSByZWFsbSIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgcmVhbG0gewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW5fc3RhbGVfcHJvYmUiKSkKCQkJCXJldHVybiBjdXIuUHJldmlvdXMoKQoJCQl9LAoJCQljYWxsOiBmdW5jKGN1ciByZWFsbSwgc3RhbGUgcmVhbG0pIHsKCQkJCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBzdGFsZSwgSXNBZG1pbikKCQkJfSwKCQkJc2hvdWxkUGFuaWM6IHRydWUsCgkJCXBhbmljTXNnOiAgICAic3Bvb2ZlZCByZWFsbSIsCgkJfSwKCQl7CgkJCW5hbWU6ICJwZW5kaW5nIGFkbWluIGNhbGxlciByZWplY3RzIHN0YWxlIHJlYWxtIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSByZWFsbSB7CgkJCQlwZW5kaW5nQWRtaW4gPSB0ZXN0VXNlcgoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW5fc3RhbGVfcHJvYmUiKSkKCQkJCXJldHVybiBjdXIuUHJldmlvdXMoKQoJCQl9LAoJCQljYWxsOiBmdW5jKGN1ciByZWFsbSwgc3RhbGUgcmVhbG0pIHsKCQkJCW11c3RHZXRQZW5kaW5nQWRtaW5Vc2VyQ2FsbGVyKDAsIHN0YWxlKQoJCQl9LAoJCQlzaG91bGRQYW5pYzogdHJ1ZSwKCQkJcGFuaWNNc2c6ICAgICJzcG9vZmVkIHJlYWxtIiwKCQl9LAoJfQoKCWZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CgkJc2V0dXBDb21tb25BZG1pblRlc3RzKGN1ciwgdCkKCQlzdGFsZSA6PSB0dC5zZXR1cChjdXIpCgkJY2FsbCA6PSBmdW5jKCkgewoJCQl0dC5jYWxsKGN1ciwgc3RhbGUpCgkJfQoJCWlmIHR0LnNob3VsZFBhbmljIHsKCQkJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBjYWxsKQoJCQljb250aW51ZQoJCX0KCQlpZiB0dC5wYW5pY01zZyAhPSAiIiB7CgkJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0dC5wYW5pY01zZywgY2FsbCkKCQkJY29udGludWUKCQl9CgkJY2FsbCgpCgkJaWYgdHQudmVyaWZ5ICE9IG5pbCB7CgkJCXR0LnZlcmlmeSh0KQoJCX0KCX0KfQoKZnVuYyBUZXN0Q2FuY2VsQWRtaW5UcmFuc2ZlcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdHMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgICAgICAgICBzdHJpbmcKCQlzZXR1cCAgICAgICAgZnVuYygpCgkJb3JpZ2luQ2FsbGVyIGFkZHJlc3MKCQlyZWFsbSAgICAgICAgcnVudGltZS5SZWFsbQoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJfXsKCQl7CgkJCW5hbWU6ICJhZG1pbiBjYW5jZWxzIHBlbmRpbmcgdHJhbnNmZXIiLAoJCQlzZXR1cDogZnVuYygpIHsKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgdGVzdFVzZXIpCgkJCX0sCgkJCW9yaWdpbkNhbGxlcjogdGVzdEFkbWluLAoJCQlyZWFsbTogICAgICAgIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbiksCgkJfSwKCQl7CgkJCW5hbWU6ICJ1bmF1dGhvcml6ZWQgdXNlciBjYW5ub3QgY2FuY2VsIiwKCQkJc2V0dXA6IGZ1bmMoKSB7CgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJCQlUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoJCQl9LAoJCQlvcmlnaW5DYWxsZXI6IHVuYXV0aG9yaXplZFVzZXIsCgkJCXJlYWxtOiAgICAgICAgdGVzdGluZy5OZXdVc2VyUmVhbG0odW5hdXRob3JpemVkVXNlciksCgkJCXNob3VsZFBhbmljOiAgdHJ1ZSwKCQkJcGFuaWNNc2c6ICAgICAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogICAgICAgICAibWlzc2luZyBwZW5kaW5nIGFkbWluIiwKCQkJb3JpZ2luQ2FsbGVyOiB0ZXN0QWRtaW4sCgkJCXJlYWxtOiAgICAgICAgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwKCQkJc2hvdWxkUGFuaWM6ICB0cnVlLAoJCQlwYW5pY01zZzogICAgICJpbnZhbGlkIHBlbmRpbmcgYWRtaW4gYWRkcmVzcyIsCgkJfSwKCX0KCglmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewoJCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCgkJaWYgdHQuc2V0dXAgIT0gbmlsIHsKCQkJdHQuc2V0dXAoKQoJCX0KCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodHQub3JpZ2luQ2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odHQucmVhbG0pCgoJCWlmIHR0LnNob3VsZFBhbmljIHsKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQkJQ2FuY2VsQWRtaW5UcmFuc2Zlcihjcm9zcyhjdXIpKQoJCQl9KQoJCQljb250aW51ZQoJCX0KCgkJQ2FuY2VsQWRtaW5UcmFuc2Zlcihjcm9zcyhjdXIpKQoJCXVhc3NlcnQuRXF1YWwodCwgdGVzdEFkbWluLlN0cmluZygpLCBHZXRBZG1pbigpLlN0cmluZygpKQoJCXVhc3NlcnQuRXF1YWwodCwgIiIsIEdldFBlbmRpbmdBZG1pbigpLlN0cmluZygpKQoJfQp9CgpmdW5jIFRlc3RDYW5jZWxBZG1pblRyYW5zZmVyX1ByZXNlcnZlc0FkbWluKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgdGVzdFVzZXIpCgoJQ2FuY2VsQWRtaW5UcmFuc2Zlcihjcm9zcyhjdXIpKQoJdWFzc2VydC5FcXVhbCh0LCB0ZXN0QWRtaW4uU3RyaW5nKCksIEdldEFkbWluKCkuU3RyaW5nKCkpCgl1YXNzZXJ0LlRydWUodCwgSXNBZG1pbih0ZXN0QWRtaW4pKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgR2V0UGVuZGluZ0FkbWluKCkuU3RyaW5nKCkpCn0KCi8vID09PT09PT09PT09PT09PT09PT09IEV4cGxvcmVyVVJMIFRlc3RzID09PT09PT09PT09PT09PT09PT09CgpmdW5jIFRlc3RTZXRFeHBsb3JlclVSTChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdHMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgICAgICAgICBzdHJpbmcKCQlvcmlnaW5DYWxsZXIgYWRkcmVzcwoJCXJlYWxtICAgICAgICBydW50aW1lLlJlYWxtCgkJdXJsICAgICAgICAgIHN0cmluZwoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJCWV4cGVjdGVkVVJMICBzdHJpbmcKCX17CgkJeyJhZG1pbiBzZXRzIHVybCIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgImh0dHBzOi8vbmV3LmV4cGxvcmVyLmNvbSIsIGZhbHNlLCAiIiwgImh0dHBzOi8vbmV3LmV4cGxvcmVyLmNvbSJ9LAoJCXsidHJhaWxpbmcgc2xhc2ggbm9ybWFsaXplZCIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgImh0dHBzOi8vbmV3LmV4cGxvcmVyLmNvbS8vLyIsIGZhbHNlLCAiIiwgImh0dHBzOi8vbmV3LmV4cGxvcmVyLmNvbSJ9LAoJCXsiYWRtaW4gc2V0cyBlbXB0eSB1cmwiLCB0ZXN0QWRtaW4sIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbiksICIiLCB0cnVlLCAiZXhwbG9yZXIgVVJMIGlzIHJlcXVpcmVkIiwgIiJ9LAoJCXsicmVqZWN0cyBodHRwIiwgdGVzdEFkbWluLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pLCAiaHR0cDovL25ldy5leHBsb3Jlci5jb20iLCB0cnVlLCAiZXhwbG9yZXIgVVJMIG11c3QgdXNlIGh0dHBzIiwgIiJ9LAoJCXsicmVqZWN0cyB3aGl0ZXNwYWNlIiwgdGVzdEFkbWluLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pLCAiIGh0dHBzOi8vbmV3LmV4cGxvcmVyLmNvbSIsIHRydWUsICJpbnZhbGlkIGV4cGxvcmVyIFVSTCIsICIifSwKCQl7InJlamVjdHMgYnJhY2tldHMiLCB0ZXN0QWRtaW4sIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbiksICJodHRwczovL25ldy5leHBsb3Jlci5jb20vW3Rlc3RdIiwgdHJ1ZSwgImludmFsaWQgZXhwbG9yZXIgVVJMIiwgIiJ9LAoJCXsidW5hdXRob3JpemVkIiwgdW5hdXRob3JpemVkVXNlciwgdGVzdGluZy5OZXdVc2VyUmVhbG0odW5hdXRob3JpemVkVXNlciksICJodHRwczovL2hhY2tlci5jb20iLCB0cnVlLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgIiJ9LAoJfQoKCWZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CgkJc2V0dXBDb21tb25BZG1pblRlc3RzKGN1ciwgdCkKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0dC5vcmlnaW5DYWxsZXIpCgkJdGVzdGluZy5TZXRSZWFsbSh0dC5yZWFsbSkKCgkJaWYgdHQuc2hvdWxkUGFuaWMgewoJCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgdHQucGFuaWNNc2csIGZ1bmMoKSB7CgkJCQlTZXRFeHBsb3JlclVSTChjcm9zcyhjdXIpLCB0dC51cmwpCgkJCX0pCgkJCXVhc3NlcnQuRXF1YWwodCwgImh0dHBzOi8vYXBwLmJldGEuYWtrYWRpYS5sYW5kIiwgR2V0RXhwbG9yZXJVUkwoKSkKCQl9IGVsc2UgewoJCQlTZXRFeHBsb3JlclVSTChjcm9zcyhjdXIpLCB0dC51cmwpCgkJCXVhc3NlcnQuRXF1YWwodCwgdHQuZXhwZWN0ZWRVUkwsIEdldEV4cGxvcmVyVVJMKCkpCgkJfQoJfQp9CgovLyA9PT09PT09PT09PT09PT09PT09PSBPcGVyYXRvciBUZXN0cyA9PT09PT09PT09PT09PT09PT09PQoKZnVuYyBUZXN0U2V0T3BlcmF0b3IoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICAgICAgc3RyaW5nCgkJb3JpZ2luQ2FsbGVyIGFkZHJlc3MKCQlyZWFsbSAgICAgICAgcnVudGltZS5SZWFsbQoJCW5ld0FkZHIgICAgICBhZGRyZXNzCgkJc2hvdWxkUGFuaWMgIGJvb2wKCQlwYW5pY01zZyAgICAgc3RyaW5nCgl9ewoJCXsiYWRtaW4gc2V0cyBvcGVyYXRvciIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgdGVzdFVzZXIsIGZhbHNlLCAiIn0sCgkJeyJ1bmF1dGhvcml6ZWQiLCB1bmF1dGhvcml6ZWRVc2VyLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh1bmF1dGhvcml6ZWRVc2VyKSwgdGVzdFVzZXIsIHRydWUsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQifSwKCQl7ImludmFsaWQgYWRkcmVzcyIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgYWRkcmVzcygiIiksIHRydWUsICJpbnZhbGlkIGFkZHJlc3MifSwKCX0KCglmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewoJCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodHQub3JpZ2luQ2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odHQucmVhbG0pCgoJCWlmIHR0LnNob3VsZFBhbmljIHsKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdHQubmV3QWRkcikKCQkJfSkKCQl9IGVsc2UgewoJCQlTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0dC5uZXdBZGRyKQoJCQl1YXNzZXJ0LlRydWUodCwgSXNPcGVyYXRvcih0dC5uZXdBZGRyKSkKCQkJdWFzc2VydC5UcnVlKHQsIElzT3BlcmF0b3IodGVzdEFkbWluKSkKCQl9Cgl9Cn0KCmZ1bmMgVGVzdEdldE9wZXJhdG9ycyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDb21tb25BZG1pblRlc3RzKGN1ciwgdCkKCglvcGVyYXRvcnMgOj0gR2V0T3BlcmF0b3JzKCkKCXVhc3NlcnQuRXF1YWwodCwgbGVuKG9wZXJhdG9ycyksIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIG9wZXJhdG9yc1swXS5TdHJpbmcoKSwgdGVzdEFkbWluLlN0cmluZygpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoKCW9wZXJhdG9ycyA9IEdldE9wZXJhdG9ycygpCgl1YXNzZXJ0LkVxdWFsKHQsIGxlbihvcGVyYXRvcnMpLCAyKQoKCW9wZXJhdG9yc1swXSA9IHVuYXV0aG9yaXplZFVzZXIKCW9wZXJhdG9yc0FnYWluIDo9IEdldE9wZXJhdG9ycygpCgl1YXNzZXJ0LkVxdWFsKHQsIGxlbihvcGVyYXRvcnNBZ2FpbiksIDIpCgl1YXNzZXJ0LkZhbHNlKHQsIGNvbnRhaW5zT3BlcmF0b3Iob3BlcmF0b3JzQWdhaW4sIHVuYXV0aG9yaXplZFVzZXIpKQp9CgpmdW5jIFRlc3RVbnNldE9wZXJhdG9yKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0cyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgICAgIHN0cmluZwoJCW9yaWdpbkNhbGxlciBhZGRyZXNzCgkJcmVhbG0gICAgICAgIHJ1bnRpbWUuUmVhbG0KCQlhZGRyICAgICAgICAgYWRkcmVzcwoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJfXsKCQl7ImFkbWluIHVuc2V0cyBvcGVyYXRvciIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgdGVzdFVzZXIsIGZhbHNlLCAiIn0sCgkJeyJ1bmF1dGhvcml6ZWQiLCB1bmF1dGhvcml6ZWRVc2VyLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh1bmF1dGhvcml6ZWRVc2VyKSwgdGVzdFVzZXIsIHRydWUsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQifSwKCQl7ImludmFsaWQgYWRkcmVzcyIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgYWRkcmVzcygiIiksIHRydWUsICJpbnZhbGlkIGFkZHJlc3MifSwKCQl7Im5vdCBhbiBvcGVyYXRvciIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgdW5hdXRob3JpemVkVXNlciwgdHJ1ZSwgImFkZHJlc3MgaXMgbm90IGFuIG9wZXJhdG9yIn0sCgl9CgoJZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKCQlzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoJCS8vIEFkZCB0ZXN0VXNlciBhcyBvcGVyYXRvciBmb3IgdW5zZXQgdGVzdHMKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0dC5vcmlnaW5DYWxsZXIpCgkJdGVzdGluZy5TZXRSZWFsbSh0dC5yZWFsbSkKCgkJaWYgdHQuc2hvdWxkUGFuaWMgewoJCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgdHQucGFuaWNNc2csIGZ1bmMoKSB7CgkJCQlVbnNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHR0LmFkZHIpCgkJCX0pCgkJfSBlbHNlIHsKCQkJVW5zZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0dC5hZGRyKQoJCQl1YXNzZXJ0LkZhbHNlKHQsIElzT3BlcmF0b3IodHQuYWRkcikpCgkJCXVhc3NlcnQuVHJ1ZSh0LCBJc09wZXJhdG9yKHRlc3RBZG1pbikpCgkJfQoJfQp9CgovLyA9PT09PT09PT09PT09PT09PT09PSBGZWVDb2xsZWN0b3IgVGVzdHMgPT09PT09PT09PT09PT09PT09PT0KCmZ1bmMgVGVzdFNldEZlZUNvbGxlY3RvcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdHMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgICAgICAgICBzdHJpbmcKCQlvcmlnaW5DYWxsZXIgYWRkcmVzcwoJCXJlYWxtICAgICAgICBydW50aW1lLlJlYWxtCgkJbmV3QWRkciAgICAgIGFkZHJlc3MKCQlzaG91bGRQYW5pYyAgYm9vbAoJCXBhbmljTXNnICAgICBzdHJpbmcKCX17CgkJeyJhZG1pbiBzZXRzIGZlZUNvbGxlY3RvciIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgdGVzdFVzZXIsIGZhbHNlLCAiIn0sCgkJeyJ1bmF1dGhvcml6ZWQiLCB1bmF1dGhvcml6ZWRVc2VyLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh1bmF1dGhvcml6ZWRVc2VyKSwgdGVzdFVzZXIsIHRydWUsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQifSwKCQl7ImludmFsaWQgYWRkcmVzcyIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgYWRkcmVzcygiIiksIHRydWUsICJpbnZhbGlkIGFkZHJlc3MifSwKCX0KCglmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewoJCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodHQub3JpZ2luQ2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odHQucmVhbG0pCgoJCWlmIHR0LnNob3VsZFBhbmljIHsKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQkJU2V0RmVlQ29sbGVjdG9yKGNyb3NzKGN1ciksIHR0Lm5ld0FkZHIpCgkJCX0pCgkJCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5SZWFsbUFkZHIoKS5TdHJpbmcoKSwgR2V0RmVlQ29sbGVjdG9yKCkuU3RyaW5nKCkpCgkJfSBlbHNlIHsKCQkJU2V0RmVlQ29sbGVjdG9yKGNyb3NzKGN1ciksIHR0Lm5ld0FkZHIpCgkJCXVhc3NlcnQuRXF1YWwodCwgdHQubmV3QWRkci5TdHJpbmcoKSwgR2V0RmVlQ29sbGVjdG9yKCkuU3RyaW5nKCkpCgkJCXVhc3NlcnQuVHJ1ZSh0LCBJc0ZlZUNvbGxlY3Rvcih0dC5uZXdBZGRyKSkKCQkJdWFzc2VydC5GYWxzZSh0LCBJc0ZlZUNvbGxlY3Rvcih0ZXN0QWRtaW4pKQoJCX0KCX0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT0gUHJvdG9jb2wgVGVzdHMgPT09PT09PT09PT09PT09PT09PT0KCmZ1bmMgVGVzdFNldFByb3RvY29sKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0cyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgICAgIHN0cmluZwoJCW9yaWdpbkNhbGxlciBhZGRyZXNzCgkJcmVhbG0gICAgICAgIHJ1bnRpbWUuUmVhbG0KCQluZXdBZGRyICAgICAgYWRkcmVzcwoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJfXsKCQl7ImFkbWluIHNldHMgcHJvdG9jb2wiLCB0ZXN0QWRtaW4sIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbiksIHRlc3RVc2VyLCBmYWxzZSwgIiJ9LAoJCXsidW5hdXRob3JpemVkIiwgdW5hdXRob3JpemVkVXNlciwgdGVzdGluZy5OZXdVc2VyUmVhbG0odW5hdXRob3JpemVkVXNlciksIHRlc3RVc2VyLCB0cnVlLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIn0sCgkJeyJpbnZhbGlkIGFkZHJlc3MiLCB0ZXN0QWRtaW4sIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbiksIGFkZHJlc3MoIiIpLCB0cnVlLCAiaW52YWxpZCBhZGRyZXNzIn0sCgl9CgoJZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKCQlzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHR0Lm9yaWdpbkNhbGxlcikKCQl0ZXN0aW5nLlNldFJlYWxtKHR0LnJlYWxtKQoKCQlpZiB0dC5zaG91bGRQYW5pYyB7CgkJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0dC5wYW5pY01zZywgZnVuYygpIHsKCQkJCVNldFByb3RvY29sKGNyb3NzKGN1ciksIHR0Lm5ld0FkZHIpCgkJCX0pCgkJCXVhc3NlcnQuRXF1YWwodCwgdGVzdEFkbWluLlN0cmluZygpLCBHZXRQcm90b2NvbCgpLlN0cmluZygpKQoJCX0gZWxzZSB7CgkJCVNldFByb3RvY29sKGNyb3NzKGN1ciksIHR0Lm5ld0FkZHIpCgkJCXVhc3NlcnQuRXF1YWwodCwgdHQubmV3QWRkci5TdHJpbmcoKSwgR2V0UHJvdG9jb2woKS5TdHJpbmcoKSkKCQkJdWFzc2VydC5UcnVlKHQsIElzUHJvdG9jb2wodHQubmV3QWRkcikpCgkJCXVhc3NlcnQuRmFsc2UodCwgSXNQcm90b2NvbCh0ZXN0QWRtaW4pKQoJCX0KCX0KfQoKZnVuYyBUZXN0UmVuZGVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RVc2VyKQoJU2V0RmVlQ29sbGVjdG9yKGNyb3NzKGN1ciksIHRlc3RVc2VyMikKCVNldFByb3RvY29sKGNyb3NzKGN1ciksIHVuYXV0aG9yaXplZFVzZXIpCglTZXRGYXVjZXRUYXJnZXRBbW91bnQoY3Jvc3MoY3VyKSwgMTAwMDAwMCkKCglvdXRwdXQgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0cHV0LCB0ZXN0QWRtaW4uU3RyaW5nKCkpLCAicmVuZGVyIHNob3VsZCBpbmNsdWRlIGFkbWluIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dHB1dCwgdGVzdFVzZXIuU3RyaW5nKCkpLCAicmVuZGVyIHNob3VsZCBpbmNsdWRlIG9wZXJhdG9yIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dHB1dCwgdGVzdFVzZXIyLlN0cmluZygpKSwgInJlbmRlciBzaG91bGQgaW5jbHVkZSBmZWUgY29sbGVjdG9yIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dHB1dCwgdW5hdXRob3JpemVkVXNlci5TdHJpbmcoKSksICJyZW5kZXIgc2hvdWxkIGluY2x1ZGUgcHJvdG9jb2wiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0cHV0LCAiMTAwMDAwMCB1Z25vdCIpLCAicmVuZGVyIHNob3VsZCBpbmNsdWRlIGZhdWNldCB0YXJnZXQiKQp9Chq8BQoRZmVlX2NvbGxlY3Rvci5nbm8SpgVwYWNrYWdlIGFkbWluCgppbXBvcnQgKAoJImNoYWluIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgopCgpjb25zdCAoCglTZXRGZWVDb2xsZWN0b3JFdmVudCA9ICJTZXRGZWVDb2xsZWN0b3IiCikKCnZhciAoCglmZWVDb2xsZWN0b3JBZGRyIGFkZHJlc3MKKQoKZnVuYyBpbml0KCkgewoJZmVlQ29sbGVjdG9yQWRkciA9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIpCn0KCmZ1bmMgR2V0RmVlQ29sbGVjdG9yKCkgYWRkcmVzcyB7CglyZXR1cm4gZmVlQ29sbGVjdG9yQWRkcgp9CgpmdW5jIFNldEZlZUNvbGxlY3RvcihjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcykgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgSXNBZG1pbikKCglhc3NlcnRWYWxpZEFkZHJlc3MoYWRkcikKCW9sZEFkZHIgOj0gZmVlQ29sbGVjdG9yQWRkcgoJZmVlQ29sbGVjdG9yQWRkciA9IGFkZHIKCgljaGFpbi5FbWl0KAoJCVNldEZlZUNvbGxlY3RvckV2ZW50LAoJCSJvbGRBZGRyIiwgb2xkQWRkci5TdHJpbmcoKSwKCQkibmV3QWRkciIsIGFkZHIuU3RyaW5nKCksCgkpCn0KCmZ1bmMgSXNGZWVDb2xsZWN0b3IoYWRkcmVzcyBhZGRyZXNzKSBib29sIHsKCXJldHVybiBhZGRyZXNzID09IGZlZUNvbGxlY3RvckFkZHIKfQoaRAoLZ25vbW9kLnRvbWwSNW1vZHVsZSA9ICJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKZ25vID0gIjAuOSIKGrMICgxvcGVyYXRvci5nbm8SoghwYWNrYWdlIGFkbWluCgppbXBvcnQgKAoJImNoYWluIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgopCgpjb25zdCAoCglTZXRPcGVyYXRvckV2ZW50ICAgPSAiU2V0T3BlcmF0b3IiCglVbnNldE9wZXJhdG9yRXZlbnQgPSAiVW5zZXRPcGVyYXRvciIKKQoKdmFyICgKCW9wZXJhdG9yQWRkcnMgKmJwdHJlZS5CUFRyZWUgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQopCgpmdW5jIFNldE9wZXJhdG9yKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBJc0FkbWluKQoKCWFzc2VydFZhbGlkQWRkcmVzcyhhZGRyKQoJb3BlcmF0b3JBZGRycy5TZXQoYWRkci5TdHJpbmcoKSwgdHJ1ZSkKCgljaGFpbi5FbWl0KAoJCVNldE9wZXJhdG9yRXZlbnQsCgkJImFkZHJlc3MiLCBhZGRyLlN0cmluZygpLAoJKQp9CgpmdW5jIEdldE9wZXJhdG9ycygpIFtdYWRkcmVzcyB7CglyZXN1bHQgOj0gW11hZGRyZXNze30KCW9wZXJhdG9yQWRkcnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoYWRkciBzdHJpbmcsIF8gYW55KSBib29sIHsKCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBhZGRyZXNzKGFkZHIpKQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiByZXN1bHQKfQoKZnVuYyBVbnNldE9wZXJhdG9yKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBJc0FkbWluKQoJYXNzZXJ0VmFsaWRBZGRyZXNzKGFkZHIpCglpZiAhb3BlcmF0b3JBZGRycy5IYXMoYWRkci5TdHJpbmcoKSkgewoJCXBhbmljKCJhZGRyZXNzIGlzIG5vdCBhbiBvcGVyYXRvciIpCgl9CglvcGVyYXRvckFkZHJzLlJlbW92ZShhZGRyLlN0cmluZygpKQoJY2hhaW4uRW1pdCgKCQlVbnNldE9wZXJhdG9yRXZlbnQsCgkJImFkZHJlc3MiLCBhZGRyLlN0cmluZygpLAoJKQp9CgpmdW5jIElzT3BlcmF0b3IoYWRkciBhZGRyZXNzKSBib29sIHsKCXJldHVybiBvcGVyYXRvckFkZHJzLkhhcyhhZGRyLlN0cmluZygpKQp9ChqjIQoTb3BlcmF0b3JfZmF1Y2V0LmdubxKLIXBhY2thZ2UgYWRtaW4KCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgopCgpjb25zdCAoCglTZXRGYXVjZXRUYXJnZXRBbW91bnRFdmVudCA9ICJTZXRGYXVjZXRUYXJnZXRBbW91bnQiCglSZXF1ZXN0RmF1Y2V0RXZlbnQgICAgICAgICA9ICJSZXF1ZXN0RmF1Y2V0IgoJUmVxdWVzdEZhdWNldHNFdmVudCAgICAgICAgPSAiUmVxdWVzdEZhdWNldHMiCglXaXRoZHJhd0V2ZW50ICAgICAgICAgICAgICA9ICJXaXRoZHJhdyIKKQoKdmFyICgKCWZhdWNldFRhcmdldEFtb3VudCBpbnQ2NAopCgpmdW5jIFNldEZhdWNldFRhcmdldEFtb3VudChjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgSXNBZG1pbikKCWFzc2VydFBvc2l0aXZlRmF1Y2V0VGFyZ2V0KGFtb3VudCkKCglvbGRBbW91bnQgOj0gZmF1Y2V0VGFyZ2V0QW1vdW50CglmYXVjZXRUYXJnZXRBbW91bnQgPSBhbW91bnQKCgljaGFpbi5FbWl0KAoJCVNldEZhdWNldFRhcmdldEFtb3VudEV2ZW50LAoJCSJvbGRBbW91bnQiLCBpbnQ2NFRvU3RyaW5nKG9sZEFtb3VudCksCgkJIm5ld0Ftb3VudCIsIGludDY0VG9TdHJpbmcoYW1vdW50KSwKCSkKfQoKZnVuYyBHZXRGYXVjZXRUYXJnZXRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZmF1Y2V0VGFyZ2V0QW1vdW50Cn0KCmZ1bmMgUmVxdWVzdEZhdWNldChjdXIgcmVhbG0pIGludDY0IHsKCWNhbGxlciA6PSBtdXN0R2V0RmF1Y2V0Q2FsbGVyKDAsIGN1cikKCWFzc2VydFBvc2l0aXZlRmF1Y2V0VGFyZ2V0KGZhdWNldFRhcmdldEFtb3VudCkKCglyZXR1cm4gc2VuZEZhdWNldERlZmljaXQoY3VyLCBjYWxsZXIsIHRydWUpCn0KCmZ1bmMgUmVxdWVzdEZhdWNldEZvcihjdXIgcmVhbG0sIG9wZXJhdG9yIGFkZHJlc3MpIGludDY0IHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIElzQWRtaW4pCglhc3NlcnRQb3NpdGl2ZUZhdWNldFRhcmdldChmYXVjZXRUYXJnZXRBbW91bnQpCglhc3NlcnRGYXVjZXRPcGVyYXRvcihvcGVyYXRvcikKCglyZXR1cm4gc2VuZEZhdWNldERlZmljaXQoY3VyLCBvcGVyYXRvciwgdHJ1ZSkKfQoKZnVuYyBSZXF1ZXN0RmF1Y2V0cyhjdXIgcmVhbG0pIGludDY0IHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIElzQWRtaW4pCglhc3NlcnRQb3NpdGl2ZUZhdWNldFRhcmdldChmYXVjZXRUYXJnZXRBbW91bnQpCgoJYm5rIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikKCW9wZXJhdG9ycyA6PSBHZXRPcGVyYXRvcnMoKQoJZGVmaWNpdE9wZXJhdG9ycyA6PSBbXWFkZHJlc3N7fQoJZGVmaWNpdHMgOj0gW11pbnQ2NHt9Cgl0b3RhbEFtb3VudCA6PSBpbnQ2NCgwKQoKCWZvciBfLCBvcGVyYXRvciA6PSByYW5nZSBvcGVyYXRvcnMgewoJCWRlZmljaXQgOj0gZ2V0RmF1Y2V0RGVmaWNpdChibmssIG9wZXJhdG9yKQoJCWlmIGRlZmljaXQgPD0gMCB7CgkJCWNvbnRpbnVlCgkJfQoKCQlkZWZpY2l0T3BlcmF0b3JzID0gYXBwZW5kKGRlZmljaXRPcGVyYXRvcnMsIG9wZXJhdG9yKQoJCWRlZmljaXRzID0gYXBwZW5kKGRlZmljaXRzLCBkZWZpY2l0KQoJCXRvdGFsQW1vdW50ICs9IGRlZmljaXQKCX0KCglpZiB0b3RhbEFtb3VudCA9PSAwIHsKCQlyZXR1cm4gMAoJfQoKCWFzc2VydEFkbWluUmVhbG1CYWxhbmNlKGJuaywgY3VyLkFkZHJlc3MoKSwgdG90YWxBbW91bnQpCglmb3IgaSwgb3BlcmF0b3IgOj0gcmFuZ2UgZGVmaWNpdE9wZXJhdG9ycyB7CgkJc2VuZEFkbWluUmVhbG1VZ25vdChibmssIGN1ci5BZGRyZXNzKCksIG9wZXJhdG9yLCBkZWZpY2l0c1tpXSkKCQllbWl0UmVxdWVzdEZhdWNldChvcGVyYXRvciwgZGVmaWNpdHNbaV0pCgl9CgoJY2hhaW4uRW1pdCgKCQlSZXF1ZXN0RmF1Y2V0c0V2ZW50LAoJCSJhbW91bnQiLCBpbnQ2NFRvU3RyaW5nKHRvdGFsQW1vdW50KSwKCQkidGFyZ2V0QW1vdW50IiwgaW50NjRUb1N0cmluZyhmYXVjZXRUYXJnZXRBbW91bnQpLAoJKQoKCXJldHVybiB0b3RhbEFtb3VudAp9CgpmdW5jIFdpdGhkcmF3KGN1ciByZWFsbSwgcmVjaXBpZW50IGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgaW50NjQgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgSXNBZG1pbikKCWFzc2VydFZhbGlkQWRkcmVzcyhyZWNpcGllbnQpCglhc3NlcnRQb3NpdGl2ZVVnbm90QW1vdW50KGFtb3VudCkKCglibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJcmVhbG1BZGRyIDo9IGN1ci5BZGRyZXNzKCkKCWFzc2VydEFkbWluUmVhbG1CYWxhbmNlKGJuaywgcmVhbG1BZGRyLCBhbW91bnQpCglzZW5kQWRtaW5SZWFsbVVnbm90KGJuaywgcmVhbG1BZGRyLCByZWNpcGllbnQsIGFtb3VudCkKCgljaGFpbi5FbWl0KAoJCVdpdGhkcmF3RXZlbnQsCgkJInJlY2lwaWVudCIsIHJlY2lwaWVudC5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaW50NjRUb1N0cmluZyhhbW91bnQpLAoJKQoKCXJldHVybiBhbW91bnQKfQoKZnVuYyBzZW5kRmF1Y2V0RGVmaWNpdChjdXIgcmVhbG0sIG9wZXJhdG9yIGFkZHJlc3MsIHBhbmljSWZGdW5kZWQgYm9vbCkgaW50NjQgewoJYm5rIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikKCWFtb3VudCA6PSBnZXRGYXVjZXREZWZpY2l0KGJuaywgb3BlcmF0b3IpCglpZiBhbW91bnQgPD0gMCB7CgkJaWYgcGFuaWNJZkZ1bmRlZCB7CgkJCXBhbmljKCJvcGVyYXRvciBiYWxhbmNlIGlzIG5vdCBiZWxvdyBmYXVjZXQgdGFyZ2V0IikKCQl9CgkJcmV0dXJuIDAKCX0KCglyZWFsbUFkZHIgOj0gY3VyLkFkZHJlc3MoKQoJYXNzZXJ0QWRtaW5SZWFsbUJhbGFuY2UoYm5rLCByZWFsbUFkZHIsIGFtb3VudCkKCXNlbmRBZG1pblJlYWxtVWdub3QoYm5rLCByZWFsbUFkZHIsIG9wZXJhdG9yLCBhbW91bnQpCgllbWl0UmVxdWVzdEZhdWNldChvcGVyYXRvciwgYW1vdW50KQoKCXJldHVybiBhbW91bnQKfQoKZnVuYyBnZXRGYXVjZXREZWZpY2l0KGJuayBiYW5rZXIuQmFua2VyLCBvcGVyYXRvciBhZGRyZXNzKSBpbnQ2NCB7CglvcGVyYXRvckJhbGFuY2UgOj0gYm5rLkdldENvaW5zKG9wZXJhdG9yKS5BbW91bnRPZigidWdub3QiKQoJaWYgb3BlcmF0b3JCYWxhbmNlID49IGZhdWNldFRhcmdldEFtb3VudCB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gZmF1Y2V0VGFyZ2V0QW1vdW50IC0gb3BlcmF0b3JCYWxhbmNlCn0KCmZ1bmMgYXNzZXJ0QWRtaW5SZWFsbUJhbGFuY2UoYm5rIGJhbmtlci5CYW5rZXIsIHJlYWxtQWRkciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCXJlYWxtQmFsYW5jZSA6PSBibmsuR2V0Q29pbnMocmVhbG1BZGRyKS5BbW91bnRPZigidWdub3QiKQoJaWYgcmVhbG1CYWxhbmNlIDwgYW1vdW50IHsKCQlwYW5pYygiYWRtaW4gcmVhbG0gYmFsYW5jZSBpcyBpbnN1ZmZpY2llbnQiKQoJfQp9CgpmdW5jIHNlbmRBZG1pblJlYWxtVWdub3QoYm5rIGJhbmtlci5CYW5rZXIsIHJlYWxtQWRkciBhZGRyZXNzLCByZWNpcGllbnQgYWRkcmVzcywgYW1vdW50IGludDY0KSB7Cgljb2lucyA6PSBjaGFpbi5Db2luc3tjaGFpbi5Db2lueyJ1Z25vdCIsIGFtb3VudH19CglibmsuU2VuZENvaW5zKHJlYWxtQWRkciwgcmVjaXBpZW50LCBjb2lucykKfQoKZnVuYyBlbWl0UmVxdWVzdEZhdWNldChvcGVyYXRvciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWNoYWluLkVtaXQoCgkJUmVxdWVzdEZhdWNldEV2ZW50LAoJCSJvcGVyYXRvciIsIG9wZXJhdG9yLlN0cmluZygpLAoJCSJhbW91bnQiLCBpbnQ2NFRvU3RyaW5nKGFtb3VudCksCgkJInRhcmdldEFtb3VudCIsIGludDY0VG9TdHJpbmcoZmF1Y2V0VGFyZ2V0QW1vdW50KSwKCSkKfQoKZnVuYyBtdXN0R2V0RmF1Y2V0Q2FsbGVyKF8gaW50LCBybG0gcmVhbG0pIGFkZHJlc3MgewoJY2FsbGVyIDo9IGFjY2Vzc2NvbnRyb2wuTXVzdEdldFVzZXJDYWxsZXIoMCwgcmxtKQoJYXNzZXJ0RmF1Y2V0T3BlcmF0b3IoY2FsbGVyKQoJcmV0dXJuIGNhbGxlcgp9CgpmdW5jIGFzc2VydEZhdWNldE9wZXJhdG9yKG9wZXJhdG9yIGFkZHJlc3MpIHsKCWFzc2VydFZhbGlkQWRkcmVzcyhvcGVyYXRvcikKCWlmICFJc09wZXJhdG9yKG9wZXJhdG9yKSB7CgkJcGFuaWMoIm9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIpCgl9Cn0KGuqCAQoYb3BlcmF0b3JfZmF1Y2V0X3Rlc3QuZ25vEsyCAXBhY2thZ2UgYWRtaW4KCmltcG9ydCAoCgkidGVzdGluZyIKCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImNoYWluL3J1bnRpbWUiCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKY29uc3QgKAoJdGVzdEZhdWNldEZ1bmRBbW91bnQgaW50NjQgPSAxMDAwMDAwCikKCnR5cGUgZmF1Y2V0VGVzdEhlbHBlciBzdHJ1Y3R7fQoKdmFyIGZhdWNldFRlc3QgPSAmZmF1Y2V0VGVzdEhlbHBlcnt9CgpmdW5jIFRlc3RTZXRGYXVjZXRUYXJnZXRBbW91bnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICAgICAgc3RyaW5nCgkJb3JpZ2luQ2FsbGVyIGFkZHJlc3MKCQlyZWFsbSAgICAgICAgcnVudGltZS5SZWFsbQoJCWFtb3VudCAgICAgICBpbnQ2NAoJCXNob3VsZFBhbmljICBib29sCgkJcGFuaWNNc2cgICAgIHN0cmluZwoJfXsKCQl7ImFkbWluIHNldHMgdGFyZ2V0IGFtb3VudCIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgMTAwMDAwMCwgZmFsc2UsICIifSwKCQl7InVuYXV0aG9yaXplZCIsIHVuYXV0aG9yaXplZFVzZXIsIHRlc3RpbmcuTmV3VXNlclJlYWxtKHVuYXV0aG9yaXplZFVzZXIpLCAxMDAwMDAwLCB0cnVlLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIn0sCgkJeyJ6ZXJvIGFtb3VudCIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgMCwgdHJ1ZSwgImZhdWNldCB0YXJnZXQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUifSwKCQl7Im5lZ2F0aXZlIGFtb3VudCIsIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgLTEsIHRydWUsICJmYXVjZXQgdGFyZ2V0IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIn0sCgl9CgoJZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKCQlzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHR0Lm9yaWdpbkNhbGxlcikKCQl0ZXN0aW5nLlNldFJlYWxtKHR0LnJlYWxtKQoKCQlpZiB0dC5zaG91bGRQYW5pYyB7CgkJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0dC5wYW5pY01zZywgZnVuYygpIHsKCQkJCVNldEZhdWNldFRhcmdldEFtb3VudChjcm9zcyhjdXIpLCB0dC5hbW91bnQpCgkJCX0pCgkJCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEdldEZhdWNldFRhcmdldEFtb3VudCgpKQoJCQljb250aW51ZQoJCX0KCgkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIHR0LmFtb3VudCkKCQl1YXNzZXJ0LkVxdWFsKHQsIHR0LmFtb3VudCwgR2V0RmF1Y2V0VGFyZ2V0QW1vdW50KCkpCgl9Cn0KCmZ1bmMgVGVzdFJlcXVlc3RGYXVjZXRUcmFuc2ZlcnNEZWZpY2l0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoKCWFkbWluUmVhbG0gOj0gYWRtaW5SZWFsbUFkZHIoKQoJYWRtaW5CZWZvcmUgOj0gYWRtaW5VZ25vdEJhbGFuY2UoYWRtaW5SZWFsbSkKCW9wZXJhdG9yQmVmb3JlIDo9IGFkbWluVWdub3RCYWxhbmNlKHRlc3RPcGVyYXRvcikKCWV4cGVjdGVkVHJhbnNmZXIgOj0gaW50NjQoMzAwMDAwKQoJZmF1Y2V0VGVzdC5GdW5kQWRtaW4odGVzdEZhdWNldEZ1bmRBbW91bnQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIG9wZXJhdG9yQmVmb3JlK2V4cGVjdGVkVHJhbnNmZXIpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdE9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0T3BlcmF0b3IpKQoJdHJhbnNmZXJyZWQgOj0gUmVxdWVzdEZhdWNldChjcm9zcyhjdXIpKQoKCXVhc3NlcnQuRXF1YWwodCwgZXhwZWN0ZWRUcmFuc2ZlciwgdHJhbnNmZXJyZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIG9wZXJhdG9yQmVmb3JlK2V4cGVjdGVkVHJhbnNmZXIsIGFkbWluVWdub3RCYWxhbmNlKHRlc3RPcGVyYXRvcikpCgl1YXNzZXJ0LkVxdWFsKHQsIGFkbWluQmVmb3JlK3Rlc3RGYXVjZXRGdW5kQW1vdW50LWV4cGVjdGVkVHJhbnNmZXIsIGFkbWluVWdub3RCYWxhbmNlKGFkbWluUmVhbG0pKQp9CgpmdW5jIFRlc3RSZXF1ZXN0RmF1Y2V0Rm9yVHJhbnNmZXJzRGVmaWNpdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBDb21tb25BZG1pblRlc3RzKGN1ciwgdCkKCglhZG1pblJlYWxtIDo9IGFkbWluUmVhbG1BZGRyKCkKCWFkbWluQmVmb3JlIDo9IGFkbWluVWdub3RCYWxhbmNlKGFkbWluUmVhbG0pCglvcGVyYXRvckJlZm9yZSA6PSBhZG1pblVnbm90QmFsYW5jZSh0ZXN0T3BlcmF0b3IpCglleHBlY3RlZFRyYW5zZmVyIDo9IGludDY0KDMwMDAwMCkKCWZhdWNldFRlc3QuRnVuZEFkbWluKHRlc3RGYXVjZXRGdW5kQW1vdW50KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RPcGVyYXRvcikKCVNldEZhdWNldFRhcmdldEFtb3VudChjcm9zcyhjdXIpLCBvcGVyYXRvckJlZm9yZStleHBlY3RlZFRyYW5zZmVyKQoJdHJhbnNmZXJyZWQgOj0gUmVxdWVzdEZhdWNldEZvcihjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IpCgoJdWFzc2VydC5FcXVhbCh0LCBleHBlY3RlZFRyYW5zZmVyLCB0cmFuc2ZlcnJlZCkKCXVhc3NlcnQuRXF1YWwodCwgb3BlcmF0b3JCZWZvcmUrZXhwZWN0ZWRUcmFuc2ZlciwgYWRtaW5VZ25vdEJhbGFuY2UodGVzdE9wZXJhdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5CZWZvcmUrdGVzdEZhdWNldEZ1bmRBbW91bnQtZXhwZWN0ZWRUcmFuc2ZlciwgYWRtaW5VZ25vdEJhbGFuY2UoYWRtaW5SZWFsbSkpCn0KCmZ1bmMgVGVzdFJlcXVlc3RGYXVjZXRzVHJhbnNmZXJzRGVmaWNpdHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJVW5zZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0QWRtaW4pCglTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IpCglTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RVc2VyMikKCglhZG1pblJlYWxtIDo9IGFkbWluUmVhbG1BZGRyKCkKCWFkbWluQmVmb3JlIDo9IGFkbWluVWdub3RCYWxhbmNlKGFkbWluUmVhbG0pCglvcGVyYXRvckJlZm9yZSA6PSBhZG1pblVnbm90QmFsYW5jZSh0ZXN0T3BlcmF0b3IpCgl1c2VyQmVmb3JlIDo9IGFkbWluVWdub3RCYWxhbmNlKHRlc3RVc2VyKQoJdXNlcjJCZWZvcmUgOj0gYWRtaW5VZ25vdEJhbGFuY2UodGVzdFVzZXIyKQoJdGFyZ2V0QW1vdW50IDo9IG1heEludDY0KG9wZXJhdG9yQmVmb3JlLCBtYXhJbnQ2NCh1c2VyQmVmb3JlLCB1c2VyMkJlZm9yZSkpICsgMzAwMDAwCglpZiB1c2VyMkJlZm9yZSA8IHRhcmdldEFtb3VudCB7CgkJZmF1Y2V0VGVzdC5Jc3N1ZSh0ZXN0VXNlcjIsIHRhcmdldEFtb3VudC11c2VyMkJlZm9yZSkKCQl1c2VyMkJlZm9yZSA9IHRhcmdldEFtb3VudAoJfQoJb3BlcmF0b3JEZWZpY2l0IDo9IHRhcmdldEFtb3VudCAtIG9wZXJhdG9yQmVmb3JlCgl1c2VyRGVmaWNpdCA6PSB0YXJnZXRBbW91bnQgLSB1c2VyQmVmb3JlCglleHBlY3RlZFRyYW5zZmVyIDo9IG9wZXJhdG9yRGVmaWNpdCArIHVzZXJEZWZpY2l0CglmYXVjZXRUZXN0LkZ1bmRBZG1pbihleHBlY3RlZFRyYW5zZmVyKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVNldEZhdWNldFRhcmdldEFtb3VudChjcm9zcyhjdXIpLCB0YXJnZXRBbW91bnQpCgl0cmFuc2ZlcnJlZCA6PSBSZXF1ZXN0RmF1Y2V0cyhjcm9zcyhjdXIpKQoKCXVhc3NlcnQuRXF1YWwodCwgZXhwZWN0ZWRUcmFuc2ZlciwgdHJhbnNmZXJyZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIHRhcmdldEFtb3VudCwgYWRtaW5VZ25vdEJhbGFuY2UodGVzdE9wZXJhdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgdGFyZ2V0QW1vdW50LCBhZG1pblVnbm90QmFsYW5jZSh0ZXN0VXNlcikpCgl1YXNzZXJ0LkVxdWFsKHQsIHVzZXIyQmVmb3JlLCBhZG1pblVnbm90QmFsYW5jZSh0ZXN0VXNlcjIpKQoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbkJlZm9yZSwgYWRtaW5VZ25vdEJhbGFuY2UoYWRtaW5SZWFsbSkpCn0KCmZ1bmMgVGVzdFJlcXVlc3RGYXVjZXRzUmV0dXJuc1plcm9XaXRob3V0RGVmaWNpdHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJVW5zZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0QWRtaW4pCglTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IpCglTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0VXNlcikKCglvcGVyYXRvckJlZm9yZSA6PSBhZG1pblVnbm90QmFsYW5jZSh0ZXN0T3BlcmF0b3IpCgl1c2VyQmVmb3JlIDo9IGFkbWluVWdub3RCYWxhbmNlKHRlc3RVc2VyKQoJdGFyZ2V0QW1vdW50IDo9IG1heEludDY0KG9wZXJhdG9yQmVmb3JlLCB1c2VyQmVmb3JlKQoJaWYgb3BlcmF0b3JCZWZvcmUgPCB0YXJnZXRBbW91bnQgewoJCWZhdWNldFRlc3QuSXNzdWUodGVzdE9wZXJhdG9yLCB0YXJnZXRBbW91bnQtb3BlcmF0b3JCZWZvcmUpCgl9CglpZiB1c2VyQmVmb3JlIDwgdGFyZ2V0QW1vdW50IHsKCQlmYXVjZXRUZXN0Lklzc3VlKHRlc3RVc2VyLCB0YXJnZXRBbW91bnQtdXNlckJlZm9yZSkKCX0KCWlmIHRhcmdldEFtb3VudCA8PSAwIHsKCQl0YXJnZXRBbW91bnQgPSAxCgkJZmF1Y2V0VGVzdC5Jc3N1ZSh0ZXN0T3BlcmF0b3IsIHRhcmdldEFtb3VudCkKCQlmYXVjZXRUZXN0Lklzc3VlKHRlc3RVc2VyLCB0YXJnZXRBbW91bnQpCgl9CgoJYWRtaW5CZWZvcmUgOj0gYWRtaW5VZ25vdEJhbGFuY2UoYWRtaW5SZWFsbUFkZHIoKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVNldEZhdWNldFRhcmdldEFtb3VudChjcm9zcyhjdXIpLCB0YXJnZXRBbW91bnQpCgl0cmFuc2ZlcnJlZCA6PSBSZXF1ZXN0RmF1Y2V0cyhjcm9zcyhjdXIpKQoKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHRyYW5zZmVycmVkKQoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbkJlZm9yZSwgYWRtaW5VZ25vdEJhbGFuY2UoYWRtaW5SZWFsbUFkZHIoKSkpCn0KCmZ1bmMgVGVzdFJlcXVlc3RGYXVjZXRSZWplY3RzSW52YWxpZFJlcXVlc3QoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICBzdHJpbmcKCQlzZXR1cCAgICBmdW5jKGN1ciByZWFsbSkgKGFkZHJlc3MsIHJ1bnRpbWUuUmVhbG0pCgkJcGFuaWNNc2cgc3RyaW5nCgl9ewoJCXsKCQkJbmFtZTogIm5vbi1vcGVyYXRvciBkaXJlY3QgY2FsbGVyIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSkgewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIDEwMDAwMDApCgkJCQlmYXVjZXRUZXN0LkZ1bmRBZG1pbih0ZXN0RmF1Y2V0RnVuZEFtb3VudCkKCQkJCXJldHVybiB1bmF1dGhvcml6ZWRVc2VyLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh1bmF1dGhvcml6ZWRVc2VyKQoJCQl9LAoJCQlwYW5pY01zZzogIm9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJvcGVyYXRvciBiYWxhbmNlIGFscmVhZHkgcmVhY2hlcyB0YXJnZXQiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIChhZGRyZXNzLCBydW50aW1lLlJlYWxtKSB7CgkJCQlvcGVyYXRvckJhbGFuY2UgOj0gYWRtaW5VZ25vdEJhbGFuY2UodGVzdE9wZXJhdG9yKQoJCQkJaWYgb3BlcmF0b3JCYWxhbmNlID09IDAgewoJCQkJCWZhdWNldFRlc3QuSXNzdWUodGVzdE9wZXJhdG9yLCAxKQoJCQkJCW9wZXJhdG9yQmFsYW5jZSA9IDEKCQkJCX0KCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RPcGVyYXRvcikKCQkJCVNldEZhdWNldFRhcmdldEFtb3VudChjcm9zcyhjdXIpLCBvcGVyYXRvckJhbGFuY2UpCgkJCQlmYXVjZXRUZXN0LkZ1bmRBZG1pbih0ZXN0RmF1Y2V0RnVuZEFtb3VudCkKCQkJCXJldHVybiB0ZXN0T3BlcmF0b3IsIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikKCQkJfSwKCQkJcGFuaWNNc2c6ICJvcGVyYXRvciBiYWxhbmNlIGlzIG5vdCBiZWxvdyBmYXVjZXQgdGFyZ2V0IiwKCQl9LAoJCXsKCQkJbmFtZTogImFkbWluIHJlYWxtIGJhbGFuY2UgaXMgaW5zdWZmaWNpZW50IiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSkgewoJCQkJYWRtaW5CYWxhbmNlIDo9IGFkbWluVWdub3RCYWxhbmNlKGFkbWluUmVhbG1BZGRyKCkpCgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJCQlTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IpCgkJCQlTZXRGYXVjZXRUYXJnZXRBbW91bnQoY3Jvc3MoY3VyKSwgYWRtaW5VZ25vdEJhbGFuY2UodGVzdE9wZXJhdG9yKSthZG1pbkJhbGFuY2UrMSkKCQkJCXJldHVybiB0ZXN0T3BlcmF0b3IsIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiByZWFsbSBiYWxhbmNlIGlzIGluc3VmZmljaWVudCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJvcGVyYXRvciBvcmlnaW4gdGhyb3VnaCBjb2RlIHJlYWxtIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSkgewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIGFkbWluVWdub3RCYWxhbmNlKHRlc3RPcGVyYXRvcikrMSkKCQkJCWZhdWNldFRlc3QuRnVuZEFkbWluKHRlc3RGYXVjZXRGdW5kQW1vdW50KQoJCQkJcmV0dXJuIHRlc3RPcGVyYXRvciwgdGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL29wZXJhdG9yX2ZhdWNldF9yZWxheSIpCgkJCX0sCgkJCXBhbmljTXNnOiAiY29udHJhY3QgY2FsbHMgbm90IGFsbG93ZWQ6IGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHVzZXIiLAoJCX0sCgkJewoJCQluYW1lOiAidGFyZ2V0IGFtb3VudCBpcyBub3QgY29uZmlndXJlZCIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgKGFkZHJlc3MsIHJ1bnRpbWUuUmVhbG0pIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RPcGVyYXRvcikKCQkJCWZhdWNldFRlc3QuRnVuZEFkbWluKHRlc3RGYXVjZXRGdW5kQW1vdW50KQoJCQkJcmV0dXJuIHRlc3RPcGVyYXRvciwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdE9wZXJhdG9yKQoJCQl9LAoJCQlwYW5pY01zZzogImZhdWNldCB0YXJnZXQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiLAoJCX0sCgl9CgoJZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKCQlzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoJCWNhbGxlciwgcmxtIDo9IHR0LnNldHVwKGN1cikKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjYWxsZXIpCgkJdGVzdGluZy5TZXRSZWFsbShybG0pCgoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0dC5wYW5pY01zZywgZnVuYygpIHsKCQkJUmVxdWVzdEZhdWNldChjcm9zcyhjdXIpKQoJCX0pCgl9Cn0KCmZ1bmMgVGVzdFJlcXVlc3RGYXVjZXRGb3JSZWplY3RzSW52YWxpZFJlcXVlc3QoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICBzdHJpbmcKCQlzZXR1cCAgICBmdW5jKGN1ciByZWFsbSkgKGFkZHJlc3MsIHJ1bnRpbWUuUmVhbG0sIGFkZHJlc3MpCgkJcGFuaWNNc2cgc3RyaW5nCgl9ewoJCXsKCQkJbmFtZTogIm5vbi1hZG1pbiBjYWxsZXIiLAoJCQlzZXR1cDogZnVuYyhjdXIgcmVhbG0pIChhZGRyZXNzLCBydW50aW1lLlJlYWxtLCBhZGRyZXNzKSB7CgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJCQlTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IpCgkJCQlTZXRGYXVjZXRUYXJnZXRBbW91bnQoY3Jvc3MoY3VyKSwgMTAwMDAwMCkKCQkJCWZhdWNldFRlc3QuRnVuZEFkbWluKHRlc3RGYXVjZXRGdW5kQW1vdW50KQoJCQkJcmV0dXJuIHVuYXV0aG9yaXplZFVzZXIsIHRlc3RpbmcuTmV3VXNlclJlYWxtKHVuYXV0aG9yaXplZFVzZXIpLCB0ZXN0T3BlcmF0b3IKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLAoJCX0sCgkJewoJCQluYW1lOiAibm9uLW9wZXJhdG9yIHRhcmdldCIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgKGFkZHJlc3MsIHJ1bnRpbWUuUmVhbG0sIGFkZHJlc3MpIHsKCQkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQkJCVNldEZhdWNldFRhcmdldEFtb3VudChjcm9zcyhjdXIpLCAxMDAwMDAwKQoJCQkJZmF1Y2V0VGVzdC5GdW5kQWRtaW4odGVzdEZhdWNldEZ1bmRBbW91bnQpCgkJCQlyZXR1cm4gdGVzdEFkbWluLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pLCB1bmF1dGhvcml6ZWRVc2VyCgkJCX0sCgkJCXBhbmljTXNnOiAib3BlcmF0b3IgYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogIm9wZXJhdG9yIGJhbGFuY2UgYWxyZWFkeSByZWFjaGVzIHRhcmdldCIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgKGFkZHJlc3MsIHJ1bnRpbWUuUmVhbG0sIGFkZHJlc3MpIHsKCQkJCW9wZXJhdG9yQmFsYW5jZSA6PSBhZG1pblVnbm90QmFsYW5jZSh0ZXN0T3BlcmF0b3IpCgkJCQlpZiBvcGVyYXRvckJhbGFuY2UgPT0gMCB7CgkJCQkJZmF1Y2V0VGVzdC5Jc3N1ZSh0ZXN0T3BlcmF0b3IsIDEpCgkJCQkJb3BlcmF0b3JCYWxhbmNlID0gMQoJCQkJfQoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIG9wZXJhdG9yQmFsYW5jZSkKCQkJCWZhdWNldFRlc3QuRnVuZEFkbWluKHRlc3RGYXVjZXRGdW5kQW1vdW50KQoJCQkJcmV0dXJuIHRlc3RBZG1pbiwgdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSwgdGVzdE9wZXJhdG9yCgkJCX0sCgkJCXBhbmljTXNnOiAib3BlcmF0b3IgYmFsYW5jZSBpcyBub3QgYmVsb3cgZmF1Y2V0IHRhcmdldCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJhZG1pbiByZWFsbSBiYWxhbmNlIGlzIGluc3VmZmljaWVudCIsCgkJCXNldHVwOiBmdW5jKGN1ciByZWFsbSkgKGFkZHJlc3MsIHJ1bnRpbWUuUmVhbG0sIGFkZHJlc3MpIHsKCQkJCWFkbWluQmFsYW5jZSA6PSBhZG1pblVnbm90QmFsYW5jZShhZG1pblJlYWxtQWRkcigpKQoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIGFkbWluVWdub3RCYWxhbmNlKHRlc3RPcGVyYXRvcikrYWRtaW5CYWxhbmNlKzEpCgkJCQlyZXR1cm4gdGVzdEFkbWluLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pLCB0ZXN0T3BlcmF0b3IKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiByZWFsbSBiYWxhbmNlIGlzIGluc3VmZmljaWVudCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJ0YXJnZXQgYW1vdW50IGlzIG5vdCBjb25maWd1cmVkIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSwgYWRkcmVzcykgewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJZmF1Y2V0VGVzdC5GdW5kQWRtaW4odGVzdEZhdWNldEZ1bmRBbW91bnQpCgkJCQlyZXR1cm4gdGVzdEFkbWluLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pLCB0ZXN0T3BlcmF0b3IKCQkJfSwKCQkJcGFuaWNNc2c6ICJmYXVjZXQgdGFyZ2V0IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIiwKCQl9LAoJfQoKCWZvciBfLCB0dCA6PSByYW5nZSB0ZXN0cyB7CgkJc2V0dXBDb21tb25BZG1pblRlc3RzKGN1ciwgdCkKCQljYWxsZXIsIHJsbSwgb3BlcmF0b3IgOj0gdHQuc2V0dXAoY3VyKQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNhbGxlcikKCQl0ZXN0aW5nLlNldFJlYWxtKHJsbSkKCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQlSZXF1ZXN0RmF1Y2V0Rm9yKGNyb3NzKGN1ciksIG9wZXJhdG9yKQoJCX0pCgl9Cn0KCmZ1bmMgVGVzdFJlcXVlc3RGYXVjZXRzUmVqZWN0c0ludmFsaWRSZXF1ZXN0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0cyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgc3RyaW5nCgkJc2V0dXAgICAgZnVuYyhjdXIgcmVhbG0pIChhZGRyZXNzLCBydW50aW1lLlJlYWxtKQoJCXBhbmljTXNnIHN0cmluZwoJfXsKCQl7CgkJCW5hbWU6ICJub24tYWRtaW4gY2FsbGVyIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSkgewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJU2V0RmF1Y2V0VGFyZ2V0QW1vdW50KGNyb3NzKGN1ciksIGFkbWluVWdub3RCYWxhbmNlKHRlc3RPcGVyYXRvcikrMSkKCQkJCWZhdWNldFRlc3QuRnVuZEFkbWluKHRlc3RGYXVjZXRGdW5kQW1vdW50KQoJCQkJcmV0dXJuIHVuYXV0aG9yaXplZFVzZXIsIHRlc3RpbmcuTmV3VXNlclJlYWxtKHVuYXV0aG9yaXplZFVzZXIpCgkJCX0sCgkJCXBhbmljTXNnOiAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwKCQl9LAoJCXsKCQkJbmFtZTogImFkbWluIHJlYWxtIGJhbGFuY2UgaXMgaW5zdWZmaWNpZW50IiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSkgewoJCQkJYWRtaW5CYWxhbmNlIDo9IGFkbWluVWdub3RCYWxhbmNlKGFkbWluUmVhbG1BZGRyKCkpCgkJCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgkJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJCQlTZXRPcGVyYXRvcihjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IpCgkJCQlTZXRGYXVjZXRUYXJnZXRBbW91bnQoY3Jvc3MoY3VyKSwgYWRtaW5VZ25vdEJhbGFuY2UodGVzdE9wZXJhdG9yKSthZG1pbkJhbGFuY2UrMSkKCQkJCXJldHVybiB0ZXN0QWRtaW4sIHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikKCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiByZWFsbSBiYWxhbmNlIGlzIGluc3VmZmljaWVudCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJ0YXJnZXQgYW1vdW50IGlzIG5vdCBjb25maWd1cmVkIiwKCQkJc2V0dXA6IGZ1bmMoY3VyIHJlYWxtKSAoYWRkcmVzcywgcnVudGltZS5SZWFsbSkgewoJCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJCQkJU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgdGVzdE9wZXJhdG9yKQoJCQkJZmF1Y2V0VGVzdC5GdW5kQWRtaW4odGVzdEZhdWNldEZ1bmRBbW91bnQpCgkJCQlyZXR1cm4gdGVzdEFkbWluLCB0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pCgkJCX0sCgkJCXBhbmljTXNnOiAiZmF1Y2V0IHRhcmdldCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIsCgkJfSwKCX0KCglmb3IgXywgdHQgOj0gcmFuZ2UgdGVzdHMgewoJCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgkJY2FsbGVyLCBybG0gOj0gdHQuc2V0dXAoY3VyKQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNhbGxlcikKCQl0ZXN0aW5nLlNldFJlYWxtKHJsbSkKCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHR0LnBhbmljTXNnLCBmdW5jKCkgewoJCQlSZXF1ZXN0RmF1Y2V0cyhjcm9zcyhjdXIpKQoJCX0pCgl9Cn0KCmZ1bmMgVGVzdFdpdGhkcmF3VHJhbnNmZXJzQWRtaW5SZWFsbUJhbGFuY2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIsIHQpCgoJYWRtaW5SZWFsbSA6PSBhZG1pblJlYWxtQWRkcigpCglhZG1pbkJlZm9yZSA6PSBhZG1pblVnbm90QmFsYW5jZShhZG1pblJlYWxtKQoJcmVjaXBpZW50QmVmb3JlIDo9IGFkbWluVWdub3RCYWxhbmNlKHRlc3RVc2VyKQoJd2l0aGRyYXdBbW91bnQgOj0gaW50NjQoMjAwMDAwKQoJZmF1Y2V0VGVzdC5GdW5kQWRtaW4od2l0aGRyYXdBbW91bnQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdHJhbnNmZXJyZWQgOj0gV2l0aGRyYXcoY3Jvc3MoY3VyKSwgdGVzdFVzZXIsIHdpdGhkcmF3QW1vdW50KQoKCXVhc3NlcnQuRXF1YWwodCwgd2l0aGRyYXdBbW91bnQsIHRyYW5zZmVycmVkKQoJdWFzc2VydC5FcXVhbCh0LCByZWNpcGllbnRCZWZvcmUrd2l0aGRyYXdBbW91bnQsIGFkbWluVWdub3RCYWxhbmNlKHRlc3RVc2VyKSkKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5CZWZvcmUsIGFkbWluVWdub3RCYWxhbmNlKGFkbWluUmVhbG0pKQp9Cgp0eXBlIHdpdGhkcmF3UmVqZWN0Q29udGV4dCBzdHJ1Y3QgewoJY2FsbGVyICAgICAgICAgIGFkZHJlc3MKCXJlY2lwaWVudCAgICAgICBhZGRyZXNzCglhbW91bnQgICAgICAgICAgaW50NjQKCWFkbWluQmVmb3JlICAgICBpbnQ2NAoJcmVjaXBpZW50QmVmb3JlIGludDY0CgljaGVja1JlY2lwaWVudCAgYm9vbAp9CgpmdW5jIFRlc3RXaXRoZHJhd1JlamVjdHNJbnZhbGlkUmVxdWVzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdHMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgICAgIHN0cmluZwoJCXNldHVwICAgIGZ1bmMoKSB3aXRoZHJhd1JlamVjdENvbnRleHQKCQlwYW5pY01zZyBzdHJpbmcKCX17CgkJewoJCQluYW1lOiAibm9uLWFkbWluIGNhbGxlciIsCgkJCXNldHVwOiBmdW5jKCkgd2l0aGRyYXdSZWplY3RDb250ZXh0IHsKCQkJCWZhdWNldFRlc3QuRnVuZEFkbWluKDEpCgkJCQlyZXR1cm4gd2l0aGRyYXdSZWplY3RDb250ZXh0ewoJCQkJCWNhbGxlcjogICAgdW5hdXRob3JpemVkVXNlciwKCQkJCQlyZWNpcGllbnQ6IHRlc3RVc2VyLAoJCQkJCWFtb3VudDogICAgMSwKCQkJCX0KCQkJfSwKCQkJcGFuaWNNc2c6ICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLAoJCX0sCgkJewoJCQluYW1lOiAiaW52YWxpZCByZWNpcGllbnQiLAoJCQlzZXR1cDogZnVuYygpIHdpdGhkcmF3UmVqZWN0Q29udGV4dCB7CgkJCQlmYXVjZXRUZXN0LkZ1bmRBZG1pbigxKQoJCQkJcmV0dXJuIHdpdGhkcmF3UmVqZWN0Q29udGV4dHsKCQkJCQljYWxsZXI6ICAgIHRlc3RBZG1pbiwKCQkJCQlyZWNpcGllbnQ6IGFkZHJlc3MoIiIpLAoJCQkJCWFtb3VudDogICAgMSwKCQkJCX0KCQkJfSwKCQkJcGFuaWNNc2c6ICJpbnZhbGlkIGFkZHJlc3MiLAoJCX0sCgkJewoJCQluYW1lOiAiemVybyBhbW91bnQiLAoJCQlzZXR1cDogZnVuYygpIHdpdGhkcmF3UmVqZWN0Q29udGV4dCB7CgkJCQlmYXVjZXRUZXN0LkZ1bmRBZG1pbigxKQoJCQkJcmV0dXJuIHdpdGhkcmF3UmVqZWN0Q29udGV4dHsKCQkJCQljYWxsZXI6ICAgIHRlc3RBZG1pbiwKCQkJCQlyZWNpcGllbnQ6IHRlc3RVc2VyLAoJCQkJCWFtb3VudDogICAgMCwKCQkJCX0KCQkJfSwKCQkJcGFuaWNNc2c6ICJhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIsCgkJfSwKCQl7CgkJCW5hbWU6ICJuZWdhdGl2ZSBhbW91bnQiLAoJCQlzZXR1cDogZnVuYygpIHdpdGhkcmF3UmVqZWN0Q29udGV4dCB7CgkJCQlmYXVjZXRUZXN0LkZ1bmRBZG1pbigxKQoJCQkJcmV0dXJuIHdpdGhkcmF3UmVqZWN0Q29udGV4dHsKCQkJCQljYWxsZXI6ICAgIHRlc3RBZG1pbiwKCQkJCQlyZWNpcGllbnQ6IHRlc3RVc2VyLAoJCQkJCWFtb3VudDogICAgLTEsCgkJCQl9CgkJCX0sCgkJCXBhbmljTXNnOiAiYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiLAoJCX0sCgkJewoJCQluYW1lOiAiYWRtaW4gcmVhbG0gYmFsYW5jZSBpcyBpbnN1ZmZpY2llbnQiLAoJCQlzZXR1cDogZnVuYygpIHdpdGhkcmF3UmVqZWN0Q29udGV4dCB7CgkJCQlyZXR1cm4gd2l0aGRyYXdSZWplY3RDb250ZXh0ewoJCQkJCWNhbGxlcjogICAgdGVzdEFkbWluLAoJCQkJCXJlY2lwaWVudDogdGVzdFVzZXIsCgkJCQkJYW1vdW50OiAgICBhZG1pblVnbm90QmFsYW5jZShhZG1pblJlYWxtQWRkcigpKSArIDEsCgkJCQl9CgkJCX0sCgkJCXBhbmljTXNnOiAiYWRtaW4gcmVhbG0gYmFsYW5jZSBpcyBpbnN1ZmZpY2llbnQiLAoJCX0sCgl9CgoJZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKCQlzZXR1cENvbW1vbkFkbWluVGVzdHMoY3VyLCB0KQoJCWN0eCA6PSB0dC5zZXR1cCgpCgkJY3R4LmFkbWluQmVmb3JlID0gYWRtaW5VZ25vdEJhbGFuY2UoYWRtaW5SZWFsbUFkZHIoKSkKCQljdHguY2hlY2tSZWNpcGllbnQgPSBjdHgucmVjaXBpZW50LklzVmFsaWQoKQoJCWlmIGN0eC5jaGVja1JlY2lwaWVudCB7CgkJCWN0eC5yZWNpcGllbnRCZWZvcmUgPSBhZG1pblVnbm90QmFsYW5jZShjdHgucmVjaXBpZW50KQoJCX0KCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjdHguY2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3R4LmNhbGxlcikpCgoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0dC5wYW5pY01zZywgZnVuYygpIHsKCQkJV2l0aGRyYXcoY3Jvc3MoY3VyKSwgY3R4LnJlY2lwaWVudCwgY3R4LmFtb3VudCkKCQl9KQoJCXVhc3NlcnQuRXF1YWwodCwgY3R4LmFkbWluQmVmb3JlLCBhZG1pblVnbm90QmFsYW5jZShhZG1pblJlYWxtQWRkcigpKSkKCQlpZiBjdHguY2hlY2tSZWNpcGllbnQgewoJCQl1YXNzZXJ0LkVxdWFsKHQsIGN0eC5yZWNpcGllbnRCZWZvcmUsIGFkbWluVWdub3RCYWxhbmNlKGN0eC5yZWNpcGllbnQpKQoJCX0KCX0KfQoKZnVuYyBhZG1pblVnbm90QmFsYW5jZShhZGRyIGFkZHJlc3MpIGludDY0IHsKCWJuayA6PSBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKQoJcmV0dXJuIGJuay5HZXRDb2lucyhhZGRyKS5BbW91bnRPZigidWdub3QiKQp9CgpmdW5jIChoICpmYXVjZXRUZXN0SGVscGVyKSBGdW5kQWRtaW4oYW1vdW50IGludDY0KSB7CgloLklzc3VlKGFkbWluUmVhbG1BZGRyKCksIGFtb3VudCkKfQoKZnVuYyAoaCAqZmF1Y2V0VGVzdEhlbHBlcikgSXNzdWUoYWRkciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWlmIGFtb3VudCA8PSAwIHsKCQlyZXR1cm4KCX0KCXRlc3RpbmcuSXNzdWVDb2lucyhhZGRyLCBjaGFpbi5Db2luc3t7InVnbm90IiwgYW1vdW50fX0pCn0KCmZ1bmMgbWF4SW50NjQoYSBpbnQ2NCwgYiBpbnQ2NCkgaW50NjQgewoJaWYgYSA+IGIgewoJCXJldHVybiBhCgl9CglyZXR1cm4gYgp9ChqRBQoMcHJvdG9jb2wuZ25vEoAFcGFja2FnZSBhZG1pbgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKKQoKY29uc3QgKAoJU2V0UHJvdG9jb2xFdmVudCA9ICJTZXRQcm90b2NvbCIKKQoKdmFyICgKCXByb3RvY29sQWRkciBhZGRyZXNzCikKCmZ1bmMgaW5pdCgpIHsKCWNhbGxlciA6PSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCXByb3RvY29sQWRkciA9IGNhbGxlcgp9CgpmdW5jIEdldFByb3RvY29sKCkgYWRkcmVzcyB7CglyZXR1cm4gcHJvdG9jb2xBZGRyCn0KCmZ1bmMgU2V0UHJvdG9jb2woY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MpIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIElzQWRtaW4pCgoJYXNzZXJ0VmFsaWRBZGRyZXNzKGFkZHIpCglvbGRBZGRyIDo9IHByb3RvY29sQWRkcgoJcHJvdG9jb2xBZGRyID0gYWRkcgoKCWNoYWluLkVtaXQoCgkJU2V0UHJvdG9jb2xFdmVudCwKCQkib2xkQWRkciIsIG9sZEFkZHIuU3RyaW5nKCksCgkJIm5ld0FkZHIiLCBhZGRyLlN0cmluZygpLAoJKQp9CgpmdW5jIElzUHJvdG9jb2woYWRkcmVzcyBhZGRyZXNzKSBib29sIHsKCXJldHVybiBhZGRyZXNzID09IHByb3RvY29sQWRkcgp9ChqMBgoKcmVuZGVyLmdubxL9BXBhY2thZ2UgYWRtaW4KCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIHJlbmRlckhvbWUoKQp9CgpmdW5jIHJlbmRlckhvbWUoKSBzdHJpbmcgewoJb3BlcmF0b3JzIDo9IEdldE9wZXJhdG9ycygpCglvcGVyYXRvckxpc3QgOj0gIiIKCWZvciBfLCBhZGRyIDo9IHJhbmdlIG9wZXJhdG9ycyB7CgkJb3BlcmF0b3JMaXN0ICs9ICIqICIgKyBhZGRyLlN0cmluZygpICsgIlxuIgoJfQoJaWYgb3BlcmF0b3JMaXN0ID09ICIiIHsKCQlvcGVyYXRvckxpc3QgPSAiKG5vbmUpXG4iCgl9CgoJb3V0cHV0IDo9IGAjIEFLS0FESUEgb24gR25vCgojIyBJbnRyb2R1Y3Rpb24KCkFLS0FESUEgaXMgYSBibG9ja2NoYWluLWJhc2VkIGdhbWUgbGlrZSBNaW5lY3JhZnQuCgp0aGlzIGNvbnRyYWN0IGlzIG1hbmFnaW5nIHRoZSBhZG1pbiBvZiB0aGUgQUtLQURJQSBnYW1lLgoKIyMgQWRtaW4KCiogKipBZGRyZXNzKio6IGAgKyBhZG1pbi5TdHJpbmcoKSArIGAKCiMjIE9wZXJhdG9ycwoKYCArIG9wZXJhdG9yTGlzdCArIGAKIyMgRmVlIENvbGxlY3RvcgoKKiAqKkFkZHJlc3MqKjogYCArIGZlZUNvbGxlY3RvckFkZHIuU3RyaW5nKCkgKyBgCgojIyBQcm90b2NvbAoKKiAqKkFkZHJlc3MqKjogYCArIHByb3RvY29sQWRkci5TdHJpbmcoKSArIGAKCiMjIE9wZXJhdG9yIEZhdWNldAoKKiAqKlRhcmdldCBBbW91bnQqKjogYCArIGludDY0VG9TdHJpbmcoZmF1Y2V0VGFyZ2V0QW1vdW50KSArIGAgdWdub3QKYAoJcmV0dXJuIG91dHB1dAp9ChryCAoOc2V0dXBfdGVzdC5nbm8S3whwYWNrYWdlIGFkbWluCgppbXBvcnQgKAoJInRlc3RpbmciCgoJImNoYWluIgoKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKKQoKdmFyICgKCXRlc3RBZG1pbiAgICAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInRlc3RBZG1pbiIpCgl0ZXN0T3BlcmF0b3IgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJ0ZXN0T3BlcmF0b3IiKQoJdGVzdFVzZXIgICAgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidGVzdFVzZXIiKQoJdGVzdFVzZXIyICAgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidGVzdFVzZXIyIikKCXVuYXV0aG9yaXplZFVzZXIgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInVuYXV0aG9yaXplZFVzZXIiKQoJdGVzdFByb3RvY29sICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidGVzdFByb3RvY29sIikKKQoKLy8gc2V0dXBDb21tb25BZG1pblRlc3RzIGluaXRpYWxpemVzIGNvbW1vbiBhZG1pbiB0ZXN0IGVudmlyb25tZW50LgpmdW5jIHNldHVwQ29tbW9uQWRtaW5UZXN0cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdC5IZWxwZXIoKQoJYWRtaW4gPSB0ZXN0QWRtaW4KCXBlbmRpbmdBZG1pbiA9IGFkZHJlc3MoIiIpCglvcGVyYXRvckFkZHJzID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCW9wZXJhdG9yQWRkcnMuU2V0KHRlc3RBZG1pbi5TdHJpbmcoKSwgdHJ1ZSkKCWZlZUNvbGxlY3RvckFkZHIgPSBhZG1pblJlYWxtQWRkcigpCglwcm90b2NvbEFkZHIgPSB0ZXN0QWRtaW4KCWZhdWNldFRhcmdldEFtb3VudCA9IDAKCWV4cGxvcmVyVVJMID0gImh0dHBzOi8vYXBwLmJldGEuYWtrYWRpYS5sYW5kIgp9CgpmdW5jIGFkbWluUmVhbG1BZGRyKCkgYWRkcmVzcyB7CglyZXR1cm4gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIikKfQoKZnVuYyBjb250YWluc09wZXJhdG9yKG9wZXJhdG9ycyBbXWFkZHJlc3MsIGFkZHIgYWRkcmVzcykgYm9vbCB7Cglmb3IgXywgb3BlcmF0b3IgOj0gcmFuZ2Ugb3BlcmF0b3JzIHsKCQlpZiBvcGVyYXRvciA9PSBhZGRyIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoa+wIKCXV0aWxzLmdubxLtAnBhY2thZ2UgYWRtaW4KCmltcG9ydCAoCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKKQoKZnVuYyBpbnQ2NFRvU3RyaW5nKHZhbHVlIGludDY0KSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkKfQoKZnVuYyBtdXN0R2V0UGVuZGluZ0FkbWluVXNlckNhbGxlcihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWNhbGxlciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRVc2VyQ2FsbGVyKDAsIHJsbSkKCWlmIGNhbGxlciAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJwZW5kaW5nIGFkbWluIGFjY2VzcyByZXF1aXJlZCIpCgl9CglyZXR1cm4gY2FsbGVyCn0KGrMICg52YWxpZGF0aW9uLmdubxKgCHBhY2thZ2UgYWRtaW4KCmltcG9ydCAoCgkibmV0L3VybCIKCSJzdHJpbmdzIgopCgpmdW5jIGFzc2VydFZhbGlkQWRkcmVzcyhhZGRyIGFkZHJlc3MpIHsKCWlmICFhZGRyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYWRkcmVzcyIpCgl9Cn0KCmZ1bmMgYXNzZXJ0UG9zaXRpdmVGYXVjZXRUYXJnZXQoYW1vdW50IGludDY0KSB7CglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImZhdWNldCB0YXJnZXQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJfQp9CgpmdW5jIGFzc2VydFBvc2l0aXZlVWdub3RBbW91bnQoYW1vdW50IGludDY0KSB7CglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIikKCX0KfQoKZnVuYyBub3JtYWxpemVFeHBsb3JlclVSTChyYXdVUkwgc3RyaW5nKSBzdHJpbmcgewoJaWYgcmF3VVJMID09ICIiIHsKCQlwYW5pYygiZXhwbG9yZXIgVVJMIGlzIHJlcXVpcmVkIikKCX0KCWlmIHN0cmluZ3MuVHJpbVNwYWNlKHJhd1VSTCkgIT0gcmF3VVJMIHx8IHN0cmluZ3MuQ29udGFpbnNBbnkocmF3VVJMLCAiIFx0XHJcbiIpIHsKCQlwYW5pYygiaW52YWxpZCBleHBsb3JlciBVUkwiKQoJfQoJaWYgc3RyaW5ncy5Db250YWluc0FueShyYXdVUkwsICJbXSgpIikgewoJCXBhbmljKCJpbnZhbGlkIGV4cGxvcmVyIFVSTCIpCgl9CgoJcGFyc2VkLCBlcnIgOj0gdXJsLlBhcnNlKHJhd1VSTCkKCWlmIGVyciAhPSBuaWwgfHwgcGFyc2VkLkhvc3QgPT0gIiIgewoJCXBhbmljKCJpbnZhbGlkIGV4cGxvcmVyIFVSTCIpCgl9CglpZiBwYXJzZWQuU2NoZW1lICE9ICJodHRwcyIgewoJCXBhbmljKCJleHBsb3JlciBVUkwgbXVzdCB1c2UgaHR0cHMiKQoJfQoKCW5vcm1hbGl6ZWRVUkwgOj0gcmF3VVJMCglmb3IgbGVuKG5vcm1hbGl6ZWRVUkwpID4gbGVuKCJodHRwczovLyIpICYmIHN0cmluZ3MuSGFzU3VmZml4KG5vcm1hbGl6ZWRVUkwsICIvIikgewoJCW5vcm1hbGl6ZWRVUkwgPSBub3JtYWxpemVkVVJMWzpsZW4obm9ybWFsaXplZFVSTCktMV0KCX0KCglyZXR1cm4gbm9ybWFsaXplZFVSTAp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBITCPTJjogBEgsxNDI3MjZ1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQItRS2vq8g7O+I4ZvJRzWH7jH0BzvxYjnsf41ryBRUbwxJA7iW9Wo8AHFkElThhNGIzJ4kdYTaE1KIb9ec46uqTp5JFDoheh5cb6iIRASjnAspFXPsrBwmu6sm6SJHcC5Xt9hooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==