Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
1B98D7A2DB6EDC8A5C07E052CE3CE38014486D567CA11692F44DD516CD1AAC5C
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
82,114,080
Requested gas limit
GAS USED
41,057,070
Gas consumed
FEE
82115ugnot
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
Ct3YAQoML3ZtLm1fYWRkcGtnEsvYAQooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRKd2AEKA2FidBIbZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWJ0GoIZCgdhYnQuZ25vEvYYcGFja2FnZSBhYnQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKCSJnbm8ubGFuZC9wL250L2dyYzIwL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgpjb25zdCBGcm96ZW5DaGFuZ2VkRXZlbnQgPSAiRnJvemVuQ2hhbmdlZCIKCnZhciAoCgkvLyBFdmVuIGEgVG9rZW4gY2FuIGNyZWF0ZSBtdXRhYmxlIHRlbGxlcnM7IGtlZXAgYWxsIGNhcGFiaWxpdGllcyBwcml2YXRlLgoJdG9rZW4gICpncmMyMC5Ub2tlbgoJbGVkZ2VyICpncmMyMC5Qcml2YXRlTGVkZ2VyCglmcm96ZW4gPSB0cnVlCikKCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCXRva2VuLCBsZWRnZXIgPSBncmMyMC5OZXdUb2tlbigiQWtrYWRpYSBCZXRhIFRva2VuIiwgImFidCIsIDYsIDAsIGN1cikKfQoKLy8gTWludCByZW1haW5zIGF2YWlsYWJsZSB3aGlsZSBmcm96ZW4uIEVhY2ggc3VjY2Vzc2Z1bCBjYWxsIGlzc3VlcyBuZXcgdG9rZW5zLgpmdW5jIE1pbnQoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWFjY2Vzc2NvbnRyb2wuTXVzdEdldEFkbWluT3JPcGVyYXRvckNhbGxlcigwLCBjdXIsIGFkbWluLklzQWRtaW4sIGFkbWluLklzT3BlcmF0b3IpCglhc3NlcnROb0NvaW5zKDAsIGN1cikKCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGFidCByZWNpcGllbnQiKQoJfQoJaWYgYW1vdW50IDw9IDAgewoJCXBhbmljKCJhYnQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJfQoJaWYgZXJyIDo9IGxlZGdlci5NaW50KHRvLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiYWJ0IG1pbnQgZmFpbGVkOiAiICsgZXJyLkVycm9yKCkpCgl9Cn0KCi8vIFNldEZyb3plbiBwcmVzZXJ2ZXMgZXhpc3RpbmcgYWxsb3dhbmNlcywgd2hpY2ggYmVjb21lIHVzYWJsZSBhZnRlciB1bmZyZWV6aW5nLgpmdW5jIFNldEZyb3plbihjdXIgcmVhbG0sIHZhbHVlIGJvb2wpIHsKCWNhbGxlciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRBZG1pbkNhbGxlcigwLCBjdXIsIGFkbWluLklzQWRtaW4pCglhc3NlcnROb0NvaW5zKDAsIGN1cikKCWlmIGZyb3plbiA9PSB2YWx1ZSB7CgkJcmV0dXJuCgl9CglwcmV2aW91cyA6PSBmcm96ZW4KCWZyb3plbiA9IHZhbHVlCgljaGFpbi5FbWl0KEZyb3plbkNoYW5nZWRFdmVudCwKCQkiZXhlY3V0b3IiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZpb3VzIiwgc3RyY29udi5Gb3JtYXRCb29sKHByZXZpb3VzKSwKCQkiZnJvemVuIiwgc3RyY29udi5Gb3JtYXRCb29sKGZyb3plbiksCgkpCn0KCmZ1bmMgVHJhbnNmZXIoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydENhblRyYW5zZmVyKDAsIGN1cikKCWlmIGVyciA6PSBsZWRnZXIuQ2FsbGVyVGVsbGVyKCkuVHJhbnNmZXIoMCwgY3VyLCB0bywgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImFidCB0cmFuc2ZlciBmYWlsZWQ6ICIgKyBlcnIuRXJyb3IoKSkKCX0KfQoKLy8gQXBwcm92ZSBhbHNvIHJlamVjdHMgYWxsb3dhbmNlIHJldm9jYXRpb24gd2hpbGUgZnJvemVuLgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCBzcGVuZGVyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgewoJYXNzZXJ0Q2FuVHJhbnNmZXIoMCwgY3VyKQoJaWYgZXJyIDo9IGxlZGdlci5DYWxsZXJUZWxsZXIoKS5BcHByb3ZlKDAsIGN1ciwgc3BlbmRlciwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImFidCBhcHByb3ZhbCBmYWlsZWQ6ICIgKyBlcnIuRXJyb3IoKSkKCX0KfQoKZnVuYyBUcmFuc2ZlckZyb20oY3VyIHJlYWxtLCBmcm9tLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydENhblRyYW5zZmVyKDAsIGN1cikKCS8vIFRoZSBsaWJyYXJ5IHNwZW5kcyBhbGxvd2FuY2UgYmVmb3JlIHJlamVjdGluZyBzZWxmLXRyYW5zZmVycy4gUmVqZWN0CgkvLyBoZXJlIHNvIGV2ZW4gYSBjYWxsZXIgdGhhdCByZXZpdmVzIHRoZSBhYm9ydCBjYW5ub3QgY29uc3VtZSBhbGxvd2FuY2UuCglpZiBmcm9tID09IHRvIHsKCQlwYW5pYygiYWJ0IHRyYW5zZmVyIGZhaWxlZDogY2Fubm90IHNlbmQgdHJhbnNmZXIgdG8gc2VsZiIpCgl9CglpZiBlcnIgOj0gbGVkZ2VyLkNhbGxlclRlbGxlcigpLlRyYW5zZmVyRnJvbSgwLCBjdXIsIGZyb20sIHRvLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiYWJ0IHRyYW5zZmVyIGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQp9CgpmdW5jIElzRnJvemVuKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmcm96ZW4gfQpmdW5jIEdldE5hbWUoKSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tlbi5HZXROYW1lKCkgfQpmdW5jIEdldFN5bWJvbCgpIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tlbi5HZXRTeW1ib2woKSB9CmZ1bmMgR2V0RGVjaW1hbHMoKSBpbnQgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva2VuLkdldERlY2ltYWxzKCkgfQpmdW5jIFRvdGFsU3VwcGx5KCkgaW50NjQgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tlbi5Ub3RhbFN1cHBseSgpIH0KZnVuYyBCYWxhbmNlT2Yob3duZXIgYWRkcmVzcykgaW50NjQgICAgICAgICAgeyByZXR1cm4gdG9rZW4uQmFsYW5jZU9mKG93bmVyKSB9CmZ1bmMgQWxsb3dhbmNlKG93bmVyLCBzcGVuZGVyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIHRva2VuLkFsbG93YW5jZShvd25lciwgc3BlbmRlcikgfQoKZnVuYyBhc3NlcnRDYW5UcmFuc2ZlcihfIGludCwgcmxtIHJlYWxtKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydEN1cnJlbnRSZWFsbSgwLCBybG0pCglhc3NlcnROb0NvaW5zKDAsIHJsbSkKCWlmIGZyb3plbiB7CgkJcGFuaWMoImFidCBpcyBmcm96ZW4iKQoJfQp9CgpmdW5jIGFzc2VydE5vQ29pbnMoXyBpbnQsIHJsbSByZWFsbSkgewoJLy8gT3JpZ2luU2VuZCBiZWxvbmdzIHRvIHRoZSBvcmlnaW4gY2FsbCwgbm90IGEgc3Vic2VxdWVudCByZWFsbSByZWxheS4KCWlmIHJsbS5QcmV2aW91cygpLklzVXNlcigpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSAhPSAwIHsKCQlwYW5pYygiYXR0YWNoZWQgY29pbnMgbm90IGFsbG93ZWQiKQoJfQp9ChqIMQoMYWJ0X3Rlc3QuZ25vEvcwcGFja2FnZSBhYnQKCmltcG9ydCAoCgkibWF0aCIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW4iCikKCmZ1bmMgVGVzdEluaXRpYWxTdGF0ZSh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuRXF1YWwodCwgIkFra2FkaWEgQmV0YSBUb2tlbiIsIEdldE5hbWUoKSkKCXVhc3NlcnQuRXF1YWwodCwgImFidCIsIEdldFN5bWJvbCgpKQoJdWFzc2VydC5FcXVhbCh0LCA2LCBHZXREZWNpbWFscygpKQoJdWFzc2VydC5FcXVhbCh0LCAiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWJ0LmFidC4wMDAwMDAwIiwgdG9rZW4uSUQoKSkKCXVhc3NlcnQuVHJ1ZSh0LCBJc0Zyb3plbigpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgVG90YWxTdXBwbHkoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEJhbGFuY2VPZihhYnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEFsbG93YW5jZShhYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyKSkKfQoKZnVuYyBUZXN0TWludFdoaWxlRnJvemVuKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEFCVChjcm9zcyhjdXIpLCB0KQoJZm9yIF8sIGNhbGxlciA6PSByYW5nZSBbXWFkZHJlc3N7YWJ0VGVzdC5BZG1pbiwgYWJ0VGVzdC5PcGVyYXRvcn0gewoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNhbGxlcikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNhbGxlcikpCgkJTWludChjcm9zcyhjdXIpLCBhYnRUZXN0Lk93bmVyLCAxMDApCgkJTWludChjcm9zcyhjdXIpLCBhYnRUZXN0Lk90aGVyLCAxMCkKCX0KCXVhc3NlcnQuVHJ1ZSh0LCBJc0Zyb3plbigpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyMjApLCBUb3RhbFN1cHBseSgpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyMDApLCBCYWxhbmNlT2YoYWJ0VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIwKSwgQmFsYW5jZU9mKGFidFRlc3QuT3RoZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIGFidFRlc3QuT3RoZXIpKQp9CgpmdW5jIFRlc3RNaW50SW52YWxpZElucHV0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgc3RyaW5nCgkJdG8gICAgICAgYWRkcmVzcwoJCWFtb3VudCAgIGludDY0CgkJcGFuaWNNc2cgc3RyaW5nCgl9ewoJCXsiZW1wdHkgYWRkcmVzcyIsIGFkZHJlc3MoIiIpLCAxLCAiaW52YWxpZCBhYnQgcmVjaXBpZW50In0sCgkJeyJpbnZhbGlkIGFkZHJlc3MiLCBhZGRyZXNzKCJpbnZhbGlkIiksIDEsICJpbnZhbGlkIGFidCByZWNpcGllbnQifSwKCQl7Inplcm8iLCBhYnRUZXN0Lk93bmVyLCAwLCAiYWJ0IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIn0sCgkJeyJuZWdhdGl2ZSIsIGFidFRlc3QuT3duZXIsIC0xLCAiYWJ0IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIn0sCgkJeyJtaW5pbXVtIGludDY0IiwgYWJ0VGVzdC5Pd25lciwgbWF0aC5NaW5JbnQ2NCwgImFidCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSJ9LAoJfQoJZm9yIF8sIHRjIDo9IHJhbmdlIGNhc2VzIHsKCQl0LlJ1bih0Yy5uYW1lLCBmdW5jKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgkJCXNldHVwQUJUKGNyb3NzKGN1ciksIHQpCgkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5BZG1pbikpCgkJCU1pbnQoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgNykKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHRjLnBhbmljTXNnLCBmdW5jKCkgewoJCQkJTWludChjcm9zcyhjdXIpLCB0Yy50bywgdGMuYW1vdW50KQoJCQl9KQoJCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDcpLCBUb3RhbFN1cHBseSgpKQoJCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDcpLCBCYWxhbmNlT2YoYWJ0VGVzdC5Pd25lcikpCgkJCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEJhbGFuY2VPZihhYnRUZXN0Lk90aGVyKSkKCQl9KQoJfQp9CgpmdW5jIFRlc3RNaW50T3ZlcmZsb3coY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQUJUKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pKQoJTWludChjcm9zcyhjdXIpLCBhYnRUZXN0Lk93bmVyLCBtYXRoLk1heEludDY0KQoJZm9yIF8sIHRvIDo9IHJhbmdlIFtdYWRkcmVzc3thYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyfSB7CgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhYnQgbWludCBmYWlsZWQ6IG1pbnQgb3ZlcmZsb3ciLCBmdW5jKCkgewoJCQlNaW50KGNyb3NzKGN1ciksIHRvLCAxKQoJCX0pCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KG1hdGguTWF4SW50NjQpLCBUb3RhbFN1cHBseSgpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NChtYXRoLk1heEludDY0KSwgQmFsYW5jZU9mKGFidFRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQmFsYW5jZU9mKGFidFRlc3QuT3RoZXIpKQp9CgpmdW5jIFRlc3RGcmVlemVMaWZlY3ljbGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQUJUKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pKQoJTWludChjcm9zcyhjdXIpLCBhYnRUZXN0Lk93bmVyLCAxMDApCglTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgdHJ1ZSkKCVNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkKCVNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkKCU1pbnQoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgNSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3duZXIpKQoJVHJhbnNmZXIoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgMTApCglBcHByb3ZlKGNyb3NzKGN1ciksIGFidFRlc3QuT3RoZXIsIDQwKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWJ0VGVzdC5PdGhlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5PdGhlcikpCglUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5BZG1pbiwgMTUpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDgwKSwgQmFsYW5jZU9mKGFidFRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMCksIEJhbGFuY2VPZihhYnRUZXN0Lk90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTUpLCBCYWxhbmNlT2YoYWJ0VGVzdC5BZG1pbikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDI1KSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIGFidFRlc3QuT3RoZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWJ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5BZG1pbikpCglTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgdHJ1ZSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhYnQgaXMgZnJvemVuIiwgZnVuYygpIHsgQXBwcm92ZShjcm9zcyhjdXIpLCBhYnRUZXN0Lk90aGVyLCAwKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhYnQgaXMgZnJvemVuIiwgZnVuYygpIHsgVHJhbnNmZXIoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgMSkgfSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3RoZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3RoZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhYnQgaXMgZnJvemVuIiwgZnVuYygpIHsKCQlUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5BZG1pbiwgMjUpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyNSksIEFsbG93YW5jZShhYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoODApLCBCYWxhbmNlT2YoYWJ0VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwNSksIFRvdGFsU3VwcGx5KCkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhYnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCVNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3RoZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3RoZXIpKQoJVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIGFidFRlc3QuQWRtaW4sIDI1KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIGFidFRlc3QuT3RoZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1NSksIEJhbGFuY2VPZihhYnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNDApLCBCYWxhbmNlT2YoYWJ0VGVzdC5BZG1pbikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwNSksIFRvdGFsU3VwcGx5KCkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhYnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0Lk93bmVyKSkKCUFwcHJvdmUoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgNSkKCUFwcHJvdmUoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgNykKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNyksIEFsbG93YW5jZShhYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyKSkKCUFwcHJvdmUoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEFsbG93YW5jZShhYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyKSkKfQoKZnVuYyBUZXN0TWludFJvbGVDaGFuZ2VzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEFCVChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCWFkbWluLlVuc2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3BlcmF0b3IpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvciBvcGVyYXRvciBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgeyBNaW50KGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDEpIH0pCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhYnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCWFkbWluLlRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3RoZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3RoZXIpKQoJYWRtaW4uQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCU1pbnQoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgMykKCVNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvciBvcGVyYXRvciBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgeyBNaW50KGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDEpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7IFNldEZyb3plbihjcm9zcyhjdXIpLCB0cnVlKSB9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzKSwgVG90YWxTdXBwbHkoKSkKCXVhc3NlcnQuRmFsc2UodCwgSXNGcm96ZW4oKSkKfQoathUKE2V2ZW50c19maWxldGVzdC5nbm8SnhUvLyBQS0dQQVRIOiBnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hYnRfZXZlbnRzCnBhY2thZ2UgYWJ0X2V2ZW50cwoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hYnQiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW4iCikKCmZ1bmMgbWFpbihjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImFidEV2ZW50QWRtaW4iKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWRtaW4uR2V0QWRtaW4oKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4uR2V0QWRtaW4oKSkpCglhZG1pbi5UcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIGNhbGxlcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNhbGxlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY2FsbGVyKSkKCWFkbWluLkFjY2VwdEFkbWluKGNyb3NzKGN1cikpCglhYnQuTWludChjcm9zcyhjdXIpLCBjYWxsZXIsIDEwKQoJYWJ0LlNldEZyb3plbihjcm9zcyhjdXIpLCB0cnVlKSAvLyBObyBldmVudCBmb3IgdGhlIGluaXRpYWwgdmFsdWUuCglhYnQuU2V0RnJvemVuKGNyb3NzKGN1ciksIGZhbHNlKQoJYWJ0LlNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkgLy8gTm8gZHVwbGljYXRlIGV2ZW50LgoJYWJ0LlNldEZyb3plbihjcm9zcyhjdXIpLCB0cnVlKQoJcHJpbnRsbihhYnQuVG90YWxTdXBwbHkoKSwgYWJ0LklzRnJvemVuKCkpCn0KCi8vIE91dHB1dDoKLy8gMTAgdHJ1ZQoKLy8gRXZlbnRzOgovLyBbCi8vICAgewovLyAgICAgInR5cGUiOiAiVHJhbnNmZXJBZG1pbiIsCi8vICAgICAiYXR0cnMiOiBbCi8vICAgICAgIHsKLy8gICAgICAgICAia2V5IjogImZyb20iLAovLyAgICAgICAgICJ2YWx1ZSI6ICIiCi8vICAgICAgIH0sCi8vICAgICAgIHsKLy8gICAgICAgICAia2V5IjogInRvIiwKLy8gICAgICAgICAidmFsdWUiOiAiZzF2OTM4ZzN0a3Y0aDhnc3R5ZDQ1a3VoNmx0YTA0N2g2bHgyczU3NiIKLy8gICAgICAgfQovLyAgICAgXSwKLy8gICAgICJwa2dfcGF0aCI6ICJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKLy8gICB9LAovLyAgIHsKLy8gICAgICJ0eXBlIjogIkFjY2VwdEFkbWluIiwKLy8gICAgICJhdHRycyI6IFsKLy8gICAgICAgewovLyAgICAgICAgICJrZXkiOiAiZnJvbSIsCi8vICAgICAgICAgInZhbHVlIjogIiIKLy8gICAgICAgfSwKLy8gICAgICAgewovLyAgICAgICAgICJrZXkiOiAidG8iLAovLyAgICAgICAgICJ2YWx1ZSI6ICJnMXY5MzhnM3RrdjRoOGdzdHlkNDVrdWg2bHRhMDQ3aDZseDJzNTc2IgovLyAgICAgICB9Ci8vICAgICBdLAovLyAgICAgInBrZ19wYXRoIjogImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgovLyAgIH0sCi8vICAgewovLyAgICAgInR5cGUiOiAiVHJhbnNmZXIiLAovLyAgICAgImF0dHJzIjogWwovLyAgICAgICB7Ci8vICAgICAgICAgImtleSI6ICJ0b2tlbiIsCi8vICAgICAgICAgInZhbHVlIjogImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FidC5hYnQuMDAwMDAwMCIKLy8gICAgICAgfSwKLy8gICAgICAgewovLyAgICAgICAgICJrZXkiOiAiZnJvbSIsCi8vICAgICAgICAgInZhbHVlIjogIiIKLy8gICAgICAgfSwKLy8gICAgICAgewovLyAgICAgICAgICJrZXkiOiAidG8iLAovLyAgICAgICAgICJ2YWx1ZSI6ICJnMXY5MzhnM3RrdjRoOGdzdHlkNDVrdWg2bHRhMDQ3aDZseDJzNTc2IgovLyAgICAgICB9LAovLyAgICAgICB7Ci8vICAgICAgICAgImtleSI6ICJ2YWx1ZSIsCi8vICAgICAgICAgInZhbHVlIjogIjEwIgovLyAgICAgICB9Ci8vICAgICBdLAovLyAgICAgInBrZ19wYXRoIjogImduby5sYW5kL3AvbnQvZ3JjMjAvdjAiCi8vICAgfSwKLy8gICB7Ci8vICAgICAidHlwZSI6ICJGcm96ZW5DaGFuZ2VkIiwKLy8gICAgICJhdHRycyI6IFsKLy8gICAgICAgewovLyAgICAgICAgICJrZXkiOiAiZXhlY3V0b3IiLAovLyAgICAgICAgICJ2YWx1ZSI6ICJnMXY5MzhnM3RrdjRoOGdzdHlkNDVrdWg2bHRhMDQ3aDZseDJzNTc2IgovLyAgICAgICB9LAovLyAgICAgICB7Ci8vICAgICAgICAgImtleSI6ICJwcmV2aW91cyIsCi8vICAgICAgICAgInZhbHVlIjogInRydWUiCi8vICAgICAgIH0sCi8vICAgICAgIHsKLy8gICAgICAgICAia2V5IjogImZyb3plbiIsCi8vICAgICAgICAgInZhbHVlIjogImZhbHNlIgovLyAgICAgICB9Ci8vICAgICBdLAovLyAgICAgInBrZ19wYXRoIjogImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FidCIKLy8gICB9LAovLyAgIHsKLy8gICAgICJ0eXBlIjogIkZyb3plbkNoYW5nZWQiLAovLyAgICAgImF0dHJzIjogWwovLyAgICAgICB7Ci8vICAgICAgICAgImtleSI6ICJleGVjdXRvciIsCi8vICAgICAgICAgInZhbHVlIjogImcxdjkzOGczdGt2NGg4Z3N0eWQ0NWt1aDZsdGEwNDdoNmx4MnM1NzYiCi8vICAgICAgIH0sCi8vICAgICAgIHsKLy8gICAgICAgICAia2V5IjogInByZXZpb3VzIiwKLy8gICAgICAgICAidmFsdWUiOiAiZmFsc2UiCi8vICAgICAgIH0sCi8vICAgICAgIHsKLy8gICAgICAgICAia2V5IjogImZyb3plbiIsCi8vICAgICAgICAgInZhbHVlIjogInRydWUiCi8vICAgICAgIH0KLy8gICAgIF0sCi8vICAgICAicGtnX3BhdGgiOiAiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWJ0IgovLyAgIH0KLy8gXQoavBIKEWV4dGVybmFsX3Rlc3QuZ25vEqYScGFja2FnZSBhYnRfdGVzdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hYnQiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW4iCikKCmZ1bmMgVGVzdEV4dGVybmFsV3JhcHBlckxpZmVjeWNsZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJY2FsbGVyIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYWJ0RXh0ZXJuYWxBZG1pbiIpCglvd25lciA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImFidEV4dGVybmFsT3duZXIiKQoJb3RoZXIgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhYnRFeHRlcm5hbE90aGVyIikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFkbWluLkdldEFkbWluKCkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluLkdldEFkbWluKCkpKQoJYWRtaW4uVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBjYWxsZXIpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjYWxsZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNhbGxlcikpCglhZG1pbi5BY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze30pCgl0ZXN0aW5nLlNldFJlYWxtKHJ1bnRpbWUuTmV3UmVhbG0oY2FsbGVyLCAiZ25vLmxhbmQvZS8iK2NhbGxlci5TdHJpbmcoKSsiL3J1biIpKQoJYWJ0LlNldEZyb3plbihjcm9zcyhjdXIpLCB0cnVlKQoJc3VwcGx5QmVmb3JlIDo9IGFidC5Ub3RhbFN1cHBseSgpCglhYnQuTWludChjcm9zcyhjdXIpLCBvd25lciwgMjApCgl1YXNzZXJ0LkVxdWFsKHQsICJBa2thZGlhIEJldGEgVG9rZW4iLCBhYnQuR2V0TmFtZSgpKQoJdWFzc2VydC5FcXVhbCh0LCAiYWJ0IiwgYWJ0LkdldFN5bWJvbCgpKQoJdWFzc2VydC5FcXVhbCh0LCA2LCBhYnQuR2V0RGVjaW1hbHMoKSkKCXVhc3NlcnQuRXF1YWwodCwgc3VwcGx5QmVmb3JlKzIwLCBhYnQuVG90YWxTdXBwbHkoKSkKCXVhc3NlcnQuVHJ1ZSh0LCBhYnQuSXNGcm96ZW4oKSkKCWFidC5TZXRGcm96ZW4oY3Jvc3MoY3VyKSwgZmFsc2UpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihvd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJYWJ0LlRyYW5zZmVyKGNyb3NzKGN1ciksIG90aGVyLCAyKQoJYWJ0LkFwcHJvdmUoY3Jvc3MoY3VyKSwgb3RoZXIsIDUpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihvdGhlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3RoZXIpKQoJYWJ0LlRyYW5zZmVyRnJvbShjcm9zcyhjdXIpLCBvd25lciwgb3RoZXIsIDMpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDE1KSwgYWJ0LkJhbGFuY2VPZihvd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDUpLCBhYnQuQmFsYW5jZU9mKG90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIGFidC5BbGxvd2FuY2Uob3duZXIsIG90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgIjE1IiwgYWJ0LlJlbmRlcigiYmFsYW5jZS8iK293bmVyLlN0cmluZygpKSkKCS8vIEEgbGF0ZXIgZmFpbGluZyB0cmFuc2ZlciBtdXN0IHByZXNlcnZlIGFsbG93YW5jZSBldmVuIGlmIGl0cyBhYm9ydCBpcyBjYXVnaHQuCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGNhbm5vdCBzZW5kIHRyYW5zZmVyIHRvIHNlbGYiLCBmdW5jKCkgewoJCWFidC5UcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgb3duZXIsIG93bmVyLCAxKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIGFidC5BbGxvd2FuY2Uob3duZXIsIG90aGVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNhbGxlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY2FsbGVyKSkKCWFidC5TZXRGcm96ZW4oY3Jvc3MoY3VyKSwgdHJ1ZSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG90aGVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvdGhlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFidCBpcyBmcm96ZW4iLCBmdW5jKCkgeyBhYnQuVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIG93bmVyLCBvdGhlciwgMikgfSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIGFidC5BbGxvd2FuY2Uob3duZXIsIG90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgc3VwcGx5QmVmb3JlKzIwLCBhYnQuVG90YWxTdXBwbHkoKSkKfQoaQgoLZ25vbW9kLnRvbWwSM21vZHVsZSA9ICJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hYnQiCmdubyA9ICIwLjkiChqKAwoKcmVuZGVyLmdubxL7AnBhY2thZ2UgYWJ0CgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKKQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlyZXR1cm4gdG9rZW4uUmVuZGVySG9tZSgpICsgIiogKipGcm96ZW4qKjogIiArIHN0cmNvbnYuRm9ybWF0Qm9vbChmcm96ZW4pICsgIlxuIgoJfQoJaWYgc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgImJhbGFuY2UvIikgewoJCW93bmVyIDo9IGFkZHJlc3Moc3RyaW5ncy5UcmltUHJlZml4KHBhdGgsICJiYWxhbmNlLyIpKQoJCWlmIG93bmVyLklzVmFsaWQoKSB7CgkJCXJldHVybiBzdHJjb252LkZvcm1hdEludChCYWxhbmNlT2Yob3duZXIpLCAxMCkKCQl9Cgl9CglyZXR1cm4gIjQwNCIKfQoapAgKD3JlbmRlcl90ZXN0LmdubxKQCHBhY2thZ2UgYWJ0CgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgpmdW5jIFRlc3RSZW5kZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQUJUKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pKQoJTWludChjcm9zcyhjdXIpLCBhYnRUZXN0Lk93bmVyLCAxMjMpCglmb3IgXywgdGV4dCA6PSByYW5nZSBbXXN0cmluZ3siQWtrYWRpYSBCZXRhIFRva2VuIiwgIiRhYnQiLCAiKipEZWNpbWFscyoqOiA2IiwgIioqVG90YWwgc3VwcGx5Kio6IDEyMyIsICIqKkZyb3plbioqOiB0cnVlIn0gewoJCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigiIiksIHRleHQpKQoJfQoJdWFzc2VydC5FcXVhbCh0LCAiMTIzIiwgUmVuZGVyKCJiYWxhbmNlLyIrYWJ0VGVzdC5Pd25lci5TdHJpbmcoKSkpCgl1YXNzZXJ0LkVxdWFsKHQsICIwIiwgUmVuZGVyKCJiYWxhbmNlLyIrYWJ0VGVzdC5PdGhlci5TdHJpbmcoKSkpCglmb3IgXywgcGF0aCA6PSByYW5nZSBbXXN0cmluZ3sidW5rbm93biIsICJiYWxhbmNlLyIsICJiYWxhbmNlL2ludmFsaWQiLCAiYmFsYW5jZS8iICsgYWJ0VGVzdC5Pd25lci5TdHJpbmcoKSArICIvZXh0cmEiLCAiYmFsYW5jZS88c2NyaXB0PiJ9IHsKCQl1YXNzZXJ0LkVxdWFsKHQsICI0MDQiLCBSZW5kZXIocGF0aCkpCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEyMyksIFRvdGFsU3VwcGx5KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEyMyksIEJhbGFuY2VPZihhYnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEFsbG93YW5jZShhYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyKSkKCXVhc3NlcnQuVHJ1ZSh0LCBJc0Zyb3plbigpKQoJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZhbHNlKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCIiKSwgIioqRnJvemVuKio6IGZhbHNlIikpCn0KGtIzChFzZWN1cml0eV90ZXN0LmdubxK8M3BhY2thZ2UgYWJ0CgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgpmdW5jIFRlc3RVbmF1dGhvcml6ZWRNaW50QW5kRnJlZXplKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEFCVChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWJ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7IE1pbnQoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgMSkgfSkKCWZvciBfLCBjYWxsZXIgOj0gcmFuZ2UgW11hZGRyZXNze2FidFRlc3QuT3duZXIsIGFidFRlc3QuT3BlcmF0b3J9IHsKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjYWxsZXIpCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjYWxsZXIpKQoJCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBbXWJvb2x7dHJ1ZSwgZmFsc2V9IHsKCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgeyBTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgdmFsdWUpIH0pCgkJfQoJfQoJZm9yIF8sIHNpZ25lciA6PSByYW5nZSBbXWFkZHJlc3N7YWJ0VGVzdC5BZG1pbiwgYWJ0VGVzdC5PcGVyYXRvcn0gewoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHNpZ25lcikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2V4YW1wbGUvYWJ0X3JlbGF5IikpCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvciBvcGVyYXRvciBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgeyBNaW50KGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDEpIH0pCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgeyBTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgZmFsc2UpIH0pCgl9Cgl1YXNzZXJ0LlRydWUodCwgSXNGcm96ZW4oKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFRvdGFsU3VwcGx5KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBCYWxhbmNlT2YoYWJ0VGVzdC5Pd25lcikpCn0KCmZ1bmMgVGVzdEZyb3plblJlamVjdHNBbGxDYWxsZXJzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEFCVChjcm9zcyhjdXIpLCB0KQoJZm9yIF8sIGNhbGxlciA6PSByYW5nZSBbXWFkZHJlc3N7YWJ0VGVzdC5BZG1pbiwgYWJ0VGVzdC5PcGVyYXRvciwgYWJ0VGVzdC5Pd25lcn0gewoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuQWRtaW4pCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCQlNaW50KGNyb3NzKGN1ciksIGNhbGxlciwgMTApCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY2FsbGVyKSkKCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFidCBpcyBmcm96ZW4iLCBmdW5jKCkgeyBUcmFuc2Zlcihjcm9zcyhjdXIpLCBhYnRUZXN0Lk90aGVyLCAxKSB9KQoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWJ0IGlzIGZyb3plbiIsIGZ1bmMoKSB7IEFwcHJvdmUoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgMSkgfSkKCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFidCBpcyBmcm96ZW4iLCBmdW5jKCkgeyBBcHByb3ZlKGNyb3NzKGN1ciksIGFidFRlc3QuT3RoZXIsIDApIH0pCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhYnQgaXMgZnJvemVuIiwgZnVuYygpIHsgVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGNhbGxlciwgYWJ0VGVzdC5PdGhlciwgMSkgfSkKCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwKSwgQmFsYW5jZU9mKGNhbGxlcikpCgkJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGNhbGxlciwgYWJ0VGVzdC5PdGhlcikpCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMwKSwgVG90YWxTdXBwbHkoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEJhbGFuY2VPZihhYnRUZXN0Lk90aGVyKSkKfQoKZnVuYyBUZXN0QXR0YWNoZWRDb2luc1JlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSBzdHJpbmcKCQljYWxsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkKCX17CgkJeyJtaW50IiwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IE1pbnQoY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgMSkgfX0sCgkJeyJmcmVlemUiLCBmdW5jKF8gaW50LCBybG0gcmVhbG0pIHsgU2V0RnJvemVuKGNyb3NzKHJsbSksIHRydWUpIH19LAoJCXsiZnJlZXplIG5vLW9wIiwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IFNldEZyb3plbihjcm9zcyhybG0pLCBmYWxzZSkgfX0sCgkJeyJ0cmFuc2ZlciIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2Zlcihjcm9zcyhybG0pLCBhYnRUZXN0Lk90aGVyLCAxKSB9fSwKCQl7ImFwcHJvdmUiLCBmdW5jKF8gaW50LCBybG0gcmVhbG0pIHsgQXBwcm92ZShjcm9zcyhybG0pLCBhYnRUZXN0Lk90aGVyLCAxKSB9fSwKCQl7InRyYW5zZmVyRnJvbSIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2ZlckZyb20oY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5PdGhlciwgMSkgfX0sCgl9Cglmb3IgXywgdGMgOj0gcmFuZ2UgY2FzZXMgewoJCXQuUnVuKHRjLm5hbWUsIGZ1bmMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCQkJc2V0dXBBQlQoY3Jvc3MoY3VyKSwgdCkKCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCQkJTWludChjcm9zcyhjdXIpLCBhYnRUZXN0LkFkbWluLCAxMCkKCQkJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZhbHNlKQoJCQlmb3IgXywgY2FsbGVyIDo9IHJhbmdlIFtdcnVudGltZS5SZWFsbXsKCQkJCXRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pLAoJCQkJcnVudGltZS5OZXdSZWFsbShhYnRUZXN0LkFkbWluLCAiZ25vLmxhbmQvZS8iK2FidFRlc3QuQWRtaW4uU3RyaW5nKCkrIi9ydW4iKSwKCQkJfSB7CgkJCQl0ZXN0aW5nLlNldFJlYWxtKGNhbGxlcikKCQkJCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7InVnbm90IiwgMX19KQoJCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhdHRhY2hlZCBjb2lucyBub3QgYWxsb3dlZCIsIGZ1bmMoKSB7IHRjLmNhbGwoMCwgY3VyKSB9KQoJCQkJdWFzc2VydC5GYWxzZSh0LCBJc0Zyb3plbigpKQoJCQkJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMCksIFRvdGFsU3VwcGx5KCkpCgkJCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwKSwgQmFsYW5jZU9mKGFidFRlc3QuQWRtaW4pKQoJCQkJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQmFsYW5jZU9mKGFidFRlc3QuT3RoZXIpKQoJCQkJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGFidFRlc3QuQWRtaW4sIGFidFRlc3QuT3RoZXIpKQoJCQl9CgkJfSkKCX0KfQoKZnVuYyBUZXN0UmVsYXlVc2VzT3duQmFsYW5jZUFuZEFsbG93YW5jZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBBQlQoY3Jvc3MoY3VyKSwgdCkKCXJlbGF5IDo9IHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2V4YW1wbGUvYWJ0X3JlbGF5IikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5BZG1pbikpCglNaW50KGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDEwMCkKCU1pbnQoY3Jvc3MoY3VyKSwgcmVsYXkuQWRkcmVzcygpLCAyMCkKCVNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuT3duZXIpKQoJQXBwcm92ZShjcm9zcyhjdXIpLCByZWxheS5BZGRyZXNzKCksIDcpCglBcHByb3ZlKGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDMwKQoJLy8gVGhlc2UgY29pbnMgYmVsb25nIHRvIHRoZSByZWxheSdzIG9yaWdpbiBjYWxsLCBub3QgdG8gQUJULgoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3sidWdub3QiLCAxfX0pCgl0ZXN0aW5nLlNldFJlYWxtKHJlbGF5KQoJVHJhbnNmZXIoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgNSkKCUFwcHJvdmUoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgMykKCVRyYW5zZmVyRnJvbShjcm9zcyhjdXIpLCBhYnRUZXN0Lk93bmVyLCBhYnRUZXN0Lk90aGVyLCA3KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhYnQgdHJhbnNmZXIgZmFpbGVkOiBpbnN1ZmZpY2llbnQgYWxsb3dhbmNlIiwgZnVuYygpIHsKCQlUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5PdGhlciwgMSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDkzKSwgQmFsYW5jZU9mKGFidFRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxNSksIEJhbGFuY2VPZihyZWxheS5BZGRyZXNzKCkpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMiksIEJhbGFuY2VPZihhYnRUZXN0Lk90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMyksIEFsbG93YW5jZShyZWxheS5BZGRyZXNzKCksIGFidFRlc3QuT3RoZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIGFidFRlc3QuT3RoZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIHJlbGF5LkFkZHJlc3MoKSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMwKSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIGFidFRlc3QuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMjApLCBUb3RhbFN1cHBseSgpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze30pCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhYnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCVNldEZyb3plbihjcm9zcyhjdXIpLCB0cnVlKQoJdGVzdGluZy5TZXRSZWFsbShyZWxheSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWJ0IGlzIGZyb3plbiIsIGZ1bmMoKSB7IFRyYW5zZmVyKGNyb3NzKGN1ciksIGFidFRlc3QuT3RoZXIsIDEpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFidCBpcyBmcm96ZW4iLCBmdW5jKCkgeyBBcHByb3ZlKGNyb3NzKGN1ciksIGFidFRlc3QuT3RoZXIsIDApIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFidCBpcyBmcm96ZW4iLCBmdW5jKCkgeyBUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5PdGhlciwgMSkgfSkKfQoKZnVuYyBUZXN0T3BlcmF0b3JSZWFsbUNhbk1pbnRXaXRoT3duQXV0aG9yaXR5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEFCVChjcm9zcyhjdXIpLCB0KQoJcmVsYXkgOj0gdGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9hYnRfb3BlcmF0b3IiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCWFkbWluLlNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHJlbGF5LkFkZHJlc3MoKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7eyJ1Z25vdCIsIDF9fSkKCXRlc3RpbmcuU2V0UmVhbG0ocmVsYXkpCglNaW50KGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDIpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7IFNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkgfSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIFRvdGFsU3VwcGx5KCkpCgl1YXNzZXJ0LlRydWUodCwgSXNGcm96ZW4oKSkKfQoKZnVuYyBUZXN0U3Bvb2ZlZFJlYWxtUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQUJUKGNyb3NzKGN1ciksIHQpCglzdGFsZSA6PSBjYXB0dXJlQUJUUmVhbG0oY3Jvc3MoY3VyKSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAic3Bvb2ZlZCByZWFsbSIsIGZ1bmMoKSB7IGFzc2VydENhblRyYW5zZmVyKDAsIHN0YWxlKSB9KQoJdWFzc2VydC5UcnVlKHQsIElzRnJvemVuKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBUb3RhbFN1cHBseSgpKQp9ChqWCgoOc2V0dXBfdGVzdC5nbm8SgwpwYWNrYWdlIGFidAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L2dyYzIwL3YwIgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgp2YXIgYWJ0VGVzdCA9IHN0cnVjdCB7CglBZG1pbiwgT3BlcmF0b3IsIE93bmVyLCBPdGhlciBhZGRyZXNzCn17CglBZG1pbjogICAgdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhYnRBZG1pbiIpLAoJT3BlcmF0b3I6IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYWJ0T3BlcmF0b3IiKSwKCU93bmVyOiAgICB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImFidE93bmVyIiksCglPdGhlcjogICAgdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhYnRPdGhlciIpLAp9CgovLyBDYWxsIHdpdGggY3Jvc3MoY3VyKSBzbyB0b2tlbiBjb25zdHJ1Y3Rpb24gdXNlcyBhIGxpdmUgQUJUIHJlYWxtLgpmdW5jIHNldHVwQUJUKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCgl0b2tlbiwgbGVkZ2VyID0gZ3JjMjAuTmV3VG9rZW4oIkFra2FkaWEgQmV0YSBUb2tlbiIsICJhYnQiLCA2LCAwLCBjdXIpCglmcm96ZW4gPSB0cnVlCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7fSkKCW9yaWdpbmFsQWRtaW4gOj0gYWRtaW4uR2V0QWRtaW4oKQoJaWYgb3JpZ2luYWxBZG1pbiAhPSBhYnRUZXN0LkFkbWluIHsKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihvcmlnaW5hbEFkbWluKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3JpZ2luYWxBZG1pbikpCgkJYWRtaW4uVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBhYnRUZXN0LkFkbWluKQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuQWRtaW4pCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhYnRUZXN0LkFkbWluKSkKCQlhZG1pbi5BY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJfQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWJ0VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5BZG1pbikpCglmb3IgXywgb3BlcmF0b3IgOj0gcmFuZ2UgYWRtaW4uR2V0T3BlcmF0b3JzKCkgewoJCWFkbWluLlVuc2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgb3BlcmF0b3IpCgl9CglhZG1pbi5TZXRPcGVyYXRvcihjcm9zcyhjdXIpLCBhYnRUZXN0Lk9wZXJhdG9yKQp9CgpmdW5jIGNhcHR1cmVBQlRSZWFsbShjdXIgcmVhbG0pIHJlYWxtIHsgcmV0dXJuIGN1ciB9ChrmGwoRdHJhbnNmZXJfdGVzdC5nbm8S0BtwYWNrYWdlIGFidAoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCmZ1bmMgVGVzdFRyYW5zZmVyRmFpbHVyZXNQcmVzZXJ2ZVN0YXRlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgc3RyaW5nCgkJY2FsbGVyICAgYWRkcmVzcwoJCWNhbGwgICAgIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkKCQlwYW5pY01zZyBzdHJpbmcKCX17CgkJeyJ0cmFuc2ZlciBhZGRyZXNzIiwgYWJ0VGVzdC5Pd25lciwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IFRyYW5zZmVyKGNyb3NzKHJsbSksIGFkZHJlc3MoImJhZCIpLCAxKSB9LCAiYWJ0IHRyYW5zZmVyIGZhaWxlZDogaW52YWxpZCBhZGRyZXNzIn0sCgkJeyJ0cmFuc2ZlciBuZWdhdGl2ZSIsIGFidFRlc3QuT3duZXIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2Zlcihjcm9zcyhybG0pLCBhYnRUZXN0Lk90aGVyLCAtMSkgfSwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGludmFsaWQgYW1vdW50In0sCgkJeyJ0cmFuc2ZlciBiYWxhbmNlIiwgYWJ0VGVzdC5Pd25lciwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IFRyYW5zZmVyKGNyb3NzKHJsbSksIGFidFRlc3QuT3RoZXIsIDExKSB9LCAiYWJ0IHRyYW5zZmVyIGZhaWxlZDogaW5zdWZmaWNpZW50IGJhbGFuY2UifSwKCQl7InRyYW5zZmVyIHNlbGYiLCBhYnRUZXN0Lk93bmVyLCBmdW5jKF8gaW50LCBybG0gcmVhbG0pIHsgVHJhbnNmZXIoY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgMSkgfSwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGNhbm5vdCBzZW5kIHRyYW5zZmVyIHRvIHNlbGYifSwKCQl7ImFwcHJvdmUgYWRkcmVzcyIsIGFidFRlc3QuT3duZXIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBBcHByb3ZlKGNyb3NzKHJsbSksIGFkZHJlc3MoIiIpLCAxKSB9LCAiYWJ0IGFwcHJvdmFsIGZhaWxlZDogaW52YWxpZCBhZGRyZXNzIn0sCgkJeyJhcHByb3ZlIG5lZ2F0aXZlIiwgYWJ0VGVzdC5Pd25lciwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IEFwcHJvdmUoY3Jvc3MocmxtKSwgYWJ0VGVzdC5PdGhlciwgLTEpIH0sICJhYnQgYXBwcm92YWwgZmFpbGVkOiBpbnZhbGlkIGFtb3VudCJ9LAoJCXsidHJhbnNmZXJGcm9tIG93bmVyIiwgYWJ0VGVzdC5PdGhlciwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IFRyYW5zZmVyRnJvbShjcm9zcyhybG0pLCBhZGRyZXNzKCIiKSwgYWJ0VGVzdC5BZG1pbiwgMSkgfSwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGludmFsaWQgYWRkcmVzcyJ9LAoJCXsidHJhbnNmZXJGcm9tIHJlY2lwaWVudCIsIGFidFRlc3QuT3RoZXIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2ZlckZyb20oY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgYWRkcmVzcygiYmFkIiksIDEpIH0sICJhYnQgdHJhbnNmZXIgZmFpbGVkOiBpbnZhbGlkIGFkZHJlc3MifSwKCQl7InRyYW5zZmVyRnJvbSBuZWdhdGl2ZSIsIGFidFRlc3QuT3RoZXIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2ZlckZyb20oY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5BZG1pbiwgLTEpIH0sICJhYnQgdHJhbnNmZXIgZmFpbGVkOiBpbnZhbGlkIGFtb3VudCJ9LAoJCXsidHJhbnNmZXJGcm9tIGFsbG93YW5jZSIsIGFidFRlc3QuT3RoZXIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2ZlckZyb20oY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5BZG1pbiwgNikgfSwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGluc3VmZmljaWVudCBhbGxvd2FuY2UifSwKCQl7InRyYW5zZmVyRnJvbSBiYWxhbmNlIiwgYWJ0VGVzdC5PdGhlciwgZnVuYyhfIGludCwgcmxtIHJlYWxtKSB7IFRyYW5zZmVyRnJvbShjcm9zcyhybG0pLCBhYnRUZXN0Lk93bmVyLCBhYnRUZXN0LkFkbWluLCAxMSkgfSwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGluc3VmZmljaWVudCBiYWxhbmNlIn0sCgkJeyJ0cmFuc2ZlckZyb20gc2VsZiIsIGFidFRlc3QuT3RoZXIsIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSkgeyBUcmFuc2ZlckZyb20oY3Jvc3MocmxtKSwgYWJ0VGVzdC5Pd25lciwgYWJ0VGVzdC5Pd25lciwgMSkgfSwgImFidCB0cmFuc2ZlciBmYWlsZWQ6IGNhbm5vdCBzZW5kIHRyYW5zZmVyIHRvIHNlbGYifSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJdC5SdW4odGMubmFtZSwgZnVuYyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJCQlzZXR1cEFCVChjcm9zcyhjdXIpLCB0KQoJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pKQoJCQlNaW50KGNyb3NzKGN1ciksIGFidFRlc3QuT3duZXIsIDEwKQoJCQlTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgZmFsc2UpCgkJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFidFRlc3QuT3duZXIpCgkJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5Pd25lcikpCgkJCUFwcHJvdmUoY3Jvc3MoY3VyKSwgYWJ0VGVzdC5PdGhlciwgNSkKCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGMuY2FsbGVyKQoJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRjLmNhbGxlcikpCgkJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0Yy5wYW5pY01zZywgZnVuYygpIHsgdGMuY2FsbCgwLCBjdXIpIH0pCgkJCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTApLCBUb3RhbFN1cHBseSgpKQoJCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwKSwgQmFsYW5jZU9mKGFidFRlc3QuT3duZXIpKQoJCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBCYWxhbmNlT2YoYWJ0VGVzdC5PdGhlcikpCgkJCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEJhbGFuY2VPZihhYnRUZXN0LkFkbWluKSkKCQkJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1KSwgQWxsb3dhbmNlKGFidFRlc3QuT3duZXIsIGFidFRlc3QuT3RoZXIpKQoJCX0pCgl9Cn0KCmZ1bmMgVGVzdFplcm9UcmFuc2ZlcnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwQUJUKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFidFRlc3QuQWRtaW4pKQoJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZhbHNlKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWJ0VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWJ0VGVzdC5Pd25lcikpCglUcmFuc2Zlcihjcm9zcyhjdXIpLCBhYnRUZXN0Lk90aGVyLCAwKQoJVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGFidFRlc3QuT3RoZXIsIGFidFRlc3QuQWRtaW4sIDApCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBUb3RhbFN1cHBseSgpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQmFsYW5jZU9mKGFidFRlc3QuT3RoZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQWxsb3dhbmNlKGFidFRlc3QuT3RoZXIsIGFidFRlc3QuT3duZXIpKQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCMDYp04SCjgyMTE1dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECLUUtr6vIOzviOGbyUc1h+4x9Ac78WI57H+Na8gUVG8MSQPGTrza6ByFE0RSmL1tEOU1HQjZbkDpgBxZaFk+zUdYFEvn5RQf1THfTXXzSgr+x1bLEIvvA1Q5S3bPNOZpPb6kaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=